From 1248b6f334452929b71a5568e1fcb07f0d583f44 Mon Sep 17 00:00:00 2001 From: Black Hat Date: Thu, 22 Nov 2018 08:01:07 +0800 Subject: [PATCH] Fix #117. --- .../Component/Timeline/MessageDelegate.qml | 23 +++++------ imports/Spectral/Panel/RoomPanel.qml | 2 +- src/messageeventmodel.cpp | 40 +++++++++++++++---- src/messageeventmodel.h | 3 +- 4 files changed, 45 insertions(+), 23 deletions(-) diff --git a/imports/Spectral/Component/Timeline/MessageDelegate.qml b/imports/Spectral/Component/Timeline/MessageDelegate.qml index 69876ce..d45cec8 100644 --- a/imports/Spectral/Component/Timeline/MessageDelegate.qml +++ b/imports/Spectral/Component/Timeline/MessageDelegate.qml @@ -54,13 +54,19 @@ ColumnLayout { source: author.paintable } - Rectangle { + Label { Layout.preferredWidth: 32 Layout.preferredHeight: 32 Layout.alignment: Qt.AlignTop - color: "transparent" visible: !(sentByMe || avatarVisible) + + text: Qt.formatDateTime(time, "hh:mm") + color: "#5B7480" + + font.pixelSize: 10 + horizontalAlignment: Label.AlignHCenter + verticalAlignment: Label.AlignVCenter } Control { @@ -78,6 +84,8 @@ ColumnLayout { AutoMouseArea { anchors.fill: parent + id: messageMouseArea + onSecondaryClicked: { messageContextMenu.root = root messageContextMenu.model = model @@ -224,15 +232,4 @@ ColumnLayout { } } } - -// Label { -// Layout.leftMargin: sentByMe ? 12 : 48 - -// text: Qt.formatDateTime(time, "dd/MM/yyyy '-' hh:mm") - -// visible: index === messageListView.currentIndex - -// font.pixelSize: 13 -// verticalAlignment: Text.AlignVCenter -// } } diff --git a/imports/Spectral/Panel/RoomPanel.qml b/imports/Spectral/Panel/RoomPanel.qml index 38c8f9d..73326ca 100644 --- a/imports/Spectral/Panel/RoomPanel.qml +++ b/imports/Spectral/Panel/RoomPanel.qml @@ -95,7 +95,7 @@ Item { sourceModel: messageEventModel filters: ExpressionFilter { - expression: marks !== 0x08 && marks !== 0x10 && eventType !== "other" + expression: marks !== 0x10 && eventType !== "other" } onModelReset: { diff --git a/src/messageeventmodel.cpp b/src/messageeventmodel.cpp index 60c277b..6973b68 100644 --- a/src/messageeventmodel.cpp +++ b/src/messageeventmodel.cpp @@ -89,6 +89,9 @@ void MessageEventModel::setRoom(SpectralRoom *room) { {AboveEventTypeRole, AboveAuthorRole, AboveSectionRole, AboveTimeRole}); } + for (auto i = m_currentRoom->maxTimelineIndex() - biggest; + i <= m_currentRoom->maxTimelineIndex() - lowest; ++i) + refreshLastUserEvents(i); }); connect(m_currentRoom, &Room::pendingEventAboutToAdd, this, [this] { beginInsertRows({}, 0, 0); }); @@ -108,9 +111,10 @@ void MessageEventModel::setRoom(SpectralRoom *room) { endMoveRows(); movingEvent = false; } - refreshRow(timelineBaseIndex()); // Refresh the looks + refreshRow(timelineBaseIndex()); // Refresh the looks + refreshLastUserEvents(0); if (m_currentRoom->timelineSize() > 1) // Refresh above - refreshEventRoles(timelineBaseIndex() + 1); + refreshEventRoles(timelineBaseIndex() + 1, {ReadMarkerRole}); if (timelineBaseIndex() > 0) // Refresh below, see #312 refreshEventRoles(timelineBaseIndex() - 1, {AboveEventTypeRole, AboveAuthorRole, @@ -128,9 +132,11 @@ void MessageEventModel::setRoom(SpectralRoom *room) { {ReadMarkerRole}); refreshEventRoles(lastReadEventId, {ReadMarkerRole}); }); - connect( - m_currentRoom, &Room::replacedEvent, this, - [this](const RoomEvent *newEvent) { refreshEvent(newEvent->id()); }); + connect(m_currentRoom, &Room::replacedEvent, this, + [this](const RoomEvent *newEvent) { + refreshLastUserEvents(refreshEvent(newEvent->id()) - + timelineBaseIndex()); + }); connect(m_currentRoom, &Room::fileTransferProgress, this, &MessageEventModel::refreshEvent); connect(m_currentRoom, &Room::fileTransferCompleted, this, @@ -140,7 +146,7 @@ void MessageEventModel::setRoom(SpectralRoom *room) { connect(m_currentRoom, &Room::fileTransferCancelled, this, &MessageEventModel::refreshEvent); connect(m_currentRoom, &Room::readMarkerForUserMoved, this, - [=](User *user, QString fromEventId, QString toEventId) { + [=](User *, QString fromEventId, QString toEventId) { refreshEventRoles(fromEventId, {UserMarkerRole}); refreshEventRoles(toEventId, {UserMarkerRole}); }); @@ -214,6 +220,23 @@ QString MessageEventModel::renderDate(QDateTime timestamp) const { return date.toString(Qt::DefaultLocaleShortDate); } +void MessageEventModel::refreshLastUserEvents(int baseTimelineRow) { + if (!m_currentRoom || m_currentRoom->timelineSize() <= baseTimelineRow) + return; + + const auto &timelineBottom = m_currentRoom->messageEvents().rbegin(); + const auto &lastSender = (*(timelineBottom + baseTimelineRow))->senderId(); + const auto limit = timelineBottom + std::min(baseTimelineRow + 10, + m_currentRoom->timelineSize()); + for (auto it = timelineBottom + std::max(baseTimelineRow - 10, 0); + it != limit; ++it) { + if ((*it)->senderId() == lastSender) { + auto idx = index(it - timelineBottom); + emit dataChanged(idx, idx); + } + } +} + int MessageEventModel::rowCount(const QModelIndex &parent) const { if (!m_currentRoom || parent.isValid()) return 0; return m_currentRoom->timelineSize(); @@ -306,13 +329,14 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const { if (role == HighlightRole) return m_currentRoom->isEventHighlighted(&evt); - if (role == ReadMarkerRole) return evt.id() == lastReadEventId && row > timelineBaseIndex(); + if (role == ReadMarkerRole) + return evt.id() == lastReadEventId && row > timelineBaseIndex(); if (role == SpecialMarksRole) { if (isPending) return pendingIt->deliveryStatus(); if (is(evt)) return EventStatus::Hidden; - if (evt.isRedacted()) return EventStatus::Redacted; + if (evt.isRedacted()) return EventStatus::Hidden; if (evt.isStateEvent() && static_cast(evt).repeatsState()) diff --git a/src/messageeventmodel.h b/src/messageeventmodel.h index f142a7c..b211c8d 100644 --- a/src/messageeventmodel.h +++ b/src/messageeventmodel.h @@ -1,8 +1,8 @@ #ifndef MESSAGEEVENTMODEL_H #define MESSAGEEVENTMODEL_H -#include "spectralroom.h" #include "room.h" +#include "spectralroom.h" #include @@ -62,6 +62,7 @@ class MessageEventModel : public QAbstractListModel { const QMatrixClient::Room::rev_iter_t& baseIt) const; QString renderDate(QDateTime timestamp) const; + void refreshLastUserEvents(int baseRow); void refreshEventRoles(int row, const QVector& roles = {}); int refreshEventRoles(const QString& eventId, const QVector& roles = {});