diff --git a/apps/solver/app.cpp b/apps/solver/app.cpp index 427c12873..2e35f1e3f 100644 --- a/apps/solver/app.cpp +++ b/apps/solver/app.cpp @@ -44,7 +44,9 @@ void App::Snapshot::tidy() { App::App(Container * container, Snapshot * snapshot) : ExpressionFieldDelegateApp(container, snapshot, &m_inputViewController), - m_listController(&m_stackViewController, snapshot->equationStore(), &m_listFooter), + m_solutionsController(&m_alternateEmptyViewController, snapshot->equationStore()), + m_alternateEmptyViewController(nullptr, &m_solutionsController, &m_solutionsController), + m_listController(&m_listFooter, snapshot->equationStore(), &m_listFooter), m_listFooter(&m_stackViewController, &m_listController, &m_listController, ButtonRowController::Position::Bottom, ButtonRowController::Style::EmbossedGrey), m_stackViewController(&m_inputViewController, &m_listFooter), m_inputViewController(&m_modalViewController, &m_stackViewController, &m_listController, &m_listController) diff --git a/apps/solver/app.h b/apps/solver/app.h index bb83f8b90..0235caf5e 100644 --- a/apps/solver/app.h +++ b/apps/solver/app.h @@ -5,6 +5,7 @@ #include "../shared/expression_field_delegate_app.h" #include "list_controller.h" #include "equation_store.h" +#include "solutions_controller.h" namespace Solver { @@ -28,10 +29,13 @@ public: EquationStore m_equationStore; }; InputViewController * inputViewController() { return &m_inputViewController; } + ViewController * solutionsControllerStack() { return &m_alternateEmptyViewController; } void willBecomeInactive() override; const char * XNT() override; private: App(Container * container, Snapshot * snapshot); + SolutionsController m_solutionsController; + AlternateEmptyViewController m_alternateEmptyViewController; ListController m_listController; ButtonRowController m_listFooter; StackViewController m_stackViewController; diff --git a/apps/solver/list_controller.cpp b/apps/solver/list_controller.cpp index 3973d1fba..17e4f8e0a 100644 --- a/apps/solver/list_controller.cpp +++ b/apps/solver/list_controller.cpp @@ -12,9 +12,7 @@ ListController::ListController(Responder * parentResponder, EquationStore * equa m_equationStore(equationStore), m_resolveButton(this, I18n::Message::Resolve, Invocation([](void * context, void * sender) { ListController * list = (ListController *)context; - StackViewController * stackController = list->stackController(); - // TODO - //stackController->push(list->solutionPage ??) + list->resolveEquations(); }, this), KDText::FontSize::Small, Palette::PurpleBright), m_modelsParameterController(this, equationStore, this), m_modelsStackController(nullptr, &m_modelsParameterController, KDColorWhite, Palette::PurpleDark, Palette::PurpleDark) @@ -142,6 +140,27 @@ bool ListController::expressionLayoutFieldDidReceiveEvent(ExpressionLayoutField return false; } +void ListController::resolveEquations() { + EquationStore::Error e = m_equationStore->exactSolve(static_cast(app())->localContext()); + switch (e) { + case EquationStore::Error::TooManyVariables: + app()->displayWarning(I18n::Message::TooManyVariables); + return; + case EquationStore::Error::NonLinearSystem: + app()->displayWarning(I18n::Message::NonLinearSystem); + return; + case EquationStore::Error::RequireApproximateSolution: + return; + default: + { + assert(e == EquationStore::Error::NoError); + StackViewController * stack = stackController(); + App * solverApp = static_cast(app()); + stack->push(solverApp->solutionsControllerStack(), KDColorWhite, Palette::PurpleBright, Palette::PurpleBright); + } + } +} + void ListController::addEmptyModel() { app()->displayModalViewController(&m_modelsStackController, 0.f, 0.f, Metric::CommonTopMargin, Metric::CommonRightMargin, 0, Metric::CommonLeftMargin); } diff --git a/apps/solver/list_controller.h b/apps/solver/list_controller.h index 436b69891..30140f30b 100644 --- a/apps/solver/list_controller.h +++ b/apps/solver/list_controller.h @@ -45,6 +45,8 @@ public: Shared::ExpressionFieldDelegateApp * expressionFieldDelegateApp() override; bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override; bool expressionLayoutFieldDidReceiveEvent(ExpressionLayoutField * expressionLayoutField, Ion::Events::Event event) override; + /* Specific to Solver */ + void resolveEquations(); private: constexpr static int k_maxNumberOfRows = 5; // Ion::Display::Height / Metric::StoreRowHeight = 4.8; void addEmptyModel() override; diff --git a/apps/solver/solutions_controller.cpp b/apps/solver/solutions_controller.cpp index 023d6c04b..c71d8c66e 100644 --- a/apps/solver/solutions_controller.cpp +++ b/apps/solver/solutions_controller.cpp @@ -61,7 +61,7 @@ I18n::Message SolutionsController::emptyMessage() { } Responder * SolutionsController::defaultController() { - return parentResponder(); + return parentResponder()->parentResponder(); } /* TableViewDataSource */