Warning, /plasma-mobile/plasma-camera/src/contents/ui/PreviewArea.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2020 Jonah BrĂ¼chert <jbb@kaidan.im>
0002 // SPDX-FileCopyrightText: 2020 Sebastian Pettke <sebpe@mailbox.org>
0003 //
0004 // SPDX-License-Identifier: GPL-3.0-or-later
0005 
0006 import QtQuick 2.7
0007 import QtMultimedia 5.8
0008 import QtQuick.Controls.Material 2.0
0009 import QtQuick.Controls 2.0 as Controls
0010 import org.kde.kirigami 2.4 as Kirigami
0011 import QtGraphicalEffects 1.0
0012 
0013 
0014 Rectangle {
0015     id: preview
0016 
0017     property var imageCapture
0018     property var videoRecorder
0019     property bool showVideoPreview: false // when set to true, the preview for the videoRecorder is shown, if false for the imageCapture
0020     property bool videoThumbnailRequested: false
0021 
0022     visible: ((imageCapture.capturedImagePath && !showVideoPreview) || (videoRecorder.actualLocation && showVideoPreview)) && !(videoRecorder.recorderStatus === CameraRecorder.RecordingStatus)
0023     width: Kirigami.Units.gridUnit * 6
0024     height: width
0025     layer.enabled: preview.enabled
0026     layer.effect: DropShadow {
0027         color: Material.dropShadowColor
0028         samples: 30
0029         spread: 0.5
0030     }
0031 
0032     Component.onCompleted: {
0033         videoRecorder.recorderStatusChanged.connect(createVideoThumbnail)
0034     }
0035 
0036     function setPhotoPreview() {
0037         showVideoPreview = false
0038     }
0039 
0040     function setVideoPreview() {
0041         videoThumbnailRequested = true
0042         showVideoPreview = true
0043     }
0044 
0045     function createVideoThumbnail() {
0046         if (videoThumbnailRequested && !(videoRecorder.recorderStatus === CameraRecorder.FinalizingStatus)) {
0047             video.source = videoRecorder.actualLocation
0048             video.play()
0049             video.pause()
0050             videoThumbnailRequested = false
0051         }
0052     }
0053 
0054     MouseArea {
0055         anchors.fill: parent
0056         onClicked: {
0057             if (showVideoPreview) {
0058                 Qt.openUrlExternally(videoRecorder.actualLocation)
0059             }
0060             else {
0061                 Qt.openUrlExternally("file://" + imageCapture.capturedImagePath)
0062             }
0063         }
0064     }
0065 
0066     Image {
0067         visible: !showVideoPreview
0068         fillMode: Image.PreserveAspectCrop
0069         anchors.fill: parent
0070         source: imageCapture.capturedImagePath ? "file://" + imageCapture.capturedImagePath : ""
0071     }
0072 
0073     Rectangle {
0074         visible: showVideoPreview
0075         anchors.fill: parent
0076         color: "grey"
0077 
0078         Video {
0079             id: video
0080             anchors.fill: parent
0081             muted: true
0082             fillMode: VideoOutput.PreserveAspectCrop
0083         }
0084 
0085         Controls.BusyIndicator {
0086             id: thumbnailBusyIdicator
0087             visible: (videoRecorder.recorderStatus === CameraRecorder.FinalizingStatus)
0088             Kirigami.Theme.textColor: "white"
0089             anchors.fill: parent
0090 
0091             layer.enabled: thumbnailBusyIdicator.enabled
0092             layer.effect: DropShadow {
0093                 color: Material.dropShadowColor
0094                 samples: 30
0095                 spread: 0.5
0096             }
0097         }
0098 
0099         Kirigami.Icon {
0100             id: playbackIcon
0101             visible: !thumbnailBusyIdicator.visible
0102             source: "media-playback-start"
0103             color: "white"
0104             width: parent.width * 0.75
0105             height: width
0106             anchors.centerIn: parent
0107 
0108             layer.enabled: playbackIcon.enabled
0109             layer.effect: DropShadow {
0110                 color: Material.dropShadowColor
0111                 samples: 30
0112                 spread: 0.5
0113             }
0114         }
0115     }
0116 }