This introduces a new NeoChatDateTime object that wraps a QDateTime. The intent is that it can be passed to QML and has a series of functions that format the QDateTime into the various string representations we need. This means we only have to send the single object to QML and then the correct string can be grabbed from there, simplifying the backend. It is also easy to add a new representation if needed as a function with a QString output and Q_PROPERTY can be added and then it will be available.
78 lines
2.5 KiB
QML
78 lines
2.5 KiB
QML
// SPDX-FileCopyrightText: 2020 Carl Schwan <carl@carlschwan.eu>
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
import QtQuick
|
|
import QtQuick.Controls as QQC2
|
|
import QtQuick.Layouts
|
|
|
|
import Qt.labs.qmlmodels
|
|
import org.kde.kirigami as Kirigami
|
|
|
|
import org.kde.neochat
|
|
|
|
TimelineDelegate {
|
|
id: root
|
|
|
|
/**
|
|
* @brief The timestamp of the event as a NeoChatDateTime.
|
|
*/
|
|
required property NeoChatDateTime dateTime
|
|
|
|
property bool isTemporaryHighlighted: false
|
|
onIsTemporaryHighlightedChanged: if (isTemporaryHighlighted) {
|
|
temporaryHighlightTimer.start();
|
|
}
|
|
|
|
width: parent?.width
|
|
rightPadding: NeoChatConfig.compactLayout && root.ListView.view.width >= Kirigami.Units.gridUnit * 20 ? Kirigami.Units.gridUnit * 2 + Kirigami.Units.largeSpacing : Kirigami.Units.largeSpacing
|
|
|
|
alwaysFillWidth: NeoChatConfig.compactLayout
|
|
|
|
contentItem: QQC2.ItemDelegate {
|
|
padding: Kirigami.Units.largeSpacing
|
|
topInset: Kirigami.Units.largeSpacing
|
|
topPadding: Kirigami.Units.largeSpacing * 2
|
|
bottomPadding: Kirigami.Units.largeSpacing * 2
|
|
leftPadding: Kirigami.Units.largeSpacing * 2
|
|
bottomInset: Kirigami.Units.largeSpacing
|
|
|
|
Timer {
|
|
id: temporaryHighlightTimer
|
|
|
|
interval: 1500
|
|
onTriggered: root.isTemporaryHighlighted = false
|
|
}
|
|
|
|
contentItem: QQC2.Label {
|
|
text: i18nc("Relative time since the room was last read", "Last read: %1", root.dateTime.relativeDateTime)
|
|
}
|
|
|
|
background: Kirigami.ShadowedRectangle {
|
|
id: readMarkerBackground
|
|
color: {
|
|
if (root.isTemporaryHighlighted) {
|
|
return Kirigami.Theme.positiveBackgroundColor;
|
|
} else {
|
|
return Kirigami.Theme.backgroundColor;
|
|
}
|
|
}
|
|
Kirigami.Theme.inherit: false
|
|
Kirigami.Theme.colorSet: Kirigami.Theme.View
|
|
opacity: root.isTemporaryHighlighted ? 1 : 0.6
|
|
radius: Kirigami.Units.cornerRadius
|
|
shadow.size: Kirigami.Units.smallSpacing
|
|
shadow.color: Qt.rgba(0.0, 0.0, 0.0, 0.10)
|
|
border.color: Kirigami.ColorUtils.tintWithAlpha(color, Kirigami.Theme.textColor, 0.15)
|
|
border.width: 1
|
|
|
|
Behavior on color {
|
|
ColorAnimation {
|
|
target: readMarkerBackground
|
|
duration: Kirigami.Units.veryLongDuration
|
|
easing.type: Easing.InOutCubic
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|