Scripting: Add reset menu opiton

This commit is contained in:
Vicki Pfau 2022-05-22 22:57:47 -07:00
parent b3476a997a
commit e69be0cc6f
5 changed files with 44 additions and 18 deletions

View File

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

View File

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

View File

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

View File

@ -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() {

View File

@ -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>&amp;Reset</string>
</property>
</action>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>