[calculation] WIP: first version of ComplexListController

This commit is contained in:
Émilie Feral
2019-11-21 14:04:31 +01:00
committed by Léa Saviot
parent 47e4abee81
commit 2ebbe5ae25
18 changed files with 246 additions and 68 deletions

View File

@@ -7,9 +7,10 @@ app_calculation_test_src += $(addprefix apps/calculation/,\
)
app_calculation_src = $(addprefix apps/calculation/,\
additional_outputs/complex_graph_controller.cpp \
additional_outputs/complex_graph_view.cpp \
additional_outputs/complex_graph_cell.cpp \
additional_outputs/complex_model.cpp \
additional_outputs/complex_list_controller.cpp \
additional_outputs/illustrated_list_controller.cpp \
additional_outputs/scrollable_input_exact_approximate_expressions_cell.cpp \
app.cpp \
edit_expression_controller.cpp \

View File

@@ -1,4 +1,4 @@
#include "complex_graph_view.h"
#include "complex_graph_cell.h"
using namespace Shared;
using namespace Poincare;

View File

@@ -0,0 +1,32 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_COMPLEX_GRAPH_CELL_H
#define CALCULATION_ADDITIONAL_OUTPUTS_COMPLEX_GRAPH_CELL_H
#include "../../shared/curve_view.h"
#include "complex_model.h"
namespace Calculation {
class ComplexGraphView : public Shared::CurveView {
public:
ComplexGraphView(ComplexModel * complexModel);
void drawRect(KDContext * ctx, KDRect rect) const override;
private:
char * label(Axis axis, int index) const override { return nullptr; }
ComplexModel * m_complex;
};
class ComplexGraphCell : public HighlightCell {
public:
ComplexGraphCell(ComplexModel * complexModel) : m_view(complexModel) {}
void setHighlighted(bool highlight) override { return; }
private:
int numberOfSubviews() const override { return 1; }
View * subviewAtIndex(int index) override { return &m_view; }
void layoutSubviews(bool force = false) override { m_view.setFrame(bounds(), force); }
ComplexGraphView m_view;
};
}
#endif

View File

@@ -1,15 +0,0 @@
#include "complex_graph_controller.h"
using namespace Poincare;
namespace Calculation {
ComplexGraphController::ComplexGraphController() :
ViewController(nullptr),
m_complex(),
m_graphView(&m_complex)
{
}
}

View File

@@ -1,25 +0,0 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_COMPLEX_GRAPH_CONTROLLER_H
#define CALCULATION_ADDITIONAL_OUTPUTS_COMPLEX_GRAPH_CONTROLLER_H
#include "complex_graph_view.h"
#include "complex_model.h"
namespace Calculation {
class ComplexGraphController : public ViewController {
public:
ComplexGraphController();
const char * title() override { return "Emilie"; }
View * view() override {
return &m_graphView;
}
ComplexModel * complexModel() { return &m_complex; }
private:
ComplexModel m_complex;
ComplexGraphView m_graphView;
};
}
#endif

View File

@@ -1,21 +0,0 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_COMPLEX_GRAPH_VIEW_H
#define CALCULATION_ADDITIONAL_OUTPUTS_COMPLEX_GRAPH_VIEW_H
#include "../../shared/curve_view.h"
#include "complex_model.h"
namespace Calculation {
class ComplexGraphView : public Shared::CurveView {
public:
ComplexGraphView(ComplexModel * complexModel);
void drawRect(KDContext * ctx, KDRect rect) const override;
private:
char * label(Axis axis, int index) const override { return nullptr; }
ComplexModel * m_complex;
};
}
#endif

View File

@@ -0,0 +1,11 @@
#include "complex_list_controller.h"
namespace Calculation {
void ComplexListController::fillCalculationStoreFromExpression(Poincare::Expression e) {
//TODO
m_model.setComplex(std::complex<float>(1.2f,2.3f));
IllustratedListController::fillCalculationStoreFromExpression(e);
}
}

View File

@@ -0,0 +1,25 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_COMPLEX_LIST_CONTROLLER_H
#define CALCULATION_ADDITIONAL_OUTPUTS_COMPLEX_LIST_CONTROLLER_H
#include "complex_graph_cell.h"
#include "complex_model.h"
#include "illustrated_list_controller.h"
namespace Calculation {
class ComplexListController : public IllustratedListController {
public:
ComplexListController() :
IllustratedListController(nullptr),
m_complexGraphCell(&m_model) {}
void fillCalculationStoreFromExpression(Poincare::Expression e) override;
private:
HighlightCell * illustrationCell() override { return &m_complexGraphCell; }
ComplexGraphCell m_complexGraphCell;
ComplexModel m_model;
};
}
#endif

View File

@@ -0,0 +1,99 @@
#include "illustrated_list_controller.h"
#include "../app.h"
using namespace Poincare;
namespace Calculation {
/* List Controller */
IllustratedListController::ListController::ListController(IllustratedListController * dataSource) :
ViewController(dataSource),
m_selectableTableView(this, dataSource, dataSource)
{
m_selectableTableView.setMargins(0);
m_selectableTableView.setDecoratorType(ScrollView::Decorator::Type::None);
}
void IllustratedListController::ListController::didBecomeFirstResponder() {
m_selectableTableView.reloadData();
m_selectableTableView.selectCellAtLocation(0, 1);
Container::activeApp()->setFirstResponder(&m_selectableTableView);
}
/* Illustrated list controller */
IllustratedListController::IllustratedListController(Responder * parentResponder) :
StackViewController(parentResponder, &m_listController, KDColorWhite, Palette::PurpleBright, Palette::PurpleDark),
m_listController(this),
m_additionalCalculationCells{}
{
for (int i = 0; i < k_maxNumberOfAdditionalCalculations; i++) {
m_additionalCalculationCells[i].setParentResponder(m_listController.selectableTableView());
}
}
bool IllustratedListController::handleEvent(Ion::Events::Event event) {
return false;
}
void IllustratedListController::didBecomeFirstResponder() {
Container::activeApp()->setFirstResponder(&m_listController);
}
int IllustratedListController::numberOfRows() const {
return k_maxNumberOfAdditionalCalculations + 1;
}
int IllustratedListController::reusableCellCount(int type) {
assert(type < 2);
if (type == 0) {
return 1;
}
return k_maxNumberOfAdditionalCalculations;
}
HighlightCell * IllustratedListController::reusableCell(int index, int type) {
assert(type < 2);
assert(index >= 0);
if (type == 0) {
return illustrationCell();
}
return &m_additionalCalculationCells[index];
}
KDCoordinate IllustratedListController::rowHeight(int j) {
if (j == 0) {
return k_illustrationHeight;
}
int calculationIndex = j-1;
if (calculationIndex >= m_calculationStore.numberOfCalculations()) {
return 0;
}
Shared::ExpiringPointer<Calculation> calculation = m_calculationStore.calculationAtIndex(calculationIndex);
return calculation->height(App::app()->localContext(), j == selectedRow()) + 4 * Metric::CommonSmallMargin;
}
int IllustratedListController::typeAtLocation(int i, int j) {
return j == 0 ? 0 : 1;
}
void IllustratedListController::willDisplayCellForIndex(HighlightCell * cell, int index) {
if (index == 0) {
// TODO ?
return;
}
ScrollableInputExactApproximateExpressionsCell * myCell = (ScrollableInputExactApproximateExpressionsCell *)cell;
myCell->setCalculation(m_calculationStore.calculationAtIndex(index-1).pointer());
//myCell->setHighlighted(myCell->isHighlighted()); //TODO??
}
void IllustratedListController::fillCalculationStoreFromExpression(Expression e) {
// TODO
Poincare::Context * context = App::app()->localContext();
m_calculationStore.push("1+root(2,3)", context);
m_calculationStore.push("2+root(2,3)", context);
m_calculationStore.push("3+root(2,3)", context);
}
}

View File

@@ -0,0 +1,53 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_ILLUSTRATED_LIST_CONTROLLER_H
#define CALCULATION_ADDITIONAL_OUTPUTS_ILLUSTRATED_LIST_CONTROLLER_H
#include <escher.h>
#include "scrollable_input_exact_approximate_expressions_cell.h"
#include "../calculation_store.h"
#include <apps/i18n.h>
namespace Calculation {
class IllustratedListController : public StackViewController, public ListViewDataSource, public SelectableTableViewDataSource {
public:
IllustratedListController(Responder * parentResponder);
// Responder
bool handleEvent(Ion::Events::Event event) override;
void didBecomeFirstResponder() override;
//ListViewDataSource
int numberOfRows() const override;
int reusableCellCount(int type) override;
HighlightCell * reusableCell(int index, int type) override;
KDCoordinate rowHeight(int j) override;
int typeAtLocation(int i, int j) override;
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
// IllustratedListController
virtual void fillCalculationStoreFromExpression(Poincare::Expression e);
private:
class ListController : public ViewController {
public:
ListController(IllustratedListController * dataSource);
const char * title() override { return I18n::translate(I18n::Message::AdditionalResults); }
View * view() override { return &m_selectableTableView; }
void didBecomeFirstResponder() override;
SelectableTableView * selectableTableView() { return &m_selectableTableView; }
private:
SelectableTableView m_selectableTableView;
};
constexpr static int k_maxNumberOfAdditionalCalculations = 3;
constexpr static KDCoordinate k_illustrationHeight = 50;
ListController m_listController;
// Cells
virtual HighlightCell * illustrationCell() = 0;
ScrollableInputExactApproximateExpressionsCell m_additionalCalculationCells[k_maxNumberOfAdditionalCalculations];
CalculationStore m_calculationStore;
};
}
#endif

View File

@@ -9,11 +9,12 @@ namespace Calculation {
class ScrollableInputExactApproximateExpressionsView : public Shared::AbstractScrollableExactApproximateExpressionsView {
public:
ScrollableInputExactApproximateExpressionsView(Responder * parentResponder) : Shared::AbstractScrollableExactApproximateExpressionsView(parentResponder, &m_contentCell) {}
ScrollableInputExactApproximateExpressionsView(Responder * parentResponder) : Shared::AbstractScrollableExactApproximateExpressionsView(parentResponder, &m_contentCell), m_contentCell() {}
void setCalculation(Calculation * calculation);
private:
class ContentCell : public Shared::AbstractScrollableExactApproximateExpressionsView::ContentCell {
public:
ContentCell() : m_leftExpressionView() {}
Poincare::Layout layout() const override;
KDColor backgroundColor() const override { return KDColorWhite; }
void setEven(bool even) override { return; }
@@ -31,6 +32,18 @@ private:
ContentCell m_contentCell;
};
class ScrollableInputExactApproximateExpressionsCell : public HighlightCell {
public:
ScrollableInputExactApproximateExpressionsCell() : m_view(nullptr) {}
void setParentResponder(Responder * r) { m_view.setParentResponder(r); }
void setCalculation(Calculation * calculation) { m_view.setCalculation(calculation); }
private:
int numberOfSubviews() const override { return 1; }
View * subviewAtIndex(int index) override { return &m_view; }
void layoutSubviews(bool force = false) override { m_view.setFrame(bounds(), force); }
ScrollableInputExactApproximateExpressionsView m_view;
};
}
#endif

View File

@@ -1,2 +1,3 @@
CalculApp = "Berechnung"
CalculAppCapital = "BERECHNUNG"
AdditionalResults = "????"

View File

@@ -1,2 +1,3 @@
CalculApp = "Calculation"
CalculAppCapital = "CALCULATION"
AdditionalResults = "Additional results"

View File

@@ -1,2 +1,3 @@
CalculApp = "Cálculo"
CalculAppCapital = "CÁLCULO"
AdditionalResults = "????"

View File

@@ -1,2 +1,3 @@
CalculApp = "Calculs"
CalculAppCapital = "CALCULS"
AdditionalResults = "Résultats complémentaires"

View File

@@ -1,2 +1,3 @@
CalculApp = "Cálculo"
CalculAppCapital = "CÁLCULO"
AdditionalResults = "????"

View File

@@ -74,7 +74,7 @@ bool HistoryController::handleEvent(Ion::Events::Event event) {
* Controller * c = additionalInformationType ? graphController : listController?
* m_controller->setType(additionalInformationType)*/
if (additionalInfoType == Expression::AdditionalInformationType::Complex) {
m_complexController.complexModel()->setComplex(std::complex<float>(1.2f,2.0f));
m_complexController.fillCalculationStoreFromExpression(calculation->exactOutput());
Container::activeApp()->displayModalViewController(&m_complexController, 0.f, 0.f, Metric::PopUpTopMargin, Metric::PopUpLeftMargin, Metric::PopUpTopMargin, Metric::PopUpRightMargin);
}
} else {

View File

@@ -5,7 +5,7 @@
#include "history_view_cell.h"
#include "calculation_store.h"
#include "selectable_table_view.h"
#include "additional_outputs/complex_graph_controller.h"
#include "additional_outputs/complex_list_controller.h"
namespace Calculation {
@@ -37,7 +37,7 @@ private:
CalculationSelectableTableView m_selectableTableView;
HistoryViewCell m_calculationHistory[k_maxNumberOfDisplayedRows];
CalculationStore * m_calculationStore;
ComplexGraphController m_complexController;
ComplexListController m_complexController;
};
}