diff --git a/applets/clipboard/contents/ui/BarcodePage.qml b/applets/clipboard/contents/ui/BarcodePage.qml new file mode 100644 index 000000000..dd9ba0f7c --- /dev/null +++ b/applets/clipboard/contents/ui/BarcodePage.qml @@ -0,0 +1,113 @@ +/******************************************************************** +This file is part of the KDE project. + +Copyright (C) 2015 Martin Gräßlin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ +import QtQuick 2.0 +import QtQuick.Layouts 1.1 +import org.kde.plasma.components 2.0 as PlasmaComponents +import org.kde.kquickcontrolsaddons 2.0 + +ColumnLayout { + id: barcodeView + + property var uuid: "" + property int barcodeType: 0 + + function show(uuid) { + barcodeView.uuid = uuid; + barcodePreview.image = undefined; + barcodePreview.busy = true; + var service = clipboardSource.serviceForSource(uuid) + var operation = service.operationDescription("barcode"); + operation.width = barcodePreview.width; + operation.height = barcodePreview.height; + operation.barcodeType = barcodeView.barcodeType; + var serviceJob = service.startOperationCall(operation); + serviceJob.finished.connect(function (job) { + if (!job.error) { + barcodePreview.image = job.result; + barcodePreview.busy = false; + } + }); + } + + RowLayout { + Layout.fillWidth: true + PlasmaComponents.Button { + Layout.fillWidth: true + iconSource: "go-previous-view" + text: i18n("Return to Clipboard") + onClicked: stack.pop() + } + PlasmaComponents.ContextMenu { + id: menu + visualParent: configureButton + function change(type) { + barcodeView.barcodeType = type; + barcodeView.show(barcodeView.uuid); + } + PlasmaComponents.MenuItem { + text: i18n("QR Code") + checkable: true + checked: barcodeView.barcodeType == 0 + onClicked: menu.change(0) + } + PlasmaComponents.MenuItem { + text: i18n("Data Matrix") + checkable: true + checked: barcodeView.barcodeType == 1 + onClicked: menu.change(1) + } + PlasmaComponents.MenuItem { + text: i18n("Code 39") + checkable: true + checked: barcodeView.barcodeType == 2 + onClicked: menu.change(2) + } + PlasmaComponents.MenuItem { + text: i18n("Code 93") + checkable: true + checked: barcodeView.barcodeType == 3 + onClicked: menu.change(3) + } + } + PlasmaComponents.ToolButton { + id: configureButton + iconSource: "configure" + tooltip: i18n("Change the barcode type") + onClicked: menu.open(0, configureButton.height) + } + } + QImageItem { + id: barcodePreview + property alias busy: busyIndicator.visible + fillMode: QImageItem.PreserveAspectFit + Layout.fillWidth: true + Layout.fillHeight: true + onWidthChanged: barcodeView.show(barcodeView.uuid) + onHeightChanged: barcodeView.show(barcodeView.uuid) + PlasmaComponents.BusyIndicator { + id: busyIndicator + anchors.centerIn: parent + } + PlasmaComponents.Label { + anchors.centerIn: parent + text: i18n("Creating barcode failed") + visible: !barcodePreview.busy && barcodePreview.null + } + } +} diff --git a/applets/clipboard/contents/ui/ClipboardPage.qml b/applets/clipboard/contents/ui/ClipboardPage.qml new file mode 100644 index 000000000..002e78b40 --- /dev/null +++ b/applets/clipboard/contents/ui/ClipboardPage.qml @@ -0,0 +1,67 @@ +/******************************************************************** +This file is part of the KDE project. + +Copyright (C) 2014 Martin Gräßlin +Copyright (C) 2014 Kai Uwe Broulik + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ +import QtQuick 2.0 +import QtQuick.Layouts 1.1 +import org.kde.plasma.plasmoid 2.0 +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 2.0 as PlasmaComponents + +ColumnLayout { + RowLayout { + Layout.fillWidth: true + Item { + width: units.gridUnit / 2 - parent.spacing + height: 1 + } + PlasmaComponents.TextField { + id: filter + placeholderText: i18n("Search") + clearButtonShown: true + Layout.fillWidth: true + } + PlasmaComponents.ToolButton { + iconSource: "edit-delete" + tooltip: i18n("Clear history") + onClicked: clipboardSource.service("", "clearHistory") + } + } + Menu { + id: clipboardMenu + model: PlasmaCore.SortFilterModel { + sourceModel: clipboardSource.models.clipboard + filterRole: "DisplayRole" + filterRegExp: filter.text + } + supportsBarcodes: clipboardSource.data["clipboard"]["supportsBarcodes"] + Layout.fillWidth: true + Layout.fillHeight: true + onItemSelected: clipboardSource.service(uuid, "select") + onRemove: clipboardSource.service(uuid, "remove") + onEdit: clipboardSource.edit(uuid) + onBarcode: { + var page = stack.push(barcodePage); + page.show(uuid); + } + onAction: { + clipboardSource.service(uuid, "action") + clipboardMenu.view.currentIndex = 0 + } + } +} diff --git a/applets/clipboard/contents/ui/clipboard.qml b/applets/clipboard/contents/ui/clipboard.qml index 23cabadd2..2a33a9d08 100644 --- a/applets/clipboard/contents/ui/clipboard.qml +++ b/applets/clipboard/contents/ui/clipboard.qml @@ -133,44 +133,17 @@ Item { } } } - ColumnLayout { + PlasmaComponents.PageStack { + id: stack anchors.fill: parent - RowLayout { - Layout.fillWidth: true - Item { - width: units.gridUnit / 2 - parent.spacing - height: 1 - } - PlasmaComponents.TextField { - id: filter - placeholderText: i18n("Search") - clearButtonShown: true - Layout.fillWidth: true - } - PlasmaComponents.ToolButton { - iconSource: "edit-delete" - tooltip: i18n("Clear history") - onClicked: clipboardSource.service("", "clearHistory") - } + initialPage: ClipboardPage { + anchors.fill: parent } - Menu { - id: clipboardMenu - model: PlasmaCore.SortFilterModel { - sourceModel: clipboardSource.models.clipboard - filterRole: "DisplayRole" - filterRegExp: filter.text - } - supportsBarcodes: clipboardSource.data["clipboard"]["supportsBarcodes"] - Layout.fillWidth: true - Layout.fillHeight: true - onItemSelected: clipboardSource.service(uuid, "select") - onRemove: clipboardSource.service(uuid, "remove") - onEdit: clipboardSource.edit(uuid) - onBarcode: clipboardSource.service(uuid, "barcode") - onAction: { - clipboardSource.service(uuid, "action") - clipboardMenu.view.currentIndex = 0 - } + } + Component { + id: barcodePage + BarcodePage { + anchors.fill: parent } } } diff --git a/klipper/CMakeLists.txt b/klipper/CMakeLists.txt index 05c8e9052..099cb7127 100644 --- a/klipper/CMakeLists.txt +++ b/klipper/CMakeLists.txt @@ -70,6 +70,7 @@ set(plasma_engine_clipboard_SRCS ${libklipper_common_SRCS} clipboardengine.cpp c add_library(plasma_engine_clipboard MODULE ${plasma_engine_clipboard_SRCS}) kcoreaddons_desktop_to_json(plasma_engine_clipboard plasma-dataengine-clipboard.desktop) target_link_libraries(plasma_engine_clipboard + Qt5::Concurrent Qt5::DBus Qt5::Widgets # QAction KF5::ConfigGui diff --git a/klipper/clipboardjob.cpp b/klipper/clipboardjob.cpp index ad6b6358d..388c7232c 100644 --- a/klipper/clipboardjob.cpp +++ b/klipper/clipboardjob.cpp @@ -22,9 +22,18 @@ along with this program. If not, see . #include "historyitem.h" #include +#include +#include #include #include +#ifdef HAVE_PRISON +#include +#include +#include +#include +#endif + const static QString s_iconKey = QStringLiteral("icon"); const static QString s_previewKey = QStringLiteral("preview"); const static QString s_previewWidthKey = QStringLiteral("previewWidth"); @@ -81,8 +90,51 @@ void ClipboardJob::start() return; } else if (operation == QLatin1String("barcode")) { #ifdef HAVE_PRISON - m_klipper->showBarcode(item); - setResult(true); + int pixelWidth = parameters().value(QStringLiteral("width")).toInt(); + int pixelHeight = parameters().value(QStringLiteral("height")).toInt(); + prison::AbstractBarcode *code = nullptr; + switch (parameters().value(QStringLiteral("barcodeType")).toInt()) { + case 1: { + code = new prison::DataMatrixBarcode; + const int size = qMin(pixelWidth, pixelHeight); + pixelWidth = size; + pixelHeight = size; + break; + } + case 2: { + code = new prison::Code39Barcode; + break; + } + case 3: { + code = new prison::Code93Barcode; + break; + } + case 0: + default: { + code = new prison::QRCodeBarcode; + const int size = qMin(pixelWidth, pixelHeight); + pixelWidth = size; + pixelHeight = size; + break; + } + } + if (code) { + code->setData(item->text()); + QFutureWatcher *watcher = new QFutureWatcher(this); + connect(watcher, &QFutureWatcher::finished, this, + [this, watcher, code] { + setResult(watcher->result()); + watcher->deleteLater(); + delete code; + emitResult(); + } + ); + auto future = QtConcurrent::run(code, &prison::AbstractBarcode::toImage, QSizeF(pixelWidth, pixelHeight)); + watcher->setFuture(future); + return; + } else { + setResult(false); + } #else setResult(false); #endif diff --git a/klipper/org.kde.plasma.clipboard.operations b/klipper/org.kde.plasma.clipboard.operations index 5e9f71ac1..f959fbc87 100644 --- a/klipper/org.kde.plasma.clipboard.operations +++ b/klipper/org.kde.plasma.clipboard.operations @@ -20,6 +20,15 @@ + + + + + + + + +