From 63c7601942eeef17ee5258015a601cfb04a21759 Mon Sep 17 00:00:00 2001 From: Black Hat Date: Mon, 10 Sep 2018 19:46:04 +0800 Subject: [PATCH] Fix a bug that avatar does not show after a state event. --- qml/component/MessageDelegate.qml | 2 +- src/messageeventmodel.cpp | 25 +++++++++++++++++-------- src/messageeventmodel.h | 6 +++--- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/qml/component/MessageDelegate.qml b/qml/component/MessageDelegate.qml index 5d6b26c..fcf6527 100644 --- a/qml/component/MessageDelegate.qml +++ b/qml/component/MessageDelegate.qml @@ -7,7 +7,7 @@ import Matrique.Settings 0.1 import "qrc:/js/util.js" as Util RowLayout { - readonly property bool avatarVisible: !(sentByMe || (aboveAuthor === author && section === aboveSection)) + readonly property bool avatarVisible: !sentByMe && (aboveAuthor !== author || aboveSection !== section || aboveEventType === "state" || aboveEventType === "emote") readonly property bool highlighted: !(sentByMe || eventType === "notice" ) readonly property bool sentByMe: author === currentRoom.localUser readonly property bool isText: eventType === "notice" || eventType === "message" diff --git a/src/messageeventmodel.cpp b/src/messageeventmodel.cpp index f512249..9dac890 100644 --- a/src/messageeventmodel.cpp +++ b/src/messageeventmodel.cpp @@ -15,6 +15,7 @@ QHash MessageEventModel::roleNames() const { QHash roles = QAbstractItemModel::roleNames(); roles[EventTypeRole] = "eventType"; + roles[AboveEventTypeRole] = "aboveEventType"; roles[EventIdRole] = "eventId"; roles[TimeRole] = "time"; roles[AboveTimeRole] = "aboveTime"; @@ -77,7 +78,8 @@ void MessageEventModel::setRoom(MatriqueRoom* room) { auto rowBelowInserted = m_currentRoom->maxTimelineIndex() - biggest + timelineBaseIndex() - 1; refreshEventRoles(rowBelowInserted, - {AboveAuthorRole, AboveSectionRole}); + {AboveEventTypeRole, AboveAuthorRole, + AboveSectionRole, AboveTimeRole}); } for (auto i = m_currentRoom->maxTimelineIndex() - biggest; i <= m_currentRoom->maxTimelineIndex() - lowest; ++i) @@ -107,7 +109,8 @@ void MessageEventModel::setRoom(MatriqueRoom* room) { refreshEventRoles(timelineBaseIndex() + 1, {ReadMarkerRole}); if (timelineBaseIndex() > 0) // Refresh below, see #312 refreshEventRoles(timelineBaseIndex() - 1, - {AboveAuthorRole, AboveSectionRole}); + {AboveEventTypeRole, AboveAuthorRole, + AboveSectionRole, AboveTimeRole}); }); connect(m_currentRoom, &Room::pendingEventChanged, this, &MessageEventModel::refreshRow); @@ -621,14 +624,20 @@ QVariant MessageEventModel::data(const QModelIndex& idx, int role) const { return role == TimeRole ? QVariant(ts) : renderDate(ts); } - if (role == AboveSectionRole || role == AboveAuthorRole || - role == AboveTimeRole) + if (role == AboveEventTypeRole || role == AboveSectionRole || + role == AboveAuthorRole || role == AboveTimeRole) for (auto r = row + 1; r < rowCount(); ++r) { auto i = index(r); - if (data(i, SpecialMarksRole) != EventStatus::Hidden) - return data(i, role == AboveSectionRole - ? SectionRole - : role == AboveAuthorRole ? AuthorRole : TimeRole); + if (data(i, SpecialMarksRole) != EventStatus::Hidden) switch (role) { + case AboveEventTypeRole: + return data(i, EventTypeRole); + case AboveSectionRole: + return data(i, SectionRole); + case AboveAuthorRole: + return data(i, AuthorRole); + case AboveTimeRole: + return data(i, TimeRole); + } } return {}; diff --git a/src/messageeventmodel.h b/src/messageeventmodel.h index 8161e3e..d672bda 100644 --- a/src/messageeventmodel.h +++ b/src/messageeventmodel.h @@ -1,19 +1,19 @@ #ifndef MESSAGEEVENTMODEL_H #define MESSAGEEVENTMODEL_H -#include "room.h" #include "matriqueroom.h" +#include "room.h" #include class MessageEventModel : public QAbstractListModel { Q_OBJECT - Q_PROPERTY( - MatriqueRoom* room READ getRoom WRITE setRoom NOTIFY roomChanged) + Q_PROPERTY(MatriqueRoom* room READ getRoom WRITE setRoom NOTIFY roomChanged) public: enum EventRoles { EventTypeRole = Qt::UserRole + 1, + AboveEventTypeRole, EventIdRole, TimeRole, AboveTimeRole,