Numworks Epsilon  1.4.1
Graphing Calculator Operating System
responder.cpp
Go to the documentation of this file.
1 #include <escher/responder.h>
2 #include <escher/app.h>
3 #include <escher/toolbox.h>
4 #include <escher/metric.h>
5 #include <assert.h>
6 
7 Responder::Responder(Responder * parentResponder) :
8  m_parentResponder(parentResponder)
9 {
10 }
11 
13  return m_parentResponder;
14 }
15 
17  m_parentResponder = responder;
18 }
19 
21  if (event == Ion::Events::Toolbox && toolbox() != nullptr) {
22  toolbox()->setSender(this);
24  return true;
25  }
26  return false;
27 }
28 
30 }
31 
33 }
34 
35 void Responder::didEnterResponderChain(Responder * previousFirstResponder) {
36 }
37 
38 void Responder::willExitResponderChain(Responder * nextFirstResponder) {
39 }
40 
42  if (responder == nullptr) {
43  return nullptr;
44  }
45  if (this == responder) {
46  return this;
47  }
48  Responder * rootResponder = this;
49  while (rootResponder->parentResponder() != responder && rootResponder->parentResponder() != nullptr) {
50  rootResponder = rootResponder->parentResponder();
51  }
52  if (rootResponder->parentResponder() == responder) {
53  return responder;
54  }
55  rootResponder = responder;
56  while (rootResponder->parentResponder() != this && rootResponder->parentResponder() != nullptr) {
57  rootResponder = rootResponder->parentResponder();
58  }
59  if (rootResponder->parentResponder() == this) {
60  return this;
61  }
62  Responder * r = nullptr;
63  if (parentResponder()) {
64  r = parentResponder()->commonAncestorWith(responder);
65  }
66  Responder * s = nullptr;
67  if (responder->parentResponder()) {
68  s = commonAncestorWith(responder->parentResponder());
69  }
70  if (r) {
71  return r;
72  }
73  return s;
74 }
75 
76 /* We assume the app is the root parent. */
78  Responder * rootResponder = this;
79  while (rootResponder->parentResponder() != nullptr) {
80  rootResponder = rootResponder->parentResponder();
81  }
82  /* If we used RTTI we could use a dynamic_cast, which would be a lot more
83  * safe, as such:
84  * return dynamic_cast<App *>(rootResponder); */
85  App * result = (App *)rootResponder;
86  assert(result->m_magic == App::Magic); // Poor man's RTTI
87  return result;
88 }
virtual void willResignFirstResponder()
Definition: responder.cpp:32
#define assert(e)
Definition: assert.h:9
void displayModalViewController(ViewController *vc, float verticalAlignment, float horizontalAlignment, KDCoordinate topMargin=0, KDCoordinate leftMargin=0, KDCoordinate bottomMargin=0, KDCoordinate rightMargin=0)
Definition: app.cpp:85
Responder * commonAncestorWith(Responder *responder)
Definition: responder.cpp:41
virtual void didBecomeFirstResponder()
Definition: responder.cpp:29
Responder * parentResponder() const
Definition: responder.cpp:12
uint8_t m_magic
Definition: app.h:56
virtual bool handleEvent(Ion::Events::Event event)
Definition: responder.cpp:20
static constexpr uint8_t Magic
Definition: app.h:46
virtual void willExitResponderChain(Responder *nextFirstResponder)
Definition: responder.cpp:38
void setParentResponder(Responder *responder)
Definition: responder.cpp:16
void setSender(Responder *sender)
Definition: toolbox.cpp:99
static constexpr KDCoordinate PopUpTopMargin
Definition: metric.h:23
Definition: app.h:23
virtual Toolbox * toolbox()
Definition: responder.h:21
Responder(Responder *parentResponder)
Definition: responder.cpp:7
constexpr Event Toolbox
Definition: events.h:75
virtual void didEnterResponderChain(Responder *previousFirstResponder)
Definition: responder.cpp:35
App * app()
Definition: responder.cpp:77
static constexpr KDCoordinate PopUpRightMargin
Definition: metric.h:22
static constexpr KDCoordinate PopUpLeftMargin
Definition: metric.h:21