mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-12-28 10:48:19 +03:00
Map selected indexes to source before modify the data
Changing the data may affect the layout of the sort/filter model, which in turn may invalidate the indexes previously obtained from selection model before we process them all. Therefore, we must map all the selected indexes to source before start processing them. PR #19372. Closes #19359.
This commit is contained in:
parent
766fce82b1
commit
41e44d22ea
2 changed files with 28 additions and 9 deletions
|
@ -253,6 +253,16 @@ QModelIndex TransferListWidget::mapToSource(const QModelIndex &index) const
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QModelIndexList TransferListWidget::mapToSource(const QModelIndexList &indexes) const
|
||||||
|
{
|
||||||
|
QModelIndexList result;
|
||||||
|
result.reserve(indexes.size());
|
||||||
|
for (const QModelIndex &index : indexes)
|
||||||
|
result.append(mapToSource(index));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
QModelIndex TransferListWidget::mapFromSource(const QModelIndex &index) const
|
QModelIndex TransferListWidget::mapFromSource(const QModelIndex &index) const
|
||||||
{
|
{
|
||||||
Q_ASSERT(index.isValid());
|
Q_ASSERT(index.isValid());
|
||||||
|
@ -263,11 +273,13 @@ QModelIndex TransferListWidget::mapFromSource(const QModelIndex &index) const
|
||||||
void TransferListWidget::torrentDoubleClicked()
|
void TransferListWidget::torrentDoubleClicked()
|
||||||
{
|
{
|
||||||
const QModelIndexList selectedIndexes = selectionModel()->selectedRows();
|
const QModelIndexList selectedIndexes = selectionModel()->selectedRows();
|
||||||
if ((selectedIndexes.size() != 1) || !selectedIndexes.first().isValid()) return;
|
if ((selectedIndexes.size() != 1) || !selectedIndexes.first().isValid())
|
||||||
|
return;
|
||||||
|
|
||||||
const QModelIndex index = m_listModel->index(mapToSource(selectedIndexes.first()).row());
|
const QModelIndex index = m_listModel->index(mapToSource(selectedIndexes.first()).row());
|
||||||
BitTorrent::Torrent *const torrent = m_listModel->torrentHandle(index);
|
BitTorrent::Torrent *const torrent = m_listModel->torrentHandle(index);
|
||||||
if (!torrent) return;
|
if (!torrent)
|
||||||
|
return;
|
||||||
|
|
||||||
int action;
|
int action;
|
||||||
if (torrent->isFinished())
|
if (torrent->isFinished())
|
||||||
|
@ -871,9 +883,13 @@ QStringList TransferListWidget::askTagsForSelection(const QString &dialogTitle)
|
||||||
|
|
||||||
void TransferListWidget::applyToSelectedTorrents(const std::function<void (BitTorrent::Torrent *const)> &fn)
|
void TransferListWidget::applyToSelectedTorrents(const std::function<void (BitTorrent::Torrent *const)> &fn)
|
||||||
{
|
{
|
||||||
for (const QModelIndex &index : asConst(selectionModel()->selectedRows()))
|
// Changing the data may affect the layout of the sort/filter model, which in turn may invalidate
|
||||||
|
// the indexes previously obtained from selection model before we process them all.
|
||||||
|
// Therefore, we must map all the selected indexes to source before start processing them.
|
||||||
|
const QModelIndexList sourceRows = mapToSource(selectionModel()->selectedRows());
|
||||||
|
for (const QModelIndex &index : sourceRows)
|
||||||
{
|
{
|
||||||
BitTorrent::Torrent *const torrent = m_listModel->torrentHandle(mapToSource(index));
|
BitTorrent::Torrent *const torrent = m_listModel->torrentHandle(index);
|
||||||
Q_ASSERT(torrent);
|
Q_ASSERT(torrent);
|
||||||
fn(torrent);
|
fn(torrent);
|
||||||
}
|
}
|
||||||
|
@ -882,11 +898,13 @@ void TransferListWidget::applyToSelectedTorrents(const std::function<void (BitTo
|
||||||
void TransferListWidget::renameSelectedTorrent()
|
void TransferListWidget::renameSelectedTorrent()
|
||||||
{
|
{
|
||||||
const QModelIndexList selectedIndexes = selectionModel()->selectedRows();
|
const QModelIndexList selectedIndexes = selectionModel()->selectedRows();
|
||||||
if ((selectedIndexes.size() != 1) || !selectedIndexes.first().isValid()) return;
|
if ((selectedIndexes.size() != 1) || !selectedIndexes.first().isValid())
|
||||||
|
return;
|
||||||
|
|
||||||
const QModelIndex mi = m_listModel->index(mapToSource(selectedIndexes.first()).row(), TransferListModel::TR_NAME);
|
const QModelIndex mi = m_listModel->index(mapToSource(selectedIndexes.first()).row(), TransferListModel::TR_NAME);
|
||||||
BitTorrent::Torrent *const torrent = m_listModel->torrentHandle(mi);
|
BitTorrent::Torrent *const torrent = m_listModel->torrentHandle(mi);
|
||||||
if (!torrent) return;
|
if (!torrent)
|
||||||
|
return;
|
||||||
|
|
||||||
// Ask for a new Name
|
// Ask for a new Name
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
|
@ -901,8 +919,7 @@ void TransferListWidget::renameSelectedTorrent()
|
||||||
|
|
||||||
void TransferListWidget::setSelectionCategory(const QString &category)
|
void TransferListWidget::setSelectionCategory(const QString &category)
|
||||||
{
|
{
|
||||||
for (const QModelIndex &index : asConst(selectionModel()->selectedRows()))
|
applyToSelectedTorrents([&category](BitTorrent::Torrent *torrent) { torrent->setCategory(category); });
|
||||||
m_listModel->setData(m_listModel->index(mapToSource(index).row(), TransferListModel::TR_CATEGORY), category, Qt::DisplayRole);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransferListWidget::addSelectionTag(const QString &tag)
|
void TransferListWidget::addSelectionTag(const QString &tag)
|
||||||
|
@ -923,7 +940,8 @@ void TransferListWidget::clearSelectionTags()
|
||||||
void TransferListWidget::displayListMenu()
|
void TransferListWidget::displayListMenu()
|
||||||
{
|
{
|
||||||
const QModelIndexList selectedIndexes = selectionModel()->selectedRows();
|
const QModelIndexList selectedIndexes = selectionModel()->selectedRows();
|
||||||
if (selectedIndexes.isEmpty()) return;
|
if (selectedIndexes.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
auto *listMenu = new QMenu(this);
|
auto *listMenu = new QMenu(this);
|
||||||
listMenu->setAttribute(Qt::WA_DeleteOnClose);
|
listMenu->setAttribute(Qt::WA_DeleteOnClose);
|
||||||
|
|
|
@ -119,6 +119,7 @@ private slots:
|
||||||
private:
|
private:
|
||||||
void wheelEvent(QWheelEvent *event) override;
|
void wheelEvent(QWheelEvent *event) override;
|
||||||
QModelIndex mapToSource(const QModelIndex &index) const;
|
QModelIndex mapToSource(const QModelIndex &index) const;
|
||||||
|
QModelIndexList mapToSource(const QModelIndexList &indexes) const;
|
||||||
QModelIndex mapFromSource(const QModelIndex &index) const;
|
QModelIndex mapFromSource(const QModelIndex &index) const;
|
||||||
bool loadSettings();
|
bool loadSettings();
|
||||||
QVector<BitTorrent::Torrent *> getSelectedTorrents() const;
|
QVector<BitTorrent::Torrent *> getSelectedTorrents() const;
|
||||||
|
|
Loading…
Reference in a new issue