From e423cceba81288ce1d9a8ed1ea2df2dd7660cf3f Mon Sep 17 00:00:00 2001 From: Sergiusz Bazanski Date: Wed, 1 Aug 2018 03:31:06 +0100 Subject: gui: treemodel: bail early on empty children updates in IdStringList --- gui/treemodel.cc | 18 ++++++++++++++++-- 1 file 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 IdStringList::alphaNumSplit(const QString &str) void IdStringList::updateElements(Context *ctx, std::vector elements) { + bool changed = false; + // For any elements that are not yet in managed_, created them. std::unordered_set element_set; for (auto elem : elements) { @@ -64,17 +66,29 @@ void IdStringList::updateElements(Context *ctx, std::vector elements) if (existing == managed_.end()) { auto item = new IdStringItem(ctx, elem, this, child_type_); managed_.emplace(elem, std::unique_ptr(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 -- cgit v1.2.3