aboutsummaryrefslogtreecommitdiffstats
path: root/gui/treemodel.cc
diff options
context:
space:
mode:
authorSergiusz Bazanski <q3k@q3k.org>2018-08-01 03:31:06 +0100
committerSergiusz Bazanski <q3k@q3k.org>2018-08-01 03:31:06 +0100
commite423cceba81288ce1d9a8ed1ea2df2dd7660cf3f (patch)
tree4ea8693d13b13777fdf8eb7250276d1cfb8a5af1 /gui/treemodel.cc
parentf9d30bcdea72e4860361d8ab350282703dc3bfcf (diff)
downloadnextpnr-e423cceba81288ce1d9a8ed1ea2df2dd7660cf3f.tar.gz
nextpnr-e423cceba81288ce1d9a8ed1ea2df2dd7660cf3f.tar.bz2
nextpnr-e423cceba81288ce1d9a8ed1ea2df2dd7660cf3f.zip
gui: treemodel: bail early on empty children updates in IdStringList
Diffstat (limited to 'gui/treemodel.cc')
-rw-r--r--gui/treemodel.cc18
1 files changed, 16 insertions, 2 deletions
diff --git a/gui/treemodel.cc b/gui/treemodel.cc
index bf7d81a3..35221231 100644
--- a/gui/treemodel.cc
+++ b/gui/treemodel.cc
@@ -56,6 +56,8 @@ std::vector<QString> IdStringList::alphaNumSplit(const QString &str)
void IdStringList::updateElements(Context *ctx, std::vector<IdString> elements)
{
+ bool changed = false;
+
// For any elements that are not yet in managed_, created them.
std::unordered_set<IdString> element_set;
for (auto elem : elements) {
@@ -64,17 +66,29 @@ void IdStringList::updateElements(Context *ctx, std::vector<IdString> elements)
if (existing == managed_.end()) {
auto item = new IdStringItem(ctx, elem, this, child_type_);
managed_.emplace(elem, std::unique_ptr<IdStringItem>(item));
+ changed = true;
}
}
- children_.clear();
// For any elements that are in managed_ but not in new, delete them.
for (auto &pair : managed_) {
if (element_set.count(pair.first) != 0) {
- children_.push_back(pair.second.get());
continue;
}
managed_.erase(pair.first);
+ changed = true;
+ }
+
+ // Return early if there are no changes.
+ if (!changed)
+ return;
+
+ // Rebuild children list.
+ children_.clear();
+ for (auto &pair : managed_) {
+ if (element_set.count(pair.first) != 0) {
+ children_.push_back(pair.second.get());
+ }
}
// Sort new children