mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
[apps/graph][apps/sequence] In values controller, memoize the number of
columns to improve performance Change-Id: Ie3c545d0198a2f23575bd22fdbf56e9c6b8ff2b8
This commit is contained in:
@@ -62,11 +62,11 @@ App::App(Container * container, Snapshot * snapshot) :
|
||||
m_listFooter(&m_listHeader, &m_listController, &m_listController, ButtonRowController::Position::Bottom, ButtonRowController::Style::EmbossedGrey),
|
||||
m_listHeader(&m_listStackViewController, &m_listFooter, &m_listController),
|
||||
m_listStackViewController(&m_tabViewController, &m_listHeader),
|
||||
m_graphController(&m_graphAlternateEmptyViewController, snapshot->functionStore(), snapshot->graphRange(), snapshot->cursor(), snapshot->modelVersion(), snapshot->rangeVersion(), &m_graphHeader),
|
||||
m_graphController(&m_graphAlternateEmptyViewController, snapshot->functionStore(), snapshot->graphRange(), snapshot->cursor(), snapshot->graphModelVersion(), snapshot->rangeVersion(), &m_graphHeader),
|
||||
m_graphAlternateEmptyViewController(&m_graphHeader, &m_graphController, &m_graphController),
|
||||
m_graphHeader(&m_graphStackViewController, &m_graphAlternateEmptyViewController, &m_graphController),
|
||||
m_graphStackViewController(&m_tabViewController, &m_graphHeader),
|
||||
m_valuesController(&m_valuesAlternateEmptyViewController, snapshot->functionStore(), snapshot->interval(), &m_valuesHeader),
|
||||
m_valuesController(&m_valuesAlternateEmptyViewController, snapshot->functionStore(), snapshot->interval(), snapshot->valuesModelVersion(), &m_valuesHeader),
|
||||
m_valuesAlternateEmptyViewController(&m_valuesHeader, &m_valuesController, &m_valuesController),
|
||||
m_valuesHeader(&m_valuesStackViewController, &m_valuesAlternateEmptyViewController, &m_valuesController),
|
||||
m_valuesStackViewController(&m_tabViewController, &m_valuesHeader),
|
||||
|
||||
@@ -48,6 +48,7 @@ bool DerivativeParameterController::handleEvent(Ion::Events::Event event) {
|
||||
{
|
||||
m_valuesController->selectCellAtLocation(m_valuesController->selectedColumn()-1, m_valuesController->selectedRow());
|
||||
m_function->setDisplayDerivative(false);
|
||||
m_valuesController->updateNumberOfColumns();
|
||||
StackViewController * stack = (StackViewController *)(parentResponder());
|
||||
stack->pop();
|
||||
return true;
|
||||
|
||||
@@ -25,6 +25,7 @@ bool FunctionParameterController::handleEvent(Ion::Events::Event event) {
|
||||
case 0:
|
||||
{
|
||||
m_cartesianFunction->setDisplayDerivative(!m_cartesianFunction->displayDerivative());
|
||||
m_valuesController->updateNumberOfColumns();
|
||||
if (m_cartesianFunction->displayDerivative()) {
|
||||
m_valuesController->selectCellAtLocation(m_valuesController->selectedColumn()+1, m_valuesController->selectedRow());
|
||||
}
|
||||
|
||||
@@ -7,8 +7,8 @@ using namespace Poincare;
|
||||
|
||||
namespace Graph {
|
||||
|
||||
ValuesController::ValuesController(Responder * parentResponder, CartesianFunctionStore * functionStore, Interval * interval, ButtonRowController * header) :
|
||||
Shared::ValuesController(parentResponder, header, I18n::Message::XColumn, &m_intervalParameterController, interval),
|
||||
ValuesController::ValuesController(Responder * parentResponder, CartesianFunctionStore * functionStore, Interval * interval, uint32_t * modelVersion, ButtonRowController * header) :
|
||||
Shared::ValuesController(parentResponder, header, I18n::Message::XColumn, &m_intervalParameterController, interval, modelVersion),
|
||||
m_functionTitleCells{},
|
||||
m_floatCells{},
|
||||
m_functionStore(functionStore),
|
||||
@@ -16,6 +16,7 @@ ValuesController::ValuesController(Responder * parentResponder, CartesianFunctio
|
||||
m_intervalParameterController(this, m_interval),
|
||||
m_derivativeParameterController(this)
|
||||
{
|
||||
updateNumberOfColumns();
|
||||
}
|
||||
|
||||
bool ValuesController::handleEvent(Ion::Events::Event event) {
|
||||
@@ -27,16 +28,6 @@ bool ValuesController::handleEvent(Ion::Events::Event event) {
|
||||
return Shared::ValuesController::handleEvent(event);
|
||||
}
|
||||
|
||||
int ValuesController::numberOfColumns() {
|
||||
int result = 1;
|
||||
for (int i = 0; i < m_functionStore->numberOfActiveFunctions(); i++) {
|
||||
if (m_functionStore->activeFunctionAtIndex(i)->isActive()) {
|
||||
result += 1 + m_functionStore->activeFunctionAtIndex(i)->displayDerivative();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void ValuesController::willDisplayCellAtLocation(HighlightCell * cell, int i, int j) {
|
||||
Shared::ValuesController::willDisplayCellAtLocation(cell, i, j);
|
||||
// The cell is the abscissa title cell:
|
||||
@@ -181,5 +172,15 @@ void ValuesController::unloadView(View * view) {
|
||||
Shared::ValuesController::unloadView(view);
|
||||
}
|
||||
|
||||
void ValuesController::updateNumberOfColumns() {
|
||||
int result = 1;
|
||||
for (int i = 0; i < m_functionStore->numberOfActiveFunctions(); i++) {
|
||||
if (m_functionStore->activeFunctionAtIndex(i)->isActive()) {
|
||||
result += 1 + m_functionStore->activeFunctionAtIndex(i)->displayDerivative();
|
||||
}
|
||||
}
|
||||
m_numberOfColumns = result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -12,12 +12,12 @@ namespace Graph {
|
||||
|
||||
class ValuesController : public Shared::ValuesController {
|
||||
public:
|
||||
ValuesController(Responder * parentResponder, CartesianFunctionStore * functionStore, Shared::Interval * interval, ButtonRowController * header);
|
||||
ValuesController(Responder * parentResponder, CartesianFunctionStore * functionStore, Shared::Interval * interval, uint32_t * modelVersion, ButtonRowController * header);
|
||||
bool handleEvent(Ion::Events::Event event) override;
|
||||
int numberOfColumns() override;
|
||||
void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override;
|
||||
I18n::Message emptyMessage() override;
|
||||
Shared::IntervalParameterController * intervalParameterController() override;
|
||||
void updateNumberOfColumns() override;
|
||||
private:
|
||||
CartesianFunction * functionAtColumn(int i) override;
|
||||
bool isDerivativeColumn(int i);
|
||||
|
||||
@@ -60,11 +60,11 @@ App::App(Container * container, Snapshot * snapshot) :
|
||||
m_listFooter(&m_listHeader, &m_listController, &m_listController, ButtonRowController::Position::Bottom, ButtonRowController::Style::EmbossedGrey),
|
||||
m_listHeader(nullptr, &m_listFooter, &m_listController),
|
||||
m_listStackViewController(&m_tabViewController, &m_listHeader),
|
||||
m_graphController(&m_graphAlternateEmptyViewController, snapshot->sequenceStore(), snapshot->graphRange(), snapshot->cursor(), snapshot->modelVersion(), snapshot->rangeVersion(), &m_graphHeader),
|
||||
m_graphController(&m_graphAlternateEmptyViewController, snapshot->sequenceStore(), snapshot->graphRange(), snapshot->cursor(), snapshot->graphModelVersion(), snapshot->rangeVersion(), &m_graphHeader),
|
||||
m_graphAlternateEmptyViewController(&m_graphHeader, &m_graphController, &m_graphController),
|
||||
m_graphHeader(&m_graphStackViewController, &m_graphAlternateEmptyViewController, &m_graphController),
|
||||
m_graphStackViewController(&m_tabViewController, &m_graphHeader),
|
||||
m_valuesController(&m_valuesAlternateEmptyViewController, snapshot->sequenceStore(), snapshot->interval(), &m_valuesHeader),
|
||||
m_valuesController(&m_valuesAlternateEmptyViewController, snapshot->sequenceStore(), snapshot->interval(), snapshot->valuesModelVersion(), &m_valuesHeader),
|
||||
m_valuesAlternateEmptyViewController(&m_valuesHeader, &m_valuesController, &m_valuesController),
|
||||
m_valuesHeader(nullptr, &m_valuesAlternateEmptyViewController, &m_valuesController),
|
||||
m_valuesStackViewController(&m_tabViewController, &m_valuesHeader),
|
||||
|
||||
@@ -5,8 +5,8 @@ using namespace Shared;
|
||||
|
||||
namespace Sequence {
|
||||
|
||||
ValuesController::ValuesController(Responder * parentResponder, SequenceStore * sequenceStore, Interval * interval, ButtonRowController * header) :
|
||||
Shared::ValuesController(parentResponder, header, I18n::Message::NColumn, &m_intervalParameterController, interval),
|
||||
ValuesController::ValuesController(Responder * parentResponder, SequenceStore * sequenceStore, Interval * interval, uint32_t * modelVersion, ButtonRowController * header) :
|
||||
Shared::ValuesController(parentResponder, header, I18n::Message::NColumn, &m_intervalParameterController, interval, modelVersion),
|
||||
m_sequenceTitleCells{},
|
||||
m_floatCells{},
|
||||
m_sequenceStore(sequenceStore),
|
||||
@@ -15,10 +15,7 @@ ValuesController::ValuesController(Responder * parentResponder, SequenceStore *
|
||||
#endif
|
||||
m_intervalParameterController(this, m_interval)
|
||||
{
|
||||
}
|
||||
|
||||
int ValuesController::numberOfColumns() {
|
||||
return m_sequenceStore->numberOfActiveFunctions()+1;
|
||||
updateNumberOfColumns();
|
||||
}
|
||||
|
||||
void ValuesController::willDisplayCellAtLocation(HighlightCell * cell, int i, int j) {
|
||||
|
||||
@@ -10,8 +10,7 @@ namespace Sequence {
|
||||
|
||||
class ValuesController : public Shared::ValuesController {
|
||||
public:
|
||||
ValuesController(Responder * parentResponder, SequenceStore * sequenceStore, Shared::Interval * interval, ButtonRowController * header);
|
||||
int numberOfColumns() override;
|
||||
ValuesController(Responder * parentResponder, SequenceStore * sequenceStore, Shared::Interval * interval, uint32_t * modelVersion, ButtonRowController * header);
|
||||
void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override;
|
||||
I18n::Message emptyMessage() override;
|
||||
IntervalParameterController * intervalParameterController() override;
|
||||
|
||||
@@ -84,7 +84,7 @@ Poincare::ExpressionLayout * Function::layout() {
|
||||
}
|
||||
|
||||
bool Function::isDefined() {
|
||||
return strlen(m_text) != 0;
|
||||
return m_text[0] != 0;
|
||||
}
|
||||
|
||||
bool Function::isActive() {
|
||||
@@ -96,7 +96,7 @@ void Function::setActive(bool active) {
|
||||
}
|
||||
|
||||
bool Function::isEmpty() {
|
||||
return strlen(m_text) == 0;
|
||||
return m_text[0] == 0;
|
||||
}
|
||||
|
||||
float Function::evaluateAtAbscissa(float x, Poincare::Context * context) const {
|
||||
|
||||
@@ -8,7 +8,8 @@ namespace Shared {
|
||||
FunctionApp::Snapshot::Snapshot() :
|
||||
m_cursor(),
|
||||
m_interval(),
|
||||
m_modelVersion(0),
|
||||
m_graphModelVersion(0),
|
||||
m_valuesModelVersion(0),
|
||||
m_rangeVersion(0)
|
||||
{
|
||||
m_interval.setStart(0);
|
||||
@@ -20,8 +21,12 @@ CurveViewCursor * FunctionApp::Snapshot::cursor() {
|
||||
return &m_cursor;
|
||||
}
|
||||
|
||||
uint32_t * FunctionApp::Snapshot::modelVersion() {
|
||||
return &m_modelVersion;
|
||||
uint32_t * FunctionApp::Snapshot::graphModelVersion() {
|
||||
return &m_graphModelVersion;
|
||||
}
|
||||
|
||||
uint32_t * FunctionApp::Snapshot::valuesModelVersion() {
|
||||
return &m_valuesModelVersion;
|
||||
}
|
||||
|
||||
uint32_t * FunctionApp::Snapshot::rangeVersion() {
|
||||
@@ -36,7 +41,8 @@ void FunctionApp::Snapshot::reset() {
|
||||
m_interval.setStart(0);
|
||||
m_interval.setEnd(10);
|
||||
m_interval.setStep(1);
|
||||
m_modelVersion = 0;
|
||||
m_graphModelVersion = 0;
|
||||
m_valuesModelVersion = 0;
|
||||
m_rangeVersion = 0;
|
||||
setActiveTab(0);
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@ public:
|
||||
public:
|
||||
Snapshot();
|
||||
CurveViewCursor * cursor();
|
||||
uint32_t * modelVersion();
|
||||
uint32_t * graphModelVersion();
|
||||
uint32_t * valuesModelVersion();
|
||||
uint32_t * rangeVersion();
|
||||
Interval * interval();
|
||||
void reset() override;
|
||||
@@ -24,7 +25,8 @@ public:
|
||||
CurveViewCursor m_cursor;
|
||||
Interval m_interval;
|
||||
private:
|
||||
uint32_t m_modelVersion;
|
||||
uint32_t m_graphModelVersion;
|
||||
uint32_t m_valuesModelVersion;
|
||||
uint32_t m_rangeVersion;
|
||||
};
|
||||
virtual ~FunctionApp() = default;
|
||||
|
||||
@@ -12,9 +12,10 @@ Function * FunctionStore::activeFunctionAtIndex(int i) {
|
||||
assert(i>=0 && i<m_numberOfFunctions);
|
||||
int index = 0;
|
||||
for (int k = 0; k < m_numberOfFunctions; k++) {
|
||||
if (functionAtIndex(k)->isActive() && functionAtIndex(k)->isDefined()) {
|
||||
Function * function = functionAtIndex(k);
|
||||
if (function->isActive() && function->isDefined()) {
|
||||
if (i == index) {
|
||||
return functionAtIndex(k);
|
||||
return function;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
@@ -45,7 +46,8 @@ int FunctionStore::numberOfFunctions() {
|
||||
int FunctionStore::numberOfActiveFunctions() {
|
||||
int result = 0;
|
||||
for (int i = 0; i < m_numberOfFunctions; i++) {
|
||||
if (functionAtIndex(i)->isDefined() && functionAtIndex(i)->isActive()) {
|
||||
Function * function = functionAtIndex(i);
|
||||
if (function->isDefined() && function->isActive()) {
|
||||
result++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,12 +8,14 @@ using namespace Poincare;
|
||||
|
||||
namespace Shared {
|
||||
|
||||
ValuesController::ValuesController(Responder * parentResponder, ButtonRowController * header, I18n::Message parameterTitle, IntervalParameterController * intervalParameterController, Interval * interval) :
|
||||
ValuesController::ValuesController(Responder * parentResponder, ButtonRowController * header, I18n::Message parameterTitle, IntervalParameterController * intervalParameterController, Interval * interval, uint32_t * modelVersion) :
|
||||
EditableCellTableViewController(parentResponder),
|
||||
ButtonRowDelegate(header, nullptr),
|
||||
m_interval(interval),
|
||||
m_numberOfColumns(0),
|
||||
m_abscissaTitleCell(nullptr),
|
||||
m_abscissaCells{},
|
||||
m_modelVersion(modelVersion),
|
||||
m_abscissaParameterController(this, intervalParameterController, parameterTitle),
|
||||
m_setIntervalButton(this, I18n::Message::IntervalSet, Invocation([](void * context, void * sender) {
|
||||
ValuesController * valuesController = (ValuesController *) context;
|
||||
@@ -27,6 +29,10 @@ const char * ValuesController::title() {
|
||||
return I18n::translate(I18n::Message::ValuesTab);
|
||||
}
|
||||
|
||||
int ValuesController::numberOfColumns() {
|
||||
return m_numberOfColumns;
|
||||
}
|
||||
|
||||
Interval * ValuesController::interval() {
|
||||
return m_interval;
|
||||
}
|
||||
@@ -228,6 +234,11 @@ Responder * ValuesController::defaultController() {
|
||||
}
|
||||
|
||||
void ValuesController::viewWillAppear() {
|
||||
uint32_t newModelVersion = functionStore()->storeChecksum();
|
||||
if (*m_modelVersion != newModelVersion) {
|
||||
*m_modelVersion = newModelVersion;
|
||||
updateNumberOfColumns();
|
||||
}
|
||||
EditableCellTableViewController::viewWillAppear();
|
||||
header()->setSelectedButton(-1);
|
||||
}
|
||||
@@ -313,5 +324,9 @@ void ValuesController::unloadView(View * view) {
|
||||
EditableCellTableViewController::unloadView(view);
|
||||
}
|
||||
|
||||
void ValuesController::updateNumberOfColumns() {
|
||||
m_numberOfColumns = 1+functionStore()->numberOfActiveFunctions();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -15,9 +15,10 @@ namespace Shared {
|
||||
|
||||
class ValuesController : public EditableCellTableViewController, public ButtonRowDelegate, public AlternateEmptyViewDelegate {
|
||||
public:
|
||||
ValuesController(Responder * parentResponder, ButtonRowController * header, I18n::Message parameterTitle, IntervalParameterController * intervalParameterController, Interval * interval);
|
||||
ValuesController(Responder * parentResponder, ButtonRowController * header, I18n::Message parameterTitle, IntervalParameterController * intervalParameterController, Interval * interval, uint32_t * modelVersion);
|
||||
const char * title() override;
|
||||
Interval * interval();
|
||||
int numberOfColumns() override;
|
||||
virtual bool handleEvent(Ion::Events::Event event) override;
|
||||
void didBecomeFirstResponder() override;
|
||||
void willExitResponderChain(Responder * nextFirstResponder) override;
|
||||
@@ -45,7 +46,9 @@ protected:
|
||||
bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override;
|
||||
View * loadView() override;
|
||||
void unloadView(View * view) override;
|
||||
virtual void updateNumberOfColumns();
|
||||
Interval * m_interval;
|
||||
int m_numberOfColumns;
|
||||
private:
|
||||
virtual Function * functionAtColumn(int i);
|
||||
Responder * tabController() const override;
|
||||
@@ -66,6 +69,7 @@ private:
|
||||
EvenOddEditableTextCell * m_abscissaCells[k_maxNumberOfAbscissaCells];
|
||||
virtual FunctionStore * functionStore() const = 0;
|
||||
virtual ValuesFunctionParameterController * functionParameterController() = 0;
|
||||
uint32_t * m_modelVersion;
|
||||
ValuesParameterController m_abscissaParameterController;
|
||||
Button m_setIntervalButton;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user