Warning, /utilities/qrca/src/contents/ui/QrCodeScannerPage.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * SPDX-FileCopyrightText: 2020 Nicolas Fella <nicolas.fella@gmx.de>
0003 * SPDX-FileCopyrightText: 2016-2019 Kaidan developers and contributors (see the LICENSE file of Kaidan for a full list of copyright authors)
0004 *
0005 * SPDX-License-Identifier: GPL-3.0-or-later
0006 */
0007
0008 import QtCore
0009 import QtQuick 2.0
0010 import QtQuick.Controls 2.3 as Controls
0011 import QtMultimedia
0012 import org.kde.kirigami as Kirigami
0013 import QtQuick.Layouts 1.3
0014 import org.kde.prison.scanner 1.0 as Prison
0015
0016 import org.kde.qrca 1.0
0017
0018 Kirigami.Page {
0019 leftPadding: 0
0020 rightPadding: 0
0021 topPadding: 0
0022 bottomPadding: 0
0023
0024 title: qsTr("Scan QR code")
0025 actions: [
0026 Kirigami.Action {
0027 icon.name: checked ? "flashlight-off" : "flashlight-on"
0028 text: i18n("Light")
0029 checkable: true
0030 checked: camera.torchMode == Camera.TorchOn
0031 visible: camera.isTorchModeSupported
0032 onTriggered: camera.torchMode = (camera.torchMode == Camera.TorchOn ? Camera.TorchOff : Camera.TorchOn)
0033 },
0034 Kirigami.Action {
0035 text: i18n("Select Camera")
0036 visible: devices.videoInputs.length > 1
0037 icon.name: "camera-video-symbolic"
0038 onTriggered: cameraSelectorSheet.open()
0039 }
0040 ]
0041
0042 CameraPermission {
0043 id: permission
0044 onStatusChanged: {
0045 if (status == Qt.PermissionStatus.Granted) {
0046 camera.start();
0047 }
0048 }
0049 }
0050
0051 MediaDevices {
0052 id: devices
0053 }
0054
0055 function asLink(text) {
0056 return "<a href='" + text + "'>" + text + "</a>"
0057 }
0058
0059 Kirigami.OverlaySheet {
0060 id: resultSheet
0061
0062 property var tag
0063
0064 header: Kirigami.Heading {
0065 text: {
0066 switch (resultSheet.tag.contentType) {
0067 case QrCodeContent.Text:
0068 return i18n("Text found")
0069 case QrCodeContent.Url:
0070 return i18n("URL found")
0071 case QrCodeContent.VCard:
0072 return i18n("Contact found")
0073 case QrCodeContent.OtpToken:
0074 return i18n("OTP URI found")
0075 case QrCodeContent.Binary:
0076 return i18n("Binary data found")
0077 case QrCodeContent.HealthCertificate:
0078 return i18n("Health certificate found")
0079 case QrCodeContent.TransportTicket:
0080 return i18n("Transport ticket found")
0081 case QrCodeContent.ISBN:
0082 return i18n("ISBN found")
0083 case QrCodeContent.EAN:
0084 return i18n("International Article Number found")
0085 case QrCodeContent.WifiSetting:
0086 return i18n("Wi-Fi settings found")
0087 }
0088 }
0089 }
0090
0091 Item {
0092 implicitWidth: Kirigami.Units.gridUnit * 20
0093 height: childrenRect.height
0094
0095 Controls.Label {
0096 text: {
0097 switch(resultSheet.tag.contentType) {
0098 case QrCodeContent.VCard:
0099 return Qrca.getVCardName(resultSheet.tag.text);
0100 case QrCodeContent.WifiSetting:
0101 return Qrca.wifiName(resultSheet.tag.text);
0102 default:
0103 return resultSheet.tag.isPlainText ? resultSheet.tag.text : i18n("<binary data>");
0104 }
0105 }
0106 anchors.left: parent.left
0107 anchors.right: parent.right
0108 wrapMode: Text.Wrap
0109 }
0110 }
0111
0112 footer: RowLayout {
0113 Controls.Button {
0114 text: {
0115 switch (resultSheet.tag.contentType) {
0116 case QrCodeContent.Url:
0117 return i18n("Open")
0118 case QrCodeContent.VCard:
0119 return i18n("Save contact")
0120 case QrCodeContent.OtpToken:
0121 return i18n("Open OTP client")
0122 case QrCodeContent.EAN:
0123 return i18n("Open Food Facts")
0124 case QrCodeContent.ISBN:
0125 return i18n("Wikipedia Book Sources")
0126 case QrCodeContent.TransportTicket:
0127 return i18n("Open KDE Itinerary")
0128 case QrCodeContent.HealthCertificate:
0129 return i18n("Open in Vakzination")
0130 case QrCodeContent.WifiSetting:
0131 return i18n("Connect")
0132 }
0133 }
0134 onClicked: {
0135 switch (resultSheet.tag.contentType) {
0136 case QrCodeContent.Url:
0137 Qt.openUrlExternally(resultSheet.tag.text)
0138 break
0139 case QrCodeContent.VCard:
0140 Qrca.saveVCard(resultSheet.tag.text)
0141 break
0142 case QrCodeContent.OtpToken:
0143 Qt.openUrlExternally(resultSheet.tag.text)
0144 break
0145 case QrCodeContent.EAN:
0146 Qt.openUrlExternally("https://world.openfoodfacts.org/product/" + resultSheet.tag.text)
0147 break;
0148 case QrCodeContent.ISBN:
0149 Qt.openUrlExternally("https://en.wikipedia.org/wiki/Special:BookSources?isbn=" + resultSheet.tag.text)
0150 break;
0151 case QrCodeContent.TransportTicket:
0152 Qrca.openInApplication(resultSheet.tag, "org.kde.itinerary");
0153 break;
0154 case QrCodeContent.HealthCertificate:
0155 Qrca.openInApplication(resultSheet.tag, "org.kde.vakzination");
0156 case QrCodeContent.WifiSetting:
0157 Qrca.connectToWifi(resultSheet.tag.text);
0158 }
0159 resultSheet.close()
0160 }
0161 visible: {
0162 switch (resultSheet.tag.contentType) {
0163 case QrCodeContent.Binary:
0164 case QrCodeContent.Text:
0165 return false;
0166 case QrCodeContent.TransportTicket:
0167 return Qrca.hasApplication("org.kde.itinerary");
0168 case QrCodeContent.HealthCertificate:
0169 return Qrca.hasApplication("org.kde.vakzination");
0170 case QrCodeContent.WifiSetting:
0171 return Qrca.canConnectToWifi();
0172 }
0173 return true;
0174 }
0175 icon.name: {
0176 switch (resultSheet.tag.contentType) {
0177 case QrCodeContent.VCard:
0178 return "document-save";
0179 case QrCodeContent.OtpToken:
0180 return "document-encrypt";
0181 case QrCodeContent.TransportTicket:
0182 return Qrca.applicationIconName("org.kde.itinerary");
0183 case QrCodeContent.HealthCertificate:
0184 return Qrca.applicationIconName("org.kde.vakzination");
0185 case QrCodeContent.WifiSetting:
0186 return "network-wireless";
0187 }
0188 return "internet-services"
0189 }
0190
0191 Layout.fillWidth: true
0192 }
0193 Controls.Button {
0194 text: i18n("Copy to clipboard")
0195 icon.name: "edit-copy-symbolic"
0196 onClicked: {
0197 Qrca.copyToClipboard(resultSheet.tag)
0198 resultSheet.close()
0199 }
0200 Layout.fillWidth: true
0201 }
0202 }
0203 }
0204
0205 Kirigami.OverlaySheet {
0206 id: cameraSelectorSheet
0207
0208 header: Kirigami.Heading {
0209 text: i18n("Select Camera")
0210 }
0211
0212 ListView {
0213 model: devices.videoInputs
0214 implicitWidth: Kirigami.Units.gridUnit * 20
0215
0216 delegate: Controls.ItemDelegate {
0217 text: modelData.description
0218 width: ListView.view.width
0219 onClicked: {
0220 camera.cameraDevice = modelData;
0221 camera.start();
0222 cameraSelectorSheet.close();
0223 }
0224 }
0225 }
0226 }
0227
0228 VideoOutput {
0229 id: viewfinder
0230 anchors.fill: parent
0231 fillMode: VideoOutput.PreserveAspectCrop
0232 }
0233
0234 Prison.VideoScanner {
0235 id: scannerFilter
0236
0237 onResultContentChanged: result => {
0238 if (!result.hasContent) {
0239 return
0240 }
0241
0242 resultSheet.tag = Qrca.resultContent(result)
0243 if (!resultSheet.sheetOpen) {
0244 resultSheet.open()
0245 }
0246 }
0247 videoSink: viewfinder.videoSink
0248 }
0249
0250 CaptureSession {
0251 id: captureSession
0252 camera: Camera {
0253 id: camera
0254 active: true
0255 }
0256 videoOutput: viewfinder
0257 }
0258
0259 Kirigami.PlaceholderMessage {
0260 text: camera.errorString
0261 visible: camera.error != Camera.NoError
0262 anchors.fill: parent
0263 }
0264
0265 Component.onCompleted: {
0266 if (permission.status == Qt.PermissionStatus.Undetermined)
0267 permission.request()
0268 }
0269 }