diff --git a/apps/code/app.cpp b/apps/code/app.cpp index b446187e8..e0aa39738 100644 --- a/apps/code/app.cpp +++ b/apps/code/app.cpp @@ -105,6 +105,10 @@ bool App::handleEvent(Ion::Events::Event event) { return false; } +void App::willExitResponderChain(Responder * nextFirstResponder) { + m_menuController.willExitApp(); +} + Toolbox * App::toolboxForInputEventHandler(InputEventHandler * textInput) { return &m_toolbox; } diff --git a/apps/code/app.h b/apps/code/app.h index f683b5bbb..43f8d5202 100644 --- a/apps/code/app.h +++ b/apps/code/app.h @@ -52,6 +52,7 @@ public: /* Responder */ bool handleEvent(Ion::Events::Event event) override; + void willExitResponderChain(Responder * nextFirstResponder) override; /* InputEventHandlerDelegate */ Toolbox * toolboxForInputEventHandler(InputEventHandler * textInput) override; diff --git a/apps/code/editor_controller.cpp b/apps/code/editor_controller.cpp index 7f33af4fd..9634cd315 100644 --- a/apps/code/editor_controller.cpp +++ b/apps/code/editor_controller.cpp @@ -38,15 +38,16 @@ void EditorController::setScript(Script script) { m_editorView.setText(const_cast(m_script.scriptContent()), newScriptSize - Script::k_importationStatusSize); } +void EditorController::willExitApp() { + cleanStorageEmptySpace(); +} + // TODO: this should be done in textAreaDidFinishEditing maybe?? bool EditorController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::OK || event == Ion::Events::Back || event == Ion::Events::Home || event == Ion::Events::USBEnumeration) { /* Exit the edition on USB enumeration, because the storage needs to be in a * "clean" state (with all records packed at the beginning of the storage) */ - Ion::Storage::Record::Data scriptValue = m_script.value(); - Ion::Storage::sharedStorage()->getAvailableSpaceFromEndOfRecord( - m_script, - scriptValue.size - Script::k_importationStatusSize - (strlen(m_script.scriptContent()) + 1)); // TODO optimize number of script fetches + cleanStorageEmptySpace(); stackController()->pop(); return event != Ion::Events::Home && event != Ion::Events::USBEnumeration; } @@ -128,4 +129,15 @@ StackViewController * EditorController::stackController() { return static_cast(parentResponder()); } +void EditorController::cleanStorageEmptySpace() { + if (m_script.isNull()) { + return; + } + Ion::Storage::Record::Data scriptValue = m_script.value(); + Ion::Storage::sharedStorage()->getAvailableSpaceFromEndOfRecord( + m_script, + scriptValue.size - Script::k_importationStatusSize - (strlen(m_script.scriptContent()) + 1)); // TODO optimize number of script fetches +} + + } diff --git a/apps/code/editor_controller.h b/apps/code/editor_controller.h index 3b8d87980..9a45a8f40 100644 --- a/apps/code/editor_controller.h +++ b/apps/code/editor_controller.h @@ -17,6 +17,7 @@ class EditorController : public ViewController, public TextAreaDelegate, public public: EditorController(MenuController * menuController, App * pythonDelegate); void setScript(Script script); + void willExitApp(); /* ViewController */ View * view() override { return &m_editorView; } @@ -33,6 +34,7 @@ public: VariableBoxController * variableBoxForInputEventHandler(InputEventHandler * textInput) override; private: + void cleanStorageEmptySpace(); StackViewController * stackController(); EditorView m_editorView; Script m_script; diff --git a/apps/code/menu_controller.cpp b/apps/code/menu_controller.cpp index bed2c31cc..f3fdfdfe7 100644 --- a/apps/code/menu_controller.cpp +++ b/apps/code/menu_controller.cpp @@ -156,6 +156,10 @@ void MenuController::scriptContentEditionDidFinish() { reloadConsole(); } +void MenuController::willExitApp() { + m_editorController.willExitApp(); +} + int MenuController::numberOfRows() const { return m_scriptStore->numberOfScripts() + m_shouldDisplayAddScriptRow; } diff --git a/apps/code/menu_controller.h b/apps/code/menu_controller.h index 252b2f030..e93314390 100644 --- a/apps/code/menu_controller.h +++ b/apps/code/menu_controller.h @@ -23,6 +23,7 @@ public: void reloadConsole(); void openConsoleWithScript(Script script); void scriptContentEditionDidFinish(); + void willExitApp(); /* ViewController */ View * view() override { return &m_selectableTableView; }