diff --git a/apps/expression_editor/controller.cpp b/apps/expression_editor/controller.cpp index 1ed4f7d7e..40563a736 100644 --- a/apps/expression_editor/controller.cpp +++ b/apps/expression_editor/controller.cpp @@ -80,8 +80,7 @@ ExpressionLayout * Controller::handleAddEvent(Ion::Events::Event event) { return m_cursor.addEmptyFractionLayout(); } if (event == Ion::Events::XNT) { - //TODO - return nullptr; + return m_cursor.addXNTCharLayout(); } if (event == Ion::Events::Exp) { return m_cursor.addEmptyExponentialLayout(); diff --git a/poincare/include/poincare/expression_layout.h b/poincare/include/poincare/expression_layout.h index 5398dee72..021f891da 100644 --- a/poincare/include/poincare/expression_layout.h +++ b/poincare/include/poincare/expression_layout.h @@ -63,13 +63,17 @@ public: bool moveUpInside(ExpressionLayoutCursor * cursor); virtual bool moveDown(ExpressionLayoutCursor * cursor, ExpressionLayout * previousLayout = nullptr, ExpressionLayout * previousPreviousLayout = nullptr); bool moveDownInside(ExpressionLayoutCursor * cursor); + + /* Other */ + virtual char XNTChar() const; + protected: virtual void render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) = 0; virtual KDSize computeSize() = 0; virtual void computeBaseline() = 0; virtual KDPoint positionOfChild(ExpressionLayout * child) = 0; void detachChildAtIndex(int i); - virtual void moveCursorInsideAtDirection ( + virtual void moveCursorInsideAtDirection ( VerticalDirection direction, ExpressionLayoutCursor * cursor, ExpressionLayout ** childResult, diff --git a/poincare/include/poincare/expression_layout_cursor.h b/poincare/include/poincare/expression_layout_cursor.h index d7bb195ff..5b9dfae37 100644 --- a/poincare/include/poincare/expression_layout_cursor.h +++ b/poincare/include/poincare/expression_layout_cursor.h @@ -49,6 +49,7 @@ public: ExpressionLayout * addEmptyPowerLayout(); ExpressionLayout * addEmptyRootLayout(); ExpressionLayout * addEmptySquarePowerLayout(); + ExpressionLayout * addXNTCharLayout(); ExpressionLayout * insertText(const char * text); private: diff --git a/poincare/src/expression_layout_cursor.cpp b/poincare/src/expression_layout_cursor.cpp index 8db913a3f..19016af2c 100644 --- a/poincare/src/expression_layout_cursor.cpp +++ b/poincare/src/expression_layout_cursor.cpp @@ -102,6 +102,12 @@ ExpressionLayout * ExpressionLayoutCursor::addEmptySquarePowerLayout() { return child1; } +ExpressionLayout * ExpressionLayoutCursor::addXNTCharLayout() { + CharLayout * newChild = new CharLayout(m_pointedExpressionLayout->XNTChar()); + m_pointedExpressionLayout->addBrother(this, newChild); + return newChild; +} + ExpressionLayout * ExpressionLayoutCursor::insertText(const char * text) { int textLength = strlen(text); if (textLength <= 0) { diff --git a/poincare/src/layout/expression_layout.cpp b/poincare/src/layout/expression_layout.cpp index 3a92820d7..cb2bdb2a0 100644 --- a/poincare/src/layout/expression_layout.cpp +++ b/poincare/src/layout/expression_layout.cpp @@ -189,6 +189,13 @@ void ExpressionLayout::detachChild(const ExpressionLayout * e) { } } +char ExpressionLayout::XNTChar() const { + if (m_parent == nullptr) { + return 'x'; + } + return m_parent->XNTChar(); +} + void ExpressionLayout::detachChildAtIndex(int i) { ExpressionLayout ** op = const_cast(children()); if (op[i] != nullptr && op[i]->parent() == this) { diff --git a/poincare/src/layout/sequence_layout.cpp b/poincare/src/layout/sequence_layout.cpp index 3955f77b3..691a9a29c 100644 --- a/poincare/src/layout/sequence_layout.cpp +++ b/poincare/src/layout/sequence_layout.cpp @@ -128,6 +128,10 @@ bool SequenceLayout::moveDown(ExpressionLayoutCursor * cursor, ExpressionLayout return ExpressionLayout::moveDown(cursor, previousLayout, previousPreviousLayout); } +char SequenceLayout::XNTChar() const { + return 'n'; +} + ExpressionLayout * SequenceLayout::upperBoundLayout() { return editableChild(0); } diff --git a/poincare/src/layout/sequence_layout.h b/poincare/src/layout/sequence_layout.h index 6e186982d..98e100420 100644 --- a/poincare/src/layout/sequence_layout.h +++ b/poincare/src/layout/sequence_layout.h @@ -14,6 +14,7 @@ public: bool moveRight(ExpressionLayoutCursor * cursor) override; bool moveUp(ExpressionLayoutCursor * cursor, ExpressionLayout * previousLayout, ExpressionLayout * previousPreviousLayout) override; bool moveDown(ExpressionLayoutCursor * cursor, ExpressionLayout * previousLayout, ExpressionLayout * previousPreviousLayout) override; + char XNTChar() const override; protected: constexpr static KDCoordinate k_boundHeightMargin = 2; ExpressionLayout * lowerBoundLayout();