From bf23e0f8da50950b48ff7589aaeff67c9ecd6978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 24 Sep 2019 16:31:09 +0200 Subject: [PATCH] [apps/graph] ValuesController: change display of the parametric column - display only one column for (x;y) values --- apps/graph/values/values_controller.cpp | 63 +++++++++++----------- apps/graph/values/values_controller.h | 2 +- apps/sequence/values/values_controller.cpp | 5 +- apps/sequence/values/values_controller.h | 2 +- apps/shared/values_controller.cpp | 6 +-- apps/shared/values_controller.h | 2 +- 6 files changed, 38 insertions(+), 42 deletions(-) diff --git a/apps/graph/values/values_controller.cpp b/apps/graph/values/values_controller.cpp index 12089f392..b3e5efff9 100644 --- a/apps/graph/values/values_controller.cpp +++ b/apps/graph/values/values_controller.cpp @@ -1,5 +1,6 @@ #include "values_controller.h" #include +#include "../../shared/poincare_helpers.h" #include "../../constant.h" #include "../app.h" @@ -95,28 +96,11 @@ void ValuesController::willDisplayCellAtLocation(HighlightCell * cell, int i, in bool isDerivative = false; Ion::Storage::Record record = recordAtColumn(i, &isDerivative); Shared::ExpiringPointer function = functionStore()->modelForRecord(record); - if (function->plotType() == ContinuousFunction::PlotType::Parametric) { - bool isX = false; - if (i+1 < numberOfColumns() && typeAtLocation(i+1,j) == k_functionTitleCellType) { - isX = recordAtColumn(i+1) == record; - function = functionStore()->modelForRecord(record); // To pass Expiring pointer assertions - } - if (isX) { - // This is the parametric function x column title - function->name(bufferName, bufferNameSize); - myFunctionCell->setHorizontalAlignment(1.0f); - } else { - // This is the parametric function y column title - myFunctionCell->setHorizontalAlignment(0.0f); - strlcpy(bufferName, "(t)", bufferNameSize); - } + myFunctionCell->setHorizontalAlignment(0.5f); + if (isDerivative) { + function->derivativeNameWithArgument(bufferName, bufferNameSize); } else { - myFunctionCell->setHorizontalAlignment(0.5f); - if (isDerivative) { - function->derivativeNameWithArgument(bufferName, bufferNameSize); - } else { - function->nameWithArgument(bufferName, bufferNameSize); - } + function->nameWithArgument(bufferName, bufferNameSize); } myFunctionCell->setText(bufferName); myFunctionCell->setColor(function->color()); @@ -175,8 +159,7 @@ int ValuesController::numberOfColumnsForRecord(Ion::Storage::Record record) cons ExpiringPointer f = functionStore()->modelForRecord(record); ContinuousFunction::PlotType plotType = f->plotType(); return 1 + - (plotType == ContinuousFunction::PlotType::Cartesian && f->displayDerivative()) + - (plotType == ContinuousFunction::PlotType::Parametric); + (plotType == ContinuousFunction::PlotType::Cartesian && f->displayDerivative()); } Shared::Interval * ValuesController::intervalAtColumn(int columnIndex) { @@ -228,23 +211,37 @@ ViewController * ValuesController::functionParameterController() { return &m_functionParameterController; } -double ValuesController::evaluationOfAbscissaAtColumn(double abscissa, int columnIndex) { +void ValuesController::printEvaluationOfAbscissaAtColumn(double abscissa, int columnIndex, char * buffer, const int bufferSize) { bool isDerivative = false; + double evaluationX = NAN; + double evaluationY = NAN; Ion::Storage::Record record = recordAtColumn(columnIndex, &isDerivative); Shared::ExpiringPointer function = functionStore()->modelForRecord(record); Poincare::Context * context = textFieldDelegateApp()->localContext(); + bool isParametric = function->plotType() == ContinuousFunction::PlotType::Parametric; if (isDerivative) { - return function->approximateDerivative(abscissa, context); + evaluationY = function->approximateDerivative(abscissa, context); + } else { + Poincare::Coordinate2D eval = function->evaluate2DAtParameter(abscissa, context); + evaluationY = eval.x2(); + if (isParametric) { + evaluationX = eval.x1(); + } } - Poincare::Coordinate2D eval = function->evaluate2DAtParameter(abscissa, context); - if (function->plotType() != ContinuousFunction::PlotType::Parametric - || (columnIndex == numberOfColumns() - 1 - || !((typeAtLocation(columnIndex+1, 0) == k_functionTitleCellType) - && recordAtColumn(columnIndex+1) == record))) - { - return eval.x2(); + int numberOfChar = 0; + if (isParametric) { + assert(numberOfChar < bufferSize-1); + buffer[numberOfChar++] = '('; + numberOfChar += PoincareHelpers::ConvertFloatToText(evaluationX, buffer+numberOfChar, bufferSize-numberOfChar, Preferences::LargeNumberOfSignificantDigits); + assert(numberOfChar < bufferSize-1); + buffer[numberOfChar++] = ';'; + } + numberOfChar += PoincareHelpers::ConvertFloatToText(evaluationY, buffer+numberOfChar, bufferSize-numberOfChar, Preferences::LargeNumberOfSignificantDigits); + if (isParametric) { + assert(numberOfChar+1 < bufferSize-1); + buffer[numberOfChar++] = ')'; + buffer[numberOfChar] = 0; } - return eval.x1(); } void ValuesController::setStartEndMessages(Shared::IntervalParameterController * controller, int column) { diff --git a/apps/graph/values/values_controller.h b/apps/graph/values/values_controller.h index 4bdf23357..6320329ac 100644 --- a/apps/graph/values/values_controller.h +++ b/apps/graph/values/values_controller.h @@ -47,8 +47,8 @@ private: Shared::ContinuousFunction::PlotType plotTypeAtColumn(int * i) const; int maxNumberOfCells() override; int maxNumberOfFunctions() override; - double evaluationOfAbscissaAtColumn(double abscissa, int columnIndex) override; Shared::Hideable * hideableCellFromType(HighlightCell * cell, int type); + void printEvaluationOfAbscissaAtColumn(double abscissa, int columnIndex, char * buffer, const int bufferSize) override; ContinuousFunctionStore * functionStore() const override { return static_cast(Shared::ValuesController::functionStore()); } Shared::BufferFunctionTitleCell * functionTitleCells(int j) override; EvenOddBufferTextCell * floatCells(int j) override; diff --git a/apps/sequence/values/values_controller.cpp b/apps/sequence/values/values_controller.cpp index 50960fe73..f14c8f0d3 100644 --- a/apps/sequence/values/values_controller.cpp +++ b/apps/sequence/values/values_controller.cpp @@ -1,6 +1,7 @@ #include "values_controller.h" #include #include +#include "../../shared/poincare_helpers.h" #include "../app.h" namespace Sequence { @@ -63,10 +64,10 @@ bool ValuesController::setDataAtLocation(double floatBody, int columnIndex, int return Shared::ValuesController::setDataAtLocation(std::round(floatBody), columnIndex, rowIndex); } -double ValuesController::evaluationOfAbscissaAtColumn(double abscissa, int columnIndex) { +void ValuesController::printEvaluationOfAbscissaAtColumn(double abscissa, int columnIndex, char * buffer, const int bufferSize) { Shared::ExpiringPointer sequence = functionStore()->modelForRecord(recordAtColumn(columnIndex)); Poincare::Coordinate2D xy = sequence->evaluateXYAtParameter(abscissa, textFieldDelegateApp()->localContext()); - return xy.x2(); + Shared::PoincareHelpers::ConvertFloatToText(xy.x2(), buffer, bufferSize, Poincare::Preferences::LargeNumberOfSignificantDigits); } Shared::Interval * ValuesController::intervalAtColumn(int columnIndex) { diff --git a/apps/sequence/values/values_controller.h b/apps/sequence/values/values_controller.h index 48182e4a1..d29037e43 100644 --- a/apps/sequence/values/values_controller.h +++ b/apps/sequence/values/values_controller.h @@ -22,7 +22,7 @@ public: private: void setStartEndMessages(Shared::IntervalParameterController * controller, int column) override; bool setDataAtLocation(double floatBody, int columnIndex, int rowIndex) override; - double evaluationOfAbscissaAtColumn(double abscissa, int columnIndex) override; + void printEvaluationOfAbscissaAtColumn(double abscissa, int columnIndex, char * buffer, const int bufferSize) override; Shared::Interval * intervalAtColumn(int columnIndex) override; I18n::Message valuesParameterMessageAtColumn(int columnIndex) const override; int maxNumberOfCells() override { return k_maxNumberOfCells; } diff --git a/apps/shared/values_controller.cpp b/apps/shared/values_controller.cpp index 590c51a02..7b505ad87 100644 --- a/apps/shared/values_controller.cpp +++ b/apps/shared/values_controller.cpp @@ -1,6 +1,5 @@ #include "values_controller.h" #include "function_app.h" -#include "poincare_helpers.h" #include #include @@ -125,14 +124,13 @@ void ValuesController::willDisplayCellAtLocation(HighlightCell * cell, int i, in willDisplayCellAtLocationWithDisplayMode(cell, i, j, Preferences::sharedPreferences()->displayMode()); // The cell is not a title cell and not editable if (typeAtLocation(i,j) == k_notEditableValueCellType) { - constexpr int precision = Preferences::LargeNumberOfSignificantDigits; - char buffer[PrintFloat::bufferSizeForFloatsWithPrecision(precision)]; + char buffer[2*PrintFloat::bufferSizeForFloatsWithPrecision(Preferences::LargeNumberOfSignificantDigits)+3];//(??;??) // Special case: last row if (j == numberOfElementsInColumn(i) + 1) { buffer[0] = 0; } else { double x = intervalAtColumn(i)->element(j-1); - PoincareHelpers::ConvertFloatToText(evaluationOfAbscissaAtColumn(x, i), buffer, cellBufferSize(i), precision); + printEvaluationOfAbscissaAtColumn(x, i, buffer, cellBufferSize(i)); } static_cast(cell)->setText(buffer); } diff --git a/apps/shared/values_controller.h b/apps/shared/values_controller.h index 2d29c868d..0d9a60a96 100644 --- a/apps/shared/values_controller.h +++ b/apps/shared/values_controller.h @@ -61,7 +61,7 @@ private: Responder * tabController() const override; bool cellAtLocationIsEditable(int columnIndex, int rowIndex) override; double dataAtLocation(int columnIndex, int rowIndex) override; - virtual double evaluationOfAbscissaAtColumn(double abscissa, int columnIndex) = 0; + virtual void printEvaluationOfAbscissaAtColumn(double abscissa, int columnIndex, char * buffer, const int bufferSize) = 0; virtual Interval * intervalAtColumn(int columnIndex) = 0; virtual I18n::Message valuesParameterMessageAtColumn(int columnIndex) const = 0; int maxNumberOfElements() const override {