diff options
Diffstat (limited to 'examples/webenginewidgets/simplebrowser/downloadwidget.cpp')
-rw-r--r-- | examples/webenginewidgets/simplebrowser/downloadwidget.cpp | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/examples/webenginewidgets/simplebrowser/downloadwidget.cpp b/examples/webenginewidgets/simplebrowser/downloadwidget.cpp new file mode 100644 index 000000000..a80366f77 --- /dev/null +++ b/examples/webenginewidgets/simplebrowser/downloadwidget.cpp @@ -0,0 +1,152 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "downloadwidget.h" + +#include <QFileInfo> +#include <QUrl> +#include <QWebEngineDownloadItem> + +DownloadWidget::DownloadWidget(QWebEngineDownloadItem *download, QWidget *parent) + : QFrame(parent) + , m_download(download) + , m_timeAdded(QTime::currentTime()) +{ + setupUi(this); + m_dstName->setText(QFileInfo(m_download->path()).fileName()); + m_srcUrl->setText(m_download->url().toDisplayString()); + + connect(m_cancelButton, &QPushButton::clicked, + [this](bool) { + if (m_download->state() == QWebEngineDownloadItem::DownloadInProgress) + m_download->cancel(); + else + emit removeClicked(this); + }); + + connect(m_download, &QWebEngineDownloadItem::downloadProgress, + [this](qint64, qint64) { + updateWidget(); + }); + + connect(m_download, &QWebEngineDownloadItem::stateChanged, + [this](QWebEngineDownloadItem::DownloadState) { + updateWidget(); + }); + + updateWidget(); +} + +inline QString DownloadWidget::withUnit(qreal bytes) +{ + if (bytes < (1 << 10)) + return tr("%L1 B").arg(bytes); + else if (bytes < (1 << 20)) + return tr("%L1 KiB").arg(bytes / (1 << 10), 0, 'f', 2); + else if (bytes < (1 << 30)) + return tr("%L1 MiB").arg(bytes / (1 << 20), 0, 'f', 2); + else + return tr("%L1 GiB").arg(bytes / (1 << 30), 0, 'f', 2); +} + +void DownloadWidget::updateWidget() +{ + qreal totalBytes = m_download->totalBytes(); + qreal receivedBytes = m_download->receivedBytes(); + qreal bytesPerSecond = receivedBytes / m_timeAdded.elapsed() * 1000; + + auto state = m_download->state(); + switch (state) { + case QWebEngineDownloadItem::DownloadRequested: + Q_UNREACHABLE(); + 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)) + .arg(withUnit(totalBytes)) + .arg(withUnit(bytesPerSecond))); + } else { + m_progressBar->setValue(0); + m_progressBar->setDisabled(false); + m_progressBar->setFormat( + tr("unknown size - %1 downloaded - %2/s") + .arg(withUnit(receivedBytes)) + .arg(withUnit(bytesPerSecond))); + } + break; + case QWebEngineDownloadItem::DownloadCompleted: + m_progressBar->setValue(100); + m_progressBar->setDisabled(true); + m_progressBar->setFormat( + tr("completed - %1 downloaded - %2/s") + .arg(withUnit(receivedBytes)) + .arg(withUnit(bytesPerSecond))); + break; + case QWebEngineDownloadItem::DownloadCancelled: + m_progressBar->setValue(0); + m_progressBar->setDisabled(true); + m_progressBar->setFormat( + tr("cancelled - %1 downloaded - %2/s") + .arg(withUnit(receivedBytes)) + .arg(withUnit(bytesPerSecond))); + break; + case QWebEngineDownloadItem::DownloadInterrupted: + m_progressBar->setValue(0); + m_progressBar->setDisabled(true); + m_progressBar->setFormat( + tr("interrupted: %1") + .arg(m_download->interruptReasonString())); + break; + } + + if (state == QWebEngineDownloadItem::DownloadInProgress) { + static QIcon cancelIcon(QStringLiteral(":process-stop.png")); + m_cancelButton->setIcon(cancelIcon); + m_cancelButton->setToolTip(tr("Stop downloading")); + } else { + static QIcon removeIcon(QStringLiteral(":edit-clear.png")); + m_cancelButton->setIcon(removeIcon); + m_cancelButton->setToolTip(tr("Remove from list")); + } +} |