diff --git a/ScreenPlay/CMakeLists.txt b/ScreenPlay/CMakeLists.txt index 91103e97..3c07b980 100644 --- a/ScreenPlay/CMakeLists.txt +++ b/ScreenPlay/CMakeLists.txt @@ -1,6 +1,6 @@ -cmake_minimum_required(VERSION 3.16.0) +cmake_minimum_required(VERSION 3.17 ) -project(ScreenPlay) +project(ScreenPlay LANGUAGES CXX) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOMOC ON) diff --git a/ScreenPlay/qml/Common/Slider.qml b/ScreenPlay/qml/Common/Slider.qml index 8cf5bac0..41ced50b 100644 --- a/ScreenPlay/qml/Common/Slider.qml +++ b/ScreenPlay/qml/Common/Slider.qml @@ -1,6 +1,6 @@ import QtQuick 2.12 import QtQuick.Layouts 1.12 -import QtQuick.Controls 2.2 +import QtQuick.Controls 2.2 as QQC import ScreenPlay 1.0 Item { @@ -9,11 +9,7 @@ Item { property string headline: "dummyHeandline" property string iconSource: "qrc:/assets/icons/icon_volume.svg" - property alias value: slider.value - - property alias from: slider.from - property alias to: slider.to - property alias stepSize: slider.stepSize + property alias slider: slider Text { id: txtHeadline @@ -48,14 +44,14 @@ Item { Layout.alignment: Qt.AlignVCenter } - Slider { + QQC.Slider { id: slider stepSize: 0.01 from: 0 value: 1 + to: 1 Layout.fillWidth: true Layout.alignment: Qt.AlignVCenter - to: 1 } Text { diff --git a/ScreenPlay/qml/Installed/Sidebar.qml b/ScreenPlay/qml/Installed/Sidebar.qml index 59b74d16..45606810 100644 --- a/ScreenPlay/qml/Installed/Sidebar.qml +++ b/ScreenPlay/qml/Installed/Sidebar.qml @@ -269,7 +269,7 @@ Item { availableHeight: height fontSize: 11 onActiveMonitorsChanged: { - if(isWidget()){ + if (isWidget()) { btnSetWallpaper.enabled = true return } @@ -281,10 +281,13 @@ Item { SP.Slider { id: sliderVolume - stepSize: 0.01 - from: 0 - value: 1 - to: 1 + slider { + stepSize: 0.01 + from: 0 + value: 1 + to: 1 + } + Layout.fillWidth: true headline: qsTr("Set Volume") } @@ -374,12 +377,14 @@ Item { ScreenPlay.screenPlayManager.createWallpaper( root.type, cbVideoFillMode.currentValue, absoluteStoragePath, previewImage, - screenFile, activeMonitors, volume, true) + screenFile, activeMonitors, volume, + 1.0, {}, true) } if (root.isWidget()) { ScreenPlay.screenPlayManager.createWidget( - type, Qt.point(0,0), absoluteStoragePath, previewImage, true) + type, Qt.point(0, 0), absoluteStoragePath, + previewImage, {}, true) } root.state = "inactive" diff --git a/ScreenPlay/qml/Monitors/DefaultVideoControls.qml b/ScreenPlay/qml/Monitors/DefaultVideoControls.qml index f5d49dc3..0f37e7d2 100644 --- a/ScreenPlay/qml/Monitors/DefaultVideoControls.qml +++ b/ScreenPlay/qml/Monitors/DefaultVideoControls.qml @@ -30,20 +30,24 @@ ColumnLayout { SP.Slider { headline: qsTr("Volume") - onValueChanged: ScreenPlay.screenPlayManager.setWallpaperValueAtMonitorIndex( - activeMonitorIndex, "volume", value) + slider.onMoved: { + print("MODEV") + ScreenPlay.screenPlayManager.setWallpaperValueAtMonitorIndex( + activeMonitorIndex, "volume", slider.value) + } + Layout.fillWidth: true } SP.Slider { headline: qsTr("Playback rate") - onValueChanged: ScreenPlay.screenPlayManager.setWallpaperValueAtMonitorIndex( - activeMonitorIndex, "playbackRate", value) + slider.onMoved: ScreenPlay.screenPlayManager.setWallpaperValueAtMonitorIndex( + activeMonitorIndex, "playbackRate", slider.value) Layout.fillWidth: true } SP.Slider { headline: qsTr("Current Video Time") - onValueChanged: ScreenPlay.screenPlayManager.setWallpaperValueAtMonitorIndex( - activeMonitorIndex, "currentTime", value) + slider.onMoved: ScreenPlay.screenPlayManager.setWallpaperValueAtMonitorIndex( + activeMonitorIndex, "currentTime", slider.value) Layout.fillWidth: true } ColumnLayout { @@ -93,7 +97,7 @@ ColumnLayout { "text": qsTr("Cover") }, { "value": FillMode.Scale_Down, - "text": qsTr("Scale-Down") + "text": qsTr("Scale_Down") }] } } diff --git a/ScreenPlay/qml/Monitors/Monitors.qml b/ScreenPlay/qml/Monitors/Monitors.qml index 087c3b22..ffe25431 100644 --- a/ScreenPlay/qml/Monitors/Monitors.qml +++ b/ScreenPlay/qml/Monitors/Monitors.qml @@ -96,24 +96,8 @@ Item { } Connections { target: ScreenPlay.screenPlayManager - function onProjectSettingsListModelResult(found, listModel, type) { - - customPropertiesGridView.model = null - if (!found) { - videoControlWrapper.state = "hidden" - customPropertiesGridView.state = "hidden" - return - } - - videoControlWrapper.state = "visible" + function onProjectSettingsListModelResult(listModel) { customPropertiesGridView.model = listModel - if (type === InstalledType.VideoWallpaper) { - customPropertiesGridView.state = "hidden" - videoControlWrapper.state = "visible" - } else { - customPropertiesGridView.state = "visible" - videoControlWrapper.state = "hidden" - } } } } @@ -181,19 +165,6 @@ Item { left: itmLeftWrapper.right } - DefaultVideoControls { - id: videoControlWrapper - activeMonitorIndex: monitors.activeMonitorIndex - anchors { - top: parent.top - topMargin: 10 - right: parent.right - rightMargin: 20 - left: parent.left - leftMargin: 20 - } - } - GridView { id: customPropertiesGridView boundsBehavior: Flickable.DragOverBounds @@ -219,41 +190,6 @@ Item { snapMode: ScrollBar.SnapOnRelease policy: ScrollBar.AlwaysOn } - - states: [ - State { - name: "visible" - PropertyChanges { - target: customPropertiesGridView - opacity: 1 - z: 1 - anchors.topMargin: 60 - } - }, - State { - name: "hidden" - PropertyChanges { - target: customPropertiesGridView - opacity: 0 - z: -1 - anchors.topMargin: -100 - } - } - ] - - transitions: [ - Transition { - from: "visible" - to: "hidden" - reversible: true - PropertyAnimation { - target: customPropertiesGridView - duration: 300 - easing.type: Easing.InOutQuart - properties: "anchors.topMargin, opacity" - } - } - ] } } MouseArea { diff --git a/ScreenPlay/qml/Monitors/MonitorsProjectSettingItem.qml b/ScreenPlay/qml/Monitors/MonitorsProjectSettingItem.qml index aa9310f7..03f805fe 100644 --- a/ScreenPlay/qml/Monitors/MonitorsProjectSettingItem.qml +++ b/ScreenPlay/qml/Monitors/MonitorsProjectSettingItem.qml @@ -5,7 +5,6 @@ import QtQuick.Dialogs 1.2 import QtQuick.Controls.Material 2.2 import QtQuick.Layouts 1.3 - import ScreenPlay 1.0 Item { @@ -25,7 +24,8 @@ Item { anchors.verticalCenter: parent.verticalCenter font.family: ScreenPlay.settings.font font.weight: Font.Normal - color: root.isHeadline ? Qt.darker(Material.foreground) : Material.foreground + color: root.isHeadline ? Qt.darker( + Material.foreground) : Material.foreground anchors { left: parent.left @@ -47,28 +47,33 @@ Item { return } - var obj = JSON.parse(root.value.toString()) + if (root.isHeadline) + return - if (obj["text"]) { - txtDescription.text = obj["text"] - } - switch (obj["type"]) { - case "slider": - loader.sourceComponent = compSlider - loader.item.from = obj["from"] - loader.item.to = obj["to"] - loader.item.value = obj["value"] - loader.item.stepSize = obj["stepSize"] - break - case "bool": - loader.sourceComponent = compCheckbox - loader.item.value = obj["value"] - break - case "color": - loader.sourceComponent = compColorpicker - loader.item.value = obj["value"] - break + for (let item in root.value) { + // print(item.toString()) + switch (item["type"]) { + case "slider": + loader.sourceComponent = compSlider + loader.item.from = obj["from"] + loader.item.to = obj["to"] + loader.item.value = obj["value"] + loader.item.stepSize = obj["stepSize"] + break + case "bool": + loader.sourceComponent = compCheckbox + loader.item.value = obj["value"] + break + case "color": + loader.sourceComponent = compColorpicker + loader.item.value = obj["value"] + break + } + + if (item["text"]) { + txtDescription.text = obj["text"] + } } } @@ -88,7 +93,7 @@ Item { right: parent.right verticalCenter: parent.verticalCenter } - onCheckedChanged: { + onCheckedChanged: { ScreenPlay.screenPlayManager.setWallpaperValueAtMonitorIndex( selectedMonitor, name, checkbox.checked) } @@ -161,9 +166,9 @@ Item { anchors { verticalCenter: parent.verticalCenter - right:txtSliderValue.left + right: txtSliderValue.left rightMargin: 20 - left:parent.left + left: parent.left leftMargin: 20 } @@ -176,7 +181,7 @@ Item { } Text { id: txtSliderValue - color: Material.foreground + color: Material.foreground horizontalAlignment: Text.AlignRight font.family: ScreenPlay.settings.font anchors { diff --git a/ScreenPlay/qml/Workshop/Workshop.qml b/ScreenPlay/qml/Workshop/Workshop.qml index 62020569..a2fc9cfd 100644 --- a/ScreenPlay/qml/Workshop/Workshop.qml +++ b/ScreenPlay/qml/Workshop/Workshop.qml @@ -12,4 +12,5 @@ Item { anchors.fill: parent } + } diff --git a/ScreenPlay/src/globalvariables.h b/ScreenPlay/src/globalvariables.h index faff2464..a44d0662 100644 --- a/ScreenPlay/src/globalvariables.h +++ b/ScreenPlay/src/globalvariables.h @@ -101,7 +101,7 @@ namespace FillMode { class GlobalVariables : public QObject { Q_OBJECT - Q_PROPERTY(QVersionNumber version READ version) + Q_PROPERTY(QVersionNumber version READ version CONSTANT) Q_PROPERTY(QUrl localStoragePath READ localStoragePath WRITE setLocalStoragePath NOTIFY localStoragePathChanged) Q_PROPERTY(QUrl localSettingsPath READ localSettingsPath WRITE setLocalSettingsPath NOTIFY localSettingsPathChanged) Q_PROPERTY(QUrl wallpaperExecutablePath READ wallpaperExecutablePath WRITE setWallpaperExecutablePath NOTIFY wallpaperExecutablePathChanged) diff --git a/ScreenPlay/src/monitorlistmodel.h b/ScreenPlay/src/monitorlistmodel.h index 1a9c8eaf..e1830145 100644 --- a/ScreenPlay/src/monitorlistmodel.h +++ b/ScreenPlay/src/monitorlistmodel.h @@ -37,7 +37,6 @@ #include #include #include -#include #include #include #include @@ -110,6 +109,12 @@ public: std::optional getAppIDByMonitorIndex(const int index) const; + QRect getAbsoluteDesktopSize() const + { + auto* app = static_cast(QApplication::instance()); + return app->screens().at(0)->availableVirtualGeometry(); + } + signals: void monitorReloadCompleted(); void setNewActiveMonitor(int index, QString path); @@ -133,12 +138,6 @@ public slots: reset(); } - QRect getAbsoluteDesktopSize() const - { - auto* app = static_cast(QApplication::instance()); - return app->screens().at(0)->availableVirtualGeometry(); - } - private: void loadMonitors(); diff --git a/ScreenPlay/src/projectfile.h b/ScreenPlay/src/projectfile.h index 987e3fe5..b588ed44 100644 --- a/ScreenPlay/src/projectfile.h +++ b/ScreenPlay/src/projectfile.h @@ -34,7 +34,6 @@ #pragma once -#include "globalvariables.h" #include #include #include @@ -44,6 +43,9 @@ #include #include +#include "globalvariables.h" +#include "util.h" + /*! \class ProjectFile \brief In ScreenPlay every Wallpaper, Scene or Widget has an project.json to store its configuration @@ -99,42 +101,14 @@ struct ProjectFile { if (!obj.contains("type")) return; - QString type = obj.value("type").toString(); - if (type.endsWith("Wallpaper")) { - if (type.startsWith("video")) { - m_searchType = SearchType::SearchType::Wallpaper; - m_type = InstalledType::InstalledType::VideoWallpaper; - return; - } - m_searchType = SearchType::SearchType::Scenes; - if (type.startsWith("qml")) { - m_type = InstalledType::InstalledType::QMLWallpaper; - return; - } - if (type.startsWith("html")) { - m_type = InstalledType::InstalledType::HTMLWallpaper; - return; - } - if (type.startsWith("godot")) { - m_type = InstalledType::InstalledType::GodotWallpaper; - return; - } + auto type = Util::getInstalledTypeFromString(obj.value("type").toString()); + if (!type) { + qWarning() << "Type could not parsed from: " << *type << folderName; + return; } - if (type.endsWith("Widget")) { - m_searchType = SearchType::SearchType::Widget; - if (type.startsWith("qml")) { - m_type = InstalledType::InstalledType::QMLWidget; - return; - } - if (type.startsWith("html")) { - m_type = InstalledType::InstalledType::HTMLWidget; - return; - } - } - - - qWarning() << "Type could not parsed from: " << type << folderName; + m_type = *type; + m_searchType = Util::getSearchTypeFromInstalledType(m_type); } ProjectFile() { } diff --git a/ScreenPlay/src/projectsettingslistitem.h b/ScreenPlay/src/projectsettingslistitem.h index f5d064c0..81e0d751 100644 --- a/ScreenPlay/src/projectsettingslistitem.h +++ b/ScreenPlay/src/projectsettingslistitem.h @@ -34,7 +34,12 @@ #pragma once +#include +#include +#include +#include #include +#include #include namespace ScreenPlay { @@ -47,20 +52,107 @@ namespace ScreenPlay { */ -struct ProjectSettingsListItem { - - ProjectSettingsListItem( - const QString& name, - const bool isHeadline, - const QVariant& value) +struct IListItem { + //MOC complains otherwise WTF + bool operator!=(const IListItem& val) { - m_name = name; - m_isHeadline = isHeadline; - m_value = value; + return true; + } +}; + +struct SliderItem : public IListItem { + Q_GADGET + Q_PROPERTY(double from MEMBER m_from) + Q_PROPERTY(double to MEMBER m_to) + Q_PROPERTY(double stepSize MEMBER m_stepSize) + Q_PROPERTY(double value MEMBER m_value) +public: + double m_from = { 0.0 }; + double m_to = { 0.1 }; + double m_stepSize = { 0.1 }; + double m_value = { 0.0 }; +}; + +struct ColorItem : public IListItem { + Q_GADGET + Q_PROPERTY(QColor color MEMBER m_color) +public: + QColor m_color = { QColor::fromRgb(0, 0, 0) }; +}; +struct CheckBoxItem : public IListItem { + Q_GADGET + Q_PROPERTY(bool value MEMBER m_value) +public: + bool m_value = { false }; +}; +struct FileItem : public IListItem { + Q_GADGET + Q_PROPERTY(QUrl file MEMBER m_file) +public: + QUrl m_file = {}; +}; + +struct ProjectSettingsListItem { + Q_GADGET + Q_PROPERTY(IListItem item MEMBER m_item) +public: + ProjectSettingsListItem( + const QString& headline) + { + m_isHeadline = true; + m_key = headline; } - QString m_name; + ProjectSettingsListItem( + const QString& key, + const QJsonObject& obj) + { + m_isHeadline = false; + m_key = key; + QString type = obj.value("type").toString(); + qInfo() << type; + if (type == "slider") { + SliderItem item; + item.m_from = obj.value("from").toDouble(0); + item.m_to = obj.value("to").toDouble(1); + item.m_stepSize = obj.value("stepSize").toDouble(0.1); + item.m_value = obj.value("value").toDouble(1); + m_item = item; + return; + } + + if (type == "file") { + FileItem item; + item.m_file = obj.value("file").toString(); + m_item = item; + return; + } + + if (type == "color") { + ColorItem item; + item.m_color = { obj.value("file").toString() }; + m_item = item; + return; + } + + if (type == "bool") { + CheckBoxItem item; + + m_item = item; + return; + } + } + + QString m_key; bool m_isHeadline { false }; QVariant m_value; + IListItem m_item; + QVariant value() const + { + return m_value; + } + }; + + } diff --git a/ScreenPlay/src/projectsettingslistmodel.cpp b/ScreenPlay/src/projectsettingslistmodel.cpp index f04f3e72..f5f143a2 100644 --- a/ScreenPlay/src/projectsettingslistmodel.cpp +++ b/ScreenPlay/src/projectsettingslistmodel.cpp @@ -35,12 +35,40 @@ namespace ScreenPlay { */ /*! - Constructor + Constructor when loading properties from settings.json */ -ProjectSettingsListModel::ProjectSettingsListModel(QString file, QObject* parent) - : QAbstractListModel(parent) + +void ProjectSettingsListModel::init(const InstalledType::InstalledType& type, const QJsonObject& properties) { - init(file); + if (type == InstalledType::InstalledType::VideoWallpaper) { +// beginInsertRows(QModelIndex(), m_projectSettings.size(), m_projectSettings.size()); + +// m_projectSettings.append("General"); + +// if (properties.contains("volume")) +// append({"slider", properties.value("volume")}=; + +// if (properties.contains("playbackRate")) +// append("slider", properties.value("playbackRate").toObject()); +// endInsertRows(); + + } else { + for (QJsonObject::const_iterator itParent = properties.begin(); itParent != properties.end(); itParent++) { + + // The first object is always a category + const QJsonObject category = properties.value(itParent.key()).toObject(); + beginInsertRows(QModelIndex(), m_projectSettings.size(), m_projectSettings.size()); + m_projectSettings.append(ProjectSettingsListItem { itParent.key() }); + endInsertRows(); + // Children of this category + for (QJsonObject::const_iterator itChild = category.begin(); itChild != category.end(); itChild++) { + qInfo() << itChild.key() << itChild.value(); + beginInsertRows(QModelIndex(), m_projectSettings.size(), m_projectSettings.size()); + m_projectSettings.append(ProjectSettingsListItem {itChild.key(), itChild.value().toObject() }); + endInsertRows(); + } + } + } } int ProjectSettingsListModel::rowCount(const QModelIndex& parent) const @@ -63,7 +91,7 @@ QVariant ProjectSettingsListModel::data(const QModelIndex& index, int role) cons if (index.row() < rowCount()) switch (role) { case NameRole: - return m_projectSettings.at(rowIndex).m_name; + return m_projectSettings.at(rowIndex).m_key; case IsHeadlineRole: return m_projectSettings.at(rowIndex).m_isHeadline; case ValueRole: @@ -86,45 +114,26 @@ QHash ProjectSettingsListModel::roleNames() const return roles; } -/*! - Recursively loads the content of a project.json. - See also \l {https://kelteseth.gitlab.io/ScreenPlayDocs/project/project/} . - */ -void ProjectSettingsListModel::init(const QString& file) +QJsonObject ProjectSettingsListModel::getActiveSettingsJson() { - if (auto config = Util::openJsonFileToObject(file)) { - - QJsonObject obj = *config; - QJsonObject tmpParent; - - if (obj.contains("properties")) { - tmpParent = obj.value("properties").toObject(); - } else { - return; - } - - QJsonObject::iterator itParent, itChild; - for (itParent = tmpParent.begin(); itParent != tmpParent.end(); itParent++) { - - // The first object is always a category - QJsonObject tmpChildObj = tmpParent.value(itParent.key()).toObject(); - append(itParent.key(), true, ""); - - // Children of this category - for (itChild = tmpChildObj.begin(); itChild != tmpChildObj.end(); itChild++) { - append(itChild.key(), false, QJsonDocument(tmpChildObj.value(itChild.key()).toObject()).toJson()); - } - } - } else { - qWarning() << "Could not load: " << file << " for wallpaper settings!"; + if (m_projectSettings.isEmpty()) { + qWarning() << "Trying to read emppty projectSettings. Abort!"; + return {}; } + + QJsonObject obj; + for (const auto& itemCategory : m_projectSettings) { + QJsonObject category; + if (itemCategory.m_isHeadline) { + for (const auto& itemProperties : m_projectSettings) { + if (itemProperties.m_isHeadline) + continue; + category.insert(itemProperties.m_key, QJsonValue::fromVariant(itemProperties.m_value)); + } + obj.insert(itemCategory.m_key, category); + } + } + return obj; } -void ProjectSettingsListModel::append(QString name, bool isHeadline, QVariant value) -{ - beginInsertRows(QModelIndex(), m_projectSettings.size(), m_projectSettings.size()); - ProjectSettingsListItem tmpFile(name, isHeadline, value.toString()); - m_projectSettings.append(tmpFile); - endInsertRows(); -} } diff --git a/ScreenPlay/src/projectsettingslistmodel.h b/ScreenPlay/src/projectsettingslistmodel.h index 81e3a135..760e7b61 100644 --- a/ScreenPlay/src/projectsettingslistmodel.h +++ b/ScreenPlay/src/projectsettingslistmodel.h @@ -52,8 +52,6 @@ class ProjectSettingsListModel : public QAbstractListModel { Q_OBJECT public: - explicit ProjectSettingsListModel(QString file, QObject* parent = nullptr); - int rowCount(const QModelIndex& parent = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; QHash roleNames() const override; @@ -65,10 +63,8 @@ public: }; Q_ENUM(ProjectSettingsRole) - void init(const QString& file); - -public slots: - void append(QString name, bool isHeadline, QVariant value); + QJsonObject getActiveSettingsJson(); + void init(const InstalledType::InstalledType& type, const QJsonObject& properties); private: QVector m_projectSettings; diff --git a/ScreenPlay/src/screenplaymanager.cpp b/ScreenPlay/src/screenplaymanager.cpp index da55c0f3..c6cd77ec 100644 --- a/ScreenPlay/src/screenplaymanager.cpp +++ b/ScreenPlay/src/screenplaymanager.cpp @@ -32,6 +32,15 @@ ScreenPlayManager::ScreenPlayManager( if (!m_server->listen("ScreenPlay")) { qCritical("Could not open Local Socket with the name ScreenPlay!"); } + + // We limit the time we save via a Qtimer. This is because we can live update values like + // volume to the wallpaper very fast. This would be very imperformant for HDD user, so + // we limit ourself to m_saveLimiters interval below: + m_saveLimiter.setInterval(1000); + QObject::connect(&m_saveLimiter, &QTimer::timeout, this, &ScreenPlayManager::saveProfiles); + QObject::connect(this, &ScreenPlayManager::requestSaveProfiles, this, [this]() { + m_saveLimiter.start(); + }); } /*! @@ -76,20 +85,20 @@ void ScreenPlayManager::init( a \a fillMode, a \a type (htmlWallpaper, qmlWallpaper etc.), a \a saveToProfilesConfigFile bool only set to flase if we call the method when using via the settings on startup to skip a unnecessary save. */ -void ScreenPlayManager::createWallpaper( - const InstalledType::InstalledType type, +void ScreenPlayManager::createWallpaper(const InstalledType::InstalledType type, const FillMode::FillMode fillMode, const QString& absoluteStoragePath, const QString& previewImage, const QString& file, - QVector monitorIndex, + const QVector& monitorIndex, const float volume, + const float playbackRate, const QJsonObject& properties, const bool saveToProfilesConfigFile) { auto saveToProfile = qScopeGuard([=, this] { // Do not save on app start if (saveToProfilesConfigFile) { - saveProfiles(); + emit requestSaveProfiles(); } }); @@ -128,8 +137,7 @@ void ScreenPlayManager::createWallpaper( } } - std::shared_ptr wallpaper; - wallpaper = std::make_shared( + auto wallpaper = std::make_shared( monitorIndex, m_globalVariables, appID, @@ -137,11 +145,13 @@ void ScreenPlayManager::createWallpaper( previewImage, file, volume, + playbackRate, fillMode, type, + properties, m_settings->checkWallpaperVisible()); - QObject::connect(wallpaper.get(), &ScreenPlayWallpaper::requestSave, this, &ScreenPlayManager::saveProfiles); + QObject::connect(wallpaper.get(), &ScreenPlayWallpaper::requestSave, this, &ScreenPlayManager::requestSaveProfiles); m_screenPlayWallpapers.append(wallpaper); m_monitorListModel->setWallpaperActiveMonitor(wallpaper, monitorIndex); increaseActiveWallpaperCounter(); @@ -150,17 +160,17 @@ void ScreenPlayManager::createWallpaper( /*! \brief Creates a ScreenPlayWidget object via a \a absoluteStoragePath and a \a preview image (relative path). */ -void ScreenPlayManager::createWidget( - const InstalledType::InstalledType type, +void ScreenPlayManager::createWidget(const InstalledType::InstalledType type, const QPoint& position, const QString& absoluteStoragePath, const QString& previewImage, + const QJsonObject& properties, const bool saveToProfilesConfigFile) { auto saveToProfile = qScopeGuard([=, this] { // Do not save on app start if (saveToProfilesConfigFile) { - saveProfiles(); + emit requestSaveProfiles(); } }); @@ -171,8 +181,17 @@ void ScreenPlayManager::createWidget( qInfo() << "Path is empty, Abort! String: " << absoluteStoragePath; return; } - auto widget = std::make_shared(appID, m_globalVariables, position, path, previewImage, type); - QObject::connect(widget.get(), &ScreenPlayWidget::requestSave, this, &ScreenPlayManager::saveProfiles); + + auto widget = std::make_shared( + appID, + m_globalVariables, + position, + path, + previewImage, + properties, + type); + + QObject::connect(widget.get(), &ScreenPlayWidget::requestSave, this, &ScreenPlayManager::requestSaveProfiles); increaseActiveWidgetsCounter(); m_screenPlayWidgets.append(widget); } @@ -207,7 +226,7 @@ void ScreenPlayManager::removeAllWallpapers() m_monitorListModel->clearActiveWallpaper(); - saveProfiles(); + emit requestSaveProfiles(); setActiveWallpaperCounter(0); if (activeWallpaperCounter() != m_screenPlayWallpapers.length()) { if (m_telemetry) { @@ -233,7 +252,7 @@ void ScreenPlayManager::removeAllWidgets() if (!m_screenPlayWidgets.empty()) { closeAllWidgets(); m_screenPlayWidgets.clear(); - saveProfiles(); + emit requestSaveProfiles(); setActiveWidgetsCounter(0); } } @@ -247,7 +266,7 @@ bool ScreenPlayManager::removeWallpaperAt(int index) { if (auto appID = m_monitorListModel->getAppIDByMonitorIndex(index)) { - saveProfiles(); + emit requestSaveProfiles(); if (!closeWallpaper(*appID)) { qWarning() << "Could not close socket. Abort!"; @@ -263,7 +282,7 @@ bool ScreenPlayManager::removeWallpaperAt(int index) qWarning() << "Could not remove Wallpaper " << appIDCopy << " from wallpaper list!"; return false; } - saveProfiles(); + emit requestSaveProfiles(); return true; } if (m_telemetry) { @@ -282,13 +301,10 @@ void ScreenPlayManager::requestProjectSettingsAtMonitorIndex(const int index) if (uPtrWallpaper->screenNumber()[0] == index) { emit projectSettingsListModelResult( - true, - uPtrWallpaper->getProjectSettingsListModel(), - uPtrWallpaper->type()); + uPtrWallpaper->getProjectSettingsListModel()); return; } } - emit projectSettingsListModelResult(false); } /*! @@ -340,7 +356,7 @@ void ScreenPlayManager::newConnection() // Only after we receive the first message with appID and type we can set the shared reference to the // ScreenPlayWallpaper or ScreenPlayWidgets class QObject::connect(connection.get(), &SDKConnection::appConnected, this, [this](const SDKConnection* connection) { - for (const auto& client : m_clients) { + for (const auto& client : qAsConst(m_clients)) { if (client.get() == connection) { appConnected(client); return; @@ -350,7 +366,6 @@ void ScreenPlayManager::newConnection() m_clients.append(connection); } - /*! \brief Closes all wallpaper connection with the following type: \list @@ -409,23 +424,23 @@ bool ScreenPlayManager::closeWallpaper(const QString& appID) /*! \brief Sets a given \a value to a given \a key. The \a appID is used to identify the receiver socket. */ -void ScreenPlayManager::setWallpaperValue(QString appID, QString key, QString value) +void ScreenPlayManager::setWallpaperValue(const QString& appID, const QString& key, const QVariant& value) { for (const auto& wallpaper : m_screenPlayWallpapers) { if (wallpaper->appID() == appID) { - wallpaper->setWallpaperValue(key, value); + wallpaper->setWallpaperValue(key, value, true); } } } - /*! \brief Saves a given wallpaper \a newProfileObject to a \a profileName. We ignore the profileName argument because we currently only support one profile. Returns \c true if successfuly saved to profiles.json, otherwise \c false. */ void ScreenPlayManager::saveProfiles() { - + m_saveLimiter.stop(); + qInfo() << "Save profiles!"; QJsonArray wallpaper {}; for (const auto& activeWallpaper : m_screenPlayWallpapers) { wallpaper.append(activeWallpaper->getActiveSettingsJson()); @@ -534,13 +549,15 @@ void ScreenPlayManager::loadProfiles() const QString absolutePath = wallpaperObj.value("absolutePath").toString(); const QString fillModeString = wallpaperObj.value("fillMode").toString(); const QString previewImage = wallpaperObj.value("previewImage").toString(); + const float playbackRate = wallpaperObj.value("playbackRate").toDouble(1.0); const QString file = wallpaperObj.value("file").toString(); const QString typeString = wallpaperObj.value("type").toString(); + const QJsonObject properties = wallpaperObj.value("properties").toObject(); const auto type = QStringToEnum(typeString, InstalledType::InstalledType::VideoWallpaper); const auto fillMode = QStringToEnum(fillModeString, FillMode::FillMode::Cover); - createWallpaper(type, fillMode, absolutePath, previewImage, file, monitors, volume, false); + createWallpaper(type, fillMode, absolutePath, previewImage, file, monitors, volume, playbackRate, properties, false); monitors.clear(); } @@ -557,8 +574,9 @@ void ScreenPlayManager::loadProfiles() const int positionY = widgetObj.value("positionY").toInt(0); const QPoint position { positionX, positionY }; const auto type = QStringToEnum(typeString, InstalledType::InstalledType::QMLWidget); + const QJsonObject properties = widgetObj.value("properties").toObject(); - createWidget(type, position, absolutePath, previewImage, false); + createWidget(type, position, absolutePath, previewImage, properties, false); } } } diff --git a/ScreenPlay/src/screenplaymanager.h b/ScreenPlay/src/screenplaymanager.h index 52ac51bf..ebce5ffc 100644 --- a/ScreenPlay/src/screenplaymanager.h +++ b/ScreenPlay/src/screenplaymanager.h @@ -88,29 +88,34 @@ public: const std::shared_ptr& settings); signals: - void projectSettingsListModelResult( - const bool found, - ProjectSettingsListModel* li = nullptr, - const ScreenPlay::InstalledType::InstalledType type = ScreenPlay::InstalledType::InstalledType::VideoWallpaper); + void projectSettingsListModelResult(ScreenPlay::ProjectSettingsListModel* li = nullptr); void activeWallpaperCounterChanged(int activeWallpaperCounter); void activeWidgetsCounterChanged(int activeWidgetsCounter); + void requestSaveProfiles(); void requestRaise(); +private slots: + void saveProfiles(); + public slots: // moc needs full enum namespace info see QTBUG-58454 - void createWallpaper( - const ScreenPlay::InstalledType::InstalledType type, + void createWallpaper(const ScreenPlay::InstalledType::InstalledType type, const ScreenPlay::FillMode::FillMode fillMode, const QString& absoluteStoragePath, const QString& previewImage, const QString& file, - QVector monitorIndex, + const QVector& monitorIndex, const float volume, + const float playbackRate, + const QJsonObject& properties, const bool saveToProfilesConfigFile); - void createWidget(const ScreenPlay::InstalledType::InstalledType type, const QPoint& position, + void createWidget( + const ScreenPlay::InstalledType::InstalledType type, + const QPoint& position, const QString& absoluteStoragePath, const QString& previewImage, + const QJsonObject& properties, const bool saveToProfilesConfigFile); void removeAllWallpapers(); @@ -122,13 +127,12 @@ public slots: void setAllWallpaperValue(const QString& key, const QString& value); std::optional> getWallpaperByAppID(const QString& appID); - void saveProfiles(); void newConnection(); void closeAllWallpapers(); void closeAllWidgets(); void closeConntectionByType(const QStringList& list); bool closeWallpaper(const QString& appID); - void setWallpaperValue(QString appID, QString key, QString value); + void setWallpaperValue(const QString& appID, const QString& key, const QVariant& value); void setActiveWallpaperCounter(int activeWallpaperCounter) { @@ -198,6 +202,7 @@ private: int m_activeWidgetsCounter { 0 }; bool m_isAnotherScreenPlayInstanceRunning = false; + QTimer m_saveLimiter; }; } diff --git a/ScreenPlay/src/screenplaywallpaper.cpp b/ScreenPlay/src/screenplaywallpaper.cpp index 329d0f31..55f7a94f 100644 --- a/ScreenPlay/src/screenplaywallpaper.cpp +++ b/ScreenPlay/src/screenplaywallpaper.cpp @@ -13,20 +13,20 @@ namespace ScreenPlay { /*! \brief Constructor for video Wallpaper. */ -ScreenPlayWallpaper::ScreenPlayWallpaper( - const QVector& screenNumber, +ScreenPlayWallpaper::ScreenPlayWallpaper(const QVector& screenNumber, const std::shared_ptr& globalVariables, const QString& appID, const QString& absolutePath, const QString& previewImage, const QString& file, const float volume, + const float playbackRate, const FillMode::FillMode fillMode, const InstalledType::InstalledType type, + const QJsonObject& properties, const bool checkWallpaperVisible, QObject* parent) : QObject(parent) - , m_projectSettingsListModel { absolutePath + "/project.json" } , m_globalVariables { globalVariables } , m_screenNumber { screenNumber } , m_previewImage { previewImage } @@ -35,8 +35,30 @@ ScreenPlayWallpaper::ScreenPlayWallpaper( , m_appID { appID } , m_absolutePath { absolutePath } , m_file { file } - + , m_playbackRate { playbackRate } { + { + // If + QJsonObject projectSettingsListModelProperties; + + if (type == InstalledType::InstalledType::VideoWallpaper) { + projectSettingsListModelProperties.insert("volume", m_volume); + projectSettingsListModelProperties.insert("playbackRate", m_playbackRate); + } else { + if (properties.isEmpty()) { + auto obj = Util::openJsonFileToObject(absolutePath + "/project.json"); + if (!obj) + return; + + if (!obj->contains("properties")) + return; + projectSettingsListModelProperties = obj->value("properties").toObject(); + } else { + projectSettingsListModelProperties = properties; + } + } + m_projectSettingsListModel.init(type, projectSettingsListModelProperties); + } QObject::connect(&m_process, QOverload::of(&QProcess::finished), this, &ScreenPlayWallpaper::processExit); QObject::connect(&m_process, &QProcess::errorOccurred, this, &ScreenPlayWallpaper::processError); @@ -66,6 +88,7 @@ ScreenPlayWallpaper::ScreenPlayWallpaper( // Fixes issue 84 media key overlay " --disable-features=HardwareMediaKeyHandling" }; + qInfo() << proArgs; m_process.setArguments(proArgs); m_process.setProgram(m_globalVariables->wallpaperExecutablePath().toString()); @@ -80,14 +103,22 @@ QJsonObject ScreenPlayWallpaper::getActiveSettingsJson() } QJsonObject obj; + QJsonObject properties; + if (m_type == InstalledType::InstalledType::VideoWallpaper) { + obj.insert("fillMode", QVariant::fromValue(m_fillMode).toString()); + obj.insert("isLooping", m_isLooping); + obj.insert("volume", m_volume); + obj.insert("playbackRate", m_playbackRate); + } else { + auto properties = m_projectSettingsListModel.getActiveSettingsJson(); + if (!properties.isEmpty()) + obj.insert("properties", properties); + } obj.insert("file", m_file); obj.insert("absolutePath", m_absolutePath); - obj.insert("fillMode", QVariant::fromValue(m_fillMode).toString()); - obj.insert("isLooping", m_isLooping); obj.insert("monitors", screenNumber); obj.insert("previewImage", m_previewImage); obj.insert("type", QVariant::fromValue(m_type).toString()); - obj.insert("volume", m_volume); return obj; } @@ -109,23 +140,37 @@ void ScreenPlayWallpaper::processError(QProcess::ProcessError error) qDebug() << "EX: " << error; } -void ScreenPlayWallpaper::setWallpaperValue(const QString& key, const QString& value) +void ScreenPlayWallpaper::setWallpaperValue(const QString& key, const QVariant& value, const bool save) { QJsonObject obj; - obj.insert(key, value); + obj.insert(key, value.toString()); + + if (key == "volume") { + setVolume(value.toFloat()); + } + if (key == "playbackRate") { + setPlaybackRate(value.toFloat()); + } + if (key == "fillmode") { + setFillMode(QStringToEnum(value.toString(), FillMode::FillMode::Cover)); + } m_connection->sendMessage(QJsonDocument(obj).toJson(QJsonDocument::Compact)); -} - -ProjectSettingsListModel* ScreenPlayWallpaper::getProjectSettingsListModel() -{ - return &m_projectSettingsListModel; + qInfo() << "save" << save; + if (save) + emit requestSave(); } void ScreenPlayWallpaper::setSDKConnection(const std::shared_ptr& connection) { m_connection = connection; qInfo() << "App Wallpaper connected!"; + qInfo() << playbackRate() << (playbackRate() != 1.0); + QTimer::singleShot(500, [this]() { + if (playbackRate() != 1.0) { + setWallpaperValue("playbackRate", playbackRate(), false); + } + }); } void ScreenPlayWallpaper::replace( @@ -155,9 +200,8 @@ void ScreenPlayWallpaper::replace( obj.insert("file", file); obj.insert("checkWallpaperVisible", checkWallpaperVisible); - - m_connection->sendMessage(QJsonDocument(obj).toJson(QJsonDocument::Compact)); + emit requestSave(); } } diff --git a/ScreenPlay/src/screenplaywallpaper.h b/ScreenPlay/src/screenplaywallpaper.h index b52572a8..83624829 100644 --- a/ScreenPlay/src/screenplaywallpaper.h +++ b/ScreenPlay/src/screenplaywallpaper.h @@ -44,6 +44,7 @@ #include "globalvariables.h" #include "projectsettingslistmodel.h" #include "sdkconnection.h" +#include "util.h" namespace ScreenPlay { @@ -53,6 +54,7 @@ class ScreenPlayWallpaper : public QObject { Q_PROPERTY(QVector screenNumber READ screenNumber WRITE setScreenNumber NOTIFY screenNumberChanged) Q_PROPERTY(float volume READ volume WRITE setVolume NOTIFY volumeChanged) + Q_PROPERTY(float playbackRate READ playbackRate WRITE setPlaybackRate NOTIFY playbackRateChanged) Q_PROPERTY(bool isLooping READ isLooping WRITE setIsLooping NOTIFY isLoopingChanged) @@ -65,22 +67,29 @@ class ScreenPlayWallpaper : public QObject { Q_PROPERTY(InstalledType::InstalledType type READ type WRITE setType NOTIFY typeChanged) public: - explicit ScreenPlayWallpaper( - const QVector& screenNumber, + explicit ScreenPlayWallpaper(const QVector& screenNumber, const std::shared_ptr& globalVariables, const QString& appID, const QString& absolutePath, const QString& previewImage, const QString& file, - const float volume, + const float volume, const float playbackRate, const FillMode::FillMode fillMode, - const InstalledType::InstalledType type, + const InstalledType::InstalledType type, const QJsonObject& properties, const bool checkWallpaperVisible, QObject* parent = nullptr); - QJsonObject getActiveSettingsJson(); + void replace(const QString& absolutePath, + const QString& previewImage, + const QString& file, + const float volume, + const FillMode::FillMode fillMode, + const InstalledType::InstalledType type, + const bool checkWallpaperVisible); - bool m_isAnotherScreenPlayInstanceRunning { false }; + void setSDKConnection(const std::shared_ptr& connection); + + QJsonObject getActiveSettingsJson(); QVector screenNumber() const { @@ -127,17 +136,15 @@ public: return m_isLooping; } - ProjectSettingsListModel* getProjectSettingsListModel(); + ProjectSettingsListModel* getProjectSettingsListModel() + { + return &m_projectSettingsListModel; + } - void setSDKConnection(const std::shared_ptr& connection); - - void replace(const QString& absolutePath, - const QString& previewImage, - const QString& file, - const float volume, - const FillMode::FillMode fillMode, - const InstalledType::InstalledType type, - const bool checkWallpaperVisible); + float playbackRate() const + { + return m_playbackRate; + } signals: void screenNumberChanged(QVector screenNumber); @@ -151,11 +158,12 @@ signals: void volumeChanged(float volume); void isLoopingChanged(bool isLooping); void requestSave(); + void playbackRateChanged(float playbackRate); public slots: void processExit(int exitCode, QProcess::ExitStatus exitStatus); void processError(QProcess::ProcessError error); - void setWallpaperValue(const QString &key, const QString &value); + void setWallpaperValue(const QString& key, const QVariant& value, const bool save = false); void setScreenNumber(QVector screenNumber) { @@ -241,6 +249,15 @@ public slots: emit isLoopingChanged(m_isLooping); } + void setPlaybackRate(float playbackRate) + { + if (playbackRate < 0.0f || playbackRate > 1.0f) + return; + + m_playbackRate = playbackRate; + emit playbackRateChanged(m_playbackRate); + } + private: const std::shared_ptr& m_globalVariables; std::shared_ptr m_connection; @@ -256,5 +273,6 @@ private: QString m_file; float m_volume { 1.0f }; bool m_isLooping { true }; + float m_playbackRate { 1.0f }; }; } diff --git a/ScreenPlay/src/screenplaywidget.cpp b/ScreenPlay/src/screenplaywidget.cpp index 7810c46a..13bca9f7 100644 --- a/ScreenPlay/src/screenplaywidget.cpp +++ b/ScreenPlay/src/screenplaywidget.cpp @@ -19,6 +19,7 @@ ScreenPlayWidget::ScreenPlayWidget( const QPoint& position, const QString& absolutePath, const QString& previewImage, + const QJsonObject& properties, const InstalledType::InstalledType type) : QObject { nullptr } , m_globalVariables { globalVariables } @@ -28,6 +29,25 @@ ScreenPlayWidget::ScreenPlayWidget( , m_type { type } , m_absolutePath { absolutePath } { + { + // If + QJsonObject projectSettingsListModelProperties; + + if (properties.isEmpty()) { + auto obj = Util::openJsonFileToObject(absolutePath + "/project.json"); + if (!obj) + return; + + if (!obj->contains("properties")) + return; + projectSettingsListModelProperties = obj->value("properties").toObject(); + } else { + projectSettingsListModelProperties = properties; + } + + m_projectSettingsListModel.init(type, projectSettingsListModelProperties); + } + const QStringList proArgs { m_absolutePath, QString { "appID=" + m_appID }, @@ -39,8 +59,6 @@ ScreenPlayWidget::ScreenPlayWidget( m_process.setArguments(proArgs); m_process.setProgram(m_globalVariables->widgetExecutablePath().path()); - qDebug() << proArgs; - QObject::connect(&m_process, &QProcess::errorOccurred, this, [](QProcess::ProcessError error) { qDebug() << "error: " << error; }); @@ -62,6 +80,11 @@ void ScreenPlayWidget::setSDKConnection(const std::shared_ptr& co QJsonObject ScreenPlayWidget::getActiveSettingsJson() { QJsonObject obj; + + auto properties = m_projectSettingsListModel.getActiveSettingsJson(); + if (!properties.isEmpty()) + obj.insert("properties", properties); + obj.insert("previewImage", m_previewImage); obj.insert("absolutePath", m_absolutePath); obj.insert("positionX", m_position.x()); diff --git a/ScreenPlay/src/screenplaywidget.h b/ScreenPlay/src/screenplaywidget.h index f2d536b2..7c84a13b 100644 --- a/ScreenPlay/src/screenplaywidget.h +++ b/ScreenPlay/src/screenplaywidget.h @@ -45,6 +45,7 @@ #include #include "globalvariables.h" +#include "projectsettingslistmodel.h" #include "sdkconnection.h" namespace ScreenPlay { @@ -63,7 +64,7 @@ public: const std::shared_ptr& globalVariables, const QPoint& position, const QString& absolutePath, - const QString& previewImage, + const QString& previewImage, const QJsonObject& properties, const InstalledType::InstalledType type); ~ScreenPlayWidget() { } @@ -98,6 +99,11 @@ public: public slots: QJsonObject getActiveSettingsJson(); + ProjectSettingsListModel* getProjectSettingsListModel() + { + return &m_projectSettingsListModel; + } + void setPreviewImage(QString previewImage) { if (m_previewImage == previewImage) @@ -154,6 +160,7 @@ signals: private: const std::shared_ptr& m_globalVariables; std::shared_ptr m_connection; + ProjectSettingsListModel m_projectSettingsListModel; QProcess m_process; QString m_previewImage; diff --git a/ScreenPlay/src/sdkconnection.h b/ScreenPlay/src/sdkconnection.h index 3e32ff9f..525fc3c9 100644 --- a/ScreenPlay/src/sdkconnection.h +++ b/ScreenPlay/src/sdkconnection.h @@ -98,7 +98,7 @@ signals: void typeChanged(QString type); void requestDecreaseWidgetCount(); void requestRaise(); - void appConnected(const SDKConnection* connection); + void appConnected(const ScreenPlay::SDKConnection* connection); void jsonMessageReceived(const QJsonObject obj); public slots: diff --git a/ScreenPlay/src/settings.h b/ScreenPlay/src/settings.h index c01acedd..a0de7ac1 100644 --- a/ScreenPlay/src/settings.h +++ b/ScreenPlay/src/settings.h @@ -197,9 +197,9 @@ signals: void anonymousTelemetryChanged(bool anonymousTelemetry); void checkWallpaperVisibleChanged(bool checkWallpaperVisible); void videoFillModeChanged(ScreenPlay::FillMode::FillMode videoFillMode); - void languageChanged(Language language); + void languageChanged(ScreenPlay::Settings::Language language); void fontChanged(QString font); - void themeChanged(Theme theme); + void themeChanged(ScreenPlay::Settings::Theme theme); public slots: void writeJsonFileFromResource(const QString& filename); @@ -325,7 +325,7 @@ public slots: emit videoFillModeChanged(m_videoFillMode); } - void setLanguage(Language language) + void setLanguage(ScreenPlay::Settings::Language language) { if (m_language == language) return; @@ -345,7 +345,7 @@ public slots: emit fontChanged(m_font); } - void setTheme(Theme theme) + void setTheme(ScreenPlay::Settings::Theme theme) { if (m_theme == theme) return; diff --git a/ScreenPlay/src/util.cpp b/ScreenPlay/src/util.cpp index 8f345040..9d69a25d 100644 --- a/ScreenPlay/src/util.cpp +++ b/ScreenPlay/src/util.cpp @@ -175,7 +175,7 @@ bool Util::writeJsonObjectToFile(const QString& absoluteFilePath, const QJsonObj QString Util::toString(const QStringList& list) { QString out; - for (const auto &string : list) { + for (const auto& string : list) { out += " " + string; } return out; @@ -326,8 +326,8 @@ void Util::downloadFFMPEG() ZipEntry entryFFMPEG; std::string entryFFMPEGPath; #ifdef Q_OS_WIN - entryFFMPEG = archive->getEntry(ffmpegVersion.toStdString() + "-win64-static/bin/ffmpeg.exe"); - entryFFMPEGPath = path + "ffmpeg.exe"; + entryFFMPEG = archive->getEntry(ffmpegVersion.toStdString() + "-win64-static/bin/ffmpeg.exe"); + entryFFMPEGPath = path + "ffmpeg.exe"; #elif defined(Q_OS_OSX) entryFFMPEG = archive->getEntry(ffmpegVersion.toStdString() +"-macos64-static/bin/ffmpeg"); entryFFMPEGPath = path + "ffmpeg"; @@ -347,8 +347,8 @@ void Util::downloadFFMPEG() return; } - ZipEntry entryFFPROBE; - std::string entryFFPROBEPath; + ZipEntry entryFFPROBE; + std::string entryFFPROBEPath; #ifdef Q_OS_WIN entryFFPROBE = archive->getEntry(ffmpegVersion.toStdString() + "-win64-static/bin/ffprobe.exe"); entryFFPROBEPath = path + "ffprobe.exe"; @@ -377,6 +377,56 @@ void Util::downloadFFMPEG() }); } +SearchType::SearchType Util::getSearchTypeFromInstalledType(const InstalledType::InstalledType type) +{ + using InstalledType::InstalledType; + using SearchType::SearchType; + + switch (type) { + case InstalledType::GodotWallpaper: + case InstalledType::HTMLWallpaper: + case InstalledType::QMLWallpaper: + return SearchType::Scenes; + case InstalledType::VideoWallpaper: + return SearchType::Wallpaper; + case InstalledType::HTMLWidget: + case InstalledType::QMLWidget: + return SearchType::Widget; + case InstalledType::Unknown: + default: + return SearchType::All; + } +} + +std::optional Util::getInstalledTypeFromString(const QString& type) +{ + if (type.endsWith("Wallpaper")) { + if (type.startsWith("video", Qt::CaseInsensitive)) { + return InstalledType::InstalledType::VideoWallpaper; + } + if (type.startsWith("qml", Qt::CaseInsensitive)) { + return InstalledType::InstalledType::QMLWallpaper; + } + if (type.startsWith("html", Qt::CaseInsensitive)) { + return InstalledType::InstalledType::HTMLWallpaper; + } + if (type.startsWith("godot", Qt::CaseInsensitive)) { + return InstalledType::InstalledType::GodotWallpaper; + } + } + + if (type.endsWith("Widget")) { + if (type.startsWith("qml", Qt::CaseInsensitive)) { + return InstalledType::InstalledType::QMLWidget; + } + if (type.startsWith("html", Qt::CaseInsensitive)) { + return InstalledType::InstalledType::HTMLWidget; + } + } + + return std::nullopt; +} + /*! \brief Basic logging to the GUI. No logging is done to a log file for now. This string can be copied in the settings tab in the UI. diff --git a/ScreenPlay/src/util.h b/ScreenPlay/src/util.h index 98445b8d..99204287 100644 --- a/ScreenPlay/src/util.h +++ b/ScreenPlay/src/util.h @@ -126,7 +126,7 @@ signals: void allLicenseLoaded(QString licensesText); void allDataProtectionLoaded(QString dataProtectionText); void ffmpegAvailableChanged(bool ffmpegAvailable); - void aquireFFMPEGStatusChanged(AquireFFMPEGStatus aquireFFMPEGStatus); + void aquireFFMPEGStatusChanged(ScreenPlay::Util::AquireFFMPEGStatus aquireFFMPEGStatus); void debugMessagesChanged(QString debugMessages); public slots: @@ -138,6 +138,8 @@ public slots: void downloadFFMPEG(); + static SearchType::SearchType getSearchTypeFromInstalledType(const InstalledType::InstalledType type); + static std::optional getInstalledTypeFromString(const QString& type); static std::optional parseQByteArrayToQJsonObject(const QByteArray& byteArray); static std::optional openJsonFileToObject(const QString& path); static std::optional openJsonFileToString(const QString& path); @@ -173,7 +175,7 @@ public slots: emit ffmpegAvailableChanged(m_ffmpegAvailable); } - void setAquireFFMPEGStatus(AquireFFMPEGStatus aquireFFMPEGStatus) + void setAquireFFMPEGStatus(ScreenPlay::Util::AquireFFMPEGStatus aquireFFMPEGStatus) { if (m_aquireFFMPEGStatus == aquireFFMPEGStatus) return; diff --git a/ScreenPlaySDK/CMakeLists.txt b/ScreenPlaySDK/CMakeLists.txt index 762c2b21..3b32e74a 100644 --- a/ScreenPlaySDK/CMakeLists.txt +++ b/ScreenPlaySDK/CMakeLists.txt @@ -1,4 +1,6 @@ -project(ScreenPlaySDK) +cmake_minimum_required(VERSION 3.17 ) + +project(ScreenPlaySDK LANGUAGES CXX) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOMOC ON) diff --git a/ScreenPlaySysInfo/CMakeLists.txt b/ScreenPlaySysInfo/CMakeLists.txt index 2222ff5e..6cf2c974 100644 --- a/ScreenPlaySysInfo/CMakeLists.txt +++ b/ScreenPlaySysInfo/CMakeLists.txt @@ -1,4 +1,6 @@ -project(ScreenPlaySysInfo) +cmake_minimum_required(VERSION 3.17 ) + +project(ScreenPlaySysInfo LANGUAGES CXX) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOMOC ON) diff --git a/ScreenPlayWallpaper/CMakeLists.txt b/ScreenPlayWallpaper/CMakeLists.txt index d496796c..6ee402b7 100644 --- a/ScreenPlayWallpaper/CMakeLists.txt +++ b/ScreenPlayWallpaper/CMakeLists.txt @@ -1,4 +1,6 @@ -project(ScreenPlayWallpaper) +cmake_minimum_required(VERSION 3.17 ) + +project(ScreenPlayWallpaper LANGUAGES CXX) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOMOC ON) diff --git a/ScreenPlayWidget/CMakeLists.txt b/ScreenPlayWidget/CMakeLists.txt index e1aff08b..944d2517 100644 --- a/ScreenPlayWidget/CMakeLists.txt +++ b/ScreenPlayWidget/CMakeLists.txt @@ -1,4 +1,6 @@ -project(ScreenPlayWidget) +cmake_minimum_required(VERSION 3.17 ) + +project(ScreenPlayWidget LANGUAGES CXX) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOMOC ON) diff --git a/ScreenPlayWidget/src/widgetwindow.cpp b/ScreenPlayWidget/src/widgetwindow.cpp index 8098f6e9..28884cc5 100644 --- a/ScreenPlayWidget/src/widgetwindow.cpp +++ b/ScreenPlayWidget/src/widgetwindow.cpp @@ -29,26 +29,6 @@ WidgetWindow::WidgetWindow( setType(type); - { - // We limit ourself to only update the position every 500ms! - auto sendPositionUpdate = [this]() { - m_positionMessageLimiter.stop(); - if (!m_sdk->isConnected()) - return; - - QJsonObject obj; - obj.insert("messageType", "positionUpdate"); - obj.insert("positionX", m_window.x()); - obj.insert("positionY", m_window.y()); - m_sdk->sendMessage(obj); - }; - m_positionMessageLimiter.setInterval(500); - - QObject::connect(&m_positionMessageLimiter, &QTimer::timeout, this, sendPositionUpdate); - QObject::connect(&m_window, &QWindow::xChanged, this, [this]() { m_positionMessageLimiter.start(); }); - QObject::connect(&m_window, &QWindow::yChanged, this, [this]() { m_positionMessageLimiter.start(); }); - } - Qt::WindowFlags flags = m_window.flags(); m_window.setFlags(flags | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::BypassWindowManagerHint | Qt::SplashScreen); @@ -87,6 +67,27 @@ WidgetWindow::WidgetWindow( m_window.setSource(QUrl("qrc:/Widget.qml")); m_window.setPosition(m_position); m_window.show(); + + // Do not trigger position changed save reuqest on startup + QTimer::singleShot(1000, [=, this]() { + // We limit ourself to only update the position every 500ms! + auto sendPositionUpdate = [this]() { + m_positionMessageLimiter.stop(); + if (!m_sdk->isConnected()) + return; + + QJsonObject obj; + obj.insert("messageType", "positionUpdate"); + obj.insert("positionX", m_window.x()); + obj.insert("positionY", m_window.y()); + m_sdk->sendMessage(obj); + }; + m_positionMessageLimiter.setInterval(500); + + QObject::connect(&m_positionMessageLimiter, &QTimer::timeout, this, sendPositionUpdate); + QObject::connect(&m_window, &QWindow::xChanged, this, [this]() { m_positionMessageLimiter.start(); }); + QObject::connect(&m_window, &QWindow::yChanged, this, [this]() { m_positionMessageLimiter.start(); }); + }); } void WidgetWindow::setSize(QSize size)