mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-30 04:00:02 +02:00
[escher] Modify header view controller to handle the logic without data
Change-Id: I87b544e39f24961683085af3f6060be357ee4f24
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
#include "graph_controller.h"
|
||||
#include <assert.h>
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -1,15 +1,12 @@
|
||||
#include <escher/button.h>
|
||||
#include <assert.h>
|
||||
|
||||
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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user