From d504564334aa094baaaa788b480506c0f9ffaff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Mon, 23 Mar 2020 13:44:56 +0100 Subject: [PATCH] [apps/shared] Create ZoomAndPanCurveViewController, ZoomParameterController inherits from ZoomAndPanCurveViewController --- apps/shared/Makefile | 1 + .../zoom_and_pan_curve_view_controller.cpp | 35 ++++++++++++++++ .../zoom_and_pan_curve_view_controller.h | 23 +++++++++++ apps/shared/zoom_parameter_controller.cpp | 41 +------------------ apps/shared/zoom_parameter_controller.h | 16 +++++--- 5 files changed, 70 insertions(+), 46 deletions(-) create mode 100644 apps/shared/zoom_and_pan_curve_view_controller.cpp create mode 100644 apps/shared/zoom_and_pan_curve_view_controller.h diff --git a/apps/shared/Makefile b/apps/shared/Makefile index 1185cf65a..00a676226 100644 --- a/apps/shared/Makefile +++ b/apps/shared/Makefile @@ -79,6 +79,7 @@ app_shared_src = $(addprefix apps/shared/,\ vertical_cursor_view.cpp \ xy_banner_view.cpp\ zoom_curve_view_controller.cpp \ + zoom_and_pan_curve_view_controller.cpp \ zoom_parameter_controller.cpp \ ) diff --git a/apps/shared/zoom_and_pan_curve_view_controller.cpp b/apps/shared/zoom_and_pan_curve_view_controller.cpp new file mode 100644 index 000000000..eff23f303 --- /dev/null +++ b/apps/shared/zoom_and_pan_curve_view_controller.cpp @@ -0,0 +1,35 @@ +#include "zoom_and_pan_curve_view_controller.h" +#include +#include + +using namespace Poincare; + +namespace Shared { + +bool ZoomAndPanCurveViewController::handleEvent(Ion::Events::Event event) { + if (event == Ion::Events::Left || event == Ion::Events::Right || event == Ion::Events::Up || event == Ion::Events::Down) { + return handlePan(event); + } + return ZoomCurveViewController::handleEvent(event); +} + +bool ZoomAndPanCurveViewController::handlePan(Ion::Events::Event event) { + float xMove = 0.0f; + float yMove = 0.0f; + if (event == Ion::Events::Up) { + yMove = interactiveCurveViewRange()->yGridUnit(); + } else if (event == Ion::Events::Down) { + yMove = -interactiveCurveViewRange()->yGridUnit(); + } else if (event == Ion::Events::Left) { + xMove = -interactiveCurveViewRange()->xGridUnit(); + } else { + assert(event == Ion::Events::Right); + xMove = interactiveCurveViewRange()->xGridUnit(); + } + interactiveCurveViewRange()->panWithVector(xMove, yMove); + curveView()->reload(); + return true; +} + +} + diff --git a/apps/shared/zoom_and_pan_curve_view_controller.h b/apps/shared/zoom_and_pan_curve_view_controller.h new file mode 100644 index 000000000..e17f9ddf5 --- /dev/null +++ b/apps/shared/zoom_and_pan_curve_view_controller.h @@ -0,0 +1,23 @@ +#ifndef SHARED_ZOOM_AND_PAN_CURVE_VIEW_CONTROLLER_H +#define SHARED_ZOOM_AND_PAN_CURVE_VIEW_CONTROLLER_H + +#include "zoom_curve_view_controller.h" + +namespace Shared { + +/* ZoomAndPanCurveViewController is a View controller with a cursor that can + * handles zoom in/out and directional pan events. */ + +class ZoomAndPanCurveViewController : public ZoomCurveViewController { +public: + ZoomAndPanCurveViewController(Responder * parentResponder) : ZoomCurveViewController(parentResponder) {} + bool handleEvent(Ion::Events::Event event) override; +protected: + virtual bool handlePan(Ion::Events::Event event); + float xFocus() override { return interactiveCurveViewRange()->xCenter(); } + float yFocus() override { return interactiveCurveViewRange()->yCenter(); } +}; + +} + +#endif diff --git a/apps/shared/zoom_parameter_controller.cpp b/apps/shared/zoom_parameter_controller.cpp index 222a63732..fffc06680 100644 --- a/apps/shared/zoom_parameter_controller.cpp +++ b/apps/shared/zoom_parameter_controller.cpp @@ -5,7 +5,7 @@ namespace Shared { ZoomParameterController::ZoomParameterController(Responder * parentResponder, InteractiveCurveViewRange * interactiveRange, CurveView * curveView) : - ViewController(parentResponder), + ZoomAndPanCurveViewController(parentResponder), m_contentView(curveView), m_interactiveRange(interactiveRange) { @@ -15,45 +15,6 @@ const char * ZoomParameterController::title() { return I18n::translate(I18n::Message::Zoom); } -View * ZoomParameterController::view() { - return &m_contentView; -} - -bool ZoomParameterController::handleEvent(Ion::Events::Event event) { - if (event == Ion::Events::Plus) { - m_interactiveRange->zoom(2.0f/3.0f, m_interactiveRange->xCenter(), m_interactiveRange->yCenter()); - m_contentView.curveView()->reload(); - return true; - } - if (event == Ion::Events::Minus) { - m_interactiveRange->zoom(3.0f/2.0f, m_interactiveRange->xCenter(), m_interactiveRange->yCenter()); - m_contentView.curveView()->reload(); - return true; - } - if (event == Ion::Events::Up) { - m_interactiveRange->panWithVector(0.0f, m_interactiveRange->yGridUnit()); - m_contentView.curveView()->reload(); - return true; - } - if (event == Ion::Events::Down) { - m_interactiveRange->panWithVector(0.0f, -m_interactiveRange->yGridUnit()); - m_contentView.curveView()->reload(); - return true; - } - if (event == Ion::Events::Left) { - m_interactiveRange->panWithVector(-m_interactiveRange->xGridUnit(), 0.0f); - m_contentView.curveView()->reload(); - return true; - } - if (event == Ion::Events::Right) { - m_interactiveRange->panWithVector(m_interactiveRange->xGridUnit(), 0.0f); - m_contentView.curveView()->reload(); - return true; - } - - return false; -} - void ZoomParameterController::viewWillAppear() { ViewController::viewWillAppear(); m_contentView.curveView()->setOkView(nullptr); diff --git a/apps/shared/zoom_parameter_controller.h b/apps/shared/zoom_parameter_controller.h index 3f8758afa..293f166cf 100644 --- a/apps/shared/zoom_parameter_controller.h +++ b/apps/shared/zoom_parameter_controller.h @@ -1,25 +1,23 @@ #ifndef SHARED_ZOOM_PARAMETER_CONTROLLER_H #define SHARED_ZOOM_PARAMETER_CONTROLLER_H -#include -#include "interactive_curve_view_range.h" -#include "curve_view.h" +#include "zoom_and_pan_curve_view_controller.h" #include namespace Shared { -class ZoomParameterController : public ViewController { +class ZoomParameterController : public ZoomAndPanCurveViewController { public: ZoomParameterController(Responder * parentResponder, InteractiveCurveViewRange * interactiveCurveViewRange, CurveView * curveView); const char * title() override; - View * view() override; - bool handleEvent(Ion::Events::Event event) override; + View * view() override { return &m_contentView; } void viewWillAppear() override; void viewDidDisappear() override; void didBecomeFirstResponder() override; TELEMETRY_ID("Zoom"); private: constexpr static KDCoordinate k_standardViewHeight = 175; + class ContentView : public View { public: constexpr static KDCoordinate k_legendHeight = 30; @@ -46,7 +44,13 @@ private: CurveView * m_curveView; LegendView m_legendView; }; + void adaptCurveRange(bool viewWillAppear); + + // ZoomAndPanCurveViewController + InteractiveCurveViewRange * interactiveCurveViewRange() override { return m_interactiveRange; } + CurveView * curveView() override { return m_contentView.curveView(); } + ContentView m_contentView; InteractiveCurveViewRange * m_interactiveRange; };