diff --git a/apps/variable_box_controller.cpp b/apps/variable_box_controller.cpp index 6e3e871a3..7d8207625 100644 --- a/apps/variable_box_controller.cpp +++ b/apps/variable_box_controller.cpp @@ -170,7 +170,7 @@ KDCoordinate VariableBoxController::ContentViewController::rowHeight(int index) } LayoutRef layoutR = layoutRefForIndex(index); if (!layoutR.isUninitialized()) { - return layoutR.layoutSize().height()+k_leafMargin; + return max(layoutR.layoutSize().height()+k_leafMargin, Metric::ToolboxRowHeight); } return Metric::ToolboxRowHeight; } diff --git a/apps/variable_box_controller.h b/apps/variable_box_controller.h index 05906cb93..14f450ed0 100644 --- a/apps/variable_box_controller.h +++ b/apps/variable_box_controller.h @@ -48,7 +48,7 @@ private: #else constexpr static int k_numberOfMenuRows = 2; #endif - constexpr static KDCoordinate k_leafMargin = 10; + constexpr static KDCoordinate k_leafMargin = 20; Page pageAtIndex(int index); void putLabelAtIndexInBuffer(int index, char * buffer); I18n::Message nodeLabelAtIndex(int index); diff --git a/poincare/include/poincare/global_context.h b/poincare/include/poincare/global_context.h index e4264280b..07848f207 100644 --- a/poincare/include/poincare/global_context.h +++ b/poincare/include/poincare/global_context.h @@ -28,7 +28,9 @@ private: static Decimal defaultExpression(); int symbolIndex(const Symbol & symbol) const; Expression m_expressions[k_maxNumberOfScalarExpressions]; - Matrix m_matrixExpressions[k_maxNumberOfMatrixExpressions]; + /* Matrix has to be uninitialized by default which forces them to be + * Expression. */ + Expression m_matrixExpressions[k_maxNumberOfMatrixExpressions]; /* Matrix layout memoization */ LayoutRef m_matrixLayouts[k_maxNumberOfMatrixExpressions]; }; diff --git a/poincare/src/global_context.cpp b/poincare/src/global_context.cpp index 6388272c1..536e36fe5 100644 --- a/poincare/src/global_context.cpp +++ b/poincare/src/global_context.cpp @@ -64,11 +64,13 @@ void GlobalContext::setExpressionForSymbolName(const Expression & expression, co int indexMatrix = symbol.name() - (char)Symbol::SpecialSymbols::M0; assert(indexMatrix >= 0 && indexMatrix < k_maxNumberOfMatrixExpressions); Expression evaluation = expression.isUninitialized() ? Expression() : expression.approximate(context, Preferences::sharedPreferences()->angleUnit(), Preferences::sharedPreferences()->complexFormat()); // evaluate before deleting anything (to be able to evaluate M1+2->M1) + // Reinitialize the matrix layout + m_matrixLayouts[indexMatrix] = LayoutReference(); if (!evaluation.isUninitialized()) { if (evaluation.type() != ExpressionNode::Type::Matrix) { m_matrixExpressions[indexMatrix] = Matrix(evaluation); } else { - m_matrixExpressions[indexMatrix] = static_cast(evaluation); + m_matrixExpressions[indexMatrix] = evaluation; } } return; diff --git a/poincare/src/grid_layout_node.cpp b/poincare/src/grid_layout_node.cpp index b9d2763f8..9f50cecbf 100644 --- a/poincare/src/grid_layout_node.cpp +++ b/poincare/src/grid_layout_node.cpp @@ -91,7 +91,8 @@ void GridLayoutNode::moveCursorDown(LayoutCursor * cursor, bool * shouldRecomput } void GridLayoutNode::didAddChildAtIndex(int newNumberOfChildren) { - GridLayoutRef(this).setDimensions(1, newNumberOfChildren); + setNumberOfRows(1); + setNumberOfColumns(newNumberOfChildren); } // Protected @@ -239,7 +240,7 @@ KDCoordinate GridLayoutNode::height() const { for (int i = 0; i < m_numberOfRows; i++) { totalHeight += rowHeight(i); } - totalHeight += (m_numberOfRows-1)*k_gridEntryMargin; + totalHeight += max((m_numberOfRows-1)*k_gridEntryMargin, 0); return totalHeight; } @@ -256,7 +257,7 @@ KDCoordinate GridLayoutNode::width() const { for (int j = 0; j < m_numberOfColumns; j++) { totalWidth += columnWidth(j); } - totalWidth += (m_numberOfColumns-1)*k_gridEntryMargin; + totalWidth += max(0, (m_numberOfColumns-1)*k_gridEntryMargin); return totalWidth; } diff --git a/poincare/src/matrix.cpp b/poincare/src/matrix.cpp index eb5ffdf46..9f671533b 100644 --- a/poincare/src/matrix.cpp +++ b/poincare/src/matrix.cpp @@ -22,6 +22,7 @@ int MatrixNode::polynomialDegree(char symbolName) const { } LayoutRef MatrixNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { + assert(numberOfChildren() > 0); MatrixLayoutRef layout; for (int i = 0; i < numberOfChildren(); i++) { layout.addChildAtIndex(childAtIndex(i)->createLayout(floatDisplayMode, numberOfSignificantDigits), i, i, nullptr); @@ -89,6 +90,7 @@ Evaluation MatrixNode::templatedApproximate(Context& context, Preferences::An // MATRIX void Matrix::setDimensions(int rows, int columns) { + assert(rows * columns == numberOfChildren()); setNumberOfRows(rows); setNumberOfColumns(columns); } diff --git a/poincare/src/symbol.cpp b/poincare/src/symbol.cpp index 527e457d7..4aa4e3663 100644 --- a/poincare/src/symbol.cpp +++ b/poincare/src/symbol.cpp @@ -323,7 +323,7 @@ int Symbol::getPolynomialCoefficients(char symbolName, Expression coefficients[] coefficients[1] = Rational(1); return 1; } - coefficients[0] = Symbol(name()); + coefficients[0] = clone(); return 0; }