9 #include <QStringBuilder>
20 using namespace swift::config;
22 using namespace swift::misc::db;
23 using namespace swift::misc::simulation::fscommon;
24 using namespace swift::misc::simulation::xplane;
28 namespace swift::misc::simulation
30 CSimulatorInfo::CSimulatorInfo() {}
32 CSimulatorInfo::CSimulatorInfo(
const QString &identifierString)
33 : m_simulator(identifierToSimulator(identifierString))
38 const QString identifier = simulators.join(
' ');
45 : m_simulator(boolToFlag(fsx, fs9, xp, p3d, fg, msfs, msfs2024))
90 int c =
isFS9() ? 1 : 0;
102 return (m_simulator & otherInfo.m_simulator) == otherInfo.m_simulator;
107 return (m_simulator & otherInfo.m_simulator) > 0;
119 return Compare::compare(m_simulator, compareValue.m_simulator);
126 const QString str = (s.testFlag(
FSX) ? QStringLiteral(
"FSX ") : QString()) %
127 (s.testFlag(FS9) ? QStringLiteral(
"FS9 ") : QString()) %
128 (s.testFlag(P3D) ? QStringLiteral(
"P3D ") : QString()) %
129 (s.testFlag(XPLANE) ? QStringLiteral(
"XPlane ") : QString()) %
130 (s.testFlag(FG) ? QStringLiteral(
"FG ") : QString()) %
131 (s.testFlag(MSFS) ? QStringLiteral(
"MSFS ") : QString()) %
132 (s.testFlag(MSFS2024) ? QStringLiteral(
"MSFS2024 ") : QString());
133 return str.trimmed();
151 QSet<CSimulatorInfo> set;
158 if (m_simulator & MSFS2024) { set.insert(
CSimulatorInfo(MSFS2024)); }
164 m_simulator = (m_simulator ^
static_cast<int>(All)) &
static_cast<int>(All);
180 return m.
info(u
"Simulators OK for model");
186 Simulator s =
fsx ?
FSX : None;
187 if (
fs9) { s |= FS9; }
188 if (xp) { s |= XPLANE; }
189 if (
p3d) { s |= P3D; }
191 if (
msfs) { s |= MSFS; }
198 const QString i(identifier.toLower().trimmed().remove(
' ').remove(
'-'));
199 if (i.isEmpty()) {
return None; }
202 if (i.contains(
"fsx") || i.contains(
"fs10")) { s |=
FSX; }
203 if (i.contains(
"fs9") || i.contains(
"2004")) { s |= FS9; }
204 if (i.contains(
"plane") || i.contains(
"xp")) { s |= XPLANE; }
205 if (i.contains(
"gear") ||
stringCompare(QStringLiteral(
"fg"), identifier, Qt::CaseInsensitive)) { s |= FG; }
206 if (i.contains(
"3d") || i.contains(
"prepar") || i.contains(
"martin") || i.contains(
"lm") || i.contains(
"lock"))
210 if (i.contains(
"msfs2024"))
216 if (i.contains(
"msfs")) { s |= MSFS; }
228 static const QStringList sims = [] {
231 s.sort(Qt::CaseInsensitive);
259 if (CBuildConfig::isRunningOnWindowsNtPlatform())
261 fs9 = !CFsDirectories::fs9AircraftDir().isEmpty() && !CFsDirectories::fs9Dir().isEmpty();
262 fsx = !CFsDirectories::fsxSimObjectsDir().isEmpty() && !CFsDirectories::fsxDir().isEmpty();
263 p3d = !CFsDirectories::p3dDir().isEmpty() && !CFsDirectories::p3dSimObjectsDir().isEmpty();
264 msfs = !CFsDirectories::msfsDir().isEmpty() && !CFsDirectories::msfsPackagesDir().isEmpty();
265 msfs2024 = !CFsDirectories::msfs2024Dir().isEmpty() && !CFsDirectories::msfs2024PackagesDir().isEmpty();
268 const bool xp = !CXPlaneUtil::xplaneRootDir().isEmpty();
278 if (CBuildConfig::isRunningOnLinuxPlatform() || CBuildConfig::isRunningOnMacOSPlatform())
299 const QJsonValue jfsx = json.value(prefix % u
"simfsx");
300 const QJsonValue jfs9 = json.value(prefix % u
"simfs9");
301 const QJsonValue jxp = json.value(prefix % u
"simxplane");
302 const QJsonValue jp3d = json.value(prefix % u
"simp3d");
303 const QJsonValue jfg = json.value(prefix % u
"simfg");
304 const QJsonValue jmsfs = json.value(prefix % u
"simmsfs");
305 const QJsonValue jmsfs2024 = json.value(prefix % u
"simmsfs2024");
308 const bool fsx = jfsx.isBool() ? jfsx.toBool() : CDatastoreUtility::dbBoolStringToBool(jfsx.toString());
309 const bool fs9 = jfs9.isBool() ? jfs9.toBool() : CDatastoreUtility::dbBoolStringToBool(jfs9.toString());
310 const bool xp = jxp.isBool() ? jxp.toBool() : CDatastoreUtility::dbBoolStringToBool(jxp.toString());
311 const bool p3d = jp3d.isBool() ? jp3d.toBool() : CDatastoreUtility::dbBoolStringToBool(jp3d.toString());
312 const bool fg = jfg.isBool() ? jfg.toBool() : CDatastoreUtility::dbBoolStringToBool(jfg.toString());
313 const bool msfs = jmsfs.isBool() ? jmsfs.toBool() : CDatastoreUtility::dbBoolStringToBool(jmsfs.toString());
315 jmsfs2024.isBool() ? jmsfs2024.toBool() : CDatastoreUtility::dbBoolStringToBool(jmsfs2024.toString());
329 return m_counts[internalIndex(simulator)];
357 for (
int i = 0; i < m_counts.size() - 1; i++)
359 if (m_counts[i] > 0) { c++; }
366 QMultiMap<int, CSimulatorInfo> counts;
367 for (
int i = 0; i < m_counts.size(); i++) { counts.insert(m_counts[i], simulator(i)); }
373 return u
"FSX: " % QString::number(m_counts[0]) % u
" P3D: " % QString::number(m_counts[1]) % u
" FS9: " %
374 QString::number(m_counts[2]) % u
" XPlane: " % QString::number(m_counts[3]) % u
" FG: " %
375 QString::number(m_counts[4]) % u
" MSFS: " % QString::number(m_counts[5]) % u
" MSFS2024: " %
376 QString::number(m_counts[6]);
381 m_counts[internalIndex(simulator)] = count;
392 if (simulator.
isFSX()) { m_counts[0]++; }
393 if (simulator.
isP3D()) { m_counts[1]++; }
394 if (simulator.
isFS9()) { m_counts[2]++; }
395 if (simulator.
isXPlane()) { m_counts[3]++; }
396 if (simulator.
isFG()) { m_counts[4]++; }
397 if (simulator.
isMSFS()) { m_counts[5]++; }
398 if (simulator.
isMSFS2024()) { m_counts[6]++; }
401 int CCountPerSimulator::internalIndex(
const CSimulatorInfo &simulator)
406 case CSimulatorInfo::FSX:
return 0;
407 case CSimulatorInfo::P3D:
return 1;
408 case CSimulatorInfo::FS9:
return 2;
409 case CSimulatorInfo::XPLANE:
return 3;
410 case CSimulatorInfo::FG:
return 4;
411 case CSimulatorInfo::MSFS:
return 5;
412 case CSimulatorInfo::MSFS2024:
return 6;
417 CSimulatorInfo CCountPerSimulator::simulator(
int internalIndex)
419 switch (internalIndex)
421 case 0:
return CSimulatorInfo(CSimulatorInfo::FSX);
422 case 1:
return CSimulatorInfo(CSimulatorInfo::P3D);
423 case 2:
return CSimulatorInfo(CSimulatorInfo::FS9);
424 case 3:
return CSimulatorInfo(CSimulatorInfo::XPLANE);
425 case 4:
return CSimulatorInfo(CSimulatorInfo::FG);
426 case 5:
return CSimulatorInfo(CSimulatorInfo::MSFS);
427 case 6:
return CSimulatorInfo(CSimulatorInfo::MSFS2024);
428 default:
return CSimulatorInfo(CSimulatorInfo::None);
IconIndex
Index for each icon, allows to send them via DBus, efficiently store them, etc.
Derived & validationError(const char16_t(&format)[N])
Set the severity to error, providing a format string, and adding the validation category.
Derived & info(const char16_t(&format)[N])
Set the severity to info, providing a format string.
Non-owning reference to a CPropertyIndex with a subset of its features.
Streamable status message, e.g.
QString toQString() const
As QString.
void setCount(int count, const CSimulatorInfo &simulator)
Set count.
CCountPerSimulator()
Constructor.
int getCountForFsxFamilySimulators() const
P3D, MSFS or FSX.
int getMinimum() const
Minimum.
void increaseSimulatorCounts(const CSimulatorInfo &simulator)
Increase all simulators given here.
int simulatorsRepresented() const
Number of simulators with count > 0.
int getMaximum() const
Maximum.
int getCount(const CSimulatorInfo &simulator) const
Object count for given simulator.
int getCountForUnknownSimulators() const
Unknown count.
QMultiMap< int, CSimulatorInfo > countPerSimulator() const
Sorted (ascending) per simulator.
int getCountForFsFamilySimulators() const
P3D, FSX, MSFS or FS9.
Simple hardcoded info about the corresponding simulator.
static const QSet< CSimulatorInfo > & allSimulatorsSet()
All simulators as set.
bool isAllSimulators() const
Is all simulators?
CSimulatorInfo add(const CSimulatorInfo &other)
Add simulator.
CSimulatorInfo()
Default constructor.
QSet< CSimulatorInfo > asSingleSimulatorSet() const
As a set of single simulator info objects.
bool matchesAll(const CSimulatorInfo &otherInfo) const
Matches all simulators.
int comparePropertyByIndex(CPropertyIndexRef index, const CSimulatorInfo &compareValue) const
Cast as QString.
static const CSimulatorInfo & allSimulators()
All simulators.
static Simulator boolToFlag(bool isFSX, bool isFS9, bool xp, bool isP3D, bool fg, bool msfs, bool msfs2024)
Bool flags to enum.
static CSimulatorInfo getLocallyInstalledSimulators()
Locally installed simulators.
bool isMSFS2024() const
MSFS2024?
bool isSingleSimulator() const
Single simulator selected.
bool isNoSimulator() const
No simulator?
bool isMultipleSimulators() const
Represents > 1 simulator.
bool matchesAny(const CSimulatorInfo &otherInfo) const
Matches any simulator.
bool isUnspecified() const
Unspecified simulator.
static const CSimulatorInfo & guessDefaultSimulator()
Guess a default simulator based on installation.
void invertSimulators()
All simulators selected become unselected and vice versa.
Simulator getSimulator() const
Simulator.
static const CSimulatorInfo & msfs()
Const simulator info objects.
bool isMicrosoftSimulator() const
Microsoft Simulator?
bool isFsxP3DFamily() const
FSX family, i.e. FSX or P3D?
static const CSimulatorInfo & fs9()
Const simulator info objects.
static CSimulatorInfo fromDatabaseJson(const QJsonObject &json, const QString &prefix)
From database JSON.
static const CSimulatorInfo & fsx()
Const simulator info objects.
CIcons::IconIndex toIcon() const
As icon, not implemented by all classes.
static const CSimulatorInfo & p3d()
Const simulator info objects.
static const CSimulatorInfo & xplane()
Const simulator info objects.
static Simulator identifierToSimulator(const QString &identifier)
Identifer, as provided by plugin.
static const CSimulatorInfo & msfs2024()
Const simulator info objects.
void setSimulator(Simulator s)
Simulator.
bool isAnySimulator() const
Any simulator?
QString convertToQString(bool i18n=false) const
Cast as QString.
int numberSimulators() const
Number simulators selected.
static const QStringList & allSimulatorStrings()
All simulator strings.
bool isXPlane() const
XPlane.
static const CSimulatorInfo & allFsFamilySimulators()
All simulators of the FS family (P3D FSX, FS9)
CStatusMessage validateSimulatorsForModel() const
Validate simulators for an aircraft model.
static constexpr int NumberOfSimulators
Number of known individual simulators.
static const CSimulatorInfo & fg()
Const simulator info objects.
bool isMicrosoftOrPrepare3DSimulator() const
Microsoft Simulator or P3D?
bool matchesAnyOrNone(const CSimulatorInfo &otherInfo) const
Matches any simulator or None (NULL)
Utility classes for FSX, OS and driver independent code.
Free functions in swift::misc.
SWIFT_MISC_EXPORT bool stringCompare(const QString &c1, const QString &c2, Qt::CaseSensitivity cs)
String compare.
#define SWIFT_DEFINE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template definition of mixins for a CValueObject subclass.