reverse list to load most recent messages first
This commit is contained in:
parent
d17a61e6d0
commit
3f3f29b2ec
5 changed files with 155 additions and 148 deletions
|
|
@ -44,6 +44,7 @@ void EventLogProxy::setSourceModel(QAbstractItemModel *model) {
|
||||||
connect(newEventLogList, &EventLogList::eventChanged, this, &EventLogProxy::eventChanged);
|
connect(newEventLogList, &EventLogList::eventChanged, this, &EventLogProxy::eventChanged);
|
||||||
connect(newEventLogList, &EventLogList::eventInserted, this,
|
connect(newEventLogList, &EventLogList::eventInserted, this,
|
||||||
[this, newEventLogList](int index, EventLogGui *event) {
|
[this, newEventLogList](int index, EventLogGui *event) {
|
||||||
|
invalidate();
|
||||||
if (index != -1) {
|
if (index != -1) {
|
||||||
index = dynamic_cast<SortFilterList *>(sourceModel())
|
index = dynamic_cast<SortFilterList *>(sourceModel())
|
||||||
->mapFromSource(newEventLogList->index(index, 0))
|
->mapFromSource(newEventLogList->index(index, 0))
|
||||||
|
|
@ -53,7 +54,7 @@ void EventLogProxy::setSourceModel(QAbstractItemModel *model) {
|
||||||
emit eventInserted(index, event);
|
emit eventInserted(index, event);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
setSourceModels(new SortFilterList(model, Qt::AscendingOrder));
|
setSourceModels(new SortFilterList(model, Qt::DescendingOrder));
|
||||||
sort(0);
|
sort(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -88,10 +89,10 @@ int EventLogProxy::findFirstUnreadIndex() {
|
||||||
if (mMaxDisplayItems <= listIndex) setMaxDisplayItems(listIndex + mDisplayItemsStep);
|
if (mMaxDisplayItems <= listIndex) setMaxDisplayItems(listIndex + mDisplayItemsStep);
|
||||||
return listIndex;
|
return listIndex;
|
||||||
} else {
|
} else {
|
||||||
return std::max(0, getCount() - 1);
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return std::max(0, getCount() - 1);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventLogProxy::markIndexAsRead(int proxyIndex) {
|
void EventLogProxy::markIndexAsRead(int proxyIndex) {
|
||||||
|
|
|
||||||
|
|
@ -2072,45 +2072,45 @@ Error</extracomment>
|
||||||
<context>
|
<context>
|
||||||
<name>ChatMessagesListView</name>
|
<name>ChatMessagesListView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="35"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="36"/>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="49"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="50"/>
|
||||||
<source>popup_info_find_message_title</source>
|
<source>popup_info_find_message_title</source>
|
||||||
<extracomment>Find message</extracomment>
|
<extracomment>Find message</extracomment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="37"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="38"/>
|
||||||
<source>info_popup_no_result_message</source>
|
<source>info_popup_no_result_message</source>
|
||||||
<extracomment>No result found</extracomment>
|
<extracomment>No result found</extracomment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="51"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="52"/>
|
||||||
<source>info_popup_first_result_message</source>
|
<source>info_popup_first_result_message</source>
|
||||||
<extracomment>First result reached</extracomment>
|
<extracomment>First result reached</extracomment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="53"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="54"/>
|
||||||
<source>info_popup_last_result_message</source>
|
<source>info_popup_last_result_message</source>
|
||||||
<extracomment>Last result reached</extracomment>
|
<extracomment>Last result reached</extracomment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="140"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="143"/>
|
||||||
<source>chat_message_list_encrypted_header_title</source>
|
<source>chat_message_list_encrypted_header_title</source>
|
||||||
<extracomment>End to end encrypted chat</extracomment>
|
<extracomment>End to end encrypted chat</extracomment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="150"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="153"/>
|
||||||
<source>chat_message_list_encrypted_header_message</source>
|
<source>chat_message_list_encrypted_header_message</source>
|
||||||
<extracomment>Les messages de cette conversation sont chiffrés de bout
|
<extracomment>Les messages de cette conversation sont chiffrés de bout
|
||||||
en bout. Seul votre correspondant peut les déchiffrer.</extracomment>
|
en bout. Seul votre correspondant peut les déchiffrer.</extracomment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="296"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="191"/>
|
||||||
<source>chat_message_is_writing_info</source>
|
<source>chat_message_is_writing_info</source>
|
||||||
<extracomment>%1 is writing…</extracomment>
|
<extracomment>%1 is writing…</extracomment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
|
|
|
||||||
|
|
@ -2034,38 +2034,38 @@ Error</extracomment>
|
||||||
<context>
|
<context>
|
||||||
<name>ChatMessagesListView</name>
|
<name>ChatMessagesListView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="35"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="36"/>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="49"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="50"/>
|
||||||
<source>popup_info_find_message_title</source>
|
<source>popup_info_find_message_title</source>
|
||||||
<extracomment>Find message</extracomment>
|
<extracomment>Find message</extracomment>
|
||||||
<translation>Find message</translation>
|
<translation>Find message</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="37"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="38"/>
|
||||||
<source>info_popup_no_result_message</source>
|
<source>info_popup_no_result_message</source>
|
||||||
<extracomment>No result found</extracomment>
|
<extracomment>No result found</extracomment>
|
||||||
<translation>No result found</translation>
|
<translation>No result found</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="51"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="52"/>
|
||||||
<source>info_popup_first_result_message</source>
|
<source>info_popup_first_result_message</source>
|
||||||
<extracomment>First result reached</extracomment>
|
<extracomment>First result reached</extracomment>
|
||||||
<translation>First result reached</translation>
|
<translation>First result reached</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="53"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="54"/>
|
||||||
<source>info_popup_last_result_message</source>
|
<source>info_popup_last_result_message</source>
|
||||||
<extracomment>Last result reached</extracomment>
|
<extracomment>Last result reached</extracomment>
|
||||||
<translation>Last result reached</translation>
|
<translation>Last result reached</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="140"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="143"/>
|
||||||
<source>chat_message_list_encrypted_header_title</source>
|
<source>chat_message_list_encrypted_header_title</source>
|
||||||
<extracomment>End to end encrypted chat</extracomment>
|
<extracomment>End to end encrypted chat</extracomment>
|
||||||
<translation>End to end encrypted chat</translation>
|
<translation>End to end encrypted chat</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="150"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="153"/>
|
||||||
<source>chat_message_list_encrypted_header_message</source>
|
<source>chat_message_list_encrypted_header_message</source>
|
||||||
<extracomment>Les messages de cette conversation sont chiffrés de bout
|
<extracomment>Les messages de cette conversation sont chiffrés de bout
|
||||||
en bout. Seul votre correspondant peut les déchiffrer.</extracomment>
|
en bout. Seul votre correspondant peut les déchiffrer.</extracomment>
|
||||||
|
|
@ -2073,7 +2073,7 @@ Error</extracomment>
|
||||||
Only your correspondent can decrypt them.</translation>
|
Only your correspondent can decrypt them.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="296"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="191"/>
|
||||||
<source>chat_message_is_writing_info</source>
|
<source>chat_message_is_writing_info</source>
|
||||||
<extracomment>%1 is writing…</extracomment>
|
<extracomment>%1 is writing…</extracomment>
|
||||||
<translation>%1 is writing…</translation>
|
<translation>%1 is writing…</translation>
|
||||||
|
|
|
||||||
|
|
@ -2034,38 +2034,38 @@ Error</extracomment>
|
||||||
<context>
|
<context>
|
||||||
<name>ChatMessagesListView</name>
|
<name>ChatMessagesListView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="35"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="36"/>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="49"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="50"/>
|
||||||
<source>popup_info_find_message_title</source>
|
<source>popup_info_find_message_title</source>
|
||||||
<extracomment>Find message</extracomment>
|
<extracomment>Find message</extracomment>
|
||||||
<translation>Trouver un message</translation>
|
<translation>Trouver un message</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="37"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="38"/>
|
||||||
<source>info_popup_no_result_message</source>
|
<source>info_popup_no_result_message</source>
|
||||||
<extracomment>No result found</extracomment>
|
<extracomment>No result found</extracomment>
|
||||||
<translation>Aucun résultat trouvé</translation>
|
<translation>Aucun résultat trouvé</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="51"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="52"/>
|
||||||
<source>info_popup_first_result_message</source>
|
<source>info_popup_first_result_message</source>
|
||||||
<extracomment>First result reached</extracomment>
|
<extracomment>First result reached</extracomment>
|
||||||
<translation>Premier résultat atteint</translation>
|
<translation>Premier résultat atteint</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="53"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="54"/>
|
||||||
<source>info_popup_last_result_message</source>
|
<source>info_popup_last_result_message</source>
|
||||||
<extracomment>Last result reached</extracomment>
|
<extracomment>Last result reached</extracomment>
|
||||||
<translation>Dernier résultat atteint</translation>
|
<translation>Dernier résultat atteint</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="140"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="143"/>
|
||||||
<source>chat_message_list_encrypted_header_title</source>
|
<source>chat_message_list_encrypted_header_title</source>
|
||||||
<extracomment>End to end encrypted chat</extracomment>
|
<extracomment>End to end encrypted chat</extracomment>
|
||||||
<translation>Conversation chiffrée de bout en bout</translation>
|
<translation>Conversation chiffrée de bout en bout</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="150"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="153"/>
|
||||||
<source>chat_message_list_encrypted_header_message</source>
|
<source>chat_message_list_encrypted_header_message</source>
|
||||||
<extracomment>Les messages de cette conversation sont chiffrés de bout
|
<extracomment>Les messages de cette conversation sont chiffrés de bout
|
||||||
en bout. Seul votre correspondant peut les déchiffrer.</extracomment>
|
en bout. Seul votre correspondant peut les déchiffrer.</extracomment>
|
||||||
|
|
@ -2073,7 +2073,7 @@ Error</extracomment>
|
||||||
en bout. Seul votre correspondant peut les déchiffrer.</translation>
|
en bout. Seul votre correspondant peut les déchiffrer.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="296"/>
|
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="191"/>
|
||||||
<source>chat_message_is_writing_info</source>
|
<source>chat_message_is_writing_info</source>
|
||||||
<extracomment>%1 is writing…</extracomment>
|
<extracomment>%1 is writing…</extracomment>
|
||||||
<translation>%1 est en train d'écrire…</translation>
|
<translation>%1 est en train d'écrire…</translation>
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ ListView {
|
||||||
property ChatGui chat
|
property ChatGui chat
|
||||||
property color backgroundColor
|
property color backgroundColor
|
||||||
property bool lastItemVisible: false
|
property bool lastItemVisible: false
|
||||||
|
verticalLayoutDirection: ListView.BottomToTop
|
||||||
signal showReactionsForMessageRequested(ChatMessageGui chatMessage)
|
signal showReactionsForMessageRequested(ChatMessageGui chatMessage)
|
||||||
signal showImdnStatusForMessageRequested(ChatMessageGui chatMessage)
|
signal showImdnStatusForMessageRequested(ChatMessageGui chatMessage)
|
||||||
signal replyToMessageRequested(ChatMessageGui chatMessage)
|
signal replyToMessageRequested(ChatMessageGui chatMessage)
|
||||||
|
|
@ -57,7 +58,7 @@ ListView {
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
Qt.callLater(function() {
|
Qt.callLater(function() {
|
||||||
var index = eventLogProxy.findFirstUnreadIndex()
|
var index = eventLogProxy.findFirstUnreadIndex()
|
||||||
positionViewAtIndex(index, ListView.End)
|
positionViewAtIndex(index, ListView.Beginning)
|
||||||
eventLogProxy.markIndexAsRead(index)
|
eventLogProxy.markIndexAsRead(index)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -81,43 +82,46 @@ ListView {
|
||||||
anchors.rightMargin: Math.round(18 * DefaultStyle.dp)
|
anchors.rightMargin: Math.round(18 * DefaultStyle.dp)
|
||||||
onClicked: {
|
onClicked: {
|
||||||
var index = eventLogProxy.findFirstUnreadIndex()
|
var index = eventLogProxy.findFirstUnreadIndex()
|
||||||
mainItem.positionViewAtIndex(index, ListView.End)
|
mainItem.positionViewAtIndex(index, ListView.Beginning)
|
||||||
eventLogProxy.markIndexAsRead(index)
|
eventLogProxy.markIndexAsRead(index)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onAtYEndChanged: if (atYEnd) {
|
onAtYEndChanged: if (atYEnd) {
|
||||||
|
chat.core.lMarkAsRead()
|
||||||
|
}
|
||||||
|
onAtYBeginningChanged: if (atYBeginning) {
|
||||||
if (eventLogProxy.haveMore)
|
if (eventLogProxy.haveMore)
|
||||||
eventLogProxy.displayMore()
|
eventLogProxy.displayMore()
|
||||||
else chat.core.lMarkAsRead()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
model: EventLogProxy {
|
model: EventLogProxy {
|
||||||
id: eventLogProxy
|
id: eventLogProxy
|
||||||
chatGui: mainItem.chat
|
chatGui: mainItem.chat
|
||||||
// scroll when in view and message inserted
|
|
||||||
filterText: mainItem.filterText
|
filterText: mainItem.filterText
|
||||||
initialDisplayItems: 10
|
initialDisplayItems: 10
|
||||||
displayItemsStep: 3 * initialDisplayItems / 2
|
|
||||||
onEventInserted: (index, gui) => {
|
onEventInserted: (index, gui) => {
|
||||||
if (!mainItem.visible) return
|
if (!mainItem.visible) return
|
||||||
if(mainItem.lastItemVisible) mainItem.positionViewAtIndex(index, ListView.End)
|
if(mainItem.lastItemVisible) mainItem.positionViewAtIndex(index, ListView.Beginning)
|
||||||
}
|
}
|
||||||
onModelReset: Qt.callLater(function() {
|
onModelReset: Qt.callLater(function() {
|
||||||
var index = eventLogProxy.findFirstUnreadIndex()
|
var index = eventLogProxy.findFirstUnreadIndex()
|
||||||
positionViewAtIndex(index, ListView.End)
|
positionViewAtIndex(index, ListView.Beginning)
|
||||||
eventLogProxy.markIndexAsRead(index)
|
eventLogProxy.markIndexAsRead(index)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
header: Item {
|
footer: Item {
|
||||||
visible: mainItem.chat && mainItem.chat.core.isEncrypted
|
visible: mainItem.chat && mainItem.chat.core.isEncrypted && !eventLogProxy.haveMore
|
||||||
height: visible ? headerMessage.height + Math.round(50 * DefaultStyle.dp) : Math.round(30 * DefaultStyle.dp)
|
height: visible ? headerMessage.height + headerMessage.topMargin + headerMessage.bottomMargin : Math.round(30 * DefaultStyle.dp)
|
||||||
width: headerMessage.width
|
width: headerMessage.width
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
Control.Control {
|
Control.Control {
|
||||||
id: headerMessage
|
id: headerMessage
|
||||||
anchors.topMargin: Math.round(30 * DefaultStyle.dp)
|
property int topMargin: mainItem.contentHeight > mainItem.height ? Math.round(30 * DefaultStyle.dp) : Math.round(50 * DefaultStyle.dp)
|
||||||
|
property int bottomMargin: Math.round(30 * DefaultStyle.dp)
|
||||||
|
anchors.topMargin: topMargin
|
||||||
|
anchors.bottomMargin: bottomMargin
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
padding: Math.round(10 * DefaultStyle.dp)
|
padding: Math.round(10 * DefaultStyle.dp)
|
||||||
background: Rectangle {
|
background: Rectangle {
|
||||||
|
|
@ -159,118 +163,12 @@ ListView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
footerPositioning: ListView.PullBackFooter
|
||||||
|
headerPositioning: ListView.OverlayHeader
|
||||||
delegate: DelegateChooser {
|
header: Control.Control {
|
||||||
role: "eventType"
|
|
||||||
|
|
||||||
DelegateChoice {
|
|
||||||
roleValue: "chatMessage"
|
|
||||||
delegate: ChatMessage {
|
|
||||||
id: chatMessageDelegate
|
|
||||||
property int yoff: Math.round(chatMessageDelegate.y - mainItem.contentY)
|
|
||||||
property bool isFullyVisible: (yoff > mainItem.y && yoff + height < mainItem.y + mainItem.height)
|
|
||||||
chatMessage: modelData.core.chatMessageGui
|
|
||||||
onIsFullyVisibleChanged: {
|
|
||||||
if (index === mainItem.count - 1) {
|
|
||||||
mainItem.lastItemVisible = isFullyVisible
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Component.onCompleted: if (index === mainItem.count - 1) mainItem.lastItemVisible = isFullyVisible
|
|
||||||
chat: mainItem.chat
|
|
||||||
searchedTextPart: mainItem.filterText
|
|
||||||
maxWidth: Math.round(mainItem.width * (3/4))
|
|
||||||
width: mainItem.width
|
|
||||||
property var previousIndex: index - 1
|
|
||||||
property ChatMessageGui nextChatMessage: index >= (mainItem.count - 1)
|
|
||||||
? null
|
|
||||||
: eventLogProxy.getEventAtIndex(index+1)
|
|
||||||
? eventLogProxy.getEventAtIndex(index+1).core.chatMessageGui
|
|
||||||
: null
|
|
||||||
property var previousFromAddress: eventLogProxy.getEventAtIndex(index-1)?.core.chatMessage?.fromAddress
|
|
||||||
backgroundColor: isRemoteMessage ? DefaultStyle.main2_100 : DefaultStyle.main1_100
|
|
||||||
isFirstMessage: !previousFromAddress || previousFromAddress !== chatMessage.core.fromAddress
|
|
||||||
anchors.right: !isRemoteMessage && parent
|
|
||||||
? parent.right
|
|
||||||
: undefined
|
|
||||||
|
|
||||||
onMessageDeletionRequested: chatMessage.core.lDelete()
|
|
||||||
onShowReactionsForMessageRequested: mainItem.showReactionsForMessageRequested(chatMessage)
|
|
||||||
onShowImdnStatusForMessageRequested: mainItem.showImdnStatusForMessageRequested(chatMessage)
|
|
||||||
onReplyToMessageRequested: mainItem.replyToMessageRequested(chatMessage)
|
|
||||||
onForwardMessageRequested: mainItem.forwardMessageRequested(chatMessage)
|
|
||||||
onEndOfVoiceRecordingReached: {
|
|
||||||
if (nextChatMessage && nextChatMessage.core.isVoiceRecording) mainItem.requestAutoPlayVoiceRecording(index + 1)
|
|
||||||
}
|
|
||||||
Connections {
|
|
||||||
target: mainItem
|
|
||||||
function onRequestHighlight(indexToHighlight) {
|
|
||||||
if (indexToHighlight === index) {
|
|
||||||
requestHighlight()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function onRequestAutoPlayVoiceRecording(indexToPlay) {
|
|
||||||
if (indexToPlay === index) {
|
|
||||||
chatMessageDelegate.requestAutoPlayVoiceRecording()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DelegateChoice {
|
|
||||||
roleValue: "event"
|
|
||||||
delegate: Item {
|
|
||||||
id: eventDelegate
|
|
||||||
property int yoff: Math.round(eventDelegate.y - mainItem.contentY)
|
|
||||||
property bool isFullyVisible: (yoff > mainItem.y && yoff + height < mainItem.y + mainItem.height)
|
|
||||||
onIsFullyVisibleChanged: {
|
|
||||||
if (index === mainItem.count - 1) {
|
|
||||||
mainItem.lastItemVisible = isFullyVisible
|
|
||||||
}
|
|
||||||
}
|
|
||||||
property bool showTopMargin: !header.visible && index == 0
|
|
||||||
width: mainItem.width
|
|
||||||
height: (showTopMargin ? 30 : 0 * DefaultStyle.dp) + eventItem.implicitHeight
|
|
||||||
Event {
|
|
||||||
id: eventItem
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.topMargin: showTopMargin ? 30 : 0 * DefaultStyle.dp
|
|
||||||
width: parent.width
|
|
||||||
eventLogGui: modelData
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DelegateChoice {
|
|
||||||
roleValue: "ephemeralEvent"
|
|
||||||
delegate: Item {
|
|
||||||
id: ephemeralEventDelegate
|
|
||||||
property int yoff: Math.round(ephemeralEventDelegate.y - mainItem.contentY)
|
|
||||||
property bool isFullyVisible: (yoff > mainItem.y && yoff + height < mainItem.y + mainItem.height)
|
|
||||||
onIsFullyVisibleChanged: {
|
|
||||||
if (index === mainItem.count - 1) {
|
|
||||||
mainItem.lastItemVisible = isFullyVisible
|
|
||||||
}
|
|
||||||
}
|
|
||||||
property bool showTopMargin: !header.visible && index == 0
|
|
||||||
width: mainItem.width
|
|
||||||
//height: 40 * DefaultStyle.dp
|
|
||||||
height: (showTopMargin ? 30 : 0 * DefaultStyle.dp) + ephemeralEventItem.height
|
|
||||||
EphemeralEvent {
|
|
||||||
id: ephemeralEventItem
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.topMargin: showTopMargin ? 30 : 0 * DefaultStyle.dp
|
|
||||||
eventLogGui: modelData
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
footerPositioning: ListView.OverlayFooter
|
|
||||||
footer: Control.Control {
|
|
||||||
visible: composeLayout.composingName !== "" && composeLayout.composingName !== undefined
|
visible: composeLayout.composingName !== "" && composeLayout.composingName !== undefined
|
||||||
width: mainItem.width
|
width: mainItem.width
|
||||||
|
// height: visible ? contentItem.implicitHeight + topPadding + bottomPadding : 0
|
||||||
z: mainItem.z + 2
|
z: mainItem.z + 2
|
||||||
topPadding: Math.round(5 * DefaultStyle.dp)
|
topPadding: Math.round(5 * DefaultStyle.dp)
|
||||||
bottomPadding: Math.round(5 * DefaultStyle.dp)
|
bottomPadding: Math.round(5 * DefaultStyle.dp)
|
||||||
|
|
@ -297,4 +195,112 @@ ListView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delegate: DelegateChooser {
|
||||||
|
role: "eventType"
|
||||||
|
|
||||||
|
DelegateChoice {
|
||||||
|
roleValue: "chatMessage"
|
||||||
|
delegate: ChatMessage {
|
||||||
|
id: chatMessageDelegate
|
||||||
|
property int yoff: Math.round(chatMessageDelegate.y - mainItem.contentY)
|
||||||
|
property bool isFullyVisible: (yoff > mainItem.y && yoff + height < mainItem.y + mainItem.height)
|
||||||
|
chatMessage: modelData.core.chatMessageGui
|
||||||
|
onIsFullyVisibleChanged: {
|
||||||
|
if (index === 0) {
|
||||||
|
mainItem.lastItemVisible = isFullyVisible
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Component.onCompleted: {
|
||||||
|
if (index === 0) mainItem.lastItemVisible = isFullyVisible
|
||||||
|
}
|
||||||
|
chat: mainItem.chat
|
||||||
|
searchedTextPart: mainItem.filterText
|
||||||
|
maxWidth: Math.round(mainItem.width * (3/4))
|
||||||
|
width: mainItem.width
|
||||||
|
property var previousIndex: index - 1
|
||||||
|
property ChatMessageGui nextChatMessage: index <= 0
|
||||||
|
? null
|
||||||
|
: eventLogProxy.getEventAtIndex(index-1)
|
||||||
|
? eventLogProxy.getEventAtIndex(index-1).core.chatMessageGui
|
||||||
|
: null
|
||||||
|
property var previousFromAddress: eventLogProxy.getEventAtIndex(index+1)?.core.chatMessage?.fromAddress
|
||||||
|
backgroundColor: isRemoteMessage ? DefaultStyle.main2_100 : DefaultStyle.main1_100
|
||||||
|
isFirstMessage: !previousFromAddress || previousFromAddress !== chatMessage.core.fromAddress
|
||||||
|
anchors.right: !isRemoteMessage && parent
|
||||||
|
? parent.right
|
||||||
|
: undefined
|
||||||
|
|
||||||
|
onMessageDeletionRequested: chatMessage.core.lDelete()
|
||||||
|
onShowReactionsForMessageRequested: mainItem.showReactionsForMessageRequested(chatMessage)
|
||||||
|
onShowImdnStatusForMessageRequested: mainItem.showImdnStatusForMessageRequested(chatMessage)
|
||||||
|
onReplyToMessageRequested: mainItem.replyToMessageRequested(chatMessage)
|
||||||
|
onForwardMessageRequested: mainItem.forwardMessageRequested(chatMessage)
|
||||||
|
onEndOfVoiceRecordingReached: {
|
||||||
|
if (nextChatMessage && nextChatMessage.core.isVoiceRecording) mainItem.requestAutoPlayVoiceRecording(index - 1)
|
||||||
|
}
|
||||||
|
Connections {
|
||||||
|
target: mainItem
|
||||||
|
function onRequestHighlight(indexToHighlight) {
|
||||||
|
if (indexToHighlight === index) {
|
||||||
|
requestHighlight()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function onRequestAutoPlayVoiceRecording(indexToPlay) {
|
||||||
|
if (indexToPlay === index) {
|
||||||
|
chatMessageDelegate.requestAutoPlayVoiceRecording()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DelegateChoice {
|
||||||
|
roleValue: "event"
|
||||||
|
delegate: Item {
|
||||||
|
id: eventDelegate
|
||||||
|
property int yoff: Math.round(eventDelegate.y - mainItem.contentY)
|
||||||
|
property bool isFullyVisible: (yoff > mainItem.y && yoff + height < mainItem.y + mainItem.height)
|
||||||
|
onIsFullyVisibleChanged: {
|
||||||
|
if (index === 0) {
|
||||||
|
mainItem.lastItemVisible = isFullyVisible
|
||||||
|
}
|
||||||
|
}
|
||||||
|
property bool showTopMargin: !header.visible && index == 0
|
||||||
|
width: mainItem.width
|
||||||
|
height: (showTopMargin ? 30 * DefaultStyle.dp : 0) + eventItem.implicitHeight
|
||||||
|
Event {
|
||||||
|
id: eventItem
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: showTopMargin ? 30 : 0 * DefaultStyle.dp
|
||||||
|
width: parent.width
|
||||||
|
eventLogGui: modelData
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DelegateChoice {
|
||||||
|
roleValue: "ephemeralEvent"
|
||||||
|
delegate: Item {
|
||||||
|
id: ephemeralEventDelegate
|
||||||
|
property int yoff: Math.round(ephemeralEventDelegate.y - mainItem.contentY)
|
||||||
|
property bool isFullyVisible: (yoff > mainItem.y && yoff + height < mainItem.y + mainItem.height)
|
||||||
|
onIsFullyVisibleChanged: {
|
||||||
|
if (index === 0) {
|
||||||
|
mainItem.lastItemVisible = isFullyVisible
|
||||||
|
}
|
||||||
|
}
|
||||||
|
property bool showTopMargin: !header.visible && index == 0
|
||||||
|
width: mainItem.width
|
||||||
|
//height: 40 * DefaultStyle.dp
|
||||||
|
height: (showTopMargin ? 30 : 0 * DefaultStyle.dp) + ephemeralEventItem.height
|
||||||
|
EphemeralEvent {
|
||||||
|
id: ephemeralEventItem
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: showTopMargin ? 30 : 0 * DefaultStyle.dp
|
||||||
|
eventLogGui: modelData
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue