diff --git a/src/blackgui/components/datasettingscomponent.ui b/src/blackgui/components/datasettingscomponent.ui
index f63ca3300..12c2750c6 100644
--- a/src/blackgui/components/datasettingscomponent.ui
+++ b/src/blackgui/components/datasettingscomponent.ui
@@ -7,7 +7,7 @@
0
0
400
- 364
+ 497
@@ -32,14 +32,42 @@
4
- -
-
-
-
- 0
- 150
-
+
-
+
+
+ swift DB
+
+
-
+
+
+
+ 0
+ 40
+
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
+ -
+
+
+
+ 0
+ 150
+
+
+ comp_DebugDb
+ comp_DebugDb
+ comp_DebugDb
+
+
+
-
@@ -91,20 +119,23 @@
- -
-
-
-
- 0
- 40
-
-
-
- QFrame::StyledPanel
-
-
- QFrame::Raised
+
-
+
+
+ Simulator
+
+
-
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
+
@@ -128,6 +159,12 @@
blackgui/components/distributorpreferencescomponent.h
1
+
+ BlackGui::Components::CSettingsSimulatorBasicsComponent
+ QFrame
+ blackgui/components/settingssimulatorbasicscomponent.h
+ 1
+
diff --git a/src/blackgui/components/dbdebugdatabasesetup.ui b/src/blackgui/components/dbdebugdatabasesetup.ui
index 658d9713c..d607993fe 100644
--- a/src/blackgui/components/dbdebugdatabasesetup.ui
+++ b/src/blackgui/components/dbdebugdatabasesetup.ui
@@ -6,8 +6,8 @@
0
0
- 129
- 79
+ 130
+ 35
@@ -20,7 +20,7 @@
QFrame::Raised
- -
+
-
@@ -34,19 +34,6 @@
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
diff --git a/src/blackgui/components/settingssimulatorbasicscomponent.cpp b/src/blackgui/components/settingssimulatorbasicscomponent.cpp
new file mode 100644
index 000000000..6818b82ec
--- /dev/null
+++ b/src/blackgui/components/settingssimulatorbasicscomponent.cpp
@@ -0,0 +1,259 @@
+/* Copyright (C) 2016
+ * swift project Community / Contributors
+ *
+ * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
+ * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
+ * including this file, may be copied, modified, propagated, or distributed except according to the terms
+ * contained in the LICENSE file.
+ */
+
+#include "settingssimulatorbasicscomponent.h"
+#include "ui_settingssimulatorbasicscomponent.h"
+#include "blackmisc/fileutils.h"
+#include "blackmisc/logmessage.h"
+#include "blackconfig/buildconfig.h"
+
+using namespace BlackMisc;
+using namespace BlackMisc::Simulation;
+using namespace BlackMisc::Simulation::Settings;
+using namespace BlackConfig;
+
+namespace BlackGui
+{
+ namespace Components
+ {
+ CSettingsSimulatorBasicsComponent::CSettingsSimulatorBasicsComponent(QWidget *parent) :
+ QFrame(parent),
+ ui(new Ui::CSettingsSimulatorBasicsComponent)
+ {
+ ui->setupUi(this);
+ this->setSmallLayout(true); // no disadvantage, so I always set it
+ ui->comp_SimulatorSelector->setMode(CSimulatorSelector::RadioButtons);
+ ui->comp_SimulatorSelector->setToLastSelection();
+ connect(ui->pb_ExcludeFileDialog, &QPushButton::clicked, this, &CSettingsSimulatorBasicsComponent::ps_excludeFileDialog);
+ connect(ui->pb_ModelFileDialog, &QPushButton::clicked, this, &CSettingsSimulatorBasicsComponent::ps_modelFileDialog);
+ connect(ui->pb_SimulatorFileDialog, &QPushButton::clicked, this, &CSettingsSimulatorBasicsComponent::ps_simulatorFileDialog);
+ connect(ui->pb_Save, &QPushButton::clicked, this, &CSettingsSimulatorBasicsComponent::ps_save);
+ connect(ui->pb_Reset, &QPushButton::clicked, this, &CSettingsSimulatorBasicsComponent::ps_reset);
+ connect(ui->pb_CopyDefaults, &QPushButton::clicked, this, &CSettingsSimulatorBasicsComponent::ps_copyDefaults);
+ connect(ui->comp_SimulatorSelector, &CSimulatorSelector::changed, this, &CSettingsSimulatorBasicsComponent::ps_simulatorChanged);
+ connect(ui->le_ModelDirectory, &QLineEdit::returnPressed, this, &CSettingsSimulatorBasicsComponent::ps_modelDirectoryEntered);
+ connect(ui->le_SimulatorDirectory, &QLineEdit::returnPressed, this, &CSettingsSimulatorBasicsComponent::ps_simulatorDirectoryEntered);
+
+ const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
+ this->displayDefaultValuesAsPlaceholder(simulator);
+ }
+
+ CSettingsSimulatorBasicsComponent::~CSettingsSimulatorBasicsComponent()
+ { }
+
+ void CSettingsSimulatorBasicsComponent::hideSelector(bool show)
+ {
+ ui->comp_SimulatorSelector->setVisible(show);
+ }
+
+ void CSettingsSimulatorBasicsComponent::setSimulator(const CSimulatorInfo &simulator)
+ {
+ Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "Need single simulator");
+ ui->comp_SimulatorSelector->setValue(simulator);
+ }
+
+ void CSettingsSimulatorBasicsComponent::setSmallLayout(bool small)
+ {
+ ui->lbl_ExcludeDirectories->setWordWrap(small);
+ ui->lbl_ModelDirectory->setWordWrap(small);
+ ui->lbl_SimulatorDirectory->setWordWrap(small);
+ }
+
+ void CSettingsSimulatorBasicsComponent::ps_simulatorFileDialog()
+ {
+ const QString startDirectory = this->getBestCurrentSimulatorDirectory();
+ const QString dir = QFileDialog::getExistingDirectory(this, tr("Simulator directory"), startDirectory,
+ QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+ if (dir.isEmpty()) { return; }
+ ui->le_SimulatorDirectory->setText(CFileUtils::normalizeFilePathToQtStandard(dir));
+ }
+
+ void CSettingsSimulatorBasicsComponent::ps_modelFileDialog()
+ {
+ const QString startDirectory = this->getBestCurrentModelDirectory();
+ const QString dir = QFileDialog::getExistingDirectory(this, tr("Model directory"), startDirectory,
+ QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+ if (dir.isEmpty()) { return; }
+ ui->le_ModelDirectory->setText(CFileUtils::normalizeFilePathToQtStandard(dir));
+ }
+
+ void CSettingsSimulatorBasicsComponent::ps_excludeFileDialog()
+ {
+ const QString startDirectory = this->getBestCurrentModelDirectory();
+ const QString dir = QFileDialog::getExistingDirectory(this, tr("Exclude directory"), startDirectory,
+ QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+ if (dir.isEmpty()) { return; }
+ this->addExcludeDirectoryPattern(dir);
+ }
+
+ void CSettingsSimulatorBasicsComponent::ps_simulatorDirectoryEntered()
+ {
+ const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
+ const QString sd = CFileUtils::normalizeFilePathToQtStandard(ui->le_SimulatorDirectory->text().trimmed());
+ ui->le_SimulatorDirectory->setText(sd);
+ this->displayDefaultValuesAsPlaceholder(simulator);
+ }
+
+ void CSettingsSimulatorBasicsComponent::ps_modelDirectoryEntered()
+ {
+ const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
+ const QString md = CFileUtils::normalizeFilePathToQtStandard(ui->le_ModelDirectory->text().trimmed());
+ ui->le_ModelDirectory->setText(md);
+ this->displayDefaultValuesAsPlaceholder(simulator);
+ }
+
+ void CSettingsSimulatorBasicsComponent::ps_save()
+ {
+ const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
+ CSettingsSimulator s = this->getSettings(simulator);
+ const QString sd(ui->le_SimulatorDirectory->text().trimmed());
+ const QString md(ui->le_ModelDirectory->text().trimmed());
+ const QStringList ed(this->parseExcludeDirectories());
+ const QStringList red = CFileUtils::makeDirectoriesRelative(ed, this->getBestCurrentModelDirectory(), this->m_fileCaseSensitivity);
+ s.setSimulatorDirectory(sd);
+ s.setModelDirectory(md);
+ s.setModelExcludeDirectories(red);
+ const CStatusMessage m = this->m_settings.setAndSaveSettings(s, simulator);
+ if (!m.isEmpty())
+ {
+ CLogMessage::preformatted(m);
+ }
+
+ // display as saved
+ this->displaySettings(simulator);
+ }
+
+ void CSettingsSimulatorBasicsComponent::ps_copyDefaults()
+ {
+ const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
+ const QString sd(this->m_settings.getDefaultSimulatorDirectory(simulator));
+ ui->le_SimulatorDirectory->setText(CFileUtils::normalizeFilePathToQtStandard(sd));
+ const QString md(this->m_settings.getDefaultModelDirectory(simulator));
+ ui->le_ModelDirectory->setText(CFileUtils::normalizeFilePathToQtStandard(md));
+ const QStringList excludes(this->m_settings.getDefaultModelExcludeDirectoryPatterns(simulator));
+ this->displayExcludeDirectoryPatterns(excludes, md);
+ }
+
+ void CSettingsSimulatorBasicsComponent::ps_reset()
+ {
+ const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
+ ui->le_SimulatorDirectory->clear();
+ ui->le_ModelDirectory->clear();
+ ui->pte_ExcludeDirectories->clear();
+ this->displayDefaultValuesAsPlaceholder(simulator);
+ this->m_settings.resetToDefaults(simulator);
+ CLogMessage(this).info("Reset values for settings of %1") << simulator.toQString(true);
+ }
+
+ void CSettingsSimulatorBasicsComponent::ps_simulatorChanged()
+ {
+ const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
+ this->displayDefaultValuesAsPlaceholder(simulator);
+ this->displaySettings(simulator);
+ }
+
+ QStringList CSettingsSimulatorBasicsComponent::parseExcludeDirectories() const
+ {
+ const QString raw = ui->pte_ExcludeDirectories->toPlainText().trimmed();
+ if (raw.isEmpty()) { return QStringList(); }
+ QStringList rawLines = raw.split(QRegExp("\n|\r\n|\r"));
+ QStringList dirs;
+ for (const QString &l : rawLines)
+ {
+ const QString normalized = CFileUtils::normalizeFilePathToQtStandard(l);
+ if (normalized.isEmpty()) { continue; }
+ dirs.push_back(normalized);
+ }
+ dirs.removeDuplicates();
+ dirs.sort(this->m_fileCaseSensitivity);
+ return dirs;
+ }
+
+ void CSettingsSimulatorBasicsComponent::addExcludeDirectoryPattern(const QString &excludeDirectoryPattern)
+ {
+ const QString d(CFileUtils::normalizeFilePathToQtStandard(excludeDirectoryPattern));
+ if (d.isEmpty()) { return; }
+ QStringList dirs = this->parseExcludeDirectories();
+ if (!dirs.contains(d, this->m_fileCaseSensitivity))
+ {
+ dirs.push_back(d);
+ }
+ dirs.removeDuplicates();
+ dirs.sort(this->m_fileCaseSensitivity);
+ this->displayExcludeDirectoryPatterns(dirs, ui->le_ModelDirectory->text().trimmed());
+ }
+
+ void CSettingsSimulatorBasicsComponent::displayExcludeDirectoryPatterns(const QStringList &dirs, const QString &modelDir)
+ {
+ const QStringList relativeDirectories = CFileUtils::makeDirectoriesRelative(dirs, modelDir);
+ const QString d = relativeDirectories.join("\n");
+ ui->pte_ExcludeDirectories->setPlainText(d);
+ }
+
+ CSettingsSimulator CSettingsSimulatorBasicsComponent::getSettings(const CSimulatorInfo &simulator) const
+ {
+ const CSettingsSimulator s = this->m_settings.getSettings(simulator);
+ return s;
+ }
+
+ void CSettingsSimulatorBasicsComponent::displaySettings(const CSimulatorInfo &simulator)
+ {
+ const CSettingsSimulator s = this->getSettings(simulator);
+ this->displayExcludeDirectoryPatterns(s.getModelExcludeDirectoryPatterns(), s.getModelDirectory());
+ ui->le_SimulatorDirectory->setText(s.getSimulatorDirectory());
+ ui->le_ModelDirectory->setText(s.getModelDirectory());
+ }
+
+ void CSettingsSimulatorBasicsComponent::displayDefaultValuesAsPlaceholder(const CSimulatorInfo &simulator)
+ {
+ const QString s = this->m_settings.getDefaultSimulatorDirectory(simulator);
+ ui->le_SimulatorDirectory->setPlaceholderText(s.isEmpty() ? "Simulator directory" : s);
+
+ const QString m = this->m_settings.getDefaultModelDirectory(simulator);
+ ui->le_ModelDirectory->setPlaceholderText(m.isEmpty() ? "Model directory" : m);
+
+ const QStringList e = this->m_settings.getDefaultModelExcludeDirectoryPatterns(simulator);
+ if (e.isEmpty())
+ {
+ ui->pte_ExcludeDirectories->setPlaceholderText("Exclude directories");
+ }
+ else
+ {
+ const QString es(e.join('\n'));
+ ui->pte_ExcludeDirectories->setPlaceholderText(es);
+ }
+ }
+
+ QString CSettingsSimulatorBasicsComponent::getBestCurrentModelDirectory() const
+ {
+ const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
+ QString md(ui->le_ModelDirectory->text().trimmed());
+ if (md.isEmpty())
+ {
+ md = this->m_settings.getModelDirectoryOrDefault(simulator);
+ }
+ if (md.isEmpty())
+ {
+ md = this->getBestCurrentSimulatorDirectory();
+ }
+ return CFileUtils::normalizeFilePathToQtStandard(md);
+ }
+
+ QString CSettingsSimulatorBasicsComponent::getBestCurrentSimulatorDirectory() const
+ {
+ const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
+ QString sd(ui->le_SimulatorDirectory->text().trimmed());
+ if (sd.isEmpty())
+ {
+ sd = this->m_settings.getSimulatorDirectoryOrDefault(simulator);
+ }
+ return CFileUtils::normalizeFilePathToQtStandard(sd);
+ }
+ } // ns
+} // ns
diff --git a/src/blackgui/components/settingssimulatorbasicscomponent.h b/src/blackgui/components/settingssimulatorbasicscomponent.h
new file mode 100644
index 000000000..7c3f7dd8e
--- /dev/null
+++ b/src/blackgui/components/settingssimulatorbasicscomponent.h
@@ -0,0 +1,91 @@
+/* Copyright (C) 2016
+ * swift project Community / Contributors
+ *
+ * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
+ * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
+ * including this file, may be copied, modified, propagated, or distributed except according to the terms
+ * contained in the LICENSE file.
+ */
+
+//! \file
+
+#ifndef BLACKGUI_COMPONENTS_SETTINGSSIMULATORBASICSCOMPONENT_H
+#define BLACKGUI_COMPONENTS_SETTINGSSIMULATORBASICSCOMPONENT_H
+
+#include "blackmisc/simulation/settings/settingssimulator.h"
+#include
+#include
+
+namespace Ui { class CSettingsSimulatorBasicsComponent; }
+namespace BlackGui
+{
+ namespace Components
+ {
+ /*!
+ * Driver independent parts of simulator settings, ie those one are also used independent of the driver.
+ * Example: model paths used in loaders
+ */
+ class CSettingsSimulatorBasicsComponent : public QFrame
+ {
+ Q_OBJECT
+
+ public:
+ //! Constructor
+ explicit CSettingsSimulatorBasicsComponent(QWidget *parent = nullptr);
+
+ //! Destructor
+ virtual ~CSettingsSimulatorBasicsComponent();
+
+ //! Show / hide selector
+ void hideSelector(bool show);
+
+ //! Simulator
+ void setSimulator(const BlackMisc::Simulation::CSimulatorInfo &simulator);
+
+ private slots:
+ void ps_modelFileDialog();
+ void ps_excludeFileDialog();
+ void ps_simulatorFileDialog();
+ void ps_simulatorDirectoryEntered();
+ void ps_modelDirectoryEntered();
+ void ps_save();
+ void ps_copyDefaults();
+ void ps_reset();
+ void ps_simulatorChanged();
+
+ private:
+ QScopedPointer ui;
+ BlackMisc::Simulation::Settings::CMultiSimulatorSimulatorSettings m_settings { this };
+ Qt::CaseSensitivity m_fileCaseSensitivity = BlackMisc::CFileUtils::osFileNameCaseSensitivity();
+
+ //! Optimize for small layout
+ void setSmallLayout(bool small);
+
+ //! Exclude directories from line edit
+ QStringList parseExcludeDirectories() const;
+
+ //! Add an exclude directory
+ void addExcludeDirectoryPattern(const QString &excludeDirectoryPattern);
+
+ //! Display the directories
+ void displayExcludeDirectoryPatterns(const QStringList &dirs, const QString &modelDir);
+
+ //! Current settings
+ BlackMisc::Simulation::Settings::CSettingsSimulator getSettings(const BlackMisc::Simulation::CSimulatorInfo &simulator) const;
+
+ //! Display simulator`s settings
+ void displaySettings(const BlackMisc::Simulation::CSimulatorInfo &simulator);
+
+ //! Default values for simulator displayed as placeholder text
+ void displayDefaultValuesAsPlaceholder(const BlackMisc::Simulation::CSimulatorInfo &simulator);
+
+ //! Model directory either from input or settings or default
+ QString getBestCurrentModelDirectory() const;
+
+ //! Simulator directory either from input or settings or default
+ QString getBestCurrentSimulatorDirectory() const;
+ };
+ } // ns
+} // ns
+
+#endif // guard
diff --git a/src/blackgui/components/settingssimulatorbasicscomponent.ui b/src/blackgui/components/settingssimulatorbasicscomponent.ui
new file mode 100644
index 000000000..3468d4c9f
--- /dev/null
+++ b/src/blackgui/components/settingssimulatorbasicscomponent.ui
@@ -0,0 +1,141 @@
+
+
+ CSettingsSimulatorBasicsComponent
+
+
+
+ 0
+ 0
+ 400
+ 300
+
+
+
+ Frame
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+ -
+
+
+ copy defaults
+
+
+
+ -
+
+
+ ...
+
+
+
+ -
+
+
+ Model directory path
+
+
+
+ -
+
+
+ Excluded from model loading
+
+
+ Exclude directories:
+
+
+
+ -
+
+
+ save
+
+
+
+ -
+
+
+ reset
+
+
+
+ -
+
+
+ Model directory:
+
+
+
+ -
+
+
+ ...
+
+
+
+ -
+
+
+ Simulator directory;
+
+
+
+ -
+
+
+ Simulator directory path
+
+
+
+ -
+
+
+ Excluded directory patterns
+
+
+ QPlainTextEdit::NoWrap
+
+
+ Excluded directory patterns
+
+
+
+ -
+
+
+ ...
+
+
+
+ -
+
+
+
+ 175
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+
+ BlackGui::Components::CSimulatorSelector
+ QFrame
+ blackgui/components/simulatorselector.h
+ 1
+
+
+
+
+