Warning, /multimedia/plasmatube/src/ui/components/VideoGridItem.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-FileCopyrightText: 2019 Linus Jahn <lnj@kaidan.im>
0002 // SPDX-FileCopyrightText: 2022 Devin Lin <devin@kde.org>
0003 // SPDX-License-Identifier: GPL-3.0-or-later
0004
0005 import QtQuick
0006 import QtQuick.Layouts
0007 import QtQuick.Controls as QQC2
0008 import Qt5Compat.GraphicalEffects
0009
0010 import org.kde.kirigami as Kirigami
0011
0012 import "utils.js" as Utils
0013
0014 BaseGridItem {
0015 id: root
0016
0017 property string vid
0018 property url thumbnail
0019 property bool liveNow
0020 property date length
0021 property string title
0022 property string author
0023 property string authorId
0024 property string description
0025 property int viewCount
0026 property string publishedText
0027 property bool watched
0028
0029 contentItem: ColumnLayout {
0030 id: column
0031 anchors.fill: parent
0032 anchors.topMargin: root.topPadding
0033 anchors.bottomMargin: root.bottomPadding
0034 anchors.leftMargin: root.leftPadding
0035 anchors.rightMargin: root.rightPadding
0036
0037 spacing: Kirigami.Units.largeSpacing
0038
0039 TapHandler {
0040 acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad
0041 acceptedButtons: Qt.RightButton
0042 onTapped: root.contextMenuRequested()
0043 }
0044
0045 Image {
0046 id: thumb
0047 Layout.alignment: Qt.AlignTop
0048 Layout.preferredWidth: column.width
0049 Layout.maximumWidth: column.width
0050 Layout.preferredHeight: column.width / 16 * 9
0051 Layout.maximumHeight: column.width / 16 * 9
0052 layer.enabled: true
0053 layer.effect: OpacityMask {
0054 maskSource: mask
0055 }
0056 source: thumbnail
0057 fillMode: Image.PreserveAspectCrop
0058 Rectangle {
0059 id: mask
0060 radius: 7
0061 anchors.fill: thumb
0062 visible: false
0063 }
0064
0065 PlaceholderItem {
0066 anchors.fill: parent
0067 visible: thumb.status !== Image.Ready
0068 }
0069
0070 Text {
0071 visible: !liveNow && text !== "00:00"
0072 text: Utils.formatTime(length)
0073 color: "white"
0074 font.pointSize: Kirigami.Theme.smallFont.pointSize
0075
0076 z: 2
0077
0078 anchors.right: parent.right
0079 anchors.bottom: parent.bottom
0080 anchors.rightMargin: Kirigami.Units.smallSpacing * 2
0081 anchors.bottomMargin: Kirigami.Units.smallSpacing * 2
0082
0083 Rectangle {
0084 anchors.fill: parent
0085 anchors.topMargin: -Kirigami.Units.smallSpacing
0086 anchors.bottomMargin: -Kirigami.Units.smallSpacing
0087 anchors.leftMargin: -Kirigami.Units.smallSpacing
0088 anchors.rightMargin: -Kirigami.Units.smallSpacing
0089 z: -1
0090 color: "#90000000"
0091 radius: 2
0092 width: 60
0093 height: 15
0094 }
0095 }
0096
0097 Rectangle {
0098 id: watchIndicator
0099
0100 color: "black"
0101 opacity: 0.5
0102 visible: root.watched
0103 anchors.fill: parent
0104
0105 Rectangle {
0106 anchors {
0107 bottom: parent.bottom
0108 left: parent.left
0109 right: parent.right
0110 }
0111
0112 color: "red"
0113 height: 3
0114 }
0115 }
0116 }
0117
0118 ColumnLayout {
0119 id: videoInfo
0120 Layout.fillWidth: true
0121 Layout.alignment: Qt.AlignTop
0122 spacing: Kirigami.Units.smallSpacing
0123
0124 Kirigami.Heading {
0125 Layout.alignment: Qt.AlignTop
0126 Layout.fillWidth: true
0127
0128 text: title
0129 level: 4
0130 maximumLineCount: 2
0131 wrapMode: Text.Wrap
0132 elide: Text.ElideRight
0133 }
0134
0135 QQC2.Label {
0136 font.pointSize: Kirigami.Theme.smallFont.pointSize
0137 text: author
0138 color: Kirigami.Theme.disabledTextColor
0139 maximumLineCount: 2
0140 elide: Text.ElideRight
0141 }
0142
0143 QQC2.Label {
0144 font.pointSize: Kirigami.Theme.smallFont.pointSize
0145 text: i18n("%1 views \u2022 %2", Utils.formatCount(viewCount), liveNow ? "<i>live now</i>" : publishedText)
0146 color: Kirigami.Theme.disabledTextColor
0147 maximumLineCount: 1
0148 elide: Text.ElideRight
0149 }
0150 }
0151
0152 Item { Layout.fillHeight: true }
0153 }
0154 }
0155