mirror of https://github.com/mgba-emu/mgba.git
Scripting: Add reset menu opiton
This commit is contained in:
parent
b3476a997a
commit
e69be0cc6f
|
@ -273,7 +273,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) {
|
||||||
}
|
}
|
||||||
#ifdef ENABLE_SCRIPTING
|
#ifdef ENABLE_SCRIPTING
|
||||||
// startCallback could add a script context
|
// startCallback could add a script context
|
||||||
if (!scriptContext) {
|
if (scriptContext != threadContext->scriptContext) {
|
||||||
scriptContext = threadContext->scriptContext;
|
scriptContext = threadContext->scriptContext;
|
||||||
if (scriptContext) {
|
if (scriptContext) {
|
||||||
_mCoreThreadAddCallbacks(threadContext);
|
_mCoreThreadAddCallbacks(threadContext);
|
||||||
|
@ -294,7 +294,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) {
|
||||||
|
|
||||||
#ifdef ENABLE_SCRIPTING
|
#ifdef ENABLE_SCRIPTING
|
||||||
// resetCallback could add a script context
|
// resetCallback could add a script context
|
||||||
if (!scriptContext) {
|
if (scriptContext != threadContext->scriptContext) {
|
||||||
scriptContext = threadContext->scriptContext;
|
scriptContext = threadContext->scriptContext;
|
||||||
if (scriptContext) {
|
if (scriptContext) {
|
||||||
_mCoreThreadAddCallbacks(threadContext);
|
_mCoreThreadAddCallbacks(threadContext);
|
||||||
|
@ -351,7 +351,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef ENABLE_SCRIPTING
|
#ifdef ENABLE_SCRIPTING
|
||||||
if (!scriptContext) {
|
if (scriptContext != threadContext->scriptContext) {
|
||||||
scriptContext = threadContext->scriptContext;
|
scriptContext = threadContext->scriptContext;
|
||||||
if (scriptContext) {
|
if (scriptContext) {
|
||||||
_mCoreThreadAddCallbacks(threadContext);
|
_mCoreThreadAddCallbacks(threadContext);
|
||||||
|
|
|
@ -13,10 +13,6 @@ using namespace QGBA;
|
||||||
ScriptingController::ScriptingController(QObject* parent)
|
ScriptingController::ScriptingController(QObject* parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
{
|
{
|
||||||
mScriptContextInit(&m_scriptContext);
|
|
||||||
mScriptContextAttachStdlib(&m_scriptContext);
|
|
||||||
mScriptContextRegisterEngines(&m_scriptContext);
|
|
||||||
|
|
||||||
m_logger.p = this;
|
m_logger.p = this;
|
||||||
m_logger.log = [](mLogger* log, int, enum mLogLevel level, const char* format, va_list args) {
|
m_logger.log = [](mLogger* log, int, enum mLogLevel level, const char* format, va_list args) {
|
||||||
Logger* logger = static_cast<Logger*>(log);
|
Logger* logger = static_cast<Logger*>(log);
|
||||||
|
@ -37,17 +33,7 @@ ScriptingController::ScriptingController(QObject* parent)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
mScriptContextAttachLogger(&m_scriptContext, &m_logger);
|
init();
|
||||||
mScriptContextSetTextBufferFactory(&m_scriptContext, &ScriptingController::createTextBuffer, this);
|
|
||||||
|
|
||||||
HashTableEnumerate(&m_scriptContext.engines, [](const char* key, void* engine, void* context) {
|
|
||||||
ScriptingController* self = static_cast<ScriptingController*>(context);
|
|
||||||
self->m_engines[QString::fromUtf8(key)] = static_cast<mScriptEngineContext*>(engine);
|
|
||||||
}, this);
|
|
||||||
|
|
||||||
if (m_engines.count() == 1) {
|
|
||||||
m_activeEngine = *m_engines.begin();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ScriptingController::~ScriptingController() {
|
ScriptingController::~ScriptingController() {
|
||||||
|
@ -99,6 +85,18 @@ void ScriptingController::clearController() {
|
||||||
m_controller.reset();
|
m_controller.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ScriptingController::reset() {
|
||||||
|
CoreController::Interrupter interrupter(m_controller);
|
||||||
|
mScriptContextDetachCore(&m_scriptContext);
|
||||||
|
mScriptContextDeinit(&m_scriptContext);
|
||||||
|
m_engines.clear();
|
||||||
|
m_activeEngine = nullptr;
|
||||||
|
init();
|
||||||
|
if (m_controller && m_controller->hasStarted()) {
|
||||||
|
mScriptContextAttachCore(&m_scriptContext, m_controller->thread()->core);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ScriptingController::runCode(const QString& code) {
|
void ScriptingController::runCode(const QString& code) {
|
||||||
VFileDevice vf(code.toUtf8());
|
VFileDevice vf(code.toUtf8());
|
||||||
load(vf, "*prompt");
|
load(vf, "*prompt");
|
||||||
|
@ -110,3 +108,21 @@ mScriptTextBuffer* ScriptingController::createTextBuffer(void* context) {
|
||||||
emit self->textBufferCreated(buffer);
|
emit self->textBufferCreated(buffer);
|
||||||
return buffer->textBuffer();
|
return buffer->textBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ScriptingController::init() {
|
||||||
|
mScriptContextInit(&m_scriptContext);
|
||||||
|
mScriptContextAttachStdlib(&m_scriptContext);
|
||||||
|
mScriptContextRegisterEngines(&m_scriptContext);
|
||||||
|
|
||||||
|
mScriptContextAttachLogger(&m_scriptContext, &m_logger);
|
||||||
|
mScriptContextSetTextBufferFactory(&m_scriptContext, &ScriptingController::createTextBuffer, this);
|
||||||
|
|
||||||
|
HashTableEnumerate(&m_scriptContext.engines, [](const char* key, void* engine, void* context) {
|
||||||
|
ScriptingController* self = static_cast<ScriptingController*>(context);
|
||||||
|
self->m_engines[QString::fromUtf8(key)] = static_cast<mScriptEngineContext*>(engine);
|
||||||
|
}, this);
|
||||||
|
|
||||||
|
if (m_engines.count() == 1) {
|
||||||
|
m_activeEngine = *m_engines.begin();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -42,9 +42,12 @@ signals:
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void clearController();
|
void clearController();
|
||||||
|
void reset();
|
||||||
void runCode(const QString& code);
|
void runCode(const QString& code);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void init();
|
||||||
|
|
||||||
static mScriptTextBuffer* createTextBuffer(void* context);
|
static mScriptTextBuffer* createTextBuffer(void* context);
|
||||||
|
|
||||||
struct Logger : mLogger {
|
struct Logger : mLogger {
|
||||||
|
|
|
@ -29,6 +29,7 @@ ScriptingView::ScriptingView(ScriptingController* controller, QWidget* parent)
|
||||||
|
|
||||||
connect(m_ui.buffers, &QListWidget::currentRowChanged, this, &ScriptingView::selectBuffer);
|
connect(m_ui.buffers, &QListWidget::currentRowChanged, this, &ScriptingView::selectBuffer);
|
||||||
connect(m_ui.load, &QAction::triggered, this, &ScriptingView::load);
|
connect(m_ui.load, &QAction::triggered, this, &ScriptingView::load);
|
||||||
|
connect(m_ui.reset, &QAction::triggered, controller, &ScriptingController::reset);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScriptingView::submitRepl() {
|
void ScriptingView::submitRepl() {
|
||||||
|
|
|
@ -80,6 +80,7 @@
|
||||||
<string>File</string>
|
<string>File</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="load"/>
|
<addaction name="load"/>
|
||||||
|
<addaction name="reset"/>
|
||||||
</widget>
|
</widget>
|
||||||
<addaction name="menuFile"/>
|
<addaction name="menuFile"/>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -89,6 +90,11 @@
|
||||||
<string>Load script...</string>
|
<string>Load script...</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="reset">
|
||||||
|
<property name="text">
|
||||||
|
<string>&Reset</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
|
|
Loading…
Reference in New Issue