From 6c4e237d4b43db5c3f9dc01f8c0d3313f3bd2605 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sun, 19 Jul 2020 16:48:31 -0400 Subject: fixed crash because items were sorted while being expanded when expanding all or updating the tree, only sort once at the end cache file types --- src/filetreemodel.cpp | 59 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 14 deletions(-) (limited to 'src/filetreemodel.cpp') diff --git a/src/filetreemodel.cpp b/src/filetreemodel.cpp index 11901c43..8790f981 100644 --- a/src/filetreemodel.cpp +++ b/src/filetreemodel.cpp @@ -196,13 +196,13 @@ void* makeInternalPointer(FileTreeItem* item) FileTreeModel::FileTreeModel(OrganizerCore& core, QObject* parent) : QAbstractItemModel(parent), m_core(core), m_enabled(true), m_root(FileTreeItem::createDirectory(this, nullptr, L"", L"")), - m_flags(NoFlags), m_fullyLoaded(false) + m_flags(NoFlags), m_fullyLoaded(false), m_sortingEnabled(true) { m_root->setExpanded(true); + m_sortTimer.setSingleShot(true); connect(&m_removeTimer, &QTimer::timeout, [&]{ removeItems(); }); connect(&m_sortTimer, &QTimer::timeout, [&]{ sortItems(); }); - connect(&m_iconPendingTimer, &QTimer::timeout, [&]{ updatePendingIcons(); }); } @@ -212,6 +212,7 @@ void FileTreeModel::refresh() m_fullyLoaded = false; update(*m_root, *m_core.directoryStructure(), L"", false); + sortItem(*m_root, false); } void FileTreeModel::clear() @@ -253,6 +254,17 @@ void FileTreeModel::setEnabled(bool b) m_enabled = b; } +void FileTreeModel::aboutToExpandAll() +{ + m_sortingEnabled = false; +} + +void FileTreeModel::expandedAll() +{ + m_sortingEnabled = true; + sortItem(*m_root, false); +} + const FileTreeModel::SortInfo& FileTreeModel::sortInfo() const { return m_sort; @@ -360,6 +372,10 @@ void FileTreeModel::doFetchMore(const QModelIndex& parent, bool forFetch) const auto parentPath = item->dataRelativeParentPath(); update(*item, *parentEntry, parentPath.toStdWString(), forFetch); + + if (!forFetch) { + sortItem(*item, false); + } } QVariant FileTreeModel::data(const QModelIndex& index, int role) const @@ -485,7 +501,7 @@ void FileTreeModel::sort(int column, Qt::SortOrder order) m_sort.column = column; m_sort.order = order; - sortItem(*m_root, false); + sortItem(*m_root, true); } FileTreeItem* FileTreeModel::itemFromIndex(const QModelIndex& index) const @@ -558,11 +574,15 @@ void FileTreeModel::update( } if (added) { + parentItem.makeSortingStale(); + // see comment at the top of this file - if (forFetching) - queueSortItem(&parentItem); - else - sortItem(parentItem, true); + if (forFetching) { + // don't pass a specific item, this will start a timer and re-sort the + // whole tree, which is faster than potentially queuing every single + // node if the whole tree is expanded + queueSortItem(nullptr); + } } } @@ -873,21 +893,32 @@ void FileTreeModel::removeItems() void FileTreeModel::queueSortItem(FileTreeItem* item) { - m_sortItems.push_back(item); + if (!m_sortingEnabled) { + return; + } + + if (item) { + m_sortItems.push_back(item); + } + m_sortTimer.start(1); } void FileTreeModel::sortItems() { // see comment at the top of this file - trace(log::debug("sort item timer: sorting {} items", m_sortItems.size())); - auto copy = std::move(m_sortItems); - m_sortItems.clear(); - m_sortTimer.stop(); + if (m_sortItems.empty()) { + sortItem(*m_root, false); + } else { + log::debug("sort item timer: sorting {} items", m_sortItems.size()); - for (auto&& f : copy) { - sortItem(*f, true); + auto items = std::move(m_sortItems); + m_sortItems.clear(); + + for (auto* item : items) { + sortItem(*item, false); + } } } -- cgit v1.3.1 From 0c7265be4f897834fc6126068c1423b6d2defdaf Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Mon, 20 Jul 2020 19:02:14 -0400 Subject: only sort once at the end when fully loading for search temporarily disable filtering completely when fully loading instead of just disabling recursive filtering, this could close already expanded nodes if their parent directories didn't match --- src/datatab.cpp | 4 ++-- src/filetreemodel.cpp | 10 ++++++---- src/filetreemodel.h | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) (limited to 'src/filetreemodel.cpp') diff --git a/src/datatab.cpp b/src/datatab.cpp index af7eb18f..21c205e5 100644 --- a/src/datatab.cpp +++ b/src/datatab.cpp @@ -118,9 +118,9 @@ void DataTab::updateTree() void DataTab::ensureFullyLoaded() { if (!m_filetree->fullyLoaded()) { - m_filter.proxyModel()->setRecursiveFilteringEnabled(false); + m_filter.setFilteringEnabled(false); m_filetree->ensureFullyLoaded(); - m_filter.proxyModel()->setRecursiveFilteringEnabled(true); + m_filter.setFilteringEnabled(true); } } diff --git a/src/filetreemodel.cpp b/src/filetreemodel.cpp index 8790f981..59025479 100644 --- a/src/filetreemodel.cpp +++ b/src/filetreemodel.cpp @@ -227,7 +227,7 @@ void FileTreeModel::clear() void FileTreeModel::recursiveFetchMore(const QModelIndex& m) { if (canFetchMore(m)) { - doFetchMore(m, false); + doFetchMore(m, false, false); } for (int i=0; idataRelativeParentPath(); update(*item, *parentEntry, parentPath.toStdWString(), forFetch); - if (!forFetch) { + if (!forFetch && doSort) { sortItem(*item, false); } } diff --git a/src/filetreemodel.h b/src/filetreemodel.h index 4894e4be..73a18d91 100644 --- a/src/filetreemodel.h +++ b/src/filetreemodel.h @@ -119,7 +119,7 @@ private: FileTreeItem& parentItem, const MOShared::DirectoryEntry& parentEntry, const std::wstring& parentPath, bool forFetching); - void doFetchMore(const QModelIndex& parent, bool forFetch); + void doFetchMore(const QModelIndex& parent, bool forFetch, bool doSort); void queueRemoveItem(FileTreeItem* item); void removeItems(); -- cgit v1.3.1