From 0607050ecc2df16a05e39ef51ccc44bcc800919d Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Wed, 2 Oct 2019 19:19:33 +0800 Subject: [PATCH 1/4] Clean up PreviewSelectDialog class --- src/base/bittorrent/torrenthandle.cpp | 2 +- src/base/bittorrent/torrenthandle.h | 2 +- src/gui/previewselectdialog.cpp | 5 ++--- src/gui/previewselectdialog.h | 9 ++++----- src/gui/transferlistwidget.cpp | 5 +++-- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/base/bittorrent/torrenthandle.cpp b/src/base/bittorrent/torrenthandle.cpp index 5ad0565ab..005084b30 100644 --- a/src/base/bittorrent/torrenthandle.cpp +++ b/src/base/bittorrent/torrenthandle.cpp @@ -2187,7 +2187,7 @@ void TorrentHandle::setSuperSeeding(const bool enable) #endif } -void TorrentHandle::flushCache() +void TorrentHandle::flushCache() const { m_nativeHandle.flush_cache(); } diff --git a/src/base/bittorrent/torrenthandle.h b/src/base/bittorrent/torrenthandle.h index 4a52a9b89..80ce1af9a 100644 --- a/src/base/bittorrent/torrenthandle.h +++ b/src/base/bittorrent/torrenthandle.h @@ -324,7 +324,7 @@ namespace BitTorrent void setUploadLimit(int limit); void setDownloadLimit(int limit); void setSuperSeeding(bool enable); - void flushCache(); + void flushCache() const; void addTrackers(const QVector &trackers); void replaceTrackers(const QVector &trackers); void addUrlSeeds(const QVector &urlSeeds); diff --git a/src/gui/previewselectdialog.cpp b/src/gui/previewselectdialog.cpp index 821912a72..fc3cc0d20 100644 --- a/src/gui/previewselectdialog.cpp +++ b/src/gui/previewselectdialog.cpp @@ -45,7 +45,7 @@ #define SETTINGS_KEY(name) "PreviewSelectDialog/" name -PreviewSelectDialog::PreviewSelectDialog(QWidget *parent, BitTorrent::TorrentHandle *const torrent) +PreviewSelectDialog::PreviewSelectDialog(QWidget *parent, const BitTorrent::TorrentHandle *torrent) : QDialog(parent) , m_ui(new Ui::PreviewSelectDialog) , m_torrent(torrent) @@ -53,13 +53,12 @@ PreviewSelectDialog::PreviewSelectDialog(QWidget *parent, BitTorrent::TorrentHan , m_storeTreeHeaderState(SETTINGS_KEY("HeaderState")) { m_ui->setupUi(this); - setAttribute(Qt::WA_DeleteOnClose); m_ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Preview")); connect(m_ui->buttonBox, &QDialogButtonBox::accepted, this, &PreviewSelectDialog::previewButtonClicked); connect(m_ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); - Preferences *const pref = Preferences::instance(); + const Preferences *pref = Preferences::instance(); // Preview list m_previewListModel = new QStandardItemModel(0, NB_COLUMNS, this); m_previewListModel->setHeaderData(NAME, Qt::Horizontal, tr("Name")); diff --git a/src/gui/previewselectdialog.h b/src/gui/previewselectdialog.h index a9dc54749..8ab018121 100644 --- a/src/gui/previewselectdialog.h +++ b/src/gui/previewselectdialog.h @@ -60,26 +60,25 @@ public: NB_COLUMNS }; - PreviewSelectDialog(QWidget *parent, BitTorrent::TorrentHandle *const torrent); + PreviewSelectDialog(QWidget *parent, const BitTorrent::TorrentHandle *torrent); ~PreviewSelectDialog(); signals: void readyToPreviewFile(QString) const; -protected: - void showEvent(QShowEvent *event) override; - private slots: void previewButtonClicked(); private: + void showEvent(QShowEvent *event) override; + void loadWindowState(); void saveWindowState(); Ui::PreviewSelectDialog *m_ui; QStandardItemModel *m_previewListModel; PreviewListDelegate *m_listDelegate; - BitTorrent::TorrentHandle *const m_torrent; + const BitTorrent::TorrentHandle *m_torrent; bool m_headerStateInitialized = false; // Settings diff --git a/src/gui/transferlistwidget.cpp b/src/gui/transferlistwidget.cpp index acf2c193a..0887af09b 100644 --- a/src/gui/transferlistwidget.cpp +++ b/src/gui/transferlistwidget.cpp @@ -501,9 +501,10 @@ void TransferListWidget::openSelectedTorrentsFolder() const void TransferListWidget::previewSelectedTorrents() { - for (BitTorrent::TorrentHandle *const torrent : asConst(getSelectedTorrents())) { + for (const BitTorrent::TorrentHandle *torrent : asConst(getSelectedTorrents())) { if (torrentContainsPreviewableFiles(torrent)) { - const auto *dialog = new PreviewSelectDialog(this, torrent); + auto *dialog = new PreviewSelectDialog(this, torrent); + dialog->setAttribute(Qt::WA_DeleteOnClose); connect(dialog, &PreviewSelectDialog::readyToPreviewFile, this, &TransferListWidget::previewFile); } else { From 7ed0cd0c359e5edaae6d9297fea5ae443b996880 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Wed, 2 Oct 2019 19:29:28 +0800 Subject: [PATCH 2/4] Fix "preview file" action not working Root cause is the PreviewSelectDialog::readyToPreviewFile signal is emitted before it is connected to a slot. Only single-file torrents are affected. Closes #11315. --- src/gui/previewselectdialog.cpp | 22 ++++++++++------------ src/gui/transferlistwidget.cpp | 1 + 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/gui/previewselectdialog.cpp b/src/gui/previewselectdialog.cpp index fc3cc0d20..2de213876 100644 --- a/src/gui/previewselectdialog.cpp +++ b/src/gui/previewselectdialog.cpp @@ -101,16 +101,6 @@ PreviewSelectDialog::PreviewSelectDialog(QWidget *parent, const BitTorrent::Torr // Restore dialog state loadWindowState(); - - if (m_previewListModel->rowCount() == 1) { - qDebug("Torrent file only contains one file, no need to display selection dialog before preview"); - // Only one file : no choice - previewButtonClicked(); - } - else { - qDebug("Displaying media file selection dialog for preview"); - show(); - } } PreviewSelectDialog::~PreviewSelectDialog() @@ -161,13 +151,21 @@ void PreviewSelectDialog::loadWindowState() void PreviewSelectDialog::showEvent(QShowEvent *event) { - Q_UNUSED(event); + // event originated from system + if (event->spontaneous()) { + QDialog::showEvent(event); + return; + } // Default size, have to be called after show(), because width is needed // Set Name column width to 60% of TreeView if (!m_headerStateInitialized) { - int nameSize = (m_ui->previewList->size().width() * 0.6); + const int nameSize = (m_ui->previewList->size().width() * 0.6); m_ui->previewList->header()->resizeSection(0, nameSize); m_headerStateInitialized = true; } + + // Only one file, no choice + if (m_previewListModel->rowCount() <= 1) + previewButtonClicked(); } diff --git a/src/gui/transferlistwidget.cpp b/src/gui/transferlistwidget.cpp index 0887af09b..69e6f2fd8 100644 --- a/src/gui/transferlistwidget.cpp +++ b/src/gui/transferlistwidget.cpp @@ -506,6 +506,7 @@ void TransferListWidget::previewSelectedTorrents() auto *dialog = new PreviewSelectDialog(this, torrent); dialog->setAttribute(Qt::WA_DeleteOnClose); connect(dialog, &PreviewSelectDialog::readyToPreviewFile, this, &TransferListWidget::previewFile); + dialog->show(); } else { QMessageBox::critical(this, tr("Unable to preview"), tr("The selected torrent does not contain previewable files")); From 6a462edb72c80cd1d518da702787baee8752fa84 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Wed, 2 Oct 2019 20:03:50 +0800 Subject: [PATCH 3/4] Don't close preview dialog if selected file failed to open User may have made a mis-selection and this should not close the dialog (only when the torrent has multiple previewable files). --- src/gui/previewselectdialog.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/gui/previewselectdialog.cpp b/src/gui/previewselectdialog.cpp index 2de213876..3108b582f 100644 --- a/src/gui/previewselectdialog.cpp +++ b/src/gui/previewselectdialog.cpp @@ -112,21 +112,26 @@ PreviewSelectDialog::~PreviewSelectDialog() void PreviewSelectDialog::previewButtonClicked() { - QModelIndexList selectedIndexes = m_ui->previewList->selectionModel()->selectedRows(FILE_INDEX); + const QModelIndexList selectedIndexes = m_ui->previewList->selectionModel()->selectedRows(FILE_INDEX); if (selectedIndexes.isEmpty()) return; // Flush data m_torrent->flushCache(); - QStringList absolutePaths(m_torrent->absoluteFilePaths()); + const QStringList absolutePaths = m_torrent->absoluteFilePaths(); // Only one file should be selected - QString path = absolutePaths.at(selectedIndexes.at(0).data().toInt()); + const QString path = absolutePaths.at(selectedIndexes.at(0).data().toInt()); // File - if (QFile::exists(path)) - emit readyToPreviewFile(path); - else - QMessageBox::critical(this->parentWidget(), tr("Preview impossible"), tr("Sorry, we can't preview this file")); + if (!QFile::exists(path)) { + const bool isSingleFile = (m_previewListModel->rowCount() == 1); + QWidget *parent = isSingleFile ? this->parentWidget() : this; + QMessageBox::critical(parent, tr("Preview impossible"), tr("Sorry, we can't preview this file")); + if (isSingleFile) + reject(); + return; + } + emit readyToPreviewFile(path); accept(); } From 7f73a713192e4c63e52134f6326db30a504c284e Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Wed, 2 Oct 2019 21:02:05 +0800 Subject: [PATCH 4/4] Show torrent name in "preview file" related dialogs --- src/gui/previewselectdialog.cpp | 6 +++++- src/gui/previewselectdialog.ui | 3 --- src/gui/transferlistwidget.cpp | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/gui/previewselectdialog.cpp b/src/gui/previewselectdialog.cpp index 3108b582f..67f24ae43 100644 --- a/src/gui/previewselectdialog.cpp +++ b/src/gui/previewselectdialog.cpp @@ -54,6 +54,9 @@ PreviewSelectDialog::PreviewSelectDialog(QWidget *parent, const BitTorrent::Torr { m_ui->setupUi(this); + m_ui->label->setText(tr("The following files from torrent \"%1\" support previewing, please select one of them:") + .arg(m_torrent->name())); + m_ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Preview")); connect(m_ui->buttonBox, &QDialogButtonBox::accepted, this, &PreviewSelectDialog::previewButtonClicked); connect(m_ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); @@ -125,7 +128,8 @@ void PreviewSelectDialog::previewButtonClicked() if (!QFile::exists(path)) { const bool isSingleFile = (m_previewListModel->rowCount() == 1); QWidget *parent = isSingleFile ? this->parentWidget() : this; - QMessageBox::critical(parent, tr("Preview impossible"), tr("Sorry, we can't preview this file")); + QMessageBox::critical(parent, tr("Preview impossible") + , tr("Sorry, we can't preview this file: \"%1\".").arg(Utils::Fs::toNativePath(path))); if (isSingleFile) reject(); return; diff --git a/src/gui/previewselectdialog.ui b/src/gui/previewselectdialog.ui index f37b0af45..bd21963e4 100644 --- a/src/gui/previewselectdialog.ui +++ b/src/gui/previewselectdialog.ui @@ -16,9 +16,6 @@ - - The following files support previewing, please select one of them: - true diff --git a/src/gui/transferlistwidget.cpp b/src/gui/transferlistwidget.cpp index 69e6f2fd8..f2793761e 100644 --- a/src/gui/transferlistwidget.cpp +++ b/src/gui/transferlistwidget.cpp @@ -509,7 +509,8 @@ void TransferListWidget::previewSelectedTorrents() dialog->show(); } else { - QMessageBox::critical(this, tr("Unable to preview"), tr("The selected torrent does not contain previewable files")); + QMessageBox::critical(this, tr("Unable to preview"), tr("The selected torrent \"%1\" does not contain previewable files") + .arg(torrent->name())); } } }