diff --git a/apps/graph/list/domain_parameter_controller.cpp b/apps/graph/list/domain_parameter_controller.cpp index 326a7eb85..b4c70627c 100644 --- a/apps/graph/list/domain_parameter_controller.cpp +++ b/apps/graph/list/domain_parameter_controller.cpp @@ -10,7 +10,8 @@ namespace Graph { DomainParameterController::DomainParameterController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate) : FloatParameterController(parentResponder), m_domainCells{}, - m_record() + m_record(), + m_tempDomain() { for (int i = 0; i < k_totalNumberOfCell; i++) { m_domainCells[i].setParentResponder(&m_selectableTableView); @@ -18,12 +19,10 @@ DomainParameterController::DomainParameterController(Responder * parentResponder } } -const char * DomainParameterController::title() { - return I18n::translate(I18n::Message::FunctionDomain); -} - -int DomainParameterController::numberOfRows() const { - return k_totalNumberOfCell+1; +void DomainParameterController::viewWillAppear() { + // Initialize m_tempParameters to the extracted value. + extractParameters(); + FloatParameterController::viewWillAppear(); } void DomainParameterController::willDisplayCellForIndex(HighlightCell * cell, int index) { @@ -56,10 +55,6 @@ void DomainParameterController::willDisplayCellForIndex(HighlightCell * cell, in FloatParameterController::willDisplayCellForIndex(cell, index); } -int DomainParameterController::reusableParameterCellCount(int type) { - return k_totalNumberOfCell; -} - HighlightCell * DomainParameterController::reusableParameterCell(int index, int type) { assert(index >= 0 && index < k_totalNumberOfCell); return &m_domainCells[index]; @@ -74,16 +69,38 @@ bool DomainParameterController::handleEvent(Ion::Events::Event event) { } float DomainParameterController::parameterAtIndex(int index) { - return index == 0 ? function()->tMin() : function()->tMax(); + return index == 0 ? m_tempDomain.min() : m_tempDomain.max(); +} + +void DomainParameterController::extractParameters() { + setParameterAtIndex(0, function()->tMin()); + setParameterAtIndex(1, function()->tMax()); + /* Setting m_tempDomain tMin might affect m_tempDomain.max(), but setting tMax + * right after will not affect m_tempDomain.min() because Function's Range1D + * parameters are valid (tMax>tMin), and final tMin value is already set. + * Same happens in confirmParameters when setting function's parameters from + * valid m_tempDomain parameters. */ + assert(function()->tMin() == m_tempDomain.min()); + assert(function()->tMax() == m_tempDomain.max()); } bool DomainParameterController::setParameterAtIndex(int parameterIndex, float f) { - // TODO: what to do if the xmin > xmax? - parameterIndex == 0 ? function()->setTMin(f) : function()->setTMax(f); + /* Setting Min (or Max) parameter can alter the previously set Max + * (or Min) parameter if Max <= Min. */ + parameterIndex == 0 ? m_tempDomain.setMin(f) : m_tempDomain.setMax(f); return true; } +void DomainParameterController::confirmParameters() { + function()->setTMin(parameterAtIndex(0)); + function()->setTMax(parameterAtIndex(1)); + // See comment on Range1D initialization in extractParameters + assert(function()->tMin() == m_tempDomain.min()); + assert(function()->tMax() == m_tempDomain.max()); +} + void DomainParameterController::buttonAction() { + confirmParameters(); StackViewController * stack = stackController(); stack->pop(); stack->pop(); diff --git a/apps/graph/list/domain_parameter_controller.h b/apps/graph/list/domain_parameter_controller.h index 1b8da3712..5efe1c193 100644 --- a/apps/graph/list/domain_parameter_controller.h +++ b/apps/graph/list/domain_parameter_controller.h @@ -6,6 +6,7 @@ #include "../../shared/continuous_function.h" #include "../../shared/expiring_pointer.h" #include "../../shared/float_parameter_controller.h" +#include "../../shared/range_1D.h" namespace Graph { @@ -14,17 +15,18 @@ public: DomainParameterController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate); // ViewController - const char * title() override; + const char * title() override { return I18n::translate(I18n::Message::FunctionDomain); } TELEMETRY_ID("DomainParameter"); // ListViewDataSource - int numberOfRows() const override; + int numberOfRows() const override { return k_totalNumberOfCell+1; } void willDisplayCellForIndex(HighlightCell * cell, int index) override; void setRecord(Ion::Storage::Record record) { m_record = record; } private: constexpr static int k_totalNumberOfCell = 2; - int reusableParameterCellCount(int type) override; + void viewWillAppear() override; + int reusableParameterCellCount(int type) override { return k_totalNumberOfCell; } HighlightCell * reusableParameterCell(int index, int type) override; bool handleEvent(Ion::Events::Event event) override; bool setParameterAtIndex(int parameterIndex, float f) override; @@ -32,8 +34,13 @@ private: void buttonAction() override; InfinityTolerance infinityAllowanceForRow(int row) const override; Shared::ExpiringPointer function() const; + // Applies temporary parameters to function. + void confirmParameters(); + // Extracts parameters from function, setting m_tempDomain parameters. + void extractParameters(); MessageTableCellWithEditableText m_domainCells[k_totalNumberOfCell]; Ion::Storage::Record m_record; + Shared::Range1D m_tempDomain; }; }