From c584d1fb4e05bd18291208f54931bbd1625a2f98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Wed, 15 Feb 2017 17:53:13 +0100 Subject: [PATCH] [escher] Add toolbox event handling in responder [apps] Correct the text field delegate app accordingly Change-Id: I180fe53aaa1e0929b357d3985f584937fba2ecca --- .../edit_expression_controller.cpp | 11 +-- apps/calculation/edit_expression_controller.h | 5 +- apps/probability/calculation_controller.cpp | 10 +-- apps/probability/calculation_controller.h | 5 +- apps/shared/Makefile | 2 +- .../editable_cell_table_view_controller.cpp | 10 +-- .../editable_cell_table_view_controller.h | 3 +- .../shared/expression_text_field_delegate.cpp | 83 ------------------- apps/shared/expression_text_field_delegate.h | 20 ----- apps/shared/float_parameter_controller.cpp | 9 +- apps/shared/float_parameter_controller.h | 4 +- apps/shared/text_field_delegate.cpp | 15 ++++ apps/shared/text_field_delegate.h | 20 +++++ apps/shared/text_field_delegate_app.cpp | 74 ++++++++++++++++- apps/shared/text_field_delegate_app.h | 11 ++- escher/include/escher/input_view_controller.h | 1 + escher/include/escher/responder.h | 2 + escher/include/escher/text_field.h | 1 + escher/include/escher/text_field_delegate.h | 1 + escher/src/input_view_controller.cpp | 4 + escher/src/responder.cpp | 10 +++ escher/src/text_field.cpp | 10 +++ 22 files changed, 175 insertions(+), 136 deletions(-) delete mode 100644 apps/shared/expression_text_field_delegate.cpp delete mode 100644 apps/shared/expression_text_field_delegate.h create mode 100644 apps/shared/text_field_delegate.cpp create mode 100644 apps/shared/text_field_delegate.h diff --git a/apps/calculation/edit_expression_controller.cpp b/apps/calculation/edit_expression_controller.cpp index 0665e29e2..bcc98cbc0 100644 --- a/apps/calculation/edit_expression_controller.cpp +++ b/apps/calculation/edit_expression_controller.cpp @@ -3,6 +3,8 @@ #include "../apps_container.h" #include +using namespace Shared; + namespace Calculation { EditExpressionController::ContentView::ContentView(Responder * parentResponder, TableView * subview, TextFieldDelegate * textFieldDelegate) : @@ -75,11 +77,6 @@ void EditExpressionController::didBecomeFirstResponder() { app()->setFirstResponder(m_contentView.textField()); } -bool EditExpressionController::textFieldDidReceiveEvent(::TextField * textField, Ion::Events::Event event) { - App * myApp = (App *)app(); - return myApp->textFieldDidReceiveEvent(textField, event); -} - bool EditExpressionController::textFieldDidFinishEditing(::TextField * textField, const char * text) { App * calculationApp = (App *)app(); m_calculationStore->push(textBody(), calculationApp->localContext()); @@ -89,4 +86,8 @@ bool EditExpressionController::textFieldDidFinishEditing(::TextField * textField return true; } +TextFieldDelegateApp * EditExpressionController::textFieldDelegateApp() { + return (App *)app(); +} + } diff --git a/apps/calculation/edit_expression_controller.h b/apps/calculation/edit_expression_controller.h index 47b817037..ca1632587 100644 --- a/apps/calculation/edit_expression_controller.h +++ b/apps/calculation/edit_expression_controller.h @@ -5,11 +5,12 @@ #include "history_controller.h" #include "calculation_store.h" #include "text_field.h" +#include "../shared/text_field_delegate.h" namespace Calculation { class HistoryController; -class EditExpressionController : public ViewController, public TextFieldDelegate { +class EditExpressionController : public ViewController, public Shared::TextFieldDelegate { public: EditExpressionController(Responder * parentResponder, HistoryController * historyController, CalculationStore * calculationStore); View * view() override; @@ -18,7 +19,6 @@ public: bool handleEvent(Ion::Events::Event event) override; const char * textBody(); void setTextBody(const char * text); - bool textFieldDidReceiveEvent(::TextField * textField, Ion::Events::Event event) override; bool textFieldDidFinishEditing(::TextField * textField, const char * text) override; private: class ContentView : public View { @@ -35,6 +35,7 @@ private: TextField m_textField; char m_textBody[255]; }; + Shared::TextFieldDelegateApp * textFieldDelegateApp() override; ContentView m_contentView; HistoryController * m_historyController; CalculationStore * m_calculationStore; diff --git a/apps/probability/calculation_controller.cpp b/apps/probability/calculation_controller.cpp index ea4995a26..0cc2751e8 100644 --- a/apps/probability/calculation_controller.cpp +++ b/apps/probability/calculation_controller.cpp @@ -7,6 +7,7 @@ #include using namespace Poincare; +using namespace Shared; namespace Probability { @@ -198,11 +199,6 @@ bool CalculationController::handleEvent(Ion::Events::Event event) { return false; } -bool CalculationController::textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) { - App * myApp = (App *)app(); - return myApp->textFieldDidReceiveEvent(textField, event); -} - bool CalculationController::textFieldDidFinishEditing(TextField * textField, const char * text) { App * probaApp = (App *)app(); Context * globalContext = probaApp->container()->globalContext(); @@ -251,4 +247,8 @@ void CalculationController::updateTitle() { m_titleBuffer[currentChar-1] = 0; } +TextFieldDelegateApp * CalculationController::textFieldDelegateApp() { + return (App *)app(); +} + } diff --git a/apps/probability/calculation_controller.h b/apps/probability/calculation_controller.h index 512f4fab6..2b813dd45 100644 --- a/apps/probability/calculation_controller.h +++ b/apps/probability/calculation_controller.h @@ -6,10 +6,11 @@ #include "law_curve_view.h" #include "image_table_view.h" #include "calculation/calculation.h" +#include "../shared/text_field_delegate.h" namespace Probability { -class CalculationController : public ViewController, public TextFieldDelegate { +class CalculationController : public ViewController, public Shared::TextFieldDelegate { public: CalculationController(Responder * parentResponder); View * view() override; @@ -20,10 +21,10 @@ public: bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; void selectSubview(int subviewIndex); - bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override; bool textFieldDidFinishEditing(TextField * textField, const char * text) override; private: void updateTitle(); + Shared::TextFieldDelegateApp * textFieldDelegateApp() override; Calculation * m_calculation; class ContentView : public View { public: diff --git a/apps/shared/Makefile b/apps/shared/Makefile index 124619933..0c0d86f82 100644 --- a/apps/shared/Makefile +++ b/apps/shared/Makefile @@ -5,7 +5,6 @@ app_objs += $(addprefix apps/shared/,\ curve_view_cursor.o\ curve_view_range.o\ editable_cell_table_view_controller.o\ - expression_text_field_delegate.o\ float_pair_store.o\ float_parameter_controller.o\ function.o\ @@ -20,6 +19,7 @@ app_objs += $(addprefix apps/shared/,\ range_parameter_controller.o\ store_controller.o\ store_parameter_controller.o\ + text_field_delegate.o\ text_field_delegate_app.o\ zoom_parameter_controller.o\ ) diff --git a/apps/shared/editable_cell_table_view_controller.cpp b/apps/shared/editable_cell_table_view_controller.cpp index c9f7c8e37..679d74e13 100644 --- a/apps/shared/editable_cell_table_view_controller.cpp +++ b/apps/shared/editable_cell_table_view_controller.cpp @@ -19,11 +19,6 @@ View * EditableCellTableViewController::view() { return &m_selectableTableView; } -bool EditableCellTableViewController::textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) { - TextFieldDelegateApp * myApp = (TextFieldDelegateApp *)app(); - return myApp->textFieldDidReceiveEvent(textField, event); -} - bool EditableCellTableViewController::textFieldDidFinishEditing(TextField * textField, const char * text) { AppsContainer * appsContainer = ((TextFieldDelegateApp *)app())->container(); Context * globalContext = appsContainer->globalContext(); @@ -105,9 +100,12 @@ void EditableCellTableViewController::didBecomeFirstResponder() { app()->setFirstResponder(&m_selectableTableView); } - void EditableCellTableViewController::viewWillAppear() { m_selectableTableView.reloadData(); } +TextFieldDelegateApp * EditableCellTableViewController::textFieldDelegateApp() { + return (TextFieldDelegateApp *)app(); +} + } diff --git a/apps/shared/editable_cell_table_view_controller.h b/apps/shared/editable_cell_table_view_controller.h index 985f09c3f..0980531c1 100644 --- a/apps/shared/editable_cell_table_view_controller.h +++ b/apps/shared/editable_cell_table_view_controller.h @@ -3,6 +3,7 @@ #include #include +#include "text_field_delegate.h" namespace Shared { @@ -12,7 +13,6 @@ public: KDCoordinate rightMargin, KDCoordinate bottomMargin, KDCoordinate leftMargin); virtual View * view() override; - bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override; bool textFieldDidFinishEditing(TextField * textField, const char * text) override; void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) override; @@ -27,6 +27,7 @@ public: protected: SelectableTableView m_selectableTableView; private: + TextFieldDelegateApp * textFieldDelegateApp() override; static constexpr KDCoordinate k_cellHeight = 20; virtual bool cellAtLocationIsEditable(int columnIndex, int rowIndex) = 0; virtual void setDataAtLocation(float floatBody, int columnIndex, int rowIndex) = 0; diff --git a/apps/shared/expression_text_field_delegate.cpp b/apps/shared/expression_text_field_delegate.cpp deleted file mode 100644 index 3961b7884..000000000 --- a/apps/shared/expression_text_field_delegate.cpp +++ /dev/null @@ -1,83 +0,0 @@ -#include "expression_text_field_delegate.h" -#include "../apps_container.h" -#include -#include - -using namespace Poincare; - -namespace Shared { - -const char * ExpressionTextFieldDelegate::XNT() { - return "x"; -} - -bool ExpressionTextFieldDelegate::cursorInToken(TextField * textField, const char * token) { - const char * text = textField->text(); - int location = textField->cursorLocation(); - int tokenLength = strlen(token); - while (text[location] != '(') { - location --; - } - if (location - tokenLength < 0) { - return false; - } - char previousToken[10]; - strlcpy(previousToken, text+location-tokenLength, tokenLength+1); - if (strcmp(previousToken, token) == 0) { - return true; - } - return false; -} - -bool ExpressionTextFieldDelegate::textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) { - if (event == Ion::Events::OK && textField->isEditing()) { - Expression * exp = Expression::parse(textField->text()); - if (exp == nullptr) { - if (textField->textLength() == 0) { - return true; - } - textField->app()->displayWarning("Attention a la syntaxe jeune padawan"); - return true; - } - Expression * evaluation = exp->evaluate(*localContext()); - if (evaluation == nullptr) { - delete exp; - textField->app()->displayWarning("Relis ton cours de maths, veux tu?"); - return true; - } else { - delete evaluation; - delete exp; - } - } - if (event == Ion::Events::Toolbox) { - AppsContainer * appsContainer = (AppsContainer *)textField->app()->container(); - MathToolbox * toolboxController = appsContainer->mathToolbox(); - toolboxController->setSender(textField); - textField->app()->displayModalViewController(toolboxController, 0.f, 0.f, 50, 50, 0, 50); - return true; - } - if (event == Ion::Events::Var) { - AppsContainer * appsContainer = (AppsContainer *)textField->app()->container(); - VariableBoxController * variableBoxController = appsContainer->variableBoxController(); - variableBoxController->setTextFieldCaller(textField); - textField->app()->displayModalViewController(variableBoxController, 0.f, 0.f, 50, 50, 0, 50); - return true; - } - if (event == Ion::Events::XNT) { - if (!textField->isEditing()) { - textField->setEditing(true); - textField->setText(""); - } - if (cursorInToken(textField, "sum") || cursorInToken(textField, "product")) { - textField->insertTextAtLocation("n", textField->cursorLocation()); - textField->setCursorLocation(textField->cursorLocation()+strlen("n")); - return true; - } - textField->insertTextAtLocation(XNT(), textField->cursorLocation()); - textField->setCursorLocation(textField->cursorLocation()+strlen(XNT())); - return true; - } - return false; -} - -} diff --git a/apps/shared/expression_text_field_delegate.h b/apps/shared/expression_text_field_delegate.h deleted file mode 100644 index a94bebb51..000000000 --- a/apps/shared/expression_text_field_delegate.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef SHARED_EXPRESSION_TEXT_FIELD_DELEGATE_H -#define SHARED_EXPRESSION_TEXT_FIELD_DELEGATE_H - -#include -#include - -namespace Shared { - -class ExpressionTextFieldDelegate : public TextFieldDelegate { -public: - virtual Poincare::Context * localContext() = 0; - virtual const char * XNT(); - bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override; -private: - bool cursorInToken(TextField * textField, const char * token); -}; - -} - -#endif diff --git a/apps/shared/float_parameter_controller.cpp b/apps/shared/float_parameter_controller.cpp index ad790431a..cd1ed67eb 100644 --- a/apps/shared/float_parameter_controller.cpp +++ b/apps/shared/float_parameter_controller.cpp @@ -45,11 +45,6 @@ bool FloatParameterController::textFieldDidFinishEditing(TextField * textField, return true; } -bool FloatParameterController::textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) { - TextFieldDelegateApp * myApp = (TextFieldDelegateApp *)app(); - return myApp->textFieldDidReceiveEvent(textField, event); -} - void FloatParameterController::tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) { EditableTextMenuListCell * myCell = (EditableTextMenuListCell *)t->cellAtLocation(previousSelectedCellX, previousSelectedCellY); myCell->setEditing(false); @@ -57,6 +52,10 @@ void FloatParameterController::tableViewDidChangeSelection(SelectableTableView * app()->setFirstResponder(myNewCell); } +TextFieldDelegateApp * FloatParameterController::textFieldDelegateApp() { + return (TextFieldDelegateApp *)app(); +} + KDCoordinate FloatParameterController::cellHeight() { return Metric::ParameterCellHeight; } diff --git a/apps/shared/float_parameter_controller.h b/apps/shared/float_parameter_controller.h index 3fef0ca36..65d60ac91 100644 --- a/apps/shared/float_parameter_controller.h +++ b/apps/shared/float_parameter_controller.h @@ -2,7 +2,7 @@ #define SHARED_FLOAT_PARAMETER_CONTROLLER_H #include -#include "expression_text_field_delegate.h" +#include "text_field_delegate.h" namespace Shared { @@ -17,12 +17,12 @@ public: KDCoordinate cellHeight() override; void willDisplayCellForIndex(TableViewCell * cell, int index) override; bool textFieldDidFinishEditing(TextField * textField, const char * text) override; - bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override; void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) override; protected: int activeCell(); SelectableTableView m_selectableTableView; private: + TextFieldDelegateApp * textFieldDelegateApp() override; virtual float parameterAtIndex(int index) = 0; virtual void setParameterAtIndex(int parameterIndex, float f) = 0; }; diff --git a/apps/shared/text_field_delegate.cpp b/apps/shared/text_field_delegate.cpp new file mode 100644 index 000000000..0b00392d2 --- /dev/null +++ b/apps/shared/text_field_delegate.cpp @@ -0,0 +1,15 @@ +#include "text_field_delegate.h" + +using namespace Poincare; + +namespace Shared { + +bool TextFieldDelegate::textFieldDidReceiveEvent(::TextField * textField, Ion::Events::Event event) { + return textFieldDelegateApp()->textFieldDidReceiveEvent(textField, event); +} + +Toolbox * TextFieldDelegate::toolboxForTextField(::TextField * textField) { + return textFieldDelegateApp()->toolboxForTextField(textField); +} + +} diff --git a/apps/shared/text_field_delegate.h b/apps/shared/text_field_delegate.h new file mode 100644 index 000000000..9159970ea --- /dev/null +++ b/apps/shared/text_field_delegate.h @@ -0,0 +1,20 @@ +#ifndef SHARED_TEXT_FIELD_DELEGATE_H +#define SHARED_TEXT_FIELD_DELEGATE_H + +#include +#include "text_field_delegate_app.h" +#include + +namespace Shared { + +class TextFieldDelegate : public ::TextFieldDelegate { +public: + bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override; + Toolbox * toolboxForTextField(TextField * textField) override; +private: + virtual TextFieldDelegateApp * textFieldDelegateApp() = 0; +}; + +} + +#endif diff --git a/apps/shared/text_field_delegate_app.cpp b/apps/shared/text_field_delegate_app.cpp index bca6eab07..809cc836d 100644 --- a/apps/shared/text_field_delegate_app.cpp +++ b/apps/shared/text_field_delegate_app.cpp @@ -1,5 +1,7 @@ #include "text_field_delegate_app.h" #include "../apps_container.h" +#include +#include using namespace Poincare; @@ -8,7 +10,7 @@ namespace Shared { TextFieldDelegateApp::TextFieldDelegateApp(Container * container, ViewController * rootViewController, const char * name, const char * upperName, const Image * icon) : ::App(container, rootViewController, name, upperName, icon), - ExpressionTextFieldDelegate() + TextFieldDelegate() { } @@ -20,4 +22,74 @@ AppsContainer * TextFieldDelegateApp::container() { return (AppsContainer *)app()->container(); } +const char * TextFieldDelegateApp::XNT() { + return "x"; +} + +bool TextFieldDelegateApp::cursorInToken(TextField * textField, const char * token) { + const char * text = textField->text(); + int location = textField->cursorLocation(); + int tokenLength = strlen(token); + while (text[location] != '(') { + location --; + } + if (location - tokenLength < 0) { + return false; + } + char previousToken[10]; + strlcpy(previousToken, text+location-tokenLength, tokenLength+1); + if (strcmp(previousToken, token) == 0) { + return true; + } + return false; +} + +bool TextFieldDelegateApp::textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) { + if (event == Ion::Events::OK && textField->isEditing()) { + Expression * exp = Expression::parse(textField->text()); + if (exp == nullptr) { + if (textField->textLength() == 0) { + return true; + } + textField->app()->displayWarning("Attention a la syntaxe jeune padawan"); + return true; + } + Expression * evaluation = exp->evaluate(*localContext()); + if (evaluation == nullptr) { + delete exp; + textField->app()->displayWarning("Relis ton cours de maths, veux tu?"); + return true; + } else { + delete evaluation; + delete exp; + } + } + if (event == Ion::Events::Var) { + AppsContainer * appsContainer = (AppsContainer *)textField->app()->container(); + VariableBoxController * variableBoxController = appsContainer->variableBoxController(); + variableBoxController->setTextFieldCaller(textField); + textField->app()->displayModalViewController(variableBoxController, 0.f, 0.f, 50, 50, 0, 50); + return true; + } + if (event == Ion::Events::XNT) { + if (!textField->isEditing()) { + textField->setEditing(true); + textField->setText(""); + } + if (cursorInToken(textField, "sum") || cursorInToken(textField, "product")) { + textField->insertTextAtLocation("n", textField->cursorLocation()); + textField->setCursorLocation(textField->cursorLocation()+strlen("n")); + return true; + } + textField->insertTextAtLocation(XNT(), textField->cursorLocation()); + textField->setCursorLocation(textField->cursorLocation()+strlen(XNT())); + return true; + } + return false; +} + +Toolbox * TextFieldDelegateApp::toolboxForTextField(TextField * textField) { + return container()->mathToolbox(); +} + } diff --git a/apps/shared/text_field_delegate_app.h b/apps/shared/text_field_delegate_app.h index 9d2783b49..a29ed79af 100644 --- a/apps/shared/text_field_delegate_app.h +++ b/apps/shared/text_field_delegate_app.h @@ -2,17 +2,22 @@ #define SHARED_TEXT_FIELD_DELEGATE_APP_H #include -#include "expression_text_field_delegate.h" +#include class AppsContainer; namespace Shared { -class TextFieldDelegateApp : public ::App, public ExpressionTextFieldDelegate { +class TextFieldDelegateApp : public ::App, public TextFieldDelegate { public: TextFieldDelegateApp(Container * container, ViewController * rootViewController, const char * name = nullptr, const char * upperName = nullptr, const Image * icon = nullptr); - virtual Poincare::Context * localContext() override; + virtual Poincare::Context * localContext(); AppsContainer * container(); + virtual const char * XNT(); + bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override; + Toolbox * toolboxForTextField(TextField * textField) override; +private: + bool cursorInToken(TextField * textField, const char * token); }; } diff --git a/escher/include/escher/input_view_controller.h b/escher/include/escher/input_view_controller.h index 7db47374b..7bbde626c 100644 --- a/escher/include/escher/input_view_controller.h +++ b/escher/include/escher/input_view_controller.h @@ -15,6 +15,7 @@ public: bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override; bool textFieldDidFinishEditing(TextField * textField, const char * text) override; bool textFieldDidAbortEditing(TextField * textField, const char * text) override; + Toolbox * toolboxForTextField(TextField * textFied) override; private: class TextFieldController : public ViewController { public: diff --git a/escher/include/escher/responder.h b/escher/include/escher/responder.h index 7333ace86..96cf22c5e 100644 --- a/escher/include/escher/responder.h +++ b/escher/include/escher/responder.h @@ -4,6 +4,7 @@ #include class App; +class Toolbox; class Responder { public: @@ -15,6 +16,7 @@ public: Responder * parentResponder() const; void setParentResponder(Responder * responder); App * app(); + virtual Toolbox * toolbox(); private: Responder * m_parentResponder; }; diff --git a/escher/include/escher/text_field.h b/escher/include/escher/text_field.h index 3db49e08c..874e1778d 100644 --- a/escher/include/escher/text_field.h +++ b/escher/include/escher/text_field.h @@ -11,6 +11,7 @@ public: TextField(Responder * parentResponder, char * textBuffer, char * draftTextBuffer, size_t textBufferSize, TextFieldDelegate * delegate = nullptr, KDText::FontSize size = KDText::FontSize::Large, float horizontalAlignment = 0.0f, float verticalAlignment = 0.5f, KDColor textColor = KDColorBlack, KDColor = KDColorWhite); + Toolbox * toolbox() override; // View void drawRect(KDContext * ctx, KDRect rect) const override; // Responder diff --git a/escher/include/escher/text_field_delegate.h b/escher/include/escher/text_field_delegate.h index a44d53def..a9fcc3404 100644 --- a/escher/include/escher/text_field_delegate.h +++ b/escher/include/escher/text_field_delegate.h @@ -8,6 +8,7 @@ public: virtual bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) = 0; virtual bool textFieldDidFinishEditing(TextField * textField, const char * text) {return false;}; virtual bool textFieldDidAbortEditing(TextField * textField, const char * text) {return false;}; + virtual Toolbox * toolboxForTextField(TextField * textFied) = 0; }; #endif diff --git a/escher/src/input_view_controller.cpp b/escher/src/input_view_controller.cpp index a57774eba..cc3425ac7 100644 --- a/escher/src/input_view_controller.cpp +++ b/escher/src/input_view_controller.cpp @@ -64,3 +64,7 @@ bool InputViewController::textFieldDidAbortEditing(TextField * textField, const bool InputViewController::textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) { return m_textFieldDelegate->textFieldDidReceiveEvent(textField, event); } + +Toolbox * InputViewController::toolboxForTextField(TextField * textField) { + return m_textFieldDelegate->toolboxForTextField(textField); +} diff --git a/escher/src/responder.cpp b/escher/src/responder.cpp index 80b439a60..88a0af353 100644 --- a/escher/src/responder.cpp +++ b/escher/src/responder.cpp @@ -1,5 +1,6 @@ #include #include +#include #include Responder::Responder(Responder * parentResponder) : @@ -16,6 +17,11 @@ void Responder::setParentResponder(Responder * responder) { } bool Responder::handleEvent(Ion::Events::Event event) { + if (event == Ion::Events::Toolbox && toolbox() != nullptr) { + toolbox()->setSender(this); + app()->displayModalViewController(toolbox(), 0.f, 0.f, 50, 50, 0, 50); + return true; + } return false; } @@ -38,3 +44,7 @@ App * Responder::app() { assert(result->m_magic == App::Magic); // Poor man's RTTI return result; } + +Toolbox * Responder::toolbox() { + return nullptr; +} diff --git a/escher/src/text_field.cpp b/escher/src/text_field.cpp index 949881df3..e891436d5 100644 --- a/escher/src/text_field.cpp +++ b/escher/src/text_field.cpp @@ -21,6 +21,13 @@ TextField::TextField(Responder * parentResponder, char * textBuffer, char * draf { } +Toolbox * TextField::toolbox() { + if (m_delegate) { + return m_delegate->toolboxForTextField(this); + } + return nullptr; +} + const char * TextField::text() const { if (m_isEditing) { return (const char *)m_draftTextBuffer; @@ -67,6 +74,9 @@ void TextField::reload() { } bool TextField::handleEvent(Ion::Events::Event event) { + if (Responder::handleEvent(event)) { + return true; + } if (m_delegate) { if (m_delegate->textFieldDidReceiveEvent(this, event)) { return true;