From 0a27b61885279776e93cfa11a940c07595553196 Mon Sep 17 00:00:00 2001 From: Elias Steurer Date: Sat, 23 Nov 2019 17:22:24 +0100 Subject: [PATCH] Some refactoring of the wallpaper. Split video/webview into seperate qml file. Add sanity check for current time. Change animation from OpacityAnimation to states. This is a behavior change in Qt 5.14 resulting in not starting the animation when no mouse enter was detected at all. --- ScreenPlayWallpaper/SPWResources.qrc | 2 + ScreenPlayWallpaper/WebView.qml | 120 +++++++++++ ScreenPlayWallpaper/mainWindow.qml | 250 +++++++++------------- ScreenPlayWallpaper/qtquickcontrols2.conf | 11 + ScreenPlayWallpaper/src/basewindow.h | 4 +- ScreenPlayWallpaper/src/winwindow.cpp | 42 ++-- ScreenPlayWallpaper/src/winwindow.h | 2 + 7 files changed, 255 insertions(+), 176 deletions(-) create mode 100644 ScreenPlayWallpaper/WebView.qml create mode 100644 ScreenPlayWallpaper/qtquickcontrols2.conf diff --git a/ScreenPlayWallpaper/SPWResources.qrc b/ScreenPlayWallpaper/SPWResources.qrc index 581a72c2..46ff52b1 100644 --- a/ScreenPlayWallpaper/SPWResources.qrc +++ b/ScreenPlayWallpaper/SPWResources.qrc @@ -3,5 +3,7 @@ mainWindow.qml test.qml dot.png + qtquickcontrols2.conf + WebView.qml diff --git a/ScreenPlayWallpaper/WebView.qml b/ScreenPlayWallpaper/WebView.qml new file mode 100644 index 00000000..b4faf19d --- /dev/null +++ b/ScreenPlayWallpaper/WebView.qml @@ -0,0 +1,120 @@ +import QtQuick 2.0 +import ScreenPlay.Wallpaper 1.0 +import QtWebEngine 1.8 + +Item { + property string url: webView.url + + signal requestFadeIn() + + Component.onCompleted: { + + WebEngine.settings.allowRunningInsecureContent = true + WebEngine.settings.accelerated2dCanvasEnabled = true + WebEngine.settings.javascriptCanOpenWindows = false + WebEngine.settings.printElementBackgrounds = false + WebEngine.settings.showScrollBars = false + WebEngine.settings.playbackRequiresUserGesture = false + } + + WebEngineView { + id: webView + anchors.fill: parent + url: Qt.resolvedUrl(window.getApplicationPath() + "/index.html") + onLoadProgressChanged: { + if (loadProgress === 100) { + + // 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() + + }) + } + } + + onJavaScriptConsoleMessage: print(lineNumber, message) + } + + Timer { + id: fadeInTimer + interval: 500 + onTriggered: requestFadeIn() + } + + Connections { + target: window + + onQmlExit: { + webView.runJavaScript( + "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.volume = 0;") + } + + onMutedChanged: { + if (muted) { + webView.runJavaScript( + "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.volume = 0;") + } else { + webView.runJavaScript( + "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.volume = " + window.volume + ";") + } + } + + onFillModeChanged: { + if (webView.loadProgress === 100) { + webView.runJavaScript( + "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.setAttribute('style', 'object-fit :" + window.fillMode + ";');") + } + } + + onLoopsChanged: { + if (webView.loadProgress === 100) { + webView.runJavaScript( + "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.loop = " + loops + ";") + } + } + + onVolumeChanged: { + if (webView.loadProgress === 100) { + webView.runJavaScript( + "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.volume = " + volume + ";") + } + } + + onCurrentTimeChanged: { + if (webView.loadProgress === 100) { + webView.runJavaScript( + "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.currentTime = " + + currentTime + " * videoPlayer.duration;") + } + } + + onPlaybackRateChanged: { + if (webView.loadProgress === 100) { + webView.runJavaScript( + "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.playbackRate = " + playbackRate + ";") + } + } + + onIsPlayingChanged: { + if (webView.loadProgress === 100) { + if (isPlaying) { + webView.runJavaScript( + "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.play();") + } else { + webView.runJavaScript( + "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.pause();") + } + } + } + } +} diff --git a/ScreenPlayWallpaper/mainWindow.qml b/ScreenPlayWallpaper/mainWindow.qml index f20322a7..e2515572 100644 --- a/ScreenPlayWallpaper/mainWindow.qml +++ b/ScreenPlayWallpaper/mainWindow.qml @@ -1,5 +1,4 @@ import QtQuick 2.12 -import QtWebEngine 1.8 import ScreenPlay.Wallpaper 1.0 Rectangle { @@ -15,102 +14,78 @@ Rectangle { property bool canFadeByWallpaperFillMode: true + Connections { + target: window + + onQmlExit: { + if (canFadeByWallpaperFillMode && window.canFade) { + imgCover.state = "outExit" + } else { + window.terminate() + } + } + + onQmlSceneValueReceived: { + var obj2 = 'import QtQuick 2.0; Item {Component.onCompleted: loader.item.' + + key + ' = ' + value + '; }' + print(key, value) + var newObject = Qt.createQmlObject(obj2.toString(), root, "err") + newObject.destroy(10000) + } + } + Component.onCompleted: { - - WebEngine.settings.allowRunningInsecureContent = true - WebEngine.settings.accelerated2dCanvasEnabled = true - WebEngine.settings.javascriptCanOpenWindows = false - WebEngine.settings.printElementBackgrounds = false - WebEngine.settings.showScrollBars = false - WebEngine.settings.playbackRequiresUserGesture = false - switch (window.type) { case Wallpaper.WallpaperType.Video: - webView.url = Qt.resolvedUrl(window.getApplicationPath() + "/index.html") - webView.enabled = true + loader.source = "qrc:/WebView.qml" + break case Wallpaper.WallpaperType.Html: - webView.enabled = true - webView.url = Qt.resolvedUrl(window.fullContentPath) + loader.source = "qrc:/WebView.qml" + loader.webViewUrl = Qt.resolvedUrl(window.fullContentPath) break case Wallpaper.WallpaperType.ThreeJSScene: - webView.enabled = true - webView.url = Qt.resolvedUrl(window.fullContentPath) + loader.source = "qrc:/WebView.qml" + loader.webViewUrl = Qt.resolvedUrl(window.fullContentPath) break case Wallpaper.WallpaperType.Qml: - loader.enabled = true loader.source = Qt.resolvedUrl(window.fullContentPath) - fadeIn() + imgCover.state = "out" break } } function fadeIn() { + print("fadeIn()") window.setVisible(true) + print("setVisible()") if (canFadeByWallpaperFillMode && window.canFade) { - animFadeIn.start() + print("fadein") + imgCover.state = "out" } else { + print("imgCover.opacity = 0") imgCover.opacity = 0 } } - Timer { - id: fadeInTimer - interval: 50 - onTriggered: fadeIn() - } - - OpacityAnimator { - id: animFadeIn - target: imgCover - from: 1 - to: 0 - duration: 800 - easing.type: Easing.InOutQuad - } - - OpacityAnimator { - id: animFadeOut - target: imgCover - from: 0 - to: 1 - duration: 800 - easing.type: Easing.InOutQuad - onFinished: window.terminate() - } - - WebEngineView { - id: webView - enabled: false - anchors.fill: parent - onLoadProgressChanged: { - if (loadProgress === 100) { - - // 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() - }) - } - } - - onJavaScriptConsoleMessage: print(lineNumber, message) - } - Loader { id: loader anchors.fill: parent enabled: false + property string webViewUrl + onStatusChanged: { + if (loader.status === Loader.Ready) { + if (window.type === Wallpaper.WallpaperType.Video) { + loader.item.url = loader.webViewUrl + } + } + } + + Connections { + ignoreUnknownSignals: true + target: loader.item + onRequestFadeIn:fadeIn() + } } Image { @@ -120,11 +95,63 @@ Rectangle { left: parent.left right: parent.right } + state: "in" sourceSize.width: window.width sourceSize.height: window.height source: Qt.resolvedUrl("file:///" + desktopProperties.wallpaperPath) + states: [ + State { + name: "in" + PropertyChanges { + target: imgCover + opacity: 1 + } + }, + State { + name: "out" + PropertyChanges { + target: imgCover + opacity: 0 + } + }, + State { + name: "outExit" + PropertyChanges { + target: imgCover + opacity: 1 + } + } + ] + transitions: [ + Transition { + from: "out" + to: "in" + reversible: true + PropertyAnimation { + target: imgCover + duration: 600 + property: "opacity" + } + }, + Transition { + from: "out" + to: "outExit" + reversible: true + SequentialAnimation { + PropertyAnimation { + target: imgCover + duration: 600 + property: "opacity" + } + ScriptAction { + script: window.terminate() + } + } + } + ] + Component.onCompleted: { switch (desktopProperties.wallpaperStyle) { @@ -154,85 +181,4 @@ Rectangle { } } } - - Connections { - target: window - - onMutedChanged:{ - if(muted){ - webView.runJavaScript( - "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.volume = 0;") - } else { - webView.runJavaScript( - "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.volume = " + window.volume + ";") - } - } - - onQmlExit: { - webView.runJavaScript( - "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.volume = 0;") - - if (canFadeByWallpaperFillMode && window.canFade) { - animFadeOut.start() - } else { - window.terminate() - } - } - - onQmlSceneValueReceived: { - var obj2 = 'import QtQuick 2.0; Item {Component.onCompleted: loader.item.' - + key + ' = ' + value + '; }' - print(key, value) - var newObject = Qt.createQmlObject(obj2.toString(), root, "err") - newObject.destroy(10000) - } - - - onFillModeChanged:{ - if (webView.loadProgress === 100) { - webView.runJavaScript( - "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.setAttribute('style', 'object-fit :" + window.fillMode + ";');") - } - } - - onLoopsChanged: { - if (webView.loadProgress === 100) { - webView.runJavaScript( - "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.loop = " + loops + ";") - } - } - - onVolumeChanged: { - if (webView.loadProgress === 100) { - webView.runJavaScript( - "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.volume = " + volume + ";") - } - } - - onCurrentTimeChanged: { - if (webView.loadProgress === 100) { - webView.runJavaScript( - "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.currentTime = " + currentTime + " * videoPlayer.duration;") - } - } - - onPlaybackRateChanged: { - if (webView.loadProgress === 100) { - webView.runJavaScript( - "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.playbackRate = " + playbackRate + ";") - } - } - - onIsPlayingChanged: { - if (webView.loadProgress === 100) { - if (isPlaying) { - webView.runJavaScript( - "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.play();") - } else { - webView.runJavaScript( - "var videoPlayer = document.getElementById('videoPlayer'); videoPlayer.pause();") - } - } - } - } } diff --git a/ScreenPlayWallpaper/qtquickcontrols2.conf b/ScreenPlayWallpaper/qtquickcontrols2.conf new file mode 100644 index 00000000..159b5f2b --- /dev/null +++ b/ScreenPlayWallpaper/qtquickcontrols2.conf @@ -0,0 +1,11 @@ +[Controls] +Style=Material + +[Material] +Theme=Light +Accent=Orange +Primary=White +Foreground=Grey +Font\Family=Roboto +Font\PixelSize=12 +Variant=Dense diff --git a/ScreenPlayWallpaper/src/basewindow.h b/ScreenPlayWallpaper/src/basewindow.h index d54a1ce8..dd0c2182 100644 --- a/ScreenPlayWallpaper/src/basewindow.h +++ b/ScreenPlayWallpaper/src/basewindow.h @@ -232,7 +232,9 @@ public slots: void setCurrentTime(float currentTime) { - qWarning("Floating point comparison needs context sanity check"); + if (currentTime < 0.0f || currentTime > 100000000000.0f) + return; + if (qFuzzyCompare(m_currentTime, currentTime)) return; diff --git a/ScreenPlayWallpaper/src/winwindow.cpp b/ScreenPlayWallpaper/src/winwindow.cpp index b7ce1e04..c7cf1783 100644 --- a/ScreenPlayWallpaper/src/winwindow.cpp +++ b/ScreenPlayWallpaper/src/winwindow.cpp @@ -68,6 +68,7 @@ WinWindow::WinWindow( const QString fillmode) : BaseWindow(projectPath) { + m_window.hide(); m_windowHandle = reinterpret_cast(m_window.winId()); if (!IsWindow(m_windowHandle)) { @@ -90,8 +91,8 @@ WinWindow::WinWindow( // WARNING: Setting Window flags must be called *here*! Qt::WindowFlags flags = m_window.flags(); - m_window.setFlags(flags | Qt::FramelessWindowHint); - SetWindowLongPtr(m_windowHandle, GWL_STYLE, WS_CHILDWINDOW); + m_window.setFlags(flags | Qt::FramelessWindowHint | Qt::SplashScreen | Qt::ForeignWindow | Qt::SubWindow); + //SetWindowLongPtr(m_windowHandle, GWL_STYLE, WS_CHILDWINDOW); SetWindowLongPtr(m_windowHandle, GWL_EXSTYLE, WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_NOACTIVATE); // Windows coordante system begins at 0x0 at the @@ -118,35 +119,18 @@ WinWindow::WinWindow( // we can set it here once :) m_window.setTextRenderType(QQuickWindow::TextRenderType::NativeTextRendering); m_window.setSource(QUrl("qrc:/mainWindow.qml")); - - // MUST be called before setting hook for events! - // if(type() == BaseWindow::WallpaperType::Qml){ - // winGlobalHook = &m_window; - // if (!(mouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookCallback, nullptr, 0))) { - // qDebug() << "Faild to install mouse hook!"; - // } - // } - - // FIXME WORKAROUND: - // There is a strange bug when we open the ScreenPlayWallpaper project on its one - // that if we set ShowWindow(m_windowHandle, SW_HIDE); we can no longer set - // the window visible via set Visible. - if (projectPath != "test") { - // Let QML decide when were are read to show the window - // ShowWindow(m_windowHandle, SW_HIDE); - } + m_window.hide(); } void WinWindow::setVisible(bool show) { if (show) { if (!ShowWindow(m_windowHandle, SW_SHOW)) { - qDebug() << "Cannot set window handle visible"; + qDebug() << "Cannot set window handle SW_SHOW"; } - m_window.show(); } else { if (!ShowWindow(m_windowHandle, SW_HIDE)) { - qDebug() << "Cannot set window handle hidden"; + qDebug() << "Cannot set window handle SW_HIDE"; } } } @@ -220,7 +204,7 @@ void WinWindow::setupWallpaperForMultipleScreens(const QVector& activeScree rect.setX(upperLeftScreen->geometry().x()); rect.setY(upperLeftScreen->geometry().y()); - if (!SetWindowPos(m_windowHandle, nullptr, rect.x()+ m_windowOffsetX, rect.y()+ m_windowOffsetY, rect.width(), rect.height(), SWP_SHOWWINDOW)) { + if (!SetWindowPos(m_windowHandle, nullptr, rect.x() + m_windowOffsetX, rect.y() + m_windowOffsetY, rect.width(), rect.height(), SWP_SHOWWINDOW)) { qFatal("Could not set window pos: "); } if (SetParent(m_windowHandle, m_windowHandleWorker) == nullptr) { @@ -228,6 +212,17 @@ void WinWindow::setupWallpaperForMultipleScreens(const QVector& activeScree } } +void WinWindow::setupWindowMouseHook() +{ + // MUST be called before setting hook for events! + if (type() == BaseWindow::WallpaperType::Qml) { + winGlobalHook = &m_window; + if (!(mouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookCallback, nullptr, 0))) { + qDebug() << "Faild to install mouse hook!"; + } + } +} + bool WinWindow::searchWorkerWindowToParentTo() { HWND progman_hwnd = FindWindowW(L"Progman", L"Program Manager"); @@ -240,6 +235,7 @@ bool WinWindow::searchWorkerWindowToParentTo() void WinWindow::terminate() { + ShowWindow(m_windowHandle, SW_HIDE); // Force refresh so that we display the regular diff --git a/ScreenPlayWallpaper/src/winwindow.h b/ScreenPlayWallpaper/src/winwindow.h index 303535be..c114af7c 100644 --- a/ScreenPlayWallpaper/src/winwindow.h +++ b/ScreenPlayWallpaper/src/winwindow.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -34,6 +35,7 @@ private: void setupWallpaperForOneScreen(int activeScreen); void setupWallpaperForAllScreens(); void setupWallpaperForMultipleScreens(const QVector& activeScreensList); + void setupWindowMouseHook(); bool searchWorkerWindowToParentTo();