refs #676, adjusted GUI to support 1..n model directories

This commit is contained in:
Klaus Basan
2016-06-18 00:29:25 +02:00
parent 0a0f8cf85c
commit 30b9900ea3
3 changed files with 112 additions and 84 deletions

View File

@@ -37,7 +37,6 @@ namespace BlackGui
connect(ui->pb_Reset, &QPushButton::clicked, this, &CSettingsSimulatorBasicsComponent::ps_reset); connect(ui->pb_Reset, &QPushButton::clicked, this, &CSettingsSimulatorBasicsComponent::ps_reset);
connect(ui->pb_CopyDefaults, &QPushButton::clicked, this, &CSettingsSimulatorBasicsComponent::ps_copyDefaults); connect(ui->pb_CopyDefaults, &QPushButton::clicked, this, &CSettingsSimulatorBasicsComponent::ps_copyDefaults);
connect(ui->comp_SimulatorSelector, &CSimulatorSelector::changed, this, &CSettingsSimulatorBasicsComponent::ps_simulatorChanged); 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); connect(ui->le_SimulatorDirectory, &QLineEdit::returnPressed, this, &CSettingsSimulatorBasicsComponent::ps_simulatorDirectoryEntered);
const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue()); const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
@@ -67,7 +66,7 @@ namespace BlackGui
void CSettingsSimulatorBasicsComponent::ps_simulatorFileDialog() void CSettingsSimulatorBasicsComponent::ps_simulatorFileDialog()
{ {
const QString startDirectory = this->getBestCurrentSimulatorDirectory(); const QString startDirectory = this->getFileBrowserSimulatorDirectory();
const QString dir = QFileDialog::getExistingDirectory(this, tr("Simulator directory"), startDirectory, const QString dir = QFileDialog::getExistingDirectory(this, tr("Simulator directory"), startDirectory,
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
if (dir.isEmpty()) { return; } if (dir.isEmpty()) { return; }
@@ -76,20 +75,22 @@ namespace BlackGui
void CSettingsSimulatorBasicsComponent::ps_modelFileDialog() void CSettingsSimulatorBasicsComponent::ps_modelFileDialog()
{ {
const QString startDirectory = this->getBestCurrentModelDirectory(); const QString startDirectory = this->getFileBrowserModelDirectory();
const QString dir = QFileDialog::getExistingDirectory(this, tr("Model directory"), startDirectory, const QString dir = QFileDialog::getExistingDirectory(this, tr("Model directory"), startDirectory,
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
if (dir.isEmpty()) { return; } if (dir.isEmpty()) { return; }
ui->le_ModelDirectory->setText(CFileUtils::normalizeFilePathToQtStandard(dir)); const QStringList newDirs = this->addDirectory(dir, this->parseDirectories(ui->pte_ModelDirectories->toPlainText()));
this->displayModelDirectories(newDirs);
} }
void CSettingsSimulatorBasicsComponent::ps_excludeFileDialog() void CSettingsSimulatorBasicsComponent::ps_excludeFileDialog()
{ {
const QString startDirectory = this->getBestCurrentModelDirectory(); const QString startDirectory = this->getFileBrowserModelDirectory();
const QString dir = QFileDialog::getExistingDirectory(this, tr("Exclude directory"), startDirectory, const QString dir = QFileDialog::getExistingDirectory(this, tr("Exclude directory"), startDirectory,
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
if (dir.isEmpty()) { return; } if (dir.isEmpty()) { return; }
this->addExcludeDirectoryPattern(dir); const QStringList newDirs = this->addDirectory(dir, this->parseDirectories(ui->pte_ExcludeDirectories->toPlainText()));
this->displayExcludeDirectoryPatterns(newDirs);
} }
void CSettingsSimulatorBasicsComponent::ps_simulatorDirectoryEntered() void CSettingsSimulatorBasicsComponent::ps_simulatorDirectoryEntered()
@@ -100,24 +101,16 @@ namespace BlackGui
this->displayDefaultValuesAsPlaceholder(simulator); 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() void CSettingsSimulatorBasicsComponent::ps_save()
{ {
const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue()); const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
CSettingsSimulator s = this->getSettings(simulator); CSettingsSimulator s = this->getSettings(simulator);
const QString sd(ui->le_SimulatorDirectory->text().trimmed()); const QString sd(ui->le_SimulatorDirectory->text().trimmed());
const QString md(ui->le_ModelDirectory->text().trimmed()); const QStringList md(this->parseDirectories(ui->pte_ModelDirectories->toPlainText()));
const QStringList ed(this->parseExcludeDirectories()); const QStringList ed(this->parseDirectories(ui->pte_ExcludeDirectories->toPlainText()));
const QStringList red = CFileUtils::makeDirectoriesRelative(ed, this->getBestCurrentModelDirectory(), this->m_fileCaseSensitivity); const QStringList red = CFileUtils::makeDirectoriesRelative(ed, this->getFileBrowserModelDirectory(), this->m_fileCaseSensitivity);
s.setSimulatorDirectory(sd); s.setSimulatorDirectory(sd);
s.setModelDirectory(md); s.setModelDirectories(md);
s.setModelExcludeDirectories(red); s.setModelExcludeDirectories(red);
const CStatusMessage m = this->m_settings.setAndSaveSettings(s, simulator); const CStatusMessage m = this->m_settings.setAndSaveSettings(s, simulator);
if (!m.isEmpty()) if (!m.isEmpty())
@@ -134,20 +127,21 @@ namespace BlackGui
const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue()); const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
const QString sd(this->m_settings.getDefaultSimulatorDirectory(simulator)); const QString sd(this->m_settings.getDefaultSimulatorDirectory(simulator));
ui->le_SimulatorDirectory->setText(CFileUtils::normalizeFilePathToQtStandard(sd)); ui->le_SimulatorDirectory->setText(CFileUtils::normalizeFilePathToQtStandard(sd));
const QString md(this->m_settings.getDefaultModelDirectory(simulator)); const QStringList md(this->m_settings.getDefaultModelDirectories(simulator));
ui->le_ModelDirectory->setText(CFileUtils::normalizeFilePathToQtStandard(md)); this->displayModelDirectories(md);
const QStringList excludes(this->m_settings.getDefaultModelExcludeDirectoryPatterns(simulator)); const QStringList excludes(this->m_settings.getDefaultModelExcludeDirectoryPatterns(simulator));
this->displayExcludeDirectoryPatterns(excludes, md); this->displayExcludeDirectoryPatterns(excludes);
} }
void CSettingsSimulatorBasicsComponent::ps_reset() void CSettingsSimulatorBasicsComponent::ps_reset()
{ {
const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue()); const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
this->m_settings.resetToDefaults(simulator);
ui->le_SimulatorDirectory->clear(); ui->le_SimulatorDirectory->clear();
ui->le_ModelDirectory->clear(); ui->pte_ModelDirectories->clear();
ui->pte_ExcludeDirectories->clear(); ui->pte_ExcludeDirectories->clear();
this->displayDefaultValuesAsPlaceholder(simulator); this->displayDefaultValuesAsPlaceholder(simulator);
this->m_settings.resetToDefaults(simulator);
CLogMessage(this).info("Reset values for settings of %1") << simulator.toQString(true); CLogMessage(this).info("Reset values for settings of %1") << simulator.toQString(true);
} }
@@ -158,44 +152,48 @@ namespace BlackGui
this->displaySettings(simulator); this->displaySettings(simulator);
} }
QStringList CSettingsSimulatorBasicsComponent::parseExcludeDirectories() const QStringList CSettingsSimulatorBasicsComponent::parseDirectories(const QString &rawString) const
{ {
const QString raw = ui->pte_ExcludeDirectories->toPlainText().trimmed(); const QString raw = rawString.trimmed();
if (raw.isEmpty()) { return QStringList(); } if (raw.isEmpty()) { return QStringList(); }
QStringList rawLines = raw.split(QRegExp("\n|\r\n|\r"));
QStringList dirs; QStringList dirs;
const QStringList rawLines = raw.split(QRegExp("\n|\r\n|\r"));
for (const QString &l : rawLines) for (const QString &l : rawLines)
{ {
const QString normalized = CFileUtils::normalizeFilePathToQtStandard(l); const QString normalized = CFileUtils::normalizeFilePathToQtStandard(l);
if (normalized.isEmpty()) { continue; } if (normalized.isEmpty()) { continue; }
dirs.push_back(normalized); dirs.push_back(normalized);
} }
dirs.removeDuplicates(); dirs = CFileUtils::removeSubDirectories(dirs);
dirs.sort(this->m_fileCaseSensitivity);
return dirs; return dirs;
} }
void CSettingsSimulatorBasicsComponent::addExcludeDirectoryPattern(const QString &excludeDirectoryPattern) QStringList CSettingsSimulatorBasicsComponent::addDirectory(const QString &directory, const QStringList &existingDirs)
{ {
const QString d(CFileUtils::normalizeFilePathToQtStandard(excludeDirectoryPattern)); const QString d(CFileUtils::normalizeFilePathToQtStandard(directory));
if (d.isEmpty()) { return; } QStringList dirs(existingDirs);
QStringList dirs = this->parseExcludeDirectories(); if (d.isEmpty()) { return existingDirs; }
if (!dirs.contains(d, this->m_fileCaseSensitivity)) if (!dirs.contains(d, this->m_fileCaseSensitivity))
{ {
dirs.push_back(d); dirs.push_back(d);
} }
dirs.removeDuplicates(); dirs.removeDuplicates();
dirs.sort(this->m_fileCaseSensitivity); dirs.sort(this->m_fileCaseSensitivity);
this->displayExcludeDirectoryPatterns(dirs, ui->le_ModelDirectory->text().trimmed()); return dirs;
} }
void CSettingsSimulatorBasicsComponent::displayExcludeDirectoryPatterns(const QStringList &dirs, const QString &modelDir) void CSettingsSimulatorBasicsComponent::displayExcludeDirectoryPatterns(const QStringList &dirs)
{ {
const QStringList relativeDirectories = CFileUtils::makeDirectoriesRelative(dirs, modelDir); const QString d = dirs.join("\n");
const QString d = relativeDirectories.join("\n");
ui->pte_ExcludeDirectories->setPlainText(d); ui->pte_ExcludeDirectories->setPlainText(d);
} }
void CSettingsSimulatorBasicsComponent::displayModelDirectories(const QStringList &dirs)
{
const QString d = dirs.join("\n");
ui->pte_ModelDirectories->setPlainText(d);
}
CSettingsSimulator CSettingsSimulatorBasicsComponent::getSettings(const CSimulatorInfo &simulator) const CSettingsSimulator CSettingsSimulatorBasicsComponent::getSettings(const CSimulatorInfo &simulator) const
{ {
const CSettingsSimulator s = this->m_settings.getSettings(simulator); const CSettingsSimulator s = this->m_settings.getSettings(simulator);
@@ -205,9 +203,9 @@ namespace BlackGui
void CSettingsSimulatorBasicsComponent::displaySettings(const CSimulatorInfo &simulator) void CSettingsSimulatorBasicsComponent::displaySettings(const CSimulatorInfo &simulator)
{ {
const CSettingsSimulator s = this->getSettings(simulator); const CSettingsSimulator s = this->getSettings(simulator);
this->displayExcludeDirectoryPatterns(s.getModelExcludeDirectoryPatterns(), s.getModelDirectory()); this->displayExcludeDirectoryPatterns(s.getModelExcludeDirectoryPatterns());
this->displayModelDirectories(s.getModelDirectories());
ui->le_SimulatorDirectory->setText(s.getSimulatorDirectory()); ui->le_SimulatorDirectory->setText(s.getSimulatorDirectory());
ui->le_ModelDirectory->setText(s.getModelDirectory());
} }
void CSettingsSimulatorBasicsComponent::displayDefaultValuesAsPlaceholder(const CSimulatorInfo &simulator) void CSettingsSimulatorBasicsComponent::displayDefaultValuesAsPlaceholder(const CSimulatorInfo &simulator)
@@ -215,8 +213,16 @@ namespace BlackGui
const QString s = this->m_settings.getDefaultSimulatorDirectory(simulator); const QString s = this->m_settings.getDefaultSimulatorDirectory(simulator);
ui->le_SimulatorDirectory->setPlaceholderText(s.isEmpty() ? "Simulator directory" : s); ui->le_SimulatorDirectory->setPlaceholderText(s.isEmpty() ? "Simulator directory" : s);
const QString m = this->m_settings.getDefaultModelDirectory(simulator); const QStringList m = this->m_settings.getDefaultModelDirectories(simulator);
ui->le_ModelDirectory->setPlaceholderText(m.isEmpty() ? "Model directory" : m); if (m.isEmpty())
{
ui->pte_ModelDirectories->setPlaceholderText("Model directories");
}
else
{
const QString ms(m.join('\n'));
ui->pte_ModelDirectories->setPlaceholderText(ms);
}
const QStringList e = this->m_settings.getDefaultModelExcludeDirectoryPatterns(simulator); const QStringList e = this->m_settings.getDefaultModelExcludeDirectoryPatterns(simulator);
if (e.isEmpty()) if (e.isEmpty())
@@ -230,22 +236,23 @@ namespace BlackGui
} }
} }
QString CSettingsSimulatorBasicsComponent::getBestCurrentModelDirectory() const QString CSettingsSimulatorBasicsComponent::getFileBrowserModelDirectory() const
{ {
const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue()); const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
QString md(ui->le_ModelDirectory->text().trimmed()); const QStringList modelDirs(this->parseDirectories(ui->pte_ModelDirectories->toPlainText()));
QString md = modelDirs.isEmpty() ? "" : modelDirs.first();
if (md.isEmpty()) if (md.isEmpty())
{ {
md = this->m_settings.getModelDirectoryOrDefault(simulator); md = this->m_settings.getFirstModelDirectoryOrDefault(simulator);
} }
if (md.isEmpty()) if (md.isEmpty())
{ {
md = this->getBestCurrentSimulatorDirectory(); md = this->getFileBrowserSimulatorDirectory();
} }
return CFileUtils::normalizeFilePathToQtStandard(md); return CFileUtils::normalizeFilePathToQtStandard(md);
} }
QString CSettingsSimulatorBasicsComponent::getBestCurrentSimulatorDirectory() const QString CSettingsSimulatorBasicsComponent::getFileBrowserSimulatorDirectory() const
{ {
const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue()); const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
QString sd(ui->le_SimulatorDirectory->text().trimmed()); QString sd(ui->le_SimulatorDirectory->text().trimmed());

View File

@@ -47,7 +47,6 @@ namespace BlackGui
void ps_excludeFileDialog(); void ps_excludeFileDialog();
void ps_simulatorFileDialog(); void ps_simulatorFileDialog();
void ps_simulatorDirectoryEntered(); void ps_simulatorDirectoryEntered();
void ps_modelDirectoryEntered();
void ps_save(); void ps_save();
void ps_copyDefaults(); void ps_copyDefaults();
void ps_reset(); void ps_reset();
@@ -62,13 +61,16 @@ namespace BlackGui
void setSmallLayout(bool small); void setSmallLayout(bool small);
//! Exclude directories from line edit //! Exclude directories from line edit
QStringList parseExcludeDirectories() const; QStringList parseDirectories(const QString &rawString) const;
//! Add an exclude directory //! Add a directory
void addExcludeDirectoryPattern(const QString &excludeDirectoryPattern); QStringList addDirectory(const QString &directory, const QStringList &existingDirs);
//! Display the directories //! Display the directories
void displayExcludeDirectoryPatterns(const QStringList &dirs, const QString &modelDir); void displayExcludeDirectoryPatterns(const QStringList &dirs);
//! Display the directories
void displayModelDirectories(const QStringList &dirs);
//! Current settings //! Current settings
BlackMisc::Simulation::Settings::CSettingsSimulator getSettings(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; BlackMisc::Simulation::Settings::CSettingsSimulator getSettings(const BlackMisc::Simulation::CSimulatorInfo &simulator) const;
@@ -80,10 +82,10 @@ namespace BlackGui
void displayDefaultValuesAsPlaceholder(const BlackMisc::Simulation::CSimulatorInfo &simulator); void displayDefaultValuesAsPlaceholder(const BlackMisc::Simulation::CSimulatorInfo &simulator);
//! Model directory either from input or settings or default //! Model directory either from input or settings or default
QString getBestCurrentModelDirectory() const; QString getFileBrowserModelDirectory() const;
//! Simulator directory either from input or settings or default //! Simulator directory either from input or settings or default
QString getBestCurrentSimulatorDirectory() const; QString getFileBrowserSimulatorDirectory() const;
}; };
} // ns } // ns
} // ns } // ns

View File

@@ -20,62 +20,51 @@
<enum>QFrame::Raised</enum> <enum>QFrame::Raised</enum>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="4" column="4"> <item row="5" column="4">
<widget class="QPushButton" name="pb_CopyDefaults"> <widget class="QPushButton" name="pb_CopyDefaults">
<property name="toolTip">
<string>copy (materialize) defaults</string>
</property>
<property name="text"> <property name="text">
<string>copy defaults</string> <string>copy def.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="4"> <item row="1" column="4" alignment="Qt::AlignTop">
<widget class="QPushButton" name="pb_ModelFileDialog"> <widget class="QPushButton" name="pb_ModelFileDialog">
<property name="text"> <property name="text">
<string>...</string> <string>...</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="2"> <item row="3" column="0" alignment="Qt::AlignTop">
<widget class="QLineEdit" name="le_ModelDirectory">
<property name="placeholderText">
<string>Model directory path</string>
</property>
</widget>
</item>
<item row="2" column="0" alignment="Qt::AlignTop">
<widget class="QLabel" name="lbl_ExcludeDirectories"> <widget class="QLabel" name="lbl_ExcludeDirectories">
<property name="toolTip"> <property name="toolTip">
<string>Excluded from model loading</string> <string>Excluded from model loading</string>
</property> </property>
<property name="text"> <property name="text">
<string>Exclude directories:</string> <string>Exclude directory patterns:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="4"> <item row="0" column="4">
<widget class="QPushButton" name="pb_Save"> <widget class="QPushButton" name="pb_SimulatorFileDialog">
<property name="text"> <property name="text">
<string>save</string> <string>...</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="4"> <item row="4" column="4">
<widget class="QPushButton" name="pb_Reset"> <widget class="QPushButton" name="pb_Reset">
<property name="text"> <property name="text">
<string>reset</string> <string>reset</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="1" column="0" alignment="Qt::AlignTop">
<widget class="QLabel" name="lbl_ModelDirectory"> <widget class="QLabel" name="lbl_ModelDirectory">
<property name="text"> <property name="text">
<string>Model directory:</string> <string>Model directories:</string>
</property>
</widget>
</item>
<item row="2" column="4" alignment="Qt::AlignTop">
<widget class="QPushButton" name="pb_ExcludeFileDialog">
<property name="text">
<string>...</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -86,6 +75,20 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="4">
<widget class="QPushButton" name="pb_Save">
<property name="text">
<string>save</string>
</property>
</widget>
</item>
<item row="3" column="4" alignment="Qt::AlignTop">
<widget class="QPushButton" name="pb_ExcludeFileDialog">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="0" column="2"> <item row="0" column="2">
<widget class="QLineEdit" name="le_SimulatorDirectory"> <widget class="QLineEdit" name="le_SimulatorDirectory">
<property name="placeholderText"> <property name="placeholderText">
@@ -93,7 +96,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="2" rowspan="4"> <item row="3" column="2" rowspan="4">
<widget class="QPlainTextEdit" name="pte_ExcludeDirectories"> <widget class="QPlainTextEdit" name="pte_ExcludeDirectories">
<property name="documentTitle"> <property name="documentTitle">
<string>Excluded directory patterns</string> <string>Excluded directory patterns</string>
@@ -106,19 +109,19 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="4"> <item row="1" column="2">
<widget class="QPushButton" name="pb_SimulatorFileDialog"> <widget class="QPlainTextEdit" name="pte_ModelDirectories">
<property name="text"> <property name="placeholderText">
<string>...</string> <string>Model directories</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="0" colspan="4" alignment="Qt::AlignRight"> <item row="7" column="0" colspan="4" alignment="Qt::AlignRight">
<widget class="BlackGui::Components::CSimulatorSelector" name="comp_SimulatorSelector"> <widget class="BlackGui::Components::CSimulatorSelector" name="comp_SimulatorSelector">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>175</width> <width>175</width>
<height>0</height> <height>25</height>
</size> </size>
</property> </property>
<property name="lineWidth"> <property name="lineWidth">
@@ -126,6 +129,22 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="8" column="0">
<spacer name="vs_Footer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</widget> </widget>
<customwidgets> <customwidgets>