moment/src/qml/Chat/Timeline/EventList.qml

101 lines
2.8 KiB
QML
Raw Normal View History

2019-07-08 13:52:41 +10:00
// Copyright 2019 miruka
// This file is part of harmonyqml, licensed under LGPLv3.
import QtQuick 2.12
import SortFilterProxyModel 0.2
import "../../Base"
import "../../utils.js" as Utils
2019-03-22 14:28:14 +11:00
HRectangle {
property alias listView: eventList
2019-07-07 07:29:32 +10:00
color: theme.chat.eventList.background
2019-04-29 01:01:38 +10:00
2019-05-14 03:15:03 +10:00
HListView {
id: eventList
2019-05-03 05:01:25 +10:00
clip: true
Component.onCompleted: shortcuts.flickTarget = eventList
2019-03-22 14:28:14 +11:00
function canCombine(item, itemAfter) {
if (! item || ! itemAfter) { return false }
return Boolean(
! canTalkBreak(item, itemAfter) &&
! canDayBreak(item, itemAfter) &&
item.senderId === itemAfter.senderId &&
Utils.minutesBetween(item.date, itemAfter.date) <= 5
)
}
function canTalkBreak(item, itemAfter) {
if (! item || ! itemAfter) { return false }
return Boolean(
! canDayBreak(item, itemAfter) &&
Utils.minutesBetween(item.date, itemAfter.date) >= 20
)
}
function canDayBreak(item, itemAfter) {
if (! item || ! itemAfter || ! item.date || ! itemAfter.date) {
return false
}
return Boolean(
itemAfter.eventType == "RoomCreateEvent" ||
item.date.getDate() != itemAfter.date.getDate()
)
}
model: HListModel {
2019-07-05 06:01:44 +10:00
sourceModel: timelines
filters: ValueFilter {
roleName: "roomId"
value: chatPage.roomId
}
}
property bool ownEventsOnRight:
width < theme.chat.eventList.ownEventsOnRightUnderWidth
2019-07-03 12:29:09 +10:00
delegate: EventDelegate {}
2019-04-29 01:01:38 +10:00
anchors.fill: parent
2019-07-16 19:29:47 +10:00
anchors.leftMargin: theme.spacing
anchors.rightMargin: theme.spacing
2019-04-29 01:01:38 +10:00
2019-07-16 19:29:47 +10:00
topMargin: theme.spacing
bottomMargin: theme.spacing
verticalLayoutDirection: ListView.BottomToTop
2019-04-18 03:44:04 +10:00
// Keep x scroll pages cached, to limit images having to be
// reloaded from network.
cacheBuffer: height * 4
2019-04-18 04:27:22 +10:00
2019-07-05 16:45:30 +10:00
// Declaring this as "alias" provides the on... signal
property real yPos: visibleArea.yPosition
2019-07-05 16:45:30 +10:00
property bool canLoad: true
2019-07-25 07:05:27 +10:00
// property int zz: 0
2019-07-05 16:45:30 +10:00
onYPosChanged: {
2019-07-05 16:45:30 +10:00
if (chatPage.category != "Invites" && canLoad && yPos <= 0.1) {
2019-07-25 07:05:27 +10:00
// zz += 1
// print(canLoad, zz)
eventList.canLoad = false
2019-07-05 16:45:30 +10:00
py.callClientCoro(
chatPage.userId, "load_past_events", [chatPage.roomId],
moreToLoad => { eventList.canLoad = moreToLoad }
2019-07-05 16:45:30 +10:00
)
}
}
2019-03-22 14:28:14 +11:00
}
HNoticePage {
text: qsTr("Nothing to show here yet...")
visible: eventList.model.count < 1
anchors.fill: parent
}
2019-03-22 14:28:14 +11:00
}