From 23f2ddaced409d595bd084c95b5ada3f197b3184 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Mon, 2 Jan 2017 18:17:42 +0100 Subject: [PATCH] [apps] Factorize the graph view controller of regression and graph apps Change-Id: Ib586376c3afc0738ea39dd86fb693ec08811281e --- apps/Makefile | 1 + ...view_with_banner_and_cursor_controller.cpp | 146 ++++++++++++++++++ ...e_view_with_banner_and_cursor_controller.h | 39 +++++ apps/graph/graph/graph_controller.cpp | 135 +--------------- apps/graph/graph/graph_controller.h | 23 +-- apps/regression/graph_controller.cpp | 110 +------------ apps/regression/graph_controller.h | 25 +-- 7 files changed, 207 insertions(+), 272 deletions(-) create mode 100644 apps/curve_view_with_banner_and_cursor_controller.cpp create mode 100644 apps/curve_view_with_banner_and_cursor_controller.h diff --git a/apps/Makefile b/apps/Makefile index 618ae8552..5b9784b58 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -14,6 +14,7 @@ app_objs += $(addprefix apps/,\ curve_view.o\ curve_view_with_banner.o\ curve_view_with_banner_and_cursor.o\ + curve_view_with_banner_and_cursor_controller.o\ curve_view_window.o\ curve_view_window_with_cursor.o\ data.o\ diff --git a/apps/curve_view_with_banner_and_cursor_controller.cpp b/apps/curve_view_with_banner_and_cursor_controller.cpp new file mode 100644 index 000000000..4c1b9f4fc --- /dev/null +++ b/apps/curve_view_with_banner_and_cursor_controller.cpp @@ -0,0 +1,146 @@ +#include "curve_view_with_banner_and_cursor_controller.h" +#include +#include + +CurveViewWindowWithBannerAndCursorController::CurveViewWindowWithBannerAndCursorController(Responder * parentResponder, + HeaderViewController * header, CurveViewWindowWithCursor * graphWindow, CurveViewWithBannerAndCursor * graphView) : + ViewController(parentResponder), + HeaderViewDelegate(header), + m_graphWindow(graphWindow), + m_graphView(graphView), + m_windowParameterController(WindowParameterController(this, m_graphWindow)), + m_zoomParameterController(ZoomParameterController(this, m_graphWindow, m_graphView)), + m_windowButton(this, "Axes", Invocation([](void * context, void * sender) { + CurveViewWindowWithBannerAndCursorController * graphController = (CurveViewWindowWithBannerAndCursorController *) context; + StackViewController * stack = graphController->stackController(); + stack->push(graphController->windowParameterController()); + }, this)), + m_zoomButton(this, "Zoom", Invocation([](void * context, void * sender) { + CurveViewWindowWithBannerAndCursorController * graphController = (CurveViewWindowWithBannerAndCursorController *) context; + StackViewController * stack = graphController->stackController(); + stack->push(graphController->zoomParameterController()); + }, this)), + m_defaultInitialisationButton(this, "Initialisation", Invocation([](void * context, void * sender) { + CurveViewWindowWithBannerAndCursorController * graphController = (CurveViewWindowWithBannerAndCursorController *) context; + StackViewController * stack = graphController->stackController(); + stack->push(graphController->initialisationParameterController()); + }, this)) +{ +} + +const char * CurveViewWindowWithBannerAndCursorController::title() const { + return "Graphique"; +} + +View * CurveViewWindowWithBannerAndCursorController::view() { + return m_graphView; +} + +bool CurveViewWindowWithBannerAndCursorController::handleEvent(Ion::Events::Event event) { + if (!m_graphView->isMainViewSelected()) { + if (event == Ion::Events::Down) { + headerViewController()->setSelectedButton(-1); + m_graphView->selectMainView(true); + m_graphView->reloadSelection(); + return true; + } + if (event == Ion::Events::Up) { + headerViewController()->setSelectedButton(-1); + app()->setFirstResponder(tabController()); + return true; + } + return false; + } + if (event == Ion::Events::Plus) { + m_graphWindow->zoom(1.0f/3.0f); + m_graphView->reload(); + return true; + } + if (event == Ion::Events::Minus) { + m_graphWindow->zoom(3.0f/4.0f); + m_graphView->reload(); + return true; + } + if (event == Ion::Events::Left || event == Ion::Events::Right) { + int direction = event == Ion::Events::Left ? -1 : 1; + m_graphView->reloadSelection(); + int didMoveCursor = m_graphWindow->moveCursorHorizontally(direction); + if (didMoveCursor == 0) { + m_graphView->reloadSelection(); + } else { + m_graphView->reload(); + } + return (didMoveCursor >= 0); + } + if (event == Ion::Events::Down || event == Ion::Events::Up) { + int direction = event == Ion::Events::Down ? -1 : 1; + m_graphView->reloadSelection(); + int didMoveCursor = m_graphWindow->moveCursorVertically(direction); + if (didMoveCursor < 0) { + if (event == Ion::Events::Down) { + return false; + } + m_graphView->selectMainView(false); + headerViewController()->setSelectedButton(0); + return true; + } + if (didMoveCursor == 0) { + m_graphView->reloadSelection(); + } + if (didMoveCursor == 1) { + m_graphView->reload(); + } + return true; + } + if (event == Ion::Events::OK) { + return handleEnter(); + } + return false; +} + +void CurveViewWindowWithBannerAndCursorController::didBecomeFirstResponder() { + headerViewController()->setSelectedButton(-1); + m_graphView->selectMainView(true); + // Layout view whe the graph view that might have been modified by the zoom page + headerViewController()->layoutView(); + // Reload graph view + m_graphView->reload(); +} + +ViewController * CurveViewWindowWithBannerAndCursorController::windowParameterController() { + return &m_windowParameterController; +} + +ViewController * CurveViewWindowWithBannerAndCursorController::zoomParameterController() { + return &m_zoomParameterController; +} + +int CurveViewWindowWithBannerAndCursorController::numberOfButtons() const { + return 3; +} + +Button * CurveViewWindowWithBannerAndCursorController::buttonAtIndex(int index) { + switch (index) { + case 0: + return &m_windowButton; + case 1: + return &m_zoomButton; + case 2: + return &m_defaultInitialisationButton; + default: + assert(false); + } + return nullptr; +} + +Responder * CurveViewWindowWithBannerAndCursorController::defaultController() { + return tabController(); +} + +Responder * CurveViewWindowWithBannerAndCursorController::tabController() const{ + return (parentResponder()->parentResponder()->parentResponder()->parentResponder()); +} + +StackViewController * CurveViewWindowWithBannerAndCursorController::stackController() const{ + return (StackViewController *)(parentResponder()->parentResponder()->parentResponder()); +} diff --git a/apps/curve_view_with_banner_and_cursor_controller.h b/apps/curve_view_with_banner_and_cursor_controller.h new file mode 100644 index 000000000..53aa51920 --- /dev/null +++ b/apps/curve_view_with_banner_and_cursor_controller.h @@ -0,0 +1,39 @@ +#ifndef APPS_CURVE_VIEW_WINDOW_WITH_BANNER_AND_CURSOR_CONTROLLER_H +#define APPS_CURVE_VIEW_WINDOW_WITH_BANNER_AND_CURSOR_CONTROLLER_H + +#include +#include "curve_view_window_with_cursor.h" +#include "curve_view_with_banner_and_cursor.h" +#include "window_parameter_controller.h" +#include "zoom_parameter_controller.h" + +class CurveViewWindowWithBannerAndCursorController : public ViewController, public HeaderViewDelegate, public AlternateEmptyViewDelegate { +public: + CurveViewWindowWithBannerAndCursorController(Responder * parentResponder, HeaderViewController * header, CurveViewWindowWithCursor * graphWindow, CurveViewWithBannerAndCursor * graphView); + View * view() override; + const char * title() const override; + bool handleEvent(Ion::Events::Event event) override; + void didBecomeFirstResponder() override; + + ViewController * windowParameterController(); + ViewController * zoomParameterController(); + virtual ViewController * initialisationParameterController() = 0; + + int numberOfButtons() const override; + Button * buttonAtIndex(int index) override; + + Responder * defaultController() override; +protected: + virtual bool handleEnter() = 0; + Responder * tabController() const; + StackViewController * stackController() const; + CurveViewWindowWithCursor * m_graphWindow; + CurveViewWithBannerAndCursor * m_graphView; + WindowParameterController m_windowParameterController; + ZoomParameterController m_zoomParameterController; + Button m_windowButton; + Button m_zoomButton; + Button m_defaultInitialisationButton; +}; + +#endif diff --git a/apps/graph/graph/graph_controller.cpp b/apps/graph/graph/graph_controller.cpp index db021a15e..5df46f05b 100644 --- a/apps/graph/graph/graph_controller.cpp +++ b/apps/graph/graph/graph_controller.cpp @@ -6,29 +6,11 @@ namespace Graph { GraphController::GraphController(Responder * parentResponder, FunctionStore * functionStore, HeaderViewController * header) : - ViewController(parentResponder), - HeaderViewDelegate(header), + CurveViewWindowWithBannerAndCursorController(parentResponder, header, &m_graphWindow, &m_view), m_view(GraphView(functionStore, &m_graphWindow)), m_graphWindow(functionStore), - m_windowParameterController(WindowParameterController(this, &m_graphWindow)), - m_zoomParameterController(ZoomParameterController(this, &m_graphWindow, &m_view)), m_initialisationParameterController(InitialisationParameterController(this, &m_graphWindow)), m_curveParameterController(CurveParameterController(&m_view, &m_graphWindow)), - m_windowButton(this, "Axes", Invocation([](void * context, void * sender) { - GraphController * graphController = (GraphController *) context; - StackViewController * stack = graphController->stackController(); - stack->push(graphController->windowParameterController()); - }, this)), - m_zoomButton(this, "Zoom", Invocation([](void * context, void * sender) { - GraphController * graphController = (GraphController *) context; - StackViewController * stack = graphController->stackController(); - stack->push(graphController->zoomParameterController()); - }, this)), - m_defaultInitialisationButton(this, "Initialisation", Invocation([](void * context, void * sender) { - GraphController * graphController = (GraphController *) context; - StackViewController * stack = graphController->stackController(); - stack->push(graphController->initialisationParameterController()); - }, this)), m_functionStore(functionStore) { } @@ -40,10 +22,6 @@ View * GraphController::view() { return &m_view; } -const char * GraphController::title() const { - return "Graphique"; -} - bool GraphController::isEmpty() { if (m_functionStore->numberOfActiveFunctions() == 0) { return true; @@ -58,48 +36,10 @@ const char * GraphController::emptyMessage() { return "Aucune fonction selectionnee"; } -Responder * GraphController::defaultController() { - return tabController(); -} - -Responder * GraphController::tabController() const{ - return (parentResponder()->parentResponder()->parentResponder()->parentResponder()); -} - -StackViewController * GraphController::stackController() const{ - return (StackViewController *)(parentResponder()->parentResponder()->parentResponder()); -} - -ViewController * GraphController::windowParameterController() { - return &m_windowParameterController; -} - -ViewController * GraphController::zoomParameterController() { - return &m_zoomParameterController; -} - ViewController * GraphController::initialisationParameterController() { return &m_initialisationParameterController; } -int GraphController::numberOfButtons() const { - return 3; -} - -Button * GraphController::buttonAtIndex(int index) { - switch (index) { - case 0: - return &m_windowButton; - case 1: - return &m_zoomButton; - case 2: - return &m_defaultInitialisationButton; - default: - assert(false); - } - return nullptr; -} - void GraphController::didBecomeFirstResponder() { if (m_view.context() == nullptr) { App * graphApp = (Graph::App *)app(); @@ -113,74 +53,15 @@ void GraphController::didBecomeFirstResponder() { if (m_graphWindow.computeYaxis()) { m_graphWindow.initCursorPosition(); } - headerViewController()->setSelectedButton(-1); - m_view.selectMainView(true); - // Layout view whe the graph view that might have been modified by the zoom page - headerViewController()->layoutView(); - // Reload graph view - m_view.reload(); + CurveViewWindowWithBannerAndCursorController::didBecomeFirstResponder(); } -bool GraphController::handleEvent(Ion::Events::Event event) { - if (!m_view.isMainViewSelected()) { - if (event == Ion::Events::Down) { - headerViewController()->setSelectedButton(-1); - app()->setFirstResponder(this); - m_view.selectMainView(true); - return true; - } - if (event == Ion::Events::Up) { - headerViewController()->setSelectedButton(-1); - app()->setFirstResponder(tabController()); - } - return headerViewController()->handleEvent(event); - } else { - if (event == Ion::Events::Plus) { - m_graphWindow.zoom(1.0f/3.0f); - m_view.reload(); - return true; - } - if (event == Ion::Events::Minus) { - m_graphWindow.zoom(3.0f/4.0f); - m_view.reload(); - return true; - } - if (event == Ion::Events::Right || event == Ion::Events::Left) { - int direction = event == Ion::Events::Left ? -1 : 1; - m_view.reloadSelection(); - if (m_graphWindow.moveCursorHorizontally(direction)) { - m_view.reload(); - } else { - m_view.reloadSelection(); - } - return true; - } - if (event == Ion::Events::Up || event == Ion::Events::Down) { - int direction = event == Ion::Events::Down ? -1 : 1; - int result = m_graphWindow.moveCursorVertically(direction); - if (result < 0) { - if (event == Ion::Events::Down) { - return false; - } - m_view.selectMainView(false); - headerViewController()->setSelectedButton(0); - } - if (result == 0) { - m_view.reloadSelection(); - } - if (result == 1) { - m_view.reload(); - } - return true; - } - if (event == Ion::Events::OK) { - Function * f = m_graphWindow.functionSelectedByCursor(); - m_curveParameterController.setFunction(f); - StackViewController * stack = stackController(); - stack->push(&m_curveParameterController); - } - return false; - } +bool GraphController::handleEnter() { + Function * f = m_graphWindow.functionSelectedByCursor(); + m_curveParameterController.setFunction(f); + StackViewController * stack = stackController(); + stack->push(&m_curveParameterController); + return true; } } diff --git a/apps/graph/graph/graph_controller.h b/apps/graph/graph/graph_controller.h index 9ea1e46a8..ac2e1b858 100644 --- a/apps/graph/graph/graph_controller.h +++ b/apps/graph/graph/graph_controller.h @@ -4,43 +4,28 @@ #include #include "graph_view.h" #include "graph_window.h" -#include "../../window_parameter_controller.h" #include "curve_parameter_controller.h" #include "initialisation_parameter_controller.h" -#include "../../zoom_parameter_controller.h" +#include "../../curve_view_with_banner_and_cursor_controller.h" #include "../function_store.h" namespace Graph { -class GraphController : public ViewController, public HeaderViewDelegate, public AlternateEmptyViewDelegate { +class GraphController : public CurveViewWindowWithBannerAndCursorController { public: GraphController(Responder * parentResponder, FunctionStore * functionStore, HeaderViewController * header); - const char * title() const override; View * view() override; - bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; - ViewController * windowParameterController(); - ViewController * zoomParameterController(); - ViewController * initialisationParameterController(); - - int numberOfButtons() const override; - Button * buttonAtIndex(int index) override; + ViewController * initialisationParameterController() override; bool isEmpty() override; const char * emptyMessage() override; - Responder * defaultController() override; private: - Responder * tabController() const; - StackViewController * stackController() const; + bool handleEnter() override; GraphView m_view; GraphWindow m_graphWindow; - WindowParameterController m_windowParameterController; - ZoomParameterController m_zoomParameterController; InitialisationParameterController m_initialisationParameterController; CurveParameterController m_curveParameterController; - Button m_windowButton; - Button m_zoomButton; - Button m_defaultInitialisationButton; FunctionStore * m_functionStore; }; diff --git a/apps/regression/graph_controller.cpp b/apps/regression/graph_controller.cpp index d9572e6e8..412ab0d04 100644 --- a/apps/regression/graph_controller.cpp +++ b/apps/regression/graph_controller.cpp @@ -3,98 +3,14 @@ namespace Regression { GraphController::GraphController(Responder * parentResponder, HeaderViewController * headerViewController, Data * data) : - ViewController(parentResponder), - HeaderViewDelegate(headerViewController), + CurveViewWindowWithBannerAndCursorController(parentResponder, headerViewController, data, &m_view), m_view(GraphView(data)), - m_windowParameterController(WindowParameterController(this, data)), - m_zoomParameterController(ZoomParameterController(this, data, &m_view)), - m_windowButton(this, "Axes", Invocation([](void * context, void * sender) { - GraphController * graphController = (GraphController *) context; - StackViewController * stack = graphController->stackController(); - stack->push(graphController->windowParameterController()); - }, this)), - m_zoomButton(this, "Zoom", Invocation([](void * context, void * sender) { - GraphController * graphController = (GraphController *) context; - StackViewController * stack = graphController->stackController(); - stack->push(graphController->zoomParameterController()); - }, this)), - m_defaultInitialisationButton(this, "Initialisation", Invocation([](void * context, void * sender) {}, this)), m_data(data) { } -const char * GraphController::title() const { - return "Graph"; -} - -View * GraphController::view() { - return &m_view; -} - -bool GraphController::handleEvent(Ion::Events::Event event) { - if (!m_view.isMainViewSelected()) { - if (event == Ion::Events::Down) { - headerViewController()->setSelectedButton(-1); - m_view.selectMainView(true); - m_view.reloadSelection(); - return true; - } - if (event == Ion::Events::Up) { - headerViewController()->setSelectedButton(-1); - app()->setFirstResponder(tabController()); - return true; - } - return false; - } - if (event == Ion::Events::Down || event == Ion::Events::Up) { - int direction = event == Ion::Events::Down ? -1 : 1; - m_view.reloadSelection(); - int didMoveCursor = m_data->moveCursorVertically(direction); - if ( event == Ion::Events::Up && didMoveCursor < 0) { - m_view.selectMainView(false); - headerViewController()->setSelectedButton(0); - return true; - } - if (didMoveCursor == 0) { - m_view.reloadSelection(); - } else { - m_view.reload(); - } - return (didMoveCursor >= 0); - } - if (event == Ion::Events::Left || event == Ion::Events::Right) { - int direction = event == Ion::Events::Left ? -1 : 1; - m_view.reloadSelection(); - int didMoveCursor = m_data->moveCursorHorizontally(direction); - if (didMoveCursor == 0) { - m_view.reloadSelection(); - } else { - m_view.reload(); - } - return (didMoveCursor >= 0); - } - return false; -} - -void GraphController::didBecomeFirstResponder() { - headerViewController()->setSelectedButton(-1); - m_view.selectMainView(true); - // Layout view whe the graph view that might have been modified by the zoom page - headerViewController()->layoutView(); - m_view.reload(); -} - -int GraphController::numberOfButtons() const { - return 3; -} -Button * GraphController::buttonAtIndex(int index) { - if (index == 0) { - return &m_windowButton; - } - if (index == 1) { - return &m_zoomButton; - } - return &m_defaultInitialisationButton; +ViewController * GraphController::initialisationParameterController() { + return &m_windowParameterController; } bool GraphController::isEmpty() { @@ -108,24 +24,8 @@ const char * GraphController::emptyMessage() { return "Aucune donnee a tracer"; } -Responder * GraphController::defaultController() { - return tabController(); -} - -ViewController * GraphController::windowParameterController() { - return &m_windowParameterController; -} - -ViewController * GraphController::zoomParameterController() { - return &m_zoomParameterController; -} - -Responder * GraphController::tabController() const { - return (parentResponder()->parentResponder()->parentResponder()->parentResponder()); -} - -StackViewController * GraphController::stackController() const{ - return (StackViewController *)(parentResponder()->parentResponder()->parentResponder()); +bool GraphController::handleEnter() { + return false; } } diff --git a/apps/regression/graph_controller.h b/apps/regression/graph_controller.h index 9b6bc582e..b4a3c5861 100644 --- a/apps/regression/graph_controller.h +++ b/apps/regression/graph_controller.h @@ -4,38 +4,21 @@ #include #include "data.h" #include "graph_view.h" -#include "../window_parameter_controller.h" -#include "../zoom_parameter_controller.h" +#include "../curve_view_with_banner_and_cursor_controller.h" namespace Regression { -class GraphController : public ViewController, public HeaderViewDelegate, public AlternateEmptyViewDelegate { +class GraphController : public CurveViewWindowWithBannerAndCursorController { public: GraphController(Responder * parentResponder, HeaderViewController * headerViewController, Data * data); - const char * title() const override; - View * view() override; - bool handleEvent(Ion::Events::Event event) override; - void didBecomeFirstResponder() override; - - int numberOfButtons() const override; - Button * buttonAtIndex(int index) override; + ViewController * initialisationParameterController() override; bool isEmpty() override; const char * emptyMessage() override; - Responder * defaultController() override; - - ViewController * windowParameterController(); - ViewController * zoomParameterController(); private: - Responder * tabController() const; - StackViewController * stackController() const; + bool handleEnter() override; GraphView m_view; - WindowParameterController m_windowParameterController; - ZoomParameterController m_zoomParameterController; - Button m_windowButton; - Button m_zoomButton; - Button m_defaultInitialisationButton; Data * m_data; };