diff --git a/apps/graph/app.cpp b/apps/graph/app.cpp index 581877d5f..b8db422f3 100644 --- a/apps/graph/app.cpp +++ b/apps/graph/app.cpp @@ -82,4 +82,8 @@ const char * App::XNT() { return "x"; } +Responder * App::graphControllerParent() { + return &m_graphAlternateEmptyViewController; +} + } diff --git a/apps/graph/app.h b/apps/graph/app.h index 328579cf7..426ea76d8 100644 --- a/apps/graph/app.h +++ b/apps/graph/app.h @@ -34,6 +34,7 @@ public: }; InputViewController * inputViewController() override; const char * XNT() override; + Responder * graphControllerParent(); private: App(Container * container, Snapshot * snapshot); ListController m_listController; diff --git a/apps/graph/graph/calculation_parameter_controller.cpp b/apps/graph/graph/calculation_parameter_controller.cpp index 5fe14061c..669215dcc 100644 --- a/apps/graph/graph/calculation_parameter_controller.cpp +++ b/apps/graph/graph/calculation_parameter_controller.cpp @@ -1,4 +1,5 @@ #include "calculation_parameter_controller.h" +#include "graph_controller.h" #include #include @@ -6,11 +7,12 @@ using namespace Shared; namespace Graph { -CalculationParameterController::CalculationParameterController(Responder * parentResponder) : +CalculationParameterController::CalculationParameterController(Responder * parentResponder, GraphController * graphController) : ViewController(parentResponder), m_selectableTableView(this, this, 0, 1, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin, this), - m_function(nullptr) + m_function(nullptr), + m_graphController(graphController) { } @@ -29,7 +31,19 @@ void CalculationParameterController::didBecomeFirstResponder() { bool CalculationParameterController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::OK || event == Ion::Events::EXE) { - return true; + switch(selectedRow()) { + case 4: + { + StackViewController * stack = (StackViewController *)parentResponder(); + stack->pop(); + stack->pop(); + m_graphController->setType(GraphController::Type::Tangent); + stack->push(m_graphController); + return true; + } + default: + return false; + } } return false; } diff --git a/apps/graph/graph/calculation_parameter_controller.h b/apps/graph/graph/calculation_parameter_controller.h index c18e74cd6..4e81e93a3 100644 --- a/apps/graph/graph/calculation_parameter_controller.h +++ b/apps/graph/graph/calculation_parameter_controller.h @@ -7,9 +7,11 @@ namespace Graph { +class GraphController; + class CalculationParameterController : public ViewController, public SimpleListViewDataSource, public SelectableTableViewDataSource { public: - CalculationParameterController(Responder * parentResponder); + CalculationParameterController(Responder * parentResponder, GraphController * graphController); View * view() override; const char * title() override; bool handleEvent(Ion::Events::Event event) override; @@ -25,6 +27,7 @@ private: MessageTableCell m_cells[k_totalNumberOfCells]; SelectableTableView m_selectableTableView; Shared::Function * m_function; + GraphController * m_graphController; }; } diff --git a/apps/graph/graph/curve_parameter_controller.cpp b/apps/graph/graph/curve_parameter_controller.cpp index 004df9c7b..2d26e3913 100644 --- a/apps/graph/graph/curve_parameter_controller.cpp +++ b/apps/graph/graph/curve_parameter_controller.cpp @@ -1,4 +1,5 @@ #include "curve_parameter_controller.h" +#include "graph_controller.h" #include "../../i18n.h" #include @@ -6,13 +7,13 @@ using namespace Shared; namespace Graph { -CurveParameterController::CurveParameterController(InteractiveCurveViewRange * graphRange, BannerView * bannerView, CurveViewCursor * cursor) : +CurveParameterController::CurveParameterController(InteractiveCurveViewRange * graphRange, BannerView * bannerView, CurveViewCursor * cursor, GraphController * graphController) : FunctionCurveParameterController(graphRange, cursor), m_goToParameterController(this, graphRange, cursor, I18n::Message::X), m_bannerView(bannerView), m_calculationCell(I18n::Message::Compute), m_derivativeCell(I18n::Message::DerivateNumber), - m_calculationParameterController(this) + m_calculationParameterController(this, graphController) { } diff --git a/apps/graph/graph/curve_parameter_controller.h b/apps/graph/graph/curve_parameter_controller.h index cb00b7752..9753a9d50 100644 --- a/apps/graph/graph/curve_parameter_controller.h +++ b/apps/graph/graph/curve_parameter_controller.h @@ -7,9 +7,11 @@ namespace Graph { +class GraphController; + class CurveParameterController : public Shared::FunctionCurveParameterController { public: - CurveParameterController(Shared::InteractiveCurveViewRange * graphRange, BannerView * bannerView, Shared::CurveViewCursor * cursor); + CurveParameterController(Shared::InteractiveCurveViewRange * graphRange, BannerView * bannerView, Shared::CurveViewCursor * cursor, GraphController * graphController); const char * title() override; bool handleEvent(Ion::Events::Event event) override; int numberOfRows() override; diff --git a/apps/graph/graph/graph_controller.cpp b/apps/graph/graph/graph_controller.cpp index aedac3d4f..c9871604d 100644 --- a/apps/graph/graph/graph_controller.cpp +++ b/apps/graph/graph/graph_controller.cpp @@ -1,4 +1,5 @@ #include "graph_controller.h" +#include "../app.h" using namespace Shared; using namespace Poincare; @@ -10,12 +11,22 @@ GraphController::GraphController(Responder * parentResponder, CartesianFunctionS m_bannerView(), m_view(functionStore, curveViewRange, m_cursor, &m_bannerView, &m_cursorView), m_graphRange(curveViewRange), - m_curveParameterController(curveViewRange, &m_bannerView, m_cursor), - m_functionStore(functionStore) + m_curveParameterController(curveViewRange, &m_bannerView, m_cursor, this), + m_functionStore(functionStore), + m_type(Type::Default) { m_graphRange->setDelegate(this); } +const char * GraphController::title() { + switch(m_type) { + case Type::Tangent: + return I18n::translate(I18n::Message::Tangent); + default: + return I18n::translate(I18n::Message::GraphTab); + } +} + I18n::Message GraphController::emptyMessage() { if (m_functionStore->numberOfDefinedFunctions() == 0) { return I18n::Message::NoFunction; @@ -23,11 +34,30 @@ I18n::Message GraphController::emptyMessage() { return I18n::Message::NoActivatedFunction; } +bool GraphController::handleEvent(Ion::Events::Event event) { + if (m_type == Type::Default || event == Ion::Events::Left || event == Ion::Events::Right || event == Ion::Events::Plus || event == Ion::Events::Minus) { + return FunctionGraphController::handleEvent(event); + } + // TODO: handle for type != Type::Default + if (m_type != Type::Default && event == Ion::Events::Back) { + stackController()->handleEvent(event); + setType(Type::Default); + setParentResponder(static_cast(app())->graphControllerParent()); + return true; + } + return false; +} + +void GraphController::setType(Type type) { + m_type = type; +} + BannerView * GraphController::bannerView() { return &m_bannerView; } void GraphController::reloadBannerView() { + // TODO: do something else if m_type == Type::tangent FunctionGraphController::reloadBannerView(); if (!m_bannerView.displayDerivative()) { return; @@ -90,4 +120,11 @@ CurveParameterController * GraphController::curveParameterController() { return &m_curveParameterController; } +StackViewController * GraphController::stackController() const{ + if (m_type != Type::Default) { + return (StackViewController *)(parentResponder()); + } + return FunctionGraphController::stackController(); +} + } diff --git a/apps/graph/graph/graph_controller.h b/apps/graph/graph/graph_controller.h index 2f2645bc1..ca9e4c9cd 100644 --- a/apps/graph/graph/graph_controller.h +++ b/apps/graph/graph/graph_controller.h @@ -13,8 +13,16 @@ namespace Graph { class GraphController : public Shared::FunctionGraphController { public: + enum class Type { + Default, + Tangent, + Integral + }; GraphController(Responder * parentResponder, CartesianFunctionStore * functionStore, Shared::InteractiveCurveViewRange * curveViewRange, Shared::CurveViewCursor * cursor, uint32_t * modelVersion, uint32_t * rangeVersion, Poincare::Expression::AngleUnit * angleUnitVersion, ButtonRowController * header); + const char * title() override; I18n::Message emptyMessage() override; + bool handleEvent(Ion::Events::Event event) override; + void setType(Type type); private: BannerView * bannerView() override; void reloadBannerView() override; @@ -24,11 +32,13 @@ private: CartesianFunctionStore * functionStore() const override; GraphView * functionGraphView() override; CurveParameterController * curveParameterController() override; + StackViewController * stackController() const override; BannerView m_bannerView; GraphView m_view; Shared::InteractiveCurveViewRange * m_graphRange; CurveParameterController m_curveParameterController; CartesianFunctionStore * m_functionStore; + Type m_type; }; } diff --git a/apps/shared/interactive_curve_view_controller.cpp b/apps/shared/interactive_curve_view_controller.cpp index 6cf440b08..acb44ceb0 100644 --- a/apps/shared/interactive_curve_view_controller.cpp +++ b/apps/shared/interactive_curve_view_controller.cpp @@ -171,7 +171,7 @@ void InteractiveCurveViewController::willExitResponderChain(Responder * nextFirs } Responder * InteractiveCurveViewController::tabController() const{ - return (parentResponder()->parentResponder()->parentResponder()->parentResponder()); + return (stackController()->parentResponder()); } StackViewController * InteractiveCurveViewController::stackController() const{ diff --git a/apps/shared/interactive_curve_view_controller.h b/apps/shared/interactive_curve_view_controller.h index ea1f5c891..a1f239dd8 100644 --- a/apps/shared/interactive_curve_view_controller.h +++ b/apps/shared/interactive_curve_view_controller.h @@ -39,7 +39,7 @@ protected: virtual BannerView * bannerView() = 0; virtual bool handleEnter() = 0; Responder * tabController() const; - StackViewController * stackController() const; + virtual StackViewController * stackController() const; virtual void reloadBannerView() = 0; virtual void initRangeParameters() = 0; virtual void initCursorParameters() = 0;