Spreadsheet: docDeps property was not properly maintained, resulting in spurious links to other objects.

This commit is contained in:
Eivind Kvedalen 2015-02-16 00:16:07 +01:00 committed by wmayer
parent 2621c22409
commit 43e777c7e5
5 changed files with 62 additions and 10 deletions

View File

@ -161,6 +161,8 @@ void Cell::setExpression(Expression *expr)
/* Update dependencies */
owner->addDependencies(address);
owner->rebuildDocDepList();
}
/**

View File

@ -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 */
};

View File

@ -77,6 +77,34 @@ private:
std::string newName;
};
class BuildDocDepsExpressionVisitor : public ExpressionVisitor {
public:
BuildDocDepsExpressionVisitor(std::set<DocumentObject*> & _docDeps)
: docDeps(_docDeps)
{
}
void visit(Expression * node) {
VariableExpression *expr = freecad_dynamic_cast<VariableExpression>(node);
if (expr) {
const App::Property * prop = expr->getProperty();
if (prop) {
App::DocumentObject * docObj = freecad_dynamic_cast<DocumentObject>(prop->getContainer());
if (docObj)
docDeps.insert(docObj);
}
}
}
private:
std::set<App::DocumentObject*> & 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<std::string> &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<CellAddress, Cell* >::iterator i = data.begin();
/* Resolve all cells */
while (i != data.end()) {
i->second->visit(v);
++i;
}
}
PyObject *PropertySheet::getPyObject()

View File

@ -123,7 +123,7 @@ public:
const std::set<std::string> &getDeps(CellAddress pos) const;
const std::vector<App::DocumentObject*> & getDocDeps() const { return docDeps; }
const std::set<App::DocumentObject*> & 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<CellAddress, std::set< std::string > > cellToDocumentObjectMap;
/* Other document objects the sheet depends on */
std::vector<App::DocumentObject*> docDeps;
std::set<App::DocumentObject*> docDeps;
/* Name of document objects, used for renaming */
std::map<const App::DocumentObject*, std::string> documentObjectName;

View File

@ -796,7 +796,9 @@ App::DocumentObjectExecReturn *Sheet::execute(void)
currRow.purgeTouched();
currColumn.purgeTouched();
docDeps.setValues(cells.getDocDeps());
std::set<App::DocumentObject*> ds(cells.getDocDeps());
std::vector<App::DocumentObject*> dv(ds.begin(), ds.end());
docDeps.setValues(dv);
purgeTouched();