diff --git a/apps/statistics/app.cpp b/apps/statistics/app.cpp index cea063eaf..8f591b088 100644 --- a/apps/statistics/app.cpp +++ b/apps/statistics/app.cpp @@ -18,6 +18,16 @@ const Image * App::Descriptor::icon() { return ImageStore::StatIcon; } +App::Snapshot::Snapshot() : + m_store(), + m_storeVersion(0), + m_barVersion(0), + m_rangeVersion(0), + m_selectedHistogramBarIndex(0), + m_selectedBoxQuantile(BoxView::Quantile::Min) +{ +} + App * App::Snapshot::unpack(Container * container) { return new App(container, this); } @@ -35,15 +45,35 @@ Store * App::Snapshot::store() { return &m_store; } +uint32_t * App::Snapshot::storeVersion() { + return &m_storeVersion; +} + +uint32_t * App::Snapshot::barVersion() { + return &m_barVersion; +} + +uint32_t * App::Snapshot::rangeVersion() { + return &m_rangeVersion; +} + +int * App::Snapshot::selectedHistogramBarIndex() { + return &m_selectedHistogramBarIndex; +} + +BoxView::Quantile * App::Snapshot::selectedBoxQuantile() { + return &m_selectedBoxQuantile; +} + App::App(Container * container, Snapshot * snapshot) : TextFieldDelegateApp(container, snapshot, &m_tabViewController), m_calculationController(&m_calculationAlternateEmptyViewController, &m_calculationHeader, snapshot->store()), m_calculationAlternateEmptyViewController(&m_calculationHeader, &m_calculationController, &m_calculationController), m_calculationHeader(&m_tabViewController, &m_calculationAlternateEmptyViewController, &m_calculationController), - m_boxController(&m_boxAlternateEmptyViewController, &m_boxHeader, snapshot->store()), + m_boxController(&m_boxAlternateEmptyViewController, &m_boxHeader, snapshot->store(), snapshot->selectedBoxQuantile()), m_boxAlternateEmptyViewController(&m_boxHeader, &m_boxController, &m_boxController), m_boxHeader(&m_tabViewController, &m_boxAlternateEmptyViewController, &m_boxController), - m_histogramController(&m_histogramAlternateEmptyViewController, &m_histogramHeader, snapshot->store()), + m_histogramController(&m_histogramAlternateEmptyViewController, &m_histogramHeader, snapshot->store(), snapshot->storeVersion(), snapshot->barVersion(), snapshot->rangeVersion(), snapshot->selectedHistogramBarIndex()), m_histogramAlternateEmptyViewController(&m_histogramHeader, &m_histogramController, &m_histogramController), m_histogramHeader(&m_histogramStackViewController, &m_histogramAlternateEmptyViewController, &m_histogramController), m_histogramStackViewController(&m_tabViewController, &m_histogramHeader), diff --git a/apps/statistics/app.h b/apps/statistics/app.h index 7016887a8..9cd2f84cc 100644 --- a/apps/statistics/app.h +++ b/apps/statistics/app.h @@ -21,12 +21,23 @@ public: }; class Snapshot : public ::App::Snapshot { public: + Snapshot(); App * unpack(Container * container) override; void reset() override; Descriptor * descriptor() override; Store * store(); + uint32_t * storeVersion(); + uint32_t * barVersion(); + uint32_t * rangeVersion(); + int * selectedHistogramBarIndex(); + BoxView::Quantile * selectedBoxQuantile(); private: Store m_store; + uint32_t m_storeVersion; + uint32_t m_barVersion; + uint32_t m_rangeVersion; + int m_selectedHistogramBarIndex; + BoxView::Quantile m_selectedBoxQuantile; }; private: App(Container * container, Snapshot * snapshot); diff --git a/apps/statistics/box_controller.cpp b/apps/statistics/box_controller.cpp index d200d5856..86e4af9a1 100644 --- a/apps/statistics/box_controller.cpp +++ b/apps/statistics/box_controller.cpp @@ -7,11 +7,11 @@ using namespace Poincare; namespace Statistics { -BoxController::BoxController(Responder * parentResponder, ButtonRowController * header, Store * store) : +BoxController::BoxController(Responder * parentResponder, ButtonRowController * header, Store * store, BoxView::Quantile * selectedQuantile) : ViewController(parentResponder), ButtonRowDelegate(header, nullptr), m_boxBannerView(BoxBannerView()), - m_view(BoxView(store, &m_boxBannerView)), + m_view(BoxView(store, &m_boxBannerView, selectedQuantile)), m_store(store) { } diff --git a/apps/statistics/box_controller.h b/apps/statistics/box_controller.h index 1c4adb95e..810c8a693 100644 --- a/apps/statistics/box_controller.h +++ b/apps/statistics/box_controller.h @@ -10,7 +10,7 @@ namespace Statistics { class BoxController : public ViewController, public ButtonRowDelegate, public AlternateEmptyViewDelegate { public: - BoxController(Responder * parentResponder, ButtonRowController * header, Store * store); + BoxController(Responder * parentResponder, ButtonRowController * header, Store * store, BoxView::Quantile * selectedQuantile); const char * title() override; View * view() override; bool handleEvent(Ion::Events::Event event) override; diff --git a/apps/statistics/box_view.cpp b/apps/statistics/box_view.cpp index 0aebdd192..f2882ab4b 100644 --- a/apps/statistics/box_view.cpp +++ b/apps/statistics/box_view.cpp @@ -6,12 +6,12 @@ using namespace Shared; namespace Statistics { -BoxView::BoxView(Store * store, BannerView * bannerView) : +BoxView::BoxView(Store * store, BannerView * bannerView, Quantile * selectedQuantile) : CurveView(&m_boxRange, nullptr, bannerView, nullptr), m_store(store), m_boxRange(BoxRange(store)), m_labels{}, - m_selectedQuantile(Quantile::Min) + m_selectedQuantile(selectedQuantile) { } @@ -19,7 +19,7 @@ void BoxView::reload() { CurveView::reload(); CalculPointer calculationMethods[5] = {&Store::minValue, &Store::firstQuartile, &Store::median, &Store::thirdQuartile, &Store::maxValue}; - float calculation = (m_store->*calculationMethods[(int)m_selectedQuantile])(); + float calculation = (m_store->*calculationMethods[(int)*m_selectedQuantile])(); float pixelUpperBound = floatToPixel(Axis::Vertical, 0.2f)+1; float pixelLowerBound = floatToPixel(Axis::Vertical, 0.8)-1; float selectedValueInPixels = floatToPixel(Axis::Horizontal, calculation)-1; @@ -28,16 +28,16 @@ void BoxView::reload() { } BoxView::Quantile BoxView::selectedQuantile() { - return m_selectedQuantile; + return *m_selectedQuantile; } bool BoxView::selectQuantile(int selectedQuantile) { if (selectedQuantile < 0 || selectedQuantile > 4) { return false; } - if ((int)m_selectedQuantile != selectedQuantile) { + if ((int)*m_selectedQuantile != selectedQuantile) { reload(); - m_selectedQuantile = (Quantile)selectedQuantile; + *m_selectedQuantile = (Quantile)selectedQuantile; reload(); } return true; @@ -75,7 +75,7 @@ void BoxView::drawRect(KDContext * ctx, KDRect rect) const { drawSegment(ctx, rect, Axis::Vertical, calculations[k], lowBound, upBound, Palette::Select, 2); } if (isMainViewSelected()) { - drawSegment(ctx, rect, Axis::Vertical, calculations[(int)m_selectedQuantile], lowBound, upBound, Palette::YellowDark, 2); + drawSegment(ctx, rect, Axis::Vertical, calculations[(int)*m_selectedQuantile], lowBound, upBound, Palette::YellowDark, 2); } } diff --git a/apps/statistics/box_view.h b/apps/statistics/box_view.h index 1a0e42933..979c4d7f7 100644 --- a/apps/statistics/box_view.h +++ b/apps/statistics/box_view.h @@ -19,7 +19,7 @@ public: ThirdQuartile = 3, Max = 4 }; - BoxView(Store * store, Shared::BannerView * bannerView); + BoxView(Store * store, Shared::BannerView * bannerView, Quantile * selectedQuantile); void reload() override; Quantile selectedQuantile(); bool selectQuantile(int selectedQuantile); @@ -29,7 +29,7 @@ private: Store * m_store; BoxRange m_boxRange; char m_labels[k_maxNumberOfXLabels][Poincare::Complex::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits)]; - Quantile m_selectedQuantile; + Quantile * m_selectedQuantile; }; } diff --git a/apps/statistics/histogram_controller.cpp b/apps/statistics/histogram_controller.cpp index a883cd813..5dd568099 100644 --- a/apps/statistics/histogram_controller.cpp +++ b/apps/statistics/histogram_controller.cpp @@ -10,7 +10,7 @@ using namespace Shared; namespace Statistics { -HistogramController::HistogramController(Responder * parentResponder, ButtonRowController * header, Store * store) : +HistogramController::HistogramController(Responder * parentResponder, ButtonRowController * header, Store * store, uint32_t * storeVersion, uint32_t * barVersion, uint32_t * rangeVersion, int * selectedBarIndex) : ViewController(parentResponder), ButtonRowDelegate(header, nullptr), m_bannerView(HistogramBannerView()), @@ -21,7 +21,10 @@ HistogramController::HistogramController(Responder * parentResponder, ButtonRowC stack->push(histogramController->histogramParameterController()); }, this))), m_store(store), - m_cursor(CurveViewCursor()), + m_storeVersion(storeVersion), + m_barVersion(barVersion), + m_rangeVersion(rangeVersion), + m_selectedBarIndex(selectedBarIndex), m_histogramParameterController(nullptr, store) { } @@ -78,25 +81,25 @@ bool HistogramController::handleEvent(Ion::Events::Event event) { void HistogramController::didBecomeFirstResponder() { uint32_t storeChecksum = m_store->storeChecksum(); - if (m_storeVersion != storeChecksum) { - m_storeVersion = storeChecksum; + if (*m_storeVersion != storeChecksum) { + *m_storeVersion = storeChecksum; initBarParameters(); } uint32_t barChecksum = m_store->barChecksum(); - if (m_barVersion != barChecksum) { - m_barVersion = barChecksum; + if (*m_barVersion != barChecksum) { + *m_barVersion = barChecksum; initRangeParameters(); } uint32_t rangeChecksum = m_store->rangeChecksum(); - if (m_rangeVersion != rangeChecksum) { - m_rangeVersion = rangeChecksum; + if (*m_rangeVersion != rangeChecksum) { + *m_rangeVersion = rangeChecksum; initBarSelection(); reloadBannerView(); } if (!m_view.isMainViewSelected()) { header()->setSelectedButton(0); } else { - m_view.setHighlight(m_store->startOfBarAtIndex(m_selectedBarIndex), m_store->endOfBarAtIndex(m_selectedBarIndex)); + m_view.setHighlight(m_store->startOfBarAtIndex(*m_selectedBarIndex), m_store->endOfBarAtIndex(*m_selectedBarIndex)); } } @@ -153,10 +156,10 @@ void HistogramController::reloadBannerView() { int legendLength = strlen(legend); strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; - float lowerBound = m_store->startOfBarAtIndex(m_selectedBarIndex); + float lowerBound = m_store->startOfBarAtIndex(*m_selectedBarIndex); numberOfChar += Complex::convertFloatToText(lowerBound, buffer+numberOfChar, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); buffer[numberOfChar++] = ';'; - float upperBound = m_store->endOfBarAtIndex(m_selectedBarIndex); + float upperBound = m_store->endOfBarAtIndex(*m_selectedBarIndex); numberOfChar += Complex::convertFloatToText(upperBound, buffer+numberOfChar, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); buffer[numberOfChar++] = '['; legend = " "; @@ -170,7 +173,7 @@ void HistogramController::reloadBannerView() { legendLength = strlen(legend); strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; - float size = m_store->heightOfBarAtIndex(m_selectedBarIndex); + float size = m_store->heightOfBarAtIndex(*m_selectedBarIndex); numberOfChar += Complex::convertFloatToText(size, buffer+numberOfChar, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); legend = " "; legendLength = strlen(legend); @@ -193,7 +196,7 @@ void HistogramController::reloadBannerView() { } bool HistogramController::moveSelection(int deltaIndex) { - int newSelectedBarIndex = m_selectedBarIndex; + int newSelectedBarIndex = *m_selectedBarIndex; if (deltaIndex > 0) { do { newSelectedBarIndex++; @@ -203,10 +206,10 @@ bool HistogramController::moveSelection(int deltaIndex) { newSelectedBarIndex--; } while (m_store->heightOfBarAtIndex(newSelectedBarIndex) == 0 && newSelectedBarIndex >= 0); } - if (newSelectedBarIndex >= 0 && newSelectedBarIndex < m_store->numberOfBars() && m_selectedBarIndex != newSelectedBarIndex) { - m_selectedBarIndex = newSelectedBarIndex; - m_view.setHighlight(m_store->startOfBarAtIndex(m_selectedBarIndex), m_store->endOfBarAtIndex(m_selectedBarIndex)); - m_store->scrollToSelectedBarIndex(m_selectedBarIndex); + if (newSelectedBarIndex >= 0 && newSelectedBarIndex < m_store->numberOfBars() && *m_selectedBarIndex != newSelectedBarIndex) { + *m_selectedBarIndex = newSelectedBarIndex; + m_view.setHighlight(m_store->startOfBarAtIndex(*m_selectedBarIndex), m_store->endOfBarAtIndex(*m_selectedBarIndex)); + m_store->scrollToSelectedBarIndex(*m_selectedBarIndex); return true; } return false; @@ -252,20 +255,20 @@ void HistogramController::initBarParameters() { } void HistogramController::initBarSelection() { - m_selectedBarIndex = 0; - while ((m_store->heightOfBarAtIndex(m_selectedBarIndex) == 0 && - m_selectedBarIndex < m_store->numberOfBars()) || - m_store->startOfBarAtIndex(m_selectedBarIndex) < m_store->firstDrawnBarAbscissa()) { - m_selectedBarIndex++; + *m_selectedBarIndex = 0; + while ((m_store->heightOfBarAtIndex(*m_selectedBarIndex) == 0 && + *m_selectedBarIndex < m_store->numberOfBars()) || + m_store->startOfBarAtIndex(*m_selectedBarIndex) < m_store->firstDrawnBarAbscissa()) { + *m_selectedBarIndex = *m_selectedBarIndex+1; } - if (m_selectedBarIndex >= m_store->numberOfBars()) { + if (*m_selectedBarIndex >= m_store->numberOfBars()) { /* No bar is after m_firstDrawnBarAbscissa, so we select the first bar */ - m_selectedBarIndex = 0; - while (m_store->heightOfBarAtIndex(m_selectedBarIndex) == 0 && m_selectedBarIndex < m_store->numberOfBars()) { - m_selectedBarIndex++; + *m_selectedBarIndex = 0; + while (m_store->heightOfBarAtIndex(*m_selectedBarIndex) == 0 && *m_selectedBarIndex < m_store->numberOfBars()) { + *m_selectedBarIndex = *m_selectedBarIndex+1; } } - m_store->scrollToSelectedBarIndex(m_selectedBarIndex); + m_store->scrollToSelectedBarIndex(*m_selectedBarIndex); } } diff --git a/apps/statistics/histogram_controller.h b/apps/statistics/histogram_controller.h index 64f27eea1..c6842a3fc 100644 --- a/apps/statistics/histogram_controller.h +++ b/apps/statistics/histogram_controller.h @@ -13,7 +13,7 @@ namespace Statistics { class HistogramController : public ViewController, public ButtonRowDelegate, public AlternateEmptyViewDelegate { public: - HistogramController(Responder * parentResponder, ButtonRowController * header, Store * store); + HistogramController(Responder * parentResponder, ButtonRowController * header, Store * store, uint32_t * m_storeVersion, uint32_t * m_barVersion, uint32_t * m_rangeVersion, int * m_selectedBarIndex); const char * title() override; View * view() override; StackViewController * stackController(); @@ -45,11 +45,10 @@ private: HistogramView m_view; Button m_settingButton; Store * m_store; - Shared::CurveViewCursor m_cursor; - uint32_t m_storeVersion; - uint32_t m_barVersion; - uint32_t m_rangeVersion; - int m_selectedBarIndex; + uint32_t * m_storeVersion; + uint32_t * m_barVersion; + uint32_t * m_rangeVersion; + int * m_selectedBarIndex; HistogramParameterController m_histogramParameterController; };