[escher] New handling of stack view headers in StackViewController.

A boolean in ViewController states if the ViewController wants MaximumSpace (do
not show any stack view headers), or if it does not want to add its own title to
the stack view headers. If the ViewController's title is null, it is not added
to the stack view headers.
By default, ButtonRowControllers do not want to add their title (because they
are only used for now in TabViews, where the title is already displayed in the
tab).

Change-Id: I9e4c64b845262e4d44eb03cf769950f9c9e67a3a
This commit is contained in:
Léa Saviot
2017-10-31 18:06:52 +01:00
committed by Romain Goyet
parent 68e237702b
commit eadf4a018a
9 changed files with 57 additions and 27 deletions

View File

@@ -4,14 +4,18 @@ extern "C" {
#include <escher/stack_view_controller.h>
#include <escher/app.h>
StackViewController::ControllerView::ControllerView(bool displayFirstStackHeader) :
StackViewController::ControllerView::ControllerView() :
View(),
m_contentView(nullptr),
m_numberOfStacks(0),
m_displayFirstStackHeader(displayFirstStackHeader)
m_displayStackHeaders(true)
{
}
void StackViewController::ControllerView::shouldDisplayStackHearders(bool shouldDisplay) {
m_displayStackHeaders = shouldDisplay;
}
void StackViewController::ControllerView::setContentView(View * view) {
m_contentView = view;
layoutSubviews();
@@ -33,23 +37,30 @@ void StackViewController::ControllerView::popStack() {
void StackViewController::ControllerView::layoutSubviews() {
KDCoordinate width = m_frame.width();
int indexFirstHeader = m_displayFirstStackHeader ? 0 : 1;
for (int i=indexFirstHeader; i<m_numberOfStacks; i++) {
m_stackViews[i].setFrame(KDRect(0, k_stackHeight*(i-indexFirstHeader), width, k_stackHeight + 1));
if (m_displayStackHeaders) {
for (int i=0; i<m_numberOfStacks; i++) {
m_stackViews[i].setFrame(KDRect(0, k_stackHeight*i, width, k_stackHeight + 1));
}
}
if (m_contentView) {
bool separatorHeight = m_displayFirstStackHeader + (m_numberOfStacks > 1);
KDRect contentViewFrame = KDRect( 0, (m_numberOfStacks-indexFirstHeader)*k_stackHeight + separatorHeight,
width, m_frame.height() - (m_numberOfStacks-indexFirstHeader)*k_stackHeight);
bool separatorHeight = m_numberOfStacks > 1;
KDRect contentViewFrame = KDRect( 0,
m_displayStackHeaders * (m_numberOfStacks * k_stackHeight + separatorHeight),
width,
m_frame.height() - m_displayStackHeaders * m_numberOfStacks * k_stackHeight);
m_contentView->setFrame(contentViewFrame);
}
}
int StackViewController::ControllerView::numberOfSubviews() const {
return m_numberOfStacks + (m_contentView == nullptr ? 0 : 1);
return (m_displayStackHeaders ? m_numberOfStacks : 0) + (m_contentView == nullptr ? 0 : 1);
}
View * StackViewController::ControllerView::subviewAtIndex(int index) {
if (!m_displayStackHeaders) {
assert(index == 0);
return m_contentView;
}
if (index < m_numberOfStacks) {
assert(index >= 0);
return &m_stackViews[index];
@@ -65,10 +76,9 @@ const char * StackViewController::ControllerView::className() const {
}
#endif
StackViewController::StackViewController(Responder * parentResponder, ViewController * rootViewController,
bool displayFirstStackHeader, KDColor textColor, KDColor backgroundColor, KDColor separatorColor) :
StackViewController::StackViewController(Responder * parentResponder, ViewController * rootViewController, KDColor textColor, KDColor backgroundColor, KDColor separatorColor) :
ViewController(parentResponder),
m_view(displayFirstStackHeader),
m_view(),
m_numberOfChildren(0),
m_isVisible(false)
{
@@ -88,8 +98,10 @@ void StackViewController::push(ViewController * vc, KDColor textColor, KDColor b
if (!m_isVisible) {
return;
}
/* Load stack view */
m_view.pushStack(frame);
/* Load stack view if the View Controller has a title. */
if (vc->title() != nullptr && vc->displayParameter() != ViewController::DisplayParameter::DoNotShowOwnTitle) {
m_view.pushStack(frame);
}
setupActiveViewController();
if (m_numberOfChildren > 1) {
m_childrenFrame[m_numberOfChildren-2].viewController()->viewDidDisappear();
@@ -97,9 +109,11 @@ void StackViewController::push(ViewController * vc, KDColor textColor, KDColor b
}
void StackViewController::pop() {
m_view.popStack();
assert(m_numberOfChildren > 0);
ViewController * vc = m_childrenFrame[m_numberOfChildren-1].viewController();
if (vc->title() != nullptr && vc->displayParameter() != ViewController::DisplayParameter::DoNotShowOwnTitle) {
m_view.popStack();
}
m_numberOfChildren--;
setupActiveViewController();
vc->setParentResponder(nullptr);
@@ -117,6 +131,7 @@ void StackViewController::pushModel(Frame frame) {
void StackViewController::setupActiveViewController() {
ViewController * vc = m_childrenFrame[m_numberOfChildren-1].viewController();
vc->setParentResponder(this);
m_view.shouldDisplayStackHearders(vc->displayParameter() != ViewController::DisplayParameter::WantsMaximumSpace);
m_view.setContentView(vc->view());
vc->viewWillAppear();
vc->setParentResponder(this);
@@ -143,12 +158,16 @@ View * StackViewController::view() {
void StackViewController::viewWillAppear() {
/* Load the stack view */
for (int i = 0; i < m_numberOfChildren; i++) {
m_view.pushStack(m_childrenFrame[i]);
ViewController * childrenVC = m_childrenFrame[i].viewController();
if (childrenVC->title() != nullptr && childrenVC->displayParameter() != ViewController::DisplayParameter::DoNotShowOwnTitle) {
m_view.pushStack(m_childrenFrame[i]);
}
}
/* Load the visible controller view */
ViewController * vc = m_childrenFrame[m_numberOfChildren-1].viewController();
if (m_numberOfChildren > 0 && vc) {
m_view.setContentView(vc->view());
m_view.shouldDisplayStackHearders(vc->displayParameter() != ViewController::DisplayParameter::WantsMaximumSpace);
vc->viewWillAppear();
}
m_isVisible = true;
@@ -159,7 +178,7 @@ void StackViewController::viewDidDisappear() {
if (m_numberOfChildren > 0 && vc) {
vc->viewDidDisappear();
}
for (int i = 0; i < m_numberOfChildren; i++) {
for (int i = 0; i < m_view.numberOfStacks(); i++) {
m_view.popStack();
}
m_isVisible = false;