From 51e986606c15ebabcb85dea615f8ea2283836eeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Tue, 24 Apr 2018 10:16:22 +0200 Subject: [PATCH] [poincare] Factorize Left/RightBracket layouts code. Change-Id: I8708b9e0cfe0154232184f01afd532d4879b4cc0 --- poincare/src/layout/bracket_layout.cpp | 57 +++++++++++++++++++- poincare/src/layout/bracket_layout.h | 3 +- poincare/src/layout/left_bracket_layout.cpp | 51 +----------------- poincare/src/layout/left_bracket_layout.h | 2 - poincare/src/layout/right_bracket_layout.cpp | 49 +---------------- poincare/src/layout/right_bracket_layout.h | 2 - 6 files changed, 60 insertions(+), 104 deletions(-) diff --git a/poincare/src/layout/bracket_layout.cpp b/poincare/src/layout/bracket_layout.cpp index 9ce509275..0dd4cd6d7 100644 --- a/poincare/src/layout/bracket_layout.cpp +++ b/poincare/src/layout/bracket_layout.cpp @@ -1,4 +1,5 @@ #include "bracket_layout.h" +#include #include extern "C" { #include @@ -50,14 +51,68 @@ KDSize BracketLayout::computeSize() { return KDSize(k_externWidthMargin + k_lineThickness + k_widthMargin, operandHeight() + k_lineThickness); } +void BracketLayout::computeBaseline() { + assert(m_parent != nullptr); + m_baseline = operandHeight()/2; + int currentNumberOfOpenBrackets = 1; + int increment = isLeftBracket() ? 1 : -1; + int numberOfSiblings = m_parent->numberOfChildren(); + for (int i = m_parent->indexOfChild(this) + increment; i >= 0 && i < numberOfSiblings; i+=increment) { + ExpressionLayout * sibling = m_parent->editableChild(i); + if ((isRightBracket() && sibling->isLeftBracket()) + || (isLeftBracket() && sibling->isRightBracket())) + { + currentNumberOfOpenBrackets--; + if (currentNumberOfOpenBrackets == 0) { + break; + } + } else if ((isRightBracket() && sibling->isRightBracket()) + || (isLeftBracket() && sibling->isLeftBracket())) + { + currentNumberOfOpenBrackets++; + } + if (sibling->baseline() > m_baseline) { + m_baseline = sibling->baseline(); + } + } + m_baselined = true; +} + KDCoordinate BracketLayout::operandHeight() { if (!m_operandHeightComputed) { computeOperandHeight(); - m_operandHeightComputed = true; } return m_operandHeight; } +void BracketLayout::computeOperandHeight() { + assert(m_parent != nullptr); + m_operandHeight = Metric::MinimalBracketAndParenthesisHeight; + int currentNumberOfOpenBrackets = 1; + int increment = isLeftBracket() ? 1 : -1; + int numberOfSiblings = m_parent->numberOfChildren(); + for (int i = m_parent->indexOfChild(this) + increment; i >= 0 && i < numberOfSiblings; i+=increment) { + ExpressionLayout * sibling = m_parent->editableChild(i); + if ((isRightBracket() && sibling->isLeftBracket()) + || (isLeftBracket() && sibling->isRightBracket())) + { + currentNumberOfOpenBrackets--; + if (currentNumberOfOpenBrackets == 0) { + break; + } + } else if ((isRightBracket() && sibling->isRightBracket()) + || (isLeftBracket() && sibling->isLeftBracket())) + { + currentNumberOfOpenBrackets++; + } + KDCoordinate siblingHeight = sibling->size().height(); + if (siblingHeight > m_operandHeight) { + m_operandHeight = siblingHeight; + } + } + m_operandHeightComputed = true; +} + KDPoint BracketLayout::positionOfChild(ExpressionLayout * child) { assert(false); return KDPointZero; diff --git a/poincare/src/layout/bracket_layout.h b/poincare/src/layout/bracket_layout.h index 4f8ee41bf..6418d45b8 100644 --- a/poincare/src/layout/bracket_layout.h +++ b/poincare/src/layout/bracket_layout.h @@ -17,8 +17,9 @@ protected: constexpr static KDCoordinate k_widthMargin = 5; constexpr static KDCoordinate k_externWidthMargin = 2; KDSize computeSize() override; + void computeBaseline() override; KDCoordinate operandHeight(); - virtual void computeOperandHeight() = 0; + void computeOperandHeight(); KDPoint positionOfChild(ExpressionLayout * child) override; bool m_operandHeightComputed; uint16_t m_operandHeight; diff --git a/poincare/src/layout/left_bracket_layout.cpp b/poincare/src/layout/left_bracket_layout.cpp index 27e99e0ff..21a3b5fe5 100644 --- a/poincare/src/layout/left_bracket_layout.cpp +++ b/poincare/src/layout/left_bracket_layout.cpp @@ -1,14 +1,9 @@ #include "left_bracket_layout.h" -#include -extern "C" { -#include -} namespace Poincare { ExpressionLayout * LeftBracketLayout::clone() const { - LeftBracketLayout * layout = new LeftBracketLayout(); - return layout; + return new LeftBracketLayout(); } void LeftBracketLayout::render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) { @@ -17,48 +12,4 @@ void LeftBracketLayout::render(KDContext * ctx, KDPoint p, KDColor expressionCol ctx->fillRect(KDRect(p.x()+k_externWidthMargin, p.y() + operandHeight(), k_bracketWidth, k_lineThickness), expressionColor); } -void LeftBracketLayout::computeOperandHeight() { - assert(m_parent != nullptr); - m_operandHeight = Metric::MinimalBracketAndParenthesisHeight; - int currentNumberOfOpenBrackets = 1; - int numberOfSiblings = m_parent->numberOfChildren(); - for (int i = m_parent->indexOfChild(this) + 1; i < numberOfSiblings; i++) { - ExpressionLayout * sibling = m_parent->editableChild(i); - if (sibling->isRightBracket()) { - currentNumberOfOpenBrackets--; - if (currentNumberOfOpenBrackets == 0) { - return; - } - } else if (sibling->isLeftBracket()) { - currentNumberOfOpenBrackets++; - } - KDCoordinate siblingHeight = sibling->size().height(); - if (siblingHeight > m_operandHeight) { - m_operandHeight = siblingHeight; - } - } -} - -void LeftBracketLayout::computeBaseline() { - assert(m_parent != nullptr); - m_baseline = operandHeight()/2; - int currentNumberOfOpenBrackets = 1; - int numberOfSiblings = m_parent->numberOfChildren(); - for (int i = m_parent->indexOfChild(this) + 1; i < numberOfSiblings; i++) { - ExpressionLayout * sibling = m_parent->editableChild(i); - if (sibling->isRightBracket()) { - currentNumberOfOpenBrackets--; - if (currentNumberOfOpenBrackets == 0) { - break; - } - } else if (sibling->isLeftBracket()) { - currentNumberOfOpenBrackets++; - } - if (sibling->baseline() > m_baseline) { - m_baseline = sibling->baseline(); - } - } - m_baselined = true; -} - } diff --git a/poincare/src/layout/left_bracket_layout.h b/poincare/src/layout/left_bracket_layout.h index 12cf64409..f8c3881b6 100644 --- a/poincare/src/layout/left_bracket_layout.h +++ b/poincare/src/layout/left_bracket_layout.h @@ -16,8 +16,6 @@ public: bool isLeftBracket() const override { return true; } protected: void render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) override; - void computeOperandHeight() override; - void computeBaseline() override; }; } diff --git a/poincare/src/layout/right_bracket_layout.cpp b/poincare/src/layout/right_bracket_layout.cpp index f3743b1d8..c5626fb11 100644 --- a/poincare/src/layout/right_bracket_layout.cpp +++ b/poincare/src/layout/right_bracket_layout.cpp @@ -1,14 +1,9 @@ #include "right_bracket_layout.h" -#include -extern "C" { -#include -} namespace Poincare { ExpressionLayout * RightBracketLayout::clone() const { - RightBracketLayout * layout = new RightBracketLayout(); - return layout; + return new RightBracketLayout(); } void RightBracketLayout::render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) { @@ -17,46 +12,4 @@ void RightBracketLayout::render(KDContext * ctx, KDPoint p, KDColor expressionCo ctx->fillRect(KDRect(p.x()+k_widthMargin-k_bracketWidth+1, p.y() + operandHeight(), k_bracketWidth, k_lineThickness), expressionColor); } -void RightBracketLayout::computeOperandHeight() { - assert(m_parent != nullptr); - m_operandHeight = Metric::MinimalBracketAndParenthesisHeight; - int currentNumberOfOpenBrackets = 1; - for (int i = m_parent->indexOfChild(this) - 1; i >= 0; i--) { - ExpressionLayout * sibling = m_parent->editableChild(i); - if (sibling->isLeftBracket()) { - currentNumberOfOpenBrackets--; - if (currentNumberOfOpenBrackets == 0) { - return; - } - } else if (sibling->isRightBracket()) { - currentNumberOfOpenBrackets++; - } - KDCoordinate siblingHeight = sibling->size().height(); - if (siblingHeight > m_operandHeight) { - m_operandHeight = siblingHeight; - } - } -} - -void RightBracketLayout::computeBaseline() { - assert(m_parent != nullptr); - m_baseline = operandHeight()/2; - int currentNumberOfOpenBrackets = 1; - for (int i = m_parent->indexOfChild(this) - 1; i >= 0; i--) { - ExpressionLayout * sibling = m_parent->editableChild(i); - if (sibling->isLeftBracket()) { - currentNumberOfOpenBrackets--; - if (currentNumberOfOpenBrackets == 0) { - break; - } - } else if (sibling->isRightBracket()) { - currentNumberOfOpenBrackets++; - } - if (sibling->baseline() > m_baseline) { - m_baseline = sibling->baseline(); - } - } - m_baselined = true; -} - } diff --git a/poincare/src/layout/right_bracket_layout.h b/poincare/src/layout/right_bracket_layout.h index 011c67cf8..bece05a12 100644 --- a/poincare/src/layout/right_bracket_layout.h +++ b/poincare/src/layout/right_bracket_layout.h @@ -16,8 +16,6 @@ public: bool isRightBracket() const override { return true; } protected: void render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) override; - void computeOperandHeight() override; - void computeBaseline() override; }; }