[apps/calculation] Improve expressions that are displayed in Complex

pop-up
This commit is contained in:
Émilie Feral
2019-12-04 16:34:54 +01:00
committed by Léa Saviot
parent d698af035c
commit d178adc936
5 changed files with 57 additions and 13 deletions

View File

@@ -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<float>(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);
}
}

View File

@@ -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;

View File

@@ -1,4 +1,5 @@
#include "illustrated_list_controller.h"
#include <poincare/symbol.h>
#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);
}
}

View File

@@ -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;
};
}

View File

@@ -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 {