7 #include <QRegularExpression>
9 #include "ui_settingssimulatorbasicscomponent.h"
18 using namespace swift::misc::simulation;
19 using namespace swift::misc::simulation::fscommon;
20 using namespace swift::misc::simulation::settings;
21 using namespace swift::misc::simulation::xplane;
22 using namespace swift::config;
26 const QStringList &CSettingsSimulatorBasicsComponent::getLogCategories()
32 CSettingsSimulatorBasicsComponent::CSettingsSimulatorBasicsComponent(QWidget *parent)
36 this->setSmallLayout(
true);
38 ui->comp_SimulatorSelector->setRememberSelectionAndSetToLastSelection();
40 connect(ui->pb_ExcludeFileDialog, &QPushButton::clicked,
this,
41 &CSettingsSimulatorBasicsComponent::excludeFileDialog);
42 connect(ui->pb_ModelFileDialog, &QPushButton::clicked,
this,
43 &CSettingsSimulatorBasicsComponent::modelFileDialog);
44 connect(ui->pb_SimulatorFileDialog, &QPushButton::clicked,
this,
45 &CSettingsSimulatorBasicsComponent::simulatorFileDialog);
47 connect(ui->pb_Reset, &QPushButton::clicked,
this, &CSettingsSimulatorBasicsComponent::reset);
48 connect(ui->pb_CopyDefaults, &QPushButton::clicked,
this, &CSettingsSimulatorBasicsComponent::copyDefaults);
49 connect(ui->pb_AdjustModelDirectory, &QPushButton::clicked,
this,
50 &CSettingsSimulatorBasicsComponent::adjustModelDirectory);
51 connect(ui->le_SimulatorDirectory, &QLineEdit::returnPressed,
this,
52 &CSettingsSimulatorBasicsComponent::simulatorDirectoryEntered);
54 &CSettingsSimulatorBasicsComponent::onSimulatorChanged);
55 connect(&m_settings, &CMultiSimulatorSettings::settingsChanged,
this,
56 &CSettingsSimulatorBasicsComponent::onSimulatorSettingsChanged);
58 this->onSimulatorChanged();
67 return !ui->le_SimulatorDirectory->text().isEmpty() || !ui->pte_ModelDirectories->toPlainText().isEmpty() ||
68 !ui->pte_ExcludeDirectories->toPlainText().isEmpty();
74 ui->comp_SimulatorSelector->setValue(simulator);
77 void CSettingsSimulatorBasicsComponent::setSmallLayout(
bool small)
79 ui->lbl_ExcludeDirectories->setWordWrap(small);
80 ui->lbl_ModelDirectory->setWordWrap(small);
81 ui->lbl_SimulatorDirectory->setWordWrap(small);
84 void CSettingsSimulatorBasicsComponent::simulatorFileDialog()
86 const QString startDirectory = CFileUtils::fixWindowsUncPath(this->getFileBrowserSimulatorDirectory());
88 QFileDialog::getExistingDirectory(
this, tr(
"Simulator directory"), startDirectory,
89 QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
90 if (dir.isEmpty()) {
return; }
91 ui->le_SimulatorDirectory->setText(CFileUtils::normalizeFilePathToQtStandard(dir));
92 this->adjustModelDirectory();
95 void CSettingsSimulatorBasicsComponent::modelFileDialog()
97 const QString startDirectory = CFileUtils::fixWindowsUncPath(this->getFileBrowserModelDirectory());
98 const QString dir = QFileDialog::getExistingDirectory(
99 this, tr(
"Model directory"), startDirectory, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
100 if (dir.isEmpty()) {
return; }
101 m_unsavedChanges =
true;
102 const QStringList newDirs = this->addDirectory(dir, this->parseModelDirectories());
103 this->displayModelDirectories(newDirs);
106 void CSettingsSimulatorBasicsComponent::excludeFileDialog()
108 const QString startDirectory = this->getFileBrowserModelDirectory();
110 QFileDialog::getExistingDirectory(
this, tr(
"Exclude directory"), startDirectory,
111 QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
112 if (dir.isEmpty()) {
return; }
113 m_unsavedChanges =
true;
114 const QStringList newDirs =
115 CFileUtils::stripLeadingSlashOrDriveLetters(this->addDirectory(dir, this->parseExcludeDirectories()));
116 this->displayExcludeDirectoryPatterns(newDirs);
119 void CSettingsSimulatorBasicsComponent::simulatorDirectoryEntered()
121 const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
122 const QString simDir = CFileUtils::normalizeFilePathToQtStandard(ui->le_SimulatorDirectory->text().trimmed());
123 ui->le_SimulatorDirectory->setText(simDir);
124 this->displayDefaultValuesAsPlaceholder(simulator);
129 using namespace std::chrono_literals;
130 const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
132 const QString simulatorDir(ui->le_SimulatorDirectory->text().trimmed());
133 const QStringList modelDirs(this->parseModelDirectories());
134 const QStringList excludeDirs(this->parseDirectories(ui->pte_ExcludeDirectories->toPlainText()));
136 const QStringList relativeDirs = CFileUtils::makeDirectoriesRelative(
137 excludeDirs, this->getFileBrowserModelDirectory(), m_fileCaseSensitivity);
144 const CStatusMessage m = m_settings.setAndSaveSettings(s, simulator);
145 if (!m.
isEmpty()) { CLogMessage::preformatted(m); }
148 m_unsavedChanges = m_unsavedChanges && !m.
isSuccess();
151 this->displaySettings(simulator);
156 void CSettingsSimulatorBasicsComponent::copyDefaults()
158 const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
162 QMessageBox::StandardButton reply = QMessageBox::question(
this,
"Override",
"Override existing values?",
163 QMessageBox::Yes | QMessageBox::No);
164 if (reply != QMessageBox::Yes) {
return; }
169 const QString sd = CFileUtils::fixWindowsUncPath(
173 ui->le_SimulatorDirectory->setText(sd);
174 m_unsavedChanges =
true;
180 this->displayModelDirectories(md);
181 m_unsavedChanges =
true;
185 if (!excludes.isEmpty())
187 this->displayExcludeDirectoryPatterns(excludes);
188 m_unsavedChanges =
true;
192 void CSettingsSimulatorBasicsComponent::adjustModelDirectory()
194 const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
195 const QString simDir = this->getFileBrowserSimulatorDirectory();
203 const QStringList parsedDirectories = this->parseModelDirectories();
204 const QStringList newDirs =
205 parsedDirectories.size() > 1 ?
208 this->displayModelDirectories(newDirs);
211 void CSettingsSimulatorBasicsComponent::reset()
213 const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
216 m_unsavedChanges =
true;
218 ui->le_SimulatorDirectory->clear();
219 ui->pte_ModelDirectories->clear();
220 ui->pte_ExcludeDirectories->clear();
221 this->displayDefaultValuesAsPlaceholder(simulator);
223 CLogMessage(
this).
info(u
"Reset values for settings of %1") << simulator.toQString(
true);
226 void CSettingsSimulatorBasicsComponent::onSimulatorChanged()
228 const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
229 this->displaySettings(simulator);
230 this->displayDefaultValuesAsPlaceholder(simulator);
233 void CSettingsSimulatorBasicsComponent::onSimulatorSettingsChanged(
const CSimulatorInfo &simulator)
235 const CSimulatorInfo selectedSimulator(ui->comp_SimulatorSelector->getValue());
236 if (selectedSimulator == simulator) { this->displaySettings(simulator); }
239 QStringList CSettingsSimulatorBasicsComponent::parseModelDirectories()
const
241 return this->parseDirectories(ui->pte_ModelDirectories->toPlainText());
244 QStringList CSettingsSimulatorBasicsComponent::parseExcludeDirectories()
const
246 return this->parseDirectories(ui->pte_ExcludeDirectories->toPlainText());
249 QStringList CSettingsSimulatorBasicsComponent::parseDirectories(
const QString &rawString)
const
251 const QString raw = rawString.trimmed();
252 if (raw.isEmpty()) {
return QStringList(); }
254 thread_local
const QRegularExpression regExp(
"\n|\r\n|\r");
255 const QStringList rawLines = raw.split(regExp);
256 for (
const QString &l : rawLines)
258 const QString normalized = CFileUtils::normalizeFilePathToQtStandard(l);
259 if (normalized.isEmpty()) {
continue; }
260 dirs.push_back(normalized);
262 dirs = CFileUtils::removeSubDirectories(dirs);
266 QStringList CSettingsSimulatorBasicsComponent::addDirectory(
const QString &directory,
267 const QStringList &existingDirs)
269 const QString d(CFileUtils::normalizeFilePathToQtStandard(directory));
270 QStringList dirs(existingDirs);
271 if (d.isEmpty()) {
return existingDirs; }
272 if (!dirs.contains(d, m_fileCaseSensitivity)) { dirs.push_back(d); }
273 dirs.removeDuplicates();
274 dirs.sort(m_fileCaseSensitivity);
278 QStringList CSettingsSimulatorBasicsComponent::removeDirectory(
const QString &directory,
279 const QStringList &existingDirs)
281 const QString d(CFileUtils::normalizeFilePathToQtStandard(directory));
282 return this->removeDirectories(QStringList({ d }), existingDirs);
285 QStringList CSettingsSimulatorBasicsComponent::removeDirectories(
const QStringList &removeDirectories,
286 const QStringList &existingDirs)
288 if (existingDirs.isEmpty() || removeDirectories.isEmpty()) {
return existingDirs; }
289 const QStringList rDirs = CFileUtils::fixWindowsUncPaths(removeDirectories);
290 const QStringList eDirs = CFileUtils::fixWindowsUncPaths(existingDirs);
292 for (
const QString &dir : eDirs)
294 if (rDirs.contains(dir, m_fileCaseSensitivity)) {
continue; }
297 dirs.removeDuplicates();
298 dirs.sort(m_fileCaseSensitivity);
302 void CSettingsSimulatorBasicsComponent::displayExcludeDirectoryPatterns(
const QStringList &dirs)
304 QStringList cleanedDirs(dirs);
305 cleanedDirs.removeDuplicates();
306 cleanedDirs.sort(m_fileCaseSensitivity);
307 const QString d = cleanedDirs.join(
"\n");
308 ui->pte_ExcludeDirectories->setPlainText(d);
311 void CSettingsSimulatorBasicsComponent::displayModelDirectories(
const QStringList &dirs)
313 QStringList cleanedDirs(dirs);
314 cleanedDirs.removeDuplicates();
315 cleanedDirs.sort(m_fileCaseSensitivity);
316 const QString d = cleanedDirs.join(
"\n");
317 ui->pte_ModelDirectories->setPlainText(d);
318 this->displayDefaultValuesAsPlaceholder(ui->comp_SimulatorSelector->getValue());
327 void CSettingsSimulatorBasicsComponent::displaySettings(
const CSimulatorInfo &simulator)
339 void CSettingsSimulatorBasicsComponent::displayDefaultValuesAsPlaceholder(
const CSimulatorInfo &simulator)
341 const QString simDir = this->getFileBrowserSimulatorDirectory();
342 ui->le_SimulatorDirectory->setPlaceholderText(simDir.isEmpty() ?
"Simulator directory" : simDir);
349 if (m.isEmpty()) { ui->pte_ModelDirectories->setPlaceholderText(
"Model directories"); }
352 const QString ms = m.join(
"\n");
353 ui->pte_ModelDirectories->setPlaceholderText(ms);
357 if (e.isEmpty()) { ui->pte_ExcludeDirectories->setPlaceholderText(
"Exclude directories"); }
360 const QString es = e.join(
"\n");
361 ui->pte_ExcludeDirectories->setPlaceholderText(es);
365 QString CSettingsSimulatorBasicsComponent::getFileBrowserModelDirectory()
const
367 const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
368 const QStringList modelDirs(this->parseDirectories(ui->pte_ModelDirectories->toPlainText()));
369 QString md = modelDirs.isEmpty() ?
"" : modelDirs.first();
371 if (md.isEmpty()) { md = this->getFileBrowserSimulatorDirectory(); }
372 return CFileUtils::normalizeFilePathToQtStandard(md);
375 QString CSettingsSimulatorBasicsComponent::getFileBrowserSimulatorDirectory()
const
377 const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
378 QString sd(ui->le_SimulatorDirectory->text().trimmed());
380 return CFileUtils::normalizeFilePathToQtStandard(sd);
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.
void showOverlayMessagesOrHTMLMessage(const swift::misc::CStatusMessageList &messages, bool appendOldMessages=false, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
Show multiple messages or a single message (HTML)
Using this class provides a QFrame with the overlay functionality already integrated.
Driver independent parts of simulator settings, ie those one are also used independent of the driver.
void hideSelector(bool show)
Show / hide selector.
virtual ~CSettingsSimulatorBasicsComponent()
Destructor.
bool hasAnyValues() const
Any values filled in.
void setSimulator(const swift::misc::simulation::CSimulatorInfo &simulator)
Simulator.
void changed(const swift::misc::simulation::CSimulatorInfo &simulator)
Value has been changed.
static const QString & wizard()
Wizard.
static const QString & guiComponent()
GUI components.
Class for emitting a log message.
bool isEmpty() const
Message empty.
Derived & info(const char16_t(&format)[N])
Set the severity to info, providing a format string.
Streamable status message, e.g.
bool isSuccess() const
Operation considered successful.
Status messages, e.g. from Core -> GUI.
bool isSuccess() const
All messages are marked as success.
Simple hardcoded info about the corresponding simulator.
bool isSingleSimulator() const
Single simulator selected.
QString getFirstModelDirectoryOrDefault(const CSimulatorInfo &simulator) const
First model directoy.
void resetToDefaults(const CSimulatorInfo &simulator)
Reset to defaults.
CSpecializedSimulatorSettings getSpecializedSettings(const CSimulatorInfo &simulator) const
Specialized simulator settings.
QStringList getModelDirectoriesIfNotDefault(const CSimulatorInfo &simulator) const
Model directory or or empty if default.
const QStringList & defaultModelDirectories(const CSimulatorInfo &simulator) const
Default model path per simulator.
CSimulatorSettings getSettings(const CSimulatorInfo &simulator) const
Settings per simulator.
QStringList getModelExcludeDirectoryPatternsIfNotDefault(const CSimulatorInfo &simulator) const
Model exclude patterns or empty if default.
QString getSimulatorDirectoryOrDefault(const CSimulatorInfo &simulator) const
Simulator directory or default model path per simulator.
Settings for simulator Driver independent parts (such as directories), also used in model loaders.
void setModelDirectories(const QStringList &modelDirectories)
Set model directories.
void setSimulatorDirectory(const QString &simulatorDirectory)
Set simulator directory.
void setModelExcludeDirectories(const QStringList &excludeDirectories)
Set exclude directories.
const QString & getSimulatorDirectory() const
Simulator directory.
Allows to have specific utility functions for each simulator.
QStringList getModelDirectoriesFromSimulatorDirectoryOrDefault() const
Model directories, then from simulator directory, then default.
void setSimulatorDirectory(const QString &simDir)
Set simulator directory.
const QStringList & getDefaultModelExcludeDirectoryPatterns() const
Default model exclude patterns.
static const QStringList & defaultModelExcludeDirectoryPatterns(const CSimulatorInfo &simulator)
Default model exclude patterns per simulator.
static const QString & defaultSimulatorDirectory(const CSimulatorInfo &simulator)
Default simulator path per simulator.
High level reusable GUI components.
Free functions in swift::misc.