[apps/shared] Factorize Store/ValuesController::textFieldDidFinishEditing

This commit is contained in:
Ruben Dashyan
2019-04-24 16:47:46 +02:00
committed by Émilie Feral
parent a400a5024b
commit 5e5e07e963
4 changed files with 30 additions and 26 deletions

View File

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

View File

@@ -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<double>(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) {

View File

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

View File

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