From a40c6e81011abd76e4a9c9f8bbd8963f26c647aa Mon Sep 17 00:00:00 2001 From: Aleix Pol Date: Fri, 5 Jul 2019 17:58:46 +0200 Subject: [PATCH] Submitted proof of concept for a presenter plugin Will show a cursor so we can point at interesting things on the screen during presentations. --- plugins/CMakeLists.txt | 7 +- plugins/presenter/CMakeLists.txt | 9 ++ plugins/presenter/Presenter.qml | 94 +++++++++++++++++++++ plugins/presenter/assets.qrc | 7 ++ plugins/presenter/kdeconnect_presenter.json | 21 +++++ plugins/presenter/presenterplugin.cpp | 93 ++++++++++++++++++++ plugins/presenter/presenterplugin.h | 52 ++++++++++++ plugins/presenter/test.qml | 21 +++++ 8 files changed, 303 insertions(+), 1 deletion(-) create mode 100644 plugins/presenter/CMakeLists.txt create mode 100644 plugins/presenter/Presenter.qml create mode 100644 plugins/presenter/assets.qrc create mode 100644 plugins/presenter/kdeconnect_presenter.json create mode 100644 plugins/presenter/presenterplugin.cpp create mode 100644 plugins/presenter/presenterplugin.h create mode 100644 plugins/presenter/test.qml diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index cfc8f9a3f..cb9560a12 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -41,6 +41,11 @@ if(SAILFISHOS OR EXPERIMENTALAPP_ENABLED) add_subdirectory(remotesystemvolume) endif() -# If we split notifications per plugin, in several notifyrc files, they won't +option(EXPERIMENTAL_PRESENTER "Enables building the experimental on-screen pointer for presentations" OFF) +if(EXPERIMENTAL_PRESENTER) + add_subdirectory(presenter) +endif() + +# If we split notifications per plugin, in several notifyrc files, they won't # appear in the same group in the Notifications KCM install(FILES kdeconnect.notifyrc DESTINATION ${KNOTIFYRC_INSTALL_DIR}) diff --git a/plugins/presenter/CMakeLists.txt b/plugins/presenter/CMakeLists.txt new file mode 100644 index 000000000..6fea7f67e --- /dev/null +++ b/plugins/presenter/CMakeLists.txt @@ -0,0 +1,9 @@ +qt5_add_resources(presenter_SRCS assets.qrc) + +kdeconnect_add_plugin(kdeconnect_presenter JSON kdeconnect_presenter.json SOURCES presenterplugin.cpp ${presenter_SRCS}) +target_link_libraries(kdeconnect_presenter + kdeconnectcore + Qt5::DBus + Qt5::Quick + KF5::I18n +) diff --git a/plugins/presenter/Presenter.qml b/plugins/presenter/Presenter.qml new file mode 100644 index 000000000..f1d5915a7 --- /dev/null +++ b/plugins/presenter/Presenter.qml @@ -0,0 +1,94 @@ +/** + * Copyright 2019 Aleix Pol Gonzalez + * + * 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) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * 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.5 +import QtQuick.Window 2.5 +import QtQuick.Particles 2.0 + +Item { + id: root + anchors.fill: parent + + property real xPos: 0.5 + property real yPos: 0.5 + + ParticleSystem { + id: particles + width: parent.width/20 + height: width + + x: root.width * root.xPos - width/2 + y: root.height * root.yPos - height/2 + + ImageParticle { + groups: ["center", "edge"] + anchors.fill: parent + source: "qrc:///particleresources/glowdot.png" + colorVariation: 0.1 + color: "#000099FF" + } + + Emitter { + anchors.fill: parent + group: "center" + emitRate: 400 + lifeSpan: 200 + size: 20 + sizeVariation: 2 + endSize: 0 + //! [0] + shape: EllipseShape {fill: false} + velocity: TargetDirection { + targetX: particles.width/2 + targetY: particles.height/2 + proportionalMagnitude: true + magnitude: 0.5 + } + //! [0] + } + + Emitter { + anchors.fill: parent + group: "edge" + startTime: 200 + emitRate: 200 + lifeSpan: 20 + size: 28 + sizeVariation: 2 + endSize: 16 + shape: EllipseShape {fill: false} + velocity: TargetDirection { + targetX: particles.width/2 + targetY: particles.height/2 + proportionalMagnitude: true + magnitude: 0.1 + magnitudeVariation: 0.1 + } + acceleration: TargetDirection { + targetX: particles.width/2 + targetY: particles.height/2 + targetVariation: 200 + proportionalMagnitude: true + magnitude: 0.1 + magnitudeVariation: 0.1 + } + } + } +} diff --git a/plugins/presenter/assets.qrc b/plugins/presenter/assets.qrc new file mode 100644 index 000000000..20bbadc24 --- /dev/null +++ b/plugins/presenter/assets.qrc @@ -0,0 +1,7 @@ + + + + + Presenter.qml + + diff --git a/plugins/presenter/kdeconnect_presenter.json b/plugins/presenter/kdeconnect_presenter.json new file mode 100644 index 000000000..bd2fb9dfe --- /dev/null +++ b/plugins/presenter/kdeconnect_presenter.json @@ -0,0 +1,21 @@ +{ + "KPlugin": { + "Authors": [ + { + "Email": "aleixpol@kde.org", + "Name": "Aleix Pol" + } + ], + "Description": "", + "EnabledByDefault": true, + "Icon": "view-presentation", + "Id": "kdeconnect_presenter", + "License": "GPL", + "Name": "Presenter", + "ServiceTypes": [ "KdeConnect/Plugin" ] + }, + "X-KdeConnect-OutgoingPacketType": [], + "X-KdeConnect-SupportedPacketType": [ + "kdeconnect.presenter" + ] +} diff --git a/plugins/presenter/presenterplugin.cpp b/plugins/presenter/presenterplugin.cpp new file mode 100644 index 000000000..abbc88e1d --- /dev/null +++ b/plugins/presenter/presenterplugin.cpp @@ -0,0 +1,93 @@ +/** + * Copyright 2019 Aleix Pol Gonzalez + * + * 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) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * 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 . + */ + +#include "presenterplugin.h" + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +K_PLUGIN_CLASS_WITH_JSON(PresenterPlugin, "kdeconnect_presenter.json") + +Q_LOGGING_CATEGORY(KDECONNECT_PLUGIN_PRESENT, "kdeconnect.plugin.presenter") + +class PresenterView : public QQuickView +{ +public: + PresenterView() { + setFlags(flags() | Qt::WindowFlags(Qt::WA_TranslucentBackground)); + setClearBeforeRendering(true); + setColor(QColor(Qt::transparent)); + + setResizeMode(QQuickView::SizeViewToRootObject); + setSource(QUrl(QStringLiteral("qrc:/presenter/Presenter.qml"))); + + const auto ourErrors = errors(); + for (const auto &error : ourErrors) { + qCWarning(KDECONNECT_PLUGIN_PRESENT) << "error" << error.description() << error.url() << error.line() << error.column(); + } + } +}; + +PresenterPlugin::PresenterPlugin(QObject* parent, const QVariantList& args) + : KdeConnectPlugin(parent, args) + , m_view(nullptr) + , m_timer(new QTimer(this)) +{ + m_timer->setInterval(2000); + m_timer->setSingleShot(true); +} + +PresenterPlugin::~PresenterPlugin() +{ +} + +bool PresenterPlugin::receivePacket(const NetworkPacket& np) +{ + if (!m_view) { + m_view = new PresenterView; + m_view->showFullScreen(); + connect(this, &QObject::destroyed, m_view, &QObject::deleteLater); + connect(m_timer, &QTimer::timeout, m_view, &QObject::deleteLater); + } + + auto screenSize = m_view->screen()->size(); + auto ratio = screenSize.width()/screenSize.height(); + + m_timer->start(); + + auto object = m_view->rootObject(); + object->setProperty("xPos", np.get(QStringLiteral("px"))/2 + 0.5); + object->setProperty("yPos", np.get(QStringLiteral("py"))/2 + 0.5); + return true; +} + +#include "presenterplugin.moc" + diff --git a/plugins/presenter/presenterplugin.h b/plugins/presenter/presenterplugin.h new file mode 100644 index 000000000..3cd9bb508 --- /dev/null +++ b/plugins/presenter/presenterplugin.h @@ -0,0 +1,52 @@ +/** + * Copyright 2019 Aleix Pol Gonzalez + * + * 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) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * 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 . + */ + +#ifndef PRESENTERPLUGIN_H +#define PRESENTERPLUGIN_H + +#include +#include +#include + +#include + +#define PACKET_TYPE_PRESENTER QStringLiteral("kdeconnect.presenter") + +class PresenterView; + +class Q_DECL_EXPORT PresenterPlugin + : public KdeConnectPlugin +{ + Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "org.kde.kdeconnect.device.presenter") + +public: + explicit PresenterPlugin(QObject* parent, const QVariantList& args); + ~PresenterPlugin() override; + + bool receivePacket(const NetworkPacket& np) override; + void connected() override {} + +private: + QPointer m_view; + QTimer* m_timer; +}; + +#endif diff --git a/plugins/presenter/test.qml b/plugins/presenter/test.qml new file mode 100644 index 000000000..c5ce59ad1 --- /dev/null +++ b/plugins/presenter/test.qml @@ -0,0 +1,21 @@ +import QtQuick 2.10 + +Rectangle +{ + color: "red" + width: 500 + height: 500 + + MouseArea { + id: mouse + anchors.fill: parent + hoverEnabled: true + } + + Presenter { + anchors.fill: parent + + xPos: mouse.mouseX/width + yPos: mouse.mouseY/height + } +}