From 2e5ded2aa906491315f602b089a57cd570c059dd Mon Sep 17 00:00:00 2001 From: Ruben Dashyan Date: Thu, 22 Aug 2019 10:30:43 +0200 Subject: [PATCH] [apps/shared/editable_cell_table_view_controller] Factor textFieldDidFinishEditing --- .../editable_cell_table_view_controller.cpp | 17 ++++++++++++++--- apps/shared/store_controller.cpp | 8 +------- apps/shared/values_controller.cpp | 18 ------------------ apps/shared/values_controller.h | 1 - 4 files changed, 15 insertions(+), 29 deletions(-) diff --git a/apps/shared/editable_cell_table_view_controller.cpp b/apps/shared/editable_cell_table_view_controller.cpp index 951b889a9..77378f56b 100644 --- a/apps/shared/editable_cell_table_view_controller.cpp +++ b/apps/shared/editable_cell_table_view_controller.cpp @@ -28,20 +28,31 @@ bool EditableCellTableViewController::textFieldDidFinishEditing(TextField * text if (textFieldDelegateApp()->hasUndefinedValue(text, floatBody)) { return false; } + // Save attributes for later use + int column = selectedColumn(); + int previousRow = selectedRow(); + int previousNumberOfElementsInColumn = numberOfElementsInColumn(column); if (!setDataAtLocation(floatBody, selectedColumn(), selectedRow())) { Container::activeApp()->displayWarning(I18n::Message::ForbiddenValue); return false; } /* At this point, a new cell is selected depending on the event, before the * data is reloaded, which means that the right cell is selected but the data - * may be incorrect. The data is reloaded afterwards by the - * textFieldDidFinishEditing methods of the derived classes StoreController - * and ValuesController. */ + * may be incorrect. The data is reloaded afterwards. */ if (event == Ion::Events::EXE || event == Ion::Events::OK) { selectableTableView()->selectCellAtLocation(selectedColumn(), selectedRow()+1); } else { selectableTableView()->handleEvent(event); } + if (previousNumberOfElementsInColumn != numberOfElementsInColumn(column)) { + // Reload the whole table, if a value was appended. + selectableTableView()->reloadData(); + } else { + // Reload the row, if an existing value was edited. + for (int i = 0; i < numberOfColumns(); i++) { + selectableTableView()->reloadCellAtLocation(i, previousRow); + } + } return true; } diff --git a/apps/shared/store_controller.cpp b/apps/shared/store_controller.cpp index 3a99ec424..5b9226e17 100644 --- a/apps/shared/store_controller.cpp +++ b/apps/shared/store_controller.cpp @@ -93,13 +93,7 @@ bool StoreController::textFieldDidFinishEditing(TextField * textField, const cha } return true; } - bool didFinishEditing = EditableCellTableViewController::textFieldDidFinishEditing(textField, text, event); - if (didFinishEditing) { - // FIXME Find out if redrawing errors can be suppressed without always reloading all the data - // See Shared::ValuesController::textFieldDidFinishEditing - selectableTableView()->reloadData(); - } - return didFinishEditing; + return EditableCellTableViewController::textFieldDidFinishEditing(textField, text, event); } bool StoreController::textFieldDidAbortEditing(TextField * textField) { diff --git a/apps/shared/values_controller.cpp b/apps/shared/values_controller.cpp index faffcaee8..590837b0e 100644 --- a/apps/shared/values_controller.cpp +++ b/apps/shared/values_controller.cpp @@ -39,24 +39,6 @@ ValuesController::ValuesController(Responder * parentResponder, InputEventHandle } } -bool ValuesController::textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) { - int row = selectedRow(); - int nbOfRows = numberOfRows(); - bool didFinishEditing = EditableCellTableViewController::textFieldDidFinishEditing(textField, text, event); - if (didFinishEditing) { - if (nbOfRows != numberOfRows()) { - // Reload the whole table, if a value is appended. - selectableTableView()->reloadData(); - } else { - // Reload the row, if an existing value is edited. - for (int i = 0; i < numberOfColumns(); i++) { - selectableTableView()->reloadCellAtLocation(i, row); - } - } - } - return didFinishEditing; -} - const char * ValuesController::title() { return I18n::translate(I18n::Message::ValuesTab); } diff --git a/apps/shared/values_controller.h b/apps/shared/values_controller.h index 773a4ab7e..14a93aee5 100644 --- a/apps/shared/values_controller.h +++ b/apps/shared/values_controller.h @@ -16,7 +16,6 @@ namespace Shared { class ValuesController : public EditableCellTableViewController, public ButtonRowDelegate, public AlternateEmptyViewDefaultDelegate { public: ValuesController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, ButtonRowController * header, I18n::Message parameterTitle, IntervalParameterController * intervalParameterController, Interval * interval); - bool textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) override; const char * title() override; Interval * interval(); int numberOfColumns() override;