From de680f4fcd027a0b7e398d318fc130684c35f2d7 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 18 Jan 2019 21:15:27 +0100 Subject: [PATCH] Ref T515, further utility functions to validate models --- src/blackmisc/simulation/aircraftmodel.cpp | 11 +++-- src/blackmisc/simulation/aircraftmodel.h | 3 ++ .../simulation/aircraftmodellist.cpp | 44 ++++++++++++++++++- src/blackmisc/simulation/aircraftmodellist.h | 11 +++++ .../fscommon/aircraftcfgentrieslist.cpp | 10 +++++ .../fscommon/aircraftcfgentrieslist.h | 4 ++ src/blackmisc/simulation/simulatorinfo.cpp | 18 ++++++-- src/blackmisc/simulation/simulatorinfo.h | 8 +++- 8 files changed, 98 insertions(+), 11 deletions(-) diff --git a/src/blackmisc/simulation/aircraftmodel.cpp b/src/blackmisc/simulation/aircraftmodel.cpp index 537e7a30d..55f3b3356 100644 --- a/src/blackmisc/simulation/aircraftmodel.cpp +++ b/src/blackmisc/simulation/aircraftmodel.cpp @@ -154,6 +154,11 @@ namespace BlackMisc .arg(this->getLivery().asHtmlSummary(" ")).replace(" ", " "); } + bool CAircraftModel::matchesFileName(const QString &fileName) const + { + return stringCompare(fileName, m_fileName, CFileUtils::osFileNameCaseSensitivity()); + } + CStatusMessageList CAircraftModel::verifyModelData() const { CStatusMessageList msgs; @@ -744,15 +749,13 @@ namespace BlackMisc bool CAircraftModel::matchesModelString(const QString &modelString, Qt::CaseSensitivity sensitivity) const { - if (sensitivity == Qt::CaseInsensitive) { return caseInsensitiveStringCompare(modelString, m_modelString); } - return m_modelString == modelString; + return stringCompare(modelString, m_modelString, sensitivity); } bool CAircraftModel::matchesModelStringOrAlias(const QString &modelString, Qt::CaseSensitivity sensitivity) const { if (this->matchesModelString(modelString, sensitivity)) { return true; } - if (sensitivity == Qt::CaseInsensitive) { return caseInsensitiveStringCompare(modelString, m_modelStringAlias); } - return m_modelStringAlias == modelString; + return stringCompare(modelString, m_modelStringAlias, sensitivity); } int CAircraftModel::calculateScore(const CAircraftModel &compareModel, bool preferColorLiveries, CStatusMessageList *log) const diff --git a/src/blackmisc/simulation/aircraftmodel.h b/src/blackmisc/simulation/aircraftmodel.h index 8b860d9ab..d067abebf 100644 --- a/src/blackmisc/simulation/aircraftmodel.h +++ b/src/blackmisc/simulation/aircraftmodel.h @@ -430,6 +430,9 @@ namespace BlackMisc //! File name? bool hasFileName() const { return !m_fileName.isEmpty(); } + //! Matching file name? + bool matchesFileName(const QString &fileName) const; + //! Does the corresponding file exist? bool hasExistingCorrespondingFile() const; diff --git a/src/blackmisc/simulation/aircraftmodellist.cpp b/src/blackmisc/simulation/aircraftmodellist.cpp index ab4fb7fa0..d556c01b0 100644 --- a/src/blackmisc/simulation/aircraftmodellist.cpp +++ b/src/blackmisc/simulation/aircraftmodellist.cpp @@ -688,6 +688,30 @@ namespace BlackMisc return this->removeIf(&CAircraftModel::getAircraftIcaoCode, aircraftIcao, &CAircraftModel::getAirlineIcaoCode, airline); } + int CAircraftModelList::removeIfNotFsFamily() + { + if (this->isEmpty()) { return 0; } + CAircraftModelList fsOnly = this->getAllFsFamilyModels(); + if (fsOnly.size() == this->size()) { return 0; } + const int delta = this->size() - fsOnly.size(); + *this = fsOnly; + return delta; + } + + CAircraftModelList CAircraftModelList::removeIfFileButNotInSet(const QString &fileName, const QSet &modelStrings) + { + CAircraftModelList removed; + for (const CAircraftModel &model : *this) + { + if (!model.matchesFileName(fileName)) { continue; } + if (modelStrings.contains(model.getModelString())) { continue; } + removed.push_back(model); + } + + this->removeIfIn(removed); + return removed; + } + bool CAircraftModelList::replaceOrAddModelWithString(const CAircraftModel &addOrReplaceModel, Qt::CaseSensitivity sensitivity) { bool r = false; @@ -1013,6 +1037,18 @@ namespace BlackMisc return combinedCodes; } + QSet CAircraftModelList::getAllFileNames() const + { + const bool cs = CFileUtils::isFileNameCaseSensitive(); + QSet files; + for (const CAircraftModel &model : *this) + { + if (!model.hasFileName()) { continue; } + files.insert(cs ? model.getFileName() : model.getFileNameLowerCase()); + } + return files; + } + QString CAircraftModelList::getCombinedTypesAsString(const QString &separator) const { return this->getCombinedTypes().values().join(separator); @@ -1178,15 +1214,19 @@ namespace BlackMisc QSet workingFiles; int failedFilesCount = 0; + // sorting allows to skip multiple files as once when a file fails + CAircraftModelList sorted(*this); + if (!alreadySorted) { sorted.sortByFileName(); } + const bool caseSensitive = CFileUtils::isFileNameCaseSensitive(); - for (const CAircraftModel &model : *this) + for (const CAircraftModel &model : as_const(sorted)) { bool ok = false; do { if (!model.hasModelString()) { - const CStatusMessage m(this, CStatusMessage::SeverityError, "No model string"); + const CStatusMessage m(this, CStatusMessage::SeverityError, "No model string", true); msgs.push_back(m); break; } diff --git a/src/blackmisc/simulation/aircraftmodellist.h b/src/blackmisc/simulation/aircraftmodellist.h index 8015ac042..de64d4904 100644 --- a/src/blackmisc/simulation/aircraftmodellist.h +++ b/src/blackmisc/simulation/aircraftmodellist.h @@ -281,6 +281,14 @@ namespace BlackMisc //! \return number of elements removed int removeByAircraftAndAirline(const Aviation::CAircraftIcaoCode &aircraftIcao, const Aviation::CAirlineIcaoCode &airline); + //! Remove if NOT FS family model, ie. FSX/P3D/FS9 + //! \return number of elements removed + int removeIfNotFsFamily(); + + //! Remove those models of a particular file, but not in the given set + //! \remark mostly used for FSX/FS9/P3D consolidation + CAircraftModelList removeIfFileButNotInSet(const QString &fileName, const QSet &modelStrings); + //! Replace or add based on model string //! \return element removed? bool replaceOrAddModelWithString(const CAircraftModel &addOrReplaceModel, Qt::CaseSensitivity sensitivity); @@ -372,6 +380,9 @@ namespace BlackMisc //! All combined types QSet getCombinedTypes() const; + //! All file names + QSet getAllFileNames() const; + //! All combined types as string QString getCombinedTypesAsString(const QString &separator = ", ") const; diff --git a/src/blackmisc/simulation/fscommon/aircraftcfgentrieslist.cpp b/src/blackmisc/simulation/fscommon/aircraftcfgentrieslist.cpp index 5696e8f41..bb4f58e48 100644 --- a/src/blackmisc/simulation/fscommon/aircraftcfgentrieslist.cpp +++ b/src/blackmisc/simulation/fscommon/aircraftcfgentrieslist.cpp @@ -57,6 +57,16 @@ namespace BlackMisc return titles; } + QSet CAircraftCfgEntriesList::getTitleSetUpperCase() const + { + QSet titlesUc; + for (const CAircraftCfgEntries &entries : *this) + { + titlesUc.insert(entries.getTitle().toUpper()); + } + return titlesUc; + } + QString CAircraftCfgEntriesList::getTitlesAsString(bool sorted, const QString &separator) const { return this->getTitles(sorted).join(separator); diff --git a/src/blackmisc/simulation/fscommon/aircraftcfgentrieslist.h b/src/blackmisc/simulation/fscommon/aircraftcfgentrieslist.h index 337fdaae2..11554d865 100644 --- a/src/blackmisc/simulation/fscommon/aircraftcfgentrieslist.h +++ b/src/blackmisc/simulation/fscommon/aircraftcfgentrieslist.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -49,6 +50,9 @@ namespace BlackMisc //! All titles (aka model names) QStringList getTitles(bool sorted = false) const; + //! Titles as set in upper case + QSet getTitleSetUpperCase() const; + //! All titles as string QString getTitlesAsString(bool sorted, const QString &separator = ", ") const; diff --git a/src/blackmisc/simulation/simulatorinfo.cpp b/src/blackmisc/simulation/simulatorinfo.cpp index 20d162e33..7b643accf 100644 --- a/src/blackmisc/simulation/simulatorinfo.cpp +++ b/src/blackmisc/simulation/simulatorinfo.cpp @@ -369,6 +369,16 @@ namespace BlackMisc return m_counts[CSimulatorInfo::NumberOfSimulators]; } + int CCountPerSimulator::getCountForFsFamilySimulators() const + { + return this->getCount(CSimulatorInfo::fsx()) + this->getCount(CSimulatorInfo::p3d()) + this->getCount(CSimulatorInfo::fs9()); + } + + int CCountPerSimulator::getCountForFsxFamilySimulators() const + { + return this->getCount(CSimulatorInfo::fsx()) + this->getCount(CSimulatorInfo::p3d()); + } + int CCountPerSimulator::getMaximum() const { return *std::min_element(m_counts.begin(), m_counts.end()); @@ -401,11 +411,11 @@ namespace BlackMisc QString CCountPerSimulator::toQString() const { - return u"FSX: " % QString::number(m_counts[0]) % - u" P3D: " % QString::number(m_counts[1]) % - u" FS9: " % QString::number(m_counts[2]) % + return u"FSX: " % QString::number(m_counts[0]) % + u" P3D: " % QString::number(m_counts[1]) % + u" FS9: " % QString::number(m_counts[2]) % u" XPlane: " % QString::number(m_counts[3]) % - u" FG: " % QString::number(m_counts[4]); + u" FG: " % QString::number(m_counts[4]); } void CCountPerSimulator::setCount(int count, const CSimulatorInfo &simulator) diff --git a/src/blackmisc/simulation/simulatorinfo.h b/src/blackmisc/simulation/simulatorinfo.h index 7b8ab071c..f45409ffc 100644 --- a/src/blackmisc/simulation/simulatorinfo.h +++ b/src/blackmisc/simulation/simulatorinfo.h @@ -222,9 +222,15 @@ namespace BlackMisc //! Object count for given simulator int getCount(const CSimulatorInfo &simulator) const; - //! Unkown count + //! Unknown count int getCountForUnknownSimulators() const; + //! P3D, FSX, or FS9 + int getCountForFsFamilySimulators() const; + + //! P3D or FSX + int getCountForFsxFamilySimulators() const; + //! Set count void setCount(int count, const CSimulatorInfo &simulator);