[apps/calculation] Create ScrollableInputExactApproximateExpressionsView

inheriting from Shared::ScrollableExactApproximateExpressionsView
This commit is contained in:
Émilie Feral
2019-11-20 11:59:10 +01:00
committed by Léa Saviot
parent 6ed9e11de3
commit ec0c7c0384
5 changed files with 80 additions and 6 deletions

View File

@@ -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 \

View File

@@ -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();
}
}

View File

@@ -0,0 +1,36 @@
#ifndef CALCULATION_SCROLLABLE_INPUT_EXACT_APPROXIMATE_EXPRESSIONS_CELL_H
#define CALCULATION_SCROLLABLE_INPUT_EXACT_APPROXIMATE_EXPRESSIONS_CELL_H
#include <escher.h>
#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

View File

@@ -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;
}

View File

@@ -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; };