diff --git a/apps/probability/calculation_controller.cpp b/apps/probability/calculation_controller.cpp index 3ce66b908..e422a3884 100644 --- a/apps/probability/calculation_controller.cpp +++ b/apps/probability/calculation_controller.cpp @@ -212,11 +212,8 @@ bool CalculationController::textFieldShouldFinishEditing(TextField * textField, } bool CalculationController::textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) { - App * probaApp = (App *)app(); - Context * globalContext = probaApp->container()->globalContext(); - double floatBody = PoincareHelpers::ApproximateToScalar(text, *globalContext); - if (std::isnan(floatBody) || std::isinf(floatBody)) { - app()->displayWarning(I18n::Message::UndefinedValue); + double floatBody; + if (textFieldDelegateApp()->hasUndefinedValue(text, floatBody)) { return false; } if (m_calculation->type() != Calculation::Type::FiniteIntegral && selectedColumn() == 2) { diff --git a/apps/sequence/list/list_parameter_controller.cpp b/apps/sequence/list/list_parameter_controller.cpp index ac36094be..5674f4837 100644 --- a/apps/sequence/list/list_parameter_controller.cpp +++ b/apps/sequence/list/list_parameter_controller.cpp @@ -72,14 +72,11 @@ bool ListParameterController::textFieldDidFinishEditing(TextField * textField, c static float maxFirstIndex = std::pow(10.0f, Sequence::k_initialRankNumberOfDigits) - 1.0f; /* -1 to take into account a double recursive sequence, which has * SecondIndex = FirstIndex + 1 */ - AppsContainer * appsContainer = ((TextFieldDelegateApp *)app())->container(); - Context * globalContext = appsContainer->globalContext(); - float floatBody = PoincareHelpers::ApproximateToScalar(text, *globalContext); - int index = std::round(floatBody); - if (std::isnan(floatBody) || std::isinf(floatBody)) { - app()->displayWarning(I18n::Message::UndefinedValue); + double floatBody; + if (textFieldDelegateApp()->hasUndefinedValue(text, floatBody)) { return false; } + int index = std::round(floatBody); if (index < 0 || floatBody >= maxFirstIndex) { app()->displayWarning(I18n::Message::ForbiddenValue); return false; diff --git a/apps/settings/sub_menu/display_mode_controller.cpp b/apps/settings/sub_menu/display_mode_controller.cpp index 86af72bde..945b0876a 100644 --- a/apps/settings/sub_menu/display_mode_controller.cpp +++ b/apps/settings/sub_menu/display_mode_controller.cpp @@ -76,10 +76,9 @@ bool DisplayModeController::textFieldShouldFinishEditing(TextField * textField, } bool DisplayModeController::textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) { - Context * globalContext = textFieldDelegateApp()->localContext(); - float floatBody = PoincareHelpers::ApproximateToScalar(text, *globalContext); - if (std::isnan(floatBody) || std::isinf(floatBody)) { - floatBody = PrintFloat::k_numberOfPrintedSignificantDigits; + double floatBody; + if (textFieldDelegateApp()->hasUndefinedValue(text, floatBody)) { + return false; } if (floatBody < 1) { floatBody = 1; diff --git a/apps/shared/editable_cell_table_view_controller.cpp b/apps/shared/editable_cell_table_view_controller.cpp index f6ceaa6c0..03049a14c 100644 --- a/apps/shared/editable_cell_table_view_controller.cpp +++ b/apps/shared/editable_cell_table_view_controller.cpp @@ -24,11 +24,8 @@ bool EditableCellTableViewController::textFieldShouldFinishEditing(TextField * t } bool EditableCellTableViewController::textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) { - 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); + double floatBody; + if (textFieldDelegateApp()->hasUndefinedValue(text, floatBody)) { return false; } if (!setDataAtLocation(floatBody, selectedColumn(), selectedRow())) { diff --git a/apps/shared/float_parameter_controller.cpp b/apps/shared/float_parameter_controller.cpp index 5c8392ace..3f210dce1 100644 --- a/apps/shared/float_parameter_controller.cpp +++ b/apps/shared/float_parameter_controller.cpp @@ -122,11 +122,8 @@ bool FloatParameterController::textFieldShouldFinishEditing(TextField * textFiel } bool FloatParameterController::textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) { - 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); + double floatBody; + if (textFieldDelegateApp()->hasUndefinedValue(text, floatBody)) { return false; } if (!setParameterAtIndex(selectedRow(), floatBody)) { diff --git a/apps/shared/sum_graph_controller.cpp b/apps/shared/sum_graph_controller.cpp index 4fac3e5fd..3181f0f08 100644 --- a/apps/shared/sum_graph_controller.cpp +++ b/apps/shared/sum_graph_controller.cpp @@ -91,11 +91,8 @@ void SumGraphController::setRecord(Ion::Storage::Record record) { } bool SumGraphController::textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) { - 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); + double floatBody; + if (textFieldDelegateApp()->hasUndefinedValue(text, floatBody)) { return false; } if ((m_step == Step::SecondParameter && floatBody < m_startSum) || !moveCursorHorizontallyToPosition(floatBody)) { diff --git a/apps/shared/text_field_delegate_app.cpp b/apps/shared/text_field_delegate_app.cpp index 720b6c0b1..b87a98b1b 100644 --- a/apps/shared/text_field_delegate_app.cpp +++ b/apps/shared/text_field_delegate_app.cpp @@ -41,6 +41,15 @@ bool TextFieldDelegateApp::isAcceptableText(const char * text) { return isAcceptableExpression(exp); } +bool TextFieldDelegateApp::hasUndefinedValue(const char * text, double & value) { + value = PoincareHelpers::ApproximateToScalar(text, *localContext()); + bool isUndefined = std::isnan(value) || std::isinf(value); + if (isUndefined) { + displayWarning(I18n::Message::UndefinedValue); + } + return isUndefined; +} + /* Protected */ TextFieldDelegateApp::TextFieldDelegateApp(Container * container, Snapshot * snapshot, ViewController * rootViewController) : diff --git a/apps/shared/text_field_delegate_app.h b/apps/shared/text_field_delegate_app.h index 20e6eb0e8..74885ad69 100644 --- a/apps/shared/text_field_delegate_app.h +++ b/apps/shared/text_field_delegate_app.h @@ -18,6 +18,7 @@ public: bool textFieldShouldFinishEditing(TextField * textField, Ion::Events::Event event) override; virtual bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override; bool isAcceptableText(const char * text); + bool hasUndefinedValue(const char * text, double & value); protected: TextFieldDelegateApp(Container * container, Snapshot * snapshot, ViewController * rootViewController); bool fieldDidReceiveEvent(EditableField * field, Responder * responder, Ion::Events::Event event);