From 193aefd5a66afe316dff740bd1a4eaf723405c5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Tue, 17 Apr 2018 15:33:40 +0200 Subject: [PATCH] [poincare] Each leayout gives the layoutToPointWhenInserting Change-Id: I5f054643decd27731e77d0f1cf2e6874cf6ff8d5 --- apps/math_toolbox.cpp | 3 --- escher/src/scrollable_expression_view_with_cursor.cpp | 9 +++++++-- poincare/include/poincare/expression_layout.h | 1 + poincare/src/layout/condensed_sum_layout.cpp | 5 +++++ poincare/src/layout/condensed_sum_layout.h | 1 + poincare/src/layout/expression_layout.cpp | 7 +++++++ poincare/src/layout/fraction_layout.cpp | 10 ++++++++++ poincare/src/layout/fraction_layout.h | 1 + poincare/src/layout/integral_layout.cpp | 5 +++++ poincare/src/layout/integral_layout.h | 2 ++ poincare/src/layout/sequence_layout.cpp | 5 +++++ poincare/src/layout/sequence_layout.h | 1 + 12 files changed, 45 insertions(+), 5 deletions(-) diff --git a/apps/math_toolbox.cpp b/apps/math_toolbox.cpp index e8f126b18..61b5ca479 100644 --- a/apps/math_toolbox.cpp +++ b/apps/math_toolbox.cpp @@ -146,9 +146,6 @@ void MathToolbox::actionForScrollableExpressionViewWithCursor(void * sender, con break; } } - } else if (resultLayout->numberOfChildren() > 0) { - // Else, if the layout has children, pick the first one. - pointedLayout = resultLayout->editableChild(0); } // Insert the layout. If pointedLayout is nullptr, the cursor will be on the // right of the inserted layout. diff --git a/escher/src/scrollable_expression_view_with_cursor.cpp b/escher/src/scrollable_expression_view_with_cursor.cpp index 57dbb5660..654c7c450 100644 --- a/escher/src/scrollable_expression_view_with_cursor.cpp +++ b/escher/src/scrollable_expression_view_with_cursor.cpp @@ -207,9 +207,14 @@ void ScrollableExpressionViewWithCursor::insertLayoutAtCursor(Poincare::Expressi if (layout->isMatrix() && pointedLayout && pointedLayout->hasAncestor(layout)) { static_cast(layout)->addGreySquares(); } - if (pointedLayout != nullptr) { + bool layoutWillBeMerged = layout->isHorizontal(); + if (!layoutWillBeMerged) { m_expressionViewWithCursor.cursor()->addLayout(layout); - m_expressionViewWithCursor.cursor()->setPointedExpressionLayout(pointedLayout); + if (pointedLayout != nullptr) { + m_expressionViewWithCursor.cursor()->setPointedExpressionLayout(pointedLayout); + } else { + m_expressionViewWithCursor.cursor()->setPointedExpressionLayout(layout->layoutToPointWhenInserting()); + } m_expressionViewWithCursor.cursor()->setPosition(Poincare::ExpressionLayoutCursor::Position::Right); } else { m_expressionViewWithCursor.cursor()->addLayoutAndMoveCursor(layout); diff --git a/poincare/include/poincare/expression_layout.h b/poincare/include/poincare/expression_layout.h index 1064f7488..2286410af 100644 --- a/poincare/include/poincare/expression_layout.h +++ b/poincare/include/poincare/expression_layout.h @@ -99,6 +99,7 @@ public: virtual int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const = 0; /* Other */ + virtual ExpressionLayout * layoutToPointWhenInserting(); bool addGreySquaresToAllMatrixAncestors(); bool hasText() const; virtual bool isCollapsable(int * numberOfOpenParenthesis, bool goingLeft) const { return true; } diff --git a/poincare/src/layout/condensed_sum_layout.cpp b/poincare/src/layout/condensed_sum_layout.cpp index 33058438e..32e7dbb30 100644 --- a/poincare/src/layout/condensed_sum_layout.cpp +++ b/poincare/src/layout/condensed_sum_layout.cpp @@ -124,6 +124,11 @@ bool CondensedSumLayout::moveDown(ExpressionLayoutCursor * cursor, bool * should return ExpressionLayout::moveDown(cursor, shouldRecomputeLayout, previousLayout, previousPreviousLayout); } +ExpressionLayout * CondensedSumLayout::layoutToPointWhenInserting() { + assert(subscriptLayout() != nullptr); + return subscriptLayout(); +} + void CondensedSumLayout::render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) { // Nothing to draw } diff --git a/poincare/src/layout/condensed_sum_layout.h b/poincare/src/layout/condensed_sum_layout.h index aa76d39d9..ec506a839 100644 --- a/poincare/src/layout/condensed_sum_layout.h +++ b/poincare/src/layout/condensed_sum_layout.h @@ -17,6 +17,7 @@ public: int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { return LayoutEngine::writePrefixExpressionLayoutTextInBuffer(this, buffer, bufferSize, numberOfSignificantDigits, "sum"); } + ExpressionLayout * layoutToPointWhenInserting() override; protected: void render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) override; KDSize computeSize() override; diff --git a/poincare/src/layout/expression_layout.cpp b/poincare/src/layout/expression_layout.cpp index 280d30eb2..c7c4d4bf0 100644 --- a/poincare/src/layout/expression_layout.cpp +++ b/poincare/src/layout/expression_layout.cpp @@ -261,6 +261,13 @@ bool ExpressionLayout::moveDownInside(ExpressionLayoutCursor * cursor, bool * sh return moveInside(VerticalDirection::Down, cursor, shouldRecomputeLayout); } +ExpressionLayout * ExpressionLayout::layoutToPointWhenInserting() { + if (numberOfChildren() > 0) { + return editableChild(0); + } + return this; +} + bool ExpressionLayout::addGreySquaresToAllMatrixAncestors() { bool addedSquares = false; ExpressionLayout * currentAncestor = m_parent; diff --git a/poincare/src/layout/fraction_layout.cpp b/poincare/src/layout/fraction_layout.cpp index cb680d6d0..4e9dd3a95 100644 --- a/poincare/src/layout/fraction_layout.cpp +++ b/poincare/src/layout/fraction_layout.cpp @@ -218,6 +218,16 @@ int FractionLayout::writeTextInBuffer(char * buffer, int bufferSize, int numberO return numberOfChar; } +ExpressionLayout * FractionLayout::layoutToPointWhenInserting() { + if (numeratorLayout()->isEmpty()){ + return numeratorLayout(); + } + if (denominatorLayout()->isEmpty()){ + return denominatorLayout(); + } + return this; +} + void FractionLayout::render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) { KDCoordinate fractionLineY = p.y() + numeratorLayout()->size().height() + k_fractionLineMargin; ctx->fillRect(KDRect(p.x()+Metric::FractionAndConjugateHorizontalMargin, fractionLineY, size().width()-2*Metric::FractionAndConjugateHorizontalMargin, 1), expressionColor); diff --git a/poincare/src/layout/fraction_layout.h b/poincare/src/layout/fraction_layout.h index 65ab4251f..1ed0becba 100644 --- a/poincare/src/layout/fraction_layout.h +++ b/poincare/src/layout/fraction_layout.h @@ -17,6 +17,7 @@ public: bool moveUp(ExpressionLayoutCursor * cursor, bool * shouldRecomputeLayout, ExpressionLayout * previousLayout, ExpressionLayout * previousPreviousLayout) override; bool moveDown(ExpressionLayoutCursor * cursor, bool * shouldRecomputeLayout, ExpressionLayout * previousLayout, ExpressionLayout * previousPreviousLayout) override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override; + ExpressionLayout * layoutToPointWhenInserting() override; bool canBeOmittedMultiplicationRightFactor() const override { return false; } /* WARNING: We need to override this function, else 1/2 3/4 would be * serialized as 1/2**3/4, as the two Fraction layouts think their brother is diff --git a/poincare/src/layout/integral_layout.cpp b/poincare/src/layout/integral_layout.cpp index 2184a1cd3..e3042631b 100644 --- a/poincare/src/layout/integral_layout.cpp +++ b/poincare/src/layout/integral_layout.cpp @@ -204,6 +204,11 @@ int IntegralLayout::writeTextInBuffer(char * buffer, int bufferSize, int numberO return numberOfChar; } +ExpressionLayout * IntegralLayout::layoutToPointWhenInserting() { + assert(lowerBoundLayout() != nullptr); + return lowerBoundLayout(); +} + void IntegralLayout::render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) { KDSize integrandSize = integrandLayout()->size(); KDSize upperBoundSize = upperBoundLayout()->size(); diff --git a/poincare/src/layout/integral_layout.h b/poincare/src/layout/integral_layout.h index a5866df1b..c165c6395 100644 --- a/poincare/src/layout/integral_layout.h +++ b/poincare/src/layout/integral_layout.h @@ -25,6 +25,8 @@ public: /* Expression Engine */ int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override; + /* Other */ + ExpressionLayout * layoutToPointWhenInserting() override; protected: void render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) override; KDSize computeSize() override; diff --git a/poincare/src/layout/sequence_layout.cpp b/poincare/src/layout/sequence_layout.cpp index dd1066051..2194214cb 100644 --- a/poincare/src/layout/sequence_layout.cpp +++ b/poincare/src/layout/sequence_layout.cpp @@ -132,6 +132,11 @@ bool SequenceLayout::moveDown(ExpressionLayoutCursor * cursor, bool * shouldReco return ExpressionLayout::moveDown(cursor, shouldRecomputeLayout, previousLayout, previousPreviousLayout); } +ExpressionLayout * SequenceLayout::layoutToPointWhenInserting() { + assert(lowerBoundLayout() != nullptr); + return lowerBoundLayout(); +} + char SequenceLayout::XNTChar() const { return 'n'; } diff --git a/poincare/src/layout/sequence_layout.h b/poincare/src/layout/sequence_layout.h index 164ead79d..37fc29b02 100644 --- a/poincare/src/layout/sequence_layout.h +++ b/poincare/src/layout/sequence_layout.h @@ -15,6 +15,7 @@ public: bool moveRight(ExpressionLayoutCursor * cursor, bool * shouldRecomputeLayout) override; bool moveUp(ExpressionLayoutCursor * cursor, bool * shouldRecomputeLayout, ExpressionLayout * previousLayout, ExpressionLayout * previousPreviousLayout) override; bool moveDown(ExpressionLayoutCursor * cursor, bool * shouldRecomputeLayout, ExpressionLayout * previousLayout, ExpressionLayout * previousPreviousLayout) override; + ExpressionLayout * layoutToPointWhenInserting() override; char XNTChar() const override; protected: constexpr static KDCoordinate k_boundHeightMargin = 2;