Warning, /maui/booth/src/views/CameraPage.qml is written in an unsupported language. File is not indexed.
0001 // Copyright 2018-2020 Camilo Higuita <milo.h@aol.com> 0002 // Copyright 2018-2020 Nitrux Latinoamericana S.C. 0003 // 0004 // SPDX-License-Identifier: GPL-3.0-or-later 0005 0006 import QtQml 2.14 0007 import QtQuick 2.14 0008 import QtQuick.Controls 2.15 0009 import QtMultimedia 5.15 0010 0011 import org.mauikit.controls 1.3 as Maui 0012 0013 import org.mauikit.filebrowsing 1.3 as FB 0014 0015 import org.kde.prison.scanner 1.0 as Prison 0016 0017 import "../widgets" 0018 0019 Pane 0020 { 0021 id: cameraPage 0022 padding: 0 0023 property bool manualMode: false 0024 property alias camera : _camera 0025 state: "PhotoCapture" 0026 0027 background: Rectangle 0028 { 0029 color: "black" 0030 } 0031 0032 states: [ 0033 State { 0034 name: "PhotoCapture" 0035 StateChangeScript { 0036 script: { 0037 camera.captureMode = Camera.CaptureStillImage 0038 camera.start() 0039 } 0040 } 0041 }, 0042 State { 0043 name: "PhotoPreview" 0044 }, 0045 State { 0046 name: "VideoCapture" 0047 StateChangeScript { 0048 script: { 0049 camera.captureMode = Camera.CaptureVideo 0050 camera.start() 0051 } 0052 } 0053 }, 0054 State { 0055 name: "VideoPreview" 0056 StateChangeScript { 0057 script: { 0058 camera.stop() 0059 } 0060 } 0061 } 0062 ] 0063 0064 Prison.VideoScanner 0065 { 0066 id: scanner 0067 // formats: Prison.Format.QRCode | Prison.Format.Aztec 0068 onResultChanged: { 0069 if (result.hasText) { 0070 console.log(result.text, result.format); 0071 } else if (result.hasBinaryData) { 0072 console.log("<binary content>", result.format); 0073 } else { 0074 console.log("no barcode found"); 0075 } 0076 } 0077 } 0078 0079 0080 contentItem: PinchArea 0081 { 0082 pinch.minimumScale: 0 0083 pinch.maximumScale: camera.maximumDigitalZoom 0084 enabled: camera.maximumDigitalZoom > 1 && Maui.Handy.isTouch 0085 0086 onPinchUpdated: 0087 { 0088 console.log("PINCH ZOOMING", pinch.previousScale) 0089 camera.setDigitalZoom(Math.round(pinch.previousScale + pinch.scale)) 0090 pinch.accepted = true 0091 } 0092 0093 VideoOutput 0094 { 0095 id: viewfinder 0096 visible: cameraPage.state == "PhotoCapture" || cameraPage.state == "VideoCapture" 0097 anchors.fill: parent 0098 0099 autoOrientation: true 0100 0101 filters: settings.readQR ? [scanner] : [] 0102 0103 source: Camera 0104 { 0105 id: _camera 0106 captureMode: Camera.CaptureStillImage 0107 0108 // flash.mode: Camera.FlashRedEyeReduction 0109 // imageProcessing.whiteBalanceMode: CameraImageProcessing.WhiteBalanceFlash 0110 0111 exposure { 0112 exposureCompensation: -1.0 0113 exposureMode: Camera.ExposurePortrait 0114 } 0115 0116 focus { 0117 focusMode: Camera.FocusPointAuto 0118 // focusPointMode: Camera.FocusPointCustom 0119 customFocusPoint: Qt.point(0.2, 0.2) // Focus relative to top-left corner 0120 } 0121 0122 imageCapture { 0123 onImageCaptured: 0124 { 0125 _previewImage.source = preview 0126 // stillControls.previewAvailable = true 0127 // cameraPage.state = "PhotoPreview" 0128 } 0129 } 0130 0131 videoRecorder { 0132 resolution: "640x480" 0133 frameRate: 30 0134 } 0135 } 0136 0137 Repeater 0138 { 0139 model: _camera.focus.focusZones 0140 0141 Rectangle 0142 { 0143 border 0144 { 0145 width: 2 0146 color: status == Camera.FocusAreaFocused ? "green" : "white" 0147 } 0148 0149 color: "transparent" 0150 0151 // Map from the relative, normalized frame coordinates 0152 property variant mappedRect: viewfinder.mapNormalizedRectToItem(area); 0153 0154 x: mappedRect.x 0155 y: mappedRect.y 0156 width: mappedRect.width 0157 height: mappedRect.height 0158 } 0159 } 0160 0161 0162 Maui.Chip 0163 { 0164 text: _camera.digitalZoom+"x" 0165 visible: _camera.digitalZoom >1 0166 anchors.right: parent.right 0167 anchors.bottom: parent.bottom 0168 anchors.margins: Maui.Style.space.big 0169 } 0170 0171 Item 0172 { 0173 height: 100 0174 width: 100 0175 0176 anchors.left: parent.left 0177 anchors.bottom: parent.bottom 0178 anchors.margins: Maui.Style.space.big 0179 0180 Image 0181 { 0182 id: _previewImage 0183 anchors.fill: parent 0184 sourceSize.width: width 0185 sourceSize.height: height 0186 0187 fillMode: Image.PreserveAspectFit 0188 } 0189 } 0190 } 0191 0192 Item 0193 { 0194 anchors.fill: parent 0195 0196 Label 0197 { 0198 text: { 0199 if (camera.lockStatus == Camera.Unlocked) 0200 "Focus"; 0201 else if (camera.lockStatus == Camera.Searching) 0202 "Focusing" 0203 else 0204 "Unlock" 0205 } 0206 } 0207 0208 TapHandler 0209 { 0210 onTapped: 0211 { 0212 var mappedPoint = viewfinder.mapPointToSourceNormalized(eventPoint.scenePosition); 0213 0214 var point = Qt.point(eventPoint.scenePosition.x/viewfinder.contentRect.width, mappedPoint.y/viewfinder.contentRect.height) 0215 0216 console.log("TAPPED POINT", point.x, point.y) 0217 camera.focus.customFocusPoint = mappedPoint 0218 0219 if (camera.lockStatus == Camera.Unlocked) 0220 { 0221 camera.searchAndLock(); 0222 } 0223 else 0224 { 0225 camera.unlock(); 0226 camera.searchAndLock(); 0227 } 0228 } 0229 0230 onDoubleTapped: 0231 { 0232 var mappedPoint = viewfinder.mapPointToSourceNormalized(eventPoint.scenePosition); 0233 0234 var point = Qt.point(eventPoint.scenePosition.x/viewfinder.contentRect.width, mappedPoint.y/viewfinder.contentRect.height) 0235 0236 console.log("TAPPED POINT", point.x, point.y) 0237 camera.focus.customFocusPoint = mappedPoint 0238 0239 camera.searchAndLock(); 0240 } 0241 } 0242 } 0243 0244 Rectangle 0245 { 0246 color: "#80ff0000" 0247 x: viewfinder.mapRectToItem(scanner.result.boundingRect).x 0248 y: viewfinder.mapRectToItem(scanner.result.boundingRect).y 0249 width: viewfinder.mapRectToItem(scanner.result.boundingRect).width 0250 height: viewfinder.mapRectToItem(scanner.result.boundingRect).height 0251 0252 Maui.Chip 0253 { 0254 z: parent.z + 9999 0255 anchors.top: parent.bottom 0256 anchors.left: parent.left 0257 0258 text: scanner.result.text 0259 0260 onClicked: 0261 { 0262 console.log("Trying to open URL") 0263 Qt.openUrlExternally(scanner.result.text) 0264 } 0265 } 0266 } 0267 0268 } 0269 0270 0271 // PhotoPreview 0272 // { 0273 // id : photoPreview 0274 // anchors.fill : parent 0275 // onClosed: cameraPage.state = "PhotoCapture" 0276 // visible: cameraPage.state == "PhotoPreview" 0277 // focus: visible 0278 // } 0279 0280 // VideoPreview 0281 // { 0282 // id : videoPreview 0283 // anchors.fill : parent 0284 // onClosed: cameraPage.state = "VideoCapture" 0285 // visible: cameraPage.state == "VideoPreview" 0286 // focus: visible 0287 0288 // //don't load recorded video if preview is invisible 0289 // source: visible ? camera.videoRecorder.actualLocation : "" 0290 // } 0291 0292 0293 // PhotoCaptureControls 0294 // { 0295 // id: stillControls 0296 // anchors.fill: parent 0297 // camera: camera 0298 // visible: cameraPage.state == "PhotoCapture" 0299 // onPreviewSelected: cameraPage.state = "PhotoPreview" 0300 // } 0301 0302 // VideoCaptureControls 0303 // { 0304 // id: videoControls 0305 // anchors.fill: parent 0306 // camera: camera 0307 // visible: cameraPage.state == "VideoCapture" 0308 // onPreviewSelected: cameraPage.state = "VideoPreview" 0309 // } 0310 0311 function flipCamera() 0312 { 0313 0314 } 0315 0316 function capture() 0317 { 0318 if(cameraPage.state === "PhotoCapture" && camera.imageCapture.ready) 0319 { 0320 cameraPage.camera.imageCapture.capture() 0321 } 0322 0323 if(cameraPage.state === "VideoCapture" && _cameraPage.camera.videoRecorder.recorderStatus == CameraRecorder.LoadedStatus) 0324 { 0325 0326 cameraPage.camera.videoRecorder.record() 0327 } 0328 } 0329 0330 Component.onCompleted: 0331 { 0332 cameraPage.state = "PhotoCapture" 0333 } 0334 } 0335