From e98a61fea60cf3b95441ce3d9591ced0cf93f566 Mon Sep 17 00:00:00 2001
From: Nicolas Werner <nicolas.werner@hotmail.de>
Date: Tue, 10 Dec 2019 14:46:52 +0100
Subject: [PATCH] Show topic and name changes in timeline

---
 resources/qml/delegates/MessageDelegate.qml | 12 ++++++++
 resources/qml/delegates/NoticeMessage.qml   |  3 +-
 src/timeline/TimelineModel.cpp              | 32 +++++++++++++++++++++
 src/timeline/TimelineModel.h                |  2 ++
 4 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/resources/qml/delegates/MessageDelegate.qml b/resources/qml/delegates/MessageDelegate.qml
index 178dfd860..20ec71e5b 100644
--- a/resources/qml/delegates/MessageDelegate.qml
+++ b/resources/qml/delegates/MessageDelegate.qml
@@ -49,6 +49,18 @@ DelegateChooser {
 			text: qsTr("Encryption enabled")
 		}
 	}
+	DelegateChoice {
+		roleValue: MtxEvent.Name
+		NoticeMessage {
+			notice: model.roomName ? qsTr("room name changed to: %1").arg(model.roomName) : qsTr("removed room name")
+		}
+	}
+	DelegateChoice {
+		roleValue: MtxEvent.Topic
+		NoticeMessage {
+			notice: model.roomTopic ? qsTr("topic changed to: %1").arg(model.roomTopic) : qsTr("removed topic")
+		}
+	}
 	DelegateChoice {
 		Placeholder {}
 	}
diff --git a/resources/qml/delegates/NoticeMessage.qml b/resources/qml/delegates/NoticeMessage.qml
index a392eb5bb..f7467ecae 100644
--- a/resources/qml/delegates/NoticeMessage.qml
+++ b/resources/qml/delegates/NoticeMessage.qml
@@ -1,7 +1,8 @@
 import ".."
 
 MatrixText {
-	text: model.formattedBody
+	property string notice: model.formattedBody.replace("<pre>", "<pre style='white-space: pre-wrap'>")
+	text: notice
 	width: parent ? parent.width : undefined
 	font.italic: true
 	color: inactiveColors.text
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index e3d87ae6a..9da8a194d 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -59,6 +59,30 @@ eventMsgType(const mtx::events::RoomEvent<T> &e) -> decltype(e.content.msgtype)
         return e.content.msgtype;
 }
 
+template<class T>
+QString
+eventRoomName(const T &)
+{
+        return "";
+}
+QString
+eventRoomName(const mtx::events::StateEvent<mtx::events::state::Name> &e)
+{
+        return QString::fromStdString(e.content.name);
+}
+
+template<class T>
+QString
+eventRoomTopic(const T &)
+{
+        return "";
+}
+QString
+eventRoomTopic(const mtx::events::StateEvent<mtx::events::state::Topic> &e)
+{
+        return QString::fromStdString(e.content.topic);
+}
+
 template<class T>
 QString
 eventBody(const mtx::events::Event<T> &)
@@ -437,6 +461,8 @@ TimelineModel::roleNames() const
           {State, "state"},
           {IsEncrypted, "isEncrypted"},
           {ReplyTo, "replyTo"},
+          {RoomName, "roomName"},
+          {RoomTopic, "roomTopic"},
         };
 }
 int
@@ -563,6 +589,12 @@ TimelineModel::data(const QModelIndex &index, int role) const
                   [](const auto &e) -> QString { return eventRelatesTo(e); }, event);
                 return QVariant(evId);
         }
+        case RoomName:
+                return QVariant(boost::apply_visitor(
+                  [](const auto &e) -> QString { return eventRoomName(e); }, event));
+        case RoomTopic:
+                return QVariant(boost::apply_visitor(
+                  [](const auto &e) -> QString { return eventRoomTopic(e); }, event));
         default:
                 return QVariant();
         }
diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index 06c64acf5..05e059620 100644
--- a/src/timeline/TimelineModel.h
+++ b/src/timeline/TimelineModel.h
@@ -141,6 +141,8 @@ public:
                 State,
                 IsEncrypted,
                 ReplyTo,
+                RoomName,
+                RoomTopic,
         };
 
         QHash<int, QByteArray> roleNames() const override;
-- 
GitLab