diff --git a/apps/sequence/Makefile b/apps/sequence/Makefile index f86d2de35..1538d8e99 100644 --- a/apps/sequence/Makefile +++ b/apps/sequence/Makefile @@ -2,12 +2,12 @@ app_objs += $(addprefix apps/sequence/,\ app.o\ list/list_controller.o\ list/list_parameter_controller.o\ + list/sequence_toolbox.o\ list/type_parameter_controller.o\ values/values_controller.o\ sequence.o\ sequence_store.o\ sequence_title_cell.o\ - sequence_toolbox.o\ ) app_images += apps/sequence/sequence_icon.png diff --git a/apps/sequence/app.cpp b/apps/sequence/app.cpp index 9cb4fbf81..aa4c7f945 100644 --- a/apps/sequence/app.cpp +++ b/apps/sequence/app.cpp @@ -7,7 +7,6 @@ namespace Sequence { App::App(Container * container, Context * context) : TextFieldDelegateApp(container, &m_inputViewController, "Suites", "SUITES", ImageStore::SequenceIcon), - m_sequenceToolbox(SequenceToolbox()), m_sequenceStore(SequenceStore()), m_nContext(VariableContext('n', context)), m_listController(&m_listHeader, &m_sequenceStore, &m_listHeader), @@ -38,12 +37,4 @@ const char * App::XNT() { return "n"; } -SequenceToolbox * App::sequenceToolbox() { - return &m_sequenceToolbox; -} - -SequenceStore * App::sequenceStore() { - return &m_sequenceStore; -} - } diff --git a/apps/sequence/app.h b/apps/sequence/app.h index 6b12a837a..df4b07b5c 100644 --- a/apps/sequence/app.h +++ b/apps/sequence/app.h @@ -4,7 +4,6 @@ #include #include #include "sequence_store.h" -#include "sequence_toolbox.h" #include "list/list_controller.h" #include "values/values_controller.h" #include "../shared/text_field_delegate_app.h" @@ -17,10 +16,7 @@ public: InputViewController * inputViewController(); Poincare::Context * localContext() override; const char * XNT() override; - SequenceToolbox * sequenceToolbox(); - SequenceStore * sequenceStore(); private: - SequenceToolbox m_sequenceToolbox; SequenceStore m_sequenceStore; Poincare::VariableContext m_nContext; ListController m_listController; diff --git a/apps/sequence/list/list_controller.cpp b/apps/sequence/list/list_controller.cpp index 4298a74bb..546f07421 100644 --- a/apps/sequence/list/list_controller.cpp +++ b/apps/sequence/list/list_controller.cpp @@ -15,7 +15,8 @@ ListController::ListController(Responder * parentResponder, SequenceStore * sequ SequenceTitleCell(FunctionTitleCell::Orientation::VerticalIndicator), SequenceTitleCell(FunctionTitleCell::Orientation::VerticalIndicator)}, m_parameterController(ListParameterController(this, sequenceStore)), m_typeParameterController(this, sequenceStore), - m_typeStackController(StackViewController(nullptr, &m_typeParameterController, true, KDColorWhite, Palette::PurpleDark, Palette::PurpleDark)) + m_typeStackController(StackViewController(nullptr, &m_typeParameterController, true, KDColorWhite, Palette::PurpleDark, Palette::PurpleDark)), + m_sequenceToolbox(SequenceToolbox(m_sequenceStore)) { } @@ -23,6 +24,21 @@ const char * ListController::title() const { return "Suites"; } +Toolbox * ListController::toolboxForTextField(TextField * textField) { + int recurrenceDepth = 0; + int sequenceDefinition = sequenceDefinitionForRow(m_selectableTableView.selectedRow()); + Sequence * sequence = m_sequenceStore->functionAtIndex(sequenceIndexForRow(m_selectableTableView.selectedRow())); + if (sequenceDefinition == 0) { + recurrenceDepth = sequence->numberOfElements()-1; + } + m_sequenceToolbox.addCells(recurrenceDepth); + return &m_sequenceToolbox; +} + +TextFieldDelegateApp * ListController::textFieldDelegateApp() { + return (App *)app(); +} + int ListController::numberOfRows() { int numberOfRows = 0; for (int i = 0; i < m_sequenceStore->numberOfFunctions(); i++) { @@ -116,6 +132,7 @@ void ListController::editExpression(Sequence * sequence, int sequenceDefinition, } App * myApp = (App *)app(); InputViewController * inputController = myApp->inputViewController(); + inputController->setTextFieldDelegate(this); if (sequenceDefinition == 0) { inputController->edit(this, event, sequence, initialText, [](void * context, void * sender){ diff --git a/apps/sequence/list/list_controller.h b/apps/sequence/list/list_controller.h index 1d3d72e46..144249d66 100644 --- a/apps/sequence/list/list_controller.h +++ b/apps/sequence/list/list_controller.h @@ -8,11 +8,13 @@ #include "type_parameter_controller.h" #include "../../shared/new_function_cell.h" #include "../../shared/list_controller.h" +#include "../../shared/text_field_delegate.h" #include "list_parameter_controller.h" +#include "sequence_toolbox.h" namespace Sequence { -class ListController : public Shared::ListController { +class ListController : public Shared::ListController, public Shared::TextFieldDelegate { public: ListController(Responder * parentResponder, SequenceStore * sequenceStore, HeaderViewController * header); const char * title() const override; @@ -20,7 +22,9 @@ public: virtual KDCoordinate rowHeight(int j) override; void willDisplayCellAtLocation(TableViewCell * cell, int i, int j) override; bool handleEvent(Ion::Events::Event event) override; + Toolbox * toolboxForTextField(TextField * textField) override; private: + Shared::TextFieldDelegateApp * textFieldDelegateApp() override; bool handleEnter(); void editExpression(Sequence * sequence, int sequenceDefinitionIndex, Ion::Events::Event event); ListParameterController * parameterController() override; @@ -39,6 +43,7 @@ private: ListParameterController m_parameterController; TypeParameterController m_typeParameterController; StackViewController m_typeStackController; + SequenceToolbox m_sequenceToolbox; }; } diff --git a/apps/sequence/sequence_toolbox.cpp b/apps/sequence/list/sequence_toolbox.cpp similarity index 74% rename from apps/sequence/sequence_toolbox.cpp rename to apps/sequence/list/sequence_toolbox.cpp index 03c0013d5..38a5f8294 100644 --- a/apps/sequence/sequence_toolbox.cpp +++ b/apps/sequence/list/sequence_toolbox.cpp @@ -1,15 +1,16 @@ #include "sequence_toolbox.h" -#include "../../poincare/src/layout/baseline_relative_layout.h" -#include "../../poincare/src/layout/string_layout.h" +#include "../../../poincare/src/layout/baseline_relative_layout.h" +#include "../../../poincare/src/layout/string_layout.h" #include using namespace Poincare; namespace Sequence { -SequenceToolbox::SequenceToolbox() : +SequenceToolbox::SequenceToolbox(SequenceStore * sequenceStore) : MathToolbox(), - m_numberOfAddedCells(0) + m_numberOfAddedCells(0), + m_sequenceStore(sequenceStore) { } @@ -64,10 +65,14 @@ int SequenceToolbox::typeAtLocation(int i, int j) { return MathToolbox::typeAtLocation(i,j); } -void SequenceToolbox::addCells(int numberOfAddedCells, char ** cellNames, char ** cellSubscript) { - m_numberOfAddedCells = numberOfAddedCells; - for (int i = 0; i < numberOfAddedCells; i++) { - m_addedCellLayout[i] = new BaselineRelativeLayout(new StringLayout(cellNames[i], 1, KDText::FontSize::Large), new StringLayout(cellSubscript[i], strlen(cellSubscript[i]), KDText::FontSize::Small), BaselineRelativeLayout::Type::Subscript); +void SequenceToolbox::addCells(int recurrenceDepth) { + m_numberOfAddedCells = 0; + for (int k = 0; k < m_sequenceStore->numberOfFunctions(); k++) { + Sequence * s = m_sequenceStore->functionAtIndex(k); + for (int j = 0; j < recurrenceDepth; j++) { + m_addedCellLayout[m_numberOfAddedCells] = new BaselineRelativeLayout(new StringLayout((char *)s->name(), 1, KDText::FontSize::Large), new StringLayout((char *)(j == 0? "n" : "n+1"), strlen((char *)(j == 0? "n" : "n+1")), KDText::FontSize::Small), BaselineRelativeLayout::Type::Subscript); + m_numberOfAddedCells++; + } } } diff --git a/apps/sequence/sequence_toolbox.h b/apps/sequence/list/sequence_toolbox.h similarity index 80% rename from apps/sequence/sequence_toolbox.h rename to apps/sequence/list/sequence_toolbox.h index c26675496..3f2305f49 100644 --- a/apps/sequence/sequence_toolbox.h +++ b/apps/sequence/list/sequence_toolbox.h @@ -1,26 +1,28 @@ #ifndef SEQUENCE_SEQUENCE_TOOLBOX_H #define SEQUENCE_SEQUENCE_TOOLBOX_H -#include "../math_toolbox.h" +#include "../../math_toolbox.h" +#include "../sequence_store.h" namespace Sequence { class SequenceToolbox : public MathToolbox { public: - SequenceToolbox(); + SequenceToolbox(SequenceStore * sequenceStore); bool handleEvent(Ion::Events::Event event) override; int numberOfRows() override; TableViewCell * reusableCell(int index, int type) override; void willDisplayCellForIndex(TableViewCell * cell, int index) override; KDCoordinate rowHeight(int j) override; int typeAtLocation(int i, int j) override; - void addCells(int numberOfAddedCells, char ** cellNames, char ** cellSubscripts); + void addCells(int recurrenceDepth); private: bool selectAddedCell(int selectedRow); constexpr static KDCoordinate k_addedRowHeight = 20; ExpressionMenuListCell m_addedCells[k_maxNumberOfDisplayedRows]; Poincare::ExpressionLayout * m_addedCellLayout[k_maxNumberOfDisplayedRows]; int m_numberOfAddedCells; + SequenceStore * m_sequenceStore; }; }