Files
Upsilon/poincare/src/layout/editable_string_layout.cpp
Léa Saviot d5316e06f7 [poincare] EditableStringLayout.
Change-Id: Ie985874c216881a722d9c6807c007bc17b25d4f0
2018-01-15 11:58:01 +01:00

51 lines
1.4 KiB
C++

#include "editable_string_layout.h"
#include <poincare/expression_layout_cursor.h>
#include <assert.h>
#include <stdlib.h>
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;
}
}