Improve behavior of deleting torrents in transfer list

Avoids accessing invalid pointers.
Closes #12584.
This commit is contained in:
Chocobo1 2020-04-26 09:42:08 +08:00
parent 4e961845cf
commit 7ce83599b4
No known key found for this signature in database
GPG key ID: 210D9C873253A68C
2 changed files with 26 additions and 19 deletions

View file

@ -501,6 +501,17 @@ QVector<BitTorrent::TorrentHandle *> TransferListWidget::getSelectedTorrents() c
return torrents;
}
QVector<BitTorrent::TorrentHandle *> TransferListWidget::getVisibleTorrents() const
{
const int visibleTorrentsCount = m_sortFilterModel->rowCount();
QVector<BitTorrent::TorrentHandle *> torrents;
torrents.reserve(visibleTorrentsCount);
for (int i = 0; i < visibleTorrentsCount; ++i)
torrents << m_listModel->torrentHandle(mapToSource(m_sortFilterModel->index(i, 0)));
return torrents;
}
void TransferListWidget::setSelectedTorrentsLocation()
{
const QVector<BitTorrent::TorrentHandle *> torrents = getSelectedTorrents();
@ -547,12 +558,9 @@ void TransferListWidget::forceStartSelectedTorrents()
void TransferListWidget::startVisibleTorrents()
{
for (int i = 0; i < m_sortFilterModel->rowCount(); ++i) {
BitTorrent::TorrentHandle *const torrent = m_listModel->torrentHandle(mapToSource(m_sortFilterModel->index(i, 0)));
if (torrent)
for (BitTorrent::TorrentHandle *const torrent : asConst(getVisibleTorrents()))
torrent->resume();
}
}
void TransferListWidget::pauseSelectedTorrents()
{
@ -562,12 +570,9 @@ void TransferListWidget::pauseSelectedTorrents()
void TransferListWidget::pauseVisibleTorrents()
{
for (int i = 0; i < m_sortFilterModel->rowCount(); ++i) {
BitTorrent::TorrentHandle *const torrent = m_listModel->torrentHandle(mapToSource(m_sortFilterModel->index(i, 0)));
if (torrent)
for (BitTorrent::TorrentHandle *const torrent : asConst(getVisibleTorrents()))
torrent->pause();
}
}
void TransferListWidget::softDeleteSelectedTorrents()
{
@ -589,9 +594,11 @@ void TransferListWidget::deleteSelectedTorrents(const bool deleteLocalFiles)
if (Preferences::instance()->confirmTorrentDeletion()) {
auto *dialog = new DeletionConfirmationDialog(this, torrents.size(), torrents[0]->name(), deleteLocalFiles);
dialog->setAttribute(Qt::WA_DeleteOnClose);
connect(dialog, &DeletionConfirmationDialog::accepted, this, [dialog, torrents]()
connect(dialog, &DeletionConfirmationDialog::accepted, this, [this, dialog]()
{
removeTorrents(torrents, dialog->isDeleteFileSelected());
// Some torrents might be removed when waiting for user input, so refetch the torrent list
// NOTE: this will only work when dialog is modal
removeTorrents(getSelectedTorrents(), dialog->isDeleteFileSelected());
});
dialog->open();
}
@ -602,18 +609,17 @@ void TransferListWidget::deleteSelectedTorrents(const bool deleteLocalFiles)
void TransferListWidget::deleteVisibleTorrents()
{
if (m_sortFilterModel->rowCount() <= 0) return;
QVector<BitTorrent::TorrentHandle *> torrents;
for (int i = 0; i < m_sortFilterModel->rowCount(); ++i)
torrents << m_listModel->torrentHandle(mapToSource(m_sortFilterModel->index(i, 0)));
const QVector<BitTorrent::TorrentHandle *> torrents = getVisibleTorrents();
if (torrents.empty()) return;
if (Preferences::instance()->confirmTorrentDeletion()) {
auto *dialog = new DeletionConfirmationDialog(this, torrents.size(), torrents[0]->name(), false);
dialog->setAttribute(Qt::WA_DeleteOnClose);
connect(dialog, &DeletionConfirmationDialog::accepted, this, [dialog, torrents]()
connect(dialog, &DeletionConfirmationDialog::accepted, this, [this, dialog]()
{
removeTorrents(torrents, dialog->isDeleteFileSelected());
// Some torrents might be removed when waiting for user input, so refetch the torrent list
// NOTE: this will only work when dialog is modal
removeTorrents(getVisibleTorrents(), dialog->isDeleteFileSelected());
});
dialog->open();
}

View file

@ -141,6 +141,7 @@ private:
void confirmRemoveAllTagsForSelection();
QStringList askTagsForSelection(const QString &dialogTitle);
void applyToSelectedTorrents(const std::function<void (BitTorrent::TorrentHandle *const)> &fn);
QVector<BitTorrent::TorrentHandle *> getVisibleTorrents() const;
// supposed to be used with qss only
QColor unknownStateForeground() const;