diff --git a/src/platform/qt/ConfigController.cpp b/src/platform/qt/ConfigController.cpp index 66c89b4d5..4fc4037e0 100644 --- a/src/platform/qt/ConfigController.cpp +++ b/src/platform/qt/ConfigController.cpp @@ -301,9 +301,9 @@ void ConfigController::setQtOption(const QString& key, const QVariant& value, co } } -QList ConfigController::getMRU() const { - QList mru; - m_settings->beginGroup("mru"); +QStringList ConfigController::getMRU(ConfigController::MRU mruType) const { + QStringList mru; + m_settings->beginGroup(mruName(mruType)); for (int i = 0; i < MRU_LIST_SIZE; ++i) { QString item = m_settings->value(QString::number(i)).toString(); if (item.isNull()) { @@ -315,9 +315,9 @@ QList ConfigController::getMRU() const { return mru; } -void ConfigController::setMRU(const QList& mru) { +void ConfigController::setMRU(const QStringList& mru, ConfigController::MRU mruType) { int i = 0; - m_settings->beginGroup("mru"); + m_settings->beginGroup(mruName(mruType)); for (const QString& item : mru) { m_settings->setValue(QString::number(i), item); ++i; @@ -331,6 +331,15 @@ void ConfigController::setMRU(const QList& mru) { m_settings->endGroup(); } +constexpr const char* ConfigController::mruName(ConfigController::MRU mru) { + switch (mru) { + case MRU::ROM: + return "mru"; + case MRU::Script: + return "recentScripts"; + } +} + void ConfigController::write() { mCoreConfigSave(&m_config); m_settings->sync(); diff --git a/src/platform/qt/ConfigController.h b/src/platform/qt/ConfigController.h index 57fbda9c5..4b7f859fb 100644 --- a/src/platform/qt/ConfigController.h +++ b/src/platform/qt/ConfigController.h @@ -67,6 +67,11 @@ public: constexpr static const char* const PORT = "qt"; static const int MRU_LIST_SIZE = 10; + enum class MRU { + ROM, + Script + }; + ConfigController(QObject* parent = nullptr); ~ConfigController(); @@ -84,8 +89,8 @@ public: QVariant getArgvOption(const QString& key) const; QVariant takeArgvOption(const QString& key); - QList getMRU() const; - void setMRU(const QList& mru); + QStringList getMRU(MRU = MRU::ROM) const; + void setMRU(const QStringList& mru, MRU = MRU::ROM); Configuration* overrides() { return mCoreConfigGetOverrides(&m_config); } void saveOverride(const Override&); @@ -114,7 +119,7 @@ public slots: void write(); private: - void addArgvOption(const QString& key, const QVariant& value); + static constexpr const char* mruName(ConfigController::MRU); Configuration* defaults() { return &m_config.defaultsTable; } diff --git a/src/platform/qt/ScriptingView.cpp b/src/platform/qt/ScriptingView.cpp index 46857d219..834b1abed 100644 --- a/src/platform/qt/ScriptingView.cpp +++ b/src/platform/qt/ScriptingView.cpp @@ -6,13 +6,15 @@ #include "ScriptingView.h" #include "GBAApp.h" +#include "ConfigController.h" #include "ScriptingController.h" #include "ScriptingTextBuffer.h" using namespace QGBA; -ScriptingView::ScriptingView(ScriptingController* controller, QWidget* parent) +ScriptingView::ScriptingView(ScriptingController* controller, ConfigController* config, QWidget* parent) : QMainWindow(parent) + , m_config(config) , m_controller(controller) { m_ui.setupUi(this); @@ -30,6 +32,9 @@ ScriptingView::ScriptingView(ScriptingController* controller, QWidget* parent) connect(m_ui.buffers, &QListWidget::currentRowChanged, this, &ScriptingView::selectBuffer); connect(m_ui.load, &QAction::triggered, this, &ScriptingView::load); connect(m_ui.reset, &QAction::triggered, controller, &ScriptingController::reset); + + m_mruFiles = m_config->getMRU(ConfigController::MRU::Script); + updateMRU(); } void ScriptingView::submitRepl() { @@ -41,7 +46,10 @@ void ScriptingView::submitRepl() { void ScriptingView::load() { QString filename = GBAApp::app()->getOpenFileName(this, tr("Select script to load"), getFilters()); if (!filename.isEmpty()) { - m_controller->loadFile(filename); + if (!m_controller->loadFile(filename)) { + return; + } + appendMRU(filename); } } @@ -72,3 +80,25 @@ QString ScriptingView::getFilters() const { filters.append(tr("All files (*.*)")); return filters.join(";;"); } + +void ScriptingView::appendMRU(const QString& fname) { + int index = m_mruFiles.indexOf(fname); + if (index >= 0) { + m_mruFiles.removeAt(index); + } + m_mruFiles.prepend(fname); + while (m_mruFiles.size() > ConfigController::MRU_LIST_SIZE) { + m_mruFiles.removeLast(); + } + updateMRU(); +} + +void ScriptingView::updateMRU() { + m_config->setMRU(m_mruFiles, ConfigController::MRU::Script); + m_ui.mru->clear(); + for (const auto& fname : m_mruFiles) { + m_ui.mru->addAction(fname, [this, fname]() { + m_controller->loadFile(fname); + }); + } +} diff --git a/src/platform/qt/ScriptingView.h b/src/platform/qt/ScriptingView.h index 5f7668dd2..d6fec7847 100644 --- a/src/platform/qt/ScriptingView.h +++ b/src/platform/qt/ScriptingView.h @@ -9,6 +9,7 @@ namespace QGBA { +class ConfigController; class ScriptingController; class ScriptingTextBuffer; @@ -16,7 +17,7 @@ class ScriptingView : public QMainWindow { Q_OBJECT public: - ScriptingView(ScriptingController* controller, QWidget* parent = nullptr); + ScriptingView(ScriptingController* controller, ConfigController* config, QWidget* parent = nullptr); private slots: void submitRepl(); @@ -28,10 +29,15 @@ private slots: private: QString getFilters() const; + void appendMRU(const QString&); + void updateMRU(); + Ui::ScriptingView m_ui; + ConfigController* m_config; ScriptingController* m_controller; QList m_textBuffers; + QStringList m_mruFiles; }; } diff --git a/src/platform/qt/ScriptingView.ui b/src/platform/qt/ScriptingView.ui index 3b30ba9b2..61afa257f 100644 --- a/src/platform/qt/ScriptingView.ui +++ b/src/platform/qt/ScriptingView.ui @@ -79,7 +79,14 @@ File + + + Load recent script + + + + @@ -95,6 +102,11 @@ &Reset + + + 0 + + diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index 128435831..c32662fb8 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -662,7 +662,7 @@ void Window::scriptingOpen() { m_scripting->setController(m_controller); } } - ScriptingView* view = new ScriptingView(m_scripting.get()); + ScriptingView* view = new ScriptingView(m_scripting.get(), m_config); openView(view); } #endif diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h index 667cf77ca..f129c44e5 100644 --- a/src/platform/qt/Window.h +++ b/src/platform/qt/Window.h @@ -222,7 +222,7 @@ private: QTimer m_fpsTimer; QTimer m_mustRestart; QTimer m_mustReset; - QList m_mruFiles; + QStringList m_mruFiles; ShortcutController* m_shortcutController; #if defined(BUILD_GL) || defined(BUILD_GLES2) std::unique_ptr m_shaderView;