diff --git a/qml/component/MaterialIcon.qml b/qml/component/MaterialIcon.qml index d1b2f0e..87c3315 100644 --- a/qml/component/MaterialIcon.qml +++ b/qml/component/MaterialIcon.qml @@ -3,20 +3,13 @@ import QtQuick.Controls 2.2 import QtQuick.Layouts 1.3 import Matrique.Settings 0.1 -Item { - property alias icon: iconText.text - property var color: MSettings.darkTheme ? "white" : "black" +Text { + property alias icon: materialLabel.text - id: item + id: materialLabel - Text { - anchors.fill: parent - - id: iconText - font.pointSize: 16 - font.family: materialFont.name - color: item.color - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - } + font.pointSize: 16 + font.family: materialFont.name + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter } diff --git a/qml/component/MessageDelegate.qml b/qml/component/MessageDelegate.qml index fcf6527..9e91313 100644 --- a/qml/component/MessageDelegate.qml +++ b/qml/component/MessageDelegate.qml @@ -93,13 +93,29 @@ RowLayout { active: eventType === "image" || eventType === "file" || eventType === "audio" } - AutoLabel { + Row { Layout.alignment: Qt.AlignRight - visible: Math.abs(time - aboveTime) > 600000 || index == 0 - text: Qt.formatTime(time, "hh:mm") - coloredBackground: highlighted - Material.foreground: "grey" - font.pointSize: 8 + + spacing: 8 + + AutoLabel { + id: timeLabel + + visible: Math.abs(time - aboveTime) > 600000 || index == 0 + text: Qt.formatTime(time, "hh:mm") + coloredBackground: highlighted + Material.foreground: "grey" + font.pointSize: 8 + } + + MaterialIcon { + height: timeLabel.height + + visible: userMarker.length > 0 + icon: "\ue5ca" + color: highlighted ? "white": Material.foreground + font.pointSize: 12 + } } } diff --git a/src/messageeventmodel.cpp b/src/messageeventmodel.cpp index 2c5525a..51fefbb 100644 --- a/src/messageeventmodel.cpp +++ b/src/messageeventmodel.cpp @@ -32,6 +32,7 @@ QHash MessageEventModel::roleNames() const { roles[AnnotationRole] = "annotation"; roles[EventResolvedTypeRole] = "eventResolvedType"; roles[PlainTextRole] = "plainText"; + roles[UserMarkerRole] = "userMarker"; return roles; } @@ -137,6 +138,11 @@ void MessageEventModel::setRoom(MatriqueRoom* room) { &MessageEventModel::refreshEvent); connect(m_currentRoom, &Room::fileTransferCancelled, this, &MessageEventModel::refreshEvent); + connect(m_currentRoom, &Room::readMarkerForUserMoved, this, + [=](User* user, QString fromEventId, QString toEventId) { + refreshEventRoles(fromEventId, {UserMarkerRole}); + refreshEventRoles(toEventId, {UserMarkerRole}); + }); qDebug() << "Connected to room" << room->id() << "as" << room->localUser()->id(); } else @@ -624,6 +630,15 @@ QVariant MessageEventModel::data(const QModelIndex& idx, int role) const { return role == TimeRole ? QVariant(ts) : renderDate(ts); } + if (role == UserMarkerRole) { + QVariantList variantList; + for (User* user : m_currentRoom->usersAtEventId(evt.id())) { + if (user == m_currentRoom->localUser()) continue; + variantList.append(QVariant::fromValue(user)); + } + return variantList; + } + if (role == AboveEventTypeRole || role == AboveSectionRole || role == AboveAuthorRole || role == AboveTimeRole) for (auto r = row + 1; r < rowCount(); ++r) { diff --git a/src/messageeventmodel.h b/src/messageeventmodel.h index d672bda..a19cb0a 100644 --- a/src/messageeventmodel.h +++ b/src/messageeventmodel.h @@ -29,6 +29,7 @@ class MessageEventModel : public QAbstractListModel { LongOperationRole, AnnotationRole, PlainTextRole, + UserMarkerRole, // For debugging EventResolvedTypeRole, }; @@ -42,7 +43,7 @@ class MessageEventModel : public QAbstractListModel { int rowCount(const QModelIndex& parent = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; - QHash roleNames() const; + QHash roleNames() const override; private slots: int refreshEvent(const QString& eventId);