From c5a55654a0b36902426f8eb3359d45ecc9742b8b Mon Sep 17 00:00:00 2001 From: Black Hat Date: Mon, 6 Aug 2018 23:16:35 +0800 Subject: [PATCH] Update libqmatrixclient again and some code cleanup. --- include/libqmatrixclient | 2 +- qml/main.qml | 21 -------- src/messageeventmodel.cpp | 103 +++++++++++++++++++++++--------------- src/messageeventmodel.h | 9 ++-- 4 files changed, 69 insertions(+), 66 deletions(-) diff --git a/include/libqmatrixclient b/include/libqmatrixclient index c0e75a5..c8dc0c0 160000 --- a/include/libqmatrixclient +++ b/include/libqmatrixclient @@ -1 +1 @@ -Subproject commit c0e75a52504a3d31bcca0d4c39745d4d6c1fe917 +Subproject commit c8dc0c075497ca8f174b738ee4253ca282cbec8c diff --git a/qml/main.qml b/qml/main.qml index 9ad888b..d28a020 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -91,27 +91,6 @@ ApplicationWindow { } } - Dialog { - property alias text: errorLabel.text - - id: errorDialog - width: 360 - modal: true - title: "ERROR" - - x: (window.width - width) / 2 - y: (window.height - height) / 2 - - standardButtons: Dialog.Ok - - Label { - id: errorLabel - width: parent.width - text: "Label" - wrapMode: Text.Wrap - } - } - Component { id: loginPage diff --git a/src/messageeventmodel.cpp b/src/messageeventmodel.cpp index 30deb33..e97289d 100644 --- a/src/messageeventmodel.cpp +++ b/src/messageeventmodel.cpp @@ -60,23 +60,29 @@ void MessageEventModel::setRoom(QMatrixClient::Room* room) { using namespace QMatrixClient; connect(m_currentRoom, &Room::aboutToAddNewMessages, this, [=](RoomEventsRange events) { - const auto pos = m_currentRoom->pendingEvents().size(); - beginInsertRows(QModelIndex(), int(pos), - int(pos + events.size() - 1)); + beginInsertRows({}, timelineBaseIndex(), + timelineBaseIndex() + int(events.size()) - 1); }); connect(m_currentRoom, &Room::aboutToAddHistoricalMessages, this, [=](RoomEventsRange events) { if (rowCount() > 0) rowBelowInserted = rowCount() - 1; // See #312 - beginInsertRows(QModelIndex(), rowCount(), + beginInsertRows({}, rowCount(), rowCount() + int(events.size()) - 1); }); - connect(m_currentRoom, &Room::addedMessages, this, [=] { - endInsertRows(); - if (rowBelowInserted > -1) - refreshEventRoles(rowBelowInserted, - {AboveAuthorRole, AboveSectionRole}); - }); + connect(m_currentRoom, &Room::addedMessages, this, + [=](int lowest, int biggest) { + endInsertRows(); + if (biggest < m_currentRoom->maxTimelineIndex()) { + auto rowBelowInserted = m_currentRoom->maxTimelineIndex() - + biggest + timelineBaseIndex() - 1; + refreshEventRoles(rowBelowInserted, + {AboveAuthorRole, AboveSectionRole}); + } + 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); }); connect(m_currentRoom, &Room::pendingEventAdded, this, @@ -95,7 +101,8 @@ void MessageEventModel::setRoom(QMatrixClient::Room* 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, {ReadMarkerRole}); if (timelineBaseIndex() > 0) // Refresh below, see #312 @@ -114,9 +121,11 @@ void MessageEventModel::setRoom(QMatrixClient::Room* 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, @@ -132,8 +141,8 @@ void MessageEventModel::setRoom(QMatrixClient::Room* room) { endResetModel(); } -void MessageEventModel::refreshEvent(const QString& eventId) { - refreshEventRoles(eventId); +int MessageEventModel::refreshEvent(const QString& eventId) { + return refreshEventRoles(eventId); } void MessageEventModel::refreshRow(int row) { refreshEventRoles(row); } @@ -147,16 +156,17 @@ void MessageEventModel::refreshEventRoles(int row, const QVector& roles) { emit dataChanged(idx, idx, roles); } -void MessageEventModel::refreshEventRoles(const QString& eventId, - const QVector& roles) { +int MessageEventModel::refreshEventRoles(const QString& eventId, + const QVector& roles) { const auto it = m_currentRoom->findInTimeline(eventId); if (it == m_currentRoom->timelineEdge()) { qWarning() << "Trying to refresh inexistent event:" << eventId; - return; + return -1; } - refreshEventRoles( - it - m_currentRoom->messageEvents().rbegin() + timelineBaseIndex(), - roles); + const auto row = + it - m_currentRoom->messageEvents().rbegin() + timelineBaseIndex(); + refreshEventRoles(row, roles); + return row; } inline bool hasValidTimestamp(const QMatrixClient::TimelineItem& ti) { @@ -210,8 +220,8 @@ bool MessageEventModel::isUserActivityNotable( bool joinFound = false, redactionsFound = false; // Find the nearest join of this user above, or a no-nonsense event. for (auto it = baseIt, - limit = - baseIt + std::min(m_currentRoom->timelineEdge() - baseIt, 100); + limit = baseIt + + std::min(int(m_currentRoom->timelineEdge() - baseIt), 100); it != limit; ++it) { const auto& e = **it; if (e.senderId() != senderId) continue; @@ -231,10 +241,10 @@ bool MessageEventModel::isUserActivityNotable( // Find the nearest leave of this user below, or a no-nonsense event bool leaveFound = false; for (auto it = baseIt.base() - 1, - limit = - baseIt.base() + - std::min(m_currentRoom->messageEvents().end() - baseIt.base(), - 100); + limit = baseIt.base() + + std::min(int(m_currentRoom->messageEvents().end() - + baseIt.base()), + 100); it != limit; ++it) { const auto& e = **it; if (e.senderId() != senderId) continue; @@ -258,6 +268,22 @@ bool MessageEventModel::isUserActivityNotable( return !(joinFound && leaveFound); // Join + (maybe profile changes) + leave } +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 + 100, + m_currentRoom->timelineSize()); + for (auto it = timelineBottom + std::max(baseTimelineRow - 100, 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(); @@ -550,28 +576,25 @@ QVariant MessageEventModel::data(const QModelIndex& idx, int role) const { !Settings().value("UI/show_joinleave", true).toBool()) return EventStatus::Hidden; } - if (evt.isRedacted() || memberEvent) { + if (memberEvent || evt.isRedacted()) { if (evt.senderId() == m_currentRoom->localUser()->id() || Settings().value("UI/show_spammy").toBool()) { - return EventStatus::Normal; + // QElapsedTimer et; et.start(); + auto hide = !isUserActivityNotable(timelineIt); + // qDebug() << "Checked user activity for" << evt.id() << + // "in" << et; + if (hide) return EventStatus::Hidden; } - QElapsedTimer et; - et.start(); - auto hide = !isUserActivityNotable(timelineIt); - qDebug() << "Checked user activity for" << evt.id() << "in" << et; - if (hide) return EventStatus::Hidden; } + if (evt.isRedacted()) + return Settings().value("UI/show_redacted").toBool() + ? EventStatus::Redacted : EventStatus::Hidden; if (evt.isStateEvent() && static_cast(evt).repeatsState() && !Settings().value("UI/show_noop_events").toBool()) return EventStatus::Hidden; - if (evt.isRedacted()) - return Settings().value("UI/show_redacted").toBool() - ? EventStatus::Redacted - : EventStatus::Hidden; - return EventStatus::Normal; } diff --git a/src/messageeventmodel.h b/src/messageeventmodel.h index c4f21b8..500ca8a 100644 --- a/src/messageeventmodel.h +++ b/src/messageeventmodel.h @@ -43,7 +43,7 @@ class MessageEventModel : public QAbstractListModel { QHash roleNames() const; private slots: - void refreshEvent(const QString& eventId); + int refreshEvent(const QString& eventId); void refreshRow(int row); private: @@ -56,11 +56,12 @@ class MessageEventModel : public QAbstractListModel { QDateTime makeMessageTimestamp( const QMatrixClient::Room::rev_iter_t& baseIt) const; QString renderDate(QDateTime timestamp) const; - bool isUserActivityNotable(const QMatrixClient::Room::rev_iter_t& baseIt) const; + bool isUserActivityNotable( + const QMatrixClient::Room::rev_iter_t& baseIt) const; + void refreshLastUserEvents(int baseRow); void refreshEventRoles(int row, const QVector& roles = {}); - void refreshEventRoles(const QString& eventId, - const QVector& roles = {}); + int refreshEventRoles(const QString& eventId, const QVector& roles = {}); signals: void roomChanged();