diff options
author | Konstantinos Sideris <sideris.konstantin@gmail.com> | 2017-11-29 23:39:35 +0200 |
---|---|---|
committer | Konstantinos Sideris <sideris.konstantin@gmail.com> | 2017-11-29 23:39:35 +0200 |
commit | fdb76bb5c1bdce765479442a70ddca80b867caa6 (patch) | |
tree | b418ea31dbe0f140fc2635584666db4ce36bf732 /include | |
parent | b21942a3e3db3e425155c58483a99bc2789de241 (diff) |
Implement file uploads
fixes #24
Diffstat (limited to 'include')
-rw-r--r-- | include/FileItem.h | 1 | ||||
-rw-r--r-- | include/MatrixClient.h | 2 | ||||
-rw-r--r-- | include/TextInputWidget.h | 1 | ||||
-rw-r--r-- | include/TimelineItem.h | 43 | ||||
-rw-r--r-- | include/TimelineView.h | 33 | ||||
-rw-r--r-- | include/TimelineViewManager.h | 1 |
6 files changed, 79 insertions, 2 deletions
diff --git a/include/FileItem.h b/include/FileItem.h index 1c47689c..ebb18111 100644 --- a/include/FileItem.h +++ b/include/FileItem.h @@ -80,6 +80,7 @@ private slots: private: QString calculateFileSize(int nbytes) const; void openUrl(); + void init(); QUrl url_; QString text_; diff --git a/include/MatrixClient.h b/include/MatrixClient.h index 80dc9df9..b0f6993d 100644 --- a/include/MatrixClient.h +++ b/include/MatrixClient.h @@ -56,6 +56,7 @@ 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 QString &filename); + void uploadFile(const QString &roomid, const QString &filename); void joinRoom(const QString &roomIdOrAlias); void leaveRoom(const QString &roomId); void sendTypingNotification(const QString &roomid, int timeoutInMillis = 20000); @@ -92,6 +93,7 @@ signals: const QString &token); void versionSuccess(); void imageUploaded(const QString &roomid, const QString &filename, const QString &url); + void fileUploaded(const QString &roomid, const QString &filename, const QString &url); void roomAvatarRetrieved(const QString &roomid, const QPixmap &img); void userAvatarRetrieved(const QString &userId, const QImage &img); diff --git a/include/TextInputWidget.h b/include/TextInputWidget.h index 88706e4a..80c16740 100644 --- a/include/TextInputWidget.h +++ b/include/TextInputWidget.h @@ -85,6 +85,7 @@ signals: void sendTextMessage(QString msg); void sendEmoteMessage(QString msg); void uploadImage(QString filename); + void uploadFile(QString filename); void sendJoinRoomRequest(const QString &room); void startedTyping(); diff --git a/include/TimelineItem.h b/include/TimelineItem.h index b94acbdb..9646405c 100644 --- a/include/TimelineItem.h +++ b/include/TimelineItem.h @@ -17,12 +17,14 @@ #pragma once +#include <QDateTime> #include <QHBoxLayout> #include <QLabel> #include <QPainter> #include <QStyle> #include <QStyleOption> +#include "AvatarProvider.h" #include "Emote.h" #include "File.h" #include "Image.h" @@ -30,6 +32,7 @@ #include "Notice.h" #include "RoomInfoListItem.h" #include "Text.h" +#include "TimelineViewManager.h" class ImageItem; class FileItem; @@ -61,6 +64,7 @@ public: QWidget *parent = 0); // m.image TimelineItem(ImageItem *item, const QString &userid, bool withSender, QWidget *parent = 0); + TimelineItem(FileItem *item, const QString &userid, bool withSender, QWidget *parent = 0); TimelineItem(ImageItem *img, const events::MessageEvent<msgs::Image> &e, @@ -83,6 +87,12 @@ protected: private: void init(); + template<class Widget> + void setupLocalWidgetLayout(Widget *widget, + const QString &userid, + const QString &msgDescription, + bool withSender); + void generateBody(const QString &body); void generateBody(const QString &userid, const QString &body); void generateTimestamp(const QDateTime &time); @@ -110,3 +120,36 @@ private: QLabel *userName_; QLabel *body_; }; + +template<class Widget> +void +TimelineItem::setupLocalWidgetLayout(Widget *widget, + const QString &userid, + const QString &msgDescription, + bool withSender) +{ + auto displayName = TimelineViewManager::displayName(userid); + auto timestamp = QDateTime::currentDateTime(); + + descriptionMsg_ = { + "You", userid, QString(" %1").arg(msgDescription), descriptiveTime(timestamp)}; + + generateTimestamp(timestamp); + + auto widgetLayout = new QHBoxLayout(); + widgetLayout->setContentsMargins(0, 5, 0, 0); + widgetLayout->addWidget(widget); + widgetLayout->addStretch(1); + + if (withSender) { + generateBody(displayName, ""); + setupAvatarLayout(displayName); + mainLayout_->addLayout(headerLayout_); + + AvatarProvider::resolve(userid, this); + } else { + setupSimpleLayout(); + } + + mainLayout_->addLayout(widgetLayout); +} diff --git a/include/TimelineView.h b/include/TimelineView.h index e3bedff0..715d8a9a 100644 --- a/include/TimelineView.h +++ b/include/TimelineView.h @@ -17,26 +17,28 @@ #pragma once +#include <QApplication> #include <QLayout> #include <QList> #include <QQueue> #include <QScrollArea> +#include <QSettings> #include <QStyle> #include <QStyleOption> #include "Emote.h" #include "File.h" #include "Image.h" +#include "MatrixClient.h" #include "MessageEvent.h" #include "Notice.h" #include "Text.h" +#include "TimelineItem.h" class FloatingButton; -class MatrixClient; class RoomMessages; class ScrollBar; class Timeline; -class TimelineItem; struct DescInfo; namespace msgs = matrix::events::messages; @@ -102,6 +104,8 @@ public: // Add new events at the end of the timeline. int addEvents(const Timeline &timeline); void addUserMessage(matrix::events::MessageEventType ty, const QString &msg); + + template<class Widget, events::MessageEventType MsgType> void addUserMessage(const QString &url, const QString &filename); void updatePendingMessage(int txn_id, QString event_id); void scrollDown(); @@ -193,3 +197,28 @@ private: QList<PendingMessage> pending_sent_msgs_; QSharedPointer<MatrixClient> client_; }; + +template<class Widget, events::MessageEventType MsgType> +void +TimelineView::addUserMessage(const QString &url, const QString &filename) +{ + QSettings settings; + auto user_id = settings.value("auth/user_id").toString(); + auto with_sender = lastSender_ != user_id; + + auto widget = new Widget(client_, url, filename, this); + + TimelineItem *view_item = new TimelineItem(widget, user_id, with_sender, scroll_widget_); + scroll_layout_->addWidget(view_item); + + lastMessageDirection_ = TimelineDirection::Bottom; + + QApplication::processEvents(); + + lastSender_ = user_id; + + int txn_id = client_->incrementTransactionId(); + + PendingMessage message(MsgType, txn_id, url, filename, "", view_item); + handleNewUserMessage(message); +} diff --git a/include/TimelineViewManager.h b/include/TimelineViewManager.h index d9fb730e..854c2550 100644 --- a/include/TimelineViewManager.h +++ b/include/TimelineViewManager.h @@ -67,6 +67,7 @@ public slots: void queueTextMessage(const QString &msg); void queueEmoteMessage(const QString &msg); void queueImageMessage(const QString &roomid, const QString &filename, const QString &url); + void queueFileMessage(const QString &roomid, const QString &filename, const QString &url); private slots: void messageSent(const QString &eventid, const QString &roomid, int txnid); |