Page MenuHomePhorge

No OneTemporary

Size
8 KB
Referenced Files
None
Subscribers
None
diff --git a/src/contents/ui/RoomPage.qml b/src/contents/ui/RoomPage.qml
index abeba4e..ec95101 100644
--- a/src/contents/ui/RoomPage.qml
+++ b/src/contents/ui/RoomPage.qml
@@ -1,29 +1,56 @@
/*
* This file is part of kazv.
* SPDX-FileCopyrightText: 2020 Tusooa Zhu <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import QtQuick 2.2
import QtQuick.Layouts 1.15
import QtQuick.Controls 2.15
import org.kde.kirigami 2.13 as Kirigami
+import moe.kazv.mxc.kazv 0.0 as MK
import '.' as Kazv
Kirigami.ScrollablePage {
id: roomPage
property string roomId: ''
property var room: sdkVars.roomList.room(roomId)
+ property var uploadJobs: []
title: room.name || roomId
RoomTimelineView {
timeline: room.timeline()
}
- footer: Kazv.SendMessageBox {
- room: roomPage.room
+ onRoomChanged: {
+ uploadJobs = root.kazvIOManager.getUploadJobs(room.roomId)
+ }
+
+ footer: ColumnLayout {
+ width: parent.width
+ ListView {
+ id: uploadList
+ width: parent.width
+ height: contentHeight
+ model: uploadJobs.length
+ delegate: ProgressBar {
+ width: parent.width
+ property var kazvIO: MK.KazvIO {
+ job: roomPage.uploadJobs[index]
+ }
+ value: kazvIO.progress
+ }
+ anchors.bottom: sendMessageBos.top
+ }
+ Kazv.SendMessageBox {
+ id: sendMessageBos
+ room: roomPage.room
+ onStartNewJob: {
+ uploadJobs = root.kazvIOManager.getUploadJobs(room.roomId)
+ }
+ }
}
}
diff --git a/src/contents/ui/SendMessageBox.qml b/src/contents/ui/SendMessageBox.qml
index 5935903..8a2ed24 100644
--- a/src/contents/ui/SendMessageBox.qml
+++ b/src/contents/ui/SendMessageBox.qml
@@ -1,74 +1,71 @@
/*
* This file is part of kazv.
* SPDX-FileCopyrightText: 2020-2021 Tusooa Zhu <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import QtQuick 2.15
import QtQuick.Layouts 1.15
import QtQuick.Controls 2.15
import Qt.labs.platform 1.1 as Platform
import org.kde.kirigami 2.13 as Kirigami
import moe.kazv.mxc.kazv 0.0 as MK
import '.' as Kazv
RowLayout {
property var room
-
- property var kazvIO: MK.KazvIO {
- id: kazvIO
- }
+ signal startNewJob
onRoomChanged: {
textArea.text = room.localDraft
}
TextArea {
id: textArea
property var shortcutList: ["Ctrl+Return", "Ctrl+Enter"]
placeholderText: l10n.get('send-message-box-input-placeholder')
Layout.fillWidth: true
wrapMode: TextEdit.Wrap
onTextChanged: {
room.localDraft = text
}
// Shortcut keys for sending messages (TODO: Shortcut keys customized by the user)
Shortcut {
sequences: textArea.shortcutList
onActivated: {
sendAction.trigger()
}
}
}
Kirigami.Action {
id: sendAction
iconName: "document-send"
onTriggered: {
room.sendTextMessage(textArea.text)
textArea.text = ""
}
}
Kirigami.Action {
id:sendMediaFileAction
iconName: "document-send-symbolic"
onTriggered: {
fileDialog.open()
}
}
property var fileDialog: Platform.FileDialog {
onAccepted: {
- kazvIO.job = root.kazvIOManager.startNewUploadJob(matrixSdk.serverUrl, file, matrixSdk.token, room)
+ root.kazvIOManager.startNewUploadJob(matrixSdk.serverUrl, file, matrixSdk.token, room)
+ startNewJob()
}
}
ToolButton {
icon.name: "document-send-symbolic"
onClicked: sendMediaFileAction.trigger()
}
ToolButton {
icon.name: "document-send"
onClicked: sendAction.trigger()
}
-
}
diff --git a/src/kazv-io-manager.cpp b/src/kazv-io-manager.cpp
index f005e5f..a32b8f0 100644
--- a/src/kazv-io-manager.cpp
+++ b/src/kazv-io-manager.cpp
@@ -1,82 +1,92 @@
/*
* This file is part of kazv.
* SPDX-FileCopyrightText: 2022 nannanko <nannanko@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#include "kazv-io-manager.hpp"
#include "kazv-io-job.hpp"
#include "matrix-room.hpp"
#include <api/csapi/content-repo.hpp>
#include <file-desc.hpp>
#include <QObject>
#include <QIODevice>
#include <QFile>
#include <QSaveFile>
#include <QPointer>
#include <QSharedPointer>
#include <QUrl>
#include <QMap>
#include <QMultiMap>
#include <string>
struct KazvIOManagerPrivate
{
QMap<QString, QPointer<KazvIODownloadJob>> downloadJobs;
QMultiMap<QString, QPointer<KazvIOUploadJob>> uploadJobs;
};
KazvIOManager::KazvIOManager(QObject *parent)
: QObject(parent)
, m_d(new KazvIOManagerPrivate)
{
}
KazvIOManager::~KazvIOManager() = default;
KazvIOBaseJob *KazvIOManager::startNewDownloadJob(const QUrl &serverUrl, const QUrl &localFileUrl, const QString &jobId)
{
auto downloadJob = QPointer<KazvIODownloadJob>(new KazvIODownloadJob());
downloadJob->setJob(KIO::get(serverUrl));
downloadJob->setFile(new QSaveFile(localFileUrl.path(), downloadJob.data()));
m_d->downloadJobs[jobId] = downloadJob;
return downloadJob.data();
}
KazvIOBaseJob *KazvIOManager::startNewUploadJob(const QUrl &serverUrl, const QUrl &localFileUrl, const QString &token, MatrixRoom *room)
{
auto uploadJob = QPointer<KazvIOUploadJob>(new KazvIOUploadJob());
uploadJob->setFile(new QFile(localFileUrl.path(), uploadJob.data()));
auto kazvUploadJob = Kazv::Api::UploadContentJob(serverUrl.toString().toStdString(), token.toStdString(), Kazv::FileDesc(std::string()));
uploadJob->setJob(KIO::http_post(QString(kazvUploadJob.url().data()), uploadJob->file().data()));
uploadJob->job()->addMetaData(QString("content-type") , QMimeDatabase().mimeTypeForFile(localFileUrl.path()).name());
uploadJob->job()->addMetaData("customHTTPHeader", QString("Authorization: ").append(kazvUploadJob.requestHeader()->at("Authorization").data()));
uploadJob->job()->addMetaData("PropagateHttpHeader", "true");
uploadJob->setRoom(room);
uploadJob->setLocalFileUrl(localFileUrl);
auto jobId = room->roomId();
connect(uploadJob.data(), &KazvIOUploadJob::result, this, [this, jobId, uploadJob]() {
m_d->uploadJobs.remove(jobId, uploadJob);
uploadJob->deleteLater();
});
m_d->uploadJobs.insert(jobId, uploadJob);
return uploadJob.data();
}
KazvIOBaseJob *KazvIOManager::getDownloadJob(const QString &jobId)
{
auto targetJob = m_d->downloadJobs.find(jobId);
if (targetJob == m_d->downloadJobs.end()) {
return nullptr;
}
return targetJob.value().data();
}
void KazvIOManager::deleteDownloadJob(const QString &jobId)
{
m_d->downloadJobs[jobId]->deleteLater();
m_d->downloadJobs.remove(jobId);
}
+
+QList<QObject*> KazvIOManager::getUploadJobs(const QString &roomId)
+{
+ auto uploadJobs = m_d->uploadJobs.values(roomId);
+ auto kazvBaseJobs = QList<QObject*>();
+ for (int i = 0; i < uploadJobs.size(); i++) {
+ kazvBaseJobs.append(uploadJobs[i].data());
+ }
+ return kazvBaseJobs;
+}
diff --git a/src/kazv-io-manager.hpp b/src/kazv-io-manager.hpp
index f979145..259dbb9 100644
--- a/src/kazv-io-manager.hpp
+++ b/src/kazv-io-manager.hpp
@@ -1,37 +1,38 @@
/*
* 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-job.hpp"
#include "matrix-room.hpp"
#include <QObject>
#include <QtQml>
#include <QUrl>
#include <QString>
#include <KIO/TransferJob>
#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;
Q_INVOKABLE KazvIOBaseJob *startNewDownloadJob(const QUrl &serverUrl, const QUrl &localFileName, const QString &jobId);
Q_INVOKABLE KazvIOBaseJob *startNewUploadJob(const QUrl &serverUrl, const QUrl &localFileName, const QString &token, MatrixRoom *room);
Q_INVOKABLE KazvIOBaseJob *getDownloadJob(const QString &jobId);
Q_INVOKABLE void deleteDownloadJob(const QString &jobId);
+ Q_INVOKABLE QList<QObject*> getUploadJobs(const QString &roomId);
};

File Metadata

Mime Type
text/x-diff
Expires
Sat, Sep 19, 2:29 AM (12 h, 19 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1768683
Default Alt Text
(8 KB)

Event Timeline