diff --git a/apps/code/app.cpp b/apps/code/app.cpp index 805db528a..63942a6ba 100644 --- a/apps/code/app.cpp +++ b/apps/code/app.cpp @@ -26,24 +26,24 @@ App * App::Snapshot::unpack(Container * container) { return new App(container, this); } +void App::Snapshot::reset() { + m_program.setContent(""); +} + App::Descriptor * App::Snapshot::descriptor() { static Descriptor descriptor; return &descriptor; } -void App::Snapshot::reset() { - m_program.setContent(""); -} - Program * App::Snapshot::program() { return &m_program; } -static KDColor sCodeColors[] = {KDColorBlack, KDColorBlack, KDColorBlack, KDColorBlack, KDColorBlack}; - App::App(Container * container, Snapshot * snapshot) : - ::App(container, snapshot, &m_menuController, I18n::Message::Warning), - m_menuController(this, snapshot->program()) + ::App(container, snapshot, &m_codeStackViewController, I18n::Message::Warning), + m_listFooter(&m_codeStackViewController, &m_menuController, &m_menuController, ButtonRowController::Position::Bottom, ButtonRowController::Style::EmbossedGrey), + m_menuController(&m_listFooter, snapshot->program(), &m_listFooter), + m_codeStackViewController(&m_modalViewController, &m_listFooter) { } diff --git a/apps/code/app.h b/apps/code/app.h index 1dccfa149..5b300ba77 100644 --- a/apps/code/app.h +++ b/apps/code/app.h @@ -26,9 +26,12 @@ public: private: Program m_program; }; + StackViewController * stackViewController() { return &m_codeStackViewController; } private: App(Container * container, Snapshot * snapshot); + ButtonRowController m_listFooter; MenuController m_menuController; + StackViewController m_codeStackViewController; }; } diff --git a/apps/code/base.de.i18n b/apps/code/base.de.i18n index 49ef71391..12da69116 100644 --- a/apps/code/base.de.i18n +++ b/apps/code/base.de.i18n @@ -1,3 +1,4 @@ +AddScript = "Add a script" Console = "Console" ConsoleError = "Error" EditProgram = "Programm bearbeiten" diff --git a/apps/code/base.en.i18n b/apps/code/base.en.i18n index fdc231ce1..20d5a5b76 100644 --- a/apps/code/base.en.i18n +++ b/apps/code/base.en.i18n @@ -1,3 +1,4 @@ +AddScript = "Add a script" Console = "Console" ConsoleError = "Error" EditProgram = "Edit program" diff --git a/apps/code/base.es.i18n b/apps/code/base.es.i18n index 3e2584359..e1e6419d5 100644 --- a/apps/code/base.es.i18n +++ b/apps/code/base.es.i18n @@ -1,3 +1,4 @@ +AddScript = "Add a script" Console = "Console" ConsoleError = "Error" EditProgram = "Editar el programa" diff --git a/apps/code/base.fr.i18n b/apps/code/base.fr.i18n index 3542f462e..2eadb6aeb 100644 --- a/apps/code/base.fr.i18n +++ b/apps/code/base.fr.i18n @@ -1,3 +1,4 @@ +AddScript = "Add a script" Console = "Console" ConsoleError = "Error" EditProgram = "Editer le programme" diff --git a/apps/code/base.pt.i18n b/apps/code/base.pt.i18n index b34989fe3..c10b49acd 100644 --- a/apps/code/base.pt.i18n +++ b/apps/code/base.pt.i18n @@ -1,3 +1,4 @@ +AddScript = "Add a script" Console = "Console" ConsoleError = "Error" EditProgram = "Editar programa" diff --git a/apps/code/console_controller.cpp b/apps/code/console_controller.cpp index 1ebe3867d..6639990c0 100644 --- a/apps/code/console_controller.cpp +++ b/apps/code/console_controller.cpp @@ -1,5 +1,6 @@ #include "console_controller.h" #include +#include "app.h" extern "C" { #include @@ -138,6 +139,11 @@ bool ConsoleController::textFieldDidFinishEditing(TextField * textField, const c return true; } +bool ConsoleController::textFieldDidAbortEditing(TextField * textField, const char * text) { + app()->dismissModalViewController(); + return true; +} + Toolbox * ConsoleController::toolboxForTextField(TextField * textFied) { return nullptr; } diff --git a/apps/code/console_controller.h b/apps/code/console_controller.h index 2e6f45d0e..492a4ea79 100644 --- a/apps/code/console_controller.h +++ b/apps/code/console_controller.h @@ -37,6 +37,7 @@ public: bool textFieldShouldFinishEditing(TextField * textField, Ion::Events::Event event) override; bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override; bool textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) override; + bool textFieldDidAbortEditing(TextField * textField, const char * text) override; Toolbox * toolboxForTextField(TextField * textFied) override; // Python diff --git a/apps/code/menu_controller.cpp b/apps/code/menu_controller.cpp index a257dc084..899a36a81 100644 --- a/apps/code/menu_controller.cpp +++ b/apps/code/menu_controller.cpp @@ -4,12 +4,23 @@ namespace Code { -MenuController::MenuController(Responder * parentResponder, Program * program) : +MenuController::MenuController(Responder * parentResponder, Program * program, ButtonRowController * footer) : ViewController(parentResponder), - m_selectableTableView(this, this, 0, 1, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin, this), + ButtonRowDelegate(nullptr, footer), + m_addNewProgramCell(I18n::Message::AddScript), m_editorController(program), - m_consoleController(parentResponder) + m_consoleController(parentResponder), + m_selectableTableView(this, this, 0, 1, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin, this), + m_consoleButton(this, I18n::Message::Console, Invocation([](void * context, void * sender) { + MenuController * menu = (MenuController *)context; + menu->app()->displayModalViewController(menu->consoleController(), 0.5f, 0.5f); + }, this)) { + m_stackViewController = (StackViewController *) (parentResponder->parentResponder()); // TODO: Dirty? +} + +ConsoleController * MenuController::consoleController() { + return &m_consoleController; } View * MenuController::view() { @@ -22,6 +33,16 @@ void MenuController::didBecomeFirstResponder() { } bool MenuController::handleEvent(Ion::Events::Event event) { + if (event == Ion::Events::Down) { + m_selectableTableView.deselectTable(); + footer()->setSelectedButton(0); + return true; + } else if (event == Ion::Events::Up) { + footer()->setSelectedButton(-1); + m_selectableTableView.selectCellAtLocation(0, numberOfRows()-1); + app()->setFirstResponder(&m_selectableTableView); + return true; + } ViewController * vc[2] = {&m_editorController, &m_consoleController}; if (event == Ion::Events::OK || event == Ion::Events::EXE) { app()->displayModalViewController(vc[selectedRow()], 0.5f, 0.5f); @@ -31,29 +52,42 @@ bool MenuController::handleEvent(Ion::Events::Event event) { } int MenuController::numberOfRows() { - return k_totalNumberOfCells; + return k_totalNumberOfCells + 1; }; - -HighlightCell * MenuController::reusableCell(int index) { - assert(index >= 0); - assert(index < k_totalNumberOfCells); - return &m_cells[index]; -} - -int MenuController::reusableCellCount() { - return k_totalNumberOfCells; -} - KDCoordinate MenuController::cellHeight() { return Metric::ParameterCellHeight; } +HighlightCell * MenuController::reusableCell(int index) { + assert(index >= 0); + if (index < k_totalNumberOfCells) { + return &m_cells[index]; + } + assert(index == k_totalNumberOfCells); + return &m_addNewProgramCell; +} + +int MenuController::reusableCellCount() { + return k_totalNumberOfCells + 1; +} + void MenuController::willDisplayCellForIndex(HighlightCell * cell, int index) { - MessageTableCell * myCell = (MessageTableCell *)cell; - I18n::Message titles[k_totalNumberOfCells] = {I18n::Message::EditProgram, I18n::Message::Console}; - // TODO: translate Console in the .i18n - myCell->setMessage(titles[index]); + if (index < k_totalNumberOfCells) { + MessageTableCell * myCell = (MessageTableCell *)cell; + I18n::Message titles[k_totalNumberOfCells] = {I18n::Message::EditProgram, I18n::Message::Console}; + // TODO: translate Console in the .i18n + myCell->setMessage(titles[index]); + } +} + +int MenuController::numberOfButtons(ButtonRowController::Position position) const { + return 1; +} + +Button * MenuController::buttonAtIndex(int index, ButtonRowController::Position position) const { + assert(index == 0); + return (Button *) (&m_consoleButton); } } diff --git a/apps/code/menu_controller.h b/apps/code/menu_controller.h index be43ba2ae..c40f4e4e8 100644 --- a/apps/code/menu_controller.h +++ b/apps/code/menu_controller.h @@ -4,27 +4,41 @@ #include #include "console_controller.h" #include "editor_controller.h" +#include #include "program.h" namespace Code { -class MenuController : public ViewController, public SimpleListViewDataSource, public SelectableTableViewDataSource { +class MenuController : public ViewController, public SimpleListViewDataSource, public SelectableTableViewDataSource, public ButtonRowDelegate { public: - MenuController(Responder * parentResponder, Program * program); + MenuController(Responder * parentResponder, Program * program, ButtonRowController * footer); + ConsoleController * consoleController(); + StackViewController * stackViewController() { return m_stackViewController; } + + /* ViewController */ View * view() override; bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; + + /* SimpleListViewDataSource */ int numberOfRows() override; KDCoordinate cellHeight() override; HighlightCell * reusableCell(int index) override; int reusableCellCount() override; void willDisplayCellForIndex(HighlightCell * cell, int index) override; + + /* ButtonRowDelegate */ + int numberOfButtons(ButtonRowController::Position position) const override; + Button * buttonAtIndex(int index, ButtonRowController::Position position) const override; private: constexpr static int k_totalNumberOfCells = 2; MessageTableCell m_cells[k_totalNumberOfCells]; - SelectableTableView m_selectableTableView; + Shared::NewFunctionCell m_addNewProgramCell; + StackViewController * m_stackViewController; EditorController m_editorController; ConsoleController m_consoleController; + SelectableTableView m_selectableTableView; + Button m_consoleButton; }; } diff --git a/apps/code/program.h b/apps/code/program.h index fd4e6837c..ea65782cb 100644 --- a/apps/code/program.h +++ b/apps/code/program.h @@ -20,4 +20,3 @@ private: } #endif -