From d5316e06f7a6b77df074f59d7b49a143cabd8a2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Fri, 15 Dec 2017 10:26:59 +0100 Subject: [PATCH] [poincare] EditableStringLayout. Change-Id: Ie985874c216881a722d9c6807c007bc17b25d4f0 --- poincare/Makefile | 1 + .../src/layout/editable_string_layout.cpp | 50 +++++++++++++++++++ poincare/src/layout/editable_string_layout.h | 17 +++++++ poincare/src/layout/string_layout.cpp | 30 ++--------- poincare/src/layout/string_layout.h | 2 +- 5 files changed, 72 insertions(+), 28 deletions(-) create mode 100644 poincare/src/layout/editable_string_layout.cpp create mode 100644 poincare/src/layout/editable_string_layout.h diff --git a/poincare/Makefile b/poincare/Makefile index 08473fef5..a33606ae2 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -87,6 +87,7 @@ objs += $(addprefix poincare/src/layout/,\ bracket_layout.o\ condensed_sum_layout.o\ conjugate_layout.o\ + editable_string_layout.o\ expression_layout.o\ fraction_layout.o\ grid_layout.o\ diff --git a/poincare/src/layout/editable_string_layout.cpp b/poincare/src/layout/editable_string_layout.cpp new file mode 100644 index 000000000..e06ab544a --- /dev/null +++ b/poincare/src/layout/editable_string_layout.cpp @@ -0,0 +1,50 @@ +#include "editable_string_layout.h" +#include +#include +#include + +namespace Poincare { + +bool EditableStringLayout::moveLeft(ExpressionLayoutCursor * cursor) { + assert(cursor->pointedExpressionLayout() == this); + // Case: Right. + // Go before the last char. + if (cursor->position() == ExpressionLayoutCursor::Position::Right) { + size_t stringLength = strlen(m_string); + if (stringLength > 1) { + cursor->setPosition(ExpressionLayoutCursor::Position::Inside); + cursor->setPositionInside(stringLength - 1); + return true; + } + if (stringLength == 1) { + cursor->setPosition(ExpressionLayoutCursor::Position::Left); + return true; + } + assert(stringLength == 0); + cursor->setPosition(ExpressionLayoutCursor::Position::Left); + if (m_parent) { + return m_parent->moveLeft(cursor); + } + return false; + } + // Case: Inside. + // Go one char left. + if (cursor->position() == ExpressionLayoutCursor::Position::Inside) { + int cursorIndex = cursor->positionInside(); + assert(cursorIndex > 0 && cursorIndex < strlen(m_string)); + if (cursorIndex == 1) { + cursor->setPosition(ExpressionLayoutCursor::Position::Left); + return true; + } + cursor->setPositionInside(cursorIndex - 1); + return true; + } + // Case: Left. + // Ask the parent. + if (m_parent) { + return m_parent->moveLeft(cursor); + } + return false; +} + +} diff --git a/poincare/src/layout/editable_string_layout.h b/poincare/src/layout/editable_string_layout.h new file mode 100644 index 000000000..23e92bc65 --- /dev/null +++ b/poincare/src/layout/editable_string_layout.h @@ -0,0 +1,17 @@ +#ifndef POINCARE_EDITABLE_STRING_LAYOUT_H +#define POINCARE_EDITABLE_STRING_LAYOUT_H + +#include "string_layout.h" +#include + +namespace Poincare { + +class EditableStringLayout : public StringLayout { +public: + using StringLayout::StringLayout; + bool moveLeft(ExpressionLayoutCursor * cursor) override; +}; + +} + +#endif diff --git a/poincare/src/layout/string_layout.cpp b/poincare/src/layout/string_layout.cpp index ab0b2818d..84a8a35fe 100644 --- a/poincare/src/layout/string_layout.cpp +++ b/poincare/src/layout/string_layout.cpp @@ -25,37 +25,13 @@ char * StringLayout::text() { } bool StringLayout::moveLeft(ExpressionLayoutCursor * cursor) { + assert(cursor->pointedExpressionLayout() == this); + // A StringLayout is not editable, and the cursor cannot go inside it. assert(cursor->pointedExpressionLayout() == this); // Case: Right. - // Go before the last char. + // Go Left. if (cursor->position() == ExpressionLayoutCursor::Position::Right) { - size_t stringLength = strlen(m_string); - if (stringLength > 1) { - cursor->setPosition(ExpressionLayoutCursor::Position::Inside); - cursor->setPositionInside(stringLength - 1); - return true; - } - if (stringLength == 1) { - cursor->setPosition(ExpressionLayoutCursor::Position::Left); - return true; - } - assert(stringLength == 0); cursor->setPosition(ExpressionLayoutCursor::Position::Left); - if (m_parent) { - return m_parent->moveLeft(cursor); - } - return false; - } - // Case: Inside. - // Go one char left. - if (cursor->position() == ExpressionLayoutCursor::Position::Inside) { - int cursorIndex = cursor->positionInside(); - assert(cursorIndex > 0 && cursorIndex < strlen(m_string)); - if (cursorIndex == 1) { - cursor->setPosition(ExpressionLayoutCursor::Position::Left); - return true; - } - cursor->setPositionInside(cursorIndex - 1); return true; } // Case: Left. diff --git a/poincare/src/layout/string_layout.h b/poincare/src/layout/string_layout.h index bb86c4dc6..236bfaa8b 100644 --- a/poincare/src/layout/string_layout.h +++ b/poincare/src/layout/string_layout.h @@ -24,8 +24,8 @@ protected: KDSize computeSize() override; ExpressionLayout * child(uint16_t index) override; KDPoint positionOfChild(ExpressionLayout * child) override; -private: char * m_string; +private: KDText::FontSize m_fontSize; };