summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2017-11-29 23:39:35 +0200
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2017-11-29 23:39:35 +0200
commitfdb76bb5c1bdce765479442a70ddca80b867caa6 (patch)
treeb418ea31dbe0f140fc2635584666db4ce36bf732 /include
parentb21942a3e3db3e425155c58483a99bc2789de241 (diff)
Implement file uploads
fixes #24
Diffstat (limited to 'include')
-rw-r--r--include/FileItem.h1
-rw-r--r--include/MatrixClient.h2
-rw-r--r--include/TextInputWidget.h1
-rw-r--r--include/TimelineItem.h43
-rw-r--r--include/TimelineView.h33
-rw-r--r--include/TimelineViewManager.h1
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);