From aaca93e9149a6b428022b4e769581bc4dbb8c4ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Tue, 9 Jan 2018 11:01:35 +0100 Subject: [PATCH] [poincare] Helper function to create log layouts. Change-Id: I4f43d11a48e1b8bdddb6660da11e3127778a0bae --- poincare/include/poincare/layout_engine.h | 4 ++++ poincare/src/layout_engine.cpp | 23 +++++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/poincare/include/poincare/layout_engine.h b/poincare/include/poincare/layout_engine.h index f5838d0f9..2b8c9984d 100644 --- a/poincare/include/poincare/layout_engine.h +++ b/poincare/include/poincare/layout_engine.h @@ -11,8 +11,12 @@ public: /* Expression to ExpressionLayout */ static ExpressionLayout * createInfixLayout(const Expression * expression, Expression::FloatDisplayMode floatDisplayMode, Expression::ComplexFormat complexFormat, const char * operatorName); static ExpressionLayout * createPrefixLayout(const Expression * expression, Expression::FloatDisplayMode floatDisplayMode, Expression::ComplexFormat complexFormat, const char * operatorName); + + /* Create special layouts */ static ExpressionLayout * createParenthesedLayout(ExpressionLayout * layout, bool cloneLayout); static ExpressionLayout * createStringLayout(const char * buffer, int bufferSize, KDText::FontSize fontSize = KDText::FontSize::Large); + static ExpressionLayout * createLogLayout(ExpressionLayout * argument, ExpressionLayout * index); + /* Expression to Text */ typedef bool (*OperandNeedsParenthesis)(const Expression * e); diff --git a/poincare/src/layout_engine.cpp b/poincare/src/layout_engine.cpp index 14a1f14f7..f54bbba22 100644 --- a/poincare/src/layout_engine.cpp +++ b/poincare/src/layout_engine.cpp @@ -3,6 +3,7 @@ #include "layout/horizontal_layout.h" #include "layout/parenthesis_left_layout.h" #include "layout/parenthesis_right_layout.h" +#include "layout/vertical_offset_layout.h" extern "C" { #include } @@ -49,6 +50,16 @@ ExpressionLayout * LayoutEngine::createPrefixLayout(const Expression * expressio return result; } +ExpressionLayout * LayoutEngine::createParenthesedLayout(ExpressionLayout * layout, bool cloneLayout) { + HorizontalLayout * result = new HorizontalLayout(); + result->addChildAtIndex(new ParenthesisLeftLayout(), 0); + if (layout != nullptr) { + result->addOrMergeChildAtIndex(cloneLayout ? layout->clone() : layout, 1); + } + result->addChildAtIndex(new ParenthesisRightLayout(), result->numberOfChildren()); + return result; +} + ExpressionLayout * LayoutEngine::createStringLayout(const char * buffer, int bufferSize, KDText::FontSize fontSize) { assert(bufferSize > 0); HorizontalLayout * resultLayout = new HorizontalLayout(); @@ -58,12 +69,12 @@ ExpressionLayout * LayoutEngine::createStringLayout(const char * buffer, int buf return resultLayout; } -ExpressionLayout * LayoutEngine::createParenthesedLayout(ExpressionLayout * layout, bool cloneLayout) { - HorizontalLayout * result = new HorizontalLayout(); - result->addChildAtIndex(new ParenthesisLeftLayout(), 0); - result->addOrMergeChildAtIndex(cloneLayout ? layout->clone() : layout, 1); - result->addChildAtIndex(new ParenthesisRightLayout(), result->numberOfChildren()); - return result; +ExpressionLayout * LayoutEngine::createLogLayout(ExpressionLayout * argument, ExpressionLayout * index) { + HorizontalLayout * resultLayout = static_cast(createStringLayout("log", 3)); + VerticalOffsetLayout * offsetLayout = new VerticalOffsetLayout(index, VerticalOffsetLayout::Type::Subscript, false); + resultLayout->addChildAtIndex(offsetLayout, resultLayout->numberOfChildren()); + resultLayout->addOrMergeChildAtIndex(createParenthesedLayout(argument, false), resultLayout->numberOfChildren()); + return resultLayout; } int LayoutEngine::writeInfixExpressionTextInBuffer(const Expression * expression, char * buffer, int bufferSize, const char * operatorName, OperandNeedsParenthesis operandNeedsParenthesis) {