Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F85832342
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Authored By
Unknown
Size
11 KB
Referenced Files
None
Subscribers
None
View Options
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
Details
Attached
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)
Attached To
Mode
rK kazv
Attached
Detach File
Event Timeline