From e6a33772fe6d40ca28795fc35cd23f331394725d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Thu, 25 Jan 2018 14:55:51 +0100 Subject: [PATCH] [apps] Regression: alternate between round and cross cursor views --- apps/regression/graph_controller.cpp | 33 ++++++++++++++++++---------- apps/regression/graph_controller.h | 5 ++++- apps/shared/round_cursor_view.cpp | 4 ++-- apps/shared/round_cursor_view.h | 2 +- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/apps/regression/graph_controller.cpp b/apps/regression/graph_controller.cpp index 1599cd686..5229dd8a0 100644 --- a/apps/regression/graph_controller.cpp +++ b/apps/regression/graph_controller.cpp @@ -9,8 +9,10 @@ namespace Regression { GraphController::GraphController(Responder * parentResponder, ButtonRowController * header, Store * store, CurveViewCursor * cursor, uint32_t * modelVersion, uint32_t * rangeVersion, int * selectedDotIndex) : InteractiveCurveViewController(parentResponder, header, store, &m_view, cursor, modelVersion, rangeVersion), + m_crossCursorView(), + m_roundCursorView(Palette::YellowDark), m_bannerView(), - m_view(store, m_cursor, &m_bannerView, &m_cursorView), + m_view(store, m_cursor, &m_bannerView, &m_crossCursorView), m_store(store), m_initialisationParameterController(this, m_store), m_predictionParameterController(this, m_store, m_cursor, this), @@ -37,8 +39,14 @@ I18n::Message GraphController::emptyMessage() { return I18n::Message::NoEnoughDataForRegression; } +void GraphController::viewWillAppear() { + InteractiveCurveViewController::viewWillAppear(); + m_view.setCursorView(*m_selectedDotIndex >= 0 ? static_cast(&m_crossCursorView): static_cast(&m_roundCursorView)); +} + void GraphController::selectRegressionCurve() { *m_selectedDotIndex = -1; + m_view.setCursorView(&m_roundCursorView); } CurveView * GraphController::curveView() { @@ -177,11 +185,11 @@ void GraphController::initRangeParameters() { } void GraphController::initCursorParameters() { - double x = (m_store->xMin() + m_store->xMax())/2.0; - double y = m_store->yValueForXValue(x); + double x = m_store->meanOfColumn(0); + double y = m_store->meanOfColumn(1); m_cursor->moveTo(x, y); m_store->panToMakePointVisible(x, y, k_cursorTopMarginRatio, k_cursorRightMarginRatio, k_cursorBottomMarginRatio, k_cursorLeftMarginRatio); - selectRegressionCurve(); + *m_selectedDotIndex = m_store->numberOfPairs(); } bool GraphController::moveCursorHorizontally(int direction) { @@ -213,7 +221,7 @@ bool GraphController::moveCursorVertically(int direction) { double yRegressionCurve = m_store->yValueForXValue(m_cursor->x()); if (*m_selectedDotIndex >= 0) { if ((yRegressionCurve - m_cursor->y() > 0) == (direction > 0)) { - *m_selectedDotIndex = -1; + selectRegressionCurve(); m_cursor->moveTo(m_cursor->x(), yRegressionCurve); m_store->panToMakePointVisible(m_cursor->x(), m_cursor->y(), k_cursorTopMarginRatio, k_cursorRightMarginRatio, k_cursorBottomMarginRatio, k_cursorLeftMarginRatio); return true; @@ -222,18 +230,19 @@ bool GraphController::moveCursorVertically(int direction) { } } else { int dotSelected = m_store->closestVerticalDot(direction, m_cursor->x()); - if (dotSelected >= 0 && dotSelected < m_store->numberOfPairs()) { + if (dotSelected >= 0 && dotSelected <= m_store->numberOfPairs()) { + m_view.setCursorView(&m_crossCursorView); + if (dotSelected == m_store->numberOfPairs()) { + *m_selectedDotIndex = dotSelected; + m_cursor->moveTo(m_store->meanOfColumn(0), m_store->meanOfColumn(1)); + m_store->panToMakePointVisible(m_cursor->x(), m_cursor->y(), k_cursorTopMarginRatio, k_cursorRightMarginRatio, k_cursorBottomMarginRatio, k_cursorLeftMarginRatio); + return true; + } *m_selectedDotIndex = dotSelected; m_cursor->moveTo(m_store->get(0, *m_selectedDotIndex), m_store->get(1, *m_selectedDotIndex)); m_store->panToMakePointVisible(m_cursor->x(), m_cursor->y(), k_cursorTopMarginRatio, k_cursorRightMarginRatio, k_cursorBottomMarginRatio, k_cursorLeftMarginRatio); return true; } - if (dotSelected == m_store->numberOfPairs()) { - *m_selectedDotIndex = dotSelected; - m_cursor->moveTo(m_store->meanOfColumn(0), m_store->meanOfColumn(1)); - m_store->panToMakePointVisible(m_cursor->x(), m_cursor->y(), k_cursorTopMarginRatio, k_cursorRightMarginRatio, k_cursorBottomMarginRatio, k_cursorLeftMarginRatio); - return true; - } return false; } } diff --git a/apps/regression/graph_controller.h b/apps/regression/graph_controller.h index cbd5d99d7..234e5dd19 100644 --- a/apps/regression/graph_controller.h +++ b/apps/regression/graph_controller.h @@ -10,6 +10,7 @@ #include "../shared/interactive_curve_view_controller.h" #include "../shared/curve_view_cursor.h" #include "../shared/cursor_view.h" +#include "../shared/round_cursor_view.h" namespace Regression { @@ -20,6 +21,7 @@ public: ViewController * initialisationParameterController() override; bool isEmpty() const override; I18n::Message emptyMessage() override; + void viewWillAppear() override; void selectRegressionCurve(); private: constexpr static float k_cursorTopMarginRatio = 0.07f; // (cursorHeight/2)/graphViewHeight @@ -37,7 +39,8 @@ private: uint32_t modelVersion() override; uint32_t rangeVersion() override; bool isCursorVisible() override; - Shared::CursorView m_cursorView; + Shared::CursorView m_crossCursorView; + Shared::RoundCursorView m_roundCursorView; BannerView m_bannerView; GraphView m_view; Store * m_store; diff --git a/apps/shared/round_cursor_view.cpp b/apps/shared/round_cursor_view.cpp index d982f1e69..baee1829e 100644 --- a/apps/shared/round_cursor_view.cpp +++ b/apps/shared/round_cursor_view.cpp @@ -2,8 +2,8 @@ namespace Shared { -RoundCursorView::RoundCursorView() : - m_color(KDColorBlack) +RoundCursorView::RoundCursorView(KDColor color) : + m_color(color) { } diff --git a/apps/shared/round_cursor_view.h b/apps/shared/round_cursor_view.h index 137557156..93a3e78ce 100644 --- a/apps/shared/round_cursor_view.h +++ b/apps/shared/round_cursor_view.h @@ -7,7 +7,7 @@ namespace Shared { class RoundCursorView : public View { public: - RoundCursorView(); + RoundCursorView(KDColor color = KDColorBlack); void drawRect(KDContext * ctx, KDRect rect) const override; KDSize minimalSizeForOptimalDisplay() const override; void setColor(KDColor color);