diff --git a/apps/graph/graph/axis_parameter_controller.cpp b/apps/graph/graph/axis_parameter_controller.cpp index 6ee51f9c5..4af5147ef 100644 --- a/apps/graph/graph/axis_parameter_controller.cpp +++ b/apps/graph/graph/axis_parameter_controller.cpp @@ -3,10 +3,11 @@ namespace Graph { -AxisParameterController::AxisParameterController(Responder * parentResponder, AxisInterval * axisInterval) : +AxisParameterController::AxisParameterController(Responder * parentResponder, AxisInterval * axisInterval, GraphView * graphView) : FloatParameterController(parentResponder), m_axisInterval(axisInterval), - m_yAutoCell(SwitchMenuListCell((char*)"Y auto")) + m_yAutoCell(SwitchMenuListCell((char*)"Y auto")), + m_graphView(graphView) { m_axisCells[0].setText("Xmin"); m_axisCells[1].setText("Xmax"); @@ -36,6 +37,7 @@ void AxisParameterController::willDisplayCellForIndex(TableViewCell * cell, int } bool AxisParameterController::handleEvent(Ion::Events::Event event) { + m_graphView->initCursorPosition(); if (activeCell() == 2) { if (event == Ion::Events::OK) { m_axisInterval->setYAuto(!m_axisInterval->yAuto()); diff --git a/apps/graph/graph/axis_parameter_controller.h b/apps/graph/graph/axis_parameter_controller.h index 9f2319764..4c1d37146 100644 --- a/apps/graph/graph/axis_parameter_controller.h +++ b/apps/graph/graph/axis_parameter_controller.h @@ -3,12 +3,13 @@ #include #include "axis_interval.h" +#include "graph_view.h" #include "../float_parameter_controller.h" namespace Graph { class AxisParameterController : public FloatParameterController { public: - AxisParameterController(Responder * parentResponder, AxisInterval * axisInterval); + AxisParameterController(Responder * parentResponder, AxisInterval * axisInterval, GraphView * graphView); const char * title() const override; int numberOfRows() override; TableViewCell * reusableCell(int index) override; @@ -22,6 +23,7 @@ private: AxisInterval * m_axisInterval; TextMenuListCell m_axisCells[k_numberOfTextCell]; SwitchMenuListCell m_yAutoCell; + GraphView * m_graphView; }; } diff --git a/apps/graph/graph/graph_controller.cpp b/apps/graph/graph/graph_controller.cpp index e4e787e86..7443f7a8d 100644 --- a/apps/graph/graph/graph_controller.cpp +++ b/apps/graph/graph/graph_controller.cpp @@ -10,9 +10,9 @@ GraphController::GraphController(Responder * parentResponder, FunctionStore * fu HeaderViewDelegate(header), m_view(GraphView(functionStore, &m_axisInterval)), m_axisInterval(functionStore), - m_axisParameterController(AxisParameterController(this, &m_axisInterval)), + m_axisParameterController(AxisParameterController(this, &m_axisInterval, &m_view)), m_zoomParameterController(ZoomParameterController(this, &m_axisInterval, &m_view)), - m_initialisationParameterController(InitialisationParameterController(this, &m_axisInterval)), + m_initialisationParameterController(InitialisationParameterController(this, &m_axisInterval, &m_view)), m_curveParameterController(CurveParameterController(this)), m_axisButton(this, "Axes", Invocation([](void * context, void * sender) { GraphController * graphController = (GraphController *) context; @@ -34,6 +34,9 @@ GraphController::GraphController(Responder * parentResponder, FunctionStore * fu } View * GraphController::view() { + if (m_view.xCursorPosition() < 0.0f) { + m_view.initCursorPosition(); + } return &m_view; } @@ -110,6 +113,8 @@ void GraphController::didBecomeFirstResponder() { m_axisInterval.computeYaxes(); headerViewController()->setSelectedButton(-1); m_headerSelected = false; + + m_view.setVisibleCursor(true); // Layout view whe the graph view that might have been modified by the zoom page headerViewController()->layoutView(); // Reload graph view @@ -121,6 +126,7 @@ bool GraphController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::Down) { headerViewController()->setSelectedButton(-1); m_headerSelected = false; + m_view.setVisibleCursor(true); return true; } if (event == Ion::Events::Up) { @@ -129,11 +135,11 @@ bool GraphController::handleEvent(Ion::Events::Event event) { } return headerViewController()->handleEvent(event); } else { - float xMin = m_axisInterval.xMin(); - float xMax = m_axisInterval.xMax(); - float yMin = m_axisInterval.yMin(); - float yMax = m_axisInterval.yMax(); if (event == Ion::Events::Plus) { + float xMin = m_axisInterval.xMin(); + float xMax = m_axisInterval.xMax(); + float yMin = m_axisInterval.yMin(); + float yMax = m_axisInterval.yMax(); m_axisInterval.setXMin((xMax+xMin)/2.0f - fabsf(xMax-xMin)/3.0f); m_axisInterval.setXMax((xMax+xMin)/2.0f + fabsf(xMax-xMin)/3.0f); m_axisInterval.setYAuto(false); @@ -143,6 +149,10 @@ bool GraphController::handleEvent(Ion::Events::Event event) { return true; } if (event == Ion::Events::Minus) { + float xMin = m_axisInterval.xMin(); + float xMax = m_axisInterval.xMax(); + float yMin = m_axisInterval.yMin(); + float yMax = m_axisInterval.yMax(); m_axisInterval.setXMin((xMax+xMin)/2.0f - 3.0f*fabsf(xMax-xMin)/4.0f); m_axisInterval.setXMax((xMax+xMin)/2.0f + 3.0f*fabsf(xMax-xMin)/4.0f); m_axisInterval.setYAuto(false); @@ -162,6 +172,8 @@ bool GraphController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::Up) { Function * f = m_view.moveCursorUp(); if (f == nullptr) { + m_view.initCursorPosition(); + m_view.setVisibleCursor(false); headerViewController()->setSelectedButton(0); m_headerSelected = true; } diff --git a/apps/graph/graph/graph_view.cpp b/apps/graph/graph/graph_view.cpp index f069bec51..296b070ef 100644 --- a/apps/graph/graph/graph_view.cpp +++ b/apps/graph/graph/graph_view.cpp @@ -16,8 +16,9 @@ GraphView::GraphView(FunctionStore * functionStore, AxisInterval * axisInterval) View(), #endif m_cursorView(CursorView()), - m_xCursorPosition(0.0f), - m_yCursorPosition(0.0f), + m_xCursorPosition(-1.0f), + m_yCursorPosition(-1.0f), + m_visibleCursor(true), m_axisInterval(axisInterval), m_functionStore(functionStore), m_evaluateContext(nullptr) @@ -61,7 +62,6 @@ Context * GraphView::context() const { void GraphView::reload() { markRectAsDirty(bounds()); - initCursorPosition(); layoutSubviews(); } @@ -79,6 +79,15 @@ int GraphView::numberOfYLabels() const { return ceilf((max(Axis::Vertical) - min(Axis::Vertical))/(2*m_axisInterval->yScale())); } +float GraphView::xCursorPosition() { + return m_xCursorPosition; +} + +void GraphView::setVisibleCursor(bool visibleCursor) { + m_visibleCursor = visibleCursor; + layoutSubviews(); +} + void GraphView::initCursorPosition() { float center = (min(Axis::Horizontal)+max(Axis::Horizontal))/2.0f; m_indexFunctionSelectedByCursor = 0; @@ -144,6 +153,9 @@ Function * GraphView::moveCursorDown() { void GraphView::layoutSubviews() { KDRect cursorFrame((int)m_xCursorPosition - (k_cursorSize+1)/2+1, (int)m_yCursorPosition - (k_cursorSize+1)/2+1, k_cursorSize, k_cursorSize); + if (!m_visibleCursor) { + cursorFrame = KDRectZero; + } m_cursorView.setPosition(m_xCursorPosition, m_yCursorPosition); m_cursorView.setFrame(cursorFrame); float step = m_axisInterval->xScale(); diff --git a/apps/graph/graph/graph_view.h b/apps/graph/graph/graph_view.h index 484903661..7d30c4683 100644 --- a/apps/graph/graph/graph_view.h +++ b/apps/graph/graph/graph_view.h @@ -30,6 +30,8 @@ public: #endif // void drawRect(KDRect rect) const override; + float xCursorPosition(); + void setVisibleCursor(bool visibleCursor); void initCursorPosition(); void moveCursorHorizontally(KDCoordinate xOffset); Function * moveCursorUp(); @@ -84,6 +86,7 @@ private: float m_xCursorPosition; float m_yCursorPosition; int m_indexFunctionSelectedByCursor; + bool m_visibleCursor; constexpr static KDCoordinate k_cursorSize = 10; constexpr static KDCoordinate k_labelWidth = 32; constexpr static KDCoordinate k_labelHeight = 12; diff --git a/apps/graph/graph/initialisation_parameter_controller.cpp b/apps/graph/graph/initialisation_parameter_controller.cpp index f79478c28..cba5a3054 100644 --- a/apps/graph/graph/initialisation_parameter_controller.cpp +++ b/apps/graph/graph/initialisation_parameter_controller.cpp @@ -4,11 +4,12 @@ namespace Graph { -InitialisationParameterController::InitialisationParameterController(Responder * parentResponder, AxisInterval * axisInterval) : +InitialisationParameterController::InitialisationParameterController(Responder * parentResponder, AxisInterval * axisInterval, GraphView * graphView) : ViewController(parentResponder), m_selectableTableView(SelectableTableView(this, this, Metric::TopMargin, Metric::RightMargin, Metric::BottomMargin, Metric::LeftMargin)), - m_axisInterval(axisInterval) + m_axisInterval(axisInterval), + m_graphView(graphView) { m_cells[0].setText("Trigonometrique"); m_cells[1].setText("Abscisses entieres"); @@ -69,6 +70,7 @@ bool InitialisationParameterController::handleEvent(Ion::Events::Event event) { default: return false; } + m_graphView->initCursorPosition(); StackViewController * stack = (StackViewController *)parentResponder(); stack->pop(); return true; diff --git a/apps/graph/graph/initialisation_parameter_controller.h b/apps/graph/graph/initialisation_parameter_controller.h index 232bc5f56..0a97c3be5 100644 --- a/apps/graph/graph/initialisation_parameter_controller.h +++ b/apps/graph/graph/initialisation_parameter_controller.h @@ -3,12 +3,13 @@ #include #include "axis_interval.h" +#include "graph_view.h" namespace Graph { class InitialisationParameterController : public ViewController, public SimpleListViewDataSource { public: - InitialisationParameterController(Responder * parentResponder, AxisInterval * axisInterval); + InitialisationParameterController(Responder * parentResponder, AxisInterval * axisInterval, GraphView * graphView); View * view() override; const char * title() const override; bool handleEvent(Ion::Events::Event event) override; @@ -22,6 +23,7 @@ private: MenuListCell m_cells[k_totalNumberOfCells]; SelectableTableView m_selectableTableView; AxisInterval * m_axisInterval; + GraphView * m_graphView; }; } diff --git a/apps/graph/graph/zoom_parameter_controller.cpp b/apps/graph/graph/zoom_parameter_controller.cpp index 2acdc4d40..55aa769a0 100644 --- a/apps/graph/graph/zoom_parameter_controller.cpp +++ b/apps/graph/graph/zoom_parameter_controller.cpp @@ -34,6 +34,7 @@ bool ZoomParameterController::handleEvent(Ion::Events::Event event) { m_axisInterval->setXMax((xMax+xMin)/2.0f + fabsf(xMax-xMin)/3.0f); m_axisInterval->setYMin((yMax+yMin)/2.0f - fabsf(yMax-yMin)/3.0f); m_axisInterval->setYMax((yMax+yMin)/2.0f + fabsf(yMax-yMin)/3.0f); + m_contentView.graphView()->initCursorPosition(); m_contentView.graphView()->reload(); return true; } @@ -42,30 +43,35 @@ bool ZoomParameterController::handleEvent(Ion::Events::Event event) { m_axisInterval->setXMax((xMax+xMin)/2.0f + 3.0f*fabsf(xMax-xMin)/4.0f); m_axisInterval->setYMin((yMax+yMin)/2.0f - 3.0f*fabsf(yMax-yMin)/4.0f); m_axisInterval->setYMax((yMax+yMin)/2.0f + 3.0f*fabsf(yMax-yMin)/4.0f); + m_contentView.graphView()->initCursorPosition(); m_contentView.graphView()->reload(); return true; } if (event == Ion::Events::Up) { m_axisInterval->setYMin(yMin + m_axisInterval->yScale()); m_axisInterval->setYMax(yMax + m_axisInterval->yScale()); + m_contentView.graphView()->initCursorPosition(); m_contentView.graphView()->reload(); return true; } if (event == Ion::Events::Down) { m_axisInterval->setYMin(yMin - m_axisInterval->yScale()); m_axisInterval->setYMax(yMax - m_axisInterval->yScale()); + m_contentView.graphView()->initCursorPosition(); m_contentView.graphView()->reload(); return true; } if (event == Ion::Events::Left) { m_axisInterval->setXMin(xMin - m_axisInterval->xScale()); m_axisInterval->setXMax(xMax - m_axisInterval->xScale()); + m_contentView.graphView()->initCursorPosition(); m_contentView.graphView()->reload(); return true; } if (event == Ion::Events::Right) { m_axisInterval->setXMin(xMin + m_axisInterval->xScale()); m_axisInterval->setXMax(xMax + m_axisInterval->xScale()); + m_contentView.graphView()->initCursorPosition(); m_contentView.graphView()->reload(); return true; }