diff --git a/apps/probability/parameters_controller.cpp b/apps/probability/parameters_controller.cpp index 438f63988..2e0d627c0 100644 --- a/apps/probability/parameters_controller.cpp +++ b/apps/probability/parameters_controller.cpp @@ -68,19 +68,12 @@ void ParametersController::ContentView::layoutSubviews() { /* Parameters Controller */ ParametersController::ParametersController(Responder * parentResponder) : - FloatParameterController(parentResponder, I18n::Message::Next), - m_menuListCell{MessageTableCellWithEditableText(&m_selectableTableView, this, m_draftTextBuffer), - MessageTableCellWithEditableText(&m_selectableTableView, this, m_draftTextBuffer)}, - m_contentView(ContentView(this, &m_selectableTableView)), + FloatParameterController(parentResponder), m_law(nullptr), m_calculationController(CalculationController(nullptr)) { } -View * ParametersController::view() { - return &m_contentView; -} - const char * ParametersController::title() { if (m_law != nullptr) { return I18n::translate(m_law->title()); @@ -90,18 +83,15 @@ const char * ParametersController::title() { void ParametersController::setLaw(Law * law) { m_law = law; - if (m_law != nullptr) { - m_contentView.setNumberOfParameters(m_law->numberOfParameter()); - } m_calculationController.setLaw(law); } void ParametersController::viewWillAppear() { for (int i = 0; i < m_law->numberOfParameter(); i++) { m_previousParameters[i] = parameterAtIndex(i); - m_contentView.parameterDefinitionAtIndex(i)->setMessage(m_law->parameterDefinitionAtIndex(i)); + contentView()->parameterDefinitionAtIndex(i)->setMessage(m_law->parameterDefinitionAtIndex(i)); } - m_contentView.layoutSubviews(); + contentView()->layoutSubviews(); FloatParameterController::viewWillAppear(); } @@ -111,7 +101,7 @@ int ParametersController::numberOfRows() { void ParametersController::willDisplayCellForIndex(HighlightCell * cell, int index) { if (index == numberOfRows()-1) { - if (m_selectableTableView.selectedRow() != numberOfRows()-1) { + if (m_selectableTableView->selectedRow() != numberOfRows()-1) { cell->setHighlighted(false); } return; @@ -124,13 +114,25 @@ void ParametersController::willDisplayCellForIndex(HighlightCell * cell, int ind HighlightCell * ParametersController::reusableParameterCell(int index, int type) { assert(index >= 0); assert(index < 2); - return &m_menuListCell[index]; + return m_menuListCell[index]; } 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::previousParameterAtIndex(int index) { assert(index >= 0); assert(index < 2); @@ -152,7 +154,7 @@ bool ParametersController::setParameterAtIndex(int parameterIndex, float f) { bool ParametersController::textFieldDidFinishEditing(TextField * textField, const char * text) { if (FloatParameterController::textFieldDidFinishEditing(textField, text)) { - m_selectableTableView.reloadData(); + m_selectableTableView->reloadData(); return true; } return false; @@ -166,5 +168,31 @@ void ParametersController::buttonAction() { stack->push(&m_calculationController, KDColorWhite, Palette::SubTab, Palette::SubTab); } +I18n::Message ParametersController::okButtonText() { + return I18n::Message::Next; +} + +View * ParametersController::createView() { + assert(m_selectableTableView == nullptr); + m_selectableTableView = (SelectableTableView *)FloatParameterController::createView(); + 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); + if (m_law != nullptr) { + contentView->setNumberOfParameters(m_law->numberOfParameter()); + } + return contentView; +} + +SelectableTableView * ParametersController::selectableTableView() { + return m_selectableTableView; +} + +ParametersController::ContentView * ParametersController::contentView() { + return (ContentView *)view(); +} + } diff --git a/apps/probability/parameters_controller.h b/apps/probability/parameters_controller.h index c718625de..b50cdc393 100644 --- a/apps/probability/parameters_controller.h +++ b/apps/probability/parameters_controller.h @@ -11,12 +11,12 @@ namespace Probability { class ParametersController : public Shared::FloatParameterController { public: ParametersController(Responder * parentResponder); - View * view() override; const char * title() override; void setLaw(Law * law); 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,6 +25,8 @@ private: float parameterAtIndex(int index) override; bool setParameterAtIndex(int parameterIndex, float f) override; bool textFieldDidFinishEditing(TextField * textField, const char * text) override; + I18n::Message okButtonText() override; + View * createView() override; class ContentView : public View { public: ContentView(Responder * parentResponder, SelectableTableView * selectableTableView); @@ -43,11 +45,13 @@ private: MessageTextView m_secondParameterDefinition; SelectableTableView * m_selectableTableView; }; + SelectableTableView * selectableTableView() override; + ContentView * contentView(); + SelectableTableView * m_selectableTableView; constexpr static int k_maxNumberOfCells = 2; char m_draftTextBuffer[MessageTableCellWithEditableText::k_bufferLength]; - MessageTableCellWithEditableText m_menuListCell[k_maxNumberOfCells]; + MessageTableCellWithEditableText * m_menuListCell[k_maxNumberOfCells]; float m_previousParameters[k_maxNumberOfCells]; - ContentView m_contentView; Law * m_law; CalculationController m_calculationController; }; diff --git a/apps/shared/float_parameter_controller.cpp b/apps/shared/float_parameter_controller.cpp index e9614bb92..1ad3c3d05 100644 --- a/apps/shared/float_parameter_controller.cpp +++ b/apps/shared/float_parameter_controller.cpp @@ -8,49 +8,39 @@ using namespace Poincare; namespace Shared { -FloatParameterController::FloatParameterController(Responder * parentResponder, I18n::Message okButtonText) : - ViewController(parentResponder), - m_selectableTableView(SelectableTableView(this, this, 0, 1, Metric::CommonTopMargin, Metric::CommonRightMargin, - Metric::CommonBottomMargin, Metric::CommonLeftMargin, this)), - m_okButton(ButtonWithSeparator(&m_selectableTableView, okButtonText, Invocation([](void * context, void * sender) { - FloatParameterController * parameterController = (FloatParameterController *) context; - parameterController->buttonAction(); - }, this))) +FloatParameterController::FloatParameterController(Responder * parentResponder) : + DynamicViewController(parentResponder) { } -View * FloatParameterController::view() { - return &m_selectableTableView; -} - void FloatParameterController::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); } - app()->setFirstResponder(&m_selectableTableView); + app()->setFirstResponder(selectableTableView()); } void FloatParameterController::viewWillAppear() { - m_selectableTableView.reloadData(); - if (m_selectableTableView.selectedRow() == -1) { - m_selectableTableView.selectCellAtLocation(0, 0); + selectableTableView()->reloadData(); + if (selectableTableView()->selectedRow() == -1) { + selectableTableView()->selectCellAtLocation(0, 0); } 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); } } void FloatParameterController::willExitResponderChain(Responder * nextFirstResponder) { if (parentResponder() == nullptr) { - m_selectableTableView.deselectTable(); - m_selectableTableView.scrollToCell(0,0); + selectableTableView()->deselectTable(); + selectableTableView()->scrollToCell(0,0); } } @@ -83,7 +73,7 @@ int FloatParameterController::reusableCellCount(int type) { HighlightCell * FloatParameterController::reusableCell(int index, int type) { if (type == 0) { - return &m_okButton; + return m_okButton; } return reusableParameterCell(index, type); } @@ -130,13 +120,13 @@ bool FloatParameterController::textFieldDidFinishEditing(TextField * textField, app()->displayWarning(I18n::Message::UndefinedValue); return false; } - if (!setParameterAtIndex(m_selectableTableView.selectedRow(), floatBody)) { + if (!setParameterAtIndex(selectableTableView()->selectedRow(), floatBody)) { return false; } - willDisplayCellForIndex(m_selectableTableView.cellAtLocation(m_selectableTableView.selectedColumn(), - m_selectableTableView.selectedRow()), activeCell()); - m_selectableTableView.reloadData(); - m_selectableTableView.selectCellAtLocation(m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow()+1); + willDisplayCellForIndex(selectableTableView()->cellAtLocation(selectableTableView()->selectedColumn(), + selectableTableView()->selectedRow()), activeCell()); + selectableTableView()->reloadData(); + selectableTableView()->selectCellAtLocation(selectableTableView()->selectedColumn(), selectableTableView()->selectedRow()+1); return true; } @@ -164,16 +154,41 @@ TextFieldDelegateApp * FloatParameterController::textFieldDelegateApp() { } int FloatParameterController::activeCell() { - return m_selectableTableView.selectedRow(); + return selectableTableView()->selectedRow(); +} + +void FloatParameterController::unloadView() { + assert(m_okButton != nullptr); + delete m_okButton; + m_okButton = nullptr; + DynamicViewController::unloadView(); } StackViewController * FloatParameterController::stackController() { return (StackViewController *)parentResponder(); } +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(); } +I18n::Message FloatParameterController::okButtonText() { + return I18n::Message::Ok; +} + } diff --git a/apps/shared/float_parameter_controller.h b/apps/shared/float_parameter_controller.h index 89ba2f6c8..f8788b8e4 100644 --- a/apps/shared/float_parameter_controller.h +++ b/apps/shared/float_parameter_controller.h @@ -10,10 +10,9 @@ namespace Shared { /* This controller edits float parameter of any model (given through * parameterAtIndex and setParameterAtIndex). */ -class FloatParameterController : public ViewController, public ListViewDataSource, public SelectableTableViewDelegate, public TextFieldDelegate { +class FloatParameterController : public DynamicViewController, public ListViewDataSource, public SelectableTableViewDelegate, public TextFieldDelegate { public: - FloatParameterController(Responder * parentResponder, I18n::Message okButtonText = I18n::Message::Ok); - View * view() override; + FloatParameterController(Responder * parentResponder); void didBecomeFirstResponder() override; void viewWillAppear() override; void willExitResponderChain(Responder * nextFirstResponder) override; @@ -29,20 +28,23 @@ public: bool textFieldDidFinishEditing(TextField * textField, const char * text) override; void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) override; + void unloadView() override; protected: int activeCell(); StackViewController * stackController(); virtual float parameterAtIndex(int index) = 0; - SelectableTableView m_selectableTableView; + virtual SelectableTableView * selectableTableView(); + View * createView() override; private: constexpr static int k_buttonMargin = 6; virtual void buttonAction(); + virtual I18n::Message okButtonText(); virtual int reusableParameterCellCount(int type) = 0; virtual HighlightCell * reusableParameterCell(int index, int type) = 0; TextFieldDelegateApp * textFieldDelegateApp() override; virtual float previousParameterAtIndex(int index) = 0; virtual bool setParameterAtIndex(int parameterIndex, float f) = 0; - ButtonWithSeparator m_okButton; + ButtonWithSeparator * m_okButton; }; } diff --git a/apps/shared/go_to_parameter_controller.cpp b/apps/shared/go_to_parameter_controller.cpp index b6183e986..5aa009e4f 100644 --- a/apps/shared/go_to_parameter_controller.cpp +++ b/apps/shared/go_to_parameter_controller.cpp @@ -7,8 +7,8 @@ namespace Shared { GoToParameterController::GoToParameterController(Responder * parentResponder, InteractiveCurveViewRange * graphRange, CurveViewCursor * cursor, I18n::Message symbol) : FloatParameterController(parentResponder), m_cursor(cursor), - m_abscisseCell(MessageTableCellWithEditableText(&m_selectableTableView, this, m_draftTextBuffer, symbol)), - m_graphRange(graphRange) + m_graphRange(graphRange), + m_abscissaSymbol(symbol) { } @@ -21,6 +21,13 @@ int GoToParameterController::numberOfRows() { return 2; } +void GoToParameterController::unloadView() { + assert(m_abscisseCell != nullptr); + delete m_abscisseCell; + m_abscisseCell = nullptr; + FloatParameterController::unloadView(); +} + float GoToParameterController::previousParameterAtIndex(int index) { assert(index == 0); return m_previousParameter; @@ -28,7 +35,7 @@ float GoToParameterController::previousParameterAtIndex(int index) { HighlightCell * GoToParameterController::reusableParameterCell(int index, int type) { assert(index == 0); - return &m_abscisseCell; + return m_abscisseCell; } int GoToParameterController::reusableParameterCellCount(int type) { @@ -43,4 +50,11 @@ void GoToParameterController::buttonAction() { stack->pop(); } +View * GoToParameterController::createView() { + SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::createView(); + assert(m_abscisseCell == nullptr); + m_abscisseCell = new MessageTableCellWithEditableText(tableView, this, m_draftTextBuffer, m_abscissaSymbol); + return tableView; +} + } diff --git a/apps/shared/go_to_parameter_controller.h b/apps/shared/go_to_parameter_controller.h index 3f9bc937e..9ed7067ad 100644 --- a/apps/shared/go_to_parameter_controller.h +++ b/apps/shared/go_to_parameter_controller.h @@ -13,6 +13,7 @@ public: GoToParameterController(Responder * parentResponder, InteractiveCurveViewRange * graphRange, CurveViewCursor * cursor, I18n::Message symbol); void viewWillAppear() override; int numberOfRows() override; + void unloadView() override; protected: constexpr static float k_maxDisplayableFloat = 1E8f; CurveViewCursor * m_cursor; @@ -21,10 +22,12 @@ private: HighlightCell * reusableParameterCell(int index, int type) override; int reusableParameterCellCount(int type) override; float previousParameterAtIndex(int index) override; + View * createView() override; char m_draftTextBuffer[MessageTableCellWithEditableText::k_bufferLength]; - MessageTableCellWithEditableText m_abscisseCell; + MessageTableCellWithEditableText * m_abscisseCell; float m_previousParameter; InteractiveCurveViewRange * m_graphRange; + I18n::Message m_abscissaSymbol; }; } diff --git a/apps/shared/interval_parameter_controller.cpp b/apps/shared/interval_parameter_controller.cpp index 57a0154d6..e9a4da662 100644 --- a/apps/shared/interval_parameter_controller.cpp +++ b/apps/shared/interval_parameter_controller.cpp @@ -5,8 +5,7 @@ namespace Shared { IntervalParameterController::IntervalParameterController(Responder * parentResponder, Interval * interval) : FloatParameterController(parentResponder), - m_interval(interval), - m_intervalCells{MessageTableCellWithEditableText(&m_selectableTableView, this, m_draftTextBuffer, I18n::Message::Default), MessageTableCellWithEditableText(&m_selectableTableView, this, m_draftTextBuffer, I18n::Message::Default), MessageTableCellWithEditableText(&m_selectableTableView, this, m_draftTextBuffer, I18n::Message::Default)} + m_interval(interval) { } @@ -39,6 +38,15 @@ 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::previousParameterAtIndex(int index) { assert(index >= 0 && index < k_totalNumberOfCell); return m_previousParameters[index]; @@ -72,11 +80,20 @@ bool IntervalParameterController::setParameterAtIndex(int parameterIndex, float HighlightCell * IntervalParameterController::reusableParameterCell(int index, int type) { assert(index >= 0); assert(index < k_totalNumberOfCell); - return &m_intervalCells[index]; + return m_intervalCells[index]; } int IntervalParameterController::reusableParameterCellCount(int type) { return k_totalNumberOfCell; } +View * IntervalParameterController::createView() { + SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::createView(); + 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; +} + } diff --git a/apps/shared/interval_parameter_controller.h b/apps/shared/interval_parameter_controller.h index a4ab709b3..1ca4d900a 100644 --- a/apps/shared/interval_parameter_controller.h +++ b/apps/shared/interval_parameter_controller.h @@ -15,6 +15,7 @@ public: void viewWillAppear() 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; @@ -24,8 +25,9 @@ private: int reusableParameterCellCount(int type) override; float previousParameterAtIndex(int index) override; float parameterAtIndex(int index) override; + View * createView() override; char m_draftTextBuffer[MessageTableCellWithEditableText::k_bufferLength]; - MessageTableCellWithEditableText m_intervalCells[k_totalNumberOfCell]; + MessageTableCellWithEditableText * m_intervalCells[k_totalNumberOfCell]; float m_previousParameters[k_totalNumberOfCell]; }; diff --git a/apps/shared/range_parameter_controller.cpp b/apps/shared/range_parameter_controller.cpp index 255632787..bbde23380 100644 --- a/apps/shared/range_parameter_controller.cpp +++ b/apps/shared/range_parameter_controller.cpp @@ -9,10 +9,7 @@ namespace Shared { RangeParameterController::RangeParameterController(Responder * parentResponder, InteractiveCurveViewRange * interactiveRange) : FloatParameterController(parentResponder), - m_interactiveRange(interactiveRange), - m_rangeCells{MessageTableCellWithEditableText(&m_selectableTableView, this, m_draftTextBuffer, I18n::Message::Default), MessageTableCellWithEditableText(&m_selectableTableView, this, m_draftTextBuffer, I18n::Message::Default), - MessageTableCellWithEditableText(&m_selectableTableView, this, m_draftTextBuffer, I18n::Message::Default), MessageTableCellWithEditableText(&m_selectableTableView, this, m_draftTextBuffer, I18n::Message::Default)}, - m_yAutoCell(MessageTableCellWithSwitch(I18n::Message::YAuto)) + m_interactiveRange(interactiveRange) { } @@ -48,7 +45,7 @@ void RangeParameterController::willDisplayCellForIndex(HighlightCell * cell, int return; } if (index == 2) { - SwitchView * switchView = (SwitchView *)m_yAutoCell.accessoryView(); + SwitchView * switchView = (SwitchView *)m_yAutoCell->accessoryView(); switchView->setState(m_interactiveRange->yAuto()); return; } @@ -63,7 +60,7 @@ void RangeParameterController::willDisplayCellForIndex(HighlightCell * cell, int bool RangeParameterController::textFieldDidFinishEditing(TextField * textField, const char * text) { if (FloatParameterController::textFieldDidFinishEditing(textField, text)) { - m_selectableTableView.reloadData(); + selectableTableView()->reloadData(); return true; } return false; @@ -96,7 +93,7 @@ void RangeParameterController::tableViewDidChangeSelection(SelectableTableView * bool RangeParameterController::handleEvent(Ion::Events::Event event) { if (activeCell() == 2 && event == Ion::Events::OK) { m_interactiveRange->setYAuto(!m_interactiveRange->yAuto()); - m_selectableTableView.reloadData(); + selectableTableView()->reloadData(); return true; } if (event == Ion::Events::Back) { @@ -127,11 +124,11 @@ bool RangeParameterController::setParameterAtIndex(int parameterIndex, float f) HighlightCell * RangeParameterController::reusableParameterCell(int index, int type) { if (type == 2) { - return &m_yAutoCell; + return m_yAutoCell; } assert(index >= 0); assert(index < k_numberOfTextCell); - return &m_rangeCells[index]; + return m_rangeCells[index]; } int RangeParameterController::reusableParameterCellCount(int type) { @@ -141,4 +138,28 @@ 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); + 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; +} + +} + diff --git a/apps/shared/range_parameter_controller.h b/apps/shared/range_parameter_controller.h index 5b717928a..1bb94293d 100644 --- a/apps/shared/range_parameter_controller.h +++ b/apps/shared/range_parameter_controller.h @@ -18,17 +18,19 @@ public: bool textFieldDidFinishEditing(TextField * textField, const char * text) 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 previousParameterAtIndex(int index) override; float parameterAtIndex(int index) override; bool setParameterAtIndex(int parameterIndex, float f) override; + View * createView() override; constexpr static int k_numberOfTextCell = 4; InteractiveCurveViewRange * m_interactiveRange; char m_draftTextBuffer[MessageTableCellWithEditableText::k_bufferLength]; - MessageTableCellWithEditableText m_rangeCells[k_numberOfTextCell]; - MessageTableCellWithSwitch m_yAutoCell; + MessageTableCellWithEditableText * m_rangeCells[k_numberOfTextCell]; + MessageTableCellWithSwitch * m_yAutoCell; float m_previousParameters[k_numberOfTextCell]; bool m_previousSwitchState; }; diff --git a/apps/statistics/histogram_parameter_controller.cpp b/apps/statistics/histogram_parameter_controller.cpp index 535cc4394..3f8b5acb7 100644 --- a/apps/statistics/histogram_parameter_controller.cpp +++ b/apps/statistics/histogram_parameter_controller.cpp @@ -8,7 +8,6 @@ namespace Statistics { HistogramParameterController::HistogramParameterController(Responder * parentResponder, Store * store) : FloatParameterController(parentResponder), - m_cells{MessageTableCellWithEditableText(&m_selectableTableView, this, m_draftTextBuffer, I18n::Message::Default), MessageTableCellWithEditableText(&m_selectableTableView, this, m_draftTextBuffer, I18n::Message::Default)}, m_store(store) { } @@ -18,14 +17,14 @@ const char * HistogramParameterController::title() { } void HistogramParameterController::viewWillAppear() { - for (int i = 0; i < 2; i++) { + for (int i = 0; i < k_numberOfCells; i++) { m_previousParameters[i] = parameterAtIndex(i); } FloatParameterController::viewWillAppear(); } int HistogramParameterController::numberOfRows() { - return 1+2; + return 1+k_numberOfCells; } void HistogramParameterController::willDisplayCellForIndex(HighlightCell * cell, int index) { @@ -33,13 +32,22 @@ void HistogramParameterController::willDisplayCellForIndex(HighlightCell * cell, return; } MessageTableCellWithEditableText * myCell = (MessageTableCellWithEditableText *)cell; - I18n::Message labels[2] = {I18n::Message::RectangleWidth, I18n::Message::BarStart}; + I18n::Message labels[k_numberOfCells] = {I18n::Message::RectangleWidth, I18n::Message::BarStart}; myCell->setMessage(labels[index]); 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 < 2); + assert(index >= 0 && index < k_numberOfCells); if (index == 0) { return m_store->barWidth(); } @@ -51,7 +59,7 @@ float HistogramParameterController::previousParameterAtIndex(int index) { } bool HistogramParameterController::setParameterAtIndex(int parameterIndex, float f) { - assert(parameterIndex >= 0 && parameterIndex < 2); + assert(parameterIndex >= 0 && parameterIndex < k_numberOfCells); if (parameterIndex == 0) { if (f <= 0.0f) { app()->displayWarning(I18n::Message::ForbiddenValue); @@ -65,12 +73,22 @@ bool HistogramParameterController::setParameterAtIndex(int parameterIndex, float } HighlightCell * HistogramParameterController::reusableParameterCell(int index, int type) { - assert(index >= 0 && index < 2); - return &m_cells[index]; + assert(index >= 0 && index < k_numberOfCells); + return m_cells[index]; } int HistogramParameterController::reusableParameterCellCount(int type) { - return 2; + return k_numberOfCells; +} + +View * HistogramParameterController::createView() { + SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::createView(); + 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; } } + diff --git a/apps/statistics/histogram_parameter_controller.h b/apps/statistics/histogram_parameter_controller.h index d4acf2220..e33a7ecfb 100644 --- a/apps/statistics/histogram_parameter_controller.h +++ b/apps/statistics/histogram_parameter_controller.h @@ -14,15 +14,18 @@ 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; float parameterAtIndex(int index) override; float previousParameterAtIndex(int index) override; bool setParameterAtIndex(int parameterIndex, float f) override; + View * createView() override; char m_draftTextBuffer[MessageTableCellWithEditableText::k_bufferLength]; - MessageTableCellWithEditableText m_cells[2]; - float m_previousParameters[2]; + constexpr static int k_numberOfCells = 2; + MessageTableCellWithEditableText * m_cells[k_numberOfCells]; + float m_previousParameters[k_numberOfCells]; Store * m_store; };