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 
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:
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 TSimulatorFsx : public TSettingTrait<CSimulatorSettings>
303  {
305  static const char *key() { return "settingssimulatorfsx"; }
306 
308  static const QString &humanReadable()
309  {
310  static const QString name("FSX settings");
311  return name;
312  }
313  };
314 
316  struct TSimulatorFs9 : public TSettingTrait<CSimulatorSettings>
317  {
319  static const char *key() { return "settingssimulatorfs9"; }
320 
322  static const QString &humanReadable()
323  {
324  static const QString name("FS9 settings");
325  return name;
326  }
327  };
328 
330  struct TSimulatorP3D : public TSettingTrait<CSimulatorSettings>
331  {
333  static const char *key() { return "settingssimulatorp3d"; }
334 
336  static const QString &humanReadable()
337  {
338  static const QString name("P3D settings");
339  return name;
340  }
341  };
342 
344  struct TSimulatorMsfs : public TSettingTrait<CSimulatorSettings>
345  {
347  static const char *key() { return "settingssimulatormsfs"; }
348 
350  static const QString &humanReadable()
351  {
352  static const QString name("MSFS settings");
353  return name;
354  }
355  };
356 
358  struct TSimulatorMsfs2024 : public TSettingTrait<CSimulatorSettings>
359  {
361  static const char *key() { return "settingssimulatormsfs2024"; }
362 
364  static const QString &humanReadable()
365  {
366  static const QString name("MSFS2024 settings");
367  return name;
368  }
369  };
370 
372  struct TP3DVersion : public TSettingTrait<QString>
373  {
375  static const char *key() { return "simulator/p3dversion"; }
376 
378  static const QString &humanReadable()
379  {
380  static const QString name("P3D version");
381  return name;
382  }
383 
385  static const QString &defaultValue()
386  {
387  static const QString version("4.3");
388  return version;
389  }
390  };
391 
393  struct TFsxDetailsSettings : public TSettingTrait<CFsxP3DSettings>
394  {
396  static const char *key() { return "simulator/fsxdetailsettings"; }
397 
399  static const QString &humanReadable()
400  {
401  static const QString name("FSX details");
402  return name;
403  }
404 
407  {
408  static const CFsxP3DSettings d(true, true);
409  return d;
410  }
411  };
412 
414  struct TP3DDetailsSettings : public TSettingTrait<CFsxP3DSettings>
415  {
417  static const char *key() { return "simulator/p3ddetailsettings"; }
418 
420  static const QString &humanReadable()
421  {
422  static const QString name("P3D details");
423  return name;
424  }
425 
428  {
429  static const CFsxP3DSettings d(false, true);
430  return d;
431  }
432  };
433 
435  struct SWIFT_MISC_EXPORT TSimulatorXP : public TSettingTrait<CSimulatorSettings>
436  {
438  static const char *key() { return "settingssimulatorxplane"; }
439 
441  static const QString &humanReadable()
442  {
443  static const QString name("XPlane settings");
444  return name;
445  }
446 
448  static bool isValid(const CSimulatorSettings &value, QString &reason);
449  };
450 
452  struct TSimulatorFG : public TSettingTrait<CSimulatorSettings>
453  {
455  static const char *key() { return "settingssimulatorfg"; }
456 
458  static const QString &humanReadable()
459  {
460  static const QString name("FG settings");
461  return name;
462  }
463  };
464 
467  {
468  public:
470  CFsxP3DSettings getSettings(const CSimulatorInfo &sim) const;
471 
473  CStatusMessage setSettings(const CFsxP3DSettings &settings, const CSimulatorInfo &simulator);
474 
476  CStatusMessage setAndSaveSettings(const CFsxP3DSettings &settings, const CSimulatorInfo &simulator);
477 
478  private:
479  CSetting<TFsxDetailsSettings> m_simFsx { this };
480  CSetting<TP3DDetailsSettings> m_simP3D { this };
481  };
482 
485  {
486  Q_OBJECT
487 
488  public:
490  CMultiSimulatorSettings(QObject *parent = nullptr);
491 
493  CSimulatorSettings getSettings(const CSimulatorInfo &simulator) const;
494 
496  CSpecializedSimulatorSettings getSpecializedSettings(const CSimulatorInfo &simulator) const;
497 
499  CStatusMessage setSettings(const CSimulatorSettings &settings, const CSimulatorInfo &simulator);
500 
502  CStatusMessage addModelDirectory(const QString &modelDirectory, const CSimulatorInfo &simulator);
503 
505  CStatusMessage clearModelDirectories(const CSimulatorInfo &simulator);
506 
509  CStatusMessageList setAndValidateSettings(const CSimulatorSettings &settings, const CSimulatorInfo &simulator);
510 
512  CStatusMessage setAndSaveSettings(const CSimulatorSettings &settings, const CSimulatorInfo &simulator);
513 
515  CStatusMessage setAndSaveSettings(const CSpecializedSimulatorSettings &settings,
516  const CSimulatorInfo &simulator);
517 
519  CStatusMessage saveSettings(const CSimulatorInfo &simulator);
520 
522  QString getSimulatorDirectoryIfNotDefault(const CSimulatorInfo &simulator) const;
523 
525  QString getSimulatorDirectoryOrDefault(const CSimulatorInfo &simulator) const;
526 
528  QStringList getModelDirectoriesIfNotDefault(const CSimulatorInfo &simulator) const;
529 
531  QStringList getModelDirectoriesOrDefault(const CSimulatorInfo &simulator) const;
532 
534  QString getFirstModelDirectoryOrDefault(const CSimulatorInfo &simulator) const;
535 
537  QStringList getModelExcludeDirectoryPatternsIfNotDefault(const CSimulatorInfo &simulator) const;
538 
540  QStringList getModelExcludeDirectoryPatternsOrDefault(const CSimulatorInfo &simulator) const;
541 
543  void resetToDefaults(const CSimulatorInfo &simulator);
544 
546  const QStringList &defaultModelDirectories(const CSimulatorInfo &simulator) const;
547 
548  signals:
551 
552  private:
553  CSetting<TSimulatorFsx> m_simSettingsFsx { this,
554  &CMultiSimulatorSettings::onFsxSettingsChanged };
555  CSetting<TSimulatorFs9> m_simSettingsFs9 { this,
556  &CMultiSimulatorSettings::onFs9SettingsChanged };
557  CSetting<TSimulatorP3D> m_simSettingsP3D { this,
558  &CMultiSimulatorSettings::onP3DSettingsChanged };
559  CSetting<TSimulatorMsfs> m_simSettingsMsfs {
560  this, &CMultiSimulatorSettings::onMsfsSettingsChanged
561  };
562  CSetting<TSimulatorMsfs2024> m_simSettingsMsfs2024 {
563  this, &CMultiSimulatorSettings::onMsfs2024SettingsChanged
564  };
565  CSetting<TSimulatorXP> m_simSettingsXP { this, &CMultiSimulatorSettings::onXPSettingsChanged };
566  CSetting<TSimulatorFG> m_simSettingsFG { this, &CMultiSimulatorSettings::onFGSettingsChanged };
567 
570  void onFsxSettingsChanged();
571  void onFs9SettingsChanged();
572  void onP3DSettingsChanged();
573  void onMsfsSettingsChanged();
574  void onMsfs2024SettingsChanged();
575  void onXPSettingsChanged();
576  void onFGSettingsChanged();
578 
580  void emitSettingsChanged(const CSimulatorInfo &simInfo);
581  };
582 
585  class SWIFT_MISC_EXPORT CSimulatorMessagesSettings : public CValueObject<CSimulatorMessagesSettings>
586  {
587  public:
590  {
591  IndexTechnicalLogSeverity = CPropertyIndexRef::GlobalIndexCSimulatorMessageSettings,
592  IndexRelayTextMessage,
593  IndexRelayGloballyEnabled
594  };
595 
598  {
599  NoTextMessages = 0,
600  TextMessagesUnicom = 1 << 0,
601  TextMessagesCom1 = 1 << 1,
602  TextMessagesCom2 = 1 << 2,
603  TextMessagePrivate = 1 << 3,
604  TextMessageSupervisor = 1 << 4,
605  TextMessagesAll = TextMessagesUnicom | TextMessagesCom1 | TextMessagesCom2 | TextMessagePrivate
606  };
607  Q_DECLARE_FLAGS(TextMessageType, TextMessageTypeFlag)
608 
609 
611 
613  void setTechnicalLogSeverity(CStatusMessage::StatusSeverity severity);
614 
616  void setRelayGloballyEnabled(bool enabled) { m_relayGloballyEnabled = enabled; }
617 
619  bool isRelayGloballyEnabled() const { return m_relayGloballyEnabled; }
620 
622  void disableTechnicalMessages();
623 
625  bool isRelayErrorsMessages() const;
626 
628  bool isRelayWarningMessages() const;
629 
631  bool isRelayInfoMessages() const;
632 
634  bool isRelayTechnicalMessages() const;
635 
637  void setRelayTextMessages(CSimulatorMessagesSettings::TextMessageType messageType);
638 
640  bool isRelaySupervisorTextMessages() const;
641 
643  bool isRelayPrivateTextMessages() const;
644 
646  bool isRelayUnicomTextMessages() const;
647 
649  bool isRelayCom1TextMessages() const;
650 
652  bool isRelayCom2TextMessages() const;
653 
655  bool relayThisTextMessage(const network::CTextMessage &msg, const CSimulatedAircraft &aircraft) const;
656 
658  bool relayThisStatusMessage(const CStatusMessage &message) const;
659 
661  CSimulatorMessagesSettings::TextMessageType getRelayedTextMessageTypes() const;
662 
664  QString convertToQString(bool i18n = false) const;
665 
667  QVariant propertyByIndex(CPropertyIndexRef index) const;
668 
670  void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant);
671 
672  private:
673  int m_technicalLogLevel = CStatusMessage::SeverityError;
674  int m_messageType = static_cast<int>(TextMessagePrivate | TextMessageSupervisor);
675  bool m_relayGloballyEnabled = true;
676 
679  SWIFT_METAMEMBER(technicalLogLevel),
680  SWIFT_METAMEMBER(messageType));
681  };
682 
684  struct TSimulatorMessages : public TSettingTrait<CSimulatorMessagesSettings>
685  {
687  static const char *key() { return "settingssimulatormessages"; }
688 
690  static const QString &humanReadable()
691  {
692  static const QString name("Simulator messages");
693  return name;
694  }
695  };
696 
697 } // namespace swift::misc::simulation::settings
698 
706 Q_DECLARE_METATYPE(swift::misc::simulation::settings::CSimulatorMessagesSettings::TextMessageType)
707 Q_DECLARE_OPERATORS_FOR_FLAGS(swift::misc::simulation::settings::CSimulatorMessagesSettings::TextMessageType)
708 
709 #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:142
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?
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.
void setRelayGloballyEnabled(bool enabled)
Globally enable / disable.
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:73
#define SWIFT_METACLASS(CLASS,...)
Macro to define a nested metaclass that describes the attributes of its enclosing class.
Definition: metaclass.h:53
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 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.
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