diff --git a/src/blackmisc/aviation/aircrafticaocodelist.cpp b/src/blackmisc/aviation/aircrafticaocodelist.cpp index 184d15042..d56219336 100644 --- a/src/blackmisc/aviation/aircrafticaocodelist.cpp +++ b/src/blackmisc/aviation/aircrafticaocodelist.cpp @@ -250,18 +250,30 @@ namespace BlackMisc return c; } - QSet CAircraftIcaoCodeList::allIcaoCodes(bool onlyKnownDesignators) const + QSet CAircraftIcaoCodeList::allDesignators(bool noUnspecified) const { QSet c; for (const CAircraftIcaoCode &icao : *this) { - if (onlyKnownDesignators && !icao.hasKnownDesignator()) { continue; } + if (noUnspecified && !icao.hasKnownDesignator()) { continue; } const QString d(icao.getDesignator()); c.insert(d); } return c; } + QSet CAircraftIcaoCodeList::allDesignatorsAndKey(bool noUnspecified) const + { + QSet c; + for (const CAircraftIcaoCode &icao : *this) + { + if (noUnspecified && !icao.hasKnownDesignator()) { continue; } + const QString d(icao.getDesignatorDbKey()); + c.insert(d); + } + return c; + } + QSet CAircraftIcaoCodeList::allFamilies() const { QSet c; diff --git a/src/blackmisc/aviation/aircrafticaocodelist.h b/src/blackmisc/aviation/aircrafticaocodelist.h index 7e63dfd32..5a9643efb 100644 --- a/src/blackmisc/aviation/aircrafticaocodelist.h +++ b/src/blackmisc/aviation/aircrafticaocodelist.h @@ -122,7 +122,10 @@ namespace BlackMisc QStringList toCompleterStrings(bool withIataCodes = false, bool withFamily = false, bool sort = true) const; //! All ICAO codes, no duplicates - QSet allIcaoCodes(bool noUnspecified = true) const; + QSet allDesignators(bool noUnspecified = true) const; + + //! All ICAO codes and DB key, no duplicates + QSet allDesignatorsAndKey(bool noUnspecified = true) const; //! All families, no duplicates QSet allFamilies() const; diff --git a/src/blackmisc/aviation/airlineicaocode.cpp b/src/blackmisc/aviation/airlineicaocode.cpp index a87f20cbb..1b4e2a273 100644 --- a/src/blackmisc/aviation/airlineicaocode.cpp +++ b/src/blackmisc/aviation/airlineicaocode.cpp @@ -302,10 +302,9 @@ namespace BlackMisc QString CAirlineIcaoCode::getCombinedStringWithKey() const { - QString s(getVDesignator()); - if (s.isEmpty()) s = "????"; - if (hasName()) { s = s.append(" ").append(getName()); } - return s.append(this->getDbKeyAsStringInParentheses(" ")); + return (this->hasValidDesignator() ? this->getVDesignator() : QStringLiteral("")) % + (this->hasName() ? QStringLiteral(" ") % m_name : QStringLiteral("")) % + this->getDbKeyAsStringInParentheses(" "); } CAirlineIcaoCode CAirlineIcaoCode::thisOrCallsignCode(const CCallsign &callsign) const diff --git a/src/blackmisc/aviation/airlineicaocodelist.cpp b/src/blackmisc/aviation/airlineicaocodelist.cpp index a602cbfdb..949d36506 100644 --- a/src/blackmisc/aviation/airlineicaocodelist.cpp +++ b/src/blackmisc/aviation/airlineicaocodelist.cpp @@ -273,6 +273,28 @@ namespace BlackMisc return c; } + QSet CAirlineIcaoCodeList::allDesignators() const + { + QSet designators; + for (const CAirlineIcaoCode &icao : *this) + { + if (!icao.hasValidDesignator()) { continue; } + designators.insert(icao.getDesignator()); + } + return designators; + } + + QSet CAirlineIcaoCodeList::allVDesignators() const + { + QSet designators; + for (const CAirlineIcaoCode &icao : *this) + { + if (!icao.hasValidDesignator()) { continue; } + designators.insert(icao.getVDesignator()); + } + return designators; + } + bool CAirlineIcaoCodeList::containsDesignator(const QString &designator) const { if (designator.isEmpty()) { return false; } diff --git a/src/blackmisc/aviation/airlineicaocodelist.h b/src/blackmisc/aviation/airlineicaocodelist.h index c25147cd4..f6795121c 100644 --- a/src/blackmisc/aviation/airlineicaocodelist.h +++ b/src/blackmisc/aviation/airlineicaocodelist.h @@ -101,6 +101,12 @@ namespace BlackMisc //! String list for completion by name QStringList toNameCompleterStrings(bool sort = true) const; + //! All designators + QSet allDesignators() const; + + //! All designators + QSet allVDesignators() const; + //! Contains given designator? bool containsDesignator(const QString &designator) const; diff --git a/src/blackmisc/simulation/aircraftmodellist.cpp b/src/blackmisc/simulation/aircraftmodellist.cpp index 379722e05..231e1e953 100644 --- a/src/blackmisc/simulation/aircraftmodellist.cpp +++ b/src/blackmisc/simulation/aircraftmodellist.cpp @@ -9,8 +9,6 @@ #include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/simulation/matchingutils.h" -#include "blackmisc/aviation/aircrafticaocode.h" -#include "blackmisc/aviation/airlineicaocode.h" #include "blackmisc/aviation/callsign.h" #include "blackmisc/aviation/livery.h" #include "blackmisc/math/mathutils.h" @@ -732,6 +730,24 @@ namespace BlackMisc return distributors; } + CAircraftIcaoCodeList CAircraftModelList::getAircraftIcaoCodesFromDb() const + { + if (this->isEmpty()) { return CAircraftIcaoCodeList(); } + QSet keys; + CAircraftIcaoCodeList icaos; + for (const CAircraftModel &model : *this) + { + const CAircraftIcaoCode icao = model.getAircraftIcaoCode(); + if (!icao.hasValidDbKey()) { continue; } + + const int key = icao.getDbKey(); + if (keys.contains(key)) { continue; } + icaos.push_back(icao); + keys.insert(key); + } + return icaos; + } + QSet CAircraftModelList::getAircraftDesignators() const { QSet designators; @@ -767,6 +783,24 @@ namespace BlackMisc return icaos; } + CAirlineIcaoCodeList CAircraftModelList::getAirlineIcaoCodesFromDb() const + { + if (this->isEmpty()) { return CAirlineIcaoCodeList(); } + QSet keys; + CAirlineIcaoCodeList icaos; + for (const CAircraftModel &model : *this) + { + const CAirlineIcaoCode icao = model.getAirlineIcaoCode(); + if (!icao.hasValidDbKey()) { continue; } + + const int key = icao.getDbKey(); + if (keys.contains(key)) { continue; } + icaos.push_back(icao); + keys.insert(key); + } + return icaos; + } + QSet CAircraftModelList::getAirlineDesignators() const { QSet designators; @@ -1094,15 +1128,38 @@ namespace BlackMisc ); } - QString CAircraftModelList::htmlStatistics() const + QString CAircraftModelList::htmlStatistics(bool aircraftStats, bool airlineStats) const { + static const QString sep("
"); const bool notOnlyDb = this->containsAnyObjectWithoutKey(); - QString stats = this->coverageSummary("
"); + QString stats = this->coverageSummary(sep); + if (aircraftStats) + { + const CAircraftIcaoCodeList icaos = this->getAircraftIcaoCodesFromDb(); + QStringList designators(icaos.allDesignators().toList()); + designators.sort(); + stats += sep % sep % + QStringLiteral("Aircraft ICAOs from DB: ") % sep % + designators.join(", "); + } + + if (airlineStats) + { + const CAirlineIcaoCodeList icaos = this->getAirlineIcaoCodesFromDb(); + const QStringList designators = icaos.toIcaoDesignatorCompleterStrings(); + stats += sep % sep % + QStringLiteral("Airline ICAOs from DB: ") % sep % + designators.join(", "); + } + if (notOnlyDb) { const CAircraftModelList dbModels = this->findObjectsWithDbKey(); - stats += QStringLiteral("

DB objects:
---------
") % - dbModels.coverageSummary("
"); + stats += sep % + sep % + QStringLiteral("DB objects:
---------") % + sep % + dbModels.htmlStatistics(false, false); } return stats; } diff --git a/src/blackmisc/simulation/aircraftmodellist.h b/src/blackmisc/simulation/aircraftmodellist.h index 6b0566833..0348f9ab1 100644 --- a/src/blackmisc/simulation/aircraftmodellist.h +++ b/src/blackmisc/simulation/aircraftmodellist.h @@ -16,6 +16,7 @@ #include "blackmisc/simulation/distributorlist.h" #include "blackmisc/simulation/simulatorinfo.h" #include "blackmisc/aviation/aircrafticaocodelist.h" +#include "blackmisc/aviation/airlineicaocodelist.h" #include "blackmisc/db/datastoreobjectlist.h" #include "blackmisc/blackmiscexport.h" #include "blackmisc/collection.h" @@ -282,6 +283,9 @@ namespace BlackMisc //! All distributors used with models of this list CDistributorList getDistributors(bool onlyDbDistributors = true) const; + //! Aircraft ICAO codes from DB, without duplicates + Aviation::CAircraftIcaoCodeList getAircraftIcaoCodesFromDb() const; + //! Aircraft designators QSet getAircraftDesignators() const; @@ -293,6 +297,9 @@ namespace BlackMisc //! \remark gives all aircraft flown by an airline Aviation::CAircraftIcaoCodeList getAicraftIcaoCodesForAirline(const Aviation::CAirlineIcaoCode &airlineCode) const; + //! Airline ICAO codes from DB, without duplicates + Aviation::CAirlineIcaoCodeList getAirlineIcaoCodesFromDb() const; + //! Airline designators QSet getAirlineDesignators() const; @@ -355,7 +362,7 @@ namespace BlackMisc QString coverageSummaryForModel(const CAircraftModel &checkModel, const QString &separator = "\n") const; //! A HTML summary of the data in the list - QString htmlStatistics() const; + QString htmlStatistics(bool aircraftStats, bool airlineStats) const; }; //! Model per callsign