From f3200fe2e96cad2d2d65f79c1f7a925948a7b5e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Tue, 17 Oct 2017 11:38:36 +0200 Subject: [PATCH] [code] Program store that uses an accordeon buffer to store the programs. The user can now add scripts. A contextual menu displays various options when clicking on a script, such as editing. Change-Id: I124a17f7584b0beedb897e8499ca0a1bb6c13cbe --- apps/code/Makefile | 2 + apps/code/app.cpp | 13 +- apps/code/app.h | 6 +- apps/code/base.de.i18n | 5 + apps/code/base.en.i18n | 5 + apps/code/base.es.i18n | 5 + apps/code/base.fr.i18n | 5 + apps/code/base.pt.i18n | 5 + apps/code/editor_controller.cpp | 8 +- apps/code/editor_controller.h | 5 +- apps/code/menu_controller.cpp | 72 ++++--- apps/code/menu_controller.h | 23 ++- apps/code/program.cpp | 43 +---- apps/code/program.h | 7 +- apps/code/program_parameter_controller.cpp | 78 ++++++++ apps/code/program_parameter_controller.h | 43 +++++ apps/code/program_store.cpp | 208 +++++++++++++++++++++ apps/code/program_store.h | 46 +++++ escher/include/escher/text_area.h | 5 +- escher/src/text_area.cpp | 22 ++- 20 files changed, 513 insertions(+), 93 deletions(-) create mode 100644 apps/code/program_parameter_controller.cpp create mode 100644 apps/code/program_parameter_controller.h create mode 100644 apps/code/program_store.cpp create mode 100644 apps/code/program_store.h diff --git a/apps/code/Makefile b/apps/code/Makefile index f2d18db06..baa049a72 100644 --- a/apps/code/Makefile +++ b/apps/code/Makefile @@ -10,6 +10,8 @@ app_objs += $(addprefix apps/code/,\ editor_controller.o\ menu_controller.o\ program.o\ + program_parameter_controller.o\ + program_store.o\ ) i18n_files += $(addprefix apps/code/,\ diff --git a/apps/code/app.cpp b/apps/code/app.cpp index 63942a6ba..957aa68e8 100644 --- a/apps/code/app.cpp +++ b/apps/code/app.cpp @@ -17,9 +17,8 @@ const Image * App::Descriptor::icon() { return ImageStore::CodeIcon; } -App::Snapshot::Snapshot() : - m_program() -{ +App::Snapshot::Snapshot() { + m_programStore.addDefaultProgram(); } App * App::Snapshot::unpack(Container * container) { @@ -27,7 +26,7 @@ App * App::Snapshot::unpack(Container * container) { } void App::Snapshot::reset() { - m_program.setContent(""); + m_programStore.deleteAll(); } App::Descriptor * App::Snapshot::descriptor() { @@ -35,14 +34,14 @@ App::Descriptor * App::Snapshot::descriptor() { return &descriptor; } -Program * App::Snapshot::program() { - return &m_program; +ProgramStore * App::Snapshot::programStore() { + return &m_programStore; } App::App(Container * container, Snapshot * snapshot) : ::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_menuController(&m_listFooter, snapshot->programStore(), &m_listFooter), m_codeStackViewController(&m_modalViewController, &m_listFooter) { } diff --git a/apps/code/app.h b/apps/code/app.h index 5b300ba77..09638e397 100644 --- a/apps/code/app.h +++ b/apps/code/app.h @@ -3,7 +3,7 @@ #include #include "menu_controller.h" -#include "program.h" +#include "program_store.h" #include "../shared/message_controller.h" namespace Code { @@ -22,9 +22,9 @@ public: App * unpack(Container * container) override; void reset() override; Descriptor * descriptor() override; - Program * program(); + ProgramStore * programStore(); private: - Program m_program; + ProgramStore m_programStore; }; StackViewController * stackViewController() { return &m_codeStackViewController; } private: diff --git a/apps/code/base.de.i18n b/apps/code/base.de.i18n index 12da69116..f61ece54d 100644 --- a/apps/code/base.de.i18n +++ b/apps/code/base.de.i18n @@ -1,4 +1,9 @@ AddScript = "Add a script" +ScriptOptions = "Script options" +EditScript = "Edit script" +RenameScript = "Rename script" +AutoImportScript = "Auto import." +DeleteScript = "Delete script" Console = "Console" ConsoleError = "Error" EditProgram = "Programm bearbeiten" diff --git a/apps/code/base.en.i18n b/apps/code/base.en.i18n index 20d5a5b76..0dfbd1d2f 100644 --- a/apps/code/base.en.i18n +++ b/apps/code/base.en.i18n @@ -1,4 +1,9 @@ AddScript = "Add a script" +ScriptOptions = "Script options" +EditScript = "Edit script" +RenameScript = "Rename script" +AutoImportScript = "Auto import." +DeleteScript = "Delete script" Console = "Console" ConsoleError = "Error" EditProgram = "Edit program" diff --git a/apps/code/base.es.i18n b/apps/code/base.es.i18n index e1e6419d5..98a2c6152 100644 --- a/apps/code/base.es.i18n +++ b/apps/code/base.es.i18n @@ -1,4 +1,9 @@ AddScript = "Add a script" +ScriptOptions = "Script options" +EditScript = "Edit script" +RenameScript = "Rename script" +AutoImportScript = "Auto import." +DeleteScript = "Delete script" Console = "Console" ConsoleError = "Error" EditProgram = "Editar el programa" diff --git a/apps/code/base.fr.i18n b/apps/code/base.fr.i18n index 2eadb6aeb..7088347f4 100644 --- a/apps/code/base.fr.i18n +++ b/apps/code/base.fr.i18n @@ -1,4 +1,9 @@ AddScript = "Add a script" +ScriptOptions = "Script options" +EditScript = "Edit script" +RenameScript = "Rename script" +AutoImportScript = "Auto import." +DeleteScript = "Delete script" Console = "Console" ConsoleError = "Error" EditProgram = "Editer le programme" diff --git a/apps/code/base.pt.i18n b/apps/code/base.pt.i18n index c10b49acd..1572add77 100644 --- a/apps/code/base.pt.i18n +++ b/apps/code/base.pt.i18n @@ -1,4 +1,9 @@ AddScript = "Add a script" +ScriptOptions = "Script options" +EditScript = "Edit script" +RenameScript = "Rename script" +AutoImportScript = "Auto import." +DeleteScript = "Delete script" Console = "Console" ConsoleError = "Error" EditProgram = "Editar programa" diff --git a/apps/code/editor_controller.cpp b/apps/code/editor_controller.cpp index 9a3f9f575..091adda0e 100644 --- a/apps/code/editor_controller.cpp +++ b/apps/code/editor_controller.cpp @@ -2,14 +2,14 @@ namespace Code { -EditorController::EditorController(Program * program) : +EditorController::EditorController() : ViewController(nullptr), - m_view(this, program->editableContent(), program->bufferSize()) + m_view(this) { } -View * EditorController::view() { - return &m_view; +void EditorController::setProgram(Program program){ + m_view.setText(program.editableContent(), program.bufferSize()); } bool EditorController::handleEvent(Ion::Events::Event event) { diff --git a/apps/code/editor_controller.h b/apps/code/editor_controller.h index 2b77faf2a..1b99805fa 100644 --- a/apps/code/editor_controller.h +++ b/apps/code/editor_controller.h @@ -8,8 +8,9 @@ namespace Code { class EditorController : public ViewController { public: - EditorController(Program * program); - View * view() override; + EditorController(); + void setProgram(Program program); + View * view() override { return &m_view; } bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; private: diff --git a/apps/code/menu_controller.cpp b/apps/code/menu_controller.cpp index 899a36a81..62a9acf72 100644 --- a/apps/code/menu_controller.cpp +++ b/apps/code/menu_controller.cpp @@ -4,19 +4,22 @@ namespace Code { -MenuController::MenuController(Responder * parentResponder, Program * program, ButtonRowController * footer) : +MenuController::MenuController(Responder * parentResponder, ProgramStore * programStore, ButtonRowController * footer) : ViewController(parentResponder), ButtonRowDelegate(nullptr, footer), + m_programStore(programStore), m_addNewProgramCell(I18n::Message::AddScript), - m_editorController(program), - 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)) + }, this)), + m_selectableTableView(this, this, 0, 1, 0, 0, 0, 0, this, nullptr, false), + m_consoleController(parentResponder), + m_programParameterController(nullptr, I18n::Message::ScriptOptions, m_programStore) { - m_stackViewController = (StackViewController *) (parentResponder->parentResponder()); // TODO: Dirty? + for (int i = 0; i< k_maxNumberOfCells; i++) { + m_cells[i].setMessageFontSize(KDText::FontSize::Large); + } } ConsoleController * MenuController::consoleController() { @@ -38,46 +41,65 @@ bool MenuController::handleEvent(Ion::Events::Event event) { 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; + if (m_selectableTableView.selectedRow()<0) { + 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); - return true; + int selectedRow = m_selectableTableView.selectedRow(); + if (selectedRow >= 0 && selectedRow < m_programStore->numberOfPrograms()) { + configureProgram(); + return true; + } else if (selectedRow == m_programStore->numberOfPrograms()) { + addProgram(); + return true; + } } return false; } +void MenuController::configureProgram() { + m_programParameterController.setProgram(m_selectableTableView.selectedRow()); + stackViewController()->push(&m_programParameterController); +} + +void MenuController::addProgram() { + m_selectableTableView.selectCellAtLocation(0, 0); + m_programStore->addDefaultProgram(); + m_selectableTableView.reloadData(); + m_selectableTableView.selectCellAtLocation(0, numberOfRows()-2); +} + int MenuController::numberOfRows() { - return k_totalNumberOfCells + 1; + return m_programStore->numberOfPrograms() + 1; + //TODO do not add the addProgram row if there can be no more programs stored. }; KDCoordinate MenuController::cellHeight() { - return Metric::ParameterCellHeight; + return k_rowHeight; } HighlightCell * MenuController::reusableCell(int index) { assert(index >= 0); - if (index < k_totalNumberOfCells) { + if (index < m_programStore->numberOfPrograms()) { return &m_cells[index]; } - assert(index == k_totalNumberOfCells); + assert(index == m_programStore->numberOfPrograms()); return &m_addNewProgramCell; } int MenuController::reusableCellCount() { - return k_totalNumberOfCells + 1; + return m_programStore->numberOfPrograms() + 1; } void MenuController::willDisplayCellForIndex(HighlightCell * cell, int index) { - if (index < k_totalNumberOfCells) { + if (index < m_programStore->numberOfPrograms()) { 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]); + // TODO: store script names + myCell->setMessage(I18n::Message::Console); } } @@ -87,7 +109,11 @@ int MenuController::numberOfButtons(ButtonRowController::Position position) cons Button * MenuController::buttonAtIndex(int index, ButtonRowController::Position position) const { assert(index == 0); - return (Button *) (&m_consoleButton); + return const_cast