Files
neochat/src/timeline/ReadMarkerDelegate.qml
2026-02-18 12:08:05 -05:00

110 lines
3.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 NeoChatRoom the delegate is being displayed in.
*/
required property NeoChatRoom room
/**
* @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
leftPadding: NeoChatConfig.compactLayout && root.ListView.view.width >= Kirigami.Units.gridUnit * 20 ? Kirigami.Units.largeSpacing * 2 : Kirigami.Units.largeSpacing
rightPadding: NeoChatConfig.compactLayout && root.ListView.view.width >= Kirigami.Units.gridUnit * 20 ? Kirigami.Units.largeSpacing * 2 : Kirigami.Units.largeSpacing
alwaysFillWidth: NeoChatConfig.compactLayout
contentItem: QQC2.ItemDelegate {
padding: Kirigami.Units.largeSpacing * 2
topPadding: padding
bottomPadding: Kirigami.Units.largeSpacing
leftPadding: padding
rightPadding: padding
topInset: Kirigami.Units.largeSpacing + Kirigami.Units.mediumSpacing
bottomInset: Kirigami.Units.mediumSpacing
rightInset: 0
leftInset: 0
Timer {
id: temporaryHighlightTimer
interval: 1500
onTriggered: root.isTemporaryHighlighted = false
}
contentItem: RowLayout {
spacing: Kirigami.Units.largeSpacing
Kirigami.Icon {
source: "view-readermode"
Layout.preferredWidth: Kirigami.Units.iconSizes.sizeForLabels
Layout.preferredHeight: Kirigami.Units.iconSizes.sizeForLabels
}
QQC2.Label {
text: i18nc("Relative time since the room was last read", "Last read: %1", root.dateTime.relativeDateTime)
Layout.fillWidth: true
}
QQC2.ToolButton {
text: i18nc("@action:button Mark all messages up to now as read", "Mark as Read")
icon.name: "checkmark"
onClicked: root.room.markAllMessagesAsRead()
Layout.alignment: Qt.AlignRight
}
}
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
}
}
}
}
}