diff --git a/include/MatrixClient.h b/include/MatrixClient.h
index 3efd2d0a..d9f5067a 100644
--- a/include/MatrixClient.h
+++ b/include/MatrixClient.h
@@ -39,7 +39,8 @@ public:
int txnId,
const QString &roomid,
const QString &msg,
- const QFileInfo &info,
+ const QString &mime,
+ const int64_t media_size,
const QString &url = "") noexcept;
void login(const QString &username, const QString &password) noexcept;
void registerUser(const QString &username,
@@ -58,14 +59,17 @@ public:
void downloadFile(const QString &event_id, const QUrl &url);
void messages(const QString &room_id, const QString &from_token, int limit = 30) noexcept;
void uploadImage(const QString &roomid,
- const QSharedPointer<QIODevice> data,
- const QString &filename);
+ const QString &filename,
+ const QSharedPointer<QIODevice> data);
void uploadFile(const QString &roomid,
- const QSharedPointer<QIODevice> data,
- const QString &filename);
+ const QString &filename,
+ const QSharedPointer<QIODevice> data);
void uploadAudio(const QString &roomid,
- const QSharedPointer<QIODevice> data,
- const QString &filename);
+ const QString &filename,
+ const QSharedPointer<QIODevice> data);
+ void uploadVideo(const QString &roomid,
+ const QString &filename,
+ const QSharedPointer<QIODevice> data);
void uploadFilter(const QString &filter) noexcept;
void joinRoom(const QString &roomIdOrAlias);
void leaveRoom(const QString &roomId);
@@ -108,12 +112,25 @@ signals:
const QString &token);
void versionSuccess();
void imageUploaded(const QString &roomid,
- const QSharedPointer<QIODevice> data,
const QString &filename,
- const QString &url);
- void fileUploaded(const QString &roomid, const QString &filename, const QString &url);
- void audioUploaded(const QString &roomid, const QString &filename, const QString &url);
-
+ const QString &url,
+ const QString &mime,
+ const int64_t size);
+ void fileUploaded(const QString &roomid,
+ const QString &filename,
+ const QString &url,
+ const QString &mime,
+ const int64_t size);
+ void audioUploaded(const QString &roomid,
+ const QString &filename,
+ const QString &url,
+ const QString &mime,
+ const int64_t size);
+ void videoUploaded(const QString &roomid,
+ const QString &filename,
+ const QString &url,
+ const QString &mime,
+ const int64_t size);
void roomAvatarRetrieved(const QString &roomid,
const QPixmap &img,
const QString &url,
@@ -143,6 +160,7 @@ signals:
private:
QNetworkReply *makeUploadRequest(QSharedPointer<QIODevice> iodev);
+ QJsonObject getUploadReply(QNetworkReply *reply);
// Client API prefix.
QString clientApiUrl_;
diff --git a/include/TextInputWidget.h b/include/TextInputWidget.h
index 6d28009e..b89b7753 100644
--- a/include/TextInputWidget.h
+++ b/include/TextInputWidget.h
@@ -27,12 +27,12 @@
#include "FlatButton.h"
#include "LoadingIndicator.h"
-#include "dialogs/PreviewImageOverlay.h"
+#include "dialogs/PreviewUploadOverlay.h"
#include "emoji/PickButton.h"
namespace dialogs {
-class PreviewImageOverlay;
+class PreviewUploadOverlay;
}
class FilteredTextEdit : public QTextEdit
@@ -53,9 +53,13 @@ signals:
void heightChanged(int height);
void startedTyping();
void stoppedTyping();
+ void startedUpload();
void message(QString);
void command(QString name, QString args);
- void image(const QSharedPointer<QIODevice> iodev, const QString &img_name);
+ void image(QSharedPointer<QIODevice> data, const QString &filename);
+ void audio(QSharedPointer<QIODevice> data, const QString &filename);
+ void video(QSharedPointer<QIODevice> data, const QString &filename);
+ void file(QSharedPointer<QIODevice> data, const QString &filename);
protected:
void keyPressEvent(QKeyEvent *event) override;
@@ -67,11 +71,12 @@ private:
size_t history_index_;
QTimer *typingTimer_;
- dialogs::PreviewImageOverlay previewDialog_;
+ dialogs::PreviewUploadOverlay previewDialog_;
void textChanged();
- void receiveImage(const QByteArray img, const QString &img_name);
+ void uploadData(const QByteArray data, const QString &media, const QString &filename);
void afterCompletion(int);
+ void showPreview(const QMimeData *source, const QStringList &formats);
};
class TextInputWidget : public QWidget
@@ -95,9 +100,10 @@ signals:
void sendTextMessage(QString msg);
void sendEmoteMessage(QString msg);
- void uploadImage(QSharedPointer<QIODevice> data, const QString &filename);
- void uploadFile(QSharedPointer<QIODevice> data, const QString &filename);
- void uploadAudio(QSharedPointer<QIODevice> data, const QString &filename);
+ void uploadImage(const QSharedPointer<QIODevice> data, const QString &filename);
+ void uploadFile(const QSharedPointer<QIODevice> data, const QString &filename);
+ void uploadAudio(const QSharedPointer<QIODevice> data, const QString &filename);
+ void uploadVideo(const QSharedPointer<QIODevice> data, const QString &filename);
void sendJoinRoomRequest(const QString &room);
diff --git a/include/Utils.h b/include/Utils.h
index bbe46dd8..2c764f88 100644
--- a/include/Utils.h
+++ b/include/Utils.h
@@ -22,4 +22,8 @@ getMessageDescription(const TimelineEvent &event, const QString &localUser);
//! surrogate pairs might be in use.
QString
firstChar(const QString &input);
+
+//! Get a human readable file size with the appropriate units attached.
+QString
+humanReadableFileSize(const uint64_t bytes);
}
diff --git a/include/dialogs/PreviewImageOverlay.h b/include/dialogs/PreviewUploadOverlay.h
index a1ab32ee..c9516719 100644
--- a/include/dialogs/PreviewImageOverlay.h
+++ b/include/dialogs/PreviewUploadOverlay.h
@@ -28,28 +28,32 @@ class QMimeData;
namespace dialogs {
-class PreviewImageOverlay : public QWidget
+class PreviewUploadOverlay : public QWidget
{
Q_OBJECT
public:
- PreviewImageOverlay(QWidget *parent = nullptr);
+ PreviewUploadOverlay(QWidget *parent = nullptr);
- void setImageAndCreate(const QByteArray data, const QString &type);
- void setImageAndCreate(const QString &path);
+ void setPreview(const QByteArray data, const QString &mime);
+ void setPreview(const QString &path);
signals:
- void confirmImageUpload(const QByteArray data, const QString &img_name);
+ void confirmUpload(const QByteArray data, const QString &media, const QString &filename);
private:
void init();
+ void setLabels(const QString &type, const QString &mime, const int upload_size);
+ bool isImage_;
QPixmap image_;
- QByteArray imageData_;
- QString imagePath_;
+
+ QByteArray data_;
+ QString filePath_;
+ QString mediaType_;
QLabel titleLabel_;
- QLabel imageLabel_;
- QLineEdit imageName_;
+ QLabel infoLabel_;
+ QLineEdit fileName_;
FlatButton upload_;
FlatButton cancel_;
diff --git a/include/timeline/TimelineView.h b/include/timeline/TimelineView.h
index 6e1287c8..782f3afd 100644
--- a/include/timeline/TimelineView.h
+++ b/include/timeline/TimelineView.h
@@ -44,6 +44,8 @@ struct PendingMessage
int txn_id;
QString body;
QString filename;
+ QString mime;
+ int64_t media_size;
QString event_id;
TimelineItem *widget;
@@ -51,12 +53,16 @@ struct PendingMessage
int txn_id,
QString body,
QString filename,
+ QString mime,
+ int64_t media_size,
QString event_id,
TimelineItem *widget)
: ty(ty)
, txn_id(txn_id)
, body(body)
, filename(filename)
+ , mime(mime)
+ , media_size(media_size)
, event_id(event_id)
, widget(widget)
{}
@@ -87,10 +93,10 @@ public:
void addUserMessage(mtx::events::MessageType ty, const QString &msg);
template<class Widget, mtx::events::MessageType MsgType>
- void addUserMessage(
- const QString &url,
- const QString &filename,
- const QSharedPointer<QIODevice> data = QSharedPointer<QIODevice>(nullptr));
+ void addUserMessage(const QString &url,
+ const QString &filename,
+ const QString &mime,
+ const int64_t size);
void updatePendingMessage(int txn_id, QString event_id);
void scrollDown();
QLabel *createDateSeparator(QDateTime datetime);
@@ -236,11 +242,13 @@ template<class Widget, mtx::events::MessageType MsgType>
void
TimelineView::addUserMessage(const QString &url,
const QString &filename,
- const QSharedPointer<QIODevice> data)
+ const QString &mime,
+ const int64_t size)
{
auto with_sender = lastSender_ != local_user_;
+ auto trimmed = QFileInfo{filename}.fileName(); // Trim file path.
- auto widget = new Widget(client_, url, data, filename, this);
+ auto widget = new Widget(client_, url, trimmed, size, this);
TimelineItem *view_item =
new TimelineItem(widget, local_user_, with_sender, scroll_widget_);
@@ -255,7 +263,7 @@ TimelineView::addUserMessage(const QString &url,
int txn_id = client_->incrementTransactionId();
- PendingMessage message(MsgType, txn_id, url, filename, "", view_item);
+ PendingMessage message(MsgType, txn_id, url, trimmed, mime, size, "", view_item);
handleNewUserMessage(message);
}
diff --git a/include/timeline/TimelineViewManager.h b/include/timeline/TimelineViewManager.h
index 74d8588c..a531be88 100644
--- a/include/timeline/TimelineViewManager.h
+++ b/include/timeline/TimelineViewManager.h
@@ -64,11 +64,25 @@ public slots:
void queueTextMessage(const QString &msg);
void queueEmoteMessage(const QString &msg);
void queueImageMessage(const QString &roomid,
- const QSharedPointer<QIODevice> data,
const QString &filename,
- const QString &url);
- void queueFileMessage(const QString &roomid, const QString &filename, const QString &url);
- void queueAudioMessage(const QString &roomid, const QString &filename, const QString &url);
+ const QString &url,
+ const QString &mime,
+ const int64_t dsize);
+ void queueFileMessage(const QString &roomid,
+ const QString &filename,
+ const QString &url,
+ const QString &mime,
+ const int64_t dsize);
+ void queueAudioMessage(const QString &roomid,
+ const QString &filename,
+ const QString &url,
+ const QString &mime,
+ const int64_t dsize);
+ void queueVideoMessage(const QString &roomid,
+ const QString &filename,
+ const QString &url,
+ const QString &mime,
+ const int64_t dsize);
private slots:
void messageSent(const QString &eventid, const QString &roomid, int txnid);
diff --git a/include/timeline/widgets/AudioItem.h b/include/timeline/widgets/AudioItem.h
index ca81f498..06f4b8ff 100644
--- a/include/timeline/widgets/AudioItem.h
+++ b/include/timeline/widgets/AudioItem.h
@@ -48,8 +48,8 @@ public:
AudioItem(QSharedPointer<MatrixClient> client,
const QString &url,
- const QSharedPointer<QIODevice> data,
const QString &filename,
+ const int64_t size,
QWidget *parent = nullptr);
QSize sizeHint() const override;
@@ -76,7 +76,6 @@ private slots:
void fileDownloaded(const QString &event_id, const QByteArray &data);
private:
- QString calculateFileSize(int nbytes) const;
void init();
enum class AudioState
diff --git a/include/timeline/widgets/FileItem.h b/include/timeline/widgets/FileItem.h
index 72589189..36d72f25 100644
--- a/include/timeline/widgets/FileItem.h
+++ b/include/timeline/widgets/FileItem.h
@@ -42,8 +42,8 @@ public:
FileItem(QSharedPointer<MatrixClient> client,
const QString &url,
- const QSharedPointer<QIODevice> data,
const QString &filename,
+ const int64_t size,
QWidget *parent = nullptr);
QSize sizeHint() const override;
@@ -64,7 +64,6 @@ private slots:
void fileDownloaded(const QString &event_id, const QByteArray &data);
private:
- QString calculateFileSize(int nbytes) const;
void openUrl();
void init();
diff --git a/include/timeline/widgets/ImageItem.h b/include/timeline/widgets/ImageItem.h
index d24b7239..9e5fa82b 100644
--- a/include/timeline/widgets/ImageItem.h
+++ b/include/timeline/widgets/ImageItem.h
@@ -36,8 +36,8 @@ public:
ImageItem(QSharedPointer<MatrixClient> client,
const QString &url,
- const QSharedPointer<QIODevice> data,
const QString &filename,
+ const int64_t size,
QWidget *parent = nullptr);
void setImage(const QPixmap &image);
diff --git a/include/timeline/widgets/VideoItem.h b/include/timeline/widgets/VideoItem.h
index 53c3e21a..65b87c95 100644
--- a/include/timeline/widgets/VideoItem.h
+++ b/include/timeline/widgets/VideoItem.h
@@ -37,13 +37,12 @@ public:
VideoItem(QSharedPointer<MatrixClient> client,
const QString &url,
- const QSharedPointer<QIODevice> data,
const QString &filename,
+ const int64_t size,
QWidget *parent = nullptr);
private:
void init();
- QString calculateFileSize(int nbytes) const;
QUrl url_;
QString text_;
|