/* * This file is part of smolbote. It's copyrighted by the contributors recorded * in the version control history of the file, available from its original * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote * * SPDX-License-Identifier: GPL-3.0 */ #include "downloaditemwidget.h" #include "ui_downloaditemform.h" #include #include #include #include inline QString sizeString(qint64 size) { if(size < 1024) { return QString("%1 bytes").arg(size); } // KiB if(size < 1024 * 1024) { return QString("%1 kB").arg(size / 1024); } // MiB if(size < 1024 * 1024 * 1024) { return QString("%1 MB").arg(size / (1024 * 1024)); } // GiB return QString("%1 GB").arg(size / (1024 * 1024 * 1024)); } DownloadItemWidget::DownloadItemWidget(QWebEngineDownloadItem *m_item, QWidget *parent) : QWidget(parent) , ui(new Ui::DownloadItemForm) { Q_CHECK_PTR(item); m_item = item; ui->setupUi(this); { // pause/resume icons QIcon pauseIcon; pauseIcon.addPixmap(style()->standardPixmap(QStyle::SP_MediaPlay), QIcon::Normal, QIcon::Off); pauseIcon.addPixmap(style()->standardPixmap(QStyle::SP_MediaPause), QIcon::Normal, QIcon::On); ui->pause_toolButton->setIcon(pauseIcon); ui->abort_toolButton->setIcon(style()->standardIcon(QStyle::SP_MediaStop)); } ui->url_label->setText(item->url().toString()); ui->path_label->setText(QString("%1
%2").arg(item->downloadDirectory(), item->downloadFileName())); this->updateState(item->state()); connect(item, &QWebEngineDownloadItem::stateChanged, this, &DownloadItemWidget::updateState); connect(item, &QWebEngineDownloadItem::downloadProgress, this, &DownloadItemWidget::updateProgress); connect(item, &QWebEngineDownloadItem::finished, this, &DownloadItemWidget::updateFinished); connect(ui->abort_toolButton, &QToolButton::clicked, item, &QWebEngineDownloadItem::cancel); connect(ui->pause_toolButton, &QToolButton::clicked, item, [m_item](bool clicked) { clicked ? m_item->pause() : m_item->resume(); }); connect(ui->open_toolButton, &QToolButton::clicked, item, [m_item]() { QDesktopServices::openUrl(QUrl::fromLocalFile(m_item->downloadDirectory() + '/' + m_item->downloadFileName())); }); } DownloadItemWidget::~DownloadItemWidget() { delete ui; } void DownloadItemWidget::updateState(QWebEngineDownloadItem::DownloadState state) { switch(state) { case QWebEngineDownloadItem::DownloadRequested: ui->status_label->setText(tr("Requested")); ui->pause_toolButton->setEnabled(true); ui->abort_toolButton->setEnabled(true); ui->open_toolButton->setEnabled(false); break; case QWebEngineDownloadItem::DownloadInProgress: ui->status_label->setText(tr("In progress")); ui->pause_toolButton->setEnabled(true); ui->abort_toolButton->setEnabled(true); ui->open_toolButton->setEnabled(false); break; case QWebEngineDownloadItem::DownloadCompleted: ui->status_label->setText(tr("Completed")); ui->pause_toolButton->setEnabled(false); ui->abort_toolButton->setEnabled(false); ui->open_toolButton->setEnabled(true); break; case QWebEngineDownloadItem::DownloadCancelled: ui->status_label->setText(tr("Cancelled")); ui->pause_toolButton->setEnabled(false); ui->abort_toolButton->setEnabled(false); ui->open_toolButton->setEnabled(false); break; case QWebEngineDownloadItem::DownloadInterrupted: ui->status_label->setText(tr("Interrupted")); ui->pause_toolButton->setEnabled(false); ui->abort_toolButton->setEnabled(false); ui->open_toolButton->setEnabled(false); break; default: break; } } void DownloadItemWidget::updateProgress(qint64 value, qint64 total) { ui->progressBar->setValue(static_cast((static_cast(value) / static_cast(total)) * 100)); ui->progressBar->setFormat(QString("%1 / %2").arg(sizeString(value), sizeString(total))); } void DownloadItemWidget::updateFinished() { ui->progressBar->setValue(ui->progressBar->maximum()); ui->pause_toolButton->hide(); ui->abort_toolButton->hide(); ui->open_toolButton->show(); // generate a preview tooltip if(item->mimeType().startsWith("image")) { const QPixmap pixmap(item->downloadDirectory()+'/'+item->downloadFileName()); const QPixmap thumbnail = pixmap.scaledToWidth(qMax(400, pixmap.width()), Qt::SmoothTransformation); QByteArray imageData; QBuffer buffer(&imageData); thumbnail.save(&buffer, "PNG"); const auto tooltip = QString("preview"); setToolTip(tooltip); } }