From ec0c7c0384c1cd096199fc0942868c10a458dc9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Wed, 20 Nov 2019 11:59:10 +0100 Subject: [PATCH] [apps/calculation] Create ScrollableInputExactApproximateExpressionsView inheriting from Shared::ScrollableExactApproximateExpressionsView --- apps/calculation/Makefile | 1 + ...put_exact_approximate_expressions_cell.cpp | 35 ++++++++++++++++++ ...input_exact_approximate_expressions_cell.h | 36 +++++++++++++++++++ ...ble_exact_approximate_expressions_view.cpp | 2 +- ...lable_exact_approximate_expressions_view.h | 12 ++++--- 5 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 apps/calculation/additional_outputs/scrollable_input_exact_approximate_expressions_cell.cpp create mode 100644 apps/calculation/additional_outputs/scrollable_input_exact_approximate_expressions_cell.h diff --git a/apps/calculation/Makefile b/apps/calculation/Makefile index c1da8604b..f97614326 100644 --- a/apps/calculation/Makefile +++ b/apps/calculation/Makefile @@ -10,6 +10,7 @@ app_calculation_src = $(addprefix apps/calculation/,\ additional_outputs/complex_graph_controller.cpp \ additional_outputs/complex_graph_view.cpp \ additional_outputs/complex_model.cpp \ + additional_outputs/scrollable_input_exact_approximate_expressions_cell.cpp \ app.cpp \ edit_expression_controller.cpp \ expression_field.cpp \ diff --git a/apps/calculation/additional_outputs/scrollable_input_exact_approximate_expressions_cell.cpp b/apps/calculation/additional_outputs/scrollable_input_exact_approximate_expressions_cell.cpp new file mode 100644 index 000000000..dce444409 --- /dev/null +++ b/apps/calculation/additional_outputs/scrollable_input_exact_approximate_expressions_cell.cpp @@ -0,0 +1,35 @@ +#include "scrollable_input_exact_approximate_expressions_cell.h" +#include "../app.h" + +namespace Calculation { + +Poincare::Layout ScrollableInputExactApproximateExpressionsView::ContentCell::layout() const { + if (selectedSubviewPosition() == SubviewPosition::Left) { + return m_leftExpressionView.layout(); + } + return AbstractScrollableExactApproximateExpressionsView::ContentCell::layout(); +} + +void ScrollableInputExactApproximateExpressionsView::setCalculation(Calculation * calculation) { + Poincare::Context * context = App::app()->localContext(); + + // Clean the layouts to make room in the pool + contentCell()->leftExpressionView()->setLayout(Poincare::Layout()); + setLayouts(Poincare::Layout(), Poincare::Layout()); + + Calculation::DisplayOutput displayOutput = calculation->displayOutput(context); + contentCell()->leftExpressionView()->setLayout(calculation->createInputLayout()); + Poincare::Layout leftOutputLayout = calculation->createExactOutputLayout(); + Poincare::Layout rightOutputLayout = (displayOutput == Calculation::DisplayOutput::ExactOnly) ? leftOutputLayout : + calculation->createApproximateOutputLayout(context); + setLayouts(rightOutputLayout, leftOutputLayout); + I18n::Message equalMessage = calculation->exactAndApproximateDisplayedOutputsAreEqual(context) == Calculation::EqualSign::Equal ? I18n::Message::Equal : I18n::Message::AlmostEqual; + setEqualMessage(equalMessage); + + /* The displayed input and outputs have changed. We need to re-layout the cell + * and re-initialize the scroll. */ + layoutSubviews(); + reloadScroll(); +} + +} diff --git a/apps/calculation/additional_outputs/scrollable_input_exact_approximate_expressions_cell.h b/apps/calculation/additional_outputs/scrollable_input_exact_approximate_expressions_cell.h new file mode 100644 index 000000000..a9e40d6a5 --- /dev/null +++ b/apps/calculation/additional_outputs/scrollable_input_exact_approximate_expressions_cell.h @@ -0,0 +1,36 @@ +#ifndef CALCULATION_SCROLLABLE_INPUT_EXACT_APPROXIMATE_EXPRESSIONS_CELL_H +#define CALCULATION_SCROLLABLE_INPUT_EXACT_APPROXIMATE_EXPRESSIONS_CELL_H + +#include +#include "../../shared/scrollable_exact_approximate_expressions_view.h" +#include "../calculation.h" + +namespace Calculation { + +class ScrollableInputExactApproximateExpressionsView : public Shared::AbstractScrollableExactApproximateExpressionsView { +public: + ScrollableInputExactApproximateExpressionsView(Responder * parentResponder) : Shared::AbstractScrollableExactApproximateExpressionsView(parentResponder, &m_contentCell) {} + void setCalculation(Calculation * calculation); +private: + class ContentCell : public Shared::AbstractScrollableExactApproximateExpressionsView::ContentCell { + public: + Poincare::Layout layout() const override; + KDColor backgroundColor() const override { return KDColorWhite; } + void setEven(bool even) override { return; } + View * leftView() override { return &m_leftExpressionView; } + ExpressionView * leftExpressionView() { return &m_leftExpressionView; } + private: + void setLeftViewBackgroundColor(KDColor color) override { m_leftExpressionView.setBackgroundColor(color); } + KDCoordinate leftBaseline() const override { return m_leftExpressionView.layout().isUninitialized() ? m_leftExpressionView.layout().baseline() : 0; } + KDSize leftMinimalSizeForOptimalDisplay() const override { return m_leftExpressionView.minimalSizeForOptimalDisplay(); } + ExpressionView m_leftExpressionView; + }; + + ContentCell * contentCell() override { return &m_contentCell; }; + const ContentCell * constContentCell() const override { return &m_contentCell; }; + ContentCell m_contentCell; +}; + +} + +#endif diff --git a/apps/shared/scrollable_exact_approximate_expressions_view.cpp b/apps/shared/scrollable_exact_approximate_expressions_view.cpp index ad2d620d2..d66003d97 100644 --- a/apps/shared/scrollable_exact_approximate_expressions_view.cpp +++ b/apps/shared/scrollable_exact_approximate_expressions_view.cpp @@ -65,7 +65,7 @@ KDSize AbstractScrollableExactApproximateExpressionsView::ContentCell::minimalSi KDCoordinate leftViewBaseline = 0; KDCoordinate width = 0; if (m_displayLeft) { - leftSize = leftView()->minimalSizeForOptimalDisplay(); + leftSize = leftMinimalSizeForOptimalDisplay(); leftViewBaseline = leftBaseline(); width += leftSize.width() + Metric::CommonLargeMargin; } diff --git a/apps/shared/scrollable_exact_approximate_expressions_view.h b/apps/shared/scrollable_exact_approximate_expressions_view.h index 3eb6dbd79..9e81b28f1 100644 --- a/apps/shared/scrollable_exact_approximate_expressions_view.h +++ b/apps/shared/scrollable_exact_approximate_expressions_view.h @@ -50,7 +50,7 @@ protected: MessageTextView * approximateSign() { return &m_approximateSign; } - SubviewPosition selectedSubviewPosition() { + SubviewPosition selectedSubviewPosition() const { return m_selectedSubviewPosition; } void setSelectedSubviewPosition(SubviewPosition subviewPosition); @@ -60,11 +60,12 @@ protected: void setDisplayLeft(bool display) { m_displayLeft = display; } void layoutSubviews(bool force = false) override; int numberOfSubviews() const override; - Poincare::Layout layout() const override; + virtual Poincare::Layout layout() const override; - virtual View * leftView() const = 0; + virtual View * leftView() = 0; private: virtual void setLeftViewBackgroundColor(KDColor color) = 0; + virtual KDSize leftMinimalSizeForOptimalDisplay() const = 0; virtual KDCoordinate leftBaseline() const = 0; View * subviewAtIndex(int index) override; @@ -87,14 +88,15 @@ public: private: class ContentCell : public AbstractScrollableExactApproximateExpressionsView::ContentCell { public: - View * leftView() const override { return ContentCell::burgerMenuView(); } + View * leftView() override { return ContentCell::burgerMenuView(); } private: /* We keep only one instance of BurgerMenuView to avoid wasting space when * we know that only one ScrollableExactApproximateExpressionsView display * the burger view at a time. */ static BurgerMenuView * burgerMenuView(); void setLeftViewBackgroundColor(KDColor color) override { burgerMenuView()->setBackgroundColor(color); } - KDCoordinate leftBaseline() const override { return burgerMenuView()->minimalSizeForOptimalDisplay().height()/2; } + KDSize leftMinimalSizeForOptimalDisplay() const override { return burgerMenuView()->minimalSizeForOptimalDisplay(); } + KDCoordinate leftBaseline() const override { return leftMinimalSizeForOptimalDisplay().height()/2; } }; ContentCell * contentCell() override { return &m_contentCell; }; const ContentCell * constContentCell() const override { return &m_contentCell; };