diff --git a/apps/expression_editor/app.h b/apps/expression_editor/app.h index f90805121..84b537833 100644 --- a/apps/expression_editor/app.h +++ b/apps/expression_editor/app.h @@ -2,6 +2,7 @@ #define EXPRESSION_EDITOR_APP_H #include +#include #include "controller.h" #include "expression_and_layout.h" @@ -25,9 +26,11 @@ public: private: ExpressionAndLayout m_expressionAndLayout; }; + MathToolbox * mathToolbox() { return &m_toolbox; } private: App(Container * container, Snapshot * snapshot); Controller m_controller; + MathToolbox m_toolbox; }; } diff --git a/apps/expression_editor/controller.cpp b/apps/expression_editor/controller.cpp index 3be04567e..f29c14c61 100644 --- a/apps/expression_editor/controller.cpp +++ b/apps/expression_editor/controller.cpp @@ -1,4 +1,5 @@ #include "controller.h" +#include using namespace Poincare; @@ -32,7 +33,23 @@ bool Controller::handleEvent(Ion::Events::Event event) { m_view.cursorPositionChanged(); return true; } - return false; + return Responder::handleEvent(event); +} + +Toolbox * Controller::toolbox() { + ExpressionEditor::App * expressionEditorApp = static_cast(app()); + return expressionEditorApp->mathToolbox(); +} + +void Controller::insertLayoutAtCursor(ExpressionLayout * layout, ExpressionLayout * pointedLayout) { + if (layout == nullptr) { + return; + } + m_cursor.addLayout(layout); + m_cursor.setPointedExpressionLayout(pointedLayout); + m_cursor.setPosition(ExpressionLayoutCursor::Position::Right); + m_cursor.setPositionInside(0); + m_view.cursorPositionChanged(); } bool Controller::privateHandleEvent(Ion::Events::Event event) { diff --git a/apps/expression_editor/controller.h b/apps/expression_editor/controller.h index e285ff8a8..f34518ff5 100644 --- a/apps/expression_editor/controller.h +++ b/apps/expression_editor/controller.h @@ -17,6 +17,13 @@ public: View * view() override { return &m_view; } void didBecomeFirstResponder() override; bool handleEvent(Ion::Events::Event event) override; + + /* Responder */ + Toolbox * toolbox() override; + + /* Callback for Toolbox */ + void insertLayoutAtCursor(ExpressionLayout * layout, ExpressionLayout * pointedLayout); + private: bool privateHandleEvent(Ion::Events::Event event); bool handleMoveEvent(Ion::Events::Event event); diff --git a/apps/math_toolbox.cpp b/apps/math_toolbox.cpp index caa25e6dc..b0e319531 100644 --- a/apps/math_toolbox.cpp +++ b/apps/math_toolbox.cpp @@ -9,8 +9,8 @@ * subtree, the edited text is set at I18n::Message::Default. */ const ToolboxMessageTree calculChildren[4] = { - ToolboxMessageTree(I18n::Message::DiffCommandWithArg, I18n::Message::DerivateNumber, I18n::Message::DiffCommandWithArg), - ToolboxMessageTree(I18n::Message::IntCommandWithArg, I18n::Message::Integral, I18n::Message::IntCommandWithArg), + ToolboxMessageTree(I18n::Message::DiffCommandWithArg, I18n::Message::DerivateNumber, I18n::Message::DiffCommandWithArg, nullptr, 0), + ToolboxMessageTree(I18n::Message::IntCommandWithArg, I18n::Message::Integral, I18n::Message::IntCommandWithArg, nullptr, 0, new IntegralLayout(new EmptyVisibleLayout(), new EmptyVisibleLayout, new HorizontalLayout(const_cast(Poincare::ExpressionLayout::ExpressionLayoutArray2(new EmptyVisibleLayout(), new StringLayout("dx",2))), 2, false), false)), ToolboxMessageTree(I18n::Message::SumCommandWithArg, I18n::Message::Sum, I18n::Message::SumCommandWithArg), ToolboxMessageTree(I18n::Message::ProductCommandWithArg, I18n::Message::Product, I18n::Message::ProductCommandWithArg)}; @@ -102,22 +102,34 @@ MathToolbox::MathToolbox() : Toolbox(nullptr, I18n::translate(rootModel()->label { } -TextField * MathToolbox::sender() { - return (TextField *)Toolbox::sender(); +TextField * MathToolbox::textFieldSender() { + return static_cast(Toolbox::sender()); +} + +ExpressionEditor::Controller * MathToolbox::expressionEditorControllerSender() { + return static_cast(Toolbox::sender()); } bool MathToolbox::selectLeaf(ToolboxMessageTree * selectedMessageTree) { - m_selectableTableView.deselectTable(); - ToolboxMessageTree * messageTree = selectedMessageTree; - const char * editedText = I18n::translate(messageTree->insertedText()); - if (!sender()->isEditing()) { - sender()->setEditing(true); + if (0) { + m_selectableTableView.deselectTable(); + ToolboxMessageTree * messageTree = selectedMessageTree; + const char * editedText = I18n::translate(messageTree->insertedText()); + if (!textFieldSender()->isEditing()) { + textFieldSender()->setEditing(true); + } + char strippedEditedText[strlen(editedText)]; + Shared::ToolboxHelpers::TextToInsertForCommandMessage(messageTree->insertedText(), strippedEditedText); + textFieldSender()->insertTextAtLocation(strippedEditedText, textFieldSender()->cursorLocation()); + int newCursorLocation = textFieldSender()->cursorLocation() + Shared::ToolboxHelpers::CursorIndexInCommand(strippedEditedText); + textFieldSender()->setCursorLocation(newCursorLocation); + app()->dismissModalViewController(); + return true; } - char strippedEditedText[strlen(editedText)]; - Shared::ToolboxHelpers::TextToInsertForCommandMessage(messageTree->insertedText(), strippedEditedText); - sender()->insertTextAtLocation(strippedEditedText, sender()->cursorLocation()); - int newCursorLocation = sender()->cursorLocation() + Shared::ToolboxHelpers::CursorIndexInCommand(strippedEditedText); - sender()->setCursorLocation(newCursorLocation); + // Deal with ExpressionEditor::Controller for now. + m_selectableTableView.deselectTable(); + ExpressionLayout * newLayout = selectedMessageTree->layout()->clone(); + expressionEditorControllerSender()->insertLayoutAtCursor(newLayout, newLayout->editableChild(2)->editableChild(0)); app()->dismissModalViewController(); return true; } diff --git a/apps/math_toolbox.h b/apps/math_toolbox.h index 0579969de..9da44865b 100644 --- a/apps/math_toolbox.h +++ b/apps/math_toolbox.h @@ -4,12 +4,14 @@ #define MATRICES_ARE_DEFINED 1 #include #include +#include class MathToolbox : public Toolbox { public: MathToolbox(); protected: - TextField * sender() override; + TextField * textFieldSender(); + ExpressionEditor::Controller * expressionEditorControllerSender(); bool selectLeaf(ToolboxMessageTree * selectedMessageTree) override; const ToolboxMessageTree * rootModel() override; MessageTableCellWithMessage * leafCellAtIndex(int index) override; diff --git a/escher/include/escher/toolbox_message_tree.h b/escher/include/escher/toolbox_message_tree.h index 10e5cb336..aebf25db4 100644 --- a/escher/include/escher/toolbox_message_tree.h +++ b/escher/include/escher/toolbox_message_tree.h @@ -2,23 +2,27 @@ #define ESCHER_TOOLBOX_MESSAGE_TREE_H #include +#include class ToolboxMessageTree : public MessageTree { public: - constexpr ToolboxMessageTree(I18n::Message label = (I18n::Message)0, I18n::Message text = (I18n::Message)0, I18n::Message insertedText = (I18n::Message)0, const ToolboxMessageTree * children = nullptr, int numberOfChildren = 0) : + constexpr ToolboxMessageTree(I18n::Message label = (I18n::Message)0, I18n::Message text = (I18n::Message)0, I18n::Message insertedText = (I18n::Message)0, const ToolboxMessageTree * children = nullptr, int numberOfChildren = 0, Poincare::ExpressionLayout * layout = nullptr) : MessageTree(label, numberOfChildren), m_children(children), m_text(text), - m_insertedText(insertedText) + m_insertedText(insertedText), + m_layout(layout) { }; const MessageTree * children(int index) const override; I18n::Message text() const; I18n::Message insertedText() const; + Poincare::ExpressionLayout * layout() const { return m_layout; } private: const ToolboxMessageTree * m_children; I18n::Message m_text; I18n::Message m_insertedText; + Poincare::ExpressionLayout * m_layout; }; #endif diff --git a/poincare/include/poincare/expression_layout_cursor.h b/poincare/include/poincare/expression_layout_cursor.h index 5b9dfae37..5813fee8c 100644 --- a/poincare/include/poincare/expression_layout_cursor.h +++ b/poincare/include/poincare/expression_layout_cursor.h @@ -43,6 +43,7 @@ public: bool moveDown(); /* Edition */ + void addLayout(ExpressionLayout * layout); ExpressionLayout * addEmptyExponentialLayout(); ExpressionLayout * addEmptyFractionLayout(); ExpressionLayout * addEmptyLogarithmLayout(); diff --git a/poincare/include/poincare_layouts.h b/poincare/include/poincare_layouts.h new file mode 100644 index 000000000..f3d71feae --- /dev/null +++ b/poincare/include/poincare_layouts.h @@ -0,0 +1,32 @@ +#ifndef POINCARE_LAYOUTS_H +#define POINCARE_LAYOUTS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/poincare/src/expression_layout_cursor.cpp b/poincare/src/expression_layout_cursor.cpp index 19016af2c..d10c759e6 100644 --- a/poincare/src/expression_layout_cursor.cpp +++ b/poincare/src/expression_layout_cursor.cpp @@ -52,6 +52,10 @@ bool ExpressionLayoutCursor::moveDown() { return m_pointedExpressionLayout->moveDown(this); } +void ExpressionLayoutCursor::addLayout(ExpressionLayout * layout) { + pointedExpressionLayout()->addBrother(this, layout); +} + ExpressionLayout * ExpressionLayoutCursor::addEmptyExponentialLayout() { CharLayout * child1 = new CharLayout(Ion::Charset::Exponential); EmptyVisibleLayout * child2 = new EmptyVisibleLayout();