ContactScanPage.qml Example File
appdemos/qtws/qml/pages/ContactScanPage.qml
import Felgo 3.0
import QtQuick 2.0
import QtMultimedia 5.5
import QZXing 2.3
import "../common"
Page {
id: page
title: "Add Contact"
backgroundColor: "black"
rightBarItem: ActivityIndicatorBarItem {
animating: page.busy
visible: animating
}
property bool busy: false
property string lastScannedTag: ""
signal tagFound(string tag)
Component.onCompleted: initializeScanner()
onTagFound: {
page.busy = true
captureText.visible = false
captureZone.color = "green"
logic.loadContact(tag, function(data) {
page.busy = false
var time = Date.now()
data["scan_timestamp"] = time
data["scan_tag"] = tag
amplitude.logEvent("Card Scan Successful",{"tag" : tag, "data": data, "name": data.name})
var contactAlreadyExists = dataModel.contacts && dataModel.contacts[tag]
logic.addContact(tag, data)
if(!contactAlreadyExists) {
page.navigationStack.pop(getPage(navigationStack.depth - 2))
page.navigationStack.push(Qt.resolvedUrl("ContactDetailPage.qml"), { contactId: tag, contact: data })
}
else {
NativeDialog.confirm("Contact Exists", "You already have this contact in your list, your contact was updated.", function(accept) {
page.navigationStack.pop(getPage(navigationStack.depth - 2))
page.navigationStack.push(Qt.resolvedUrl("ContactDetailPage.qml"), { contactId: tag, contact: data })
}, false)
}
}, function() {
page.busy = false
captureZone.color = "red"
NativeDialog.confirm("Failed to fetch data","Please scan a valid code and make sure your device has internet access.", function() {
initializeScanner()
}, false)
})
}
Item {
anchors.fill: parent
Component.onCompleted: {
captureZone.width = Qt.binding(function() { return videoOutput.contentRect.width / 2 })
captureZone.height = Qt.binding(function() { return videoOutput.contentRect.height / 2 })
}
Camera {
id:camera
focus {
focusMode: CameraFocus.FocusContinuous
focusPointMode: CameraFocus.FocusPointAuto
}
}
VideoOutput {
id: videoOutput
source: camera
anchors.fill: parent
autoOrientation: true
fillMode: VideoOutput.PreserveAspectCrop
filters: [ zxingFilter ]
MouseArea {
anchors.fill: parent
onClicked: {
camera.focus.customFocusPoint = Qt.point(mouse.x / width, mouse.y / height);
camera.focus.focusMode = CameraFocus.FocusMacro;
camera.focus.focusPointMode = CameraFocus.FocusPointCustom;
}
}
}
QZXingFilter {
id: zxingFilter
captureRect: {
videoOutput.contentRect;
videoOutput.sourceRect;
return videoOutput.mapRectToSource(videoOutput.mapNormalizedRectToItem(Qt.rect(
0.25, 0.25, 0.5, 0.5
)));
}
decoder {
enabledDecoders: QZXing.DecoderFormat_QR_CODE
onTagFound: {
console.log(tag + " | " + decoder.foundedFormat() + " | " + decoder.charSet());
zxingFilter.active = false
page.lastScannedTag = tag
page.tagFound(page.lastScannedTag)
}
tryHarder: false
}
}
}
Item {
id: scannerUI
anchors.fill: parent
z: 1
Rectangle {
id: captureZone
color: "red"
opacity: 0.2
anchors.centerIn: parent
}
AppText {
id: captureText
anchors.centerIn: parent
color: "white"
text: "[place QR code\nin this area]"
font.pixelSize: sp(12)
horizontalAlignment: AppText.AlignHCenter
font.bold: true
}
AppActivityIndicator {
animating: page.busy
visible: animating
anchors.centerIn: parent
color: "white"
}
}
function initializeScanner() {
captureText.visible = true
captureZone.color = "red"
zxingFilter.active = true
}
}