From 54adb403298a0ea387f9e045c27b6f271f2482aa Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sat, 9 Mar 2019 02:05:07 +0100 Subject: [PATCH] Ref T472, further utility functions for category handling --- .../aviation/aircraftcategorylist.cpp | 7 +++ src/blackmisc/aviation/aircraftcategorylist.h | 3 + .../aviation/aircrafticaocodelist.cpp | 4 +- src/blackmisc/aviation/aircrafticaocodelist.h | 2 +- src/blackmisc/simulation/aircraftmodel.cpp | 7 ++- src/blackmisc/simulation/aircraftmodel.h | 3 + .../simulation/aircraftmodellist.cpp | 55 +++++++++++++++++++ src/blackmisc/simulation/aircraftmodellist.h | 18 ++++++ 8 files changed, 95 insertions(+), 4 deletions(-) diff --git a/src/blackmisc/aviation/aircraftcategorylist.cpp b/src/blackmisc/aviation/aircraftcategorylist.cpp index 5e0470a83..36a163733 100644 --- a/src/blackmisc/aviation/aircraftcategorylist.cpp +++ b/src/blackmisc/aviation/aircraftcategorylist.cpp @@ -57,6 +57,13 @@ namespace BlackMisc return levels; } + QString CAircraftCategoryList::getLevelsString(const QString &separator) const + { + const QSet levels = this->getLevelStrings(); + if (levels.isEmpty()) {return {}; } + return levels.toList().join(separator); + } + QList CAircraftCategoryList::getFirstLevels() const { QSet levels; diff --git a/src/blackmisc/aviation/aircraftcategorylist.h b/src/blackmisc/aviation/aircraftcategorylist.h index 1a5c1e725..39fc575f1 100644 --- a/src/blackmisc/aviation/aircraftcategorylist.h +++ b/src/blackmisc/aviation/aircraftcategorylist.h @@ -55,6 +55,9 @@ namespace BlackMisc //! Get all level strings QSet getLevelStrings() const; + //! Get all level strings + QString getLevelsString(const QString &separator = ", ") const; + //! All levels sorted QList getFirstLevels() const; diff --git a/src/blackmisc/aviation/aircrafticaocodelist.cpp b/src/blackmisc/aviation/aircrafticaocodelist.cpp index 2ac762b83..25fa71af5 100644 --- a/src/blackmisc/aviation/aircrafticaocodelist.cpp +++ b/src/blackmisc/aviation/aircrafticaocodelist.cpp @@ -216,7 +216,7 @@ namespace BlackMisc this->removeIf(&CAircraftIcaoCode::isDbDuplicate, true); } - QStringList CAircraftIcaoCodeList::toCompleterStrings(bool withIataCodes, bool withFamily, bool sort) const + QStringList CAircraftIcaoCodeList::toCompleterStrings(bool withIataCodes, bool withFamily, bool withCategory, bool sort) const { QStringList c; CAircraftIcaoCodeList icaos(*this); @@ -225,7 +225,7 @@ namespace BlackMisc // 3 steps to get a proper sort order of the string list for (const CAircraftIcaoCode &icao : as_const(icaos)) { - c.append(icao.getCombinedIcaoStringWithKey()); + c.append(withCategory ? icao.getCombinedIcaoCategoryStringWithKey() : icao.getCombinedIcaoStringWithKey()); } if (withFamily) diff --git a/src/blackmisc/aviation/aircrafticaocodelist.h b/src/blackmisc/aviation/aircrafticaocodelist.h index da62511c6..cf0c875c7 100644 --- a/src/blackmisc/aviation/aircrafticaocodelist.h +++ b/src/blackmisc/aviation/aircrafticaocodelist.h @@ -119,7 +119,7 @@ namespace BlackMisc void removeDuplicates(); //! For selection completion - QStringList toCompleterStrings(bool withIataCodes = false, bool withFamily = false, bool sort = true) const; + QStringList toCompleterStrings(bool withIataCodes = false, bool withFamily = false, bool withCategory = true, bool sort = true) const; //! All ICAO codes, no duplicates QSet allDesignators(bool noUnspecified = true) const; diff --git a/src/blackmisc/simulation/aircraftmodel.cpp b/src/blackmisc/simulation/aircraftmodel.cpp index 1a2411023..d4dd6de19 100644 --- a/src/blackmisc/simulation/aircraftmodel.cpp +++ b/src/blackmisc/simulation/aircraftmodel.cpp @@ -202,7 +202,7 @@ namespace BlackMisc if (this->hasValidDbKey()) { return this->hasModelString() ? - QString(this->getModelString() + this->getDbKeyAsStringInParentheses(" ")) : + this->getModelString() % this->getDbKeyAsStringInParentheses(" ") : this->getDbKeyAsString(); } else @@ -390,6 +390,11 @@ namespace BlackMisc return m_aircraftIcao.hasKnownDesignator(); } + bool CAircraftModel::hasCategory() const + { + return m_aircraftIcao.hasCategory(); + } + bool CAircraftModel::hasAirlineDesignator() const { return m_livery.hasValidAirlineDesignator(); diff --git a/src/blackmisc/simulation/aircraftmodel.h b/src/blackmisc/simulation/aircraftmodel.h index f439e973b..32921a42e 100644 --- a/src/blackmisc/simulation/aircraftmodel.h +++ b/src/blackmisc/simulation/aircraftmodel.h @@ -242,6 +242,9 @@ namespace BlackMisc //! Has known aircraft designator? bool hasKnownAircraftDesignator() const; + //! Assigned a category? + bool hasCategory() const; + //! Airline designator? bool hasAirlineDesignator() const; diff --git a/src/blackmisc/simulation/aircraftmodellist.cpp b/src/blackmisc/simulation/aircraftmodellist.cpp index 951a69d74..7ce3f2173 100644 --- a/src/blackmisc/simulation/aircraftmodellist.cpp +++ b/src/blackmisc/simulation/aircraftmodellist.cpp @@ -276,6 +276,17 @@ namespace BlackMisc }); } + CAircraftModelList CAircraftModelList::findByDesignatorsOrFamilyWithColorLivery(const QStringList &designators) const + { + return this->findBy([ & ](const CAircraftModel & model) + { + if (!model.getLivery().isColorLivery()) { return false; } + const CAircraftIcaoCode modelIcao(model.getAircraftIcaoCode()); + if (designators.contains(modelIcao.getDesignator())) { return true; } + return modelIcao.hasFamily() && designators.contains(modelIcao.getFamily()); + }); + } + CAircraftModelList CAircraftModelList::findByCombinedType(const QString &combinedType) const { const QString cc(combinedType.trimmed().toUpper()); @@ -356,6 +367,33 @@ namespace BlackMisc }); } + CAircraftModelList CAircraftModelList::findByCategoryFirstLevel(int firstLevel) const + { + if (firstLevel < 0) { return CAircraftModelList(); } + return this->findBy([ = ](const CAircraftModel & model) + { + return (model.hasCategory() && model.getAircraftIcaoCode().getCategory().getFirstLevel() == firstLevel); + }); + } + + CAircraftModelList CAircraftModelList::findByCategory(const CAircraftCategory &category) const + { + if (category.isNull()) { return CAircraftModelList(); } + return this->findBy([ = ](const CAircraftModel & model) + { + return (model.hasCategory() && model.getAircraftIcaoCode().getCategory() == category); + }); + } + + CAircraftModelList CAircraftModelList::findByCategories(const CAircraftCategoryList &categories) const + { + if (categories.isEmpty()) { return CAircraftModelList(); } + return this->findBy([ = ](const CAircraftModel & model) + { + return (model.hasCategory() && categories.contains(model.getAircraftIcaoCode().getCategory())); + }); + } + CAircraftModelList CAircraftModelList::findFsFamilyModels() const { return this->findBy([](const CAircraftModel & model) @@ -545,6 +583,23 @@ namespace BlackMisc }); } + bool CAircraftModelList::containsCategory() const + { + return this->containsBy([ & ](const CAircraftModel & model) + { + return model.hasCategory(); + }); + } + + bool CAircraftModelList::containsCategory(int firstLevel) const + { + if (firstLevel < 0) { return false; } + return this->containsBy([ & ](const CAircraftModel & model) + { + return model.hasCategory() && model.getAircraftIcaoCode().getCategory().getFirstLevel() == firstLevel; + }); + } + CAircraftModelList CAircraftModelList::findByDistributors(const CDistributorList &distributors) const { if (distributors.isEmpty()) { return CAircraftModelList(); } diff --git a/src/blackmisc/simulation/aircraftmodellist.h b/src/blackmisc/simulation/aircraftmodellist.h index 31273112f..4b358fbc3 100644 --- a/src/blackmisc/simulation/aircraftmodellist.h +++ b/src/blackmisc/simulation/aircraftmodellist.h @@ -106,6 +106,12 @@ namespace BlackMisc //! Contains VTOL models? bool containsVtol() const; + //! Contains any categorized model? + bool containsCategory() const; + + //! Contains any model with 1st level? + bool containsCategory(int firstLevel) const; + //! Find by model string //! \remark normally CAircraftModelList::findFirstByModelStringOrDefault would be used CAircraftModelList findByModelString(const QString &modelString, Qt::CaseSensitivity sensitivity = Qt::CaseInsensitive) const; @@ -176,6 +182,9 @@ namespace BlackMisc //! Models with aircraft family or designator and color livery CAircraftModelList findByDesignatorOrFamilyWithColorLivery(const Aviation::CAircraftIcaoCode &icao) const; + //! Models with aircraft family or designators and color livery + CAircraftModelList findByDesignatorsOrFamilyWithColorLivery(const QStringList &designators) const; + //! Find by combined code, wildcards possible, e.g. L*P, *2J CAircraftModelList findByCombinedType(const QString &combinedType) const; @@ -208,6 +217,15 @@ namespace BlackMisc //! Find by model mode CAircraftModelList findByModelMode(CAircraftModel::ModelMode mode) const; + //! Find by first level of category + CAircraftModelList findByCategoryFirstLevel(int firstLevel) const; + + //! Find by category + CAircraftModelList findByCategory(const Aviation::CAircraftCategory &category) const; + + //! Find by categories + CAircraftModelList findByCategories(const Aviation::CAircraftCategoryList &categories) const; + //! Model icon path QString findModelIconPathByModelString(const QString &modelString) const;