[Apps/Shared] Fixed interval and curve view exit

This commit is contained in:
Joachim LF
2020-07-25 15:28:30 +02:00
committed by LeaNumworks
parent b4a3dd10e1
commit d37bf9e344
8 changed files with 73 additions and 51 deletions

View File

@@ -15,8 +15,10 @@ InteractiveCurveViewController::InteractiveCurveViewController(Responder * paren
m_rangeVersion(rangeVersion),
m_rangeParameterController(this, inputEventHandlerDelegate, interactiveRange),
m_zoomParameterController(this, interactiveRange, curveView),
m_interactiveRange(interactiveRange),
m_rangeButton(this, I18n::Message::Axis, Invocation([](void * context, void * sender) {
InteractiveCurveViewController * graphController = (InteractiveCurveViewController *) context;
graphController->rangeParameterController()->setRange(graphController->interactiveRange());
StackViewController * stack = graphController->stackController();
stack->push(graphController->rangeParameterController());
return true;
@@ -113,7 +115,7 @@ void InteractiveCurveViewController::didBecomeFirstResponder() {
}
}
ViewController * InteractiveCurveViewController::rangeParameterController() {
RangeParameterController * InteractiveCurveViewController::rangeParameterController() {
return &m_rangeParameterController;
}

View File

@@ -19,7 +19,7 @@ public:
void didBecomeFirstResponder() override;
TELEMETRY_ID("Graph");
ViewController * rangeParameterController();
RangeParameterController * rangeParameterController();
ViewController * zoomParameterController();
virtual ViewController * initialisationParameterController() = 0;
@@ -35,6 +35,7 @@ public:
void willExitResponderChain(Responder * nextFirstResponder) override;
bool textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) override;
bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override;
protected:
Responder * tabController() const;
virtual StackViewController * stackController() const;
@@ -57,6 +58,8 @@ protected:
float cursorBottomMarginRatio() override;
OkView m_okView;
InteractiveCurveViewRange * interactiveRange(){return m_interactiveRange;}
private:
/* The value 21 is the actual height of the ButtonRow, that is
* ButtonRowController::ContentView::k_plainStyleHeight + 1.
@@ -75,6 +78,7 @@ private:
uint32_t * m_rangeVersion;
RangeParameterController m_rangeParameterController;
ZoomParameterController m_zoomParameterController;
InteractiveCurveViewRange * m_interactiveRange;
Button m_rangeButton;
Button m_zoomButton;
Button m_defaultInitialisationButton;

View File

@@ -29,21 +29,6 @@ double Interval::element(int i) {
return m_intervalBuffer[i];
}
void Interval::setStart(double f) {
m_start = f;
m_needCompute = true;
}
void Interval::setEnd(double f) {
m_end = f;
m_needCompute = true;
}
void Interval::setStep(double f) {
m_step = f;
m_needCompute = true;
}
void Interval::setElement(int i, double f) {
assert(i <= numberOfElements() && i < k_maxNumberOfElements);
computeElements();
@@ -54,16 +39,16 @@ void Interval::setElement(int i, double f) {
}
void Interval::reset() {
m_start = 0.0;
m_end = 10.0;
m_step = 1.0;
m_parameters.setStart(0.0);
m_parameters.setEnd(10.0);
m_parameters.setStep(1.0);
m_needCompute = true;
}
void Interval::clear() {
m_start = 1.0;
m_end = 0.0;
m_step = 1.0;
m_parameters.setStart(1.0);
m_parameters.setEnd(10.0);
m_parameters.setStep(1.0);
m_needCompute = true;
}
@@ -71,14 +56,14 @@ void Interval::computeElements() {
if (!m_needCompute) {
return;
}
if (m_start > m_end) {
if (m_parameters.start() > m_parameters.end()) {
m_numberOfElements = 0;
} else {
m_numberOfElements = m_step > 0 ? 1 + (m_end - m_start)/m_step : k_maxNumberOfElements;
m_numberOfElements = m_parameters.step() > 0 ? 1 + (m_parameters.end() - m_parameters.start())/m_parameters.step() : k_maxNumberOfElements;
m_numberOfElements = m_numberOfElements > k_maxNumberOfElements || m_numberOfElements < 0 ? k_maxNumberOfElements : m_numberOfElements;
}
for (int i = 0; i < m_numberOfElements; i += 1) {
m_intervalBuffer[i] = m_start + i * m_step;
m_intervalBuffer[i] = m_parameters.start() + i * m_parameters.step();
}
m_needCompute = false;
}

View File

@@ -10,13 +10,22 @@ public:
Interval(const Interval&) = delete;
int numberOfElements();
void deleteElementAtIndex(int index);
class intervalParameters {
public:
void setStart(double f) { m_start = f; }
void setEnd(double f) { m_end = f; }
void setStep(double f) {m_step = f; }
double start() const { return m_start; }
double end() const { return m_end; }
double step() const { return m_step; }
private:
double m_start;
double m_end;
double m_step;
};
double element(int i);
double start() const { return m_start; }
double end() const { return m_end; }
double step() const { return m_step; }
void setStart(double f);
void setEnd(double f);
void setStep(double f);
intervalParameters * parameters() { return &m_parameters; }
void setParameters(intervalParameters parameters) { m_parameters = parameters; }
void setElement(int i, double f);
void forceRecompute(){ m_needCompute = true;}
void reset();
@@ -27,14 +36,12 @@ private:
void computeElements();
int m_numberOfElements;
double m_intervalBuffer[k_maxNumberOfElements];
double m_start;
double m_end;
double m_step;
bool m_needCompute;
intervalParameters m_parameters;
};
typedef void (Interval::*SetterPointer)(double);
typedef double (Interval::*GetterPointer)() const;
typedef void (Interval::intervalParameters::*SetterPointer)(double);
typedef double (Interval::intervalParameters::*GetterPointer)() const;
}

View File

@@ -2,6 +2,8 @@
namespace Shared {
static Interval::intervalParameters s_tempIntevalParameters;
IntervalParameterController::IntervalParameterController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate) :
FloatParameterController<double>(parentResponder),
m_interval(nullptr),
@@ -16,6 +18,11 @@ IntervalParameterController::IntervalParameterController(Responder * parentRespo
}
}
void IntervalParameterController::setInterval(Interval * interval) {
m_interval = interval;
s_tempIntevalParameters = *(*interval).parameters();
}
const char * IntervalParameterController::title() {
return I18n::translate(m_title);
}
@@ -42,8 +49,8 @@ void IntervalParameterController::willDisplayCellForIndex(HighlightCell * cell,
}
double IntervalParameterController::parameterAtIndex(int index) {
GetterPointer getters[k_totalNumberOfCell] = {&Interval::start, &Interval::end, &Interval::step};
return (m_interval->*getters[index])();
GetterPointer getters[k_totalNumberOfCell] = {&Shared::Interval::intervalParameters::start, &Shared::Interval::intervalParameters::end, &Shared::Interval::intervalParameters::step};
return (s_tempIntevalParameters.*getters[index])();
}
bool IntervalParameterController::setParameterAtIndex(int parameterIndex, double f) {
@@ -51,18 +58,18 @@ bool IntervalParameterController::setParameterAtIndex(int parameterIndex, double
Container::activeApp()->displayWarning(I18n::Message::ForbiddenValue);
return false;
}
double start = parameterIndex == 0 ? f : m_interval->start();
double end = parameterIndex == 1 ? f : m_interval->end();
double start = parameterIndex == 0 ? f : s_tempIntevalParameters.start();
double end = parameterIndex == 1 ? f : s_tempIntevalParameters.end();
if (start > end) {
if (parameterIndex == 1) {
Container::activeApp()->displayWarning(I18n::Message::ForbiddenValue);
return false;
}
double g = f+1.0;
m_interval->setEnd(g);
s_tempIntevalParameters.setEnd(g);
}
SetterPointer setters[k_totalNumberOfCell] = {&Interval::setStart, &Interval::setEnd, &Interval::setStep};
(m_interval->*setters[parameterIndex])(f);
SetterPointer setters[k_totalNumberOfCell] = {&Shared::Interval::intervalParameters::setStart, &Shared::Interval::intervalParameters::setEnd, &Shared::Interval::intervalParameters::setStep};
(s_tempIntevalParameters.*setters[parameterIndex])(f);
return true;
}
@@ -85,6 +92,7 @@ int IntervalParameterController::reusableParameterCellCount(int type) {
}
void IntervalParameterController::buttonAction() {
m_interval->setParameters(s_tempIntevalParameters);
m_interval->forceRecompute();
StackViewController * stack = stackController();
stack->pop();

View File

@@ -12,7 +12,7 @@ class IntervalParameterController : public Shared::FloatParameterController<doub
public:
IntervalParameterController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate);
Interval * interval() { assert(m_interval); return m_interval; }
void setInterval(Interval * interval) { m_interval = interval; }
void setInterval(Interval * interval);
const char * title() override;
void setTitle(I18n::Message title) { m_title = title; }
void willDisplayCellForIndex(HighlightCell * cell, int index) override;

View File

@@ -8,6 +8,7 @@ namespace Shared {
RangeParameterController::RangeParameterController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, InteractiveCurveViewRange * interactiveRange) :
FloatParameterController<float>(parentResponder),
m_interactiveRange(interactiveRange),
m_tempInteractiveRange(*interactiveRange),
m_xRangeCells{},
m_yRangeCells{},
m_yAutoCell(I18n::Message::YAuto)
@@ -18,7 +19,7 @@ RangeParameterController::RangeParameterController(Responder * parentResponder,
}
for (int i = 0; i < k_numberOfConvertibleTextCell; i++) {
m_yRangeCells[i].setParentResponder(&m_selectableTableView);
m_yRangeCells[i].setInteractiveCurveViewRange(m_interactiveRange);
m_yRangeCells[i].setInteractiveCurveViewRange(&m_tempInteractiveRange);
m_yRangeCells[i].textField()->setDelegates(inputEventHandlerDelegate, this);
}
}
@@ -50,13 +51,13 @@ void RangeParameterController::willDisplayCellForIndex(HighlightCell * cell, int
}
if (index == 2) {
SwitchView * switchView = (SwitchView *)m_yAutoCell.accessoryView();
switchView->setState(m_interactiveRange->yAuto());
switchView->setState(m_tempInteractiveRange.yAuto());
return;
}
MessageTableCellWithEditableText * myCell = (MessageTableCellWithEditableText *)cell;
I18n::Message labels[k_numberOfTextCell+1] = {I18n::Message::XMin, I18n::Message::XMax, I18n::Message::Default, I18n::Message::YMin, I18n::Message::YMax};
myCell->setMessage(labels[index]);
KDColor yColor = m_interactiveRange->yAuto() ? Palette::GreyDark : KDColorBlack;
KDColor yColor = m_tempInteractiveRange.yAuto() ? Palette::GreyDark : KDColorBlack;
KDColor colors[k_numberOfTextCell+1] = {KDColorBlack, KDColorBlack, KDColorBlack, yColor, yColor};
myCell->setTextColor(colors[index]);
FloatParameterController::willDisplayCellForIndex(cell, index);
@@ -70,9 +71,14 @@ bool RangeParameterController::textFieldDidFinishEditing(TextField * textField,
return false;
}
void RangeParameterController::setRange(InteractiveCurveViewRange * range){
m_interactiveRange = range;
m_tempInteractiveRange = *range;
}
bool RangeParameterController::handleEvent(Ion::Events::Event event) {
if (activeCell() == 2 && (event == Ion::Events::OK || event == Ion::Events::EXE)) {
m_interactiveRange->setYAuto(!m_interactiveRange->yAuto());
m_tempInteractiveRange.setYAuto(!m_tempInteractiveRange.yAuto());
m_selectableTableView.reloadData();
return true;
}
@@ -83,14 +89,14 @@ float RangeParameterController::parameterAtIndex(int parameterIndex) {
ParameterGetterPointer getters[k_numberOfTextCell] = {&InteractiveCurveViewRange::xMin,
&InteractiveCurveViewRange::xMax, &InteractiveCurveViewRange::yMin, &InteractiveCurveViewRange::yMax};
int index = parameterIndex > 2 ? parameterIndex - 1 : parameterIndex;
return (m_interactiveRange->*getters[index])();
return (m_tempInteractiveRange.*getters[index])();
}
bool RangeParameterController::setParameterAtIndex(int parameterIndex, float f) {
ParameterSetterPointer setters[k_numberOfTextCell] = {&InteractiveCurveViewRange::setXMin,
&InteractiveCurveViewRange::setXMax, &InteractiveCurveViewRange::setYMin, &InteractiveCurveViewRange::setYMax};
int index = parameterIndex > 2 ? parameterIndex - 1 : parameterIndex;
(m_interactiveRange->*setters[index])(f);
(m_tempInteractiveRange.*setters[index])(f);
return true;
}
@@ -119,4 +125,11 @@ int RangeParameterController::reusableParameterCellCount(int type) {
return k_numberOfConvertibleTextCell;
}
void RangeParameterController::buttonAction() {
*m_interactiveRange = m_tempInteractiveRange;
StackViewController * stack = stackController();
stack->pop();
}
}

View File

@@ -16,6 +16,7 @@ public:
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
bool textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) override;
bool handleEvent(Ion::Events::Event event) override;
void setRange(InteractiveCurveViewRange * range);
TELEMETRY_ID("Range");
private:
class MessageTableCellWithConvertibleEditableText : public MessageTableCellWithEditableText {
@@ -39,9 +40,11 @@ private:
constexpr static int k_numberOfConvertibleTextCell = 2;
constexpr static int k_numberOfTextCell = k_numberOfEditableTextCell+k_numberOfConvertibleTextCell;
InteractiveCurveViewRange * m_interactiveRange;
InteractiveCurveViewRange m_tempInteractiveRange;
MessageTableCellWithEditableText m_xRangeCells[k_numberOfEditableTextCell];
MessageTableCellWithConvertibleEditableText m_yRangeCells[k_numberOfConvertibleTextCell];
MessageTableCellWithSwitch m_yAutoCell;
void buttonAction() override;
};
}