Expression Completer: speedup property completion using cache

Cache object property list in expression completer, so it is not rebuilt for every requested index. This helps with performance when an object has a large number of properties.
This commit is contained in:
Louis Gombert
2026-01-24 22:11:18 +01:00
parent 1a956b0f01
commit d10bd05689

View File

@@ -286,6 +286,17 @@ public:
return result;
}
// Store named object property list in cache for performance purposes,
// to avoid building it again for each requested index
std::vector<std::pair<const char*, App::Property*>>& getCachedPropertyNamedList(DocumentObject* obj) const {
if (!this->namedPropsCache.contains(obj))
{
this->namedPropsCache[obj];
obj->getPropertyNamedList(this->namedPropsCache[obj]);
}
return this->namedPropsCache[obj];
}
// The completion tree structure created takes into account the current document and object
//
// It is done as such:
@@ -311,7 +322,6 @@ public:
int docSize = (int)docs.size() * 2;
int objSize = 0;
int propSize = 0;
std::vector<std::pair<const char*, App::Property*>> props;
App::Document* doc = nullptr;
App::DocumentObject* obj = nullptr;
const char* propName = nullptr;
@@ -361,7 +371,7 @@ public:
row = idx;
}
// get the properties
cobj->getPropertyNamedList(props);
auto& props = this->getCachedPropertyNamedList(cobj);
propSize = (int)props.size();
// if this is an invalid index, bail out
@@ -469,7 +479,7 @@ public:
}
if (!propName) {
idx = info.prop < 0 ? row : info.prop;
obj->getPropertyNamedList(props);
auto& props = this->getCachedPropertyNamedList(obj);
propSize = (int)props.size();
// return if the property is invalid
if (idx < 0 || idx >= propSize) {
@@ -522,7 +532,6 @@ public:
}
}
}
return;
}
QModelIndex parent(const QModelIndex& index) const override
@@ -682,6 +691,7 @@ public:
}
private:
mutable std::map<DocumentObject*, std::vector<std::pair<const char*, App::Property*>>> namedPropsCache;
std::set<App::DocumentObject*> inList;
std::string currentDoc;
std::string currentObj;