diff --git a/apps/statistics/histogram_controller.cpp b/apps/statistics/histogram_controller.cpp index 2154781e2..bc7654029 100644 --- a/apps/statistics/histogram_controller.cpp +++ b/apps/statistics/histogram_controller.cpp @@ -47,9 +47,8 @@ bool HistogramController::handleEvent(Ion::Events::Event event) { return MultipleDataViewController::handleEvent(event); } -void HistogramController::didBecomeFirstResponder() { - MultipleDataViewController::didBecomeFirstResponder(); - +void HistogramController::viewWillAppear() { + MultipleDataViewController::viewWillAppear(); uint32_t storeChecksum = m_store->storeChecksum(); if (*m_storeVersion != storeChecksum) { *m_storeVersion = storeChecksum; @@ -67,8 +66,6 @@ void HistogramController::didBecomeFirstResponder() { initBarSelection(); reloadBannerView(); } - HistogramView * selectedHistogramView = static_cast(m_view.dataViewAtIndex(selectedSeriesIndex())); - selectedHistogramView->setHighlight(m_store->startOfBarAtIndex(selectedSeriesIndex(), *m_selectedBarIndex), m_store->endOfBarAtIndex(selectedSeriesIndex(), *m_selectedBarIndex)); } void HistogramController::willExitResponderChain(Responder * nextFirstResponder) { @@ -80,6 +77,11 @@ void HistogramController::willExitResponderChain(Responder * nextFirstResponder) MultipleDataViewController::willExitResponderChain(nextFirstResponder); } +void HistogramController::highlightSelection() { + HistogramView * selectedHistogramView = static_cast(m_view.dataViewAtIndex(selectedSeriesIndex())); + selectedHistogramView->setHighlight(m_store->startOfBarAtIndex(selectedSeriesIndex(), *m_selectedBarIndex), m_store->endOfBarAtIndex(selectedSeriesIndex(), *m_selectedBarIndex)); +} + Responder * HistogramController::tabController() const { return (parentResponder()->parentResponder()->parentResponder()->parentResponder()); } diff --git a/apps/statistics/histogram_controller.h b/apps/statistics/histogram_controller.h index 1790723b6..def083feb 100644 --- a/apps/statistics/histogram_controller.h +++ b/apps/statistics/histogram_controller.h @@ -19,17 +19,18 @@ public: // ViewController const char * title() override; + void viewWillAppear() override; MultipleDataView * multipleDataView() override { return &m_view; } // Responder bool handleEvent(Ion::Events::Event event) override; - void didBecomeFirstResponder() override; void willExitResponderChain(Responder * nextFirstResponder) override; private: constexpr static int k_maxNumberOfBarsPerWindow = 100; constexpr static int k_maxIntervalLegendLength = 33; constexpr static int k_maxLegendLength = 13; constexpr static int k_maxNumberOfCharacters = 30; + void highlightSelection() override; Responder * tabController() const override; void reloadBannerView() override; void initRangeParameters(); diff --git a/apps/statistics/multiple_data_view_controller.cpp b/apps/statistics/multiple_data_view_controller.cpp index 440c09e78..c9687b55c 100644 --- a/apps/statistics/multiple_data_view_controller.cpp +++ b/apps/statistics/multiple_data_view_controller.cpp @@ -27,11 +27,9 @@ Responder * MultipleDataViewController::defaultController() { } void MultipleDataViewController::viewWillAppear() { - multipleDataView()->setDisplayBanner(true); - if (*m_selectedSeriesIndex < 0) { + if (*m_selectedSeriesIndex < 0 || m_store->sumOfOccurrences(*m_selectedSeriesIndex) == 0) { *m_selectedSeriesIndex = multipleDataView()->seriesOfSubviewAtIndex(0); } - multipleDataView()->selectDataView(*m_selectedSeriesIndex); reloadBannerView(); multipleDataView()->reload(); } @@ -45,8 +43,8 @@ bool MultipleDataViewController::handleEvent(Ion::Events::Event event) { *m_selectedSeriesIndex = multipleDataView()->seriesOfSubviewAtIndex(currentSelectedSubview+1); *m_selectedBarIndex = MultipleDataView::k_defaultSelectedBar; multipleDataView()->selectDataView(*m_selectedSeriesIndex); + highlightSelection(); reloadBannerView(); - app()->setFirstResponder(this); return true; } return false; @@ -58,7 +56,7 @@ bool MultipleDataViewController::handleEvent(Ion::Events::Event event) { *m_selectedSeriesIndex = multipleDataView()->seriesOfSubviewAtIndex(currentSelectedSubview-1); *m_selectedBarIndex = MultipleDataView::k_defaultSelectedBar; multipleDataView()->selectDataView(*m_selectedSeriesIndex); - app()->setFirstResponder(this); + highlightSelection(); } else { app()->setFirstResponder(tabController()); } @@ -73,26 +71,18 @@ bool MultipleDataViewController::handleEvent(Ion::Events::Event event) { return false; } -void MultipleDataViewController::didBecomeFirstResponder() { +void MultipleDataViewController::didEnterResponderChain(Responder * firstResponder) { + assert(*m_selectedSeriesIndex >= 0); multipleDataView()->setDisplayBanner(true); - if (*m_selectedSeriesIndex < 0 || m_store->sumOfOccurrences(*m_selectedSeriesIndex) == 0) { - if (*m_selectedSeriesIndex >= 0) { - multipleDataView()->deselectDataView(*m_selectedSeriesIndex); - } - *m_selectedSeriesIndex = multipleDataView()->seriesOfSubviewAtIndex(0); - multipleDataView()->selectDataView(*m_selectedSeriesIndex); - multipleDataView()->reload(); - } else { - multipleDataView()->dataViewAtIndex(*m_selectedSeriesIndex)->selectMainView(true); - } + multipleDataView()->selectDataView(*m_selectedSeriesIndex); + highlightSelection(); } void MultipleDataViewController::willExitResponderChain(Responder * nextFirstResponder) { if (nextFirstResponder == nullptr || nextFirstResponder == tabController()) { - if (*m_selectedSeriesIndex >= 0) { - multipleDataView()->dataViewAtIndex(*m_selectedSeriesIndex)->selectMainView(false); - multipleDataView()->setDisplayBanner(false); - } + assert(*m_selectedSeriesIndex >= 0); + multipleDataView()->deselectDataView(*m_selectedSeriesIndex); + multipleDataView()->setDisplayBanner(false); } } diff --git a/apps/statistics/multiple_data_view_controller.h b/apps/statistics/multiple_data_view_controller.h index e3dfa92ed..23fd3eaaa 100644 --- a/apps/statistics/multiple_data_view_controller.h +++ b/apps/statistics/multiple_data_view_controller.h @@ -24,9 +24,10 @@ public: // Responder bool handleEvent(Ion::Events::Event event) override; - void didBecomeFirstResponder() override; + void didEnterResponderChain(Responder * previousFirstResponder) override; void willExitResponderChain(Responder * nextFirstResponder) override; protected: + virtual void highlightSelection() {} virtual Responder * tabController() const = 0; virtual void reloadBannerView() = 0; virtual bool moveSelectionHorizontally(int deltaIndex) = 0;