swift
aircraftcfgentrieslist.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include "misc/predicates.h"
7 #include "misc/range.h"
8 #include "misc/setbuilder.h"
10 #include "misc/statusmessagelist.h"
11 #include "misc/stringutils.h"
12 
13 using namespace swift::misc;
14 using namespace swift::misc::simulation;
15 
16 SWIFT_DEFINE_SEQUENCE_MIXINS(swift::misc::simulation::fscommon, CAircraftCfgEntries, CAircraftCfgEntriesList)
17 
18 namespace swift::misc::simulation::fscommon
19 {
21 
23 
24  bool CAircraftCfgEntriesList::containsModelWithTitle(const QString &title, Qt::CaseSensitivity caseSensitivity)
25  {
26  if (title.isEmpty()) { return false; }
27  return this->containsBy([=](const CAircraftCfgEntries &entries) {
28  return title.compare(entries.getTitle(), caseSensitivity) == 0;
29  });
30  }
31 
33  {
34  QStringList titles = this->getTitles(true);
35  QStringList ambiguousTitles;
36  QString last;
37  for (const QString &title : titles)
38  {
39  if (title.isEmpty()) { continue; }
40  if (title.compare(last, Qt::CaseInsensitive) == 0)
41  {
42  if (!ambiguousTitles.contains(title, Qt::CaseInsensitive)) { ambiguousTitles.append(title); }
43  }
44  last = title;
45  }
46  return ambiguousTitles;
47  }
48 
49  QStringList CAircraftCfgEntriesList::getTitles(bool sorted) const
50  {
52  if (sorted) { titles.sort(Qt::CaseInsensitive); }
53  return titles;
54  }
55 
57  {
58  CSetBuilder<QString> titlesUc;
59  for (const CAircraftCfgEntries &entries : *this) { titlesUc.insert(entries.getTitle().toUpper()); }
60  return titlesUc;
61  }
62 
63  QString CAircraftCfgEntriesList::getTitlesAsString(bool sorted, const QString &separator) const
64  {
65  return this->getTitles(sorted).join(separator);
66  }
67 
68  bool CAircraftCfgEntriesList::containsTitle(const QString &title) const
69  {
70  if (title.isEmpty()) { return false; }
71  for (const CAircraftCfgEntries &entries : (*this))
72  {
73  if (stringCompare(entries.getTitle(), title, Qt::CaseInsensitive)) { return true; }
74  }
75  return false;
76  }
77 
78  CAircraftModelList CAircraftCfgEntriesList::toAircraftModelList(bool ignoreDuplicatesAndEmptyModelStrings,
79  CStatusMessageList &msgs) const
80  {
82  QSet<QString> keys;
83  for (const CAircraftCfgEntries &entries : (*this))
84  {
85  if (ignoreDuplicatesAndEmptyModelStrings)
86  {
87  const QString key = entries.getTitle().toUpper();
88  if (key.isEmpty()) { continue; }
89  if (keys.contains(key))
90  {
91  CStatusMessage msg(this);
92  msg.warning(u"Duplicate model string %1 in %2 %3")
93  << entries.getTitle() << entries.getFileDirectory() << entries.getFileName();
94  msgs.push_back(msg);
95  continue;
96  }
97  keys.insert(key);
98  }
99  ml.push_back(entries.toAircraftModel());
100  }
101  return ml;
102  }
103 
105  bool ignoreDuplicatesAndEmptyModelStrings,
106  CStatusMessageList &msgs) const
107  {
108  CAircraftModelList ml = this->toAircraftModelList(ignoreDuplicatesAndEmptyModelStrings, msgs);
109  ml.setSimulatorInfo(simInfo);
110  return ml;
111  }
112 
114  Qt::CaseSensitivity caseSensitivity) const
115  {
116  return this->findBy([=](const CAircraftCfgEntries &entries) {
117  return title.compare(entries.getTitle(), caseSensitivity) == 0;
118  });
119  }
120 
121 } // namespace swift::misc::simulation::fscommon
Derived & warning(const char16_t(&format)[N])
Set the severity to warning, providing a format string.
bool containsBy(Predicate p) const
Return true if there is an element for which a given predicate returns true.
Definition: range.h:101
auto transform(F function) const
Return a new container generated by applying some transformation function to all elements of this one...
Definition: range.h:403
CSequence findBy(Predicate p) const
Return a copy containing only those elements for which a given predicate returns true.
Definition: sequence.h:398
void push_back(const T &value)
Appends an element at the end of the sequence.
Definition: sequence.h:305
Build a QSet more efficiently when calling insert() in a for loop.
Definition: setbuilder.h:25
void insert(const T &value)
Add an element to the set. Runs in amortized constant time.
Definition: setbuilder.h:29
Streamable status message, e.g.
Status messages, e.g. from Core -> GUI.
Value object encapsulating a list of aircraft models.
int setSimulatorInfo(const CSimulatorInfo &info)
Set simulator for all elements.
Simple hardcoded info about the corresponding simulator.
Definition: simulatorinfo.h:41
Set of aircraft.cfg entries representing an aircraft (FSX)
bool containsModelWithTitle(const QString &title, Qt::CaseSensitivity caseSensitivity=Qt::CaseInsensitive)
Contains model with title?
QString getTitlesAsString(bool sorted, const QString &separator=", ") const
All titles as string.
QStringList getTitles(bool sorted=false) const
All titles (aka model names)
CAircraftCfgEntriesList findByTitle(const QString &title, Qt::CaseSensitivity caseSensitivity=Qt::CaseInsensitive) const
Find by title.
swift::misc::simulation::CAircraftModelList toAircraftModelList(bool ignoreDuplicatesAndEmptyModelStrings, CStatusMessageList &msgs) const
As aircraft models.
bool containsTitle(const QString &title) const
Can check if a title (model string) is known.
QSet< QString > getTitleSetUpperCase() const
Titles as set in upper case.
auto MemberTransform(T memberFunc)
Returns a function object that returns the value returned by one of it's argument member functions.
Definition: predicates.h:54
Free functions in swift::misc.
SWIFT_MISC_EXPORT bool stringCompare(const QString &c1, const QString &c2, Qt::CaseSensitivity cs)
String compare.
#define SWIFT_DEFINE_SEQUENCE_MIXINS(Namespace, T, List)
Explicit template definition of mixins for a CSequence subclass.
Definition: sequence.h:63