From 2661032993a945501d9d46eb24c9fc28f90720e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Fri, 21 Sep 2018 11:53:53 +0200 Subject: [PATCH] [apps/code] Fix Python loading when going in the VarBoxController The Var box controller deinited python on exit, and the console controller did not reload python + it made the console controller lose all its context, such as imported scripts --- apps/code/app.h | 1 + apps/code/console_controller.cpp | 9 +++++++-- apps/code/console_controller.h | 5 ++++- apps/code/menu_controller.cpp | 23 ++++++++--------------- apps/code/menu_controller.h | 1 - apps/code/variable_box_controller.cpp | 10 +++++----- apps/code/variable_box_controller.h | 1 - 7 files changed, 25 insertions(+), 25 deletions(-) diff --git a/apps/code/app.h b/apps/code/app.h index f3deb7c79..f9de1d626 100644 --- a/apps/code/app.h +++ b/apps/code/app.h @@ -43,6 +43,7 @@ public: bool handleEvent(Ion::Events::Event event) override; bool textInputDidReceiveEvent(TextInput * textInput, Ion::Events::Event event); // Python delegate + bool pythonIsInited() { return m_pythonUser != nullptr; } bool isPythonUser(const void * pythonUser) { return m_pythonUser == pythonUser; } void initPythonWithUser(const void * pythonUser); void deinitPython(); diff --git a/apps/code/console_controller.cpp b/apps/code/console_controller.cpp index 814b7f822..3b1d4ae6b 100644 --- a/apps/code/console_controller.cpp +++ b/apps/code/console_controller.cpp @@ -44,14 +44,14 @@ ConsoleController::ConsoleController(Responder * parentResponder, App * pythonDe } } -bool ConsoleController::loadPythonEnvironment(bool autoImportScripts) { +bool ConsoleController::loadPythonEnvironment() { if(pythonEnvironmentIsLoaded()) { return true; } emptyOutputAccumulationBuffer(); m_pythonDelegate->initPythonWithUser(this); MicroPython::registerScriptProvider(m_scriptStore); - m_importScriptsWhenViewAppears = autoImportScripts; + m_importScriptsWhenViewAppears = m_autoImportScripts; return true; } @@ -104,6 +104,7 @@ const char * ConsoleController::inputText(const char * prompt) { } void ConsoleController::viewWillAppear() { + loadPythonEnvironment(); assert(pythonEnvironmentIsLoaded()); m_sandboxIsDisplayed = false; if (m_importScriptsWhenViewAppears) { @@ -116,6 +117,10 @@ void ConsoleController::viewWillAppear() { m_editCell.setText(""); } +void ConsoleController::didEnterResponderChain(Responder * previousFirstResponder) { + loadPythonEnvironment(); +} + void ConsoleController::didBecomeFirstResponder() { app()->setFirstResponder(&m_editCell); } diff --git a/apps/code/console_controller.h b/apps/code/console_controller.h index 624fb5e9e..5e8a7ee2e 100644 --- a/apps/code/console_controller.h +++ b/apps/code/console_controller.h @@ -24,10 +24,11 @@ public: #endif ); - bool loadPythonEnvironment(bool autoImportScripts = true); + bool loadPythonEnvironment(); void unloadPythonEnvironment(); bool pythonEnvironmentIsLoaded(); + void setAutoImport(bool autoImport) { m_autoImportScripts = autoImport; } void autoImport(); void autoImportScript(Script script, bool force = false); void runAndPrintForCommand(const char * command); @@ -37,6 +38,7 @@ public: // ViewController View * view() override { return &m_selectableTableView; } void viewWillAppear() override; + void didEnterResponderChain(Responder * previousFirstResponder) override; void didBecomeFirstResponder() override; bool handleEvent(Ion::Events::Event event) override; ViewController::DisplayParameter displayParameter() override { return ViewController::DisplayParameter::WantsMaximumSpace; } @@ -100,6 +102,7 @@ private: ScriptStore * m_scriptStore; SandboxController m_sandboxController; bool m_inputRunLoopActive; + bool m_autoImportScripts; #if EPSILON_GETOPT bool m_locked; #endif diff --git a/apps/code/menu_controller.cpp b/apps/code/menu_controller.cpp index c55d39981..bbc88ae9b 100644 --- a/apps/code/menu_controller.cpp +++ b/apps/code/menu_controller.cpp @@ -14,13 +14,11 @@ MenuController::MenuController(Responder * parentResponder, App * pythonDelegate m_scriptStore(scriptStore), m_addNewScriptCell(), m_consoleButton(this, I18n::Message::Console, Invocation([](void * context, void * sender) { - MenuController * menu = (MenuController *)context; - if (menu->consoleController()->loadPythonEnvironment()) { - menu->stackViewController()->push(menu->consoleController()); - return; - } - //TODO: Pop up warning message: not enough space to load Python - }, this), KDText::FontSize::Large), + MenuController * menu = (MenuController *)context; + menu->consoleController()->setAutoImport(true); + menu->stackViewController()->push(menu->consoleController()); + return; + }, this), KDText::FontSize::Large), m_selectableTableView(this, this, this, this), m_scriptParameterController(nullptr, I18n::Message::ScriptOptions, this), m_editorController(this, pythonDelegate), @@ -146,16 +144,11 @@ void MenuController::reloadConsole() { m_reloadConsoleWhenBecomingFirstResponder = false; } -void MenuController::loadPythonIfNeeded() { - consoleController()->loadPythonEnvironment(false); -} - void MenuController::openConsoleWithScript(Script script) { reloadConsole(); - if (consoleController()->loadPythonEnvironment(false)) { - stackViewController()->push(consoleController()); - consoleController()->autoImportScript(script, true); - } + consoleController()->setAutoImport(false); + stackViewController()->push(consoleController()); + consoleController()->autoImportScript(script, true); m_reloadConsoleWhenBecomingFirstResponder = true; } diff --git a/apps/code/menu_controller.h b/apps/code/menu_controller.h index 490c43935..e54125241 100644 --- a/apps/code/menu_controller.h +++ b/apps/code/menu_controller.h @@ -20,7 +20,6 @@ public: void renameSelectedScript(); void deleteScript(Script script); void reloadConsole(); - void loadPythonIfNeeded(); void openConsoleWithScript(Script script); void scriptContentEditionDidFinish(); diff --git a/apps/code/variable_box_controller.cpp b/apps/code/variable_box_controller.cpp index 9c4d731d0..3437e0153 100644 --- a/apps/code/variable_box_controller.cpp +++ b/apps/code/variable_box_controller.cpp @@ -49,11 +49,11 @@ const char * VariableBoxController::ContentViewController::title() { } void VariableBoxController::ContentViewController::didEnterResponderChain(Responder * previousFirstResponder) { - m_pythonDelegate->initPythonWithUser(this); -} - -void VariableBoxController::ContentViewController::willExitResponderChain(Responder * nextFirstResponder) { - m_pythonDelegate->deinitPython(); + /* This Code::VariableBoxController should always be called from an + * environment where Python has already been inited. This way, we do not + * deinit Python when leaving the VariableBoxController, so we do not lose the + * environment that was loaded when entering the VariableBoxController. */ + assert(m_pythonDelegate->pythonIsInited()); } void VariableBoxController::ContentViewController::viewWillAppear() { diff --git a/apps/code/variable_box_controller.h b/apps/code/variable_box_controller.h index a7b39f39e..a850a9473 100644 --- a/apps/code/variable_box_controller.h +++ b/apps/code/variable_box_controller.h @@ -34,7 +34,6 @@ private: /* Responder */ void didEnterResponderChain(Responder * previousFirstResponder) override; - void willExitResponderChain(Responder * nextFirstResponder) override; void didBecomeFirstResponder() override; bool handleEvent(Ion::Events::Event event) override;