Warning, /plasma-bigscreen/peertube-voice-application/ui/delegates/VideoCard.qml is written in an unsupported language. File is not indexed.

0001 import QtQuick 2.9
0002 import QtQuick.Layouts 1.4
0003 import QtGraphicalEffects 1.0
0004 import QtQuick.Controls 2.3
0005 import org.kde.kirigami 2.8 as Kirigami
0006 import org.kde.plasma.core 2.0 as PlasmaCore
0007 import org.kde.plasma.components 3.0 as PlasmaComponents3
0008 import org.kde.plasma.components 2.0 as PlasmaComponents
0009 import Mycroft 1.0 as Mycroft
0010 
0011 PlasmaComponents3.ItemDelegate {
0012     id: delegate
0013         
0014     property int borderSize: Kirigami.Units.smallSpacing
0015     property int baseRadius: 3
0016     
0017     readonly property Flickable listView: {
0018         var candidate = parent;
0019         while (candidate) {
0020             if (candidate instanceof Flickable) {
0021                 return candidate;
0022             }
0023             candidate = candidate.parent;
0024         }
0025         return null;
0026     }
0027 
0028     
0029     readonly property bool isCurrent: {//print(text+index+" "+listView.currentIndex+activeFocus+" "+listView.moving)
0030         listView.currentIndex == index && activeFocus && !listView.moving
0031     }
0032 
0033     
0034     leftPadding: Kirigami.Units.largeSpacing * 2
0035     topPadding: Kirigami.Units.largeSpacing * 2
0036     rightPadding: Kirigami.Units.largeSpacing * 2
0037     bottomPadding: Kirigami.Units.largeSpacing * 2
0038 
0039     leftInset: Kirigami.Units.largeSpacing
0040     topInset: Kirigami.Units.largeSpacing
0041     rightInset: Kirigami.Units.largeSpacing
0042     bottomInset: Kirigami.Units.largeSpacing
0043 
0044     implicitWidth: parent.cellWidth
0045     height: parent.height
0046 
0047         background: Item {
0048         id: background
0049 
0050         readonly property Item highlight: Rectangle {
0051             parent: delegate
0052             z: 1
0053             anchors {
0054                 fill: parent
0055             }
0056             color: "transparent"
0057             border {
0058                 width: delegate.borderSize
0059                 color: delegate.Kirigami.Theme.highlightColor
0060             }
0061             opacity: delegate.isCurrent || delegate.highlighted
0062             Behavior on opacity {
0063                 OpacityAnimator {
0064                     duration: Kirigami.Units.longDuration/2
0065                     easing.type: Easing.InOutQuad
0066                 }
0067             }
0068         }
0069 
0070         Rectangle {
0071             id: frame
0072             anchors {
0073                 fill: parent
0074             }
0075             radius: delegate.baseRadius
0076             color: delegate.Kirigami.Theme.backgroundColor
0077             layer.enabled: true
0078             layer.effect: DropShadow {
0079                 transparentBorder: false
0080                 horizontalOffset: 1.25
0081                 verticalOffset: 1
0082             }
0083 
0084             states: [
0085                 State {
0086                     when: delegate.isCurrent
0087                     PropertyChanges {
0088                         target: delegate
0089                         leftInset: 0
0090                         rightInset: 0
0091                         topInset: 0
0092                         bottomInset: 0
0093                     }
0094                     PropertyChanges {
0095                         target: background.highlight.anchors
0096                         margins: 0
0097                     }
0098                     PropertyChanges {
0099                         target: frame
0100                         // baseRadius + borderSize preserves the original radius for the visible part of frame
0101                         radius: delegate.baseRadius + delegate.borderSize
0102                     }
0103                     PropertyChanges {
0104                         target: background.highlight
0105                         // baseRadius + borderSize preserves the original radius for the visible part of frame
0106                         radius: delegate.baseRadius + delegate.borderSize
0107                     }
0108                 },
0109                 State {
0110                     when: !delegate.isCurrent
0111                     PropertyChanges {
0112                         target: delegate
0113                         leftInset: Kirigami.Units.largeSpacing
0114                         rightInset: Kirigami.Units.largeSpacing
0115                         topInset: Kirigami.Units.largeSpacing
0116                         bottomInset: Kirigami.Units.largeSpacing
0117                     }
0118                     PropertyChanges {
0119                         target: background.highlight.anchors
0120                         margins: Kirigami.Units.largeSpacing
0121                     }
0122                     PropertyChanges {
0123                         target: frame
0124                         radius: delegate.baseRadius
0125                     }
0126                     PropertyChanges {
0127                         target: background.highlight
0128                         radius: delegate.baseRadius
0129                     }
0130                 }
0131             ]
0132 
0133             transitions: Transition {
0134                 ParallelAnimation {
0135                     NumberAnimation {
0136                         property: "leftInset"
0137                         duration: Kirigami.Units.longDuration
0138                         easing.type: Easing.InOutQuad
0139                     }
0140                     NumberAnimation {
0141                         property: "rightInset"
0142                         duration: Kirigami.Units.longDuration
0143                         easing.type: Easing.InOutQuad
0144                     }
0145                     NumberAnimation {
0146                         property: "topInset"
0147                         duration: Kirigami.Units.longDuration
0148                         easing.type: Easing.InOutQuad
0149                     }
0150                     NumberAnimation {
0151                         property: "bottomInset"
0152                         duration: Kirigami.Units.longDuration
0153                         easing.type: Easing.InOutQuad
0154                     }
0155                     NumberAnimation {
0156                         property: "radius"
0157                         duration: Kirigami.Units.longDuration
0158                         easing.type: Easing.InOutQuad
0159                     }
0160                     NumberAnimation {
0161                         property: "margins"
0162                         duration: Kirigami.Units.longDuration
0163                         easing.type: Easing.InOutQuad
0164                     }
0165                 }
0166             }
0167         }
0168     }
0169 
0170     contentItem: ColumnLayout {
0171         spacing: Kirigami.Units.smallSpacing
0172 
0173         Item {
0174             id: imgRoot
0175             //clip: true
0176             Layout.alignment: Qt.AlignTop
0177             Layout.fillWidth: true
0178             Layout.topMargin: -delegate.topPadding + delegate.topInset + extraBorder
0179             Layout.leftMargin: -delegate.leftPadding + delegate.leftInset + extraBorder
0180             Layout.rightMargin: -delegate.rightPadding + delegate.rightInset + extraBorder
0181             // Any width times 0.5625 is a 16:9 ratio
0182             // Adding baseRadius is needed to prevent the bottom from being rounded
0183             Layout.preferredHeight: width * 0.5625 + delegate.baseRadius
0184             // FIXME: another thing copied from AbstractDelegate
0185             property real extraBorder: 0
0186 
0187             layer.enabled: true
0188             layer.effect: OpacityMask {
0189                 cached: true
0190                 maskSource: Rectangle {
0191                     x: imgRoot.x;
0192                     y: imgRoot.y
0193                     width: imgRoot.width
0194                     height: imgRoot.height
0195                     radius: delegate.baseRadius
0196                 }
0197             }
0198 
0199             Image {
0200                 id: img
0201                 source: "https://" + modelData.channel.host + modelData.thumbnail_path
0202                 anchors {
0203                     fill: parent
0204                     // To not round under
0205                     bottomMargin: delegate.baseRadius
0206                 }
0207                 opacity: 1
0208                 fillMode: Image.PreserveAspectCrop
0209 
0210                 Rectangle {
0211                     id: videoDurationTime
0212                     anchors.bottom: parent.bottom
0213                     anchors.bottomMargin: Kirigami.Units.largeSpacing
0214                     anchors.right: parent.right
0215                     anchors.rightMargin: Kirigami.Units.largeSpacing
0216                     // FIXME: kind of hacky to get the padding around the text right
0217                     width: durationText.width + Kirigami.Units.largeSpacing
0218                     height: Kirigami.Units.gridUnit
0219                     radius: delegate.baseRadius
0220                     visible: modelData.duration ? 1 : 0
0221                     color: Qt.rgba(0, 0, 0, 0.8)
0222 
0223                     PlasmaComponents.Label {
0224                         id: durationText
0225                         anchors.centerIn: parent
0226                         text: timeSanitize(modelData.duration)
0227                         color: Kirigami.Theme.textColor
0228                     }
0229                 }
0230             }
0231             
0232             states: [
0233                 State {
0234                     when: delegate.isCurrent
0235                     PropertyChanges {
0236                         target: imgRoot
0237                         extraBorder: delegate.borderSize
0238                     }
0239                 },
0240                 State {
0241                     when: !delegate.isCurrent
0242                     PropertyChanges {
0243                         target: imgRoot
0244                         extraBorder: 0
0245                     }
0246                 }
0247             ]
0248             transitions: Transition {
0249                 onRunningChanged: {
0250                     // Optimize when animating the thumbnail
0251                     img.smooth = !running
0252                 }
0253                 NumberAnimation {
0254                     property: "extraBorder"
0255                     duration: Kirigami.Units.longDuration
0256                     easing.type: Easing.InOutQuad
0257                 }
0258             }
0259         }
0260 
0261         ColumnLayout {
0262             Layout.fillWidth: true
0263             Layout.fillHeight: true
0264             // Compensate for blank space created from not rounding thumbnail bottom corners
0265             Layout.topMargin: -delegate.baseRadius
0266             Layout.alignment: Qt.AlignLeft | Qt.AlignTop
0267             spacing: Kirigami.Units.smallSpacing
0268 
0269             Kirigami.Heading {
0270                 id: videoLabel
0271                 Layout.fillWidth: true
0272                 Layout.alignment: Qt.AlignLeft | Qt.AlignTop
0273                 wrapMode: Text.Wrap
0274                 level: 3
0275                 maximumLineCount: 1
0276                 elide: Text.ElideRight
0277                 color: PlasmaCore.ColorScope.textColor
0278                 Component.onCompleted: {
0279                     text = modelData.name
0280                 }
0281             }
0282 
0283             PlasmaComponents.Label {
0284                 id: videoChannelName
0285                 Layout.fillWidth: true
0286                 wrapMode: Text.WordWrap
0287                 Layout.alignment: Qt.AlignLeft | Qt.AlignTop
0288                 maximumLineCount: 1
0289                 elide: Text.ElideRight
0290                 color: PlasmaCore.ColorScope.textColor
0291                 text: modelData.channel.display_name
0292             }
0293 
0294             RowLayout {
0295                 Layout.fillWidth: true
0296 
0297                 PlasmaComponents.Label {
0298                     id: videoViews
0299                     Layout.alignment: Qt.AlignLeft
0300                     Layout.rightMargin: Kirigami.Units.largeSpacing
0301                     elide: Text.ElideRight
0302                     color: PlasmaCore.ColorScope.textColor
0303                     text: modelData.views
0304                 }
0305 
0306                 PlasmaComponents.Label {
0307                     id: videoUploadDate
0308                     Layout.fillWidth: true
0309                     Layout.alignment: Qt.AlignRight | Qt.AlignTop
0310                     horizontalAlignment: Text.AlignRight
0311                     elide: Text.ElideRight
0312                     color: PlasmaCore.ColorScope.textColor
0313                     text: setPublishedDate(modelData.published_at)
0314                 }
0315             }
0316         }
0317     }
0318     
0319     Keys.onReturnPressed: {
0320         clicked()
0321     }
0322 
0323     onClicked: {
0324         busyIndicatorPop.open()
0325         triggerGuiEvent("PeerTube.WatchVideo", modelData)
0326     }
0327 }