summaryrefslogtreecommitdiff
path: root/src/filetreemodel.cpp
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2020-01-14 16:52:33 -0500
committerisanae <14251494+isanae@users.noreply.github.com>2020-02-04 03:33:19 -0500
commit08188830a3cf67924980b4183e2ca7a4b5e12c3d (patch)
tree95f9213db85466dae4d68c7b92f3db94a9b7ba4b /src/filetreemodel.cpp
parentaa63bffd350727041e8fdd4a7fc884fda80a0a4a (diff)
removed LEAK_TRACE stuff
refactored DirectoryEntry for lookup maps filetreemodel: made ensureLoaded() a no-op while refreshing, faster processing for removing rows
Diffstat (limited to 'src/filetreemodel.cpp')
-rw-r--r--src/filetreemodel.cpp66
1 files changed, 53 insertions, 13 deletions
diff --git a/src/filetreemodel.cpp b/src/filetreemodel.cpp
index ed62b8ae..91dd4b90 100644
--- a/src/filetreemodel.cpp
+++ b/src/filetreemodel.cpp
@@ -20,7 +20,7 @@ void trace(F&&)
FileTreeModel::FileTreeModel(OrganizerCore& core, QObject* parent) :
QAbstractItemModel(parent), m_core(core),
m_root(nullptr, 0, L"", L"", FileTreeItem::Directory, L"", L"<root>"),
- m_flags(NoFlags)
+ m_flags(NoFlags), m_isRefreshing(false)
{
m_root.setExpanded(true);
@@ -39,6 +39,9 @@ FileTreeModel::FileTreeModel(OrganizerCore& core, QObject* parent) :
void FileTreeModel::refresh()
{
+ m_isRefreshing = true;
+ Guard g([&]{ m_isRefreshing = false; });
+
if (m_root.hasChildren()) {
TimeThis tt("FileTreeModel::update()");
update(m_root, *m_core.directoryStructure(), L"");
@@ -65,6 +68,10 @@ bool FileTreeModel::showArchives() const
void FileTreeModel::ensureLoaded(FileTreeItem* item) const
{
+ if (m_isRefreshing) {
+ return;
+ }
+
if (!item) {
log::error("ensureLoaded(): item is null");
return;
@@ -247,7 +254,7 @@ void FileTreeModel::updateDirectories(
});
int row = 0;
- std::vector<FileTreeItem*> remove;
+ std::list<FileTreeItem*> remove;
std::unordered_set<std::wstring_view> seen;
for (auto&& item : parentItem.children()) {
@@ -329,26 +336,59 @@ void FileTreeModel::updateDirectories(
parentItem.debugName());
});
- for (auto* toRemove : remove) {
- const auto& cs = parentItem.children();
- for (std::size_t i=0; i<cs.size(); ++i) {
+ QModelIndex parentIndex;
+ int first = -1;
+ int last = -1;
+
+ const auto& cs = parentItem.children();
+ for (std::size_t i=0; i<cs.size(); ++i) {
+ if (remove.empty()) {
+ break;
+ }
+
+ for (auto itor=remove.begin(); itor!=remove.end(); ++itor) {
+ auto* toRemove = *itor;
+
if (cs[i].get() == toRemove) {
- const auto itemIndex = indexFromItem(
- toRemove, static_cast<int>(i), 0);
+ if (!parentIndex.isValid()) {
+ parentIndex = parent(indexFromItem(
+ toRemove, static_cast<int>(i), 0));
+ }
- const auto parentIndex = parent(itemIndex);
- const int first = static_cast<int>(i);
- const int last = static_cast<int>(i);
+ if (first == -1) {
+ first = i;
+ last = i;
+ } else if (i == (last + 1)) {
+ last = i;
+ } else {
+ beginRemoveRows(parentIndex, first, last);
- beginRemoveRows(parentIndex, first, last);
- parentItem.remove(i);
- endRemoveRows();
+ parentItem.remove(
+ static_cast<std::size_t>(first),
+ static_cast<std::size_t>(last - first + 1));
+
+ endRemoveRows();
+
+ first = i;
+ last = i;
+ }
+ remove.erase(itor);
break;
}
}
}
+
+ if (first != -1) {
+ beginRemoveRows(parentIndex, first, last);
+
+ parentItem.remove(
+ static_cast<std::size_t>(first),
+ static_cast<std::size_t>(last - first + 1));
+
+ endRemoveRows();
+ }
}