9 Commits

Author SHA1 Message Date
Digital Artifex 6bea9b32df Added animation settings 2026-08-25 19:22:39 -04:00
Digital Artifex c8209b723a Added application settings page 2026-08-25 19:21:53 -04:00
Digital Artifex e779c8e9b1 Added apply and reset functions 2026-08-25 19:20:02 -04:00
Digital Artifex 5def93edf2 Removed unused assets 2026-08-25 19:18:55 -04:00
Digital Artifex abdd49bf52 Removed Qt completion default comment 2026-08-25 14:28:49 -04:00
Digital Artifex 871ab8a262 Added copyright block 2026-08-25 14:24:37 -04:00
Digital Artifex 3ef029aba9 Removed KOMPLEX_LOCAL_DEV define 2026-08-25 14:03:51 -04:00
Digital Artifex cf5baa0684 Cleanup unused assets and finished comments 2026-08-25 11:00:04 -04:00
Digital Artifex 2ffe0bba88 Merge pull request #1 from DigitalArtifex/dev
PackCompiler should now be much more stable and cuts down on file writes. Instead of rewriting the file for each modification, the entire process now requires just 2 file writes per shader: 1 to extract and 1 to save the compiled shader. Also, the need to expose a setting for the location to the qsb binary is no longer needed as it uses QShaderBaker directly.

It should also be a bit faster now. Instead of compiling a generic set of versions, it only compiles the safe default or system reported supported versions for both SPIR-V and GLSL, when they are present. Only caveat would be if a user were to downgrade their GPU. They would potentially need to rebuild the packs they have installed.
2026-08-25 05:23:22 -04:00
53 changed files with 2344 additions and 343 deletions
+5 -5
View File
@@ -103,11 +103,11 @@ qt_add_resources(${CMAKE_PROJECT_NAME} "app_images"
"images/kero/kero_warning.png"
)
target_compile_definitions(
${CMAKE_PROJECT_NAME}
PUBLIC
KOMPLEX_LOCAL_DEV
)
# target_compile_definitions(
# ${CMAKE_PROJECT_NAME}
# PUBLIC
# KOMPLEX_LOCAL_DEV
# )
include(qds)
+32 -3
View File
@@ -1,21 +1,50 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtQuick
import QtQuick.Controls 2.15
import QtCore
import KomplexHub
import org.kde.kirigami as Kirigami
ApplicationWindow {
id: window
visible: true
flags: Qt.Window
title: "KomplexHub"
color: "transparent"
minimumWidth: 720
MainScreen {
antialiasing: true
MainScreen
{
id: mainScreen
antialiasing: true
anchors.fill: parent
}
Settings
{
property alias x: window.x
property alias y: window.y
property alias width: window.width
property alias height: window.height
}
}
+49 -32
View File
@@ -1,9 +1,22 @@
/*
This is a UI file (.ui.qml) that is intended to be edited in Qt Design Studio only.
It is supposed to be strictly declarative and only uses a subset of QML. If you edit
this file manually, you might introduce QML code that is not supported by Qt Design Studio.
Check out https://doc.qt.io/qtcreator/creator-quick-ui-forms.html for details on .ui.qml files.
*/
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls 2.0
import QtQuick.Layouts
@@ -12,7 +25,8 @@ import KomplexHub.Controls
import KomplexHub.Kero
import KomplexHubContent
Rectangle {
Rectangle
{
property MenuButton currentMenuButton
property bool popup: false
@@ -20,12 +34,14 @@ Rectangle {
color: palette.window
RowLayout {
RowLayout
{
id: windowRootLayout
anchors.fill: parent
spacing: 0
Rectangle {
Rectangle
{
id: windowMenu
Layout.fillWidth: false
@@ -58,10 +74,12 @@ Rectangle {
selected = false
}
Behavior on opacity {
Behavior on opacity
{
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
@@ -228,7 +246,7 @@ Rectangle {
{
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ? settings.normalAnimationDuration : 0
}
}
}
@@ -266,8 +284,12 @@ Rectangle {
pageLoader.setSearchTerm()
}
Behavior on preferredHeight {
NumberAnimation { duration: Constants.normalAnimationDuration }
Behavior on preferredHeight
{
NumberAnimation
{
duration: settings.animationsEnabled ? settings.normalAnimationDuration : 0
}
}
}
@@ -302,7 +324,7 @@ Rectangle {
id: pageLoaderAnimation
target: pageLoader
duration: 150
duration: settings.animationsEnabled ? settings.pageChangeAnimationDuration : 0
onFinished: () => {
if(pageLoader.loading && pageLoader.opacity === 0)
@@ -381,23 +403,6 @@ Rectangle {
}
}
KeroBuildingAnimation
{
id: buildingOverlay
anchors.fill: parent
visible: false
}
KeroLoadingAnimation
{
id: loadingAnimation
anchors.fill: parent
visible: opacity > 0
opacity: 0
}
Connections
{
id: popupConnection
@@ -414,7 +419,6 @@ Rectangle {
currentMenuButton = homeMenubutton
pageLoader.page = "pages/HomePage.qml"
searchContainer.preferredHeight = 0
loadingAnimation.opacity = 0
}
states: [
@@ -446,4 +450,17 @@ Rectangle {
}
]
Settings
{
id: settings
property bool animationsEnabled: true
//ms length of page change
property int pageChangeAnimationDuration: 250
property int pageFadeAnimationDuration: 250
property int slowAnimationDuration: 750
property int normalAnimationDuration: 250
property int fastAnimationDuration: 125
}
}
+1
View File
@@ -17,4 +17,5 @@ qt6_add_qml_module(KomplexHubPages
"FeaturedPacksPage.qml"
"FeaturedImagesPage.qml"
"NewestPacksPage.qml"
QML_FILES KomplexSettingsPage.qml
)
+36 -3
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -24,7 +43,6 @@ Rectangle
FeaturedImagesModel
{
id: searchModel
//query: rootItem.query
resultsPerPage: paginator.resultsPerPage
Component.onCompleted: () => nextPage()
@@ -109,7 +127,8 @@ Rectangle
Behavior on opacity {
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
@@ -117,7 +136,8 @@ Rectangle
Behavior on opacity {
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
@@ -151,4 +171,17 @@ Rectangle
resultsLayout.opacity = 1
rootItem.popup = false
}
Settings
{
id: settings
property bool animationsEnabled: true
//ms length of page change
property int pageChangeAnimationDuration: 250
property int pageFadeAnimationDuration: 250
property int slowAnimationDuration: 750
property int normalAnimationDuration: 250
property int fastAnimationDuration: 125
}
}
+36 -2
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -109,7 +128,8 @@ Rectangle
Behavior on opacity {
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
@@ -117,7 +137,8 @@ Rectangle
Behavior on opacity {
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
@@ -142,4 +163,17 @@ Rectangle
resultsLayout.opacity = 0
rootItem.popup = true
}
Settings
{
id: settings
property bool animationsEnabled: true
//ms length of page change
property int pageChangeAnimationDuration: 250
property int pageFadeAnimationDuration: 250
property int slowAnimationDuration: 750
property int normalAnimationDuration: 250
property int fastAnimationDuration: 125
}
}
+36 -2
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -109,7 +128,8 @@ Rectangle
{
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
@@ -118,7 +138,8 @@ Rectangle
{
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
@@ -150,4 +171,17 @@ Rectangle
resultsLayout.opacity = 1
rootItem.popup = false
}
Settings
{
id: settings
property bool animationsEnabled: true
//ms length of page change
property int pageChangeAnimationDuration: 250
property int pageFadeAnimationDuration: 250
property int slowAnimationDuration: 750
property int normalAnimationDuration: 250
property int fastAnimationDuration: 125
}
}
+141 -9
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls 2.0
import QtQuick.Layouts
@@ -20,6 +39,10 @@ Item
imagesModel.state === FeaturedImagesModel.Loading ||
videosModel.state === FeaturedVideosModel.Loading;
property bool error: packsModel.state === NewestPacksModel.Error ||
imagesModel.state === FeaturedImagesModel.Error ||
videosModel.state === FeaturedVideosModel.Error;
onWidthChanged: () =>
{
packsModel.resultsPerPage = resultsPerRow
@@ -405,6 +428,15 @@ Item
visible: opacity > 0
opacity: 1
Behavior on opacity
{
NumberAnimation
{
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
Rectangle
@@ -426,7 +458,8 @@ Item
{
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
@@ -442,7 +475,8 @@ Item
{
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
@@ -458,7 +492,8 @@ Item
{
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
@@ -467,7 +502,8 @@ Item
{
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
@@ -486,7 +522,8 @@ Item
{
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
@@ -508,7 +545,8 @@ Item
{
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
@@ -530,7 +568,8 @@ Item
{
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
@@ -538,6 +577,25 @@ Item
}
}
ErrorView
{
id: errorView
anchors.fill: parent
opacity: 0
visible: opacity > 0.01
manager: downloadManager
Behavior on opacity
{
NumberAnimation
{
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
Item
{
id: featuredLoaderItem
@@ -577,6 +635,41 @@ Item
target: popupContainer
opacity: 0
}
PropertyChanges
{
target: errorView
opacity: 0
}
},
State
{
name: "error"
when: homePageRoot.error
PropertyChanges
{
target: loadingAnimation
opacity: 1
}
PropertyChanges
{
target: pageArea
opacity: 0
}
PropertyChanges
{
target: popupContainer
opacity: 0
}
PropertyChanges
{
target: errorView
opacity: 1
}
},
State
{
@@ -594,6 +687,18 @@ Item
target: pageArea
opacity: 1
}
PropertyChanges
{
target: errorView
opacity: 0
}
PropertyChanges
{
target: popupContainer
opacity: 0
}
},
State
{
@@ -611,6 +716,18 @@ Item
target: loadingAnimation
opacity: 0
}
PropertyChanges
{
target: errorView
opacity: 0
}
PropertyChanges
{
target: popupContainer
opacity: 1
}
}
]
@@ -623,13 +740,15 @@ Item
NumberAnimation
{
target: loadingAnimation
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
property: "opacity";
}
NumberAnimation
{
target: pageArea
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
property: "opacity";
}
}
@@ -725,4 +844,17 @@ Item
pageArea.opacity = 1
homePageRoot.popup = false
}
Settings
{
id: settings
property bool animationsEnabled: true
//ms length of page change
property int pageChangeAnimationDuration: 250
property int pageFadeAnimationDuration: 250
property int slowAnimationDuration: 750
property int normalAnimationDuration: 250
property int fastAnimationDuration: 125
}
}
+36 -2
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -83,7 +102,8 @@ Item
Behavior on opacity {
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
@@ -91,7 +111,8 @@ Item
Behavior on opacity {
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
@@ -125,4 +146,17 @@ Item
paginator.opacity = 1
rootItem.popup = false
}
Settings
{
id: settings
property bool animationsEnabled: true
//ms length of page change
property int pageChangeAnimationDuration: 250
property int pageFadeAnimationDuration: 250
property int slowAnimationDuration: 750
property int normalAnimationDuration: 250
property int fastAnimationDuration: 125
}
}
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -138,4 +157,17 @@ Rectangle {
}
]
Settings
{
id: settings
property bool animationsEnabled: true
//ms length of page change
property int pageChangeAnimationDuration: 250
property int pageFadeAnimationDuration: 250
property int slowAnimationDuration: 750
property int normalAnimationDuration: 250
property int fastAnimationDuration: 125
}
}
@@ -0,0 +1,476 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import KomplexHub
Item
{
property bool updated: updates.length > 0
property var updates: []
ColumnLayout
{
anchors.fill: parent
anchors.margins: Constants.largeMargin
Text
{
Layout.fillWidth: true
text: qsTr("Animation Settings")
font: Constants.h1Font
color: palette.text
}
Rectangle
{
Layout.fillWidth: true
Layout.preferredHeight: 320
Layout.margins: Constants.largeMargin
color: palette.base
border.color: palette.midlight
ColumnLayout
{
id: animationSettingsLayout
anchors.fill: parent
anchors.margins: Constants.largeMargin
RowLayout
{
Layout.fillWidth: true
Layout.preferredHeight: 36
CheckBox
{
Layout.preferredHeight: 36
property bool value: settings.animationsEnabled
id: animationsEnabledCheckbox
text: qsTr("Enable Animations")
font: Constants.h3Font
checked: value
onCheckStateChanged:
{
if(updates.indexOf("enable"))
{
updates.splice(updates.indexOf("enable"), 1)
}
else
{
updates.push("enable")
}
value = checked
}
}
}
Rectangle
{
Layout.fillHeight: true
Layout.fillWidth: true
color: "transparent"
Rectangle
{
anchors.centerIn: parent
anchors.right: parent.right
anchors.left: parent.left
height: 2
color: palette.midlight
}
}
RowLayout
{
Layout.fillWidth: true
Layout.preferredHeight: 36
Text
{
Layout.fillWidth: true
Layout.fillHeight: true
text: qsTr("Slow Animation Duration (Ms)")
font: Constants.h3Font
color: palette.text
verticalAlignment: Qt.AlignVCenter
}
TextField
{
property int value: settings.slowAnimationDuration
Layout.fillHeight: true
Layout.preferredWidth: 36 * 3
id: slowAnimationDurationField
inputMethodHints: Qt.ImhFormattedNumbersOnly
horizontalAlignment: Text.AlignRight
enabled: animationsEnabledCheckbox.value
text: value
onEditingFinished: () =>
{
if(updates.indexOf("slowAnimationDuration"))
{
updates.splice(updates.indexOf("slowAnimationDuration"), 1)
}
else
{
updates.push("slowAnimationDuration")
}
value = parseInt(text)
}
Keys.onPressed: (event) =>
{
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter)
{
slowAnimationDurationField.focus = false; // Unfocus the TextField
event.accepted = true; // Prevent further propagation of the key event
}
}
background: Rectangle
{
color: slowAnimationDurationField.activeFocus ? palette.base : "transparent"
border.color: slowAnimationDurationField.activeFocus ? palette.highlight : "transparent"
border.width: 1
radius: 4
anchors.fill: slowAnimationDurationField
anchors.margins: -2
}
}
}
RowLayout
{
Layout.fillWidth: true
Layout.preferredHeight: 36
Text
{
Layout.fillWidth: true
Layout.fillHeight: true
text: qsTr("Normal Animation Duration (Ms)")
font: Constants.h3Font
color: palette.text
verticalAlignment: Qt.AlignVCenter
}
TextField
{
property int value: settings.normalAnimationDuration
Layout.fillHeight: true
Layout.preferredWidth: 36 * 3
id: normalAnimationDurationField
inputMethodHints: Qt.ImhFormattedNumbersOnly
horizontalAlignment: Text.AlignRight
enabled: animationsEnabledCheckbox.value
text: value
onEditingFinished: () =>
{
if(updates.indexOf("normalAnimationDuration"))
{
updates.splice(updates.indexOf("normalAnimationDuration"), 1)
}
else
{
updates.push("normalAnimationDuration")
}
value = parseInt(text)
}
Keys.onPressed: (event) =>
{
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter)
{
normalAnimationDurationField.focus = false; // Unfocus the TextField
event.accepted = true; // Prevent further propagation of the key event
}
}
background: Rectangle
{
color: normalAnimationDurationField.activeFocus ? palette.base : "transparent"
border.color: normalAnimationDurationField.activeFocus ? palette.highlight : "transparent"
border.width: 1
radius: 4
anchors.fill: normalAnimationDurationField
anchors.margins: -2
}
}
}
RowLayout
{
Layout.fillWidth: true
Layout.preferredHeight: 36
Text
{
Layout.fillWidth: true
Layout.fillHeight: true
text: qsTr("Fast Animation Duration (Ms)")
font: Constants.h3Font
color: palette.text
verticalAlignment: Qt.AlignVCenter
}
TextField
{
property int value: settings.fastAnimationDuration
Layout.fillHeight: true
Layout.preferredWidth: 36 * 3
id: fastAnimationDurationField
inputMethodHints: Qt.ImhFormattedNumbersOnly
horizontalAlignment: Text.AlignRight
enabled: animationsEnabledCheckbox.value
text: value
onEditingFinished: () =>
{
if(updates.indexOf("normalAnimationDuration"))
{
updates.splice(updates.indexOf("normalAnimationDuration"), 1)
}
else
{
updates.push("normalAnimationDuration")
}
value = parseInt(text)
}
Keys.onPressed: (event) =>
{
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter)
{
fastAnimationDurationField.focus = false; // Unfocus the TextField
event.accepted = true; // Prevent further propagation of the key event
}
}
background: Rectangle
{
color: fastAnimationDurationField.activeFocus ? palette.base : "transparent"
border.color: fastAnimationDurationField.activeFocus ? palette.highlight : "transparent"
border.width: 1
radius: 4
anchors.fill: fastAnimationDurationField
anchors.margins: -2
}
}
}
RowLayout
{
Layout.fillWidth: true
Layout.preferredHeight: 36
Text
{
Layout.fillWidth: true
Layout.fillHeight: true
text: qsTr("Page Change Animation Duration (Ms)")
font: Constants.h3Font
color: palette.text
verticalAlignment: Qt.AlignVCenter
}
TextField
{
property int value: settings.pageChangeAnimationDuration
Layout.fillHeight: true
Layout.preferredWidth: 36 * 3
id: pageChangeAnimationDurationField
inputMethodHints: Qt.ImhFormattedNumbersOnly
horizontalAlignment: Text.AlignRight
enabled: animationsEnabledCheckbox.value
text: value
onEditingFinished: () =>
{
if(updates.indexOf("pageChangeAnimationDuration"))
{
updates.splice(updates.indexOf("pageChangeAnimationDuration"), 1)
}
else
{
updates.push("pageChangeAnimationDuration")
}
value = parseInt(text)
}
Keys.onPressed: (event) =>
{
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter)
{
pageChangeAnimationDurationField.focus = false; // Unfocus the TextField
event.accepted = true; // Prevent further propagation of the key event
}
}
background: Rectangle
{
color: pageChangeAnimationDurationField.activeFocus ? palette.base : "transparent"
border.color: pageChangeAnimationDurationField.activeFocus ? palette.highlight : "transparent"
border.width: 1
radius: 4
anchors.fill: pageChangeAnimationDurationField
anchors.margins: -2
}
}
}
RowLayout
{
Layout.fillWidth: true
Layout.preferredHeight: 36
Text
{
Layout.fillWidth: true
Layout.fillHeight: true
text: qsTr("Page Fade Animation Duration (Ms)")
font: Constants.h3Font
color: palette.text
verticalAlignment: Qt.AlignVCenter
}
TextField
{
property int value: settings.pageFadeAnimationDuration
Layout.fillHeight: true
Layout.preferredWidth: 36 * 3
id: pageFadeAnimationDurationField
inputMethodHints: Qt.ImhFormattedNumbersOnly
horizontalAlignment: Text.AlignRight
text: value
enabled: animationsEnabledCheckbox.value
onEditingFinished: () =>
{
if(updates.indexOf("pageChangeAnimationDuration"))
{
updates.splice(updates.indexOf("pageChangeAnimationDuration"), 1)
}
else
{
updates.push("pageChangeAnimationDuration")
}
value = parseInt(text)
}
Keys.onPressed: (event) =>
{
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter)
{
pageFadeAnimationDurationField.focus = false; // Unfocus the TextField
event.accepted = true; // Prevent further propagation of the key event
}
}
background: Rectangle
{
color: pageFadeAnimationDurationField.activeFocus ? palette.base : "transparent"
border.color: pageFadeAnimationDurationField.activeFocus ? palette.highlight : "transparent"
border.width: 1
radius: 4
anchors.fill: pageFadeAnimationDurationField
anchors.margins: -2
}
}
}
}
}
Item
{
Layout.fillHeight: true
Layout.fillWidth: true
}
}
Settings
{
id: settings
property bool animationsEnabled: true
//ms length of page change
property int pageChangeAnimationDuration: 250
property int pageFadeAnimationDuration: 250
property int slowAnimationDuration: 750
property int normalAnimationDuration: 250
property int fastAnimationDuration: 125
}
function apply()
{
if(updated)
{
settings.animationsEnabled = animationsEnabledCheckbox.value
settings.slowAnimationDuration = slowAnimationDurationField.value
settings.normalAnimationDuration = normalAnimationDurationField.value
settings.fastAnimationDuration = fastAnimationDurationField.value
settings.pageChangeAnimationDuration = pageChangeAnimationDurationField.value
settings.pageFadeAnimationDuration = pageFadeAnimationDurationField.value
updates.splice(0, updates.length)
}
}
function reset()
{
if(updated)
{
animationsEnabledCheckbox.value = settings.animationsEnabled
slowAnimationDurationField.value = settings.slowAnimationDuration
normalAnimationDurationField.value = settings.normalAnimationDuration
fastAnimationDurationField.value = settings.fastAnimationDuration
pageChangeAnimationDurationField.value = settings.pageChangeAnimationDuration
pageFadeAnimationDurationField.value = settings.pageFadeAnimationDuration
updates.splice(0, updates.length)
}
}
}
+46 -13
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
@@ -65,6 +84,15 @@ Item
}
}
}
Behavior on opacity
{
NumberAnimation
{
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
Rectangle
@@ -73,27 +101,20 @@ Item
anchors.fill: parent
opacity: 0
color: palette.base
visible: opacity > 0.01
PackView
{
id: viewMoreWallpaperPopup
anchors.fill: parent
opacity: 0
visible: opacity > 0.01
//model: videosModel.itemModel
Behavior on opacity {
NumberAnimation
{
duration: 250
}
}
}
Behavior on opacity {
Behavior on opacity
{
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
@@ -113,9 +134,21 @@ Item
viewMoreWallpaperPopup.description = searchModel.data(searchModel.index(index,0), PackSearchModel.DescriptionRole)
viewMoreWallpaperPopup.thumbnail = searchModel.data(searchModel.index(index,0), PackSearchModel.ThumbnailRole)
viewMoreWallpaperPopup.uuid = searchModel.data(searchModel.index(index,0), PackSearchModel.UuidRole)
viewMoreWallpaperPopup.opacity = 1
popupContainer.opacity = 1
paginator.opacity = 0
rootItem.popup = true
}
Settings
{
id: settings
property bool animationsEnabled: true
//ms length of page change
property int pageChangeAnimationDuration: 250
property int pageFadeAnimationDuration: 250
property int slowAnimationDuration: 750
property int normalAnimationDuration: 250
property int fastAnimationDuration: 125
}
}
+32
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -90,4 +109,17 @@ Item {
}
}
}
Settings
{
id: settings
property bool animationsEnabled: true
//ms length of page change
property int pageChangeAnimationDuration: 250
property int pageFadeAnimationDuration: 250
property int slowAnimationDuration: 750
property int normalAnimationDuration: 250
property int fastAnimationDuration: 125
}
}
+49 -4
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -90,6 +109,15 @@ Rectangle
}
}
}
Behavior on opacity
{
NumberAnimation
{
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
Rectangle
@@ -107,18 +135,22 @@ Rectangle
opacity: 0
visible: opacity > 0.01
Behavior on opacity {
Behavior on opacity
{
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
Behavior on opacity {
Behavior on opacity
{
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
@@ -142,4 +174,17 @@ Rectangle
resultsLayout.opacity = 0
rootItem.popup = true
}
Settings
{
id: settings
property bool animationsEnabled: true
//ms length of page change
property int pageChangeAnimationDuration: 250
property int pageFadeAnimationDuration: 250
property int slowAnimationDuration: 750
property int normalAnimationDuration: 250
property int fastAnimationDuration: 125
}
}
+158 -19
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -11,6 +30,9 @@ import KomplexHub.Pages
Item {
readonly property bool searchable: false
property bool settingsUpdated: wallpaperSettingsUpdated || komplexSettingsUpdated
property bool wallpaperSettingsUpdated: wallpaperSettingsPage.updated && pageStack.currentIndex === 0
property bool komplexSettingsUpdated: komplexSettingsPage.updated && pageStack.currentIndex === 1
id: settingsPageRoot
@@ -29,6 +51,9 @@ Item {
TabButton {
text: qsTr("Wallpaper")
}
TabButton {
text: qsTr("Komplex")
}
TabButton {
text: qsTr("Account")
}
@@ -37,33 +62,53 @@ Item {
}
}
StackLayout {
StackLayout
{
id: pageStack
Layout.fillHeight: true
Layout.fillWidth: true
currentIndex: bar.currentIndex
Item {
Item
{
id: wallpaperTab
Layout.fillHeight: true
Layout.fillWidth: true
WallpaperSettingsPage {
WallpaperSettingsPage
{
id: wallpaperSettingsPage
anchors.fill: parent
}
}
Item {
Item
{
id: komplexTab
Layout.fillHeight: true
Layout.fillWidth: true
KomplexSettingsPage
{
id: komplexSettingsPage
anchors.fill: parent
}
}
Item
{
id: accountTab
Layout.fillHeight: true
Layout.fillWidth: true
UserProfilePage {
UserProfilePage
{
anchors.fill: parent
}
}
Item {
Item
{
Layout.fillHeight: true
Layout.fillWidth: true
property string title: qsTr("Hello!")
@@ -78,14 +123,17 @@ Pexels")
id: keroHelloAvatarRoot
Rectangle {
Rectangle
{
anchors.fill: parent
color: "transparent"
ColumnLayout {
ColumnLayout
{
anchors.fill: parent
KeroHelloAvatar {
KeroHelloAvatar
{
Layout.fillHeight: true
Layout.fillWidth: true
antialiasing: true
@@ -93,7 +141,8 @@ Pexels")
Item { Layout.preferredHeight: 36 }
Text {
Text
{
Layout.fillHeight: false
Layout.fillWidth: true
Layout.margins: Constants.largeMargin
@@ -106,7 +155,8 @@ Pexels")
textFormat: Text.MarkdownText
}
Text {
Text
{
Layout.fillHeight: false
Layout.fillWidth: true
Layout.margins: Constants.largeMargin
@@ -121,16 +171,19 @@ Pexels")
Item { Layout.fillHeight: true }
RowLayout {
RowLayout
{
Layout.fillWidth: true
Layout.alignment: Qt.AlignTop | Qt.AlignRight
ColumnLayout {
ColumnLayout
{
Layout.alignment: Qt.AlignTop | Qt.AlignRight
Layout.margins: Constants.largeMargin
Layout.fillHeight: true
Text {
Text
{
text: qsTr("Contributors")
color: palette.text.darker()
font: Constants.h5Font
@@ -141,7 +194,8 @@ Pexels")
textFormat: Text.MarkdownText
}
Text {
Text
{
id: contributorText
text: keroHelloAvatarRoot.contributors
color: palette.text.darker()
@@ -153,12 +207,14 @@ Pexels")
}
}
ColumnLayout {
ColumnLayout
{
Layout.alignment: Qt.AlignTop | Qt.AlignRight
Layout.margins: Constants.largeMargin
Layout.fillHeight: true
Text {
Text
{
text: qsTr("Special Thanks")
color: palette.text.darker()
font: Constants.h5Font
@@ -169,7 +225,8 @@ Pexels")
textFormat: Text.MarkdownText
}
Text {
Text
{
id: thanksText
text: keroHelloAvatarRoot.thanks
color: palette.text.darker()
@@ -183,10 +240,92 @@ Pexels")
}
}
}
}
}
Rectangle
{
Layout.fillWidth: true
Layout.preferredHeight: settingsUpdated ? 64 : 0
color: palette.base
border.color: palette.midlight
opacity: settingsUpdated ? 1 : 0
RowLayout
{
anchors.fill: parent
anchors.rightMargin: Constants.mediumMargin
Item
{
Layout.fillHeight: true
Layout.fillWidth: true
}
SquareButton
{
Layout.preferredHeight: 50
Layout.preferredWidth: 160
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
icon.source: "qrc:/images/icons/icons8-reply-arrow.svg"
text: qsTr("Reset")
}
SquareButton
{
Layout.preferredHeight: 50
Layout.preferredWidth: 160
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
icon.source: "qrc:/images/icons/icons8-check-mark.svg"
text: qsTr("Apply")
}
}
Behavior on opacity
{
NumberAnimation
{
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
Behavior on height
{
NumberAnimation
{
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
}
}
function applyCurrentSettings()
{
if(pageStack.currentIndex === 0 && wallpaperSettingsPage.updated)
{
wallpaperSettingsPage.apply()
}
else if(pageStack.currentIndex === 1 && komplexSettingsPage.updated)
{
komplexSettingsPage.apply()
}
}
function resetCurrentSettings()
{
if(pageStack.currentIndex === 0 && wallpaperSettingsPage.updated)
{
wallpaperSettingsPage.reset()
}
else if(pageStack.currentIndex === 1 && komplexSettingsPage.updated)
{
komplexSettingsPage.reset()
}
}
}
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -63,4 +82,17 @@ Item {
}
}
}
Settings
{
id: settings
property bool animationsEnabled: true
//ms length of page change
property int pageChangeAnimationDuration: 250
property int pageFadeAnimationDuration: 250
property int slowAnimationDuration: 750
property int normalAnimationDuration: 250
property int fastAnimationDuration: 125
}
}
+44 -9
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -66,6 +85,15 @@ Item
}
}
}
Behavior on opacity
{
NumberAnimation
{
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
Rectangle
@@ -80,22 +108,16 @@ Item
{
id: viewMoreVideoPopup
anchors.fill: parent
visible: opacity > 0.01
opacity: 0
Behavior on opacity
{
NumberAnimation
{
duration: 250
}
}
}
Behavior on opacity
{
NumberAnimation
{
duration: 250
duration: settings.animationsEnabled ?
settings.normalAnimationDuration : 0
}
}
}
@@ -122,4 +144,17 @@ Item
paginator.opacity = 1
rootItem.popup = false
}
Settings
{
id: settings
property bool animationsEnabled: true
//ms length of page change
property int pageChangeAnimationDuration: 250
property int pageFadeAnimationDuration: 250
property int slowAnimationDuration: 750
property int normalAnimationDuration: 250
property int fastAnimationDuration: 125
}
}
+207 -48
View File
@@ -23,13 +23,29 @@
*/
// pragma ComponentBehavior: Bound
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Dialogs
import QtQuick.Layouts
//import org.kde.kirigami as Kirigami
//import org.kde.plasma.core as PlasmaCore
import QtCore
import Qt.labs.folderlistmodel 2.15
import KomplexHub
@@ -52,13 +68,9 @@ Item
id: root
property alias cfg_pauseMode: pauseModeCombo.currentIndex
property alias cfg_isPaused: runningCombo.checked
property alias cfg_shaderSpeed: speedSlider.value
property alias cfg_mouseSpeedBias: mouseBiasSlider.value
property bool cfg_infoPlasma6Preview_dismissed
property bool cfg_warningResources_dismissed
property bool cfg_emergencyHelp_dismissed
property bool cfg_infoiChannelSettings_dismissed
property alias cfg_enableMouseTracking: mouseTrackingCheckbox.checked
property alias cfg_checkActiveScreen: activeScreenOnlyCheckbox.checked
property alias cfg_excludeWindows: excludeWindows.windows
property alias cfg_running: runningCombo.checked
@@ -77,6 +89,9 @@ Item
property bool enableMouseTracking: true
property real mouseTrackingBias: 0.5
property bool updated: updates.length > 0
property var updates: []
Rectangle {
anchors.fill: parent
color: "transparent"
@@ -123,19 +138,17 @@ Item
currentIndex: manager.shaderPackIndex
displayText: currentIndex === -1 ? "Custom File" : currentText.replace("_", " ").charAt(0).toUpperCase() + currentText.replace("_", " ").slice(1)
// onCurrentTextChanged:
// {
// root.cfg_shader_package_index = currentIndex;
// if (root.cfg_shader_package_index === -1)
// return;
// var source = currentText
// shaderPackModel.loadMetadata(source)
// root.cfg_shader_package = "file://" + shaderPackModel.path(source)
// }
onCurrentIndexChanged:
{
if(updates.indexOf("wallpaper") >= 0 && value === manager.shaderPackIndex)
{
updates.slice(updates.indexOf("wallpaper"), 1)
}
else
{
updates.push("wallpaper")
}
}
}
Item { Layout.preferredHeight: Constants.smallMargin }
@@ -174,6 +187,15 @@ Item
onEditingFinished: () =>
{
value = parseInt(text)
if(updates.indexOf("resolutionX") >= 0 && value === manager.resolutionX)
{
updates.slice(updates.indexOf("resolutionX"), 1)
}
else
{
updates.push("resolutionX")
}
}
Keys.onPressed: (event) =>
@@ -196,7 +218,8 @@ Item
}
}
Text {
Text
{
text: qsTr("Y")
font: Constants.h3Font
color: palette.text
@@ -205,7 +228,8 @@ Item
verticalAlignment: Text.AlignVCenter
}
TextField {
TextField
{
property int value: manager.resolutionY
Layout.preferredHeight: 36
@@ -219,6 +243,15 @@ Item
onEditingFinished: () =>
{
value = parseInt(text)
if(updates.indexOf("resolutionY") >= 0 && value === manager.resolutionY)
{
updates.slice(updates.indexOf("resolutionY"), 1)
}
else
{
updates.push("resolutionY")
}
}
Keys.onPressed: (event) =>
@@ -248,7 +281,8 @@ Item
{
Layout.fillWidth: true
Text {
Text
{
text: qsTr("Frame Rate")
font: Constants.h3Font
color: palette.text
@@ -263,7 +297,19 @@ Item
from: 1
to: 60
stepSize: 0.01
onValueChanged: frameRateField.text = String(value.toFixed(2));
onValueChanged:
{
frameRateField.text = String(value.toFixed(2));
if(updates.indexOf("frameRate") >= 0 && value === manager.targetFramerate)
{
updates.slice(updates.indexOf("frameRate"), 1)
}
else
{
updates.push("frameRate")
}
}
Component.onCompleted: () => {
value = manager.targetFramerate
@@ -313,7 +359,8 @@ Item
id: speedLayout
Layout.fillWidth: true
Text {
Text
{
text: qsTr("Shader Speed")
font: Constants.h3Font
color: palette.text
@@ -329,9 +376,22 @@ Item
from: -4.0
to: 4.0
stepSize: 0.01
onValueChanged: shaderSpeedField.text = String(value.toFixed(2));
onValueChanged:
{
if(updates.indexOf("shaderSpeed") >= 0 && value === manager.shaderSpeed)
{
updates.slice(updates.indexOf("shaderSpeed"), 1)
}
else
{
updates.push("shaderSpeed")
}
Component.onCompleted: () => {
shaderSpeedField.text = String(value.toFixed(2));
}
Component.onCompleted: () =>
{
value = manager.shaderSpeed
}
}
@@ -414,7 +474,17 @@ Item
]
textRole: modelData
//onCurrentIndexChanged: root.cfg_pauseMode = currentIndex
onCurrentIndexChanged:
{
if(updates.indexOf("pauseMode") && currentIndex === manager.pauseMode)
{
updates.slice(updates.indexOf("pauseMode"), 1)
}
else
{
updates.push("pauseMode")
}
}
currentIndex: manager.pauseMode
}
}
@@ -434,7 +504,8 @@ Item
{
Layout.fillWidth: true
Text {
Text
{
text: qsTr("Excluded Windows")
font: Constants.h3Font
color: palette.text
@@ -451,6 +522,15 @@ Item
onEditingFinished: () =>
{
windows = excludeWindows.text.trim().replace(/\s+/g, "").split(",");
if(updates.indexOf("excludeWindows") >= 0 && windows === manager.excludedWindows)
{
updates.slice(updates.indexOf("excludeWindows"), 1)
}
else
{
updates.push("excludeWindows")
}
}
ToolTip.visible: hovered
@@ -462,16 +542,27 @@ Item
CheckBox
{
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", cfg_isPaused ? "Playing" : "Paused")
id: runningCombo
checked: manager.running
text: qsTr("Shader Is Running")
onCheckedChanged:
{
if(updates.indexOf("shaderRunning") > 0 && checked === manager.running)
{
updates.slice(updates.indexOf("shaderRunning"), 1)
}
else
{
updates.push("shaderRunning")
}
}
}
Item { Layout.preferredHeight: Constants.largeMargin }
Text {
Text
{
text: qsTr("Mouse Tracking")
font: Constants.h2Font
color: palette.text
@@ -483,14 +574,15 @@ Item
{
Layout.fillWidth: true
Text {
text: qsTr("Mouse Tracking Bias")
Text
{
text: qsTr("Mouse Speed Bias")
font: Constants.h3Font
color: palette.text
verticalAlignment: Text.AlignVCenter
Layout.preferredHeight: 36
}
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", "Mouse bias:")
Slider
{
id: mouseBiasSlider
@@ -503,6 +595,15 @@ Item
onValueChanged: () =>
{
mouseBiasField.text = String(value.toFixed(2));
if(updates.indexOf("mouseSpeedBias") >= 0 && value === manager.mouseTrackingBias)
{
updates.slice(updates.indexOf("mouseSpeedBias"), 1)
}
else
{
updates.push("mouseSpeedBias")
}
}
}
TextField
@@ -549,19 +650,29 @@ Item
CheckBox
{
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", cfg_isPaused ? "Playing" : "Paused")
id: mouseTrackingCheckbox
checked: manager.mouseTrackingEnabled
text: qsTr("Mouse Tracking Enabled")
onCheckedChanged:
{
if(updates.indexOf("mouseEnabled") >= 0 && currentIndex === manager.mouseTrackingEnabled)
{
updates.slice(updates.indexOf("mouseEnabled"), 1)
}
else
{
updates.push("mouseEnabled")
}
}
}
// Button
// {
// visible: navBar.currentIndex === 2
// id: kofiButton
// Layout.preferredWidth: Kirigami.Units.gridUnit * 5
// Layout.preferredHeight: Kirigami.Units.gridUnit * 3
// Layout.preferredWidth: 4 * 5
// Layout.preferredHeight: 4 * 3
// contentItem: RowLayout
// {
@@ -598,10 +709,9 @@ Item
RowLayout
{
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", "Author:")
Text
{
Layout.preferredWidth: Kirigami.Units.gridUnit * 11
Layout.preferredWidth: 4 * 11
text: shaderPackModel.metadata.author
horizontalAlignment: Text.AlignLeft
color: palette.text
@@ -610,10 +720,9 @@ Item
RowLayout
{
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", "Description:")
Text
{
Layout.preferredWidth: Kirigami.Units.gridUnit * 16
Layout.preferredWidth: 4 * 16
text: shaderPackModel.metadata.description
horizontalAlignment: Text.AlignLeft
color: palette.text
@@ -625,10 +734,9 @@ Item
RowLayout
{
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", "License:")
Text
{
Layout.preferredWidth: Kirigami.Units.gridUnit * 11
Layout.preferredWidth: 4 * 11
text: shaderPackModel.metadata.license
horizontalAlignment: Text.AlignLeft
color: palette.text
@@ -637,10 +745,9 @@ Item
RowLayout
{
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", "Version:")
Text
{
Layout.preferredWidth: Kirigami.Units.gridUnit * 11
Layout.preferredWidth: 4 * 11
text: shaderPackModel.metadata.version
horizontalAlignment: Text.AlignLeft
color: palette.text
@@ -649,4 +756,56 @@ Item
}
}
}
Settings
{
id: settings
property bool animationsEnabled: true
//ms length of page change
property int pageChangeAnimationDuration: 250
property int pageFadeAnimationDuration: 250
property int slowAnimationDuration: 750
property int normalAnimationDuration: 250
property int fastAnimationDuration: 125
}
function apply()
{
if(updated)
{
manager.pauseMode = cfg_pauseMode
manager.shaderSpeed = cfg_shaderSpeed
manager.mouseTrackingBias = cfg_mouseSpeedBias
manager.mouseTrackingEnabled = cfg_enableMouseTracking
manager.onlyCheckActiveScreen = cfg_checkActiveScreen
manager.excludedWindows = cfg_excludeWindows
manager.running = cfg_running
manager.resolutionX = cfg_resolution_x
manager.resolutionY = cfg_resolution_y
manager.targetFramerate = cfg_framerate_limit
updates.splice(0, updates.length)
}
}
function reset()
{
if(updated)
{
cfg_pauseMode = manager.pauseMode
cfg_shaderSpeed = manager.shaderSpeed
cfg_mouseSpeedBias = manager.mouseTrackingBias
cfg_enableMouseTracking = manager.mouseTrackingEnabled
cfg_checkActiveScreen = manager.onlyCheckActiveScreen
cfg_excludeWindows = manager.excludedWindows
cfg_running = manager.running
cfg_resolution_x = manager.resolutionX
cfg_resolution_y = manager.resolutionY
cfg_framerate_limit = manager.targetFramerate
updates.splice(0, updates.length)
}
}
}
+19
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
+19
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
+19
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
+51
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -164,6 +183,14 @@ Item
}
}
Behavior on opacity
{
NumberAnimation
{
duration: 250
}
}
states:
[
State
@@ -294,6 +321,14 @@ Item
thumbnail: rootItem.thumbnail
opacity: 0
visible: opacity > 0.01
Behavior on opacity
{
NumberAnimation
{
duration: 250
}
}
}
CompletedView
@@ -304,6 +339,14 @@ Item
opacity: 0
visible: opacity > 0.01
manager: downloadManager
Behavior on opacity
{
NumberAnimation
{
duration: 250
}
}
}
ErrorView
@@ -314,6 +357,14 @@ Item
opacity: 0
visible: opacity > 0.01
manager: downloadManager
Behavior on opacity
{
NumberAnimation
{
duration: 250
}
}
}
function download()
+110
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -148,6 +167,15 @@ Item
}
}
}
Behavior on opacity
{
NumberAnimation
{
duration: 250
}
}
states:
[
State
@@ -180,6 +208,64 @@ Item
}
},
State
{
name: "compiling"
when: downloadManager.state === DownloadManager.Compiling
PropertyChanges
{
target: pageView
opacity: 0
}
PropertyChanges
{
target: downloadView
opacity: 1
}
PropertyChanges
{
target: completedView
opacity: 0
}
PropertyChanges
{
target: errorView
opacity: 0
}
},
State
{
name: "installing"
when: downloadManager.state === DownloadManager.Installing
PropertyChanges
{
target: pageView
opacity: 0
}
PropertyChanges
{
target: downloadView
opacity: 1
}
PropertyChanges
{
target: completedView
opacity: 0
}
PropertyChanges
{
target: errorView
opacity: 0
}
},
State
{
name: "complete"
when: downloadManager.state === DownloadManager.Complete
@@ -278,6 +364,14 @@ Item
thumbnail: rootItem.thumbnail
opacity: 0
visible: opacity > 0.01
Behavior on opacity
{
NumberAnimation
{
duration: 250
}
}
}
CompletedView
@@ -288,6 +382,14 @@ Item
opacity: 0
visible: opacity > 0.01
manager: downloadManager
Behavior on opacity
{
NumberAnimation
{
duration: 250
}
}
}
ErrorView
@@ -298,6 +400,14 @@ Item
opacity: 0
visible: opacity > 0.01
manager: downloadManager
Behavior on opacity
{
NumberAnimation
{
duration: 250
}
}
}
function download()
+51
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -154,6 +173,14 @@ Item
}
}
Behavior on opacity
{
NumberAnimation
{
duration: 250
}
}
states:
[
State
@@ -284,6 +311,14 @@ Item
thumbnail: rootItem.thumbnail
opacity: 0
visible: opacity > 0.01
Behavior on opacity
{
NumberAnimation
{
duration: 250
}
}
}
CompletedView
@@ -294,6 +329,14 @@ Item
opacity: 0
visible: opacity > 0.01
manager: downloadManager
Behavior on opacity
{
NumberAnimation
{
duration: 250
}
}
}
ErrorView
@@ -304,6 +347,14 @@ Item
opacity: 0
visible: opacity > 0.01
manager: downloadManager
Behavior on opacity
{
NumberAnimation
{
duration: 250
}
}
}
function download()
+3 -3
View File
@@ -13,9 +13,9 @@ qt6_add_qml_module(KomplexHubModule
RESOURCE_PREFIX "/qt/qml"
QML_FILES
"Constants.qml"
"EventListModel.qml"
"EventListSimulator.qml"
"WallpaperModelData.qml"
)
set_target_properties(KomplexHubModule PROPERTIES VERSION "1.0")
+20 -5
View File
@@ -1,8 +1,27 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
pragma Singleton
import QtQuick
import QtQuick.Studio.Application
QtObject {
QtObject
{
readonly property int width: 1920
readonly property int height: 1080
@@ -62,8 +81,4 @@ QtObject {
readonly property int slowAnimationDuration: 750
readonly property int normalAnimationDuration: 250
readonly property int fastAnimationDuration: 125
// property StudioApplication application: StudioApplication {
// fontPath: Qt.resolvedUrl("../KomplexHubContent/" + relativeFontDirectory)
// }
}
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Effects
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
+19
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
+19
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
+18 -5
View File
@@ -1,9 +1,22 @@
/*
This is a UI file (.ui.qml) that is intended to be edited in Qt Design Studio only.
It is supposed to be strictly declarative and only uses a subset of QML. If you edit
this file manually, you might introduce QML code that is not supported by Qt Design Studio.
Check out https://doc.qt.io/qtcreator/creator-quick-ui-forms.html for details on .ui.qml files.
*/
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
+19
View File
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Shapes
import QtQuick.Effects
@@ -1,3 +1,22 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtCore
import QtQuick
import QtQuick.Layouts
-12
View File
@@ -1,12 +0,0 @@
import QtQuick
ListModel {
id: eventListModel
ListElement {
eventId: "enterPressed"
eventDescription: "Emitted when pressing the enter button"
shortcut: "Return"
parameters: "Enter"
}
}
-22
View File
@@ -1,22 +0,0 @@
import QtQuick
import QtQuick.Studio.EventSimulator
import QtQuick.Studio.EventSystem
QtObject {
id: simulator
property bool active: true
property Timer __timer: Timer {
id: timer
interval: 100
onTriggered: {
EventSimulator.show()
}
}
Component.onCompleted: {
EventSystem.init(Qt.resolvedUrl("EventListModel.qml"))
if (simulator.active)
timer.start()
}
}
@@ -1,3 +1,21 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -1,3 +1,21 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
+18
View File
@@ -1,3 +1,21 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
+18
View File
@@ -1,3 +1,21 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtQuick
import QtQuick.Controls 2.0
import QtQuick.Layouts
+18
View File
@@ -1,3 +1,21 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -1,3 +1,21 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -1,3 +1,21 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -1,3 +1,21 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -1,3 +1,21 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2026 @DigitalArtifex
* https://digitalartifex.dev - https://github.com/DigitalArtifex
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>
*/
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
-67
View File
@@ -1,67 +0,0 @@
import QtQuick
import QtQuick.Controls
ListModel {
ListElement {
author: "Wizmart"
name: "Some cool name 1"
description: "This is not a real wallpaper or person"
thumbnail: ""
uuid: "{aafd-311-afaa}"
url: ""
}
ListElement {
author: "Wizmart"
name: "Some cool name 2"
description: "This is not a real wallpaper or person"
thumbnail: ""
uuid: "{aafd-311-afaa}"
url: ""
}
ListElement {
author: "Wizmart"
name: "Some cool name 3"
description: "This is not a real wallpaper or person"
thumbnail: ""
uuid: "{aafd-311-afaa}"
url: ""
}
ListElement {
author: "Wizmart"
name: "Some cool name 4"
description: "This is not a real wallpaper or person"
thumbnail: ""
uuid: "{aafd-311-afaa}"
url: ""
}
ListElement {
author: "Wizmart"
name: "Some cool name 5"
description: "This is not a real wallpaper or person"
thumbnail: ""
uuid: "{aafd-311-afaa}"
url: ""
}
ListElement {
author: "Wizmart"
name: "Some cool name 6"
description: "This is not a real wallpaper or person"
thumbnail: ""
uuid: "{aafd-311-afaa}"
url: ""
}
ListElement {
author: "Wizmart"
name: "Some cool name 7"
description: "This is not a real wallpaper or person"
thumbnail: ""
uuid: "{aafd-311-afaa}"
url: ""
}
}
+1 -1
View File
@@ -249,7 +249,7 @@ auto InstalledPackManager::setState(State state) -> void
auto InstalledPackManager::resetState() -> void
{
setState(Idle); // TODO: Adapt to use your actual default value
setState(Idle);
}
auto InstalledPackManager::roleNames() const -> QHash<int, QByteArray>
+13 -49
View File
@@ -24,17 +24,17 @@ PackCompiler::PackCompiler(QObject *parent)
auto PackCompiler::reset() -> void
{
setError({}, {});
setProgress(std::numeric_limits<qreal>::infinity());
setTotalSteps(0);
setCurrentStep(0);
setCompilerOutput({});
setStatus({});
setState(Idle);
}
auto PackCompiler::build(const QUrl &uri) -> QUrl
{
setState(Compiling);
setStatus(QStringLiteral("Preparing Komplex Pack For Building"));
BuildContext *context = new BuildContext;
QUrl extractedUri = extract(uri);
@@ -42,6 +42,8 @@ auto PackCompiler::build(const QUrl &uri) -> QUrl
context->commonData = loadCommonData(extractedUri);
processShaders(extractedUri, context);
setState(Complete);
setStatus(QStringLiteral("Complete"));
delete context;
return extractedUri;
@@ -50,6 +52,7 @@ auto PackCompiler::build(const QUrl &uri) -> QUrl
auto PackCompiler::extract(const QUrl &sourceUri) noexcept(false) -> const QUrl
{
validateUri(sourceUri);
setStatus(QStringLiteral("Extracting Komplex Pack"));
QFileInfo info(sourceUri.toLocalFile());
@@ -77,7 +80,6 @@ auto PackCompiler::extract(const QUrl &sourceUri) noexcept(false) -> const QUrl
}
run(QStringLiteral("tar"), arguments);
QFile::remove(sourceUri.toLocalFile());
return std::move(outputUri);
@@ -101,6 +103,7 @@ auto PackCompiler::validatePack(const QUrl &uri) const noexcept(false) -> void
auto PackCompiler::loadCommonData(const QUrl &uri) -> QMap<QByteArray,QByteArray>
{
validateUri(uri);
setStatus(QStringLiteral("Loading Common Data"));
QMap<QByteArray,QByteArray> commonData;
@@ -166,18 +169,21 @@ auto PackCompiler::processShaders(const QUrl &uri, BuildContext *context) -> voi
const QStringList entries = shaderDirectory.entryList();
setTotalSteps(entries.count());
setProgress(0);
for(const QString &entry : entries)
{
QFileInfo entryInfo(shaderDirectory.absoluteFilePath(entry));
QByteArray shaderData;
QUrl entryUri = QStringLiteral("file://%1").arg
(
entryInfo.absoluteFilePath()
);
shaderData += readFile(entryUri);
setStatus(QStringLiteral("Compiling: %1").arg(entry));
QShader::Stage stage = getStageFromSuffix(entryInfo.suffix());
QByteArray shaderData = readFile(entryUri);
appendCommonData(&shaderData, entryInfo.suffix().toUtf8(), context);
replaceUniformVariables(&shaderData);
@@ -195,6 +201,7 @@ auto PackCompiler::processShaders(const QUrl &uri, BuildContext *context) -> voi
save(outputUri, shader);
QFile::remove(entryUri.toLocalFile());
incrementCompileStep();
}
}
@@ -237,13 +244,6 @@ auto PackCompiler::compile(const QByteArray &data, const QString &filename, cons
if(!shader.isValid())
{
QUrl errorUri
(
QStringLiteral("file://tmp/_err")
);
writeFile(errorUri, data);
throw shader::logic_error
(
std::string("Compiler Error"),
@@ -541,42 +541,6 @@ auto PackCompiler::setProgress(qreal progress) -> void
Q_EMIT progressChanged();
}
void PackCompiler::setCompilerOutput(const QString &compilerOutput)
{
if (m_compilerOutput == compilerOutput)
{
return;
}
m_compilerOutput = compilerOutput;
emit compilerOutputChanged();
}
auto PackCompiler::setError(const QString &title, const QString &message, const QUrl &uri) -> void
{
if(title == m_errorTitle && message == m_errorMessage)
{
return;
}
m_errorMessage = std::move(message);
m_errorTitle = std::move(title);
if(uri.isValid() && uri.isLocalFile())
{
QFile errorFile(uri.toLocalFile());
if(errorFile.open(QFile::ReadWrite | QFile::Append))
{
errorFile.write(message.toLocal8Bit() + QByteArray("\n"));
}
}
Q_EMIT errorTitleChanged();
Q_EMIT errorMessageChanged();
Q_EMIT errorOcurred();
}
auto PackCompiler::setState(State state) -> void
{
if(state == m_state)
+201 -28
View File
@@ -59,7 +59,6 @@
struct KOMPLEX_EXPORT BuildContext
{
QMap<QByteArray, QByteArray> commonData;
QPromise<QUrl> promise;
};
/**
@@ -83,6 +82,10 @@ class PackCompiler : public QObject
Q_OBJECT
public:
/**
* @brief The State enum
* Enum of the possible states of the compiler
*/
enum State
{
Idle,
@@ -94,23 +97,59 @@ public:
explicit PackCompiler(QObject *parent = nullptr);
auto compilerOutput() const -> const QString & { return m_compilerOutput; }
/**
* @brief progress
* Current compiler progress
* @return
*/
auto progress() -> qreal { return m_progress; }
/**
* @brief currentStep
* Current compiler step
* @return
*/
auto currentStep() -> qint64 { return m_currentStep; }
/**
* @brief totalSteps
* Total steps in the current compile
* @return
*/
auto totalSteps() -> qint64 { return m_totalSteps; }
auto errorTitle() const -> const QString & { return m_errorTitle; }
auto errorMessage() const -> const QString & { return m_errorMessage; }
/**
* @brief status
* Current status message
* @return
*/
auto status() const -> const QString & { return m_status; }
/**
* @brief state
* Current compiler state
* @return
*/
auto state() const -> State { return m_state; }
/**
* @brief reset
* Resets the compiler state
*/
auto reset() -> void;
/**
* @brief build
* Builds a Komplex pack from a tar.gz file
* @param uri
* Uri of the tar.gz
* @return
* Uri of the built pack
*/
auto build(const QUrl &uri) -> QUrl;
signals:
auto compilerOutputChanged() -> void;
auto errorOcurred() -> void;
auto errorTitleChanged() -> void;
auto errorMessageChanged() -> void;
auto stateChanged() -> void;
auto progressChanged() -> void;
auto currentStepChanged() -> void;
@@ -230,36 +269,161 @@ private:
auto compile(const QByteArray &data, const QString &filename, const QShader::Stage stage) noexcept(false) -> QShader;
//[13]
/**
* @brief save
* Saves a serialized version of the shader to the specified uri
* @param uri
* Uri of the file to create
* @param shader
* The compiled shader
*/
auto save(const QUrl &uri, const QShader &shader) noexcept(false) -> void;
//helpers
//@BEGIN helpers
/**
* @brief validateUri
* Validates that the uri is a local file or direcotry
* @param uri
*/
auto validateUri(const QUrl &uri) const noexcept(false) -> void;
/**
* @brief run
* Runs the supplied command with the given arguments as a QProcess. If
* data is supplied, it is written to the standard input channel after the
* process has started
* @param command
* System command or program to run
* @param arguments
* QStringList of the given arguments. Minimal wildcard expansion available.
* @param data
* Optional data to write
* @return
* Standard non-error output
*/
auto run(const QString &command, const QStringList &arguments, const QByteArray &data = {}) noexcept(false) -> QByteArray;
/**
* @brief readFile
* Reads the file at the given uri and returns its data
* @param uri
* Uri of the file
* @return
* File contents
*/
auto readFile(const QUrl &uri) noexcept(false) -> QByteArray;
/**
* @brief writeFile
* Writes the supplied data to the given uri
* @param uri
* Uri of the file
* @param data
* Data to write
*/
auto writeFile(const QUrl &uri, const QByteArray &data) noexcept(false) -> void;
/**
* @brief copyFile
* Copys file to new uri
* @param sourceUri
* File to copy
* @param destinationUri
* New file location/name
*/
auto copyFile(const QUrl &sourceUri, const QUrl &destinationUri) noexcept(false) -> void;
/**
* @brief createDirectory
* QDir::mkpath was failing, so this helper function calls mkdir -p
* @param uri
* Directory path to create
*/
auto createDirectory(const QUrl &uri) noexcept(false) -> void;
/**
* @brief removeDirectory
* Calls rm -rf, but should be replaced with an agnostic solution
* @param uri
* Directory to remove
*/
auto removeDirectory(const QUrl &uri) noexcept(false) -> void;
/**
* @brief getStageFromSuffix
* Supplies the stage/type of shader based on the shaders file extension
* @param suffix
* @return
*/
auto getStageFromSuffix(const QString &suffix) const -> QShader::Stage;
auto setError(const QString &title, const QString &message, const QUrl &uri = {}) -> void;
auto setCompilerOutput(const QString &compilerOutput) -> void;
/**
* @brief setState
* Sets the current state of the compiler
* @param state
*/
auto setState(State state) -> void;
/**
* @brief setProgress
* Sets the current progress of the compiler
* @param progress
*/
auto setProgress(qreal progress) -> void;
/**
* @brief setTotalSteps
* Sets the total steps pack will take to build
* @param steps
*/
auto setTotalSteps(qint64 steps) -> void;
/**
* @brief setCurrentStep
* Sets the current step
* @param step
*/
auto setCurrentStep(qint64 step) -> void;
/**
* @brief setStatus
* Sets the current status message
* @param status
*/
auto setStatus(const QString &status) -> void;
/**
* @brief incrementCompileStep
* Increments the current step and updates progress
*/
auto incrementCompileStep() -> void;
//@END helpers
#ifdef HAS_VULKAN
/**
* @brief vulkanVersion
* Returns the current version reported by the vulkan api
* @return
*/
auto vulkanVersion() const -> qint32;
#endif
#ifdef HAS_OPENGL
/**
* @brief openGlVersion
* Returns the current version reported by the opengl api
* @return
*/
auto openGlVersion() const -> qint32;
#endif
//members
/**
* @brief m_updateVariables
* Standard variables expected by most online shaders, mainly
* shadertoy and similar.
*/
static inline const QStringList m_updateVariables
{
QStringLiteral("iTime"),
@@ -275,6 +439,16 @@ private:
QStringLiteral("iChannelResolution")
};
/**
* @brief m_variableExpressions
* Regular expressions of standardized variables. Built at runtime
*/
static inline QList<QRegularExpression> m_variableExpressions;
/**
* @brief m_shaderNameFilters
* Name filters for supported shader types
*/
static inline const QStringList m_shaderNameFilters
{
QStringLiteral("*.frag"),
@@ -286,6 +460,10 @@ private:
QStringLiteral("*.glsl")
};
/**
* @brief m_shaderStages
* Map of supported file suffix to their QShader::Stage
*/
static inline const QMap<QString, QShader::Stage> m_shaderStages
{
{
@@ -314,11 +492,19 @@ private:
}
};
/**
* @brief m_version
* Version to be appended to the shader before build
*/
static inline const QByteArray m_version
{
R"(#version 450)"
};
/**
* @brief m_header
* Header to be appended to the shader before build
*/
static inline const QByteArray m_header
{
R"(layout(location = 0) in vec2 qt_TexCoord0;
@@ -348,6 +534,10 @@ layout(binding = 4) uniform sampler2D iChannel3;
vec2 fragCoord = vec2(qt_TexCoord0.x, 1.0 - qt_TexCoord0.y) * ubuf.iResolution.xy;)"
};
/**
* @brief m_footer
* Footer to be appended to the shader before build
*/
static inline const QByteArray m_footer
{
R"(
@@ -358,29 +548,12 @@ void main() {
})"
};
QMap<QByteArray, QByteArray> m_commonData;
QMap<QByteArray, QShaderBaker> m_shaders;
QString m_compilerOutput;
QString m_errorMessage;
QString m_errorTitle;
QString m_status;
State m_state;
qreal m_currentStep = 0;
qreal m_progress = 0;
qreal m_totalSteps = 0;
QString m_status;
QMutex m_downloadMutex;
QFuture<QUrl> m_buildFuture;
static inline QList<QRegularExpression> m_variableExpressions;
Q_PROPERTY(QString compilerOutput READ compilerOutput WRITE setCompilerOutput NOTIFY compilerOutputChanged FINAL)
Q_PROPERTY(QString errorTitle READ errorTitle NOTIFY errorTitleChanged FINAL)
Q_PROPERTY(QString errorMessage READ errorMessage NOTIFY errorMessageChanged FINAL)
Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged FINAL)
Q_PROPERTY(qint64 totalSteps READ totalSteps NOTIFY totalStepsChanged FINAL)
Q_PROPERTY(qint64 currentStep READ currentStep NOTIFY currentStepChanged FINAL)