diff options
author | Aqua-sama <aqua@iserlohn-fortress.net> | 2018-01-03 16:39:32 +0100 |
---|---|---|
committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2018-01-03 16:39:32 +0100 |
commit | 85d9f14aa8bac16ab341662c770b64a15c21628b (patch) | |
tree | 422db18e798646cd4bc98abf342f25c09c0bdf1d /lib/downloads | |
parent | Download items' width should no longer exceed the list width (diff) | |
download | smolbote-85d9f14aa8bac16ab341662c770b64a15c21628b.tar.xz |
Changed from qbs to cmake
Diffstat (limited to 'lib/downloads')
-rw-r--r-- | lib/downloads/CMakeLists.txt | 13 | ||||
-rw-r--r-- | lib/downloads/downloadsform.ui | 24 | ||||
-rw-r--r-- | lib/downloads/downloadswidget.cpp | 91 | ||||
-rw-r--r-- | lib/downloads/downloadswidget.h | 38 | ||||
-rw-r--r-- | lib/downloads/widgets/downloaditemform.ui | 74 | ||||
-rw-r--r-- | lib/downloads/widgets/downloaditemwidget.cpp | 103 | ||||
-rw-r--r-- | lib/downloads/widgets/downloaditemwidget.h | 43 | ||||
-rw-r--r-- | lib/downloads/widgets/elidedlabel.cpp | 85 | ||||
-rw-r--r-- | lib/downloads/widgets/elidedlabel.h | 85 |
9 files changed, 556 insertions, 0 deletions
diff --git a/lib/downloads/CMakeLists.txt b/lib/downloads/CMakeLists.txt new file mode 100644 index 0000000..ca67f0a --- /dev/null +++ b/lib/downloads/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.1.0) + +add_library(downloads + downloadsform.ui + downloadswidget.cpp + downloadswidget.h + widgets/downloaditemform.ui + widgets/downloaditemwidget.cpp + widgets/downloaditemwidget.h + widgets/elidedlabel.cpp + widgets/elidedlabel.h) + +target_link_libraries(downloads Qt5::Widgets Qt5::WebEngineWidgets)
\ No newline at end of file diff --git a/lib/downloads/downloadsform.ui b/lib/downloads/downloadsform.ui new file mode 100644 index 0000000..43a0d49 --- /dev/null +++ b/lib/downloads/downloadsform.ui @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>DownloadDialog</class> + <widget class="QWidget" name="DownloadDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>600</width> + <height>420</height> + </rect> + </property> + <property name="windowTitle"> + <string>Downloads</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QListWidget" name="listWidget"/> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/lib/downloads/downloadswidget.cpp b/lib/downloads/downloadswidget.cpp new file mode 100644 index 0000000..f9a8f34 --- /dev/null +++ b/lib/downloads/downloadswidget.cpp @@ -0,0 +1,91 @@ +/* + * 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: git://neueland.iserlohn-fortress.net/smolbote.git + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#include "downloadswidget.h" +#include "ui_downloadsform.h" + +#include <QWebEngineDownloadItem> +#include <QUrl> +#include <QFileDialog> +#include <QListWidget> +#include <QLabel> +#include "widgets/downloaditemwidget.h" + +DownloadsWidget::DownloadsWidget(const QString &downloadPath, QWidget *parent) : + QDialog(parent), + ui(new Ui::DownloadDialog) +{ + // make sure this dialog does not get deleted on close + setAttribute(Qt::WA_DeleteOnClose, false); + setWindowTitle(tr("Downloads")); + + ui->setupUi(this); + + m_downloadPath = downloadPath; + + connect(ui->listWidget, &QListWidget::currentItemChanged, this, [this](QListWidgetItem *current, QListWidgetItem *previous) { + DownloadItemWidget *currentWidget = qobject_cast<DownloadItemWidget*>(ui->listWidget->itemWidget(current)); + currentWidget->showDetails(); + currentWidget->setFixedWidth(ui->listWidget->viewport()->width()); + currentWidget->adjustSize(); + current->setSizeHint(currentWidget->size()); + + DownloadItemWidget *previousWidget = qobject_cast<DownloadItemWidget*>(ui->listWidget->itemWidget(previous)); + if(previousWidget != nullptr) { + previousWidget->hideDetails(); + previousWidget->setFixedWidth(ui->listWidget->viewport()->width()); + previousWidget->adjustSize(); + previous->setSizeHint(previousWidget->size()); + } + }); +} + +DownloadsWidget::~DownloadsWidget() +{ + delete ui; +} + +void DownloadsWidget::addDownload(QWebEngineDownloadItem *item) +{ + this->show(); + + QString filepath = QFileDialog::getSaveFileName(this, + tr("Save"), + m_downloadPath + "/" + QFileInfo(item->path()).fileName()); + + if(filepath.isEmpty()) { + // user cancelled the save dialog + item->cancel(); + return; + } + + item->setPath(filepath); + + QListWidgetItem *listItem = new QListWidgetItem(); + int rowIndex = ui->listWidget->count(); + ui->listWidget->insertItem(rowIndex, listItem); + + DownloadItemWidget *form = new DownloadItemWidget(item, this); + ui->listWidget->setItemWidget(listItem, form); + + item->accept(); + + ui->listWidget->setCurrentRow(rowIndex); +} + +void DownloadsWidget::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); + + for(int i = 0; i < ui->listWidget->count(); ++i) { + QWidget *w = ui->listWidget->itemWidget(ui->listWidget->item(i)); + w->setFixedWidth(ui->listWidget->viewport()->width()); + w->adjustSize(); + ui->listWidget->item(i)->setSizeHint(w->size()); + } +} diff --git a/lib/downloads/downloadswidget.h b/lib/downloads/downloadswidget.h new file mode 100644 index 0000000..8c9ea21 --- /dev/null +++ b/lib/downloads/downloadswidget.h @@ -0,0 +1,38 @@ +/* + * 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: git://neueland.iserlohn-fortress.net/smolbote.git + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#ifndef DOWNLOADDIALOG_H +#define DOWNLOADDIALOG_H + +#include <QDialog> + +namespace Ui { +class DownloadDialog; +} + +class QWebEngineDownloadItem; +class DownloadsWidget : public QDialog +{ + Q_OBJECT + +public: + explicit DownloadsWidget(const QString &downloadPath, QWidget *parent = nullptr); + ~DownloadsWidget(); + +public slots: + void addDownload(QWebEngineDownloadItem *item); + +protected: + void resizeEvent(QResizeEvent *event) override; + +private: + Ui::DownloadDialog *ui; + QString m_downloadPath; +}; + +#endif // DOWNLOADDIALOG_H diff --git a/lib/downloads/widgets/downloaditemform.ui b/lib/downloads/widgets/downloaditemform.ui new file mode 100644 index 0000000..17f1d6a --- /dev/null +++ b/lib/downloads/widgets/downloaditemform.ui @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>DownloadItemForm</class> + <widget class="QWidget" name="DownloadItemForm"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>500</width> + <height>122</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="spacing"> + <number>0</number> + </property> + <item> + <widget class="ElidedLabel" name="url_label"> + <property name="text"> + <string>[url]</string> + </property> + </widget> + </item> + <item> + <widget class="QProgressBar" name="progressBar"> + <property name="value"> + <number>24</number> + </property> + </widget> + </item> + <item> + <widget class="QWidget" name="detailsWidget" native="true"> + <layout class="QVBoxLayout" name="detailsLayout"> + <item> + <widget class="QLabel" name="status_label"> + <property name="text"> + <string>status_label</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="path_label"> + <property name="text"> + <string>path_label</string> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>ElidedLabel</class> + <extends>QLabel</extends> + <header>widgets/elidedlabel.h</header> + </customwidget> + </customwidgets> + <resources/> + <connections/> +</ui> diff --git a/lib/downloads/widgets/downloaditemwidget.cpp b/lib/downloads/widgets/downloaditemwidget.cpp new file mode 100644 index 0000000..fff3cfc --- /dev/null +++ b/lib/downloads/widgets/downloaditemwidget.cpp @@ -0,0 +1,103 @@ +/* + * 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: git://neueland.iserlohn-fortress.net/smolbote.git + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#include "downloaditemwidget.h" +#include "ui_downloaditemform.h" + +#include <QUrl> +#include <QLabel> + +DownloadItemWidget::DownloadItemWidget(QWebEngineDownloadItem *item, QWidget *parent) : + QWidget(parent), + ui(new Ui::DownloadItemForm) +{ + m_item = item; + + ui->setupUi(this); + + ui->url_label->setContent(item->url().toString()); + ui->detailsWidget->hide(); + + ui->path_label->setText(item->path()); + + connect(item, &QWebEngineDownloadItem::stateChanged, this, &DownloadItemWidget::updateState); + connect(item, &QWebEngineDownloadItem::downloadProgress, this, &DownloadItemWidget::updateProgress); + connect(item, &QWebEngineDownloadItem::finished, this, &DownloadItemWidget::updateFinished); +} + +DownloadItemWidget::~DownloadItemWidget() +{ + delete ui; +} + +void DownloadItemWidget::showDetails() +{ + ui->detailsWidget->show(); +} + +void DownloadItemWidget::hideDetails() +{ + ui->detailsWidget->hide(); +} + +QWebEngineDownloadItem *DownloadItemWidget::item() const +{ + return m_item; +} + +QString DownloadItemWidget::sizeString(int size) const +{ + 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)); +} + +void DownloadItemWidget::updateState(QWebEngineDownloadItem::DownloadState state) +{ + switch (state) { + case QWebEngineDownloadItem::DownloadRequested: + ui->status_label->setText(tr("Requested")); + break; + case QWebEngineDownloadItem::DownloadInProgress: + ui->status_label->setText(tr("In progress")); + break; + case QWebEngineDownloadItem::DownloadCompleted: + ui->status_label->setText(tr("Completed")); + break; + case QWebEngineDownloadItem::DownloadCancelled: + ui->status_label->setText(tr("Cancelled")); + break; + case QWebEngineDownloadItem::DownloadInterrupted: + ui->status_label->setText(tr("Interrupted")); + break; + default: + break; + } +} + +void DownloadItemWidget::updateProgress(qint64 value, qint64 total) +{ + ui->progressBar->setMaximum(total); + ui->progressBar->setValue(value); + ui->progressBar->setFormat(QString("%1 / %2").arg(sizeString(value), sizeString(total))); +} + +void DownloadItemWidget::updateFinished() +{ + ui->progressBar->setValue(ui->progressBar->maximum()); +} diff --git a/lib/downloads/widgets/downloaditemwidget.h b/lib/downloads/widgets/downloaditemwidget.h new file mode 100644 index 0000000..c6246da --- /dev/null +++ b/lib/downloads/widgets/downloaditemwidget.h @@ -0,0 +1,43 @@ +/* + * 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: git://neueland.iserlohn-fortress.net/smolbote.git + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#ifndef DOWNLOADITEMFORM_H +#define DOWNLOADITEMFORM_H + +#include <QWidget> +#include <QWebEngineDownloadItem> + +namespace Ui { +class DownloadItemForm; +} + +class DownloadItemWidget : public QWidget +{ + Q_OBJECT + +public: + explicit DownloadItemWidget(QWebEngineDownloadItem *item, QWidget *parent = 0); + ~DownloadItemWidget(); + + void showDetails(); + void hideDetails(); + + QWebEngineDownloadItem *item() const; + QString sizeString(int size) const; + +private slots: + void updateState(QWebEngineDownloadItem::DownloadState state); + void updateProgress(qint64 value, qint64 total); + void updateFinished(); + +private: + Ui::DownloadItemForm *ui; + QWebEngineDownloadItem *m_item; +}; + +#endif // DOWNLOADITEMFORM_H diff --git a/lib/downloads/widgets/elidedlabel.cpp b/lib/downloads/widgets/elidedlabel.cpp new file mode 100644 index 0000000..dc17d32 --- /dev/null +++ b/lib/downloads/widgets/elidedlabel.cpp @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, 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$ +** +****************************************************************************/ +/* + * 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: git://neueland.iserlohn-fortress.net/smolbote.git + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "elidedlabel.h" + +#include <QPainter> +#include <QTextLayout> +#include <QDebug> + +ElidedLabel::ElidedLabel(QWidget *parent) + : QLabel(parent) + , elided(false) + , content("elided_label") +{ + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); +} + +void ElidedLabel::setContent(const QString &newText) +{ + content = newText; + setText(newText); +} + +void ElidedLabel::resizeEvent(QResizeEvent *event) +{ + QLabel::resizeEvent(event); + + QFontMetrics font = this->fontMetrics(); + QString elidedLine = font.elidedText(content, Qt::ElideRight, width()); + setText(elidedLine); +} diff --git a/lib/downloads/widgets/elidedlabel.h b/lib/downloads/widgets/elidedlabel.h new file mode 100644 index 0000000..d0f6221 --- /dev/null +++ b/lib/downloads/widgets/elidedlabel.h @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, 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$ +** +****************************************************************************/ +/* + * 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: git://neueland.iserlohn-fortress.net/smolbote.git + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ELIDEDLABEL_H +#define ELIDEDLABEL_H + +#include <QLabel> + +class ElidedLabel : public QLabel +{ + +public: + explicit ElidedLabel(QWidget *parent = nullptr); + + void setContent(const QString &text); + const QString & text() const { + return content; + } + bool isElided() const { + return elided; + } + +protected: + void resizeEvent(QResizeEvent *event) override; + +private: + bool elided; + QString content; +}; + +#endif // ELIDEDLABEL_H |