From 0a823da78cde7c51a7f19c93acfe8a8160b44da3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 23 Oct 2018 14:29:12 +0200 Subject: [PATCH] [escher] Variable box pop-up is handle as Toolbox pop-up by asking InputEventHandlerDelegate --- apps/calculation/app.cpp | 4 ++-- apps/code/app.cpp | 9 ++++----- apps/code/app.h | 1 + apps/sequence/graph/term_sum_controller.cpp | 2 +- apps/sequence/graph/term_sum_controller.h | 2 +- apps/sequence/list/list_controller.cpp | 6 +++++- apps/sequence/list/list_controller.h | 6 ++++-- .../list/list_parameter_controller.cpp | 2 +- .../sequence/list/list_parameter_controller.h | 2 +- apps/shared/input_event_handler_delegate.h | 19 +++++++++++++++++++ .../input_event_handler_delegate_app.cpp | 6 ++++++ .../shared/input_event_handler_delegate_app.h | 1 + apps/shared/text_field_delegate_app.cpp | 19 +++---------------- apps/shared/text_field_delegate_app.h | 1 - escher/include/escher/input_event_handler.h | 4 +++- .../escher/input_event_handler_delegate.h | 2 ++ escher/include/escher/input_view_controller.h | 1 + escher/src/input_event_handler.cpp | 14 +++++++++----- escher/src/input_view_controller.cpp | 4 ++++ escher/src/layout_field.cpp | 10 ++++------ escher/src/text_area.cpp | 4 ++-- escher/src/text_field.cpp | 11 +++++------ 22 files changed, 79 insertions(+), 51 deletions(-) create mode 100644 apps/shared/input_event_handler_delegate.h diff --git a/apps/calculation/app.cpp b/apps/calculation/app.cpp index 5750ef81b..54b63d325 100644 --- a/apps/calculation/app.cpp +++ b/apps/calculation/app.cpp @@ -52,7 +52,7 @@ App::App(Container * container, Snapshot * snapshot) : } bool App::textFieldDidReceiveEvent(::TextField * textField, Ion::Events::Event event) { - if ((event == Ion::Events::Var || event == Ion::Events::XNT) && TextFieldDelegateApp::textFieldDidReceiveEvent(textField, event)) { + if (event == Ion::Events::XNT && TextFieldDelegateApp::textFieldDidReceiveEvent(textField, event)) { return true; } if (textField->isEditing() && textField->shouldFinishEditing(event)) { @@ -68,7 +68,7 @@ bool App::textFieldDidReceiveEvent(::TextField * textField, Ion::Events::Event e } bool App::layoutFieldDidReceiveEvent(::LayoutField * layoutField, Ion::Events::Event event) { - if ((event == Ion::Events::Var || event == Ion::Events::XNT) && ExpressionFieldDelegateApp::layoutFieldDidReceiveEvent(layoutField, event)) { + if (event == Ion::Events::XNT && ExpressionFieldDelegateApp::layoutFieldDidReceiveEvent(layoutField, event)) { return true; } if (layoutField->isEditing() && layoutField->shouldFinishEditing(event)) { diff --git a/apps/code/app.cpp b/apps/code/app.cpp index ed956a5dd..64ef47859 100644 --- a/apps/code/app.cpp +++ b/apps/code/app.cpp @@ -113,17 +113,16 @@ Toolbox * App::toolboxForInputEventHandler(InputEventHandler * textInput) { return &m_toolbox; } +NestedMenuController * App::variableBoxForInputEventHandler(InputEventHandler * textInput) { + return &m_variableBoxController; +} + bool App::textInputDidReceiveEvent(InputEventHandler * textInput, Ion::Events::Event event) { const char * pythonText = Helpers::PythonTextForEvent(event); if (pythonText != nullptr) { textInput->handleEventWithText(pythonText); return true; } - if (event == Ion::Events::Var) { - m_variableBoxController.setSender(textInput); - displayModalViewController(&m_variableBoxController, 0.f, 0.f, Metric::PopUpTopMargin, Metric::PopUpLeftMargin, 0, Metric::PopUpRightMargin); - return true; - } return false; } diff --git a/apps/code/app.h b/apps/code/app.h index de7dd3f19..af4336713 100644 --- a/apps/code/app.h +++ b/apps/code/app.h @@ -46,6 +46,7 @@ public: /* InputEventHandlerDelegate */ Toolbox * toolboxForInputEventHandler(InputEventHandler * textInput) override; + NestedMenuController * variableBoxForInputEventHandler(InputEventHandler * textInput) override; bool textInputDidReceiveEvent(InputEventHandler * textInput, Ion::Events::Event event); // Python delegate diff --git a/apps/sequence/graph/term_sum_controller.cpp b/apps/sequence/graph/term_sum_controller.cpp index 24ecb3371..8a006eb24 100644 --- a/apps/sequence/graph/term_sum_controller.cpp +++ b/apps/sequence/graph/term_sum_controller.cpp @@ -17,7 +17,7 @@ using namespace Poincare; namespace Sequence { -TermSumController::TermSumController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, GraphView * graphView, CurveViewRange * graphRange, CurveViewCursor * cursor) : +TermSumController::TermSumController(Responder * parentResponder, ::InputEventHandlerDelegate * inputEventHandlerDelegate, GraphView * graphView, CurveViewRange * graphRange, CurveViewCursor * cursor) : SumGraphController(parentResponder, inputEventHandlerDelegate, graphView, graphRange, cursor, Ion::Charset::CapitalSigma) { } diff --git a/apps/sequence/graph/term_sum_controller.h b/apps/sequence/graph/term_sum_controller.h index 4739d73aa..df3acf423 100644 --- a/apps/sequence/graph/term_sum_controller.h +++ b/apps/sequence/graph/term_sum_controller.h @@ -11,7 +11,7 @@ namespace Sequence { class TermSumController : public Shared::SumGraphController { public: - TermSumController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, GraphView * graphView, CurveViewRange * graphRange, Shared::CurveViewCursor * cursor); + TermSumController(Responder * parentResponder, ::InputEventHandlerDelegate * inputEventHandlerDelegate, GraphView * graphView, CurveViewRange * graphRange, Shared::CurveViewCursor * cursor); const char * title() override; private: bool moveCursorHorizontallyToPosition(double position) override; diff --git a/apps/sequence/list/list_controller.cpp b/apps/sequence/list/list_controller.cpp index 8a8041aa6..947d03838 100644 --- a/apps/sequence/list/list_controller.cpp +++ b/apps/sequence/list/list_controller.cpp @@ -9,7 +9,7 @@ using namespace Poincare; namespace Sequence { -ListController::ListController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, SequenceStore * sequenceStore, ButtonRowController * header, ButtonRowController * footer) : +ListController::ListController(Responder * parentResponder, ::InputEventHandlerDelegate * inputEventHandlerDelegate, SequenceStore * sequenceStore, ButtonRowController * header, ButtonRowController * footer) : Shared::FunctionListController(parentResponder, sequenceStore, header, footer, I18n::Message::AddSequence), m_sequenceStore(sequenceStore), m_sequenceTitleCells{}, @@ -40,6 +40,10 @@ ExpressionFieldDelegateApp * ListController::expressionFieldDelegateApp() { return (App *)app(); } +InputEventHandlerDelegateApp * ListController::inputEventHandlerDelegateApp() { + return (App *)app(); +} + int ListController::numberOfExpressionRows() { int numberOfRows = 0; for (int i = 0; i < m_sequenceStore->numberOfModels(); i++) { diff --git a/apps/sequence/list/list_controller.h b/apps/sequence/list/list_controller.h index 88a393607..0b8453a19 100644 --- a/apps/sequence/list/list_controller.h +++ b/apps/sequence/list/list_controller.h @@ -6,6 +6,7 @@ #include "../sequence_store.h" #include "../../shared/function_expression_cell.h" #include "../../shared/function_list_controller.h" +#include "../../shared/input_event_handler_delegate.h" #include "../../shared/layout_field_delegate.h" #include "../../shared/text_field_delegate.h" #include "list_parameter_controller.h" @@ -14,9 +15,9 @@ namespace Sequence { -class ListController : public Shared::FunctionListController, public InputEventHandlerDelegate, public Shared::TextFieldDelegate, public Shared::LayoutFieldDelegate { +class ListController : public Shared::FunctionListController, public Shared::InputEventHandlerDelegate, public Shared::TextFieldDelegate, public Shared::LayoutFieldDelegate { public: - ListController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, SequenceStore * sequenceStore, ButtonRowController * header, ButtonRowController * footer); + ListController(Responder * parentResponder, ::InputEventHandlerDelegate * inputEventHandlerDelegate, SequenceStore * sequenceStore, ButtonRowController * header, ButtonRowController * footer); const char * title() override; int numberOfExpressionRows() override; KDCoordinate expressionRowHeight(int j) override; @@ -29,6 +30,7 @@ private: Toolbox * toolboxForSender(InputEventHandler * sender); Shared::TextFieldDelegateApp * textFieldDelegateApp() override; Shared::ExpressionFieldDelegateApp * expressionFieldDelegateApp() override; + Shared::InputEventHandlerDelegateApp * inputEventHandlerDelegateApp() override; ListParameterController * parameterController() override; int maxNumberOfRows() override; Shared::FunctionTitleCell * titleCells(int index) override; diff --git a/apps/sequence/list/list_parameter_controller.cpp b/apps/sequence/list/list_parameter_controller.cpp index a83b4f1a9..a4c94e3b3 100644 --- a/apps/sequence/list/list_parameter_controller.cpp +++ b/apps/sequence/list/list_parameter_controller.cpp @@ -9,7 +9,7 @@ using namespace Shared; namespace Sequence { -ListParameterController::ListParameterController(InputEventHandlerDelegate * inputEventHandlerDelegate, ListController * listController, SequenceStore * sequenceStore) : +ListParameterController::ListParameterController(::InputEventHandlerDelegate * inputEventHandlerDelegate, ListController * listController, SequenceStore * sequenceStore) : Shared::ListParameterController(listController, sequenceStore, I18n::Message::SequenceColor, I18n::Message::DeleteSequence, this), m_typeCell(I18n::Message::SequenceType), m_initialRankCell(&m_selectableTableView, inputEventHandlerDelegate, this, m_draftTextBuffer, I18n::Message::FirstTermIndex), diff --git a/apps/sequence/list/list_parameter_controller.h b/apps/sequence/list/list_parameter_controller.h index a4902f744..85e2b510c 100644 --- a/apps/sequence/list/list_parameter_controller.h +++ b/apps/sequence/list/list_parameter_controller.h @@ -13,7 +13,7 @@ class ListController; class ListParameterController : public Shared::ListParameterController, public SelectableTableViewDelegate, public Shared::ParameterTextFieldDelegate { public: - ListParameterController(InputEventHandlerDelegate * inputEventHandlerDelegate, ListController * list, SequenceStore * sequenceStore); + ListParameterController(::InputEventHandlerDelegate * inputEventHandlerDelegate, ListController * list, SequenceStore * sequenceStore); const char * title() override; bool handleEvent(Ion::Events::Event event) override; void setFunction(Shared::Function * function) override; diff --git a/apps/shared/input_event_handler_delegate.h b/apps/shared/input_event_handler_delegate.h new file mode 100644 index 000000000..3fadd27fe --- /dev/null +++ b/apps/shared/input_event_handler_delegate.h @@ -0,0 +1,19 @@ +#ifndef SHARED_INPUT_EVENT_HANDLER_DELEGATE_H +#define SHARED_INPUT_EVENT_HANDLER_DELEGATE_H + +#include +#include "input_event_handler_delegate_app.h" + +namespace Shared { + +class InputEventHandlerDelegate : public ::InputEventHandlerDelegate { +public: + Toolbox * toolboxForInputEventHandler(InputEventHandler * textInput) override { return inputEventHandlerDelegateApp()->toolboxForInputEventHandler(textInput); } + NestedMenuController * variableBoxForInputEventHandler(InputEventHandler * textInput) override { return inputEventHandlerDelegateApp()->variableBoxForInputEventHandler(textInput); } +private: + virtual InputEventHandlerDelegateApp * inputEventHandlerDelegateApp() = 0; +}; + +} + +#endif diff --git a/apps/shared/input_event_handler_delegate_app.cpp b/apps/shared/input_event_handler_delegate_app.cpp index cfbe2e105..cf3b42e53 100644 --- a/apps/shared/input_event_handler_delegate_app.cpp +++ b/apps/shared/input_event_handler_delegate_app.cpp @@ -23,4 +23,10 @@ Toolbox * InputEventHandlerDelegateApp::toolboxForInputEventHandler(InputEventHa return toolbox; } +NestedMenuController * InputEventHandlerDelegateApp::variableBoxForInputEventHandler(InputEventHandler * textInput) { + VariableBoxController * varBox = container()->variableBoxController(); + varBox->setSender(textInput); + return varBox; +} + } diff --git a/apps/shared/input_event_handler_delegate_app.h b/apps/shared/input_event_handler_delegate_app.h index c0a1359c9..75f502988 100644 --- a/apps/shared/input_event_handler_delegate_app.h +++ b/apps/shared/input_event_handler_delegate_app.h @@ -12,6 +12,7 @@ public: virtual ~InputEventHandlerDelegateApp() = default; AppsContainer * container(); Toolbox * toolboxForInputEventHandler(InputEventHandler * textInput) override; + NestedMenuController * variableBoxForInputEventHandler(InputEventHandler * textInput) override; protected: InputEventHandlerDelegateApp(Container * container, Snapshot * snapshot, ViewController * rootViewController); }; diff --git a/apps/shared/text_field_delegate_app.cpp b/apps/shared/text_field_delegate_app.cpp index fdf4745b9..fd52d0789 100644 --- a/apps/shared/text_field_delegate_app.cpp +++ b/apps/shared/text_field_delegate_app.cpp @@ -40,29 +40,16 @@ bool TextFieldDelegateApp::textFieldDidReceiveEvent(TextField * textField, Ion:: /* Protected */ bool TextFieldDelegateApp::fieldDidReceiveEvent(EditableField * field, Responder * responder, Ion::Events::Event event) { - if (event == Ion::Events::Var) { - forceEdition(field); - AppsContainer * appsContainer = (AppsContainer *)responder->app()->container(); - VariableBoxController * variableBoxController = appsContainer->variableBoxController(); - variableBoxController->setSender(field); - responder->app()->displayModalViewController(variableBoxController, 0.f, 0.f, Metric::PopUpTopMargin, Metric::PopUpLeftMargin, 0, Metric::PopUpRightMargin); - return true; - - } if (event == Ion::Events::XNT) { - forceEdition(field); + if (!field->isEditing()) { + field->setEditing(true); + } const char xnt[2] = {field->XNTChar(XNT()), 0}; return field->handleEventWithText(xnt); } return false; } -void TextFieldDelegateApp::forceEdition(EditableField * field) { - if (!field->isEditing()) { - field->setEditing(true); - } -} - bool TextFieldDelegateApp::isFinishingEvent(Ion::Events::Event event) { return event == Ion::Events::OK || event == Ion::Events::EXE; } diff --git a/apps/shared/text_field_delegate_app.h b/apps/shared/text_field_delegate_app.h index e8277d966..91e76a651 100644 --- a/apps/shared/text_field_delegate_app.h +++ b/apps/shared/text_field_delegate_app.h @@ -21,7 +21,6 @@ protected: TextFieldDelegateApp(Container * container, Snapshot * snapshot, ViewController * rootViewController); protected: bool fieldDidReceiveEvent(EditableField * field, Responder * responder, Ion::Events::Event event); - void forceEdition(EditableField * field); bool isFinishingEvent(Ion::Events::Event event); bool unparsableText(const char * text, Responder * responder); }; diff --git a/escher/include/escher/input_event_handler.h b/escher/include/escher/input_event_handler.h index 395ff3cf5..b413eef6d 100644 --- a/escher/include/escher/input_event_handler.h +++ b/escher/include/escher/input_event_handler.h @@ -1,6 +1,8 @@ #ifndef ESCHER_INPUT_EVENT_HANDLER_H #define ESCHER_INPUT_EVENT_HANDLER_H +#include + class InputEventHandlerDelegate; class App; @@ -9,7 +11,7 @@ public: InputEventHandler(InputEventHandlerDelegate * inputEventHandlerdelegate) : m_inputEventHandlerDelegate(inputEventHandlerdelegate) {} virtual bool handleEventWithText(const char * text, bool indentation = false, bool forceCursorRightOfText = false) { return false; } protected: - bool handleToolboxEvent(App * app); + bool handleBoxEvent(App * app, Ion::Events::Event event); InputEventHandlerDelegate * m_inputEventHandlerDelegate; }; diff --git a/escher/include/escher/input_event_handler_delegate.h b/escher/include/escher/input_event_handler_delegate.h index 900fa165a..cc16d2433 100644 --- a/escher/include/escher/input_event_handler_delegate.h +++ b/escher/include/escher/input_event_handler_delegate.h @@ -3,10 +3,12 @@ class InputEventHandler; class Toolbox; +class NestedMenuController; class InputEventHandlerDelegate { public: virtual Toolbox * toolboxForInputEventHandler(InputEventHandler * textInput) = 0; + virtual NestedMenuController * variableBoxForInputEventHandler(InputEventHandler * textInput) = 0; }; #endif diff --git a/escher/include/escher/input_view_controller.h b/escher/include/escher/input_view_controller.h index 879c7ffd5..e5cf99004 100644 --- a/escher/include/escher/input_view_controller.h +++ b/escher/include/escher/input_view_controller.h @@ -35,6 +35,7 @@ public: /* InputEventHandlerDelegate */ Toolbox * toolboxForInputEventHandler(InputEventHandler * handler) override; + NestedMenuController * variableBoxForInputEventHandler(InputEventHandler * handler) override; private: class ExpressionFieldController : public ViewController { public: diff --git a/escher/src/input_event_handler.cpp b/escher/src/input_event_handler.cpp index d2291c167..aa2f2a0af 100644 --- a/escher/src/input_event_handler.cpp +++ b/escher/src/input_event_handler.cpp @@ -4,11 +4,15 @@ #include #include -bool InputEventHandler::handleToolboxEvent(App * app) { - if (m_inputEventHandlerDelegate != nullptr) { - Toolbox * toolbox = m_inputEventHandlerDelegate->toolboxForInputEventHandler(this); - toolbox->setSender(this); - app->displayModalViewController(toolbox, 0.f, 0.f, Metric::PopUpTopMargin, Metric::PopUpLeftMargin, 0, Metric::PopUpRightMargin); +bool InputEventHandler::handleBoxEvent(App * app, Ion::Events::Event event) { + NestedMenuController * box = nullptr; + if (m_inputEventHandlerDelegate) { + box = event == Ion::Events::Toolbox ? m_inputEventHandlerDelegate->toolboxForInputEventHandler(this) : box; + box = event == Ion::Events::Var ? m_inputEventHandlerDelegate->variableBoxForInputEventHandler(this) : box; + } + if (box) { + box->setSender(this); + app->displayModalViewController(box, 0.f, 0.f, Metric::PopUpTopMargin, Metric::PopUpLeftMargin, 0, Metric::PopUpRightMargin); return true; } return false; diff --git a/escher/src/input_view_controller.cpp b/escher/src/input_view_controller.cpp index dd001cb96..7c52476d1 100644 --- a/escher/src/input_view_controller.cpp +++ b/escher/src/input_view_controller.cpp @@ -99,6 +99,10 @@ Toolbox * InputViewController::toolboxForInputEventHandler(InputEventHandler * h return m_inputEventHandlerDelegate->toolboxForInputEventHandler(handler); } +NestedMenuController * InputViewController::variableBoxForInputEventHandler(InputEventHandler * handler) { + return m_inputEventHandlerDelegate->variableBoxForInputEventHandler(handler); +} + void InputViewController::inputViewDidFinishEditing() { m_successAction.perform(this); dismissModalViewController(); diff --git a/escher/src/layout_field.cpp b/escher/src/layout_field.cpp index e4ed9e906..7e4f03345 100644 --- a/escher/src/layout_field.cpp +++ b/escher/src/layout_field.cpp @@ -185,13 +185,11 @@ bool LayoutField::privateHandleEvent(Ion::Events::Event event) { if (m_delegate && m_delegate->layoutFieldDidReceiveEvent(this, event)) { return true; } - if (event == Ion::Events::Toolbox) { - if (handleToolboxEvent(app())) { - if (!isEditing()) { - setEditing(true); - } - return true; + if (handleBoxEvent(app(), event)) { + if (!isEditing()) { + setEditing(true); } + return true; } if (isEditing() && m_delegate->layoutFieldShouldFinishEditing(this, event)) { //TODO use class method? setEditing(false); diff --git a/escher/src/text_area.cpp b/escher/src/text_area.cpp index 0723270fa..e9084892c 100644 --- a/escher/src/text_area.cpp +++ b/escher/src/text_area.cpp @@ -51,8 +51,8 @@ bool TextArea::handleEventWithText(const char * text, bool indentation, bool for bool TextArea::handleEvent(Ion::Events::Event event) { if (m_delegate != nullptr && m_delegate->textAreaDidReceiveEvent(this, event)) { return true; - } else if (event == Ion::Events::Toolbox) { - return handleToolboxEvent(app()); + } else if (handleBoxEvent(app(), event)) { + return true; } else if (event == Ion::Events::Left) { return setCursorLocation(cursorLocation()-1); } else if (event == Ion::Events::Right) { diff --git a/escher/src/text_field.cpp b/escher/src/text_field.cpp index 8702994dd..b0ea1d7a5 100644 --- a/escher/src/text_field.cpp +++ b/escher/src/text_field.cpp @@ -229,13 +229,12 @@ void TextField::setEditing(bool isEditing, bool reinitDrafBuffer) { } bool TextField::privateHandleEvent(Ion::Events::Event event) { - if (event == Ion::Events::Toolbox) { - if (handleToolboxEvent(app())) { - if (!isEditing()) { - setEditing(true); - } - return true; + // Handle Toolbox or Var event + if (handleBoxEvent(app(), event)) { + if (!isEditing()) { + setEditing(true); } + return true; } if (event == Ion::Events::Left && isEditing() && cursorLocation() > 0) { return setCursorLocation(cursorLocation()-1);