[apps/graph/list] Apply changes on confirm with function interval selection

Change-Id: I0ec1ae54788f1c72fc8277544ed51a85ba4474d5
This commit is contained in:
Hugo Saint-Vignes
2020-07-30 15:07:22 +02:00
committed by Émilie Feral
parent cce1fa0c90
commit cbd26e69d1
2 changed files with 41 additions and 17 deletions

View File

@@ -10,7 +10,8 @@ namespace Graph {
DomainParameterController::DomainParameterController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate) :
FloatParameterController<float>(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();

View File

@@ -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<Shared::ContinuousFunction> 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;
};
}