From 53cf3e2ead47333265b3fbf09039410eaa3fb495 Mon Sep 17 00:00:00 2001 From: Romain Goyet Date: Fri, 12 Aug 2016 10:12:22 +0200 Subject: [PATCH] [Escher] Responder can get a pointer to the parent App We assume the root parent is the App. This works well because each view controller is a Responder. Change-Id: I5d90053949a4ffbdb78746cc85430a15138e48e7 --- apps/graph/graph/graph_controller.cpp | 4 ++-- apps/graph/graph/graph_controller.h | 2 +- apps/graph/graph_app.cpp | 6 +++--- apps/graph/list/function_cell.cpp | 1 + apps/graph/list/list_controller.cpp | 4 ++-- apps/graph/list/list_controller.h | 2 +- escher/include/escher/app.h | 2 +- escher/include/escher/responder.h | 7 +++++-- escher/include/escher/tab_view_controller.h | 2 +- escher/include/escher/text_field.h | 2 +- escher/include/escher/view_controller.h | 2 +- escher/src/app.cpp | 1 + escher/src/responder.cpp | 18 +++++++++++++++--- escher/src/tab_view_controller.cpp | 4 ++-- escher/src/text_field.cpp | 3 ++- escher/src/view_controller.cpp | 5 +++-- 16 files changed, 42 insertions(+), 23 deletions(-) diff --git a/apps/graph/graph/graph_controller.cpp b/apps/graph/graph/graph_controller.cpp index 09f0287d8..f9cdb2443 100644 --- a/apps/graph/graph/graph_controller.cpp +++ b/apps/graph/graph/graph_controller.cpp @@ -1,7 +1,7 @@ #include "graph_controller.h" -GraphController::GraphController() : - ViewController(), +GraphController::GraphController(Responder * parentResponder) : + ViewController(parentResponder), m_view(GraphView()) { } diff --git a/apps/graph/graph/graph_controller.h b/apps/graph/graph/graph_controller.h index c7f15d40d..588209ff1 100644 --- a/apps/graph/graph/graph_controller.h +++ b/apps/graph/graph/graph_controller.h @@ -6,7 +6,7 @@ class GraphController : public ViewController { public: - GraphController(); + GraphController(Responder * parentResponder); View * view() override; const char * title() const override; void setFocused(bool focused) override; diff --git a/apps/graph/graph_app.cpp b/apps/graph/graph_app.cpp index 3cd80d9be..68ec69279 100644 --- a/apps/graph/graph_app.cpp +++ b/apps/graph/graph_app.cpp @@ -2,9 +2,9 @@ GraphApp::GraphApp() : App(), - m_listController(ListController()), - m_graphController(GraphController()), - m_tabViewController(&m_listController, &m_graphController) + m_listController(ListController(nullptr)), + m_graphController(GraphController(nullptr)), + m_tabViewController(this, &m_listController, &m_graphController) { } diff --git a/apps/graph/list/function_cell.cpp b/apps/graph/list/function_cell.cpp index 96fce3d65..b2cc99122 100644 --- a/apps/graph/list/function_cell.cpp +++ b/apps/graph/list/function_cell.cpp @@ -2,6 +2,7 @@ FunctionCell::FunctionCell() : ChildlessView(), + Responder(nullptr), m_focused(false), m_even(false) { diff --git a/apps/graph/list/list_controller.cpp b/apps/graph/list/list_controller.cpp index 7053e7b59..467e4d254 100644 --- a/apps/graph/list/list_controller.cpp +++ b/apps/graph/list/list_controller.cpp @@ -8,8 +8,8 @@ static const char * sMessages[] = { "PPP15", "QQQ16", "RRR17", "SSS18", "TTT19" }; -ListController::ListController() : - ViewController(), +ListController::ListController(Responder * parentResponder) : + ViewController(parentResponder), m_tableView(TableView(this)), m_activeCell(0), m_manualScrolling(0) diff --git a/apps/graph/list/list_controller.h b/apps/graph/list/list_controller.h index 770013a4d..2da95c91b 100644 --- a/apps/graph/list/list_controller.h +++ b/apps/graph/list/list_controller.h @@ -6,7 +6,7 @@ class ListController : public ViewController, public TableViewDataSource { public: - ListController(); + ListController(Responder * parentResponder); void setActiveCell(int index); diff --git a/escher/include/escher/app.h b/escher/include/escher/app.h index 0e15deb87..9624c3cec 100644 --- a/escher/include/escher/app.h +++ b/escher/include/escher/app.h @@ -4,7 +4,7 @@ #include #include -class App { +class App : public Responder { public: App(); static App * runningApp(); diff --git a/escher/include/escher/responder.h b/escher/include/escher/responder.h index 3792bffaa..c9af9ffb3 100644 --- a/escher/include/escher/responder.h +++ b/escher/include/escher/responder.h @@ -5,13 +5,16 @@ extern "C" { #include } +class App; + class Responder { public: - Responder(); + Responder(Responder * parentResponder); virtual bool handleEvent(ion_event_t event); // Default implementation does nothing virtual void setFocused(bool focused); // Default implementation does nothing. Used by subclasses to know when active or not - Responder * parentResponder(); + Responder * parentResponder() const; void setParentResponder(Responder * responder); + App * app(); private: Responder * m_parentResponder; }; diff --git a/escher/include/escher/tab_view_controller.h b/escher/include/escher/tab_view_controller.h index 9556799d7..ca5683acd 100644 --- a/escher/include/escher/tab_view_controller.h +++ b/escher/include/escher/tab_view_controller.h @@ -6,7 +6,7 @@ class TabViewController : public ViewController { public: - TabViewController(ViewController * one, ViewController * two); + TabViewController(Responder * parentResponder, ViewController * one, ViewController * two); //TabViewController(ViewController ** children, uint8_t numberOfChildren); View * view() override; void handleKeyEvent(int key) override; diff --git a/escher/include/escher/text_field.h b/escher/include/escher/text_field.h index f2ebd0632..15ebd38fa 100644 --- a/escher/include/escher/text_field.h +++ b/escher/include/escher/text_field.h @@ -7,7 +7,7 @@ class TextField : public ChildlessView, public Responder { public: - TextField(char * textBuffer, size_t textBufferSize); + TextField(Responder * parentResponder, char * textBuffer, size_t textBufferSize); // View void drawRect(KDContext * ctx, KDRect rect) const override; // Responder diff --git a/escher/include/escher/view_controller.h b/escher/include/escher/view_controller.h index 7d0fd5f85..979b5d86c 100644 --- a/escher/include/escher/view_controller.h +++ b/escher/include/escher/view_controller.h @@ -16,7 +16,7 @@ extern "C" { class ViewController : public Responder { public: - ViewController(); + ViewController(Responder * parentResponder); virtual const char * title() const; virtual void handleKeyEvent(int key); virtual View * view() = 0; diff --git a/escher/src/app.cpp b/escher/src/app.cpp index 679aaf8d1..ec2e8ad0e 100644 --- a/escher/src/app.cpp +++ b/escher/src/app.cpp @@ -7,6 +7,7 @@ extern "C" { static App * sRunningApp = nullptr; App::App() : + Responder(nullptr), m_focusedResponder(nullptr) { } diff --git a/escher/src/responder.cpp b/escher/src/responder.cpp index c543efe9c..6f011b2a0 100644 --- a/escher/src/responder.cpp +++ b/escher/src/responder.cpp @@ -1,11 +1,11 @@ #include -Responder::Responder() : - m_parentResponder(nullptr) +Responder::Responder(Responder * parentResponder) : + m_parentResponder(parentResponder) { } -Responder * Responder::parentResponder() { +Responder * Responder::parentResponder() const { return m_parentResponder; } @@ -19,3 +19,15 @@ bool Responder::handleEvent(ion_event_t event) { void Responder::setFocused(bool focused) { } + +/* We assume the app is the root parent. */ +App * Responder::app() { + Responder * rootResponder = this; + while (rootResponder->parentResponder() != nullptr) { + rootResponder = rootResponder->parentResponder(); + } + /* If we used RTTI we could use a dynamic_cast, which would be a lot more + * safe, as such: + * return dynamic_cast(rootResponder); */ + return (App *)rootResponder; +} diff --git a/escher/src/tab_view_controller.cpp b/escher/src/tab_view_controller.cpp index 2da2b1af8..51b5dfd7a 100644 --- a/escher/src/tab_view_controller.cpp +++ b/escher/src/tab_view_controller.cpp @@ -53,8 +53,8 @@ const char * TabViewController::ContentView::className() const { } #endif -TabViewController::TabViewController(ViewController * one, ViewController * two) : - ViewController(), +TabViewController::TabViewController(Responder * parentResponder, ViewController * one, ViewController * two) : + ViewController(parentResponder), m_numberOfChildren(2), m_activeChildIndex(-1) { diff --git a/escher/src/text_field.cpp b/escher/src/text_field.cpp index d703983df..5ad7ec547 100644 --- a/escher/src/text_field.cpp +++ b/escher/src/text_field.cpp @@ -1,6 +1,7 @@ #include -TextField::TextField(char * textBuffer, size_t textBufferSize) : +TextField::TextField(Responder * parentResponder, char * textBuffer, size_t textBufferSize) : + Responder(parentResponder), ChildlessView(), m_textBuffer(textBuffer), m_textBufferSize(textBufferSize), diff --git a/escher/src/view_controller.cpp b/escher/src/view_controller.cpp index 1eb07e5bb..d67d57006 100644 --- a/escher/src/view_controller.cpp +++ b/escher/src/view_controller.cpp @@ -1,7 +1,8 @@ #include -ViewController::ViewController() : - Responder() { +ViewController::ViewController(Responder * parentResponder) : + Responder(parentResponder) +{ } const char * ViewController::title() const {