From d525b29fa5ab18b6fedc159aaa9c2a04b2b8bab4 Mon Sep 17 00:00:00 2001 From: Benjamin Nauck Date: Fri, 1 Jan 2021 18:37:58 +0100 Subject: [PATCH] [Spreadsheet] Remove alias from dynamic properties on removeRows/Columns When removing a row in a spreadsheet which has an assigned alias, the alias will not be removed from the list of dynamic properties. This makes it impossible to create a new alias which uses the same name even if the original was removed (using removeRows/removeColumns) Fixes #4492 --- src/Mod/Spreadsheet/App/PropertySheet.cpp | 24 +++++++++++++++++++++++ src/Mod/Spreadsheet/App/PropertySheet.h | 4 ++++ src/Mod/Spreadsheet/App/Sheet.cpp | 16 +++++++++++++++ src/Mod/Spreadsheet/TestSpreadsheet.py | 16 +++++++++++++++ 4 files changed, 60 insertions(+) diff --git a/src/Mod/Spreadsheet/App/PropertySheet.cpp b/src/Mod/Spreadsheet/App/PropertySheet.cpp index 0a299a7690b5..7ae24ec8492e 100644 --- a/src/Mod/Spreadsheet/App/PropertySheet.cpp +++ b/src/Mod/Spreadsheet/App/PropertySheet.cpp @@ -741,6 +741,18 @@ bool PropertySheet::rowSortFunc(const CellAddress & a, const CellAddress & b) { return false; } +std::vector PropertySheet::getRows(int row, int count) const +{ + std::vector keys; + + for (const auto &i : data) { + auto key = i.first; + if (key.row() >= row && key.row() < row + count) + keys.push_back(key); + } + return keys; +} + void PropertySheet::removeRows(int row, int count) { std::vector keys; @@ -849,6 +861,18 @@ bool PropertySheet::colSortFunc(const CellAddress & a, const CellAddress & b) { return false; } +std::vector PropertySheet::getColumns(int column, int count) const +{ + std::vector keys; + + for (const auto &i : data) { + auto key = i.first; + if (key.col() >= column && key.col() < column + count) + keys.push_back(key); + } + return keys; +} + void PropertySheet::removeColumns(int col, int count) { std::vector keys; diff --git a/src/Mod/Spreadsheet/App/PropertySheet.h b/src/Mod/Spreadsheet/App/PropertySheet.h index 7c92ca6fc854..7e20cf6a7d34 100644 --- a/src/Mod/Spreadsheet/App/PropertySheet.h +++ b/src/Mod/Spreadsheet/App/PropertySheet.h @@ -130,10 +130,14 @@ class SpreadsheetExport PropertySheet : public App::PropertyExpressionContainer void insertRows(int row, int count); + std::vector getRows(int row, int count) const; + void removeRows(int row, int count); void insertColumns(int col, int count); + std::vector getColumns(int column, int count) const; + void removeColumns(int col, int count); virtual unsigned int getMemSize (void) const override; diff --git a/src/Mod/Spreadsheet/App/Sheet.cpp b/src/Mod/Spreadsheet/App/Sheet.cpp index c026780b459c..381418142c24 100644 --- a/src/Mod/Spreadsheet/App/Sheet.cpp +++ b/src/Mod/Spreadsheet/App/Sheet.cpp @@ -1135,6 +1135,14 @@ void Sheet::insertColumns(int col, int count) void Sheet::removeColumns(int col, int count) { + // Remove aliases, if defined + for (auto address : cells.getColumns(col, count)) { + auto cell = getCell(address); + std::string aliasStr; + if (cell && cell->getAlias(aliasStr)) + removeDynamicProperty(aliasStr.c_str()); + } + cells.removeColumns(col, count); updateColumnsOrRows(true,col,-count); } @@ -1163,6 +1171,14 @@ void Sheet::insertRows(int row, int count) void Sheet::removeRows(int row, int count) { + // Remove aliases, if defined + for (auto address : cells.getRows(row, count)) { + auto cell = getCell(address); + std::string aliasStr; + if (cell && cell->getAlias(aliasStr)) + removeDynamicProperty(aliasStr.c_str()); + } + cells.removeRows(row, count); updateColumnsOrRows(false,row,-count); } diff --git a/src/Mod/Spreadsheet/TestSpreadsheet.py b/src/Mod/Spreadsheet/TestSpreadsheet.py index 936a853f5aeb..adda58466d26 100644 --- a/src/Mod/Spreadsheet/TestSpreadsheet.py +++ b/src/Mod/Spreadsheet/TestSpreadsheet.py @@ -1073,6 +1073,14 @@ def testRemoveRowsAlias(self): self.doc.recompute() self.assertEqual(sheet.A3, 3) + def testRemoveRowsAliasReuseName(self): + """ Regression test for issue 4492; deleted aliases remains in database""" + sheet = self.doc.addObject('Spreadsheet::Sheet','Spreadsheet') + sheet.setAlias('B2', 'test') + self.doc.recompute() + sheet.removeRows('2', 1) + sheet.setAlias('B3','test') + def testRemoveColumnsAlias(self): """ Regression test for issue 4429; remove columns from sheet with aliases""" sheet = self.doc.addObject('Spreadsheet::Sheet','Spreadsheet') @@ -1086,6 +1094,14 @@ def testRemoveColumnsAlias(self): self.doc.recompute() self.assertEqual(sheet.C1, 3) + def testRemoveColumnsAliasReuseName(self): + """ Regression test for issue 4492; deleted aliases remains in database""" + sheet = self.doc.addObject('Spreadsheet::Sheet','Spreadsheet') + sheet.setAlias('B2', 'test') + self.doc.recompute() + sheet.removeColumns('B', 1) + sheet.setAlias('C3','test') + def tearDown(self): #closing doc FreeCAD.closeDocument(self.doc.Name)