11 #include "ui_firstmodelsetcomponent.h"
24 using namespace swift::config;
26 using namespace swift::misc::simulation;
27 using namespace swift::misc::simulation::settings;
31 const QStringList &CFirstModelSetComponent::getLogCategories()
33 static const QStringList cats { CLogCategories::modelGui() };
37 CFirstModelSetComponent::CFirstModelSetComponent(QWidget *parent)
41 ui->comp_Distributors->view()->setSelectionMode(QAbstractItemView::MultiSelection);
43 ui->comp_SimulatorSelector->setRememberSelectionAndSetToLastSelection();
49 this->onSimulatorChanged(ui->comp_SimulatorSelector->getValue());
52 &CFirstModelSetComponent::onSimulatorChanged);
53 Q_ASSERT_X(s, Q_FUNC_INFO,
"Cannot connect selector signal");
54 connect(&m_simulatorSettings, &CMultiSimulatorSettings::settingsChanged,
this,
55 &CFirstModelSetComponent::onSettingsChanged, Qt::QueuedConnection);
56 Q_ASSERT_X(s, Q_FUNC_INFO,
"Cannot connect settings signal");
58 &CFirstModelSetComponent::onModelsLoaded, Qt::QueuedConnection);
59 Q_ASSERT_X(s, Q_FUNC_INFO,
"Cannot connect models signal");
61 connect(ui->pb_ModelSet, &QPushButton::clicked,
this, &CFirstModelSetComponent::openOwnModelSetDialog);
62 connect(ui->pb_Models, &QPushButton::clicked,
this, &CFirstModelSetComponent::openOwnModelsDialog);
63 connect(ui->pb_ModelsTriggerReload, &QPushButton::clicked,
this, &CFirstModelSetComponent::openOwnModelsDialog);
64 connect(ui->pb_ChangeModelDir, &QPushButton::clicked,
this, &CFirstModelSetComponent::changeModelDirectory);
65 connect(ui->pb_ClearModelDir, &QPushButton::clicked,
this, &CFirstModelSetComponent::changeModelDirectory);
66 connect(ui->pb_CreateModelSet, &QPushButton::clicked,
this, &CFirstModelSetComponent::createModelSet);
71 void CFirstModelSetComponent::onSimulatorChanged(
const CSimulatorInfo &simulator)
77 if (CBuildConfig::isLocalDeveloperDebugBuild())
85 Q_ASSERT_X(m_modelsDialog, Q_FUNC_INFO,
"No models dialog");
86 m_modelsDialog->setSimulator(simulator);
88 Q_ASSERT_X(m_modelSetDialog, Q_FUNC_INFO,
"No model set dialog");
89 m_modelSetDialog->setSimulator(simulator);
92 ui->comp_Distributors->filterBySimulator(simulator);
95 ui->le_ModelDirectories->setText(dirs.join(
", "));
100 static const QString modelsNo(
"No models so far");
104 static const QString modelsInfo(
"%1 included %2 DB key %3");
106 const int modelsIncluded = modelsInCache.
countByMode(CAircraftModel::Include);
108 ui->le_ModelsInfo->setText(modelsInfo.arg(this->modelLoader()->getCacheCountAndTimestamp(simulator))
112 else { ui->le_ModelsInfo->setText(modelsNo); }
114 ui->pb_CreateModelSet->setEnabled(modelsCount > 0);
116 static const QString modelsSetNo(
"Model set is empty");
117 const int modelsSetCount = m_modelSetDialog->modelSetComponent()->getModelSetCount();
118 ui->le_ModelSetInfo->setText(
119 modelsSetCount > 0 ? m_modelSetDialog->modelSetComponent()->getModelCacheCountAndTimestamp() : modelsSetNo);
122 void CFirstModelSetComponent::onSettingsChanged(
const CSimulatorInfo &simulator)
124 const CSimulatorInfo currentSimulator = ui->comp_SimulatorSelector->getValue();
125 if (simulator != currentSimulator) {
return; }
126 this->onSimulatorChanged(simulator);
129 void CFirstModelSetComponent::onModelsLoaded(
const CSimulatorInfo &simulator,
int count)
132 const CSimulatorInfo currentSimulator = ui->comp_SimulatorSelector->getValue();
133 if (simulator != currentSimulator) {
return; }
134 this->onSimulatorChanged(simulator);
137 void CFirstModelSetComponent::triggerSettingsChanged(
const CSimulatorInfo &simulator)
140 QPointer<CFirstModelSetComponent> myself(
this);
143 myself->onSettingsChanged(simulator);
147 const CDbOwnModelsComponent *CFirstModelSetComponent::modelsComponent()
const
149 Q_ASSERT_X(m_modelsDialog, Q_FUNC_INFO,
"No models dialog");
150 Q_ASSERT_X(m_modelsDialog->modelsComponent(), Q_FUNC_INFO,
"No models component");
151 return m_modelsDialog->modelsComponent();
154 const CDbOwnModelSetComponent *CFirstModelSetComponent::modelSetComponent()
const
156 Q_ASSERT_X(m_modelSetDialog, Q_FUNC_INFO,
"No model set dialog");
157 Q_ASSERT_X(m_modelSetDialog->modelSetComponent(), Q_FUNC_INFO,
"No model set component");
158 return m_modelSetDialog->modelSetComponent();
163 Q_ASSERT_X(m_modelsDialog->modelsComponent()->modelLoader(), Q_FUNC_INFO,
"No model loader");
164 return m_modelsDialog->modelsComponent()->modelLoader();
167 void CFirstModelSetComponent::openOwnModelsDialog()
169 if (!m_modelsDialog) {
return; }
171 const bool reload = (QObject::sender() == ui->pb_ModelsTriggerReload);
173 const CSimulatorInfo simulator = ui->comp_SimulatorSelector->getValue();
174 m_modelsDialog->setSimulator(simulator);
180 const QMessageBox::StandardButton reply = QMessageBox::warning(
181 this->mainWindow(),
"DB data",
"No DB data, models cannot be consolidated. Load anyway?",
182 QMessageBox::Yes | QMessageBox::No);
183 if (reply != QMessageBox::Yes) {
return; }
186 bool loadOnlyIfNotEmpty =
true;
187 if (m_modelsDialog->getOwnModelsCount() > 0)
189 const QMessageBox::StandardButton reply =
190 QMessageBox::warning(this->mainWindow(),
"Model loading",
191 "Reload the models?\nThe existing cache data will we overridden.",
192 QMessageBox::Yes | QMessageBox::No);
193 if (reply == QMessageBox::Yes) { loadOnlyIfNotEmpty =
false; }
195 m_modelsDialog->requestModelsInBackground(simulator, loadOnlyIfNotEmpty);
197 m_modelsDialog->exec();
200 this->triggerSettingsChanged(simulator);
203 void CFirstModelSetComponent::openOwnModelSetDialog()
205 const CSimulatorInfo simulator = ui->comp_SimulatorSelector->getValue();
206 m_modelSetDialog->setSimulator(simulator);
207 m_modelSetDialog->enableButtons(
false,
false);
208 m_modelSetDialog->exec();
211 this->triggerSettingsChanged(simulator);
214 void CFirstModelSetComponent::changeModelDirectory()
216 using namespace std::chrono_literals;
219 const CSimulatorInfo simulator = ui->comp_SimulatorSelector->getValue();
221 const bool clear = (QObject::sender() == ui->pb_ClearModelDir);
227 const QString newDir =
228 QFileDialog::getExistingDirectory(this->mainWindow(), tr(
"Open model directory"), dirOld,
229 QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
230 if (newDir.isEmpty() || CDirectoryUtils::isSameExistingDirectory(dirOld, newDir)) {
return; }
234 const CStatusMessage msg = m_simulatorSettings.setAndSaveSettings(settings, simulator);
235 if (msg.
isSuccess()) { this->triggerSettingsChanged(simulator); }
239 void CFirstModelSetComponent::createModelSet()
241 using namespace std::chrono_literals;
242 const CSimulatorInfo simulator = ui->comp_SimulatorSelector->getValue();
243 const int modelsCount = this->modelLoader()->getCachedModelsCount(simulator);
252 bool useAllModels =
false;
253 if (!ui->comp_Distributors->hasSelectedDistributors())
255 const QMessageBox::StandardButton reply =
256 QMessageBox::question(this->mainWindow(),
"Models",
"No distributors selected, use all models?",
257 QMessageBox::Yes | QMessageBox::No);
258 if (reply == QMessageBox::Yes) { useAllModels =
true; }
269 const CDistributorList distributors = ui->comp_Distributors->getSelectedDistributors();
281 if (!m_modelSetDialog || !m_modelSetDialog->modelSetComponent())
287 const int modelsSetCount = m_modelSetDialog->modelSetComponent()->getModelSetCount();
288 if (modelsSetCount > 0)
290 QMessageBox::StandardButton
override = QMessageBox::question(
291 this,
"Override",
"Override existing model set?", QMessageBox::Yes | QMessageBox::No);
292 if (
override != QMessageBox::Yes) {
return; }
295 m_modelSetDialog->modelSetComponent()->setModelSet(modelsForSet, simulator);
296 ui->pb_ModelSet->click();
299 QWidget *CFirstModelSetComponent::mainWindow()
302 return pw ? pw :
this;
bool isShuttingDown() const
Is application shutting down?
CWebDataServices * getWebDataServices() const
Get the web data services.
bool hasDbModelData() const
Are DB model data available?
static QWidget * mainApplicationWidget()
Main application window widget.
bool showOverlayHTMLMessage(const QString &htmlMessage, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
HTML message.
bool showOverlayMessage(const swift::misc::CStatusMessage &message, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
Show single message.
Using this class provides a QFrame with the overlay functionality already integrated.
void successfullyLoadedModels(const swift::misc::simulation::CSimulatorInfo &simulator, int count)
Models have been successfully loaded.
Create a first model set.
virtual ~CFirstModelSetComponent()
Destructor.
virtual bool validatePage()
void changed(const swift::misc::simulation::CSimulatorInfo &simulator)
Value has been changed.
Class for emitting a log message.
Derived & validationError(const char16_t(&format)[N])
Set the severity to error, providing a format string, and adding the validation category.
Derived & error(const char16_t(&format)[N])
Set the severity to error, providing a format string.
bool isEmpty() const
Synonym for empty.
Streamable status message, e.g.
bool isSuccess() const
Operation considered successful.
int removeObjectsWithoutDbKey()
Remove objects without key.
int countWithValidDbKey(bool withKey) const
Number of objects with/without key.
QString toQString(bool i18n=false) const
Cast as QString.
Value object encapsulating a list of aircraft models.
int countByMode(CAircraftModel::ModelMode mode) const
Count by mode.
CAircraftModelList findByDistributors(const CDistributorList &distributors) const
All models from given distributors.
Value object encapsulating a list of distributors.
Simple hardcoded info about the corresponding simulator.
bool isSingleSimulator() const
Single simulator selected.
Load the aircraft for a simulator.
CAircraftModelList getCachedModels(const CSimulatorInfo &simulator) const
Look like IMultiSimulatorModelCaches interface.
int getCachedModelsCount(const CSimulatorInfo &simulator) const
Look like IMultiSimulatorModelCaches interface.
QStringList getModelDirectoriesOrDefault(const CSimulatorInfo &simulator) const
Model directory or default model path per simulator.
Allows to have specific utility functions for each simulator.
QString getFirstModelDirectoryOrDefault() const
First model directoy.
bool addModelDirectory(const QString &modelDirectory)
Add (if not exists) model directory.
void clearModelDirectories()
Clear the model directories.
SWIFT_GUI_EXPORT swift::gui::CGuiApplication * sGui
Single instance of GUI application object.
High level reusable GUI components.
Free functions in swift::misc.
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...
#define SWIFT_VERIFY_X(COND, WHERE, WHAT)
A weaker kind of assert.