From dd687dc983614e133b841b6b942a13ff2dfd0ebf Mon Sep 17 00:00:00 2001 From: Keshav Bhatt Date: Wed, 22 Mar 2023 20:22:51 +0530 Subject: fix: prevent overwrite if file exists - handle situation to prevent download overwrite - add clear all downloads - cleanup --- src/downloadmanagerwidget.cpp | 68 +++++++++++++++++++++++++++++-------- src/downloadmanagerwidget.h | 36 +++++++++++--------- src/downloadmanagerwidget.ui | 79 ++++++++++++++++++++++++++++++------------- 3 files changed, 129 insertions(+), 54 deletions(-) diff --git a/src/downloadmanagerwidget.cpp b/src/downloadmanagerwidget.cpp index e9865c8..812c471 100644 --- a/src/downloadmanagerwidget.cpp +++ b/src/downloadmanagerwidget.cpp @@ -11,6 +11,12 @@ DownloadManagerWidget::DownloadManagerWidget(QWidget *parent) setupUi(this); } +void DownloadManagerWidget::acceptDownload(QWebEngineDownloadItem *download) { + download->accept(); + add(new DownloadWidget(download)); + show(); +} + void DownloadManagerWidget::downloadRequested( QWebEngineDownloadItem *download) { Q_ASSERT(download && @@ -22,14 +28,39 @@ void DownloadManagerWidget::downloadRequested( QStandardPaths::DownloadLocation) + QDir::separator() + QApplication::applicationName()) .toString(); - QDir d; - d.mkpath(path); - download->setDownloadFileName(path + QDir::separator() + - download->downloadFileName()); - download->accept(); - add(new DownloadWidget(download)); - show(); + QDir().mkpath(path); + + auto proposed_file_name = + path + QDir::separator() + download->downloadFileName(); + + QFileInfo p_file_info(proposed_file_name); + + if (p_file_info.exists()) { + + QMessageBox msgBox; + msgBox.setText("File with same name already exist!"); + msgBox.setInformativeText("Save file with a new name?"); + msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Save); + switch (msgBox.exec()) { + case QMessageBox::Save: { + QString n_proposed_file_name = path + QDir::separator() + + utils::generateRandomId(5) + "_" + + download->downloadFileName(); + download->setDownloadFileName(n_proposed_file_name); + acceptDownload(download); + break; + } + case QMessageBox::Cancel: + break; + default: + break; + } + } else { + download->setDownloadFileName(proposed_file_name); + acceptDownload(download); + } } void DownloadManagerWidget::add(DownloadWidget *downloadWidget) { @@ -41,8 +72,10 @@ void DownloadManagerWidget::add(DownloadWidget *downloadWidget) { } void DownloadManagerWidget::remove(DownloadWidget *downloadWidget) { - m_itemsLayout->removeWidget(downloadWidget); - downloadWidget->deleteLater(); + if (downloadWidget != nullptr) { + m_itemsLayout->removeWidget(downloadWidget); + downloadWidget->deleteLater(); + } if (--m_numDownloads == 0) m_zeroItemsLabel->show(); } @@ -57,10 +90,17 @@ void DownloadManagerWidget::on_open_download_dir_clicked() { .toString()); } -void DownloadManagerWidget::keyPressEvent(QKeyEvent *e) -{ - if (e->key() == Qt::Key_Escape) - this->close(); +void DownloadManagerWidget::keyPressEvent(QKeyEvent *e) { + if (e->key() == Qt::Key_Escape) + this->close(); + + QWidget::keyPressEvent(e); +} - QWidget::keyPressEvent(e); +void DownloadManagerWidget::on_clear_all_downlads_clicked() { + foreach (auto downloadItem, this->findChildren()) { + if (downloadItem != nullptr) { + downloadItem->remove(); + } + } } diff --git a/src/downloadmanagerwidget.h b/src/downloadmanagerwidget.h index 4a8d059..76464e8 100644 --- a/src/downloadmanagerwidget.h +++ b/src/downloadmanagerwidget.h @@ -53,9 +53,9 @@ #include "ui_downloadmanagerwidget.h" -#include -#include #include "utils.h" +#include +#include QT_BEGIN_NAMESPACE class QWebEngineDownloadItem; @@ -64,28 +64,32 @@ QT_END_NAMESPACE class DownloadWidget; // Displays a list of downloads. -class DownloadManagerWidget final : public QWidget, public Ui::DownloadManagerWidget -{ - Q_OBJECT +class DownloadManagerWidget final : public QWidget, + public Ui::DownloadManagerWidget { + Q_OBJECT public: - explicit DownloadManagerWidget(QWidget *parent = nullptr); + explicit DownloadManagerWidget(QWidget *parent = nullptr); - // Prompts user with a "Save As" dialog. If the user doesn't cancel it, then - // the QWebEngineDownloadItem will be accepted and the DownloadManagerWidget - // will be shown on the screen. - void downloadRequested(QWebEngineDownloadItem *webItem); + // Prompts user with a "Save As" dialog. If the user doesn't cancel it, then + // the QWebEngineDownloadItem will be accepted and the DownloadManagerWidget + // will be shown on the screen. + void downloadRequested(QWebEngineDownloadItem *webItem); protected slots: - void keyPressEvent(QKeyEvent *e); + void keyPressEvent(QKeyEvent *e); private slots: - void on_open_download_dir_clicked(); + void on_open_download_dir_clicked(); + + void acceptDownload(QWebEngineDownloadItem *download); + + void on_clear_all_downlads_clicked(); private: - void add(DownloadWidget *downloadWidget); - void remove(DownloadWidget *downloadWidget); + void add(DownloadWidget *downloadWidget); + void remove(DownloadWidget *downloadWidget); - int m_numDownloads; - QSettings settings; + int m_numDownloads; + QSettings settings; }; #endif // DOWNLOADMANAGERWIDGET_H diff --git a/src/downloadmanagerwidget.ui b/src/downloadmanagerwidget.ui index c87286b..7020d03 100644 --- a/src/downloadmanagerwidget.ui +++ b/src/downloadmanagerwidget.ui @@ -6,8 +6,8 @@ 0 0 - 450 - 250 + 589 + 363 @@ -26,18 +26,6 @@ QLayout::SetNoConstraint - - 0 - - - 0 - - - 0 - - - 0 - @@ -57,8 +45,8 @@ 0 0 - 448 - 248 + 569 + 310 @@ -109,19 +97,62 @@ - - - - Open Download directory - - - + + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Clear download list + + + Clear all + + + + :/icons/close-fill.png:/icons/close-fill.png + + + + + + + Open download directory in file manager + + + Open Download directory + + + + :/icons/folder-open-line.png:/icons/folder-open-line.png + + + + + - + + + -- cgit v1.2.3