swift
simulatorsettings.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (C) 2016 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #ifndef SWIFT_MISC_SIMULATION_SETTINGS_SIMULATORSETTINGS_H
7 #define SWIFT_MISC_SIMULATION_SETTINGS_SIMULATORSETTINGS_H
8 
9 #include <QObject>
10 #include <QStringList>
11 
12 #include "misc/directoryutils.h"
14 #include "misc/pq/length.h"
15 #include "misc/propertyindexref.h"
16 #include "misc/settingscache.h"
19 #include "misc/statusmessage.h"
20 #include "misc/swiftmiscexport.h"
21 
22 SWIFT_DECLARE_VALUEOBJECT_MIXINS(swift::misc::simulation::Settings, CSimulatorSettings)
23 SWIFT_DECLARE_VALUEOBJECT_MIXINS(swift::misc::simulation::Settings, CFsxP3DSettings)
24 SWIFT_DECLARE_VALUEOBJECT_MIXINS(swift::misc::simulation::Settings, CSimulatorMessagesSettings)
25 
26 namespace swift::misc::simulation::settings
27 {
30  class SWIFT_MISC_EXPORT CSimulatorSettings : public CValueObject<CSimulatorSettings>
31  {
32  public:
35  {
36  IndexSimulatorDirectory = CPropertyIndexRef::GlobalIndexCSimulatorSettings,
37  IndexModelDirectories,
38  IndexModelExcludeDirectoryPatterns,
40  IndexCGSource,
41  IndexRecordOwnAircraftGnd,
42  IndexRecordOwnAircraftGndRadius
43  };
44 
46  enum CGSource
47  {
48  CGFromSimulatorFirst,
49  CGFromDBFirst,
50  CGFromSimulatorOnly,
51  CGFromDBOnly
52  };
53 
55  static const QString &cgSourceAsString(CGSource source);
56 
58  CSimulatorSettings() = default;
59 
61  CSimulatorSettings(const QString &simDir) : m_simulatorDirectory(simDir) {}
62 
64  void setSimulatorDirectory(const QString &simulatorDirectory);
65 
67  const QString &getSimulatorDirectory() const;
68 
70  bool hasSimulatorDirectory() const { return !this->getSimulatorDirectory().isEmpty(); }
71 
73  void setModelDirectories(const QStringList &modelDirectories);
74 
76  void clearModelDirectories();
77 
79  void setModelDirectory(const QString &modelDirectory);
80 
82  bool addModelDirectory(const QString &modelDirectory);
83 
85  const QStringList &getModelDirectories() const;
86 
88  bool hasModelDirectories() const { return !this->getModelDirectories().isEmpty(); }
89 
91  void setModelExcludeDirectories(const QStringList &excludeDirectories);
92 
94  const QStringList &getModelExcludeDirectoryPatterns() const;
95 
97  bool hasModelExcludeDirectoryPatterns() const { return !this->getModelExcludeDirectoryPatterns().isEmpty(); }
98 
100  bool isComIntegrated() const { return m_comIntegration; }
101 
103  bool setComIntegrated(bool integrated);
104 
106  CGSource getCGSource() const { return static_cast<CGSource>(m_cgSource); }
107 
109  bool setCGSource(CGSource source);
110 
112  bool isRecordOwnAircraftGnd() const { return m_recordGnd; }
113 
115  bool setRecordOwnAircraftGnd(bool record);
116 
118  swift::misc::physical_quantities::CLength getRecordedGndRadius() const { return m_recordedGndRadius; }
119 
121  bool setRecordedGndRadius(const swift::misc::physical_quantities::CLength &radius);
122 
124  void resetPaths();
125 
127  QString convertToQString(bool i18n = false) const;
128 
130  QString convertToQString(const QString &separator, bool i18n = false) const;
131 
133  QVariant propertyByIndex(CPropertyIndexRef index) const;
134 
136  void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant);
137 
138  private:
139  QString m_simulatorDirectory;
140  QStringList m_modelDirectories;
141  QStringList m_excludeDirectoryPatterns;
142  bool m_comIntegration = false;
143  bool m_recordGnd = false;
144  int m_cgSource = static_cast<int>(CGFromSimulatorFirst);
145  physical_quantities::CLength m_recordedGndRadius { 250.0, physical_quantities::CLengthUnit::m() };
146 
148  CSimulatorSettings,
149  SWIFT_METAMEMBER(simulatorDirectory),
150  SWIFT_METAMEMBER(modelDirectories),
151  SWIFT_METAMEMBER(excludeDirectoryPatterns),
152  SWIFT_METAMEMBER(comIntegration),
153  SWIFT_METAMEMBER(cgSource),
154  SWIFT_METAMEMBER(recordGnd),
155  SWIFT_METAMEMBER(recordedGndRadius));
156  };
157 
159  class SWIFT_MISC_EXPORT CFsxP3DSettings : public CValueObject<CFsxP3DSettings>
160  {
161  public:
163  CFsxP3DSettings() = default;
164 
166  CFsxP3DSettings(bool simulatedObject, bool sbOffsets)
167  : m_useSimulatedObjectAdding(simulatedObject), m_useSbOffsets(sbOffsets)
168  {}
169 
171  void setAddingAsSimulatedObjectEnabled(bool enable) { m_useSimulatedObjectAdding = enable; }
172 
174  bool isAddingAsSimulatedObjectEnabled() const { return m_useSimulatedObjectAdding; }
175 
177  void setSbOffsetsEnabled(bool enable) { m_useSbOffsets = enable; }
178 
180  bool isSbOffsetsEnabled() const { return m_useSbOffsets; }
181 
183  QString convertToQString(bool i18n = false) const;
184 
186  QVariant propertyByIndex(CPropertyIndexRef index) const;
187 
189  void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant);
190 
191  private:
192  bool m_useSimulatedObjectAdding = false;
193  bool m_useSbOffsets = true;
194 
197  SWIFT_METAMEMBER(useSimulatedObjectAdding),
198  SWIFT_METAMEMBER(useSbOffsets));
199  };
200 
203  {
204  public:
206  const CSimulatorSettings &getGenericSettings() const { return m_genericSettings; }
207 
210  : m_genericSettings(settings), m_simulator(simulator)
211  {}
212 
214  CSpecializedSimulatorSettings(const QString &simulatorDir, const CSimulatorInfo &simulator)
215  : m_genericSettings(CSimulatorSettings(simulatorDir)), m_simulator(simulator)
216  {}
217 
219  const CSimulatorSettings &getSimulatorSettings() const { return m_genericSettings; }
220 
222  const QString &getDefaultSimulatorDirectory() const;
223 
225  const QString &getSimulatorDirectoryIfNotDefault() const;
226 
228  const QString &getSimulatorDirectoryOrDefault() const;
229 
231  QStringList getModelDirectoriesOrDefault() const;
232 
234  QStringList getModelDirectoriesFromSimulatorDirectoy() const;
235 
237  QStringList getModelDirectoriesFromSimulatorDirectoryOrDefault() const;
238 
240  const QStringList &getModelDirectoriesIfNotDefault() const;
241 
243  const QStringList &getDefaultModelExcludeDirectoryPatterns() const;
244 
246  QString getFirstModelDirectoryOrDefault() const;
247 
249  const QStringList &getDefaultModelDirectories() const;
250 
252  const QStringList &getModelExcludeDirectoryPatternsIfNotDefault() const;
253 
255  const QStringList &getModelExcludeDirectoryPatternsOrDefault() const;
256 
258  void clearModelDirectories() { m_genericSettings.clearModelDirectories(); }
259 
261  bool addModelDirectory(const QString &modelDirectory)
262  {
263  return m_genericSettings.addModelDirectory(modelDirectory);
264  }
265 
267  void setSimulatorDirectory(const QString &simDir) { m_genericSettings.setSimulatorDirectory(simDir); }
268 
270  static const QStringList &defaultModelDirectories(const CSimulatorInfo &simulator);
271 
273  static const QString &defaultSimulatorDirectory(const CSimulatorInfo &simulator);
274 
276  static const QStringList &defaultModelExcludeDirectoryPatterns(const CSimulatorInfo &simulator);
277 
278  protected:
281  };
282 
285  {
286  public:
290  {}
291 
294  : CXPlaneSimulatorSettings(settings.getGenericSettings())
295  {}
296 
298  QString getPluginDirOrDefault() const;
299  };
300 
302  struct TSimulatorP3D : public TSettingTrait<CSimulatorSettings>
303  {
305  static const char *key() { return "settingssimulatorp3d"; }
306 
308  static const QString &humanReadable()
309  {
310  static const QString name("P3D settings");
311  return name;
312  }
313  };
314 
316  struct TSimulatorMsfs : public TSettingTrait<CSimulatorSettings>
317  {
319  static const char *key() { return "settingssimulatormsfs"; }
320 
322  static const QString &humanReadable()
323  {
324  static const QString name("MSFS settings");
325  return name;
326  }
327  };
328 
330  struct TSimulatorMsfs2024 : public TSettingTrait<CSimulatorSettings>
331  {
333  static const char *key() { return "settingssimulatormsfs2024"; }
334 
336  static const QString &humanReadable()
337  {
338  static const QString name("MSFS2024 settings");
339  return name;
340  }
341  };
342 
344  struct TP3DVersion : public TSettingTrait<QString>
345  {
347  static const char *key() { return "simulator/p3dversion"; }
348 
350  static const QString &humanReadable()
351  {
352  static const QString name("P3D version");
353  return name;
354  }
355 
357  static const QString &defaultValue()
358  {
359  static const QString version("4.3");
360  return version;
361  }
362  };
363 
365  struct TFsxDetailsSettings : public TSettingTrait<CFsxP3DSettings>
366  {
368  static const char *key() { return "simulator/fsxdetailsettings"; }
369 
371  static const QString &humanReadable()
372  {
373  static const QString name("FSX details");
374  return name;
375  }
376 
379  {
380  static const CFsxP3DSettings d(true, true);
381  return d;
382  }
383  };
384 
386  struct TP3DDetailsSettings : public TSettingTrait<CFsxP3DSettings>
387  {
389  static const char *key() { return "simulator/p3ddetailsettings"; }
390 
392  static const QString &humanReadable()
393  {
394  static const QString name("P3D details");
395  return name;
396  }
397 
400  {
401  static const CFsxP3DSettings d(false, true);
402  return d;
403  }
404  };
405 
407  struct SWIFT_MISC_EXPORT TSimulatorXP : public TSettingTrait<CSimulatorSettings>
408  {
410  static const char *key() { return "settingssimulatorxplane"; }
411 
413  static const QString &humanReadable()
414  {
415  static const QString name("XPlane settings");
416  return name;
417  }
418 
420  static bool isValid(const CSimulatorSettings &value, QString &reason);
421  };
422 
424  struct TSimulatorFG : public TSettingTrait<CSimulatorSettings>
425  {
427  static const char *key() { return "settingssimulatorfg"; }
428 
430  static const QString &humanReadable()
431  {
432  static const QString name("FG settings");
433  return name;
434  }
435  };
436 
439  {
440  public:
442  CFsxP3DSettings getSettings(const CSimulatorInfo &sim) const;
443 
445  CStatusMessage setSettings(const CFsxP3DSettings &settings, const CSimulatorInfo &simulator);
446 
448  CStatusMessage setAndSaveSettings(const CFsxP3DSettings &settings, const CSimulatorInfo &simulator);
449 
450  private:
451  CSetting<TFsxDetailsSettings> m_simFsx { this };
452  CSetting<TP3DDetailsSettings> m_simP3D { this };
453  };
454 
457  {
458  Q_OBJECT
459 
460  public:
462  CMultiSimulatorSettings(QObject *parent = nullptr);
463 
465  CSimulatorSettings getSettings(const CSimulatorInfo &simulator) const;
466 
468  CSpecializedSimulatorSettings getSpecializedSettings(const CSimulatorInfo &simulator) const;
469 
471  CStatusMessage setSettings(const CSimulatorSettings &settings, const CSimulatorInfo &simulator);
472 
474  CStatusMessage addModelDirectory(const QString &modelDirectory, const CSimulatorInfo &simulator);
475 
477  CStatusMessage clearModelDirectories(const CSimulatorInfo &simulator);
478 
481  CStatusMessageList setAndValidateSettings(const CSimulatorSettings &settings, const CSimulatorInfo &simulator);
482 
484  CStatusMessage setAndSaveSettings(const CSimulatorSettings &settings, const CSimulatorInfo &simulator);
485 
487  CStatusMessage setAndSaveSettings(const CSpecializedSimulatorSettings &settings,
488  const CSimulatorInfo &simulator);
489 
491  CStatusMessage saveSettings(const CSimulatorInfo &simulator);
492 
494  QString getSimulatorDirectoryIfNotDefault(const CSimulatorInfo &simulator) const;
495 
497  QString getSimulatorDirectoryOrDefault(const CSimulatorInfo &simulator) const;
498 
500  QStringList getModelDirectoriesIfNotDefault(const CSimulatorInfo &simulator) const;
501 
503  QStringList getModelDirectoriesOrDefault(const CSimulatorInfo &simulator) const;
504 
506  QString getFirstModelDirectoryOrDefault(const CSimulatorInfo &simulator) const;
507 
509  QStringList getModelExcludeDirectoryPatternsIfNotDefault(const CSimulatorInfo &simulator) const;
510 
512  QStringList getModelExcludeDirectoryPatternsOrDefault(const CSimulatorInfo &simulator) const;
513 
515  void resetToDefaults(const CSimulatorInfo &simulator);
516 
518  const QStringList &defaultModelDirectories(const CSimulatorInfo &simulator) const;
519 
520  signals:
523 
524  private:
525  CSetting<TSimulatorP3D> m_simSettingsP3D { this,
526  &CMultiSimulatorSettings::onP3DSettingsChanged };
527  CSetting<TSimulatorMsfs> m_simSettingsMsfs {
528  this, &CMultiSimulatorSettings::onMsfsSettingsChanged
529  };
530  CSetting<TSimulatorMsfs2024> m_simSettingsMsfs2024 {
531  this, &CMultiSimulatorSettings::onMsfs2024SettingsChanged
532  };
533  CSetting<TSimulatorXP> m_simSettingsXP { this, &CMultiSimulatorSettings::onXPSettingsChanged };
534  CSetting<TSimulatorFG> m_simSettingsFG { this, &CMultiSimulatorSettings::onFGSettingsChanged };
535 
538  void onP3DSettingsChanged();
539  void onMsfsSettingsChanged();
540  void onMsfs2024SettingsChanged();
541  void onXPSettingsChanged();
542  void onFGSettingsChanged();
544 
546  void emitSettingsChanged(const CSimulatorInfo &simInfo);
547  };
548 
551  class SWIFT_MISC_EXPORT CSimulatorMessagesSettings : public CValueObject<CSimulatorMessagesSettings>
552  {
553  public:
556  {
557  IndexTechnicalLogSeverity = CPropertyIndexRef::GlobalIndexCSimulatorMessageSettings,
558  IndexRelayTextMessage,
559  IndexRelayGloballyEnabled
560  };
561 
564  {
565  NoTextMessages = 0,
566  TextMessagesUnicom = 1 << 0,
567  TextMessagesCom1 = 1 << 1,
568  TextMessagesCom2 = 1 << 2,
569  TextMessagePrivate = 1 << 3,
570  TextMessageSupervisor = 1 << 4,
571  TextMessagesAll = TextMessagesUnicom | TextMessagesCom1 | TextMessagesCom2 | TextMessagePrivate
572  };
573  Q_DECLARE_FLAGS(TextMessageType, TextMessageTypeFlag)
574 
575 
577 
579  void setTechnicalLogSeverity(CStatusMessage::StatusSeverity severity);
580 
582  void setRelayGloballyEnabled(bool enabled) { m_relayGloballyEnabled = enabled; }
583 
585  bool isRelayGloballyEnabled() const { return m_relayGloballyEnabled; }
586 
588  void disableTechnicalMessages();
589 
591  bool isRelayErrorsMessages() const;
592 
594  bool isRelayWarningMessages() const;
595 
597  bool isRelayInfoMessages() const;
598 
600  bool isRelayTechnicalMessages() const;
601 
603  void setRelayTextMessages(CSimulatorMessagesSettings::TextMessageType messageType);
604 
606  bool isRelaySupervisorTextMessages() const;
607 
609  bool isRelayPrivateTextMessages() const;
610 
612  bool isRelayUnicomTextMessages() const;
613 
615  bool isRelayCom1TextMessages() const;
616 
618  bool isRelayCom2TextMessages() const;
619 
621  bool relayThisTextMessage(const network::CTextMessage &msg, const CSimulatedAircraft &aircraft) const;
622 
624  bool relayThisStatusMessage(const CStatusMessage &message) const;
625 
627  CSimulatorMessagesSettings::TextMessageType getRelayedTextMessageTypes() const;
628 
630  QString convertToQString(bool i18n = false) const;
631 
633  QVariant propertyByIndex(CPropertyIndexRef index) const;
634 
636  void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant);
637 
638  private:
639  int m_technicalLogLevel = CStatusMessage::SeverityError;
640  int m_messageType = static_cast<int>(TextMessagePrivate | TextMessageSupervisor);
641  bool m_relayGloballyEnabled = true;
642 
645  SWIFT_METAMEMBER(technicalLogLevel),
646  SWIFT_METAMEMBER(messageType));
647  };
648 
650  struct TSimulatorMessages : public TSettingTrait<CSimulatorMessagesSettings>
651  {
653  static const char *key() { return "settingssimulatormessages"; }
654 
656  static const QString &humanReadable()
657  {
658  static const QString name("Simulator messages");
659  return name;
660  }
661  };
662 
663 } // namespace swift::misc::simulation::settings
664 
672 Q_DECLARE_METATYPE(swift::misc::simulation::settings::CSimulatorMessagesSettings::TextMessageType)
673 Q_DECLARE_OPERATORS_FOR_FLAGS(swift::misc::simulation::settings::CSimulatorMessagesSettings::TextMessageType)
674 
675 #endif // SWIFT_MISC_SIMULATION_SETTINGS_SIMULATORSETTINGS_H
Generic ordered container with value semantics.
Definition: collection.h:107
Non-owning reference to a CPropertyIndex with a subset of its features.
Class template for accessing a specific value in the CSettingsCache.
Definition: settingscache.h:68
Streamable status message, e.g.
constexpr static auto SeverityError
Status severities.
Status messages, e.g. from Core -> GUI.
Mix of the most commonly used mixin classes.
Definition: valueobject.h:114
ColumnIndex
Base class enums.
Definition: mixinindex.h:44
Value object encapsulating information of a text message.
Definition: textmessage.h:31
Physical unit length (length)
Definition: length.h:18
static CLengthUnit m()
Meter m.
Definition: units.h:140
Comprehensive information of an aircraft.
Simple hardcoded info about the corresponding simulator.
Definition: simulatorinfo.h:41
bool isAddingAsSimulatedObjectEnabled() const
Use simulated object adding.
CFsxP3DSettings(bool simulatedObject, bool sbOffsets)
Constructor.
void setSbOffsetsEnabled(bool enable)
Use SB offsets?
CFsxP3DSettings()=default
Default constructor.
void setAddingAsSimulatedObjectEnabled(bool enable)
Use simulated object adding.
bool isSbOffsetsEnabled() const
Are SB offsets enabled.
void settingsChanged(const swift::misc::simulation::CSimulatorInfo &simulator)
Simulator settings have been changed.
Settings regarding message handling. Driver independent part, related to network.
Settings for simulator Driver independent parts (such as directories), also used in model loaders.
bool hasSimulatorDirectory() const
Setting has simulator setting.
bool hasModelDirectories() const
Having model directories?
swift::misc::physical_quantities::CLength getRecordedGndRadius() const
Record GND values with radius.
bool hasModelExcludeDirectoryPatterns() const
Having model exclude directoy patterns?
CGSource
Where we get the CG (aka vertical offset) from.
CSimulatorSettings(const QString &simDir)
Constructor.
bool isRecordOwnAircraftGnd() const
Record GND values (of own aircraft)
Allows to have specific utility functions for each simulator.
CSpecializedSimulatorSettings(const CSimulatorSettings &settings, const CSimulatorInfo &simulator)
Ctor.
bool addModelDirectory(const QString &modelDirectory)
Add (if not exists) model directory.
CSpecializedSimulatorSettings(const QString &simulatorDir, const CSimulatorInfo &simulator)
Ctor.
const CSimulatorSettings & getGenericSettings() const
Get the generic settings.
void setSimulatorDirectory(const QString &simDir)
Set simulator directory.
const CSimulatorSettings & getSimulatorSettings() const
The generic settings.
CXPlaneSimulatorSettings(const CSimulatorSettings &settings)
Constructor.
CXPlaneSimulatorSettings(const CSpecializedSimulatorSettings &settings)
Constructor.
#define SWIFT_METAMEMBER(MEMBER,...)
Macro to define an element within a metaclass.
Definition: metaclass.h:72
#define SWIFT_METACLASS(CLASS,...)
Macro to define a nested metaclass that describes the attributes of its enclosing class.
Definition: metaclass.h:52
StatusSeverity
Status severities.
Definition: statusmessage.h:35
Base class for traits to be used as template argument to swift::misc::CSetting.
static const QString & humanReadable()
Optional human readable name.
static const CFsxP3DSettings & defaultValue()
Return the value to use in case the supplied value does not satisfy the validator....
static const char * key()
Key string of the value. Reimplemented in derived class.
static const char * key()
Key string of the value. Reimplemented in derived class.
static const CFsxP3DSettings & defaultValue()
Return the value to use in case the supplied value does not satisfy the validator....
static const QString & humanReadable()
Optional human readable name.
static const QString & humanReadable()
Optional human readable name.
static const QString & defaultValue()
Return the value to use in case the supplied value does not satisfy the validator....
static const char * key()
Key string of the value. Reimplemented in derived class.
static const QString & humanReadable()
Optional human readable name.
static const char * key()
Key string of the value. Reimplemented in derived class.
static const QString & humanReadable()
Optional human readable name.
static const char * key()
Key string of the value. Reimplemented in derived class.
static const char * key()
Key string of the value. Reimplemented in derived class.
static const QString & humanReadable()
Optional human readable name.
static const char * key()
Key string of the value. Reimplemented in derived class.
static const QString & humanReadable()
Optional human readable name.
static const char * key()
Key string of the value. Reimplemented in derived class.
static const QString & humanReadable()
Optional human readable name.
static const QString & humanReadable()
Optional human readable name.
static const char * key()
Key string of the value. Reimplemented in derived class.
#define SWIFT_MISC_EXPORT
Export a class or function from the library.
#define SWIFT_DECLARE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template declaration of mixins for a CValueObject subclass to be placed near the top of the ...
Definition: valueobject.h:65