From f995fb0fc22b7490c637a0ef0e9606cbfbbc7b14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Thu, 3 Oct 2019 16:49:57 +0200 Subject: [PATCH] [apps/shared] ValuesController: reload memoized cell when abscissa is edited --- .../editable_cell_table_view_controller.cpp | 1 + .../editable_cell_table_view_controller.h | 1 + apps/shared/values_controller.cpp | 17 +++++++++++++++++ apps/shared/values_controller.h | 1 + 4 files changed, 20 insertions(+) diff --git a/apps/shared/editable_cell_table_view_controller.cpp b/apps/shared/editable_cell_table_view_controller.cpp index 36657c8de..5f83da19c 100644 --- a/apps/shared/editable_cell_table_view_controller.cpp +++ b/apps/shared/editable_cell_table_view_controller.cpp @@ -44,6 +44,7 @@ bool EditableCellTableViewController::textFieldDidFinishEditing(TextField * text } else { selectableTableView()->handleEvent(event); } + didChangeRow(previousRow); if (previousNumberOfElementsInColumn != numberOfElementsInColumn(column)) { // Reload the whole table, if a value was appended. selectableTableView()->reloadData(); diff --git a/apps/shared/editable_cell_table_view_controller.h b/apps/shared/editable_cell_table_view_controller.h index 5ec91d9ae..4b5b9b881 100644 --- a/apps/shared/editable_cell_table_view_controller.h +++ b/apps/shared/editable_cell_table_view_controller.h @@ -25,6 +25,7 @@ protected: static constexpr KDCoordinate k_margin = Metric::TableSeparatorThickness; static constexpr KDCoordinate k_scrollBarMargin = Metric::CommonRightMargin; private: + virtual void didChangeRow(int row) {} virtual bool cellAtLocationIsEditable(int columnIndex, int rowIndex) = 0; virtual bool setDataAtLocation(double floatBody, int columnIndex, int rowIndex) = 0; virtual double dataAtLocation(int columnIndex, int rowIndex) = 0; diff --git a/apps/shared/values_controller.cpp b/apps/shared/values_controller.cpp index b9750eeee..492f41294 100644 --- a/apps/shared/values_controller.cpp +++ b/apps/shared/values_controller.cpp @@ -224,6 +224,23 @@ double ValuesController::dataAtLocation(int columnIndex, int rowIndex) { return intervalAtColumn(columnIndex)->element(rowIndex-1); } +void ValuesController::didChangeRow(int row) { + /* Update the row memoization if it exists */ + // Conversion of coordinates from absolute table to values table + int valuesRow = valuesRowForAbsoluteRow(row); + if (m_firstMemoizedRow > valuesRow || valuesRow >= m_firstMemoizedRow + k_maxNumberOfRows) { + // The changed row is out of the memoized table + return; + } + + int memoizedRow = valuesRow - m_firstMemoizedRow; + int maxI = numberOfValuesColumns() - m_firstMemoizedColumn; + int nbOfMemoizedColumns = numberOfMemoizedColumn(); + for (int i = 0; i < minInt(nbOfMemoizedColumns, maxI); i++) { + fillMemoizedBuffer(absoluteColumnForValuesColumn(m_firstMemoizedColumn + i), row, nbOfMemoizedColumns*memoizedRow+i); + } +} + int ValuesController::numberOfElementsInColumn(int columnIndex) const { return const_cast(this)->intervalAtColumn(columnIndex)->numberOfElements(); } diff --git a/apps/shared/values_controller.h b/apps/shared/values_controller.h index 16a055384..d59b2d104 100644 --- a/apps/shared/values_controller.h +++ b/apps/shared/values_controller.h @@ -91,6 +91,7 @@ private: // EditableCellTableViewController bool cellAtLocationIsEditable(int columnIndex, int rowIndex) override; double dataAtLocation(int columnIndex, int rowIndex) override; + void didChangeRow(int row) override; virtual int numberOfValuesColumns() { return functionStore()->numberOfActiveFunctions(); } int maxNumberOfElements() const override { return Interval::k_maxNumberOfElements;