1
0
mirror of https://gitlab.com/kelteseth/ScreenPlay.git synced 2024-11-25 04:02:50 +01:00

Add replace wallpaper that reuses the existing ScreenPlayWallpaper process

This commit is contained in:
Elias Steurer 2020-06-21 16:07:10 +02:00
parent a83d1fc491
commit 73730eaac5
11 changed files with 240 additions and 84 deletions

View File

@ -1,4 +1,5 @@
#include "screenplaymanager.h"
#include <QScopeGuard>
namespace ScreenPlay {
@ -47,6 +48,13 @@ void ScreenPlayManager::createWallpaper(
const float volume,
const bool saveToProfilesConfigFile)
{
auto saveToProfile = qScopeGuard([=, this] {
// Do not save on app start
if (saveToProfilesConfigFile) {
saveProfiles();
}
});
if (m_telemetry) {
m_telemetry->sendEvent("wallpaper", "start");
}
@ -59,10 +67,34 @@ void ScreenPlayManager::createWallpaper(
const QString path = QUrl::fromUserInput(absoluteStoragePath).toLocalFile();
const QString appID = Util::generateRandomString();
// Only support remove wallpaper that spans over 1 monitor
if (monitorIndex.length() == 1) {
int i = 0;
for (auto& wallpaper : m_screenPlayWallpapers) {
if (wallpaper->screenNumber().length() == 1) {
if (monitors.at(0) == wallpaper->screenNumber().at(0)) {
wallpaper->replace(
path,
previewImage,
file,
volume,
fillMode,
type,
m_settings->checkWallpaperVisible());
m_monitorListModel->setWallpaperActiveMonitor(wallpaper, monitorIndex);
return;
}
}
i++;
}
}
std::shared_ptr<ScreenPlayWallpaper> wallpaper;
wallpaper = std::make_shared<ScreenPlayWallpaper>(
monitorIndex,
m_globalVariables,
m_sdkconnector,
appID,
path,
previewImage,
@ -72,29 +104,9 @@ void ScreenPlayManager::createWallpaper(
type,
m_settings->checkWallpaperVisible());
// Only support remove wallpaper that spans over 1 monitor
if (monitorIndex.length() == 1) {
int i = 0;
for (auto& wallpaperIterator : m_screenPlayWallpapers) {
if (wallpaperIterator->screenNumber().length() == 1) {
if (monitors.at(0) == wallpaperIterator->screenNumber().at(0)) {
if (!removeWallpaperAt(i)) {
qWarning() << "Could not remove wallpaper at index " << i;
}
}
}
i++;
}
}
m_screenPlayWallpapers.append(wallpaper);
m_monitorListModel->setWallpaperActiveMonitor(wallpaper, monitorIndex);
increaseActiveWallpaperCounter();
// Do not save on app start
if (saveToProfilesConfigFile) {
saveProfiles();
}
}
/*!

View File

@ -16,6 +16,7 @@ namespace ScreenPlay {
ScreenPlayWallpaper::ScreenPlayWallpaper(
const QVector<int>& screenNumber,
const std::shared_ptr<GlobalVariables>& globalVariables,
const std::shared_ptr<SDKConnector>& sdkConnector,
const QString& appID,
const QString& absolutePath,
const QString& previewImage,
@ -28,6 +29,7 @@ ScreenPlayWallpaper::ScreenPlayWallpaper(
: QObject(parent)
, m_projectSettingsListModel { absolutePath + "/project.json" }
, m_globalVariables { globalVariables }
, m_sdkConnector { sdkConnector }
, m_screenNumber { screenNumber }
, m_previewImage { previewImage }
, m_type { type }
@ -114,4 +116,31 @@ ProjectSettingsListModel* ScreenPlayWallpaper::getProjectSettingsListModel()
return &m_projectSettingsListModel;
}
void ScreenPlayWallpaper::replace(
const QString& absolutePath,
const QString& previewImage,
const QString& file,
const float volume,
const FillMode::FillMode fillMode,
const InstalledType::InstalledType type,
const bool checkWallpaperVisible)
{
m_previewImage = previewImage;
m_type = type;
m_fillMode = fillMode;
m_absolutePath = absolutePath;
m_file = file;
QJsonObject obj;
obj.insert("command", "replace");
obj.insert("type", QVariant::fromValue(type).toString());
obj.insert("fillMode", QVariant::fromValue(fillMode).toString());
obj.insert("volume", volume);
obj.insert("absolutePath", absolutePath);
obj.insert("file", file);
obj.insert("checkWallpaperVisible", checkWallpaperVisible);
m_sdkConnector->replace(m_appID, obj);
}
}

View File

@ -43,6 +43,7 @@
#include "globalvariables.h"
#include "projectsettingslistmodel.h"
#include "sdkconnector.h"
namespace ScreenPlay {
@ -67,6 +68,7 @@ public:
explicit ScreenPlayWallpaper(
const QVector<int>& screenNumber,
const std::shared_ptr<GlobalVariables>& globalVariables,
const std::shared_ptr<SDKConnector>& sdkConnector,
const QString& appID,
const QString& absolutePath,
const QString& previewImage,
@ -126,6 +128,14 @@ public:
ProjectSettingsListModel* getProjectSettingsListModel();
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);
signals:
void screenNumberChanged(QVector<int> screenNumber);
void previewImageChanged(QString previewImage);
@ -231,6 +241,7 @@ private:
ProjectSettingsListModel m_projectSettingsListModel;
const std::shared_ptr<GlobalVariables>& m_globalVariables;
const std::shared_ptr<SDKConnector>& m_sdkConnector;
QVector<int> m_screenNumber;

View File

@ -90,14 +90,7 @@ void SDKConnector::closeAllConnections()
*/
void SDKConnector::closeAllWallpapers()
{
QStringList types {
"VideoWallpaper",
"QmlWallpaper",
"HtmlWallpaper",
"GodotWallpaper"
};
closeConntectionByType(types);
closeConntectionByType(GlobalVariables::getAvailableWallpaper());
}
/*!
@ -110,13 +103,7 @@ void SDKConnector::closeAllWallpapers()
*/
void SDKConnector::closeAllWidgets()
{
QStringList types {
"QmlWidget",
"HtmlWidget",
"StandaloneWidget"
};
closeConntectionByType(types);
closeConntectionByType(GlobalVariables::getAvailableWidgets());
}
/*!
@ -165,4 +152,16 @@ void SDKConnector::setWallpaperValue(QString appID, QString key, QString value)
}
}
void SDKConnector::replace(const QString& appID, const QJsonObject& obj)
{
for (int i = 0; i < m_clients.count(); ++i) {
if (m_clients.at(i)->appID() == appID) {
QByteArray send = QJsonDocument(obj).toJson();
m_clients.at(i)->socket()->write(send);
m_clients.at(i)->socket()->waitForBytesWritten();
}
}
}
}

View File

@ -77,6 +77,7 @@ public slots:
void closeAllWidgets();
bool closeWallpaper(const QString& appID);
void setWallpaperValue(QString appID, QString key, QString value);
void replace(const QString& appID, const QJsonObject& obj);
private:
std::unique_ptr<QLocalServer> m_server;

View File

@ -36,13 +36,12 @@ void ScreenPlaySDK::init()
// If the wallpaper never connects it will never get the
// disconnect event. We can savely assume no connection will
// be made after 1 second timeout.
QTimer::singleShot(1000,[this](){
if(m_socket.state() != QLocalSocket::ConnectedState){
m_socket.disconnectFromServer();
emit sdkDisconnected();
QTimer::singleShot(1000, [this]() {
if (m_socket.state() != QLocalSocket::ConnectedState) {
m_socket.disconnectFromServer();
emit sdkDisconnected();
}
});
}
ScreenPlaySDK::~ScreenPlaySDK()
@ -76,19 +75,58 @@ void ScreenPlaySDK::readyRead()
emit incommingMessageError(err.errorString());
return;
}
QJsonObject ob = doc.object();
QJsonObject obj = doc.object();
if(ob.size() == 1){
if(ob.contains("command")){
if(ob.value("command") == "quit"){
if (obj.size() == 1) {
if (obj.contains("command")) {
if (obj.value("command") == "quit") {
emit sdkDisconnected();
return;
}
}
}
if (obj.contains("command")) {
if (obj.value("command") == "replace") {
QString type = obj.value("type").toString();
QString fillMode = obj.value("fillMode").toString();
QString absolutePath = obj.value("absolutePath").toString();
QString file = obj.value("file").toString();
bool checkWallpaperVisible = obj.value("checkWallpaperVisible").toBool();
if (type.isEmpty()
|| fillMode.isEmpty()
|| absolutePath.isEmpty()
|| file.isEmpty()
|| (!obj.contains("volume"))) {
qWarning() << "Command replace with incompile message received: "
<< type
<< fillMode
<< absolutePath
<< file;
return;
}
bool volumeParsedOK = false;
float volumeParsed = QVariant(obj.value("volume").toVariant()).toFloat(&volumeParsedOK);
if (!volumeParsedOK && (volumeParsed > 0.0 && volumeParsed <= 1.0)) {
qWarning() << "Command replaced contained bad volume float value: " << volumeParsed;
}
qWarning()
<< type
<< fillMode
<< volumeParsed
<< absolutePath
<< file;
emit replaceWallpaper(absolutePath, file, volumeParsed, fillMode, type, checkWallpaperVisible);
return;
}
}
QJsonObject::iterator iterator;
for (iterator = ob.begin(); iterator != ob.end(); iterator++) {
emit incommingMessage(iterator.key(), ob.value(iterator.key()).toString());
for (iterator = obj.begin(); iterator != obj.end(); iterator++) {
emit incommingMessage(iterator.key(), obj.value(iterator.key()).toString());
}
}

View File

@ -35,6 +35,7 @@
#pragma once
#include <QByteArray>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
@ -54,7 +55,7 @@ class ScreenPlaySDK : public QQuickItem {
public:
ScreenPlaySDK(QQuickItem* parent = nullptr);
ScreenPlaySDK( const QString& appID, const QString& type,QQuickItem* parent = nullptr);
ScreenPlaySDK(const QString& appID, const QString& type, QQuickItem* parent = nullptr);
~ScreenPlaySDK();
Q_PROPERTY(QString type READ type WRITE setType NOTIFY typeChanged)
@ -125,6 +126,14 @@ signals:
void appIDChanged(QString appID);
void newRedirectMessage(QByteArray& msg);
void replaceWallpaper(
const QString absolutePath,
const QString file,
const float volume,
const QString fillMode,
const QString type,
const bool checkWallpaperVisible);
private:
void init();

View File

@ -15,18 +15,43 @@ Item {
WebEngine.settings.allowRunningInsecureContent = true
WebEngine.settings.accelerated2dCanvasEnabled = true
WebEngine.settings.javascriptCanOpenWindows = false
WebEngine.settings.printElementBackgrounds = false
WebEngine.settings.showScrollBars = false
WebEngine.settings.playbackRequiresUserGesture = false
WebEngine.settings.focusOnNavigationEnabled = true
}
Connections {
target: window
function onReloadVideo() {
webView.runJavaScript(root.getSetVideoCommand())
}
}
function getSetVideoCommand() {
// TODO 30:
// Currently wont work. Commit anyways til QtCreator and Qt work with js template literals
var src = ""
src += "var videoPlayer = document.getElementById('videoPlayer');"
src += "var videoSource = document.getElementById('videoSource');"
src += "videoSource.src = '" + window.fullContentPath + "';"
src += "videoPlayer.load();"
src += "videoPlayer.volume = " + window.volume + ";"
src += "videoPlayer.setAttribute('style', 'object-fit :" + window.fillMode + ";');"
src += "videoPlayer.play();"
return src
}
WebEngineView {
id: webView
anchors.fill: parent
url: {
if (window.type === Wallpaper.WallpaperType.Video) {
return Qt.resolvedUrl(window.getApplicationPath() + "/index.html")
return Qt.resolvedUrl(window.getApplicationPath(
) + "/index.html")
}
if (window.type === Wallpaper.WallpaperType.Html) {
return Qt.resolvedUrl(window.fullContentPath + "/index.html")
@ -37,21 +62,11 @@ Item {
if ((loadProgress === 100)) {
if (window.type === Wallpaper.WallpaperType.Video) {
// TODO 30:
// Currently wont work. Commit anyways til QtCreator and Qt work with js template literals
var src = ""
src += "var videoPlayer = document.getElementById('videoPlayer');"
src += "var videoSource = document.getElementById('videoSource');"
src += "videoSource.src = '" + window.fullContentPath + "';"
src += "videoPlayer.load();"
src += "videoPlayer.volume = " + window.volume + ";"
src += "videoPlayer.setAttribute('style', 'object-fit :"
+ window.fillMode + ";');"
src += "videoPlayer.play();"
webView.runJavaScript(src, function (result) {
fadeInTimer.start()
})
webView.runJavaScript(root.getSetVideoCommand(),
function (result) {
fadeInTimer.start()
})
} else {
fadeInTimer.start()
}
@ -79,7 +94,6 @@ Item {
color: "white"
}
Timer {
id: timerCover
interval: 300
@ -89,7 +103,6 @@ Item {
}
}
Connections {
target: window

View File

@ -115,6 +115,7 @@ int main(int argc, char* argv[])
WinWindow window(list, argumentList.at(2), argumentList.at(3), argumentList.at(4), argumentList.at(5), checkWallpaperVisible);
QObject::connect(&sdk, &ScreenPlaySDK::sdkDisconnected, &window, &WinWindow::destroyThis);
QObject::connect(&sdk, &ScreenPlaySDK::incommingMessage, &window, &WinWindow::messageReceived);
QObject::connect(&sdk, &ScreenPlaySDK::replaceWallpaper, &window, &WinWindow::replaceWallpaper);
#endif
#if defined(Q_OS_LINUX)

View File

@ -71,25 +71,7 @@ BaseWindow::BaseWindow(QString projectFilePath, const QVector<int> activeScreens
QString type = projectObject.value("type").toString().toLower();
if (type.contains("VideoWallpaper", Qt::CaseInsensitive)) {
setType(BaseWindow::WallpaperType::Video);
return;
}
if (type.contains("QmlWallpaper", Qt::CaseInsensitive)) {
setType(BaseWindow::WallpaperType::Qml);
return;
}
if (type.contains("HtmlWallpaper", Qt::CaseInsensitive)) {
setType(BaseWindow::WallpaperType::Html);
return;
}
if (type.contains("GodotWallpaper", Qt::CaseInsensitive)) {
setType(BaseWindow::WallpaperType::Godot);
return;
}
setType(parseWallpaperType(type));
}
void BaseWindow::messageReceived(QString key, QString value)
@ -152,6 +134,31 @@ void BaseWindow::messageReceived(QString key, QString value)
emit qmlSceneValueReceived(key, value);
}
void BaseWindow::replaceWallpaper(
const QString absolutePath,
const QString file,
const float volume,
const QString fillMode,
const QString type,
const bool checkWallpaperVisible)
{
setCheckWallpaperVisible(checkWallpaperVisible);
setVolume(volume);
setFillMode(fillMode);
setType(parseWallpaperType(type));
setFullContentPath("file:///" + absolutePath + "/" + file);
qInfo( ) << file;
if (m_type == WallpaperType::Qml || m_type == WallpaperType::Html)
emit reloadQML();
if (m_type == WallpaperType::Video)
emit reloadVideo();
}
// Used for loading shader
// Loading shader relative to the qml file will be available in Qt 6
QString BaseWindow::loadFromFile(const QString& filename)
{
QFile file;
@ -161,3 +168,27 @@ QString BaseWindow::loadFromFile(const QString& filename)
}
return "";
}
BaseWindow::WallpaperType BaseWindow::parseWallpaperType(const QString& type)
{
if (type.contains("VideoWallpaper", Qt::CaseInsensitive)) {
return (BaseWindow::WallpaperType::Video);
}
if (type.contains("QmlWallpaper", Qt::CaseInsensitive)) {
return (BaseWindow::WallpaperType::Qml);
}
if (type.contains("HtmlWallpaper", Qt::CaseInsensitive)) {
return (BaseWindow::WallpaperType::Html);
}
if (type.contains("GodotWallpaper", Qt::CaseInsensitive)) {
return (BaseWindow::WallpaperType::Godot);
}
qWarning() << "Could not parse Wallpaper type from value: " << type;
return BaseWindow::WallpaperType::Video;
}

View File

@ -179,6 +179,7 @@ public:
signals:
void qmlExit();
void reloadQML();
void reloadVideo();
void loopsChanged(bool loops);
void volumeChanged(float volume);
@ -204,6 +205,14 @@ public slots:
virtual void destroyThis() { }
virtual void setVisible(bool show) { Q_UNUSED(show) }
virtual void messageReceived(QString key, QString value) final;
virtual void replaceWallpaper(
const QString absolutePath,
const QString file,
const float volume,
const QString fillMode,
const QString type,
const bool checkWallpaperVisible) final;
QString loadFromFile(const QString& filename);
@ -395,6 +404,9 @@ public slots:
emit basePathChanged(m_basePath);
}
private:
BaseWindow::WallpaperType parseWallpaperType(const QString& type);
private:
bool m_checkWallpaperVisible { false };
bool m_visualsPaused { false };