Files
Upsilon/escher/src/header_view_controller.cpp
Émilie Feral 6f138e6b1c [escher] Add methods viewWillAppear/Disappear in view controller instead
of keeping track of dataHasChanged in the selectable table view

Change-Id: Id2626f527f44714e29b9bd66e2c843193e1b57b5
2017-02-17 16:35:07 +01:00

142 lines
4.2 KiB
C++

#include <escher/header_view_controller.h>
#include <escher/palette.h>
#include <assert.h>
HeaderViewController::ContentView::ContentView(ViewController * mainViewController, HeaderViewDelegate * delegate) :
View(),
m_mainViewController(mainViewController),
m_selectedButton(-1),
m_delegate(delegate)
{
}
int HeaderViewController::ContentView::numberOfButtons() const {
return m_delegate->numberOfButtons();
}
Button * HeaderViewController::ContentView::buttonAtIndex(int index) {
return m_delegate->buttonAtIndex(index);
}
int HeaderViewController::ContentView::numberOfSubviews() const {
return numberOfButtons() + 1;
}
View * HeaderViewController::ContentView::subviewAtIndex(int index) {
if (index == 0) {
return m_mainViewController->view();
} else {
return buttonAtIndex(index - 1);
}
}
void HeaderViewController::ContentView::layoutSubviews() {
if (numberOfButtons() == 0) {
KDRect mainViewFrame(0, 1, bounds().width(), bounds().height() - 1);
m_mainViewController->view()->setFrame(mainViewFrame);
return;
}
KDRect mainViewFrame(0, k_headerHeight + 1, bounds().width(), bounds().height() - k_headerHeight - 1);
m_mainViewController->view()->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;
}
}
void HeaderViewController::ContentView::drawRect(KDContext * ctx, KDRect rect) const {
if (numberOfButtons() > 0) {
ctx->fillRect(KDRect(0, 0, bounds().width(), k_headerHeight), KDColorWhite);
ctx->fillRect(KDRect(0, k_headerHeight, bounds().width(), 1), Palette::GreyWhite);
} else {
ctx->fillRect(KDRect(0, 0, bounds().width(), 1), Palette::GreyWhite);
}
}
bool HeaderViewController::ContentView::setSelectedButton(int selectedButton, App * application) {
if (selectedButton < -1 || selectedButton >= numberOfButtons() || selectedButton == m_selectedButton) {
return false;
}
if (m_selectedButton >= 0) {
Button * button = buttonAtIndex(m_selectedButton);
button->setBackgroundColor(KDColorWhite);
}
m_selectedButton = selectedButton;
if (m_selectedButton >= 0) {
Button * button = buttonAtIndex(selectedButton);
button->setBackgroundColor(Palette::Select);
application->setFirstResponder(button);
return true;
}
return false;
}
int HeaderViewController::ContentView::selectedButton() {
return m_selectedButton;
}
ViewController * HeaderViewController::ContentView::mainViewController() const {
return m_mainViewController;
}
HeaderViewDelegate * HeaderViewController::ContentView::headerViewDelegate() const {
return m_delegate;
}
HeaderViewController::HeaderViewController(Responder * parentResponder, ViewController * mainViewController, HeaderViewDelegate * delegate) :
ViewController(parentResponder),
m_contentView(ContentView(mainViewController, delegate))
{
}
View * HeaderViewController::view() {
return &m_contentView;
}
const char * HeaderViewController::title() const {
return m_contentView.mainViewController()->title();
}
void HeaderViewController::didBecomeFirstResponder(){
m_contentView.layoutSubviews();
app()->setFirstResponder(m_contentView.mainViewController());
}
bool HeaderViewController::setSelectedButton(int selectedButton) {
App * application = app();
return m_contentView.setSelectedButton(selectedButton, application);
}
bool HeaderViewController::handleEvent(Ion::Events::Event event) {
if (event == Ion::Events::Left) {
if (m_contentView.selectedButton() == 0) {
} else {
setSelectedButton(m_contentView.selectedButton() - 1);
}
return true;
}
if (event == Ion::Events::Right) {
if (m_contentView.selectedButton() == - 1) {
} else {
setSelectedButton(m_contentView.selectedButton() + 1);
}
return true;
}
if (event == Ion::Events::OK) {
return true;
}
return false;
}
void HeaderViewController::viewWillAppear() {
m_contentView.mainViewController()->viewWillAppear();
}
void HeaderViewController::viewWillDisappear() {
m_contentView.mainViewController()->viewWillDisappear();
}