diff --git a/src/blackgui/components/dbmappingcomponent.cpp b/src/blackgui/components/dbmappingcomponent.cpp index 1a9c077a7..33d26cbdd 100644 --- a/src/blackgui/components/dbmappingcomponent.cpp +++ b/src/blackgui/components/dbmappingcomponent.cpp @@ -10,9 +10,9 @@ #include "dbmappingcomponent.h" #include "ui_dbmappingcomponent.h" #include "blackgui/guiutility.h" +#include "blackgui/shortcut.h" #include "blackmisc/simulation/fscommon/aircraftcfgparser.h" #include "blackmisc/logmessage.h" -#include "blackmisc/project.h" #include using namespace BlackCore; @@ -35,14 +35,23 @@ namespace BlackGui { ui->setupUi(this); this->ui->comp_StashAircraft->setMappingComponent(this); - this->ui->tvp_AircraftModelsForVPilot->setAircraftModelMode(CAircraftModelListModel::VPilotRuleModel); - this->ui->tvp_OwnAircraftModels->setAircraftModelMode(CAircraftModelListModel::OwnSimulatorModelMapping); - connect(ui->editor_Model, &CModelMappingForm::requestSave, this, &CDbMappingComponent::saveSingleModelToDb); + this->ui->tvp_AircraftModelsForVPilot->setAircraftModelMode(CAircraftModelListModel::VPilotRuleModel); + this->ui->tvp_AircraftModelsForVPilot->setAllowStash(true); + this->ui->tvp_OwnAircraftModels->setAircraftModelMode(CAircraftModelListModel::OwnSimulatorModelMapping); + this->ui->tvp_OwnAircraftModels->setAllowStash(true); + + // connects + connect(ui->editor_Model, &CModelMappingForm::requestPublish, this, &CDbMappingComponent::ps_publishSingleModelToDb); + connect(ui->editor_Model, &CModelMappingForm::requestStash, this, &CDbMappingComponent::ps_stashCurrentModel); + connect(ui->tvp_OwnAircraftModels, &CAircraftModelView::doubleClicked, this, &CDbMappingComponent::ps_onModelRowSelected); connect(ui->tvp_OwnAircraftModels, &CAircraftModelView::rowCountChanged, this, &CDbMappingComponent::ps_onOwnModelsCountChanged); + connect(ui->tvp_OwnAircraftModels, &CAircraftModelView::requestStash, this, &CDbMappingComponent::stashSelectedModels); connect(ui->comp_StashAircraft->getView(), &CAircraftModelView::rowCountChanged, this, &CDbMappingComponent::ps_onStashCountChanged); - connect(ui->comp_StashAircraft, &CDbStashComponent::stashedModelChanged, this, &CDbMappingComponent::ps_onStashedModelsChanged); + connect(ui->comp_StashAircraft->getView(), &CAircraftModelView::doubleClicked, this, &CDbMappingComponent::ps_onModelRowSelected); + connect(ui->comp_StashAircraft->getView(), &CAircraftModelView::requestHandlingOfStashDrop, this, &CDbMappingComponent::ps_handleStashDropRequest); + connect(ui->comp_StashAircraft, &CDbStashComponent::stashedModelsChanged, this, &CDbMappingComponent::ps_onStashedModelsChanged); ui->tvp_OwnAircraftModels->setDisplayAutomatically(true); ui->tvp_OwnAircraftModels->setCustomMenu(new CMappingSimulatorModelMenu(this)); @@ -57,6 +66,7 @@ namespace BlackGui this->ui->tw_ModelsToBeMapped->setTabIcon(TabStash, CIcons::appDbStash16()); this->ui->tw_ModelsToBeMapped->setTabIcon(TabOwnModels, CIcons::appModels16()); + // vPilot this->initVPilotLoading(); } @@ -67,17 +77,18 @@ namespace BlackGui void CDbMappingComponent::initVPilotLoading() { - bool canUseVPilot = CProject::isRunningOnWindowsNtPlatform() && CProject::isCompiledWithMsFlightSimulatorSupport(); + bool canUseVPilot = true; // further restriction could go here bool withVPilotRights = canUseVPilot && this->m_user.get().isMappingAdmin(); this->m_withVPilot = withVPilotRights; 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); + this->ui->tvp_AircraftModelsForVPilot->setCustomMenu(new CStashMenu(this, true)); + connect(this->ui->tvp_AircraftModelsForVPilot, &CAircraftModelView::doubleClicked, this, &CDbMappingComponent::ps_onModelRowSelected); + connect(this->ui->tvp_AircraftModelsForVPilot, &CAircraftModelView::rowCountChanged, this, &CDbMappingComponent::ps_onVPilotCountChanged); connect(&m_vPilotReader, &CVPilotRulesReader::readFinished, this, &CDbMappingComponent::ps_onLoadVPilotDataFinished); + connect(this->ui->tvp_AircraftModelsForVPilot, &CAircraftModelView::requestStash, this, &CDbMappingComponent::stashSelectedModels); this->ui->tvp_AircraftModelsForVPilot->setCustomMenu(new CMappingVPilotMenu(this, true)); this->ui->tvp_AircraftModelsForVPilot->setDisplayAutomatically(true); const CAircraftModelList cachedModels(m_cachedVPilotModels.get()); @@ -122,6 +133,29 @@ namespace BlackGui } } + CAircraftModel CDbMappingComponent::getModelFromView(const QModelIndex &index) const + { + if (!index.isValid()) { return CAircraftModel(); } + QObject *sender = QObject::sender(); + if (sender == this->ui->tvp_AircraftModelsForVPilot) + { + return this->ui->tvp_AircraftModelsForVPilot->at(index); + } + else if (sender == this->ui->tvp_OwnAircraftModels) + { + return this->ui->tvp_OwnAircraftModels->at(index); + } + else if (sender == this->ui->comp_StashAircraft || sender == this->ui->comp_StashAircraft->getView()) + { + return this->ui->comp_StashAircraft->getView()->at(index); + } + + // no sender, use current tab + const CAircraftModelView *v = this->currentModelView(); + if (!v) { return CAircraftModel(); } + return v->at(index); + } + void CDbMappingComponent::setProvider(BlackMisc::Network::IWebDataServicesProvider *provider) { CWebDataServicesAware::setProvider(provider); @@ -139,24 +173,40 @@ namespace BlackGui if (this->m_modelLoader) { this->m_modelLoader->gracefulShutdown(); } } - bool CDbMappingComponent::hasModelsForStash() const + bool CDbMappingComponent::hasModelsToStash() const { TabIndex tab = currentTabIndex(); switch (tab) { case TabOwnModels: - return ui->tvp_OwnAircraftModels->hasSelection(); + return ui->tvp_OwnAircraftModels->hasModelsToStash(); case TabVPliot: - return ui->tvp_AircraftModelsForVPilot->hasSelection(); + return ui->tvp_AircraftModelsForVPilot->hasModelsToStash(); default: break; } return false; } - CAircraftModelList CDbMappingComponent::getModelsForStash() const + const CAircraftModelView *CDbMappingComponent::currentModelView() const { - if (!hasModelsForStash()) { return CAircraftModelList(); } + TabIndex tab = currentTabIndex(); + switch (tab) + { + case TabOwnModels: + return ui->tvp_OwnAircraftModels; + case TabVPliot: + return ui->tvp_AircraftModelsForVPilot; + case TabStash: + return ui->comp_StashAircraft->getView(); + default: + return nullptr; + } + } + + CAircraftModelList CDbMappingComponent::getModelsToStash() const + { + if (!hasModelsToStash()) { return CAircraftModelList(); } TabIndex tab = currentTabIndex(); switch (tab) { @@ -170,12 +220,27 @@ namespace BlackGui return CAircraftModelList(); } + const CAircraftModelList &CDbMappingComponent::getStashedModels() const + { + return ui->comp_StashAircraft->getStashedModels(); + } + + QStringList CDbMappingComponent::getStashedModelStrings() const + { + return ui->comp_StashAircraft->getStashedModelStrings(); + } + CDbMappingComponent::TabIndex CDbMappingComponent::currentTabIndex() const { int t = ui->tw_ModelsToBeMapped->currentIndex(); return static_cast(t); } + bool CDbMappingComponent::isStashedView() const + { + return currentTabIndex() == TabStash; + } + CStatusMessageList CDbMappingComponent::validate(bool withNestedForms) const { CStatusMessageList msgs(this->ui->editor_Model->validate(!withNestedForms)); @@ -188,7 +253,7 @@ namespace BlackGui return msgs; } - void CDbMappingComponent::saveSingleModelToDb() + void CDbMappingComponent::ps_publishSingleModelToDb() { CStatusMessageList msgs(validate(true)); if (msgs.hasErrorMessages()) @@ -198,14 +263,33 @@ namespace BlackGui return; } - CAircraftModel model(getAircraftModel()); - msgs = this->asyncWriteModelToDb(model); + const CAircraftModel model(getAircraftModel()); + msgs = this->asyncWriteModel(model); if (!msgs.isEmpty()) { CLogMessage(this).preformatted(msgs); } } + void CDbMappingComponent::ps_handleStashDropRequest(const CAirlineIcaoCode &code) const + { + CLivery stdLivery(this->getStdLiveryForAirlineCode(code)); + if (!stdLivery.hasValidDbKey()) { return; } + this->ui->comp_StashAircraft->applyToSelected(stdLivery); + } + + void CDbMappingComponent::ps_stashCurrentModel() + { + const CAircraftModel model(getAircraftModel()); + if (!model.hasModelString()) + { + CStatusMessage msg = CStatusMessage(CStatusMessage::SeverityError, "no model string, ignored"); + this->showMessage(msg); + return; + } + this->ui->comp_StashAircraft->stashModel(model); + } + void CDbMappingComponent::resizeForSelect() { int h = this->height(); @@ -279,6 +363,14 @@ namespace BlackGui this->ui->tvp_OwnAircraftModels->hideLoadIndicator(); } + void CDbMappingComponent::ps_onVPilotCacheChanged() + { + if (this->ui->tvp_AircraftModelsForVPilot->displayAutomatically()) + { + this->ui->tvp_AircraftModelsForVPilot->updateContainerMaybeAsync(this->m_cachedVPilotModels.get()); + } + } + void CDbMappingComponent::ps_onStashedModelsChanged() { bool hlvp = this->ui->tvp_AircraftModelsForVPilot->derivedModel()->highlightGivenModelStrings(); @@ -351,10 +443,10 @@ namespace BlackGui void CDbMappingComponent::stashSelectedModels() { - if (!this->hasModelsForStash()) { return; } + if (!this->hasModelsToStash()) { return; } CStatusMessageList msgs = this->ui->comp_StashAircraft->stashModels( - this->getModelsForStash() + this->getModelsToStash() ); if (msgs.hasWarningOrErrorMessages()) { @@ -364,20 +456,8 @@ namespace BlackGui void CDbMappingComponent::ps_onModelRowSelected(const QModelIndex &index) { - QObject *sender = QObject::sender(); - CAircraftModel model; - if (sender == this->ui->tvp_AircraftModelsForVPilot) - { - model = this->ui->tvp_AircraftModelsForVPilot->at(index); - } - else if (sender == this->ui->tvp_OwnAircraftModels) - { - model = this->ui->tvp_OwnAircraftModels->at(index); - } - else - { - return; - } + CAircraftModel model(this->getModelFromView(index)); + if (!model.hasModelString()) { return; } this->ui->editor_Model->setValue(model); const CLivery livery(this->smartLiverySelector(model.getLivery())); @@ -507,11 +587,9 @@ namespace BlackGui { CDbMappingComponent *mapComp = qobject_cast(this->parent()); Q_ASSERT_X(mapComp, Q_FUNC_INFO, "Cannot access mapping component"); - if (mapComp->hasModelsForStash()) + if (mapComp->hasModelsToStash()) { - QAction *a = menu.addAction(CIcons::appMappings16(), "Stash", mapComp, SLOT(stashSelectedModels()), Qt::ALT + Qt::Key_S); - a->setShortcut(Qt::ALT + Qt::Key_S); - + menu.addAction(CIcons::appMappings16(), "Stash", mapComp, SLOT(stashSelectedModels()), CShortcut::keyStash()); } this->nestedCustomMenu(menu); } diff --git a/src/blackgui/components/dbmappingcomponent.h b/src/blackgui/components/dbmappingcomponent.h index d86dd24f3..bc8781730 100644 --- a/src/blackgui/components/dbmappingcomponent.h +++ b/src/blackgui/components/dbmappingcomponent.h @@ -19,6 +19,7 @@ #include "blackgui/menudelegate.h" #include "blackgui/enableforviewbasedindicator.h" #include "blackgui/components/enablefordockwidgetinfoarea.h" +#include "blackgui/views/aircraftmodelview.h" #include "blackmisc/simulation/aircraftmodelloader.h" #include "blackmisc/simulation/fscommon/vpilotrulesreader.h" #include "blackmisc/network/webdataservicesprovider.h" @@ -69,15 +70,24 @@ namespace BlackGui //! With vPilot rules bool withVPilot() const { return m_withVPilot; } - //! And models which can be stashed - bool hasModelsForStash() const; + //! Any models which can be stashed + bool hasModelsToStash() const; - //! The model to be stashed - BlackMisc::Simulation::CAircraftModelList getModelsForStash() const; + //! The models to be stashed + BlackMisc::Simulation::CAircraftModelList getModelsToStash() const; + + //! Stashed models + const BlackMisc::Simulation::CAircraftModelList &getStashedModels() const; + + //! Stashed models trings + QStringList getStashedModelStrings() const; //! Current tab index TabIndex currentTabIndex() const; + //! Is stashed view + bool isStashedView() const; + //! Unvalidated consolidated aircraft model from the subparts (icao, distributor) //! \note not guaranteed to be valid, just snapshot of as it state BlackMisc::Simulation::CAircraftModel getAircraftModel() const; @@ -96,9 +106,6 @@ namespace BlackGui //! Validate, empty list means OK BlackMisc::CStatusMessageList validate(bool withNestedForms) const; - //! Save - void saveSingleModelToDb(); - //! Resize so that selection is easy (larger table view) void resizeForSelect(); @@ -115,9 +122,18 @@ namespace BlackGui //! Data for vPilot have been loaded void ps_onLoadVPilotDataFinished(bool success); + //! vPilot cached changed + void ps_onVPilotCacheChanged(); + //! Stashed models changed void ps_onStashedModelsChanged(); + //! Publish + void ps_publishSingleModelToDb(); + + //! Stash drop request + void ps_handleStashDropRequest(const BlackMisc::Aviation::CAirlineIcaoCode &code) const; + //! Row count for vPilot data changed void ps_onVPilotCountChanged(int count, bool withFilter); @@ -142,10 +158,13 @@ namespace BlackGui //! User object changed void ps_userChanged(); + //! Stash current model + void ps_stashCurrentModel(); + private: QScopedPointer ui; BlackMisc::Simulation::FsCommon::CVPilotRulesReader m_vPilotReader; //!< read vPilot rules - BlackCore::CData m_cachedVPilotModels { this }; //!< cache for latest vPilot rules + BlackCore::CData m_cachedVPilotModels { this, &CDbMappingComponent::ps_onVPilotCacheChanged }; //!< cache for latest vPilot rules std::unique_ptr m_modelLoader; //!< read own aircraft models BlackCore::CData m_cachedOwnModels { this }; //!< cache for latest models BlackCore::CData m_user {this, &CDbMappingComponent::ps_userChanged}; @@ -158,6 +177,12 @@ namespace BlackGui //! Init model loader bool initModelLoader(const BlackMisc::Simulation::CSimulatorInfo &simInfo); + //! Model for given index from sender/current view + BlackMisc::Simulation::CAircraftModel getModelFromView(const QModelIndex &index) const; + + //! Current model view + const BlackGui::Views::CAircraftModelView *currentModelView() const; + // -------------------- component specific menus -------------------------- //! The menu for loading and handling own models for mapping @@ -188,6 +213,7 @@ namespace BlackGui virtual void customMenu(QMenu &menu) const override; private: + //! Mapping component CDbMappingComponent *mappingComponent() const; }; @@ -204,6 +230,8 @@ namespace BlackGui //! \copydoc IMenuDelegate::customMenu virtual void customMenu(QMenu &menu) const override; + private: + //! Mapping component CDbMappingComponent *mappingComponent() const; }; }; diff --git a/src/blackgui/components/dbmappingcomponent.ui b/src/blackgui/components/dbmappingcomponent.ui index 9276bf22e..bf659dd71 100644 --- a/src/blackgui/components/dbmappingcomponent.ui +++ b/src/blackgui/components/dbmappingcomponent.ui @@ -2,6 +2,14 @@ CDbMappingComponent + + + 0 + 0 + 262 + 618 + + Frame @@ -214,6 +222,14 @@ true + + + 0 + 0 + 244 + 425 + + 0 @@ -281,7 +297,6 @@ QFrame::Raised - fr_EditorsRight