diff --git a/src/RoomList.cc b/src/RoomList.cc
index 61b3e4bc..a3195196 100644
--- a/src/RoomList.cc
+++ b/src/RoomList.cc
@@ -187,7 +187,13 @@ RoomList::cleanupInvites(const std::map<QString, bool> &invites)
return;
utils::erase_if(rooms_, [invites](auto &room) {
- return room.second->isInvite() && (invites.find(room.first) == invites.end());
+ auto room_id = room.first;
+ auto item = room.second;
+
+ if (!item)
+ return false;
+
+ return item->isInvite() && (invites.find(room_id) == invites.end());
});
}
diff --git a/src/Utils.cc b/src/Utils.cc
index fd88d51c..0aca8303 100644
--- a/src/Utils.cc
+++ b/src/Utils.cc
@@ -118,6 +118,18 @@ utils::getMessageDescription(const TimelineEvent &event,
" sent a video clip",
utils::descriptiveTime(ts),
ts};
+ } else if (mpark::holds_alternative<mtx::events::Sticker>(event)) {
+ const auto msg = mpark::get<mtx::events::Sticker>(event);
+ QString sender = QString::fromStdString(msg.sender);
+
+ const auto username = Cache::displayName(room_id, sender);
+ const auto ts = QDateTime::fromMSecsSinceEpoch(msg.origin_server_ts);
+
+ return DescInfo{sender == localUser ? "You" : username,
+ sender,
+ " sent a sticker",
+ utils::descriptiveTime(ts),
+ ts};
}
return DescInfo{};
diff --git a/src/timeline/TimelineItem.cc b/src/timeline/TimelineItem.cc
index cd1dac67..ce82ebd8 100644
--- a/src/timeline/TimelineItem.cc
+++ b/src/timeline/TimelineItem.cc
@@ -210,6 +210,20 @@ TimelineItem::TimelineItem(ImageItem *image,
addSaveImageAction(image);
}
+TimelineItem::TimelineItem(StickerItem *image,
+ const mtx::events::Sticker &event,
+ bool with_sender,
+ const QString &room_id,
+ QWidget *parent)
+ : QWidget(parent)
+ , room_id_{room_id}
+{
+ setupWidgetLayout<mtx::events::Sticker, StickerItem>(
+ image, event, " sent a sticker", with_sender);
+
+ addSaveImageAction(image);
+}
+
TimelineItem::TimelineItem(FileItem *file,
const mtx::events::RoomEvent<mtx::events::msg::File> &event,
bool with_sender,
diff --git a/src/timeline/TimelineView.cc b/src/timeline/TimelineView.cc
index 679aa173..d7f674d4 100644
--- a/src/timeline/TimelineView.cc
+++ b/src/timeline/TimelineView.cc
@@ -281,6 +281,9 @@ TimelineView::parseMessageEvent(const mtx::events::collections::TimelineEvents &
} else if (mpark::holds_alternative<mtx::events::RoomEvent<msg::Video>>(event)) {
auto video = mpark::get<mtx::events::RoomEvent<msg::Video>>(event);
return processMessageEvent<VideoEvent, VideoItem>(video, direction);
+ } else if (mpark::holds_alternative<mtx::events::Sticker>(event)) {
+ return processMessageEvent<mtx::events::Sticker, StickerItem>(
+ mpark::get<mtx::events::Sticker>(event), direction);
}
return nullptr;
diff --git a/src/timeline/widgets/ImageItem.cc b/src/timeline/widgets/ImageItem.cc
index 3aae63c8..03f9741b 100644
--- a/src/timeline/widgets/ImageItem.cc
+++ b/src/timeline/widgets/ImageItem.cc
@@ -138,6 +138,11 @@ ImageItem::setImage(const QPixmap &image)
void
ImageItem::mousePressEvent(QMouseEvent *event)
{
+ if (!isInteractive_) {
+ event->accept();
+ return;
+ }
+
if (event->button() != Qt::LeftButton)
return;
@@ -204,7 +209,7 @@ ImageItem::paintEvent(QPaintEvent *event)
painter.drawPath(path);
// Bottom text section
- if (underMouse()) {
+ if (isInteractive_ && underMouse()) {
const int textBoxHeight = fontHeight / 2 + 6;
textRegion_ = QRectF(0, height_ - textBoxHeight, width_, textBoxHeight);
|