From 876ced77820a95633aee1bed5a1187bc758b50b9 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Fri, 13 Aug 2021 03:38:15 +0300 Subject: [PATCH] kget: do not delete file model, re-set its indexes state instead Signed-off-by: Ivailo Monev --- kget/transfer-plugins/torrent/transferTorrent.cpp | 88 +++++++++++------------ kget/transfer-plugins/torrent/transferTorrent.h | 1 - 2 files changed, 42 insertions(+), 47 deletions(-) diff --git a/kget/transfer-plugins/torrent/transferTorrent.cpp b/kget/transfer-plugins/torrent/transferTorrent.cpp index c8903f08..fb1a4838 100644 --- a/kget/transfer-plugins/torrent/transferTorrent.cpp +++ b/kget/transfer-plugins/torrent/transferTorrent.cpp @@ -345,15 +345,14 @@ static QString translatelterror(lt::error_code lterror) class TorrentFileModel : public FileModel { public: - TorrentFileModel(const QList &files, const KUrl &destDirectory, QObject *parent, const Job::Status status); + TorrentFileModel(const QList &files, const KUrl &destDirectory, QObject *parent); Qt::ItemFlags flags(const QModelIndex &index) const final; -private: - Job::Status m_status; + Job::Status transferstatus; }; -TorrentFileModel::TorrentFileModel(const QList &files, const KUrl &destDirectory, QObject *parent, const Job::Status status) - : FileModel(files, destDirectory, parent), m_status(status) +TorrentFileModel::TorrentFileModel(const QList &files, const KUrl &destDirectory, QObject *parent) + : FileModel(files, destDirectory, parent) { } @@ -363,10 +362,13 @@ Qt::ItemFlags TorrentFileModel::flags(const QModelIndex &index) const return 0; } - // TODO: this really should be done for other transfer plugins too, it does - // not make sense to disable file transfers once it is already finished - if (m_status == Job::Finished || m_status == Job::FinishedKeepAlive) { - return 0; + if (index.column() == FileItem::File) { + // TODO: this really should be done for other transfer plugins too, it does not make sense + // to disable file transfer once it is already finished + // TODO: this does not (and cannot) account for parent item (directory) flags + if (transferstatus == Job::Finished || transferstatus == Job::FinishedKeepAlive) { + return Qt::ItemIsSelectable; + } } return FileModel::flags(index); @@ -376,7 +378,7 @@ TransferTorrent::TransferTorrent(TransferGroup* parent, TransferFactory* factory Scheduler* scheduler, const KUrl &source, const KUrl &dest, const QDomElement* e) : Transfer(parent, factory, scheduler, source, dest, e), - m_timerid(0), m_ltsession(nullptr), m_filemodel(nullptr), m_recreatefilemodel(false) + m_timerid(0), m_ltsession(nullptr), m_filemodel(nullptr) { setCapabilities(Transfer::Cap_SpeedLimit | Transfer::Cap_Resuming); @@ -539,43 +541,40 @@ QList TransferTorrent::files() const FileModel* TransferTorrent::fileModel() { - if (m_recreatefilemodel && m_filemodel) { - delete m_filemodel; - m_filemodel = nullptr; - } if (!m_filemodel) { - const Job::Status transferstatus = status(); - m_filemodel = new TorrentFileModel(files(), directory(), this, transferstatus); + m_filemodel = new TorrentFileModel(files(), directory(), this); connect(m_filemodel, SIGNAL(checkStateChanged()), this, SLOT(slotCheckStateChanged())); + } - if (m_lthandle.torrent_file()) { - const lt::file_storage ltstorage = m_lthandle.torrent_file()->files(); - if (ltstorage.is_valid()) { - for (int i = 0; i < ltstorage.num_files(); i++) { - const KUrl fileurl = KUrl(ltstorage.file_path(i).c_str()); - - Job::Status filestatus = transferstatus; - // priority has no effect on finished/seeded torrents - const int ltpriority = (m_priorities.size() > i ? m_priorities.at(i) : LTPriorities::NormalPriority); - const lt::torrent_status ltstatus = m_lthandle.status(); - if (ltstatus.state == lt::torrent_status::seeding || ltstatus.state == lt::torrent_status::finished) { - filestatus = Job::Finished; - } - if (ltpriority == LTPriorities::Disabled) { - filestatus = Job::Stopped; - } - - const Qt::CheckState filestate = (ltpriority == LTPriorities::Disabled ? Qt::Unchecked : Qt::Checked); - QModelIndex fileindex = m_filemodel->index(fileurl, FileItem::File); - m_filemodel->setData(fileindex, filestate, Qt::CheckStateRole); - - QModelIndex statusindex = m_filemodel->index(fileurl, FileItem::Status); - m_filemodel->setData(statusindex, filestatus); - - const qlonglong filesize = ltstorage.file_size(i); - QModelIndex sizeindex = m_filemodel->index(fileurl, FileItem::Size); - m_filemodel->setData(sizeindex, filesize); + const Job::Status transferstatus = status(); + m_filemodel->transferstatus = transferstatus; + if (m_lthandle.torrent_file()) { + const lt::file_storage ltstorage = m_lthandle.torrent_file()->files(); + if (ltstorage.is_valid()) { + for (int i = 0; i < ltstorage.num_files(); i++) { + const KUrl fileurl = KUrl(ltstorage.file_path(i).c_str()); + + Job::Status filestatus = transferstatus; + // priority has no effect on finished/seeded torrents + const int ltpriority = (m_priorities.size() > i ? m_priorities.at(i) : LTPriorities::NormalPriority); + const lt::torrent_status ltstatus = m_lthandle.status(); + if (ltstatus.state == lt::torrent_status::seeding || ltstatus.state == lt::torrent_status::finished) { + filestatus = Job::Finished; + } + if (ltpriority == LTPriorities::Disabled) { + filestatus = Job::Stopped; } + + const Qt::CheckState filestate = (ltpriority == LTPriorities::Disabled ? Qt::Unchecked : Qt::Checked); + QModelIndex fileindex = m_filemodel->index(fileurl, FileItem::File); + m_filemodel->setData(fileindex, filestate, Qt::CheckStateRole); + + QModelIndex statusindex = m_filemodel->index(fileurl, FileItem::Status); + m_filemodel->setData(statusindex, filestatus); + + const qlonglong filesize = ltstorage.file_size(i); + QModelIndex sizeindex = m_filemodel->index(fileurl, FileItem::Size); + m_filemodel->setData(sizeindex, filesize); } } } @@ -707,9 +706,6 @@ void TransferTorrent::timerEvent(QTimerEvent *event) , true ); } else if (lt::alert_cast(ltalert)) { - // see note in TransferTorrent::fileModel() - m_recreatefilemodel = true; - m_lthandle.save_resume_data(); setStatus(Job::FinishedKeepAlive); diff --git a/kget/transfer-plugins/torrent/transferTorrent.h b/kget/transfer-plugins/torrent/transferTorrent.h index 4a7f1099..aa42e730 100644 --- a/kget/transfer-plugins/torrent/transferTorrent.h +++ b/kget/transfer-plugins/torrent/transferTorrent.h @@ -70,7 +70,6 @@ private: lt::torrent_handle m_lthandle; TorrentFileModel* m_filemodel; std::vector m_priorities; - bool m_recreatefilemodel; }; #endif // TRANSFER_TORRENT_H -- 2.11.0