From 2c562fdf7a2518742ec06373221463dc779d6f05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Wed, 10 Jan 2018 11:27:10 +0100 Subject: [PATCH] [expression_editor] Insert an empty matrix when adding a bracket. Change-Id: I5bf6ab9e097637e0e49f0941fe02e4f5a8e373a2 --- apps/expression_editor/controller.cpp | 11 ++++++++--- .../include/poincare/expression_layout_cursor.h | 1 + poincare/src/expression_layout_cursor.cpp | 15 +++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/apps/expression_editor/controller.cpp b/apps/expression_editor/controller.cpp index 814200eb8..fdf9702cd 100644 --- a/apps/expression_editor/controller.cpp +++ b/apps/expression_editor/controller.cpp @@ -130,9 +130,14 @@ ExpressionLayout * Controller::handleAddEvent(Ion::Events::Event event) { } if (event.hasText()) { const char * textToInsert = event.text(); - if (textToInsert[0] == Ion::Charset::MultiplicationSign && textToInsert[1] == 0) { - const char middleDotString[] = {Ion::Charset::MiddleDot, 0}; - return m_cursor.insertText(middleDotString); + if (textToInsert[1] == 0) { + if (textToInsert[0] == Ion::Charset::MultiplicationSign) { + const char middleDotString[] = {Ion::Charset::MiddleDot, 0}; + return m_cursor.insertText(middleDotString); + } + if (textToInsert[0] == '[' || textToInsert[0] == ']') { + return m_cursor.addEmptyMatrixLayout(); + } } return m_cursor.insertText(textToInsert); } diff --git a/poincare/include/poincare/expression_layout_cursor.h b/poincare/include/poincare/expression_layout_cursor.h index 779cd9318..a4f5dbb85 100644 --- a/poincare/include/poincare/expression_layout_cursor.h +++ b/poincare/include/poincare/expression_layout_cursor.h @@ -43,6 +43,7 @@ public: ExpressionLayout * addEmptyExponentialLayout(); ExpressionLayout * addFractionLayoutAndCollapseBrothers(); ExpressionLayout * addEmptyLogarithmLayout(); + ExpressionLayout * addEmptyMatrixLayout(int numberOfRows = 1, int numberOfColumns = 1); ExpressionLayout * addEmptyPowerLayout(); ExpressionLayout * addEmptySquareRootLayout(); ExpressionLayout * addEmptySquarePowerLayout(); diff --git a/poincare/src/expression_layout_cursor.cpp b/poincare/src/expression_layout_cursor.cpp index b723de7d0..aebbd16b2 100644 --- a/poincare/src/expression_layout_cursor.cpp +++ b/poincare/src/expression_layout_cursor.cpp @@ -108,6 +108,21 @@ ExpressionLayout * ExpressionLayoutCursor::addEmptyLogarithmLayout() { return result; } +ExpressionLayout * ExpressionLayoutCursor::addEmptyMatrixLayout(int numberOfRows, int numberOfColumns) { + assert(numberOfRows > 0); + assert(numberOfColumns > 0); + int numberOfchildren = (numberOfRows+1)*(numberOfColumns+1); + ExpressionLayout * children[numberOfchildren]; + for (int i = 0; i < numberOfchildren; i++) { + children[i] = new EmptyVisibleLayout(); + } + ExpressionLayout * matrixLayout = new MatrixLayout(const_cast(const_cast(children)), numberOfRows+1, numberOfColumns+1, false); + m_pointedExpressionLayout->addBrother(this, matrixLayout); + setPointedExpressionLayout(matrixLayout->editableChild(0)); + setPosition(ExpressionLayoutCursor::Position::Right); + return matrixLayout; +} + ExpressionLayout * ExpressionLayoutCursor::addEmptyPowerLayout() { VerticalOffsetLayout * offsetLayout = new VerticalOffsetLayout(new EmptyVisibleLayout(), VerticalOffsetLayout::Type::Superscript, false); // If there is already a base