From 87e48361961d1d1cdb8ad4997dd73acf17c44162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 21 Jan 2020 10:29:46 +0100 Subject: [PATCH] [apps/calculation][apps/shared] AbstractScrollableExactApproximateExpressionsView children classes reload scroll after reloading the subview selection when entering the responder chain and when cell becomes first responder. We don't reload scroll when setting content of cells as this is done every time we relayout - when scrolling in the table for instance. --- .../additional_outputs/illustrated_list_controller.cpp | 4 ++-- ...llable_input_exact_approximate_expressions_cell.cpp | 8 ++++++-- ...rollable_input_exact_approximate_expressions_cell.h | 6 ++---- .../scrollable_exact_approximate_expressions_cell.cpp | 10 +++++++--- .../scrollable_exact_approximate_expressions_cell.h | 1 + .../scrollable_exact_approximate_expressions_view.cpp | 2 +- .../scrollable_exact_approximate_expressions_view.h | 1 + apps/solver/solutions_controller.cpp | 7 +++++++ apps/solver/solutions_controller.h | 1 + 9 files changed, 28 insertions(+), 12 deletions(-) diff --git a/apps/calculation/additional_outputs/illustrated_list_controller.cpp b/apps/calculation/additional_outputs/illustrated_list_controller.cpp index 5659765a4..3e90488e8 100644 --- a/apps/calculation/additional_outputs/illustrated_list_controller.cpp +++ b/apps/calculation/additional_outputs/illustrated_list_controller.cpp @@ -18,9 +18,9 @@ IllustratedListController::IllustratedListController(Responder * parentResponder } void IllustratedListController::didEnterResponderChain(Responder * previousFirstResponder) { - // Select the left subview on all cells + // Select the left subview on all cells and reinitialize scroll for (int i = 0; i < k_maxNumberOfAdditionalCalculations; i++) { - m_additionalCalculationCells[i].setSelectedSubviewPosition(ScrollableInputExactApproximateExpressionsView::SubviewPosition::Left); + m_additionalCalculationCells[i].reinitSelection(); } selectCellAtLocation(0, 1); } diff --git a/apps/calculation/additional_outputs/scrollable_input_exact_approximate_expressions_cell.cpp b/apps/calculation/additional_outputs/scrollable_input_exact_approximate_expressions_cell.cpp index 5b03b18ac..5ab223f8a 100644 --- a/apps/calculation/additional_outputs/scrollable_input_exact_approximate_expressions_cell.cpp +++ b/apps/calculation/additional_outputs/scrollable_input_exact_approximate_expressions_cell.cpp @@ -59,14 +59,18 @@ void ScrollableInputExactApproximateExpressionsView::setCalculation(Calculation /* The displayed input and outputs have changed. We need to re-layout the cell * and re-initialize the scroll. */ layoutSubviews(); - reloadScroll(); } void ScrollableInputExactApproximateExpressionsCell::didBecomeFirstResponder() { - m_view.setSelectedSubviewPosition(Shared::ScrollableExactApproximateExpressionsView::SubviewPosition::Left); + reinitSelection(); Container::activeApp()->setFirstResponder(&m_view); } +void ScrollableInputExactApproximateExpressionsCell::reinitSelection() { + m_view.setSelectedSubviewPosition(Shared::ScrollableExactApproximateExpressionsView::SubviewPosition::Left); + m_view.reloadScroll(); +} + void ScrollableInputExactApproximateExpressionsCell::setCalculation(Calculation * calculation) { m_view.setCalculation(calculation); layoutSubviews(); diff --git a/apps/calculation/additional_outputs/scrollable_input_exact_approximate_expressions_cell.h b/apps/calculation/additional_outputs/scrollable_input_exact_approximate_expressions_cell.h index 55ab9eb0c..77a2994ea 100644 --- a/apps/calculation/additional_outputs/scrollable_input_exact_approximate_expressions_cell.h +++ b/apps/calculation/additional_outputs/scrollable_input_exact_approximate_expressions_cell.h @@ -49,15 +49,13 @@ public: // Table cell View * labelView() const override { return (View *)&m_view; } - void setHighlighted(bool highlight) override { - m_view.evenOddCell()->setHighlighted(highlight); - m_view.reloadScroll(); - } + void setHighlighted(bool highlight) override { m_view.evenOddCell()->setHighlighted(highlight); } void setCalculation(Calculation * calculation); void setDisplayCenter(bool display); ScrollableInputExactApproximateExpressionsView::SubviewPosition selectedSubviewPosition() { return m_view.selectedSubviewPosition(); } void setSelectedSubviewPosition(ScrollableInputExactApproximateExpressionsView::SubviewPosition subviewPosition) { m_view.setSelectedSubviewPosition(subviewPosition); } + void reinitSelection(); private: // Remove label margin added by TableCell because they're already handled by ScrollableInputExactApproximateExpressionsView KDCoordinate labelMargin() const override { return 0; } diff --git a/apps/shared/scrollable_exact_approximate_expressions_cell.cpp b/apps/shared/scrollable_exact_approximate_expressions_cell.cpp index c3ee04f64..599680c00 100644 --- a/apps/shared/scrollable_exact_approximate_expressions_cell.cpp +++ b/apps/shared/scrollable_exact_approximate_expressions_cell.cpp @@ -12,12 +12,10 @@ ScrollableExactApproximateExpressionsCell::ScrollableExactApproximateExpressions void ScrollableExactApproximateExpressionsCell::setLayouts(Poincare::Layout exactLayout, Poincare::Layout approximateLayout) { m_view.setLayouts(Layout(), exactLayout, approximateLayout); - m_view.setSelectedSubviewPosition(ScrollableExactApproximateExpressionsView::SubviewPosition::Center); } void ScrollableExactApproximateExpressionsCell::setHighlighted(bool highlight) { m_view.evenOddCell()->setHighlighted(highlight); - reloadScroll(); } void ScrollableExactApproximateExpressionsCell::setEven(bool even) { @@ -31,10 +29,16 @@ void ScrollableExactApproximateExpressionsCell::reloadScroll() { } void ScrollableExactApproximateExpressionsCell::didBecomeFirstResponder() { - m_view.setSelectedSubviewPosition(ScrollableExactApproximateExpressionsView::SubviewPosition::Center); + reinitSelection(); Container::activeApp()->setFirstResponder(&m_view); } +void ScrollableExactApproximateExpressionsCell::reinitSelection() { + ScrollableExactApproximateExpressionsView::SubviewPosition selectedSubview = m_view.displayCenter() ? ScrollableExactApproximateExpressionsView::SubviewPosition::Center : ScrollableExactApproximateExpressionsView::SubviewPosition::Right; + m_view.setSelectedSubviewPosition(selectedSubview); + reloadScroll(); +} + int ScrollableExactApproximateExpressionsCell::numberOfSubviews() const { return 1; } diff --git a/apps/shared/scrollable_exact_approximate_expressions_cell.h b/apps/shared/scrollable_exact_approximate_expressions_cell.h index dfaf7bd20..34beacbed 100644 --- a/apps/shared/scrollable_exact_approximate_expressions_cell.h +++ b/apps/shared/scrollable_exact_approximate_expressions_cell.h @@ -21,6 +21,7 @@ public: } Poincare::Layout layout() const override { return m_view.layout(); } void didBecomeFirstResponder() override; + void reinitSelection(); private: int numberOfSubviews() const override; View * subviewAtIndex(int index) override; diff --git a/apps/shared/scrollable_exact_approximate_expressions_view.cpp b/apps/shared/scrollable_exact_approximate_expressions_view.cpp index cf4ebde05..450d87a1e 100644 --- a/apps/shared/scrollable_exact_approximate_expressions_view.cpp +++ b/apps/shared/scrollable_exact_approximate_expressions_view.cpp @@ -169,7 +169,7 @@ void AbstractScrollableExactApproximateExpressionsView::setLayouts(Poincare::Lay if (updateLeftLayout || updateCenterLayout || updateRightLayout) { contentCell()->reloadTextColor(); contentCell()->layoutSubviews(); - reloadScroll(); + // Do no reload scroll here as 'setLayouts' is called every time the table is re-layout (when scrolling for instance) } } diff --git a/apps/shared/scrollable_exact_approximate_expressions_view.h b/apps/shared/scrollable_exact_approximate_expressions_view.h index 855db6b77..d71458800 100644 --- a/apps/shared/scrollable_exact_approximate_expressions_view.h +++ b/apps/shared/scrollable_exact_approximate_expressions_view.h @@ -24,6 +24,7 @@ public: void setSelectedSubviewPosition(SubviewPosition subviewPosition) { contentCell()->setSelectedSubviewPosition(subviewPosition); } + bool displayCenter() const { return constContentCell()->displayCenter(); } void setDisplayCenter(bool display); void reloadScroll(); bool handleEvent(Ion::Events::Event event) override; diff --git a/apps/solver/solutions_controller.cpp b/apps/solver/solutions_controller.cpp index 764f8df04..fc242b68f 100644 --- a/apps/solver/solutions_controller.cpp +++ b/apps/solver/solutions_controller.cpp @@ -121,6 +121,13 @@ void SolutionsController::viewWillAppear() { } } +void SolutionsController::didEnterResponderChain(Responder * previousFirstResponder) { + // Select the most left present subview on all cells and reinitialize scroll + for (int i = 0; i < EquationStore::k_maxNumberOfExactSolutions; i++) { + m_exactValueCells[i].reinitSelection(); + } +} + /* AlternateEmptyRowDelegate */ bool SolutionsController::isEmpty() const { diff --git a/apps/solver/solutions_controller.h b/apps/solver/solutions_controller.h index 8b366339d..1852ab249 100644 --- a/apps/solver/solutions_controller.h +++ b/apps/solver/solutions_controller.h @@ -15,6 +15,7 @@ public: const char * title() override; View * view() override; void viewWillAppear() override; + void didEnterResponderChain(Responder * previousFirstResponder) override; /* AlternateEmptyViewDefaultDelegate */ bool isEmpty() const override; virtual I18n::Message emptyMessage() override;