[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
This commit is contained in:
Romain Goyet
2016-08-12 10:12:22 +02:00
parent 6e0aeaf501
commit 53cf3e2ead
16 changed files with 42 additions and 23 deletions

View File

@@ -1,7 +1,7 @@
#include "graph_controller.h"
GraphController::GraphController() :
ViewController(),
GraphController::GraphController(Responder * parentResponder) :
ViewController(parentResponder),
m_view(GraphView())
{
}

View File

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

View File

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

View File

@@ -2,6 +2,7 @@
FunctionCell::FunctionCell() :
ChildlessView(),
Responder(nullptr),
m_focused(false),
m_even(false)
{

View File

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

View File

@@ -6,7 +6,7 @@
class ListController : public ViewController, public TableViewDataSource {
public:
ListController();
ListController(Responder * parentResponder);
void setActiveCell(int index);

View File

@@ -4,7 +4,7 @@
#include <escher/responder.h>
#include <escher/view_controller.h>
class App {
class App : public Responder {
public:
App();
static App * runningApp();

View File

@@ -5,13 +5,16 @@ extern "C" {
#include <ion.h>
}
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;
};

View File

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

View File

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

View File

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

View File

@@ -7,6 +7,7 @@ extern "C" {
static App * sRunningApp = nullptr;
App::App() :
Responder(nullptr),
m_focusedResponder(nullptr)
{
}

View File

@@ -1,11 +1,11 @@
#include <escher/responder.h>
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<App *>(rootResponder); */
return (App *)rootResponder;
}

View File

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

View File

@@ -1,6 +1,7 @@
#include <escher/text_field.h>
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),

View File

@@ -1,7 +1,8 @@
#include <escher/view_controller.h>
ViewController::ViewController() :
Responder() {
ViewController::ViewController(Responder * parentResponder) :
Responder(parentResponder)
{
}
const char * ViewController::title() const {