diff --git a/app/app.cpp b/app/app.cpp index eede4f5e7..d1c9814da 100644 --- a/app/app.cpp +++ b/app/app.cpp @@ -66,7 +66,7 @@ static void interactive_expression_parsing() { clear_screen(); Expression * e = Expression::parse(text_input); if (e) { - ExpressionLayout * l = e->createLayout(nullptr); + ExpressionLayout * l = e->createLayout(); if (l) { l->draw(KDPointMake(0,10)); delete l; diff --git a/poincare/Makefile b/poincare/Makefile index 190844c66..d2b7c62c6 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -24,7 +24,6 @@ objs += $(addprefix poincare/src/layout/,\ exponent_layout.o\ expression_layout.o\ fraction_layout.o\ - function_layout.o\ horizontal_layout.o\ string_layout.o\ ) diff --git a/poincare/include/poincare/addition.h b/poincare/include/poincare/addition.h index 80f64a726..591c020b3 100644 --- a/poincare/include/poincare/addition.h +++ b/poincare/include/poincare/addition.h @@ -6,10 +6,11 @@ class Addition : public CommutativeOperation { using CommutativeOperation::CommutativeOperation; public: - ExpressionLayout * createLayout(ExpressionLayout * parent) override; Type type() override; float operateApproximatevelyOn(float a, float b) override; Expression * clone() override; + protected: + char operatorChar() override; }; #endif diff --git a/poincare/include/poincare/commutative_operation.h b/poincare/include/poincare/commutative_operation.h index a9baf31f9..e7e01f8d1 100644 --- a/poincare/include/poincare/commutative_operation.h +++ b/poincare/include/poincare/commutative_operation.h @@ -10,8 +10,10 @@ class CommutativeOperation : public Expression { Expression * operand(int i) override; int numberOfOperands() override; float approximate(Context& context) override; + ExpressionLayout * createLayout() override; protected: virtual float operateApproximatevelyOn(float a, float b) = 0; + virtual char operatorChar() = 0; int m_numberOfOperands; Expression ** m_operands; }; diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index cedb2ec46..499944a6b 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -24,7 +24,7 @@ class Expression { static Expression * parse(char const * string); virtual ~Expression(); - virtual ExpressionLayout * createLayout(ExpressionLayout * parent) = 0; // Returned object must be deleted + virtual ExpressionLayout * createLayout() = 0; // Returned object must be deleted virtual Expression * operand(int i) = 0; virtual int numberOfOperands() = 0; virtual Expression * clone() = 0; diff --git a/poincare/include/poincare/expression_layout.h b/poincare/include/poincare/expression_layout.h index 52f822fc4..a46c005d2 100644 --- a/poincare/include/poincare/expression_layout.h +++ b/poincare/include/poincare/expression_layout.h @@ -7,12 +7,13 @@ extern "C" { class ExpressionLayout { public: - ExpressionLayout(ExpressionLayout * parent); + ExpressionLayout(); virtual ~ExpressionLayout(); void draw(KDPoint point); KDPoint origin(); KDSize size(); + void setParent(ExpressionLayout* parent); protected: virtual void render(KDPoint point) = 0; virtual KDSize computeSize() = 0; @@ -21,7 +22,7 @@ class ExpressionLayout { private: KDPoint absoluteOrigin(); //void computeLayout();//ExpressionLayout * parent, uint16_t childIndex); - ExpressionLayout * m_parent; + ExpressionLayout* m_parent; bool m_sized, m_positioned; KDRect m_frame; }; diff --git a/poincare/include/poincare/float.h b/poincare/include/poincare/float.h index f95edf757..245a1e8d9 100644 --- a/poincare/include/poincare/float.h +++ b/poincare/include/poincare/float.h @@ -8,7 +8,7 @@ class Float : public LeafExpression { Float(float f); ~Float(); - ExpressionLayout * createLayout(ExpressionLayout * parent) override; + ExpressionLayout * createLayout() override; float approximate(Context& context) override; Type type() override; Expression * clone() override; diff --git a/poincare/include/poincare/fraction.h b/poincare/include/poincare/fraction.h index 20c602908..23fbe9352 100644 --- a/poincare/include/poincare/fraction.h +++ b/poincare/include/poincare/fraction.h @@ -6,7 +6,7 @@ class Fraction : public BinaryOperation { using BinaryOperation::BinaryOperation; public: - ExpressionLayout * createLayout(ExpressionLayout * parent) override; + ExpressionLayout * createLayout() override; float approximate(Context& context) override; Type type() override; Expression * clone() override; diff --git a/poincare/include/poincare/function.h b/poincare/include/poincare/function.h index e02e7e388..576832d25 100644 --- a/poincare/include/poincare/function.h +++ b/poincare/include/poincare/function.h @@ -7,7 +7,7 @@ class Function : public Expression { public: Function(Expression * arg, char* function_name, bool clone_operands=true); ~Function(); - ExpressionLayout * createLayout(ExpressionLayout * parent) override; + ExpressionLayout * createLayout() override; Expression * operand(int i) override; int numberOfOperands() override; protected: diff --git a/poincare/include/poincare/integer.h b/poincare/include/poincare/integer.h index 9db01a62f..b29b2f7b0 100644 --- a/poincare/include/poincare/integer.h +++ b/poincare/include/poincare/integer.h @@ -34,7 +34,7 @@ class Integer : public LeafExpression { virtual bool identicalTo(Expression * e); */ Expression * clone() override; - virtual ExpressionLayout * createLayout(ExpressionLayout * parent) override; + virtual ExpressionLayout * createLayout() override; float approximate(Context& context) override; private: int8_t ucmp(const Integer &other) const; // -1, 0, or 1 diff --git a/poincare/include/poincare/power.h b/poincare/include/poincare/power.h index 0c91f2ccd..4f567a1df 100644 --- a/poincare/include/poincare/power.h +++ b/poincare/include/poincare/power.h @@ -6,7 +6,7 @@ class Power : public BinaryOperation { using BinaryOperation::BinaryOperation; public: - ExpressionLayout * createLayout(ExpressionLayout * parent) override; + ExpressionLayout * createLayout() override; float approximate(Context& context) override; Type type() override; Expression * clone() override; diff --git a/poincare/include/poincare/product.h b/poincare/include/poincare/product.h index 048d6d606..4b4b50be1 100644 --- a/poincare/include/poincare/product.h +++ b/poincare/include/poincare/product.h @@ -6,10 +6,11 @@ class Product : public CommutativeOperation { using CommutativeOperation::CommutativeOperation; public: - ExpressionLayout * createLayout(ExpressionLayout * parent) override; Type type() override; float operateApproximatevelyOn(float a, float b) override; Expression * clone() override; + protected: + char operatorChar() override; }; #endif diff --git a/poincare/include/poincare/subtraction.h b/poincare/include/poincare/subtraction.h index 7dac515d3..5054bf390 100644 --- a/poincare/include/poincare/subtraction.h +++ b/poincare/include/poincare/subtraction.h @@ -6,7 +6,7 @@ class Subtraction : public BinaryOperation { using BinaryOperation::BinaryOperation; public: - ExpressionLayout * createLayout(ExpressionLayout * parent) override; + ExpressionLayout * createLayout() override; float approximate(Context& context) override; Type type() override; Expression * clone() override; diff --git a/poincare/include/poincare/symbol.h b/poincare/include/poincare/symbol.h index 78967aa3b..b0e1ebaba 100644 --- a/poincare/include/poincare/symbol.h +++ b/poincare/include/poincare/symbol.h @@ -7,7 +7,7 @@ class Symbol : public LeafExpression { public: Symbol(char * name); ~Symbol(); - ExpressionLayout * createLayout(ExpressionLayout * parent) override; + ExpressionLayout * createLayout() override; float approximate(Context& context) override; Type type() override; Expression * clone() override; diff --git a/poincare/src/addition.cpp b/poincare/src/addition.cpp index 15795ee7b..0783002dc 100644 --- a/poincare/src/addition.cpp +++ b/poincare/src/addition.cpp @@ -13,6 +13,6 @@ float Addition::operateApproximatevelyOn(float a, float b) { return a + b; } -ExpressionLayout * Addition::createLayout(ExpressionLayout * parent) { - return new HorizontalLayout(parent, m_operands, m_numberOfOperands, '+'); +char Addition::operatorChar() { + return '+'; } diff --git a/poincare/src/commutative_operation.cpp b/poincare/src/commutative_operation.cpp index 37252e0a0..f96c76f90 100644 --- a/poincare/src/commutative_operation.cpp +++ b/poincare/src/commutative_operation.cpp @@ -4,6 +4,9 @@ extern "C" { #include } +#include "layout/horizontal_layout.h" +#include "layout/string_layout.h" + CommutativeOperation::CommutativeOperation(Expression ** operands, int numberOfOperands, bool cloneOperands) { assert(numberOfOperands >= 2); m_numberOfOperands = numberOfOperands; @@ -42,3 +45,15 @@ float CommutativeOperation::approximate(Context& context) { } return result; } + +ExpressionLayout * CommutativeOperation::createLayout() { + int number_of_children = 2*m_numberOfOperands-1; + ExpressionLayout** children_layouts = (ExpressionLayout **)malloc(number_of_children*sizeof(ExpressionLayout *)); + char string[2] = {operatorChar(), '\0'}; + children_layouts[0] = m_operands[0]->createLayout(); + for (int i=1; icreateLayout(); + } + return new HorizontalLayout(children_layouts, number_of_children); +} diff --git a/poincare/src/float.cpp b/poincare/src/float.cpp index 2a905b248..88fade139 100644 --- a/poincare/src/float.cpp +++ b/poincare/src/float.cpp @@ -21,7 +21,7 @@ Expression::Type Float::type() { return Expression::Type::Float; } -ExpressionLayout * Float::createLayout(ExpressionLayout * parent) { +ExpressionLayout * Float::createLayout() { assert(0); // Should not come here, ever... return nullptr; } diff --git a/poincare/src/fraction.cpp b/poincare/src/fraction.cpp index a5172bc3a..10893c814 100644 --- a/poincare/src/fraction.cpp +++ b/poincare/src/fraction.cpp @@ -6,8 +6,8 @@ Expression * Fraction::clone() { return new Fraction(m_operands, true); } -ExpressionLayout * Fraction::createLayout(ExpressionLayout * parent) { - return new FractionLayout(parent, m_operands[0], m_operands[1]); +ExpressionLayout * Fraction::createLayout() { + return new FractionLayout(m_operands[0]->createLayout(), m_operands[1]->createLayout()); } float Fraction::approximate(Context& context) { diff --git a/poincare/src/function.cpp b/poincare/src/function.cpp index e0ac86286..9def96a61 100644 --- a/poincare/src/function.cpp +++ b/poincare/src/function.cpp @@ -2,7 +2,8 @@ extern "C" { #include } #include -#include "layout/function_layout.h" +#include "layout/horizontal_layout.h" +#include "layout/string_layout.h" Function::Function(Expression * arg, char* function_name, bool clone_operands) { m_arg = (Expression *)malloc(sizeof(Expression)); @@ -18,8 +19,15 @@ Function::~Function() { delete m_arg; } -ExpressionLayout * Function::createLayout(ExpressionLayout * parent) { - return new FunctionLayout(parent, m_function_name, m_arg); +ExpressionLayout * Function::createLayout() { + ExpressionLayout** children_layouts = (ExpressionLayout **)malloc(4*sizeof(ExpressionLayout *)); + children_layouts[0] = new StringLayout(m_function_name, strlen(m_function_name)); + char string[2] = {'-', '\0'}; + children_layouts[1] = new StringLayout(string, 1); + children_layouts[2] = m_arg->createLayout(); + string[0] = ')'; + children_layouts[3] = new StringLayout(string, 1); + return new HorizontalLayout(children_layouts, 4); } Expression * Function::operand(int i) { diff --git a/poincare/src/integer.cpp b/poincare/src/integer.cpp index f073fc748..78de87385 100644 --- a/poincare/src/integer.cpp +++ b/poincare/src/integer.cpp @@ -268,7 +268,7 @@ Expression * Integer::clone() { clone->m_negative = m_negative; free(clone->m_digits); clone->m_digits = (native_uint_t *)malloc(m_numberOfDigits*sizeof(native_uint_t)); - for (int i=0;im_digits[i] = m_digits[i]; } return clone; @@ -320,7 +320,7 @@ Expression::Type Integer::type() { return Expression::Type::Integer; } -ExpressionLayout * Integer::createLayout(ExpressionLayout * parent) { +ExpressionLayout * Integer::createLayout() { char buffer[255]; Integer base = Integer(10); @@ -341,7 +341,7 @@ ExpressionLayout * Integer::createLayout(ExpressionLayout * parent) { buffer[j] = c; } - return new StringLayout(parent, buffer, size); + return new StringLayout(buffer, size); } bool Integer::valueEquals(Expression * e) { diff --git a/poincare/src/layout/exponent_layout.cpp b/poincare/src/layout/exponent_layout.cpp index 2dc202bf9..6f8b703fe 100644 --- a/poincare/src/layout/exponent_layout.cpp +++ b/poincare/src/layout/exponent_layout.cpp @@ -5,10 +5,10 @@ // TODO(fraimundo): Find a better name. #define EXPONENT_HEIGHT 5 -ExponentLayout::ExponentLayout(ExpressionLayout * parent, Expression * base, Expression * exponent) : -ExpressionLayout(parent) { - m_base_layout = base->createLayout(this); - m_exponent_layout = exponent->createLayout(this); +ExponentLayout::ExponentLayout(ExpressionLayout * base_layout, ExpressionLayout * exponent_layout) : +ExpressionLayout(), m_base_layout(base_layout), m_exponent_layout(exponent_layout) { + m_base_layout->setParent(this); + m_exponent_layout->setParent(this); } ExponentLayout::~ExponentLayout() { diff --git a/poincare/src/layout/exponent_layout.h b/poincare/src/layout/exponent_layout.h index 7f79fc64b..c29eacc1d 100644 --- a/poincare/src/layout/exponent_layout.h +++ b/poincare/src/layout/exponent_layout.h @@ -6,7 +6,7 @@ class ExponentLayout : public ExpressionLayout { public: - ExponentLayout(ExpressionLayout * parent, Expression * base, Expression * exponent); + ExponentLayout(ExpressionLayout * base_layout, ExpressionLayout * exponent_layout); ~ExponentLayout(); protected: void render(KDPoint point) override; diff --git a/poincare/src/layout/expression_layout.cpp b/poincare/src/layout/expression_layout.cpp index 54c15ac52..8a31b9c3e 100644 --- a/poincare/src/layout/expression_layout.cpp +++ b/poincare/src/layout/expression_layout.cpp @@ -2,8 +2,8 @@ #include #include "string_layout.h" -ExpressionLayout::ExpressionLayout(ExpressionLayout * parent) : - m_parent(parent), +ExpressionLayout::ExpressionLayout() : + m_parent(nullptr), m_sized(false), m_positioned(false), m_frame(KDRectZero) { @@ -52,3 +52,7 @@ KDSize ExpressionLayout::size() { } return m_frame.size; } + +void ExpressionLayout::setParent(ExpressionLayout* parent) { + m_parent = parent; +} diff --git a/poincare/src/layout/fraction_layout.cpp b/poincare/src/layout/fraction_layout.cpp index d0d56f71d..c4ef1b3fb 100644 --- a/poincare/src/layout/fraction_layout.cpp +++ b/poincare/src/layout/fraction_layout.cpp @@ -10,19 +10,19 @@ static inline KDCoordinate max(KDCoordinate a, KDCoordinate b) { #define FRACTION_LINE_MARGIN 2 #define FRACTION_LINE_HEIGHT 1 -FractionLayout::FractionLayout(ExpressionLayout * parent, Expression * numerator, Expression * denominator) : -ExpressionLayout(parent) { - m_numerator = numerator->createLayout(this); - m_denominator = denominator->createLayout(this); +FractionLayout::FractionLayout(ExpressionLayout * numerator_layout, ExpressionLayout * denominator_layout) : +ExpressionLayout(), m_numerator_layout(numerator_layout), m_denominator_layout(denominator_layout) { + m_numerator_layout->setParent(this); + m_denominator_layout->setParent(this); } FractionLayout::~FractionLayout() { - delete m_denominator; - delete m_numerator; + delete m_denominator_layout; + delete m_numerator_layout; } void FractionLayout::render(KDPoint point) { - KDCoordinate fractionLineY = point.y + m_numerator->size().height + FRACTION_LINE_MARGIN; + KDCoordinate fractionLineY = point.y + m_numerator_layout->size().height + FRACTION_LINE_MARGIN; KDDrawLine( KDPointMake(point.x, fractionLineY), @@ -32,17 +32,18 @@ void FractionLayout::render(KDPoint point) { 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; + s.width = max(m_numerator_layout->size().width, m_denominator_layout->size().width) + 2*FRACTION_BORDER_LENGTH; + s.height = m_numerator_layout->size().height + FRACTION_LINE_MARGIN + + FRACTION_LINE_HEIGHT + FRACTION_LINE_MARGIN + m_denominator_layout->size().height; return s; } ExpressionLayout * FractionLayout::child(uint16_t index) { switch (index) { case 0: - return m_numerator; + return m_numerator_layout; case 1: - return m_denominator; + return m_denominator_layout; default: return nullptr; } @@ -50,12 +51,12 @@ ExpressionLayout * FractionLayout::child(uint16_t index) { KDPoint FractionLayout::positionOfChild(ExpressionLayout * child) { KDPoint p; - if (child == m_numerator) { - p.x = (KDCoordinate)((size().width - m_numerator->size().width)/2); + if (child == m_numerator_layout) { + p.x = (KDCoordinate)((size().width - m_numerator_layout->size().width)/2); p.y = 0; - } else if (child == m_denominator) { - p.x = (KDCoordinate)((size().width - m_denominator->size().width)/2); - p.y = (KDCoordinate)(m_numerator->size().height + 2*FRACTION_LINE_MARGIN + FRACTION_LINE_HEIGHT); + } else if (child == m_denominator_layout) { + p.x = (KDCoordinate)((size().width - m_denominator_layout->size().width)/2); + p.y = (KDCoordinate)(m_numerator_layout->size().height + 2*FRACTION_LINE_MARGIN + FRACTION_LINE_HEIGHT); } else { assert(false); // Should not happen } diff --git a/poincare/src/layout/fraction_layout.h b/poincare/src/layout/fraction_layout.h index 56e531d64..5d1953ab8 100644 --- a/poincare/src/layout/fraction_layout.h +++ b/poincare/src/layout/fraction_layout.h @@ -6,7 +6,7 @@ class FractionLayout : public ExpressionLayout { public: - FractionLayout(ExpressionLayout * parent, Expression * numerator, Expression * denominator); + FractionLayout(ExpressionLayout * numerator, ExpressionLayout * denominator); ~FractionLayout(); protected: void render(KDPoint point) override; @@ -14,8 +14,8 @@ class FractionLayout : public ExpressionLayout { ExpressionLayout * child(uint16_t index) override; KDPoint positionOfChild(ExpressionLayout * child) override; private: - ExpressionLayout * m_numerator; - ExpressionLayout * m_denominator; + ExpressionLayout * m_numerator_layout; + ExpressionLayout * m_denominator_layout; }; #endif diff --git a/poincare/src/layout/function_layout.cpp b/poincare/src/layout/function_layout.cpp deleted file mode 100644 index 02bc5410b..000000000 --- a/poincare/src/layout/function_layout.cpp +++ /dev/null @@ -1,73 +0,0 @@ -extern "C" { -#include -#include -} -#include "function_layout.h" -#include "string_layout.h" - -// This code seems like a duplicate of the horizontal layout but it isn't, indeed the horizontal -// layout is used to print the same operation applied to different expressions such that: -// "expr_1 + epr_2 + expr_3 + expr_4". -// Here we want the pattern -// FUNCTION_NAME(expr). -// Thus the code in horizontal layer is not really reusable. - -FunctionLayout::FunctionLayout(ExpressionLayout * parent, char* function_name, Expression * argument) : -ExpressionLayout(parent) { - m_children[0] = new StringLayout(this, function_name, 1); - - char string[2] = {'(', '\0'}; - m_children[1] = new StringLayout(this, string, 1); - - m_children[2] = argument->createLayout(this); - - string[0] = ')'; - m_children[3] = new StringLayout(this, string, 1); -} - -FunctionLayout::~FunctionLayout() { - for (int i(0); i<4; i++) { - delete m_children[i]; - } -} - -void FunctionLayout::render(KDPoint point) { } - -KDSize FunctionLayout::computeSize() { - KDSize size = (KDSize){.width = 0, .height = 0}; - int i = 0; - while (ExpressionLayout * c = child(i++)) { - KDSize childSize = c->size(); - size.width += childSize.width; - if (childSize.height > size.height) { - size.height = childSize.height; - } - } - return size; -} - -ExpressionLayout * FunctionLayout::child(uint16_t index) { - if (index >= 4) { - return nullptr; - } - return m_children[index]; -} - -KDPoint FunctionLayout::positionOfChild(ExpressionLayout * child) { - KDPoint position = (KDPoint){.x = 0, .y = 0}; - uint16_t index = 0; - for (int i=0;i<4;i++) { - if (m_children[i] == child) { - index = i; - break; - } - } - if (index > 0) { - ExpressionLayout * previousChild = m_children[index-1]; - assert(previousChild != nullptr); - position.x = previousChild->origin().x + previousChild->size().width; - } - position.y = (size().height - child->size().height)/2; - return position; -} - diff --git a/poincare/src/layout/function_layout.h b/poincare/src/layout/function_layout.h deleted file mode 100644 index 0b689dfcf..000000000 --- a/poincare/src/layout/function_layout.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef POINCARE_FUNCTION_LAYOUT_H -#define POINCARE_FUNCTION_LAYOUT_H - -#include -#include - -class FunctionLayout : public ExpressionLayout { - public: - FunctionLayout(ExpressionLayout * parent, char* function_name, Expression * arg); - ~FunctionLayout(); - protected: - void render(KDPoint point) override; - KDSize computeSize() override; - ExpressionLayout * child(uint16_t index) override; - KDPoint positionOfChild(ExpressionLayout * child) override; - private: - ExpressionLayout * m_children[4]; -}; - -#endif - diff --git a/poincare/src/layout/horizontal_layout.cpp b/poincare/src/layout/horizontal_layout.cpp index eebc343b0..2b43b7685 100644 --- a/poincare/src/layout/horizontal_layout.cpp +++ b/poincare/src/layout/horizontal_layout.cpp @@ -6,15 +6,11 @@ extern "C" { #include "horizontal_layout.h" #include "string_layout.h" -HorizontalLayout::HorizontalLayout(ExpressionLayout * parent, Expression ** operands,int number_of_operands, char symbol) : ExpressionLayout(parent) { - assert(number_of_operands > 0); - m_number_of_children = 2*number_of_operands-1; - m_children_layouts = (ExpressionLayout **)malloc(m_number_of_children*sizeof(ExpressionLayout *)); - char string[2] = {symbol, '\0'}; - m_children_layouts[0] = operands[0]->createLayout(this); - for (int i=1; icreateLayout(this); +HorizontalLayout::HorizontalLayout(ExpressionLayout ** children_layouts, int number_of_children) : + ExpressionLayout(), m_number_of_children(number_of_children), m_children_layouts(children_layouts) { + assert(number_of_children > 0); + for (int i=0; isetParent(this); } } @@ -41,8 +37,8 @@ KDSize HorizontalLayout::computeSize() { } ExpressionLayout * HorizontalLayout::child(uint16_t index) { - assert(index <= m_number_of_children); - if (index < m_number_of_children) { + assert(index <= (unsigned int) m_number_of_children); + if (index < (unsigned int) m_number_of_children) { return m_children_layouts[index]; } else { return nullptr; diff --git a/poincare/src/layout/horizontal_layout.h b/poincare/src/layout/horizontal_layout.h index 0ee133f5c..44468fc7b 100644 --- a/poincare/src/layout/horizontal_layout.h +++ b/poincare/src/layout/horizontal_layout.h @@ -6,7 +6,7 @@ class HorizontalLayout : public ExpressionLayout { public: - HorizontalLayout(ExpressionLayout * parent, Expression ** operands, int number_of_children, char symbol); + HorizontalLayout(ExpressionLayout ** layouts, int number_of_children); ~HorizontalLayout(); protected: void render(KDPoint point) override; diff --git a/poincare/src/layout/string_layout.cpp b/poincare/src/layout/string_layout.cpp index ec65e22e3..52de8df98 100644 --- a/poincare/src/layout/string_layout.cpp +++ b/poincare/src/layout/string_layout.cpp @@ -2,8 +2,8 @@ #include #include "string_layout.h" -StringLayout::StringLayout(ExpressionLayout * parent, const char * string, size_t length) : -ExpressionLayout(parent) { +StringLayout::StringLayout(const char * string, size_t length) : +ExpressionLayout() { assert(string[length] == 0); // Assert NULL-termination m_string = (char *)malloc(sizeof(char)*(length+1)); memcpy(m_string, string, (length+1)); diff --git a/poincare/src/layout/string_layout.h b/poincare/src/layout/string_layout.h index b70afcd40..0c5de9546 100644 --- a/poincare/src/layout/string_layout.h +++ b/poincare/src/layout/string_layout.h @@ -6,7 +6,7 @@ class StringLayout : public ExpressionLayout { public: - StringLayout(ExpressionLayout * parent, const char * string, size_t length); + StringLayout(const char * string, size_t length); ~StringLayout(); protected: void render(KDPoint point) override; diff --git a/poincare/src/power.cpp b/poincare/src/power.cpp index d9c53835d..6eb6cb2f4 100644 --- a/poincare/src/power.cpp +++ b/poincare/src/power.cpp @@ -14,6 +14,6 @@ Expression::Type Power::type() { return Expression::Type::Power; } -ExpressionLayout * Power::createLayout(ExpressionLayout * parent) { - return new ExponentLayout(parent, m_operands[0], m_operands[1]); +ExpressionLayout * Power::createLayout() { + return new ExponentLayout(m_operands[0]->createLayout(), m_operands[1]->createLayout()); } diff --git a/poincare/src/product.cpp b/poincare/src/product.cpp index 36c93dcba..7fefa4ca1 100644 --- a/poincare/src/product.cpp +++ b/poincare/src/product.cpp @@ -16,6 +16,6 @@ Expression::Type Product::type() { return Expression::Type::Product; } -ExpressionLayout * Product::createLayout(ExpressionLayout * parent) { - return new HorizontalLayout(parent, m_operands, m_numberOfOperands, '*'); +char Product::operatorChar() { + return '*'; } diff --git a/poincare/src/subtraction.cpp b/poincare/src/subtraction.cpp index 448553f2a..ced5648c6 100644 --- a/poincare/src/subtraction.cpp +++ b/poincare/src/subtraction.cpp @@ -1,5 +1,9 @@ +extern "C" { +#include +} #include #include "layout/horizontal_layout.h" +#include "layout/string_layout.h" Expression * Subtraction::clone() { return new Subtraction(m_operands, true); @@ -13,6 +17,11 @@ Expression::Type Subtraction::type() { return Expression::Type::Subtraction; } -ExpressionLayout * Subtraction::createLayout(ExpressionLayout * parent) { - return new HorizontalLayout(parent, m_operands, 2, '-'); +ExpressionLayout * Subtraction::createLayout() { + ExpressionLayout** children_layouts = (ExpressionLayout **)malloc(3*sizeof(ExpressionLayout *)); + children_layouts[0] = m_operands[0]->createLayout(); + char string[2] = {'-', '\0'}; + children_layouts[1] = new StringLayout(string, 1); + children_layouts[2] = m_operands[1]->createLayout(); + return new HorizontalLayout(children_layouts, 3); } diff --git a/poincare/src/symbol.cpp b/poincare/src/symbol.cpp index a47b349e0..ca8c3f05f 100644 --- a/poincare/src/symbol.cpp +++ b/poincare/src/symbol.cpp @@ -25,9 +25,9 @@ Expression::Type Symbol::type() { return Expression::Type::Symbol; } -ExpressionLayout * Symbol::createLayout(ExpressionLayout * parent) { +ExpressionLayout * Symbol::createLayout() { size_t length = strlen(m_name); - return new StringLayout(parent, m_name, length); + return new StringLayout(m_name, length); } Expression * Symbol::clone() {