From 63bbb1dd4a2ef26eb6ebbaf1e842a6902f3c02d4 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 31 May 2021 17:40:06 -0400 Subject: [PATCH] feat: better file dialog behavior during and between runs --- src/hobbits-core/settingsdata.cpp | 3 - src/hobbits-core/settingsmanager.cpp | 5 +- src/hobbits-core/settingsmanager.h | 5 +- src/hobbits-gui/mainwindow.cpp | 25 ++++---- .../BitContainerData/bitcontainerdata.cpp | 21 ++++--- .../importerexporters/FileData/filedata.cpp | 6 -- .../importerexporters/HexString/hexstring.cpp | 5 -- .../HexString/hexstringimportform.cpp | 22 ++++--- src/hobbits-widgets/batcheditor.cpp | 41 +++++++------ src/hobbits-widgets/parametereditordialog.cpp | 2 + .../parametereditorfileselect.cpp | 36 +++++++++-- .../parametereditorfileselect.h | 3 +- src/hobbits-widgets/widgetssettings.cpp | 59 +++++++++++++++++++ src/hobbits-widgets/widgetssettings.h | 15 +++++ 14 files changed, 175 insertions(+), 73 deletions(-) diff --git a/src/hobbits-core/settingsdata.cpp b/src/hobbits-core/settingsdata.cpp index 4f5e915e..1c1f75f1 100644 --- a/src/hobbits-core/settingsdata.cpp +++ b/src/hobbits-core/settingsdata.cpp @@ -156,9 +156,6 @@ void SettingsData::initialize() m_privateSettings.insert(SettingsManager::WINDOW_SIZE_KEY, QSize(640, 480)); m_privateSettings.insert(SettingsManager::WINDOW_POSITION_KEY, QPoint(100, 100)); - m_privateSettings.insert(SettingsManager::LAST_BATCH_PATH_KEY, QDir::homePath()); - m_privateSettings.insert(SettingsManager::LAST_IMPORT_EXPORT_PATH_KEY, QDir::homePath()); - m_privateSettings.insert(SettingsManager::LAST_CONTAINER_PATH_KEY, QDir::homePath()); m_pluginLoaderSettings.insert(SettingsManager::PLUGIN_PATH_KEY, HobbitsCoreConfig::PLUGINS_DEFAULT_PATH); m_pluginLoaderSettings.insert(SettingsManager::PLUGIN_BLACKLIST_KEY, QStringList({})); diff --git a/src/hobbits-core/settingsmanager.cpp b/src/hobbits-core/settingsmanager.cpp index 8e6757cf..e960a740 100644 --- a/src/hobbits-core/settingsmanager.cpp +++ b/src/hobbits-core/settingsmanager.cpp @@ -23,9 +23,8 @@ const QString SettingsManager::DISPLAY_DISPLAY_ORDER_KEY = "Display Display Orde const QString SettingsManager::WINDOW_SIZE_KEY = "window_size"; const QString SettingsManager::WINDOW_POSITION_KEY = "window_position"; const QString SettingsManager::WINDOW_STATE_KEY = "window_state"; -const QString SettingsManager::LAST_BATCH_PATH_KEY = "last_batch_path"; -const QString SettingsManager::LAST_IMPORT_EXPORT_PATH_KEY = "last_import_export_path"; -const QString SettingsManager::LAST_CONTAINER_PATH_KEY = "last_container_path"; +const QString SettingsManager::LAST_BATCH_KEY = "last_batch"; +const QString SettingsManager::LAST_IMPORT_EXPORT_KEY = "last_import_export"; const QString SettingsManager::PLUGINS_RUNNING_KEY = "plugins_running"; const QString SettingsManager::PYTHON_HOME_KEY = "python_home_dir"; diff --git a/src/hobbits-core/settingsmanager.h b/src/hobbits-core/settingsmanager.h index ae74a0f2..2ad66874 100644 --- a/src/hobbits-core/settingsmanager.h +++ b/src/hobbits-core/settingsmanager.h @@ -75,9 +75,8 @@ class HOBBITSCORESHARED_EXPORT SettingsManager static const QString OPERATOR_DISPLAY_ORDER_KEY; static const QString ANALYZER_DISPLAY_ORDER_KEY; static const QString DISPLAY_DISPLAY_ORDER_KEY; - static const QString LAST_BATCH_PATH_KEY; - static const QString LAST_IMPORT_EXPORT_PATH_KEY; - static const QString LAST_CONTAINER_PATH_KEY; + static const QString LAST_BATCH_KEY; + static const QString LAST_IMPORT_EXPORT_KEY; static const QString PLUGINS_RUNNING_KEY; static const QString PYTHON_HOME_KEY; }; diff --git a/src/hobbits-gui/mainwindow.cpp b/src/hobbits-gui/mainwindow.cpp index d59013a0..b8225ee0 100644 --- a/src/hobbits-gui/mainwindow.cpp +++ b/src/hobbits-gui/mainwindow.cpp @@ -23,6 +23,7 @@ #include "abstractparametereditor.h" #include "parametereditordialog.h" #include "batcheditor.h" +#include "widgetssettings.h" #include "pythonpluginconfig.h" #include "simpleparametereditor.h" @@ -713,16 +714,19 @@ void MainWindow::on_pb_analyze_clicked() void MainWindow::on_action_Apply_Batch_triggered() { - QString fileName = QFileDialog::getOpenFileName( - this, - tr("Apply Batch"), - SettingsManager::getPrivateSetting(SettingsManager::LAST_BATCH_PATH_KEY).toString(), - tr("Hobbits Batch Files (*.hobbits_batch)")); - if (fileName.isEmpty()) { - return; + QString fileName = WidgetsSettings::getFile( + this, + tr("Apply Batch"), + QDir::homePath(), + tr("Hobbits Batch Files (*.hbat)"), + QFileDialog::AcceptOpen, + QFileDialog::ExistingFile, + SettingsManager::LAST_BATCH_KEY + ); + + if (!fileName.isEmpty()) { + applyBatchFile(fileName); } - - applyBatchFile(fileName); } void MainWindow::on_action_Save_Batch_triggered() @@ -756,9 +760,6 @@ void MainWindow::on_action_Save_Batch_triggered() void MainWindow::applyBatchFile(QString fileName) { QFile file(fileName); - SettingsManager::setPrivateSetting( - SettingsManager::LAST_BATCH_PATH_KEY, - QFileInfo(file).dir().path()); if (!file.open(QIODevice::ReadOnly)) { warningMessage(QString("Could not open hobbits batch file '%1'").arg(fileName)); diff --git a/src/hobbits-plugins/importerexporters/BitContainerData/bitcontainerdata.cpp b/src/hobbits-plugins/importerexporters/BitContainerData/bitcontainerdata.cpp index bb76fec7..2c26355d 100644 --- a/src/hobbits-plugins/importerexporters/BitContainerData/bitcontainerdata.cpp +++ b/src/hobbits-plugins/importerexporters/BitContainerData/bitcontainerdata.cpp @@ -2,6 +2,8 @@ #include "parametereditorfileselect.h" #include "settingsmanager.h" +static const QString LAST_BIT_CONTAINER_IMPORT_EXPORT = "last_bit_container_import_export"; + BitContainerData::BitContainerData() { QList infos = { @@ -21,7 +23,11 @@ BitContainerData::BitContainerData() [](QSharedPointer delegate, QSize size) { Q_UNUSED(size) Q_UNUSED(delegate) - return new ParameterEditorFileSelect(QFileDialog::AcceptOpen); + return new ParameterEditorFileSelect( + QFileDialog::AcceptOpen, + "filename", + "Select Bit Container File", + LAST_BIT_CONTAINER_IMPORT_EXPORT); }); m_exportDelegate = ParameterDelegate::create( @@ -37,7 +43,11 @@ BitContainerData::BitContainerData() [](QSharedPointer delegate, QSize size) { Q_UNUSED(size) Q_UNUSED(delegate) - return new ParameterEditorFileSelect(QFileDialog::AcceptSave); + return new ParameterEditorFileSelect( + QFileDialog::AcceptSave, + "filename", + "Save Bit Container File", + LAST_BIT_CONTAINER_IMPORT_EXPORT); }); } @@ -81,7 +91,6 @@ QSharedPointer BitContainerData::exportParameterDelegate() return m_exportDelegate; } -static const QString LAST_BIT_CONTAINER_IMPORT_EXPORT = "last_bit_container_import_export"; QSharedPointer BitContainerData::importBits(const Parameters ¶meters, QSharedPointer progress) @@ -99,9 +108,6 @@ QSharedPointer BitContainerData::importBits(const Parameters ¶ if (!file.open(QIODevice::ReadOnly)) { return ImportResult::error(QString("Failed to open file for import: '%1'").arg(fileName)); } - SettingsManager::setPrivateSetting( - LAST_BIT_CONTAINER_IMPORT_EXPORT, - QFileInfo(file).dir().path()); QDataStream stream(&file); QSharedPointer container = BitContainer::deserialize(stream); @@ -132,9 +138,6 @@ QSharedPointer BitContainerData::exportBits(QSharedPointerserialize(stream); diff --git a/src/hobbits-plugins/importerexporters/FileData/filedata.cpp b/src/hobbits-plugins/importerexporters/FileData/filedata.cpp index afbdc81c..6547ca35 100644 --- a/src/hobbits-plugins/importerexporters/FileData/filedata.cpp +++ b/src/hobbits-plugins/importerexporters/FileData/filedata.cpp @@ -102,9 +102,6 @@ QSharedPointer FileData::importBits(const Parameters ¶meters, if (!file.open(QIODevice::ReadOnly)) { return ImportResult::error(QString("Failed to open file for import: '%1'").arg(fileName)); } - SettingsManager::setPrivateSetting( - SettingsManager::LAST_IMPORT_EXPORT_PATH_KEY, - QFileInfo(file).dir().path()); QSharedPointer container = BitContainer::create(&file); container->setName(QFileInfo(file).fileName()); @@ -126,9 +123,6 @@ QSharedPointer FileData::exportBits(QSharedPointerbits()->writeTo(&file); file.close(); diff --git a/src/hobbits-plugins/importerexporters/HexString/hexstring.cpp b/src/hobbits-plugins/importerexporters/HexString/hexstring.cpp index 946d90aa..d1565c3d 100644 --- a/src/hobbits-plugins/importerexporters/HexString/hexstring.cpp +++ b/src/hobbits-plugins/importerexporters/HexString/hexstring.cpp @@ -103,8 +103,6 @@ QSharedPointer HexString::importBits(const Parameters ¶meters, Q_UNUSED(progress) QSharedPointer container; - auto importer = QSharedPointer(new HexStringImportForm()); - if (parameters.contains("filename")) { QString fileName = parameters.value("filename").toString(); return HexStringImportForm::importFromFile(fileName); @@ -139,9 +137,6 @@ QSharedPointer HexString::exportBits(QSharedPointerbits()->sizeInBytes(); qint64 offset = 0; diff --git a/src/hobbits-plugins/importerexporters/HexString/hexstringimportform.cpp b/src/hobbits-plugins/importerexporters/HexString/hexstringimportform.cpp index 41a64b9e..9491c60d 100644 --- a/src/hobbits-plugins/importerexporters/HexString/hexstringimportform.cpp +++ b/src/hobbits-plugins/importerexporters/HexString/hexstringimportform.cpp @@ -1,5 +1,6 @@ #include "hexstringimportform.h" #include "settingsmanager.h" +#include "widgetssettings.h" #include "ui_hexstringimportform.h" #include #include @@ -133,14 +134,19 @@ QSharedPointer HexStringImportForm::importFromHexString(QString he } void HexStringImportForm::on_pb_selectFile_pressed() -{ - m_fileName = QFileDialog::getOpenFileName( - this, - tr("Import Hex String File"), - SettingsManager::getPrivateSetting(SettingsManager::LAST_IMPORT_EXPORT_PATH_KEY).toString(), - tr("All Files (*)")); - - if (!m_fileName.isEmpty()) { +{ + QString fileName = WidgetsSettings::getFile( + this, + tr("Import Hex String File"), + QDir::homePath(), + tr("All Files (*)"), + QFileDialog::AcceptOpen, + QFileDialog::ExistingFile, + SettingsManager::LAST_IMPORT_EXPORT_KEY + ); + + if (!fileName.isEmpty()) { + m_fileName = fileName; emit accepted(); } } diff --git a/src/hobbits-widgets/batcheditor.cpp b/src/hobbits-widgets/batcheditor.cpp index 067b2e6e..d253c7b9 100644 --- a/src/hobbits-widgets/batcheditor.cpp +++ b/src/hobbits-widgets/batcheditor.cpp @@ -1,6 +1,7 @@ #include "batcheditor.h" #include "ui_batcheditor.h" #include "plugintreemodel.h" +#include "widgetssettings.h" #include #include @@ -37,24 +38,24 @@ void BatchEditor::on_action_saveBatchAs_triggered() { auto batch = m_editScene->getBatch(); - QString fileName = QFileDialog::getSaveFileName( - this, - tr("Save Batch"), - SettingsManager::getPrivateSetting( - SettingsManager::LAST_BATCH_PATH_KEY).toString(), - tr("Hobbits Batch Files (*.hobbits_batch)")); + QString fileName = WidgetsSettings::getFile( + this, + tr("Save Batch As"), + QDir::homePath(), + tr("Hobbits Batch Files (*.hbat)"), + QFileDialog::AcceptSave, + QFileDialog::AnyFile, + SettingsManager::LAST_BATCH_KEY + ); if (fileName.isEmpty()) { return; } - if (!fileName.endsWith(".hobbits_batch")) { - fileName += ".hobbits_batch"; + if (!fileName.endsWith(".hbat")) { + fileName += ".hbat"; } QFile file(fileName); - SettingsManager::setPrivateSetting( - SettingsManager::LAST_BATCH_PATH_KEY, - QFileInfo(file).dir().path()); if (!file.open(QIODevice::WriteOnly)) { QMessageBox::warning(this, "Cannot Save Batch", QString("Could not open file '%1' for writing").arg(fileName)); @@ -67,19 +68,21 @@ void BatchEditor::on_action_saveBatchAs_triggered() void BatchEditor::on_action_openBatch_triggered() { - QString fileName = QFileDialog::getOpenFileName( - this, - tr("Apply Batch"), - SettingsManager::getPrivateSetting(SettingsManager::LAST_BATCH_PATH_KEY).toString(), - tr("Hobbits Batch Files (*.hobbits_batch)")); + QString fileName = WidgetsSettings::getFile( + this, + tr("Open Batch"), + QDir::homePath(), + tr("Hobbits Batch Files (*.hbat)"), + QFileDialog::AcceptOpen, + QFileDialog::ExistingFile, + SettingsManager::LAST_BATCH_KEY + ); + if (fileName.isEmpty()) { return; } QFile file(fileName); - SettingsManager::setPrivateSetting( - SettingsManager::LAST_BATCH_PATH_KEY, - QFileInfo(file).dir().path()); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::warning(this, "Cannot Open Batch", QString("Could not open file '%1'").arg(fileName)); diff --git a/src/hobbits-widgets/parametereditordialog.cpp b/src/hobbits-widgets/parametereditordialog.cpp index afb03362..28854824 100644 --- a/src/hobbits-widgets/parametereditordialog.cpp +++ b/src/hobbits-widgets/parametereditordialog.cpp @@ -21,6 +21,8 @@ ParameterEditorDialog::ParameterEditorDialog( setWindowTitle(m_editor->title()); + this->resize(m_editor->size()); + ui->mainLayout->insertWidget(0, m_editor); if (m_editor->isStandaloneDialog()) { diff --git a/src/hobbits-widgets/parametereditorfileselect.cpp b/src/hobbits-widgets/parametereditorfileselect.cpp index 0adcd932..a7fb43b5 100644 --- a/src/hobbits-widgets/parametereditorfileselect.cpp +++ b/src/hobbits-widgets/parametereditorfileselect.cpp @@ -1,19 +1,19 @@ #include "parametereditorfileselect.h" #include "settingsmanager.h" +#include "widgetssettings.h" #include ParameterEditorFileSelect::ParameterEditorFileSelect( QFileDialog::AcceptMode acceptMode, QString fileKey, - QString editorTitle) : + QString editorTitle, + QString stateKey) : m_fileKey(fileKey), m_editorTitle(editorTitle) { m_fileDialog = new QFileDialog( nullptr, - tr(""), - SettingsManager::getPrivateSetting(SettingsManager::LAST_IMPORT_EXPORT_PATH_KEY).toString(), - tr("All Files (*)")); + tr("")); m_fileDialog->setOption(QFileDialog::DontUseNativeDialog); m_fileDialog->setWindowFlags(Qt::Widget); m_fileDialog->setVisible(true); @@ -22,16 +22,44 @@ ParameterEditorFileSelect::ParameterEditorFileSelect( QVBoxLayout *layout = new QVBoxLayout(); layout->setContentsMargins(0, 0, 0, 0); + if (stateKey.isNull()) { + stateKey = SettingsManager::LAST_IMPORT_EXPORT_KEY; + } + + QString dirKey = WidgetsSettings::dialogDirKey(stateKey); + QString sizeKey = WidgetsSettings::dialogRectKey(stateKey); + + QVariant lastDir = SettingsManager::getPrivateSetting(dirKey); + if (lastDir.isValid() && lastDir.canConvert()) { + m_fileDialog->setDirectory(lastDir.toString()); + } + + QVariant lastSize = SettingsManager::getPrivateSetting(sizeKey); + if (lastSize.isValid() && lastSize.canConvert()) { + m_fileDialog->resize(lastSize.toSize()); + } + + resize(m_fileDialog->size()); + layout->addWidget(m_fileDialog); this->setLayout(layout); connect(m_fileDialog, SIGNAL(accepted()), this, SIGNAL(accepted())); connect(m_fileDialog, SIGNAL(rejected()), this, SIGNAL(rejected())); + + connect(m_fileDialog, &QDialog::finished, [this, dirKey, sizeKey](int result) { + auto path = m_fileDialog->directory().path().toStdString(); + auto saveBytes = this->m_fileDialog->saveState().toStdString(); + + SettingsManager::setPrivateSetting(dirKey, m_fileDialog->directory().path()); + SettingsManager::setPrivateSetting(sizeKey, m_fileDialog->size()); + }); } ParameterEditorFileSelect::~ParameterEditorFileSelect() { + } QString ParameterEditorFileSelect::title() diff --git a/src/hobbits-widgets/parametereditorfileselect.h b/src/hobbits-widgets/parametereditorfileselect.h index c73ee655..407ede02 100644 --- a/src/hobbits-widgets/parametereditorfileselect.h +++ b/src/hobbits-widgets/parametereditorfileselect.h @@ -14,7 +14,8 @@ class HOBBITSWIDGETSSHARED_EXPORT ParameterEditorFileSelect : public AbstractPar ParameterEditorFileSelect( QFileDialog::AcceptMode acceptMode, QString fileKey = "filename", - QString editorTitle = "Select File"); + QString editorTitle = "Select File", + QString stateKey = QString()); ~ParameterEditorFileSelect() override; QString title() override; diff --git a/src/hobbits-widgets/widgetssettings.cpp b/src/hobbits-widgets/widgetssettings.cpp index a6a45455..fcd80f58 100644 --- a/src/hobbits-widgets/widgetssettings.cpp +++ b/src/hobbits-widgets/widgetssettings.cpp @@ -16,3 +16,62 @@ WidgetsSettings::WidgetsSettings() SettingsManager::instance().m_data.setUiSetting(SettingsManager::HIGHLIGHT_4_COLOR_KEY, QColor(200, 140, 0, 100)); SettingsManager::instance().m_data.setUiSetting(SettingsManager::HIGHLIGHT_5_COLOR_KEY, QColor(250, 50, 0, 100)); } + +QString WidgetsSettings::dialogDirKey(QString baseKey) +{ + return baseKey + "_dir"; +} + +QString WidgetsSettings::dialogSizeKey(QString baseKey) +{ + return baseKey + "_size"; +} + +QString WidgetsSettings::dialogRectKey(QString baseKey) +{ + return baseKey + "_rect"; +} + +QString WidgetsSettings::getFile(QWidget *parent, + const QString &caption, + const QString &defaultDirectory, + const QString &filter, + QFileDialog::AcceptMode acceptMode, + QFileDialog::FileMode fileMode, + const QString &dialogSettingsKey) +{ + QScopedPointer dialog( + new QFileDialog(parent, + caption, + defaultDirectory, + filter)); + + dialog->setAcceptMode(acceptMode); + dialog->setFileMode(fileMode); + + QString dirKey = dialogDirKey(dialogSettingsKey); + QString rectKey = dialogRectKey(dialogSettingsKey); + + QVariant lastDir = SettingsManager::getPrivateSetting(dirKey); + if (lastDir.isValid() && lastDir.canConvert()) { + dialog->setDirectory(lastDir.toString()); + } + + QVariant lastRect = SettingsManager::getPrivateSetting(rectKey); + if (lastRect.isValid() && lastRect.canConvert()) { + dialog->setGeometry(lastRect.toRect()); + } + + QString fileName; + if (dialog->exec()) { + QStringList fileNames = dialog->selectedFiles(); + if (!fileNames.isEmpty()) { + fileName = fileNames.at(0); + } + } + + SettingsManager::setPrivateSetting(dirKey, dialog->directory().path()); + SettingsManager::setPrivateSetting(rectKey, dialog->geometry()); + + return fileName; +} diff --git a/src/hobbits-widgets/widgetssettings.h b/src/hobbits-widgets/widgetssettings.h index f9167d58..fb552828 100644 --- a/src/hobbits-widgets/widgetssettings.h +++ b/src/hobbits-widgets/widgetssettings.h @@ -2,11 +2,26 @@ #define WIDGETSSETTINGS_H #include "hobbits-widgets_global.h" +#include +#include class HOBBITSWIDGETSSHARED_EXPORT WidgetsSettings { public: WidgetsSettings(); + + static QString dialogDirKey(QString baseKey); + static QString dialogSizeKey(QString baseKey); + static QString dialogRectKey(QString baseKey); + + static QString getFile( + QWidget *parent, + const QString &caption, + const QString &defaultDirectory, + const QString &filter, + QFileDialog::AcceptMode acceptMode, + QFileDialog::FileMode fileMode, + const QString &dialogSettingsKey); }; #endif // WIDGETSSETTINGS_H