Fix #117.
This commit is contained in:
parent
3ec1cf71bf
commit
1248b6f334
|
@ -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
|
||||
// }
|
||||
}
|
||||
|
|
|
@ -95,7 +95,7 @@ Item {
|
|||
sourceModel: messageEventModel
|
||||
|
||||
filters: ExpressionFilter {
|
||||
expression: marks !== 0x08 && marks !== 0x10 && eventType !== "other"
|
||||
expression: marks !== 0x10 && eventType !== "other"
|
||||
}
|
||||
|
||||
onModelReset: {
|
||||
|
|
|
@ -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<RedactionEvent>(evt)) return EventStatus::Hidden;
|
||||
if (evt.isRedacted()) return EventStatus::Redacted;
|
||||
if (evt.isRedacted()) return EventStatus::Hidden;
|
||||
|
||||
if (evt.isStateEvent() &&
|
||||
static_cast<const StateEventBase &>(evt).repeatsState())
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
#ifndef MESSAGEEVENTMODEL_H
|
||||
#define MESSAGEEVENTMODEL_H
|
||||
|
||||
#include "spectralroom.h"
|
||||
#include "room.h"
|
||||
#include "spectralroom.h"
|
||||
|
||||
#include <QtCore/QAbstractListModel>
|
||||
|
||||
|
@ -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<int>& roles = {});
|
||||
int refreshEventRoles(const QString& eventId, const QVector<int>& roles = {});
|
||||
|
||||
|
|
Loading…
Reference in New Issue