Warning, /frameworks/knewstuff/src/qtquick/qml/private/EntryScreenshots.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2012 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
0003     SPDX-FileCopyrightText: 2019 Dan Leinir Turthra Jensen <admin@leinir.dk>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 import QtQuick
0009 import QtQuick.Controls
0010 import QtQuick.Layouts
0011 import Qt5Compat.GraphicalEffects
0012 
0013 import org.kde.kirigami as Kirigami
0014 
0015 Flickable {
0016     id: root
0017     property alias screenshotsModel: screenshotsRep.model
0018     readonly property alias count: screenshotsRep.count
0019     property int currentIndex: -1
0020     property Item currentItem: screenshotsRep.itemAt(currentIndex)
0021     Layout.preferredHeight: Kirigami.Units.gridUnit * 13
0022     contentHeight: height
0023     contentWidth: screenshotsLayout.width
0024 
0025     Popup {
0026         id: overlay
0027         parent: applicationWindow().Overlay.overlay
0028         modal: true
0029         clip: false
0030 
0031         x: (parent.width - width)/2
0032         y: (parent.height - height)/2
0033         readonly property real proportion: overlayImage.sourceSize.width>1 ? overlayImage.sourceSize.height/overlayImage.sourceSize.width : 1
0034         height: overlayImage.status == Image.Loading ? Kirigami.Units.gridUnit * 5 : Math.min(parent.height * 0.9, (parent.width * 0.9) * proportion, overlayImage.sourceSize.height)
0035         width: height/proportion
0036 
0037         BusyIndicator {
0038             id: indicator
0039             visible: running
0040             running: overlayImage.status == Image.Loading
0041             anchors.fill: parent
0042         }
0043 
0044         // Only animate the images in the detail view; in the overview it would be irritating and not useful anyway due to the small previews
0045         AnimatedImage {
0046             id: overlayImage
0047             anchors.fill: parent
0048             source: root.currentItem ? root.currentItem.imageSource : ""
0049             fillMode: Image.PreserveAspectFit
0050             smooth: true
0051         }
0052 
0053         Button {
0054             anchors {
0055                 right: parent.left
0056                 verticalCenter: parent.verticalCenter
0057             }
0058             action: leftAction
0059             visible: leftAction.visible
0060         }
0061 
0062         Button {
0063             anchors {
0064                 left: parent.right
0065                 verticalCenter: parent.verticalCenter
0066             }
0067             action: rightAction
0068             visible: rightAction.visible
0069         }
0070 
0071         Kirigami.Action {
0072             id: leftAction
0073             icon.name: "arrow-left"
0074             enabled: overlay.visible && visible
0075             visible: root.currentIndex >= 1 && !indicator.running
0076             onTriggered: root.currentIndex = (root.currentIndex - 1) % root.count
0077         }
0078 
0079         Kirigami.Action {
0080             id: rightAction
0081             icon.name: "arrow-right"
0082             enabled: overlay.visible && visible
0083             visible: root.currentIndex < (root.count - 1) && !indicator.running
0084             onTriggered: root.currentIndex = (root.currentIndex + 1) % root.count
0085         }
0086     }
0087 
0088     Row {
0089         id: screenshotsLayout
0090         height: root.contentHeight
0091         spacing: Kirigami.Units.largeSpacing
0092         leftPadding: spacing
0093         rightPadding: spacing
0094         focus: overlay.visible
0095 
0096         Keys.onLeftPressed:  if (leftAction.visible)  leftAction.trigger()
0097         Keys.onRightPressed: if (rightAction.visible) rightAction.trigger()
0098 
0099         Repeater {
0100             id: screenshotsRep
0101 
0102             delegate: MouseArea {
0103                 readonly property url imageSource: modelData
0104                 readonly property real proportion: thumbnail.sourceSize.width>1 ? thumbnail.sourceSize.height/thumbnail.sourceSize.width : 1
0105                 anchors.verticalCenter: parent.verticalCenter
0106                 width: Math.max(50, height/proportion)
0107                 height: screenshotsLayout.height - 2 * Kirigami.Units.largeSpacing
0108 
0109                 hoverEnabled: true
0110                 cursorShape: Qt.PointingHandCursor
0111 
0112                 onClicked: {
0113                     root.currentIndex = index
0114                     overlay.open()
0115                 }
0116 
0117                 Kirigami.ShadowedRectangle {
0118                     visible: thumbnail.status == Image.Ready
0119                     anchors.fill: thumbnail
0120                     Kirigami.Theme.colorSet: Kirigami.Theme.View
0121                     shadow.size: Kirigami.Units.largeSpacing
0122                     shadow.color: Qt.rgba(0, 0, 0, 0.3)
0123                 }
0124 
0125                 BusyIndicator {
0126                     visible: running
0127                     running: thumbnail.status == Image.Loading
0128                     anchors.centerIn: parent
0129                 }
0130 
0131                 AnimatedImage {
0132                     id: thumbnail
0133                     source: modelData
0134                     height: parent.height
0135                     fillMode: Image.PreserveAspectFit
0136                     smooth: true
0137                 }
0138             }
0139         }
0140     }
0141     clip: true
0142     readonly property var leftShadow: Shadow {
0143         parent: root
0144         anchors {
0145             left: parent.left
0146             top: parent.top
0147             bottom: parent.bottom
0148         }
0149         edge: Qt.LeftEdge
0150         width: Math.max(0, Math.min(root.width/5, root.contentX))
0151     }
0152 
0153     readonly property var rightShadow: Shadow {
0154         parent: root
0155         anchors {
0156             right: parent.right
0157             top: parent.top
0158             bottom: parent.bottom
0159         }
0160         edge: Qt.RightEdge
0161         width: Math.max(0, Math.min(root.contentWidth - root.contentX - root.width)/5)
0162     }
0163 }