From d0f879bb2bab0b97b32dcfa841ba8546e224ba1e Mon Sep 17 00:00:00 2001 From: Romain Goyet Date: Tue, 22 Sep 2015 09:58:43 +0200 Subject: [PATCH] [poincare] fraction_layout --- poincare/Makefile | 2 +- poincare/src/fraction.cpp | 4 +- poincare/src/layout/fraction_layout.cpp | 65 ++++++++++++++----------- poincare/src/layout/fraction_layout.h | 10 ++-- 4 files changed, 45 insertions(+), 36 deletions(-) diff --git a/poincare/Makefile b/poincare/Makefile index 8f938eb2a..0fca71b00 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -1,6 +1,6 @@ SFLAGS += -Ipoincare/include objs += $(addprefix poincare/src/, addition.o expression.o integer.o fraction.o expression_lexer.o expression_parser.o) -objs += $(addprefix poincare/src/layout/, expression_layout.o horizontal_layout.o string_layout.o) +objs += $(addprefix poincare/src/layout/, expression_layout.o fraction_layout.o horizontal_layout.o string_layout.o) tests += $(addprefix poincare/test/, integer.cpp) # Even though flex and bison will generate both implementation and headers at diff --git a/poincare/src/fraction.cpp b/poincare/src/fraction.cpp index 6ffce01cb..1e634748f 100644 --- a/poincare/src/fraction.cpp +++ b/poincare/src/fraction.cpp @@ -1,6 +1,6 @@ #include #include -#include "layout/horizontal_layout.h" +#include "layout/fraction_layout.h" /* static inline KDCoordinate max(KDCoordinate a, KDCoordinate b) { @@ -28,7 +28,7 @@ Expression ** Fraction::children() { */ ExpressionLayout * Fraction::createLayout(ExpressionLayout * parent) { - return new HorizontalLayout(parent, NUMERATOR, '-', DENOMINATOR); + return new FractionLayout(parent, NUMERATOR, DENOMINATOR); } /* void Fraction::layout() { diff --git a/poincare/src/layout/fraction_layout.cpp b/poincare/src/layout/fraction_layout.cpp index 9c020c352..a30bb0225 100644 --- a/poincare/src/layout/fraction_layout.cpp +++ b/poincare/src/layout/fraction_layout.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "fraction_layout.h" static inline KDCoordinate max(KDCoordinate a, KDCoordinate b) { @@ -10,9 +11,29 @@ static inline KDCoordinate max(KDCoordinate a, KDCoordinate b) { #define FRACTION_LINE_MARGIN 2 #define FRACTION_LINE_HEIGHT 1 -FractionLayout::FractionLayout(Expression * numerator, Expression * denominator) { - m_numerator = numerator->createLayout(); - m_denominator = denominator->createLayout(); +FractionLayout::FractionLayout(ExpressionLayout * parent, Expression * numerator, Expression * denominator) : +ExpressionLayout(parent) { + m_numerator = numerator->createLayout(this); + m_denominator = denominator->createLayout(this); +} + +FractionLayout::~FractionLayout() { + delete m_denominator; + delete m_numerator; +} + +void FractionLayout::render(KDPoint origin) { + KDCoordinate fractionLineY = m_numerator->size().height + FRACTION_LINE_MARGIN; + + KDDrawLine((KDPoint){.x = 0, .y = fractionLineY}, + (KDPoint){.x = size().width, .y = fractionLineY}); +} + +KDSize FractionLayout::computeSize() { + KDSize s; + s.width = max(m_numerator->size().width, m_denominator->size().width) + 2*FRACTION_BORDER_LENGTH; + s.height = m_numerator->size().height + FRACTION_LINE_MARGIN + FRACTION_LINE_HEIGHT + FRACTION_LINE_MARGIN + m_denominator->size().height; + return s; } ExpressionLayout * FractionLayout::child(uint16_t index) { @@ -26,30 +47,16 @@ ExpressionLayout * FractionLayout::child(uint16_t index) { } } -void FractionLayout::positionChildren() { - /* - m_numerator->m_frame.origin.x = (KDCoordinate)((m_frame.width - numFrame.width)/2); - m_numerator->m_frame.origin.y = 0; - - m_denominator->m_frame.origin.x = (KDCoordinate)((m_frame.width - denFrame.width)/2); - m_denominator->m_frame.origin.y = (KDCoordinate)(numFrame.height + 2*FRACTION_LINE_MARGIN + FRACTION_LINE_HEIGHT); - */ -} - -void FractionLayout::computeSize() { - /* - m_frame.width = max(numFrame.width, denFrame.width) + 2*FRACTION_BORDER_LENGTH; - m_frame.height = numFrame.height + FRACTION_LINE_MARGIN + FRACTION_LINE_HEIGHT + FRACTION_LINE_MARGIN + denFrame.height; - */ -} - - -void FractionLayout::draw() { - m_numerator->draw(); - m_denominator->draw(); - - KDCoordinate fractionLineY = m_numerator->m_frame.height + FRACTION_LINE_MARGIN; - - KDDrawLine((KDPoint){.x = 0, .y = fractionLineY}, - (KDPoint){.x = m_frame.width, .y = fractionLineY}); +KDPoint FractionLayout::positionOfChild(ExpressionLayout * child) { + KDPoint p; + if (child == m_numerator) { + p.x = (KDCoordinate)((size().width - m_numerator->size().width)/2); + p.y = 0; + } else if (child == m_denominator) { + p.x = (KDCoordinate)((size().width - m_denominator->size().width)/2); + p.y = (KDCoordinate)(size().height + 2*FRACTION_LINE_MARGIN + FRACTION_LINE_HEIGHT); + } else { + assert(false); // Should not happen + } + return p; } diff --git a/poincare/src/layout/fraction_layout.h b/poincare/src/layout/fraction_layout.h index 57f496783..03be7b995 100644 --- a/poincare/src/layout/fraction_layout.h +++ b/poincare/src/layout/fraction_layout.h @@ -6,11 +6,13 @@ class FractionLayout : public ExpressionLayout { public: - FractionLayout(Expression * numerator, Expression * denominator); + FractionLayout(ExpressionLayout * parent, Expression * numerator, Expression * denominator); + ~FractionLayout(); + protected: + void render(KDPoint origin) override; + KDSize computeSize() override; ExpressionLayout * child(uint16_t index) override; - void draw() override; - void positionChildren() override; - void computeSize() override; + KDPoint positionOfChild(ExpressionLayout * child) override; private: ExpressionLayout * m_numerator; ExpressionLayout * m_denominator;