diff --git a/apps/sequence/graph/term_sum_controller.cpp b/apps/sequence/graph/term_sum_controller.cpp index 5cf3b7055..92f6b7a6a 100644 --- a/apps/sequence/graph/term_sum_controller.cpp +++ b/apps/sequence/graph/term_sum_controller.cpp @@ -1,6 +1,7 @@ #include "term_sum_controller.h" #include "../../shared/text_field_delegate.h" #include "../../../poincare/src/layout/baseline_relative_layout.h" +#include "../../../poincare/src/layout/condensed_sum_layout.h" #include "../../../poincare/src/layout/string_layout.h" #include "../../../poincare/src/layout/horizontal_layout.h" @@ -203,7 +204,7 @@ void TermSumController::ContentView::LegendView::setSumSubscript(float start) { const char sigma[2] = {Ion::Charset::CapitalSigma, 0}; char buffer[Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits)]; Complex::convertFloatToText(start, buffer, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Expression::FloatDisplayMode::Decimal); - m_sumLayout = new BaselineRelativeLayout(new StringLayout(sigma, 1), new StringLayout(buffer, strlen(buffer), KDText::FontSize::Small), BaselineRelativeLayout::Type::Subscript); + m_sumLayout = new CondensedSumLayout(new StringLayout(sigma, 1), new StringLayout(buffer, strlen(buffer), KDText::FontSize::Small), nullptr); m_sum.setExpression(m_sumLayout); m_sum.setAlignment(0.0f, 0.5f); layoutSubviews(); @@ -219,8 +220,7 @@ void TermSumController::ContentView::LegendView::setSumSuperscript(float start, Complex::convertFloatToText(start, bufferStart, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Expression::FloatDisplayMode::Decimal); char bufferEnd[Complex::bufferSizeForFloatsWithPrecision(1)]; Complex::convertFloatToText(end, bufferEnd, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Expression::FloatDisplayMode::Decimal); - ExpressionLayout * sigmaLayout = new BaselineRelativeLayout(new StringLayout(sigma, 1), new StringLayout(bufferStart, strlen(bufferStart), KDText::FontSize::Small), BaselineRelativeLayout::Type::Subscript); - m_sumLayout = new BaselineRelativeLayout(sigmaLayout, new StringLayout(bufferEnd, strlen(bufferEnd), KDText::FontSize::Small), BaselineRelativeLayout::Type::Superscript); + m_sumLayout = new CondensedSumLayout(new StringLayout(sigma, 1), new StringLayout(bufferStart, strlen(bufferStart), KDText::FontSize::Small), new StringLayout(bufferEnd, strlen(bufferEnd), KDText::FontSize::Small)); m_sum.setExpression(m_sumLayout); layoutSubviews(); } diff --git a/poincare/Makefile b/poincare/Makefile index 3f7a490de..a2bf8149d 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -46,6 +46,7 @@ objs += $(addprefix poincare/src/,\ objs += $(addprefix poincare/src/layout/,\ absolute_value_layout.o\ baseline_relative_layout.o\ + condensed_sum_layout.o\ expression_layout.o\ fraction_layout.o\ horizontal_layout.o\ diff --git a/poincare/src/layout/condensed_sum_layout.cpp b/poincare/src/layout/condensed_sum_layout.cpp new file mode 100644 index 000000000..e2c20e853 --- /dev/null +++ b/poincare/src/layout/condensed_sum_layout.cpp @@ -0,0 +1,73 @@ +#include "condensed_sum_layout.h" +#include +#include + +namespace Poincare { + +CondensedSumLayout::CondensedSumLayout(ExpressionLayout * baseLayout, ExpressionLayout * subscriptLayout, ExpressionLayout * superscriptLayout) : + ExpressionLayout(), + m_baseLayout(baseLayout), + m_subscriptLayout(subscriptLayout), + m_superscriptLayout(superscriptLayout) +{ + m_baseLayout->setParent(this); + m_subscriptLayout->setParent(this); + if (m_superscriptLayout) { + m_superscriptLayout->setParent(this); + } + KDSize superscriptSize = m_superscriptLayout == nullptr ? KDSizeZero : m_superscriptLayout->size(); + m_baseline = m_baseLayout->baseline() + max(0, superscriptSize.height() - m_baseLayout->size().height()/2); +} + +CondensedSumLayout::~CondensedSumLayout() { + delete m_baseLayout; + delete m_subscriptLayout; + if (m_superscriptLayout) { + delete m_superscriptLayout; + } +} + +void CondensedSumLayout::render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) { + // Nothing to draw +} + +KDSize CondensedSumLayout::computeSize() { + KDSize baseSize = m_baseLayout->size(); + KDSize subscriptSize = m_subscriptLayout->size(); + KDSize superscriptSize = m_superscriptLayout == nullptr ? KDSizeZero : m_superscriptLayout->size(); + return KDSize(baseSize.width() + max(subscriptSize.width(), superscriptSize.width()), max(baseSize.height()/2, subscriptSize.height()) + max(baseSize.height()/2, superscriptSize.height())); +} + +ExpressionLayout * CondensedSumLayout::child(uint16_t index) { + switch (index) { + case 0: + return m_baseLayout; + case 1: + return m_subscriptLayout; + case 2: + return m_superscriptLayout; + default: + return nullptr; + } +} + +KDPoint CondensedSumLayout::positionOfChild(ExpressionLayout * child) { + KDCoordinate x = 0; + KDCoordinate y = 0; + KDSize baseSize = m_baseLayout->size(); + KDSize superscriptSize = m_superscriptLayout == nullptr ? KDSizeZero : m_superscriptLayout->size(); + if (child == m_baseLayout) { + y = max(0, superscriptSize.height() - baseSize.height()/2); + } + if (child == m_subscriptLayout) { + x = baseSize.width(); + y = max(baseSize.height()/2, superscriptSize.height()); + } + if (child == m_superscriptLayout) { + x = baseSize.width(); + } + return KDPoint(x,y); +} + +} + diff --git a/poincare/src/layout/condensed_sum_layout.h b/poincare/src/layout/condensed_sum_layout.h new file mode 100644 index 000000000..0fcc2f9ba --- /dev/null +++ b/poincare/src/layout/condensed_sum_layout.h @@ -0,0 +1,27 @@ +#ifndef POINCARE_CONDENSED_SUM_LAYOUT_H +#define POINCARE_CONDENSED_SUM_LAYOUT_H + +#include +#include + +namespace Poincare { + +class CondensedSumLayout : public ExpressionLayout { +public: + CondensedSumLayout(ExpressionLayout * baseLayout, ExpressionLayout * subscriptLayout, ExpressionLayout * superscriptLayout = nullptr); + ~CondensedSumLayout(); +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: + ExpressionLayout * m_baseLayout; + ExpressionLayout * m_subscriptLayout; + ExpressionLayout * m_superscriptLayout; +}; + +} + +#endif +