diff --git a/apps/settings/sub_menu/display_mode_controller.cpp b/apps/settings/sub_menu/display_mode_controller.cpp index 4b5b3534d..7bb6e66b7 100644 --- a/apps/settings/sub_menu/display_mode_controller.cpp +++ b/apps/settings/sub_menu/display_mode_controller.cpp @@ -94,13 +94,5 @@ bool DisplayModeController::textFieldDidFinishEditing(TextField * textField, con } return true; } -int DisplayModeController::initialSelectedRow() const { - int row = selectedRow(); - /* If the significant number of digits row was selected, keep selecting it, - * else select the display mode currently used. */ - if (row == numberOfRows() - 1) { - return row; - } - return PreferencesController::initialSelectedRow(); -} + } diff --git a/apps/settings/sub_menu/display_mode_controller.h b/apps/settings/sub_menu/display_mode_controller.h index 07dd04ca3..343fcaef6 100644 --- a/apps/settings/sub_menu/display_mode_controller.h +++ b/apps/settings/sub_menu/display_mode_controller.h @@ -22,7 +22,6 @@ public: private: static constexpr int k_resultFormatType = 0; static constexpr int k_significantDigitsType = 1; - int initialSelectedRow() const override; MessageTableCellWithEditableTextWithSeparator m_editableCell; }; diff --git a/apps/settings/sub_menu/exam_mode_controller.cpp b/apps/settings/sub_menu/exam_mode_controller.cpp index c3af17a5c..349fb96aa 100644 --- a/apps/settings/sub_menu/exam_mode_controller.cpp +++ b/apps/settings/sub_menu/exam_mode_controller.cpp @@ -82,7 +82,12 @@ bool ExamModeController::handleEvent(Ion::Events::Event event) { } void ExamModeController::didEnterResponderChain(Responder * previousFirstResponder) { - GenericSubController::didEnterResponderChain(previousFirstResponder); + /* When a pop-up is dismissed, the exam mode status might have changed. We + * reload the selection as the number of rows might have also changed. We + * force to reload the entire data because they might have changed. */ + selectCellAtLocation(0, initialSelectedRow()); + m_selectableTableView.reloadData(); + // We add a message when the mode exam is on m_contentView.layoutSubviews(true); } @@ -111,4 +116,14 @@ void ExamModeController::willDisplayCellForIndex(HighlightCell * cell, int index } } +int ExamModeController::initialSelectedRow() const { + int row = selectedRow(); + if (row >= numberOfRows()) { + return numberOfRows()-1; + } else if (row < 0) { + return 0; + } + return row; +} + } diff --git a/apps/settings/sub_menu/exam_mode_controller.h b/apps/settings/sub_menu/exam_mode_controller.h index 38dfcf468..2e184cbe9 100644 --- a/apps/settings/sub_menu/exam_mode_controller.h +++ b/apps/settings/sub_menu/exam_mode_controller.h @@ -30,6 +30,7 @@ private: MessageTextView m_deactivateLine2; MessageTextView m_deactivateLine3; }; + int initialSelectedRow() const override; static constexpr int k_maxNumberOfCells = 2; ContentView m_contentView; MessageTableCell m_cell[k_maxNumberOfCells]; diff --git a/apps/settings/sub_menu/generic_sub_controller.cpp b/apps/settings/sub_menu/generic_sub_controller.cpp index f2f6a9ded..e1871cc3d 100644 --- a/apps/settings/sub_menu/generic_sub_controller.cpp +++ b/apps/settings/sub_menu/generic_sub_controller.cpp @@ -22,15 +22,22 @@ const char * GenericSubController::title() { return ""; } -void GenericSubController::didEnterResponderChain(Responder * previousFirstResponder) { - selectCellAtLocation(0, initialSelectedRow()); - m_selectableTableView.reloadData(); -} - void GenericSubController::didBecomeFirstResponder() { Container::activeApp()->setFirstResponder(&m_selectableTableView); } +void GenericSubController::viewWillAppear() { + /* This can't be done in didEnterResponderChain because we don't want it to + * be done everytime the pop-up disappears. For example, if we are editing a + * field and a pop-up shows up with a warning, we don't want to reload the + * entire table when dismissing the pop-up (that would erase the edition). */ + selectCellAtLocation(0, initialSelectedRow()); + /* A unique SubController is used for all sub pages of settings. We have to + * reload its data when it is displayed as it could switch from displaying + * "Angle unit" data to "Complex format" data for instance. */ + m_selectableTableView.reloadData(); +} + bool GenericSubController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::Left) { stackController()->pop(); @@ -83,14 +90,4 @@ StackViewController * GenericSubController::stackController() const { return (StackViewController *)parentResponder(); } -int GenericSubController::initialSelectedRow() const { - int row = selectedRow(); - if (row >= numberOfRows()) { - return numberOfRows()-1; - } else if (row < 0) { - return 0; - } - return row; -} - } diff --git a/apps/settings/sub_menu/generic_sub_controller.h b/apps/settings/sub_menu/generic_sub_controller.h index 744542838..b689f59b2 100644 --- a/apps/settings/sub_menu/generic_sub_controller.h +++ b/apps/settings/sub_menu/generic_sub_controller.h @@ -11,8 +11,8 @@ public: GenericSubController(Responder * parentResponder); const char * title() override; View * view() override { return &m_selectableTableView; } - void didEnterResponderChain(Responder * previousFirstResponder) override; void didBecomeFirstResponder() override; + void viewWillAppear() override; bool handleEvent(Ion::Events::Event event) override; int numberOfRows() const override; KDCoordinate rowHeight(int j) override; @@ -24,7 +24,7 @@ public: void viewDidDisappear() override; protected: StackViewController * stackController() const; - virtual int initialSelectedRow() const; + virtual int initialSelectedRow() const { return 0; } constexpr static KDCoordinate k_topBottomMargin = 13; SelectableTableView m_selectableTableView; MessageTree * m_messageTreeModel;