From 5e5e07e963769846fbf9dfa2ed8c29cf76b6142e Mon Sep 17 00:00:00 2001 From: Ruben Dashyan Date: Wed, 24 Apr 2019 16:47:46 +0200 Subject: [PATCH] [apps/shared] Factorize Store/ValuesController::textFieldDidFinishEditing --- .../editable_cell_table_view_controller.cpp | 13 ++++------ apps/shared/store_controller.cpp | 24 +++++-------------- apps/shared/values_controller.cpp | 18 ++++++++++++++ apps/shared/values_controller.h | 1 + 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/apps/shared/editable_cell_table_view_controller.cpp b/apps/shared/editable_cell_table_view_controller.cpp index ba635fc6e..f6ceaa6c0 100644 --- a/apps/shared/editable_cell_table_view_controller.cpp +++ b/apps/shared/editable_cell_table_view_controller.cpp @@ -31,18 +31,15 @@ bool EditableCellTableViewController::textFieldDidFinishEditing(TextField * text app()->displayWarning(I18n::Message::UndefinedValue); return false; } - int nbOfRows = numberOfRows(); - int nbOfColumns = numberOfColumns(); if (!setDataAtLocation(floatBody, selectedColumn(), selectedRow())) { app()->displayWarning(I18n::Message::ForbiddenValue); return false; } - for (int j = 0; j < numberOfColumns(); j++) { - selectableTableView()->reloadCellAtLocation(j, selectedRow()); - } - if (nbOfRows != numberOfRows() || nbOfColumns != numberOfColumns()) { - selectableTableView()->reloadData(); - } + /* 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. */ if (event == Ion::Events::EXE || event == Ion::Events::OK) { selectableTableView()->selectCellAtLocation(selectedColumn(), selectedRow()+1); } else { diff --git a/apps/shared/store_controller.cpp b/apps/shared/store_controller.cpp index 8352c627b..5fe16e690 100644 --- a/apps/shared/store_controller.cpp +++ b/apps/shared/store_controller.cpp @@ -95,25 +95,13 @@ bool StoreController::textFieldDidFinishEditing(TextField * textField, const cha } return true; } - AppsContainer * appsContainer = ((TextFieldDelegateApp *)app())->container(); - Context * globalContext = appsContainer->globalContext(); - double floatBody = PoincareHelpers::ApproximateToScalar(text, *globalContext); - if (std::isnan(floatBody) || std::isinf(floatBody)) { - app()->displayWarning(I18n::Message::UndefinedValue); - return false; + 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(); } - if (!setDataAtLocation(floatBody, selectedColumn(), selectedRow())) { - app()->displayWarning(I18n::Message::ForbiddenValue); - return false; - } - // FIXME Find out if redrawing errors can be suppressed without always reloading all the data - selectableTableView()->reloadData(); - if (event == Ion::Events::EXE || event == Ion::Events::OK) { - selectableTableView()->selectCellAtLocation(selectedColumn(), selectedRow()+1); - } else { - selectableTableView()->handleEvent(event); - } - return true; + return didFinishEditing; } bool StoreController::textFieldDidAbortEditing(TextField * textField) { diff --git a/apps/shared/values_controller.cpp b/apps/shared/values_controller.cpp index 994e6752a..542830b29 100644 --- a/apps/shared/values_controller.cpp +++ b/apps/shared/values_controller.cpp @@ -41,6 +41,24 @@ 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 0cab01c20..9d35418e0 100644 --- a/apps/shared/values_controller.h +++ b/apps/shared/values_controller.h @@ -16,6 +16,7 @@ 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;