Files
pallectrum/electrum/gui/qml/components/controls/QRScan.qml
Sander van Grieken a77ff9943a qml: refactor qr scan to qt6
As the method of capturing frames is totally different, the animation when
a QR is found has been removed.
2023-11-07 10:17:10 +01:00

167 lines
3.9 KiB
QML

import QtQuick
import QtQuick.Controls
import QtMultimedia
import QtQml
import org.electrum 1.0
Item {
id: scanner
property bool active: false
property string url
property string scanData
property string hint
signal found
function restart() {
console.log('qrscan.restart')
scanData = ''
qr.reset()
start()
}
function start() {
console.log('qrscan.start')
loader.item.startTimer.start()
}
function stop() {
console.log('qrscan.stop')
scanner.active = false
}
Item {
id: points
z: 100
anchors.fill: parent
}
Loader {
id: loader
anchors.fill: parent
sourceComponent: scancomp
onStatusChanged: {
if (loader.status == Loader.Ready) {
console.log('camera loaded')
} else if (loader.status == Loader.Error) {
console.log('camera load error')
}
}
}
Component {
id: scancomp
Item {
property alias vo: _vo
property alias ic: _ic
property alias startTimer: _startTimer
VideoOutput {
id: _vo
anchors.fill: parent
fillMode: VideoOutput.PreserveAspectCrop
Rectangle {
width: parent.width
height: (parent.height - parent.width) / 2
anchors.top: parent.top
color: Qt.rgba(0,0,0,0.5)
}
Rectangle {
width: parent.width
height: (parent.height - parent.width) / 2
anchors.bottom: parent.bottom
color: Qt.rgba(0,0,0,0.5)
}
InfoTextArea {
visible: scanner.hint
background.opacity: 0.5
iconStyle: InfoTextArea.IconStyle.None
anchors {
top: parent.top
topMargin: constants.paddingXLarge
left: parent.left
leftMargin: constants.paddingXXLarge
right: parent.right
rightMargin: constants.paddingXXLarge
}
text: scanner.hint
}
Component.onCompleted: {
startTimer.start()
}
}
ImageCapture {
id: _ic
}
MediaDevices {
id: mediaDevices
}
Camera {
id: camera
cameraDevice: mediaDevices.defaultVideoInput
active: scanner.active
focusMode: Camera.FocusModeAutoNear
customFocusPoint: Qt.point(0.5, 0.5)
onErrorOccurred: {
console.log('camera error: ' + errorString)
}
}
CaptureSession {
videoOutput: _vo
imageCapture: _ic
camera: camera
}
Timer {
id: _startTimer
interval: 500
repeat: false
onTriggered: scanner.active = true
}
}
}
Component {
id: r
Rectangle {
property int cx
property int cy
width: 15
height: 15
x: cx - width/2
y: cy - height/2
radius: 5
visible: scanner._pointsVisible
}
}
Connections {
target: qr
function onDataChanged() {
console.log('QR DATA: ' + qr.data)
scanner.active = false
scanner.scanData = qr.data
scanner.found()
}
}
QRParser {
id: qr
videoSink: loader.item.vo.videoSink
}
}