Inital commit of the Komplex Hub

This commit is contained in:
Digital Artifex
2026-06-02 15:11:36 -04:00
commit 15a625008e
2911 changed files with 655555 additions and 0 deletions
+18
View File
@@ -0,0 +1,18 @@
import QtQuick
import KomplexHub
Window {
visible: true
flags: Qt.Window
title: "KomplexHub"
MainScreen {
antialiasing: true
id: mainScreen
anchors.fill: parent
}
}
@@ -0,0 +1,8 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {}
@@ -0,0 +1,6 @@
<RCC>
<qresource prefix="/">
<file alias="/qt/qml/KomplexHubContent">/home/parametheus/Projects/QtDesigner/KomplexHub/build/qml/KomplexHubContent</file>
</qresource>
</RCC>
+285
View File
@@ -0,0 +1,285 @@
/*
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.
*/
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import KomplexHub
import KomplexHub.Controls
import KomplexHub.Kero
Rectangle {
property MenuButton currentMenuButton
id: windowRoot
color: palette.window
RowLayout {
id: windowRootLayout
anchors.fill: parent
Rectangle {
id: windowMenu
Layout.fillWidth: false
Layout.fillHeight: true
Layout.preferredWidth: 100
Layout.minimumWidth: 100
Layout.maximumWidth: 100
color: palette.base
ColumnLayout {
id: windowMenuLayout
anchors.fill: parent
MenuButton {
id: homeMenubutton
Layout.alignment: Qt.AlignTop
height: 64
width: 100
text: "Home"
icon.height: 32
icon.width: 32
icon.url: Qt.resolvedUrl("images/icons/icons8-famous.svg")
onTriggered: () => {
pageLoader.page = "pages/HomePage.qml"
currentMenuButton.selected = false
currentMenuButton = this
searchContainer.preferredHeight = 0
}
}
MenuButton {
Layout.alignment: Qt.AlignTop
height: 64
width: 100
text: "Images"
icon.height: 32
icon.width: 32
icon.url: Qt.resolvedUrl("images/icons/icons8-image.svg")
onTriggered: () => {
pageLoader.page = "pages/ImageSearchPage.qml"
currentMenuButton.selected = false
currentMenuButton = this
searchContainer.preferredHeight = 36
}
}
MenuButton {
Layout.alignment: Qt.AlignTop
height: 64
width: 100
text: "Live"
icon.height: 32
icon.width: 32
icon.url: Qt.resolvedUrl("images/icons/icons8-biotech.svg")
onTriggered: () => {
pageLoader.page = "pages/LiveSearchPage.qml"
currentMenuButton.selected = false
currentMenuButton = this
searchContainer.preferredHeight = 36
}
}
MenuButton {
Layout.alignment: Qt.AlignTop
height: 64
width: 100
text: "Installed"
icon.height: 32
icon.width: 32
icon.url: Qt.resolvedUrl("images/icons/icons8-hdd.svg")
onTriggered: () => {
pageLoader.page = "pages/InstalledWallpaperPage.qml"
currentMenuButton.selected = false
currentMenuButton = this
searchContainer.preferredHeight = 0
}
}
Item {
Layout.fillHeight: true
}
MenuButton {
Layout.alignment: Qt.AlignBottom
height: 64
width: 100
text: "Settings"
icon.height: 32
icon.width: 32
icon.url: Qt.resolvedUrl("images/icons/icons8-settings.svg")
onTriggered: () => {
pageLoader.page = "pages/SettingsPage.qml"
currentMenuButton.selected = false
currentMenuButton = this
searchContainer.preferredHeight = 0
}
}
}
}
Rectangle {
id: windowContainer
Layout.fillHeight: true
Layout.fillWidth: true
Layout.topMargin: 3
color: palette.window
ColumnLayout {
id: windowContainerLayout
anchors.fill: parent
SearchBar {
property int preferredHeight: 36
id: searchContainer
Layout.fillHeight: false
Layout.fillWidth: true
Layout.preferredHeight: preferredHeight
Layout.minimumHeight: preferredHeight
Layout.maximumHeight: preferredHeight
icon: Qt.resolvedUrl("images/icons/icons8-search.svg")
Behavior on preferredHeight {
NumberAnimation { duration: Constants.normalAnimationDuration }
}
}
Loader {
property bool loading: false
property string page
onPageChanged: () => {
loading = true
fadeOutPage()
}
id: pageLoader
Layout.fillHeight: true
Layout.fillWidth: true
OpacityAnimator on opacity {
id: pageLoaderAnimation
target: pageLoader
duration: 150
onFinished: () => {
if(pageLoader.loading && pageLoader.opacity === 0)
pageLoader.loadPage()
else if(pageLoader.loading && pageLoader.opacity === 1)
pageLoader.loading = false
}
}
function fadeOutPage() {
pageLoaderAnimation.from = 1
pageLoaderAnimation.to = 0
pageLoaderAnimation.start()
}
function fadeInPage() {
if(pageLoader.sourceComponent.status != Component.Ready)
return
pageLoaderAnimation.from = 0
pageLoaderAnimation.to = 1
pageLoaderAnimation.start()
}
function loadPage() {
sourceComponent = Qt.createComponent(page)
if(pageLoader.sourceComponent.status == Component.Ready)
fadeInPage()
else
statusChanged.connect(fadeInPage)
}
}
}
}
}
KeroBuildingAnimation {
id: buildingOverlay
anchors.fill: parent
visible: false
}
KeroLoadingAnimation {
id: loadingAnimation
anchors.fill: parent
// OpacityAnimator on opacity {
// duration: 150
// }
visible: opacity > 0
opacity: 0
}
Component.onCompleted: () => {
homeMenubutton.selected = true
currentMenuButton = homeMenubutton
pageLoader.page = "pages/HomePage.qml"
searchContainer.preferredHeight = 0
loadingAnimation.opacity = 0
}
states: [
State {
name: "build_error"
PropertyChanges {
target: windowOverlay
visible: true
}
},
State {
name: "building"
PropertyChanges {
target: buildingOverlay
visible: true
}
},
State {
name: "build_complete"
}
]
}
@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 72 72" width="64px" height="64px"><path d="M46.023,59.542c-1.008,0-2.016-0.378-2.794-1.137L23.183,38.844c-0.771-0.752-1.206-1.785-1.206-2.863 s0.435-2.11,1.206-2.863L43.19,13.596c1.582-1.542,4.113-1.512,5.657,0.069c1.542,1.581,1.512,4.114-0.069,5.656l-17.074,16.66 l17.113,16.698c1.581,1.542,1.611,4.075,0.069,5.656C48.103,59.138,47.063,59.542,46.023,59.542z"/></svg>

After

Width:  |  Height:  |  Size: 436 B

@@ -0,0 +1 @@
<?xml version="1.0"?><svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"> <path d="M6,2v46h38V2H6z M27,39H13v-2h14V39z M27,33H13v-2h14V33z M27,27H13v-2h14V27z M37,39h-5v-2h5V39z M37,33h-5v-2h5V33z M37,27h-5v-2h5V27z M37,13H13v-2h24V13z"/></svg>

After

Width:  |  Height:  |  Size: 298 B

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 8.9375 1.96875 C 8.863281 1.976563 8.792969 1.984375 8.71875 2 C 7.714844 2.15625 6.988281 3.046875 7.03125 4.0625 C 7.230469 11.042969 9.492188 15.933594 12.78125 19.375 C 15.101563 21.800781 17.84375 23.511719 20.625 25 C 13.867188 28.640625 7.34375 33.683594 7 45.96875 C 6.96875 47.074219 7.863281 47.96875 8.96875 48 C 8.988281 48 8.980469 48.03125 9 48.03125 C 10.078125 48.03125 10.96875 47.148438 11 46.0625 C 11.328125 34.269531 17.871094 30.816406 25.5 27 C 25.835938 26.925781 26.148438 26.761719 26.40625 26.53125 C 34.101563 22.675781 42.605469 18.125 43 4.03125 C 43.03125 2.925781 42.136719 2.03125 41.03125 2 C 39.953125 1.988281 39.03125 2.832031 39 3.9375 C 39 3.960938 39 3.976563 39 4 L 13 4 C 12.96875 4 12.9375 4 12.90625 4 C 12.875 4 12.84375 4 12.8125 4 C 12.261719 4.050781 11.855469 4.542969 11.90625 5.09375 C 11.957031 5.644531 12.449219 6.050781 13 6 L 38.84375 6 C 38.773438 6.695313 38.679688 7.367188 38.5625 8 L 13.59375 8 C 13.5625 8 13.53125 8 13.5 8 C 13.46875 8 13.4375 8 13.40625 8 C 12.855469 8.050781 12.449219 8.542969 12.5 9.09375 C 12.550781 9.644531 13.042969 10.050781 13.59375 10 L 38.09375 10 C 37.886719 10.714844 37.648438 11.367188 37.375 12 L 16 12 C 15.96875 12 15.9375 12 15.90625 12 C 15.875 12 15.84375 12 15.8125 12 C 15.261719 12.050781 14.855469 12.542969 14.90625 13.09375 C 14.957031 13.644531 15.449219 14.050781 16 14 L 36.34375 14 C 35.902344 14.71875 35.40625 15.382813 34.875 16 L 19.40625 16 C 19.375 16 19.34375 16 19.3125 16 C 19.28125 16 19.25 16 19.21875 16 C 18.667969 16.050781 18.261719 16.542969 18.3125 17.09375 C 18.363281 17.644531 18.855469 18.050781 19.40625 18 L 32.84375 18 C 31.976563 18.722656 31.046875 19.382813 30.0625 20 L 25 20 C 24.96875 20 24.9375 20 24.90625 20 C 24.875 20 24.84375 20 24.8125 20 C 24.261719 20.050781 23.855469 20.542969 23.90625 21.09375 C 23.957031 21.644531 24.449219 22.050781 25 22 L 26.46875 22 C 25.988281 22.25 25.492188 22.503906 25 22.75 C 21.441406 20.957031 18.105469 19.15625 15.65625 16.59375 C 12.996094 13.8125 11.179688 10.171875 11 3.96875 C 11 3.425781 10.78125 2.910156 10.390625 2.53125 C 10.003906 2.15625 9.480469 1.953125 8.9375 1.96875 Z M 31.4375 26.15625 C 30.261719 26.824219 29.089844 27.417969 27.9375 28 L 24.3125 28 C 24.269531 27.996094 24.230469 27.996094 24.1875 28 C 24.15625 28 24.125 28 24.09375 28 C 23.542969 28.058594 23.140625 28.558594 23.203125 29.109375 C 23.261719 29.660156 23.761719 30.0625 24.3125 30 L 30.03125 30 C 31.015625 30.628906 31.960938 31.289063 32.8125 32 L 18.8125 32 C 18.769531 31.996094 18.730469 31.996094 18.6875 32 C 18.65625 32 18.625 32 18.59375 32 C 18.042969 32.058594 17.640625 32.558594 17.703125 33.109375 C 17.761719 33.660156 18.261719 34.0625 18.8125 34 L 34.875 34 C 35.414063 34.621094 35.898438 35.28125 36.34375 36 L 15.59375 36 C 15.5625 36 15.53125 36 15.5 36 C 15.46875 36 15.4375 36 15.40625 36 C 14.855469 36.050781 14.449219 36.542969 14.5 37.09375 C 14.550781 37.644531 15.042969 38.050781 15.59375 38 L 37.40625 38 C 37.675781 38.625 37.917969 39.296875 38.125 40 L 13.59375 40 C 13.5625 40 13.53125 40 13.5 40 C 13.46875 40 13.4375 40 13.40625 40 C 12.855469 40.050781 12.449219 40.542969 12.5 41.09375 C 12.550781 41.644531 13.042969 42.050781 13.59375 42 L 38.5625 42 C 38.679688 42.632813 38.773438 43.304688 38.84375 44 L 13 44 C 12.96875 44 12.9375 44 12.90625 44 C 12.875 44 12.84375 44 12.8125 44 C 12.261719 44.050781 11.855469 44.542969 11.90625 45.09375 C 11.957031 45.644531 12.449219 46.050781 13 46 L 39 46 C 39 46.011719 39 46.019531 39 46.03125 C 39.03125 47.117188 39.890625 48 40.96875 48 C 40.988281 48 41.011719 47.96875 41.03125 47.96875 C 42.136719 47.9375 43 47.042969 42.96875 45.9375 C 42.640625 34.542969 36.996094 29.527344 31.4375 26.15625 Z"/></svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M25,2C12.319,2,2,12.319,2,25s10.319,23,23,23s23-10.319,23-23S37.681,2,25,2z M33.71,32.29c0.39,0.39,0.39,1.03,0,1.42 C33.51,33.9,33.26,34,33,34s-0.51-0.1-0.71-0.29L25,26.42l-7.29,7.29C17.51,33.9,17.26,34,17,34s-0.51-0.1-0.71-0.29 c-0.39-0.39-0.39-1.03,0-1.42L23.58,25l-7.29-7.29c-0.39-0.39-0.39-1.03,0-1.42c0.39-0.39,1.03-0.39,1.42,0L25,23.58l7.29-7.29 c0.39-0.39,1.03-0.39,1.42,0c0.39,0.39,0.39,1.03,0,1.42L26.42,25L33.71,32.29z"/></svg>

After

Width:  |  Height:  |  Size: 549 B

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M25,2C12.318,2,2,12.318,2,25c0,12.683,10.318,23,23,23c12.683,0,23-10.317,23-23C48,12.318,37.683,2,25,2z M35.827,16.562 L24.316,33.525l-8.997-8.349c-0.405-0.375-0.429-1.008-0.053-1.413c0.375-0.406,1.009-0.428,1.413-0.053l7.29,6.764l10.203-15.036 c0.311-0.457,0.933-0.575,1.389-0.266C36.019,15.482,36.138,16.104,35.827,16.562z"/></svg>

After

Width:  |  Height:  |  Size: 445 B

@@ -0,0 +1 @@
<?xml version="1.0"?><svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"> <path d="M41,4H9C6.24,4,4,6.24,4,9v32c0,2.76,2.24,5,5,5h32c2.76,0,5-2.24,5-5V9C46,6.24,43.76,4,41,4z M34.71,33.29l-1.42,1.42 L25,26.42l-8.29,8.29l-1.42-1.42L23.58,25l-8.29-8.29l1.42-1.42L25,23.58l8.29-8.29l1.42,1.42L26.42,25L34.71,33.29z"/></svg>

After

Width:  |  Height:  |  Size: 374 B

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="64px" height="64px"><path d="M29.895,12.52c-0.235-0.704-0.829-1.209-1.549-1.319l-7.309-1.095l-3.29-6.984C17.42,2.43,16.751,2,16,2 s-1.42,0.43-1.747,1.122l-3.242,6.959l-7.357,1.12c-0.72,0.11-1.313,0.615-1.549,1.319c-0.241,0.723-0.063,1.507,0.465,2.046 l5.321,5.446l-1.257,7.676c-0.125,0.767,0.185,1.518,0.811,1.959c0.602,0.427,1.376,0.469,2.02,0.114l6.489-3.624l6.581,3.624 c0.646,0.355,1.418,0.311,2.02-0.114c0.626-0.441,0.937-1.192,0.811-1.959l-1.259-7.686l5.323-5.436 C29.958,14.027,30.136,13.243,29.895,12.52z"/></svg>

After

Width:  |  Height:  |  Size: 604 B

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 4 2 C 3.398438 2 3 2.398438 3 3 L 3 6 C 3 6.300781 3.113281 6.488281 3.3125 6.6875 L 19.3125 23.6875 C 19.511719 23.886719 19.800781 24 20 24 L 30 24 C 30.300781 24 30.488281 23.886719 30.6875 23.6875 L 46.6875 6.6875 C 46.886719 6.488281 47 6.300781 47 6 L 47 3 C 47 2.398438 46.601563 2 46 2 Z M 19 26 L 19 41 C 19 41.398438 19.199219 41.707031 19.5 41.90625 L 29.5 47.90625 C 29.601563 48.007813 29.800781 48 30 48 C 30.199219 48 30.300781 48.007813 30.5 47.90625 C 30.800781 47.707031 31 47.398438 31 47 L 31 26 Z"/></svg>

After

Width:  |  Height:  |  Size: 640 B

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 5 44.996094 C 4.984375 44.996094 4.972656 44.996094 4.957031 44.996094 C 4.417969 44.972656 3.992188 44.527344 4 43.988281 C 4.003906 43.742188 4.578125 19.679688 28 19.015625 L 28 12 C 28 11.613281 28.222656 11.261719 28.570313 11.097656 C 28.914063 10.929688 29.332031 10.980469 29.628906 11.222656 L 45.628906 24.222656 C 45.863281 24.414063 46 24.699219 46 25 C 46 25.300781 45.863281 25.585938 45.632813 25.777344 L 29.632813 38.777344 C 29.332031 39.019531 28.917969 39.066406 28.570313 38.902344 C 28.222656 38.738281 28 38.386719 28 38 L 28 31.007813 C 7.160156 31.386719 6.035156 43.542969 5.996094 44.066406 C 5.960938 44.59375 5.523438 44.996094 5 44.996094 Z"/></svg>

After

Width:  |  Height:  |  Size: 793 B

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 7.6875 0 C 6.777344 0 5.964844 0.6875 5.8125 1.59375 L 0.625 32.25 C 1.050781 32.09375 1.519531 32 2 32 L 48 32 C 48.46875 32 48.894531 32.101563 49.3125 32.25 L 44.1875 1.59375 C 44.035156 0.683594 43.226563 0 42.3125 0 Z M 25 8 C 32.726563 8 39 12.476563 39 18 C 39 23.519531 32.726563 28 25 28 C 17.273438 28 11 23.519531 11 18 C 11 12.476563 17.273438 8 25 8 Z M 25 15 C 23.34375 15 22 15.894531 22 17 C 22 18.105469 23.34375 19 25 19 C 26.65625 19 28 18.105469 28 17 C 28 15.894531 26.65625 15 25 15 Z M 2 34 C 0.898438 34 0 34.898438 0 36 L 0 48 C 0 49.101563 0.898438 50 2 50 L 48 50 C 49.101563 50 50 49.101563 50 48 L 50 36 C 50 34.898438 49.101563 34 48 34 Z M 40 40 C 41.105469 40 42 40.894531 42 42 C 42 43.105469 41.105469 44 40 44 C 38.894531 44 38 43.105469 38 42 C 38 40.894531 38.894531 40 40 40 Z"/></svg>

After

Width:  |  Height:  |  Size: 937 B

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 0 4 L 0 46 L 50 46 L 50 4 Z M 2 6 L 48 6 L 48 44 L 2 44 Z M 4 8 L 4 30.6875 L 17.3125 18.28125 C 17.507813 18.097656 17.769531 17.972656 18.03125 18 C 18.296875 18.011719 18.570313 18.117188 18.75 18.3125 L 29.03125 29.5625 L 33.28125 25.28125 C 33.671875 24.890625 34.328125 24.890625 34.71875 25.28125 L 46 36.59375 L 46 8 Z M 35 15 C 36.65625 15 38 16.34375 38 18 C 38 19.65625 36.65625 21 35 21 C 33.34375 21 32 19.65625 32 18 C 32 16.34375 33.34375 15 35 15 Z M 17.9375 20.40625 L 4 33.4375 L 4 42 L 46 42 L 46 39.40625 L 34 27.40625 L 26.40625 35 L 23.59375 35 L 27.625 30.96875 Z"/></svg>

After

Width:  |  Height:  |  Size: 709 B

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 25.017578 1.9824219 C 15.436898 1.9824219 7.2123268 7.8663695 3.7636719 16.220703 A 2.0002 2.0002 0 1 0 7.4609375 17.746094 C 10.308283 10.848427 17.072259 5.9824219 25.017578 5.9824219 C 35.534702 5.9824219 44.017578 14.465298 44.017578 24.982422 C 44.017578 35.499546 35.534702 43.982422 25.017578 43.982422 C 17.073352 43.982422 10.308226 39.118231 7.4609375 32.220703 A 2.0002 2.0002 0 1 0 3.7636719 33.746094 C 7.2123838 42.100566 15.437804 47.982422 25.017578 47.982422 C 37.696454 47.982422 48.017578 37.661298 48.017578 24.982422 C 48.017578 12.303546 37.696454 1.9824219 25.017578 1.9824219 z M 26.962891 15.962891 A 2.0002 2.0002 0 0 0 25.568359 19.396484 L 29.154297 22.982422 L 3.9824219 22.982422 A 2.0002 2.0002 0 1 0 3.9824219 26.982422 L 29.154297 26.982422 L 25.568359 30.568359 A 2.0002 2.0002 0 1 0 28.396484 33.396484 L 35.396484 26.396484 A 2.0002 2.0002 0 0 0 35.396484 23.568359 L 28.396484 16.568359 A 2.0002 2.0002 0 0 0 26.962891 15.962891 z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 24.96875 1.96875 C 18.17279 1.96875 12.052876 4.9382251 7.8476562 9.6347656 A 2.0002 2.0002 0 1 0 10.826172 12.302734 C 14.306952 8.4152753 19.33471 5.96875 24.96875 5.96875 C 35.485874 5.96875 43.96875 14.451626 43.96875 24.96875 C 43.96875 35.485874 35.485874 43.96875 24.96875 43.96875 C 19.335804 43.96875 14.308056 41.522447 10.826172 37.634766 A 2.0002 2.0002 0 1 0 7.8476562 40.302734 C 12.053772 44.999053 18.173696 47.96875 24.96875 47.96875 C 37.647626 47.96875 47.96875 37.647626 47.96875 24.96875 C 47.96875 12.289874 37.647626 1.96875 24.96875 1.96875 z M 10.992188 15.949219 A 2.0002 2.0002 0 0 0 9.6171875 16.554688 L 2.7949219 23.376953 A 2.0002 2.0002 0 0 0 2.8027344 26.568359 L 9.6171875 33.382812 A 2.0002 2.0002 0 1 0 12.445312 30.554688 L 8.859375 26.96875 L 27.03125 26.96875 A 2.0002 2.0002 0 1 0 27.03125 22.96875 L 8.859375 22.96875 L 12.445312 19.382812 A 2.0002 2.0002 0 0 0 10.992188 15.949219 z"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 72 72" width="64px" height="64px"><path d="M25.977,59.542c-1.04,0-2.079-0.403-2.863-1.207c-1.542-1.581-1.512-4.114,0.069-5.656l17.113-16.698l-17.074-16.66 c-1.581-1.542-1.611-4.075-0.069-5.656c1.544-1.582,4.076-1.612,5.657-0.069l20.008,19.522c0.771,0.752,1.206,1.785,1.206,2.863 s-0.435,2.11-1.206,2.863L28.771,58.404C27.992,59.164,26.984,59.542,25.977,59.542z"/></svg>

After

Width:  |  Height:  |  Size: 438 B

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 45 45 C 44.476563 45 44.035156 44.59375 44.003906 44.066406 C 43.960938 43.519531 42.820313 31.386719 22 31.007813 L 22 38 C 22 38.386719 21.777344 38.738281 21.429688 38.902344 C 21.082031 39.066406 20.667969 39.019531 20.371094 38.777344 L 4.371094 25.777344 C 4.136719 25.585938 4 25.300781 4 25 C 4 24.699219 4.136719 24.414063 4.371094 24.222656 L 20.371094 11.222656 C 20.671875 10.980469 21.082031 10.929688 21.429688 11.097656 C 21.777344 11.261719 22 11.613281 22 12 L 22 19.015625 C 44.203125 19.644531 45.875 41.304688 45.992188 43.761719 C 46.011719 43.839844 46.019531 43.917969 46.019531 44 C 46.019531 44.554688 45.574219 45 45.019531 45 C 45.015625 45 45.007813 45 45 45 Z"/></svg>

After

Width:  |  Height:  |  Size: 811 B

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 21 3 C 11.601563 3 4 10.601563 4 20 C 4 29.398438 11.601563 37 21 37 C 24.355469 37 27.460938 36.015625 30.09375 34.34375 L 42.375 46.625 L 46.625 42.375 L 34.5 30.28125 C 36.679688 27.421875 38 23.878906 38 20 C 38 10.601563 30.398438 3 21 3 Z M 21 7 C 28.199219 7 34 12.800781 34 20 C 34 27.199219 28.199219 33 21 33 C 13.800781 33 8 27.199219 8 20 C 8 12.800781 13.800781 7 21 7 Z"/></svg>

After

Width:  |  Height:  |  Size: 506 B

@@ -0,0 +1 @@
<?xml version="1.0"?><svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"> <path d="M47.16,21.221l-5.91-0.966c-0.346-1.186-0.819-2.326-1.411-3.405l3.45-4.917c0.279-0.397,0.231-0.938-0.112-1.282 l-3.889-3.887c-0.347-0.346-0.893-0.391-1.291-0.104l-4.843,3.481c-1.089-0.602-2.239-1.08-3.432-1.427l-1.031-5.886 C28.607,2.35,28.192,2,27.706,2h-5.5c-0.49,0-0.908,0.355-0.987,0.839l-0.956,5.854c-1.2,0.345-2.352,0.818-3.437,1.412l-4.83-3.45 c-0.399-0.285-0.942-0.239-1.289,0.106L6.82,10.648c-0.343,0.343-0.391,0.883-0.112,1.28l3.399,4.863 c-0.605,1.095-1.087,2.254-1.438,3.46l-5.831,0.971c-0.482,0.08-0.836,0.498-0.836,0.986v5.5c0,0.485,0.348,0.9,0.825,0.985 l5.831,1.034c0.349,1.203,0.831,2.362,1.438,3.46l-3.441,4.813c-0.284,0.397-0.239,0.942,0.106,1.289l3.888,3.891 c0.343,0.343,0.884,0.391,1.281,0.112l4.87-3.411c1.093,0.601,2.248,1.078,3.445,1.424l0.976,5.861C21.3,47.647,21.717,48,22.206,48 h5.5c0.485,0,0.9-0.348,0.984-0.825l1.045-5.89c1.199-0.353,2.348-0.833,3.43-1.435l4.905,3.441 c0.398,0.281,0.938,0.232,1.282-0.111l3.888-3.891c0.346-0.347,0.391-0.894,0.104-1.292l-3.498-4.857 c0.593-1.08,1.064-2.222,1.407-3.408l5.918-1.039c0.479-0.084,0.827-0.5,0.827-0.985v-5.5C47.999,21.718,47.644,21.3,47.16,21.221z M25,32c-3.866,0-7-3.134-7-7c0-3.866,3.134-7,7-7s7,3.134,7,7C32,28.866,28.866,32,25,32z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 2 2 C 0.894531 2 0 2.894531 0 4 C 0 5.105469 0.894531 6 2 6 C 3.105469 6 4 5.105469 4 4 L 8.65625 4 C 10.742188 4 11.542969 4.667969 12.21875 6.9375 L 20.21875 39.21875 C 20.644531 40.828125 21.125 42.609375 22.9375 43.46875 C 22.367188 44.160156 22 45.035156 22 46 C 22 48.207031 23.792969 50 26 50 C 28.207031 50 30 48.207031 30 46 C 30 45.269531 29.78125 44.589844 29.4375 44 L 35.5625 44 C 35.21875 44.589844 35 45.269531 35 46 C 35 48.207031 36.792969 50 39 50 C 41.207031 50 43 48.207031 43 46 C 43 44.960938 42.589844 44.023438 41.9375 43.3125 C 41.972656 43.210938 42 43.113281 42 43 C 42 42.449219 41.550781 42 41 42 L 25.71875 42 C 23.023438 42 22.730469 40.921875 22.15625 38.75 L 21.46875 36 L 39.8125 36 C 40.226563 36 40.605469 35.730469 40.75 35.34375 L 47.9375 16.34375 C 48.054688 16.039063 47.996094 15.707031 47.8125 15.4375 C 47.628906 15.167969 47.324219 15 47 15 L 16.28125 15 L 14.15625 6.40625 C 13.476563 4.117188 12.320313 2 8.65625 2 Z M 26 44 C 27.101563 44 28 44.898438 28 46 C 28 47.101563 27.101563 48 26 48 C 24.898438 48 24 47.101563 24 46 C 24 44.898438 24.898438 44 26 44 Z M 39 44 C 40.101563 44 41 44.898438 41 46 C 41 47.101563 40.101563 48 39 48 C 37.898438 48 37 47.101563 37 46 C 37 44.898438 37.898438 44 39 44 Z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1 @@
<?xml version="1.0"?><svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"> <path d="M10.2,48.6c-0.2,0-0.4-0.1-0.6-0.2c-0.3-0.2-0.5-0.7-0.4-1.1l4.4-16.4L0.4,20.2C0,20-0.1,19.5,0,19.1 c0.1-0.4,0.5-0.7,0.9-0.7l17-0.9l6.1-15.9C24.2,1.3,24.6,1,25,1c0.4,0,0.8,0.3,0.9,0.6l6.1,15.9l17,0.9c0.4,0,0.8,0.3,0.9,0.7 c0.1,0.4,0,0.8-0.3,1.1L36.4,30.9l4.4,16.4c0.1,0.4,0,0.8-0.4,1.1c-0.3,0.2-0.8,0.3-1.1,0L25,39.2l-14.3,9.2 C10.5,48.6,10.4,48.6,10.2,48.6z"/></svg>

After

Width:  |  Height:  |  Size: 502 B

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 7 4 C 5.346 4 4 5.346 4 7 L 4 10.912109 C 3.9625533 11.094611 3 15.799274 3 18.5 C 3 19.87865 3.2660604 21.198539 3.9960938 22.251953 C 3.9974251 22.253874 3.9986651 22.255894 4 22.257812 L 4 43 C 4 44.657 5.343 46 7 46 L 43 46 C 44.657 46 46 44.657 46 43 L 46 22.257812 C 46.001335 22.255894 46.002575 22.253874 46.003906 22.251953 C 46.73394 21.198539 47 19.87865 47 18.5 C 47 15.799274 46.037447 11.09461 46 10.912109 L 46 7 C 46 5.346 44.654 4 43 4 L 7 4 z M 8 7 C 8.552 7 9 7.448 9 8 C 9 8.552 8.552 9 8 9 C 7.448 9 7 8.552 7 8 C 7 7.448 7.448 7 8 7 z M 11 7 C 11.552 7 12 7.448 12 8 C 12 8.552 11.552 9 11 9 C 10.448 9 10 8.552 10 8 C 10 7.448 10.448 7 11 7 z M 14 7 C 14.552 7 15 7.448 15 8 C 15 8.552 14.552 9 14 9 C 13.448 9 13 8.552 13 8 C 13 7.448 13.448 7 14 7 z M 5.8730469 12 L 10 12 L 10 20.886719 C 9.3615118 21.563076 8.4966284 22 7.5 22 C 6.5277884 22 6.0393417 21.686664 5.640625 21.111328 C 5.2419083 20.535993 5 19.60635 5 18.5 C 5 16.527448 5.7019741 12.911439 5.8730469 12 z M 12 12 L 17 12 L 17 20.886719 C 16.361512 21.563076 15.496628 22 14.5 22 C 13.504858 22 12.639028 21.566344 12 20.892578 L 12 12 z M 19 12 L 24 12 L 24 20.886719 C 23.361512 21.563076 22.496628 22 21.5 22 C 20.504858 22 19.639028 21.566344 19 20.892578 L 19 12 z M 26 12 L 31 12 L 31 20.886719 C 30.362395 21.562365 29.49642 22 28.5 22 C 27.504858 22 26.639028 21.566344 26 20.892578 L 26 12 z M 33 12 L 38 12 L 38 20.892578 C 37.361904 21.565869 36.495044 22 35.5 22 C 34.504858 22 33.638213 21.56588 33 20.892578 L 33 12 z M 40 12 L 44.126953 12 C 44.298026 12.911439 45 16.527448 45 18.5 C 45 19.60635 44.758092 20.535993 44.359375 21.111328 C 43.960658 21.686664 43.472212 22 42.5 22 C 41.504858 22 40.638213 21.56588 40 20.892578 L 40 12 z M 10 28 L 19 28 L 19 44 L 10 44 L 10 28 z M 24 28 L 40 28 L 40 40 L 24 40 L 24 28 z"/></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 19.875 4.40625 C 16.195313 4.472656 13.507813 5.570313 11.875 7.71875 C 9.941406 10.265625 9.589844 14.144531 10.8125 19.21875 C 10.363281 19.769531 10.023438 20.605469 10.15625 21.71875 C 10.421875 23.921875 11.277344 24.828125 12 25.1875 C 12.34375 26.917969 13.296875 28.863281 14.21875 29.78125 L 14.21875 30.25 C 14.226563 31.265625 14.222656 32.144531 14.125 33.28125 C 13.511719 34.6875 11.476563 35.511719 9.125 36.4375 C 5.21875 37.976563 0.363281 39.871094 0 45.9375 L -0.0625 47 L 40.0625 47 L 40 45.9375 C 39.976563 45.515625 39.910156 45.132813 39.84375 44.75 C 39.824219 44.652344 39.800781 44.5625 39.78125 44.46875 C 39.71875 44.179688 39.675781 43.894531 39.59375 43.625 C 39.570313 43.546875 39.523438 43.484375 39.5 43.40625 C 39.402344 43.121094 39.308594 42.824219 39.1875 42.5625 C 39.167969 42.519531 39.144531 42.480469 39.125 42.4375 C 38.980469 42.136719 38.828125 41.863281 38.65625 41.59375 C 36.871094 38.796875 33.660156 37.527344 30.90625 36.4375 C 28.566406 35.511719 26.519531 34.6875 25.90625 33.28125 C 25.808594 32.148438 25.835938 31.292969 25.84375 30.28125 L 25.84375 29.78125 C 26.742188 28.863281 27.664063 26.925781 28 25.1875 C 28.703125 24.824219 29.582031 23.914063 29.84375 21.71875 C 29.976563 20.628906 29.65625 19.800781 29.21875 19.25 C 29.800781 17.269531 30.988281 12.113281 28.9375 8.8125 C 28.488281 8.089844 27.90625 7.535156 27.21875 7.09375 C 26.90625 6.894531 26.578125 6.707031 26.21875 6.5625 C 25.855469 6.421875 25.472656 6.300781 25.0625 6.21875 C 24.117188 5.027344 22.304688 4.40625 19.875 4.40625 Z M 32.90625 5.40625 C 31.488281 5.433594 30.257813 5.664063 29.1875 6.0625 C 29.75 6.550781 30.25 7.128906 30.65625 7.78125 C 32.8125 11.253906 32.140625 15.988281 31.375 18.96875 C 31.800781 19.867188 31.941406 20.890625 31.8125 21.96875 C 31.535156 24.292969 30.679688 25.613281 29.78125 26.375 C 29.371094 27.890625 28.648438 29.449219 27.84375 30.53125 C 27.835938 31.289063 27.828125 31.929688 27.875 32.6875 C 28.417969 33.300781 30.242188 34.015625 31.625 34.5625 C 34.6875 35.773438 38.964844 37.480469 40.9375 41.59375 L 50.0625 41.59375 L 50 40.53125 C 49.6875 35.320313 45.539063 33.683594 42.21875 32.375 C 40.375 31.648438 38.632813 30.953125 38.125 29.84375 C 38.050781 28.910156 38.054688 28.183594 38.0625 27.34375 L 38.0625 27 C 38.859375 26.167969 39.59375 24.527344 39.875 23.15625 C 40.492188 22.808594 41.214844 22.003906 41.4375 20.15625 C 41.546875 19.234375 41.304688 18.523438 40.9375 18.03125 C 41.441406 16.292969 42.390625 11.972656 40.65625 9.1875 C 39.917969 8 38.804688 7.269531 37.34375 6.96875 C 36.507813 5.953125 34.972656 5.40625 32.90625 5.40625 Z"/></svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

@@ -0,0 +1 @@
<svg fill="#EBEBEB" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 25 2 C 12.316406 2 2 12.316406 2 25 C 2 37.683594 12.316406 48 25 48 C 37.683594 48 48 37.683594 48 25 C 48 12.316406 37.683594 2 25 2 Z M 13 28 C 11.34375 28 10 26.65625 10 25 C 10 23.34375 11.34375 22 13 22 C 14.65625 22 16 23.34375 16 25 C 16 26.65625 14.65625 28 13 28 Z M 25 28 C 23.34375 28 22 26.65625 22 25 C 22 23.34375 23.34375 22 25 22 C 26.65625 22 28 23.34375 28 25 C 28 26.65625 26.65625 28 25 28 Z M 37 28 C 35.34375 28 34 26.65625 34 25 C 34 23.34375 35.34375 22 37 22 C 38.65625 22 40 23.34375 40 25 C 40 26.65625 38.65625 28 37 28 Z"/></svg>

After

Width:  |  Height:  |  Size: 673 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

@@ -0,0 +1,128 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import KomplexHub
import KomplexHub.Controls
import "../Kero"
Item {
readonly property bool searchable: false
property int resultsPerRow: (homePageRoot.width - (64 + Constants.largeMargin)) / (256 + Constants.largeMargin)
id: homePageRoot
ScrollView {
width: homePageRoot.width
height: homePageRoot.height
ColumnLayout {
width: homePageRoot.width
// Featured Results
ColumnLayout {
width: parent.width
height: 420
Text {
color: palette.text
font.pixelSize: Constants.largeFont.pixelSize
text: "Featured"
}
RowLayout {
Layout.fillWidth: true
Layout.preferredHeight: 256
Layout.alignment: Qt.AlignHCenter
Repeater {
model: resultsPerRow
delegate: SearchResultItem {
}
}
SquareButton {
Layout.fillHeight: true
Layout.preferredWidth: 64
icon.source: "images/icons/icons8-forward.svg"
icon.height: 24
icon.width: 24
}
}
}
ColumnLayout {
width: parent.width
height: 420
Text {
color: palette.text
font.pixelSize: Constants.largeFont.pixelSize
text: "Newest"
}
RowLayout {
Layout.fillWidth: true
Layout.preferredHeight: 256
Layout.alignment: Qt.AlignHCenter
Repeater {
model: resultsPerRow
delegate: SearchResultItem {
}
}
SquareButton {
Layout.fillHeight: true
Layout.preferredWidth: 64
icon.source: "images/icons/icons8-forward.svg"
icon.height: 24
icon.width: 24
}
}
}
ColumnLayout {
width: parent.width
height: 420
Text {
color: palette.text
font.pixelSize: Constants.largeFont.pixelSize
text: "Popular"
}
RowLayout {
Layout.fillWidth: true
Layout.preferredHeight: 256
Layout.alignment: Qt.AlignHCenter
Repeater {
model: resultsPerRow
delegate: SearchResultItem {
}
}
SquareButton {
Layout.fillHeight: true
Layout.preferredWidth: 64
icon.source: "images/icons/icons8-forward.svg"
icon.height: 24
icon.width: 24
}
}
}
}
}
}
@@ -0,0 +1,77 @@
import QtQuick
import QtQuick.Controls
import KomplexHub
import KomplexHub.Controls
import "../Kero"
Item {
id: imageSearchPageRoot
SearchResultList {
id: searchResultList
anchors.fill: parent
}
KeroErrorAvatar {
id: errorOverlay
anchors.fill: parent
opacity: 0
}
KeroNoResultsAvatar {
id: noResultsOverlay
anchors.fill: parent
opacity: 0
}
KeroLoadingAnimation {
id: loadingOverlay
anchors.fill: parent
opacity: 0
}
states: [
State {
name: "loading"
when: searchResultList.state === "loading"
PropertyChanges {
target: loadingOverlay
opacity: 1
}
PropertyChanges {
target: resultsView
opacity: 0
}
},
State {
name: "empty"
when: searchResultList.state === "empty"
PropertyChanges {
target: noResultsOverlay
opacity: 1
}
PropertyChanges {
target: resultsView
opacity: 0
}
},
State {
name: "error"
when: searchResultList.state === "error"
PropertyChanges {
target: errorOverlay
opacity: 1
}
PropertyChanges {
target: resultsView
opacity: 0
}
}
]
}
@@ -0,0 +1,6 @@
import QtQuick
import QtQuick.Controls
Item {
id: root
}
@@ -0,0 +1,77 @@
import QtQuick
import QtQuick.Controls
import KomplexHub
import KomplexHub.Controls
import "../Kero"
Item {
id: imageSearchPageRoot
SearchResultList {
id: searchResultList
anchors.fill: parent
}
KeroErrorAvatar {
id: errorOverlay
anchors.fill: parent
opacity: 0
}
KeroNoResultsAvatar {
id: noResultsOverlay
anchors.fill: parent
opacity: 0
}
KeroLoadingAnimation {
id: loadingOverlay
anchors.fill: parent
opacity: 0
}
states: [
State {
name: "loading"
when: searchResultList.state === "loading"
PropertyChanges {
target: loadingOverlay
opacity: 1
}
PropertyChanges {
target: resultsView
opacity: 0
}
},
State {
name: "empty"
when: searchResultList.state === "empty"
PropertyChanges {
target: noResultsOverlay
opacity: 1
}
PropertyChanges {
target: resultsView
opacity: 0
}
},
State {
name: "error"
when: searchResultList.state === "error"
PropertyChanges {
target: errorOverlay
opacity: 1
}
PropertyChanges {
target: resultsView
opacity: 0
}
}
]
}
@@ -0,0 +1,87 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import KomplexHub
Item {
id: loginFormRoot
ColumnLayout {
anchors.centerIn: parent
Image {
source: "images/icons/icons8-user-account.svg"
Layout.preferredHeight: 64
Layout.preferredWidth: 64
Layout.alignment: Qt.AlignCenter
}
// KeroLoginAvatar {
// Layout.preferredWidth: 380
// Layout.preferredHeight: 380
// description: ""
// Layout.alignment: Qt.AlignCenter
// }
// Image {
// source: "images/kero/kero_choice.png"
// Layout.preferredWidth: 380
// Layout.preferredHeight: 380
// Layout.alignment: Qt.AlignCenter
// }
ColumnLayout {
Layout.fillWidth: true
Layout.alignment: Qt.AlignCenter
ColumnLayout {
Layout.fillWidth: true
Text {
Layout.fillWidth: false
text: "Username"
font.pixelSize: Constants.largeFont.pixelSize
}
LineEdit {
Layout.preferredHeight: 32
Layout.preferredWidth: 256
}
}
ColumnLayout {
Layout.fillWidth: true
Text {
Layout.fillWidth: false
text: "Password"
font.pixelSize: Constants.largeFont.pixelSize
}
LineEdit {
Layout.preferredHeight: 32
Layout.preferredWidth: 256
}
}
RowLayout {
clip: true
Layout.maximumWidth: 250
Layout.leftMargin: 3
SquareButton {
Layout.preferredHeight: 36
Layout.preferredWidth: 36
icon.source: "images/icons/icons8-cancel.svg"
}
SquareButton {
Layout.fillWidth: true
icon.source: "images/icons/icons8-login.svg"
text: qsTr("Login")
}
}
}
}
}
@@ -0,0 +1,214 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import KomplexHub
Item {
readonly property bool searchable: false
id: settingsPageRoot
Rectangle {
anchors.fill: parent
color: palette.window
ColumnLayout {
anchors.fill: parent
TabBar {
id: bar
Layout.fillHeight: false
Layout.fillWidth: true
TabButton {
text: qsTr("Wallpaper")
}
TabButton {
text: qsTr("Account")
}
TabButton {
text: qsTr("About")
}
}
StackLayout {
Layout.fillHeight: true
Layout.fillWidth: true
currentIndex: bar.currentIndex
Item {
id: wallpaperTab
Layout.fillHeight: true
Layout.fillWidth: true
WallpaperSettingsPage {
anchors.fill: parent
}
}
Item {
id: accountTab
Layout.fillHeight: true
Layout.fillWidth: true
UserProfilePage {
anchors.fill: parent
}
}
Item {
Layout.fillHeight: true
Layout.fillWidth: true
property string title: qsTr("Hello!")
property string contributors: qsTr("DigitalArtifex
fridje")
property string thanks: qsTr("Icons8
ShaderToy
Pexels")
property color color: palette.window
id: keroHelloAvatarRoot
Rectangle {
id: keroHelloAvatarBackground
anchors.fill: parent
color: keroHelloAvatarRoot.color
ColumnLayout {
anchors.fill: parent
Rectangle {
Layout.fillHeight: true
Layout.fillWidth: true
Layout.minimumWidth: 64
Layout.minimumHeight: 64
Layout.maximumWidth: 512
Layout.maximumHeight: 512
Layout.alignment: Qt.AlignCenter
color: "transparent"
Image {
anchors.fill: parent
source: "../images/kero/kero_hello.png"
antialiasing: true
fillMode: Image.PreserveAspectFit
}
ColumnLayout {
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
Text {
color: palette.text
text: keroHelloAvatarRoot.title
font.pixelSize: Constants.largeFont.pixelSize * 1.5
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
}
}
}
Item { Layout.fillHeight: true }
Text {
Layout.fillHeight: false
Layout.fillWidth: true
text: qsTr("Meet Kero, the small but tireless spirit behind Komplex, a curious little dragon whose name echoes the cheerful sound of a frogs call. Hailing from the realm of **Kairoku**, Kero honed his skill in a place where unfinished ideas drift like clouds and raw creativity hums in the air.")
color: palette.text.darker()
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
Layout.bottomMargin: Constants.largeMargin
wrapMode: Text.WordWrap
textFormat: Text.MarkdownText
}
Text {
Layout.fillHeight: false
Layout.fillWidth: true
text: qsTr("In Kairoku, landscapes arent painted...theyre assembled, animated, and brought to life through careful craftsmanship. Kero was once an apprentice there, learning how to shape reactive skies, breathing forests, and shimmering cityscapes. With his trusty tools and a builders instinct, he became known for turning even the simplest concept into something that felt alive.")
color: palette.text.darker()
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
Layout.bottomMargin: Constants.largeMargin
wrapMode: Text.WordWrap
textFormat: Text.MarkdownText
}
Item { Layout.fillHeight: true }
RowLayout {
Layout.fillWidth: true
Layout.alignment: Qt.AlignTop | Qt.AlignRight
ColumnLayout {
Layout.alignment: Qt.AlignTop | Qt.AlignRight
Layout.margins: Constants.largeMargin
Layout.fillHeight: true
Text {
text: qsTr("Contributors")
color: palette.text.darker()
font: Constants.h5Font
Layout.alignment: Qt.AlignTop
Layout.bottomMargin: Constants.largeMargin
wrapMode: Text.WordWrap
textFormat: Text.MarkdownText
}
Text {
id: contributorText
text: keroHelloAvatarRoot.contributors
color: palette.text.darker()
Layout.alignment: Qt.AlignBottom
Layout.bottomMargin: Constants.largeMargin
wrapMode: Text.WordWrap
textFormat: Text.MarkdownText
}
}
ColumnLayout {
Layout.alignment: Qt.AlignTop | Qt.AlignRight
Layout.margins: Constants.largeMargin
Layout.fillHeight: true
Text {
text: qsTr("Special Thanks")
color: palette.text.darker()
font: Constants.h5Font
Layout.alignment: Qt.AlignTop
Layout.bottomMargin: Constants.largeMargin
wrapMode: Text.WordWrap
textFormat: Text.MarkdownText
}
Text {
id: thanksText
text: keroHelloAvatarRoot.thanks
color: palette.text.darker()
Layout.alignment: Qt.AlignBottom
Layout.bottomMargin: Constants.largeMargin
wrapMode: Text.WordWrap
textFormat: Text.MarkdownText
}
}
}
}
}
}
}
}
}
}
@@ -0,0 +1,59 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import KomplexHub
Item {
id: root
ColumnLayout {
anchors.fill: parent
RowLayout {
Layout.fillWidth: true
Image {
Layout.preferredHeight: 128
Layout.preferredWidth: 128
id: userAccountImage
source: "../images/icons/icons8-user-account.svg"
}
ColumnLayout {
Layout.alignment: Qt.AlignTop
Layout.topMargin: Constants.largeMargin
Layout.leftMargin: Constants.largeMargin
Layout.bottomMargin: Constants.largeMargin
Layout.fillWidth: true
Layout.fillHeight: true
Text {
text: qsTr("Username")
font.pixelSize: Constants.largeFont.pixelSize
font.bold: true
color: palette.text
}
Text {
text: qsTr("Thursday, April 30th 2026")
font.pixelSize: Constants.mediumMargin.pixelSize
color: palette.text
}
RowLayout {
Text {
text: qsTr("Wallpapers Submitted:")
font.pixelSize: Constants.largeFont.pixelSize
color: palette.text
}
Text {
text: qsTr("12")
font.pixelSize: Constants.largeFont.pixelSize
font.bold: true
color: palette.text
}
}
}
}
}
}
@@ -0,0 +1,667 @@
/*
* Komplex Wallpaper Engine
* Copyright (C) 2025 @DigitalArtifex | github.com/DigitalArtifex
*
* config.qml
*
* This component provides a configuration interface for the Komplex Wallpaper Engine,
* allowing users to customize shader settings, channel configurations, and other
* parameters related to the wallpaper engine.
*
* 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 ComponentBehavior: Bound
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
import KomplexHub.Controls
import KomplexHubPlugin
//import com.github.digitalartifex.komplex 1.0 as Komplex
Item
{
SettingsManager {
id: manager
onError: (title, message) => {
console.log(title + ": " + message)
}
}
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 alias cfg_mouseAllowed: mouseEnableButton.checked
property bool cfg_infoPlasma6Preview_dismissed
property bool cfg_warningResources_dismissed
property bool cfg_emergencyHelp_dismissed
property bool cfg_infoiChannelSettings_dismissed
property alias cfg_checkActiveScreen: activeScreenOnlyCheckbox.checked
property alias cfg_excludeWindows: excludeWindows.windows
property alias cfg_running: runningCombo.checked
property alias cfg_resolution_x: resolutionXField.value
property alias cfg_resolution_y: resolutionYField.value
property alias cfg_framerate_limit: frameRateField.value
property bool cfg_shader_updated
property string shaderPackage: ""
property int shaderPackageIndex: 0
property real shaderSpeed: 1.0
property int resolutionX: 1080
property int resolution: 1920
property bool enableMouseTracking: true
property real mouseTrackingBias: 0.5
Rectangle {
anchors.fill: parent
color: palette.base
clip: true
ColumnLayout {
anchors.fill: parent
Text {
text: qsTr("Wallpaper")
font: Constants.h2Font
color: palette.text
}
Text {
text: manager.shaderPack
}
ComboBox
{
property string shader
Layout.fillWidth: true
id: selectedShaderPack
model: manager.availableShaderPacks
delegate: Component
{
id: packListDelegate
ItemDelegate
{
width: parent ? parent.width : 0
text: modelData
}
}
textRole: "modelData"
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)
// }
}
RowLayout
{
Layout.fillWidth: true
visible: true
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", "Shader Pack:")
// ComboBox
// {
// property string shader
// Layout.fillWidth: true
// id: selectedShaderPack
// //model: shaderPackModel.availableShaderPacks
// delegate: Component
// {
// id: packListDelegate
// ItemDelegate
// {
// width: parent ? parent.width : 0
// text: modelData
// }
// }
// textRole: "modelData"
// currentIndex: root.cfg_shader_package_index
// 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)
// }
// }
FileDialog
{
id: packDialog
fileMode: FileDialog.OpenFile
title: i18nd("@dialog_title:choose_shader", "Choose a shader")
// will accept and auto convert .frag in the near future
nameFilters: ["Shader Package files (*.json)", "All files (*)"]
visible: false
currentFolder: "file://" + shaderPackModel.shaderPackInstallPath
onAccepted:
{
root.cfg_shader_package_index = -1;
root.cfg_shader_package = selectedFile;
shaderPackModel.loadMetadataFromFile(selectedFile)
}
}
}
// Kirigami.Separator
// {
// Kirigami.FormData.isSection: false
// }
// TabBar
// {
// Layout.topMargin: 6
// Layout.fillWidth: true
// id: navBar
// width: parent.width
// TabButton {
// height: 36
// text: root.cfg_komplex_mode === 0 ? qsTr("Channels") : qsTr("Information")
// }
// TabButton {
// height: 36
// text: qsTr("Settings")
// }
// TabButton {
// height: 36
// text: qsTr("Extra Settings")
// }
// }
// RowLayout
// {
// Layout.fillWidth: true
// Kirigami.InlineMessage
// {
// id: warningResources
// Layout.fillWidth: true
// type: Kirigami.MessageType.Warning
// text: qsTr("Some shaders might consume more power and resources than others, beware!")
// showCloseButton: true
// visible: !root.cfg_warningResources_dismissed
// onVisibleChanged: () =>
// {
// root.cfg_warningResources_dismissed = true;
// }
// }
// }
Text {
text: qsTr("Render Resolution")
font: Constants.h2Font
color: palette.text
}
RowLayout
{
visible: navBar.currentIndex === 1
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", "Resolution:")
Text
{
color: palette.text
text: "X"
verticalAlignment: Text.AlignVCenter
}
TextField
{
property int value
id: resolutionXField
inputMethodHints: Qt.ImhFormattedNumbersOnly
horizontalAlignment: Text.AlignRight
Layout.preferredWidth: Kirigami.Units.gridUnit * 4
text: value
onEditingFinished: () =>
{
value = parseInt(text)
}
Keys.onPressed: (event) =>
{
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter)
{
resolutionXField.focus = false; // Unfocus the TextField
event.accepted = true; // Prevent further propagation of the key event
}
}
background: Rectangle
{
color: resolutionXField.activeFocus ? palette.base : "transparent"
border.color: resolutionXField.activeFocus ? palette.highlight : "transparent"
border.width: 1
radius: 4
anchors.fill: resolutionXField
anchors.margins: -2
}
}
Text
{
color: palette.text
text: "Y"
verticalAlignment: Text.AlignVCenter
}
TextField
{
property int value
id: resolutionYField
inputMethodHints: Qt.ImhFormattedNumbersOnly
horizontalAlignment: Text.AlignRight
Layout.preferredWidth: Kirigami.Units.gridUnit * 4
text: value
onEditingFinished: () =>
{
value = parseInt(text)
}
Keys.onPressed: (event) =>
{
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter)
{
resolutionYField.focus = false; // Unfocus the TextField
event.accepted = true; // Prevent further propagation of the key event
}
}
background: Rectangle
{
color: resolutionYField.activeFocus ? palette.base : "transparent"
border.color: resolutionYField.activeFocus ? palette.highlight : "transparent"
border.width: 1
radius: 4
anchors.fill: resolutionYField
anchors.margins: -2
}
}
}
RowLayout
{
visible: navBar.currentIndex === 1
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", "Frame Rate:")
TextField
{
property int value
id: frameRateField
inputMethodHints: Qt.ImhFormattedNumbersOnly
Layout.preferredWidth: Kirigami.Units.gridUnit * 4
onEditingFinished: () =>
{
value = parseInt(text)
}
Keys.onPressed: (event) =>
{
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter)
{
frameRateField.focus = false; // Unfocus the TextField
event.accepted = true; // Prevent further propagation of the key event
}
}
background: Rectangle
{
color: frameRateField.activeFocus ? palette.base : "transparent"
border.color: frameRateField.activeFocus ? palette.highlight : "transparent"
border.width: 1
radius: 4
anchors.fill: frameRateField
anchors.margins: -2
}
Component.onCompleted: () =>
{
text = value
}
}
}
ColumnLayout
{
visible: navBar.currentIndex === 1
id: speedLayout
Layout.fillWidth: true
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", "Shader speed:")
Slider
{
id: speedSlider
Layout.fillWidth: true
from: -4.0
to: 4.0
stepSize: 0.01
onValueChanged: shaderSpeedField.text = String(value.toFixed(2));
}
LineEdit
{
id: shaderSpeedField
//inputMethodHints: Qt.ImhFormattedNumbersOnly
//horizontalAlignment: Text.AlignRight
Layout.preferredWidth: 128
// onEditingFinished: () =>
// {
// let inputValue = parseFloat(text);
// if (isNaN(inputValue) || inputValue < speedSlider.from)
// inputValue = speedSlider.from;
// else if (inputValue > speedSlider.to)
// inputValue = speedSlider.to;
// text = inputValue.toFixed(2);
// speedSlider.value = inputValue;
// }
Keys.onPressed: (event) =>
{
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter)
{
shaderSpeedField.focus = false; // Unfocus the TextField
event.accepted = true; // Prevent further propagation of the key event
}
}
// background: Rectangle
// {
// color: shaderSpeedField.activeFocus ? palette.base : "transparent"
// border.color: shaderSpeedField.activeFocus ? palette.highlight : "transparent"
// border.width: 1
// radius: 4
// anchors.fill: shaderSpeedField
// anchors.margins: -2
// }
}
}
ComboBox
{
visible: navBar.currentIndex === 1
id: pauseModeCombo
//Kirigami.FormData.label: i18nd("@buttonGroup:pause_mode", "Pause:")
model: [
{
'label': i18nd("@option:pause_mode", "Maximized or full-screen windows")
},
{
'label': i18nd("@option:pause_mode", "Active window is present")
},
{
'label': i18nd("@option:pause_mode", "At least one window is shown")
},
{
'label': i18nd("@option:pause_mode", "Never")
}
]
textRole: "label"
onCurrentIndexChanged: root.cfg_pauseMode = currentIndex
currentIndex: root.cfg_pauseMode
}
CheckBox
{
visible: navBar.currentIndex === 1
id: activeScreenOnlyCheckbox
//Kirigami.FormData.label: i18nd("@checkbox:screen_filter", "Filter:")
text: i18n("Only check for windows in active screen")
}
TextField
{
visible: navBar.currentIndex === 1
id: excludeWindows
property var windows: []
width: Kirigami.Units.gridUnit * 11
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", "Exclude windows:")
text: windows.join(",")
onEditingFinished: () =>
{
windows = excludeWindows.text.trim().replace(/\s+/g, "").split(",");
}
ToolTip.visible: hovered
ToolTip.text: qsTr("A comma-separated list of fully-qualified App-IDs to exclude their windows from triggering pause mode.")
}
CheckBox
{
visible: navBar.currentIndex === 1
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", cfg_isPaused ? "Playing" : "Paused")
id: runningCombo
checked: root.cfg_running
text: i18n("Play/Pause the shader")
onCheckedChanged: () =>
{
// wallpaper.configuration.running = checked;
root.cfg_running = checked;
}
}
RowLayout
{
visible: navBar.currentIndex === 2
id: mouseLayout
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", "Mouse allowed:")
Button
{
id: mouseEnableButton
icon.name: checked ? "followmouse-symbolic" : "hidemouse-symbolic"
text: i18nd("@button:toggle_use_mouse", checked ? "Enabled" : "Disabled")
checkable: true
ToolTip.visible: hovered
ToolTip.text: qsTr("Enabling this will allow the shader to interact with the cursor but will prevent interaction with desktop elements")
}
}
RowLayout
{
id: mouseBiasLayout
visible: root.cfg_mouseAllowed && navBar.currentIndex === 2
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", "Mouse bias:")
ColumnLayout
{
Slider
{
id: mouseBiasSlider
Layout.preferredWidth: Kirigami.Units.gridUnit * 16
from: 0.0
to: 4.0
stepSize: 0.01
value: root.cfg_mouseSpeedBias ? root.cfg_mouseSpeedBias : 1.0
onValueChanged: () =>
{
mouseBiasField.text = String(value.toFixed(2));
// wallpaper.configuration.mouseBias = mouseBiasField.text;
root.cfg_mouseSpeedBias = mouseBiasField.text;
}
}
}
ColumnLayout
{
TextField
{
id: mouseBiasField
text: root.cfg_mouseSpeedBias ? String(root.cfg_mouseSpeedBias.toFixed(2)) : "1.00"
inputMethodHints: Qt.ImhFormattedNumbersOnly
Layout.preferredWidth: Kirigami.Units.gridUnit * 3
onEditingFinished: () =>
{
let inputValue = parseFloat(text);
if (isNaN(inputValue) || inputValue < mouseBiasSlider.from)
inputValue = mouseBiasSlider.from;
else if (inputValue > mouseBiasSlider.to)
inputValue = mouseBiasSlider.to;
text = inputValue.toFixed(2);
mouseBiasSlider.value = inputValue;
// wallpaper.configuration.mouseBias = inputValue;
root.cfg_mouseSpeedBias = inputValue;
}
Keys.onPressed: (event) =>
{
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter)
{
mouseBiasField.focus = false; // Unfocus the TextField
event.accepted = true; // Prevent further propagation of the key event
}
}
background: Rectangle
{
color: mouseBiasField.activeFocus ? palette.base : "transparent"
border.color: mouseBiasField.activeFocus ? palette.highlight : "transparent"
border.width: 1
radius: 4
anchors.fill: mouseBiasField
anchors.margins: -2
}
}
}
}
Button
{
visible: navBar.currentIndex === 2
id: kofiButton
Layout.preferredWidth: Kirigami.Units.gridUnit * 5
Layout.preferredHeight: Kirigami.Units.gridUnit * 3
contentItem: RowLayout
{
AnimatedImage
{
source: "icons/kofi.gif"
sourceSize.width: 36
sourceSize.height: 36
fillMode: Image.Pad
horizontalAlignment: Image.AlignLeft
transform: Translate
{
x: 8
}
}
Text
{
text: i18nd("@button:kofi", "Kofi")
horizontalAlignment: Text.AlignHCenter
color: palette.text
transform: Translate
{
x: -8
}
}
}
onClicked: () =>
{
Qt.openUrlExternally("https://ko-fi.com/digitalartifex");
}
}
RowLayout
{
visible: root.cfg_komplex_mode === 1 && navBar.currentIndex === 0
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", "Author:")
Text
{
Layout.preferredWidth: Kirigami.Units.gridUnit * 11
text: shaderPackModel.metadata.author
horizontalAlignment: Text.AlignLeft
color: palette.text
}
}
RowLayout
{
visible: root.cfg_komplex_mode === 1 && navBar.currentIndex === 0
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", "Description:")
Text
{
Layout.preferredWidth: Kirigami.Units.gridUnit * 16
text: shaderPackModel.metadata.description
horizontalAlignment: Text.AlignLeft
color: palette.text
wrapMode: Text.WordWrap
maximumLineCount: 2
elide: Text.ElideRight
}
}
RowLayout
{
visible: root.cfg_komplex_mode === 1 && navBar.currentIndex === 0
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", "License:")
Text
{
Layout.preferredWidth: Kirigami.Units.gridUnit * 11
text: shaderPackModel.metadata.license
horizontalAlignment: Text.AlignLeft
color: palette.text
}
}
RowLayout
{
visible: root.cfg_komplex_mode === 1 && navBar.currentIndex === 0
//Kirigami.FormData.label: i18nd("com.github.digitalartifex.komplex", "Version:")
Text
{
Layout.preferredWidth: Kirigami.Units.gridUnit * 11
text: shaderPackModel.metadata.version
horizontalAlignment: Text.AlignLeft
color: palette.text
}
}
}
}
}
+17
View File
@@ -0,0 +1,17 @@
module KomplexHubContent
linktarget KomplexHubContentplugin
optional plugin KomplexHubContentplugin
classname KomplexHubContentPlugin
typeinfo KomplexHubContent.qmltypes
prefer :/qt/qml/KomplexHubContent/
App 1.0 App.qml
MainScreen 1.0 MainScreen.qml
HomePage 1.0 pages/HomePage.qml
ImageSearchPage 1.0 pages/ImageSearchPage.qml
InstalledWallpaperPage 1.0 pages/InstalledWallpaperPage.qml
LiveSearchPage 1.0 pages/LiveSearchPage.qml
LoginPage 1.0 pages/LoginPage.qml
SettingsPage 1.0 pages/SettingsPage.qml
UserProfilePage 1.0 pages/UserProfilePage.qml
WallpaperSettingsPage 1.0 pages/WallpaperSettingsPage.qml