Warning, /plasma/plank-player/app/qml/FileItemDelegate.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2021 Aditya Mehra <aix.m@outlook.com>
0002 //
0003 // SPDX-License-Identifier: GPL-2.0-or-later
0004 
0005 import QtQuick 2.15
0006 import QtQuick.Layouts 1.15
0007 import QtQuick.Controls 2.15
0008 import org.kde.kirigami 2.19 as Kirigami
0009 import Qt5Compat.GraphicalEffects
0010 
0011 ItemDelegate {
0012     id: delegate
0013     property int borderSize: Kirigami.Units.smallSpacing
0014     property int baseRadius: 3
0015 
0016     readonly property Flickable gridView: {
0017         var candidate = parent;
0018         while (candidate) {
0019             if (candidate instanceof Flickable) {
0020                 return candidate;
0021             }
0022             candidate = candidate.parent;
0023         }
0024         return null;
0025     }
0026 
0027     readonly property bool isCurrent: {
0028         gridView.currentIndex == index && activeFocus && !gridView.moving
0029     }
0030 
0031     leftPadding: Kirigami.Units.largeSpacing * 2
0032     topPadding: Kirigami.Units.largeSpacing * 2
0033     rightPadding: Kirigami.Units.largeSpacing * 2
0034     bottomPadding: Kirigami.Units.largeSpacing * 2
0035 
0036     leftInset: Kirigami.Units.largeSpacing
0037     topInset: Kirigami.Units.largeSpacing
0038     rightInset: Kirigami.Units.largeSpacing
0039     bottomInset: Kirigami.Units.largeSpacing
0040 
0041     implicitWidth: gridView.cellWidth
0042     height: gridView.cellHeight
0043 
0044     background: Item {
0045         id: background
0046 
0047         readonly property Item highlight: Rectangle {
0048             parent: delegate
0049             z: 1
0050             anchors {
0051                 fill: parent
0052             }
0053             color: "transparent"
0054             border {
0055                 width: delegate.borderSize
0056                 color: delegate.Kirigami.Theme.highlightColor
0057             }
0058             opacity: delegate.isCurrent || delegate.highlighted
0059             Behavior on opacity {
0060                 OpacityAnimator {
0061                     duration: Kirigami.Units.longDuration/2
0062                     easing.type: Easing.InOutQuad
0063                 }
0064             }
0065         }
0066 
0067         Rectangle {
0068             id: frame
0069             anchors {
0070                 fill: parent
0071             }
0072             radius: delegate.baseRadius
0073             color: delegate.Kirigami.Theme.backgroundColor
0074             layer.enabled: true
0075             layer.effect: DropShadow {
0076                 transparentBorder: false
0077                 horizontalOffset: 1.25
0078                 verticalOffset: 1
0079             }
0080 
0081             states: [
0082                 State {
0083                     when: delegate.isCurrent
0084                     PropertyChanges {
0085                         target: delegate
0086                         leftInset: 0
0087                         rightInset: 0
0088                         topInset: 0
0089                         bottomInset: 0
0090                     }
0091                     PropertyChanges {
0092                         target: background.highlight.anchors
0093                         margins: 0
0094                     }
0095                     PropertyChanges {
0096                         target: frame
0097                         // baseRadius + borderSize preserves the original radius for the visible part of frame
0098                         radius: delegate.baseRadius + delegate.borderSize
0099                     }
0100                     PropertyChanges {
0101                         target: background.highlight
0102                         // baseRadius + borderSize preserves the original radius for the visible part of frame
0103                         radius: delegate.baseRadius + delegate.borderSize
0104                     }
0105                 },
0106                 State {
0107                     when: !delegate.isCurrent
0108                     PropertyChanges {
0109                         target: delegate
0110                         leftInset: Kirigami.Units.largeSpacing
0111                         rightInset: Kirigami.Units.largeSpacing
0112                         topInset: Kirigami.Units.largeSpacing
0113                         bottomInset: Kirigami.Units.largeSpacing
0114                     }
0115                     PropertyChanges {
0116                         target: background.highlight.anchors
0117                         margins: Kirigami.Units.largeSpacing
0118                     }
0119                     PropertyChanges {
0120                         target: frame
0121                         radius: delegate.baseRadius
0122                     }
0123                     PropertyChanges {
0124                         target: background.highlight
0125                         radius: delegate.baseRadius
0126                     }
0127                 }
0128             ]
0129 
0130             transitions: Transition {
0131                 ParallelAnimation {
0132                     NumberAnimation {
0133                         property: "leftInset"
0134                         duration: Kirigami.Units.longDuration
0135                         easing.type: Easing.InOutQuad
0136                     }
0137                     NumberAnimation {
0138                         property: "rightInset"
0139                         duration: Kirigami.Units.longDuration
0140                         easing.type: Easing.InOutQuad
0141                     }
0142                     NumberAnimation {
0143                         property: "topInset"
0144                         duration: Kirigami.Units.longDuration
0145                         easing.type: Easing.InOutQuad
0146                     }
0147                     NumberAnimation {
0148                         property: "bottomInset"
0149                         duration: Kirigami.Units.longDuration
0150                         easing.type: Easing.InOutQuad
0151                     }
0152                     NumberAnimation {
0153                         property: "radius"
0154                         duration: Kirigami.Units.longDuration
0155                         easing.type: Easing.InOutQuad
0156                     }
0157                     NumberAnimation {
0158                         property: "margins"
0159                         duration: Kirigami.Units.longDuration
0160                         easing.type: Easing.InOutQuad
0161                     }
0162                 }
0163             }
0164         }
0165     }
0166 
0167     contentItem: ColumnLayout {
0168         spacing: Kirigami.Units.smallSpacing
0169 
0170         Item {
0171             id: imgRoot
0172             //clip: true
0173             Layout.alignment: Qt.AlignTop
0174             Layout.fillWidth: true
0175             Layout.topMargin: -delegate.topPadding + delegate.topInset + extraBorder
0176             Layout.leftMargin: -delegate.leftPadding + delegate.leftInset + extraBorder
0177             Layout.rightMargin: -delegate.rightPadding + delegate.rightInset + extraBorder
0178             // Any width times 0.5625 is a 16:9 ratio
0179             // Adding baseRadius is needed to prevent the bottom from being rounded
0180             Layout.preferredHeight: width * 0.5625 + delegate.baseRadius
0181             // FIXME: another thing copied from AbstractDelegate
0182             property real extraBorder: 0
0183 
0184             layer.enabled: true
0185             layer.effect: OpacityMask {
0186                 cached: true
0187                 maskSource: Rectangle {
0188                     x: imgRoot.x;
0189                     y: imgRoot.y
0190                     width: imgRoot.width
0191                     height: imgRoot.height
0192                     radius: delegate.baseRadius
0193                 }
0194             }
0195 
0196             Kirigami.Icon {
0197                 id: img
0198                 source: "kdenlive-show-videothumb"
0199                 anchors {
0200                     fill: parent
0201                     // To not round under
0202                     bottomMargin: delegate.baseRadius
0203                 }
0204                 opacity: 1
0205             }
0206 
0207             states: [
0208                 State {
0209                     when: delegate.isCurrent
0210                     PropertyChanges {
0211                         target: imgRoot
0212                         extraBorder: delegate.borderSize
0213                     }
0214                 },
0215                 State {
0216                     when: !delegate.isCurrent
0217                     PropertyChanges {
0218                         target: imgRoot
0219                         extraBorder: 0
0220                     }
0221                 }
0222             ]
0223             transitions: Transition {
0224                 onRunningChanged: {
0225                     // Optimize when animating the thumbnail
0226                     img.smooth = !running
0227                 }
0228                 NumberAnimation {
0229                     property: "extraBorder"
0230                     duration: Kirigami.Units.longDuration
0231                     easing.type: Easing.InOutQuad
0232                 }
0233             }
0234         }
0235 
0236         ColumnLayout {
0237             Layout.fillWidth: true
0238             Layout.fillHeight: true
0239             // Compensate for blank space created from not rounding thumbnail bottom corners
0240             Layout.topMargin: -delegate.baseRadius
0241             Layout.alignment: Qt.AlignLeft | Qt.AlignTop
0242             spacing: Kirigami.Units.smallSpacing
0243 
0244             Kirigami.Heading {
0245                 id: videoLabel
0246                 Layout.fillWidth: true
0247                 Layout.alignment: Qt.AlignLeft | Qt.AlignTop
0248                 wrapMode: Text.Wrap
0249                 level: 3
0250                 maximumLineCount: 1
0251                 elide: Text.ElideRight
0252                 color: Kirigami.Theme.textColor
0253                 Component.onCompleted: {
0254                     text = fileName + (fileIsDir ? "/" : "")
0255                 }
0256             }
0257         }
0258     }
0259 
0260     Keys.onReturnPressed: (event)=> {
0261         clicked()
0262     }
0263 }