From 6f138e6b1c427739bacc3fee76f11abefbc74d4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Mon, 13 Feb 2017 16:31:05 +0100 Subject: [PATCH] [escher] Add methods viewWillAppear/Disappear in view controller instead of keeping track of dataHasChanged in the selectable table view Change-Id: Id2626f527f44714e29b9bd66e2c843193e1b57b5 --- apps/graph/list/list_controller.cpp | 3 --- .../values/function_parameter_controller.cpp | 2 +- apps/graph/values/values_controller.cpp | 9 ------- apps/graph/values/values_controller.h | 1 - apps/node_list_view_controller.cpp | 1 + apps/probability/image_table_view.cpp | 2 +- apps/regression/calculation_controller.cpp | 4 +++ apps/regression/calculation_controller.h | 1 + .../list/change_type_parameter_controller.cpp | 2 +- apps/sequence/list/list_controller.cpp | 2 +- apps/sequence/list/sequence_title_cell.cpp | 2 +- .../list/type_parameter_controller.cpp | 2 +- apps/settings/main_controller.cpp | 6 +++-- apps/settings/main_controller.h | 1 + apps/settings/sub_controller.cpp | 5 +++- apps/settings/sub_controller.h | 1 + .../editable_cell_table_view_controller.cpp | 13 ++++++--- .../editable_cell_table_view_controller.h | 1 + apps/shared/list_controller.cpp | 4 +++ apps/shared/list_controller.h | 1 + apps/shared/list_parameter_controller.cpp | 2 +- apps/shared/store_controller.cpp | 1 - apps/statistics/calculation_controller.cpp | 4 +++ apps/statistics/calculation_controller.h | 1 + .../escher/alternate_empty_view_controller.h | 2 ++ escher/include/escher/app.h | 6 ++++- escher/include/escher/editable_text_cell.h | 1 + .../escher/even_odd_editable_text_cell.h | 1 + .../include/escher/header_view_controller.h | 2 ++ escher/include/escher/modal_view_controller.h | 2 ++ escher/include/escher/selectable_table_view.h | 2 -- escher/include/escher/stack_view_controller.h | 2 ++ escher/include/escher/tab_view_controller.h | 2 ++ escher/include/escher/view_controller.h | 2 ++ .../src/alternate_empty_view_controller.cpp | 12 +++++++++ escher/src/app.cpp | 27 +++++++++++-------- escher/src/container.cpp | 7 ++++- escher/src/editable_text_cell.cpp | 4 +++ escher/src/even_odd_editable_text_cell.cpp | 4 +++ escher/src/header_view_controller.cpp | 8 ++++++ escher/src/modal_view_controller.cpp | 18 +++++++++++++ escher/src/selectable_table_view.cpp | 12 +-------- escher/src/stack_view_controller.cpp | 20 ++++++++++++++ escher/src/tab_view_controller.cpp | 21 ++++++++++++--- escher/src/view_controller.cpp | 6 +++++ 45 files changed, 176 insertions(+), 56 deletions(-) diff --git a/apps/graph/list/list_controller.cpp b/apps/graph/list/list_controller.cpp index a50bd5115..834a7cd2d 100644 --- a/apps/graph/list/list_controller.cpp +++ b/apps/graph/list/list_controller.cpp @@ -85,7 +85,6 @@ void ListController::editExpression(FunctionExpressionCell * functionCell, Ion:: }, [](void * context, void * sender){ }); - m_selectableTableView.dataHasChanged(true); } ListParameterController * ListController::parameterController() { @@ -110,8 +109,6 @@ void ListController::configureFunction(Shared::Function * function) { StackViewController * stack = stackController(); parameterController()->setFunction(function); stack->push(parameterController()); - // Force to reload the table (deleted functions, desactivated function) - m_selectableTableView.dataHasChanged(true); } void ListController::willDisplayTitleCellAtIndex(TableViewCell * cell, int j) { diff --git a/apps/graph/values/function_parameter_controller.cpp b/apps/graph/values/function_parameter_controller.cpp index ebea29fb2..15250592a 100644 --- a/apps/graph/values/function_parameter_controller.cpp +++ b/apps/graph/values/function_parameter_controller.cpp @@ -35,7 +35,7 @@ void FunctionParameterController::setFunction(Function * function) { } void FunctionParameterController::didBecomeFirstResponder() { - m_selectableTableView.dataHasChanged(true); + m_selectableTableView.reloadData(); m_selectableTableView.selectCellAtLocation(0, 0); app()->setFirstResponder(&m_selectableTableView); } diff --git a/apps/graph/values/values_controller.cpp b/apps/graph/values/values_controller.cpp index a00b5d705..7bc7da8cb 100644 --- a/apps/graph/values/values_controller.cpp +++ b/apps/graph/values/values_controller.cpp @@ -25,7 +25,6 @@ ValuesController::ValuesController(Responder * parentResponder, FunctionStore * m_derivativeParameterController(DerivativeParameterController(this)), m_setIntervalButton(Button(this, "Regler l'intervalle",Invocation([](void * context, void * sender) { ValuesController * valuesController = (ValuesController *) context; - valuesController->hasChangedTableData(); StackViewController * stack = ((StackViewController *)valuesController->stackController()); stack->push(valuesController->intervalParameterController()); }, this), KDText::FontSize::Small)), @@ -83,20 +82,16 @@ bool ValuesController::handleEvent(Ion::Events::Event event) { } if (event == Ion::Events::OK) { if (activeRow() == -1) { - m_selectableTableView.dataHasChanged(true); return headerViewController()->handleEvent(event); } if (activeRow() == 0) { if (activeColumn() == 0) { - m_selectableTableView.dataHasChanged(true); configureAbscissa(); return true; } if (isDerivativeColumn(activeColumn())) { - m_selectableTableView.dataHasChanged(true); configureDerivativeFunction(); } else { - m_selectableTableView.dataHasChanged(true); configureFunction(); } return true; @@ -291,10 +286,6 @@ Responder * ValuesController::defaultController() { return tabController(); } -void ValuesController::hasChangedTableData() { - m_selectableTableView.dataHasChanged(true); -} - void ValuesController::selectCellAtLocation(int i, int j) { m_selectableTableView.selectCellAtLocation(i, j); } diff --git a/apps/graph/values/values_controller.h b/apps/graph/values/values_controller.h index 65678ce74..fa56d9db0 100644 --- a/apps/graph/values/values_controller.h +++ b/apps/graph/values/values_controller.h @@ -35,7 +35,6 @@ public: bool isEmpty() const override; const char * emptyMessage() override; Responder * defaultController() override; - void hasChangedTableData(); void selectCellAtLocation(int i, int j); int activeRow(); int activeColumn(); diff --git a/apps/node_list_view_controller.cpp b/apps/node_list_view_controller.cpp index 04ab1a692..df4f3d9b3 100644 --- a/apps/node_list_view_controller.cpp +++ b/apps/node_list_view_controller.cpp @@ -25,6 +25,7 @@ Node * NodeListViewController::nodeModel() { void NodeListViewController::setNodeModel(Node * nodeModel) { m_nodeModel = nodeModel; + m_selectableTableView.reloadData(); } void NodeListViewController::setFirstSelectedRow(int firstSelectedRow) { diff --git a/apps/probability/image_table_view.cpp b/apps/probability/image_table_view.cpp index 8ae15b3ba..44ddbbaf4 100644 --- a/apps/probability/image_table_view.cpp +++ b/apps/probability/image_table_view.cpp @@ -59,7 +59,7 @@ void ImageTableView::setCalculation(Calculation * calculation, int index) { } void ImageTableView::didBecomeFirstResponder() { - m_selectableTableView.dataHasChanged(true); + m_selectableTableView.reloadData(); m_isSelected = true; if (m_selectableTableView.selectedRow() == -1) { m_selectableTableView.selectCellAtLocation(0, 0); diff --git a/apps/regression/calculation_controller.cpp b/apps/regression/calculation_controller.cpp index 6e2942845..6e3784a21 100644 --- a/apps/regression/calculation_controller.cpp +++ b/apps/regression/calculation_controller.cpp @@ -220,6 +220,10 @@ int CalculationController::typeAtLocation(int i, int j) { return 3; } +void CalculationController::viewWillAppear() { + m_selectableTableView.reloadData(); +} + Responder * CalculationController::tabController() const { return (parentResponder()->parentResponder()->parentResponder()); } diff --git a/apps/regression/calculation_controller.h b/apps/regression/calculation_controller.h index c3f581476..fcb4b66f4 100644 --- a/apps/regression/calculation_controller.h +++ b/apps/regression/calculation_controller.h @@ -33,6 +33,7 @@ public: TableViewCell * reusableCell(int index, int type) override; int reusableCellCount(int type) override; int typeAtLocation(int i, int j) override; + void viewWillAppear() override; private: Responder * tabController() const; constexpr static int k_totalNumberOfRows = 11; diff --git a/apps/sequence/list/change_type_parameter_controller.cpp b/apps/sequence/list/change_type_parameter_controller.cpp index 140a2cbec..894402855 100644 --- a/apps/sequence/list/change_type_parameter_controller.cpp +++ b/apps/sequence/list/change_type_parameter_controller.cpp @@ -33,7 +33,7 @@ View * ChangeTypeParameterController::view() { } void ChangeTypeParameterController::didBecomeFirstResponder() { - m_selectableTableView.dataHasChanged(true); + m_selectableTableView.reloadData(); m_selectableTableView.selectCellAtLocation(0, 0); app()->setFirstResponder(&m_selectableTableView); } diff --git a/apps/sequence/list/list_controller.cpp b/apps/sequence/list/list_controller.cpp index 56204e2d4..9738ed4ef 100644 --- a/apps/sequence/list/list_controller.cpp +++ b/apps/sequence/list/list_controller.cpp @@ -58,7 +58,7 @@ bool ListController::handleEvent(Ion::Events::Event event) { } if (event == Ion::Events::OK && m_selectableTableView.selectedColumn() == 1 && m_selectableTableView.selectedRow() == numberOfRows() - 1) { - m_selectableTableView.dataHasChanged(true); + m_selectableTableView.reloadData(); app()->displayModalViewController(&m_typeStackController, 0.f, 0.f, 32, 20, 20, 20); return true; } diff --git a/apps/sequence/list/sequence_title_cell.cpp b/apps/sequence/list/sequence_title_cell.cpp index 1f99ccc16..ec1da4cff 100644 --- a/apps/sequence/list/sequence_title_cell.cpp +++ b/apps/sequence/list/sequence_title_cell.cpp @@ -105,7 +105,7 @@ bool SequenceTitleCell::handleEvent(Ion::Events::Event event) { m_listParameterController->setSequence(m_sequence); stack->push(m_listParameterController); SelectableTableView * table = (SelectableTableView *)parentResponder(); - table->dataHasChanged(true); + table->reloadData(); return true; } return false; diff --git a/apps/sequence/list/type_parameter_controller.cpp b/apps/sequence/list/type_parameter_controller.cpp index 980865867..92e489b59 100644 --- a/apps/sequence/list/type_parameter_controller.cpp +++ b/apps/sequence/list/type_parameter_controller.cpp @@ -35,7 +35,7 @@ View * TypeParameterController::view() { } void TypeParameterController::didBecomeFirstResponder() { - m_selectableTableView.dataHasChanged(true); + m_selectableTableView.reloadData(); m_selectableTableView.selectCellAtLocation(0, 0); app()->setFirstResponder(&m_selectableTableView); } diff --git a/apps/settings/main_controller.cpp b/apps/settings/main_controller.cpp index 2e5dbac19..b44744169 100644 --- a/apps/settings/main_controller.cpp +++ b/apps/settings/main_controller.cpp @@ -35,7 +35,6 @@ View * MainController::view() { } void MainController::didBecomeFirstResponder() { - m_selectableTableView.dataHasChanged(true); if (m_selectableTableView.selectedRow() < 0) { m_selectableTableView.selectCellAtLocation(0, 0); } @@ -45,7 +44,6 @@ void MainController::didBecomeFirstResponder() { bool MainController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::OK) { m_subController.setNodeModel(m_nodeModel->children(m_selectableTableView.selectedRow()), m_selectableTableView.selectedRow()); - m_selectableTableView.dataHasChanged(true); StackViewController * stack = stackController(); stack->push(&m_subController); } @@ -92,6 +90,10 @@ void MainController::willDisplayCellForIndex(TableViewCell * cell, int index) { } } +void MainController::viewWillAppear() { + m_selectableTableView.reloadData(); +} + StackViewController * MainController::stackController() const { return (StackViewController *)parentResponder(); } diff --git a/apps/settings/main_controller.h b/apps/settings/main_controller.h index 5bf2e0621..57040b496 100644 --- a/apps/settings/main_controller.h +++ b/apps/settings/main_controller.h @@ -21,6 +21,7 @@ public: TableViewCell * reusableCell(int index) override; int reusableCellCount() override; void willDisplayCellForIndex(TableViewCell * cell, int index) override; + void viewWillAppear() override; private: StackViewController * stackController() const; constexpr static int k_totalNumberOfCell = 5; diff --git a/apps/settings/sub_controller.cpp b/apps/settings/sub_controller.cpp index 74ad687a6..2b7828b3d 100644 --- a/apps/settings/sub_controller.cpp +++ b/apps/settings/sub_controller.cpp @@ -30,7 +30,6 @@ View * SubController::view() { } void SubController::didBecomeFirstResponder() { - m_selectableTableView.dataHasChanged(true); m_selectableTableView.selectCellAtLocation(0, valueIndexAtPreferenceIndex(m_preferenceIndex)); app()->setFirstResponder(&m_selectableTableView); } @@ -77,6 +76,10 @@ void SubController::setNodeModel(const Node * nodeModel, int preferenceIndex) { m_preferenceIndex = preferenceIndex; } +void SubController::viewWillAppear() { + m_selectableTableView.reloadData(); +} + StackViewController * SubController::stackController() const { return (StackViewController *)parentResponder(); } diff --git a/apps/settings/sub_controller.h b/apps/settings/sub_controller.h index a79c7b31d..7666b8901 100644 --- a/apps/settings/sub_controller.h +++ b/apps/settings/sub_controller.h @@ -20,6 +20,7 @@ public: int reusableCellCount() override; void willDisplayCellForIndex(TableViewCell * cell, int index) override; void setNodeModel(const Node * nodeModel, int preferenceIndex); + void viewWillAppear() override; private: StackViewController * stackController() const; void setPreferenceAtIndexWithValueIndex(int preferenceIndex, int valueIndex); diff --git a/apps/shared/editable_cell_table_view_controller.cpp b/apps/shared/editable_cell_table_view_controller.cpp index d2f4c6e08..77b0fbd2f 100644 --- a/apps/shared/editable_cell_table_view_controller.cpp +++ b/apps/shared/editable_cell_table_view_controller.cpp @@ -78,14 +78,16 @@ void EditableCellTableViewController::willDisplayCellAtLocationWithDisplayMode(T if (j == numberOfRows() - 1) { /* Display an empty line only if there is enough space for a new element in * data */ - if (numberOfElements() < maxNumberOfElements()) { + if (numberOfElements() < maxNumberOfElements() && !myEditableValueCell->isEditing()) { buffer[0] = 0; myEditableValueCell->setText(buffer); return; } } - Complex::convertFloatToText(dataAtLocation(i, j), buffer, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, displayMode); - myEditableValueCell->setText(buffer); + if (!myEditableValueCell->isEditing()) { + Complex::convertFloatToText(dataAtLocation(i, j), buffer, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, displayMode); + myEditableValueCell->setText(buffer); + } return; } } @@ -103,4 +105,9 @@ void EditableCellTableViewController::didBecomeFirstResponder() { app()->setFirstResponder(&m_selectableTableView); } + +void EditableCellTableViewController::viewWillAppear() { + m_selectableTableView.reloadData(); +} + } diff --git a/apps/shared/editable_cell_table_view_controller.h b/apps/shared/editable_cell_table_view_controller.h index f97df5222..2f9db123d 100644 --- a/apps/shared/editable_cell_table_view_controller.h +++ b/apps/shared/editable_cell_table_view_controller.h @@ -23,6 +23,7 @@ public: int indexFromCumulatedHeight(KDCoordinate offsetY) override; void didBecomeFirstResponder() override; + void viewWillAppear() override; protected: SelectableTableView m_selectableTableView; private: diff --git a/apps/shared/list_controller.cpp b/apps/shared/list_controller.cpp index e6c103e26..fa1bd5480 100644 --- a/apps/shared/list_controller.cpp +++ b/apps/shared/list_controller.cpp @@ -159,6 +159,10 @@ bool ListController::handleEvent(Ion::Events::Event event) { return false; } +void ListController::viewWillAppear() { + m_selectableTableView.reloadData(); +} + StackViewController * ListController::stackController() const{ return (StackViewController *)(parentResponder()->parentResponder()); } diff --git a/apps/shared/list_controller.h b/apps/shared/list_controller.h index 5256b4e87..3ddeda2df 100644 --- a/apps/shared/list_controller.h +++ b/apps/shared/list_controller.h @@ -26,6 +26,7 @@ public: void willDisplayCellAtLocation(TableViewCell * cell, int i, int j) override; void didBecomeFirstResponder() override; bool handleEvent(Ion::Events::Event event) override; + void viewWillAppear() override; protected: static constexpr KDCoordinate k_emptyRowHeight = 50; StackViewController * stackController() const; diff --git a/apps/shared/list_parameter_controller.cpp b/apps/shared/list_parameter_controller.cpp index f08722361..6d9507b96 100644 --- a/apps/shared/list_parameter_controller.cpp +++ b/apps/shared/list_parameter_controller.cpp @@ -23,7 +23,7 @@ View * ListParameterController::view() { } void ListParameterController::didBecomeFirstResponder() { - m_selectableTableView.dataHasChanged(true); + m_selectableTableView.reloadData(); if (m_selectableTableView.selectedRow() == -1) { m_selectableTableView.selectCellAtLocation(0, 0); } else { diff --git a/apps/shared/store_controller.cpp b/apps/shared/store_controller.cpp index 9f0a43726..8a0e292c5 100644 --- a/apps/shared/store_controller.cpp +++ b/apps/shared/store_controller.cpp @@ -79,7 +79,6 @@ bool StoreController::handleEvent(Ion::Events::Event event) { } if (event == Ion::Events::OK && m_selectableTableView.selectedRow() == 0) { m_storeParameterController.selectXColumn(m_selectableTableView.selectedColumn() == 0); - m_selectableTableView.dataHasChanged(true); StackViewController * stack = ((StackViewController *)parentResponder()->parentResponder()); stack->push(&m_storeParameterController); return true; diff --git a/apps/statistics/calculation_controller.cpp b/apps/statistics/calculation_controller.cpp index de56cc214..8199e4e46 100644 --- a/apps/statistics/calculation_controller.cpp +++ b/apps/statistics/calculation_controller.cpp @@ -136,6 +136,10 @@ int CalculationController::typeAtLocation(int i, int j) { return i; } +void CalculationController::viewWillAppear() { + m_selectableTableView.reloadData(); +} + Responder * CalculationController::tabController() const { return (parentResponder()->parentResponder()->parentResponder()); } diff --git a/apps/statistics/calculation_controller.h b/apps/statistics/calculation_controller.h index c0ec18ffd..fdb555697 100644 --- a/apps/statistics/calculation_controller.h +++ b/apps/statistics/calculation_controller.h @@ -31,6 +31,7 @@ public: TableViewCell * reusableCell(int index, int type) override; int reusableCellCount(int type) override; int typeAtLocation(int i, int j) override; + void viewWillAppear() override; private: Responder * tabController() const; constexpr static int k_totalNumberOfRows = 13; diff --git a/escher/include/escher/alternate_empty_view_controller.h b/escher/include/escher/alternate_empty_view_controller.h index 4bd054e6e..aa86fc46f 100644 --- a/escher/include/escher/alternate_empty_view_controller.h +++ b/escher/include/escher/alternate_empty_view_controller.h @@ -12,6 +12,8 @@ public: const char * title() const override; bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; + void viewWillAppear() override; + void viewWillDisappear() override; private: class ContentView : public View { public: diff --git a/escher/include/escher/app.h b/escher/include/escher/app.h index f6111a682..a19d3adb4 100644 --- a/escher/include/escher/app.h +++ b/escher/include/escher/app.h @@ -22,7 +22,6 @@ class App : public Responder { public: constexpr static uint8_t Magic = 0xA8; App(Container * container, ViewController * rootViewController, const char * name = nullptr, const char * upperName = nullptr, const Image * icon = nullptr); - void setWindow(Window * window); void setFirstResponder(Responder * responder); Responder * firstResponder(); void processEvent(Ion::Events::Event event); @@ -35,6 +34,11 @@ public: const char * upperName(); const Image * icon(); uint8_t m_magic; // Poor man's RTTI + + + virtual void didBecomeActive(Window * window); + virtual void willBecomeInactive(); + protected: ModalViewController m_modalViewController; private: diff --git a/escher/include/escher/editable_text_cell.h b/escher/include/escher/editable_text_cell.h index b5217d815..e26b26a92 100644 --- a/escher/include/escher/editable_text_cell.h +++ b/escher/include/escher/editable_text_cell.h @@ -18,6 +18,7 @@ public: View * subviewAtIndex(int index) override; void layoutSubviews() override; void didBecomeFirstResponder() override; + bool isEditing(); void setEditing(bool isEditing); constexpr static int k_bufferLength = 255; private: diff --git a/escher/include/escher/even_odd_editable_text_cell.h b/escher/include/escher/even_odd_editable_text_cell.h index 866c29338..f3cb46710 100644 --- a/escher/include/escher/even_odd_editable_text_cell.h +++ b/escher/include/escher/even_odd_editable_text_cell.h @@ -17,6 +17,7 @@ public: View * subviewAtIndex(int index) override; void layoutSubviews() override; void didBecomeFirstResponder() override; + bool isEditing(); void setEditing(bool isEditing); private: EditableTextCell m_editableCell; diff --git a/escher/include/escher/header_view_controller.h b/escher/include/escher/header_view_controller.h index 73fb8d94b..2c03ea0fa 100644 --- a/escher/include/escher/header_view_controller.h +++ b/escher/include/escher/header_view_controller.h @@ -16,6 +16,8 @@ public: void didBecomeFirstResponder() override; bool handleEvent(Ion::Events::Event event) override; bool setSelectedButton(int selectedButton); + void viewWillAppear() override; + void viewWillDisappear() override; private: class ContentView : public View { public: diff --git a/escher/include/escher/modal_view_controller.h b/escher/include/escher/modal_view_controller.h index eb86a42f6..8414a0419 100644 --- a/escher/include/escher/modal_view_controller.h +++ b/escher/include/escher/modal_view_controller.h @@ -16,6 +16,8 @@ public: KDCoordinate topMargin = 0, KDCoordinate leftMargin = 0, KDCoordinate bottomMargin = 0, KDCoordinate rightMargin = 0); void dismissModalViewController(); bool isDisplayingModal(); + void viewWillAppear() override; + void viewWillDisappear() override; private: class ContentView : public View { public: diff --git a/escher/include/escher/selectable_table_view.h b/escher/include/escher/selectable_table_view.h index dd4abd1c2..ee57315ac 100644 --- a/escher/include/escher/selectable_table_view.h +++ b/escher/include/escher/selectable_table_view.h @@ -30,13 +30,11 @@ public: void deselectTable(); bool selectCellAtLocation(int i, int j); TableViewCell * selectedCell(); - void dataHasChanged(bool dataHasChanged); protected: SelectableTableViewDelegate * m_delegate; private: int m_selectedCellX; int m_selectedCellY; - bool m_dataHasChanged; }; #endif diff --git a/escher/include/escher/stack_view_controller.h b/escher/include/escher/stack_view_controller.h index 1093879b9..06e197284 100644 --- a/escher/include/escher/stack_view_controller.h +++ b/escher/include/escher/stack_view_controller.h @@ -21,6 +21,8 @@ public: const char * title() const override; bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; + void viewWillAppear() override; + void viewWillDisappear() override; private: class ControllerView : public View { public: diff --git a/escher/include/escher/tab_view_controller.h b/escher/include/escher/tab_view_controller.h index eb4f3d5a8..c8b917744 100644 --- a/escher/include/escher/tab_view_controller.h +++ b/escher/include/escher/tab_view_controller.h @@ -17,6 +17,8 @@ public: bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; void didResignFirstResponder() override; + void viewWillAppear() override; + void viewWillDisappear() override; private: class ContentView : public View { public: diff --git a/escher/include/escher/view_controller.h b/escher/include/escher/view_controller.h index fa237ad86..51916ed95 100644 --- a/escher/include/escher/view_controller.h +++ b/escher/include/escher/view_controller.h @@ -19,6 +19,8 @@ public: ViewController(Responder * parentResponder); virtual const char * title() const; virtual View * view() = 0; + virtual void viewWillAppear(); + virtual void viewWillDisappear(); }; #endif diff --git a/escher/src/alternate_empty_view_controller.cpp b/escher/src/alternate_empty_view_controller.cpp index 95f3f970b..551ee77cb 100644 --- a/escher/src/alternate_empty_view_controller.cpp +++ b/escher/src/alternate_empty_view_controller.cpp @@ -74,3 +74,15 @@ void AlternateEmptyViewController::didBecomeFirstResponder() { app()->setFirstResponder(m_contentView.mainViewController()); } } + +void AlternateEmptyViewController::viewWillAppear() { + if (!m_contentView.alternateEmptyViewDelegate()->isEmpty()) { + m_contentView.mainViewController()->viewWillAppear(); + } +} + +void AlternateEmptyViewController::viewWillDisappear() { + if (!m_contentView.alternateEmptyViewDelegate()->isEmpty()) { + m_contentView.mainViewController()->viewWillDisappear(); + } +} diff --git a/escher/src/app.cpp b/escher/src/app.cpp index efb08d14f..0c1d37e28 100644 --- a/escher/src/app.cpp +++ b/escher/src/app.cpp @@ -17,16 +17,6 @@ App::App(Container * container, ViewController * rootViewController, const char { } -void App::setWindow(Window * window) { - View * view = m_modalViewController.view(); - assert(m_modalViewController.app() == this); - window->setContentView(view); - if (m_firstResponder == nullptr) { - setFirstResponder(&m_modalViewController); - } - window->redraw(); -} - void App::processEvent(Ion::Events::Event event) { Responder * responder = m_firstResponder; bool didHandleEvent = false; @@ -81,4 +71,19 @@ void App::displayWarning(const char * warningMessage) { const Container * App::container() const { return m_container; -} \ No newline at end of file +} + +void App::didBecomeActive(Window * window) { + View * view = m_modalViewController.view(); + assert(m_modalViewController.app() == this); + window->setContentView(view); + if (m_firstResponder == nullptr) { + setFirstResponder(&m_modalViewController); + } + window->redraw(); + m_modalViewController.viewWillAppear(); +} + +void App::willBecomeInactive() { + m_modalViewController.viewWillDisappear(); +} diff --git a/escher/src/container.cpp b/escher/src/container.cpp index 7c7891e80..41f716938 100644 --- a/escher/src/container.cpp +++ b/escher/src/container.cpp @@ -10,8 +10,13 @@ Container::Container() : } void Container::switchTo(App * app) { + if (m_activeApp) { + m_activeApp->willBecomeInactive(); + } m_activeApp = app; - m_activeApp->setWindow(window()); + if (m_activeApp) { + m_activeApp->didBecomeActive(window()); + } } App * Container::activeApp() { diff --git a/escher/src/editable_text_cell.cpp b/escher/src/editable_text_cell.cpp index 8b66d829b..d12efb59c 100644 --- a/escher/src/editable_text_cell.cpp +++ b/escher/src/editable_text_cell.cpp @@ -48,6 +48,10 @@ void EditableTextCell::didBecomeFirstResponder() { app()->setFirstResponder(&m_textField); } +bool EditableTextCell::isEditing() { + return m_textField.isEditing(); +} + void EditableTextCell::setEditing(bool isEditing) { m_textField.setEditing(isEditing); } diff --git a/escher/src/even_odd_editable_text_cell.cpp b/escher/src/even_odd_editable_text_cell.cpp index 1f5105739..b39a11eae 100644 --- a/escher/src/even_odd_editable_text_cell.cpp +++ b/escher/src/even_odd_editable_text_cell.cpp @@ -48,6 +48,10 @@ void EvenOddEditableTextCell::didBecomeFirstResponder() { app()->setFirstResponder(&m_editableCell); } +bool EvenOddEditableTextCell::isEditing() { + return m_editableCell.isEditing(); +} + void EvenOddEditableTextCell::setEditing(bool isEditing) { m_editableCell.setEditing(isEditing); } diff --git a/escher/src/header_view_controller.cpp b/escher/src/header_view_controller.cpp index 02b6f2c39..77f173775 100644 --- a/escher/src/header_view_controller.cpp +++ b/escher/src/header_view_controller.cpp @@ -131,3 +131,11 @@ bool HeaderViewController::handleEvent(Ion::Events::Event event) { } return false; } + +void HeaderViewController::viewWillAppear() { + m_contentView.mainViewController()->viewWillAppear(); +} + +void HeaderViewController::viewWillDisappear() { + m_contentView.mainViewController()->viewWillDisappear(); +} diff --git a/escher/src/modal_view_controller.cpp b/escher/src/modal_view_controller.cpp index 08c79a682..8d2974a00 100644 --- a/escher/src/modal_view_controller.cpp +++ b/escher/src/modal_view_controller.cpp @@ -115,14 +115,18 @@ void ModalViewController::displayModalViewController(ViewController * vc, float m_currentModalViewController = vc; vc->setParentResponder(this); m_previousResponder = app()->firstResponder(); + m_regularViewController->viewWillDisappear(); m_contentView.presentModalView(vc->view(), verticalAlignment, horizontalAlignment, topMargin, leftMargin, bottomMargin, rightMargin); app()->setFirstResponder(vc); + m_currentModalViewController->viewWillAppear(); } void ModalViewController::dismissModalViewController() { + m_currentModalViewController->viewWillDisappear(); m_currentModalViewController = nullptr; app()->setFirstResponder(m_previousResponder); m_contentView.dismissModalView(); + m_regularViewController->viewWillAppear(); } void ModalViewController::didBecomeFirstResponder() { @@ -142,3 +146,17 @@ bool ModalViewController::handleEvent(Ion::Events::Event event) { } return false; } + +void ModalViewController::viewWillAppear() { + if (m_contentView.isDisplayingModal()) { + m_currentModalViewController->viewWillAppear(); + } + m_regularViewController->viewWillAppear(); +} + +void ModalViewController::viewWillDisappear() { + if (m_contentView.isDisplayingModal()) { + m_currentModalViewController->viewWillDisappear(); + } + m_regularViewController->viewWillDisappear(); +} diff --git a/escher/src/selectable_table_view.cpp b/escher/src/selectable_table_view.cpp index 7960cac26..a4f76cdff 100644 --- a/escher/src/selectable_table_view.cpp +++ b/escher/src/selectable_table_view.cpp @@ -9,8 +9,7 @@ SelectableTableView::SelectableTableView(Responder * parentResponder, TableViewD Responder(parentResponder), m_delegate(delegate), m_selectedCellX(0), - m_selectedCellY(-1), - m_dataHasChanged(true) + m_selectedCellY(-1) { } @@ -27,11 +26,6 @@ int SelectableTableView::selectedColumn() { } void SelectableTableView::didBecomeFirstResponder() { - if (m_dataHasChanged) { - reloadData(); - scrollToCell(m_selectedCellX, m_selectedCellY); - m_dataHasChanged = false; - } if (m_delegate) { m_delegate->tableViewDidChangeSelection(this, 0, -1); } @@ -98,7 +92,3 @@ bool SelectableTableView::handleEvent(Ion::Events::Event event) { } return false; } - -void SelectableTableView::dataHasChanged(bool dataHasChanged) { - m_dataHasChanged = dataHasChanged; -} diff --git a/escher/src/stack_view_controller.cpp b/escher/src/stack_view_controller.cpp index 9de6b76c0..4ead2d7d4 100644 --- a/escher/src/stack_view_controller.cpp +++ b/escher/src/stack_view_controller.cpp @@ -91,6 +91,10 @@ void StackViewController::push(ViewController * vc, KDColor textColor, KDColor b m_view.pushStack(vc->title(), textColor, backgroundColor, separatorColor); m_children[m_numberOfChildren++] = vc; setupActiveViewController(); + if (m_numberOfChildren > 1) { + m_children[m_numberOfChildren-2]->viewWillDisappear(); + } + vc->viewWillAppear(); } void StackViewController::pop() { @@ -100,6 +104,8 @@ void StackViewController::pop() { vc->setParentResponder(nullptr); m_numberOfChildren--; setupActiveViewController(); + vc->viewWillDisappear(); + m_children[m_numberOfChildren-1]->viewWillAppear(); } void StackViewController::setupActiveViewController() { @@ -129,3 +135,17 @@ bool StackViewController::handleEvent(Ion::Events::Event event) { View * StackViewController::view() { return &m_view; } + +void StackViewController::viewWillAppear() { + ViewController * vc = m_children[m_numberOfChildren-1]; + if (m_numberOfChildren > 0 && vc) { + vc->viewWillAppear(); + } +} + +void StackViewController::viewWillDisappear() { + ViewController * vc = m_children[m_numberOfChildren-1]; + if (m_numberOfChildren > 0 && vc) { + vc->viewWillDisappear(); + } +} diff --git a/escher/src/tab_view_controller.cpp b/escher/src/tab_view_controller.cpp index 076fa6125..29098b39f 100644 --- a/escher/src/tab_view_controller.cpp +++ b/escher/src/tab_view_controller.cpp @@ -94,12 +94,17 @@ bool TabViewController::handleEvent(Ion::Events::Event event) { void TabViewController::setActiveTab(int8_t i) { ViewController * activeVC = m_children[i]; if (i != m_activeChildIndex) { - //TODO assert(i <= m_numberOfchildren); + assert(i <= m_numberOfChildren); m_view.setActiveView(activeVC->view()); m_view.m_tabView.setActiveIndex(i); + if (m_activeChildIndex >= 0) { + m_children[m_activeChildIndex]->viewWillDisappear(); + } m_activeChildIndex = i; - } - + if (i >= 0) { + m_children[i]->viewWillAppear(); + } + } else {} app()->setFirstResponder(activeVC); } @@ -141,3 +146,13 @@ uint8_t TabViewController::numberOfTabs() { const char * TabViewController::tabName(uint8_t index) { return m_children[index]->title(); } + +void TabViewController::viewWillAppear() { + ViewController * activeVC = m_children[m_activeChildIndex]; + activeVC->viewWillAppear(); +} + +void TabViewController::viewWillDisappear() { + ViewController * activeVC = m_children[m_activeChildIndex]; + activeVC->viewWillDisappear(); +} diff --git a/escher/src/view_controller.cpp b/escher/src/view_controller.cpp index 184b6b853..934018ab8 100644 --- a/escher/src/view_controller.cpp +++ b/escher/src/view_controller.cpp @@ -8,3 +8,9 @@ ViewController::ViewController(Responder * parentResponder) : const char * ViewController::title() const { return nullptr; } + +void ViewController::viewWillAppear() { +} + +void ViewController::viewWillDisappear() { +}