mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-11-26 19:26:59 +03:00
Revert "Use another workaround to update files tree view"
This reverts commit 0f82c16936
.
This commit is contained in:
parent
1cee69da6c
commit
92af2922c7
2 changed files with 84 additions and 7 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue