2019-03-22 14:28:14 +11:00
|
|
|
import QtQuick 2.7
|
|
|
|
import QtQuick.Controls 2.0
|
|
|
|
import QtQuick.Layouts 1.4
|
2019-03-26 20:52:43 +11:00
|
|
|
import "../base" as Base
|
2019-04-20 17:29:24 +10:00
|
|
|
import "utils.js" as ChatJS
|
2019-03-22 14:28:14 +11:00
|
|
|
|
|
|
|
Column {
|
2019-04-21 07:45:51 +10:00
|
|
|
id: messageDelegate
|
2019-03-22 14:28:14 +11:00
|
|
|
|
2019-04-21 07:36:21 +10:00
|
|
|
function minsBetween(date1, date2) {
|
2019-03-22 14:28:14 +11:00
|
|
|
return Math.round((((date2 - date1) % 86400000) % 3600000) / 60000)
|
|
|
|
}
|
|
|
|
|
2019-04-21 07:36:21 +10:00
|
|
|
function getIsMessage(type_) { return type_.startsWith("RoomMessage") }
|
2019-04-18 06:43:18 +10:00
|
|
|
|
2019-04-21 07:36:21 +10:00
|
|
|
function getPreviousItem() {
|
2019-04-20 17:29:24 +10:00
|
|
|
return index < messageListView.model.count - 1 ?
|
|
|
|
messageListView.model.get(index + 1) : null
|
|
|
|
}
|
|
|
|
|
2019-04-21 07:36:21 +10:00
|
|
|
property var previousItem: getPreviousItem()
|
2019-04-20 17:29:24 +10:00
|
|
|
signal reloadPreviousItem()
|
2019-04-21 07:36:21 +10:00
|
|
|
onReloadPreviousItem: previousItem = getPreviousItem()
|
2019-04-18 06:43:18 +10:00
|
|
|
|
2019-04-21 07:36:21 +10:00
|
|
|
readonly property bool isMessage: getIsMessage(type)
|
2019-04-15 02:56:30 +10:00
|
|
|
|
|
|
|
readonly property bool isUndecryptableEvent:
|
|
|
|
type === "OlmEvent" || type === "MegolmEvent"
|
|
|
|
|
2019-04-19 16:07:01 +10:00
|
|
|
readonly property var displayName:
|
|
|
|
Backend.getUserDisplayName(dict.sender)
|
2019-03-22 14:28:14 +11:00
|
|
|
|
|
|
|
readonly property bool isOwn:
|
2019-04-21 07:36:21 +10:00
|
|
|
chatPage.userId === dict.sender
|
2019-03-22 14:28:14 +11:00
|
|
|
|
2019-04-20 17:29:24 +10:00
|
|
|
readonly property bool isFirstEvent: type == "RoomCreateEvent"
|
2019-03-22 14:28:14 +11:00
|
|
|
|
|
|
|
readonly property bool combine:
|
2019-04-20 17:29:24 +10:00
|
|
|
previousItem &&
|
2019-04-18 06:43:18 +10:00
|
|
|
! talkBreak &&
|
|
|
|
! dayBreak &&
|
2019-04-21 07:36:21 +10:00
|
|
|
getIsMessage(previousItem.type) === isMessage &&
|
2019-04-18 06:43:18 +10:00
|
|
|
previousItem.dict.sender === dict.sender &&
|
2019-04-21 07:36:21 +10:00
|
|
|
minsBetween(previousItem.dateTime, dateTime) <= 5
|
2019-03-22 14:28:14 +11:00
|
|
|
|
|
|
|
readonly property bool dayBreak:
|
2019-04-20 17:29:24 +10:00
|
|
|
isFirstEvent ||
|
|
|
|
previousItem &&
|
2019-04-22 10:55:24 +10:00
|
|
|
dateTime.getDate() != previousItem.dateTime.getDate()
|
2019-03-22 14:28:14 +11:00
|
|
|
|
|
|
|
readonly property bool talkBreak:
|
2019-04-20 17:29:24 +10:00
|
|
|
previousItem &&
|
2019-03-22 14:28:14 +11:00
|
|
|
! dayBreak &&
|
2019-04-21 07:36:21 +10:00
|
|
|
minsBetween(previousItem.dateTime, dateTime) >= 20
|
2019-03-22 14:28:14 +11:00
|
|
|
|
|
|
|
|
2019-04-18 06:43:18 +10:00
|
|
|
property int standardSpacing: 16
|
2019-03-22 14:28:14 +11:00
|
|
|
property int horizontalPadding: 7
|
|
|
|
property int verticalPadding: 5
|
|
|
|
|
2019-04-20 17:29:24 +10:00
|
|
|
ListView.onAdd: {
|
2019-04-21 07:36:21 +10:00
|
|
|
var nextDelegate = messageListView.contentItem.children[index]
|
|
|
|
if (nextDelegate) { nextDelegate.reloadPreviousItem() }
|
2019-04-20 17:29:24 +10:00
|
|
|
}
|
|
|
|
|
2019-03-22 14:28:14 +11:00
|
|
|
width: parent.width
|
2019-04-20 17:29:24 +10:00
|
|
|
|
2019-03-22 14:28:14 +11:00
|
|
|
topPadding:
|
2019-04-20 17:29:24 +10:00
|
|
|
isFirstEvent ? 0 :
|
2019-04-18 06:43:18 +10:00
|
|
|
talkBreak ? standardSpacing * 3 :
|
|
|
|
combine ? standardSpacing / 4 :
|
|
|
|
standardSpacing
|
|
|
|
|
2019-03-26 20:52:43 +11:00
|
|
|
Daybreak { visible: dayBreak }
|
2019-03-22 14:28:14 +11:00
|
|
|
|
2019-04-15 04:09:54 +10:00
|
|
|
MessageContent { visible: isMessage }
|
2019-03-22 14:28:14 +11:00
|
|
|
|
2019-04-15 04:09:54 +10:00
|
|
|
EventContent { visible: ! isMessage }
|
2019-03-22 14:28:14 +11:00
|
|
|
}
|