moment/src/qml/Chat/Timeline/EventDelegate.qml

88 lines
2.5 KiB
QML
Raw Normal View History

2019-03-21 23:28:14 -04:00
import QtQuick 2.7
import QtQuick.Layouts 1.3
import "../../Base"
import "../../utils.js" as Utils
2019-03-21 23:28:14 -04:00
Column {
id: roomEventDelegate
2019-03-21 23:28:14 -04:00
function minsBetween(date1, date2) {
2019-03-21 23:28:14 -04:00
return Math.round((((date2 - date1) % 86400000) % 3600000) / 60000)
}
function getPreviousItem(nth) {
// Remember, index 0 = newest bottomest message
nth = nth || 1
2019-07-03 21:20:49 -04:00
return roomEventListView.model.count - 1 > model.index + nth ?
roomEventListView.model.get(model.index + nth) : null
}
property var previousItem: getPreviousItem()
signal reloadPreviousItem()
onReloadPreviousItem: previousItem = getPreviousItem()
property var senderInfo: null
Component.onCompleted: senderInfo = models.users.getUser(model.senderId)
2019-04-14 12:56:30 -04:00
readonly property bool isOwn: chatPage.userId === model.senderId
2019-03-21 23:28:14 -04:00
readonly property bool isFirstEvent: model.eventType == "RoomCreateEvent"
2019-03-21 23:28:14 -04:00
2019-07-03 21:20:49 -04:00
// Item roles may not be loaded yet, reason for all these checks
readonly property bool combine: Boolean(
model.date &&
previousItem && previousItem.eventType && previousItem.date &&
Utils.eventIsMessage(previousItem) == Utils.eventIsMessage(model) &&
! talkBreak &&
! dayBreak &&
previousItem.senderId === model.senderId &&
minsBetween(previousItem.date, model.date) <= 5
2019-07-03 21:20:49 -04:00
)
2019-03-21 23:28:14 -04:00
2019-07-03 21:20:49 -04:00
readonly property bool dayBreak: Boolean(
isFirstEvent ||
2019-07-03 21:20:49 -04:00
model.date && previousItem && previousItem.date &&
model.date.getDate() != previousItem.date.getDate()
2019-07-03 21:20:49 -04:00
)
2019-03-21 23:28:14 -04:00
2019-07-03 21:20:49 -04:00
readonly property bool talkBreak: Boolean(
model.date && previousItem && previousItem.date &&
2019-03-21 23:28:14 -04:00
! dayBreak &&
minsBetween(previousItem.date, model.date) >= 20
2019-07-03 21:20:49 -04:00
)
2019-03-21 23:28:14 -04:00
property int standardSpacing: 16
2019-05-15 17:01:58 -04:00
property int horizontalPadding: 6
property int verticalPadding: 4
2019-03-21 23:28:14 -04:00
ListView.onAdd: {
var nextDelegate = roomEventListView.contentItem.children[index]
if (nextDelegate) { nextDelegate.reloadPreviousItem() }
}
2019-03-21 23:28:14 -04:00
width: parent.width
2019-03-21 23:28:14 -04:00
topPadding:
isFirstEvent ? 0 :
2019-04-28 11:01:38 -04:00
dayBreak ? standardSpacing * 2 :
talkBreak ? standardSpacing * 3 :
combine ? standardSpacing / 4 :
standardSpacing
2019-04-28 14:48:59 -04:00
Loader {
source: dayBreak ? "Daybreak.qml" : ""
width: roomEventDelegate.width
}
2019-03-21 23:28:14 -04:00
Item { // TODO: put this in Daybreak.qml?
2019-04-28 11:01:38 -04:00
visible: dayBreak
width: parent.width
height: topPadding
}
2019-07-02 22:29:09 -04:00
EventContent {
2019-04-28 14:48:59 -04:00
anchors.right: isOwn ? parent.right : undefined
}
2019-03-21 23:28:14 -04:00
}