Files
Upsilon/apps/shared/function_graph_controller.h
Gabriel Ozouf 190568ea84 [interactive_curve_view_controller] Fix Cursor
Restore the permanence of the cursor between accesses to the graph
window.
The cursor used to be reset when the models had been modified. As there
is no longer a system in place to track these modifications, we manually
check if there is a curve beneath the cursor before reseting it.

Change-Id: I6f71fc17744b5bf1ee552c82126bb4a08b823629
2020-11-04 15:58:19 +01:00

60 lines
2.5 KiB
C++

#ifndef SHARED_FUNCTION_GRAPH_CONTROLLER_H
#define SHARED_FUNCTION_GRAPH_CONTROLLER_H
#include <escher.h>
#include "function_banner_delegate.h"
#include "interactive_curve_view_controller.h"
#include "function_store.h"
#include "function_graph_view.h"
#include "function_curve_parameter_controller.h"
namespace Shared {
class FunctionGraphController : public InteractiveCurveViewController, public FunctionBannerDelegate {
public:
FunctionGraphController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, ButtonRowController * header, InteractiveCurveViewRange * interactiveRange, CurveView * curveView, CurveViewCursor * cursor, int * indexFunctionSelectedByCursor, uint32_t * rangeVersion, Poincare::Preferences::AngleUnit * angleUnitVersion);
bool isEmpty() const override;
void didBecomeFirstResponder() override;
void viewWillAppear() override;
void interestingRanges(Shared::InteractiveCurveViewRange * range) const override;
protected:
float cursorTopMarginRatio() override { return 0.068f; }
void reloadBannerView() override;
bool handleEnter() override;
int indexFunctionSelectedByCursor() const { return *m_indexFunctionSelectedByCursor; }
virtual void selectFunctionWithCursor(int functionIndex);
virtual double defaultCursorT(Ion::Storage::Record record);
virtual FunctionStore * functionStore() const;
// Closest vertical curve helper
virtual int nextCurveIndexVertically(bool goingUp, int currentSelectedCurve, Poincare::Context * context) const {
return closestCurveIndexVertically(goingUp, currentSelectedCurve, context);
}
bool closestCurveIndexIsSuitable(int newIndex, int currentIndex) const override;
int selectedCurveIndex() const override { return *m_indexFunctionSelectedByCursor; }
Poincare::Coordinate2D<double> xyValues(int curveIndex, double t, Poincare::Context * context) const override;
int numberOfCurves() const override;
void initCursorParameters() override;
bool isCursorHanging() override;
CurveView * curveView() override;
void yRangeForCursorFirstMove(Shared::InteractiveCurveViewRange * range) const;
private:
virtual FunctionGraphView * functionGraphView() = 0;
virtual FunctionCurveParameterController * curveParameterController() = 0;
// InteractiveCurveViewController
bool moveCursorVertically(int direction) override;
uint32_t rangeVersion() override;
Poincare::Preferences::AngleUnit * m_angleUnitVersion;
int * m_indexFunctionSelectedByCursor;
};
}
#endif