diff --git a/apps/apps_container.cpp b/apps/apps_container.cpp index 3c9caebd6..8b6cc29ea 100644 --- a/apps/apps_container.cpp +++ b/apps/apps_container.cpp @@ -120,7 +120,9 @@ bool AppsContainer::dispatchEvent(Ion::Events::Event event) { } void AppsContainer::switchTo(App * app) { - m_window.setTitle(app->upperName()); + if (app) { + m_window.setTitle(app->upperName()); + } Container::switchTo(app); } diff --git a/apps/calculation/edit_expression_controller.cpp b/apps/calculation/edit_expression_controller.cpp index 2f456013e..a224e480c 100644 --- a/apps/calculation/edit_expression_controller.cpp +++ b/apps/calculation/edit_expression_controller.cpp @@ -97,18 +97,17 @@ TextFieldDelegateApp * EditExpressionController::textFieldDelegateApp() { return (App *)app(); } -void EditExpressionController::loadView() { - m_historyController->loadView(); - DynamicViewController::loadView(); -} - -void EditExpressionController::unloadView() { - m_historyController->unloadView(); - DynamicViewController::unloadView(); -} - -View * EditExpressionController::createView() { +View * EditExpressionController::loadView() { return new ContentView(this, (TableView *)m_historyController->view(), this); } +void EditExpressionController::unloadView(View * view) { + delete view; +} + +void EditExpressionController::viewDidDisappear() { + DynamicViewController::viewDidDisappear(); + m_historyController->viewDidDisappear(); +} + } diff --git a/apps/calculation/edit_expression_controller.h b/apps/calculation/edit_expression_controller.h index 82b80ee33..3908d060e 100644 --- a/apps/calculation/edit_expression_controller.h +++ b/apps/calculation/edit_expression_controller.h @@ -10,17 +10,17 @@ namespace Calculation { class HistoryController; +/* TODO: implement a split view */ class EditExpressionController : public DynamicViewController, public Shared::TextFieldDelegate { public: EditExpressionController(Responder * parentResponder, HistoryController * historyController, CalculationStore * calculationStore); void didBecomeFirstResponder() override; + void viewDidDisappear() override; bool handleEvent(Ion::Events::Event event) override; const char * textBody(); void setTextBody(const char * text); bool textFieldDidFinishEditing(::TextField * textField, const char * text, Ion::Events::Event event) override; bool textFieldDidAbortEditing(::TextField * textField, const char * text) override; - void loadView() override; - void unloadView() override; private: class ContentView : public View { public: @@ -38,7 +38,8 @@ private: TextField m_textField; char m_textBody[TextField::maxBufferSize()]; }; - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; Shared::TextFieldDelegateApp * textFieldDelegateApp() override; HistoryController * m_historyController; CalculationStore * m_calculationStore; diff --git a/apps/calculation/history_controller.cpp b/apps/calculation/history_controller.cpp index b3825f14c..293cf35c2 100644 --- a/apps/calculation/history_controller.cpp +++ b/apps/calculation/history_controller.cpp @@ -171,29 +171,27 @@ int HistoryController::typeAtLocation(int i, int j) { return 0; } -void HistoryController::unloadView() { - for (int i = 0; i < k_maxNumberOfDisplayedRows; i++) { - assert(m_calculationHistory[i] != nullptr); - delete m_calculationHistory[i]; - m_calculationHistory[i] = nullptr; - } - DynamicViewController::unloadView(); -} - void HistoryController::scrollToCell(int i, int j) { selectableTableView()->scrollToCell(i, j); } -View * HistoryController::createView() { - for (int i = 0; i < k_maxNumberOfDisplayedRows; i++) { - assert(m_calculationHistory[i] == nullptr); - m_calculationHistory[i] = new HistoryViewCell(); - } - return new CalculationSelectableTableView(this, this, this); -} - CalculationSelectableTableView * HistoryController::selectableTableView() { return (CalculationSelectableTableView *)view(); } +View * HistoryController::loadView() { + for (int i = 0; i < k_maxNumberOfDisplayedRows; i++) { + m_calculationHistory[i] = new HistoryViewCell(); + } + return new CalculationSelectableTableView(this, this, this); +} + +void HistoryController::unloadView(View * view) { + for (int i = 0; i < k_maxNumberOfDisplayedRows; i++) { + delete m_calculationHistory[i]; + m_calculationHistory[i] = nullptr; + } + delete view; +} + } diff --git a/apps/calculation/history_controller.h b/apps/calculation/history_controller.h index 17b9b4156..016b6c275 100644 --- a/apps/calculation/history_controller.h +++ b/apps/calculation/history_controller.h @@ -28,10 +28,10 @@ public: int indexFromCumulatedHeight(KDCoordinate offsetY) override; int typeAtLocation(int i, int j) override; void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) override; - void unloadView() override; void scrollToCell(int i, int j); + View * loadView() override; + void unloadView(View * view) override; private: - View * createView() override; CalculationSelectableTableView * selectableTableView(); constexpr static int k_maxNumberOfDisplayedRows = 5; HistoryViewCell * m_calculationHistory[k_maxNumberOfDisplayedRows]; diff --git a/apps/graph/list/list_controller.cpp b/apps/graph/list/list_controller.cpp index c11a9ccf0..54469e165 100644 --- a/apps/graph/list/list_controller.cpp +++ b/apps/graph/list/list_controller.cpp @@ -36,18 +36,6 @@ KDCoordinate ListController::rowHeight(int j) { return functionSize + k_emptyRowHeight - KDText::stringSize(" ").height(); } -void ListController::unloadView() { - for (int i = 0; i < k_maxNumberOfRows; i++) { - assert(m_functionTitleCells[i] != nullptr); - delete m_functionTitleCells[i]; - m_functionTitleCells[i] = nullptr; - assert(m_expressionCells[i] != nullptr); - delete m_expressionCells[i]; - m_expressionCells[i] = nullptr; - } - Shared::ListController::unloadView(); -} - void ListController::editExpression(Function * function, Ion::Events::Event event) { char * initialText = nullptr; char initialTextContent[TextField::maxBufferSize()]; @@ -111,14 +99,22 @@ void ListController::removeFunctionRow(Function * function) { } } -View * ListController::createView() { +View * ListController::loadView() { for (int i = 0; i < k_maxNumberOfRows; i++) { - assert(m_functionTitleCells[i] == nullptr); m_functionTitleCells[i] = new FunctionTitleCell(FunctionTitleCell::Orientation::VerticalIndicator); - assert(m_expressionCells[i] == nullptr); m_expressionCells[i] = new FunctionExpressionCell(); } - return Shared::ListController::createView(); + return Shared::ListController::loadView(); +} + +void ListController::unloadView(View * view) { + for (int i = 0; i < k_maxNumberOfRows; i++) { + delete m_functionTitleCells[i]; + m_functionTitleCells[i] = nullptr; + delete m_expressionCells[i]; + m_expressionCells[i] = nullptr; + } + Shared::ListController::unloadView(view); } } diff --git a/apps/graph/list/list_controller.h b/apps/graph/list/list_controller.h index 2311ed68f..68c8a3151 100644 --- a/apps/graph/list/list_controller.h +++ b/apps/graph/list/list_controller.h @@ -17,7 +17,6 @@ public: const char * title() override; int numberOfRows() override; KDCoordinate rowHeight(int j) override; - void unloadView() override; private: void editExpression(Shared::Function * function, Ion::Events::Event event) override; Shared::ListParameterController * parameterController() override; @@ -27,7 +26,8 @@ private: void willDisplayTitleCellAtIndex(HighlightCell * cell, int j) override; void willDisplayExpressionCellAtIndex(HighlightCell * cell, int j) override; void removeFunctionRow(Shared::Function * function) override; - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; constexpr static int k_maxNumberOfRows = 5; FunctionTitleCell * m_functionTitleCells[k_maxNumberOfRows]; Shared::FunctionExpressionCell * m_expressionCells[k_maxNumberOfRows]; diff --git a/apps/graph/values/values_controller.cpp b/apps/graph/values/values_controller.cpp index f3192b786..49803355a 100644 --- a/apps/graph/values/values_controller.cpp +++ b/apps/graph/values/values_controller.cpp @@ -81,20 +81,6 @@ IntervalParameterController * ValuesController::intervalParameterController() { return &m_intervalParameterController; } -void ValuesController::unloadView() { - for (int i = 0; i < k_maxNumberOfCells; i++) { - assert(m_floatCells[i] != nullptr); - delete m_floatCells[i]; - m_floatCells[i] = nullptr; - } - for (int i = 0; i < k_maxNumberOfFunctions; i++) { - assert(m_functionTitleCells[i] != nullptr); - delete m_functionTitleCells[i]; - m_functionTitleCells[i] = nullptr; - } - Shared::ValuesController::unloadView(); -} - CartesianFunction * ValuesController::functionAtColumn(int i) { assert(i > 0); int index = 1; @@ -179,16 +165,26 @@ float ValuesController::evaluationOfAbscissaAtColumn(float abscissa, int columnI return function->evaluateAtAbscissa(abscissa, myApp->localContext()); } -View * ValuesController::createView() { +View * ValuesController::loadView() { for (int i = 0; i < k_maxNumberOfFunctions; i++) { - assert(m_functionTitleCells[i] == nullptr); m_functionTitleCells[i] = new FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small); } for (int i = 0; i < k_maxNumberOfCells; i++) { - assert(m_floatCells[i] == nullptr); m_floatCells[i] = new EvenOddBufferTextCell(); } - return Shared::ValuesController::createView(); + return Shared::ValuesController::loadView(); +} + +void ValuesController::unloadView(View * view) { + for (int i = 0; i < k_maxNumberOfCells; i++) { + delete m_floatCells[i]; + m_floatCells[i] = nullptr; + } + for (int i = 0; i < k_maxNumberOfFunctions; i++) { + delete m_functionTitleCells[i]; + m_functionTitleCells[i] = nullptr; + } + Shared::ValuesController::unloadView(view); } } diff --git a/apps/graph/values/values_controller.h b/apps/graph/values/values_controller.h index a137c52e4..f264ba4f2 100644 --- a/apps/graph/values/values_controller.h +++ b/apps/graph/values/values_controller.h @@ -20,7 +20,6 @@ public: int activeRow(); int activeColumn(); Shared::IntervalParameterController * intervalParameterController() override; - void unloadView() override; private: CartesianFunction * functionAtColumn(int i) override; bool isDerivativeColumn(int i); @@ -38,7 +37,8 @@ private: CartesianFunctionStore * functionStore() const override; FunctionParameterController m_functionParameterController; FunctionParameterController * functionParameterController() override; - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; Shared::IntervalParameterController m_intervalParameterController; DerivativeParameterController m_derivativeParameterController; }; diff --git a/apps/main.cpp b/apps/main.cpp index c6d9eb420..cf0538765 100644 --- a/apps/main.cpp +++ b/apps/main.cpp @@ -5,4 +5,5 @@ AppsContainer container; void ion_app() { container.switchTo(container.appAtIndex(0)); container.run(); + container.switchTo(nullptr); } diff --git a/apps/math_toolbox.cpp b/apps/math_toolbox.cpp index 2e73fb0e5..389607d6e 100644 --- a/apps/math_toolbox.cpp +++ b/apps/math_toolbox.cpp @@ -221,6 +221,7 @@ void MathToolbox::viewWillAppear() { } void MathToolbox::viewDidDisappear() { + Toolbox::viewDidDisappear(); m_selectableTableView.deselectTable(); } diff --git a/apps/probability/parameters_controller.cpp b/apps/probability/parameters_controller.cpp index b22bdf889..71a229af5 100644 --- a/apps/probability/parameters_controller.cpp +++ b/apps/probability/parameters_controller.cpp @@ -87,11 +87,11 @@ void ParametersController::setLaw(Law * law) { } void ParametersController::viewWillAppear() { + FloatParameterController::viewWillAppear(); for (int i = 0; i < m_law->numberOfParameter(); i++) { contentView()->parameterDefinitionAtIndex(i)->setMessage(m_law->parameterDefinitionAtIndex(i)); } contentView()->layoutSubviews(); - FloatParameterController::viewWillAppear(); } int ParametersController::numberOfRows() { @@ -120,18 +120,6 @@ int ParametersController::reusableParameterCellCount(int type) { return m_law->numberOfParameter(); } -void ParametersController::unloadView() { - assert(m_selectableTableView != nullptr); - delete m_selectableTableView; - m_selectableTableView = nullptr; - for (int i = 0; i < k_maxNumberOfCells; i++) { - assert(m_menuListCell[i] != nullptr); - delete m_menuListCell[i]; - m_menuListCell[i] = nullptr; - } - FloatParameterController::unloadView(); -} - float ParametersController::parameterAtIndex(int index) { return m_law->parameterValueAtIndex(index); } @@ -165,11 +153,9 @@ I18n::Message ParametersController::okButtonText() { return I18n::Message::Next; } -View * ParametersController::createView() { - assert(m_selectableTableView == nullptr); - m_selectableTableView = (SelectableTableView *)FloatParameterController::createView(); +View * ParametersController::loadView() { + m_selectableTableView = (SelectableTableView *)FloatParameterController::loadView(); for (int i = 0; i < k_maxNumberOfCells; i++) { - assert(m_menuListCell[i] == nullptr); m_menuListCell[i] = new MessageTableCellWithEditableText(m_selectableTableView, this, m_draftTextBuffer); } ContentView * contentView = (ContentView *)new ContentView(this, m_selectableTableView); @@ -179,6 +165,16 @@ View * ParametersController::createView() { return contentView; } +void ParametersController::unloadView(View * view) { + delete m_selectableTableView; + m_selectableTableView = nullptr; + for (int i = 0; i < k_maxNumberOfCells; i++) { + delete m_menuListCell[i]; + m_menuListCell[i] = nullptr; + } + FloatParameterController::unloadView(view); +} + SelectableTableView * ParametersController::selectableTableView() { return m_selectableTableView; } diff --git a/apps/probability/parameters_controller.h b/apps/probability/parameters_controller.h index 727bf18e7..bcbe2070e 100644 --- a/apps/probability/parameters_controller.h +++ b/apps/probability/parameters_controller.h @@ -16,7 +16,6 @@ public: void viewWillAppear() override; int numberOfRows() override; void willDisplayCellForIndex(HighlightCell * cell, int index) override; - void unloadView() override; private: HighlightCell * reusableParameterCell(int index, int type) override; int reusableParameterCellCount(int type) override; @@ -25,7 +24,8 @@ private: bool setParameterAtIndex(int parameterIndex, float f) override; bool textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) override; I18n::Message okButtonText() override; - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; class ContentView : public View { public: ContentView(Responder * parentResponder, SelectableTableView * selectableTableView); diff --git a/apps/regression/calculation_controller.cpp b/apps/regression/calculation_controller.cpp index 242a3cb4f..21d443d6d 100644 --- a/apps/regression/calculation_controller.cpp +++ b/apps/regression/calculation_controller.cpp @@ -231,54 +231,44 @@ int CalculationController::typeAtLocation(int i, int j) { return 4; } -void CalculationController::unloadView() { - assert(m_r2TitleCell != nullptr); - delete m_r2TitleCell; - m_r2TitleCell = nullptr; - assert(m_columnTitleCell != nullptr); - delete m_columnTitleCell; - m_columnTitleCell = nullptr; - for (int i = 0; i < k_maxNumberOfDisplayableRows/2; i++) { - assert(m_doubleCalculationCells[i] != nullptr); - delete m_doubleCalculationCells[i]; - m_doubleCalculationCells[i] = nullptr; - assert(m_calculationCells[i] != nullptr); - delete m_calculationCells[i]; - m_calculationCells[i] = nullptr; - } - for (int i = 0; i < k_maxNumberOfDisplayableRows; i++) { - assert(m_titleCells[i] != nullptr); - delete m_titleCells[i]; - m_titleCells[i] = nullptr; - } - TabTableController::unloadView(); -} - Responder * CalculationController::tabController() const { return (parentResponder()->parentResponder()->parentResponder()); } -View * CalculationController::createView() { - SelectableTableView * tableView = (SelectableTableView *)TabTableController::createView(); - assert(m_r2TitleCell == nullptr); +View * CalculationController::loadView() { + SelectableTableView * tableView = (SelectableTableView *)TabTableController::loadView(); m_r2TitleCell = new EvenOddExpressionCell(1.0f, 0.5f); - assert(m_columnTitleCell == nullptr); m_columnTitleCell = new EvenOddDoubleBufferTextCell(tableView); for (int i = 0; i < k_maxNumberOfDisplayableRows; i++) { - assert(m_titleCells[i] == nullptr); m_titleCells[i] = new EvenOddMessageTextCell(KDText::FontSize::Small); } for (int i = 0; i < k_maxNumberOfDisplayableRows/2; i++) { - assert(m_doubleCalculationCells[i] == nullptr); m_doubleCalculationCells[i] = new EvenOddDoubleBufferTextCell(); m_doubleCalculationCells[i]->setTextColor(Palette::GreyDark); m_doubleCalculationCells[i]->setParentResponder(tableView); - assert(m_calculationCells[i] == nullptr); m_calculationCells[i] = new EvenOddBufferTextCell(KDText::FontSize::Small); m_calculationCells[i]->setTextColor(Palette::GreyDark); } return tableView; } +void CalculationController::unloadView(View * view) { + delete m_r2TitleCell; + m_r2TitleCell = nullptr; + delete m_columnTitleCell; + m_columnTitleCell = nullptr; + for (int i = 0; i < k_maxNumberOfDisplayableRows/2; i++) { + delete m_doubleCalculationCells[i]; + m_doubleCalculationCells[i] = nullptr; + delete m_calculationCells[i]; + m_calculationCells[i] = nullptr; + } + for (int i = 0; i < k_maxNumberOfDisplayableRows; i++) { + delete m_titleCells[i]; + m_titleCells[i] = nullptr; + } + TabTableController::unloadView(view); +} + } diff --git a/apps/regression/calculation_controller.h b/apps/regression/calculation_controller.h index 725de5a21..a016b0530 100644 --- a/apps/regression/calculation_controller.h +++ b/apps/regression/calculation_controller.h @@ -31,10 +31,10 @@ public: HighlightCell * reusableCell(int index, int type) override; int reusableCellCount(int type) override; int typeAtLocation(int i, int j) override; - void unloadView() override; private: Responder * tabController() const override; - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; constexpr static int k_totalNumberOfRows = 11; constexpr static int k_totalNumberOfColumns = 2; constexpr static int k_maxNumberOfDisplayableRows = 10; diff --git a/apps/regression/store_controller.cpp b/apps/regression/store_controller.cpp index 0d5492ae2..9dd68602d 100644 --- a/apps/regression/store_controller.cpp +++ b/apps/regression/store_controller.cpp @@ -36,26 +36,24 @@ void StoreController::willDisplayCellAtLocation(HighlightCell * cell, int i, int mytitleCell->setExpression(m_titleLayout[i]); } -void StoreController::unloadView() { - for (int i = 0; i < k_numberOfTitleCells; i++) { - assert(m_titleCells[i] != nullptr); - delete m_titleCells[i]; - m_titleCells[i] = nullptr; - } - Shared::StoreController::unloadView(); -} - HighlightCell * StoreController::titleCells(int index) { assert(index >= 0 && index < k_numberOfTitleCells); return m_titleCells[index]; } -View * StoreController::createView() { +View * StoreController::loadView() { for (int i = 0; i < k_numberOfTitleCells; i++) { - assert(m_titleCells[i] == nullptr); m_titleCells[i] = new EvenOddExpressionCell(0.5f, 0.5f); } - return Shared::StoreController::createView(); + return Shared::StoreController::loadView(); +} + +void StoreController::unloadView(View * view) { + for (int i = 0; i < k_numberOfTitleCells; i++) { + delete m_titleCells[i]; + m_titleCells[i] = nullptr; + } + Shared::StoreController::unloadView(view); } } diff --git a/apps/regression/store_controller.h b/apps/regression/store_controller.h index e710eda84..bcd347232 100644 --- a/apps/regression/store_controller.h +++ b/apps/regression/store_controller.h @@ -12,10 +12,10 @@ public: StoreController(Responder * parentResponder, Store * store, ButtonRowController * header); ~StoreController(); void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; - void unloadView() override; private: HighlightCell * titleCells(int index) override; - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; EvenOddExpressionCell * m_titleCells[k_numberOfTitleCells]; Poincare::ExpressionLayout * m_titleLayout[2]; }; diff --git a/apps/sequence/list/list_controller.cpp b/apps/sequence/list/list_controller.cpp index 6425bd380..50cbbf382 100644 --- a/apps/sequence/list/list_controller.cpp +++ b/apps/sequence/list/list_controller.cpp @@ -80,18 +80,6 @@ void ListController::selectPreviousNewSequenceCell() { } } -void ListController::unloadView() { - for (int i = 0; i < k_maxNumberOfRows; i++) { - assert(m_sequenceTitleCells[i] != nullptr); - delete m_sequenceTitleCells[i]; - m_sequenceTitleCells[i] = nullptr; - assert(m_expressionCells[i] != nullptr); - delete m_expressionCells[i]; - m_expressionCells[i] = nullptr; - } - Shared::ListController::unloadView(); -} - void ListController::editExpression(Sequence * sequence, int sequenceDefinition, Ion::Events::Event event) { char * initialText = nullptr; char initialTextContent[TextField::maxBufferSize()]; @@ -276,14 +264,22 @@ void ListController::reinitExpression(Shared::Function * function) { selectableTableView()->reloadData(); } -View * ListController::createView() { +View * ListController::loadView() { for (int i = 0; i < k_maxNumberOfRows; i++) { - assert(m_sequenceTitleCells[i] == nullptr); m_sequenceTitleCells[i] = new SequenceTitleCell(FunctionTitleCell::Orientation::VerticalIndicator); - assert(m_expressionCells[i] == nullptr); m_expressionCells[i] = new FunctionExpressionCell(); } - return Shared::ListController::createView(); + return Shared::ListController::loadView(); +} + +void ListController::unloadView(View * view) { + for (int i = 0; i < k_maxNumberOfRows; i++) { + delete m_sequenceTitleCells[i]; + m_sequenceTitleCells[i] = nullptr; + delete m_expressionCells[i]; + m_expressionCells[i] = nullptr; + } + Shared::ListController::unloadView(view); } } diff --git a/apps/sequence/list/list_controller.h b/apps/sequence/list/list_controller.h index 02687369c..55ea1b86f 100644 --- a/apps/sequence/list/list_controller.h +++ b/apps/sequence/list/list_controller.h @@ -23,7 +23,6 @@ public: void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; Toolbox * toolboxForTextField(TextField * textField) override; void selectPreviousNewSequenceCell(); - void unloadView() override; private: Shared::TextFieldDelegateApp * textFieldDelegateApp() override; void editExpression(Sequence * sequence, int sequenceDefinitionIndex, Ion::Events::Event event); @@ -39,7 +38,8 @@ private: void addEmptyFunction() override; void editExpression(Shared::Function * function, Ion::Events::Event event) override; void reinitExpression(Shared::Function * function) override; - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; static constexpr KDCoordinate k_emptySubRowHeight = 30; constexpr static int k_maxNumberOfRows = 9; SequenceStore * m_sequenceStore; diff --git a/apps/sequence/values/values_controller.cpp b/apps/sequence/values/values_controller.cpp index e7fd60edb..9d7cf5da1 100644 --- a/apps/sequence/values/values_controller.cpp +++ b/apps/sequence/values/values_controller.cpp @@ -47,20 +47,6 @@ IntervalParameterController * ValuesController::intervalParameterController() { return &m_intervalParameterController; } -void ValuesController::unloadView() { - for (int i = 0; i < k_maxNumberOfCells; i++) { - assert(m_floatCells[i] != nullptr); - delete m_floatCells[i]; - m_floatCells[i] = nullptr; - } - for (int i = 0; i < k_maxNumberOfSequences; i++) { - assert(m_sequenceTitleCells[i] != nullptr); - delete m_sequenceTitleCells[i]; - m_sequenceTitleCells[i] = nullptr; - } - Shared::ValuesController::unloadView(); -} - bool ValuesController::setDataAtLocation(float floatBody, int columnIndex, int rowIndex) { if (floatBody < 0) { return false; @@ -98,16 +84,26 @@ Shared::ValuesFunctionParameterController * ValuesController::functionParameterC #endif } -View * ValuesController::createView() { +View * ValuesController::loadView() { for (int i = 0; i < k_maxNumberOfSequences; i++) { - assert(m_sequenceTitleCells[i] == nullptr); m_sequenceTitleCells[i] = new SequenceTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator); } for (int i = 0; i < k_maxNumberOfCells; i++) { - assert(m_floatCells[i] == nullptr); m_floatCells[i] = new EvenOddBufferTextCell(); } - return Shared::ValuesController::createView(); + return Shared::ValuesController::loadView(); +} + +void ValuesController::unloadView(View * view) { + for (int i = 0; i < k_maxNumberOfCells; i++) { + delete m_floatCells[i]; + m_floatCells[i] = nullptr; + } + for (int i = 0; i < k_maxNumberOfSequences; i++) { + delete m_sequenceTitleCells[i]; + m_sequenceTitleCells[i] = nullptr; + } + Shared::ValuesController::unloadView(view); } } diff --git a/apps/sequence/values/values_controller.h b/apps/sequence/values/values_controller.h index bf3b5e007..27be9f551 100644 --- a/apps/sequence/values/values_controller.h +++ b/apps/sequence/values/values_controller.h @@ -15,7 +15,6 @@ public: void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; I18n::Message emptyMessage() override; IntervalParameterController * intervalParameterController() override; - void unloadView() override; private: bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override; int maxNumberOfCells() override; @@ -28,7 +27,8 @@ private: EvenOddBufferTextCell * floatCells(int j) override; SequenceStore * m_sequenceStore; SequenceStore * functionStore() const override; - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; #if COPY_COLUMN Shared::ValuesFunctionParameterController m_sequenceParameterController; #endif diff --git a/apps/shared/editable_cell_table_view_controller.cpp b/apps/shared/editable_cell_table_view_controller.cpp index 36c8823c8..78b48e7b4 100644 --- a/apps/shared/editable_cell_table_view_controller.cpp +++ b/apps/shared/editable_cell_table_view_controller.cpp @@ -114,8 +114,7 @@ void EditableCellTableViewController::didBecomeFirstResponder() { } } -void EditableCellTableViewController::viewWillAppear() { - TabTableController::viewWillAppear(); +void EditableCellTableViewController::didEnterResponderChain(Responder * previousFirstResponder) { if (selectedRow() == -1) { selectCellAtLocation(0, 1); } else { diff --git a/apps/shared/editable_cell_table_view_controller.h b/apps/shared/editable_cell_table_view_controller.h index 7aaec55b4..be1113602 100644 --- a/apps/shared/editable_cell_table_view_controller.h +++ b/apps/shared/editable_cell_table_view_controller.h @@ -22,7 +22,7 @@ public: KDCoordinate rowHeight(int j) override; void didBecomeFirstResponder() override; - void viewWillAppear() override; + void didEnterResponderChain(Responder * previousFirstResponder) override; private: TextFieldDelegateApp * textFieldDelegateApp() override; static constexpr KDCoordinate k_cellHeight = 20; diff --git a/apps/shared/float_parameter_controller.cpp b/apps/shared/float_parameter_controller.cpp index 04ec07d05..af1b5b5c0 100644 --- a/apps/shared/float_parameter_controller.cpp +++ b/apps/shared/float_parameter_controller.cpp @@ -25,6 +25,7 @@ void FloatParameterController::didBecomeFirstResponder() { } void FloatParameterController::viewWillAppear() { + DynamicViewController::viewWillAppear(); selectableTableView()->reloadData(); if (selectedRow() == -1) { selectCellAtLocation(0, 0); @@ -169,13 +170,6 @@ int FloatParameterController::activeCell() { return selectedRow(); } -void FloatParameterController::unloadView() { - assert(m_okButton != nullptr); - delete m_okButton; - m_okButton = nullptr; - DynamicViewController::unloadView(); -} - StackViewController * FloatParameterController::stackController() { return (StackViewController *)parentResponder(); } @@ -184,16 +178,6 @@ SelectableTableView * FloatParameterController::selectableTableView() { return (SelectableTableView *)view(); } -View * FloatParameterController::createView() { - SelectableTableView * tableView = new SelectableTableView(this, this, 0, 1, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin, this); - assert(m_okButton == nullptr); - m_okButton = new ButtonWithSeparator(tableView, okButtonText(), Invocation([](void * context, void * sender) { - FloatParameterController * parameterController = (FloatParameterController *) context; - parameterController->buttonAction(); - }, this)); - return tableView; -} - void FloatParameterController::buttonAction() { StackViewController * stack = stackController(); stack->pop(); @@ -203,4 +187,19 @@ I18n::Message FloatParameterController::okButtonText() { return I18n::Message::Ok; } +View * FloatParameterController::loadView() { + SelectableTableView * tableView = new SelectableTableView(this, this, 0, 1, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin, this); + m_okButton = new ButtonWithSeparator(tableView, okButtonText(), Invocation([](void * context, void * sender) { + FloatParameterController * parameterController = (FloatParameterController *) context; + parameterController->buttonAction(); + }, this)); + return tableView; +} + +void FloatParameterController::unloadView(View * view) { + delete m_okButton; + m_okButton = nullptr; + delete view; +} + } diff --git a/apps/shared/float_parameter_controller.h b/apps/shared/float_parameter_controller.h index 450839e30..88ff51cbd 100644 --- a/apps/shared/float_parameter_controller.h +++ b/apps/shared/float_parameter_controller.h @@ -29,13 +29,13 @@ public: bool textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) override; bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override; void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) override; - void unloadView() override; protected: int activeCell(); StackViewController * stackController(); virtual float parameterAtIndex(int index) = 0; virtual SelectableTableView * selectableTableView(); - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; private: constexpr static int k_buttonMargin = 6; virtual void buttonAction(); diff --git a/apps/shared/go_to_parameter_controller.cpp b/apps/shared/go_to_parameter_controller.cpp index d0eacfd40..c235af04e 100644 --- a/apps/shared/go_to_parameter_controller.cpp +++ b/apps/shared/go_to_parameter_controller.cpp @@ -16,13 +16,6 @@ int GoToParameterController::numberOfRows() { return 2; } -void GoToParameterController::unloadView() { - assert(m_abscisseCell != nullptr); - delete m_abscisseCell; - m_abscisseCell = nullptr; - FloatParameterController::unloadView(); -} - HighlightCell * GoToParameterController::reusableParameterCell(int index, int type) { assert(index == 0); return m_abscisseCell; @@ -40,11 +33,16 @@ void GoToParameterController::buttonAction() { stack->pop(); } -View * GoToParameterController::createView() { - SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::createView(); - assert(m_abscisseCell == nullptr); +View * GoToParameterController::loadView() { + SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::loadView(); m_abscisseCell = new MessageTableCellWithEditableText(tableView, this, m_draftTextBuffer, m_abscissaSymbol); return tableView; } +void GoToParameterController::unloadView(View * view) { + delete m_abscisseCell; + m_abscisseCell = nullptr; + FloatParameterController::unloadView(view); +} + } diff --git a/apps/shared/go_to_parameter_controller.h b/apps/shared/go_to_parameter_controller.h index d9f21d52f..4285a117e 100644 --- a/apps/shared/go_to_parameter_controller.h +++ b/apps/shared/go_to_parameter_controller.h @@ -12,7 +12,6 @@ class GoToParameterController : public FloatParameterController { public: GoToParameterController(Responder * parentResponder, InteractiveCurveViewRange * graphRange, CurveViewCursor * cursor, I18n::Message symbol); int numberOfRows() override; - void unloadView() override; protected: constexpr static float k_maxDisplayableFloat = 1E8f; CurveViewCursor * m_cursor; @@ -20,7 +19,8 @@ private: void buttonAction() override; HighlightCell * reusableParameterCell(int index, int type) override; int reusableParameterCellCount(int type) override; - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; char m_draftTextBuffer[MessageTableCellWithEditableText::k_bufferLength]; MessageTableCellWithEditableText * m_abscisseCell; InteractiveCurveViewRange * m_graphRange; diff --git a/apps/shared/interval_parameter_controller.cpp b/apps/shared/interval_parameter_controller.cpp index f6c359372..be598d9a4 100644 --- a/apps/shared/interval_parameter_controller.cpp +++ b/apps/shared/interval_parameter_controller.cpp @@ -31,15 +31,6 @@ Interval * IntervalParameterController::interval() { return m_interval; } -void IntervalParameterController::unloadView() { - for (int i = 0; i < k_totalNumberOfCell; i++) { - assert(m_intervalCells[i] != nullptr); - delete m_intervalCells[i]; - m_intervalCells[i] = nullptr; - } - FloatParameterController::unloadView(); -} - float IntervalParameterController::parameterAtIndex(int index) { GetterPointer getters[k_totalNumberOfCell] = {&Interval::start, &Interval::end, &Interval::step}; return (m_interval->*getters[index])(); @@ -75,13 +66,20 @@ int IntervalParameterController::reusableParameterCellCount(int type) { return k_totalNumberOfCell; } -View * IntervalParameterController::createView() { - SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::createView(); +View * IntervalParameterController::loadView() { + SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::loadView(); for (int i = 0; i < k_totalNumberOfCell; i++) { - assert(m_intervalCells[i] == nullptr); m_intervalCells[i] = new MessageTableCellWithEditableText(tableView, this, m_draftTextBuffer, I18n::Message::Default); } return tableView; } +void IntervalParameterController::unloadView(View * view) { + for (int i = 0; i < k_totalNumberOfCell; i++) { + delete m_intervalCells[i]; + m_intervalCells[i] = nullptr; + } + FloatParameterController::unloadView(view); +} + } diff --git a/apps/shared/interval_parameter_controller.h b/apps/shared/interval_parameter_controller.h index 0012cf93f..e5856afd4 100644 --- a/apps/shared/interval_parameter_controller.h +++ b/apps/shared/interval_parameter_controller.h @@ -14,7 +14,6 @@ public: const char * title() override; void willDisplayCellForIndex(HighlightCell * cell, int index) override; int numberOfRows() override; - void unloadView() override; protected: constexpr static int k_totalNumberOfCell = 3; bool setParameterAtIndex(int parameterIndex, float f) override; @@ -23,7 +22,8 @@ private: HighlightCell * reusableParameterCell(int index, int type) override; int reusableParameterCellCount(int type) override; float parameterAtIndex(int index) override; - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; char m_draftTextBuffer[MessageTableCellWithEditableText::k_bufferLength]; MessageTableCellWithEditableText * m_intervalCells[k_totalNumberOfCell]; }; diff --git a/apps/shared/list_controller.cpp b/apps/shared/list_controller.cpp index 54788d63d..94c58157f 100644 --- a/apps/shared/list_controller.cpp +++ b/apps/shared/list_controller.cpp @@ -235,7 +235,7 @@ bool ListController::handleEvent(Ion::Events::Event event) { return false; } -void ListController::viewWillAppear() { +void ListController::didEnterResponderChain(Responder * previousFirstResponder) { selectableTableView()->reloadData(); } @@ -246,16 +246,6 @@ void ListController::willExitResponderChain(Responder * nextFirstResponder) { } } -void ListController::unloadView() { - assert(m_emptyCell != nullptr); - delete m_emptyCell; - m_emptyCell = nullptr; - assert(m_addNewFunction != nullptr); - delete m_addNewFunction; - m_addNewFunction = nullptr; - DynamicViewController::unloadView(); -} - StackViewController * ListController::stackController() const{ return (StackViewController *)(parentResponder()->parentResponder()->parentResponder()); } @@ -275,14 +265,6 @@ SelectableTableView * ListController::selectableTableView() { return (SelectableTableView *)view(); } -View * ListController::createView() { - assert(m_emptyCell == nullptr); - m_emptyCell = new EvenOddCell(); - assert(m_addNewFunction == nullptr); - m_addNewFunction = new NewFunctionCell(m_addNewMessage); - return new SelectableTableView(this, this, 0, 0, 0, 0, 0, 0, this, false, true); -} - TabViewController * ListController::tabController() const{ return (TabViewController *)(parentResponder()->parentResponder()->parentResponder()->parentResponder()); } @@ -305,4 +287,18 @@ void ListController::removeFunctionRow(Function * function) { m_functionStore->removeFunction(function); } +View * ListController::loadView() { + m_emptyCell = new EvenOddCell(); + m_addNewFunction = new NewFunctionCell(m_addNewMessage); + return new SelectableTableView(this, this, 0, 0, 0, 0, 0, 0, this, false, true); +} + +void ListController::unloadView(View * view) { + delete m_emptyCell; + m_emptyCell = nullptr; + delete m_addNewFunction; + m_addNewFunction = nullptr; + delete view; +} + } diff --git a/apps/shared/list_controller.h b/apps/shared/list_controller.h index cdee59cf0..5d0c2f94c 100644 --- a/apps/shared/list_controller.h +++ b/apps/shared/list_controller.h @@ -26,16 +26,16 @@ public: Button * buttonAtIndex(int index, ButtonRowController::Position position) const override; void didBecomeFirstResponder() override; bool handleEvent(Ion::Events::Event event) override; - void viewWillAppear() override; + void didEnterResponderChain(Responder * previousFirstResponder) override; void willExitResponderChain(Responder * nextFirstResponder) override; - void unloadView() override; protected: static constexpr KDCoordinate k_emptyRowHeight = 50; StackViewController * stackController() const; void configureFunction(Function * function); virtual void reinitExpression(Function * function); SelectableTableView * selectableTableView(); - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; FunctionStore * m_functionStore; private: static constexpr KDCoordinate k_functionNameWidth = 65; diff --git a/apps/shared/range_parameter_controller.cpp b/apps/shared/range_parameter_controller.cpp index 75feb404a..0e3bf2c10 100644 --- a/apps/shared/range_parameter_controller.cpp +++ b/apps/shared/range_parameter_controller.cpp @@ -121,28 +121,24 @@ int RangeParameterController::reusableParameterCellCount(int type) { return k_numberOfTextCell; } -void RangeParameterController::unloadView() { - assert(m_yAutoCell != nullptr); - delete m_yAutoCell; - m_yAutoCell = nullptr; - for (int i = 0; i < k_numberOfTextCell; i++) { - assert(m_rangeCells[i] != nullptr); - delete m_rangeCells[i]; - m_rangeCells[i] = nullptr; - } - FloatParameterController::unloadView(); -} - -View * RangeParameterController::createView() { - SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::createView(); - assert(m_yAutoCell == nullptr); +View * RangeParameterController::loadView() { + SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::loadView(); m_yAutoCell = new MessageTableCellWithSwitch(I18n::Message::YAuto); for (int i = 0; i < k_numberOfTextCell; i++) { - assert(m_rangeCells[i] == nullptr); m_rangeCells[i] = new MessageTableCellWithEditableText(tableView, this, m_draftTextBuffer, I18n::Message::Default); } return tableView; } +void RangeParameterController::unloadView(View * view) { + delete m_yAutoCell; + m_yAutoCell = nullptr; + for (int i = 0; i < k_numberOfTextCell; i++) { + delete m_rangeCells[i]; + m_rangeCells[i] = nullptr; + } + FloatParameterController::unloadView(view); +} + } diff --git a/apps/shared/range_parameter_controller.h b/apps/shared/range_parameter_controller.h index e8f1d6633..ca1987047 100644 --- a/apps/shared/range_parameter_controller.h +++ b/apps/shared/range_parameter_controller.h @@ -17,13 +17,13 @@ public: bool textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) override; void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) override; bool handleEvent(Ion::Events::Event event) override; - void unloadView() override; private: HighlightCell * reusableParameterCell(int index, int type) override; int reusableParameterCellCount(int type) override; float parameterAtIndex(int index) override; bool setParameterAtIndex(int parameterIndex, float f) override; - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; constexpr static int k_numberOfTextCell = 4; InteractiveCurveViewRange * m_interactiveRange; char m_draftTextBuffer[MessageTableCellWithEditableText::k_bufferLength]; diff --git a/apps/shared/store_controller.cpp b/apps/shared/store_controller.cpp index e97c7d4ec..69bd89a53 100644 --- a/apps/shared/store_controller.cpp +++ b/apps/shared/store_controller.cpp @@ -96,15 +96,6 @@ bool StoreController::handleEvent(Ion::Events::Event event) { return false; } -void StoreController::unloadView() { - for (int i = 0; i < k_maxNumberOfEditableCells; i++) { - assert(m_editableCells[i] != nullptr); - delete m_editableCells[i]; - m_editableCells[i] = nullptr; - } - EditableCellTableViewController::unloadView(); -} - Responder * StoreController::tabController() const { return (parentResponder()->parentResponder()->parentResponder()); } @@ -133,13 +124,20 @@ int StoreController::maxNumberOfElements() const { return FloatPairStore::k_maxNumberOfPairs; } -View * StoreController::createView() { - SelectableTableView * tableView = (SelectableTableView*)EditableCellTableViewController::createView(); +View * StoreController::loadView() { + SelectableTableView * tableView = (SelectableTableView*)EditableCellTableViewController::loadView(); for (int i = 0; i < k_maxNumberOfEditableCells; i++) { - assert(m_editableCells[i] == nullptr); m_editableCells[i] = new EvenOddEditableTextCell(tableView, this, m_draftTextBuffer); } return tableView; } +void StoreController::unloadView(View * view) { + for (int i = 0; i < k_maxNumberOfEditableCells; i++) { + delete m_editableCells[i]; + m_editableCells[i] = nullptr; + } + EditableCellTableViewController::unloadView(view); +} + } diff --git a/apps/shared/store_controller.h b/apps/shared/store_controller.h index 6ad29f106..eae6703a4 100644 --- a/apps/shared/store_controller.h +++ b/apps/shared/store_controller.h @@ -22,13 +22,13 @@ public: void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; - void unloadView() override; protected: static constexpr KDCoordinate k_cellWidth = Ion::Display::Width/2 - Metric::CommonRightMargin/2 - Metric::CommonLeftMargin/2; constexpr static int k_maxNumberOfEditableCells = 22; constexpr static int k_numberOfTitleCells = 2; Responder * tabController() const override; - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; bool cellAtLocationIsEditable(int columnIndex, int rowIndex) override; bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override; float dataAtLocation(int columnIndex, int rowIndex) override; diff --git a/apps/shared/tab_table_controller.cpp b/apps/shared/tab_table_controller.cpp index 3162e49a6..d250af29c 100644 --- a/apps/shared/tab_table_controller.cpp +++ b/apps/shared/tab_table_controller.cpp @@ -19,6 +19,7 @@ void TabTableController::didBecomeFirstResponder() { } void TabTableController::viewWillAppear() { + DynamicViewController::viewWillAppear(); selectableTableView()->reloadData(); } @@ -33,10 +34,13 @@ SelectableTableView * TabTableController::selectableTableView() { return (SelectableTableView *)view(); } -View * TabTableController::createView() { +View * TabTableController::loadView() { return new SelectableTableView(this, m_dataSource, 0, 0, m_topMargin, m_rightMargin, m_bottomMargin, m_leftMargin, this, m_showIndicators, true, Palette::WallScreenDark); } +void TabTableController::unloadView(View * view) { + delete view; +} } diff --git a/apps/shared/tab_table_controller.h b/apps/shared/tab_table_controller.h index f1c6af97f..42479bb52 100644 --- a/apps/shared/tab_table_controller.h +++ b/apps/shared/tab_table_controller.h @@ -17,7 +17,8 @@ public: void willExitResponderChain(Responder * nextFirstResponder) override; protected: SelectableTableView * selectableTableView(); - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; virtual Responder * tabController() const = 0; private: TableViewDataSource * m_dataSource; diff --git a/apps/shared/values_controller.cpp b/apps/shared/values_controller.cpp index 1b32539ab..638961c36 100644 --- a/apps/shared/values_controller.cpp +++ b/apps/shared/values_controller.cpp @@ -227,20 +227,8 @@ Responder * ValuesController::defaultController() { } void ValuesController::viewWillAppear() { - header()->setSelectedButton(-1); EditableCellTableViewController::viewWillAppear(); -} - -void ValuesController::unloadView() { - assert(m_abscissaTitleCell != nullptr); - delete m_abscissaTitleCell; - m_abscissaTitleCell = nullptr; - for (int i = 0; i < k_maxNumberOfAbscissaCells; i++) { - assert(m_abscissaCells[i] != nullptr); - delete m_abscissaCells[i]; - m_abscissaCells[i] = nullptr; - } - EditableCellTableViewController::unloadView(); + header()->setSelectedButton(-1); } Function * ValuesController::functionAtColumn(int i) { @@ -305,16 +293,24 @@ float ValuesController::evaluationOfAbscissaAtColumn(float abscissa, int columnI return function->evaluateAtAbscissa(abscissa, myApp->localContext()); } -View * ValuesController::createView() { - SelectableTableView * tableView = (SelectableTableView*)EditableCellTableViewController::createView(); - assert(m_abscissaTitleCell == nullptr); +View * ValuesController::loadView() { + SelectableTableView * tableView = (SelectableTableView*)EditableCellTableViewController::loadView(); m_abscissaTitleCell = new EvenOddMessageTextCell(KDText::FontSize::Small); for (int i = 0; i < k_maxNumberOfAbscissaCells; i++) { - assert(m_abscissaCells[i] == nullptr); m_abscissaCells[i] = new EvenOddEditableTextCell(tableView, this, m_draftTextBuffer, KDText::FontSize::Small); } return tableView; } +void ValuesController::unloadView(View * view) { + delete m_abscissaTitleCell; + m_abscissaTitleCell = nullptr; + for (int i = 0; i < k_maxNumberOfAbscissaCells; i++) { + delete m_abscissaCells[i]; + m_abscissaCells[i] = nullptr; + } + EditableCellTableViewController::unloadView(view); +} + } diff --git a/apps/shared/values_controller.h b/apps/shared/values_controller.h index f2533892b..9b942a375 100644 --- a/apps/shared/values_controller.h +++ b/apps/shared/values_controller.h @@ -34,7 +34,6 @@ public: bool isEmpty() const override; Responder * defaultController() override; void viewWillAppear() override; - void unloadView() override; static constexpr KDCoordinate k_topMargin = 10; static constexpr KDCoordinate k_bottomMargin = 5; static constexpr KDCoordinate k_leftMargin = 1; @@ -44,7 +43,8 @@ public: protected: StackViewController * stackController() const; bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override; - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; Interval m_interval; private: virtual Function * functionAtColumn(int i); diff --git a/apps/statistics/calculation_controller.cpp b/apps/statistics/calculation_controller.cpp index 60d1bd5f4..c4c6aee34 100644 --- a/apps/statistics/calculation_controller.cpp +++ b/apps/statistics/calculation_controller.cpp @@ -111,32 +111,29 @@ int CalculationController::typeAtLocation(int i, int j) { return i; } -void CalculationController::unloadView() { - for (int i = 0; i < k_maxNumberOfDisplayableRows; i++) { - assert(m_titleCells[i] != nullptr); - delete m_titleCells[i]; - m_titleCells[i] = nullptr; - assert(m_calculationCells[i] != nullptr); - delete m_calculationCells[i]; - m_calculationCells[i] = nullptr; - } - TabTableController::unloadView(); -} - Responder * CalculationController::tabController() const { return (parentResponder()->parentResponder()->parentResponder()); } -View * CalculationController::createView() { +View * CalculationController::loadView() { for (int i = 0; i < k_maxNumberOfDisplayableRows; i++) { - assert(m_titleCells[i] == nullptr); m_titleCells[i] = new EvenOddMessageTextCell(KDText::FontSize::Small); m_titleCells[i]->setAlignment(1.0f, 0.5f); - assert(m_calculationCells[i] == nullptr); m_calculationCells[i] = new EvenOddBufferTextCell(KDText::FontSize::Small); m_calculationCells[i]->setTextColor(Palette::GreyDark); } - return TabTableController::createView(); + return TabTableController::loadView(); +} + + +void CalculationController::unloadView(View * view) { + for (int i = 0; i < k_maxNumberOfDisplayableRows; i++) { + delete m_titleCells[i]; + m_titleCells[i] = nullptr; + delete m_calculationCells[i]; + m_calculationCells[i] = nullptr; + } + TabTableController::unloadView(view); } } diff --git a/apps/statistics/calculation_controller.h b/apps/statistics/calculation_controller.h index a9bd1cd3c..679e2f97e 100644 --- a/apps/statistics/calculation_controller.h +++ b/apps/statistics/calculation_controller.h @@ -29,10 +29,10 @@ public: HighlightCell * reusableCell(int index, int type) override; int reusableCellCount(int type) override; int typeAtLocation(int i, int j) override; - void unloadView() override; private: Responder * tabController() const override; - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; constexpr static int k_totalNumberOfRows = 13; constexpr static int k_maxNumberOfDisplayableRows = 11; static constexpr KDCoordinate k_cellHeight = 20; diff --git a/apps/statistics/histogram_parameter_controller.cpp b/apps/statistics/histogram_parameter_controller.cpp index 15f7a9083..d7aec4568 100644 --- a/apps/statistics/histogram_parameter_controller.cpp +++ b/apps/statistics/histogram_parameter_controller.cpp @@ -30,15 +30,6 @@ void HistogramParameterController::willDisplayCellForIndex(HighlightCell * cell, FloatParameterController::willDisplayCellForIndex(cell, index); } -void HistogramParameterController::unloadView() { - for (int i = 0; i < k_numberOfCells; i++) { - assert(m_cells[i] != nullptr); - delete m_cells[i]; - m_cells[i] = nullptr; - } - FloatParameterController::unloadView(); -} - float HistogramParameterController::parameterAtIndex(int index) { assert(index >= 0 && index < k_numberOfCells); if (index == 0) { @@ -76,14 +67,21 @@ int HistogramParameterController::reusableParameterCellCount(int type) { return k_numberOfCells; } -View * HistogramParameterController::createView() { - SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::createView(); +View * HistogramParameterController::loadView() { + SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::loadView(); for (int i = 0; i < k_numberOfCells; i++) { - assert(m_cells[i] == nullptr); m_cells[i] = new MessageTableCellWithEditableText(tableView, this, m_draftTextBuffer, I18n::Message::Default); } return tableView; } +void HistogramParameterController::unloadView(View * view) { + for (int i = 0; i < k_numberOfCells; i++) { + delete m_cells[i]; + m_cells[i] = nullptr; + } + FloatParameterController::unloadView(view); +} + } diff --git a/apps/statistics/histogram_parameter_controller.h b/apps/statistics/histogram_parameter_controller.h index 5cd5d3a1c..9da825be2 100644 --- a/apps/statistics/histogram_parameter_controller.h +++ b/apps/statistics/histogram_parameter_controller.h @@ -13,13 +13,13 @@ public: const char * title() override; int numberOfRows() override; void willDisplayCellForIndex(HighlightCell * cell, int index) override; - void unloadView() override; private: HighlightCell * reusableParameterCell(int index, int type) override; int reusableParameterCellCount(int type) override; float parameterAtIndex(int index) override; bool setParameterAtIndex(int parameterIndex, float f) override; - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; char m_draftTextBuffer[MessageTableCellWithEditableText::k_bufferLength]; constexpr static int k_numberOfCells = 2; MessageTableCellWithEditableText * m_cells[k_numberOfCells]; diff --git a/apps/statistics/store_controller.cpp b/apps/statistics/store_controller.cpp index 0755eac6b..6511e91c9 100644 --- a/apps/statistics/store_controller.cpp +++ b/apps/statistics/store_controller.cpp @@ -26,15 +26,6 @@ void StoreController::willDisplayCellAtLocation(HighlightCell * cell, int i, int mytitleCell->setMessage(I18n::Message::Sizes); } -void StoreController::unloadView() { - for (int i = 0; i < k_numberOfTitleCells; i++) { - assert(m_titleCells[i] != nullptr); - delete m_titleCells[i]; - m_titleCells[i] = nullptr; - } - Shared::StoreController::unloadView(); -} - HighlightCell * StoreController::titleCells(int index) { assert(index >= 0 && index < k_numberOfTitleCells); return m_titleCells[index]; @@ -51,12 +42,19 @@ bool StoreController::setDataAtLocation(float floatBody, int columnIndex, int ro return Shared::StoreController::setDataAtLocation(floatBody, columnIndex, rowIndex); } -View * StoreController::createView() { +View * StoreController::loadView() { for (int i = 0; i < k_numberOfTitleCells; i++) { - assert(m_titleCells[i] == nullptr); m_titleCells[i] = new EvenOddMessageTextCell(KDText::FontSize::Small); } - return Shared::StoreController::createView(); + return Shared::StoreController::loadView(); +} + +void StoreController::unloadView(View * view) { + for (int i = 0; i < k_numberOfTitleCells; i++) { + delete m_titleCells[i]; + m_titleCells[i] = nullptr; + } + Shared::StoreController::unloadView(view); } } diff --git a/apps/statistics/store_controller.h b/apps/statistics/store_controller.h index af53c3565..106870911 100644 --- a/apps/statistics/store_controller.h +++ b/apps/statistics/store_controller.h @@ -11,11 +11,11 @@ class StoreController : public Shared::StoreController { public: StoreController(Responder * parentResponder, Store * store, ButtonRowController * header); void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; - void unloadView() override; private: bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override; HighlightCell * titleCells(int index) override; - View * createView() override; + View * loadView() override; + void unloadView(View * view) override; EvenOddMessageTextCell * m_titleCells[k_numberOfTitleCells]; }; diff --git a/apps/variable_box_controller.cpp b/apps/variable_box_controller.cpp index 679e40916..549a9ccbd 100644 --- a/apps/variable_box_controller.cpp +++ b/apps/variable_box_controller.cpp @@ -264,5 +264,6 @@ void VariableBoxController::viewWillAppear() { } void VariableBoxController::viewDidDisappear() { + StackViewController::viewDidDisappear(); m_contentViewController.deselectTable(); } diff --git a/escher/include/escher/alternate_empty_view_controller.h b/escher/include/escher/alternate_empty_view_controller.h index cf676d973..0a3f2da1d 100644 --- a/escher/include/escher/alternate_empty_view_controller.h +++ b/escher/include/escher/alternate_empty_view_controller.h @@ -15,8 +15,6 @@ public: void didBecomeFirstResponder() override; void viewWillAppear() override; void viewDidDisappear() override; - void loadView() override; - void unloadView() override; private: class ContentView : public View { public: diff --git a/escher/include/escher/button_row_controller.h b/escher/include/escher/button_row_controller.h index 7cfd26a7f..ff241c3f3 100644 --- a/escher/include/escher/button_row_controller.h +++ b/escher/include/escher/button_row_controller.h @@ -28,8 +28,6 @@ public: bool setSelectedButton(int selectedButton); void viewWillAppear() override; void viewDidDisappear() override; - void loadView() override; - void unloadView() override; private: class ContentView : public View { public: @@ -66,10 +64,6 @@ public: virtual Button * buttonAtIndex(int index, ButtonRowController::Position position) const; ButtonRowController * header(); ButtonRowController * footer(); - /* By default these two functions do not load anything. They should be - * overrided if the delegate dynamically allocate the button views. */ - virtual void loadButtonView(); - virtual void unloadButtonView(); private: ButtonRowController * m_header; ButtonRowController * m_footer; diff --git a/escher/include/escher/dynamic_view_controller.h b/escher/include/escher/dynamic_view_controller.h index 6016864da..d94278cc6 100644 --- a/escher/include/escher/dynamic_view_controller.h +++ b/escher/include/escher/dynamic_view_controller.h @@ -15,10 +15,13 @@ public: DynamicViewController(Responder * parentResponder); ~DynamicViewController(); View * view() override; - virtual void loadView() override; - virtual void unloadView() override; + void viewWillAppear() override; + void viewDidDisappear() override; private: - virtual View * createView() = 0; + void loadViewIfNeeded(); + void unloadViewIfNeeded(); + virtual View * loadView() = 0; + virtual void unloadView(View * view) = 0; View * m_view; }; diff --git a/escher/include/escher/modal_view_controller.h b/escher/include/escher/modal_view_controller.h index 84cfad38f..30361c7a1 100644 --- a/escher/include/escher/modal_view_controller.h +++ b/escher/include/escher/modal_view_controller.h @@ -17,8 +17,6 @@ public: bool isDisplayingModal(); void viewWillAppear() override; void viewDidDisappear() override; - void loadView() override; - void unloadView() override; 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 1d9a536e3..4a5a8b93e 100644 --- a/escher/include/escher/stack_view_controller.h +++ b/escher/include/escher/stack_view_controller.h @@ -23,8 +23,6 @@ public: void didBecomeFirstResponder() override; void viewWillAppear() override; void viewDidDisappear() override; - void loadView() override; - void unloadView() override; private: class Frame { public: diff --git a/escher/include/escher/tab_view_controller.h b/escher/include/escher/tab_view_controller.h index 3b9da33e0..79131b0b6 100644 --- a/escher/include/escher/tab_view_controller.h +++ b/escher/include/escher/tab_view_controller.h @@ -20,8 +20,6 @@ public: void willResignFirstResponder() override; void viewWillAppear() override; void viewDidDisappear() override; - void loadView() override; - void unloadView() override; private: ViewController * activeViewController(); class ContentView : public View { diff --git a/escher/include/escher/view_controller.h b/escher/include/escher/view_controller.h index db4077fb9..47db53b58 100644 --- a/escher/include/escher/view_controller.h +++ b/escher/include/escher/view_controller.h @@ -32,8 +32,6 @@ public: ViewController(Responder * parentResponder); virtual const char * title(); virtual View * view() = 0; - virtual void loadView(); - virtual void unloadView(); virtual void viewWillAppear(); virtual void viewDidDisappear(); }; diff --git a/escher/src/alternate_empty_view_controller.cpp b/escher/src/alternate_empty_view_controller.cpp index 152622c94..4883c6fcc 100644 --- a/escher/src/alternate_empty_view_controller.cpp +++ b/escher/src/alternate_empty_view_controller.cpp @@ -86,15 +86,3 @@ void AlternateEmptyViewController::viewDidDisappear() { m_contentView.mainViewController()->viewDidDisappear(); } } - -void AlternateEmptyViewController::loadView() { - if (!m_contentView.alternateEmptyViewDelegate()->isEmpty()) { - m_contentView.mainViewController()->loadView(); - } -} - -void AlternateEmptyViewController::unloadView() { - if (!m_contentView.alternateEmptyViewDelegate()->isEmpty()) { - m_contentView.mainViewController()->unloadView(); - } -} diff --git a/escher/src/app.cpp b/escher/src/app.cpp index 73474656d..c6775219d 100644 --- a/escher/src/app.cpp +++ b/escher/src/app.cpp @@ -91,11 +91,10 @@ const Container * App::container() const { } void App::didBecomeActive(Window * window) { - m_modalViewController.loadView(); View * view = m_modalViewController.view(); assert(m_modalViewController.app() == this); - window->setContentView(view); m_modalViewController.viewWillAppear(); + window->setContentView(view); setFirstResponder(&m_modalViewController); window->redraw(); } @@ -106,5 +105,4 @@ void App::willBecomeInactive() { } setFirstResponder(nullptr); m_modalViewController.viewDidDisappear(); - m_modalViewController.unloadView(); } diff --git a/escher/src/button_row_controller.cpp b/escher/src/button_row_controller.cpp index 01787f6d8..2491a3327 100644 --- a/escher/src/button_row_controller.cpp +++ b/escher/src/button_row_controller.cpp @@ -26,12 +26,6 @@ ButtonRowController * ButtonRowDelegate::header() { return m_header; } -void ButtonRowDelegate::loadButtonView() { -} - -void ButtonRowDelegate::unloadButtonView() { -} - ButtonRowController::ContentView::ContentView(ViewController * mainViewController, ButtonRowDelegate * delegate, Position position, Style style) : View(), m_mainViewController(mainViewController), @@ -230,21 +224,10 @@ bool ButtonRowController::handleEvent(Ion::Events::Event event) { void ButtonRowController::viewWillAppear() { /* We need to layout subviews at first appearance because the number of * buttons might have changed between 2 appearences. */ - m_contentView.mainViewController()->viewWillAppear(); m_contentView.layoutSubviews(); + m_contentView.mainViewController()->viewWillAppear(); } void ButtonRowController::viewDidDisappear() { m_contentView.mainViewController()->viewDidDisappear(); -} - -void ButtonRowController::loadView() { - m_contentView.buttonRowDelegate()->loadButtonView(); - m_contentView.mainViewController()->loadView(); - m_contentView.layoutSubviews(); -} - -void ButtonRowController::unloadView() { - m_contentView.buttonRowDelegate()->unloadButtonView(); - m_contentView.mainViewController()->unloadView(); -} +} \ No newline at end of file diff --git a/escher/src/dynamic_view_controller.cpp b/escher/src/dynamic_view_controller.cpp index 39de39315..1b1990501 100644 --- a/escher/src/dynamic_view_controller.cpp +++ b/escher/src/dynamic_view_controller.cpp @@ -9,24 +9,32 @@ DynamicViewController::DynamicViewController(Responder * parentResponder) : } DynamicViewController::~DynamicViewController() { - if (m_view) { - delete m_view; - m_view = nullptr; - } + assert(m_view == nullptr); } View * DynamicViewController::view() { - assert(m_view != nullptr); + loadViewIfNeeded(); return m_view; } -void DynamicViewController::loadView() { - assert(m_view == nullptr); - m_view = createView(); +void DynamicViewController::viewWillAppear() { + loadViewIfNeeded(); } -void DynamicViewController::unloadView() { - assert(m_view != nullptr); - delete m_view; - m_view = nullptr; +void DynamicViewController::viewDidDisappear() { + unloadViewIfNeeded(); +} + +void DynamicViewController::loadViewIfNeeded() { + if (m_view == nullptr) { + m_view = loadView(); + assert(m_view != nullptr); + } +} + +void DynamicViewController::unloadViewIfNeeded() { + if (m_view != nullptr) { + unloadView(m_view); + m_view = nullptr; + } } diff --git a/escher/src/modal_view_controller.cpp b/escher/src/modal_view_controller.cpp index 3618626be..b98e2751f 100644 --- a/escher/src/modal_view_controller.cpp +++ b/escher/src/modal_view_controller.cpp @@ -57,8 +57,10 @@ KDRect ModalViewController::ContentView::frame() { } void ModalViewController::ContentView::layoutSubviews() { + assert(m_regularView != nullptr); m_regularView->setFrame(bounds()); if (numberOfSubviews() == 2) { + assert(m_currentModalView != nullptr); m_currentModalView->setFrame(frame()); } } @@ -110,8 +112,6 @@ void ModalViewController::displayModalViewController(ViewController * vc, float m_currentModalViewController = vc; vc->setParentResponder(this); m_previousResponder = app()->firstResponder(); - m_regularViewController->viewDidDisappear(); - vc->loadView(); m_contentView.presentModalView(vc->view(), verticalAlignment, horizontalAlignment, topMargin, leftMargin, bottomMargin, rightMargin); m_currentModalViewController->viewWillAppear(); app()->setFirstResponder(vc); @@ -119,10 +119,8 @@ void ModalViewController::displayModalViewController(ViewController * vc, float void ModalViewController::dismissModalViewController() { m_currentModalViewController->viewDidDisappear(); - m_regularViewController->viewWillAppear(); app()->setFirstResponder(m_previousResponder); m_contentView.dismissModalView(); - m_currentModalViewController->unloadView(); m_currentModalViewController = nullptr; } @@ -145,6 +143,8 @@ bool ModalViewController::handleEvent(Ion::Events::Event event) { } void ModalViewController::viewWillAppear() { + m_contentView.setMainView(m_regularViewController->view()); + m_contentView.layoutSubviews(); if (m_contentView.isDisplayingModal()) { m_currentModalViewController->viewWillAppear(); } @@ -157,19 +157,3 @@ void ModalViewController::viewDidDisappear() { } m_regularViewController->viewDidDisappear(); } - -void ModalViewController::loadView() { - if (m_contentView.isDisplayingModal()) { - m_currentModalViewController->loadView(); - } - m_regularViewController->loadView(); - m_contentView.setMainView(m_regularViewController->view()); - m_contentView.layoutSubviews(); -} - -void ModalViewController::unloadView() { - if (m_contentView.isDisplayingModal()) { - m_currentModalViewController->unloadView(); - } - m_regularViewController->unloadView(); -} diff --git a/escher/src/stack_view_controller.cpp b/escher/src/stack_view_controller.cpp index 669dc632d..c2d840dd7 100644 --- a/escher/src/stack_view_controller.cpp +++ b/escher/src/stack_view_controller.cpp @@ -89,7 +89,6 @@ void StackViewController::push(ViewController * vc, KDColor textColor, KDColor b setupActiveViewController(); if (m_numberOfChildren > 1) { m_childrenFrame[m_numberOfChildren-2].viewController()->viewDidDisappear(); - m_childrenFrame[m_numberOfChildren-2].viewController()->unloadView(); } } @@ -98,10 +97,9 @@ void StackViewController::pop() { assert(m_numberOfChildren > 0); ViewController * vc = m_childrenFrame[m_numberOfChildren-1].viewController(); m_numberOfChildren--; - vc->viewDidDisappear(); setupActiveViewController(); vc->setParentResponder(nullptr); - vc->unloadView(); + vc->viewDidDisappear(); } void StackViewController::pushModel(Frame frame) { @@ -111,7 +109,6 @@ void StackViewController::pushModel(Frame frame) { void StackViewController::setupActiveViewController() { ViewController * vc = m_childrenFrame[m_numberOfChildren-1].viewController(); vc->setParentResponder(this); - vc->loadView(); m_view.setContentView(vc->view()); vc->viewWillAppear(); vc->setParentResponder(this); @@ -136,8 +133,14 @@ View * StackViewController::view() { } void StackViewController::viewWillAppear() { + /* Load the stack view */ + for (int i = 0; i < m_numberOfChildren; i++) { + 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()); vc->viewWillAppear(); } } @@ -147,27 +150,7 @@ void StackViewController::viewDidDisappear() { if (m_numberOfChildren > 0 && vc) { vc->viewDidDisappear(); } -} - -void StackViewController::loadView() { - /* Load the stack view */ - for (int i = 0; i < m_numberOfChildren; i++) { - m_view.pushStack(m_childrenFrame[i]); - } - /* Load the visible controller view */ - ViewController * vc = m_childrenFrame[m_numberOfChildren-1].viewController(); - if (m_numberOfChildren > 0 && vc) { - vc->loadView(); - m_view.setContentView(vc->view()); - } -} - -void StackViewController::unloadView() { for (int i = 0; i < m_numberOfChildren; i++) { m_view.popStack(); } - ViewController * vc = m_childrenFrame[m_numberOfChildren-1].viewController(); - if (m_numberOfChildren > 0 && vc) { - vc->unloadView(); - } } diff --git a/escher/src/tab_view_controller.cpp b/escher/src/tab_view_controller.cpp index 1fd66fbfb..1868f6658 100644 --- a/escher/src/tab_view_controller.cpp +++ b/escher/src/tab_view_controller.cpp @@ -114,19 +114,15 @@ void TabViewController::setActiveTab(int8_t i, bool forceReactive) { ViewController * activeVC = m_children[i]; if (i != m_activeChildIndex || forceReactive) { if (i != m_activeChildIndex) { - activeVC->loadView(); m_view.setActiveView(activeVC->view()); - } - m_view.m_tabView.setActiveIndex(i); - if (i >= 0) { m_children[i]->viewWillAppear(); } + m_view.m_tabView.setActiveIndex(i); } app()->setFirstResponder(activeVC); if (i != m_activeChildIndex || forceReactive) { if (m_activeChildIndex >= 0 && m_activeChildIndex != i) { m_children[m_activeChildIndex]->viewDidDisappear(); - m_children[m_activeChildIndex]->unloadView(); } m_activeChildIndex = i; } @@ -166,15 +162,6 @@ const char * TabViewController::tabName(uint8_t index) { } void TabViewController::viewWillAppear() { - activeViewController()->viewWillAppear(); - m_view.m_tabView.setActiveIndex(m_activeChildIndex); -} - -void TabViewController::viewDidDisappear() { - activeViewController()->viewDidDisappear(); -} - -void TabViewController::loadView() { if (m_view.m_tabView.numberOfTabs() != m_numberOfChildren) { for (int i=0; iloadView(); m_view.setActiveView(m_children[m_activeChildIndex]->view()); + activeViewController()->viewWillAppear(); + m_view.m_tabView.setActiveIndex(m_activeChildIndex); } -void TabViewController::unloadView() { - activeViewController()->unloadView(); +void TabViewController::viewDidDisappear() { + activeViewController()->viewDidDisappear(); } ViewController * TabViewController::activeViewController() { diff --git a/escher/src/view_controller.cpp b/escher/src/view_controller.cpp index 59851acda..c65d56d5e 100644 --- a/escher/src/view_controller.cpp +++ b/escher/src/view_controller.cpp @@ -15,8 +15,3 @@ void ViewController::viewWillAppear() { void ViewController::viewDidDisappear() { } -void ViewController::loadView() { -} - -void ViewController::unloadView() { -}