diff --git a/apps/graph/values/values_controller.cpp b/apps/graph/values/values_controller.cpp index ef588599a..b30ac5808 100644 --- a/apps/graph/values/values_controller.cpp +++ b/apps/graph/values/values_controller.cpp @@ -8,11 +8,12 @@ using namespace Poincare; namespace Graph { ValuesController::ValuesController(Responder * parentResponder, CartesianFunctionStore * functionStore, ButtonRowController * header) : - Shared::ValuesController(parentResponder, header, I18n::Message::XColumn), + 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)), m_derivativeParameterController(DerivativeParameterController(this)) { } @@ -82,6 +83,10 @@ int ValuesController::activeColumn() { return m_selectableTableView.selectedColumn(); } +IntervalParameterController * ValuesController::intervalParameterController() { + return &m_intervalParameterController; +} + CartesianFunction * ValuesController::functionAtColumn(int i) { assert(i > 0); int index = 1; diff --git a/apps/graph/values/values_controller.h b/apps/graph/values/values_controller.h index 2219f977a..37a5ec5c0 100644 --- a/apps/graph/values/values_controller.h +++ b/apps/graph/values/values_controller.h @@ -4,6 +4,7 @@ #include "../cartesian_function_store.h" #include "../function_title_cell.h" #include "../../shared/values_controller.h" +#include "../../shared/interval_parameter_controller.h" #include "derivative_parameter_controller.h" #include "function_parameter_controller.h" @@ -19,6 +20,7 @@ public: void selectCellAtLocation(int i, int j); int activeRow(); int activeColumn(); + Shared::IntervalParameterController * intervalParameterController() override; private: CartesianFunction * functionAtColumn(int i) override; bool isDerivativeColumn(int i); @@ -36,6 +38,7 @@ private: CartesianFunctionStore * functionStore() const override; FunctionParameterController m_functionParameterController; FunctionParameterController * functionParameterController() override; + Shared::IntervalParameterController m_intervalParameterController; DerivativeParameterController m_derivativeParameterController; }; diff --git a/apps/sequence/Makefile b/apps/sequence/Makefile index d01d34036..eaf862a5e 100644 --- a/apps/sequence/Makefile +++ b/apps/sequence/Makefile @@ -12,6 +12,7 @@ app_objs += $(addprefix apps/sequence/,\ list/list_parameter_controller.o\ list/sequence_toolbox.o\ list/type_parameter_controller.o\ + values/interval_parameter_controller.o\ values/values_controller.o\ local_context.o\ sequence.o\ diff --git a/apps/sequence/values/interval_parameter_controller.cpp b/apps/sequence/values/interval_parameter_controller.cpp new file mode 100644 index 000000000..085ffc1cd --- /dev/null +++ b/apps/sequence/values/interval_parameter_controller.cpp @@ -0,0 +1,37 @@ +#include "interval_parameter_controller.h" + +using namespace Shared; + +namespace Sequence { + +IntervalParameterController::IntervalParameterController(Responder * parentResponder, Interval * interval) : + Shared::IntervalParameterController(parentResponder, interval) +{ +} + +void IntervalParameterController::willDisplayCellForIndex(HighlightCell * cell, int index) { + if (index == numberOfRows()-1) { + return; + } + MessageTableCellWithEditableText * myCell = (MessageTableCellWithEditableText *)cell; + I18n::Message labels[k_totalNumberOfCell] = {I18n::Message::XStart, I18n::Message::XEnd, I18n::Message::XStep}; + myCell->setMessage(labels[index]); + FloatParameterController::willDisplayCellForIndex(cell, index); +} + +bool IntervalParameterController::setParameterAtIndex(int parameterIndex, float f) { + if (f <= 0) { + app()->displayWarning(I18n::Message::ForbiddenValue); + return false; + } + SetterPointer setters[k_totalNumberOfCell] = {&Interval::setStart, &Interval::setEnd, &Interval::setStep}; + float parameter = roundf(f); + if (parameterIndex == 2 && parameter == 0.0f) { + parameter = 1.0f; + } + (m_interval->*setters[parameterIndex])(parameter); + return true; +} + +} + diff --git a/apps/sequence/values/interval_parameter_controller.h b/apps/sequence/values/interval_parameter_controller.h new file mode 100644 index 000000000..89bee74e4 --- /dev/null +++ b/apps/sequence/values/interval_parameter_controller.h @@ -0,0 +1,18 @@ +#ifndef SEQUENCE_INTERVAL_PARAM_CONTROLLER_H +#define SEQUENCE_INTERVAL_PARAM_CONTROLLER_H + +#include "../../shared/interval_parameter_controller.h" + +namespace Sequence { + +class IntervalParameterController : public Shared::IntervalParameterController { +public: + IntervalParameterController(Responder * parentResponder, Shared::Interval * interval); + void willDisplayCellForIndex(HighlightCell * cell, int index) override; + bool setParameterAtIndex(int parameterIndex, float f) override; +}; + +} + +#endif + diff --git a/apps/sequence/values/values_controller.cpp b/apps/sequence/values/values_controller.cpp index c0bc999fd..6ed70619d 100644 --- a/apps/sequence/values/values_controller.cpp +++ b/apps/sequence/values/values_controller.cpp @@ -6,11 +6,12 @@ using namespace Shared; namespace Sequence { ValuesController::ValuesController(Responder * parentResponder, SequenceStore * sequenceStore, ButtonRowController * header) : - Shared::ValuesController(parentResponder, header, I18n::Message::NColumn), + 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_sequenceParameterController(Shared::ValuesFunctionParameterController('n')), + m_intervalParameterController(IntervalParameterController(this, &m_interval)) { } @@ -42,6 +43,17 @@ I18n::Message ValuesController::emptyMessage() { return I18n::Message::NoActivatedSequence; } +IntervalParameterController * ValuesController::intervalParameterController() { + return &m_intervalParameterController; +} + +bool ValuesController::setDataAtLocation(float floatBody, int columnIndex, int rowIndex) { + if (floatBody < 0) { + return false; + } + return Shared::ValuesController::setDataAtLocation(roundf(floatBody), columnIndex, rowIndex); +} + int ValuesController::maxNumberOfCells() { return k_maxNumberOfCells; } diff --git a/apps/sequence/values/values_controller.h b/apps/sequence/values/values_controller.h index 1d2cd84e9..5ef30e5af 100644 --- a/apps/sequence/values/values_controller.h +++ b/apps/sequence/values/values_controller.h @@ -4,6 +4,7 @@ #include "../sequence_store.h" #include "../sequence_title_cell.h" #include "../../shared/values_controller.h" +#include "interval_parameter_controller.h" namespace Sequence { @@ -13,7 +14,9 @@ public: int numberOfColumns() override; void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; I18n::Message emptyMessage() override; + IntervalParameterController * intervalParameterController() override; private: + bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override; int maxNumberOfCells() override; int maxNumberOfFunctions() override; constexpr static int k_maxNumberOfCells = 30; @@ -26,6 +29,7 @@ private: SequenceStore * functionStore() const override; Shared::ValuesFunctionParameterController m_sequenceParameterController; Shared::ValuesFunctionParameterController * functionParameterController() override; + IntervalParameterController m_intervalParameterController; }; } diff --git a/apps/shared/interval_parameter_controller.h b/apps/shared/interval_parameter_controller.h index afd379078..1c16338ad 100644 --- a/apps/shared/interval_parameter_controller.h +++ b/apps/shared/interval_parameter_controller.h @@ -15,14 +15,15 @@ public: void viewWillAppear() override; void willDisplayCellForIndex(HighlightCell * cell, int index) override; int numberOfRows() override; +protected: + constexpr static int k_totalNumberOfCell = 3; + Interval * m_interval; 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; - constexpr static int k_totalNumberOfCell = 3; - Interval * m_interval; char m_draftTextBuffer[MessageTableCellWithEditableText::k_bufferLength]; MessageTableCellWithEditableText m_intervalCells[k_totalNumberOfCell]; float m_previousParameters[k_totalNumberOfCell]; diff --git a/apps/shared/values_controller.cpp b/apps/shared/values_controller.cpp index 2178539e5..792e60216 100644 --- a/apps/shared/values_controller.cpp +++ b/apps/shared/values_controller.cpp @@ -8,15 +8,14 @@ using namespace Poincare; namespace Shared { -ValuesController::ValuesController(Responder * parentResponder, ButtonRowController * header, I18n::Message parameterTitle) : +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_intervalParameterController(IntervalParameterController(this, &m_interval)), - m_abscissaParameterController(ValuesParameterController(this, &m_intervalParameterController, parameterTitle)), + m_abscissaParameterController(ValuesParameterController(this, intervalParameterController, parameterTitle)), m_setIntervalButton(Button(this, I18n::Message::IntervalSet, Invocation([](void * context, void * sender) { ValuesController * valuesController = (ValuesController *) context; StackViewController * stack = ((StackViewController *)valuesController->stackController()); @@ -101,10 +100,6 @@ void ValuesController::willExitResponderChain(Responder * nextFirstResponder) { } } -ViewController * ValuesController::intervalParameterController() { - return &m_intervalParameterController; -} - int ValuesController::numberOfButtons(ButtonRowController::Position) const { if (isEmpty()) { return 0; diff --git a/apps/shared/values_controller.h b/apps/shared/values_controller.h index a2d396dcc..5578a44e3 100644 --- a/apps/shared/values_controller.h +++ b/apps/shared/values_controller.h @@ -15,13 +15,13 @@ namespace Shared { class ValuesController : public EditableCellTableViewController, public ButtonRowDelegate, public AlternateEmptyViewDelegate { public: - ValuesController(Responder * parentResponder, ButtonRowController * header, I18n::Message parameterTitle); + ValuesController(Responder * parentResponder, ButtonRowController * header, I18n::Message parameterTitle, IntervalParameterController * intervalParameterController); const char * title() override; Interval * interval(); virtual bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; void willExitResponderChain(Responder * nextFirstResponder) override; - ViewController * intervalParameterController(); + virtual IntervalParameterController * intervalParameterController() = 0; int numberOfButtons(ButtonRowController::Position) const override; Button * buttonAtIndex(int index, ButtonRowController::Position position) const override; virtual void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; @@ -42,6 +42,7 @@ public: static constexpr KDCoordinate k_ordinateCellWidth = 100; protected: StackViewController * stackController() const; + bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override; Interval m_interval; private: virtual Function * functionAtColumn(int i); @@ -49,7 +50,6 @@ private: void configureAbscissa(); void configureFunction(); bool cellAtLocationIsEditable(int columnIndex, int rowIndex) override; - bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override; float dataAtLocation(int columnIndex, int rowIndex) override; int numberOfElements() override; int maxNumberOfElements() const override; @@ -64,7 +64,6 @@ private: EvenOddEditableTextCell m_abscissaCells[k_maxNumberOfAbscissaCells]; virtual FunctionStore * functionStore() const = 0; virtual ValuesFunctionParameterController * functionParameterController() = 0; - IntervalParameterController m_intervalParameterController; ValuesParameterController m_abscissaParameterController; Button m_setIntervalButton; };