swift
aircraftmodelview.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 
4 #include "aircraftmodelview.h"
5 
6 #include <QAction>
7 #include <QDropEvent>
8 #include <QMap>
9 #include <QShortcut>
10 #include <QString>
11 #include <QStringBuilder>
12 #include <QWidget>
13 #include <QtGlobal>
14 
16 #include "gui/guiapplication.h"
17 #include "gui/guiutility.h"
18 #include "gui/menus/menuaction.h"
19 #include "gui/shortcut.h"
22 #include "gui/views/viewbase.h"
26 #include "misc/aviation/livery.h"
28 #include "misc/directories.h"
29 #include "misc/icons.h"
33 #include "misc/statusmessagelist.h"
34 #include "misc/variant.h"
35 
36 using namespace swift::misc;
37 using namespace swift::misc::simulation;
38 using namespace swift::misc::aviation;
39 using namespace swift::gui::models;
40 using namespace swift::gui::filters;
41 using namespace swift::gui::menus;
42 
43 namespace swift::gui::views
44 {
45  CAircraftModelView::CAircraftModelView(QWidget *parent) : COrderableViewWithDbObjects(parent)
46  {
47  // default
48  this->standardInit(new CAircraftModelListModel(CAircraftModelListModel::OwnAircraftModelClient, this));
49  this->setSettingsDirectoryIndex(CDirectories::IndexDirLastModelJsonOrDefault);
50 
51  // shortcut
52  QShortcut *stashShortcut = new QShortcut(CShortcut::keyStash(), this);
53  stashShortcut->setContext(Qt::WidgetShortcut);
54  connect(stashShortcut, &QShortcut::activated, this, &CAircraftModelView::requestedStash);
55 
56  // default mode
58  this->setAircraftModelMode(mode);
59  this->setSortIndicator();
60  }
61 
63  {
64  this->setCustomMenu(nullptr, false); // delete everything
65  derivedModel()->setAircraftModelMode(mode);
66  this->setSortIndicator();
67  switch (mode)
68  {
69  case CAircraftModelListModel::StashModel: m_menus = MenuDefaultNoClear; break;
70  case CAircraftModelListModel::Database: m_menus = MenuDefaultDbViews; break;
71  case CAircraftModelListModel::VPilotRuleModel: m_menus = MenuDefaultNoClear | MenuStashing; break;
72  case CAircraftModelListModel::OwnAircraftModelMappingTool:
73  m_menus = MenuDefaultNoClear | MenuStashing | MenuLoadAndSave;
74  break;
75  case CAircraftModelListModel::OwnAircraftModelClient:
76  default: m_menus = MenuDefaultNoClear | MenuBackend; break;
77  }
78  }
79 
81  {
82  if (!hasSelection()) { return 0; }
83  const int c = this->updateSelected(CVariant::from(livery), CAircraftModel::IndexLivery);
84  return c;
85  }
86 
88  {
89  if (!hasSelection()) { return 0; }
90  const int c = this->updateSelected(CVariant::from(icao), CAircraftModel::IndexAircraftIcaoCode);
91  return c;
92  }
93 
95  {
96  if (!hasSelection()) { return 0; }
97  const int c = this->updateSelected(CVariant::from(distributor), CAircraftModel::IndexDistributor);
98  return c;
99  }
100 
102  {
103  if (!hasSelection()) { return 0; }
104  const int c = this->updateSelected(vm);
105  return c;
106  }
107 
109  {
110  return m_menus.testFlag(MenuCanStashModels) && hasSelection();
111  }
112 
114  {
115  Q_ASSERT(m_model);
116  m_model->setAcceptedMetaTypeIds({
117  qMetaTypeId<CAirlineIcaoCode>(),
118  qMetaTypeId<CAirlineIcaoCodeList>(),
119  qMetaTypeId<CAircraftIcaoCode>(),
120  qMetaTypeId<CAircraftIcaoCodeList>(),
121  qMetaTypeId<CLivery>(),
122  qMetaTypeId<CLiveryList>(),
123  qMetaTypeId<CDistributor>(),
124  qMetaTypeId<CDistributorList>(),
125  qMetaTypeId<CAircraftModel>(),
126  qMetaTypeId<CAircraftModelList>(),
127  });
128  }
129 
131 
133  {
134  return qobject_cast<CAircraftModelFilterDialog *>(this->getFilterWidget());
135  }
136 
137  int CAircraftModelView::removeModelsWithModelString(const QStringList &modelStrings,
138  Qt::CaseSensitivity sensitivity)
139  {
140  if (modelStrings.isEmpty()) { return 0; }
142  const int delta = copy.removeModelsWithString(modelStrings, sensitivity);
143  if (delta > 0) { this->updateContainerMaybeAsync(copy); }
144  return delta;
145  }
146 
148  Qt::CaseSensitivity sensitivity)
149  {
150  return this->removeModelsWithModelString(models.getModelStringList(), sensitivity);
151  }
152 
154  Qt::CaseSensitivity sensitivity)
155  {
156  if (models.isEmpty()) { return 0; }
158  int c = copy.replaceOrAddModelsWithString(models, sensitivity);
159  if (c == 0) { return 0; }
160  this->updateContainerMaybeAsync(copy);
161  return c;
162  }
163 
164  void CAircraftModelView::setHighlightModelStrings(const QStringList &highlightModels)
165  {
166  this->derivedModel()->setHighlightModelStrings(highlightModels);
167  }
168 
170  {
171  this->clearHighlighting();
172  CAircraftModelList invaliddModels;
173  invaliddModels.loadInvalidModels();
174  if (!invaliddModels.isEmpty())
175  {
176  this->setHighlight(true);
177  this->setHighlightColor(Qt::red);
178  this->setHighlightModels(invaliddModels);
179 
180  const int r = this->rowOf(invaliddModels.front());
181  const QModelIndex i = m_model->index(r, 0);
182  this->scrollTo(i);
183  }
184  }
185 
187  {
188  this->derivedModel()->setHighlightModels(highlightModels);
189  }
190 
191  void CAircraftModelView::setHighlight(bool highlight) { this->derivedModel()->setHighlight(highlight); }
192 
193  void CAircraftModelView::setHighlightColor(const QBrush &brush) { this->derivedModel()->setHighlightColor(brush); }
194 
195  bool CAircraftModelView::highlightModels() const { return this->derivedModel()->highlightModels(); }
196 
197  void CAircraftModelView::setCorrespondingSimulator(const CSimulatorInfo &simulator, const QString &simDir)
198  {
199  m_correspondingSimulator = simulator;
200  m_correspondingSimulatorDir = simDir;
201  }
202 
203  void CAircraftModelView::dropEvent(QDropEvent *event)
204  {
205  // moves from myself are ignored
206  // depends on isDropAllowed() / acceptDrop() if this function is called
207  Qt::DropAction action = event->dropAction();
208  if (action == Qt::MoveAction)
209  {
211  return;
212  }
213  if (!this->isDropAllowed()) { return; }
214  if (!event) { return; }
215  const QMimeData *mime = event->mimeData();
216  if (!mime) { return; }
217 
219  {
220  const CVariant valueVariant(CGuiUtility::fromSwiftDragAndDropData(mime));
221  if (valueVariant.isValid())
222  {
223  if (valueVariant.canConvert<CAircraftModel>())
224  {
225  const CAircraftModel model = valueVariant.value<CAircraftModel>();
226  if (!model.hasModelString()) { return; }
227  const CAircraftModelList models({ model });
228  this->derivedModel()->replaceOrAddByModelString(models);
229  return;
230  }
231  else if (valueVariant.canConvert<CAircraftModelList>())
232  {
233  const CAircraftModelList models(valueVariant.value<CAircraftModelList>());
234  if (models.isEmpty()) { return; }
235  this->derivedModel()->replaceOrAddByModelString(models);
236  return;
237  }
238 
239  // only for selected members
240  if (!this->hasSelection()) { return; }
241  if (valueVariant.canConvert<CAircraftIcaoCode>())
242  {
243  const CAircraftIcaoCode icao = valueVariant.value<CAircraftIcaoCode>();
244  if (icao.validate().hasErrorMessages()) { return; }
245  this->applyToSelected(icao);
246  }
247  else if (valueVariant.canConvert<CAircraftIcaoCodeList>())
248  {
249  const CAircraftIcaoCodeList icaos(valueVariant.value<CAircraftIcaoCodeList>());
250  if (icaos.size() != 1) { return; }
251  const CAircraftIcaoCode icao = icaos.front();
252  if (icao.validate().hasErrorMessages()) { return; }
253  this->applyToSelected(icao);
254  }
255  else if (valueVariant.canConvert<CLivery>())
256  {
257  const CLivery livery = valueVariant.value<CLivery>();
258  if (livery.validate().hasErrorMessages()) { return; }
259  this->applyToSelected(livery);
260  }
261  else if (valueVariant.canConvert<CLiveryList>())
262  {
263  const CLiveryList liveries(valueVariant.value<CLiveryList>());
264  if (liveries.size() != 1) { return; }
265  const CLivery livery = liveries.front();
266  if (livery.validate().hasErrorMessages()) { return; }
267  this->applyToSelected(livery);
268  }
269  else if (valueVariant.canConvert<CDistributor>())
270  {
271  const CDistributor distributor = valueVariant.value<CDistributor>();
272  if (distributor.validate().hasErrorMessages()) { return; }
273  this->applyToSelected(distributor);
274  }
275  else if (valueVariant.canConvert<CDistributorList>())
276  {
277  const CDistributorList distributors(valueVariant.value<CDistributorList>());
278  if (distributors.size() != 1) { return; }
279  const CDistributor distributor = distributors.front();
280  if (distributor.validate().hasErrorMessages()) { return; }
281  this->applyToSelected(distributor);
282  }
283  else if (valueVariant.canConvert<CAirlineIcaoCode>())
284  {
285  const CAirlineIcaoCode airline = valueVariant.value<CAirlineIcaoCode>();
286  if (airline.validate().hasErrorMessages()) { return; }
288  airline); // I need to convert to stanard livery, which I can`t do here
289  }
290  else if (valueVariant.canConvert<CAirlineIcaoCodeList>())
291  {
292  const CAirlineIcaoCodeList airlines(valueVariant.value<CAirlineIcaoCodeList>());
293  if (airlines.size() != 1) { return; }
294  const CAirlineIcaoCode airline = airlines.front();
295  if (airline.validate().hasErrorMessages()) { return; }
297  airline); // I need to convert to stanard livery, which I can`t do here
298  }
299  }
300  }
301  else { CViewBase::dropEvent(event); }
302  }
303 
305  {
306  // Statistics and validation
307  if (!this->isEmpty())
308  {
309  menuActions.addAction(CIcons::appAircraft16(), "Model statistics", CMenuAction::pathModel(),
310  { this, &CAircraftModelView::displayModelStatisticsDialog });
311  if (m_withValidationContextMenu)
312  {
313  QDialog *parentDialog = CGuiUtility::findParentDialog(this);
314  if (!(parentDialog && (qobject_cast<CAircraftModelValidationDialog *>(parentDialog))))
315  {
316  menuActions.addAction(CIcons::disk16(), "Model validation (selected)", CMenuAction::pathModel(),
317  { this, &CAircraftModelView::displayModelValidationDialog });
318  }
319  }
320  if (CAircraftModelList::hasInvalidModelFile())
321  {
322  menuActions.addAction(CIcons::disk16(), "Highlight invalid models (from file)",
323  CMenuAction::pathModel(),
325  }
326  }
327 
328  // Stash menus
329  bool addStashMenu = false;
330  if (m_menus.testFlag(MenuCanStashModels))
331  {
332  if (!m_menuFlagActions.contains(MenuCanStashModels))
333  {
334  CMenuActions ma;
335  ma.addAction(CIcons::appDbStash16(), "Stash selected", CMenuAction::pathModelStash(),
336  { this, &CAircraftModelView::requestedStash });
337  QAction *added =
338  ma.addAction(CIcons::appDbStash16(), "Stashing clears selection (on/off)",
339  CMenuAction::pathModelStash(), { this, &CAircraftModelView::stashingClearsSelection });
340  added->setCheckable(true);
342  }
343 
344  // modify menu items
345  const int selected = this->selectedRowCount();
346  const bool tooMany = selected > 500;
347  const bool canStash = selected > 0 && !tooMany;
348  QAction *a = menuActions.addActions(initMenuActions(MenuCanStashModels)).first();
349  a->setEnabled(canStash);
351  a->setChecked(m_stashingClearsSelection);
352  addStashMenu = true;
353  }
354  if (m_menus.testFlag(MenuHighlightStashed))
355  {
356  // this function requires that someone provides the model strings to be highlighted
358  {
359  CMenuActions ma;
360  QAction *added =
361  ma.addAction(CIcons::appDbStash16(), "Highlight stashed (on/off)", CMenuAction::pathModelStash(),
362  { this, &CAircraftModelView::toggleHighlightStashedModels });
363  added->setCheckable(true);
365  }
367  a->setChecked(this->derivedModel()->highlightModels());
368  addStashMenu = true;
369  }
370 
371  // client specific
372  if (m_menus.testFlag(MenuDisableModelsTemp) && this->hasSelection())
373  {
375  {
376  CMenuActions ma;
377  ma.addAction(CIcons::delete16(), "Temp.disable model", CMenuAction::pathModel(),
378  { this, &CAircraftModelView::requestTempDisable });
380  }
382  }
383 
384  if (addStashMenu) { menuActions.addMenuStash(); }
385 
386  // base class menus
388  }
389 
391  {
392  if (m_correspondingSimulator.isNoSimulator()) { return {}; }
393  if (models.isEmpty()) { return CStatusMessage(this, CStatusMessage::SeverityDebug, u"Empty models", true); }
394 
395  // multiple sims with same count
396  const int removed = models.removeIfNotMatchingSimulator(m_correspondingSimulator);
397  if (removed < 1) { return {}; }
398  return CStatusMessage(this, CStatusMessage::SeverityWarning, u"Reduced by %1 model(s) to only use %2 models",
399  true)
400  << removed << m_correspondingSimulator.toQString(true);
401  }
402 
404  {
405  if (models.isEmpty()) { return COrderableViewWithDbObjects::validateLoadedJsonData(models); }
406  if (m_correspondingSimulator.isNoSimulator())
407  {
409  }
410  if (models.containsNotMatchingSimulator(m_correspondingSimulator))
411  {
412  return CStatusMessage(this, CStatusMessage::SeverityError, u"Found entry not matching %1 in model data",
413  true)
414  << m_correspondingSimulator.toQString();
415  }
417  }
418 
420  {
421  if (models.isEmpty()) { emit this->jsonModelsForSimulatorLoaded(CSimulatorInfo()); }
422  else { emit this->jsonModelsForSimulatorLoaded(models.simulatorsWithMaxEntries()); }
423  }
424 
425  void CAircraftModelView::toggleHighlightStashedModels()
426  {
427  const bool h = derivedModel()->highlightModels();
428  derivedModel()->setHighlight(!h);
430  }
431 
432  void CAircraftModelView::toggleHighlightInvalidModels()
433  {
434  const bool h = this->highlightModels();
435  this->setHighlight(!h);
436  }
437 
438  void CAircraftModelView::stashingClearsSelection() { m_stashingClearsSelection = !m_stashingClearsSelection; }
439 
440  void CAircraftModelView::requestedStash()
441  {
442  if (!m_menus.testFlag(MenuCanStashModels)) { return; }
443  if (!this->hasSelection()) { return; }
444  const CAircraftModelList models(this->selectedObjects());
445  emit this->requestStash(models);
446  if (m_stashingClearsSelection) { this->clearSelection(); }
448  CStatusMessage(CStatusMessage::SeverityInfo, u"Stashed " % models.getModelStringList(true).join(" ")));
449  }
450 
451  void CAircraftModelView::requestTempDisable()
452  {
453  if (!m_menus.testFlag(MenuDisableModelsTemp)) { return; }
454  if (!sGui || sGui->isShuttingDown()) { return; }
455  if (!this->hasSelection()) { return; }
456 
457  const CAircraftModelList selectedModels(this->selectedObjects());
458  sGui->displayInStatusBar(CStatusMessage(CStatusMessage::SeverityInfo,
459  u"Temp.disabled " % selectedModels.getModelStringList(true).join(" ")));
460  emit this->requestTempDisableModelsForMatching(selectedModels);
461  }
462 
463  void CAircraftModelView::displayModelStatisticsDialog()
464  {
465  if (!m_statisticsDialog) { m_statisticsDialog = new CAircraftModelStatisticsDialog(this); }
466  m_statisticsDialog->analyzeModels(this->container());
467  m_statisticsDialog->exec();
468  }
469 
470  void CAircraftModelView::displayModelValidationDialog()
471  {
472  if (!m_fileValidationDialog) { m_fileValidationDialog = new CAircraftModelValidationDialog(this); }
473  m_fileValidationDialog->setModels(this->selectedObjects(), m_correspondingSimulator,
474  m_correspondingSimulatorDir);
475  m_fileValidationDialog->triggerValidation(1000);
476  m_fileValidationDialog->exec();
477  }
478 } // namespace swift::gui::views
bool isShuttingDown() const
Is application shutting down?
bool displayInStatusBar(const swift::misc::CStatusMessage &message)
direct access to main application window
static QDialog * findParentDialog(QWidget *widget)
Find parent dialog if there is any, otherwise null.
Definition: guiutility.cpp:868
static swift::misc::CVariant fromSwiftDragAndDropData(const QMimeData *mime)
From text dropped.
Definition: guiutility.cpp:368
static bool hasSwiftVariantMimeType(const QMimeData *mime)
Mime data with swift type.
Definition: guiutility.cpp:363
static const QKeySequence & keyStash()
For stashing models.
Definition: shortcut.cpp:12
void setEnabled(bool enabled)
Set enabled / disabled (allows to gray out)
Definition: menuaction.cpp:66
Bunch of CMenuAction objects.
Definition: menuaction.h:384
CMenuAction addMenuStash()
Stash menu.
Definition: menuaction.cpp:434
CMenuAction last() const
Last action.
Definition: menuaction.h:488
CMenuActions addActions(const CMenuActions &actions)
Add menu actions, returns last valid QAction.
Definition: menuaction.cpp:217
CMenuAction addAction(const CMenuAction &menuAction)
Add menu action.
Definition: menuaction.cpp:210
CMenuAction first() const
First action.
Definition: menuaction.h:485
void analyzeModels(const swift::misc::simulation::CAircraftModelList &models)
Set and analyze the models.
void setModels(const swift::misc::simulation::CAircraftModelList &models, const swift::misc::simulation::CSimulatorInfo &simulator, const QString &simulatorDir)
Models.
void triggerValidation(int delayMs=2500)
Trigger a validation.
virtual void customMenu(menus::CMenuActions &menuActions)
Method creating the menu.
bool highlightModels() const
Highlight models.
void setHighlightColor(const QBrush &brush)
The highlight color.
int removeModelsWithModelString(const QStringList &modelStrings, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive)
Remove models with model strings.
void setAircraftModelMode(models::CAircraftModelListModel::AircraftModelMode mode)
Set display mode.
swift::gui::filters::CAircraftModelFilterDialog * getFilterDialog() const
Filter dialog if any.
virtual void jsonLoadedAndModelUpdated(const swift::misc::simulation::CAircraftModelList &models)
In swift::gui::views::CViewBaseNonTemplate::loadJson the view has been updated because of loaded JSON...
virtual swift::misc::CStatusMessage modifyLoadedJsonData(swift::misc::simulation::CAircraftModelList &models) const
Modify JSON data loaded in swift::gui::views::CViewBaseNonTemplate::loadJson.
virtual swift::misc::CStatusMessage validateLoadedJsonData(const swift::misc::simulation::CAircraftModelList &models) const
Verify JSON data loaded in swift::gui::views::CViewBaseNonTemplate::loadJson.
void setHighlightModelsForInvalidModels()
Set the highlight models based on the saved file.
void requestTempDisableModelsForMatching(const swift::misc::simulation::CAircraftModelList &models)
Temp.disable model.
virtual void dropEvent(QDropEvent *event)
int replaceOrAddModelsWithString(const swift::misc::simulation::CAircraftModelList &models, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive)
Replace models with sme model string, otherwise add.
void setHighlight(bool highlight)
Highlight models.
void setHighlightModels(const swift::misc::simulation::CAircraftModelList &highlightModels)
Highlight models.
void setCorrespondingSimulator(const swift::misc::simulation::CSimulatorInfo &simulator, const QString &simDir)
Corresponding simulator.
void jsonModelsForSimulatorLoaded(const swift::misc::simulation::CSimulatorInfo &simulator)
Models for simulator loaded (JSON)
void toggledHighlightStashedModels()
Highlight stashed models has been toggled.
void requestHandlingOfStashDrop(const swift::misc::aviation::CAirlineIcaoCode &airlineIcao)
Request further handling of drops I cannot handle on my own.
void setHighlightModelStrings(const QStringList &highlightModels)
Highlight models.
bool hasSelectedModelsToStash() const
Has any models to stash and it is allowed to stash.
int applyToSelected(const swift::misc::aviation::CLivery &livery)
Apply to selected objects.
void addFilterDialog()
Add my own filter dialog.
void setAcceptedMetaTypeIds()
Add the technically supported metatypes allowed for drag and drop.
void requestStash(const swift::misc::simulation::CAircraftModelList &models)
Request to stash if applicable.
Base class for views with DB objects also orderable (based on swift::misc::IOrderableList )
Definition: viewdbobjects.h:79
virtual void customMenu(swift::gui::menus::CMenuActions &menuActions)
Method creating the menu.
int rowOf(const ObjectType &obj) const
The row of the given object.
Definition: viewbase.cpp:219
void standardInit(ModelClass *model=nullptr)
Standard initialization.
Definition: viewbase.cpp:572
virtual void clearHighlighting()
Clear any highlighted objects.
Definition: viewbase.cpp:360
virtual bool isEmpty() const
Empty?
Definition: viewbase.cpp:400
void updateContainerMaybeAsync(const ContainerType &container, bool sort=true, bool resize=true)
Based on size call sync / async update.
Definition: viewbase.cpp:117
virtual ContainerType selectedObjects() const
Selected objects.
Definition: viewbase.cpp:240
ModelClass * derivedModel()
Model.
Definition: viewbase.h:669
ModelClass * m_model
corresponding model
Definition: viewbase.h:877
void setSortIndicator()
Set the search indicator based on model.
Definition: viewbase.cpp:562
virtual swift::misc::CStatusMessage validateLoadedJsonData(const ContainerType &data) const
Verify JSON data loaded in swift::gui::views::CViewBaseNonTemplate::loadJson.
Definition: viewbase.cpp:666
virtual bool isDropAllowed() const
Drop allowed?
Definition: viewbase.cpp:427
const ContainerType & container() const
Access to container.
Definition: viewbase.cpp:200
virtual void copy()
Clipboard cut/copy/paste.
Definition: viewbase.cpp:804
int updateSelected(const swift::misc::CVariant &variant, const swift::misc::CPropertyIndex &index)
Update selected objects.
Definition: viewbase.cpp:300
virtual void dropEvent(QDropEvent *event)
Definition: viewbase.cpp:434
menus::IMenuDelegate * setCustomMenu(menus::IMenuDelegate *menu, bool nestPreviousMenu=true)
Set custom menu if applicable.
Menu m_menus
Default menu settings.
Definition: viewbase.h:603
int selectedRowCount() const
Number of selected rows.
QWidget * getFilterWidget() const
Filter widget if any.
Definition: viewbase.h:268
void setSettingsDirectoryIndex(swift::misc::CDirectories::ColumnIndex directoryIndex)
Index of the directory we "remember".
Definition: viewbase.h:333
QMap< MenuFlag, menus::CMenuActions > m_menuFlagActions
initialized actions for menu flag (enum)
Definition: viewbase.h:608
menus::CMenuActions initMenuActions(MenuFlag menu)
Init menu actions.
void setFilterDialog(filters::CFilterDialog *filterDialog)
Filter dialog.
@ MenuHighlightStashed
highlight stashed models
Definition: viewbase.h:142
@ MenuBackend
allow to request data from backend
Definition: viewbase.h:123
bool hasSelection() const
Selection (selected rows)
Specialized value object compliant map for variants, based on indexes.
size_type size() const
Returns number of elements in the sequence.
Definition: sequence.h:273
reference front()
Access the first element.
Definition: sequence.h:225
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
Streamable status message, e.g.
bool hasErrorMessages() const
Error messages.
Wrapper around QVariant which provides transparent access to CValueObject methods of the contained ob...
Definition: variant.h:66
T value() const
Return the value converted to the type T.
Definition: variant.h:169
bool isValid() const
True if this variant is valid.
Definition: variant.h:252
bool canConvert(int typeId) const
True if this variant can be converted to the type with the given metatype ID.
Value object for ICAO classification.
CStatusMessageList validate() const
Validate data.
Value object encapsulating a list of ICAO codes.
Value object for ICAO classification.
CStatusMessageList validate() const
Validate data.
Value object encapsulating a list of ICAO codes.
Value object encapsulating information about an airpot.
Definition: livery.h:29
CStatusMessageList validate() const
Validate data.
Definition: livery.cpp:128
Value object for a list of airports.
Definition: liverylist.h:29
QString toQString(bool i18n=false) const
Cast as QString.
Definition: mixinstring.h:76
Aircraft model (used by another pilot, my models on disk)
Definition: aircraftmodel.h:71
bool hasModelString() const
Non empty model string?
Value object encapsulating a list of aircraft models.
QStringList getModelStringList(bool sort=true) const
Model strings.
CStatusMessage loadInvalidModels()
Save/load invalid models.
CSimulatorInfo simulatorsWithMaxEntries() const
Which simulator(s) have the most entries?
bool containsNotMatchingSimulator(const CSimulatorInfo &simulators) const
Contains any model not matching any of of passed simulators?
int removeIfNotMatchingSimulator(const CSimulatorInfo &needToMatch)
Remove if not matching simulator.
Value object encapsulating information of software distributor.
Definition: distributor.h:33
swift::misc::CStatusMessageList validate() const
Validate data.
Value object encapsulating a list of distributors.
Simple hardcoded info about the corresponding simulator.
Definition: simulatorinfo.h:41
bool isNoSimulator() const
No simulator?
SWIFT_GUI_EXPORT swift::gui::CGuiApplication * sGui
Single instance of GUI application object.
Filter to search data sets.
Models to be used with views, mainly QTableView.
Views, mainly QTableView.
Free functions in swift::misc.