diff --git a/apps/Makefile b/apps/Makefile index f7392f395..d6f4adef4 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -12,6 +12,7 @@ apps = $(foreach i,${EPSILON_APPS},$(eval include apps/$(i)/Makefile)) apps_src += $(addprefix apps/,\ + alternate_empty_nested_menu_controller.cpp \ apps_container.cpp \ apps_container_launch_default.cpp:-onboarding \ apps_container_launch_on_boarding.cpp:+onboarding \ diff --git a/apps/alternate_empty_nested_menu_controller.cpp b/apps/alternate_empty_nested_menu_controller.cpp new file mode 100644 index 000000000..b09acca75 --- /dev/null +++ b/apps/alternate_empty_nested_menu_controller.cpp @@ -0,0 +1,18 @@ +#include "alternate_empty_nested_menu_controller.h" + +void AlternateEmptyNestedMenuController::viewDidDisappear() { + if (isDisplayingEmptyController()) { + pop(); + } + NestedMenuController::viewDidDisappear(); +} + +bool AlternateEmptyNestedMenuController::displayEmptyController() { + assert(!isDisplayingEmptyController()); + // If the content is empty, we push an empty controller. + if (numberOfRows() == 0) { + push(emptyViewController()); + return true; + } + return false; +} diff --git a/apps/alternate_empty_nested_menu_controller.h b/apps/alternate_empty_nested_menu_controller.h new file mode 100644 index 000000000..0427a2bf8 --- /dev/null +++ b/apps/alternate_empty_nested_menu_controller.h @@ -0,0 +1,19 @@ +#ifndef APPS_ALTERNATE_EMPTY_NESTED_MENU_CONTROLLER_H +#define APPS_ALTERNATE_EMPTY_NESTED_MENU_CONTROLLER_H + +#include + +class AlternateEmptyNestedMenuController : public NestedMenuController { +public: + AlternateEmptyNestedMenuController(I18n::Message title) : + NestedMenuController(nullptr, title) + {} + // View Controller + void viewDidDisappear() override; +protected: + virtual ViewController * emptyViewController() = 0; + virtual bool isDisplayingEmptyController() = 0; + bool displayEmptyController(); +}; + +#endif diff --git a/apps/variable_box_controller.cpp b/apps/variable_box_controller.cpp index 5b5f41dce..4637220b3 100644 --- a/apps/variable_box_controller.cpp +++ b/apps/variable_box_controller.cpp @@ -15,7 +15,7 @@ using namespace Shared; using namespace Ion; VariableBoxController::VariableBoxController() : - NestedMenuController(nullptr, I18n::Message::Variables), + AlternateEmptyNestedMenuController(I18n::Message::Variables), m_currentPage(Page::RootMenu), m_lockPageDelete(Page::RootMenu), m_firstMemoizedLayoutIndex(0) @@ -27,15 +27,11 @@ VariableBoxController::VariableBoxController() : void VariableBoxController::viewWillAppear() { assert(m_currentPage == Page::RootMenu); - NestedMenuController::viewWillAppear(); + AlternateEmptyNestedMenuController::viewWillAppear(); } void VariableBoxController::viewDidDisappear() { - if (isDisplayingEmptyController()) { - pop(); - } - - NestedMenuController::viewDidDisappear(); + AlternateEmptyNestedMenuController::viewDidDisappear(); /* NestedMenuController::viewDidDisappear might need cell heights, which would * use the VariableBoxController cell heights memoization. We thus reset the @@ -69,7 +65,7 @@ bool VariableBoxController::handleEvent(Ion::Events::Event event) { displayEmptyController(); return true; } - return NestedMenuController::handleEvent(event); + return AlternateEmptyNestedMenuController::handleEvent(event); } int VariableBoxController::numberOfRows() const { @@ -130,7 +126,7 @@ KDCoordinate VariableBoxController::rowHeight(int index) { return std::max(layoutR.layoutSize().height()+k_leafMargin, Metric::ToolboxRowHeight); } } - return NestedMenuController::rowHeight(index); + return AlternateEmptyNestedMenuController::rowHeight(index); } int VariableBoxController::typeAtLocation(int i, int j) { @@ -163,7 +159,7 @@ void VariableBoxController::setPage(Page page) { bool VariableBoxController::selectSubMenu(int selectedRow) { m_selectableTableView.deselectTable(); setPage(pageAtIndex(selectedRow)); - bool selectSubMenu = NestedMenuController::selectSubMenu(selectedRow); + bool selectSubMenu = AlternateEmptyNestedMenuController::selectSubMenu(selectedRow); if (displayEmptyController()) { return true; } @@ -177,7 +173,7 @@ bool VariableBoxController::returnToPreviousMenu() { m_selectableTableView.deselectTable(); } setPage(Page::RootMenu); - return NestedMenuController::returnToPreviousMenu(); + return AlternateEmptyNestedMenuController::returnToPreviousMenu(); } bool VariableBoxController::selectLeaf(int selectedRow) { @@ -261,15 +257,9 @@ Storage::Record VariableBoxController::recordAtIndex(int rowIndex) { return Storage::sharedStorage()->recordWithExtensionAtIndex(extension(), rowIndex); } -bool VariableBoxController::displayEmptyController() { - assert(!isDisplayingEmptyController()); - // If the content is empty, we push above an empty controller. - if (numberOfRows() == 0) { - m_emptyViewController.setType((VariableBoxEmptyController::Type)m_currentPage); - push(&m_emptyViewController); - return true; - } - return false; +ViewController * VariableBoxController::emptyViewController() { + m_emptyViewController.setType((VariableBoxEmptyController::Type)m_currentPage); + return &m_emptyViewController; } void VariableBoxController::resetMemoization() { diff --git a/apps/variable_box_controller.h b/apps/variable_box_controller.h index 95824e29d..affb031fd 100644 --- a/apps/variable_box_controller.h +++ b/apps/variable_box_controller.h @@ -3,11 +3,11 @@ #define MATRIX_VARIABLES 1 -#include +#include "alternate_empty_nested_menu_controller.h" #include "variable_box_empty_controller.h" #include -class VariableBoxController : public NestedMenuController { +class VariableBoxController : public AlternateEmptyNestedMenuController { public: VariableBoxController(); @@ -47,8 +47,8 @@ private: Poincare::Layout expressionLayoutForRecord(Ion::Storage::Record record, int index); const char * extension() const; Ion::Storage::Record recordAtIndex(int rowIndex); - bool displayEmptyController(); - bool isDisplayingEmptyController() { return StackViewController::depth() == 2; } + ViewController * emptyViewController() override; + bool isDisplayingEmptyController() override { return StackViewController::depth() == 2; } void resetMemoization(); void destroyRecordAtRowIndex(int rowIndex); Page m_currentPage;