mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-19 05:40:38 +01:00
[apps/calculation] Create ScrollableInputExactApproximateExpressionsView
inheriting from Shared::ScrollableExactApproximateExpressionsView
This commit is contained in:
@@ -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 \
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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; };
|
||||
|
||||
Reference in New Issue
Block a user