diff --git a/src/blackmisc/db/datastoreobjectlist.cpp b/src/blackmisc/db/datastoreobjectlist.cpp index 22158ed79..7cdb0f002 100644 --- a/src/blackmisc/db/datastoreobjectlist.cpp +++ b/src/blackmisc/db/datastoreobjectlist.cpp @@ -261,6 +261,17 @@ namespace BlackMisc return false; } + template + bool IDatastoreObjectList::containsDbKey(KEYTYPE key) const + { + for (const OBJ &obj : ITimestampObjectList::container()) + { + if (!obj.hasValidDbKey()) { continue; } + if (obj.getDbKey() == key) { return true; } + } + return false; + } + template CONTAINER IDatastoreObjectList::fromMultipleJsonFormats(const QJsonObject &jsonObject) { diff --git a/src/blackmisc/db/datastoreobjectlist.h b/src/blackmisc/db/datastoreobjectlist.h index 9cf7285dd..1190d6864 100644 --- a/src/blackmisc/db/datastoreobjectlist.h +++ b/src/blackmisc/db/datastoreobjectlist.h @@ -84,6 +84,9 @@ namespace BlackMisc //! Any object without key? bool containsAnyObjectWithoutKey() const; + //! Contains object with key? + bool containsDbKey(KEYTYPE key) const; + //! From multiple JSON formats //! \remark supports native swift C++ format, DB format, and cache format static CONTAINER fromMultipleJsonFormats(const QJsonObject &jsonObject); diff --git a/src/blackmisc/simulation/aircraftmodellist.cpp b/src/blackmisc/simulation/aircraftmodellist.cpp index 5fb57a3e7..bbf62fe75 100644 --- a/src/blackmisc/simulation/aircraftmodellist.cpp +++ b/src/blackmisc/simulation/aircraftmodellist.cpp @@ -347,6 +347,34 @@ namespace BlackMisc }); } + CAircraftModelList CAircraftModelList::findClosestColorDistance(const CRgbColor &fuselage, const CRgbColor &tail) const + { + double distance = 2.0; + CAircraftModelList models; + for (const CAircraftModel &m : (*this)) + { + const CLivery &l = m.getLivery(); + if (!l.hasColorTail() || !l.hasColorFuselage()) { continue; } + const double d = l.getColorDistance(fuselage, tail); + if (qFuzzyCompare(d, distance)) + { + models.push_back(m); + } + else if (distance > d) + { + models.clear(); + models.push_back(m); + distance = d; + } + } + return models; + } + + CAircraftModelList CAircraftModelList::findClosestFuselageColorDistance(const CRgbColor &color) const + { + return this->findClosestColorDistance(color, color); + } + CAircraftModelList CAircraftModelList::findColorLiveries() const { return this->findBy([ = ](const CAircraftModel & model) diff --git a/src/blackmisc/simulation/aircraftmodellist.h b/src/blackmisc/simulation/aircraftmodellist.h index 234671868..23e74ca16 100644 --- a/src/blackmisc/simulation/aircraftmodellist.h +++ b/src/blackmisc/simulation/aircraftmodellist.h @@ -210,9 +210,14 @@ namespace BlackMisc //! \remark kind of pseudo family, as in most cases the same combined type of a manufacturer means similar aircraft CAircraftModelList findByCombinedAndManufacturer(const QString &combinedType, const QString &manufacturer) const; - //! Find models with color liveries + //! Find color liveries CAircraftModelList findColorLiveries() const; + //! Find models with the closest color distance @{ + CAircraftModelList findClosestColorDistance(const CRgbColor &fuselage, const CRgbColor &tail) const; + CAircraftModelList findClosestFuselageColorDistance(const CRgbColor &color) const; + //! @} + //! Find by military flag, \c false returns civilian models CAircraftModelList findByMilitaryFlag(bool military) const;