From eadf4a018a4ebb59d6754589fa4e71320e04ba18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Tue, 31 Oct 2017 18:06:52 +0100 Subject: [PATCH] [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 --- apps/sequence/list/list_controller.cpp | 2 +- apps/settings/main_controller.cpp | 3 -- apps/settings/main_controller.h | 1 - apps/variable_box_controller.cpp | 2 +- escher/include/escher/button_row_controller.h | 1 + escher/include/escher/stack_view_controller.h | 8 +-- escher/include/escher/view_controller.h | 12 +++++ escher/src/stack_view_controller.cpp | 53 +++++++++++++------ escher/src/toolbox.cpp | 2 +- 9 files changed, 57 insertions(+), 27 deletions(-) diff --git a/apps/sequence/list/list_controller.cpp b/apps/sequence/list/list_controller.cpp index cd3758e8f..2dddf97e5 100644 --- a/apps/sequence/list/list_controller.cpp +++ b/apps/sequence/list/list_controller.cpp @@ -14,7 +14,7 @@ ListController::ListController(Responder * parentResponder, SequenceStore * sequ m_expressionCells{}, m_parameterController(this, sequenceStore), m_typeParameterController(this, sequenceStore, this, TableCell::Layout::Vertical), - m_typeStackController(nullptr, &m_typeParameterController, true, KDColorWhite, Palette::PurpleDark, Palette::PurpleDark), + m_typeStackController(nullptr, &m_typeParameterController, KDColorWhite, Palette::PurpleDark, Palette::PurpleDark), m_sequenceToolbox() { } diff --git a/apps/settings/main_controller.cpp b/apps/settings/main_controller.cpp index cb1793b83..5e4c91032 100644 --- a/apps/settings/main_controller.cpp +++ b/apps/settings/main_controller.cpp @@ -58,9 +58,6 @@ MainController::~MainController() { m_complexFormatLayout = nullptr; } } -const char * MainController::title() { - return I18n::translate(m_messageTreeModel->label()); -} View * MainController::view() { return &m_selectableTableView; diff --git a/apps/settings/main_controller.h b/apps/settings/main_controller.h index c134f6c16..4943fe3de 100644 --- a/apps/settings/main_controller.h +++ b/apps/settings/main_controller.h @@ -17,7 +17,6 @@ public: MainController& operator=(const MainController& other) = delete; MainController& operator=(MainController&& other) = delete; View * view() override; - const char * title() override; bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; int numberOfRows() override; diff --git a/apps/variable_box_controller.cpp b/apps/variable_box_controller.cpp index 9a31d8304..6c04a04a4 100644 --- a/apps/variable_box_controller.cpp +++ b/apps/variable_box_controller.cpp @@ -278,7 +278,7 @@ void VariableBoxController::ContentViewController::viewDidDisappear() { } VariableBoxController::VariableBoxController(GlobalContext * context) : - StackViewController(nullptr, &m_contentViewController, true, KDColorWhite, Palette::PurpleBright, Palette::PurpleDark), + StackViewController(nullptr, &m_contentViewController, KDColorWhite, Palette::PurpleBright, Palette::PurpleDark), m_contentViewController(this, context) { } diff --git a/escher/include/escher/button_row_controller.h b/escher/include/escher/button_row_controller.h index ff241c3f3..053801222 100644 --- a/escher/include/escher/button_row_controller.h +++ b/escher/include/escher/button_row_controller.h @@ -28,6 +28,7 @@ public: bool setSelectedButton(int selectedButton); void viewWillAppear() override; void viewDidDisappear() override; + ViewController::DisplayParameter displayParameter() override { return DisplayParameter::DoNotShowOwnTitle; } private: class ContentView : public View { public: diff --git a/escher/include/escher/stack_view_controller.h b/escher/include/escher/stack_view_controller.h index 8c9ce7e05..70a700a3a 100644 --- a/escher/include/escher/stack_view_controller.h +++ b/escher/include/escher/stack_view_controller.h @@ -9,7 +9,7 @@ constexpr uint8_t kMaxNumberOfStacks = 4; class StackViewController : public ViewController { public: - StackViewController(Responder * parentResponder, ViewController * rootViewController, bool displayFirstStackHeader = false, + StackViewController(Responder * parentResponder, ViewController * rootViewController, KDColor textColor = Palette::SubTab, KDColor backgroundColor = KDColorWhite, KDColor separatorColor = Palette::GreyBright); /* Push creates a new StackView and adds it */ @@ -43,7 +43,9 @@ private: }; class ControllerView : public View { public: - ControllerView(bool displayFirstStackHeader); + ControllerView(); + void shouldDisplayStackHearders(bool shouldDisplay); + int8_t numberOfStacks() const { return m_numberOfStacks; } void setContentView(View * view); void pushStack(Frame frame); void popStack(); @@ -60,7 +62,7 @@ private: StackView m_stackViews[kMaxNumberOfStacks]; View * m_contentView; int8_t m_numberOfStacks; - bool m_displayFirstStackHeader; + bool m_displayStackHeaders; }; ControllerView m_view; void pushModel(Frame frame); diff --git a/escher/include/escher/view_controller.h b/escher/include/escher/view_controller.h index 47db53b58..316d7cae2 100644 --- a/escher/include/escher/view_controller.h +++ b/escher/include/escher/view_controller.h @@ -29,11 +29,23 @@ extern "C" { class ViewController : public Responder { public: + /* DisplayParameter is only used within StackViewController for now. It + * modifies the stack headers display. */ + enum class DisplayParameter { + Default, + DoNotShowOwnTitle, + /* With DoNotShowOwnTitle, the title of the ViewController is not added to + * the stack headers. */ + WantsMaximumSpace + /* With WantsMaximumSpace, no stack headers are displayed. */ + }; + ViewController(Responder * parentResponder); virtual const char * title(); virtual View * view() = 0; virtual void viewWillAppear(); virtual void viewDidDisappear(); + virtual DisplayParameter displayParameter() { return DisplayParameter::Default; } }; #endif diff --git a/escher/src/stack_view_controller.cpp b/escher/src/stack_view_controller.cpp index 6a95b7f51..fde00d39a 100644 --- a/escher/src/stack_view_controller.cpp +++ b/escher/src/stack_view_controller.cpp @@ -4,14 +4,18 @@ extern "C" { #include #include -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 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; diff --git a/escher/src/toolbox.cpp b/escher/src/toolbox.cpp index 9f79aa464..58f062e5d 100644 --- a/escher/src/toolbox.cpp +++ b/escher/src/toolbox.cpp @@ -85,7 +85,7 @@ void Toolbox::ListController::setFirstSelectedRow(int firstSelectedRow) { /* Toolbox */ Toolbox::Toolbox(Responder * parentResponder, const char * title) : - StackViewController(parentResponder, &m_listController, true, KDColorWhite, Palette::PurpleBright, Palette::PurpleDark), + StackViewController(parentResponder, &m_listController, KDColorWhite, Palette::PurpleBright, Palette::PurpleDark), m_selectableTableView(&m_listController, this, 0, 1, 0, 0, 0, 0, this, nullptr, false), m_listController(this, &m_selectableTableView, title), m_messageTreeModel(nullptr),