From 2b0a720863a26faebdc240f4db29dd39c7a035b6 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 7 Feb 2020 13:39:35 -0500 Subject: fixed sorting not emitting layout events and fixing persistent indexes --- src/filetreeitem.cpp | 2 +- src/filetreeitem.h | 6 +++++- src/filetreemodel.cpp | 16 +++++++++++----- src/filetreemodel.h | 1 + 4 files changed, 18 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/filetreeitem.cpp b/src/filetreeitem.cpp index 8602ea6d..9eff9564 100644 --- a/src/filetreeitem.cpp +++ b/src/filetreeitem.cpp @@ -178,7 +178,7 @@ public: void FileTreeItem::sort() { - sort(m_model->sortInfo().column, m_model->sortInfo().order); + m_model->sortItem(*this); } void FileTreeItem::sort(int column, Qt::SortOrder order) diff --git a/src/filetreeitem.h b/src/filetreeitem.h index 375a05c4..e173a849 100644 --- a/src/filetreeitem.h +++ b/src/filetreeitem.h @@ -216,9 +216,13 @@ public: void setExpanded(bool b) { + if (m_expanded == b) { + return; + } + m_expanded = b; - if (m_sortingStale) { + if (m_expanded && m_sortingStale) { sort(); } } diff --git a/src/filetreemodel.cpp b/src/filetreemodel.cpp index 01a10afc..40cded09 100644 --- a/src/filetreemodel.cpp +++ b/src/filetreemodel.cpp @@ -208,6 +208,7 @@ QModelIndex FileTreeModel::index( { if (auto* parentItem=itemFromIndex(parentIndex)) { if (row < 0 || row >= parentItem->children().size()) { + log::error("row {} out of range for {}", row, parentItem->debugName()); return {}; } @@ -378,13 +379,10 @@ Qt::ItemFlags FileTreeModel::flags(const QModelIndex& index) const return f; } -void FileTreeModel::sort(int column, Qt::SortOrder order) +void FileTreeModel::sortItem(FileTreeItem& item) { emit layoutAboutToBeChanged(); - m_sort.column = column; - m_sort.order = order; - const auto oldList = persistentIndexList(); std::vector> oldItems; @@ -396,7 +394,7 @@ void FileTreeModel::sort(int column, Qt::SortOrder order) oldItems.push_back({itemFromIndex(index), index.column()}); } - m_root->sort(column, order); + item.sort(m_sort.column, m_sort.order); QModelIndexList newList; newList.reserve(itemCount); @@ -411,6 +409,14 @@ void FileTreeModel::sort(int column, Qt::SortOrder order) emit layoutChanged({}, QAbstractItemModel::VerticalSortHint); } +void FileTreeModel::sort(int column, Qt::SortOrder order) +{ + m_sort.column = column; + m_sort.order = order; + + sortItem(*m_root); +} + FileTreeItem* FileTreeModel::itemFromIndex(const QModelIndex& index) const { if (!index.isValid()) { diff --git a/src/filetreemodel.h b/src/filetreemodel.h index deb6d092..dfee597f 100644 --- a/src/filetreemodel.h +++ b/src/filetreemodel.h @@ -70,6 +70,7 @@ public: void sort(int column, Qt::SortOrder order=Qt::AscendingOrder) override; FileTreeItem* itemFromIndex(const QModelIndex& index) const; + void sortItem(FileTreeItem& item); private: class Range; -- cgit v1.3.1