From 82cc488a18e54d27b10f8fea1cc7f5c435af316e Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Mon, 20 Jul 2020 20:01:46 -0400 Subject: conflict model didn't change persistent indexes when sorting --- src/modinfodialogconflictsmodels.cpp | 72 ++++++++++++++++++++++++++++++------ 1 file changed, 60 insertions(+), 12 deletions(-) (limited to 'src/modinfodialogconflictsmodels.cpp') diff --git a/src/modinfodialogconflictsmodels.cpp b/src/modinfodialogconflictsmodels.cpp index e8ad19ad..17fdef90 100644 --- a/src/modinfodialogconflictsmodels.cpp +++ b/src/modinfodialogconflictsmodels.cpp @@ -96,6 +96,7 @@ ConflictListModel::ConflictListModel(QTreeView* tree, std::vector column void ConflictListModel::clear() { + beginResetModel(); m_items.clear(); endResetModel(); } @@ -129,16 +130,39 @@ int ConflictListModel::columnCount(const QModelIndex&) const return static_cast(m_columns.size()); } -QVariant ConflictListModel::data(const QModelIndex& index, int role) const +const ConflictItem* ConflictListModel::itemFromIndex( + const QModelIndex& index) const { - if (role == Qt::DisplayRole || role == Qt::FontRole) { - const auto row = index.row(); - if (row < 0) { - return {}; + const auto row = index.row(); + if (row < 0) { + return nullptr; + } + + const auto i = static_cast(row); + if (i >= m_items.size()) { + return nullptr; + } + + return &m_items[i]; +} + +QModelIndex ConflictListModel::indexFromItem( + const ConflictItem* item, int col) +{ + for (std::size_t i=0; i(i), col); } + } + + return {}; +} - const auto i = static_cast(row); - if (i >= m_items.size()) { +QVariant ConflictListModel::data(const QModelIndex& index, int role) const +{ + if (role == Qt::DisplayRole || role == Qt::FontRole) { + const ConflictItem* item = itemFromIndex(index); + if (!item) { return {}; } @@ -152,12 +176,10 @@ QVariant ConflictListModel::data(const QModelIndex& index, int role) const return {}; } - const auto& item = m_items[i]; - if (role == Qt::DisplayRole) { - return (item.*m_columns[c].getText)(); + return (item->*m_columns[c].getText)(); } else if (role == Qt::FontRole) { - if (item.isArchive()) { + if (item->isArchive()) { QFont f = m_tree->font(); f.setItalic(true); return f; @@ -191,7 +213,31 @@ void ConflictListModel::sort(int colIndex, Qt::SortOrder order) m_sortColumn = colIndex; m_sortOrder = order; + emit layoutAboutToBeChanged({}, QAbstractItemModel::VerticalSortHint); + + const auto oldList = persistentIndexList(); + std::vector> oldItems; + + const auto itemCount = oldList.size(); + oldItems.reserve(static_cast(itemCount)); + + for (int i=0; i(i)]; + newList.append(indexFromItem(pair.first, pair.second)); + } + + changePersistentIndexList(oldList, newList); + emit layoutChanged({}, QAbstractItemModel::VerticalSortHint); } @@ -202,8 +248,10 @@ void ConflictListModel::add(ConflictItem item) void ConflictListModel::finished() { + beginResetModel(); endResetModel(); - doSort(); + + sort(m_sortColumn, m_sortOrder); } const ConflictItem* ConflictListModel::getItem(std::size_t row) const -- cgit v1.3.1