Move ShowAuthorRole to MessageFilterModel
Only there can it be calculated correctly. Fixes #632
This commit is contained in:
@@ -24,6 +24,7 @@
|
|||||||
#include "events/pollevent.h"
|
#include "events/pollevent.h"
|
||||||
#include "linkpreviewer.h"
|
#include "linkpreviewer.h"
|
||||||
#include "messagecontentmodel.h"
|
#include "messagecontentmodel.h"
|
||||||
|
#include "models/messagefiltermodel.h"
|
||||||
#include "models/reactionmodel.h"
|
#include "models/reactionmodel.h"
|
||||||
#include "texthandler.h"
|
#include "texthandler.h"
|
||||||
|
|
||||||
@@ -43,7 +44,6 @@ QHash<int, QByteArray> MessageEventModel::roleNames() const
|
|||||||
roles[ProgressInfoRole] = "progressInfo";
|
roles[ProgressInfoRole] = "progressInfo";
|
||||||
roles[IsThreadedRole] = "isThreaded";
|
roles[IsThreadedRole] = "isThreaded";
|
||||||
roles[ThreadRootRole] = "threadRoot";
|
roles[ThreadRootRole] = "threadRoot";
|
||||||
roles[ShowAuthorRole] = "showAuthor";
|
|
||||||
roles[ShowSectionRole] = "showSection";
|
roles[ShowSectionRole] = "showSection";
|
||||||
roles[ReadMarkersRole] = "readMarkers";
|
roles[ReadMarkersRole] = "readMarkers";
|
||||||
roles[ExcessReadMarkersRole] = "excessReadMarkers";
|
roles[ExcessReadMarkersRole] = "excessReadMarkers";
|
||||||
@@ -176,7 +176,7 @@ void MessageEventModel::setRoom(NeoChatRoom *room)
|
|||||||
}
|
}
|
||||||
if (biggest < m_currentRoom->maxTimelineIndex()) {
|
if (biggest < m_currentRoom->maxTimelineIndex()) {
|
||||||
auto rowBelowInserted = m_currentRoom->maxTimelineIndex() - biggest + timelineBaseIndex() - 1;
|
auto rowBelowInserted = m_currentRoom->maxTimelineIndex() - biggest + timelineBaseIndex() - 1;
|
||||||
refreshEventRoles(rowBelowInserted, {ShowAuthorRole});
|
refreshEventRoles(rowBelowInserted, {MessageFilterModel::ShowAuthorRole});
|
||||||
}
|
}
|
||||||
for (auto i = m_currentRoom->maxTimelineIndex() - biggest; i <= m_currentRoom->maxTimelineIndex() - lowest; ++i) {
|
for (auto i = m_currentRoom->maxTimelineIndex() - biggest; i <= m_currentRoom->maxTimelineIndex() - lowest; ++i) {
|
||||||
refreshLastUserEvents(i);
|
refreshLastUserEvents(i);
|
||||||
@@ -206,7 +206,7 @@ void MessageEventModel::setRoom(NeoChatRoom *room)
|
|||||||
refreshRow(timelineBaseIndex()); // Refresh the looks
|
refreshRow(timelineBaseIndex()); // Refresh the looks
|
||||||
refreshLastUserEvents(0);
|
refreshLastUserEvents(0);
|
||||||
if (timelineBaseIndex() > 0) { // Refresh below, see #312
|
if (timelineBaseIndex() > 0) { // Refresh below, see #312
|
||||||
refreshEventRoles(timelineBaseIndex() - 1, {ShowAuthorRole});
|
refreshEventRoles(timelineBaseIndex() - 1, {MessageFilterModel::ShowAuthorRole});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
connect(m_currentRoom, &Room::pendingEventChanged, this, &MessageEventModel::refreshRow);
|
connect(m_currentRoom, &Room::pendingEventChanged, this, &MessageEventModel::refreshRow);
|
||||||
@@ -549,25 +549,6 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
|
|||||||
return eventHandler.threadRoot();
|
return eventHandler.threadRoot();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (role == ShowAuthorRole) {
|
|
||||||
for (auto r = row + 1; r < rowCount(); ++r) {
|
|
||||||
auto i = index(r);
|
|
||||||
// Note !itemData(i).empty() is a check for instances where rows have been removed, e.g. when the read marker is moved.
|
|
||||||
// While the row is removed the subsequent row indexes are not changed so we need to skip over the removed index.
|
|
||||||
// See - https://doc.qt.io/qt-5/qabstractitemmodel.html#beginRemoveRows
|
|
||||||
if (data(i, SpecialMarksRole) != EventStatus::Hidden && !itemData(i).empty()) {
|
|
||||||
return data(i, AuthorRole) != data(idx, AuthorRole) || data(i, DelegateTypeRole) == DelegateType::State
|
|
||||||
|| data(i, TimeRole).toDateTime().msecsTo(data(idx, TimeRole).toDateTime()) > 600000
|
|
||||||
|| data(i, TimeRole).toDateTime().toLocalTime().date().day() != data(idx, TimeRole).toDateTime().toLocalTime().date().day()
|
|
||||||
// FIXME: This should not be necessary; the proper fix is to calculate this role in MessageFilterModel with the knowledge about the filtered
|
|
||||||
// events.
|
|
||||||
|| data(i, IsRedactedRole).toBool();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (role == ShowSectionRole) {
|
if (role == ShowSectionRole) {
|
||||||
for (auto r = row + 1; r < rowCount(); ++r) {
|
for (auto r = row + 1; r < rowCount(); ++r) {
|
||||||
auto i = index(r);
|
auto i = index(r);
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ public:
|
|||||||
IsThreadedRole,
|
IsThreadedRole,
|
||||||
ThreadRootRole,
|
ThreadRootRole,
|
||||||
|
|
||||||
ShowAuthorRole, /**< Whether the author's name should be shown. */
|
|
||||||
ShowSectionRole, /**< Whether the section header should be shown. */
|
ShowSectionRole, /**< Whether the section header should be shown. */
|
||||||
|
|
||||||
ReadMarkersRole, /**< The first 5 other users at the event for read marker tracking. */
|
ReadMarkersRole, /**< The first 5 other users at the event for read marker tracking. */
|
||||||
|
|||||||
@@ -80,8 +80,24 @@ QVariant MessageFilterModel::data(const QModelIndex &index, int role) const
|
|||||||
return authorList(mapToSource(index).row());
|
return authorList(mapToSource(index).row());
|
||||||
} else if (role == ExcessAuthorsRole) {
|
} else if (role == ExcessAuthorsRole) {
|
||||||
return excessAuthors(mapToSource(index).row());
|
return excessAuthors(mapToSource(index).row());
|
||||||
|
} else if (role == ShowAuthorRole) {
|
||||||
|
for (auto r = index.row() + 1; r < rowCount(); ++r) {
|
||||||
|
auto i = this->index(r, 0);
|
||||||
|
// Note !itemData(i).empty() is a check for instances where rows have been removed, e.g. when the read marker is moved.
|
||||||
|
// While the row is removed the subsequent row indexes are not changed so we need to skip over the removed index.
|
||||||
|
// See - https://doc.qt.io/qt-5/qabstractitemmodel.html#beginRemoveRows
|
||||||
|
if (data(i, MessageEventModel::SpecialMarksRole) != EventStatus::Hidden && !itemData(i).empty()) {
|
||||||
|
return data(i, MessageEventModel::AuthorRole) != data(index, MessageEventModel::AuthorRole)
|
||||||
|
|| data(i, MessageEventModel::DelegateTypeRole) == DelegateType::State
|
||||||
|
|| data(i, MessageEventModel::TimeRole).toDateTime().msecsTo(data(index, MessageEventModel::TimeRole).toDateTime()) > 600000
|
||||||
|
|| data(i, MessageEventModel::TimeRole).toDateTime().toLocalTime().date().day()
|
||||||
|
!= data(index, MessageEventModel::TimeRole).toDateTime().toLocalTime().date().day();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return sourceModel()->data(mapToSource(index), role);
|
return QSortFilterProxyModel::data(index, role);
|
||||||
}
|
}
|
||||||
|
|
||||||
QHash<int, QByteArray> MessageFilterModel::roleNames() const
|
QHash<int, QByteArray> MessageFilterModel::roleNames() const
|
||||||
@@ -91,6 +107,7 @@ QHash<int, QByteArray> MessageFilterModel::roleNames() const
|
|||||||
roles[StateEventsRole] = "stateEvents";
|
roles[StateEventsRole] = "stateEvents";
|
||||||
roles[AuthorListRole] = "authorList";
|
roles[AuthorListRole] = "authorList";
|
||||||
roles[ExcessAuthorsRole] = "excessAuthors";
|
roles[ExcessAuthorsRole] = "excessAuthors";
|
||||||
|
roles[ShowAuthorRole] = "showAuthor";
|
||||||
return roles;
|
return roles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ public:
|
|||||||
StateEventsRole, /**< List of state events in the aggregated state. */
|
StateEventsRole, /**< List of state events in the aggregated state. */
|
||||||
AuthorListRole, /**< List of the first 5 unique authors of the aggregated state event. */
|
AuthorListRole, /**< List of the first 5 unique authors of the aggregated state event. */
|
||||||
ExcessAuthorsRole, /**< The number of unique authors beyond the first 5. */
|
ExcessAuthorsRole, /**< The number of unique authors beyond the first 5. */
|
||||||
|
ShowAuthorRole, /**< Whether the author (name and avatar) should be shown at this message. */
|
||||||
LastRole, // Keep this last
|
LastRole, // Keep this last
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user