From 9b05221285ce2369e1e87e88c86970b943797294 Mon Sep 17 00:00:00 2001 From: Dominik Holland Date: Thu, 31 Mar 2016 10:19:55 +0200 Subject: Added a ScreenManager plugin and use it in ClusterAndHUD.qml Currently there is no QML api for selecting which screen a window should use, this is a small helper which makes it possible to do that from QML. The ClusterAndHUD.qml now moves the cluster to the second Screen. This only works if the QPA handles the screens separately, which means in a modern desktop environment the screen will be set for the window, but it won't move there. As before the ClusterAndHUD.qml can only be started on system with a WindowManager running or a system with 2 screens Change-Id: Ia854dd420d72c8349c90b19971c88a27adab7bdf Reviewed-by: Nedim Hadzic --- ClusterAndHUD.qml | 5 ++- neptuneui.pro | 3 +- plugins/screenManager/plugin.cpp | 57 +++++++++++++++++++++++++++++++++ plugins/screenManager/qmldir | 2 ++ plugins/screenManager/screenManager.pro | 30 +++++++++++++++++ plugins/screenManager/screenmanager.cpp | 55 +++++++++++++++++++++++++++++++ plugins/screenManager/screenmanager.h | 54 +++++++++++++++++++++++++++++++ 7 files changed, 204 insertions(+), 2 deletions(-) create mode 100644 plugins/screenManager/plugin.cpp create mode 100644 plugins/screenManager/qmldir create mode 100644 plugins/screenManager/screenManager.pro create mode 100644 plugins/screenManager/screenmanager.cpp create mode 100644 plugins/screenManager/screenmanager.h diff --git a/ClusterAndHUD.qml b/ClusterAndHUD.qml index dca238d..b2d6b2e 100644 --- a/ClusterAndHUD.qml +++ b/ClusterAndHUD.qml @@ -31,6 +31,7 @@ import QtQuick 2.1 import QtQuick.Window 2.1 import io.qt.ApplicationManager 1.0 +import com.pelagicore.ScreenManager 1.0 import utils 1.0 import "sysui/Cluster" @@ -42,7 +43,7 @@ Main { title: "CSD" height: 720 width: 1920 - visible: true + visible: false color: "black" @@ -57,5 +58,7 @@ Main { Component.onCompleted: { WindowManager.registerOutputWindow(cluster) Style.withCluster = true + ScreenManager.setScreen(cluster, 1) + cluster.show() } } diff --git a/neptuneui.pro b/neptuneui.pro index 62c770b..d877abc 100644 --- a/neptuneui.pro +++ b/neptuneui.pro @@ -1,6 +1,7 @@ TEMPLATE = subdirs -SUBDIRS = plugins/datasource +SUBDIRS = plugins/datasource \ + plugins/screenManager qml.files = apps modules sysui i18n am-config.yaml DimAndCsd.qml Main* diff --git a/plugins/screenManager/plugin.cpp b/plugins/screenManager/plugin.cpp new file mode 100644 index 0000000..7b98066 --- /dev/null +++ b/plugins/screenManager/plugin.cpp @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Pelagicore AG +** Contact: http://www.qt.io/ or http://www.pelagicore.com/ +** +** This file is part of the Neptune IVI UI. +** +** $QT_BEGIN_LICENSE:GPL3-PELAGICORE$ +** Commercial License Usage +** Licensees holding valid commercial Pelagicore Neptune IVI UI +** licenses may use this file in accordance with the commercial license +** agreement provided with the Software or, alternatively, in accordance +** with the terms contained in a written agreement between you and +** Pelagicore. For licensing terms and conditions, contact us at: +** http://www.pelagicore.com. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3 requirements will be +** met: http://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +** SPDX-License-Identifier: GPL-3.0 +** +****************************************************************************/ + +#include +#include +#include "screenmanager.h" + +static QObject *screenManagerSingletonFactory(QQmlEngine *engine, QJSEngine *scriptEngine) +{ + Q_UNUSED(scriptEngine) + Q_UNUSED(engine) + + return new ScreenManager(); +} + +class HoundPlugin : public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface/1.0") +public: + virtual void registerTypes(const char *uri) + { + Q_ASSERT(QLatin1String(uri) == QLatin1String("com.pelagicore.ScreenManager")); + Q_UNUSED(uri); + + qmlRegisterSingletonType(uri, 1, 0, "ScreenManager", screenManagerSingletonFactory); + } +}; + +#include "plugin.moc" diff --git a/plugins/screenManager/qmldir b/plugins/screenManager/qmldir new file mode 100644 index 0000000..5472c91 --- /dev/null +++ b/plugins/screenManager/qmldir @@ -0,0 +1,2 @@ +module com.pelagicore.ScreenManager +plugin screenmanagerplugin diff --git a/plugins/screenManager/screenManager.pro b/plugins/screenManager/screenManager.pro new file mode 100644 index 0000000..2681be6 --- /dev/null +++ b/plugins/screenManager/screenManager.pro @@ -0,0 +1,30 @@ +TEMPLATE = lib +TARGET = screenmanagerplugin +QT += qml quick +CONFIG += qt plugin c++11 + +TARGET = $$qtLibraryTarget($$TARGET) +uri = com.pelagicore.ScreenManager + +SOURCES += \ + plugin.cpp \ + screenmanager.cpp \ + +HEADERS += \ + screenmanager.h \ + +OTHER_FILES = qmldir + +!equals(_PRO_FILE_PWD_, $$OUT_PWD) { + copy_qmldir.target = $$OUT_PWD/qmldir + copy_qmldir.depends = $$_PRO_FILE_PWD_/qmldir + copy_qmldir.commands = $(COPY_FILE) \"$$replace(copy_qmldir.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_qmldir.target, /, $$QMAKE_DIR_SEP)\" + QMAKE_EXTRA_TARGETS += copy_qmldir + PRE_TARGETDEPS += $$copy_qmldir.target +} + +qmldir.files = qmldir +installPath = $$[QT_INSTALL_QML]/$$replace(uri, \\., /) +qmldir.path = $$installPath +target.path = $$installPath +INSTALLS += target qmldir diff --git a/plugins/screenManager/screenmanager.cpp b/plugins/screenManager/screenmanager.cpp new file mode 100644 index 0000000..b993bf8 --- /dev/null +++ b/plugins/screenManager/screenmanager.cpp @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Pelagicore AG +** Contact: http://www.qt.io/ or http://www.pelagicore.com/ +** +** This file is part of the Neptune IVI UI. +** +** $QT_BEGIN_LICENSE:GPL3-PELAGICORE$ +** Commercial License Usage +** Licensees holding valid commercial Pelagicore Neptune IVI UI +** licenses may use this file in accordance with the commercial license +** agreement provided with the Software or, alternatively, in accordance +** with the terms contained in a written agreement between you and +** Pelagicore. For licensing terms and conditions, contact us at: +** http://www.pelagicore.com. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3 requirements will be +** met: http://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +** SPDX-License-Identifier: GPL-3.0 +** +****************************************************************************/ + +#include "screenmanager.h" +#include +#include +#include + +ScreenManager::ScreenManager(QObject *parent) + : QObject(parent) +{ + connect(qApp, &QGuiApplication::screenAdded, this, &ScreenManager::availableScreensChanged); + connect(qApp, &QGuiApplication::screenAdded, this, &ScreenManager::availableScreensChanged); +} + +void ScreenManager::setScreen(QWindow *window, int screen) +{ + if (screen >= 0 && screen < QGuiApplication::screens().count()) { + window->setScreen(QGuiApplication::screens().at(screen)); + } else { + qWarning() << "invalid Screen"; + } +} + +QList ScreenManager::availableScreens() const +{ + return QGuiApplication::screens(); +} diff --git a/plugins/screenManager/screenmanager.h b/plugins/screenManager/screenmanager.h new file mode 100644 index 0000000..83094dc --- /dev/null +++ b/plugins/screenManager/screenmanager.h @@ -0,0 +1,54 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Pelagicore AG +** Contact: http://www.qt.io/ or http://www.pelagicore.com/ +** +** This file is part of the Neptune IVI UI. +** +** $QT_BEGIN_LICENSE:GPL3-PELAGICORE$ +** Commercial License Usage +** Licensees holding valid commercial Pelagicore Neptune IVI UI +** licenses may use this file in accordance with the commercial license +** agreement provided with the Software or, alternatively, in accordance +** with the terms contained in a written agreement between you and +** Pelagicore. For licensing terms and conditions, contact us at: +** http://www.pelagicore.com. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3 requirements will be +** met: http://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +** SPDX-License-Identifier: GPL-3.0 +** +****************************************************************************/ + +#ifndef SCREENMANAGER_H +#define SCREENMANAGER_H + +#include +#include + +class ScreenManager : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QList availableScreens READ availableScreens NOTIFY availableScreensChanged) + +public: + explicit ScreenManager(QObject *parent = 0); + + Q_INVOKABLE int screenCount() const; + Q_INVOKABLE void setScreen(QWindow * window, int screen); + QList availableScreens() const; + +signals: + void availableScreensChanged(); +}; + +#endif // SCREENMANAGER_H -- cgit v1.2.3