mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
[escher] focus -> firstResponder
Change-Id: I2e84afe6f14abfc65e45814300e8db9703840337
This commit is contained in:
@@ -14,14 +14,6 @@ const char * GraphController::title() const {
|
||||
return "Graphique";
|
||||
}
|
||||
|
||||
void GraphController::setFocused(bool focused) {
|
||||
/*
|
||||
if (focused) {
|
||||
App::runningApp()->focus(&m_view);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
bool GraphController::handleEvent(Ion::Events::Event event) {
|
||||
switch (event) {
|
||||
case Ion::Events::Event::ENTER:
|
||||
|
||||
@@ -10,7 +10,6 @@ public:
|
||||
GraphController(Responder * parentResponder, Graph::FunctionStore * functionStore);
|
||||
View * view() override;
|
||||
const char * title() const override;
|
||||
void setFocused(bool focused) override;
|
||||
bool handleEvent(Ion::Events::Event event) override;
|
||||
private:
|
||||
GraphView m_view;
|
||||
|
||||
@@ -21,8 +21,13 @@ void FunctionCell::setFunction(Graph::Function * f) {
|
||||
m_function = f;
|
||||
}
|
||||
|
||||
void FunctionCell::setFocused(bool focused) {
|
||||
m_focused = focused;
|
||||
void FunctionCell::didBecomeFirstResponder() {
|
||||
m_focused = true;
|
||||
markRectAsDirty(bounds());
|
||||
}
|
||||
|
||||
void FunctionCell::didResignFirstResponder() {
|
||||
m_focused = false;
|
||||
markRectAsDirty(bounds());
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,8 @@ public:
|
||||
void setEven(bool even);
|
||||
|
||||
void drawRect(KDContext * ctx, KDRect rect) const override;
|
||||
void setFocused(bool focused) override;
|
||||
void didBecomeFirstResponder() override;
|
||||
void didResignFirstResponder() override;
|
||||
private:
|
||||
Graph::Function * m_function;
|
||||
bool m_focused;
|
||||
|
||||
@@ -29,7 +29,7 @@ void ListController::setActiveCell(int index) {
|
||||
m_tableView.scrollToRow(index);
|
||||
FunctionCell * cell = (FunctionCell *)(m_tableView.cellAtIndex(index));
|
||||
cell->setParentResponder(this);
|
||||
app()->focus(cell);
|
||||
app()->setFirstResponder(cell);
|
||||
}
|
||||
|
||||
bool ListController::handleEvent(Ion::Events::Event event) {
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
#include "law_cell.h"
|
||||
|
||||
constexpr KDColor separatorColor = KDColor(0xB4B7B9);
|
||||
constexpr KDColor tableBackgroundColor = KDColor(0xF0F3F5);
|
||||
constexpr KDCoordinate margin = 20;
|
||||
constexpr KDColor focusedCellBackgroundColor = KDColor(0xBFD3EB);
|
||||
constexpr KDColor cellBackgroundColor = KDColor(0xFCFCFC);
|
||||
|
||||
Probability::LawCell::LawCell() :
|
||||
ChildlessView(),
|
||||
Responder(nullptr),
|
||||
@@ -10,17 +16,34 @@ Probability::LawCell::LawCell() :
|
||||
}
|
||||
|
||||
void Probability::LawCell::drawRect(KDContext * ctx, KDRect rect) const {
|
||||
KDColor background = m_even ? KDColor(0xEEEEEE) : KDColor(0x777777);
|
||||
ctx->fillRect(rect, background);
|
||||
ctx->drawString(m_message, KDPointZero, m_focused);
|
||||
KDCoordinate width = bounds().width();
|
||||
KDCoordinate height = bounds().height();
|
||||
KDColor backgroundColor = (m_focused ? focusedCellBackgroundColor : cellBackgroundColor);
|
||||
KDColor textColor = (m_focused ? KDColorWhite : KDColorBlack);
|
||||
|
||||
ctx->fillRect(KDRect(margin+1, 1, width-2*margin-1, height-1), backgroundColor);
|
||||
ctx->fillRect(KDRect(0,0,margin,height), tableBackgroundColor);
|
||||
ctx->fillRect(KDRect(margin,0,width-2*margin,1), separatorColor);
|
||||
ctx->fillRect(KDRect(margin,0,1,height), separatorColor);
|
||||
ctx->fillRect(KDRect(width-margin,0,1,height), separatorColor);
|
||||
ctx->fillRect(KDRect(width-margin+1,0,margin, height), tableBackgroundColor);
|
||||
|
||||
//KDColor background = m_even ? KDColor(0xEEEEEE) : KDColor(0x777777);
|
||||
//ctx->fillRect(rect, background);
|
||||
//ctx->drawString(m_message, KDPoint(margin+10, 5), textColor, backgroundColor);
|
||||
}
|
||||
|
||||
void Probability::LawCell::setMessage(const char * message) {
|
||||
m_message = message;
|
||||
}
|
||||
|
||||
void Probability::LawCell::setFocused(bool focused) {
|
||||
m_focused = focused;
|
||||
void Probability::LawCell::didBecomeFirstResponder() {
|
||||
m_focused = true;
|
||||
markRectAsDirty(bounds());
|
||||
}
|
||||
|
||||
void Probability::LawCell::didResignFirstResponder() {
|
||||
m_focused = false;
|
||||
markRectAsDirty(bounds());
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@ public:
|
||||
void setEven(bool even);
|
||||
|
||||
void drawRect(KDContext * ctx, KDRect rect) const override;
|
||||
void setFocused(bool focused) override;
|
||||
void didBecomeFirstResponder() override;
|
||||
void didResignFirstResponder() override;
|
||||
private:
|
||||
const char * m_message;
|
||||
bool m_focused;
|
||||
|
||||
@@ -38,7 +38,7 @@ void Probability::LawController::setActiveCell(int index) {
|
||||
m_tableView.scrollToRow(index);
|
||||
LawCell * cell = (LawCell *)(m_tableView.cellAtIndex(index));
|
||||
cell->setParentResponder(this);
|
||||
app()->focus(cell);
|
||||
app()->setFirstResponder(cell);
|
||||
}
|
||||
|
||||
bool Probability::LawController::handleEvent(Ion::Events::Event event) {
|
||||
@@ -78,5 +78,5 @@ void Probability::LawController::willDisplayCellForIndex(View * cell, int index)
|
||||
}
|
||||
|
||||
KDCoordinate Probability::LawController::cellHeight() {
|
||||
return 40;
|
||||
return 35;
|
||||
}
|
||||
|
||||
@@ -18,13 +18,14 @@ public:
|
||||
constexpr static uint8_t Magic = 0xA8;
|
||||
App();
|
||||
void setWindow(Window * window);
|
||||
void focus(Responder * responder);
|
||||
void setFirstResponder(Responder * responder);
|
||||
Responder * firstResponder();
|
||||
void processEvent(Ion::Events::Event event);
|
||||
uint8_t m_magic; // Poor man's RTTI
|
||||
protected:
|
||||
virtual ViewController * rootViewController() = 0;
|
||||
private:
|
||||
Responder * m_focusedResponder;
|
||||
Responder * m_firstResponder;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -9,7 +9,9 @@ class Responder {
|
||||
public:
|
||||
Responder(Responder * parentResponder);
|
||||
virtual bool handleEvent(Ion::Events::Event event); // Default implementation does nothing
|
||||
virtual void setFocused(bool focused); // Default implementation does nothing. Used by subclasses to know when active or not
|
||||
virtual void didBecomeFirstResponder();
|
||||
virtual void didResignFirstResponder();
|
||||
|
||||
Responder * parentResponder() const;
|
||||
void setParentResponder(Responder * responder);
|
||||
App * app();
|
||||
|
||||
@@ -18,6 +18,7 @@ public:
|
||||
View * view() override;
|
||||
const char * title() const override;
|
||||
bool handleEvent(Ion::Events::Event event) override;
|
||||
void didBecomeFirstResponder() override;
|
||||
private:
|
||||
class ControllerView : public View {
|
||||
public:
|
||||
|
||||
@@ -7,15 +7,15 @@ extern "C" {
|
||||
App::App() :
|
||||
m_magic(Magic),
|
||||
Responder(nullptr),
|
||||
m_focusedResponder(nullptr)
|
||||
m_firstResponder(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
void App::setWindow(Window * window) {
|
||||
ViewController * controller = rootViewController();
|
||||
View * view = controller->view();
|
||||
if (m_focusedResponder == nullptr) {
|
||||
focus(controller);
|
||||
if (m_firstResponder == nullptr) {
|
||||
setFirstResponder(controller);
|
||||
}
|
||||
assert(controller->app() == this);
|
||||
|
||||
@@ -26,7 +26,7 @@ void App::setWindow(Window * window) {
|
||||
}
|
||||
|
||||
void App::processEvent(Ion::Events::Event event) {
|
||||
Responder * responder = m_focusedResponder;
|
||||
Responder * responder = m_firstResponder;
|
||||
bool didHandleEvent = false;
|
||||
while (responder) {
|
||||
didHandleEvent = responder->handleEvent(event);
|
||||
@@ -37,12 +37,16 @@ void App::processEvent(Ion::Events::Event event) {
|
||||
}
|
||||
}
|
||||
|
||||
void App::focus(Responder * responder) {
|
||||
if (m_focusedResponder) {
|
||||
m_focusedResponder->setFocused(false);
|
||||
Responder * App::firstResponder() {
|
||||
return m_firstResponder;
|
||||
}
|
||||
|
||||
void App::setFirstResponder(Responder * responder) {
|
||||
if (m_firstResponder) {
|
||||
m_firstResponder->didResignFirstResponder();
|
||||
}
|
||||
m_focusedResponder = responder;
|
||||
if (m_focusedResponder) {
|
||||
m_focusedResponder->setFocused(true);
|
||||
m_firstResponder = responder;
|
||||
if (m_firstResponder) {
|
||||
m_firstResponder->didBecomeFirstResponder();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,10 @@ bool Responder::handleEvent(Ion::Events::Event event) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void Responder::setFocused(bool focused) {
|
||||
void Responder::didBecomeFirstResponder() {
|
||||
}
|
||||
|
||||
void Responder::didResignFirstResponder() {
|
||||
}
|
||||
|
||||
/* We assume the app is the root parent. */
|
||||
|
||||
@@ -97,7 +97,12 @@ void StackViewController::setupActiveViewController() {
|
||||
ViewController * vc = m_children[m_numberOfChildren-1];
|
||||
vc->setParentResponder(this);
|
||||
m_view.setContentView(vc->view());
|
||||
app()->focus(vc);
|
||||
app()->setFirstResponder(vc);
|
||||
}
|
||||
|
||||
void StackViewController::didBecomeFirstResponder() {
|
||||
ViewController * vc = m_children[m_numberOfChildren-1];
|
||||
app()->setFirstResponder(vc);
|
||||
}
|
||||
|
||||
bool StackViewController::handleEvent(Ion::Events::Event event) {
|
||||
|
||||
@@ -110,7 +110,7 @@ void TabViewController::setActiveTab(uint8_t i) {
|
||||
m_view.m_tabView.setActiveIndex(i);
|
||||
m_activeChildIndex = i;
|
||||
|
||||
app()->focus(activeVC);
|
||||
app()->setFirstResponder(activeVC);
|
||||
}
|
||||
|
||||
View * TabViewController::view() {
|
||||
|
||||
Reference in New Issue
Block a user