diff --git a/apps/graph/values/values_controller.cpp b/apps/graph/values/values_controller.cpp index b30ac5808..95ee012b1 100644 --- a/apps/graph/values/values_controller.cpp +++ b/apps/graph/values/values_controller.cpp @@ -9,8 +9,6 @@ namespace Graph { ValuesController::ValuesController(Responder * parentResponder, CartesianFunctionStore * functionStore, ButtonRowController * header) : Shared::ValuesController(parentResponder, header, I18n::Message::XColumn, &m_intervalParameterController), - m_functionTitleCells{FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small), FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small), - FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small), FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small), FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small)}, m_functionStore(functionStore), m_functionParameterController(FunctionParameterController(this)), m_intervalParameterController(IntervalParameterController(this, &m_interval)), @@ -72,21 +70,35 @@ I18n::Message ValuesController::emptyMessage() { } void ValuesController::selectCellAtLocation(int i, int j) { - m_selectableTableView.selectCellAtLocation(i, j); + selectableTableView()->selectCellAtLocation(i, j); } int ValuesController::activeRow() { - return m_selectableTableView.selectedRow(); + return selectableTableView()->selectedRow(); } int ValuesController::activeColumn() { - return m_selectableTableView.selectedColumn(); + return selectableTableView()->selectedColumn(); } 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; @@ -146,12 +158,12 @@ int ValuesController::maxNumberOfFunctions() { FunctionTitleCell * ValuesController::functionTitleCells(int j) { assert(j >= 0 && j < k_maxNumberOfFunctions); - return &m_functionTitleCells[j]; + return m_functionTitleCells[j]; } EvenOddBufferTextCell * ValuesController::floatCells(int j) { assert(j >= 0 && j < k_maxNumberOfCells); - return &m_floatCells[j]; + return m_floatCells[j]; } CartesianFunctionStore * ValuesController::functionStore() const { @@ -171,5 +183,17 @@ float ValuesController::evaluationOfAbscissaAtColumn(float abscissa, int columnI return function->evaluateAtAbscissa(abscissa, myApp->localContext()); } +View * ValuesController::createView() { + 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(); +} + } diff --git a/apps/graph/values/values_controller.h b/apps/graph/values/values_controller.h index 37a5ec5c0..194f6cecf 100644 --- a/apps/graph/values/values_controller.h +++ b/apps/graph/values/values_controller.h @@ -21,6 +21,7 @@ public: int activeRow(); int activeColumn(); Shared::IntervalParameterController * intervalParameterController() override; + void unloadView() override; private: CartesianFunction * functionAtColumn(int i) override; bool isDerivativeColumn(int i); @@ -30,14 +31,15 @@ private: float evaluationOfAbscissaAtColumn(float abscissa, int columnIndex) override; constexpr static int k_maxNumberOfCells = 50; constexpr static int k_maxNumberOfFunctions = 5; - FunctionTitleCell m_functionTitleCells[k_maxNumberOfFunctions]; + FunctionTitleCell * m_functionTitleCells[k_maxNumberOfFunctions]; FunctionTitleCell * functionTitleCells(int j) override; - EvenOddBufferTextCell m_floatCells[k_maxNumberOfCells]; + EvenOddBufferTextCell * m_floatCells[k_maxNumberOfCells]; EvenOddBufferTextCell * floatCells(int j) override; CartesianFunctionStore * m_functionStore; CartesianFunctionStore * functionStore() const override; FunctionParameterController m_functionParameterController; FunctionParameterController * functionParameterController() override; + View * createView() override; Shared::IntervalParameterController m_intervalParameterController; DerivativeParameterController m_derivativeParameterController; }; diff --git a/apps/regression/calculation_controller.cpp b/apps/regression/calculation_controller.cpp index c779ebf07..100adc82c 100644 --- a/apps/regression/calculation_controller.cpp +++ b/apps/regression/calculation_controller.cpp @@ -14,18 +14,8 @@ namespace Regression { CalculationController::CalculationController(Responder * parentResponder, ButtonRowController * header, Store * store) : TabTableController(parentResponder, this, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin, this, true), ButtonRowDelegate(header, nullptr), - m_titleCells{EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), - EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small)}, - m_r2TitleCell(1.0f, 0.5f), - m_columnTitleCell(EvenOddDoubleBufferTextCell(&m_selectableTableView)), - m_calculationCells{EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small)}, m_store(store) { - for (int k = 0; k < k_maxNumberOfDisplayableRows/2; k++) { - m_calculationCells[k].setTextColor(Palette::GreyDark); - m_doubleCalculationCells[k].setTextColor(Palette::GreyDark); - m_doubleCalculationCells[k].setParentResponder(&m_selectableTableView); - } m_r2Layout = new BaselineRelativeLayout(new StringLayout("r", 1, KDText::FontSize::Small), new StringLayout("2", 1, KDText::FontSize::Small), BaselineRelativeLayout::Type::Superscript); } @@ -42,7 +32,7 @@ const char * CalculationController::title() { bool CalculationController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::Up) { - m_selectableTableView.deselectTable(); + selectableTableView()->deselectTable(); app()->setFirstResponder(tabController()); return true; } @@ -50,10 +40,10 @@ bool CalculationController::handleEvent(Ion::Events::Event event) { } void CalculationController::didBecomeFirstResponder() { - if (m_selectableTableView.selectedRow() == -1) { - m_selectableTableView.selectCellAtLocation(1, 0); + if (selectableTableView()->selectedRow() == -1) { + selectableTableView()->selectCellAtLocation(1, 0); } else { - m_selectableTableView.selectCellAtLocation(m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow()); + selectableTableView()->selectCellAtLocation(selectableTableView()->selectedColumn(), selectableTableView()->selectedRow()); } TabTableController::didBecomeFirstResponder(); } @@ -67,7 +57,7 @@ void CalculationController::tableViewDidChangeSelection(SelectableTableView * t, * selected one. */ if (t->selectedRow() == 0 && t->selectedColumn() == 0) { if (previousSelectedCellX == 0 && previousSelectedCellY == 1) { - m_selectableTableView.deselectTable(); + selectableTableView()->deselectTable(); app()->setFirstResponder(tabController()); } else { t->selectCellAtLocation(previousSelectedCellX, previousSelectedCellY); @@ -118,7 +108,7 @@ int CalculationController::numberOfColumns() { void CalculationController::willDisplayCellAtLocation(HighlightCell * cell, int i, int j) { EvenOddCell * myCell = (EvenOddCell *)cell; myCell->setEven(j%2 == 0); - myCell->setHighlighted(i == m_selectableTableView.selectedColumn() && j == m_selectableTableView.selectedRow()); + myCell->setHighlighted(i == selectableTableView()->selectedColumn() && j == selectableTableView()->selectedRow()); if (j == 0 && i > 0) { EvenOddDoubleBufferTextCell * myCell = (EvenOddDoubleBufferTextCell *)cell; myCell->setFirstText("x"); @@ -177,22 +167,22 @@ KDCoordinate CalculationController::rowHeight(int j) { HighlightCell * CalculationController::reusableCell(int index, int type) { if (type == 0) { assert(index < k_maxNumberOfDisplayableRows); - return &m_titleCells[index]; + return m_titleCells[index]; } if (type == 1) { assert(index == 0); - return &m_r2TitleCell; + return m_r2TitleCell; } if (type == 2) { assert(index == 0); - return &m_columnTitleCell; + return m_columnTitleCell; } if (type == 3) { assert(index < k_totalNumberOfRows/2); - return &m_doubleCalculationCells[index]; + return m_doubleCalculationCells[index]; } assert(index < k_totalNumberOfRows/2); - return &m_calculationCells[index]; + return m_calculationCells[index]; } int CalculationController::reusableCellCount(int type) { @@ -227,8 +217,54 @@ 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); + 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; } + +} + diff --git a/apps/regression/calculation_controller.h b/apps/regression/calculation_controller.h index 17bed1b85..868e80b1c 100644 --- a/apps/regression/calculation_controller.h +++ b/apps/regression/calculation_controller.h @@ -31,19 +31,21 @@ 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; constexpr static int k_totalNumberOfRows = 11; constexpr static int k_totalNumberOfColumns = 2; constexpr static int k_maxNumberOfDisplayableRows = 10; static constexpr KDCoordinate k_cellHeight = 25; static constexpr KDCoordinate k_cellWidth = Ion::Display::Width/2 - Metric::CommonRightMargin/2 - Metric::CommonLeftMargin/2; - EvenOddMessageTextCell m_titleCells[k_maxNumberOfDisplayableRows]; - EvenOddExpressionCell m_r2TitleCell; + EvenOddMessageTextCell * m_titleCells[k_maxNumberOfDisplayableRows]; + EvenOddExpressionCell * m_r2TitleCell; Poincare::ExpressionLayout * m_r2Layout; - EvenOddDoubleBufferTextCell m_columnTitleCell; - EvenOddDoubleBufferTextCell m_doubleCalculationCells[k_maxNumberOfDisplayableRows/2]; - EvenOddBufferTextCell m_calculationCells[k_maxNumberOfDisplayableRows/2]; + EvenOddDoubleBufferTextCell * m_columnTitleCell; + EvenOddDoubleBufferTextCell * m_doubleCalculationCells[k_maxNumberOfDisplayableRows/2]; + EvenOddBufferTextCell * m_calculationCells[k_maxNumberOfDisplayableRows/2]; Store * m_store; }; diff --git a/apps/regression/store_controller.cpp b/apps/regression/store_controller.cpp index b61c92602..0d5492ae2 100644 --- a/apps/regression/store_controller.cpp +++ b/apps/regression/store_controller.cpp @@ -12,8 +12,7 @@ using namespace Shared; namespace Regression { StoreController::StoreController(Responder * parentResponder, Store * store, ButtonRowController * header) : - Shared::StoreController(parentResponder, store, header), - m_titleCells{EvenOddExpressionCell(0.5f, 0.5f), EvenOddExpressionCell(0.5f, 0.5f)} + Shared::StoreController(parentResponder, store, header) { m_titleLayout[0] = new BaselineRelativeLayout(new StringLayout("X", 1, KDText::FontSize::Small), new StringLayout("i", 1, KDText::FontSize::Small), BaselineRelativeLayout::Type::Subscript); m_titleLayout[1] = new BaselineRelativeLayout(new StringLayout("Y", 1, KDText::FontSize::Small), new StringLayout("i", 1, KDText::FontSize::Small), BaselineRelativeLayout::Type::Subscript); @@ -37,9 +36,26 @@ 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]; + return m_titleCells[index]; +} + +View * StoreController::createView() { + 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(); } } diff --git a/apps/regression/store_controller.h b/apps/regression/store_controller.h index 84db3cda1..e710eda84 100644 --- a/apps/regression/store_controller.h +++ b/apps/regression/store_controller.h @@ -12,9 +12,11 @@ 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; - EvenOddExpressionCell m_titleCells[k_numberOfTitleCells]; + View * createView() override; + EvenOddExpressionCell * m_titleCells[k_numberOfTitleCells]; Poincare::ExpressionLayout * m_titleLayout[2]; }; diff --git a/apps/sequence/values/values_controller.cpp b/apps/sequence/values/values_controller.cpp index 6ed70619d..fadcda94d 100644 --- a/apps/sequence/values/values_controller.cpp +++ b/apps/sequence/values/values_controller.cpp @@ -7,8 +7,6 @@ namespace Sequence { ValuesController::ValuesController(Responder * parentResponder, SequenceStore * sequenceStore, ButtonRowController * header) : Shared::ValuesController(parentResponder, header, I18n::Message::NColumn, &m_intervalParameterController), - m_sequenceTitleCells{SequenceTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator), SequenceTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator), - SequenceTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator)}, m_sequenceStore(sequenceStore), m_sequenceParameterController(Shared::ValuesFunctionParameterController('n')), m_intervalParameterController(IntervalParameterController(this, &m_interval)) @@ -47,6 +45,20 @@ 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; @@ -64,12 +76,12 @@ int ValuesController::maxNumberOfFunctions() { SequenceTitleCell * ValuesController::functionTitleCells(int j) { assert(j >= 0 && j < k_maxNumberOfSequences); - return &m_sequenceTitleCells[j]; + return m_sequenceTitleCells[j]; } EvenOddBufferTextCell * ValuesController::floatCells(int j) { assert(j >= 0 && j < k_maxNumberOfCells); - return &m_floatCells[j]; + return m_floatCells[j]; } SequenceStore * ValuesController::functionStore() const { @@ -80,4 +92,16 @@ Shared::ValuesFunctionParameterController * ValuesController::functionParameterC return &m_sequenceParameterController; } +View * ValuesController::createView() { + 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(); +} + } diff --git a/apps/sequence/values/values_controller.h b/apps/sequence/values/values_controller.h index 5ef30e5af..37c6893e9 100644 --- a/apps/sequence/values/values_controller.h +++ b/apps/sequence/values/values_controller.h @@ -15,18 +15,20 @@ 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; int maxNumberOfFunctions() override; constexpr static int k_maxNumberOfCells = 30; constexpr static int k_maxNumberOfSequences = 3; - SequenceTitleCell m_sequenceTitleCells[k_maxNumberOfSequences]; + SequenceTitleCell * m_sequenceTitleCells[k_maxNumberOfSequences]; SequenceTitleCell * functionTitleCells(int j) override; - EvenOddBufferTextCell m_floatCells[k_maxNumberOfCells]; + EvenOddBufferTextCell * m_floatCells[k_maxNumberOfCells]; EvenOddBufferTextCell * floatCells(int j) override; SequenceStore * m_sequenceStore; SequenceStore * functionStore() const override; + View * createView() override; Shared::ValuesFunctionParameterController m_sequenceParameterController; Shared::ValuesFunctionParameterController * functionParameterController() override; IntervalParameterController m_intervalParameterController; diff --git a/apps/shared/editable_cell_table_view_controller.cpp b/apps/shared/editable_cell_table_view_controller.cpp index 98243a590..a5f92145a 100644 --- a/apps/shared/editable_cell_table_view_controller.cpp +++ b/apps/shared/editable_cell_table_view_controller.cpp @@ -22,12 +22,12 @@ bool EditableCellTableViewController::textFieldDidFinishEditing(TextField * text app()->displayWarning(I18n::Message::UndefinedValue); return false; } - if (!setDataAtLocation(floatBody, m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow())) { + if (!setDataAtLocation(floatBody, selectableTableView()->selectedColumn(), selectableTableView()->selectedRow())) { app()->displayWarning(I18n::Message::ForbiddenValue); return false; } - m_selectableTableView.reloadData(); - m_selectableTableView.selectCellAtLocation(m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow()+1); + selectableTableView()->reloadData(); + selectableTableView()->selectCellAtLocation(selectableTableView()->selectedColumn(), selectableTableView()->selectedRow()+1); return true; } @@ -86,26 +86,26 @@ void EditableCellTableViewController::willDisplayCellAtLocationWithDisplayMode(H } void EditableCellTableViewController::didBecomeFirstResponder() { - if (m_selectableTableView.selectedRow() >= 0) { - int selectedRow = m_selectableTableView.selectedRow(); + if (selectableTableView()->selectedRow() >= 0) { + int selectedRow = selectableTableView()->selectedRow(); selectedRow = selectedRow >= numberOfRows() ? numberOfRows()-1 : selectedRow; - int selectedColumn = m_selectableTableView.selectedColumn(); + int selectedColumn = selectableTableView()->selectedColumn(); selectedColumn = selectedColumn >= numberOfColumns() ? numberOfColumns() - 1 : selectedColumn; - m_selectableTableView.selectCellAtLocation(selectedColumn, selectedRow); + selectableTableView()->selectCellAtLocation(selectedColumn, selectedRow); TabTableController::didBecomeFirstResponder(); } } void EditableCellTableViewController::viewWillAppear() { TabTableController::viewWillAppear(); - if (m_selectableTableView.selectedRow() == -1) { - m_selectableTableView.selectCellAtLocation(0, 1); + if (selectableTableView()->selectedRow() == -1) { + selectableTableView()->selectCellAtLocation(0, 1); } else { - int selectedRow = m_selectableTableView.selectedRow(); + int selectedRow = selectableTableView()->selectedRow(); selectedRow = selectedRow >= numberOfRows() ? numberOfRows()-1 : selectedRow; - int selectedColumn = m_selectableTableView.selectedColumn(); + int selectedColumn = selectableTableView()->selectedColumn(); selectedColumn = selectedColumn >= numberOfColumns() ? numberOfColumns() - 1 : selectedColumn; - m_selectableTableView.selectCellAtLocation(selectedColumn, selectedRow); + selectableTableView()->selectCellAtLocation(selectedColumn, selectedRow); } } diff --git a/apps/shared/store_controller.cpp b/apps/shared/store_controller.cpp index 692b9de74..f22c9825b 100644 --- a/apps/shared/store_controller.cpp +++ b/apps/shared/store_controller.cpp @@ -10,11 +10,6 @@ namespace Shared { StoreController::StoreController(Responder * parentResponder, FloatPairStore * store, ButtonRowController * header) : EditableCellTableViewController(parentResponder, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin), ButtonRowDelegate(header, nullptr), - m_editableCells{EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), - EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), - EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), - EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), - EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer)}, m_store(store), m_storeParameterController(this, store) { @@ -48,7 +43,7 @@ HighlightCell * StoreController::reusableCell(int index, int type) { return titleCells(index); case 1: assert(index < k_maxNumberOfEditableCells); - return &m_editableCells[index]; + return m_editableCells[index]; default: assert(false); return nullptr; @@ -71,36 +66,45 @@ void StoreController::willDisplayCellAtLocation(HighlightCell * cell, int i, int } void StoreController::didBecomeFirstResponder() { - if (m_selectableTableView.selectedRow() < 0) { - m_selectableTableView.selectCellAtLocation(0, 0); + if (selectableTableView()->selectedRow() < 0) { + selectableTableView()->selectCellAtLocation(0, 0); } EditableCellTableViewController::didBecomeFirstResponder(); } bool StoreController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::Up) { - m_selectableTableView.deselectTable(); - assert(m_selectableTableView.selectedRow() == -1); + selectableTableView()->deselectTable(); + assert(selectableTableView()->selectedRow() == -1); app()->setFirstResponder(tabController()); return true; } - if (event == Ion::Events::OK && m_selectableTableView.selectedRow() == 0) { - m_storeParameterController.selectXColumn(m_selectableTableView.selectedColumn() == 0); + if (event == Ion::Events::OK && selectableTableView()->selectedRow() == 0) { + m_storeParameterController.selectXColumn(selectableTableView()->selectedColumn() == 0); StackViewController * stack = ((StackViewController *)parentResponder()->parentResponder()); stack->push(&m_storeParameterController); return true; } if (event == Ion::Events::Backspace) { - if (m_selectableTableView.selectedRow() == 0 || m_selectableTableView.selectedRow() == numberOfRows()-1) { + if (selectableTableView()->selectedRow() == 0 || selectableTableView()->selectedRow() == numberOfRows()-1) { return false; } - m_store->deletePairAtIndex(m_selectableTableView.selectedRow()-1); - m_selectableTableView.reloadData(); + m_store->deletePairAtIndex(selectableTableView()->selectedRow()-1); + selectableTableView()->reloadData(); return true; } 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()); } @@ -129,4 +133,13 @@ int StoreController::maxNumberOfElements() const { return FloatPairStore::k_maxNumberOfPairs; } +View * StoreController::createView() { + SelectableTableView * tableView = (SelectableTableView*)EditableCellTableViewController::createView(); + for (int i = 0; i < k_maxNumberOfEditableCells; i++) { + assert(m_editableCells[i] == nullptr); + m_editableCells[i] = new EvenOddEditableTextCell(tableView, this, m_draftTextBuffer); + } + return tableView; +} + } diff --git a/apps/shared/store_controller.h b/apps/shared/store_controller.h index 57849ec67..6ad29f106 100644 --- a/apps/shared/store_controller.h +++ b/apps/shared/store_controller.h @@ -22,11 +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; bool cellAtLocationIsEditable(int columnIndex, int rowIndex) override; bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override; float dataAtLocation(int columnIndex, int rowIndex) override; @@ -34,7 +36,7 @@ protected: int maxNumberOfElements() const override; virtual HighlightCell * titleCells(int index) = 0; char m_draftTextBuffer[TextField::maxBufferSize()]; - EvenOddEditableTextCell m_editableCells[k_maxNumberOfEditableCells]; + EvenOddEditableTextCell * m_editableCells[k_maxNumberOfEditableCells]; FloatPairStore * m_store; StoreParameterController m_storeParameterController; }; diff --git a/apps/shared/tab_table_controller.cpp b/apps/shared/tab_table_controller.cpp index 2a7ad77e4..546df5afe 100644 --- a/apps/shared/tab_table_controller.cpp +++ b/apps/shared/tab_table_controller.cpp @@ -4,30 +4,40 @@ namespace Shared { TabTableController::TabTableController(Responder * parentResponder, TableViewDataSource * dataSource, KDCoordinate topMargin, KDCoordinate rightMargin, KDCoordinate bottomMargin, KDCoordinate leftMargin, SelectableTableViewDelegate * delegate, bool showIndicators) : - ViewController(parentResponder), - m_selectableTableView(SelectableTableView(this, dataSource, 0, 0, topMargin, rightMargin, bottomMargin, leftMargin, - delegate, showIndicators, true, Palette::WallScreenDark)) + DynamicViewController(parentResponder), + m_dataSource(dataSource), + m_topMargin(topMargin), + m_rightMargin(rightMargin), + m_bottomMargin(bottomMargin), + m_leftMargin(leftMargin), + m_delegate(delegate), + m_showIndicators(showIndicators) { } -View * TabTableController::view() { - return &m_selectableTableView; -} - void TabTableController::didBecomeFirstResponder() { - app()->setFirstResponder(&m_selectableTableView); + app()->setFirstResponder(selectableTableView()); } void TabTableController::viewWillAppear() { - m_selectableTableView.reloadData(); + selectableTableView()->reloadData(); } void TabTableController::willExitResponderChain(Responder * nextFirstResponder) { if (nextFirstResponder == tabController()) { - m_selectableTableView.deselectTable(); - m_selectableTableView.scrollToCell(0,0); + selectableTableView()->deselectTable(); + selectableTableView()->scrollToCell(0,0); } } +SelectableTableView * TabTableController::selectableTableView() { + return (SelectableTableView *)view(); +} + +View * TabTableController::createView() { + return new SelectableTableView(this, m_dataSource, 0, 0, m_topMargin, m_rightMargin, m_bottomMargin, m_leftMargin, m_delegate, m_showIndicators, true, Palette::WallScreenDark); +} + + } diff --git a/apps/shared/tab_table_controller.h b/apps/shared/tab_table_controller.h index 317c0bbdd..9193b9773 100644 --- a/apps/shared/tab_table_controller.h +++ b/apps/shared/tab_table_controller.h @@ -8,17 +8,25 @@ namespace Shared { /* Tab table controller is a controller whose view is a selectable table view * and whose one ancestor is a tab */ -class TabTableController : public ViewController { +class TabTableController : public DynamicViewController { public: TabTableController(Responder * parentResponder, TableViewDataSource * dataSource, KDCoordinate topMargin, KDCoordinate rightMargin, KDCoordinate bottomMargin, KDCoordinate leftMargin, SelectableTableViewDelegate * delegate, bool showIndicators); - virtual View * view() override; void didBecomeFirstResponder() override; void viewWillAppear() override; void willExitResponderChain(Responder * nextFirstResponder) override; protected: - SelectableTableView m_selectableTableView; + SelectableTableView * selectableTableView(); + View * createView() override; virtual Responder * tabController() const = 0; +private: + TableViewDataSource * m_dataSource; + KDCoordinate m_topMargin; + KDCoordinate m_rightMargin; + KDCoordinate m_bottomMargin; + KDCoordinate m_leftMargin; + SelectableTableViewDelegate * m_delegate; + bool m_showIndicators; }; } diff --git a/apps/shared/values_controller.cpp b/apps/shared/values_controller.cpp index 792e60216..926d0eb10 100644 --- a/apps/shared/values_controller.cpp +++ b/apps/shared/values_controller.cpp @@ -11,10 +11,6 @@ namespace Shared { ValuesController::ValuesController(Responder * parentResponder, ButtonRowController * header, I18n::Message parameterTitle, IntervalParameterController * intervalParameterController) : EditableCellTableViewController(parentResponder, k_topMargin, k_rightMargin, k_bottomMargin, k_leftMargin), ButtonRowDelegate(header, nullptr), - m_abscissaTitleCell(EvenOddMessageTextCell(KDText::FontSize::Small)), - m_abscissaCells{EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), - EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), - EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small)}, m_abscissaParameterController(ValuesParameterController(this, intervalParameterController, parameterTitle)), m_setIntervalButton(Button(this, I18n::Message::IntervalSet, Invocation([](void * context, void * sender) { ValuesController * valuesController = (ValuesController *) context; @@ -37,37 +33,37 @@ Interval * ValuesController::interval() { bool ValuesController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::Down) { - if (m_selectableTableView.selectedRow() == -1) { + if (selectableTableView()->selectedRow() == -1) { header()->setSelectedButton(-1); - m_selectableTableView.selectCellAtLocation(0,0); - app()->setFirstResponder(&m_selectableTableView); + selectableTableView()->selectCellAtLocation(0,0); + app()->setFirstResponder(selectableTableView()); return true; } return false; } if (event == Ion::Events::Up) { - if (m_selectableTableView.selectedRow() == -1) { + if (selectableTableView()->selectedRow() == -1) { header()->setSelectedButton(-1); app()->setFirstResponder(tabController()); return true; } - m_selectableTableView.deselectTable(); + selectableTableView()->deselectTable(); header()->setSelectedButton(0); return true; } - if (event == Ion::Events::Backspace && m_selectableTableView.selectedRow() > 0 && - (m_selectableTableView.selectedRow() < numberOfRows()-1 || m_interval.numberOfElements() == Interval::k_maxNumberOfElements)) { - m_interval.deleteElementAtIndex(m_selectableTableView.selectedRow()-1); - m_selectableTableView.reloadData(); + if (event == Ion::Events::Backspace && selectableTableView()->selectedRow() > 0 && + (selectableTableView()->selectedRow() < numberOfRows()-1 || m_interval.numberOfElements() == Interval::k_maxNumberOfElements)) { + m_interval.deleteElementAtIndex(selectableTableView()->selectedRow()-1); + selectableTableView()->reloadData(); return true; } if (event == Ion::Events::OK) { - if (m_selectableTableView.selectedRow() == -1) { + if (selectableTableView()->selectedRow() == -1) { return header()->handleEvent(event); } - if (m_selectableTableView.selectedRow() == 0) { - if (m_selectableTableView.selectedColumn() == 0) { + if (selectableTableView()->selectedRow() == 0) { + if (selectableTableView()->selectedColumn() == 0) { configureAbscissa(); return true; } @@ -76,7 +72,7 @@ bool ValuesController::handleEvent(Ion::Events::Event event) { } return false; } - if (m_selectableTableView.selectedRow() == -1) { + if (selectableTableView()->selectedRow() == -1) { return header()->handleEvent(event); } return false; @@ -84,8 +80,8 @@ bool ValuesController::handleEvent(Ion::Events::Event event) { void ValuesController::didBecomeFirstResponder() { EditableCellTableViewController::didBecomeFirstResponder(); - if (m_selectableTableView.selectedRow() == -1) { - m_selectableTableView.deselectTable(); + if (selectableTableView()->selectedRow() == -1) { + selectableTableView()->deselectTable(); header()->setSelectedButton(0); } else { header()->setSelectedButton(-1); @@ -94,8 +90,8 @@ void ValuesController::didBecomeFirstResponder() { void ValuesController::willExitResponderChain(Responder * nextFirstResponder) { if (nextFirstResponder == tabController()) { - m_selectableTableView.deselectTable(); - m_selectableTableView.scrollToCell(0,0); + selectableTableView()->deselectTable(); + selectableTableView()->scrollToCell(0,0); header()->setSelectedButton(-1); } } @@ -171,12 +167,12 @@ HighlightCell * ValuesController::reusableCell(int index, int type) { switch (type) { case 0: assert(index == 0); - return &m_abscissaTitleCell; + return m_abscissaTitleCell; case 1: return functionTitleCells(index); case 2: assert(index < k_maxNumberOfAbscissaCells); - return &m_abscissaCells[index]; + return m_abscissaCells[index]; case 3: return floatCells(index); default: @@ -230,6 +226,18 @@ void ValuesController::viewWillAppear() { 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(); +} + Function * ValuesController::functionAtColumn(int i) { assert(i > 0); return functionStore()->activeFunctionAtIndex(i-1); @@ -249,7 +257,7 @@ void ValuesController::configureAbscissa() { } void ValuesController::configureFunction() { - functionParameterController()->setFunction(functionAtColumn(m_selectableTableView.selectedColumn())); + functionParameterController()->setFunction(functionAtColumn(selectableTableView()->selectedColumn())); StackViewController * stack = stackController(); stack->push(functionParameterController()); } @@ -284,5 +292,16 @@ 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); + 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; +} + } diff --git a/apps/shared/values_controller.h b/apps/shared/values_controller.h index 380dabfab..f2533892b 100644 --- a/apps/shared/values_controller.h +++ b/apps/shared/values_controller.h @@ -34,6 +34,7 @@ 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; @@ -43,6 +44,7 @@ public: protected: StackViewController * stackController() const; bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override; + View * createView() override; Interval m_interval; private: virtual Function * functionAtColumn(int i); @@ -57,11 +59,11 @@ private: constexpr static int k_maxNumberOfAbscissaCells = 10; virtual int maxNumberOfCells() = 0; virtual int maxNumberOfFunctions() = 0; - EvenOddMessageTextCell m_abscissaTitleCell; + EvenOddMessageTextCell * m_abscissaTitleCell; virtual FunctionTitleCell * functionTitleCells(int j) = 0; virtual EvenOddBufferTextCell * floatCells(int j) = 0; char m_draftTextBuffer[TextField::maxBufferSize()]; - EvenOddEditableTextCell m_abscissaCells[k_maxNumberOfAbscissaCells]; + EvenOddEditableTextCell * m_abscissaCells[k_maxNumberOfAbscissaCells]; virtual FunctionStore * functionStore() const = 0; virtual ValuesFunctionParameterController * functionParameterController() = 0; ValuesParameterController m_abscissaParameterController; diff --git a/apps/statistics/calculation_controller.cpp b/apps/statistics/calculation_controller.cpp index abea8e13b..9965862ca 100644 --- a/apps/statistics/calculation_controller.cpp +++ b/apps/statistics/calculation_controller.cpp @@ -13,16 +13,8 @@ namespace Statistics { CalculationController::CalculationController(Responder * parentResponder, ButtonRowController * header, Store * store) : TabTableController(parentResponder, this, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin, nullptr, true), ButtonRowDelegate(header, nullptr), - m_titleCells{EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), - EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small)}, - m_calculationCells{EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), - EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small)}, m_store(store) { - for (int k = 0; k < k_maxNumberOfDisplayableRows; k++) { - m_titleCells[k].setAlignment(1.0f, 0.5f); - m_calculationCells[k].setTextColor(Palette::GreyDark); - } } const char * CalculationController::title() { @@ -31,7 +23,7 @@ const char * CalculationController::title() { bool CalculationController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::Up) { - m_selectableTableView.deselectTable(); + selectableTableView()->deselectTable(); app()->setFirstResponder(tabController()); return true; } @@ -39,10 +31,10 @@ bool CalculationController::handleEvent(Ion::Events::Event event) { } void CalculationController::didBecomeFirstResponder() { - if (m_selectableTableView.selectedRow() == -1) { - m_selectableTableView.selectCellAtLocation(0, 0); + if (selectableTableView()->selectedRow() == -1) { + selectableTableView()->selectCellAtLocation(0, 0); } else { - m_selectableTableView.selectCellAtLocation(m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow()); + selectableTableView()->selectCellAtLocation(selectableTableView()->selectedColumn(), selectableTableView()->selectedRow()); } TabTableController::didBecomeFirstResponder(); } @@ -73,7 +65,7 @@ int CalculationController::numberOfColumns() { void CalculationController::willDisplayCellAtLocation(HighlightCell * cell, int i, int j) { EvenOddCell * myCell = (EvenOddCell *)cell; myCell->setEven(j%2 == 0); - myCell->setHighlighted(i == m_selectableTableView.selectedColumn() && j == m_selectableTableView.selectedRow()); + myCell->setHighlighted(i == selectableTableView()->selectedColumn() && j == selectableTableView()->selectedRow()); if (i == 0) { I18n::Message titles[k_totalNumberOfRows] = {I18n::Message::TotalSize, I18n::Message::Minimum, I18n::Message::Maximum, I18n::Message::Range, I18n::Message::Mean, I18n::Message::StandardDeviation, I18n::Message::Deviation, I18n::Message::FirstQuartile, I18n::Message::ThirdQuartile, I18n::Message::Median, I18n::Message::InterquartileRange, I18n::Message::Sum, I18n::Message::SquareSum}; EvenOddMessageTextCell * myCell = (EvenOddMessageTextCell *)cell; @@ -101,9 +93,9 @@ KDCoordinate CalculationController::rowHeight(int j) { HighlightCell * CalculationController::reusableCell(int index, int type) { assert(index < k_totalNumberOfRows); if (type == 0) { - return &m_titleCells[index]; + return m_titleCells[index]; } - return &m_calculationCells[index]; + return m_calculationCells[index]; } int CalculationController::reusableCellCount(int type) { @@ -114,8 +106,33 @@ 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() { + 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(); } + +} + diff --git a/apps/statistics/calculation_controller.h b/apps/statistics/calculation_controller.h index 1fbbdc8d9..a9bd1cd3c 100644 --- a/apps/statistics/calculation_controller.h +++ b/apps/statistics/calculation_controller.h @@ -29,14 +29,16 @@ 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; constexpr static int k_totalNumberOfRows = 13; constexpr static int k_maxNumberOfDisplayableRows = 11; static constexpr KDCoordinate k_cellHeight = 20; static constexpr KDCoordinate k_cellWidth = Ion::Display::Width/2 - Metric::CommonRightMargin/2 - Metric::CommonLeftMargin/2; - EvenOddMessageTextCell m_titleCells[k_maxNumberOfDisplayableRows]; - EvenOddBufferTextCell m_calculationCells[k_maxNumberOfDisplayableRows]; + EvenOddMessageTextCell * m_titleCells[k_maxNumberOfDisplayableRows]; + EvenOddBufferTextCell * m_calculationCells[k_maxNumberOfDisplayableRows]; Store * m_store; }; diff --git a/apps/statistics/store_controller.cpp b/apps/statistics/store_controller.cpp index 271290e67..0755eac6b 100644 --- a/apps/statistics/store_controller.cpp +++ b/apps/statistics/store_controller.cpp @@ -9,8 +9,7 @@ using namespace Shared; namespace Statistics { StoreController::StoreController(Responder * parentResponder, Store * store, ButtonRowController * header) : - Shared::StoreController(parentResponder, store, header), - m_titleCells{EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small)} + Shared::StoreController(parentResponder, store, header) { } @@ -27,9 +26,18 @@ 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]; + return m_titleCells[index]; } bool StoreController::setDataAtLocation(float floatBody, int columnIndex, int rowIndex) { @@ -43,4 +51,12 @@ bool StoreController::setDataAtLocation(float floatBody, int columnIndex, int ro return Shared::StoreController::setDataAtLocation(floatBody, columnIndex, rowIndex); } +View * StoreController::createView() { + 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(); +} + } diff --git a/apps/statistics/store_controller.h b/apps/statistics/store_controller.h index 5ecaaf5fa..af53c3565 100644 --- a/apps/statistics/store_controller.h +++ b/apps/statistics/store_controller.h @@ -11,10 +11,12 @@ 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; - EvenOddMessageTextCell m_titleCells[k_numberOfTitleCells]; + View * createView() override; + EvenOddMessageTextCell * m_titleCells[k_numberOfTitleCells]; }; }