diff --git a/src/Mod/Spreadsheet/App/Cell.cpp b/src/Mod/Spreadsheet/App/Cell.cpp index 4daa1068e..d2545684d 100644 --- a/src/Mod/Spreadsheet/App/Cell.cpp +++ b/src/Mod/Spreadsheet/App/Cell.cpp @@ -161,6 +161,8 @@ void Cell::setExpression(Expression *expr) /* Update dependencies */ owner->addDependencies(address); + + owner->rebuildDocDepList(); } /** diff --git a/src/Mod/Spreadsheet/App/Expression.h b/src/Mod/Spreadsheet/App/Expression.h index 7827cc451..b9e12b9d7 100644 --- a/src/Mod/Spreadsheet/App/Expression.h +++ b/src/Mod/Spreadsheet/App/Expression.h @@ -506,10 +506,10 @@ public: void renameDocument(const std::string &oldName, const std::string &newName); -protected: - const App::Property *getProperty() const; +protected: + Path var; /**< Variable name */ }; diff --git a/src/Mod/Spreadsheet/App/PropertySheet.cpp b/src/Mod/Spreadsheet/App/PropertySheet.cpp index 0826fb112..595cce611 100644 --- a/src/Mod/Spreadsheet/App/PropertySheet.cpp +++ b/src/Mod/Spreadsheet/App/PropertySheet.cpp @@ -77,6 +77,34 @@ private: std::string newName; }; +class BuildDocDepsExpressionVisitor : public ExpressionVisitor { +public: + + BuildDocDepsExpressionVisitor(std::set & _docDeps) + : docDeps(_docDeps) + { + + } + + void visit(Expression * node) { + VariableExpression *expr = freecad_dynamic_cast(node); + + if (expr) { + const App::Property * prop = expr->getProperty(); + + if (prop) { + App::DocumentObject * docObj = freecad_dynamic_cast(prop->getContainer()); + + if (docObj) + docDeps.insert(docObj); + } + } + } + +private: + std::set & docDeps; +}; + class RelabelDocumentExpressionVisitor : public ExpressionVisitor { public: @@ -436,6 +464,8 @@ void PropertySheet::clear(CellAddress address) // Erase from internal struct data.erase(i); + + rebuildDocDepList(); } void PropertySheet::moveCell(CellAddress currPos, CellAddress newPos) @@ -461,6 +491,8 @@ void PropertySheet::moveCell(CellAddress currPos, CellAddress newPos) data[newPos] = cell; addDependencies(newPos); setDirty(newPos); + + rebuildDocDepList(); } } @@ -813,11 +845,6 @@ void PropertySheet::addDependencies(CellAddress key) documentObjectName[docObject] = docObject->Label.getValue(); documentName[docObject->getDocument()] = docObject->getDocument()->Label.getValue(); - - if (docObject != owner) { - docDeps.resize(docDeps.size() + 1); - docDeps[docDeps.size() - 1] = docObject; - } } // Observe document to trach changes to the property @@ -1046,8 +1073,27 @@ const std::set &PropertySheet::getDeps(CellAddress pos) const void PropertySheet::recomputeDependencies(CellAddress key) { + Signaller signaller(*this); + removeDependencies(key); addDependencies(key); + rebuildDocDepList(); +} + +void PropertySheet::rebuildDocDepList() +{ + Signaller signaller(*this); + + docDeps.clear(); + BuildDocDepsExpressionVisitor v(docDeps); + + std::map::iterator i = data.begin(); + + /* Resolve all cells */ + while (i != data.end()) { + i->second->visit(v); + ++i; + } } PyObject *PropertySheet::getPyObject() diff --git a/src/Mod/Spreadsheet/App/PropertySheet.h b/src/Mod/Spreadsheet/App/PropertySheet.h index 07402dad5..7717ab60f 100644 --- a/src/Mod/Spreadsheet/App/PropertySheet.h +++ b/src/Mod/Spreadsheet/App/PropertySheet.h @@ -123,7 +123,7 @@ public: const std::set &getDeps(CellAddress pos) const; - const std::vector & getDocDeps() const { return docDeps; } + const std::set & getDocDeps() const { return docDeps; } class Signaller { public: @@ -184,6 +184,8 @@ private: void recomputeDependants(const App::DocumentObject * docObj); + void rebuildDocDepList(); + /* Cell dependencies, i.e when a change occurs to property given in key, the set of addresses needs to be recomputed. */ @@ -201,7 +203,7 @@ private: std::map > cellToDocumentObjectMap; /* Other document objects the sheet depends on */ - std::vector docDeps; + std::set docDeps; /* Name of document objects, used for renaming */ std::map documentObjectName; diff --git a/src/Mod/Spreadsheet/App/Sheet.cpp b/src/Mod/Spreadsheet/App/Sheet.cpp index 0ffd3baed..60607fcc6 100644 --- a/src/Mod/Spreadsheet/App/Sheet.cpp +++ b/src/Mod/Spreadsheet/App/Sheet.cpp @@ -796,7 +796,9 @@ App::DocumentObjectExecReturn *Sheet::execute(void) currRow.purgeTouched(); currColumn.purgeTouched(); - docDeps.setValues(cells.getDocDeps()); + std::set ds(cells.getDocDeps()); + std::vector dv(ds.begin(), ds.end()); + docDeps.setValues(dv); purgeTouched();