diff --git a/apps/calculation/additional_outputs/complex_list_controller.cpp b/apps/calculation/additional_outputs/complex_list_controller.cpp index c7f4b8b3a..ec17198fc 100644 --- a/apps/calculation/additional_outputs/complex_list_controller.cpp +++ b/apps/calculation/additional_outputs/complex_list_controller.cpp @@ -1,11 +1,30 @@ #include "complex_list_controller.h" +#include "../app.h" + +using namespace Poincare; namespace Calculation { -void ComplexListController::fillCalculationStoreFromExpression(Poincare::Expression e) { +void ComplexListController::setExpression(Poincare::Expression e) { + IllustratedListController::setExpression(e); //TODO m_model.setComplex(std::complex(1.2f,2.3f)); - IllustratedListController::fillCalculationStoreFromExpression(e); + + Poincare::Preferences * preferences = Poincare::Preferences::sharedPreferences(); + Poincare::Preferences::ComplexFormat currentComplexFormat = preferences->complexFormat(); + if (currentComplexFormat == Poincare::Preferences::ComplexFormat::Real) { + // Temporary change complex format to avoid all additional expressions to be "unreal" + preferences->setComplexFormat(Poincare::Preferences::ComplexFormat::Cartesian); + } + Poincare::Context * context = App::app()->localContext(); + // Fill Calculation Store + m_calculationStore.push("im(z)", context); + m_calculationStore.push("re(z)", context); + m_calculationStore.push("arg(z)", context); + m_calculationStore.push("abs(z)", context); + + // Reset complex format as before + preferences->setComplexFormat(currentComplexFormat); } } diff --git a/apps/calculation/additional_outputs/complex_list_controller.h b/apps/calculation/additional_outputs/complex_list_controller.h index 0237e70d9..59c98185d 100644 --- a/apps/calculation/additional_outputs/complex_list_controller.h +++ b/apps/calculation/additional_outputs/complex_list_controller.h @@ -12,8 +12,9 @@ public: ComplexListController() : IllustratedListController(nullptr), m_complexGraphCell(&m_model) {} - void fillCalculationStoreFromExpression(Poincare::Expression e) override; + void setExpression(Poincare::Expression e) override; private: + CodePoint expressionSymbol() const override { return 'z'; } HighlightCell * illustrationCell() override { return &m_complexGraphCell; } ComplexGraphCell m_complexGraphCell; ComplexModel m_model; diff --git a/apps/calculation/additional_outputs/illustrated_list_controller.cpp b/apps/calculation/additional_outputs/illustrated_list_controller.cpp index 764743707..1f2efc9c7 100644 --- a/apps/calculation/additional_outputs/illustrated_list_controller.cpp +++ b/apps/calculation/additional_outputs/illustrated_list_controller.cpp @@ -1,4 +1,5 @@ #include "illustrated_list_controller.h" +#include #include "../app.h" using namespace Poincare; @@ -41,6 +42,25 @@ void IllustratedListController::didBecomeFirstResponder() { Container::activeApp()->setFirstResponder(&m_listController); } +void IllustratedListController::viewDidDisappear() { + StackViewController::viewDidDisappear(); + // Reset the context as it was before displaying the IllustratedListController + Poincare::Context * context = App::app()->localContext(); + if (m_savedExpression.isUninitialized()) { + /* If no expression was stored in the symbol used by the + * IllustratedListController, we delete the record we stored */ + char symbolName[3]; + size_t length = UTF8Decoder::CodePointToChars(expressionSymbol(), symbolName, 3); + assert(length < 3); + symbolName[length] = 0; + const char * const extensions[2] = {"exp", "func"}; + Ion::Storage::sharedStorage()->recordBaseNamedWithExtensions(symbolName, extensions, 2).destroy(); + } else { + Poincare::Symbol s = Poincare::Symbol::Builder(expressionSymbol()); + context->setExpressionForSymbolAbstract(m_savedExpression, s); + } +} + int IllustratedListController::numberOfRows() const { return k_maxNumberOfAdditionalCalculations + 1; } @@ -107,12 +127,11 @@ void IllustratedListController::tableViewDidChangeSelection(SelectableTableView } } -void IllustratedListController::fillCalculationStoreFromExpression(Expression e) { - // TODO +void IllustratedListController::setExpression(Poincare::Expression e) { Poincare::Context * context = App::app()->localContext(); - m_calculationStore.push("1+root(2,3)", context); - m_calculationStore.push("2+root(2,3)", context); - m_calculationStore.push("3+root(2,3)", context); + Poincare::Symbol s = Poincare::Symbol::Builder('z'); + m_savedExpression = context->expressionForSymbolAbstract(s, false); + context->setExpressionForSymbolAbstract(e, s); } } diff --git a/apps/calculation/additional_outputs/illustrated_list_controller.h b/apps/calculation/additional_outputs/illustrated_list_controller.h index cd2e9fd4d..5c2a0556c 100644 --- a/apps/calculation/additional_outputs/illustrated_list_controller.h +++ b/apps/calculation/additional_outputs/illustrated_list_controller.h @@ -15,6 +15,7 @@ public: // Responder bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; + void viewDidDisappear() override; //ListViewDataSource int numberOfRows() const override; @@ -28,9 +29,13 @@ public: void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY, bool withinTemporarySelection) override; // IllustratedListController - virtual void fillCalculationStoreFromExpression(Poincare::Expression e); + virtual void setExpression(Poincare::Expression e); +protected: + Poincare::Expression m_savedExpression; + CalculationStore m_calculationStore; private: + virtual CodePoint expressionSymbol() const = 0; class ListController : public ViewController { public: ListController(IllustratedListController * dataSource); @@ -41,13 +46,12 @@ private: private: SelectableTableView m_selectableTableView; }; - constexpr static int k_maxNumberOfAdditionalCalculations = 3; + constexpr static int k_maxNumberOfAdditionalCalculations = 4; constexpr static KDCoordinate k_illustrationHeight = 100; ListController m_listController; // Cells virtual HighlightCell * illustrationCell() = 0; ScrollableInputExactApproximateExpressionsCell m_additionalCalculationCells[k_maxNumberOfAdditionalCalculations]; - CalculationStore m_calculationStore; }; } diff --git a/apps/calculation/history_controller.cpp b/apps/calculation/history_controller.cpp index ee557c3db..b40132c21 100644 --- a/apps/calculation/history_controller.cpp +++ b/apps/calculation/history_controller.cpp @@ -72,9 +72,10 @@ bool HistoryController::handleEvent(Ion::Events::Event event) { Expression::AdditionalInformationType additionalInfoType = selectedCell->additionalInformationType(); /* TODO * Controller * c = additionalInformationType ? graphController : listController? - * m_controller->setType(additionalInformationType)*/ + * m_controller->setType(additionalInformationType) + * m_controller->setCalculation()...*/ if (additionalInfoType == Expression::AdditionalInformationType::Complex) { - m_complexController.fillCalculationStoreFromExpression(calculation->exactOutput()); + m_complexController.setExpression(calculation->exactOutput()); Container::activeApp()->displayModalViewController(&m_complexController, 0.f, 0.f, Metric::CommonTopMargin, Metric::PopUpLeftMargin, 0, Metric::PopUpRightMargin); } } else {