summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2017-11-28 02:01:37 +0200
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2017-11-28 02:01:37 +0200
commitb21942a3e3db3e425155c58483a99bc2789de241 (patch)
tree860ffe40a5028b78df79de37a9b866a772885b1f /include
parentf1eb0bbac0fab61f0d497a60ec6640c97cbe5668 (diff)
Add read support for m.file messages (#24)
Diffstat (limited to 'include')
-rw-r--r--include/FileItem.h97
-rw-r--r--include/MatrixClient.h2
-rw-r--r--include/TimelineItem.h6
-rw-r--r--include/TimelineView.h3
4 files changed, 108 insertions, 0 deletions
diff --git a/include/FileItem.h b/include/FileItem.h
new file mode 100644
index 00000000..1c47689c
--- /dev/null
+++ b/include/FileItem.h
@@ -0,0 +1,97 @@
+/*
+ * nheko Copyright (C) 2017 Konstantinos Sideris <siderisk@auth.gr>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include <QEvent>
+#include <QIcon>
+#include <QMouseEvent>
+#include <QSharedPointer>
+#include <QWidget>
+
+#include "File.h"
+#include "MatrixClient.h"
+#include "MessageEvent.h"
+
+namespace events = matrix::events;
+namespace msgs = matrix::events::messages;
+
+constexpr int MaxWidth = 400;
+constexpr int Height = 70;
+constexpr int IconRadius = 22;
+constexpr int IconDiameter = IconRadius * 2;
+constexpr int HorizontalPadding = 12;
+constexpr int TextPadding = 15;
+constexpr int DownloadIconRadius = IconRadius - 4;
+
+constexpr double VerticalPadding = Height - 2 * IconRadius;
+constexpr double IconYCenter = Height / 2;
+constexpr double IconXCenter = HorizontalPadding + IconRadius;
+
+class FileItem : public QWidget
+{
+ Q_OBJECT
+
+ Q_PROPERTY(QColor textColor WRITE setTextColor READ textColor)
+ Q_PROPERTY(QColor iconColor WRITE setIconColor READ iconColor)
+ Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor)
+
+public:
+ FileItem(QSharedPointer<MatrixClient> client,
+ const events::MessageEvent<msgs::File> &event,
+ QWidget *parent = nullptr);
+
+ FileItem(QSharedPointer<MatrixClient> client,
+ const QString &url,
+ const QString &filename,
+ QWidget *parent = nullptr);
+
+ QSize sizeHint() const override;
+
+ void setTextColor(const QColor &color) { textColor_ = color; }
+ void setIconColor(const QColor &color) { iconColor_ = color; }
+ void setBackgroundColor(const QColor &color) { backgroundColor_ = color; }
+
+ QColor textColor() const { return textColor_; }
+ QColor iconColor() const { return iconColor_; }
+ QColor backgroundColor() const { return backgroundColor_; }
+
+protected:
+ void paintEvent(QPaintEvent *event) override;
+ void mousePressEvent(QMouseEvent *event) override;
+
+private slots:
+ void fileDownloaded(const QString &event_id, const QByteArray &data);
+
+private:
+ QString calculateFileSize(int nbytes) const;
+ void openUrl();
+
+ QUrl url_;
+ QString text_;
+ QString readableFileSize_;
+ QString filenameToSave_;
+
+ events::MessageEvent<msgs::File> event_;
+ QSharedPointer<MatrixClient> client_;
+
+ QIcon icon_;
+
+ QColor textColor_ = QColor("white");
+ QColor iconColor_ = QColor("#38A3D8");
+ QColor backgroundColor_ = QColor("#333");
+};
diff --git a/include/MatrixClient.h b/include/MatrixClient.h
index 999fbe47..80dc9df9 100644
--- a/include/MatrixClient.h
+++ b/include/MatrixClient.h
@@ -53,6 +53,7 @@ public:
void fetchUserAvatar(const QString &userId, const QUrl &avatarUrl);
void fetchOwnAvatar(const QUrl &avatar_url);
void downloadImage(const QString &event_id, const QUrl &url);
+ 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 joinRoom(const QString &roomIdOrAlias);
@@ -96,6 +97,7 @@ signals:
void userAvatarRetrieved(const QString &userId, const QImage &img);
void ownAvatarRetrieved(const QPixmap &img);
void imageDownloaded(const QString &event_id, const QPixmap &img);
+ void fileDownloaded(const QString &event_id, const QByteArray &data);
// Returned profile data for the user's account.
void getOwnProfileResponse(const QUrl &avatar_url, const QString &display_name);
diff --git a/include/TimelineItem.h b/include/TimelineItem.h
index cd522308..b94acbdb 100644
--- a/include/TimelineItem.h
+++ b/include/TimelineItem.h
@@ -24,6 +24,7 @@
#include <QStyleOption>
#include "Emote.h"
+#include "File.h"
#include "Image.h"
#include "MessageEvent.h"
#include "Notice.h"
@@ -31,6 +32,7 @@
#include "Text.h"
class ImageItem;
+class FileItem;
class Avatar;
namespace events = matrix::events;
@@ -64,6 +66,10 @@ public:
const events::MessageEvent<msgs::Image> &e,
bool with_sender,
QWidget *parent);
+ TimelineItem(FileItem *file,
+ const events::MessageEvent<msgs::File> &e,
+ bool with_sender,
+ QWidget *parent);
void setUserAvatar(const QImage &pixmap);
DescInfo descriptionMessage() const { return descriptionMsg_; }
diff --git a/include/TimelineView.h b/include/TimelineView.h
index 3f506002..e3bedff0 100644
--- a/include/TimelineView.h
+++ b/include/TimelineView.h
@@ -25,6 +25,7 @@
#include <QStyleOption>
#include "Emote.h"
+#include "File.h"
#include "Image.h"
#include "MessageEvent.h"
#include "Notice.h"
@@ -95,6 +96,8 @@ public:
bool with_sender);
TimelineItem *createTimelineItem(const events::MessageEvent<msgs::Emote> &e,
bool with_sender);
+ TimelineItem *createTimelineItem(const events::MessageEvent<msgs::File> &e,
+ bool with_sender);
// Add new events at the end of the timeline.
int addEvents(const Timeline &timeline);