diff --git a/poincare/Makefile b/poincare/Makefile index a2a87fb38..81015f044 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -50,13 +50,14 @@ objs += $(addprefix poincare/src/,\ objs += $(addprefix poincare/src/layout/,\ absolute_value_layout.o\ baseline_relative_layout.o\ + bracket_layout.o\ condensed_sum_layout.o\ conjugate_layout.o\ expression_layout.o\ fraction_layout.o\ + grid_layout.o\ horizontal_layout.o\ integral_layout.o\ - matrix_layout.o\ nth_root_layout.o\ parenthesis_layout.o\ product_layout.o\ diff --git a/poincare/src/layout/bracket_layout.cpp b/poincare/src/layout/bracket_layout.cpp new file mode 100644 index 000000000..3f8d3620d --- /dev/null +++ b/poincare/src/layout/bracket_layout.cpp @@ -0,0 +1,49 @@ +#include "bracket_layout.h" +extern "C" { +#include +#include +} + +namespace Poincare { + +BracketLayout::BracketLayout(ExpressionLayout * operandLayout) : + ExpressionLayout(), + m_operandLayout(operandLayout) +{ + m_operandLayout->setParent(this); + m_baseline = m_operandLayout->baseline(); +} + +BracketLayout::~BracketLayout() { + delete m_operandLayout; +} + +void BracketLayout::render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) { + KDSize operandSize = m_operandLayout->size(); + ctx->fillRect(KDRect(p.x(), p.y(), k_lineThickness, m_operandLayout->size().height()), expressionColor); + ctx->fillRect(KDRect(p.x()+operandSize.width()+2*k_widthMargin+k_lineThickness, p.y(), k_lineThickness, m_operandLayout->size().height()), expressionColor); + ctx->fillRect(KDRect(p.x(), p.y(), k_bracketWidth, k_lineThickness), expressionColor); + ctx->fillRect(KDRect(p.x()+k_lineThickness+operandSize.width()+2*k_widthMargin-k_bracketWidth, p.y(), k_bracketWidth, k_lineThickness), expressionColor); + ctx->fillRect(KDRect(p.x(), p.y()+operandSize.height()-k_lineThickness, k_bracketWidth, k_lineThickness), expressionColor); + ctx->fillRect(KDRect(p.x()+k_lineThickness+operandSize.width()+2*k_widthMargin-k_bracketWidth, p.y()+operandSize.height()-k_lineThickness, k_bracketWidth, k_lineThickness), expressionColor); + +} + +KDSize BracketLayout::computeSize() { + KDSize operandSize = m_operandLayout->size(); + return KDSize(operandSize.width() + 2*k_widthMargin + 2*k_lineThickness, operandSize.height()); +} + +ExpressionLayout * BracketLayout::child(uint16_t index) { + if (index == 0) { + return m_operandLayout; + } + return nullptr; +} + +KDPoint BracketLayout::positionOfChild(ExpressionLayout * child) { + return KDPoint(k_widthMargin+k_lineThickness, 0); +} + +} + diff --git a/poincare/src/layout/bracket_layout.h b/poincare/src/layout/bracket_layout.h new file mode 100644 index 000000000..b08ada56d --- /dev/null +++ b/poincare/src/layout/bracket_layout.h @@ -0,0 +1,28 @@ +#ifndef POINCARE_BRACKET_LAYOUT_H +#define POINCARE_BRACKET_LAYOUT_H + +#include +#include + +namespace Poincare { + +class BracketLayout : public ExpressionLayout { +public: + BracketLayout(ExpressionLayout * operandLayout); + ~BracketLayout(); +protected: + void render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) override; + KDSize computeSize() override; + ExpressionLayout * child(uint16_t index) override; + KDPoint positionOfChild(ExpressionLayout * child) override; +private: + constexpr static KDCoordinate k_bracketWidth = 5; + constexpr static KDCoordinate k_widthMargin = 5; + constexpr static KDCoordinate k_lineThickness = 1; + ExpressionLayout * m_operandLayout; +}; + +} + +#endif + diff --git a/poincare/src/layout/matrix_layout.cpp b/poincare/src/layout/grid_layout.cpp similarity index 66% rename from poincare/src/layout/matrix_layout.cpp rename to poincare/src/layout/grid_layout.cpp index 5641d905a..7b4f34ddf 100644 --- a/poincare/src/layout/matrix_layout.cpp +++ b/poincare/src/layout/grid_layout.cpp @@ -1,4 +1,4 @@ -#include "matrix_layout.h" +#include "grid_layout.h" extern "C" { #include #include @@ -6,7 +6,7 @@ extern "C" { namespace Poincare { -MatrixLayout::MatrixLayout(ExpressionLayout ** entryLayouts, int numberOfRows, int numberOfColumns) : +GridLayout::GridLayout(ExpressionLayout ** entryLayouts, int numberOfRows, int numberOfColumns) : ExpressionLayout(), m_entryLayouts(entryLayouts), m_numberOfRows(numberOfRows), @@ -18,14 +18,14 @@ MatrixLayout::MatrixLayout(ExpressionLayout ** entryLayouts, int numberOfRows, i m_baseline = height()/2 + KDText::stringSize(" ").height()/2; } -MatrixLayout::~MatrixLayout() { +GridLayout::~GridLayout() { for (int i=0; ibaseline()); @@ -34,7 +34,7 @@ KDCoordinate MatrixLayout::rowBaseline(int i) { } -KDCoordinate MatrixLayout::rowHeight(int i) { +KDCoordinate GridLayout::rowHeight(int i) { KDCoordinate rowHeight = 0; KDCoordinate baseline = rowBaseline(i); for (int j = 0; j < m_numberOfColumns; j++) { @@ -43,16 +43,16 @@ KDCoordinate MatrixLayout::rowHeight(int i) { return baseline+rowHeight; } -KDCoordinate MatrixLayout::height() { +KDCoordinate GridLayout::height() { KDCoordinate totalHeight = 0; for (int i = 0; i < m_numberOfRows; i++) { totalHeight += rowHeight(i); } - totalHeight += (m_numberOfRows-1)*k_matrixEntryMargin; + totalHeight += (m_numberOfRows-1)*k_gridEntryMargin; return totalHeight; } -KDCoordinate MatrixLayout::columnWidth(int j) { +KDCoordinate GridLayout::columnWidth(int j) { KDCoordinate columnWidth = 0; for (int i = 0; i < m_numberOfRows; i++) { columnWidth = max(columnWidth, m_entryLayouts[i*m_numberOfColumns+j]->size().width()); @@ -60,32 +60,31 @@ KDCoordinate MatrixLayout::columnWidth(int j) { return columnWidth; } -KDCoordinate MatrixLayout::width() { +KDCoordinate GridLayout::width() { KDCoordinate totalWidth = 0; for (int j = 0; j < m_numberOfColumns; j++) { totalWidth += columnWidth(j); } - totalWidth += (m_numberOfColumns-1)*k_matrixEntryMargin; - return totalWidth + 2*k_matrixBracketWidth + 2*k_matrixBracketMargin; + totalWidth += (m_numberOfColumns-1)*k_gridEntryMargin; + return totalWidth; } -void MatrixLayout::render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) { - ctx->fillRect(KDRect(p.x(), p.y(), k_matrixBracketWidth, height()), expressionColor); - ctx->fillRect(KDRect(p.x() + width() - k_matrixBracketWidth, p.y(), k_matrixBracketWidth, height()), expressionColor); +void GridLayout::render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) { + // Nothing to do for a simple grid } -KDSize MatrixLayout::computeSize() { +KDSize GridLayout::computeSize() { return KDSize(width(), height()); } -ExpressionLayout * MatrixLayout::child(uint16_t index) { +ExpressionLayout * GridLayout::child(uint16_t index) { if (index >= 0 && index < m_numberOfColumns*m_numberOfRows) { return m_entryLayouts[index]; } return nullptr; } -KDPoint MatrixLayout::positionOfChild(ExpressionLayout * child) { +KDPoint GridLayout::positionOfChild(ExpressionLayout * child) { int rowIndex = 0; int columnIndex = 0; for (int i = 0; i < m_numberOfRows; i++) { @@ -101,12 +100,12 @@ KDPoint MatrixLayout::positionOfChild(ExpressionLayout * child) { for (int j = 0; j < columnIndex; j++) { x += columnWidth(j); } - x += (columnWidth(columnIndex) - child->size().width())/2+ columnIndex * k_matrixEntryMargin + k_matrixBracketMargin + k_matrixBracketWidth; + x += (columnWidth(columnIndex) - child->size().width())/2+ columnIndex * k_gridEntryMargin; KDCoordinate y = 0; for (int i = 0; i < rowIndex; i++) { y += rowHeight(i); } - y += rowBaseline(rowIndex) - child->baseline() + rowIndex * k_matrixEntryMargin; + y += rowBaseline(rowIndex) - child->baseline() + rowIndex * k_gridEntryMargin; return KDPoint(x, y); } diff --git a/poincare/src/layout/matrix_layout.h b/poincare/src/layout/grid_layout.h similarity index 61% rename from poincare/src/layout/matrix_layout.h rename to poincare/src/layout/grid_layout.h index 6ab3bccbf..92deb27fb 100644 --- a/poincare/src/layout/matrix_layout.h +++ b/poincare/src/layout/grid_layout.h @@ -1,24 +1,22 @@ -#ifndef POINCARE_MATRIX_LAYOUT_H -#define POINCARE_MATRIX_LAYOUT_H +#ifndef POINCARE_GRID_LAYOUT_H +#define POINCARE_GRID_LAYOUT_H #include #include namespace Poincare { -class MatrixLayout : public ExpressionLayout { +class GridLayout : public ExpressionLayout { public: - MatrixLayout(ExpressionLayout ** entryLayouts, int numberOfRows, int numberOfColumns); - ~MatrixLayout(); + GridLayout(ExpressionLayout ** entryLayouts, int numberOfRows, int numberOfColumns); + ~GridLayout(); protected: void render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) override; KDSize computeSize() override; ExpressionLayout * child(uint16_t index) override; KDPoint positionOfChild(ExpressionLayout * child) override; private: - constexpr static KDCoordinate k_matrixEntryMargin = 4; - constexpr static KDCoordinate k_matrixBracketMargin = 2; - constexpr static KDCoordinate k_matrixBracketWidth = 2; + constexpr static KDCoordinate k_gridEntryMargin = 6; KDCoordinate rowBaseline(int i); KDCoordinate rowHeight(int i); KDCoordinate height(); diff --git a/poincare/src/matrix.cpp b/poincare/src/matrix.cpp index 41d4a0d7a..9f359a6a9 100644 --- a/poincare/src/matrix.cpp +++ b/poincare/src/matrix.cpp @@ -4,7 +4,8 @@ extern "C" { } #include #include -#include "layout/matrix_layout.h" +#include "layout/grid_layout.h" +#include "layout/bracket_layout.h" #include #include #include @@ -51,7 +52,7 @@ ExpressionLayout * Matrix::privateCreateLayout(FloatDisplayMode floatDisplayMode for (int i = 0; i < numberOfOperands(); i++) { childrenLayouts[i] = operand(i)->createLayout(floatDisplayMode, complexFormat); } - return new MatrixLayout(childrenLayouts, numberOfRows(), numberOfColumns()); + return new BracketLayout(new GridLayout(childrenLayouts, numberOfRows(), numberOfColumns())); } float Matrix::privateApproximate(Context& context, AngleUnit angleUnit) const {