Rabbit Remote Control 0.1.0-bate1
Loading...
Searching...
No Matches
FrmDownload.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QContextMenuEvent>
4#include <QApplication>
5#include <QClipboard>
6#include <QMimeData>
7#include <QHBoxLayout>
8#include <QVBoxLayout>
9#include <QLoggingCategory>
10#include <QDesktopServices>
11#include <QUrl>
12#include <QFileInfo>
13#include <QDir>
14#include "FrmDownload.h"
15#include "Stats.h"
16#include "RabbitCommonTools.h"
17#include "ui_FrmDownload.h"
18
19static Q_LOGGING_CATEGORY(log, "WebBrowser.Download")
20CFrmDownload::CFrmDownload(QWebEngineDownloadRequest *downalod, QWidget *parent)
21 : QFrame(parent)
22 , ui(new Ui::CFrmDownload)
23 , m_pDownload(downalod)
24{
25 bool check = false;
26 qDebug(log) << Q_FUNC_INFO;
27 ui->setupUi(this);
28 ui->pbButton->setText(QString());
29 ui->lbFileInfo->hide();
30
31 setContextMenuPolicy(Qt::CustomContextMenu);
32 check = connect(this, &QFrame::customContextMenuRequested,
33 this, &CFrmDownload::slotCustomContextMenuRequested);
34 Q_ASSERT(check);
35
36 if(m_pDownload) {
37#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
38 ui->lbTitle->setText(m_pDownload->downloadFileName());
39#else
40 QFileInfo fi(m_pDownload->path());
41 ui->lbTitle->setText(fi.fileName());
42#endif
43 ui->progressBar->setValue(0);
44
45#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
46 check = connect(m_pDownload, &QWebEngineDownloadRequest::totalBytesChanged, this, &CFrmDownload::slotUpdateWidget);
47 Q_ASSERT(check);
48 check = connect(m_pDownload, &QWebEngineDownloadRequest::receivedBytesChanged, this, &CFrmDownload::slotUpdateWidget);
49 Q_ASSERT(check);
50#else
51 check = connect(m_pDownload, &QWebEngineDownloadRequest::downloadProgress, this, &CFrmDownload::slotUpdateWidget);
52 Q_ASSERT(check);
53#endif
54 check = connect(m_pDownload, &QWebEngineDownloadRequest::stateChanged,
55 this, &CFrmDownload::slotUpdateWidget);
56 Q_ASSERT(check);
57 }
58
59 m_timeAdded.start();
60 slotUpdateWidget();
61}
62
63CFrmDownload::~CFrmDownload()
64{
65 qDebug(log) << Q_FUNC_INFO;
66 delete ui;
67}
68
69void CFrmDownload::on_pbButton_clicked()
70{
71 switch(m_pDownload->state()) {
72 case QWebEngineDownloadRequest::DownloadRequested:
73 case QWebEngineDownloadRequest::DownloadInProgress: {
74 m_pDownload->cancel();
75 break;
76 }
77 case QWebEngineDownloadRequest::DownloadCancelled:
78 case QWebEngineDownloadRequest::DownloadInterrupted: {
79 m_pDownload->resume();
80 break;
81 }
82 case QWebEngineDownloadRequest::DownloadCompleted: {
83 RabbitCommon::CTools::LocateFileWithExplorer(
84 QDir(m_pDownload->downloadDirectory()).filePath(m_pDownload->downloadFileName()));
85 break;
86 }
87 default: {
88 emit sigRemoveClicked(this);
89 }
90 }
91}
92
93void CFrmDownload::slotUpdateWidget()
94{
95 if(!m_pDownload) return;
96 qreal totalBytes = m_pDownload->totalBytes();
97 qreal receivedBytes = m_pDownload->receivedBytes();
98 qreal bytesPerSecond = 0; // Initialized to 0 for a reasonable default value
99
100 // Check for division by zero
101 if (m_timeAdded.elapsed() != 0)
102 bytesPerSecond = receivedBytes / m_timeAdded.elapsed() * 1000;
103
104 auto state = m_pDownload->state();
105 switch (state) {
106 case QWebEngineDownloadRequest::DownloadRequested:
107 m_pDownload->accept();
108 break;
109 case QWebEngineDownloadRequest::DownloadInProgress:
110 if (totalBytes > 0) {
111 ui->progressBar->setValue(qRound(100 * receivedBytes / totalBytes));
112 ui->progressBar->setDisabled(false);
113 ui->progressBar->setFormat(
114 tr("%p% - %1 of %2 downloaded - %3/s")
115 .arg(CStats::Convertbytes(receivedBytes), CStats::Convertbytes(totalBytes),
116 CStats::Convertbytes(bytesPerSecond)));
117 } else {
118 ui->progressBar->setValue(0);
119 ui->progressBar->setDisabled(false);
120 ui->progressBar->setFormat(
121 tr("unknown size - %1 downloaded - %2/s")
122 .arg(CStats::Convertbytes(receivedBytes), CStats::Convertbytes(bytesPerSecond)));
123 }
124 break;
125 case QWebEngineDownloadRequest::DownloadCompleted:
126 ui->progressBar->setValue(100);
127 ui->progressBar->setDisabled(true);
128 ui->progressBar->setFormat(
129 tr("completed - %1 downloaded - %2/s")
130 .arg(CStats::Convertbytes(receivedBytes), CStats::Convertbytes(bytesPerSecond)));
131 break;
132 case QWebEngineDownloadRequest::DownloadCancelled:
133 ui->progressBar->setValue(0);
134 ui->progressBar->setDisabled(true);
135 ui->progressBar->setFormat(
136 tr("cancelled - %1 downloaded - %2/s")
137 .arg(CStats::Convertbytes(receivedBytes), CStats::Convertbytes(bytesPerSecond)));
138 break;
139 case QWebEngineDownloadRequest::DownloadInterrupted:
140 ui->progressBar->setValue(0);
141 ui->progressBar->setDisabled(true);
142 ui->progressBar->setFormat(
143 tr("interrupted: %1")
144 .arg(m_pDownload->interruptReasonString()));
145 break;
146 }
147
148 switch(state) {
149 case QWebEngineDownloadRequest::DownloadRequested:
150 case QWebEngineDownloadRequest::DownloadInProgress: {
151 static QIcon cancelIcon(QIcon::fromTheme("media-playback-stop"));
152 ui->pbButton->setIcon(cancelIcon);
153 ui->pbButton->setToolTip(tr("Stop downloading"));
154 break;
155 }
156 case QWebEngineDownloadRequest::DownloadCancelled:
157 case QWebEngineDownloadRequest::DownloadInterrupted: {
158 static QIcon cancelIcon(QIcon::fromTheme("view-refresh"));
159 ui->pbButton->setIcon(cancelIcon);
160 ui->pbButton->setToolTip(tr("Resumes downloading"));
161 break;
162 }
163 case QWebEngineDownloadRequest::DownloadCompleted: {
164 static QIcon cancelIcon(QIcon::fromTheme("folder-open"));
165 ui->pbButton->setIcon(cancelIcon);
166 ui->pbButton->setToolTip(tr("Show in folder"));
167 ui->progressBar->hide();
168 ui->lbFileInfo->setText(tr("Completed") + " - "
169 + CStats::Convertbytes(m_pDownload->totalBytes()));
170 ui->lbFileInfo->show();
171 QString szFile;
172#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
173 QDir d(m_pDownload->downloadDirectory());
174 szFile = d.absoluteFilePath(m_pDownload->downloadFileName());
175#else
176 szFile = m_pDownload->path();
177#endif
178 m_FileWatcher.addPath(szFile);
179 connect(&m_FileWatcher, &QFileSystemWatcher::fileChanged,
180 [&](const QString &path) {
181 QFile f(path);
182 if(!f.exists()) {
183 ui->lbFileInfo->setText(tr("The file has been deleted."));
184 ui->lbFileInfo->show();
185 ui->pbButton->hide();
186 }
187 });
188 break;
189 }
190 }
191}
192
193void CFrmDownload::slotCustomContextMenuRequested(const QPoint &pos)
194{
195 qDebug(log) << Q_FUNC_INFO;
196 QString szFile;
197#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
198 QDir d(m_pDownload->downloadDirectory());
199 szFile = d.absoluteFilePath(m_pDownload->downloadFileName());
200#else
201 szFile = m_pDownload->path();
202#endif
203 QFile downloadFile(szFile);
204 QMenu menu(this);
205 if(downloadFile.exists()) {
206 menu.addAction(QIcon::fromTheme("folder-open"), tr("Show in folder"),
207 this, [this, szFile](){
208 if(!m_pDownload) return;
209 RabbitCommon::CTools::LocateFileWithExplorer(
210 QDir(m_pDownload->downloadDirectory()).filePath(m_pDownload->downloadFileName()));
211 });
212 menu.addAction(QIcon::fromTheme("file-open"), tr("Open the file with the associated program"),
213 this, [this, szFile](){
214 if(!m_pDownload) return;
215 QDesktopServices::openUrl(QUrl::fromLocalFile(szFile));
216 });
217 }
218 menu.addAction(QIcon::fromTheme("edit-copy"), tr("Copy url to clipboard"),
219 this, [&](){
220 if(m_pDownload && QApplication::clipboard()) {
221 QApplication::clipboard()->setText(m_pDownload->url().toString());
222 }
223 });
224 menu.addAction(QIcon::fromTheme("list-remove"), tr("Remove from list"),
225 this, [&](){
226 emit sigRemoveClicked(this);
227 });
228 if(downloadFile.exists()) {
229 menu.addAction(QIcon::fromTheme("edit-delete"), tr("Delete"),
230 this, [&](){
231#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
232 QDir d(m_pDownload->downloadDirectory());
233 if(!d.remove(m_pDownload->downloadFileName()))
234 qCritical(log) << "Remove file fail." << d.absoluteFilePath(m_pDownload->downloadFileName());
235#else
236 QFile f(m_pDownload->path());
237 if(!f.remove())
238 qCritical(log) << "Remove file fail." << f.fileName();
239#endif
240 emit sigRemoveClicked(this);
241 });
242 }
243 QPoint p = pos;
244 QWidget* pW = qobject_cast<QWidget*>(sender());
245 if(pW)
246 p = pW->mapToGlobal(pos);
247 menu.exec(p);
248}
249
250void CFrmDownload::mouseDoubleClickEvent(QMouseEvent *event)
251{
252 qDebug(log) << Q_FUNC_INFO;
253 if(!m_pDownload) return;
254 QString szFile;
255#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
256 QDir d(m_pDownload->downloadDirectory());
257 szFile = d.absoluteFilePath(m_pDownload->downloadFileName());
258#else
259 szFile = m_pDownload->path();
260#endif
261 QDesktopServices::openUrl(QUrl::fromLocalFile(szFile));
262}
263
264void CFrmDownload::mouseReleaseEvent(QMouseEvent *event)
265{
266 qDebug(log) << Q_FUNC_INFO;
267 emit sigSelected(this);
268}