Warning, /plasma-bigscreen/youtube-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 PlasmaComponents 0008 import Mycroft 1.0 as Mycroft 0009 0010 0011 PlasmaComponents.ItemDelegate { 0012 id: delegate 0013 0014 // readonly property Flickable gridView: { 0015 // var candidate = parent; 0016 // while (candidate) { 0017 // if (candidate instanceof Flickable) { 0018 // return candidate; 0019 // } 0020 // candidate = candidate.parent; 0021 // } 0022 // return null; 0023 // } 0024 0025 readonly property GridView gridView: GridView.view 0026 implicitWidth: gridView.cellWidth 0027 implicitHeight: gridView.cellHeight 0028 0029 readonly property bool isCurrent: { 0030 gridView.currentIndex == index && activeFocus && !gridView.moving 0031 } 0032 0033 z: isCurrent ? 2 : 0 0034 0035 onClicked: { 0036 gridView.forceActiveFocus() 0037 gridView.currentIndex = index 0038 } 0039 0040 Keys.onReturnPressed: { 0041 clicked(); 0042 } 0043 0044 leftPadding: Kirigami.Units.largeSpacing * 2 0045 topPadding: Kirigami.Units.largeSpacing * 2 0046 rightPadding: Kirigami.Units.largeSpacing * 2 0047 bottomPadding: Kirigami.Units.largeSpacing * 2 0048 0049 leftInset: Kirigami.Units.largeSpacing 0050 topInset: Kirigami.Units.largeSpacing 0051 rightInset: Kirigami.Units.largeSpacing 0052 bottomInset: Kirigami.Units.largeSpacing 0053 0054 contentItem: Item { 0055 ColumnLayout { 0056 anchors.fill: parent 0057 spacing: Kirigami.Units.smallSpacing 0058 0059 Rectangle { 0060 id: imgRoot 0061 color: "transparent" 0062 clip: true 0063 Layout.alignment: Qt.AlignTop 0064 Layout.fillWidth: true 0065 Layout.topMargin: delegate.isCurrent ? -Kirigami.Units.largeSpacing * 2 : -Kirigami.Units.smallSpacing * 2 0066 Layout.leftMargin: -Kirigami.Units.smallSpacing * 2 0067 Layout.rightMargin: -Kirigami.Units.smallSpacing * 2 0068 Layout.bottomMargin: -Kirigami.Units.smallSpacing 0069 Layout.preferredHeight: parent.height - Kirigami.Units.gridUnit * 3 0070 radius: 3 0071 0072 layer.enabled: true 0073 layer.effect: OpacityMask { 0074 maskSource: Rectangle { 0075 x: imgRoot.x; y: imgRoot.y 0076 width: imgRoot.width 0077 height: imgRoot.height 0078 radius: imgRoot.radius 0079 } 0080 } 0081 0082 Image { 0083 id: img 0084 source: modelData.videoImage 0085 width: parent.width 0086 height: parent.height 0087 y: -12 0088 opacity: 1 0089 fillMode: Image.Tile 0090 0091 Rectangle { 0092 id: videoDurationTime 0093 anchors.bottom: parent.bottom 0094 anchors.bottomMargin: parent.width > Kirigami.Units.gridUnit * 15 ? Kirigami.Units.gridUnit * 0.4 : Kirigami.Units.largeSpacing 0095 anchors.right: parent.right 0096 anchors.rightMargin: Kirigami.Units.gridUnit * 0.75 0097 width: Kirigami.Units.gridUnit * 2.5 + Kirigami.Units.largeSpacing * 2 0098 height: durationText.height 0099 radius: Kirigami.Units.gridUnit * 0.5 0100 color: Qt.rgba(0, 0, 0, 0.8) 0101 0102 PlasmaComponents.Label { 0103 id: durationText 0104 anchors.centerIn: parent 0105 text: modelData.videoDuration 0106 color: Kirigami.Theme.textColor 0107 } 0108 } 0109 } 0110 } 0111 0112 Item { 0113 Layout.fillWidth: true 0114 Layout.fillHeight: true 0115 Layout.alignment: Qt.AlignLeft | Qt.AlignTop 0116 0117 ColumnLayout { 0118 anchors.fill: parent 0119 spacing: Kirigami.Units.smallSpacing 0120 0121 Kirigami.Heading { 0122 id: videoLabel 0123 Layout.fillWidth: true 0124 Layout.leftMargin: Kirigami.Units.largeSpacing 0125 Layout.alignment: Qt.AlignLeft | Qt.AlignTop 0126 wrapMode: Text.Wrap 0127 level: 3 0128 //verticalAlignment: Text.AlignVCenter 0129 maximumLineCount: 1 0130 elide: Text.ElideRight 0131 color: PlasmaCore.ColorScope.textColor 0132 Component.onCompleted: { 0133 text = modelData.videoTitle 0134 } 0135 } 0136 0137 PlasmaComponents.Label { 0138 id: videoChannelName 0139 Layout.fillWidth: true 0140 Layout.leftMargin: Kirigami.Units.largeSpacing 0141 wrapMode: Text.WordWrap 0142 Layout.alignment: Qt.AlignLeft | Qt.AlignTop 0143 maximumLineCount: 1 0144 elide: Text.ElideRight 0145 color: PlasmaCore.ColorScope.textColor 0146 text: modelData.videoChannel 0147 } 0148 0149 RowLayout { 0150 Layout.fillWidth: true 0151 Layout.leftMargin: Kirigami.Units.largeSpacing 0152 0153 PlasmaComponents.Label { 0154 id: videoUploadDate 0155 Layout.fillWidth: true 0156 Layout.alignment: Qt.AlignLeft | Qt.AlignTop 0157 wrapMode: Text.WordWrap 0158 maximumLineCount: 1 0159 elide: Text.ElideRight 0160 color: PlasmaCore.ColorScope.textColor 0161 text: modelData.videoUploadDate 0162 } 0163 0164 PlasmaComponents.Label { 0165 id: videoViews 0166 Layout.alignment: Qt.AlignRight 0167 Layout.rightMargin: Kirigami.Units.largeSpacing 0168 wrapMode: Text.WordWrap 0169 maximumLineCount: 1 0170 elide: Text.ElideRight 0171 color: PlasmaCore.ColorScope.textColor 0172 text: modelData.videoViews 0173 } 0174 } 0175 } 0176 } 0177 } 0178 } 0179 0180 background: Item { 0181 id: background 0182 0183 Rectangle { 0184 id: shadowSource 0185 anchors { 0186 fill: frame 0187 margins: units.largeSpacing 0188 } 0189 color: "black" 0190 radius: frame.radius 0191 visible: false 0192 } 0193 0194 FastBlur { 0195 anchors.fill: frame 0196 transparentBorder: true 0197 source: shadowSource 0198 radius: Kirigami.Units.largeSpacing * 2 0199 cached: true 0200 readonly property bool inView: delegate.x <= gridView.contentX + gridView.width && delegate.x + delegate.width >= gridView.contentX 0201 visible: inView 0202 } 0203 0204 Rectangle { 0205 id: frame 0206 anchors { 0207 fill: parent 0208 } 0209 0210 /* For some reason, putting the colors and animation in the states 0211 * and transition makes the color not load until the animations finish 0212 * during the startup of the homescreen containment. 0213 * Also for some reason, frame starts out white and fades into the correct color while 0214 * innerFrame starts out transparent (maybe?) and fades into the correct color. 0215 */ 0216 color: delegate.isCurrent ? delegate.Kirigami.Theme.highlightColor : delegate.Kirigami.Theme.backgroundColor 0217 Behavior on color { 0218 ColorAnimation { 0219 duration: Kirigami.Units.longDuration/2 0220 easing.type: Easing.InOutQuad 0221 } 0222 } 0223 0224 Rectangle { 0225 id: innerFrame 0226 anchors { 0227 fill: parent 0228 margins: units.smallSpacing 0229 } 0230 radius: frame.radius/2 0231 color: delegate.Kirigami.Theme.backgroundColor 0232 } 0233 0234 states: [ 0235 State { 0236 when: delegate.isCurrent 0237 PropertyChanges { 0238 target: delegate 0239 leftInset: Kirigami.Units.largeSpacing - innerFrame.anchors.margins 0240 rightInset: Kirigami.Units.largeSpacing - innerFrame.anchors.margins 0241 topInset: -Kirigami.Units.smallSpacing 0242 bottomInset: -Kirigami.Units.smallSpacing 0243 } 0244 PropertyChanges { 0245 target: frame 0246 radius: 6 0247 } 0248 }, 0249 State { 0250 when: !delegate.isCurrent 0251 PropertyChanges { 0252 target: delegate 0253 leftInset: Kirigami.Units.largeSpacing 0254 rightInset: Kirigami.Units.largeSpacing 0255 topInset: Kirigami.Units.largeSpacing 0256 bottomInset: Kirigami.Units.largeSpacing 0257 } 0258 PropertyChanges { 0259 target: frame 0260 radius: 3 0261 } 0262 } 0263 ] 0264 0265 transitions: Transition { 0266 ParallelAnimation { 0267 NumberAnimation { 0268 property: "leftInset" 0269 duration: Kirigami.Units.longDuration 0270 easing.type: Easing.InOutQuad 0271 } 0272 NumberAnimation { 0273 property: "rightInset" 0274 duration: Kirigami.Units.longDuration 0275 easing.type: Easing.InOutQuad 0276 } 0277 NumberAnimation { 0278 property: "topInset" 0279 duration: Kirigami.Units.longDuration 0280 easing.type: Easing.InOutQuad 0281 } 0282 NumberAnimation { 0283 property: "bottomInset" 0284 duration: Kirigami.Units.longDuration 0285 easing.type: Easing.InOutQuad 0286 } 0287 NumberAnimation { 0288 property: "radius" 0289 duration: Kirigami.Units.longDuration 0290 easing.type: Easing.InOutQuad 0291 } 0292 } 0293 } 0294 } 0295 } 0296 } 0297