Merge branch 'main' into feat/wallpaper-picker-rework
C++ / fmt (pull_request) Successful in 8s
JS/TS / fmt (pull_request) Successful in 13s
JS/TS / lint (pull_request) Successful in 15s
Python / fmt (pull_request) Successful in 25s
Python / lint (pull_request) Successful in 28s
Python / test (pull_request) Successful in 55s
Python / typecheck (pull_request) Failing after 58s
Rust / fmt (pull_request) Successful in 44s
C++ / build (pull_request) Successful in 3m35s
Rust / build (pull_request) Successful in 1m53s
Python / buildcheck (pull_request) Successful in 2m36s
Rust / clippy (pull_request) Successful in 1m28s
C++ / clang-tidy (pull_request) Successful in 5m15s

This commit is contained in:
2026-08-14 19:18:15 +02:00
359 changed files with 5235 additions and 8203 deletions
+16 -15
View File
@@ -5,7 +5,8 @@ import QtQuick
import qs.Modules.Launcher.Services
import qs.Modules.Launcher.Items
import qs.Components
import qs.Config
import ZShell.Config
import qs.Services
CustomListView {
id: root
@@ -19,7 +20,7 @@ CustomListView {
orientation: Qt.Vertical
preferredHighlightBegin: 0
preferredHighlightEnd: height
spacing: Appearance.spacing.small
spacing: Tokens.spacing.small
state: {
const text = search.text;
const prefix = Config.launcher.actionPrefix;
@@ -49,7 +50,7 @@ CustomListView {
}
addDisplaced: Transition {
Anim {
duration: Appearance.anim.durations.small
duration: Tokens.anim.durations.small
property: "y"
}
@@ -69,17 +70,17 @@ CustomListView {
}
}
highlight: CustomRect {
color: DynamicColors.palette.m3onSurface
color: Colors.palette.m3onSurface
implicitHeight: root.currentItem?.implicitHeight ?? 0
implicitWidth: root.width
opacity: 0.08
radius: Appearance.rounding.smallest
radius: Tokens.rounding.smallest
y: root.currentItem?.y ?? 0
Behavior on y {
Anim {
duration: Appearance.anim.durations.small
easing.bezierCurve: Appearance.anim.curves.expressiveEffects
duration: Tokens.anim.durations.small
easing.bezierCurve: Tokens.anim.curves.expressiveEffects
}
}
}
@@ -145,8 +146,8 @@ CustomListView {
SequentialAnimation {
ParallelAnimation {
Anim {
duration: Appearance.anim.durations.small
easing.bezierCurve: Appearance.anim.curves.expressiveEffects
duration: Tokens.anim.durations.small
easing.bezierCurve: Tokens.anim.curves.expressiveEffects
from: 1
property: "opacity"
target: root
@@ -154,8 +155,8 @@ CustomListView {
}
Anim {
duration: Appearance.anim.durations.small
easing.bezierCurve: Appearance.anim.curves.expressiveEffects
duration: Tokens.anim.durations.small
easing.bezierCurve: Tokens.anim.curves.expressiveEffects
from: 1
property: "scale"
target: root
@@ -170,8 +171,8 @@ CustomListView {
ParallelAnimation {
Anim {
duration: Appearance.anim.durations.small
easing.bezierCurve: Appearance.anim.curves.expressiveEffects
duration: Tokens.anim.durations.small
easing.bezierCurve: Tokens.anim.curves.expressiveEffects
from: 0
property: "opacity"
target: root
@@ -179,8 +180,8 @@ CustomListView {
}
Anim {
duration: Appearance.anim.durations.small
easing.bezierCurve: Appearance.anim.curves.expressiveEffects
duration: Tokens.anim.durations.small
easing.bezierCurve: Tokens.anim.curves.expressiveEffects
from: 0.9
property: "scale"
target: root
+7 -6
View File
@@ -5,15 +5,16 @@ import QtQuick
import qs.Modules.Launcher.Services
import qs.Components
import qs.Helpers
import qs.Config
import ZShell.Config
import qs.Services
Item {
id: root
required property real maxHeight
readonly property int padding: Appearance.padding.small
readonly property int padding: Tokens.padding.small
required property var panels
readonly property int rounding: Appearance.rounding.large
readonly property int rounding: Tokens.rounding.large
required property PersistentProperties visibilities
implicitHeight: search.height + listWrapper.height + padding * 2
@@ -48,9 +49,9 @@ Item {
anchors.left: parent.left
anchors.margins: root.padding
anchors.right: parent.right
bottomPadding: Appearance.padding.larger
bottomPadding: Tokens.padding.larger
placeholderText: qsTr("Type \"%1\" for commands").arg(Config.launcher.actionPrefix)
topPadding: Appearance.padding.larger
topPadding: Tokens.padding.larger
Component.onCompleted: forceActiveFocus()
Keys.onDownPressed: list.currentList?.decrementCurrentIndex()
@@ -77,7 +78,7 @@ Item {
const currentItem = list.currentList?.currentItem;
if (currentItem) {
if (list.showWallpapers) {
if (DynamicColors.scheme === "dynamic" && currentItem.modelData.path !== Wallpapers.actualCurrent)
if (Colors.scheme === "dynamic" && currentItem.modelData.path !== Wallpapers.actualCurrent)
Wallpapers.previewColourLock = true;
Wallpapers.setWallpaper(currentItem.modelData.path);
root.visibilities.launcher = false;
+16 -15
View File
@@ -6,7 +6,8 @@ import qs.Paths
import qs.Modules
import qs.Components
import qs.Helpers
import qs.Config
import ZShell.Config
import qs.Services
Item {
id: root
@@ -30,22 +31,22 @@ Item {
enabled: root.visibilities.launcher
Anim {
duration: Appearance.anim.durations.small
easing.bezierCurve: Appearance.anim.curves.expressiveEffects
duration: Tokens.anim.durations.small
easing.bezierCurve: Tokens.anim.curves.expressiveEffects
}
}
Behavior on implicitWidth {
enabled: root.visibilities.launcher
Anim {
duration: Appearance.anim.durations.small
easing.bezierCurve: Appearance.anim.curves.expressiveEffects
duration: Tokens.anim.durations.small
easing.bezierCurve: Tokens.anim.curves.expressiveEffects
}
}
Behavior on state {
SequentialAnimation {
Anim {
duration: Appearance.anim.durations.small
duration: Tokens.anim.durations.small
from: 1
property: "opacity"
target: root
@@ -56,7 +57,7 @@ Item {
}
Anim {
duration: Appearance.anim.durations.small
duration: Tokens.anim.durations.small
from: 0
property: "opacity"
target: root
@@ -124,9 +125,9 @@ Item {
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
opacity: root.currentList?.count === 0 ? 1 : 0
padding: Appearance.padding.large
padding: Tokens.padding.large
scale: root.currentList?.count === 0 ? 1 : 0.5
spacing: Appearance.spacing.normal
spacing: Tokens.spacing.normal
Behavior on opacity {
Anim {
@@ -139,8 +140,8 @@ Item {
MaterialIcon {
anchors.verticalCenter: parent.verticalCenter
color: DynamicColors.palette.m3onSurfaceVariant
font.pointSize: Appearance.font.size.extraLarge
color: Colors.palette.m3onSurfaceVariant
font.pointSize: Tokens.font.size.extraLarge
text: root.state === "wallpapers" ? "wallpaper_slideshow" : "manage_search"
}
@@ -148,15 +149,15 @@ Item {
anchors.verticalCenter: parent.verticalCenter
CustomText {
color: DynamicColors.palette.m3onSurfaceVariant
font.pointSize: Appearance.font.size.larger
color: Colors.palette.m3onSurfaceVariant
font.pointSize: Tokens.font.size.larger
font.weight: 500
text: root.state === "wallpapers" ? qsTr("No wallpapers found") : qsTr("No results")
}
CustomText {
color: DynamicColors.palette.m3onSurfaceVariant
font.pointSize: Appearance.font.size.normal
color: Colors.palette.m3onSurfaceVariant
font.pointSize: Tokens.font.size.normal
text: root.state === "wallpapers" && Wallpapers.list.length === 0 ? qsTr("Try putting some wallpapers in %1").arg(Paths.shortenHome(Paths.wallsdir)) : qsTr("Try searching for something else")
}
}
+12 -11
View File
@@ -2,7 +2,8 @@ import QtQuick
import qs.Modules.Launcher.Services
import qs.Components
import qs.Helpers
import qs.Config
import ZShell.Config
import qs.Services
Item {
id: root
@@ -15,7 +16,7 @@ Item {
implicitHeight: Config.launcher.sizes.itemHeight
StateLayer {
radius: Appearance.rounding.smallest
radius: Tokens.rounding.smallest
onClicked: {
root.modelData?.onClicked(root.list);
@@ -24,21 +25,21 @@ Item {
Item {
anchors.fill: parent
anchors.leftMargin: Appearance.padding.larger
anchors.margins: Appearance.padding.smaller
anchors.rightMargin: Appearance.padding.larger
anchors.leftMargin: Tokens.padding.larger
anchors.margins: Tokens.padding.smaller
anchors.rightMargin: Tokens.padding.larger
MaterialIcon {
id: icon
anchors.verticalCenter: parent.verticalCenter
font.pointSize: Appearance.font.size.extraLarge
font.pointSize: Tokens.font.size.extraLarge
text: root.modelData?.icon ?? ""
}
Item {
anchors.left: icon.right
anchors.leftMargin: Appearance.spacing.normal
anchors.leftMargin: Tokens.spacing.normal
anchors.verticalCenter: icon.verticalCenter
implicitHeight: name.implicitHeight + desc.implicitHeight
implicitWidth: parent.width - icon.width
@@ -46,7 +47,7 @@ Item {
CustomText {
id: name
font.pointSize: Appearance.font.size.normal
font.pointSize: Tokens.font.size.normal
text: root.modelData?.name ?? ""
}
@@ -54,11 +55,11 @@ Item {
id: desc
anchors.top: name.bottom
color: DynamicColors.palette.m3outline
color: Colors.palette.m3outline
elide: Text.ElideRight
font.pointSize: Appearance.font.size.small
font.pointSize: Tokens.font.size.small
text: root.modelData?.desc ?? ""
width: root.width - icon.width - Appearance.rounding.normal * 2
width: root.width - icon.width - Tokens.rounding.normal * 2
}
}
}
+12 -11
View File
@@ -4,8 +4,9 @@ import QtQuick
import qs.Modules.Launcher.Services
import qs.Components
import qs.Helpers
import qs.Config
import ZShell.Config
import qs.Modules
import qs.Services
Item {
id: root
@@ -18,7 +19,7 @@ Item {
implicitHeight: Config.launcher.sizes.itemHeight
StateLayer {
radius: Appearance.rounding.smallest
radius: Tokens.rounding.smallest
onClicked: {
Apps.launch(root.modelData);
@@ -28,9 +29,9 @@ Item {
Item {
anchors.fill: parent
anchors.leftMargin: Appearance.padding.larger
anchors.margins: Appearance.padding.smaller
anchors.rightMargin: Appearance.padding.larger
anchors.leftMargin: Tokens.padding.larger
anchors.margins: Tokens.padding.smaller
anchors.rightMargin: Tokens.padding.larger
IconImage {
id: icon
@@ -42,7 +43,7 @@ Item {
Item {
anchors.left: icon.right
anchors.leftMargin: Appearance.spacing.normal
anchors.leftMargin: Tokens.spacing.normal
anchors.verticalCenter: icon.verticalCenter
implicitHeight: name.implicitHeight + comment.implicitHeight
implicitWidth: parent.width - icon.width
@@ -50,7 +51,7 @@ Item {
CustomText {
id: name
font.pointSize: Appearance.font.size.normal
font.pointSize: Tokens.font.size.normal
text: root.modelData?.name ?? ""
}
@@ -58,11 +59,11 @@ Item {
id: comment
anchors.top: name.bottom
color: DynamicColors.palette.m3outline
color: Colors.palette.m3outline
elide: Text.ElideRight
font.pointSize: Appearance.font.size.small
font.pointSize: Tokens.font.size.small
text: (root.modelData?.comment || root.modelData?.genericName || root.modelData?.name) ?? ""
width: root.width - icon.width - Appearance.rounding.normal * 2
width: root.width - icon.width - Tokens.rounding.normal * 2
}
}
@@ -75,7 +76,7 @@ Item {
asynchronous: true
sourceComponent: MaterialIcon {
color: DynamicColors.palette.m3primary
color: Colors.palette.m3primary
fill: 1
text: "favorite"
}
+21 -20
View File
@@ -5,7 +5,8 @@ import QtQuick.Layouts
import qs.Components
import qs.Modules
import qs.Helpers
import qs.Config
import ZShell.Config
import qs.Services
Item {
id: root
@@ -23,7 +24,7 @@ Item {
implicitHeight: Config.launcher.sizes.itemHeight
StateLayer {
radius: Appearance.rounding.smallest
radius: Tokens.rounding.smallest
onClicked: {
root.onClicked();
@@ -32,14 +33,14 @@ Item {
RowLayout {
anchors.left: parent.left
anchors.margins: Appearance.padding.larger
anchors.margins: Tokens.padding.larger
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
spacing: Appearance.spacing.normal
spacing: Tokens.spacing.normal
MaterialIcon {
Layout.alignment: Qt.AlignVCenter
font.pointSize: Appearance.font.size.extraLarge
font.pointSize: Tokens.font.size.extraLarge
text: "function"
}
@@ -50,10 +51,10 @@ Item {
Layout.fillWidth: true
color: {
if (text.includes("error: ") || text.includes("warning: "))
return DynamicColors.palette.m3error;
return Colors.palette.m3error;
if (!root.math)
return DynamicColors.palette.m3onSurfaceVariant;
return DynamicColors.palette.m3onSurface;
return Colors.palette.m3onSurfaceVariant;
return Colors.palette.m3onSurface;
}
elide: Text.ElideLeft
text: root.math.length > 0 ? Qalculator.eval(root.math) : qsTr("Type an expression to calculate")
@@ -62,21 +63,21 @@ Item {
CustomRect {
Layout.alignment: Qt.AlignVCenter
clip: true
color: DynamicColors.palette.m3tertiary
implicitHeight: Math.max(label.implicitHeight, icon.implicitHeight) + Appearance.padding.small * 2
implicitWidth: (stateLayer.containsMouse ? label.implicitWidth + label.anchors.rightMargin : 0) + icon.implicitWidth + Appearance.padding.normal * 2
radius: Appearance.rounding.normal
color: Colors.palette.m3tertiary
implicitHeight: Math.max(label.implicitHeight, icon.implicitHeight) + Tokens.padding.small * 2
implicitWidth: (stateLayer.containsMouse ? label.implicitWidth + label.anchors.rightMargin : 0) + icon.implicitWidth + Tokens.padding.normal * 2
radius: Tokens.rounding.normal
Behavior on implicitWidth {
Anim {
easing.bezierCurve: Appearance.anim.curves.expressiveEffects
easing.bezierCurve: Tokens.anim.curves.expressiveEffects
}
}
StateLayer {
id: stateLayer
color: DynamicColors.palette.m3onTertiary
color: Colors.palette.m3onTertiary
onClicked: {
Quickshell.execDetached(["app2unit", "--", ...Config.general.apps.terminal, "fish", "-C", `exec qalc -i '${root.math}'`]);
@@ -88,10 +89,10 @@ Item {
id: label
anchors.right: icon.left
anchors.rightMargin: Appearance.spacing.small
anchors.rightMargin: Tokens.spacing.small
anchors.verticalCenter: parent.verticalCenter
color: DynamicColors.palette.m3onTertiary
font.pointSize: Appearance.font.size.normal
color: Colors.palette.m3onTertiary
font.pointSize: Tokens.font.size.normal
opacity: stateLayer.containsMouse ? 1 : 0
text: qsTr("Open in calculator")
@@ -105,10 +106,10 @@ Item {
id: icon
anchors.right: parent.right
anchors.rightMargin: Appearance.padding.normal
anchors.rightMargin: Tokens.padding.normal
anchors.verticalCenter: parent.verticalCenter
color: DynamicColors.palette.m3onTertiary
font.pointSize: Appearance.font.size.large
color: Colors.palette.m3onTertiary
font.pointSize: Tokens.font.size.large
text: "open_in_new"
}
}
+14 -13
View File
@@ -1,7 +1,8 @@
import QtQuick
import qs.Components
import qs.Modules.Launcher.Services
import qs.Config
import ZShell.Config
import qs.Services
Item {
id: root
@@ -14,7 +15,7 @@ Item {
implicitHeight: Config.launcher.sizes.itemHeight
StateLayer {
radius: Appearance.rounding.smallest
radius: Tokens.rounding.smallest
onClicked: {
root.modelData?.onClicked(root.list);
@@ -23,36 +24,36 @@ Item {
Item {
anchors.fill: parent
anchors.leftMargin: Appearance.padding.larger
anchors.margins: Appearance.padding.smaller
anchors.rightMargin: Appearance.padding.larger
anchors.leftMargin: Tokens.padding.larger
anchors.margins: Tokens.padding.smaller
anchors.rightMargin: Tokens.padding.larger
MaterialIcon {
id: icon
anchors.verticalCenter: parent.verticalCenter
font.pointSize: Appearance.font.size.extraLarge
font.pointSize: Tokens.font.size.extraLarge
text: root.modelData?.icon ?? ""
}
Column {
anchors.left: icon.right
anchors.leftMargin: Appearance.spacing.larger
anchors.leftMargin: Tokens.spacing.larger
anchors.verticalCenter: icon.verticalCenter
spacing: 0
width: parent.width - icon.width - anchors.leftMargin - (current.active ? current.width + Appearance.spacing.normal : 0)
width: parent.width - icon.width - anchors.leftMargin - (current.active ? current.width + Tokens.spacing.normal : 0)
CustomText {
font.pointSize: Appearance.font.size.normal
font.pointSize: Tokens.font.size.normal
text: root.modelData?.name ?? ""
}
CustomText {
anchors.left: parent.left
anchors.right: parent.right
color: DynamicColors.palette.m3outline
color: Colors.palette.m3outline
elide: Text.ElideRight
font.pointSize: Appearance.font.size.small
font.pointSize: Tokens.font.size.small
text: root.modelData?.description ?? ""
}
}
@@ -65,8 +66,8 @@ Item {
anchors.verticalCenter: parent.verticalCenter
sourceComponent: MaterialIcon {
color: DynamicColors.palette.m3onSurfaceVariant
font.pointSize: Appearance.font.size.large
color: Colors.palette.m3onSurfaceVariant
font.pointSize: Tokens.font.size.large
text: "check"
}
}
+4 -3
View File
@@ -2,9 +2,10 @@ pragma Singleton
import qs.Modules.Launcher
import qs.Helpers
import qs.Config
import ZShell.Config
import Quickshell
import QtQuick
import qs.Services
Searcher {
id: root
@@ -19,7 +20,7 @@ Searcher {
Variants {
id: variants
model: Config.launcher.actions.filter(a => (a.enabled ?? true) && (Config.launcher.enableDangerousActions || !(a.dangerous ?? false)))
model: Config.launcher.actions.values.filter(a => (a.enabled ?? true) && (Config.launcher.enableDangerousActions || !(a.dangerous ?? false)))
Action {
}
@@ -42,7 +43,7 @@ Searcher {
list.search.text = `${Config.launcher.actionPrefix}${command[1]} `;
} else if (command[0] === "setMode" && command.length > 1) {
list.visibilities.launcher = false;
DynamicColors.setMode(command[1]);
Colors.setMode(command[1]);
} else {
list.visibilities.launcher = false;
Quickshell.execDetached(command);
+1 -1
View File
@@ -2,7 +2,7 @@ pragma Singleton
import ZShell
import Quickshell
import qs.Config
import ZShell.Config
import qs.Helpers
import qs.Paths
+1 -1
View File
@@ -3,7 +3,7 @@ pragma Singleton
import Quickshell
import QtQuick
import qs.Modules.Launcher
import qs.Config
import ZShell.Config
import qs.Helpers
Searcher {
+4 -4
View File
@@ -3,7 +3,7 @@ pragma ComponentBehavior: Bound
import Quickshell
import QtQuick
import qs.Components
import qs.Config
import ZShell.Config
import qs.Modules.Launcher.Services
Item {
@@ -11,7 +11,7 @@ Item {
property int contentHeight
readonly property real maxHeight: {
let max = screen.height - Appearance.spacing.large * 2;
let max = screen.height - Tokens.spacing.large * 2;
if (visibilities.resources && panels.resourcesWrapper.x + panels.resourcesWrapper.width > root.x)
max -= panels.resources.nonAnimHeight;
if (panels.popouts.hasCurrent)
@@ -33,8 +33,8 @@ Item {
Behavior on offsetScale {
Anim {
duration: Appearance.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
duration: Tokens.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial
}
}