mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-12 23:35:33 +08:00
refs #525, stash view
* allow to stash and unstash models from vPilot and own models * removed stash main area and moved it into mapping component * own stash component * use the new functions for modles/views from the prevuous steps
This commit is contained in:
@@ -53,17 +53,11 @@ namespace BlackGui
|
||||
return this->ui->comp_DataInfoArea;
|
||||
}
|
||||
|
||||
CDbStashComponent *CDataMainInfoAreaComponent::getStashComponent() const
|
||||
{
|
||||
return this->ui->comp_Stash;
|
||||
}
|
||||
|
||||
void CDataMainInfoAreaComponent::setProvider(BlackMisc::Network::IWebDataServicesProvider *provider)
|
||||
{
|
||||
Q_ASSERT_X(provider, Q_FUNC_INFO, "Missing provider");
|
||||
this->ui->comp_DataInfoArea->setProvider(provider);
|
||||
this->ui->comp_Mapping->setProvider(provider);
|
||||
this->ui->comp_Stash->setProvider(provider);
|
||||
}
|
||||
|
||||
void CDataMainInfoAreaComponent::displayLog()
|
||||
@@ -86,7 +80,6 @@ namespace BlackGui
|
||||
case InfoAreaData:
|
||||
case InfoAreaMapping:
|
||||
case InfoAreaSettings:
|
||||
case InfoAreaStash:
|
||||
case InfoAreaLog:
|
||||
default:
|
||||
return QSize(800, 600);
|
||||
@@ -106,8 +99,6 @@ namespace BlackGui
|
||||
return CIcons::appSettings16();
|
||||
case InfoAreaLog:
|
||||
return CIcons::appLog16();
|
||||
case InfoAreaStash:
|
||||
return CIcons::appDbStash16();
|
||||
default:
|
||||
return CIcons::empty();
|
||||
}
|
||||
|
||||
@@ -26,7 +26,6 @@ namespace BlackGui
|
||||
{
|
||||
class CLogComponent;
|
||||
class CDbMappingComponent;
|
||||
class CDbStashComponent;
|
||||
class CDataInfoAreaComponent;
|
||||
|
||||
/**
|
||||
@@ -43,11 +42,10 @@ namespace BlackGui
|
||||
enum InfoArea
|
||||
{
|
||||
// index must match tab index!
|
||||
InfoAreaData = 0,
|
||||
InfoAreaMapping = 1,
|
||||
InfoAreaStash = 2,
|
||||
InfoAreaSettings = 3,
|
||||
InfoAreaLog = 4,
|
||||
InfoAreaData = 0,
|
||||
InfoAreaMapping = 1,
|
||||
InfoAreaSettings = 2,
|
||||
InfoAreaLog = 3,
|
||||
InfoAreaNone = -1
|
||||
};
|
||||
|
||||
@@ -66,9 +64,6 @@ namespace BlackGui
|
||||
//! Mapping component
|
||||
CDataInfoAreaComponent *getDataInfoAreaComponent() const;
|
||||
|
||||
//! Stash component
|
||||
CDbStashComponent *getStashComponent() const;
|
||||
|
||||
//! Set data reader
|
||||
virtual void setProvider(BlackMisc::Network::IWebDataServicesProvider *provider) override;
|
||||
|
||||
|
||||
@@ -172,73 +172,6 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
<widget class="BlackGui::CDockWidgetInfoArea" name="dwp_Stash">
|
||||
<property name="allowedAreas">
|
||||
<set>Qt::TopDockWidgetArea</set>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Stash</string>
|
||||
</property>
|
||||
<attribute name="dockWidgetArea">
|
||||
<number>4</number>
|
||||
</attribute>
|
||||
<widget class="QWidget" name="qw_StashOuter">
|
||||
<layout class="QVBoxLayout" name="vl_StashOuter">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QFrame" name="fr_StashInner">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="vl_StashInner">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="BlackGui::Components::CDbStashComponent" name="comp_Stash">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
<widget class="BlackGui::CDockWidgetInfoArea" name="dwp_Settings">
|
||||
<property name="allowedAreas">
|
||||
<set>Qt::TopDockWidgetArea</set>
|
||||
@@ -405,12 +338,6 @@
|
||||
<header>blackgui/components/dbmappingcomponent.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>BlackGui::Components::CDbStashComponent</class>
|
||||
<extends>QFrame</extends>
|
||||
<header>blackgui/components/dbstashcomponent.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>BlackGui::Components::CDataSettingsComponent</class>
|
||||
<extends>QFrame</extends>
|
||||
|
||||
@@ -9,10 +9,11 @@
|
||||
|
||||
#include "dbmappingcomponent.h"
|
||||
#include "ui_dbmappingcomponent.h"
|
||||
#include "blackgui/guiutility.h"
|
||||
#include "blackmisc/simulation/fscommon/aircraftcfgparser.h"
|
||||
#include "blackmisc/logmessage.h"
|
||||
#include "blackmisc/project.h"
|
||||
#include "blackgui/guiutility.h"
|
||||
|
||||
|
||||
using namespace BlackCore;
|
||||
using namespace BlackMisc;
|
||||
@@ -34,17 +35,26 @@ namespace BlackGui
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->ui->tvp_AircraftModelsForVPilot->setAircraftModelMode(CAircraftModelListModel::VPilotRuleModel);
|
||||
connect(ui->editor_Model, &CModelMappingForm::requestSave, this, &CDbMappingComponent::save);
|
||||
this->ui->tvp_OwnAircraftModels->setAircraftModelMode(CAircraftModelListModel::OwnSimulatorModel);
|
||||
|
||||
connect(ui->editor_Model, &CModelMappingForm::requestSave, this, &CDbMappingComponent::saveSingleModelToDb);
|
||||
connect(ui->tvp_OwnAircraftModels, &CAircraftModelView::doubleClicked, this, &CDbMappingComponent::ps_onModelRowSelected);
|
||||
connect(ui->tvp_OwnAircraftModels, &CAircraftModelView::rowCountChanged, this, &CDbMappingComponent::ps_onOwnModelsCountChanged);
|
||||
connect(ui->comp_StashAircraft->getView(), &CAircraftModelView::rowCountChanged, this, &CDbMappingComponent::ps_onStashCountChanged);
|
||||
|
||||
ui->tvp_OwnAircraftModels->setCustomMenu(new CMappingSimulatorModelMenu(this));
|
||||
ui->tvp_OwnAircraftModels->setDisplayAutomatically(true);
|
||||
ui->tvp_OwnAircraftModels->setCustomMenu(new CMappingSimulatorModelMenu(this));
|
||||
ui->tvp_OwnAircraftModels->setCustomMenu(new CStashMenu(this, true));
|
||||
ui->tvp_OwnAircraftModels->updateContainerMaybeAsync(this->m_cachedOwnModels.get());
|
||||
|
||||
// how to display forms
|
||||
ui->editor_AircraftIcao->setMappingMode();
|
||||
ui->editor_Distributor->setMappingMode();
|
||||
ui->editor_Livery->setMappingMode();
|
||||
|
||||
this->ui->tw_ModelsToBeMapped->setTabIcon(TabStash, CIcons::appDbStash16());
|
||||
this->ui->tw_ModelsToBeMapped->setTabIcon(TabOwnModels, CIcons::appModels16());
|
||||
|
||||
this->initVPilotLoading();
|
||||
}
|
||||
|
||||
@@ -58,18 +68,19 @@ namespace BlackGui
|
||||
bool canUseVPilot = CProject::isRunningOnWindowsNtPlatform() && CProject::isCompiledWithMsFlightSimulatorSupport();
|
||||
bool withVPilotRights = canUseVPilot && this->m_user.get().isMappingAdmin();
|
||||
this->m_withVPilot = withVPilotRights;
|
||||
static const QString tabName(this->ui->tw_ModelsToBeMapped->tabText(1));
|
||||
static const QString tabName(this->ui->tw_ModelsToBeMapped->tabText(TabVPliot));
|
||||
|
||||
if (this->m_vPilot1stInit && canUseVPilot)
|
||||
{
|
||||
ui->tvp_AircraftModelsForVPilot->setCustomMenu(new CStashMenu(this, true));
|
||||
connect(ui->tvp_AircraftModelsForVPilot, &CAircraftModelView::doubleClicked, this, &CDbMappingComponent::ps_onModelRowSelected);
|
||||
connect(ui->tvp_AircraftModelsForVPilot, &CAircraftModelView::rowCountChanged, this, &CDbMappingComponent::ps_onVPilotCountChanged);
|
||||
connect(&m_vPilotReader, &CVPilotRulesReader::readFinished, this, &CDbMappingComponent::ps_onLoadVPilotDataFinished);
|
||||
this->ui->tvp_AircraftModelsForVPilot->setCustomMenu(new CMappingVPilotMenu(this));
|
||||
this->ui->tvp_AircraftModelsForVPilot->setCustomMenu(new CMappingVPilotMenu(this, true));
|
||||
this->ui->tvp_AircraftModelsForVPilot->setDisplayAutomatically(true);
|
||||
this->ui->tvp_AircraftModelsForVPilot->updateContainerMaybeAsync(m_cachedVPilotModels.get());
|
||||
}
|
||||
this->m_vPilot1stInit = false;
|
||||
|
||||
this->ui->tab_VPilot->setEnabled(withVPilotRights);
|
||||
this->ui->tab_VPilot->setVisible(withVPilotRights);
|
||||
if (withVPilotRights)
|
||||
@@ -78,7 +89,7 @@ namespace BlackGui
|
||||
}
|
||||
else
|
||||
{
|
||||
this->ui->tw_ModelsToBeMapped->removeTab(1);
|
||||
this->ui->tw_ModelsToBeMapped->removeTab(TabVPliot);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,6 +133,43 @@ namespace BlackGui
|
||||
if (this->m_modelLoader) { this->m_modelLoader->gracefulShutdown(); }
|
||||
}
|
||||
|
||||
bool CDbMappingComponent::hasModelsForStash() const
|
||||
{
|
||||
TabIndex tab = currentTabIndex();
|
||||
switch (tab)
|
||||
{
|
||||
case TabOwnModels:
|
||||
return ui->tvp_OwnAircraftModels->hasSelection();
|
||||
case TabVPliot:
|
||||
return ui->tvp_AircraftModelsForVPilot->hasSelection();
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
CAircraftModelList CDbMappingComponent::getModelsForStash() const
|
||||
{
|
||||
if (!hasModelsForStash()) { return CAircraftModelList(); }
|
||||
TabIndex tab = currentTabIndex();
|
||||
switch (tab)
|
||||
{
|
||||
case TabOwnModels:
|
||||
return ui->tvp_OwnAircraftModels->selectedObjects();
|
||||
case TabVPliot:
|
||||
return ui->tvp_AircraftModelsForVPilot->selectedObjects();
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return CAircraftModelList();
|
||||
}
|
||||
|
||||
CDbMappingComponent::TabIndex CDbMappingComponent::currentTabIndex() const
|
||||
{
|
||||
int t = ui->tw_ModelsToBeMapped->currentIndex();
|
||||
return static_cast<TabIndex>(t);
|
||||
}
|
||||
|
||||
CStatusMessageList CDbMappingComponent::validate(bool withNestedForms) const
|
||||
{
|
||||
CStatusMessageList msgs(this->ui->editor_Model->validate(!withNestedForms));
|
||||
@@ -134,7 +182,7 @@ namespace BlackGui
|
||||
return msgs;
|
||||
}
|
||||
|
||||
void CDbMappingComponent::save()
|
||||
void CDbMappingComponent::saveSingleModelToDb()
|
||||
{
|
||||
CStatusMessageList msgs(validate(true));
|
||||
if (msgs.hasErrorMessages())
|
||||
@@ -145,7 +193,7 @@ namespace BlackGui
|
||||
}
|
||||
|
||||
CAircraftModel model(getAircraftModel());
|
||||
msgs = this->asyncWriteModel(model);
|
||||
msgs = this->asyncWriteModelToDb(model);
|
||||
if (!msgs.isEmpty())
|
||||
{
|
||||
CLogMessage(this).preformatted(msgs);
|
||||
@@ -203,12 +251,30 @@ namespace BlackGui
|
||||
if (success)
|
||||
{
|
||||
CLogMessage(this).info("Loading vPilot ruleset completed");
|
||||
const CAircraftModelList models(this->m_vPilotReader.getAsModels());
|
||||
if (this->ui->tvp_AircraftModelsForVPilot->displayAutomatically())
|
||||
{
|
||||
this->ui->tvp_AircraftModelsForVPilot->updateContainerMaybeAsync(
|
||||
this->m_vPilotReader.getAsModels()
|
||||
);
|
||||
this->ui->tvp_AircraftModelsForVPilot->updateContainerMaybeAsync(models);
|
||||
}
|
||||
QTime t;
|
||||
t.start();
|
||||
m_cachedVPilotModels.set(models);
|
||||
qint64 e = t.elapsed();
|
||||
qDebug() << e;
|
||||
CLogMessage(this).info("Written %1 vPilot rules to cache") << models.size();
|
||||
|
||||
/**
|
||||
t.start();
|
||||
QString x = models.toJsonString();
|
||||
e = t.elapsed();
|
||||
|
||||
t.start();
|
||||
CAircraftModelList ml;
|
||||
ml.convertFromJson(x);
|
||||
e = t.elapsed();
|
||||
|
||||
t.start();
|
||||
**/
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -245,6 +311,17 @@ namespace BlackGui
|
||||
this->ui->tw_ModelsToBeMapped->setTabText(i, o);
|
||||
}
|
||||
|
||||
void CDbMappingComponent::ps_onStashCountChanged(int count, bool withFilter)
|
||||
{
|
||||
Q_UNUSED(count);
|
||||
Q_UNUSED(withFilter);
|
||||
int i = this->ui->tw_ModelsToBeMapped->indexOf(this->ui->tab_StashAircraftModels);
|
||||
QString o = this->ui->tw_ModelsToBeMapped->tabText(i);
|
||||
QString f = this->ui->comp_StashAircraft->getView()->derivedModel()->hasFilter() ? "F" : "";
|
||||
o = CGuiUtility::replaceTabCountValue(o, this->ui->comp_StashAircraft->getView()->rowCount()) + f;
|
||||
this->ui->tw_ModelsToBeMapped->setTabText(i, o);
|
||||
}
|
||||
|
||||
void CDbMappingComponent::ps_requestSimulatorModels()
|
||||
{
|
||||
QAction *a = qobject_cast<QAction *>(QObject::sender());
|
||||
@@ -259,6 +336,19 @@ namespace BlackGui
|
||||
this->initVPilotLoading();
|
||||
}
|
||||
|
||||
void CDbMappingComponent::stashSelectedModels()
|
||||
{
|
||||
if (!this->hasModelsForStash()) { return; }
|
||||
CStatusMessageList msgs =
|
||||
this->ui->comp_StashAircraft->stashModels(
|
||||
this->getModelsForStash()
|
||||
);
|
||||
if (msgs.hasWarningOrErrorMessages())
|
||||
{
|
||||
// maybe log, popup?
|
||||
}
|
||||
}
|
||||
|
||||
void CDbMappingComponent::ps_onModelRowSelected(const QModelIndex &index)
|
||||
{
|
||||
QObject *sender = QObject::sender();
|
||||
@@ -319,13 +409,14 @@ namespace BlackGui
|
||||
{
|
||||
if (success && this->m_modelLoader)
|
||||
{
|
||||
CLogMessage(this).info("Loading of models completed");
|
||||
const CAircraftModelList models(this->m_modelLoader->getAircraftModels());
|
||||
CLogMessage(this).info("Loading %1 of models completed") << models.size();
|
||||
if (this->ui->tvp_OwnAircraftModels->displayAutomatically())
|
||||
{
|
||||
this->ui->tvp_OwnAircraftModels->updateContainer(
|
||||
this->m_modelLoader->getAircraftModels()
|
||||
);
|
||||
this->ui->tvp_OwnAircraftModels->updateContainer(models);
|
||||
}
|
||||
this->m_cachedOwnModels.set(models);
|
||||
CLogMessage(this).info("Written %1 own models to cache") << models.size();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -347,38 +438,43 @@ namespace BlackGui
|
||||
void CDbMappingComponent::CMappingSimulatorModelMenu::customMenu(QMenu &menu) const
|
||||
{
|
||||
CSimulatorInfo sims = CSimulatorInfo::getLocallyInstalledSimulators();
|
||||
QMenu *load = menu.addMenu(CIcons::appModels16(), "Load installed models");
|
||||
QAction *a = nullptr;
|
||||
CDbMappingComponent *mapComp = qobject_cast<CDbMappingComponent *>(this->parent());
|
||||
Q_ASSERT_X(mapComp, Q_FUNC_INFO, "Cannot access parent");
|
||||
bool empty = sims.isNoSimulator() || sims.isUnspecified();
|
||||
if (!empty)
|
||||
{
|
||||
QMenu *load = menu.addMenu(CIcons::appModels16(), "Load installed models");
|
||||
QAction *a = nullptr;
|
||||
CDbMappingComponent *mapComp = qobject_cast<CDbMappingComponent *>(this->parent());
|
||||
Q_ASSERT_X(mapComp, Q_FUNC_INFO, "Cannot access parent");
|
||||
|
||||
if (sims.fs9())
|
||||
{
|
||||
a = load->addAction(CIcons::appModels16(), "FS9 models", mapComp, SLOT(ps_requestSimulatorModels()));
|
||||
a->setData(QVariant(static_cast<int>(CSimulatorInfo::FS9)));
|
||||
if (sims.fs9())
|
||||
{
|
||||
a = load->addAction(CIcons::appModels16(), "FS9 models", mapComp, SLOT(ps_requestSimulatorModels()));
|
||||
a->setData(QVariant(static_cast<int>(CSimulatorInfo::FS9)));
|
||||
}
|
||||
if (sims.fsx())
|
||||
{
|
||||
a = load->addAction(CIcons::appModels16(), "FSX models", mapComp, SLOT(ps_requestSimulatorModels()));
|
||||
a->setData(QVariant(static_cast<int>(CSimulatorInfo::FSX)));
|
||||
}
|
||||
if (sims.p3d())
|
||||
{
|
||||
a = load->addAction(CIcons::appModels16(), "P3D models", mapComp, SLOT(ps_requestSimulatorModels()));
|
||||
a->setData(QVariant(static_cast<int>(CSimulatorInfo::P3D)));
|
||||
}
|
||||
if (sims.xplane())
|
||||
{
|
||||
a = load->addAction(CIcons::appModels16(), "XPlane models", mapComp, SLOT(ps_requestSimulatorModels()));
|
||||
a->setData(QVariant(static_cast<int>(CSimulatorInfo::XPLANE)));
|
||||
}
|
||||
menu.addSeparator();
|
||||
}
|
||||
if (sims.fsx())
|
||||
{
|
||||
a = load->addAction(CIcons::appModels16(), "FSX models", mapComp, SLOT(ps_requestSimulatorModels()));
|
||||
a->setData(QVariant(static_cast<int>(CSimulatorInfo::FSX)));
|
||||
}
|
||||
if (sims.p3d())
|
||||
{
|
||||
a = load->addAction(CIcons::appModels16(), "P3D models", mapComp, SLOT(ps_requestSimulatorModels()));
|
||||
a->setData(QVariant(static_cast<int>(CSimulatorInfo::P3D)));
|
||||
}
|
||||
if (sims.xplane())
|
||||
{
|
||||
a = load->addAction(CIcons::appModels16(), "XPlane models", mapComp, SLOT(ps_requestSimulatorModels()));
|
||||
a->setData(QVariant(static_cast<int>(CSimulatorInfo::XPLANE)));
|
||||
}
|
||||
menu.addSeparator();
|
||||
this->nestedCustomMenu(menu);
|
||||
}
|
||||
|
||||
void CDbMappingComponent::CMappingVPilotMenu::customMenu(QMenu &menu) const
|
||||
{
|
||||
CDbMappingComponent *mapComp = qobject_cast<CDbMappingComponent *>(this->parent());
|
||||
Q_ASSERT_X(mapComp, Q_FUNC_INFO, "Cannot access parent");
|
||||
Q_ASSERT_X(mapComp, Q_FUNC_INFO, "Cannot access mapping component");
|
||||
|
||||
bool canUseVPilot = mappingComponent()->withVPilot();
|
||||
if (canUseVPilot)
|
||||
@@ -386,6 +482,7 @@ namespace BlackGui
|
||||
menu.addAction(CIcons::appMappings16(), "Load vPilot Rules", mapComp, SLOT(ps_loadVPilotData()));
|
||||
menu.addSeparator();
|
||||
}
|
||||
this->nestedCustomMenu(menu);
|
||||
}
|
||||
|
||||
CDbMappingComponent *CDbMappingComponent::CMappingVPilotMenu::mappingComponent() const
|
||||
@@ -393,5 +490,20 @@ namespace BlackGui
|
||||
return qobject_cast<CDbMappingComponent *>(this->parent());
|
||||
}
|
||||
|
||||
void CDbMappingComponent::CStashMenu::customMenu(QMenu &menu) const
|
||||
{
|
||||
CDbMappingComponent *mapComp = qobject_cast<CDbMappingComponent *>(this->parent());
|
||||
Q_ASSERT_X(mapComp, Q_FUNC_INFO, "Cannot access mapping component");
|
||||
if (mapComp->hasModelsForStash())
|
||||
{
|
||||
menu.addAction(CIcons::appMappings16(), "Stash", mapComp, SLOT(stashSelectedModels()));
|
||||
}
|
||||
this->nestedCustomMenu(menu);
|
||||
}
|
||||
|
||||
CDbMappingComponent *CDbMappingComponent::CStashMenu::mappingComponent() const
|
||||
{
|
||||
return qobject_cast<CDbMappingComponent *>(this->parent());
|
||||
}
|
||||
} // ns
|
||||
} // ns
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#define BLACKGUI_COMPONENTS_DBMAPPINGCOMPONENT_H
|
||||
|
||||
#include "blackcore/data/authenticateduser.h"
|
||||
#include "blackcore/data/aircraftmodels.h"
|
||||
#include "blackgui/blackguiexport.h"
|
||||
#include "blackgui/overlaymessagesframe.h"
|
||||
#include "blackgui/menudelegate.h"
|
||||
@@ -43,6 +44,16 @@ namespace BlackGui
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
//! Tab index
|
||||
//! Must match real tab index
|
||||
enum TabIndex
|
||||
{
|
||||
NoValidTab = -1,
|
||||
TabStash = 0,
|
||||
TabOwnModels = 1,
|
||||
TabVPliot = 2
|
||||
};
|
||||
|
||||
//! Constructor
|
||||
explicit CDbMappingComponent(QWidget *parent = nullptr);
|
||||
|
||||
@@ -58,6 +69,15 @@ namespace BlackGui
|
||||
//! With vPilot rules
|
||||
bool withVPilot() const { return m_withVPilot; }
|
||||
|
||||
//! And models which can be stashed
|
||||
bool hasModelsForStash() const;
|
||||
|
||||
//! The model to be stashed
|
||||
BlackMisc::Simulation::CAircraftModelList getModelsForStash() const;
|
||||
|
||||
//! Current tab index
|
||||
TabIndex currentTabIndex() const;
|
||||
|
||||
signals:
|
||||
//! Request to filter by livery
|
||||
void filterByLivery(const BlackMisc::Aviation::CLivery &livery);
|
||||
@@ -73,7 +93,7 @@ namespace BlackGui
|
||||
BlackMisc::CStatusMessageList validate(bool withNestedForms) const;
|
||||
|
||||
//! Save
|
||||
void save();
|
||||
void saveSingleModelToDb();
|
||||
|
||||
//! Resize so that selection is easy (larger table view)
|
||||
void resizeForSelect();
|
||||
@@ -81,6 +101,9 @@ namespace BlackGui
|
||||
//! Resize so that mapping is easier
|
||||
void resizeForMapping();
|
||||
|
||||
//! Stash models
|
||||
void stashSelectedModels();
|
||||
|
||||
private slots:
|
||||
//! Load the vPilot rules
|
||||
void ps_loadVPilotData();
|
||||
@@ -91,6 +114,9 @@ namespace BlackGui
|
||||
//! Row count for vPilot data changed
|
||||
void ps_onVPilotCountChanged(int count, bool withFilter);
|
||||
|
||||
//! Stash count has been changed
|
||||
void ps_onStashCountChanged(int count, bool withFilter);
|
||||
|
||||
//! Row has been selected
|
||||
void ps_onModelRowSelected(const QModelIndex &index);
|
||||
|
||||
@@ -111,8 +137,10 @@ namespace BlackGui
|
||||
|
||||
private:
|
||||
QScopedPointer<Ui::CDbMappingComponent> ui;
|
||||
BlackMisc::Simulation::FsCommon::CVPilotRulesReader m_vPilotReader;
|
||||
std::unique_ptr<BlackMisc::Simulation::IAircraftModelLoader> m_modelLoader;
|
||||
BlackMisc::Simulation::FsCommon::CVPilotRulesReader m_vPilotReader; //!< read vPilot rules
|
||||
BlackCore::CData<BlackCore::Data::VPilotAircraftModels> m_cachedVPilotModels { this }; //!< cache for latest vPilot rules
|
||||
std::unique_ptr<BlackMisc::Simulation::IAircraftModelLoader> m_modelLoader; //!< read own aircraft models
|
||||
BlackCore::CData<BlackCore::Data::OwnSimulatorAircraftModels> m_cachedOwnModels { this }; //!< cache for latest models
|
||||
BlackCore::CData<BlackCore::Data::AuthenticatedUser> m_user {this, &CDbMappingComponent::ps_userChanged};
|
||||
bool m_vPilot1stInit = true;
|
||||
bool m_withVPilot = false;
|
||||
@@ -143,13 +171,13 @@ namespace BlackGui
|
||||
};
|
||||
|
||||
//! The menu for loading and handling VPilot rules for mapping
|
||||
//! \note This is specific for that very component
|
||||
//! \note This is a specific menu for that very component
|
||||
class CMappingVPilotMenu : public BlackGui::IMenuDelegate
|
||||
{
|
||||
public:
|
||||
//! Constructor
|
||||
CMappingVPilotMenu(CDbMappingComponent *mappingComponent) :
|
||||
BlackGui::IMenuDelegate(mappingComponent)
|
||||
CMappingVPilotMenu(CDbMappingComponent *mappingComponent, bool separatorAtEnd) :
|
||||
BlackGui::IMenuDelegate(mappingComponent, separatorAtEnd)
|
||||
{}
|
||||
|
||||
//! \copydoc IMenuDelegate::customMenu
|
||||
@@ -158,8 +186,23 @@ namespace BlackGui
|
||||
private:
|
||||
CDbMappingComponent *mappingComponent() const;
|
||||
};
|
||||
};
|
||||
|
||||
//! The menu for stashing models
|
||||
//! \note This is a specific menu for that very component
|
||||
class CStashMenu : public BlackGui::IMenuDelegate
|
||||
{
|
||||
public:
|
||||
//! Constructor
|
||||
CStashMenu(CDbMappingComponent *mappingComponent, bool separatorAtEnd) :
|
||||
BlackGui::IMenuDelegate(mappingComponent, separatorAtEnd)
|
||||
{}
|
||||
|
||||
//! \copydoc IMenuDelegate::customMenu
|
||||
virtual void customMenu(QMenu &menu) const override;
|
||||
|
||||
CDbMappingComponent *mappingComponent() const;
|
||||
};
|
||||
};
|
||||
} // ns
|
||||
} // ns
|
||||
#endif // guard
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>266</width>
|
||||
<height>618</height>
|
||||
<width>264</width>
|
||||
<height>616</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@@ -62,6 +62,38 @@
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="tab_StashAircraftModels">
|
||||
<attribute name="title">
|
||||
<string>Stashed aircraft</string>
|
||||
</attribute>
|
||||
<layout class="QHBoxLayout" name="hl_StashedAircraft">
|
||||
<property name="spacing">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="BlackGui::Components::CDbStashComponent" name="comp_StashAircraft">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_OwnModels">
|
||||
<attribute name="title">
|
||||
<string>Own models</string>
|
||||
@@ -91,7 +123,7 @@
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::SingleSelection</enum>
|
||||
<enum>QAbstractItemView::MultiSelection</enum>
|
||||
</property>
|
||||
<property name="selectionBehavior">
|
||||
<enum>QAbstractItemView::SelectRows</enum>
|
||||
@@ -132,7 +164,7 @@
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::SingleSelection</enum>
|
||||
<enum>QAbstractItemView::MultiSelection</enum>
|
||||
</property>
|
||||
<property name="selectionBehavior">
|
||||
<enum>QAbstractItemView::SelectRows</enum>
|
||||
@@ -194,7 +226,7 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>245</width>
|
||||
<width>243</width>
|
||||
<height>375</height>
|
||||
</rect>
|
||||
</property>
|
||||
@@ -370,6 +402,12 @@
|
||||
<header>blackgui/overlaymessagesframe.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>BlackGui::Components::CDbStashComponent</class>
|
||||
<extends>QFrame</extends>
|
||||
<header>blackgui/components/dbstashcomponent.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
|
||||
@@ -9,6 +9,12 @@
|
||||
|
||||
#include "dbstashcomponent.h"
|
||||
#include "ui_dbstashcomponent.h"
|
||||
#include "blackmisc/icons.h"
|
||||
|
||||
using namespace BlackMisc;
|
||||
using namespace BlackMisc::Simulation;
|
||||
using namespace BlackMisc::Network;
|
||||
using namespace BlackGui::Models;
|
||||
|
||||
namespace BlackGui
|
||||
{
|
||||
@@ -19,19 +25,79 @@ namespace BlackGui
|
||||
ui(new Ui::CDbStashComponent)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->ui->tvp_StashAircraftModels->setAircraftModelMode(CAircraftModelListModel::StashModel);
|
||||
|
||||
connect(this->ui->pb_Unstash, &QPushButton::pressed, this, &CDbStashComponent::ps_onUnstashPressed);
|
||||
connect(this->ui->pb_Validate, &QPushButton::pressed, this, &CDbStashComponent::ps_onValidatePressed);
|
||||
|
||||
ui->tvp_StashAircraftModels->setCustomMenu(new CStashModelsMenu(this, true));
|
||||
}
|
||||
|
||||
CDbStashComponent::~CDbStashComponent()
|
||||
{ }
|
||||
|
||||
void CDbStashComponent::setProvider(BlackMisc::Network::IWebDataServicesProvider *provider)
|
||||
void CDbStashComponent::setProvider(IWebDataServicesProvider *provider)
|
||||
{
|
||||
CWebDataServicesAware::setProvider(provider);
|
||||
}
|
||||
|
||||
void CDbStashComponent::gracefulShutdown()
|
||||
{
|
||||
// shutdown
|
||||
}
|
||||
|
||||
CStatusMessage CDbStashComponent::validateStashModel(const CAircraftModel &model) const
|
||||
{
|
||||
static const CLogCategoryList cats(CLogCategoryList(this).join({ CLogCategory::validation()}));
|
||||
if (this->ui->tvp_StashAircraftModels->container().containsModelStringOrId(model))
|
||||
{
|
||||
const QString msg("Model \"%1\" already stashed");
|
||||
return CStatusMessage(cats, CStatusMessage::SeverityError, msg.arg(model.getModelString()));
|
||||
}
|
||||
return CStatusMessage();
|
||||
}
|
||||
|
||||
CStatusMessage CDbStashComponent::stashModel(const CAircraftModel &model)
|
||||
{
|
||||
CStatusMessage m(validateStashModel(model));
|
||||
if (!m.isWarningOrAbove())
|
||||
{
|
||||
this->ui->tvp_StashAircraftModels->insert(model);
|
||||
}
|
||||
return m;
|
||||
}
|
||||
|
||||
CStatusMessageList CDbStashComponent::stashModels(const CAircraftModelList &models)
|
||||
{
|
||||
if (models.isEmpty()) { return CStatusMessageList(); }
|
||||
CStatusMessageList msgs;
|
||||
for (const CAircraftModel &model : models)
|
||||
{
|
||||
CStatusMessage m(stashModel(model));
|
||||
if (m.isWarningOrAbove()) { msgs.push_back(m); }
|
||||
}
|
||||
return msgs;
|
||||
}
|
||||
|
||||
const Views::CAircraftModelView *CDbStashComponent::getView() const
|
||||
{
|
||||
return ui->tvp_StashAircraftModels;
|
||||
}
|
||||
|
||||
void CDbStashComponent::ps_onUnstashPressed()
|
||||
{
|
||||
this->ui->tvp_StashAircraftModels->removeSelectedRows();
|
||||
}
|
||||
|
||||
void CDbStashComponent::ps_onValidatePressed()
|
||||
{
|
||||
if (this->ui->tvp_StashAircraftModels->isEmpty()) { return; }
|
||||
}
|
||||
|
||||
void CDbStashComponent::CStashModelsMenu::customMenu(QMenu &menu) const
|
||||
{
|
||||
menu.addAction(CIcons::database16(), "Unstash", this->parent(), SLOT(ps_onUnstashPressed()));
|
||||
nestedCustomMenu(menu);
|
||||
}
|
||||
|
||||
} // ns
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
#define BLACKGUI_COMPONENTS_DBSTASHCOMPONENT_H
|
||||
|
||||
#include "blackgui/components/enablefordockwidgetinfoarea.h"
|
||||
#include "blackgui/menudelegate.h"
|
||||
#include "blackgui/views/aircraftmodelview.h"
|
||||
#include "blackmisc/network/webdataservicesprovider.h"
|
||||
#include <QFrame>
|
||||
#include <QScopedPointer>
|
||||
@@ -46,10 +48,43 @@ namespace BlackGui
|
||||
//! Graceful shutdown
|
||||
void gracefulShutdown();
|
||||
|
||||
//! Test the given model if it can be stashed
|
||||
BlackMisc::CStatusMessage validateStashModel(const BlackMisc::Simulation::CAircraftModel &model) const;
|
||||
|
||||
//! Stash given model
|
||||
BlackMisc::CStatusMessage stashModel(const BlackMisc::Simulation::CAircraftModel &model);
|
||||
|
||||
//! Stash given models
|
||||
BlackMisc::CStatusMessageList stashModels(const BlackMisc::Simulation::CAircraftModelList &models);
|
||||
|
||||
//! The embedded view
|
||||
const BlackGui::Views::CAircraftModelView *getView() const;
|
||||
|
||||
signals:
|
||||
//! Unstash
|
||||
void unstashed(BlackMisc::Simulation::CAircraftModel &model);
|
||||
|
||||
private slots:
|
||||
//! Unstash pressed
|
||||
void ps_onUnstashPressed();
|
||||
|
||||
//! Validate pressed
|
||||
void ps_onValidatePressed();
|
||||
|
||||
private:
|
||||
QScopedPointer<Ui::CDbStashComponent> ui;
|
||||
};
|
||||
|
||||
//! Custom menu for the stashed models
|
||||
class CStashModelsMenu : public BlackGui::IMenuDelegate
|
||||
{
|
||||
public:
|
||||
//! Constructor
|
||||
CStashModelsMenu(CDbStashComponent *parent, bool separatorAtEnd) : IMenuDelegate(parent, separatorAtEnd) {}
|
||||
|
||||
//! \copydoc IMenuDelegate::customMenu
|
||||
virtual void customMenu(QMenu &menu) const override;
|
||||
};
|
||||
};
|
||||
} // ns
|
||||
} // ns
|
||||
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
<?xml version='1.0'?>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>CDbStashComponent</class>
|
||||
<widget class="QFrame" name="CDbStashComponent">
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
@@ -13,11 +10,104 @@
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Frame</string>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Plain</enum>
|
||||
</property>
|
||||
<property name="lineWidth">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="vl_DbStashComponent">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="BlackGui::Views::CAircraftModelView" name="tvp_StashAircraftModels">
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::MultiSelection</enum>
|
||||
</property>
|
||||
<property name="selectionBehavior">
|
||||
<enum>QAbstractItemView::SelectRows</enum>
|
||||
</property>
|
||||
<attribute name="verticalHeaderVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="fr_StashHandling">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="hl_StashHandling">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pb_Unstash">
|
||||
<property name="text">
|
||||
<string>Unstash</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pb_Validate">
|
||||
<property name="text">
|
||||
<string>Validate</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pb_Save">
|
||||
<property name="text">
|
||||
<string>Save</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>BlackGui::Views::CAircraftModelView</class>
|
||||
<extends>QTableView</extends>
|
||||
<header>blackgui/views/aircraftmodelview.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<tabstops>
|
||||
<tabstop>pb_Unstash</tabstop>
|
||||
<tabstop>pb_Validate</tabstop>
|
||||
<tabstop>pb_Save</tabstop>
|
||||
<tabstop>tvp_StashAircraftModels</tabstop>
|
||||
</tabstops>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
||||
Reference in New Issue
Block a user