Revert "Use another workaround to update files tree view"

This reverts commit 0f82c16936.
This commit is contained in:
Vladimir Golovnev (glassez) 2022-11-19 21:44:15 +03:00
parent 1cee69da6c
commit 92af2922c7
No known key found for this signature in database
GPG key ID: 52A2C7DEE2DFA6F7
2 changed files with 84 additions and 7 deletions

View file

@ -221,7 +221,11 @@ void TorrentContentModel::updateFilesProgress(const QVector<qreal> &fp)
m_rootItem->recalculateProgress();
m_rootItem->recalculateAvailability();
emit layoutChanged();
const QVector<ColumnInterval> columns =
{
{TorrentContentModelItem::COL_PROGRESS, TorrentContentModelItem::COL_PROGRESS}
};
notifySubtreeUpdated(index(0, 0), columns);
}
void TorrentContentModel::updateFilesPriorities(const QVector<BitTorrent::DownloadPriority> &fprio)
@ -235,7 +239,12 @@ void TorrentContentModel::updateFilesPriorities(const QVector<BitTorrent::Downlo
for (int i = 0; i < fprio.size(); ++i)
m_filesIndex[i]->setPriority(static_cast<BitTorrent::DownloadPriority>(fprio[i]));
emit layoutChanged();
const QVector<ColumnInterval> columns =
{
{TorrentContentModelItem::COL_NAME, TorrentContentModelItem::COL_NAME},
{TorrentContentModelItem::COL_PRIO, TorrentContentModelItem::COL_PRIO}
};
notifySubtreeUpdated(index(0, 0), columns);
}
void TorrentContentModel::updateFilesAvailability(const QVector<qreal> &fa)
@ -250,7 +259,11 @@ void TorrentContentModel::updateFilesAvailability(const QVector<qreal> &fa)
// Update folders progress in the tree
m_rootItem->recalculateProgress();
emit layoutChanged();
const QVector<ColumnInterval> columns =
{
{TorrentContentModelItem::COL_AVAILABILITY, TorrentContentModelItem::COL_AVAILABILITY}
};
notifySubtreeUpdated(index(0, 0), columns);
}
QVector<BitTorrent::DownloadPriority> TorrentContentModel::getFilePriorities() const
@ -295,13 +308,17 @@ bool TorrentContentModel::setData(const QModelIndex &index, const QVariant &valu
if (currentPrio != newPrio)
{
emit layoutAboutToBeChanged();
item->setPriority(newPrio);
// Update folders progress in the tree
m_rootItem->recalculateProgress();
m_rootItem->recalculateAvailability();
emit layoutChanged();
const QVector<ColumnInterval> columns =
{
{TorrentContentModelItem::COL_NAME, TorrentContentModelItem::COL_NAME},
{TorrentContentModelItem::COL_PRIO, TorrentContentModelItem::COL_PRIO}
};
notifySubtreeUpdated(index, columns);
emit filteredFilesChanged();
return true;
@ -333,9 +350,14 @@ bool TorrentContentModel::setData(const QModelIndex &index, const QVariant &valu
const auto newPrio = static_cast<BitTorrent::DownloadPriority>(value.toInt());
if (currentPrio != newPrio)
{
emit layoutAboutToBeChanged();
item->setPriority(newPrio);
emit layoutChanged();
const QVector<ColumnInterval> columns =
{
{TorrentContentModelItem::COL_NAME, TorrentContentModelItem::COL_NAME},
{TorrentContentModelItem::COL_PRIO, TorrentContentModelItem::COL_PRIO}
};
notifySubtreeUpdated(index, columns);
if ((newPrio == BitTorrent::DownloadPriority::Ignored)
|| (currentPrio == BitTorrent::DownloadPriority::Ignored))
@ -570,3 +592,54 @@ void TorrentContentModel::setupModelData(const BitTorrent::AbstractFileStorage &
endResetModel();
}
void TorrentContentModel::notifySubtreeUpdated(const QModelIndex &index, const QVector<ColumnInterval> &columns)
{
// For best performance, `columns` entries should be arranged from left to right
Q_ASSERT(index.isValid());
// emit itself
for (const ColumnInterval &column : columns)
emit dataChanged(index.siblingAtColumn(column.first()), index.siblingAtColumn(column.last()));
// propagate up the model
QModelIndex parentIndex = parent(index);
while (parentIndex.isValid())
{
for (const ColumnInterval &column : columns)
emit dataChanged(parentIndex.siblingAtColumn(column.first()), parentIndex.siblingAtColumn(column.last()));
parentIndex = parent(parentIndex);
}
// propagate down the model
QVector<QModelIndex> parentIndexes;
if (hasChildren(index))
parentIndexes.push_back(index);
while (!parentIndexes.isEmpty())
{
const QModelIndex parent = parentIndexes.takeLast();
const int childCount = rowCount(parent);
const QModelIndex child = this->index(0, 0, parent);
// emit this generation
for (const ColumnInterval &column : columns)
{
const QModelIndex childTopLeft = child.siblingAtColumn(column.first());
const QModelIndex childBottomRight = child.sibling((childCount - 1), column.last());
emit dataChanged(childTopLeft, childBottomRight);
}
// check generations further down
parentIndexes.reserve(childCount);
for (int i = 0; i < childCount; ++i)
{
const QModelIndex sibling = child.siblingAtRow(i);
if (hasChildren(sibling))
parentIndexes.push_back(sibling);
}
}
}

View file

@ -81,6 +81,10 @@ signals:
void filteredFilesChanged();
private:
using ColumnInterval = IndexInterval<int>;
void notifySubtreeUpdated(const QModelIndex &index, const QVector<ColumnInterval> &columns);
TorrentContentModelFolder *m_rootItem = nullptr;
QVector<TorrentContentModelFile *> m_filesIndex;
QFileIconProvider *m_fileIconProvider = nullptr;