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),