[clipboard] Show barcodes directly in view

When clicking the barcode button, the view is changed to just show
the barcode instead of opening a dialog. By default a QR Code is
displayed.

A tool button is added which allows to change the barcode type, with
the following barcodes being supported:
* QR
* Data Matrix
* Code 39
* Code 93

REVIEW: 122402
wilder-5.14
Martin Gräßlin 11 years ago
parent 164235cf0d
commit a462d12ab9
  1. 113
      applets/clipboard/contents/ui/BarcodePage.qml
  2. 67
      applets/clipboard/contents/ui/ClipboardPage.qml
  3. 45
      applets/clipboard/contents/ui/clipboard.qml
  4. 1
      klipper/CMakeLists.txt
  5. 56
      klipper/clipboardjob.cpp
  6. 9
      klipper/org.kde.plasma.clipboard.operations

@ -0,0 +1,113 @@
/********************************************************************
This file is part of the KDE project.
Copyright (C) 2015 Martin Gräßlin <mgraesslin@kde.org>
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 <http://www.gnu.org/licenses/>.
*********************************************************************/
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
}
}
}

@ -0,0 +1,67 @@
/********************************************************************
This file is part of the KDE project.
Copyright (C) 2014 Martin Gräßlin <mgraesslin@kde.org>
Copyright (C) 2014 Kai Uwe Broulik <kde@privat.broulik.de>
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 <http://www.gnu.org/licenses/>.
*********************************************************************/
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
}
}
}

@ -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
}
}
}

@ -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

@ -22,9 +22,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "historyitem.h"
#include <KIO/PreviewJob>
#include <QtConcurrent>
#include <QFutureWatcher>
#include <QDebug>
#include <QIcon>
#ifdef HAVE_PRISON
#include <prison/QRCodeBarcode>
#include <prison/DataMatrixBarcode>
#include <prison/Code39Barcode>
#include <prison/Code93Barcode>
#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<QImage> *watcher = new QFutureWatcher<QImage>(this);
connect(watcher, &QFutureWatcher<QImage>::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

@ -20,6 +20,15 @@
</entry>
</group>
<group name="barcode">
<entry name="width" type="int">
<label>The width of the barcode in pixels</label>
</entry>
<entry name="height" type="int">
<label>The height of the barcode in pixels</label>
</entry>
<entry name="barcodeType" type="int">
<label>The barcode type 0 for QrCode, 1 for DataMatrix, 2 for Code 39, 3 for Code 93</label>
</entry>
</group>
<group name="action">
</group>

Loading…
Cancel
Save