diff --git a/spark-webapp-runtime/mainwindow.cpp b/spark-webapp-runtime/mainwindow.cpp index 0bb2716..c231fcd 100644 --- a/spark-webapp-runtime/mainwindow.cpp +++ b/spark-webapp-runtime/mainwindow.cpp @@ -1,12 +1,10 @@ -#include "mainwindow.h" +#include "mainwindow.h" #include <DMainWindow> #include <DWidgetUtil> #include <DTitlebar> #include <DMessageManager> -#include <DPushButton> -#include <QLayout> #include <QFileInfo> #include <QFileDialog> #include <QDir> @@ -40,9 +38,15 @@ MainWindow::MainWindow(QString szTitle, , t_show(new QAction(tr("Show MainWindow"))) , t_about(new QAction(tr("About"))) , t_exit(new QAction(tr("Exit"))) + , downloadProgressBar(new QWidget) , bar(new DProgressBar) + , pause(new DPushButton(tr("Pause"))) + , resume(new DPushButton(tr("Resume"))) + , cancel(new DPushButton(tr("Cancel"))) + , progress(new QHBoxLayout) , message(new DFloatingMessage(DFloatingMessage::ResidentType)) , process(new QProcess) + , isCanceled(false) , mtray(tray) , mFixSize(nFixSize) , m_width(nWidth) @@ -111,6 +115,17 @@ MainWindow::MainWindow(QString szTitle, m_tray->show(); // 启用托盘时显示 } + /* 初始化 DownloadProgressBar */ + bar->setFixedSize(250, 8); + progress->addWidget(bar); + progress->addSpacing(5); + progress->addWidget(pause); + progress->addWidget(resume); + progress->addWidget(cancel); + downloadProgressBar->setLayout(progress); + message->setIcon(QIcon::fromTheme("deepin-download").pixmap(64, 64)); + message->setWidget(downloadProgressBar); + connect(btnBack, &DToolButton::clicked, this, [&]() { m_widget->goBack(); @@ -292,58 +307,116 @@ void MainWindow::trayIconActivated(QSystemTrayIcon::ActivationReason reason) } void MainWindow::on_downloadStart(QWebEngineDownloadItem *item) - { - QString fileName = QFileInfo(item->path()).fileName(); - QString filePath = saveAs(fileName); - if(filePath.isEmpty()) + /* 尝试加锁互斥量,禁止同时下载多个文件 */ + if(mutex.tryLock()) { - return; + QString fileName = QFileInfo(item->path()).fileName(); + QString filePath = saveAs(fileName); + if(filePath.isEmpty()) + { + return; + } + item->setPath(filePath); + filePath = QFileInfo(item->path()).absoluteFilePath(); + + connect(item, &QWebEngineDownloadItem::downloadProgress, this, &MainWindow::on_downloadProgress); + connect(item, &QWebEngineDownloadItem::finished, this, [=]() + { + on_downloadFinish(filePath); + }); + + connect(pause, &DPushButton::clicked, this, [=]() + { + on_downloadPause(item); + }); + connect(resume, &DPushButton::clicked, this, [=]() + { + on_downloadResume(item); + }); + connect(cancel, &DPushButton::clicked, this, [=]() + { + on_downloadCancel(item); + }); + + DFloatingMessage *message = new DFloatingMessage(DFloatingMessage::TransientType); + message->setIcon(QIcon::fromTheme("dialog-information").pixmap(64, 64)); + message->setMessage(QString(tr("%1Start downloading %2")).arg(" ").arg(fileName)); + DMessageManager::instance()->sendMessage(this, message); + + item->accept(); + + /* 重置 DownloadProgressBar 状态 */ + isCanceled = false; + resume->hide(); + pause->show(); + this->message->show(); // 上一次下载完成后隐藏了进度条,这里要重新显示 } - item->setPath(filePath); - filePath = QFileInfo(item->path()).absoluteFilePath(); - - connect(item, &QWebEngineDownloadItem::downloadProgress, this, &MainWindow::on_downloadProgress); - connect(item, &QWebEngineDownloadItem::finished, this, [=]() + else { - on_downloadFinish(filePath); - }); - - DFloatingMessage *message = new DFloatingMessage(DFloatingMessage::TransientType); - message->setIcon(QIcon::fromTheme("dialog-information").pixmap(64, 64)); - message->setMessage(QString(tr("%1Start downloading %2")).arg(" ").arg(fileName)); - DMessageManager::instance()->sendMessage(this, message); - - item->accept(); + DMessageManager::instance()->sendMessage(this, QIcon::fromTheme("dialog-cancel").pixmap(64, 64), QString(tr("%1Wait for previous download to complete!")).arg(" ")); + } } void MainWindow::on_downloadProgress(qint64 bytesReceived, qint64 bytesTotal) { int value = int(double(bytesReceived) / double(bytesTotal) * 100.0); - - bar->setFixedSize(250, 8); bar->setValue(value); - message->setIcon(QIcon::fromTheme("deepin-download").pixmap(64, 64)); + message->setMessage(" " + QString::number(value) + "%"); - message->setWidget(bar); + DMessageManager::instance()->sendMessage(this, message); } void MainWindow::on_downloadFinish(QString filePath) { + mutex.unlock(); // 解锁互斥量,允许下载新文件 + message->hide(); - DPushButton *button = new DPushButton(tr("Open")); - - DFloatingMessage *message = new DFloatingMessage(DFloatingMessage::ResidentType); - message->setIcon(QIcon::fromTheme("dialog-ok").pixmap(64, 64)); - message->setMessage(QString(" %1 %2 %3").arg(QFileInfo(filePath).fileName()).arg(tr("download finished.")).arg(tr("Show in file manager?"))); - message->setWidget(button); - DMessageManager::instance()->sendMessage(this, message); - - connect(button, &DPushButton::clicked, this, [=]() + if(!isCanceled) // 下载完成显示提示信息 { - process->start("dde-file-manager --show-item " + filePath); - message->hide(); - }); + DPushButton *button = new DPushButton(tr("Open")); + + DFloatingMessage *message = new DFloatingMessage(DFloatingMessage::ResidentType); + message->setIcon(QIcon::fromTheme("dialog-ok").pixmap(64, 64)); + message->setMessage(QString(" %1 %2 %3").arg(QFileInfo(filePath).fileName()).arg(tr("download finished.")).arg(tr("Show in file manager?"))); + message->setWidget(button); + DMessageManager::instance()->sendMessage(this, message); + + connect(button, &DPushButton::clicked, this, [=]() + { + process->start("dde-file-manager --show-item " + filePath); + message->hide(); + }); + } +} + +void MainWindow::on_downloadPause(QWebEngineDownloadItem *item) +{ + item->pause(); + + message->setIcon(QIcon::fromTheme("package-download-failed").pixmap(64, 64)); + resume->show(); + pause->hide(); +} + +void MainWindow::on_downloadResume(QWebEngineDownloadItem *item) +{ + item->resume(); + + message->setIcon(QIcon::fromTheme("deepin-download").pixmap(64, 64)); + resume->hide(); + pause->show(); +} + +void MainWindow::on_downloadCancel(QWebEngineDownloadItem *item) +{ + isCanceled = true; // 取消下载 + item->cancel(); + + mutex.unlock(); + + message->hide(); + DMessageManager::instance()->sendMessage(this, QIcon::fromTheme("dialog-error").pixmap(64, 64), QString(tr("%1Download canceled!")).arg(" ")); } diff --git a/spark-webapp-runtime/mainwindow.h b/spark-webapp-runtime/mainwindow.h index df74ee2..2f4c139 100644 --- a/spark-webapp-runtime/mainwindow.h +++ b/spark-webapp-runtime/mainwindow.h @@ -5,10 +5,13 @@ #include <DAboutDialog> #include <DToolButton> #include <DProgressBar> +#include <DPushButton> #include <DFloatingMessage> #include <QSystemTrayIcon> +#include <QLayout> #include <QProcess> +#include <QMutex> #include "widget.h" #include "globaldefine.h" @@ -53,11 +56,19 @@ private: QAction *t_about; QAction *t_exit; + QWidget *downloadProgressBar; DProgressBar *bar; + DPushButton *pause; + DPushButton *resume; + DPushButton *cancel; + QHBoxLayout *progress; DFloatingMessage *message; QProcess *process; + QMutex mutex; // 通过 Mutex 互斥量禁止同时下载多个文件(使用简单的 bool 变量应该也可以实现该功能?) + bool isCanceled; // 判断是否为取消下载 + bool mtray, mFixSize; int m_width, m_height; @@ -76,6 +87,9 @@ private slots: void on_downloadStart(QWebEngineDownloadItem *item); void on_downloadProgress(qint64 bytesReceived, qint64 bytesTotal); void on_downloadFinish(QString filePath); + void on_downloadPause(QWebEngineDownloadItem *item); + void on_downloadResume(QWebEngineDownloadItem *item); + void on_downloadCancel(QWebEngineDownloadItem *item); signals: void sigQuit(); diff --git a/spark-webapp-runtime/translations/spark-webapp-runtime_zh_CN.qm b/spark-webapp-runtime/translations/spark-webapp-runtime_zh_CN.qm index dca0c2b..7da2e32 100644 Binary files a/spark-webapp-runtime/translations/spark-webapp-runtime_zh_CN.qm and b/spark-webapp-runtime/translations/spark-webapp-runtime_zh_CN.qm differ diff --git a/spark-webapp-runtime/translations/spark-webapp-runtime_zh_CN.ts b/spark-webapp-runtime/translations/spark-webapp-runtime_zh_CN.ts index a485dc4..031f6ab 100644 --- a/spark-webapp-runtime/translations/spark-webapp-runtime_zh_CN.ts +++ b/spark-webapp-runtime/translations/spark-webapp-runtime_zh_CN.ts @@ -4,70 +4,95 @@ <context> <name>MainWindow</name> <message> - <location filename="../mainwindow.cpp" line="36"/> + <location filename="../mainwindow.cpp" line="34"/> <source>Full Screen</source> <translation>全屏显示</translation> </message> <message> - <location filename="../mainwindow.cpp" line="37"/> + <location filename="../mainwindow.cpp" line="35"/> <source>Fix Size</source> <translation>固定大小</translation> </message> <message> - <location filename="../mainwindow.cpp" line="38"/> + <location filename="../mainwindow.cpp" line="36"/> <source>Hide Buttons</source> <translation>隐藏按钮</translation> </message> <message> - <location filename="../mainwindow.cpp" line="40"/> + <location filename="../mainwindow.cpp" line="38"/> <source>Show MainWindow</source> <translation>显示主界面</translation> </message> <message> - <location filename="../mainwindow.cpp" line="41"/> + <location filename="../mainwindow.cpp" line="39"/> <source>About</source> <translation>关于</translation> </message> <message> - <location filename="../mainwindow.cpp" line="42"/> + <location filename="../mainwindow.cpp" line="40"/> <source>Exit</source> <translation>退出</translation> </message> <message> - <location filename="../mainwindow.cpp" line="191"/> + <location filename="../mainwindow.cpp" line="43"/> + <source>Pause</source> + <translation>暂停</translation> + </message> + <message> + <location filename="../mainwindow.cpp" line="44"/> + <source>Resume</source> + <translation>继续</translation> + </message> + <message> + <location filename="../mainwindow.cpp" line="45"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location filename="../mainwindow.cpp" line="206"/> <source>%1Fullscreen Mode</source> <translation>%1全屏模式</translation> </message> <message> - <location filename="../mainwindow.cpp" line="201"/> + <location filename="../mainwindow.cpp" line="216"/> <source>%1Windowed Mode</source> <translation>%1窗口模式</translation> </message> <message> - <location filename="../mainwindow.cpp" line="243"/> + <location filename="../mainwindow.cpp" line="258"/> <source>Save As</source> <translation>另存为</translation> </message> <message> - <location filename="../mainwindow.cpp" line="314"/> + <location filename="../mainwindow.cpp" line="344"/> <source>%1Start downloading %2</source> <translation>%1开始下载 %2</translation> </message> <message> - <location filename="../mainwindow.cpp" line="336"/> + <location filename="../mainwindow.cpp" line="357"/> + <source>%1Wait for previous download to complete!</source> + <translation>%1请等待上一个下载任务完成!</translation> + </message> + <message> + <location filename="../mainwindow.cpp" line="379"/> <source>Open</source> <translation>打开</translation> </message> <message> - <location filename="../mainwindow.cpp" line="340"/> + <location filename="../mainwindow.cpp" line="383"/> <source>download finished.</source> <translation>下载完成。</translation> </message> <message> - <location filename="../mainwindow.cpp" line="340"/> + <location filename="../mainwindow.cpp" line="383"/> <source>Show in file manager?</source> <translation>是否在文件管理器中显示?</translation> </message> + <message> + <location filename="../mainwindow.cpp" line="421"/> + <source>%1Download canceled!</source> + <translation>%1下载取消!</translation> + </message> </context> <context> <name>QObject</name>