13 #include <QStringBuilder>
29 using namespace swift::config;
30 using namespace swift::misc::network;
31 using namespace swift::misc::math;
32 using namespace swift::misc::aviation;
33 using namespace swift::misc::physical_quantities;
37 namespace swift::misc::simulation
64 if (combinedType.
isEmpty()) {
return false; }
76 const QString &airlineDesignator)
const
103 if (modelString.
isEmpty()) {
return {}; }
111 if (modelString.
isEmpty()) {
return {}; }
118 if (callsign.
isEmpty()) {
return {}; }
153 const QString &combinedCode)
const
155 if (aircraftDesignator.
isEmpty()) {
return {}; }
171 if (
id < 0)
return {};
177 bool onlyIfExistInModel)
const
182 if (!name.
isEmpty() && (icao.hasName() || !onlyIfExistInModel))
184 if (!icao.getName().contains(name, Qt::CaseInsensitive)) { return false; }
187 if (!telephony.
isEmpty() && (icao.hasTelephonyDesignator() || !onlyIfExistInModel))
189 if (!icao.getTelephonyDesignator().contains(name, Qt::CaseInsensitive)) { return false; }
231 if (designators.
isEmpty()) {
return {}; }
243 if (manufacturer.
isEmpty()) {
return {}; }
251 if (family.
isEmpty()) {
return {}; }
262 if (family.
isEmpty()) {
return {}; }
267 if (!icao.hasFamily()) { return false; }
277 if (modelIcao.getDesignator() == icao.
getDesignator()) { return true; }
283 CAircraftModelList::findByDesignatorsOrFamilyWithColorLivery(
const QStringList &designators)
const
288 if (designators.
contains(modelIcao.getDesignator())) { return true; }
296 if (combinedType.
length() != 3) {
return {}; }
307 if (ml.
isEmpty()) {
return ml; }
312 return icao.
getWtc() == wtcUc;
333 const QString &manufacturer)
const
335 if (manufacturer.
isEmpty()) {
return this->findByCombinedType(combinedType); }
336 if (combinedType.
isEmpty()) {
return this->findByManufacturer(manufacturer); }
338 return model.
getAircraftIcaoCode().matchesCombinedTypeAndManufacturer(combinedType, manufacturer);
345 double distance = 2.0;
349 const CLivery &l = m.getLivery();
352 if (qFuzzyCompare(d, distance)) { models.
push_back(m); }
353 else if (distance > d)
365 return this->findClosestColorDistance(color, color);
390 if (firstLevel < 0) {
return {}; }
398 if (category.
isNull()) {
return {}; }
406 if (categories.
isEmpty()) {
return {}; }
549 if (ac.
isEmpty()) {
return {}; }
552 const int max = *std::max_element(values.
begin(), values.
end());
583 bool CAircraftModelList::containsMatchingSimulator(
const CSimulatorInfo &simulators)
const
588 bool CAircraftModelList::containsNotMatchingSimulator(
const CSimulatorInfo &simulators)
const
593 bool CAircraftModelList::containsMilitary()
const
598 bool CAircraftModelList::containsCivilian()
const
603 bool CAircraftModelList::containsCivilianAndMilitary()
const
605 return this->containsMilitary() && this->containsCivilian();
608 bool CAircraftModelList::containsVtol()
const
613 bool CAircraftModelList::containsCategory()
const
618 bool CAircraftModelList::containsCategory(
int firstLevel)
const
620 if (firstLevel < 0) {
return false; }
628 if (distributors.
isEmpty()) {
return {}; }
635 const CSimulatorInfo::Simulator s = info.
getSimulator();
638 if (model.getSimulator().getSimulator() == s) {
continue; }
639 model.setSimulator(info);
647 CSimulatorInfo::Simulator s = CSimulatorInfo::None;
651 if (s == CSimulatorInfo::All) {
break; }
658 bool isLikelyImpl(
double count,
double total)
660 if (total < 1) {
return false; }
661 const double fsRatio = count / total;
662 return fsRatio > 0.95;
666 bool CAircraftModelList::isLikelyFsFamilyModelList()
const
668 if (this->isEmpty()) {
return false; }
669 return private_ns::isLikelyImpl(this->countPerSimulator().getCountForFsFamilySimulators(), this->size());
672 bool CAircraftModelList::isLikelyFsxFamilyModelList()
const
674 if (this->isEmpty()) {
return false; }
675 return private_ns::isLikelyImpl(this->countPerSimulator().getCountForFsxFamilySimulators(), this->size());
678 bool CAircraftModelList::isLikelyXPlaneModelList()
const
680 if (this->isEmpty()) {
return false; }
681 return private_ns::isLikelyImpl(this->countPerSimulator().getCount(CSimulatorInfo::xplane()), this->size());
689 if (model.getModelMode() == mode) {
continue; }
690 model.setModelMode(mode);
701 if (model.getModelType() == type) {
continue; }
702 model.setModelType(type);
708 int CAircraftModelList::setCG(
const CLength &cg)
713 if (model.getCG() == cg) {
continue; }
722 const int cs = this->size();
723 (*this) = (findByModelStrings(modelStrings, sensitivity));
724 const int d = cs - this->size();
730 if (modelString.
isEmpty()) {
return false; }
731 if (this->isEmpty()) {
return false; }
732 const int r = this->removeIf(
739 if (models.
isEmpty()) {
return 0; }
745 if (modelStrings.
isEmpty()) {
return 0; }
746 const int cs = this->size();
747 (*this) = (this->findByNotInModelStrings(modelStrings, sensitivity));
748 const int d = cs - this->size();
752 int CAircraftModelList::removeIfNotMatchingSimulator(
const CSimulatorInfo &needToMatch)
754 if (this->isEmpty()) {
return 0; }
755 const int oldSize = this->size();
761 const int diff = models.
size() - oldSize;
762 if (diff > 0) { *
this = models; }
766 int CAircraftModelList::removeAllWithoutModelString()
768 if (this->isEmpty()) {
return 0; }
769 const int s = this->size();
776 const int diff = s - withModelStr.
size();
777 if (diff < 1) {
return 0; }
778 *
this = withModelStr;
782 int CAircraftModelList::removeIfExcluded()
784 if (this->isEmpty()) {
return 0; }
785 const int s = this->size();
789 if (model.
getModelMode() == CAircraftModel::Exclude) {
continue; }
792 const int diff = s - onlyIncluded.
size();
793 if (diff < 1) {
return 0; }
794 *
this = onlyIncluded;
798 int CAircraftModelList::removeXPlaneFlyablePlanes() {
return this->removeIfExcluded(); }
800 int CAircraftModelList::removeByDistributor(
const CDistributor &distributor)
802 return this->removeIf(&CAircraftModel::getDistributor, distributor);
807 return this->removeIf(&CAircraftModel::getAircraftIcaoCode, aircraftIcao, &CAircraftModel::getLivery, livery);
813 return this->removeIf(&CAircraftModel::getAircraftIcaoCode, aircraftIcao, &CAircraftModel::getAirlineIcaoCode,
817 int CAircraftModelList::removeIfNotFsFamily()
819 if (this->isEmpty()) {
return 0; }
821 if (fsOnly.
size() == this->size()) {
return 0; }
822 const int delta = this->size() - fsOnly.
size();
842 bool CAircraftModelList::replaceOrAddModelWithString(
const CAircraftModel &addOrReplaceModel,
846 if (!this->isEmpty()) { r = this->removeModelWithString(addOrReplaceModel.
getModelString(), sensitivity); }
847 this->push_back(addOrReplaceModel);
854 if (addOrReplaceList.
isEmpty()) {
return 0; }
857 *
this = addOrReplaceList;
858 return addOrReplaceList.
size();
863 int removed = newModels.
size();
866 return this->size() - removed;
892 QStringList CAircraftModelList::getModelStringList(
bool sort)
const
924 if (this->isEmpty()) {
return {}; }
927 if (simulatorsRepresented < 1) {
return {}; }
930 const int count = cps.
lastKey();
936 int CAircraftModelList::countModelsWithColorLivery()
const
946 int CAircraftModelList::countModelsWithAirlineLivery()
const
956 int CAircraftModelList::countVtolAircraft()
const
961 if (model.
isVtol()) { count++; }
976 int CAircraftModelList::countMilitaryAircraft()
const
986 int CAircraftModelList::countCivilianAircraft()
const
991 if (model.isCivilian()) { count++; }
996 int CAircraftModelList::countDifferentAirlines()
const {
return this->getAirlineVDesignators().size(); }
998 int CAircraftModelList::countCombinedTypes()
const {
return this->getCombinedTypes().size(); }
1000 int CAircraftModelList::countAliases()
const
1005 if (model.hasModelStringAlias()) { count++; }
1010 void CAircraftModelList::sortByFileName()
1012 if (CFileUtils::isFileNameCaseSensitive()) { this->sortBy(&CAircraftModel::getFileName); }
1013 else { this->sortBy(&CAircraftModel::getFileNameLowerCase); }
1016 void CAircraftModelList::updateDistributor(
const CDistributor &distributor)
1023 if (this->isEmpty()) {
return {}; }
1029 if (distributors.
contains(d)) {
continue; }
1032 return distributors;
1037 if (this->isEmpty()) {
return {}; }
1046 if (keys.
contains(key)) {
continue; }
1090 if (this->isEmpty()) {
return {}; }
1099 if (keys.
contains(key)) {
continue; }
1130 if (groupId < 0) {
return {}; }
1139 QSet<QString> CAircraftModelList::getAirlineDesignatorsForGroup(
int groupId)
const
1141 return this->getAirlineIcaoCodesForGroup(groupId).allDesignators();
1144 QSet<QString> CAircraftModelList::getAirlineVDesignatorsForGroup(
int groupId)
const
1146 return this->getAirlineIcaoCodesForGroup(groupId).allVDesignators();
1155 if (ct.
isEmpty()) {
continue; }
1156 combinedCodes.
insert(ct);
1158 return combinedCodes;
1163 const bool cs = CFileUtils::isFileNameCaseSensitive();
1175 const bool cs = CFileUtils::isFileNameCaseSensitive();
1181 if (CFileUtils::isWindowsUncPath(fn)) { files.
insert(fn); }
1188 if (this->isEmpty()) {
return {}; }
1192 QSet<QString> CAircraftModelList::getAicraftAndAirlineDesignators(
bool withDbId)
const
1210 QString CAircraftModelList::getAicraftAndAirlineDesignatorsAsString(
bool withDbId,
const QString &separator)
const
1212 if (this->isEmpty()) {
return {}; }
1213 return joinStringSet(this->getAicraftAndAirlineDesignators(withDbId), separator);
1221 void CAircraftModelList::updateLivery(
const CLivery &livery)
1228 if (distributors.
isEmpty()) {
return 0; }
1237 void CAircraftModelList::normalizeFileNamesForDb()
1248 CCallsign::addLogDetailsToList(
1250 QStringLiteral(
"Prefer color liveries: '%1', airline: '%2', ignore zero scores: '%3'")
1252 boolToYesNo(ignoreZeroScores)));
1253 CCallsign::addLogDetailsToList(log, remoteModel.
getCallsign(),
1254 QStringLiteral(
"--- Start scoring in list with %1 models").arg(this->size()));
1255 CCallsign::addLogDetailsToList(log, remoteModel.
getCallsign(), this->coverageSummaryForModel(remoteModel));
1261 const int score = model.
calculateScore(remoteModel, preferColorLiveries, log ? &subMsgs :
nullptr);
1262 if (ignoreZeroScores && score < 1) {
continue; }
1264 CCallsign::addLogDetailsToList(
1268 CCallsign::addLogDetailsToList(log, remoteModel.
getCallsign(),
1269 QStringLiteral(
"--- End calculating #%1 ---").arg(c));
1271 scoreMap.
insert(score, model);
1273 CCallsign::addLogDetailsToList(log, remoteModel.
getCallsign(), QStringLiteral(
"--- End scoring ---"));
1284 if (sorted) { c.
sort(); }
1292 return this->validateForPublishing(validModels, invalidModels);
1298 if (this->isEmpty()) {
return {}; }
1319 CAircraftModelList::addAsValidOrInvalidModel(model,
true, validModels, invalidModels);
1324 CAircraftModelList::addAsValidOrInvalidModel(model,
false, validModels, invalidModels);
1338 if (distributorsFromDb.
isEmpty())
1342 CAircraftModelList::addAsValidOrInvalidModels(*
this,
false, validModels, invalidModels);
1349 CAircraftModelList::addAsValidOrInvalidModel(model, valid, validModels, invalidModels);
1363 int stopAtFailedFiles, std::atomic_bool &wasStopped,
1364 const QString &simRootDirectory,
bool alreadySortedByFn)
const
1371 int failedFilesCount = 0;
1378 if (CBuildConfig::isRunningOnWindowsNtPlatform())
1384 const bool caseSensitive = CFileUtils::isFileNameCaseSensitive();
1385 const QString simRootDir = CFileUtils::normalizeFilePathToQtStandard(
1386 CFileUtils::stripLeadingSlashOrDriveLetter(caseSensitive ? simRootDirectory : simRootDirectory.
toLower()));
1390 if (wasStopped) {
break; }
1393 if (!model.hasModelString())
1399 if (!model.hasFileName())
1401 if (ignoreEmptyFileNames) {
break; }
1403 << model.getModelStringAndDbKey());
1407 const QString fn(caseSensitive ? model.getFileName() : model.getFileNameLowerCase());
1411 << model.getModelStringAndDbKey() << model.getFileName());
1415 if (workingFiles.
contains(fn) || model.hasExistingCorrespondingFile())
1421 CStatusMessage(
this).validationError(u
"'%1', not in root directory '%2', '%3' skipped")
1422 << model.getModelStringAndDbKey() << simRootDir << model.getFileName());
1440 << model.getModelStringAndDbKey() << model.getFileName());
1444 CAircraftModelList::addAsValidOrInvalidModel(model, ok, validModels, invalidModels);
1445 if (stopAtFailedFiles > 0 && failedFilesCount >= stopAtFailedFiles)
1449 << failedFilesCount);
1458 << validModels.
size());
1463 << invalidModels.
size());
1474 if (!CBuildConfig::isRunningOnWindowsNtPlatform()) {
return msgs; }
1475 if (uncFiles.
isEmpty()) {
return msgs; }
1477 const QSet<QString> uncMachines = CFileUtils::windowsUncMachines(uncFiles);
1480 msgs.
push_back(CStatusMessage(
this).validationInfo(u
"Found NO UNC machines for %1 files, odd...?")
1481 << uncFiles.
size());
1486 msgs.
push_back(CStatusMessage(
this).validationInfo(u
"Found %1 UNC files on machines: %2")
1487 << uncFiles.
size() << machines);
1490 for (
const QString &m : uncMachines)
1492 const bool ping = canPing(m);
1495 msgs.
push_back(CStatusMessage(
this).validationError(u
"Cannot ping UNC machine(s): %1. UNC files: %2")
1496 << m << uncFiles.
size());
1506 for (
const auto &it : *
this) { array << it.toMemoizedJson(helper); }
1508 json.
insert(
"containerbase", array);
1515 void CAircraftModelList::convertFromMemoizedJson(
const QJsonObject &json,
bool fallbackToConvertToJson)
1529 const bool undefDist = distributors.
isUndefined();
1530 const bool undefAll = undefAc && undefDist && undefLiv;
1532 if (fallbackToConvertToJson && undefAll)
1534 this->convertFromJson(json);
1539 if (undefAc) {
throw CJsonException(
"Missing 'aircraftIcaos'"); }
1541 if (undefDist) {
throw CJsonException(
"Missing 'distributors'"); }
1562 for (
auto &&i : array)
1568 this->push_back(value);
1592 if (this->isEmpty()) {
return {}; }
1603 if (this->isEmpty()) {
return "no models"; }
1605 const int dbEntries = this->countWithValidDbKey();
1606 const double dbRatio = CMathUtils::round(
static_cast<double>(100 * dbEntries) / this->size(), 1);
1608 u
" (" %
QString::number(dbRatio) % u
"%)" % separator % u
"color liveries: " %
1609 QString::number(this->countModelsWithColorLivery()) % u
" | airline liveries: " %
1610 QString::number(this->countModelsWithAirlineLivery()) % separator % u
"VTOL: " %
1613 QString::number(this->countCivilianAircraft()) % separator % u
"Different airlines: " %
1614 QString::number(this->countDifferentAirlines()) % separator % u
"Combined types: '" %
1615 this->getCombinedTypesAsString() % u
'\'' % separator %
1616 (this->size() <= 25 ?
1617 (u
"Aircraft/airlines: " % this->getAicraftAndAirlineDesignatorsAsString(
true) % separator) :
1619 u
"Simulators: " % this->countPerSimulator().toQString();
1623 const QString &separator)
const
1625 const bool combinedCodeForModel =
1627 const bool airlineForModel =
1629 return coverageSummary(separator) % separator % u
"Data for input model, has combined: " %
1630 boolToYesNo(combinedCodeForModel) %
1636 QString CAircraftModelList::htmlStatistics(
bool aircraftStats,
bool airlineStats)
const
1638 static const QString sep(
"<br>");
1639 const bool notOnlyDb = this->containsAnyObjectWithoutKey();
1640 QString stats = this->coverageSummary(sep);
1646 stats += sep % sep % u
"Aircraft ICAOs from DB: " % sep % designators.
join(
", ");
1653 stats += sep % sep % u
"Airline ICAOs from DB: " % sep % designators.
join(
", ");
1659 stats += sep % sep % u
"DB objects:<br>---------" % sep % dbModels.
htmlStatistics(
false,
false);
1667 const QString json = this->toJsonString();
1668 const bool s = CFileUtils::writeStringToFile(json, invalidModelFileAndPath());
1672 << this->size() << invalidModelFileAndPath();
1674 return CStatusMessage(
this).
info(u
"Saved %1 entries to '%2'") << this->size() << invalidModelFileAndPath();
1679 const QString json = CFileUtils::readFileToString(invalidModelFileAndPath());
1682 return CStatusMessage(
this).
error(u
"Unable to read from '%1'") << invalidModelFileAndPath();
1684 *
this = CAircraftModelList::fromJson(json,
true);
1685 return CStatusMessage(
this).
info(u
"Loaded %1 entries from '%2'") << this->size() << invalidModelFileAndPath();
1702 models.
push_back(CAircraftModel::fromDatabaseJsonCaching(value.toObject(), aircraftIcaosMap, categoriesMap,
1703 liveriesMap, distributorsMap));
1708 const QString &CAircraftModelList::invalidModelFileAndPath()
1711 CFileUtils::appendFilePathsAndFixUnc(CSwiftDirectories::logDirectory(),
"invalidmodels.json");
1715 bool CAircraftModelList::hasInvalidModelFile()
1717 const QFileInfo fi(invalidModelFileAndPath());
1721 void CAircraftModelList::addAsValidOrInvalidModel(
const CAircraftModel &model,
bool valid,
1743 CAircraftModelList::addAsValidOrInvalidModel(model, valid, validModels, invalidModels);
Thrown when a convertFromJson method encounters an unrecoverable error in JSON data.
Pseudo-RAII pattern that tracks the current JSON value being converted.
Memoizer for Ts. Other types are passed through.
const CSequence< T > & getTable() const
Return the values in the T table as a flat list.
Unmemoizer for Ts. Other types are passed through.
CSequence< T > & getTable()
Return reference to the flat list T table.
Derived & validationError(const char16_t(&format)[N])
Set the severity to error, providing a format string, and adding the validation category.
Derived & error(const char16_t(&format)[N])
Set the severity to error, providing a format string.
Derived & info(const char16_t(&format)[N])
Set the severity to info, providing a format string.
auto findFirstByOrDefault(Predicate p, const Value &def) const
Return a copy of the first element for which a given predicate returns true, or a default value if th...
bool containsBy(Predicate p) const
Return true if there is an element for which a given predicate returns true.
bool contains(const T &object) const
Return true if there is an element equal to given object. Uses the most efficient implementation avai...
size_type size() const
Returns number of elements in the sequence.
CSequence findBy(Predicate p) const
Return a copy containing only those elements for which a given predicate returns true.
void truncate(size_type maxSize)
Changes the size of the sequence, if it is bigger than the given size.
void push_back(const T &value)
Appends an element at the end of the sequence.
const_iterator cbegin() const
Returns const iterator at the beginning of the sequence.
void clear()
Removes all elements in the sequence.
const_iterator cend() const
Returns const iterator one past the end of the sequence.
bool isEmpty() const
Synonym for empty.
Build a QSet more efficiently when calling insert() in a for loop.
void insert(const T &value)
Add an element to the set. Runs in amortized constant time.
Streamable status message, e.g.
bool isWarningOrAbove() const
Warning or above.
void prependMessage(const QString &msg)
Prepend message.
Status messages, e.g. from Core -> GUI.
CStatusMessage toSingleMessage() const
Merge into a single message.
bool hasErrorMessages() const
Error messages.
Value object for aircraft categories.
bool isNull() const
Null category?
int getFirstLevel() const
First level.
Value object encapsulating a list of ICAO codes.
Value object for ICAO classification.
CWakeTurbulenceCategory getWtc() const
Get WTC.
bool hasFamily() const
Has family?
const QString & getFamily() const
Family (e.g. A350)
bool matchesDesignator(const QString &designator, int fuzzyMatch=-1, int *result=nullptr) const
Matches designator string?
const QString & getDesignator() const
Get ICAO designator, e.g. "B737".
QString getDesignatorDbKey() const
Designator and DB key.
bool matchesCombinedType(const QString &combinedType) const
Matches given combined code.
const QString & getCombinedType() const
Get type, e.g. "L2J".
const CAircraftCategory & getCategory() const
Get category.
const QString & getManufacturer() const
Get manufacturer, e.g. "Airbus".
Value object encapsulating a list of ICAO codes.
QSet< QString > allDesignators(bool noUnspecified=true) const
All ICAO codes, no duplicates.
Value object for ICAO classification.
QString getDesignatorDbKey() const
Designator and DB key.
const QString & getDesignator() const
Get airline, e.g. "DLH".
bool hasValidDesignator() const
Airline designator available?
bool matchesNamesOrTelephonyDesignator(const QString &candidate) const
Relaxed check by name or telephony designator (aka callsign, not to be confused with CCallsign)
int getGroupId() const
Group id.
Value object encapsulating a list of ICAO codes.
QStringList toIcaoDesignatorCompleterStrings(bool combinedString=true, bool sort=true) const
String list for completion by ICAO designator.
Value object encapsulating information of a callsign.
bool isEmpty() const
Is empty?
Value object encapsulating information about an airpot.
double getColorDistance(const CLivery &otherLivery) const
Color distance 0..1 (0 is best)
bool matchesCombinedCode(const QString &candidate) const
Matches combined code.
const CAirlineIcaoCode & getAirlineIcaoCode() const
Corresponding airline, if any.
bool hasColorTail() const
Tail color set?
bool hasColorFuselage() const
Fuselage color set?
const QString & getCombinedCode() const
Combined code.
bool isAirlineLivery() const
Livery representing airline.
bool hasCombinedCode() const
Livery combined code available?
bool isColorLivery() const
Color livery?
Value object for a list of airports.
ICAO wake turbulence category.
QMap< KEYTYPE, OBJ > toDbKeyValueMap() const
As map with DB key/object.
int getDbKey() const
Get DB key.
bool hasValidDbKey() const
Has valid DB key.
bool hasValidDbKey() const
Has valid DB key.
const QString & getDbKey() const
Get DB key.
Physical unit length (length)
Aircraft model (used by another pilot, my models on disk)
const aviation::CCallsign & getCallsign() const
Corresponding callsign if applicable.
void convertFromMemoizedJson(const QJsonObject &json, const MemoHelper::CUnmemoizer &)
From JSON with memoized members (used by CAircraftModelList)
bool setDistributorOrder(int order)
Set the distributor order.
bool matchesModelString(const QString &modelString, Qt::CaseSensitivity sensitivity) const
Matches model string?
ModelMode getModelMode() const
Model mode.
const aviation::CAirlineIcaoCode & getAirlineIcaoCode() const
Airline ICAO code.
bool hasKnownAircraftDesignator() const
Has known aircraft designator?
bool hasCategory() const
Assigned a category?
bool hasAirlineDesignator() const
Airline designator?
bool hasExistingCorrespondingFile() const
Does the corresponding file exist?
const aviation::CLivery & getLivery() const
Get livery.
ModelMode
Mode, decides if a model is supposed to be used in the model set for model matching or not....
int calculateScore(const CAircraftModel &compareModel, bool preferColorLiveries, CStatusMessageList *log=nullptr) const
Calculate score.
const QString & getAircraftIcaoCodeDesignator() const
Aircraft ICAO code designator.
CSimulatorInfo getSimulator() const
Simulator info.
void normalizeFileNameForDb()
File path for DB (absolute paths make no sense in DB)
const QString & getModelString() const
Model key, either queried or loaded from simulator model.
bool isVtol() const
VTOL aircraft?
bool hasDistributor() const
Distributor, but not necessarily loaded from DB.
bool hasFileName() const
File name?
bool isCivilian() const
Civilian model?
const QString & getModelModeAsString() const
Model mode as string.
bool hasAircraftDesignator() const
Has aircraft designator?
QJsonObject toDatabaseJson() const
To database JSON.
bool matchesModelStringOrAlias(const QString &modelString, Qt::CaseSensitivity sensitivity) const
Matches model string or alias?
CStatusMessageList validate(bool withNestedObjects) const
Validate.
bool matchesMode(simulation::CAircraftModel::ModelModeFilter mode) const
Matches given mode?
const CDistributor & getDistributor() const
Get distributor.
const aviation::CAircraftIcaoCode & getAircraftIcaoCode() const
Aircraft ICAO code.
bool matchesFileName(const QString &fileName) const
Matching file name?
bool hasDbDistributor() const
Distributor loaded from DB.
QString getModelStringAndDbKey() const
Model string and DB key (if available)
const QString getAirlineIcaoCodeVDesignator() const
Airline ICAO code designator.
QString getFileNameLowerCase() const
File name as lower case.
bool matchesAnyDbDistributor(const CDistributorList &distributors) const
By distributor.
QString asHtmlSummary(const QString &separator="<br>") const
As a brief HTML summary (e.g. used in tooltips)
const QString & getAirlineIcaoCodeDesignator() const
Airline ICAO code designator.
bool isMilitary() const
Military model?
bool hasModelString() const
Non empty model string?
void setLivery(const aviation::CLivery &livery)
Livery.
void setDistributor(const CDistributor &distributor)
Set distributor.
bool setAircraftIcaoCode(const aviation::CAircraftIcaoCode &aircraftIcaoCode)
Set aircraft ICAO code.
const QString & getFileName() const
File name (corresponding data for simulator, only available if representing simulator model.
bool matchesSimulator(const CSimulatorInfo &simulator) const
Matches given simulator?
Value object encapsulating a list of aircraft models.
bool containsModelStringOrDbKey(const simulation::CAircraftModel &model, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive) const
Contains model with model string or id?
bool containsAirlineLivery(const aviation::CAirlineIcaoCode &airline) const
Contains airline livery for given airline.
QStringList getModelStringList(bool sort=true) const
Model strings.
CAircraftModel findFirstByModelStringAliasOrDefault(const QString &modelString, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive) const
Find first by model string.
QSet< QString > getAllUNCFileNames() const
All UNC file names.
CAircraftModelList findEmptyModelStrings() const
Find empty model strings.
CAircraftModel findFirstByModelStringOrDefault(const QString &modelString, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive) const
Find first by model string.
CAircraftModelList findByAircraftAndAirline(const aviation::CAircraftIcaoCode &aircraftIcaoCode, const aviation::CAirlineIcaoCode &airlineIcaoCode) const
Find by ICAO of aircraft and airline.
CAircraftModelList findByAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator, const QString &combinedCode) const
Find by designator and livery code.
bool containsCallsign(const aviation::CCallsign &callsign) const
Contains model for callsign?
CAircraftModelList findByAirlineGroup(const swift::misc::aviation::CAirlineIcaoCode &airline) const
Find by the corresponding airline group.
CAircraftModelList findColorLiveries() const
Find color liveries.
CAircraftModelList findByIcaoDesignators(const aviation::CAircraftIcaoCode &aircraftIcaoCode, const aviation::CAirlineIcaoCode &airlineIcaoCode) const
Find by ICAO designators.
CAircraftModelList findByAircraftAndLivery(const aviation::CAircraftIcaoCode &aircraftIcaoCode, const aviation::CLivery &livery) const
Find by aircraft and livery.
int removeModelsWithString(const CAircraftModelList &models, Qt::CaseSensitivity sensitivity)
Remove those models with given model strings.
QString htmlStatistics(bool aircraftStats, bool airlineStats) const
A HTML summary of the data in the list.
CAircraftModelList findByModelString(const QString &modelString, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive) const
Find by model string.
CAircraftModel findFirstByCallsignOrDefault(const aviation::CCallsign &callsign) const
Find first by callsign.
bool removeModelWithString(const QString &modelString, Qt::CaseSensitivity sensitivity)
Remove those models with given model strings.
CAircraftModelList findByAirlineNameAndTelephonyDesignator(const QString &name, const QString &telephony, bool onlyIfExistInModel=true) const
Find by airline name and telephony.
bool containsCombinedType(const QString &combinedType) const
Contains given combined type?
bool containsModelString(const QString &modelString, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive) const
Contains model string?
bool containsModelsWithAircraftAndAirlineIcaoDesignator(const QString &aircraftDesignator, const QString &airlineDesignator) const
Contains any model with aircraft and airline ICAO designator?
bool containsModelsWithAircraftIcaoDesignator(const QString &aircraftDesignator) const
Contains any model with aircraft ICAO designator?
void sortByFileName()
Sort by file path.
Count per simulator, small utility class allows to retrieve values as per simulator.
void increaseSimulatorCounts(const CSimulatorInfo &simulator)
Increase all simulators given here.
int simulatorsRepresented() const
Number of simulators with count > 0.
QMultiMap< int, CSimulatorInfo > countPerSimulator() const
Sorted (ascending) per simulator.
Value object encapsulating information of software distributor.
Value object encapsulating a list of distributors.
int removeIfNotLoadedFromDb()
Remove distributors not from DB.
Simple hardcoded info about the corresponding simulator.
void addSimulator(Simulator s)
Add simulator flags.
bool matchesAny(const CSimulatorInfo &otherInfo) const
Matches any simulator.
Simulator getSimulator() const
Simulator.
auto removeIfIn(I begin1, I end1, J begin2, J end2)
Removes those elements in range 1 that appear also in range 2 leaving only those that do not appear i...
SWIFT_MISC_EXPORT QString joinStringSet(const QSet< QString > &set, const QString &separator)
Convert string to bool.
auto makePairsRange(const T &container)
Returns a const CRange for iterating over the keys and values of a Qt associative container.
bool exists(const QString &path)
void append(const QJsonValue &value)
QByteArray toJson(QJsonDocument::JsonFormat format) const const
QJsonObject::iterator insert(QLatin1StringView key, const QJsonValue &value)
QJsonValue value(QLatin1StringView key) const const
bool isUndefined() const const
QJsonArray toArray() const const
QJsonObject toObject() const const
void append(QList< T > &&value)
QList< T >::iterator begin()
QList< T >::iterator end()
bool isEmpty() const const
bool contains(const Key &key) const const
const Key & firstKey() const const
bool isEmpty() const const
Key key(const T &value, const Key &defaultKey) const const
QMap< Key, T >::size_type size() const const
QList< T > values() const const
QMultiMap< Key, T >::iterator insert(QMultiMap< Key, T >::const_iterator pos, const Key &key, const T &value)
const Key & lastKey() const const
QList< T > values() const const
bool contains(const QSet< T > &other) const const
QSet< T >::iterator insert(QSet< T >::const_iterator it, const T &value)
bool isEmpty() const const
qsizetype size() const const
QList< T > values() const const
const QChar at(qsizetype position) const const
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
qsizetype length() const const
QString number(double n, char format, int precision)
QString toLower() const const
QString toUpper() const const
QString trimmed() const const
bool contains(QLatin1StringView str, Qt::CaseSensitivity cs) const const
QString join(QChar separator) const const
void sort(Qt::CaseSensitivity cs)
#define SWIFT_DEFINE_SEQUENCE_MIXINS(Namespace, T, List)
Explicit template definition of mixins for a CSequence subclass.