Page MenuHomePhorge

No OneTemporary

Authored By
Unknown
Size
11 KB
Referenced Files
None
Subscribers
None
diff --git a/src/contents/ui/MediaFileMenu.qml b/src/contents/ui/MediaFileMenu.qml
index c704799..64d0af3 100644
--- a/src/contents/ui/MediaFileMenu.qml
+++ b/src/contents/ui/MediaFileMenu.qml
@@ -1,57 +1,57 @@
/*
* This file is part of kazv.
- * SPDX-FileCopyrightText: 2020 Tusooa Zhu <tusooa@kazv.moe>
+ * SPDX-FileCopyrightText: 2022 nannanko <nannanko@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import QtQuick 2.15
import QtQuick.Controls 2.15
import Qt.labs.platform 1.1 as Platform
import org.kde.kirigami 2.13 as Kirigami
import '.' as Types
TapHandler {
property var kazvIO
property var url
signal startDownload
acceptedButtons: Qt.LeftButton | Qt.RightButton
onSingleTapped: {
if (eventPoint.event.button === Qt.RightButton) {
optionMenu.popup(parent)
}
if (eventPoint.event.button === Qt.LeftButton) {
// TODO: Open with default program
}
}
onLongPressed: {
optionMenu.popup(parent)
}
property var optionMenu: Menu {
Kirigami.Action {
text: l10n.get('menu-option-view')
// shortcut: StandardKey.Open
// TODO: open with default program
}
Kirigami.Action {
text: l10n.get('menu-option-save-as')
// Can't think of a suitable shortcut key
// shortcut: StandardKey.Save
onTriggered: {
fileDialog.open()
}
}
}
property var fileDialog: Platform.FileDialog {
acceptLabel: l10n.get('menu-option-save-as')
fileMode: Platform.FileDialog.SaveFile
onAccepted: {
kazvIO.download(file)
startDownload()
}
}
}
diff --git a/src/contents/ui/ProgressBar.qml b/src/contents/ui/ProgressBar.qml
index b475ab0..a92a601 100644
--- a/src/contents/ui/ProgressBar.qml
+++ b/src/contents/ui/ProgressBar.qml
@@ -1,57 +1,57 @@
/*
* This file is part of kazv.
- * SPDX-FileCopyrightText: 2020 Tusooa Zhu <tusooa@kazv.moe>
+ * SPDX-FileCopyrightText: 2022 nannanko <nannanko@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import org.kde.kirigami 2.13 as Kirigami
import moe.kazv.mxc.kazv 0.0 as MK
RowLayout {
id: progressBarLayout
property var kazvIO
visible: false
Layout.preferredWidth: image.width
ProgressBar {
id: progressBar
Layout.fillWidth: true
value: kazvIO.progress
}
Kirigami.Action {
id: pauseAction
iconName: "media-playback-pause"
property var suspended: false
onTriggered: {
if (suspended) {
suspended = false
kazvIO.resume()
} else {
kazvIO.suspend()
suspended = true
iconName: "media-playback-start"
pauseBtn.icon.name = "media-playback-start"
}
}
}
Kirigami.Action {
id: cancelAction
iconName: "dialog-cancel"
onTriggered: {
pauseAction.suspended = false
kazvIO.cancel()
}
}
RoundButton {
id: pauseBtn
icon.name: "media-playback-pause"
onClicked: pauseAction.trigger()
}
RoundButton {
icon.name: "dialog-cancel"
onClicked: cancelAction.trigger()
}
}
diff --git a/src/kazv-io-manager.cpp b/src/kazv-io-manager.cpp
index d8b7ae9..711ac89 100644
--- a/src/kazv-io-manager.cpp
+++ b/src/kazv-io-manager.cpp
@@ -1,96 +1,96 @@
/*
* This file is part of kazv.
- * SPDX-FileCopyrightText: 2021 Tusooa Zhu <tusooa@kazv.moe>
+ * SPDX-FileCopyrightText: 2022 nannanko <nannanko@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#include "kazv-io-manager.hpp"
#include <QObject>
#include <QVector>
#include <KIO/TransferJob>
#include <QSaveFile>
#include <QPointer>
#include <QUrl>
#include <QIODevice>
#include <algorithm>
#include <execution>
struct KazvIODownloadJob {
QPointer<KIO::TransferJob> job;
QPointer<QSaveFile> file;
};
struct KazvIOManagerPrivate {
QVector<KazvIODownloadJob> jobs;
};
KazvIOManager::KazvIOManager(QObject *parent)
: QObject(parent)
, m_d(new KazvIOManagerPrivate)
{
}
KazvIOManager::~KazvIOManager() = default;
QPointer<KIO::TransferJob> KazvIOManager::startNewDownloadJob(QUrl &url, QUrl &localFileUrl)
{
KazvIODownloadJob downloadJob;
auto job = KIO::get(url);
downloadJob.job = job;
downloadJob.file = new QSaveFile(localFileUrl.path());
downloadJob.file->open(QIODevice::WriteOnly);
connect(downloadJob.job, &KIO::TransferJob::data, this, &KazvIOManager::writeFile);
connect(downloadJob.job, &KJob::result, this, &KazvIOManager::cleanJob);
m_d->jobs.push_back(downloadJob);
downloadJob.job->start();
return job;
}
void KazvIOManager::suspendJob(QUrl &url)
{
auto targetJob = std::find_if(std::execution::seq,
m_d->jobs.begin(),
m_d->jobs.end(),
[&url](auto it) { return it.job->url() == url; });
targetJob->job->suspend();
}
void KazvIOManager::resumeJob(QUrl &url)
{
auto targetJob = std::find_if(std::execution::seq,
m_d->jobs.begin(),
m_d->jobs.end(),
[&url](auto it) { return it.job->url() == url; });
targetJob->job->resume();
}
void KazvIOManager::cancelJob(QUrl &url)
{
auto targetJob = std::find_if(std::execution::seq,
m_d->jobs.begin(),
m_d->jobs.end(),
[&url](auto it) { return it.job->url() == url; });
targetJob->job->kill();
}
void KazvIOManager::writeFile(KJob *job, const QByteArray &data)
{
auto targetJob = std::find_if(std::execution::seq,
m_d->jobs.begin(),
m_d->jobs.end(),
[job](auto it) { return it.job->url() == qobject_cast<KIO::TransferJob*>(job)->url(); });
targetJob->file->write(data);
}
void KazvIOManager::cleanJob(KJob *job)
{
auto targetJob = std::find_if(std::execution::seq,
m_d->jobs.begin(),
m_d->jobs.end(),
[job](auto it) { return it.job->url() == qobject_cast<KIO::TransferJob*>(job)->url(); });
targetJob->file->commit();
delete (QSaveFile*)targetJob->file;
m_d->jobs.erase(targetJob);
}
diff --git a/src/kazv-io-manager.hpp b/src/kazv-io-manager.hpp
index 1e19348..a92b498 100644
--- a/src/kazv-io-manager.hpp
+++ b/src/kazv-io-manager.hpp
@@ -1,37 +1,37 @@
/*
* This file is part of kazv.
- * SPDX-FileCopyrightText: 2021 Tusooa Zhu <tusooa@kazv.moe>
+ * SPDX-FileCopyrightText: 2022 nannanko <nannanko@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#pragma once
#include <QObject>
#include <QtQml>
#include <QUrl>
#include <KIO/Job>
#include <QByteArray>
#include <QPointer>
#include <memory>
struct KazvIOManagerPrivate;
class KazvIOManager : public QObject {
Q_OBJECT
QML_ELEMENT
std::unique_ptr<KazvIOManagerPrivate> m_d;
public:
explicit KazvIOManager(QObject *parent = 0);
~KazvIOManager() override;
QPointer<KIO::TransferJob> startNewDownloadJob(QUrl &url, QUrl &localFileUrl);
void suspendJob(QUrl &url);
void resumeJob(QUrl &url);
void cancelJob(QUrl &url);
private Q_SLOTS:
void writeFile(KJob *job, const QByteArray &data);
void cleanJob(KJob *job);
};
diff --git a/src/kazv-io.cpp b/src/kazv-io.cpp
index 0d9ea26..27ae78e 100644
--- a/src/kazv-io.cpp
+++ b/src/kazv-io.cpp
@@ -1,97 +1,97 @@
/*
* This file is part of kazv.
- * SPDX-FileCopyrightText: 2021 Tusooa Zhu <tusooa@kazv.moe>
+ * SPDX-FileCopyrightText: 2022 nannanko <nannanko@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#include "kazv-io.hpp"
#include "kazv-io-manager.hpp"
#include <QUrl>
#include <QObject>
struct KazvIOPrivate {
QPointer<KazvIOManager> manager;
float progress;
QUrl url;
};
KazvIO::KazvIO(QObject *parent)
: QObject(parent)
, m_d(new KazvIOPrivate)
{
}
KazvIO::~KazvIO() = default;
/*
* This function is only applicable to a single thread,
* if the manager is located in other threads, please modify this function appropriately
*/
void KazvIO::download(QUrl localFileUrl)
{
auto job = m_d->manager->startNewDownloadJob(m_d->url, localFileUrl);
connect(job, &KJob::percentChanged, this, &KazvIO::updatePercent);
connect(job, &KJob::result, this, &KazvIO::result);
}
/*
* This function is only applicable to a single thread,
* if the manager is located in other threads, please modify this function appropriately
*/
void KazvIO::suspend()
{
m_d->manager->suspendJob(m_d->url);
}
/*
* This function is only applicable to a single thread,
* if the manager is located in other threads, please modify this function appropriately
*/
void KazvIO::resume()
{
m_d->manager->resumeJob(m_d->url);
}
/*
* This function is only applicable to a single thread,
* if the manager is located in other threads, please modify this function appropriately
*/
void KazvIO::cancel()
{
m_d->manager->cancelJob(m_d->url);
Q_EMIT result();
}
float KazvIO::progress()
{
return m_d->progress;
}
QUrl KazvIO::url()
{
return m_d->url;
}
void KazvIO::setUrl(QUrl url)
{
m_d->url = url;
Q_EMIT urlChanged();
}
KazvIOManager *KazvIO::manager()
{
return m_d->manager;
}
void KazvIO::setManager(KazvIOManager *manager)
{
m_d->manager = manager;
Q_EMIT managerChanged();
}
void KazvIO::updatePercent(KJob *job, unsigned long percent)
{
m_d->progress = 1.0 * percent / 100;
Q_EMIT progressChanged();
}
diff --git a/src/kazv-io.hpp b/src/kazv-io.hpp
index 77ca018..65328c7 100644
--- a/src/kazv-io.hpp
+++ b/src/kazv-io.hpp
@@ -1,76 +1,82 @@
+/*
+ * This file is part of kazv.
+ * SPDX-FileCopyrightText: 2022 nannanko <nannanko@kazv.moe>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
#pragma once
#include "kazv-io-manager.hpp"
#include <KIO/Job>
#include <QObject>
#include <QUrl>
#include <QtQml>
#include <memory>
struct KazvIOPrivate;
class KazvIO : public QObject {
Q_OBJECT
QML_ELEMENT
/*
* Progress in decimal form, from 0 to 1
*/
Q_PROPERTY(float progress READ progress NOTIFY progressChanged)
/*
* url of the file to download or upload.
*/
Q_PROPERTY(QUrl url READ url WRITE setUrl NOTIFY urlChanged)
/*
* The KazvIOManager of the application,
* KazvIO will look for the download job determined by the url attribute in the manager,
* and perform operations such as pausing, canceling, etc.
*/
Q_PROPERTY(KazvIOManager *manager READ manager WRITE setManager NOTIFY managerChanged)
private:
std::unique_ptr<KazvIOPrivate> m_d;
public:
explicit KazvIO(QObject *parent = 0);
~KazvIO() override;
/**
* QML should call this function to initiate a download.
* url is the file to download.
* localFileUrl is the file to store.
*/
Q_INVOKABLE void download(QUrl localFileUrl);
/**
* Pause the download.
*/
Q_INVOKABLE void suspend();
/**
* Resume the download.
*/
Q_INVOKABLE void resume();
/**
* Cancel the download.
*/
Q_INVOKABLE void cancel();
float progress();
QUrl url();
void setUrl(QUrl url);
KazvIOManager *manager();
void setManager(KazvIOManager *manager);
Q_SIGNALS:
void progressChanged();
void urlChanged();
void managerChanged();
/*
* Sending this signal means that the job has been destroyed and the download or upload task has ended.
* This signal is always emitted once, whether it is a normal exit or an error.
*/
void result();
private Q_SLOTS:
void updatePercent(KJob *job, unsigned long percent);
};

File Metadata

Mime Type
text/x-diff
Expires
Mon, Nov 2, 8:11 AM (18 h, 5 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1803730
Default Alt Text
(11 KB)

Event Timeline