From 7b64cf518d28597ff004418668b8680d2426e0ed Mon Sep 17 00:00:00 2001 From: Keshav Bhatt Date: Wed, 22 Mar 2023 20:24:51 +0530 Subject: feat: add open file option in download item - option allows user to open downloaded file directly from download manager --- src/downloadwidget.cpp | 83 +++++++++++++++++++++++++++++++++++--------------- src/downloadwidget.h | 32 ++++++++++--------- src/downloadwidget.ui | 69 +++++++++++++++++++++++++++-------------- 3 files changed, 122 insertions(+), 62 deletions(-) (limited to 'src') diff --git a/src/downloadwidget.cpp b/src/downloadwidget.cpp index d228074..75ebf51 100644 --- a/src/downloadwidget.cpp +++ b/src/downloadwidget.cpp @@ -1,5 +1,6 @@ #include "downloadwidget.h" +#include #include #include #include @@ -8,10 +9,28 @@ DownloadWidget::DownloadWidget(QWebEngineDownloadItem *download, QWidget *parent) : QFrame(parent), m_download(download) { setupUi(this); - m_dstName->setText(QFileInfo(m_download->downloadDirectory()).fileName()); - m_srcUrl->setText(m_download->url().toDisplayString()); - connect(m_cancelButton, &QPushButton::clicked, m_download, [this](bool) { + static QIcon openIcon(":/icons/eye-line.png"); + openButton->setIcon(openIcon); + openButton->setEnabled(false); + + auto downloadFileName = m_download->downloadFileName(); + dstName->setText(QFileInfo(downloadFileName).fileName()); + + auto url = m_download->url().toDisplayString(); + if (url.startsWith("data:")) { + srcUrl->setText("data:..."); + } else { + srcUrl->setText(url); + } + + connect(openButton, &QPushButton::clicked, m_download, [this](bool) { + if (m_download->state() == QWebEngineDownloadItem::DownloadCompleted) { + QDesktopServices::openUrl(QUrl(m_download->downloadFileName())); + } + }); + + connect(cancelButton, &QPushButton::clicked, m_download, [this](bool) { if (m_download->state() == QWebEngineDownloadItem::DownloadInProgress) m_download->cancel(); else @@ -27,6 +46,11 @@ DownloadWidget::DownloadWidget(QWebEngineDownloadItem *download, updateWidget(); } +void DownloadWidget::remove() { + if (!isDownloading()) + emit removeClicked(this); +} + inline QString DownloadWidget::withUnit(qreal bytes) { if (bytes < (1 << 10)) return tr("%L1 B").arg(bytes); @@ -38,6 +62,11 @@ inline QString DownloadWidget::withUnit(qreal bytes) { return tr("%L1 GiB").arg(bytes / (1 << 30), 0, 'f', 2); } +bool DownloadWidget::isDownloading() { + + return m_download->state() == QWebEngineDownloadItem::DownloadInProgress; +} + void DownloadWidget::updateWidget() { qreal totalBytes = m_download->totalBytes(); qreal receivedBytes = m_download->receivedBytes(); @@ -50,49 +79,53 @@ void DownloadWidget::updateWidget() { break; case QWebEngineDownloadItem::DownloadInProgress: if (totalBytes >= 0) { - m_progressBar->setValue(qRound(100 * receivedBytes / totalBytes)); - m_progressBar->setDisabled(false); - m_progressBar->setFormat(tr("%p% - %1 of %2 downloaded - %3/s") - .arg(withUnit(receivedBytes), - withUnit(totalBytes), - withUnit(bytesPerSecond))); + progressBar->setValue(qRound(100 * receivedBytes / totalBytes)); + progressBar->setDisabled(false); + progressBar->setFormat(tr("%p% - %1 of %2 downloaded - %3/s") + .arg(withUnit(receivedBytes), + withUnit(totalBytes), + withUnit(bytesPerSecond))); } else { - m_progressBar->setValue(0); - m_progressBar->setDisabled(false); - m_progressBar->setFormat( + progressBar->setValue(0); + progressBar->setDisabled(false); + progressBar->setFormat( tr("unknown size - %1 downloaded - %2/s") .arg(withUnit(receivedBytes), withUnit(bytesPerSecond))); } + openButton->setEnabled(false); break; case QWebEngineDownloadItem::DownloadCompleted: - m_progressBar->setValue(100); - m_progressBar->setDisabled(true); - m_progressBar->setFormat( + progressBar->setValue(100); + progressBar->setDisabled(true); + progressBar->setFormat( tr("completed - %1 downloaded - %2/s") .arg(withUnit(receivedBytes), withUnit(bytesPerSecond))); + openButton->setEnabled(true); break; case QWebEngineDownloadItem::DownloadCancelled: - m_progressBar->setValue(0); - m_progressBar->setDisabled(true); - m_progressBar->setFormat( + progressBar->setValue(0); + progressBar->setDisabled(true); + progressBar->setFormat( tr("cancelled - %1 downloaded - %2/s") .arg(withUnit(receivedBytes), withUnit(bytesPerSecond))); + openButton->setEnabled(false); break; case QWebEngineDownloadItem::DownloadInterrupted: - m_progressBar->setValue(0); - m_progressBar->setDisabled(true); - m_progressBar->setFormat( + progressBar->setValue(0); + progressBar->setDisabled(true); + progressBar->setFormat( tr("interrupted: %1").arg(m_download->interruptReasonString())); + openButton->setEnabled(false); break; } if (state == QWebEngineDownloadItem::DownloadInProgress) { static QIcon cancelIcon(":/icons/stop-line.png"); - m_cancelButton->setIcon(cancelIcon); - m_cancelButton->setToolTip(tr("Stop downloading")); + cancelButton->setIcon(cancelIcon); + cancelButton->setToolTip(tr("Stop downloading")); } else { static QIcon removeIcon(":/icons/close-fill.png"); - m_cancelButton->setIcon(removeIcon); - m_cancelButton->setToolTip(tr("Remove from list")); + cancelButton->setIcon(removeIcon); + cancelButton->setToolTip(tr("Remove from list")); } } diff --git a/src/downloadwidget.h b/src/downloadwidget.h index 074a979..4417cb4 100644 --- a/src/downloadwidget.h +++ b/src/downloadwidget.h @@ -54,36 +54,40 @@ #include "ui_downloadwidget.h" #include "widgets/elidedlabel/elidedlabel.h" - +#include #include #include -#include QT_BEGIN_NAMESPACE class QWebEngineDownloadItem; QT_END_NAMESPACE // Displays one ongoing or finished download (QWebEngineDownloadItem). -class DownloadWidget final : public QFrame, public Ui::DownloadWidget -{ - Q_OBJECT +class DownloadWidget final : public QFrame, public Ui::DownloadWidget { + Q_OBJECT public: - // Precondition: The QWebEngineDownloadItem has been accepted. - explicit DownloadWidget(QWebEngineDownloadItem *download, QWidget *parent = nullptr); + // Precondition: The QWebEngineDownloadItem has been accepted. + explicit DownloadWidget(QWebEngineDownloadItem *download, + QWidget *parent = nullptr); +public slots: + // Return true if downloadItem state is InProgress + bool isDownloading(); + // Remove downloadItem, updating the download manager + void remove(); signals: - // This signal is emitted when the user indicates that they want to remove - // this download from the downloads list. - void removeClicked(DownloadWidget *self); + // This signal is emitted when the user indicates that they want to remove + // this download from the downloads list. + void removeClicked(DownloadWidget *self); private slots: - void updateWidget(); + void updateWidget(); private: - QString withUnit(qreal bytes); + QString withUnit(qreal bytes); - QWebEngineDownloadItem *m_download; - QElapsedTimer m_timeAdded; + QWebEngineDownloadItem *m_download; + QElapsedTimer m_timeAdded; }; #endif // DOWNLOADWIDGET_H diff --git a/src/downloadwidget.ui b/src/downloadwidget.ui index 45d16e9..ec227ae 100644 --- a/src/downloadwidget.ui +++ b/src/downloadwidget.ui @@ -7,7 +7,7 @@ 0 0 526 - 97 + 99 @@ -17,8 +17,8 @@ QLayout::SetMinAndMaxSize - - + + @@ -27,24 +27,18 @@ - - - - - 0 - 0 - - + + - - false + + 24 - + true @@ -55,15 +49,44 @@ - - - - - - - 24 - - + + + + + + + 0 + 0 + + + + Open file using system application + + + + + + false + + + + + + + + 0 + 0 + + + + + + + false + + + + -- cgit v1.2.3