diff --git a/poincare/Makefile b/poincare/Makefile index d9750e607..aac9d10ba 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -46,6 +46,7 @@ objs += $(addprefix poincare/src/layout/,\ nth_root_layout.o\ parenthesis_layout.o\ string_layout.o\ + subscript_layout.o\ ) tests += $(addprefix poincare/test/,\ diff --git a/poincare/src/layout/subscript_layout.cpp b/poincare/src/layout/subscript_layout.cpp new file mode 100644 index 000000000..1a042fbae --- /dev/null +++ b/poincare/src/layout/subscript_layout.cpp @@ -0,0 +1,49 @@ +#include "subscript_layout.h" +#include +#include + +SubscriptLayout::SubscriptLayout(ExpressionLayout * baseLayout, ExpressionLayout * subscriptLayout) : + ExpressionLayout(), + m_baseLayout(baseLayout), + m_subscriptLayout(subscriptLayout) +{ + m_baseLayout->setParent(this); + m_subscriptLayout->setParent(this); + m_baseline = m_baseLayout->baseline(); +} + +SubscriptLayout::~SubscriptLayout() { + delete m_baseLayout; + delete m_subscriptLayout; +} + +void SubscriptLayout::render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) { + // There is nothing to draw for a power, only the position of the children matters +} + +KDSize SubscriptLayout::computeSize() { + KDSize baseSize = m_baseLayout->size(); + KDSize subscriptSize = m_subscriptLayout->size(); + return KDSize(baseSize.width() + subscriptSize.width(), m_baseLayout->baseline() + subscriptSize.height() - k_subscriptHeight); +} + +ExpressionLayout * SubscriptLayout::child(uint16_t index) { + switch (index) { + case 0: + return m_baseLayout; + case 1: + return m_subscriptLayout; + default: + return nullptr; + } +} + +KDPoint SubscriptLayout::positionOfChild(ExpressionLayout * child) { + KDCoordinate x = 0; + KDCoordinate y = 0; + if (child == m_subscriptLayout) { + x = m_baseLayout->size().width(); + y = m_baseLayout->baseline() - k_subscriptHeight; + } + return KDPoint(x,y); +} diff --git a/poincare/src/layout/subscript_layout.h b/poincare/src/layout/subscript_layout.h new file mode 100644 index 000000000..50474af3c --- /dev/null +++ b/poincare/src/layout/subscript_layout.h @@ -0,0 +1,22 @@ +#ifndef POINCARE_SUBSCRIPT_LAYOUT_H +#define POINCARE_SUBSCRIPT_LAYOUT_H + +#include +#include + +class SubscriptLayout : public ExpressionLayout { + public: + SubscriptLayout(ExpressionLayout * baseLayout, ExpressionLayout * subscriptLayout); + ~SubscriptLayout(); + 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_subscriptHeight = 5; + ExpressionLayout * m_baseLayout; + ExpressionLayout * m_subscriptLayout; +}; + +#endif