mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-26 13:08:48 +03:00
parent
5573548fb1
commit
f4f78b1d8a
5 changed files with 185 additions and 0 deletions
|
@ -31,6 +31,7 @@
|
||||||
#include "Image.h"
|
#include "Image.h"
|
||||||
#include "Notice.h"
|
#include "Notice.h"
|
||||||
#include "Text.h"
|
#include "Text.h"
|
||||||
|
#include "Video.h"
|
||||||
|
|
||||||
#include "AvatarProvider.h"
|
#include "AvatarProvider.h"
|
||||||
#include "MessageEvent.h"
|
#include "MessageEvent.h"
|
||||||
|
@ -39,6 +40,7 @@
|
||||||
|
|
||||||
class ImageItem;
|
class ImageItem;
|
||||||
class AudioItem;
|
class AudioItem;
|
||||||
|
class VideoItem;
|
||||||
class FileItem;
|
class FileItem;
|
||||||
class Avatar;
|
class Avatar;
|
||||||
|
|
||||||
|
@ -70,6 +72,7 @@ public:
|
||||||
TimelineItem(ImageItem *item, const QString &userid, bool withSender, QWidget *parent = 0);
|
TimelineItem(ImageItem *item, const QString &userid, bool withSender, QWidget *parent = 0);
|
||||||
TimelineItem(FileItem *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(AudioItem *item, const QString &userid, bool withSender, QWidget *parent = 0);
|
||||||
|
TimelineItem(VideoItem *item, const QString &userid, bool withSender, QWidget *parent = 0);
|
||||||
|
|
||||||
TimelineItem(ImageItem *img,
|
TimelineItem(ImageItem *img,
|
||||||
const events::MessageEvent<msgs::Image> &e,
|
const events::MessageEvent<msgs::Image> &e,
|
||||||
|
@ -83,6 +86,10 @@ public:
|
||||||
const events::MessageEvent<msgs::Audio> &e,
|
const events::MessageEvent<msgs::Audio> &e,
|
||||||
bool with_sender,
|
bool with_sender,
|
||||||
QWidget *parent);
|
QWidget *parent);
|
||||||
|
TimelineItem(VideoItem *video,
|
||||||
|
const events::MessageEvent<msgs::Video> &e,
|
||||||
|
bool with_sender,
|
||||||
|
QWidget *parent);
|
||||||
|
|
||||||
void setUserAvatar(const QImage &pixmap);
|
void setUserAvatar(const QImage &pixmap);
|
||||||
DescInfo descriptionMessage() const { return descriptionMsg_; }
|
DescInfo descriptionMessage() const { return descriptionMsg_; }
|
||||||
|
|
|
@ -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_;
|
||||||
|
};
|
|
@ -27,6 +27,7 @@
|
||||||
#include "timeline/widgets/AudioItem.h"
|
#include "timeline/widgets/AudioItem.h"
|
||||||
#include "timeline/widgets/FileItem.h"
|
#include "timeline/widgets/FileItem.h"
|
||||||
#include "timeline/widgets/ImageItem.h"
|
#include "timeline/widgets/ImageItem.h"
|
||||||
|
#include "timeline/widgets/VideoItem.h"
|
||||||
|
|
||||||
static const QRegExp URL_REGEX("((?:https?|ftp)://\\S+)");
|
static const QRegExp URL_REGEX("((?:https?|ftp)://\\S+)");
|
||||||
static const QString URL_HTML = "<a href=\"\\1\">\\1</a>";
|
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);
|
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,
|
TimelineItem::TimelineItem(ImageItem *image,
|
||||||
const events::MessageEvent<msgs::Image> &event,
|
const events::MessageEvent<msgs::Image> &event,
|
||||||
bool with_sender,
|
bool with_sender,
|
||||||
|
@ -169,6 +181,16 @@ TimelineItem::TimelineItem(AudioItem *audio,
|
||||||
audio, event, " sent an audio clip", with_sender);
|
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.
|
* Used to display remote notice messages.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -237,6 +237,7 @@ TimelineView::parseMessageEvent(const QJsonObject &event, TimelineDirection dire
|
||||||
using Image = events::MessageEvent<msgs::Image>;
|
using Image = events::MessageEvent<msgs::Image>;
|
||||||
using Notice = events::MessageEvent<msgs::Notice>;
|
using Notice = events::MessageEvent<msgs::Notice>;
|
||||||
using Text = events::MessageEvent<msgs::Text>;
|
using Text = events::MessageEvent<msgs::Text>;
|
||||||
|
using Video = events::MessageEvent<msgs::Video>;
|
||||||
|
|
||||||
if (msg_type == events::MessageEventType::Audio) {
|
if (msg_type == events::MessageEventType::Audio) {
|
||||||
return processMessageEvent<Audio, AudioItem>(event, direction);
|
return processMessageEvent<Audio, AudioItem>(event, direction);
|
||||||
|
@ -250,6 +251,8 @@ TimelineView::parseMessageEvent(const QJsonObject &event, TimelineDirection dire
|
||||||
return processMessageEvent<Notice>(event, direction);
|
return processMessageEvent<Notice>(event, direction);
|
||||||
} else if (msg_type == events::MessageEventType::Text) {
|
} else if (msg_type == events::MessageEventType::Text) {
|
||||||
return processMessageEvent<Text>(event, direction);
|
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) {
|
} else if (msg_type == events::MessageEventType::Unknown) {
|
||||||
// TODO Handle redacted messages.
|
// TODO Handle redacted messages.
|
||||||
// Silenced for now.
|
// Silenced for now.
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
Loading…
Reference in a new issue