From 177ad4b38c41f1077168ead122df28739de415f4 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sun, 12 Jun 2016 03:48:48 +0200 Subject: [PATCH] refs #585, GUI component for settings (integrated in mapping tool for a 1st test) --- .../components/datasettingscomponent.ui | 79 ++++-- .../components/dbdebugdatabasesetup.ui | 19 +- .../settingssimulatorbasicscomponent.cpp | 259 ++++++++++++++++++ .../settingssimulatorbasicscomponent.h | 91 ++++++ .../settingssimulatorbasicscomponent.ui | 141 ++++++++++ 5 files changed, 552 insertions(+), 37 deletions(-) create mode 100644 src/blackgui/components/settingssimulatorbasicscomponent.cpp create mode 100644 src/blackgui/components/settingssimulatorbasicscomponent.h create mode 100644 src/blackgui/components/settingssimulatorbasicscomponent.ui 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 +
+
+ + +