From 7156ce81b5eebd82b14ffcddfc11305d4c3fa434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Thu, 13 Oct 2016 11:07:43 +0200 Subject: [PATCH] [escher] Modify header view controller to handle the logic without data Change-Id: I87b544e39f24961683085af3f6060be357ee4f24 --- apps/graph/graph/graph_controller.cpp | 22 ++- apps/graph/graph/graph_controller.h | 5 + apps/graph/values/values_controller.cpp | 19 ++- apps/graph/values/values_controller.h | 3 + escher/include/escher/button.h | 4 +- .../include/escher/header_view_controller.h | 15 +- escher/src/button.cpp | 17 +-- escher/src/header_view_controller.cpp | 135 ++++++------------ 8 files changed, 95 insertions(+), 125 deletions(-) diff --git a/apps/graph/graph/graph_controller.cpp b/apps/graph/graph/graph_controller.cpp index 76e8ee281..706bbb0eb 100644 --- a/apps/graph/graph/graph_controller.cpp +++ b/apps/graph/graph/graph_controller.cpp @@ -1,11 +1,13 @@ #include "graph_controller.h" +#include GraphController::GraphController(Responder * parentResponder, Graph::FunctionStore * functionStore) : HeaderViewController(parentResponder, &m_view), m_view(GraphView(functionStore)), - m_headerSelected(false) + m_headerSelected(false), + m_windowButton(Button(this, "Fenetre", Invocation([](void * context, void * sender) {}, this))), + m_displayButton(this, "Affichage", Invocation([](void * context, void * sender) {}, this)) { - setButtonTitles("Fenetre", "Affichage", nullptr); } const char * GraphController::title() const { @@ -16,6 +18,22 @@ Responder * GraphController::tabController() const{ return (parentResponder()); } +int GraphController::numberOfButtons() const { + return 2; +} + +Button * GraphController::buttonAtIndex(int index) { + switch (index) { + case 0: + return &m_windowButton; + case 1: + return &m_displayButton; + default: + assert(false); + } + return nullptr; +} + void GraphController::didBecomeFirstResponder() { m_headerSelected = false; } diff --git a/apps/graph/graph/graph_controller.h b/apps/graph/graph/graph_controller.h index 2e23bc6ab..b1a5978c9 100644 --- a/apps/graph/graph/graph_controller.h +++ b/apps/graph/graph/graph_controller.h @@ -12,10 +12,15 @@ public: bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; + + int numberOfButtons() const override; + Button * buttonAtIndex(int index) override; private: Responder * tabController() const; GraphView m_view; bool m_headerSelected; + Button m_windowButton; + Button m_displayButton; }; #endif diff --git a/apps/graph/values/values_controller.cpp b/apps/graph/values/values_controller.cpp index c7284c462..b51100e08 100644 --- a/apps/graph/values/values_controller.cpp +++ b/apps/graph/values/values_controller.cpp @@ -8,21 +8,28 @@ ValuesController::ValuesController(Responder * parentResponder, Graph::FunctionS m_activeCellY(-1), m_functionStore(functionStore), m_interval(Graph::Interval(-1.0f, 1.0f, 0.25f)), - m_parameterController(ValuesParameterController(this)) -{ - setButtonTitles("Regler l'intervalle", nullptr, nullptr); - setButtonActions(Invocation([](void * context, void * sender) { + m_parameterController(ValuesParameterController(this)), + m_setIntervalButton(Button(this, "Regler l'intervalle",Invocation([](void * context, void * sender) { ValuesController * valuesController = (ValuesController *) context; StackViewController * stack = ((StackViewController *)valuesController->parentResponder()); stack->push(valuesController->parameterController()); - }, this), Invocation(nullptr, nullptr), Invocation(nullptr, nullptr)); + }, this))) +{ } const char * ValuesController::title() const { return "Valeurs"; } -Responder * ValuesController::tabController() const{ +int ValuesController::numberOfButtons() const { + return 1; +} + +Button * ValuesController::buttonAtIndex(int index) { + return &m_setIntervalButton; +} + +Responder * ValuesController::tabController() const { return (parentResponder()->parentResponder()); } diff --git a/apps/graph/values/values_controller.h b/apps/graph/values/values_controller.h index 7cffa0dc1..ecba806d3 100644 --- a/apps/graph/values/values_controller.h +++ b/apps/graph/values/values_controller.h @@ -18,6 +18,8 @@ public: bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; ViewController * parameterController(); + int numberOfButtons() const override; + Button * buttonAtIndex(int index) override; int numberOfRows() override; int numberOfColumns() override; @@ -54,6 +56,7 @@ private: Graph::FunctionStore * m_functionStore; Graph::Interval m_interval; ValuesParameterController m_parameterController; + Button m_setIntervalButton; }; #endif diff --git a/escher/include/escher/button.h b/escher/include/escher/button.h index 7c3e31ed0..7a5bcdd58 100644 --- a/escher/include/escher/button.h +++ b/escher/include/escher/button.h @@ -8,11 +8,9 @@ class Button : public View, public Responder { public: - Button(Responder * parentResponder); + Button(Responder * parentResponder, const char * textBody, Invocation invocation); void drawRect(KDContext * ctx, KDRect rect) const override; bool handleEvent(Ion::Events::Event event) override; - void setText(const char * textBody); - void setInvocation(Invocation invocation); void setBackgroundColor(KDColor backgroundColor); KDSize minimalSizeForOptimalDisplay() override; private: diff --git a/escher/include/escher/header_view_controller.h b/escher/include/escher/header_view_controller.h index f9057c85a..620e15b5b 100644 --- a/escher/include/escher/header_view_controller.h +++ b/escher/include/escher/header_view_controller.h @@ -14,34 +14,31 @@ public: const char * title() const override; bool handleEvent(Ion::Events::Event event) override; void setVisibleHeader(bool isVisibleHeader); + virtual int numberOfButtons() const; + virtual Button * buttonAtIndex(int index); protected: - void setButtonTitles(const char * buttonOneTitle, const char * buttonTwoTitle, const char * buttonThreeTitle); - void setButtonActions(Invocation buttonOneAction, Invocation buttonTwoAction, Invocation buttonThreeAction); void setSelectedButton(int selectedButton); private: class ContentView : public View { public: - ContentView(View * subview, Responder * parentResponder); + ContentView(View * subview, HeaderViewController * headerViewController); + int numberOfButtons() const; + Button * buttonAtIndex(int index); int numberOfSubviews() const override; View * subviewAtIndex(int index) override; void layoutSubviews() override; void drawRect(KDContext * ctx, KDRect rect) const override; void setVisibleHeader(bool isVisibleHeader); - void setButtonTitles(const char * buttonOneTitle, const char * buttonTwoTitle, const char * buttonThreeTitle); - void setButtonActions(Invocation buttonOneAction, Invocation buttonTwoAction, Invocation buttonThreeAction); void setSelectedButton(int selectedButton, App * app); int selectedButton(); private: constexpr static KDCoordinate k_headerHeight = 20; constexpr static KDColor k_separatorHeaderColor = KDColor(0xDEE0E2); constexpr static KDColor k_selectedBackgroundColor = KDColor(0x426DA7);; - Button m_buttonOne; - Button m_buttonTwo; - Button m_buttonThree; - int m_numberOfButtons; View * m_mainView; bool m_visibleHeader; int m_selectedButton; + HeaderViewController * m_headerViewController; }; ContentView m_contentView; diff --git a/escher/src/button.cpp b/escher/src/button.cpp index 3f3e45278..f69e903f9 100644 --- a/escher/src/button.cpp +++ b/escher/src/button.cpp @@ -1,15 +1,12 @@ #include #include -Button::Button(Responder * parentResponder) : +Button::Button(Responder * parentResponder, const char * textBody, Invocation invocation) : Responder(parentResponder), - m_textView(), - m_invocation(Invocation(nullptr, nullptr)), + m_textView(TextView(textBody, 0.5f, 0.5f)), + m_invocation(invocation), m_backgroundColor(KDColorWhite) { - m_textView.setBackgroundColor(KDColorWhite); - m_textView.setTextColor(KDColorBlack); - m_textView.setAlignment(0.5f, 0.5f); } void Button::drawRect(KDContext * ctx, KDRect rect) const { @@ -39,14 +36,6 @@ bool Button::handleEvent(Ion::Events::Event event) { } } -void Button::setText(const char * textBody) { - m_textView.setText(textBody); -} - -void Button::setInvocation(Invocation invocation) { - m_invocation = invocation; -} - void Button::setBackgroundColor(KDColor backgroundColor) { m_backgroundColor = backgroundColor; m_textView.setBackgroundColor(backgroundColor); diff --git a/escher/src/header_view_controller.cpp b/escher/src/header_view_controller.cpp index a74d0968a..6a2700b09 100644 --- a/escher/src/header_view_controller.cpp +++ b/escher/src/header_view_controller.cpp @@ -4,67 +4,52 @@ constexpr KDColor HeaderViewController::ContentView::k_separatorHeaderColor; constexpr KDColor HeaderViewController::ContentView::k_selectedBackgroundColor; -HeaderViewController::ContentView::ContentView(View * subview, Responder * parentResponder) : +HeaderViewController::ContentView::ContentView(View * subview, HeaderViewController * headerViewController) : View(), - m_buttonOne(Button(parentResponder)), - m_buttonTwo(Button(parentResponder)), - m_buttonThree(Button(parentResponder)), - m_numberOfButtons(0), m_mainView(subview), m_visibleHeader(true), - m_selectedButton(-1) + m_selectedButton(-1), + m_headerViewController(headerViewController) { } +int HeaderViewController::ContentView::numberOfButtons() const { + return m_headerViewController->numberOfButtons(); +} +Button * HeaderViewController::ContentView::buttonAtIndex(int index) { + return m_headerViewController->buttonAtIndex(index); +} + int HeaderViewController::ContentView::numberOfSubviews() const { if (m_visibleHeader) { - return 4; + return numberOfButtons() + 1; } return 1; } View * HeaderViewController::ContentView::subviewAtIndex(int index) { - switch (index) { - case 0: - return m_mainView; - case 1: - return &m_buttonOne; - case 2: - return &m_buttonTwo; - case 3: - return &m_buttonThree; - default: - assert(false); - return nullptr; + if (index == 0) { + return m_mainView; + } else { + return buttonAtIndex(index - 1); } } void HeaderViewController::ContentView::layoutSubviews() { - if (numberOfSubviews() == 1){ + if (numberOfButtons() == 0) { KDRect mainViewFrame(0, 1, bounds().width(), bounds().height() - 1); m_mainView->setFrame(mainViewFrame); - } else { - KDRect mainViewFrame(0, k_headerHeight + 1, bounds().width(), bounds().height() - k_headerHeight - 1); - KDCoordinate buttonOneWidth = m_buttonOne.minimalSizeForOptimalDisplay().width(); - KDCoordinate buttonTwoWidth = m_buttonTwo.minimalSizeForOptimalDisplay().width(); - KDCoordinate buttonThreeWidth = m_buttonThree.minimalSizeForOptimalDisplay().width(); - KDRect buttonOneFrame(0, 0, buttonOneWidth, k_headerHeight); - KDRect buttonTwoFrame(buttonOneWidth, 0, buttonTwoWidth, k_headerHeight); - KDRect buttonThreeFrame(buttonOneWidth + buttonTwoWidth, 0, buttonThreeWidth, k_headerHeight); - switch(m_numberOfButtons) { - case 3: - m_buttonThree.setFrame(buttonThreeFrame); - case 2: - m_buttonTwo.setFrame(buttonTwoFrame); - case 1: - m_buttonOne.setFrame(buttonOneFrame); - case 0: - m_mainView->setFrame(mainViewFrame); - return; - default: - assert(false); - return; - } + return; + } + KDRect mainViewFrame(0, k_headerHeight + 1, bounds().width(), bounds().height() - k_headerHeight - 1); + m_mainView->setFrame(mainViewFrame); + int currentXOrigin = 0; + for (int i = 0; i < numberOfButtons(); i++) { + Button * button = buttonAtIndex(i); + KDCoordinate buttonWidth = button->minimalSizeForOptimalDisplay().width(); + KDRect buttonFrame(currentXOrigin, 0, buttonWidth, k_headerHeight); + button->setFrame(buttonFrame); + currentXOrigin += buttonWidth; } } @@ -83,52 +68,19 @@ void HeaderViewController::ContentView::setVisibleHeader(bool isVisibleHeader) { layoutSubviews(); } -void HeaderViewController::ContentView::setButtonTitles(const char * buttonOneTitle, const char * buttonTwoTitle, const char * buttonThreeTitle) { - m_numberOfButtons = (bool)buttonOneTitle + (bool)buttonTwoTitle + (bool)buttonThreeTitle; - m_buttonOne.setText(buttonOneTitle); - m_buttonTwo.setText(buttonTwoTitle); - m_buttonThree.setText(buttonThreeTitle); -} - -void HeaderViewController::ContentView::setButtonActions(Invocation buttonOneAction, Invocation buttonTwoAction, Invocation buttonThreeAction) { - m_buttonOne.setInvocation(buttonOneAction); - m_buttonTwo.setInvocation(buttonTwoAction); - m_buttonThree.setInvocation(buttonThreeAction); -} - void HeaderViewController::ContentView::setSelectedButton(int selectedButton, App * application) { - if (selectedButton < -1 || selectedButton >= m_numberOfButtons) { + if (selectedButton < -1 || selectedButton >= numberOfButtons()) { return; } - switch (m_selectedButton) { - case 0: - m_buttonOne.setBackgroundColor(KDColorWhite); - break; - case 1: - m_buttonTwo.setBackgroundColor(KDColorWhite); - break; - case 2: - m_buttonThree.setBackgroundColor(KDColorWhite); - break; - default: - break; + if (m_selectedButton >= 0) { + Button * button = buttonAtIndex(m_selectedButton); + button->setBackgroundColor(KDColorWhite); } m_selectedButton = selectedButton; - switch (m_selectedButton) { - case 0: - m_buttonOne.setBackgroundColor(k_selectedBackgroundColor); - application->setFirstResponder(&m_buttonOne); - break; - case 1: - m_buttonTwo.setBackgroundColor(k_selectedBackgroundColor); - application->setFirstResponder(&m_buttonTwo); - break; - case 2: - m_buttonThree.setBackgroundColor(k_selectedBackgroundColor); - application->setFirstResponder(&m_buttonThree); - break; - default: - break; + if (m_selectedButton >= 0) { + Button * button = buttonAtIndex(selectedButton); + button->setBackgroundColor(k_selectedBackgroundColor); + application->setFirstResponder(button); } } @@ -142,6 +94,15 @@ HeaderViewController::HeaderViewController(Responder * parentResponder, View * m { } +int HeaderViewController::numberOfButtons() const { + return 0; +} + +Button * HeaderViewController::buttonAtIndex(int index) { + assert(false); + return nullptr; +} + View * HeaderViewController::view() { return &m_contentView; } @@ -154,14 +115,6 @@ void HeaderViewController::setVisibleHeader(bool isVisibleHeader) { m_contentView.setVisibleHeader(isVisibleHeader); } -void HeaderViewController::setButtonTitles(const char * buttonOneTitle, const char * buttonTwoTitle, const char * buttonThreeTitle) { - m_contentView.setButtonTitles(buttonOneTitle, buttonTwoTitle, buttonThreeTitle); -} - -void HeaderViewController::setButtonActions(Invocation buttonOneAction, Invocation buttonTwoAction, Invocation buttonThreeAction) { - m_contentView.setButtonActions(buttonOneAction, buttonTwoAction, buttonThreeAction); -} - void HeaderViewController::setSelectedButton(int selectedButton) { App * application = app(); m_contentView.setSelectedButton(selectedButton, application);