summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2017-12-01 18:28:26 +0200
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2017-12-01 18:28:26 +0200
commitf4f78b1d8a0e5f7065b50ae40766acb6521131b1 (patch)
tree08e246950d0aca235e97124854001e16ce3eaea7
parent5573548fb1adbaef6ef8e30fd76855b90c0fe26c (diff)
Add basic support for m.video messages
fixes #115
-rw-r--r--include/timeline/TimelineItem.h7
-rw-r--r--include/timeline/widgets/VideoItem.h58
-rw-r--r--src/timeline/TimelineItem.cc22
-rw-r--r--src/timeline/TimelineView.cc3
-rw-r--r--src/timeline/widgets/VideoItem.cc95
5 files changed, 185 insertions, 0 deletions
diff --git a/include/timeline/TimelineItem.h b/include/timeline/TimelineItem.h
index fe265079..e04cbeae 100644
--- a/include/timeline/TimelineItem.h
+++ b/include/timeline/TimelineItem.h
@@ -31,6 +31,7 @@
#include "Image.h"
#include "Notice.h"
#include "Text.h"
+#include "Video.h"
#include "AvatarProvider.h"
#include "MessageEvent.h"
@@ -39,6 +40,7 @@
class ImageItem;
class AudioItem;
+class VideoItem;
class FileItem;
class Avatar;
@@ -70,6 +72,7 @@ public:
TimelineItem(ImageItem *item, const QString &userid, bool withSender, QWidget *parent = 0);
TimelineItem(FileItem *item, const QString &userid, bool withSender, QWidget *parent = 0);
TimelineItem(AudioItem *item, const QString &userid, bool withSender, QWidget *parent = 0);
+ TimelineItem(VideoItem *item, const QString &userid, bool withSender, QWidget *parent = 0);
TimelineItem(ImageItem *img,
const events::MessageEvent<msgs::Image> &e,
@@ -83,6 +86,10 @@ public:
const events::MessageEvent<msgs::Audio> &e,
bool with_sender,
QWidget *parent);
+ TimelineItem(VideoItem *video,
+ const events::MessageEvent<msgs::Video> &e,
+ bool with_sender,
+ QWidget *parent);
void setUserAvatar(const QImage &pixmap);
DescInfo descriptionMessage() const { return descriptionMsg_; }
diff --git a/include/timeline/widgets/VideoItem.h b/include/timeline/widgets/VideoItem.h
index e69de29b..aa2a5da3 100644
--- a/include/timeline/widgets/VideoItem.h
+++ b/include/timeline/widgets/VideoItem.h
@@ -0,0 +1,58 @@
+/*
+ * 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 <QLabel>
+#include <QSharedPointer>
+#include <QWidget>
+
+#include "MatrixClient.h"
+#include "MessageEvent.h"
+#include "Video.h"
+
+namespace events = matrix::events;
+namespace msgs = matrix::events::messages;
+
+class VideoItem : public QWidget
+{
+ Q_OBJECT
+
+public:
+ VideoItem(QSharedPointer<MatrixClient> client,
+ const events::MessageEvent<msgs::Video> &event,
+ QWidget *parent = nullptr);
+
+ VideoItem(QSharedPointer<MatrixClient> client,
+ const QString &url,
+ const QString &filename,
+ QWidget *parent = nullptr);
+
+private:
+ void init();
+ QString calculateFileSize(int nbytes) const;
+
+ QUrl url_;
+ QString text_;
+ QString readableFileSize_;
+
+ QLabel *label_;
+
+ events::MessageEvent<msgs::Video> event_;
+ QSharedPointer<MatrixClient> client_;
+};
diff --git a/src/timeline/TimelineItem.cc b/src/timeline/TimelineItem.cc
index f55e5f4c..1cbe4b0a 100644
--- a/src/timeline/TimelineItem.cc
+++ b/src/timeline/TimelineItem.cc
@@ -27,6 +27,7 @@
#include "timeline/widgets/AudioItem.h"
#include "timeline/widgets/FileItem.h"
#include "timeline/widgets/ImageItem.h"
+#include "timeline/widgets/VideoItem.h"
static const QRegExp URL_REGEX("((?:https?|ftp)://\\S+)");
static const QString URL_HTML = "<a href=\"\\1\">\\1</a>";
@@ -139,6 +140,17 @@ TimelineItem::TimelineItem(AudioItem *audio,
setupLocalWidgetLayout<AudioItem>(audio, userid, "sent an audio clip", withSender);
}
+TimelineItem::TimelineItem(VideoItem *video,
+ const QString &userid,
+ bool withSender,
+ QWidget *parent)
+ : QWidget{parent}
+{
+ init();
+
+ setupLocalWidgetLayout<VideoItem>(video, userid, "sent a video clip", withSender);
+}
+
TimelineItem::TimelineItem(ImageItem *image,
const events::MessageEvent<msgs::Image> &event,
bool with_sender,
@@ -169,6 +181,16 @@ TimelineItem::TimelineItem(AudioItem *audio,
audio, event, " sent an audio clip", with_sender);
}
+TimelineItem::TimelineItem(VideoItem *video,
+ const events::MessageEvent<msgs::Video> &event,
+ bool with_sender,
+ QWidget *parent)
+ : QWidget(parent)
+{
+ setupWidgetLayout<events::MessageEvent<msgs::Video>, VideoItem>(
+ video, event, " sent a video clip", with_sender);
+}
+
/*
* Used to display remote notice messages.
*/
diff --git a/src/timeline/TimelineView.cc b/src/timeline/TimelineView.cc
index af7c0f7f..6b7928db 100644
--- a/src/timeline/TimelineView.cc
+++ b/src/timeline/TimelineView.cc
@@ -237,6 +237,7 @@ TimelineView::parseMessageEvent(const QJsonObject &event, TimelineDirection dire
using Image = events::MessageEvent<msgs::Image>;
using Notice = events::MessageEvent<msgs::Notice>;
using Text = events::MessageEvent<msgs::Text>;
+ using Video = events::MessageEvent<msgs::Video>;
if (msg_type == events::MessageEventType::Audio) {
return processMessageEvent<Audio, AudioItem>(event, direction);
@@ -250,6 +251,8 @@ TimelineView::parseMessageEvent(const QJsonObject &event, TimelineDirection dire
return processMessageEvent<Notice>(event, direction);
} else if (msg_type == events::MessageEventType::Text) {
return processMessageEvent<Text>(event, direction);
+ } else if (msg_type == events::MessageEventType::Video) {
+ return processMessageEvent<Video, VideoItem>(event, direction);
} else if (msg_type == events::MessageEventType::Unknown) {
// TODO Handle redacted messages.
// Silenced for now.
diff --git a/src/timeline/widgets/VideoItem.cc b/src/timeline/widgets/VideoItem.cc
index e69de29b..63cbc20c 100644
--- a/src/timeline/widgets/VideoItem.cc
+++ b/src/timeline/widgets/VideoItem.cc
@@ -0,0 +1,95 @@
+/*
+ * 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/>.
+ */
+
+#include <QDebug>
+#include <QLabel>
+#include <QVBoxLayout>
+
+#include "timeline/widgets/VideoItem.h"
+
+namespace events = matrix::events;
+namespace msgs = matrix::events::messages;
+
+void
+VideoItem::init()
+{
+ QList<QString> url_parts = url_.toString().split("mxc://");
+ if (url_parts.size() != 2) {
+ qDebug() << "Invalid format for image" << url_.toString();
+ return;
+ }
+
+ QString media_params = url_parts[1];
+ url_ = QString("%1/_matrix/media/r0/download/%2")
+ .arg(client_.data()->getHomeServer().toString(), media_params);
+}
+
+VideoItem::VideoItem(QSharedPointer<MatrixClient> client,
+ const events::MessageEvent<msgs::Video> &event,
+ QWidget *parent)
+ : QWidget(parent)
+ , url_{event.msgContent().url()}
+ , text_{event.content().body()}
+ , event_{event}
+ , client_{client}
+{
+ readableFileSize_ = calculateFileSize(event.msgContent().info().size);
+
+ init();
+
+ auto layout = new QVBoxLayout(this);
+ layout->setMargin(0);
+ layout->setSpacing(0);
+
+ QString link = QString("Video - <a href=%1>%2</a>").arg(url_.toString()).arg(text_);
+
+ label_ = new QLabel(link, this);
+ label_->setMargin(0);
+ label_->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextBrowserInteraction);
+ label_->setOpenExternalLinks(true);
+
+ layout->addWidget(label_);
+}
+
+VideoItem::VideoItem(QSharedPointer<MatrixClient> client,
+ const QString &url,
+ const QString &filename,
+ QWidget *parent)
+ : QWidget(parent)
+ , url_{url}
+ , text_{QFileInfo(filename).fileName()}
+ , client_{client}
+{
+ readableFileSize_ = calculateFileSize(QFileInfo(filename).size());
+
+ init();
+}
+
+QString
+VideoItem::calculateFileSize(int nbytes) const
+{
+ if (nbytes == 0)
+ return QString("");
+
+ if (nbytes < 1024)
+ return QString("%1 B").arg(nbytes);
+
+ if (nbytes < 1024 * 1024)
+ return QString("%1 KB").arg(nbytes / 1024);
+
+ return QString("%1 MB").arg(nbytes / 1024 / 1024);
+}