From 1601ca62fdcac8fc0820e67a3d7cc5b30738f882 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sun, 13 Dec 2015 19:40:04 +0100 Subject: [PATCH] refs #535, updated aircraft model / view * add functions to apply changes to selected objects * allow to highlight models by their model strings * Utility function to show which parts come from DB * model strings can be obtained sorted/unsorted --- src/blackgui/components/mappingcomponent.cpp | 2 +- .../models/aircraftmodellistmodel.cpp | 56 +++++++++++++++---- src/blackgui/models/aircraftmodellistmodel.h | 28 +++++++--- src/blackgui/views/aircraftmodelview.cpp | 28 ++++++++-- src/blackgui/views/aircraftmodelview.h | 9 +++ src/blackmisc/simulation/aircraftmatcher.cpp | 2 +- src/blackmisc/simulation/aircraftmodel.cpp | 14 +++++ src/blackmisc/simulation/aircraftmodel.h | 8 ++- .../simulation/aircraftmodellist.cpp | 28 +++++++++- src/blackmisc/simulation/aircraftmodellist.h | 11 +++- 10 files changed, 156 insertions(+), 30 deletions(-) diff --git a/src/blackgui/components/mappingcomponent.cpp b/src/blackgui/components/mappingcomponent.cpp index 67bc220a6..53322334d 100644 --- a/src/blackgui/components/mappingcomponent.cpp +++ b/src/blackgui/components/mappingcomponent.cpp @@ -302,7 +302,7 @@ namespace BlackGui this->ui->tvp_AircraftModels->updateContainer(ml); // model completer - this->m_modelCompleter->setModel(new QStringListModel(ml.getSortedModelStrings(), this->m_modelCompleter)); + this->m_modelCompleter->setModel(new QStringListModel(ml.getModelStrings(), this->m_modelCompleter)); this->m_modelCompleter->setModelSorting(QCompleter::CaseInsensitivelySortedModel); this->m_modelCompleter->setCaseSensitivity(Qt::CaseInsensitive); this->m_modelCompleter->setWrapAround(true); diff --git a/src/blackgui/models/aircraftmodellistmodel.cpp b/src/blackgui/models/aircraftmodellistmodel.cpp index 47ee10da0..09be4f10f 100644 --- a/src/blackgui/models/aircraftmodellistmodel.cpp +++ b/src/blackgui/models/aircraftmodellistmodel.cpp @@ -42,20 +42,25 @@ namespace BlackGui case OwnSimulatorModel: case StashModel: this->m_columns.addColumn(CColumn::standardString("model", { CAircraftModel::IndexModelString})); + this->m_columns.addColumn(CColumn::standardString("DB", "parts from DB", { CAircraftModel::IndexPartsDbStatus})); this->m_columns.addColumn(CColumn::standardString("description", { CAircraftModel::IndexDescription})); - this->m_columns.addColumn(CColumn::standardString("name", { CAircraftModel::IndexName})); - this->m_columns.addColumn(CColumn::standardString("filename", { CAircraftModel::IndexFileName})); this->m_columns.addColumn(CColumn::standardString("sim.", "simulator supported", CAircraftModel::IndexSimulatorInfoAsString)); + this->m_columns.addColumn(CColumn::standardString("dist.", "distributor", { CAircraftModel::IndexDistributor, CDistributor::IndexDbStringKey})); + this->m_columns.addColumn(CColumn::standardString("aircraft", { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexDesignatorManufacturer})); + this->m_columns.addColumn(CColumn::standardString("livery", { CAircraftModel::IndexLivery, CLivery::IndexCombinedCode})); this->m_columns.addColumn(CColumn::standardString("airline", { CAircraftModel::IndexLivery, CLivery::IndexAirlineIcaoCode, CAirlineIcaoCode::IndexDesignatorNameCountry})); + this->m_columns.addColumn(CColumn::standardString("name", { CAircraftModel::IndexName})); + this->m_columns.addColumn(CColumn::standardString("filename", { CAircraftModel::IndexFileName})); + // default sort order this->setSortColumnByPropertyIndex(CAircraftModel::IndexModelString); this->m_sortOrder = Qt::AscendingOrder; break; - case MappedModel: + case OwnSimulatorModelMapping: this->m_columns.addColumn(CColumn::standardValueObject("call", "callsign", CAircraftModel::IndexCallsign)); this->m_columns.addColumn(CColumn::standardString("model", CAircraftModel::IndexModelString)); this->m_columns.addColumn(CColumn::standardString("ac", "aircraft ICAO", { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexAircraftDesignator})); @@ -120,19 +125,50 @@ namespace BlackGui } } + QStringList CAircraftModelListModel::getModelStrings(bool sort) const + { + if (this->isEmpty()) { return QStringList(); } + return this->container().getModelStrings(sort); + } + + void CAircraftModelListModel::replaceOrAddByModelString(const CAircraftModelList &models) + { + if (models.isEmpty()) { return; } + CAircraftModelList currentModels(container()); + currentModels.removeModelsWithString(models.getModelStrings(true), Qt::CaseInsensitive); + currentModels.push_back(models); + this->updateContainerMaybeAsync(currentModels); + } + QVariant CAircraftModelListModel::data(const QModelIndex &index, int role) const { - if (!m_highlightDbData || role != Qt::BackgroundRole) { return CListModelBase::data(index, role); } + if (role != Qt::BackgroundRole) { return CListModelBase::data(index, role); } + bool db = highlightDbData(); + bool ms = highlightGivenModelStrings() && !m_highlightStrings.isEmpty(); + if (!db && !ms) { return CListModelBase::data(index, role); } + CAircraftModel model(this->at(index)); - if (model.hasValidDbKey()) - { - static const QBrush b(Qt::green); - return b; - } - else + // highlight stashed first + if (ms) { + if (m_highlightStrings.contains(model.getModelString(), Qt::CaseInsensitive)) + { + static const QBrush b(Qt::yellow); + return b; + } return QVariant(); } + + // highlight DB models + if (db) + { + if (model.hasValidDbKey()) + { + static const QBrush b(Qt::green); + return b; + } + } + return QVariant(); } } // namespace } // namespace diff --git a/src/blackgui/models/aircraftmodellistmodel.h b/src/blackgui/models/aircraftmodellistmodel.h index e7cba8ab2..84110ba7c 100644 --- a/src/blackgui/models/aircraftmodellistmodel.h +++ b/src/blackgui/models/aircraftmodellistmodel.h @@ -13,8 +13,9 @@ #define BLACKGUI_AIRCRAFTMODELLISTMODEL_H #include "blackgui/blackguiexport.h" -#include "blackmisc/simulation/aircraftmodellist.h" #include "blackgui/models/modelswithdbkey.h" +#include "blackmisc/simulation/aircraftmodellist.h" +#include #include namespace BlackGui @@ -33,7 +34,6 @@ namespace BlackGui NotSet, OwnSimulatorModel, ///< models existing for my simulator OwnSimulatorModelMapping, ///< models of my simulator, but in mapping mode - MappedModel, ///< model based on mapping operation Database, ///< Database entry VPilotRuleModel, ///< vPilot rule turned into model StashModel ///< stashed models @@ -57,20 +57,30 @@ namespace BlackGui //! Highlight the DB models void setHighlightDbData(bool highlightDbData) { m_highlightDbData = highlightDbData; } - //! Highlight stashed models - bool highlightStashedModels() const { return m_highlightStashedData; } + //! Highlight models + bool highlightGivenModelStrings() const { return m_highlightModelStrings; } - //! Highlight stashed models - void setHighlightStashedModels(bool highlightStashedModels) { m_highlightStashedData = highlightStashedModels; } + //! Highlight models + void setHighlightModelsStrings(const QStringList &modelStrings = QStringList()) { m_highlightStrings = modelStrings; } + + //! Highlight models + void setHighlightModelsStrings(bool highlightModelStrings) { m_highlightModelStrings = highlightModelStrings; } + + //! Model strings + QStringList getModelStrings(bool sort) const; + + //! Replace models with same model string, or just add + void replaceOrAddByModelString(const BlackMisc::Simulation::CAircraftModelList &models); protected: //! \copydoc QAbstractItemModel::data virtual QVariant data(const QModelIndex &index, int role) const override; private: - AircraftModelMode m_mode = NotSet; //!< current mode - bool m_highlightDbData = false; - bool m_highlightStashedData = false; + AircraftModelMode m_mode = NotSet; //!< current mode + bool m_highlightDbData = false; //!< highlight if DB data entry (valid key) + bool m_highlightModelStrings = false; //!< highlight in in model strings + QStringList m_highlightStrings; //!< model strings to highlight }; } // ns } // ns diff --git a/src/blackgui/views/aircraftmodelview.cpp b/src/blackgui/views/aircraftmodelview.cpp index 86716fdb7..0af4fc413 100644 --- a/src/blackgui/views/aircraftmodelview.cpp +++ b/src/blackgui/views/aircraftmodelview.cpp @@ -15,6 +15,7 @@ using namespace BlackMisc; using namespace BlackMisc::Simulation; +using namespace BlackMisc::Aviation; using namespace BlackGui::Models; using namespace BlackGui::Filters; @@ -56,7 +57,7 @@ namespace BlackGui break; case CAircraftModelListModel::VPilotRuleModel: this->m_withMenuItemClear = false; - this->m_withMenuItemRefresh = false; + this->m_withMenuItemRefresh = true; this->m_withMenuItemBackend = false; this->setCustomMenu(new CHighlightDbModelsMenu(this, true)); this->setCustomMenu(new CHighlightStashedModelsMenu(this, true)); @@ -80,6 +81,25 @@ namespace BlackGui } } + void CAircraftModelView::applyToSelected(const CLivery &livery) + { + if (!hasSelection()) { return; } + int c = this->updateSelected(CVariant::from(livery), CAircraftModel::IndexLivery); + // this->updateContainer(models); + } + + void CAircraftModelView::applyToSelected(const CAircraftIcaoCode &icao) + { + if (!hasSelection()) { return; } + int c = this->updateSelected(CVariant::from(icao), CAircraftModel::IndexAircraftIcaoCode); + } + + void CAircraftModelView::applyToSelected(const CDistributor &distributor) + { + if (!hasSelection()) { return; } + int c = this->updateSelected(CVariant::from(distributor), CAircraftModel::IndexDistributor); + } + void CAircraftModelView::ps_toggleHighlightDbModels() { bool h = derivedModel()->highlightDbData(); @@ -88,8 +108,8 @@ namespace BlackGui void CAircraftModelView::ps_toggleHighlightStashedModels() { - bool h = derivedModel()->highlightStashedModels(); - derivedModel()->setHighlightStashedModels(!h); + bool h = derivedModel()->highlightGivenModelStrings(); + derivedModel()->setHighlightModelsStrings(!h); } void CAircraftModelView::CHighlightDbModelsMenu::customMenu(QMenu &menu) const @@ -108,7 +128,7 @@ namespace BlackGui Q_ASSERT_X(mv, Q_FUNC_INFO, "no view"); QAction *a = menu.addAction(CIcons::appDbStash16(), "Highlight stashed models", mv, SLOT(ps_toggleHighlightStashedModels())); a->setCheckable(true); - a->setChecked(mv->derivedModel()->highlightStashedModels()); + a->setChecked(mv->derivedModel()->highlightGivenModelStrings()); this->nestedCustomMenu(menu); } diff --git a/src/blackgui/views/aircraftmodelview.h b/src/blackgui/views/aircraftmodelview.h index 11de20d97..3569c68a7 100644 --- a/src/blackgui/views/aircraftmodelview.h +++ b/src/blackgui/views/aircraftmodelview.h @@ -34,6 +34,15 @@ namespace BlackGui //! Set display mode void setAircraftModelMode(Models::CAircraftModelListModel::AircraftModelMode mode); + //! Apply to selected objects + void applyToSelected(const BlackMisc::Aviation::CLivery &livery); + + //! Apply to selected objects + void applyToSelected(const BlackMisc::Aviation::CAircraftIcaoCode &icao); + + //! Apply to selected objects + void applyToSelected(const BlackMisc::Simulation::CDistributor &distributor); + signals: //! Request to load VPilot data void requestVPilotRules(); diff --git a/src/blackmisc/simulation/aircraftmatcher.cpp b/src/blackmisc/simulation/aircraftmatcher.cpp index eb8b7def0..8785a6acb 100644 --- a/src/blackmisc/simulation/aircraftmatcher.cpp +++ b/src/blackmisc/simulation/aircraftmatcher.cpp @@ -132,7 +132,7 @@ namespace BlackMisc int CAircraftMatcher::synchronize() { - return synchronizeWithExistingModels(m_installedModels.getSortedModelStrings()); + return synchronizeWithExistingModels(m_installedModels.getModelStrings()); } void CAircraftMatcher::cancelInit() diff --git a/src/blackmisc/simulation/aircraftmodel.cpp b/src/blackmisc/simulation/aircraftmodel.cpp index 4aa6d09e7..849ebe4e4 100644 --- a/src/blackmisc/simulation/aircraftmodel.cpp +++ b/src/blackmisc/simulation/aircraftmodel.cpp @@ -92,6 +92,8 @@ namespace BlackMisc return m_livery.propertyByIndex(index.copyFrontRemoved()); case IndexCallsign: return m_callsign.propertyByIndex(index.copyFrontRemoved()); + case IndexPartsDbStatus: + return getPartsDbStatus(); default: return CValueObject::propertyByIndex(index); } @@ -179,6 +181,8 @@ namespace BlackMisc return Compare::compare(this->m_modelType, compareValue.getModelType()); case IndexModelMode: return Compare::compare(this->m_modelMode, compareValue.getModelMode()); + case IndexPartsDbStatus: + return getPartsDbStatus().compare(compareValue.getPartsDbStatus()); default: break; } @@ -255,6 +259,16 @@ namespace BlackMisc return m_simulator.isAnySimulator(); } + QString CAircraftModel::getPartsDbStatus() const + { + QString s(hasValidDbKey() ? "M" : "m"); + s = s.append(getDistributor().hasValidDbKey() ? 'D' : 'd'); + s = s.append(getAircraftIcaoCode().hasValidDbKey() ? 'A' : 'a'); + s = s.append(getLivery().hasValidDbKey() ? 'L' : 'l'); + s = s.append(getLivery().getAirlineIcaoCode().hasValidDbKey() ? 'A' : 'a'); + return s; + } + bool CAircraftModel::matchesModelString(const QString &modelString, Qt::CaseSensitivity sensitivity) const { if (sensitivity == Qt::CaseSensitive) diff --git a/src/blackmisc/simulation/aircraftmodel.h b/src/blackmisc/simulation/aircraftmodel.h index c252ccb40..777ae729c 100644 --- a/src/blackmisc/simulation/aircraftmodel.h +++ b/src/blackmisc/simulation/aircraftmodel.h @@ -70,7 +70,8 @@ namespace BlackMisc IndexModelTypeAsString, IndexModelMode, IndexModelModeAsString, - IndexHasQueriedModelString + IndexHasQueriedModelString, + IndexPartsDbStatus }; //! \copydoc BlackMisc::CValueObject::registerMetadata @@ -199,7 +200,7 @@ namespace BlackMisc //! Set simulator info void setSimulatorInfo(const CSimulatorInfo &simulator) { this->m_simulator = simulator; } - //! File name (corresponding data for simulator, only available if representing simulator model= + //! File name (corresponding data for simulator, only available if representing simulator model QString getFileName() const { return m_fileName; } //! File name? @@ -226,6 +227,9 @@ namespace BlackMisc //! Valid simulator bool hasValidSimulator() const; + //! Info, which parts/subparts (Livery, Aircraft ICAO, ...) are already based on DB data + QString getPartsDbStatus() const; + //! Matches model string? bool matchesModelString(const QString &modelString, Qt::CaseSensitivity sensitivity) const; diff --git a/src/blackmisc/simulation/aircraftmodellist.cpp b/src/blackmisc/simulation/aircraftmodellist.cpp index d4054c8c0..f44cccee5 100644 --- a/src/blackmisc/simulation/aircraftmodellist.cpp +++ b/src/blackmisc/simulation/aircraftmodellist.cpp @@ -138,16 +138,40 @@ namespace BlackMisc }); } - QStringList CAircraftModelList::getSortedModelStrings() const + QStringList CAircraftModelList::getModelStrings(bool sort) const { QStringList ms; for (const CAircraftModel &model : (*this)) { ms.append(model.getModelString()); } - ms.sort(Qt::CaseInsensitive); + if (sort) { ms.sort(Qt::CaseInsensitive); } return ms; } + void CAircraftModelList::updateDistributor(const CDistributor &distributor) + { + for (CAircraftModel &model : *this) + { + model.setDistributor(distributor); + } + } + + void CAircraftModelList::updateAircraftIcao(const CAircraftIcaoCode &icao) + { + for (CAircraftModel &model : *this) + { + model.setAircraftIcaoCode(icao); + } + } + + void CAircraftModelList::updateLivery(const CLivery &livery) + { + for (CAircraftModel &model : *this) + { + model.setLivery(livery); + } + } + } // namespace } // namespace diff --git a/src/blackmisc/simulation/aircraftmodellist.h b/src/blackmisc/simulation/aircraftmodellist.h index 8a112c6ac..3304f54a4 100644 --- a/src/blackmisc/simulation/aircraftmodellist.h +++ b/src/blackmisc/simulation/aircraftmodellist.h @@ -76,7 +76,16 @@ namespace BlackMisc int removeModelsWithString(const QStringList &modelStrings, Qt::CaseSensitivity sensitivity); //! Model strings - QStringList getSortedModelStrings() const; + QStringList getModelStrings(bool sort = true) const; + + //! Update distributors + void updateDistributor(const CDistributor &distributor); + + //! Update aircraft ICAO + void updateAircraftIcao(const BlackMisc::Aviation::CAircraftIcaoCode &icao); + + //! Update livery + void updateLivery(const BlackMisc::Aviation::CLivery &livery); }; } //namespace