6 #include <QStringBuilder>
16 using namespace swift::config;
17 using namespace swift::misc::physical_quantities;
18 using namespace swift::misc::simulation::fscommon;
19 using namespace swift::misc::simulation::xplane;
20 using namespace swift::misc::simulation::flightgear;
26 namespace swift::misc::simulation::settings
30 static const QString sf(
"simulator 1st");
31 static const QString dbf(
"DB 1st");
32 static const QString so(
"simulator only");
33 static const QString dbo(
"DB only");
37 case CGFromSimulatorFirst:
return sf;
38 case CGFromDBFirst:
return dbf;
39 case CGFromSimulatorOnly:
return so;
40 case CGFromDBOnly:
return dbo;
43 static const QString u(
"unknown");
47 void CSimulatorSettings::setSimulatorDirectory(
const QString &simulatorDirectory)
49 m_simulatorDirectory = simulatorDirectory.
trimmed();
52 const QString &CSimulatorSettings::getSimulatorDirectory()
const {
return m_simulatorDirectory; }
54 void CSimulatorSettings::setModelDirectories(
const QStringList &modelDirectories)
56 m_modelDirectories = modelDirectories;
58 m_modelDirectories.removeDuplicates();
61 void CSimulatorSettings::clearModelDirectories() { m_modelDirectories.clear(); }
63 void CSimulatorSettings::setModelDirectory(
const QString &modelDirectory)
65 m_modelDirectories =
QStringList({ modelDirectory });
68 bool CSimulatorSettings::addModelDirectory(
const QString &modelDirectory)
72 if (m_modelDirectories.contains(modelDirectory, cs)) {
return false; }
73 m_modelDirectories.push_back(modelDirectory);
74 m_modelDirectories.removeAll({});
75 m_modelDirectories.removeDuplicates();
79 const QStringList &CSimulatorSettings::getModelDirectories()
const {
return m_modelDirectories; }
81 void CSimulatorSettings::setModelExcludeDirectories(
const QStringList &excludeDirectories)
83 m_excludeDirectoryPatterns = excludeDirectories;
85 m_excludeDirectoryPatterns.removeDuplicates();
88 const QStringList &CSimulatorSettings::getModelExcludeDirectoryPatterns()
const
90 return m_excludeDirectoryPatterns;
93 bool CSimulatorSettings::setComIntegrated(
bool integrated)
95 if (integrated == m_comIntegration) {
return false; }
96 m_comIntegration = integrated;
102 const int s =
static_cast<int>(source);
103 if (m_cgSource == s) {
return false; }
108 bool CSimulatorSettings::setRecordOwnAircraftGnd(
bool record)
110 if (record == m_recordGnd) {
return false; }
111 m_recordGnd = record;
115 bool CSimulatorSettings::setRecordedGndRadius(
const CLength &radius)
117 if (radius == m_recordedGndRadius) {
return false; }
118 m_recordedGndRadius = radius;
122 void CSimulatorSettings::resetPaths()
124 m_excludeDirectoryPatterns.clear();
125 m_modelDirectories.clear();
126 m_simulatorDirectory.clear();
129 QString CSimulatorSettings::convertToQString(
bool i18n)
const {
return convertToQString(
", ", i18n); }
131 QString CSimulatorSettings::convertToQString(
const QString &separator,
bool i18n)
const
134 return u
"model directories: " % m_modelDirectories.join(
',') % separator % u
"exclude directories: " %
135 m_excludeDirectoryPatterns.join(
',');
146 case IndexModelExcludeDirectoryPatterns:
return QVariant::fromValue(m_excludeDirectoryPatterns);
150 case IndexRecordOwnAircraftGndRadius:
return m_recordedGndRadius.propertyByIndex(index.
copyFrontRemoved());
151 default:
return CValueObject::propertyByIndex(index);
165 case IndexSimulatorDirectory: this->setSimulatorDirectory(variant.
toString());
break;
166 case IndexModelDirectories: this->setModelDirectories(variant.
toStringList());
break;
167 case IndexComIntegration: this->setComIntegrated(variant.
toBool());
break;
168 case IndexRecordOwnAircraftGnd: this->setRecordOwnAircraftGnd(variant.
toBool());
break;
169 case IndexModelExcludeDirectoryPatterns: m_excludeDirectoryPatterns = variant.
value<
QStringList>();
break;
170 case IndexCGSource: m_cgSource = variant.
toInt();
break;
171 case IndexRecordOwnAircraftGndRadius:
174 default: CValueObject::setPropertyByIndex(index, variant);
break;
178 CMultiSimulatorSettings::CMultiSimulatorSettings(
QObject *parent) :
QObject(parent)
193 case CSimulatorInfo::FG:
return m_simSettingsFG.get();
194 case CSimulatorInfo::P3D:
return m_simSettingsP3D.get();
195 case CSimulatorInfo::MSFS:
return m_simSettingsMsfs.get();
196 case CSimulatorInfo::MSFS2024:
return m_simSettingsMsfs2024.get();
197 case CSimulatorInfo::XPLANE:
return m_simSettingsXP.get();
199 default: Q_ASSERT_X(simulator.
isSingleSimulator(), Q_FUNC_INFO,
"No single simulator");
break;
206 return { this->
getSettings(simulator), simulator };
215 case CSimulatorInfo::FG:
return m_simSettingsFG.set(settings);
216 case CSimulatorInfo::P3D:
return m_simSettingsP3D.set(settings);
217 case CSimulatorInfo::MSFS:
return m_simSettingsMsfs.set(settings);
218 case CSimulatorInfo::MSFS2024:
return m_simSettingsMsfs2024.set(settings);
219 case CSimulatorInfo::XPLANE:
return m_simSettingsXP.set(settings);
220 default: Q_ASSERT_X(simulator.
isSingleSimulator(), Q_FUNC_INFO,
"No single simulator");
break;
232 u
"directory already existing");
251 case CSimulatorInfo::FG:
break;
252 case CSimulatorInfo::P3D:
break;
253 case CSimulatorInfo::MSFS:
break;
254 case CSimulatorInfo::MSFS2024:
break;
255 case CSimulatorInfo::XPLANE:
264 default: Q_ASSERT_X(simulator.
isSingleSimulator(), Q_FUNC_INFO,
"No single simulator");
break;
275 case CSimulatorInfo::FG:
return m_simSettingsFG.setAndSave(settings);
276 case CSimulatorInfo::P3D:
return m_simSettingsP3D.setAndSave(settings);
277 case CSimulatorInfo::MSFS:
return m_simSettingsMsfs.setAndSave(settings);
278 case CSimulatorInfo::MSFS2024:
return m_simSettingsMsfs2024.setAndSave(settings);
279 case CSimulatorInfo::XPLANE:
return m_simSettingsXP.setAndSave(settings);
280 default: Q_ASSERT_X(simulator.
isSingleSimulator(), Q_FUNC_INFO,
"No single simulator");
break;
296 case CSimulatorInfo::FG:
return m_simSettingsFG.save();
297 case CSimulatorInfo::P3D:
return m_simSettingsP3D.save();
298 case CSimulatorInfo::MSFS:
return m_simSettingsMsfs.save();
299 case CSimulatorInfo::MSFS2024:
return m_simSettingsMsfs2024.save();
300 case CSimulatorInfo::XPLANE:
return m_simSettingsXP.save();
301 default: Q_ASSERT_X(simulator.
isSingleSimulator(), Q_FUNC_INFO,
"No single simulator");
break;
362 void CMultiSimulatorSettings::onP3DSettingsChanged() { this->emitSettingsChanged(
CSimulatorInfo::p3d()); }
364 void CMultiSimulatorSettings::onMsfsSettingsChanged() { this->emitSettingsChanged(
CSimulatorInfo::msfs()); }
366 void CMultiSimulatorSettings::onMsfs2024SettingsChanged() { this->emitSettingsChanged(
CSimulatorInfo::msfs2024()); }
368 void CMultiSimulatorSettings::onXPSettingsChanged() { this->emitSettingsChanged(
CSimulatorInfo::xplane()); }
370 void CMultiSimulatorSettings::onFGSettingsChanged() { this->emitSettingsChanged(
CSimulatorInfo::fg()); }
372 void CMultiSimulatorSettings::emitSettingsChanged(
const CSimulatorInfo &simInfo)
379 m_technicalLogLevel =
static_cast<int>(severity);
386 if (m_technicalLogLevel < 0) {
return false; }
392 if (m_technicalLogLevel < 0) {
return false; }
398 if (m_technicalLogLevel < 0) {
return false; }
406 m_messageType =
static_cast<int>(messageType);
436 if (message.
isEmpty()) {
return false; }
439 const int s =
static_cast<int>(message.
getSeverity());
440 return (s >= m_technicalLogLevel);
447 if (msg.
isEmpty()) {
return false; }
449 if (m_messageType == NoTextMessages) {
return false; }
451 const TextMessageType mt =
static_cast<TextMessageType
>(m_messageType);
452 if (msg.
isPrivateMessage() && mt.testFlag(TextMessagePrivate)) {
return true; }
453 if (msg.
isSupervisorMessage() && (mt.testFlag(TextMessagePrivate) || mt.testFlag(TextMessageSupervisor)))
457 if (msg.
isSendToUnicom() && mt.testFlag(TextMessagesUnicom)) {
return true; }
462 if (mt.testFlag(TextMessagesCom1))
466 if (mt.testFlag(TextMessagesCom2))
476 return static_cast<CSimulatorMessagesSettings::TextMessageType
>(m_messageType);
482 static const QString s(
"Enabled %1, text messages: %2, severity: %3");
516 case IndexTechnicalLogSeverity:
519 case IndexRelayTextMessage:
564 case CSimulatorInfo::FG: dirs =
QStringList(CFlightgearUtil::modelDirectoriesFromSimDir(s));
break;
565 case CSimulatorInfo::P3D:
567 const QString versionHint = CFsDirectories::guessP3DVersion(s);
568 dirs = CFsDirectories::p3dSimObjectsDirPlusAddOnXmlSimObjectsPaths(
569 CFsDirectories::p3dSimObjectsDirFromSimDir(s), versionHint);
572 case CSimulatorInfo::XPLANE: dirs =
QStringList({ CXPlaneUtil::modelDirectoriesFromSimDir(s) });
break;
573 case CSimulatorInfo::MSFS: dirs =
QStringList({ CFsDirectories::msfsSimObjectsDir() });
break;
574 case CSimulatorInfo::MSFS2024: dirs =
QStringList({ CFsDirectories::msfs2024SimObjectsDir() });
break;
643 case CSimulatorInfo::FG:
645 return CFlightgearUtil::flightgearModelDirectories();
647 case CSimulatorInfo::P3D:
649 static const QString p3d = CFsDirectories::p3dSimObjectsDir();
650 if (p3d.
isEmpty()) {
return e; }
651 static const QString versionHint = CFsDirectories::guessP3DVersion(p3d);
652 static const QStringList md = CFsDirectories::p3dSimObjectsDirPlusAddOnXmlSimObjectsPaths(p3d, versionHint);
655 case CSimulatorInfo::MSFS:
658 if (msfs.
isEmpty()) {
return e; }
662 case CSimulatorInfo::MSFS2024:
664 static const QString msfs2024 =
666 if (msfs2024.
isEmpty()) {
return e; }
670 case CSimulatorInfo::XPLANE:
672 return CXPlaneUtil::xplaneModelDirectories();
674 default: Q_ASSERT_X(simulator.
isSingleSimulator(), Q_FUNC_INFO,
"No single simulator");
break;
685 case CSimulatorInfo::FG:
return CFlightgearUtil::flightgearRootDir();
686 case CSimulatorInfo::P3D:
return CFsDirectories::p3dDir();
687 case CSimulatorInfo::MSFS:
return CFsDirectories::msfsDir();
688 case CSimulatorInfo::MSFS2024:
return CFsDirectories::msfs2024Dir();
689 case CSimulatorInfo::XPLANE:
return CXPlaneUtil::xplaneRootDir();
690 default: Q_ASSERT_X(simulator.
isSingleSimulator(), Q_FUNC_INFO,
"No single simulator");
break;
702 case CSimulatorInfo::FG:
return CFlightgearUtil::flightgearModelExcludeDirectoryPatterns();
703 case CSimulatorInfo::P3D:
return CFsDirectories::p3dSimObjectsExcludeDirectoryPatterns();
704 case CSimulatorInfo::XPLANE:
return CXPlaneUtil::xplaneModelExcludeDirectoryPatterns();
705 case CSimulatorInfo::MSFS:
return CFsDirectories::msfs20SimObjectsExcludeDirectoryPatterns();
706 case CSimulatorInfo::MSFS2024:
return CFsDirectories::msfs2024SimObjectsExcludeDirectoryPatterns();
707 default: Q_ASSERT_X(simulator.
isSingleSimulator(), Q_FUNC_INFO,
"No single simulator");
break;
715 CXPlaneUtil::xplanePluginPathName());
721 return u
"SimulatedObject: " %
boolToYesNo(m_useSimulatedObjectAdding) % u
" SB offsets: " %
739 Q_ASSERT_X(sim.
isFsxP3DFamily(), Q_FUNC_INFO,
"Only for FSX/P3D");
741 return m_simFsx.get();
747 Q_ASSERT_X(simulator.
isFsxP3DFamily(), Q_FUNC_INFO,
"Only for FSX/P3D");
749 return m_simFsx.set(settings);
755 Q_ASSERT_X(simulator.
isFsxP3DFamily(), Q_FUNC_INFO,
"Only for FSX/P3D");
757 return m_simFsx.setAndSave(settings);
static constexpr bool isRunningOnWindowsNtPlatform()
Running on Windows NT platform?
static bool sameDirectories(const QStringList &dirs1, const QStringList &dirs2, Qt::CaseSensitivity cs=osFileNameCaseSensitivity())
Same directories, order in list does not matter and lists are cleaned up.
static QString appendFilePathsAndFixUnc(const QString &path1, const QString &path2)
Append file paths.
static QString normalizeFilePathToQtStandard(const QString &filePath)
Normalize file path to Qt standard, e.g by turning \ to /.
static const QString & settings()
Settings.
bool isEmpty() const
Message empty.
Non-owning reference to a CPropertyIndex with a subset of its features.
Q_REQUIRED_RESULT CPropertyIndexRef copyFrontRemoved() const
Copy with first element removed.
CastType frontCasted() const
First element casted to given type, usually the PropertIndex enum.
bool isMyself() const
Myself index, used with nesting.
Streamable status message, e.g.
constexpr static auto SeverityError
Status severities.
static const QString & severityToString(StatusSeverity severity)
Severity as string.
StatusSeverity getSeverity() const
Message severity.
constexpr static auto SeverityInfo
Status severities.
constexpr static auto SeverityWarning
Status severities.
Status messages, e.g. from Core -> GUI.
CStatusMessage toSingleMessage() const
Merge into a single message.
CStatusMessageList getErrorMessages() const
Get all error messages.
bool isSuccess() const
All messages are marked as success.
bool isActiveFrequencySameFrequency(const physical_quantities::CFrequency &comFrequency) const
Is active frequency the same frequency.
ColumnIndex
Base class enums.
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
QString toQString(bool i18n=false) const
Cast as QString.
Value object encapsulating information of a text message.
bool isPrivateMessage() const
Is private message?
bool isEmpty() const
Empty message.
bool isSendToUnicom() const
Send to UNICOM?
bool isRadioMessage() const
Is radio message?
const physical_quantities::CFrequency & getFrequency() const
Get frequency.
bool isSupervisorMessage() const
Supervisor message?
Physical unit length (length)
Comprehensive information of an aircraft.
const aviation::CComSystem & getCom2System() const
Get COM2 system.
const aviation::CComSystem & getCom1System() const
Get COM1 system.
Simple hardcoded info about the corresponding simulator.
bool isSingleSimulator() const
Single simulator selected.
Simulator getSimulator() const
Simulator.
static const CSimulatorInfo & msfs()
Const simulator info objects.
bool isFsxP3DFamily() const
FSX family, i.e. FSX or P3D?
static const CSimulatorInfo & p3d()
Const simulator info objects.
static const CSimulatorInfo & xplane()
Const simulator info objects.
static const CSimulatorInfo & msfs2024()
Const simulator info objects.
static const CSimulatorInfo & fg()
Const simulator info objects.
QString convertToQString(bool i18n=false) const
Cast as QString.
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
CFsxP3DSettings getSettings(const CSimulatorInfo &sim) const
Settings per simulator.
CStatusMessage setSettings(const CFsxP3DSettings &settings, const CSimulatorInfo &simulator)
Set settings per simulator.
CStatusMessage setAndSaveSettings(const CFsxP3DSettings &settings, const CSimulatorInfo &simulator)
Set settings per simulator.
CStatusMessage addModelDirectory(const QString &modelDirectory, const CSimulatorInfo &simulator)
Set model directory per simulator.
QString getFirstModelDirectoryOrDefault(const CSimulatorInfo &simulator) const
First model directoy.
void resetToDefaults(const CSimulatorInfo &simulator)
Reset to defaults.
CStatusMessage setAndSaveSettings(const CSimulatorSettings &settings, const CSimulatorInfo &simulator)
Set settings per simulator.
CStatusMessage saveSettings(const CSimulatorInfo &simulator)
Set settings per simulator.
CSpecializedSimulatorSettings getSpecializedSettings(const CSimulatorInfo &simulator) const
Specialized simulator settings.
CStatusMessageList setAndValidateSettings(const CSimulatorSettings &settings, const CSimulatorInfo &simulator)
Set settings per simulator, but do NOT save yet, but validate.
CStatusMessage setSettings(const CSimulatorSettings &settings, const CSimulatorInfo &simulator)
Set settings per simulator.
QStringList getModelDirectoriesIfNotDefault(const CSimulatorInfo &simulator) const
Model directory or or empty if default.
QString getSimulatorDirectoryIfNotDefault(const CSimulatorInfo &simulator) const
Simulator directory or empty if default dir.
QStringList getModelDirectoriesOrDefault(const CSimulatorInfo &simulator) const
Model directory or default model path per simulator.
const QStringList & defaultModelDirectories(const CSimulatorInfo &simulator) const
Default model path per simulator.
CSimulatorSettings getSettings(const CSimulatorInfo &simulator) const
Settings per simulator.
QStringList getModelExcludeDirectoryPatternsOrDefault(const CSimulatorInfo &simulator) const
Model exclude patterns per simulator.
QStringList getModelExcludeDirectoryPatternsIfNotDefault(const CSimulatorInfo &simulator) const
Model exclude patterns or empty if default.
CStatusMessage clearModelDirectories(const CSimulatorInfo &simulator)
Clear the model directory.
QString getSimulatorDirectoryOrDefault(const CSimulatorInfo &simulator) const
Simulator directory or default model path per simulator.
void settingsChanged(const swift::misc::simulation::CSimulatorInfo &simulator)
Simulator settings have been changed.
Settings regarding message handling. Driver independent part, related to network.
void disableTechnicalMessages()
No technical messages.
bool isRelayErrorsMessages() const
Relay (technical) error messages.
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
void setRelayGloballyEnabled(bool enabled)
Globally enable / disable.
bool isRelayWarningMessages() const
Relay (technical) warning messages.
bool isRelayUnicomTextMessages() const
Relay UNICOM messages.
QString convertToQString(bool i18n=false) const
Cast as QString.
bool isRelayTechnicalMessages() const
Relay any message.
bool isRelayCom1TextMessages() const
Relay COM1 text message.
CSimulatorMessagesSettings::TextMessageType getRelayedTextMessageTypes() const
Relayed text messages.
bool isRelayInfoMessages() const
Relay (technical) info messages.
bool isRelayCom2TextMessages() const
Relay COM2 text message.
bool relayThisTextMessage(const network::CTextMessage &msg, const CSimulatedAircraft &aircraft) const
Relay given text message.
bool relayThisStatusMessage(const CStatusMessage &message) const
Relay this particular message.
bool isRelayPrivateTextMessages() const
Relay private messages.
bool isRelaySupervisorTextMessages() const
Relay supervisor messages.
bool isRelayGloballyEnabled() const
Globally enabled?
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
void setTechnicalLogSeverity(CStatusMessage::StatusSeverity severity)
Log severity.
void setRelayTextMessages(CSimulatorMessagesSettings::TextMessageType messageType)
Relay the following message types.
Settings for simulator Driver independent parts (such as directories), also used in model loaders.
void clearModelDirectories()
Clear the model directories.
void resetPaths()
Reset the paths.
bool hasSimulatorDirectory() const
Setting has simulator setting.
bool addModelDirectory(const QString &modelDirectory)
Add (if not exists) model directory.
bool hasModelDirectories() const
Having model directories?
bool hasModelExcludeDirectoryPatterns() const
Having model exclude directoy patterns?
CGSource
Where we get the CG (aka vertical offset) from.
const QStringList & getModelExcludeDirectoryPatterns() const
Model exclude directoy patterns.
const QString & getSimulatorDirectory() const
Simulator directory.
const QStringList & getModelDirectories() const
Model directory.
Allows to have specific utility functions for each simulator.
QString getFirstModelDirectoryOrDefault() const
First model directoy.
const QStringList & getModelExcludeDirectoryPatternsIfNotDefault() const
Model exclude patterns or empty if default.
static const QStringList & defaultModelDirectories(const CSimulatorInfo &simulator)
Default model path per simulator.
const QStringList & getDefaultModelDirectories() const
Model exclude patterns or empty if default.
const QStringList & getModelExcludeDirectoryPatternsOrDefault() const
Model exclude patterns or empty if default.
CSimulatorInfo m_simulator
represented simulator
CSimulatorSettings m_genericSettings
the generic settings
QStringList getModelDirectoriesFromSimulatorDirectoy() const
Model directories.
const QString & getSimulatorDirectoryIfNotDefault() const
Simulator directory or empty if default dir.
QStringList getModelDirectoriesOrDefault() const
Model directories or default.
const CSimulatorSettings & getGenericSettings() const
Get the generic settings.
const QStringList & getModelDirectoriesIfNotDefault() const
Model directories or empty if default.
QStringList getModelDirectoriesFromSimulatorDirectoryOrDefault() const
Model directories, then from simulator directory, then default.
const QStringList & getDefaultModelExcludeDirectoryPatterns() const
Default model exclude patterns.
static const QStringList & defaultModelExcludeDirectoryPatterns(const CSimulatorInfo &simulator)
Default model exclude patterns per simulator.
const QString & getSimulatorDirectoryOrDefault() const
Simulator directory or default path.
static const QString & defaultSimulatorDirectory(const CSimulatorInfo &simulator)
Default simulator path per simulator.
const QString & getDefaultSimulatorDirectory() const
Default simulator path per simulator.
QString getPluginDirOrDefault() const
Plugin directory or default plugin dir.
SWIFT_MISC_EXPORT const QString & boolToOnOff(bool v)
Bool to on/off.
StatusSeverity
Status severities.
SWIFT_MISC_EXPORT const QString & boolToYesNo(bool v)
Bool to yes/no.
const T & constFirst() const const
qsizetype removeAll(const AT &t)
QString arg(Args &&... args) const const
bool isEmpty() const const
QString trimmed() const const
qsizetype removeDuplicates()
QVariant fromValue(T &&value)
bool toBool() const const
int toInt(bool *ok) const const
QString toString() const const
QStringList toStringList() const const
static bool isValid(const CSimulatorSettings &value, QString &reason)
Validator function. Return true if the argument is valid, false otherwise. Default implementation jus...
#define SWIFT_DEFINE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template definition of mixins for a CValueObject subclass.
#define SWIFT_VERIFY_X(COND, WHERE, WHAT)
A weaker kind of assert.