[apps/settings] Fix sub controller viewWillAppear /

didEnterResponderChain behaviours

This fixes the following bug: when editing the number of significant
digits, input "1+", click on "OK", the data was reloaded and "1+"
disappeared...
This commit is contained in:
Émilie Feral
2020-02-05 12:05:09 +01:00
committed by Léa Saviot
parent 4e6411e4a5
commit 2470821a6b
6 changed files with 32 additions and 28 deletions

View File

@@ -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();
}
}

View File

@@ -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;
};

View File

@@ -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;
}
}

View File

@@ -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];

View File

@@ -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;
}
}

View File

@@ -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;