From 68299281d3f5839dbe69d7c6825ec9aeabbd075d Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Sun, 4 Apr 2021 15:27:26 +0800 Subject: [PATCH] Spreadsheet: do not create string property for empty cell Otherwise may cause massive slow down when, for example, the user changes the entire row/column color, which results in large amount of empty cells. --- src/Mod/Spreadsheet/App/Cell.cpp | 7 ++++++- src/Mod/Spreadsheet/App/Sheet.cpp | 8 +++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/Mod/Spreadsheet/App/Cell.cpp b/src/Mod/Spreadsheet/App/Cell.cpp index a4ab7cb35c..4cfdd0d085 100644 --- a/src/Mod/Spreadsheet/App/Cell.cpp +++ b/src/Mod/Spreadsheet/App/Cell.cpp @@ -288,6 +288,8 @@ void Cell::setContent(const char * value) clearException(); if (value) { if (owner->sheet()->isRestoring()) { + if (value[0] == '\0' || (value[0] == '\'' && value[1] == '\0')) + return; expression.reset(new App::StringExpression(owner->sheet(), value)); setUsed(EXPRESSION_SET, true); return; @@ -302,7 +304,10 @@ void Cell::setContent(const char * value) } } else if (*value == '\'') { - newExpr = std::make_unique(owner->sheet(), value + 1); + if (value[1] == '\0') + value = nullptr; + else + newExpr = std::make_unique(owner->sheet(), value + 1); } else if (*value != '\0') { // check if value is just a number diff --git a/src/Mod/Spreadsheet/App/Sheet.cpp b/src/Mod/Spreadsheet/App/Sheet.cpp index 273fdce1b3..e974e522b2 100644 --- a/src/Mod/Spreadsheet/App/Sheet.cpp +++ b/src/Mod/Spreadsheet/App/Sheet.cpp @@ -683,10 +683,12 @@ void Sheet::updateProperty(CellAddress key) else { std::string s; - if (cell->getStringContent(s)) + if (cell->getStringContent(s) && !s.empty()) output.reset(new StringExpression(this, s)); - else - output.reset(new StringExpression(this, "")); + else { + this->removeDynamicProperty(key.toString().c_str()); + return; + } } /* Eval returns either NumberExpression or StringExpression, or