From 7244eabd5151cdbe9be3a1df354b35456448c081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Thu, 26 Apr 2018 17:17:44 +0200 Subject: [PATCH] [poincare] Fix cursorAbove/Under in EmptyLayout. Change-Id: I9e5ac6eb557d07644310e391d5cc7bc75408c628 --- poincare/src/layout/empty_layout.cpp | 23 +++++++++++++++++++++++ poincare/src/layout/empty_layout.h | 3 +++ 2 files changed, 26 insertions(+) diff --git a/poincare/src/layout/empty_layout.cpp b/poincare/src/layout/empty_layout.cpp index ba04f30d4..d68a86e33 100644 --- a/poincare/src/layout/empty_layout.cpp +++ b/poincare/src/layout/empty_layout.cpp @@ -45,6 +45,29 @@ ExpressionLayoutCursor EmptyLayout::cursorRightOf(ExpressionLayoutCursor cursor, return ExpressionLayoutCursor(); } +ExpressionLayoutCursor EmptyLayout::cursorAbove(ExpressionLayoutCursor cursor, bool * shouldRecomputeLayout, bool equivalentPositionVisited) { + return cursorVerticalOf(VerticalDirection::Up, cursor, shouldRecomputeLayout, equivalentPositionVisited); +} + +ExpressionLayoutCursor EmptyLayout::cursorUnder(ExpressionLayoutCursor cursor, bool * shouldRecomputeLayout, bool equivalentPositionVisited) { + return cursorVerticalOf(VerticalDirection::Down, cursor, shouldRecomputeLayout, equivalentPositionVisited); +} + +ExpressionLayoutCursor EmptyLayout::cursorVerticalOf(VerticalDirection direction, ExpressionLayoutCursor cursor, bool * shouldRecomputeLayout, bool equivalentPositionVisited) { + assert(cursor.pointedExpressionLayout() == this); + ExpressionLayoutCursor cursorResult = direction == VerticalDirection::Up ? + ExpressionLayout::cursorAbove(cursor, shouldRecomputeLayout, equivalentPositionVisited) : + ExpressionLayout::cursorUnder(cursor, shouldRecomputeLayout, equivalentPositionVisited); + if (cursorResult.isDefined()) { + return cursorResult; + } + ExpressionLayoutCursor::Position newPosition = cursor.position() == ExpressionLayoutCursor::Position::Left ? ExpressionLayoutCursor::Position::Right : ExpressionLayoutCursor::Position::Left; + cursor.setPosition(newPosition); + return direction == VerticalDirection::Up ? + ExpressionLayout::cursorAbove(cursor, shouldRecomputeLayout, equivalentPositionVisited) : + ExpressionLayout::cursorUnder(cursor, shouldRecomputeLayout, equivalentPositionVisited); +} + int EmptyLayout::writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits) const { if (bufferSize == 0) { return -1; diff --git a/poincare/src/layout/empty_layout.h b/poincare/src/layout/empty_layout.h index d74767295..70f48333a 100644 --- a/poincare/src/layout/empty_layout.h +++ b/poincare/src/layout/empty_layout.h @@ -17,6 +17,8 @@ public: void deleteBeforeCursor(ExpressionLayoutCursor * cursor) override; ExpressionLayoutCursor cursorLeftOf(ExpressionLayoutCursor cursor, bool * shouldRecomputeLayout) override; ExpressionLayoutCursor cursorRightOf(ExpressionLayoutCursor cursor, bool * shouldRecomputeLayout) override; + ExpressionLayoutCursor cursorAbove(ExpressionLayoutCursor cursor, bool * shouldRecomputeLayout, bool equivalentPositionVisited = false) override; + ExpressionLayoutCursor cursorUnder(ExpressionLayoutCursor cursor, bool * shouldRecomputeLayout, bool equivalentPositionVisited = false) override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override; bool isEmpty() const override { return true; } Color color() const { return m_color; } @@ -38,6 +40,7 @@ private: constexpr static KDCoordinate k_marginWidth = 1; constexpr static KDCoordinate k_marginHeight = 3; constexpr static KDCoordinate k_lineThickness = 1; + ExpressionLayoutCursor cursorVerticalOf(VerticalDirection direction, ExpressionLayoutCursor cursor, bool * shouldRecomputeLayout, bool equivalentPositionVisited); bool m_isVisible; Color m_color; };