diff --git a/src/blackmisc/aviation/aircrafticaocode.cpp b/src/blackmisc/aviation/aircrafticaocode.cpp index e7e02cb7c..60445f42d 100644 --- a/src/blackmisc/aviation/aircrafticaocode.cpp +++ b/src/blackmisc/aviation/aircrafticaocode.cpp @@ -252,6 +252,23 @@ namespace BlackMisc return combined.join(", "); } + bool CAircraftIcaoCode::matchesAnyDescription(const QString &candidate) const + { + if (this->hasModelDescription()) + { + if (this->getModelDescription().contains(candidate, Qt::CaseInsensitive)) { return true; } + } + if (this->hasModelIataDescription()) + { + if (this->getModelIataDescription().contains(candidate, Qt::CaseInsensitive)) { return true; } + } + if (this->hasModelSwiftDescription()) + { + if (this->getModelSwiftDescription().contains(candidate, Qt::CaseInsensitive)) { return true; } + } + return false; + } + bool CAircraftIcaoCode::matchesCombinedType(const QString &combinedType) const { const QString cc(combinedType.toUpper().trimmed().replace(' ', '*').replace('-', '*')); diff --git a/src/blackmisc/aviation/aircrafticaocode.h b/src/blackmisc/aviation/aircrafticaocode.h index 5a8894032..0063d55ef 100644 --- a/src/blackmisc/aviation/aircrafticaocode.h +++ b/src/blackmisc/aviation/aircrafticaocode.h @@ -152,6 +152,9 @@ namespace BlackMisc //! Combined description QString getCombinedModelDescription() const; + //! Matches any of the (unempty) descriptions + bool matchesAnyDescription(const QString &candidate) const; + //! Matches given combined code //! \remark * can be used as wildcard, e.g. L*J, L** bool matchesCombinedType(const QString &combinedType) const; diff --git a/src/blackmisc/aviation/aircrafticaocodelist.cpp b/src/blackmisc/aviation/aircrafticaocodelist.cpp index 321578d4f..a78175ea6 100644 --- a/src/blackmisc/aviation/aircrafticaocodelist.cpp +++ b/src/blackmisc/aviation/aircrafticaocodelist.cpp @@ -124,6 +124,14 @@ namespace BlackMisc }); } + CAircraftIcaoCodeList CAircraftIcaoCodeList::findMatchingByAnyDescription(const QString &description) const + { + return this->findBy([&](const CAircraftIcaoCode & code) + { + return code.matchesAnyDescription(description); + }); + } + CAircraftIcaoCodeList CAircraftIcaoCodeList::findWithIataCode(bool removeWhenSameAsDesignator) const { return this->findBy([&](const CAircraftIcaoCode & code) @@ -142,6 +150,14 @@ namespace BlackMisc }); } + CAircraftIcaoCodeList CAircraftIcaoCodeList::findByMilitaryFlag(bool military) const + { + return this->findBy([&](const CAircraftIcaoCode & code) + { + return (code.isMilitary() == military); + }); + } + CAircraftIcaoCode CAircraftIcaoCodeList::findFirstByDesignatorAndRank(const QString &designator) const { if (!CAircraftIcaoCode::isValidDesignator(designator)) { return CAircraftIcaoCode(); } @@ -269,35 +285,40 @@ namespace BlackMisc if (icaoPattern.hasValidDbKey()) { const int k = icaoPattern.getDbKey(); - CAircraftIcaoCode c(this->findByKey(k)); + const CAircraftIcaoCode c(this->findByKey(k)); if (c.hasCompleteData()) { return c; } } // get an initial set of data we can choose from - const QString d(icaoPattern.getDesignator()); - if (d.isEmpty()) { return CAircraftIcaoCode(); } + const QString designator(icaoPattern.getDesignator()); + if (designator.isEmpty()) { return CAircraftIcaoCode(); } CAircraftIcaoCodeList codes; do { - codes = this->findByDesignator(d); + codes = this->findByDesignator(designator); if (!codes.isEmpty()) break; // now we search if the ICAO designator is actually an IATA code - codes = this->findByIataCode(d); + codes = this->findByIataCode(designator); if (!codes.isEmpty()) break; - if (d.length() > 4) + // search by reduced length + if (designator.length() >= 4) { - codes = this->findByDesignator(d.left(4)); + codes = this->findByDesignator(designator.left(4)); if (!codes.isEmpty()) break; } // still empty, try to find by family - codes = this->findByFamily(d); + codes = this->findByFamily(designator); if (!codes.isEmpty()) break; // now try to find as ending - codes = this->findEndingWith(d); + codes = this->findEndingWith(designator); + if (!codes.isEmpty()) break; + + // by any descriptionS + codes = this->findMatchingByAnyDescription(designator); } while (false); diff --git a/src/blackmisc/aviation/aircrafticaocodelist.h b/src/blackmisc/aviation/aircrafticaocodelist.h index 38fb933f0..494486cea 100644 --- a/src/blackmisc/aviation/aircrafticaocodelist.h +++ b/src/blackmisc/aviation/aircrafticaocodelist.h @@ -76,12 +76,18 @@ namespace BlackMisc //! Find by model description CAircraftIcaoCodeList findByDescription(const QString &description) const; + //! Find matching by any model description + CAircraftIcaoCodeList findMatchingByAnyDescription(const QString &description) const; + //! Those with IATA code CAircraftIcaoCodeList findWithIataCode(bool removeWhenSameAsDesignator) const; //! Those with family CAircraftIcaoCodeList findWithFamily(bool removeWhenSameAsDesignator) const; + //! By military flag + CAircraftIcaoCodeList findByMilitaryFlag(bool military) const; + //! Find by designator, then best match by rank CAircraftIcaoCode findFirstByDesignatorAndRank(const QString &designator) const; diff --git a/src/blackmisc/aviation/callsignobjectlist.cpp b/src/blackmisc/aviation/callsignobjectlist.cpp index 9c5193ad0..a50523081 100644 --- a/src/blackmisc/aviation/callsignobjectlist.cpp +++ b/src/blackmisc/aviation/callsignobjectlist.cpp @@ -61,6 +61,12 @@ namespace BlackMisc return cs; } + template + QStringList ICallsignObjectList::getCallsignStrings() const + { + return this->getCallsigns().getCallsignStrings(); + } + template CONTAINER ICallsignObjectList::findByCallsign(const CCallsign &callsign) const { diff --git a/src/blackmisc/aviation/callsignobjectlist.h b/src/blackmisc/aviation/callsignobjectlist.h index 790ba2327..f9c3a20b1 100644 --- a/src/blackmisc/aviation/callsignobjectlist.h +++ b/src/blackmisc/aviation/callsignobjectlist.h @@ -57,6 +57,9 @@ namespace BlackMisc //! All callsigns BlackMisc::Aviation::CCallsignSet getCallsigns() const; + //! Get callsign string list + QStringList getCallsignStrings() const; + //! Find 0..n stations by callsign CONTAINER findByCallsign(const CCallsign &callsign) const; diff --git a/src/blackmisc/aviation/callsignset.cpp b/src/blackmisc/aviation/callsignset.cpp index e94b951ba..9b49ccf34 100644 --- a/src/blackmisc/aviation/callsignset.cpp +++ b/src/blackmisc/aviation/callsignset.cpp @@ -26,6 +26,16 @@ namespace BlackMisc CCollection(other) { } + QStringList CCallsignSet::getCallsignStrings() const + { + QStringList callsigns; + for (const CCallsign &cs : *this) + { + callsigns.push_back(cs.asString()); + } + return callsigns; + } + void CCallsignSet::registerMetadata() { qRegisterMetaType>(); diff --git a/src/blackmisc/aviation/callsignset.h b/src/blackmisc/aviation/callsignset.h index 669f79aac..e14316837 100644 --- a/src/blackmisc/aviation/callsignset.h +++ b/src/blackmisc/aviation/callsignset.h @@ -39,6 +39,9 @@ namespace BlackMisc //! Construct from a base class object. CCallsignSet(const CCollection &other); + //! The callsign strings + QStringList getCallsignStrings() const; + //! Register metadata static void registerMetadata(); }; diff --git a/src/blackmisc/simulation/aircraftmodellist.cpp b/src/blackmisc/simulation/aircraftmodellist.cpp index e62819157..515847052 100644 --- a/src/blackmisc/simulation/aircraftmodellist.cpp +++ b/src/blackmisc/simulation/aircraftmodellist.cpp @@ -219,6 +219,19 @@ namespace BlackMisc }); } + CAircraftModelList CAircraftModelList::findByCombinedTypeWithColorLivery(const QString &combinedType) const + { + return this->findByCombinedType(combinedType).findColorLiveries(); + } + + CAircraftModelList CAircraftModelList::findColorLiveries() const + { + return this->findBy([ = ](const CAircraftModel & model) + { + return model.getLivery().isColorLivery(); + }); + } + CAircraftModelList CAircraftModelList::findByMilitaryFlag(bool military) const { return this->findBy([ = ](const CAircraftModel & model) diff --git a/src/blackmisc/simulation/aircraftmodellist.h b/src/blackmisc/simulation/aircraftmodellist.h index d99093756..551e594d1 100644 --- a/src/blackmisc/simulation/aircraftmodellist.h +++ b/src/blackmisc/simulation/aircraftmodellist.h @@ -138,6 +138,12 @@ namespace BlackMisc //! Find by combined code, wildcards possible e.g. L*P, *2J CAircraftModelList findByCombinedType(const QString &combinedType) const; + //! Find aircraft with color livery by combined code, wildcards possible e.g. L*P, *2J + CAircraftModelList findByCombinedTypeWithColorLivery(const QString &combinedType) const; + + //! Find models with color liveries + CAircraftModelList findColorLiveries() const; + //! Find by military flag CAircraftModelList findByMilitaryFlag(bool military) const;