From 799bbfbf05865d07d7171bb113e38b2a059e2301 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Thu, 7 Jun 2018 16:31:15 +0200 Subject: [PATCH] [apps/reg] Display the regression controller from the graph view --- apps/regression/app.cpp | 3 +- apps/regression/app.h | 9 +- apps/regression/graph_options_controller.cpp | 100 ++++++++++++++---- apps/regression/graph_options_controller.h | 23 ++-- .../regression/store_parameter_controller.cpp | 9 +- apps/regression/store_parameter_controller.h | 1 - escher/include/escher/metric.h | 1 + 7 files changed, 112 insertions(+), 34 deletions(-) diff --git a/apps/regression/app.cpp b/apps/regression/app.cpp index a5bca541e..baba7059a 100644 --- a/apps/regression/app.cpp +++ b/apps/regression/app.cpp @@ -57,7 +57,8 @@ App::App(Container * container, Snapshot * snapshot) : m_storeController(&m_storeHeader, snapshot->store(), &m_storeHeader), m_storeHeader(&m_storeStackViewController, &m_storeController, &m_storeController), m_storeStackViewController(&m_tabViewController, &m_storeHeader), - m_tabViewController(&m_modalViewController, snapshot, &m_storeStackViewController, &m_graphStackViewController, &m_calculationHeader) + m_tabViewController(&m_modalViewController, snapshot, &m_storeStackViewController, &m_graphStackViewController, &m_calculationHeader), + m_regressionController(nullptr, snapshot->store()) { } diff --git a/apps/regression/app.h b/apps/regression/app.h index aa976f617..061dccfae 100644 --- a/apps/regression/app.h +++ b/apps/regression/app.h @@ -3,10 +3,11 @@ #include #include "../shared/text_field_delegate_app.h" +#include "calculation_controller.h" +#include "graph_controller.h" +#include "regression_controller.h" #include "store.h" #include "store_controller.h" -#include "graph_controller.h" -#include "calculation_controller.h" namespace Regression { @@ -37,7 +38,8 @@ public: uint32_t m_modelVersion; uint32_t m_rangeVersion; int m_selectedSeriesIndex; - }; + }; + RegressionController * regressionController() { return &m_regressionController; } private: App(Container * container, Snapshot * snapshot); CalculationController m_calculationController; @@ -51,6 +53,7 @@ private: ButtonRowController m_storeHeader; StackViewController m_storeStackViewController; TabViewController m_tabViewController; + RegressionController m_regressionController; }; } diff --git a/apps/regression/graph_options_controller.cpp b/apps/regression/graph_options_controller.cpp index dfc48517f..c1ddf0940 100644 --- a/apps/regression/graph_options_controller.cpp +++ b/apps/regression/graph_options_controller.cpp @@ -1,4 +1,7 @@ #include "graph_options_controller.h" +#include "app.h" +#include "graph_controller.h" +#include "regression_controller.h" #include using namespace Shared; @@ -7,9 +10,13 @@ namespace Regression { GraphOptionsController::GraphOptionsController(Responder * parentResponder, Store * store, CurveViewCursor * cursor, GraphController * graphController) : ViewController(parentResponder), + m_changeRegressionCell(I18n::Message::ChangeRegression), m_selectableTableView(this), - m_goToParameterController(this, store, cursor, graphController) + m_goToParameterController(this, store, cursor, graphController), + m_store(store), + m_graphController(graphController) { + static_cast(m_changeRegressionCell.subAccessoryView())->setHorizontalMargin(Metric::ExpressionViewHorizontalMargin); } const char * GraphOptionsController::title() { @@ -27,38 +34,93 @@ void GraphOptionsController::didBecomeFirstResponder() { app()->setFirstResponder(&m_selectableTableView); } +void GraphOptionsController::viewWillAppear() { + m_selectableTableView.reloadData(); +} + bool GraphOptionsController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::OK || event == Ion::Events::EXE || event == Ion::Events::Right) { - m_goToParameterController.setXPrediction(selectedRow() == 0); - StackViewController * stack = (StackViewController *)parentResponder(); - stack->push(&m_goToParameterController); + if (selectedRow() == numberOfRows() -1) { + RegressionController * regressionController = static_cast(app())->regressionController(); + regressionController->setSeries(m_graphController->selectedSeriesIndex()); + StackViewController * stack = static_cast(parentResponder()); + stack->push(regressionController); + } else { + m_goToParameterController.setXPrediction(selectedRow() == 0); + StackViewController * stack = (StackViewController *)parentResponder(); + stack->push(&m_goToParameterController); + } return true; } return false; } int GraphOptionsController::numberOfRows() { - return k_totalNumberOfCells; -}; - -HighlightCell * GraphOptionsController::reusableCell(int index) { - assert(index >= 0); - assert(index < k_totalNumberOfCells); - return &m_cells[index]; + return k_numberOfParameterCells + 1; } -int GraphOptionsController::reusableCellCount() { - return k_totalNumberOfCells; -} - -KDCoordinate GraphOptionsController::cellHeight() { +KDCoordinate GraphOptionsController::rowHeight(int j) { + if ((j == numberOfRows() - 1) && + (static_cast(m_store)->seriesRegressionType(m_graphController->selectedSeriesIndex()) == Model::Type::Logistic)) + { + return RegressionController::k_logisticCellHeight; + } return Metric::ParameterCellHeight; } +KDCoordinate GraphOptionsController::cumulatedHeightFromIndex(int j) { + assert (j >= 0 && j <= numberOfRows()); + KDCoordinate result = 0; + for (int i = 0; i < j; i++) { + result+= rowHeight(i); + } + return result; +} + +int GraphOptionsController::indexFromCumulatedHeight(KDCoordinate offsetY) { + int result = 0; + int j = 0; + while (result < offsetY && j < numberOfRows()) { + result += rowHeight(j++); + } + return (result < offsetY || offsetY == 0) ? j : j - 1; +} + +HighlightCell * GraphOptionsController::reusableCell(int index, int type) { + assert(index >= 0); + assert(index < reusableCellCount(type)); + if (type == k_regressionCellType) { + return &m_changeRegressionCell; + } + assert(type == k_parameterCelltype); + return &m_parameterCells[index]; +} + +int GraphOptionsController::reusableCellCount(int type) { + if (type == k_regressionCellType) { + return 1; + } + assert(type == k_parameterCelltype); + return k_numberOfParameterCells; +} + +int GraphOptionsController::typeAtLocation(int i, int j) { + assert(i == 0); + if (j == numberOfRows() -1) { + return k_regressionCellType; + } + return k_parameterCelltype; +} + void GraphOptionsController::willDisplayCellForIndex(HighlightCell * cell, int index) { - MessageTableCellWithChevron * myCell = (MessageTableCellWithChevron *)cell; - I18n::Message titles[2] = {I18n::Message::XPrediction, I18n::Message::YPrediction}; - myCell->setMessage(titles[index]); + if (index < k_numberOfParameterCells) { + MessageTableCellWithChevron * myCell = (MessageTableCellWithChevron *)cell; + I18n::Message titles[k_numberOfParameterCells] = {I18n::Message::XPrediction, I18n::Message::YPrediction}; + myCell->setMessage(titles[index]); + } else { + assert(index == numberOfRows() - 1); + m_changeRegressionCell.setExpressionLayout(static_cast(m_store)->modelForSeries(m_graphController->selectedSeriesIndex())->layout()); + } } } diff --git a/apps/regression/graph_options_controller.h b/apps/regression/graph_options_controller.h index d5aa6c86b..47c57c610 100644 --- a/apps/regression/graph_options_controller.h +++ b/apps/regression/graph_options_controller.h @@ -10,23 +10,34 @@ namespace Regression { class GraphController; -class GraphOptionsController : public ViewController, public SimpleListViewDataSource, public SelectableTableViewDataSource { +class GraphOptionsController : public ViewController, public ListViewDataSource, public SelectableTableViewDataSource { public: GraphOptionsController(Responder * parentResponder, Store * store, Shared::CurveViewCursor * cursor, GraphController * graphController); View * view() override; const char * title() override; bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; + void viewWillAppear() override; + + //ListViewDataSource int numberOfRows() override; - KDCoordinate cellHeight() override; - HighlightCell * reusableCell(int index) override; - int reusableCellCount() override; + KDCoordinate rowHeight(int j) override; + KDCoordinate cumulatedHeightFromIndex(int j) override; + int indexFromCumulatedHeight(KDCoordinate offsetY) override; + HighlightCell * reusableCell(int index, int type) override; + int reusableCellCount(int type) override; + int typeAtLocation(int i, int j) override; void willDisplayCellForIndex(HighlightCell * cell, int index) override; private: - constexpr static int k_totalNumberOfCells = 2; - MessageTableCellWithChevron m_cells[2]; + constexpr static int k_regressionCellType = 0; + constexpr static int k_parameterCelltype = 1; + constexpr static int k_numberOfParameterCells = 2; + MessageTableCellWithChevron m_parameterCells[k_numberOfParameterCells]; + MessageTableCellWithChevronAndExpression m_changeRegressionCell; SelectableTableView m_selectableTableView; GoToParameterController m_goToParameterController; + Store * m_store; + GraphController * m_graphController; }; } diff --git a/apps/regression/store_parameter_controller.cpp b/apps/regression/store_parameter_controller.cpp index cd8e61632..256362917 100644 --- a/apps/regression/store_parameter_controller.cpp +++ b/apps/regression/store_parameter_controller.cpp @@ -1,4 +1,5 @@ #include "store_parameter_controller.h" +#include "app.h" #include "store_controller.h" #include @@ -7,10 +8,9 @@ namespace Regression { StoreParameterController::StoreParameterController(Responder * parentResponder, Store * store, StoreController * storeController) : Shared::StoreParameterController(parentResponder, store, storeController), m_changeRegressionCell(I18n::Message::ChangeRegression), - m_regressionController(this, store), m_lastSelectionIsRegression(false) { - static_cast(m_changeRegressionCell.subAccessoryView())->setHorizontalMargin(5); + static_cast(m_changeRegressionCell.subAccessoryView())->setHorizontalMargin(Metric::ExpressionViewHorizontalMargin); } void StoreParameterController::viewWillAppear() { @@ -20,9 +20,10 @@ void StoreParameterController::viewWillAppear() { bool StoreParameterController::handleEvent(Ion::Events::Event event) { if ((event == Ion::Events::OK || event == Ion::Events::EXE || event == Ion::Events::Right) && selectedRow() == numberOfRows() - 1) { - m_regressionController.setSeries(m_series); + RegressionController * regressionController = static_cast(app())->regressionController(); + regressionController->setSeries(m_series); StackViewController * stack = static_cast(parentResponder()); - stack->push(&m_regressionController); + stack->push(regressionController); m_lastSelectionIsRegression = true; return true; } diff --git a/apps/regression/store_parameter_controller.h b/apps/regression/store_parameter_controller.h index b12fe940d..48b81fdcc 100644 --- a/apps/regression/store_parameter_controller.h +++ b/apps/regression/store_parameter_controller.h @@ -25,7 +25,6 @@ public: private: static constexpr int k_regressionCellType = 1; MessageTableCellWithChevronAndExpression m_changeRegressionCell; - RegressionController m_regressionController; bool m_lastSelectionIsRegression; }; diff --git a/escher/include/escher/metric.h b/escher/include/escher/metric.h index 42e3211c0..5294e9e46 100644 --- a/escher/include/escher/metric.h +++ b/escher/include/escher/metric.h @@ -30,6 +30,7 @@ public: constexpr static KDCoordinate FractionAndConjugateHorizontalMargin = 2; constexpr static KDCoordinate MinimalBracketAndParenthesisHeight = 18; constexpr static KDCoordinate TableSeparatorThickness = 2; + constexpr static KDCoordinate ExpressionViewHorizontalMargin = 5; }; #endif