diff --git a/escher/include/escher/alternate_empty_view_controller.h b/escher/include/escher/alternate_empty_view_controller.h index e0834ad75..1e16d58fc 100644 --- a/escher/include/escher/alternate_empty_view_controller.h +++ b/escher/include/escher/alternate_empty_view_controller.h @@ -12,6 +12,7 @@ public: const char * title() override; bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; + void initView() override; void viewWillAppear() override; void viewDidDisappear() override; private: diff --git a/escher/include/escher/bank_view_controller.h b/escher/include/escher/bank_view_controller.h index 5da61235b..90f7270da 100644 --- a/escher/include/escher/bank_view_controller.h +++ b/escher/include/escher/bank_view_controller.h @@ -15,6 +15,7 @@ public: View * view() override { return &m_view; } void didEnterResponderChain(Responder * previousResponder) override; + void initView() override; void viewWillAppear() override; void viewDidDisappear() override; private: diff --git a/escher/include/escher/button_row_controller.h b/escher/include/escher/button_row_controller.h index 4f4faa66f..879c1b5d7 100644 --- a/escher/include/escher/button_row_controller.h +++ b/escher/include/escher/button_row_controller.h @@ -33,6 +33,7 @@ public: int selectedButton(); bool setSelectedButton(int selectedButton); void setMessageOfButtonAtIndex(I18n::Message message, int index); + void initView() override; void viewWillAppear() override; void viewDidDisappear() override; ViewController::DisplayParameter displayParameter() override { return DisplayParameter::DoNotShowOwnTitle; } diff --git a/escher/include/escher/modal_view_controller.h b/escher/include/escher/modal_view_controller.h index 198e473b3..1bce427ad 100644 --- a/escher/include/escher/modal_view_controller.h +++ b/escher/include/escher/modal_view_controller.h @@ -16,6 +16,7 @@ public: void reloadModalViewController(); void dismissModalViewController(); bool isDisplayingModal(); + void initView() override; void viewWillAppear() override; void viewDidDisappear() override; protected: diff --git a/escher/include/escher/stack_view_controller.h b/escher/include/escher/stack_view_controller.h index f711f2748..7675072c4 100644 --- a/escher/include/escher/stack_view_controller.h +++ b/escher/include/escher/stack_view_controller.h @@ -21,6 +21,7 @@ public: const char * title() override; bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; + void initView() override; void viewWillAppear() override; void viewDidDisappear() override; private: diff --git a/escher/include/escher/tab_view_controller.h b/escher/include/escher/tab_view_controller.h index 9e6328b03..f7bed6244 100644 --- a/escher/include/escher/tab_view_controller.h +++ b/escher/include/escher/tab_view_controller.h @@ -19,6 +19,7 @@ public: void didBecomeFirstResponder() override; void didEnterResponderChain(Responder * previousResponder) override; void willResignFirstResponder() override; + void initView() override; void viewWillAppear() override; void viewDidDisappear() override; private: diff --git a/escher/include/escher/view_controller.h b/escher/include/escher/view_controller.h index 316d7cae2..6084edc39 100644 --- a/escher/include/escher/view_controller.h +++ b/escher/include/escher/view_controller.h @@ -21,8 +21,12 @@ extern "C" { * - viewWillDisappear * - willExitResponderChain * - willResignFirstResponder - * Both methods are always called after setting a view and layouting it - * subviews. */ + * + * Both methods are always called after setting a view and laying its subwiews + * out. + * + * The method initView is called before setting a View (or often sets itself) + * and laying it out. */ #include #include @@ -43,6 +47,7 @@ public: ViewController(Responder * parentResponder); virtual const char * title(); virtual View * view() = 0; + virtual void initView() {} virtual void viewWillAppear(); virtual void viewDidDisappear(); virtual DisplayParameter displayParameter() { return DisplayParameter::Default; } diff --git a/escher/src/alternate_empty_view_controller.cpp b/escher/src/alternate_empty_view_controller.cpp index 5c23c1af9..43159799e 100644 --- a/escher/src/alternate_empty_view_controller.cpp +++ b/escher/src/alternate_empty_view_controller.cpp @@ -71,6 +71,10 @@ void AlternateEmptyViewController::didBecomeFirstResponder() { } } +void AlternateEmptyViewController::initView() { + m_contentView.mainViewController()->initView(); +} + void AlternateEmptyViewController::viewWillAppear() { m_contentView.layoutSubviews(); if (!m_contentView.alternateEmptyViewDelegate()->isEmpty()) { diff --git a/escher/src/app.cpp b/escher/src/app.cpp index 4a0b73b36..db8d49626 100644 --- a/escher/src/app.cpp +++ b/escher/src/app.cpp @@ -108,8 +108,9 @@ const Container * App::container() const { void App::didBecomeActive(Window * window) { View * view = m_modalViewController.view(); assert(m_modalViewController.app() == this); - m_modalViewController.viewWillAppear(); + m_modalViewController.initView(); window->setContentView(view); + m_modalViewController.viewWillAppear(); setFirstResponder(&m_modalViewController); } diff --git a/escher/src/bank_view_controller.cpp b/escher/src/bank_view_controller.cpp index 6e6146ad0..315088247 100644 --- a/escher/src/bank_view_controller.cpp +++ b/escher/src/bank_view_controller.cpp @@ -24,8 +24,14 @@ void BankViewController::didEnterResponderChain(Responder * previousResponder) { app()->setFirstResponder(activeViewController()); } -void BankViewController::viewWillAppear() { +void BankViewController::initView() { + for (int i = 0; i < numberOfChildren(); i++) { + childAtIndex(i)->initView(); + } m_view.setSubview(activeViewController()->view()); +} + +void BankViewController::viewWillAppear() { activeViewController()->viewWillAppear(); } diff --git a/escher/src/button_row_controller.cpp b/escher/src/button_row_controller.cpp index e225a5fae..941415889 100644 --- a/escher/src/button_row_controller.cpp +++ b/escher/src/button_row_controller.cpp @@ -211,6 +211,10 @@ bool ButtonRowController::handleEvent(Ion::Events::Event event) { return false; } +void ButtonRowController::initView() { + m_contentView.mainViewController()->initView(); +} + void ButtonRowController::viewWillAppear() { /* We need to layout subviews at first appearance because the number of * buttons might have changed between 2 appearences. */ diff --git a/escher/src/modal_view_controller.cpp b/escher/src/modal_view_controller.cpp index cd3ab4bd3..316a85c26 100644 --- a/escher/src/modal_view_controller.cpp +++ b/escher/src/modal_view_controller.cpp @@ -118,6 +118,7 @@ void ModalViewController::displayModalViewController(ViewController * vc, float m_currentModalViewController = vc; vc->setParentResponder(this); m_previousResponder = app()->firstResponder(); + m_currentModalViewController->initView(); m_contentView.presentModalView(vc->view(), verticalAlignment, horizontalAlignment, topMargin, leftMargin, bottomMargin, rightMargin); m_currentModalViewController->viewWillAppear(); app()->setFirstResponder(vc); @@ -152,8 +153,12 @@ bool ModalViewController::handleEvent(Ion::Events::Event event) { return false; } -void ModalViewController::viewWillAppear() { +void ModalViewController::initView() { m_contentView.setMainView(m_regularViewController->view()); + m_regularViewController->initView(); +} + +void ModalViewController::viewWillAppear() { m_contentView.layoutSubviews(); if (m_contentView.isDisplayingModal()) { m_currentModalViewController->viewWillAppear(); diff --git a/escher/src/stack_view_controller.cpp b/escher/src/stack_view_controller.cpp index fd5e2e74e..795a5ee3a 100644 --- a/escher/src/stack_view_controller.cpp +++ b/escher/src/stack_view_controller.cpp @@ -96,6 +96,7 @@ void StackViewController::push(ViewController * vc, KDColor textColor, KDColor b Frame frame = Frame(vc, textColor, backgroundColor, separatorColor); /* Add the frame to the model */ pushModel(frame); + frame.viewController()->initView(); if (!m_isVisible) { return; } @@ -156,6 +157,10 @@ View * StackViewController::view() { return &m_view; } +void StackViewController::initView() { + m_childrenFrame[0].viewController()->initView(); +} + void StackViewController::viewWillAppear() { /* Load the stack view */ for (int i = 0; i < m_numberOfChildren; i++) { diff --git a/escher/src/tab_view_controller.cpp b/escher/src/tab_view_controller.cpp index 91672bfe3..098663bc7 100644 --- a/escher/src/tab_view_controller.cpp +++ b/escher/src/tab_view_controller.cpp @@ -156,12 +156,14 @@ const char * TabViewController::tabName(uint8_t index) { return m_children[index]->title(); } -void TabViewController::viewWillAppear() { - if (m_view.m_tabView.numberOfTabs() != m_numberOfChildren) { - for (int i=0; iinitView(); } +} + +void TabViewController::viewWillAppear() { if (m_dataSource->activeTab() < 0) { m_dataSource->setActiveTab(0); }