swift
aircraftmodelstringcompleter.cpp
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 #include <QPointer>
7 #include <QRadioButton>
8 #include <QStringListModel>
9 
10 #include "ui_aircraftmodelstringcompleter.h"
11 
13 #include "core/webdataservices.h"
14 #include "gui/guiapplication.h"
15 #include "gui/uppercasevalidator.h"
16 
17 using namespace swift::core;
18 using namespace swift::core::context;
19 using namespace swift::misc::simulation;
20 using namespace swift::misc::simulation::data;
21 
22 namespace swift::gui::components
23 {
24  CAircraftModelStringCompleter::CAircraftModelStringCompleter(QWidget *parent)
25  : QFrame(parent), ui(new Ui::CAircraftModelStringCompleter)
26  {
27  Q_ASSERT_X(sGui, Q_FUNC_INFO, "missing sGui");
28  Q_ASSERT_X(sGui->hasWebDataServices(), Q_FUNC_INFO, "missing web services");
29 
30  ui->setupUi(this);
31  ui->le_modelString->setValidator(new CUpperCaseValidator(ui->le_modelString));
32 
33  connect(ui->le_modelString, &QLineEdit::editingFinished, this, &CAircraftModelStringCompleter::onTextChanged);
34  connect(sGui->getWebDataServices(), &CWebDataServices::swiftDbModelsRead, this,
35  &CAircraftModelStringCompleter::onSwiftModelDataRead);
36  connect(ui->rb_Db, &QRadioButton::clicked, this, &CAircraftModelStringCompleter::initGui);
37  connect(ui->rb_ModelSet, &QRadioButton::clicked, this, &CAircraftModelStringCompleter::initGui);
38  connect(ui->rb_OwnModels, &QRadioButton::clicked, this, &CAircraftModelStringCompleter::initGui);
39  connect(&m_modelCaches, &CModelCaches::cacheChanged, this, &CAircraftModelStringCompleter::setSimulator,
40  Qt::QueuedConnection);
41 
42  CSimulatorInfo simulator = CSimulatorInfo(CSimulatorInfo::P3D); // default
44  {
45  connect(sGui->getIContextSimulator(), &IContextSimulator::simulatorStatusChanged, this,
46  &CAircraftModelStringCompleter::onSimulatorConnected, Qt::QueuedConnection);
48  if (pluginSimulator.isSingleSimulator()) { simulator = pluginSimulator; }
49  else
50  {
51  this->setSourceVisible(OwnModels, false); // hide own models
52  }
53  }
54  this->setSimulator(simulator);
55  this->initGui();
56  }
57 
59 
60  QString CAircraftModelStringCompleter::getModelString() const { return ui->le_modelString->text(); }
61 
62  void CAircraftModelStringCompleter::showSourceSelection(bool show) { ui->wi_SourceSelection->setVisible(!show); }
63 
64  void CAircraftModelStringCompleter::setText(const QString &completersString)
65  {
66  if (ui->le_modelString->text() == completersString) { return; }
67  ui->le_modelString->setText(completersString);
68  }
69 
71  {
72  this->setText(model.getModelString());
73  }
74 
75  void CAircraftModelStringCompleter::setSourceVisible(CompleterSource source, bool visible)
76  {
77  if (source.testFlag(DB)) { ui->rb_Db->setVisible(visible); }
78  if (source.testFlag(ModelSet)) { ui->rb_ModelSet->setVisible(visible); }
79  if (source.testFlag(OwnModels)) { ui->rb_OwnModels->setVisible(visible); }
80  }
81 
83  {
84  switch (source)
85  {
86  case DB: ui->rb_Db->setChecked(true); break;
87  case ModelSet: ui->rb_ModelSet->setChecked(true); break;
88  case OwnModels: ui->rb_OwnModels->setChecked(true); break;
89  default: ui->rb_ModelSet->setChecked(true); break;
90  }
91  }
92 
94  {
95  if (simulator.isSingleSimulator()) { return false; }
96  if (this->getSimulator() == simulator) { return false; }
97  m_currentSimulator = simulator;
98  QPointer<CAircraftModelStringCompleter> myself(this);
99  QTimer::singleShot(100, this, [=] {
100  if (!myself) { return; }
101  this->setCompleter(true);
102  });
103  return true;
104  }
105 
106  CSimulatorInfo CAircraftModelStringCompleter::getSimulator() const { return m_currentSimulator; }
107 
108  void CAircraftModelStringCompleter::clear() { ui->le_modelString->clear(); }
109 
110  void CAircraftModelStringCompleter::setCompleter(bool simChanged)
111  {
112  if (!sGui || sGui->isShuttingDown()) { return; }
113  QStringList modelStrings;
114  CompleterSourceFlag dataSource = None;
115  QString simInfo = m_currentSimulator.toQString();
116  if (ui->rb_Db->isChecked())
117  {
118  if (!simChanged && m_currentDataSource == DB) { return; }
119  modelStrings = sGui->getWebDataServices()->getModelCompleterStrings();
120  dataSource = DB;
121  simInfo = QStringLiteral("DB models");
122  }
123  else if (ui->rb_ModelSet->isChecked() && sGui && sGui->getIContextSimulator())
124  {
125  if (!simChanged && m_currentDataSource == ModelSet) { return; }
126  modelStrings = sGui->getIContextSimulator()->getModelSetCompleterStrings(true);
127  dataSource = ModelSet;
128  }
129  else if (ui->rb_OwnModels->isChecked())
130  {
131  if (!simChanged && m_currentDataSource == OwnModels) { return; }
132  modelStrings = m_modelCaches.getCachedModels(this->getSimulator()).toCompleterStrings();
133  dataSource = OwnModels;
134  }
135 
136  m_currentDataSource = dataSource;
137  ui->le_modelString->setCompleter(new QCompleter(modelStrings, this));
138  ui->le_modelString->setPlaceholderText(
139  QStringLiteral("model strings (%1/%2)").arg(modelStrings.size()).arg(simInfo));
140  }
141 
142  void CAircraftModelStringCompleter::onTextChanged() { emit this->modelStringChanged(); }
143 
144  void CAircraftModelStringCompleter::initGui() { this->setCompleter(true); }
145 
146  void CAircraftModelStringCompleter::onSimulatorConnected(int status)
147  {
148  // reinit because sim changed
149  Q_UNUSED(status);
150  this->initGui();
151  }
152 
153  void CAircraftModelStringCompleter::onSwiftModelDataRead() { this->initGui(); }
154 } // namespace swift::gui::components
bool hasWebDataServices() const
Web data services available?
bool isShuttingDown() const
Is application shutting down?
const context::IContextSimulator * getIContextSimulator() const
Direct access to contexts if a CCoreFacade has been initialized.
CWebDataServices * getWebDataServices() const
Get the web data services.
QStringList getModelCompleterStrings(bool sorted=true, const swift::misc::simulation::CSimulatorInfo &simulator={ swift::misc::simulation::CSimulatorInfo::All }) const
Model completer string.
virtual swift::misc::simulation::CSimulatorPluginInfo getSimulatorPluginInfo() const =0
Simulator info, currently loaded plugin.
virtual QStringList getModelSetCompleterStrings(bool sorted) const =0
Model set completer string.
void setSourceVisible(CompleterSource source, bool visible)
Show/hide radio buttons.
void showSourceSelection(bool show)
Show the selection buttons.
bool setSimulator(const swift::misc::simulation::CSimulatorInfo &simulator)
Change the simulator.
void setModel(const swift::misc::simulation::CAircraftModel &model)
Set model.
void selectSource(CompleterSourceFlag source)
Set the currently selected source.
void setText(const QString &completersString)
Set text.
swift::misc::simulation::CSimulatorInfo getSimulator() const
Get current simulator.
@ None
normally used to indicate nothing was loaded
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
const QString & getModelString() const
Model key, either queried or loaded from simulator model.
QStringList toCompleterStrings(bool sorted=true, const CSimulatorInfo &simulator={ CSimulatorInfo::All }) const
Completer strings.
Simple hardcoded info about the corresponding simulator.
Definition: simulatorinfo.h:41
bool isSingleSimulator() const
Single simulator selected.
const QString & getSimulator() const
Simulator.
CAircraftModelList getCachedModels(const CSimulatorInfo &simulator) const
Models for simulator.
SWIFT_GUI_EXPORT swift::gui::CGuiApplication * sGui
Single instance of GUI application object.
Backend services of the swift project, like dealing with the network or the simulators.
Definition: actionbind.cpp:7
High level reusable GUI components.
Definition: aboutdialog.cpp:13
auto singleShot(int msec, QObject *target, F &&task)
Starts a single-shot timer which will call a task in the thread of the given object when it times out...
Definition: threadutils.h:30