Scripting: Add MRU

This commit is contained in:
Vicki Pfau 2022-05-25 18:40:33 -07:00
parent df60b17639
commit 997adecddc
7 changed files with 75 additions and 13 deletions

View File

@ -301,9 +301,9 @@ void ConfigController::setQtOption(const QString& key, const QVariant& value, co
}
}
QList<QString> ConfigController::getMRU() const {
QList<QString> 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<QString> ConfigController::getMRU() const {
return mru;
}
void ConfigController::setMRU(const QList<QString>& 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<QString>& 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();

View File

@ -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<QString> getMRU() const;
void setMRU(const QList<QString>& 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; }

View File

@ -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);
});
}
}

View File

@ -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<ScriptingTextBuffer*> m_textBuffers;
QStringList m_mruFiles;
};
}

View File

@ -79,7 +79,14 @@
<property name="title">
<string>File</string>
</property>
<widget class="QMenu" name="mru">
<property name="title">
<string>Load recent script</string>
</property>
</widget>
<addaction name="load"/>
<addaction name="mru"/>
<addaction name="separator"/>
<addaction name="reset"/>
</widget>
<addaction name="menuFile"/>
@ -95,6 +102,11 @@
<string>&amp;Reset</string>
</property>
</action>
<action name="action0">
<property name="text">
<string>0</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>

View File

@ -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

View File

@ -222,7 +222,7 @@ private:
QTimer m_fpsTimer;
QTimer m_mustRestart;
QTimer m_mustReset;
QList<QString> m_mruFiles;
QStringList m_mruFiles;
ShortcutController* m_shortcutController;
#if defined(BUILD_GL) || defined(BUILD_GLES2)
std::unique_ptr<ShaderSelector> m_shaderView;