summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2026-01-09 15:15:49 -0500
committerFreya Murphy <freya@freyacat.org>2026-01-09 15:15:49 -0500
commitd8efeffaf11bca0fd4d14b67b5dcc3ffa4cb972d (patch)
tree38b012373dce50c8eecdfaad36332fb6a362f698 /modules
parentonly show active workspaces, fix colors (diff)
downloadcaelestia-shell-d8efeffaf11bca0fd4d14b67b5dcc3ffa4cb972d.tar.gz
caelestia-shell-d8efeffaf11bca0fd4d14b67b5dcc3ffa4cb972d.tar.bz2
caelestia-shell-d8efeffaf11bca0fd4d14b67b5dcc3ffa4cb972d.zip
remove more stuffff
Diffstat (limited to 'modules')
-rw-r--r--modules/areapicker/AreaPicker.qml124
-rw-r--r--modules/areapicker/Picker.qml301
-rw-r--r--modules/background/Background.qml17
-rw-r--r--modules/background/DesktopClock.qml19
-rw-r--r--modules/background/Visualiser.qml151
-rw-r--r--modules/background/Wallpaper.qml40
-rw-r--r--modules/controlcenter/PaneRegistry.qml18
-rw-r--r--modules/controlcenter/Panes.qml21
-rw-r--r--modules/controlcenter/appearance/AppearancePane.qml191
-rw-r--r--modules/controlcenter/appearance/sections/AnimationsSection.qml42
-rw-r--r--modules/controlcenter/appearance/sections/BackgroundSection.qml105
-rw-r--r--modules/controlcenter/appearance/sections/BorderSection.qml63
-rw-r--r--modules/controlcenter/appearance/sections/ColorSchemeSection.qml147
-rw-r--r--modules/controlcenter/appearance/sections/ColorVariantSection.qml92
-rw-r--r--modules/controlcenter/appearance/sections/FontsSection.qml286
-rw-r--r--modules/controlcenter/appearance/sections/ScalesSection.qml84
-rw-r--r--modules/controlcenter/appearance/sections/ThemeModeSection.qml24
-rw-r--r--modules/controlcenter/appearance/sections/TransparencySection.qml74
-rw-r--r--modules/controlcenter/launcher/LauncherPane.qml599
-rw-r--r--modules/controlcenter/launcher/Settings.qml167
-rw-r--r--modules/controlcenter/taskbar/ConnectedButtonGroup.qml109
-rw-r--r--modules/controlcenter/taskbar/TaskbarPane.qml637
-rw-r--r--modules/launcher/services/Apps.qml2
-rw-r--r--modules/utilities/cards/Toggles.qml6
24 files changed, 12 insertions, 3307 deletions
diff --git a/modules/areapicker/AreaPicker.qml b/modules/areapicker/AreaPicker.qml
deleted file mode 100644
index 0d8b2fe..0000000
--- a/modules/areapicker/AreaPicker.qml
+++ /dev/null
@@ -1,124 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import qs.components.containers
-import qs.components.misc
-import Quickshell
-import Quickshell.Wayland
-import Quickshell.Io
-
-Scope {
- LazyLoader {
- id: root
-
- property bool freeze
- property bool closing
- property bool clipboardOnly
-
- Variants {
- model: Quickshell.screens
-
- StyledWindow {
- id: win
-
- required property ShellScreen modelData
-
- screen: modelData
- name: "area-picker"
- WlrLayershell.exclusionMode: ExclusionMode.Ignore
- WlrLayershell.layer: WlrLayer.Overlay
- WlrLayershell.keyboardFocus: root.closing ? WlrKeyboardFocus.None : WlrKeyboardFocus.Exclusive
- mask: root.closing ? empty : null
-
- anchors.top: true
- anchors.bottom: true
- anchors.left: true
- anchors.right: true
-
- Region {
- id: empty
- }
-
- Picker {
- loader: root
- screen: win.modelData
- }
- }
- }
- }
-
- IpcHandler {
- target: "picker"
-
- function open(): void {
- root.freeze = false;
- root.closing = false;
- root.clipboardOnly = false;
- root.activeAsync = true;
- }
-
- function openFreeze(): void {
- root.freeze = true;
- root.closing = false;
- root.clipboardOnly = false;
- root.activeAsync = true;
- }
-
- function openClip(): void {
- root.freeze = false;
- root.closing = false;
- root.clipboardOnly = true;
- root.activeAsync = true;
- }
-
- function openFreezeClip(): void {
- root.freeze = true;
- root.closing = false;
- root.clipboardOnly = true;
- root.activeAsync = true;
- }
- }
-
- CustomShortcut {
- name: "screenshot"
- description: "Open screenshot tool"
- onPressed: {
- root.freeze = false;
- root.closing = false;
- root.clipboardOnly = false;
- root.activeAsync = true;
- }
- }
-
- CustomShortcut {
- name: "screenshotFreeze"
- description: "Open screenshot tool (freeze mode)"
- onPressed: {
- root.freeze = true;
- root.closing = false;
- root.clipboardOnly = false;
- root.activeAsync = true;
- }
- }
-
- CustomShortcut {
- name: "screenshotClip"
- description: "Open screenshot tool (clipboard)"
- onPressed: {
- root.freeze = false;
- root.closing = false;
- root.clipboardOnly = true;
- root.activeAsync = true;
- }
- }
-
- CustomShortcut {
- name: "screenshotFreezeClip"
- description: "Open screenshot tool (freeze mode, clipboard)"
- onPressed: {
- root.freeze = true;
- root.closing = false;
- root.clipboardOnly = true;
- root.activeAsync = true;
- }
- }
-}
diff --git a/modules/areapicker/Picker.qml b/modules/areapicker/Picker.qml
deleted file mode 100644
index 67ec268..0000000
--- a/modules/areapicker/Picker.qml
+++ /dev/null
@@ -1,301 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import qs.components
-import qs.services
-import qs.config
-import Caelestia
-import Quickshell
-import Quickshell.Wayland
-import QtQuick
-import QtQuick.Effects
-
-MouseArea {
- id: root
-
- required property LazyLoader loader
- required property ShellScreen screen
-
- property bool onClient
-
- property real realBorderWidth: onClient ? (Hypr.options["general:border_size"] ?? 1) : 2
- property real realRounding: onClient ? (Hypr.options["decoration:rounding"] ?? 0) : 0
-
- property real ssx
- property real ssy
-
- property real sx: 0
- property real sy: 0
- property real ex: screen.width
- property real ey: screen.height
-
- property real rsx: Math.min(sx, ex)
- property real rsy: Math.min(sy, ey)
- property real sw: Math.abs(sx - ex)
- property real sh: Math.abs(sy - ey)
-
- property list<var> clients: {
- const mon = Hypr.monitorFor(screen);
- if (!mon)
- return [];
-
- const special = mon.lastIpcObject.specialWorkspace;
- const wsId = special.name ? special.id : mon.activeWorkspace.id;
-
- return Hypr.toplevels.values.filter(c => c.workspace?.id === wsId).sort((a, b) => {
- // Pinned first, then fullscreen, then floating, then any other
- const ac = a.lastIpcObject;
- const bc = b.lastIpcObject;
- return (bc.pinned - ac.pinned) || ((bc.fullscreen !== 0) - (ac.fullscreen !== 0)) || (bc.floating - ac.floating);
- });
- }
-
- function checkClientRects(x: real, y: real): void {
- for (const client of clients) {
- if (!client)
- continue;
-
- let {
- at: [cx, cy],
- size: [cw, ch]
- } = client.lastIpcObject;
- cx -= screen.x;
- cy -= screen.y;
- if (cx <= x && cy <= y && cx + cw >= x && cy + ch >= y) {
- onClient = true;
- sx = cx;
- sy = cy;
- ex = cx + cw;
- ey = cy + ch;
- break;
- }
- }
- }
-
- function save(): void {
- const tmpfile = Qt.resolvedUrl(`/tmp/caelestia-picker-${Quickshell.processId}-${Date.now()}.png`);
- CUtils.saveItem(screencopy, tmpfile, Qt.rect(Math.ceil(rsx), Math.ceil(rsy), Math.floor(sw), Math.floor(sh)), path => {
- if (root.loader.clipboardOnly) {
- Quickshell.execDetached(["sh", "-c", "wl-copy --type image/png < " + path]);
- Quickshell.execDetached(["notify-send", "-a", "caelestia-cli", "-i", path, "Screenshot taken", "Screenshot copied to clipboard"]);
- } else {
- Quickshell.execDetached(["swappy", "-f", path]);
- }
- });
- closeAnim.start();
- }
-
- onClientsChanged: checkClientRects(mouseX, mouseY)
-
- anchors.fill: parent
- opacity: 0
- hoverEnabled: true
- cursorShape: Qt.CrossCursor
-
- Component.onCompleted: {
- Hypr.extras.refreshOptions();
-
- // Break binding if frozen
- if (loader.freeze)
- clients = clients;
-
- opacity = 1;
-
- const c = clients[0];
- if (c) {
- const cx = c.lastIpcObject.at[0] - screen.x;
- const cy = c.lastIpcObject.at[1] - screen.y;
- onClient = true;
- sx = cx;
- sy = cy;
- ex = cx + c.lastIpcObject.size[0];
- ey = cy + c.lastIpcObject.size[1];
- } else {
- sx = screen.width / 2 - 100;
- sy = screen.height / 2 - 100;
- ex = screen.width / 2 + 100;
- ey = screen.height / 2 + 100;
- }
- }
-
- onPressed: event => {
- ssx = event.x;
- ssy = event.y;
- }
-
- onReleased: {
- if (closeAnim.running)
- return;
-
- if (root.loader.freeze) {
- save();
- } else {
- overlay.visible = border.visible = false;
- screencopy.visible = false;
- screencopy.active = true;
- }
- }
-
- onPositionChanged: event => {
- const x = event.x;
- const y = event.y;
-
- if (pressed) {
- onClient = false;
- sx = ssx;
- sy = ssy;
- ex = x;
- ey = y;
- } else {
- checkClientRects(x, y);
- }
- }
-
- focus: true
- Keys.onEscapePressed: closeAnim.start()
-
- SequentialAnimation {
- id: closeAnim
-
- PropertyAction {
- target: root.loader
- property: "closing"
- value: true
- }
- ParallelAnimation {
- Anim {
- target: root
- property: "opacity"
- to: 0
- duration: Appearance.anim.durations.large
- }
- ExAnim {
- target: root
- properties: "rsx,rsy"
- to: 0
- }
- ExAnim {
- target: root
- property: "sw"
- to: root.screen.width
- }
- ExAnim {
- target: root
- property: "sh"
- to: root.screen.height
- }
- }
- PropertyAction {
- target: root.loader
- property: "activeAsync"
- value: false
- }
- }
-
- Loader {
- id: screencopy
-
- anchors.fill: parent
-
- active: root.loader.freeze
- asynchronous: true
-
- sourceComponent: ScreencopyView {
- captureSource: root.screen
-
- onHasContentChanged: {
- if (hasContent && !root.loader.freeze) {
- overlay.visible = border.visible = true;
- root.save();
- }
- }
- }
- }
-
- StyledRect {
- id: overlay
-
- anchors.fill: parent
- color: Colours.palette.m3secondaryContainer
- opacity: 0.3
-
- layer.enabled: true
- layer.effect: MultiEffect {
- maskSource: selectionWrapper
- maskEnabled: true
- maskInverted: true
- maskSpreadAtMin: 1
- maskThresholdMin: 0.5
- }
- }
-
- Item {
- id: selectionWrapper
-
- anchors.fill: parent
- layer.enabled: true
- visible: false
-
- Rectangle {
- id: selectionRect
-
- radius: root.realRounding
- x: root.rsx
- y: root.rsy
- implicitWidth: root.sw
- implicitHeight: root.sh
- }
- }
-
- Rectangle {
- id: border
-
- color: "transparent"
- radius: root.realRounding > 0 ? root.realRounding + root.realBorderWidth : 0
- border.width: root.realBorderWidth
- border.color: Colours.palette.m3primary
-
- x: selectionRect.x - root.realBorderWidth
- y: selectionRect.y - root.realBorderWidth
- implicitWidth: selectionRect.implicitWidth + root.realBorderWidth * 2
- implicitHeight: selectionRect.implicitHeight + root.realBorderWidth * 2
-
- Behavior on border.color {
- CAnim {}
- }
- }
-
- Behavior on opacity {
- Anim {
- duration: Appearance.anim.durations.large
- }
- }
-
- Behavior on rsx {
- enabled: !root.pressed
-
- ExAnim {}
- }
-
- Behavior on rsy {
- enabled: !root.pressed
-
- ExAnim {}
- }
-
- Behavior on sw {
- enabled: !root.pressed
-
- ExAnim {}
- }
-
- Behavior on sh {
- enabled: !root.pressed
-
- ExAnim {}
- }
-
- component ExAnim: Anim {
- duration: Appearance.anim.durations.expressiveDefaultSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
- }
-}
diff --git a/modules/background/Background.qml b/modules/background/Background.qml
index fbacfab..1bb7d17 100644
--- a/modules/background/Background.qml
+++ b/modules/background/Background.qml
@@ -34,23 +34,6 @@ Loader {
Wallpaper {
id: wallpaper
}
-
- Visualiser {
- anchors.fill: parent
- screen: win.modelData
- wallpaper: wallpaper
- }
-
- Loader {
- anchors.right: parent.right
- anchors.bottom: parent.bottom
- anchors.margins: Appearance.padding.large
-
- active: Config.background.desktopClock.enabled
- asynchronous: true
-
- source: "DesktopClock.qml"
- }
}
}
}
diff --git a/modules/background/DesktopClock.qml b/modules/background/DesktopClock.qml
deleted file mode 100644
index 2de325c..0000000
--- a/modules/background/DesktopClock.qml
+++ /dev/null
@@ -1,19 +0,0 @@
-import qs.components
-import qs.services
-import qs.config
-import QtQuick
-
-Item {
- implicitWidth: timeText.implicitWidth + Appearance.padding.large * 2
- implicitHeight: timeText.implicitHeight + Appearance.padding.large * 2
-
- StyledText {
- id: timeText
-
- anchors.centerIn: parent
- text: Time.format(Config.services.useTwelveHourClock ? "hh:mm:ss A" : "hh:mm:ss")
- font.family: Appearance.font.family.clock
- font.pointSize: Appearance.font.size.extraLarge
- font.bold: true
- }
-}
diff --git a/modules/background/Visualiser.qml b/modules/background/Visualiser.qml
deleted file mode 100644
index f6020da..0000000
--- a/modules/background/Visualiser.qml
+++ /dev/null
@@ -1,151 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import qs.components
-import qs.services
-import qs.config
-import Caelestia.Services
-import Quickshell
-import Quickshell.Widgets
-import QtQuick
-import QtQuick.Effects
-
-Item {
- id: root
-
- required property ShellScreen screen
- required property Wallpaper wallpaper
-
- readonly property bool shouldBeActive: Config.background.visualiser.enabled && (!Config.background.visualiser.autoHide || Hypr.monitorFor(screen).activeWorkspace.toplevels.values.every(t => t.lastIpcObject.floating))
- property real offset: shouldBeActive ? 0 : screen.height * 0.2
-
- opacity: shouldBeActive ? 1 : 0
-
- Loader {
- anchors.fill: parent
- active: root.opacity > 0 && Config.background.visualiser.blur
-
- sourceComponent: MultiEffect {
- source: root.wallpaper
- maskSource: wrapper
- maskEnabled: true
- blurEnabled: true
- blur: 1
- blurMax: 32
- autoPaddingEnabled: false
- }
- }
-
- Item {
- id: wrapper
-
- anchors.fill: parent
- layer.enabled: true
-
- Loader {
- anchors.fill: parent
- anchors.topMargin: root.offset
- anchors.bottomMargin: -root.offset
-
- active: root.opacity > 0
-
- sourceComponent: Item {
- ServiceRef {
- service: Audio.cava
- }
-
- Item {
- id: content
-
- anchors.fill: parent
- anchors.margins: Config.border.thickness
- anchors.leftMargin: Visibilities.bars.get(root.screen).exclusiveZone + Appearance.spacing.small * Config.background.visualiser.spacing
-
- Side {
- content: content
- }
- Side {
- content: content
- isRight: true
- }
-
- Behavior on anchors.leftMargin {
- Anim {}
- }
- }
- }
- }
- }
-
- Behavior on offset {
- Anim {}
- }
-
- Behavior on opacity {
- Anim {}
- }
-
- component Side: Repeater {
- id: side
-
- required property Item content
- property bool isRight
-
- model: Config.services.visualiserBars
-
- ClippingRectangle {
- id: bar
-
- required property int modelData
- property real value: Math.max(0, Math.min(1, Audio.cava.values[side.isRight ? modelData : side.count - modelData - 1]))
-
- clip: true
-
- x: modelData * ((side.content.width * 0.4) / Config.services.visualiserBars) + (side.isRight ? side.content.width * 0.6 : 0)
- implicitWidth: (side.content.width * 0.4) / Config.services.visualiserBars - Appearance.spacing.small * Config.background.visualiser.spacing
-
- y: side.content.height - height
- implicitHeight: bar.value * side.content.height * 0.4
-
- color: "transparent"
- topLeftRadius: Appearance.rounding.small * Config.background.visualiser.rounding
- topRightRadius: Appearance.rounding.small * Config.background.visualiser.rounding
-
- Rectangle {
- topLeftRadius: parent.topLeftRadius
- topRightRadius: parent.topRightRadius
-
- gradient: Gradient {
- orientation: Gradient.Vertical
-
- GradientStop {
- position: 0
- color: Qt.alpha(Colours.palette.m3primary, 0.7)
-
- Behavior on color {
- CAnim {}
- }
- }
- GradientStop {
- position: 1
- color: Qt.alpha(Colours.palette.m3inversePrimary, 0.7)
-
- Behavior on color {
- CAnim {}
- }
- }
- }
-
- anchors.left: parent.left
- anchors.right: parent.right
- y: parent.height - height
- implicitHeight: side.content.height * 0.4
- }
-
- Behavior on value {
- Anim {
- duration: Appearance.anim.durations.small
- }
- }
- }
- }
-}
diff --git a/modules/background/Wallpaper.qml b/modules/background/Wallpaper.qml
index 233dacb..46f7a52 100644
--- a/modules/background/Wallpaper.qml
+++ b/modules/background/Wallpaper.qml
@@ -11,7 +11,7 @@ import QtQuick
Item {
id: root
- property string source: Wallpapers.current
+ property string source: Paths.wallpaper
property Image current: one
anchors.fill: parent
@@ -59,42 +59,6 @@ Item {
font.pointSize: Appearance.font.size.extraLarge * 2
font.bold: true
}
-
- StyledRect {
- implicitWidth: selectWallText.implicitWidth + Appearance.padding.large * 2
- implicitHeight: selectWallText.implicitHeight + Appearance.padding.small * 2
-
- radius: Appearance.rounding.full
- color: Colours.palette.m3primary
-
- FileDialog {
- id: dialog
-
- title: qsTr("Select a wallpaper")
- filterLabel: qsTr("Image files")
- filters: Images.validImageExtensions
- onAccepted: path => Wallpapers.setWallpaper(path)
- }
-
- StateLayer {
- radius: parent.radius
- color: Colours.palette.m3onPrimary
-
- function onClicked(): void {
- dialog.open();
- }
- }
-
- StyledText {
- id: selectWallText
-
- anchors.centerIn: parent
-
- text: qsTr("Set it now!")
- color: Colours.palette.m3onPrimary
- font.pointSize: Appearance.font.size.large
- }
- }
}
}
}
@@ -121,7 +85,7 @@ Item {
anchors.fill: parent
opacity: 0
- scale: Wallpapers.showPreview ? 1 : 0.8
+ scale: 0.8
onStatusChanged: {
if (status === Image.Ready)
diff --git a/modules/controlcenter/PaneRegistry.qml b/modules/controlcenter/PaneRegistry.qml
index d8bf45e..377027c 100644
--- a/modules/controlcenter/PaneRegistry.qml
+++ b/modules/controlcenter/PaneRegistry.qml
@@ -24,24 +24,6 @@ QtObject {
readonly property string icon: "volume_up"
readonly property string component: "audio/AudioPane.qml"
},
- QtObject {
- readonly property string id: "appearance"
- readonly property string label: "appearance"
- readonly property string icon: "palette"
- readonly property string component: "appearance/AppearancePane.qml"
- },
- QtObject {
- readonly property string id: "taskbar"
- readonly property string label: "taskbar"
- readonly property string icon: "task_alt"
- readonly property string component: "taskbar/TaskbarPane.qml"
- },
- QtObject {
- readonly property string id: "launcher"
- readonly property string label: "launcher"
- readonly property string icon: "apps"
- readonly property string component: "launcher/LauncherPane.qml"
- }
]
readonly property int count: panes.length
diff --git a/modules/controlcenter/Panes.qml b/modules/controlcenter/Panes.qml
index 833a411..32ee708 100644
--- a/modules/controlcenter/Panes.qml
+++ b/modules/controlcenter/Panes.qml
@@ -3,9 +3,6 @@ pragma ComponentBehavior: Bound
import "bluetooth"
import "network"
import "audio"
-import "appearance"
-import "taskbar"
-import "launcher"
import qs.components
import qs.services
import qs.config
@@ -103,12 +100,12 @@ ClippingRectangle {
implicitHeight: root.height
property bool hasBeenLoaded: false
-
+
function updateActive(): void {
const diff = Math.abs(root.session.activeIndex - pane.paneIndex);
const isActivePane = diff === 0;
let shouldBeActive = false;
-
+
if (!layout.initialOpeningComplete) {
shouldBeActive = isActivePane;
} else {
@@ -120,7 +117,7 @@ ClippingRectangle {
shouldBeActive = layout.animationComplete;
}
}
-
+
loader.active = shouldBeActive;
}
@@ -131,37 +128,37 @@ ClippingRectangle {
clip: false
asynchronous: true
active: false
-
+
Component.onCompleted: {
pane.updateActive();
}
-
+
onActiveChanged: {
if (active && !pane.hasBeenLoaded) {
pane.hasBeenLoaded = true;
}
-
+
if (active && !item) {
loader.setSource(pane.componentPath, {
"session": root.session
});
}
}
-
+
onItemChanged: {
if (item) {
pane.hasBeenLoaded = true;
}
}
}
-
+
Connections {
target: root.session
function onActiveIndexChanged(): void {
pane.updateActive();
}
}
-
+
Connections {
target: layout
function onInitialOpeningCompleteChanged(): void {
diff --git a/modules/controlcenter/appearance/AppearancePane.qml b/modules/controlcenter/appearance/AppearancePane.qml
deleted file mode 100644
index 37ae4a8..0000000
--- a/modules/controlcenter/appearance/AppearancePane.qml
+++ /dev/null
@@ -1,191 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import "../components"
-import "./sections"
-import "../../launcher/services"
-import qs.components
-import qs.components.controls
-import qs.components.effects
-import qs.components.containers
-import qs.components.images
-import qs.services
-import qs.config
-import qs.utils
-import Caelestia.Models
-import Quickshell
-import Quickshell.Widgets
-import QtQuick
-import QtQuick.Layouts
-
-Item {
- id: root
-
- required property Session session
-
- property real animDurationsScale: Config.appearance.anim.durations.scale ?? 1
- property string fontFamilyMaterial: Config.appearance.font.family.material ?? "Material Symbols Rounded"
- property string fontFamilyMono: Config.appearance.font.family.mono ?? "CaskaydiaCove NF"
- property string fontFamilySans: Config.appearance.font.family.sans ?? "Rubik"
- property real fontSizeScale: Config.appearance.font.size.scale ?? 1
- property real paddingScale: Config.appearance.padding.scale ?? 1
- property real roundingScale: Config.appearance.rounding.scale ?? 1
- property real spacingScale: Config.appearance.spacing.scale ?? 1
- property bool transparencyEnabled: Config.appearance.transparency.enabled ?? false
- property real transparencyBase: Config.appearance.transparency.base ?? 0.85
- property real transparencyLayers: Config.appearance.transparency.layers ?? 0.4
- property real borderRounding: Config.border.rounding ?? 1
- property real borderThickness: Config.border.thickness ?? 1
-
- property bool desktopClockEnabled: Config.background.desktopClock.enabled ?? false
- property bool backgroundEnabled: Config.background.enabled ?? true
- property bool visualiserEnabled: Config.background.visualiser.enabled ?? false
- property bool visualiserAutoHide: Config.background.visualiser.autoHide ?? true
- property real visualiserRounding: Config.background.visualiser.rounding ?? 1
- property real visualiserSpacing: Config.background.visualiser.spacing ?? 1
-
- anchors.fill: parent
-
- function saveConfig() {
- Config.appearance.anim.durations.scale = root.animDurationsScale;
-
- Config.appearance.font.family.material = root.fontFamilyMaterial;
- Config.appearance.font.family.mono = root.fontFamilyMono;
- Config.appearance.font.family.sans = root.fontFamilySans;
- Config.appearance.font.size.scale = root.fontSizeScale;
-
- Config.appearance.padding.scale = root.paddingScale;
- Config.appearance.rounding.scale = root.roundingScale;
- Config.appearance.spacing.scale = root.spacingScale;
-
- Config.appearance.transparency.enabled = root.transparencyEnabled;
- Config.appearance.transparency.base = root.transparencyBase;
- Config.appearance.transparency.layers = root.transparencyLayers;
-
- Config.background.desktopClock.enabled = root.desktopClockEnabled;
- Config.background.enabled = root.backgroundEnabled;
-
- Config.background.visualiser.enabled = root.visualiserEnabled;
- Config.background.visualiser.autoHide = root.visualiserAutoHide;
- Config.background.visualiser.rounding = root.visualiserRounding;
- Config.background.visualiser.spacing = root.visualiserSpacing;
-
- Config.border.rounding = root.borderRounding;
- Config.border.thickness = root.borderThickness;
-
- Config.save();
- }
-
- SplitPaneLayout {
- anchors.fill: parent
-
- leftContent: Component {
-
- StyledFlickable {
- id: sidebarFlickable
- readonly property var rootPane: root
- flickableDirection: Flickable.VerticalFlick
- contentHeight: sidebarLayout.height
-
-
- StyledScrollBar.vertical: StyledScrollBar {
- flickable: sidebarFlickable
- }
-
- ColumnLayout {
- id: sidebarLayout
- anchors.left: parent.left
- anchors.right: parent.right
- spacing: Appearance.spacing.small
-
- readonly property var rootPane: sidebarFlickable.rootPane
-
- readonly property bool allSectionsExpanded:
- themeModeSection.expanded &&
- colorVariantSection.expanded &&
- colorSchemeSection.expanded &&
- animationsSection.expanded &&
- fontsSection.expanded &&
- scalesSection.expanded &&
- transparencySection.expanded &&
- borderSection.expanded &&
- backgroundSection.expanded
-
- RowLayout {
- spacing: Appearance.spacing.smaller
-
- StyledText {
- text: qsTr("Appearance")
- font.pointSize: Appearance.font.size.large
- font.weight: 500
- }
-
- Item {
- Layout.fillWidth: true
- }
-
- IconButton {
- icon: sidebarLayout.allSectionsExpanded ? "unfold_less" : "unfold_more"
- type: IconButton.Text
- label.animate: true
- onClicked: {
- const shouldExpand = !sidebarLayout.allSectionsExpanded;
- themeModeSection.expanded = shouldExpand;
- colorVariantSection.expanded = shouldExpand;
- colorSchemeSection.expanded = shouldExpand;
- animationsSection.expanded = shouldExpand;
- fontsSection.expanded = shouldExpand;
- scalesSection.expanded = shouldExpand;
- transparencySection.expanded = shouldExpand;
- borderSection.expanded = shouldExpand;
- backgroundSection.expanded = shouldExpand;
- }
- }
- }
-
- ThemeModeSection {
- id: themeModeSection
- }
-
- ColorVariantSection {
- id: colorVariantSection
- }
-
- ColorSchemeSection {
- id: colorSchemeSection
- }
-
- AnimationsSection {
- id: animationsSection
- rootPane: sidebarFlickable.rootPane
- }
-
- FontsSection {
- id: fontsSection
- rootPane: sidebarFlickable.rootPane
- }
-
- ScalesSection {
- id: scalesSection
- rootPane: sidebarFlickable.rootPane
- }
-
- TransparencySection {
- id: transparencySection
- rootPane: sidebarFlickable.rootPane
- }
-
- BorderSection {
- id: borderSection
- rootPane: sidebarFlickable.rootPane
- }
-
- BackgroundSection {
- id: backgroundSection
- rootPane: sidebarFlickable.rootPane
- }
- }
- }
- }
- }
-}
diff --git a/modules/controlcenter/appearance/sections/AnimationsSection.qml b/modules/controlcenter/appearance/sections/AnimationsSection.qml
deleted file mode 100644
index 03fc2b1..0000000
--- a/modules/controlcenter/appearance/sections/AnimationsSection.qml
+++ /dev/null
@@ -1,42 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import "../../components"
-import qs.components
-import qs.components.controls
-import qs.components.containers
-import qs.services
-import qs.config
-import QtQuick
-import QtQuick.Layouts
-
-CollapsibleSection {
- id: root
-
- required property var rootPane
-
- title: qsTr("Animations")
- showBackground: true
-
- SectionContainer {
- contentSpacing: Appearance.spacing.normal
-
- SliderInput {
- Layout.fillWidth: true
-
- label: qsTr("Animation duration scale")
- value: rootPane.animDurationsScale
- from: 0.1
- to: 5.0
- decimals: 1
- suffix: "×"
- validator: DoubleValidator { bottom: 0.1; top: 5.0 }
-
- onValueModified: (newValue) => {
- rootPane.animDurationsScale = newValue;
- rootPane.saveConfig();
- }
- }
- }
-}
-
diff --git a/modules/controlcenter/appearance/sections/BackgroundSection.qml b/modules/controlcenter/appearance/sections/BackgroundSection.qml
deleted file mode 100644
index 8754e73..0000000
--- a/modules/controlcenter/appearance/sections/BackgroundSection.qml
+++ /dev/null
@@ -1,105 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import "../../components"
-import qs.components
-import qs.components.controls
-import qs.components.containers
-import qs.services
-import qs.config
-import QtQuick
-import QtQuick.Layouts
-
-CollapsibleSection {
- id: root
-
- required property var rootPane
-
- title: qsTr("Background")
- showBackground: true
-
- SwitchRow {
- label: qsTr("Desktop clock")
- checked: rootPane.desktopClockEnabled
- onToggled: checked => {
- rootPane.desktopClockEnabled = checked;
- rootPane.saveConfig();
- }
- }
-
- SwitchRow {
- label: qsTr("Background enabled")
- checked: rootPane.backgroundEnabled
- onToggled: checked => {
- rootPane.backgroundEnabled = checked;
- rootPane.saveConfig();
- }
- }
-
- StyledText {
- Layout.topMargin: Appearance.spacing.normal
- text: qsTr("Visualiser")
- font.pointSize: Appearance.font.size.larger
- font.weight: 500
- }
-
- SwitchRow {
- label: qsTr("Visualiser enabled")
- checked: rootPane.visualiserEnabled
- onToggled: checked => {
- rootPane.visualiserEnabled = checked;
- rootPane.saveConfig();
- }
- }
-
- SwitchRow {
- label: qsTr("Visualiser auto hide")
- checked: rootPane.visualiserAutoHide
- onToggled: checked => {
- rootPane.visualiserAutoHide = checked;
- rootPane.saveConfig();
- }
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.normal
-
- SliderInput {
- Layout.fillWidth: true
-
- label: qsTr("Visualiser rounding")
- value: rootPane.visualiserRounding
- from: 0
- to: 10
- stepSize: 1
- validator: IntValidator { bottom: 0; top: 10 }
- formatValueFunction: (val) => Math.round(val).toString()
- parseValueFunction: (text) => parseInt(text)
-
- onValueModified: (newValue) => {
- rootPane.visualiserRounding = Math.round(newValue);
- rootPane.saveConfig();
- }
- }
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.normal
-
- SliderInput {
- Layout.fillWidth: true
-
- label: qsTr("Visualiser spacing")
- value: rootPane.visualiserSpacing
- from: 0
- to: 2
- validator: DoubleValidator { bottom: 0; top: 2 }
-
- onValueModified: (newValue) => {
- rootPane.visualiserSpacing = newValue;
- rootPane.saveConfig();
- }
- }
- }
-}
-
diff --git a/modules/controlcenter/appearance/sections/BorderSection.qml b/modules/controlcenter/appearance/sections/BorderSection.qml
deleted file mode 100644
index dae26c3..0000000
--- a/modules/controlcenter/appearance/sections/BorderSection.qml
+++ /dev/null
@@ -1,63 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import "../../components"
-import qs.components
-import qs.components.controls
-import qs.components.containers
-import qs.services
-import qs.config
-import QtQuick
-import QtQuick.Layouts
-
-CollapsibleSection {
- id: root
-
- required property var rootPane
-
- title: qsTr("Border")
- showBackground: true
-
- SectionContainer {
- contentSpacing: Appearance.spacing.normal
-
- SliderInput {
- Layout.fillWidth: true
-
- label: qsTr("Border rounding")
- value: rootPane.borderRounding
- from: 0.1
- to: 100
- decimals: 1
- suffix: "px"
- validator: DoubleValidator { bottom: 0.1; top: 100 }
-
- onValueModified: (newValue) => {
- rootPane.borderRounding = newValue;
- rootPane.saveConfig();
- }
- }
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.normal
-
- SliderInput {
- Layout.fillWidth: true
-
- label: qsTr("Border thickness")
- value: rootPane.borderThickness
- from: 0.1
- to: 100
- decimals: 1
- suffix: "px"
- validator: DoubleValidator { bottom: 0.1; top: 100 }
-
- onValueModified: (newValue) => {
- rootPane.borderThickness = newValue;
- rootPane.saveConfig();
- }
- }
- }
-}
-
diff --git a/modules/controlcenter/appearance/sections/ColorSchemeSection.qml b/modules/controlcenter/appearance/sections/ColorSchemeSection.qml
deleted file mode 100644
index c0e5eb5..0000000
--- a/modules/controlcenter/appearance/sections/ColorSchemeSection.qml
+++ /dev/null
@@ -1,147 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import "../../../launcher/services"
-import qs.components
-import qs.components.controls
-import qs.components.containers
-import qs.services
-import qs.config
-import Quickshell
-import QtQuick
-import QtQuick.Layouts
-
-CollapsibleSection {
- title: qsTr("Color scheme")
- description: qsTr("Available color schemes")
- showBackground: true
-
- ColumnLayout {
- Layout.fillWidth: true
- spacing: Appearance.spacing.small / 2
-
- Repeater {
- model: Schemes.list
-
- delegate: StyledRect {
- required property var modelData
-
- Layout.fillWidth: true
-
- readonly property string schemeKey: `${modelData.name} ${modelData.flavour}`
- readonly property bool isCurrent: schemeKey === Schemes.currentScheme
-
- color: Qt.alpha(Colours.tPalette.m3surfaceContainer, isCurrent ? Colours.tPalette.m3surfaceContainer.a : 0)
- radius: Appearance.rounding.normal
- border.width: isCurrent ? 1 : 0
- border.color: Colours.palette.m3primary
-
- StateLayer {
- function onClicked(): void {
- const name = modelData.name;
- const flavour = modelData.flavour;
- const schemeKey = `${name} ${flavour}`;
-
- Schemes.currentScheme = schemeKey;
- Quickshell.execDetached(["caelestia", "scheme", "set", "-n", name, "-f", flavour]);
-
- Qt.callLater(() => {
- reloadTimer.restart();
- });
- }
- }
-
- Timer {
- id: reloadTimer
- interval: 300
- onTriggered: {
- Schemes.reload();
- }
- }
-
- RowLayout {
- id: schemeRow
-
- anchors.fill: parent
- anchors.margins: Appearance.padding.normal
-
- spacing: Appearance.spacing.normal
-
- StyledRect {
- id: preview
-
- Layout.alignment: Qt.AlignVCenter
-
- border.width: 1
- border.color: Qt.alpha(`#${modelData.colours?.outline}`, 0.5)
-
- color: `#${modelData.colours?.surface}`
- radius: Appearance.rounding.full
- implicitWidth: iconPlaceholder.implicitWidth
- implicitHeight: iconPlaceholder.implicitWidth
-
- MaterialIcon {
- id: iconPlaceholder
- visible: false
- text: "circle"
- font.pointSize: Appearance.font.size.large
- }
-
- Item {
- anchors.top: parent.top
- anchors.bottom: parent.bottom
- anchors.right: parent.right
-
- implicitWidth: parent.implicitWidth / 2
- clip: true
-
- StyledRect {
- anchors.top: parent.top
- anchors.bottom: parent.bottom
- anchors.right: parent.right
-
- implicitWidth: preview.implicitWidth
- color: `#${modelData.colours?.primary}`
- radius: Appearance.rounding.full
- }
- }
- }
-
- Column {
- Layout.fillWidth: true
- spacing: 0
-
- StyledText {
- text: modelData.flavour ?? ""
- font.pointSize: Appearance.font.size.normal
- }
-
- StyledText {
- text: modelData.name ?? ""
- font.pointSize: Appearance.font.size.small
- color: Colours.palette.m3outline
-
- elide: Text.ElideRight
- anchors.left: parent.left
- anchors.right: parent.right
- }
- }
-
- Loader {
- active: isCurrent
- asynchronous: true
-
- sourceComponent: MaterialIcon {
- text: "check"
- color: Colours.palette.m3onSurfaceVariant
- font.pointSize: Appearance.font.size.large
- }
- }
- }
-
- implicitHeight: schemeRow.implicitHeight + Appearance.padding.normal * 2
- }
- }
- }
-}
-
diff --git a/modules/controlcenter/appearance/sections/ColorVariantSection.qml b/modules/controlcenter/appearance/sections/ColorVariantSection.qml
deleted file mode 100644
index 98c3d7c..0000000
--- a/modules/controlcenter/appearance/sections/ColorVariantSection.qml
+++ /dev/null
@@ -1,92 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import "../../../launcher/services"
-import qs.components
-import qs.components.controls
-import qs.components.containers
-import qs.services
-import qs.config
-import Quickshell
-import QtQuick
-import QtQuick.Layouts
-
-CollapsibleSection {
- title: qsTr("Color variant")
- description: qsTr("Material theme variant")
- showBackground: true
-
- ColumnLayout {
- Layout.fillWidth: true
- spacing: Appearance.spacing.small / 2
-
- Repeater {
- model: M3Variants.list
-
- delegate: StyledRect {
- required property var modelData
-
- Layout.fillWidth: true
-
- color: Qt.alpha(Colours.tPalette.m3surfaceContainer, modelData.variant === Schemes.currentVariant ? Colours.tPalette.m3surfaceContainer.a : 0)
- radius: Appearance.rounding.normal
- border.width: modelData.variant === Schemes.currentVariant ? 1 : 0
- border.color: Colours.palette.m3primary
-
- StateLayer {
- function onClicked(): void {
- const variant = modelData.variant;
-
- Schemes.currentVariant = variant;
- Quickshell.execDetached(["caelestia", "scheme", "set", "-v", variant]);
-
- Qt.callLater(() => {
- reloadTimer.restart();
- });
- }
- }
-
- Timer {
- id: reloadTimer
- interval: 300
- onTriggered: {
- Schemes.reload();
- }
- }
-
- RowLayout {
- id: variantRow
-
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.normal
-
- spacing: Appearance.spacing.normal
-
- MaterialIcon {
- text: modelData.icon
- font.pointSize: Appearance.font.size.large
- fill: modelData.variant === Schemes.currentVariant ? 1 : 0
- }
-
- StyledText {
- Layout.fillWidth: true
- text: modelData.name
- font.weight: modelData.variant === Schemes.currentVariant ? 500 : 400
- }
-
- MaterialIcon {
- visible: modelData.variant === Schemes.currentVariant
- text: "check"
- color: Colours.palette.m3primary
- font.pointSize: Appearance.font.size.large
- }
- }
-
- implicitHeight: variantRow.implicitHeight + Appearance.padding.normal * 2
- }
- }
- }
-}
-
diff --git a/modules/controlcenter/appearance/sections/FontsSection.qml b/modules/controlcenter/appearance/sections/FontsSection.qml
deleted file mode 100644
index 57b10ff..0000000
--- a/modules/controlcenter/appearance/sections/FontsSection.qml
+++ /dev/null
@@ -1,286 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import "../../components"
-import qs.components
-import qs.components.controls
-import qs.components.containers
-import qs.services
-import qs.config
-import QtQuick
-import QtQuick.Layouts
-
-CollapsibleSection {
- id: root
-
- required property var rootPane
-
- title: qsTr("Fonts")
- showBackground: true
-
- CollapsibleSection {
- id: materialFontSection
- title: qsTr("Material font family")
- expanded: true
- showBackground: true
- nested: true
-
- Loader {
- id: materialFontLoader
- Layout.fillWidth: true
- Layout.preferredHeight: item ? Math.min(item.contentHeight, 300) : 0
- asynchronous: true
- active: materialFontSection.expanded
-
- sourceComponent: StyledListView {
- id: materialFontList
- property alias contentHeight: materialFontList.contentHeight
-
- clip: true
- spacing: Appearance.spacing.small / 2
- model: Qt.fontFamilies()
-
- StyledScrollBar.vertical: StyledScrollBar {
- flickable: materialFontList
- }
-
- delegate: StyledRect {
- required property string modelData
- required property int index
-
- width: ListView.view.width
-
- readonly property bool isCurrent: modelData === rootPane.fontFamilyMaterial
- color: Qt.alpha(Colours.tPalette.m3surfaceContainer, isCurrent ? Colours.tPalette.m3surfaceContainer.a : 0)
- radius: Appearance.rounding.normal
- border.width: isCurrent ? 1 : 0
- border.color: Colours.palette.m3primary
-
- StateLayer {
- function onClicked(): void {
- rootPane.fontFamilyMaterial = modelData;
- rootPane.saveConfig();
- }
- }
-
- RowLayout {
- id: fontFamilyMaterialRow
-
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.normal
-
- spacing: Appearance.spacing.normal
-
- StyledText {
- text: modelData
- font.pointSize: Appearance.font.size.normal
- }
-
- Item {
- Layout.fillWidth: true
- }
-
- Loader {
- active: isCurrent
- asynchronous: true
-
- sourceComponent: MaterialIcon {
- text: "check"
- color: Colours.palette.m3onSurfaceVariant
- font.pointSize: Appearance.font.size.large
- }
- }
- }
-
- implicitHeight: fontFamilyMaterialRow.implicitHeight + Appearance.padding.normal * 2
- }
- }
- }
- }
-
- CollapsibleSection {
- id: monoFontSection
- title: qsTr("Monospace font family")
- expanded: false
- showBackground: true
- nested: true
-
- Loader {
- Layout.fillWidth: true
- Layout.preferredHeight: item ? Math.min(item.contentHeight, 300) : 0
- asynchronous: true
- active: monoFontSection.expanded
-
- sourceComponent: StyledListView {
- id: monoFontList
- property alias contentHeight: monoFontList.contentHeight
-
- clip: true
- spacing: Appearance.spacing.small / 2
- model: Qt.fontFamilies()
-
- StyledScrollBar.vertical: StyledScrollBar {
- flickable: monoFontList
- }
-
- delegate: StyledRect {
- required property string modelData
- required property int index
-
- width: ListView.view.width
-
- readonly property bool isCurrent: modelData === rootPane.fontFamilyMono
- color: Qt.alpha(Colours.tPalette.m3surfaceContainer, isCurrent ? Colours.tPalette.m3surfaceContainer.a : 0)
- radius: Appearance.rounding.normal
- border.width: isCurrent ? 1 : 0
- border.color: Colours.palette.m3primary
-
- StateLayer {
- function onClicked(): void {
- rootPane.fontFamilyMono = modelData;
- rootPane.saveConfig();
- }
- }
-
- RowLayout {
- id: fontFamilyMonoRow
-
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.normal
-
- spacing: Appearance.spacing.normal
-
- StyledText {
- text: modelData
- font.pointSize: Appearance.font.size.normal
- }
-
- Item {
- Layout.fillWidth: true
- }
-
- Loader {
- active: isCurrent
- asynchronous: true
-
- sourceComponent: MaterialIcon {
- text: "check"
- color: Colours.palette.m3onSurfaceVariant
- font.pointSize: Appearance.font.size.large
- }
- }
- }
-
- implicitHeight: fontFamilyMonoRow.implicitHeight + Appearance.padding.normal * 2
- }
- }
- }
- }
-
- CollapsibleSection {
- id: sansFontSection
- title: qsTr("Sans-serif font family")
- expanded: false
- showBackground: true
- nested: true
-
- Loader {
- Layout.fillWidth: true
- Layout.preferredHeight: item ? Math.min(item.contentHeight, 300) : 0
- asynchronous: true
- active: sansFontSection.expanded
-
- sourceComponent: StyledListView {
- id: sansFontList
- property alias contentHeight: sansFontList.contentHeight
-
- clip: true
- spacing: Appearance.spacing.small / 2
- model: Qt.fontFamilies()
-
- StyledScrollBar.vertical: StyledScrollBar {
- flickable: sansFontList
- }
-
- delegate: StyledRect {
- required property string modelData
- required property int index
-
- width: ListView.view.width
-
- readonly property bool isCurrent: modelData === rootPane.fontFamilySans
- color: Qt.alpha(Colours.tPalette.m3surfaceContainer, isCurrent ? Colours.tPalette.m3surfaceContainer.a : 0)
- radius: Appearance.rounding.normal
- border.width: isCurrent ? 1 : 0
- border.color: Colours.palette.m3primary
-
- StateLayer {
- function onClicked(): void {
- rootPane.fontFamilySans = modelData;
- rootPane.saveConfig();
- }
- }
-
- RowLayout {
- id: fontFamilySansRow
-
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.normal
-
- spacing: Appearance.spacing.normal
-
- StyledText {
- text: modelData
- font.pointSize: Appearance.font.size.normal
- }
-
- Item {
- Layout.fillWidth: true
- }
-
- Loader {
- active: isCurrent
- asynchronous: true
-
- sourceComponent: MaterialIcon {
- text: "check"
- color: Colours.palette.m3onSurfaceVariant
- font.pointSize: Appearance.font.size.large
- }
- }
- }
-
- implicitHeight: fontFamilySansRow.implicitHeight + Appearance.padding.normal * 2
- }
- }
- }
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.normal
-
- SliderInput {
- Layout.fillWidth: true
-
- label: qsTr("Font size scale")
- value: rootPane.fontSizeScale
- from: 0.7
- to: 1.5
- decimals: 2
- suffix: "×"
- validator: DoubleValidator { bottom: 0.7; top: 1.5 }
-
- onValueModified: (newValue) => {
- rootPane.fontSizeScale = newValue;
- rootPane.saveConfig();
- }
- }
- }
-}
-
diff --git a/modules/controlcenter/appearance/sections/ScalesSection.qml b/modules/controlcenter/appearance/sections/ScalesSection.qml
deleted file mode 100644
index f74923b..0000000
--- a/modules/controlcenter/appearance/sections/ScalesSection.qml
+++ /dev/null
@@ -1,84 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import "../../components"
-import qs.components
-import qs.components.controls
-import qs.components.containers
-import qs.services
-import qs.config
-import QtQuick
-import QtQuick.Layouts
-
-CollapsibleSection {
- id: root
-
- required property var rootPane
-
- title: qsTr("Scales")
- showBackground: true
-
- SectionContainer {
- contentSpacing: Appearance.spacing.normal
-
- SliderInput {
- Layout.fillWidth: true
-
- label: qsTr("Padding scale")
- value: rootPane.paddingScale
- from: 0.5
- to: 2.0
- decimals: 1
- suffix: "×"
- validator: DoubleValidator { bottom: 0.5; top: 2.0 }
-
- onValueModified: (newValue) => {
- rootPane.paddingScale = newValue;
- rootPane.saveConfig();
- }
- }
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.normal
-
- SliderInput {
- Layout.fillWidth: true
-
- label: qsTr("Rounding scale")
- value: rootPane.roundingScale
- from: 0.1
- to: 5.0
- decimals: 1
- suffix: "×"
- validator: DoubleValidator { bottom: 0.1; top: 5.0 }
-
- onValueModified: (newValue) => {
- rootPane.roundingScale = newValue;
- rootPane.saveConfig();
- }
- }
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.normal
-
- SliderInput {
- Layout.fillWidth: true
-
- label: qsTr("Spacing scale")
- value: rootPane.spacingScale
- from: 0.1
- to: 2.0
- decimals: 1
- suffix: "×"
- validator: DoubleValidator { bottom: 0.1; top: 2.0 }
-
- onValueModified: (newValue) => {
- rootPane.spacingScale = newValue;
- rootPane.saveConfig();
- }
- }
- }
-}
-
diff --git a/modules/controlcenter/appearance/sections/ThemeModeSection.qml b/modules/controlcenter/appearance/sections/ThemeModeSection.qml
deleted file mode 100644
index c136437..0000000
--- a/modules/controlcenter/appearance/sections/ThemeModeSection.qml
+++ /dev/null
@@ -1,24 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import qs.components
-import qs.components.controls
-import qs.components.containers
-import qs.services
-import qs.config
-import QtQuick
-
-CollapsibleSection {
- title: qsTr("Theme mode")
- description: qsTr("Light or dark theme")
- showBackground: true
-
- SwitchRow {
- label: qsTr("Dark mode")
- checked: !Colours.currentLight
- onToggled: checked => {
- Colours.setMode(checked ? "dark" : "light");
- }
- }
-}
-
diff --git a/modules/controlcenter/appearance/sections/TransparencySection.qml b/modules/controlcenter/appearance/sections/TransparencySection.qml
deleted file mode 100644
index c9dbfb8..0000000
--- a/modules/controlcenter/appearance/sections/TransparencySection.qml
+++ /dev/null
@@ -1,74 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import "../../components"
-import qs.components
-import qs.components.controls
-import qs.components.containers
-import qs.services
-import qs.config
-import QtQuick
-import QtQuick.Layouts
-
-CollapsibleSection {
- id: root
-
- required property var rootPane
-
- title: qsTr("Transparency")
- showBackground: true
-
- SwitchRow {
- label: qsTr("Transparency enabled")
- checked: rootPane.transparencyEnabled
- onToggled: checked => {
- rootPane.transparencyEnabled = checked;
- rootPane.saveConfig();
- }
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.normal
-
- SliderInput {
- Layout.fillWidth: true
-
- label: qsTr("Transparency base")
- value: rootPane.transparencyBase * 100
- from: 0
- to: 100
- suffix: "%"
- validator: IntValidator { bottom: 0; top: 100 }
- formatValueFunction: (val) => Math.round(val).toString()
- parseValueFunction: (text) => parseInt(text)
-
- onValueModified: (newValue) => {
- rootPane.transparencyBase = newValue / 100;
- rootPane.saveConfig();
- }
- }
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.normal
-
- SliderInput {
- Layout.fillWidth: true
-
- label: qsTr("Transparency layers")
- value: rootPane.transparencyLayers * 100
- from: 0
- to: 100
- suffix: "%"
- validator: IntValidator { bottom: 0; top: 100 }
- formatValueFunction: (val) => Math.round(val).toString()
- parseValueFunction: (text) => parseInt(text)
-
- onValueModified: (newValue) => {
- rootPane.transparencyLayers = newValue / 100;
- rootPane.saveConfig();
- }
- }
- }
-}
-
diff --git a/modules/controlcenter/launcher/LauncherPane.qml b/modules/controlcenter/launcher/LauncherPane.qml
deleted file mode 100644
index 47f87cc..0000000
--- a/modules/controlcenter/launcher/LauncherPane.qml
+++ /dev/null
@@ -1,599 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import "../components"
-import "../../launcher/services"
-import qs.components
-import qs.components.controls
-import qs.components.effects
-import qs.components.containers
-import qs.services
-import qs.config
-import qs.utils
-import Caelestia
-import Quickshell
-import Quickshell.Widgets
-import QtQuick
-import QtQuick.Layouts
-import "../../../utils/scripts/fuzzysort.js" as Fuzzy
-
-Item {
- id: root
-
- required property Session session
-
- property var selectedApp: root.session.launcher.active
- property bool hideFromLauncherChecked: false
-
- anchors.fill: parent
-
- onSelectedAppChanged: {
- root.session.launcher.active = root.selectedApp;
- updateToggleState();
- }
-
- Connections {
- target: root.session.launcher
- function onActiveChanged() {
- root.selectedApp = root.session.launcher.active;
- updateToggleState();
- }
- }
-
- function updateToggleState() {
- if (!root.selectedApp) {
- root.hideFromLauncherChecked = false;
- return;
- }
-
- const appId = root.selectedApp.id || root.selectedApp.entry?.id;
-
- if (Config.launcher.hiddenApps && Config.launcher.hiddenApps.length > 0) {
- root.hideFromLauncherChecked = Config.launcher.hiddenApps.includes(appId);
- } else {
- root.hideFromLauncherChecked = false;
- }
- }
-
- function saveHiddenApps(isHidden) {
- if (!root.selectedApp) {
- return;
- }
-
- const appId = root.selectedApp.id || root.selectedApp.entry?.id;
-
- const hiddenApps = Config.launcher.hiddenApps ? [...Config.launcher.hiddenApps] : [];
-
- if (isHidden) {
- if (!hiddenApps.includes(appId)) {
- hiddenApps.push(appId);
- }
- } else {
- const index = hiddenApps.indexOf(appId);
- if (index !== -1) {
- hiddenApps.splice(index, 1);
- }
- }
-
- Config.launcher.hiddenApps = hiddenApps;
- Config.save();
- }
-
-
- AppDb {
- id: allAppsDb
-
- path: `${Paths.state}/apps.sqlite`
- entries: DesktopEntries.applications.values
- }
-
- property string searchText: ""
-
- function filterApps(search: string): list<var> {
- if (!search || search.trim() === "") {
- const apps = [];
- for (let i = 0; i < allAppsDb.apps.length; i++) {
- apps.push(allAppsDb.apps[i]);
- }
- return apps;
- }
-
- if (!allAppsDb.apps || allAppsDb.apps.length === 0) {
- return [];
- }
-
- const preparedApps = [];
- for (let i = 0; i < allAppsDb.apps.length; i++) {
- const app = allAppsDb.apps[i];
- const name = app.name || app.entry?.name || "";
- preparedApps.push({
- _item: app,
- name: Fuzzy.prepare(name)
- });
- }
-
- const results = Fuzzy.go(search, preparedApps, {
- all: true,
- keys: ["name"],
- scoreFn: r => r[0].score
- });
-
- return results
- .sort((a, b) => b._score - a._score)
- .map(r => r.obj._item);
- }
-
- property list<var> filteredApps: []
-
- function updateFilteredApps() {
- filteredApps = filterApps(searchText);
- }
-
- onSearchTextChanged: {
- updateFilteredApps();
- }
-
- Component.onCompleted: {
- updateFilteredApps();
- }
-
- Connections {
- target: allAppsDb
- function onAppsChanged() {
- updateFilteredApps();
- }
- }
-
- SplitPaneLayout {
- anchors.fill: parent
-
- leftContent: Component {
-
- ColumnLayout {
- id: leftLauncherLayout
- anchors.fill: parent
-
- spacing: Appearance.spacing.small
-
- RowLayout {
- spacing: Appearance.spacing.smaller
-
- StyledText {
- text: qsTr("Launcher")
- font.pointSize: Appearance.font.size.large
- font.weight: 500
- }
-
- Item {
- Layout.fillWidth: true
- }
-
- ToggleButton {
- toggled: !root.session.launcher.active
- icon: "settings"
- accent: "Primary"
- iconSize: Appearance.font.size.normal
- horizontalPadding: Appearance.padding.normal
- verticalPadding: Appearance.padding.smaller
- tooltip: qsTr("Launcher settings")
-
- onClicked: {
- if (root.session.launcher.active) {
- root.session.launcher.active = null;
- } else {
- if (root.filteredApps.length > 0) {
- root.session.launcher.active = root.filteredApps[0];
- }
- }
- }
- }
- }
-
- StyledText {
- Layout.topMargin: Appearance.spacing.large
- text: qsTr("Applications (%1)").arg(root.searchText ? root.filteredApps.length : allAppsDb.apps.length)
- font.pointSize: Appearance.font.size.normal
- font.weight: 500
- }
-
- StyledText {
- text: qsTr("All applications available in the launcher")
- color: Colours.palette.m3outline
- }
-
- StyledRect {
- Layout.fillWidth: true
- Layout.topMargin: Appearance.spacing.normal
- Layout.bottomMargin: Appearance.spacing.small
-
- color: Colours.layer(Colours.palette.m3surfaceContainer, 2)
- radius: Appearance.rounding.full
-
- implicitHeight: Math.max(searchIcon.implicitHeight, searchField.implicitHeight, clearIcon.implicitHeight)
-
- MaterialIcon {
- id: searchIcon
-
- anchors.verticalCenter: parent.verticalCenter
- anchors.left: parent.left
- anchors.leftMargin: Appearance.padding.normal
-
- text: "search"
- color: Colours.palette.m3onSurfaceVariant
- }
-
- StyledTextField {
- id: searchField
-
- anchors.left: searchIcon.right
- anchors.right: clearIcon.left
- anchors.leftMargin: Appearance.spacing.small
- anchors.rightMargin: Appearance.spacing.small
-
- topPadding: Appearance.padding.normal
- bottomPadding: Appearance.padding.normal
-
- placeholderText: qsTr("Search applications...")
-
- onTextChanged: {
- root.searchText = text;
- }
- }
-
- MaterialIcon {
- id: clearIcon
-
- anchors.verticalCenter: parent.verticalCenter
- anchors.right: parent.right
- anchors.rightMargin: Appearance.padding.normal
-
- width: searchField.text ? implicitWidth : implicitWidth / 2
- opacity: {
- if (!searchField.text)
- return 0;
- if (clearMouse.pressed)
- return 0.7;
- if (clearMouse.containsMouse)
- return 0.8;
- return 1;
- }
-
- text: "close"
- color: Colours.palette.m3onSurfaceVariant
-
- MouseArea {
- id: clearMouse
-
- anchors.fill: parent
- hoverEnabled: true
- cursorShape: searchField.text ? Qt.PointingHandCursor : undefined
-
- onClicked: searchField.text = ""
- }
-
- Behavior on width {
- Anim {
- duration: Appearance.anim.durations.small
- }
- }
-
- Behavior on opacity {
- Anim {
- duration: Appearance.anim.durations.small
- }
- }
- }
- }
-
- Loader {
- id: appsListLoader
- Layout.fillWidth: true
- Layout.fillHeight: true
- asynchronous: true
- active: true
-
- sourceComponent: StyledListView {
- id: appsListView
-
- Layout.fillWidth: true
- Layout.fillHeight: true
-
- model: root.filteredApps
- spacing: Appearance.spacing.small / 2
- clip: true
-
- StyledScrollBar.vertical: StyledScrollBar {
- flickable: parent
- }
-
- delegate: StyledRect {
- required property var modelData
-
- width: parent ? parent.width : 0
-
- readonly property bool isSelected: root.selectedApp === modelData
-
- color: isSelected ? Colours.layer(Colours.palette.m3surfaceContainer, 2) : "transparent"
- radius: Appearance.rounding.normal
-
- opacity: 0
-
- Behavior on opacity {
- NumberAnimation {
- duration: 1000
- easing.type: Easing.OutCubic
- }
- }
-
- Component.onCompleted: {
- opacity = 1;
- }
-
- StateLayer {
- function onClicked(): void {
- root.session.launcher.active = modelData;
- }
- }
-
- RowLayout {
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.normal
-
- spacing: Appearance.spacing.normal
-
- IconImage {
- Layout.alignment: Qt.AlignVCenter
- implicitSize: 32
- source: {
- const entry = modelData.entry;
- return entry ? Quickshell.iconPath(entry.icon, "image-missing") : "image-missing";
- }
- }
-
- StyledText {
- Layout.fillWidth: true
- text: modelData.name || modelData.entry?.name || qsTr("Unknown")
- font.pointSize: Appearance.font.size.normal
- }
- }
-
- implicitHeight: 40
- }
- }
- }
- }
- }
-
- rightContent: Component {
- Item {
- id: rightLauncherPane
-
- property var pane: root.session.launcher.active
- property string paneId: pane ? (pane.id || pane.entry?.id || "") : ""
- property Component targetComponent: settings
- property Component nextComponent: settings
- property var displayedApp: null
-
- function getComponentForPane() {
- return pane ? appDetails : settings;
- }
-
- Component.onCompleted: {
- displayedApp = pane;
- targetComponent = getComponentForPane();
- nextComponent = targetComponent;
- }
-
- Loader {
- id: rightLauncherLoader
-
- anchors.fill: parent
-
- opacity: 1
- scale: 1
- transformOrigin: Item.Center
- clip: false
-
- asynchronous: true
- sourceComponent: rightLauncherPane.targetComponent
- active: true
-
- property var displayedApp: rightLauncherPane.displayedApp
-
- onItemChanged: {
- if (item && rightLauncherPane.pane && rightLauncherPane.displayedApp !== rightLauncherPane.pane) {
- rightLauncherPane.displayedApp = rightLauncherPane.pane;
- }
- }
- }
-
- Behavior on paneId {
- PaneTransition {
- target: rightLauncherLoader
- propertyActions: [
- PropertyAction {
- target: rightLauncherPane
- property: "displayedApp"
- value: rightLauncherPane.pane
- },
- PropertyAction {
- target: rightLauncherLoader
- property: "active"
- value: false
- },
- PropertyAction {
- target: rightLauncherPane
- property: "targetComponent"
- value: rightLauncherPane.nextComponent
- },
- PropertyAction {
- target: rightLauncherLoader
- property: "active"
- value: true
- }
- ]
- }
- }
-
- onPaneChanged: {
- nextComponent = getComponentForPane();
- paneId = pane ? (pane.id || pane.entry?.id || "") : "";
- }
-
- onDisplayedAppChanged: {
- if (displayedApp) {
- const appId = displayedApp.id || displayedApp.entry?.id;
- if (Config.launcher.hiddenApps && Config.launcher.hiddenApps.length > 0) {
- root.hideFromLauncherChecked = Config.launcher.hiddenApps.includes(appId);
- } else {
- root.hideFromLauncherChecked = false;
- }
- } else {
- root.hideFromLauncherChecked = false;
- }
- }
- }
- }
- }
-
- Component {
- id: settings
-
- StyledFlickable {
- id: settingsFlickable
- flickableDirection: Flickable.VerticalFlick
- contentHeight: settingsInner.height
-
- StyledScrollBar.vertical: StyledScrollBar {
- flickable: settingsFlickable
- }
-
- Settings {
- id: settingsInner
-
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.top: parent.top
- session: root.session
- }
- }
- }
-
- Component {
- id: appDetails
-
- ColumnLayout {
- id: appDetailsLayout
- anchors.fill: parent
-
- readonly property var displayedApp: parent && parent.displayedApp !== undefined ? parent.displayedApp : null
-
- spacing: Appearance.spacing.normal
-
- SettingsHeader {
- Layout.leftMargin: Appearance.padding.large * 2
- Layout.rightMargin: Appearance.padding.large * 2
- Layout.topMargin: Appearance.padding.large * 2
- visible: displayedApp === null
- icon: "apps"
- title: qsTr("Launcher Applications")
- }
-
- Item {
- Layout.alignment: Qt.AlignHCenter
- Layout.leftMargin: Appearance.padding.large * 2
- Layout.rightMargin: Appearance.padding.large * 2
- Layout.topMargin: Appearance.padding.large * 2
- visible: displayedApp !== null
- implicitWidth: Math.max(appIconImage.implicitWidth, appTitleText.implicitWidth)
- implicitHeight: appIconImage.implicitHeight + Appearance.spacing.normal + appTitleText.implicitHeight
-
- ColumnLayout {
- anchors.centerIn: parent
- spacing: Appearance.spacing.normal
-
- IconImage {
- id: appIconImage
- Layout.alignment: Qt.AlignHCenter
- implicitSize: Appearance.font.size.extraLarge * 3 * 2
- source: {
- const app = appDetailsLayout.displayedApp;
- if (!app) return "image-missing";
- const entry = app.entry;
- if (entry && entry.icon) {
- return Quickshell.iconPath(entry.icon, "image-missing");
- }
- return "image-missing";
- }
- }
-
- StyledText {
- id: appTitleText
- Layout.alignment: Qt.AlignHCenter
- text: displayedApp ? (displayedApp.name || displayedApp.entry?.name || qsTr("Application Details")) : ""
- font.pointSize: Appearance.font.size.large
- font.bold: true
- }
- }
- }
-
- Item {
- Layout.fillWidth: true
- Layout.fillHeight: true
- Layout.topMargin: Appearance.spacing.large
- Layout.leftMargin: Appearance.padding.large * 2
- Layout.rightMargin: Appearance.padding.large * 2
-
- StyledFlickable {
- id: detailsFlickable
- anchors.fill: parent
- flickableDirection: Flickable.VerticalFlick
- contentHeight: debugLayout.height
-
- StyledScrollBar.vertical: StyledScrollBar {
- flickable: parent
- }
-
- ColumnLayout {
- id: debugLayout
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.top: parent.top
- spacing: Appearance.spacing.normal
-
- SwitchRow {
- Layout.topMargin: Appearance.spacing.normal
- visible: appDetailsLayout.displayedApp !== null
- label: qsTr("Hide from launcher")
- checked: root.hideFromLauncherChecked
- enabled: appDetailsLayout.displayedApp !== null
- onToggled: checked => {
- root.hideFromLauncherChecked = checked;
- const app = appDetailsLayout.displayedApp;
- if (app) {
- const appId = app.id || app.entry?.id;
- const hiddenApps = Config.launcher.hiddenApps ? [...Config.launcher.hiddenApps] : [];
- if (checked) {
- if (!hiddenApps.includes(appId)) {
- hiddenApps.push(appId);
- }
- } else {
- const index = hiddenApps.indexOf(appId);
- if (index !== -1) {
- hiddenApps.splice(index, 1);
- }
- }
- Config.launcher.hiddenApps = hiddenApps;
- Config.save();
- }
- }
- }
-
- }
- }
- }
- }
- }
-}
diff --git a/modules/controlcenter/launcher/Settings.qml b/modules/controlcenter/launcher/Settings.qml
deleted file mode 100644
index 7ab1d46..0000000
--- a/modules/controlcenter/launcher/Settings.qml
+++ /dev/null
@@ -1,167 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import "../components"
-import qs.components
-import qs.components.controls
-import qs.components.effects
-import qs.services
-import qs.config
-import QtQuick
-import QtQuick.Layouts
-
-ColumnLayout {
- id: root
-
- required property Session session
-
- spacing: Appearance.spacing.normal
-
- SettingsHeader {
- icon: "apps"
- title: qsTr("Launcher Settings")
- }
-
- SectionHeader {
- Layout.topMargin: Appearance.spacing.large
- title: qsTr("General")
- description: qsTr("General launcher settings")
- }
-
- SectionContainer {
- ToggleRow {
- label: qsTr("Enabled")
- checked: Config.launcher.enabled
- toggle.onToggled: {
- Config.launcher.enabled = checked;
- Config.save();
- }
- }
-
- ToggleRow {
- label: qsTr("Show on hover")
- checked: Config.launcher.showOnHover
- toggle.onToggled: {
- Config.launcher.showOnHover = checked;
- Config.save();
- }
- }
-
- ToggleRow {
- label: qsTr("Vim keybinds")
- checked: Config.launcher.vimKeybinds
- toggle.onToggled: {
- Config.launcher.vimKeybinds = checked;
- Config.save();
- }
- }
- }
-
- SectionHeader {
- Layout.topMargin: Appearance.spacing.large
- title: qsTr("Display")
- description: qsTr("Display and appearance settings")
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.small / 2
-
- PropertyRow {
- label: qsTr("Max shown items")
- value: qsTr("%1").arg(Config.launcher.maxShown)
- }
-
- PropertyRow {
- showTopMargin: true
- label: qsTr("Drag threshold")
- value: qsTr("%1 px").arg(Config.launcher.dragThreshold)
- }
- }
-
- SectionHeader {
- Layout.topMargin: Appearance.spacing.large
- title: qsTr("Prefixes")
- description: qsTr("Command prefix settings")
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.small / 2
-
- PropertyRow {
- label: qsTr("Special prefix")
- value: Config.launcher.specialPrefix || qsTr("None")
- }
-
- PropertyRow {
- showTopMargin: true
- label: qsTr("Action prefix")
- value: Config.launcher.actionPrefix || qsTr("None")
- }
- }
-
- SectionHeader {
- Layout.topMargin: Appearance.spacing.large
- title: qsTr("Fuzzy search")
- description: qsTr("Fuzzy search settings")
- }
-
- SectionContainer {
- ToggleRow {
- label: qsTr("Apps")
- checked: Config.launcher.useFuzzy.apps
- toggle.onToggled: {
- Config.launcher.useFuzzy.apps = checked;
- Config.save();
- }
- }
- }
-
- SectionHeader {
- Layout.topMargin: Appearance.spacing.large
- title: qsTr("Sizes")
- description: qsTr("Size settings for launcher items")
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.small / 2
-
- PropertyRow {
- label: qsTr("Item width")
- value: qsTr("%1 px").arg(Config.launcher.sizes.itemWidth)
- }
-
- PropertyRow {
- showTopMargin: true
- label: qsTr("Item height")
- value: qsTr("%1 px").arg(Config.launcher.sizes.itemHeight)
- }
-
- PropertyRow {
- showTopMargin: true
- label: qsTr("Wallpaper width")
- value: qsTr("%1 px").arg(Config.launcher.sizes.wallpaperWidth)
- }
-
- PropertyRow {
- showTopMargin: true
- label: qsTr("Wallpaper height")
- value: qsTr("%1 px").arg(Config.launcher.sizes.wallpaperHeight)
- }
- }
-
- SectionHeader {
- Layout.topMargin: Appearance.spacing.large
- title: qsTr("Hidden apps")
- description: qsTr("Applications hidden from launcher")
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.small / 2
-
- PropertyRow {
- label: qsTr("Total hidden")
- value: qsTr("%1").arg(Config.launcher.hiddenApps ? Config.launcher.hiddenApps.length : 0)
- }
- }
-}
-
diff --git a/modules/controlcenter/taskbar/ConnectedButtonGroup.qml b/modules/controlcenter/taskbar/ConnectedButtonGroup.qml
deleted file mode 100644
index bf3a97f..0000000
--- a/modules/controlcenter/taskbar/ConnectedButtonGroup.qml
+++ /dev/null
@@ -1,109 +0,0 @@
-import ".."
-import qs.components
-import qs.components.controls
-import qs.components.effects
-import qs.services
-import qs.config
-import QtQuick
-import QtQuick.Layouts
-
-StyledRect {
- id: root
-
- property var options: [] // Array of {label: string, propertyName: string, onToggled: function}
- property var rootItem: null // The root item that contains the properties we want to bind to
- property string title: "" // Optional title text
-
- Layout.fillWidth: true
- implicitHeight: layout.implicitHeight + Appearance.padding.large * 2
- radius: Appearance.rounding.normal
- color: Colours.layer(Colours.palette.m3surfaceContainer, 2)
- clip: true
-
- Behavior on implicitHeight {
- Anim {}
- }
-
- ColumnLayout {
- id: layout
-
- anchors.fill: parent
- anchors.margins: Appearance.padding.large
- spacing: Appearance.spacing.normal
-
- StyledText {
- visible: root.title !== ""
- text: root.title
- font.pointSize: Appearance.font.size.normal
- }
-
- RowLayout {
- id: buttonRow
- Layout.alignment: Qt.AlignHCenter
- spacing: Appearance.spacing.small
-
- Repeater {
- id: repeater
- model: root.options
-
- delegate: TextButton {
- id: button
- required property int index
- required property var modelData
-
- Layout.fillWidth: true
- text: modelData.label
-
- property bool _checked: false
-
- checked: _checked
- toggle: false
- type: TextButton.Tonal
-
- // Create binding in Component.onCompleted
- Component.onCompleted: {
- if (root.rootItem && modelData.propertyName) {
- const propName = modelData.propertyName;
- const rootItem = root.rootItem;
- _checked = Qt.binding(function() {
- return rootItem[propName] ?? false;
- });
- }
- }
-
- // Match utilities Toggles radius styling
- // Each button has full rounding (not connected) since they have spacing
- radius: stateLayer.pressed ? Appearance.rounding.small / 2 : internalChecked ? Appearance.rounding.small : Appearance.rounding.normal
-
- // Match utilities Toggles inactive color
- inactiveColour: Colours.layer(Colours.palette.m3surfaceContainerHighest, 2)
-
- // Adjust width similar to utilities toggles
- Layout.preferredWidth: implicitWidth + (stateLayer.pressed ? Appearance.padding.large : internalChecked ? Appearance.padding.smaller : 0)
-
- onClicked: {
- if (modelData.onToggled && root.rootItem && modelData.propertyName) {
- const currentValue = root.rootItem[modelData.propertyName] ?? false;
- modelData.onToggled(!currentValue);
- }
- }
-
- Behavior on Layout.preferredWidth {
- Anim {
- duration: Appearance.anim.durations.expressiveFastSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial
- }
- }
-
- Behavior on radius {
- Anim {
- duration: Appearance.anim.durations.expressiveFastSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial
- }
- }
- }
- }
- }
- }
-}
-
diff --git a/modules/controlcenter/taskbar/TaskbarPane.qml b/modules/controlcenter/taskbar/TaskbarPane.qml
deleted file mode 100644
index 5d51c8c..0000000
--- a/modules/controlcenter/taskbar/TaskbarPane.qml
+++ /dev/null
@@ -1,637 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import "../components"
-import qs.components
-import qs.components.controls
-import qs.components.effects
-import qs.components.containers
-import qs.services
-import qs.config
-import qs.utils
-import Quickshell
-import Quickshell.Widgets
-import QtQuick
-import QtQuick.Layouts
-
-Item {
- id: root
-
- required property Session session
-
- property bool clockShowIcon: Config.bar.clock.showIcon ?? true
- property bool persistent: Config.bar.persistent ?? true
- property bool showOnHover: Config.bar.showOnHover ?? true
- property int dragThreshold: Config.bar.dragThreshold ?? 20
- property bool showAudio: Config.bar.status.showAudio ?? true
- property bool showMicrophone: Config.bar.status.showMicrophone ?? true
- property bool showKbLayout: Config.bar.status.showKbLayout ?? false
- property bool showNetwork: Config.bar.status.showNetwork ?? true
- property bool showBluetooth: Config.bar.status.showBluetooth ?? true
- property bool showBattery: Config.bar.status.showBattery ?? true
- property bool showLockStatus: Config.bar.status.showLockStatus ?? true
- property bool trayBackground: Config.bar.tray.background ?? false
- property bool trayCompact: Config.bar.tray.compact ?? false
- property bool trayRecolour: Config.bar.tray.recolour ?? false
- property int workspacesShown: Config.bar.workspaces.shown ?? 5
- property bool workspacesActiveIndicator: Config.bar.workspaces.activeIndicator ?? true
- property bool workspacesOccupiedBg: Config.bar.workspaces.occupiedBg ?? false
- property bool workspacesShowWindows: Config.bar.workspaces.showWindows ?? false
- property bool workspacesPerMonitor: Config.bar.workspaces.perMonitorWorkspaces ?? true
- property bool scrollWorkspaces: Config.bar.scrollActions.workspaces ?? true
- property bool scrollVolume: Config.bar.scrollActions.volume ?? true
- property bool scrollBrightness: Config.bar.scrollActions.brightness ?? true
- property bool popoutActiveWindow: Config.bar.popouts.activeWindow ?? true
- property bool popoutTray: Config.bar.popouts.tray ?? true
- property bool popoutStatusIcons: Config.bar.popouts.statusIcons ?? true
-
- anchors.fill: parent
-
- Component.onCompleted: {
- if (Config.bar.entries) {
- entriesModel.clear();
- for (let i = 0; i < Config.bar.entries.length; i++) {
- const entry = Config.bar.entries[i];
- entriesModel.append({
- id: entry.id,
- enabled: entry.enabled !== false
- });
- }
- }
- }
-
- function saveConfig(entryIndex, entryEnabled) {
- Config.bar.clock.showIcon = root.clockShowIcon;
- Config.bar.persistent = root.persistent;
- Config.bar.showOnHover = root.showOnHover;
- Config.bar.dragThreshold = root.dragThreshold;
- Config.bar.status.showAudio = root.showAudio;
- Config.bar.status.showMicrophone = root.showMicrophone;
- Config.bar.status.showKbLayout = root.showKbLayout;
- Config.bar.status.showNetwork = root.showNetwork;
- Config.bar.status.showBluetooth = root.showBluetooth;
- Config.bar.status.showBattery = root.showBattery;
- Config.bar.status.showLockStatus = root.showLockStatus;
- Config.bar.tray.background = root.trayBackground;
- Config.bar.tray.compact = root.trayCompact;
- Config.bar.tray.recolour = root.trayRecolour;
- Config.bar.workspaces.shown = root.workspacesShown;
- Config.bar.workspaces.activeIndicator = root.workspacesActiveIndicator;
- Config.bar.workspaces.occupiedBg = root.workspacesOccupiedBg;
- Config.bar.workspaces.showWindows = root.workspacesShowWindows;
- Config.bar.workspaces.perMonitorWorkspaces = root.workspacesPerMonitor;
- Config.bar.scrollActions.workspaces = root.scrollWorkspaces;
- Config.bar.scrollActions.volume = root.scrollVolume;
- Config.bar.scrollActions.brightness = root.scrollBrightness;
- Config.bar.popouts.activeWindow = root.popoutActiveWindow;
- Config.bar.popouts.tray = root.popoutTray;
- Config.bar.popouts.statusIcons = root.popoutStatusIcons;
-
- const entries = [];
- for (let i = 0; i < entriesModel.count; i++) {
- const entry = entriesModel.get(i);
- let enabled = entry.enabled;
- if (entryIndex !== undefined && i === entryIndex) {
- enabled = entryEnabled;
- }
- entries.push({
- id: entry.id,
- enabled: enabled
- });
- }
- Config.bar.entries = entries;
- Config.save();
- }
-
- ListModel {
- id: entriesModel
- }
-
- ClippingRectangle {
- id: taskbarClippingRect
- anchors.fill: parent
- anchors.margins: Appearance.padding.normal
- anchors.leftMargin: 0
- anchors.rightMargin: Appearance.padding.normal
-
- radius: taskbarBorder.innerRadius
- color: "transparent"
-
- Loader {
- id: taskbarLoader
-
- anchors.fill: parent
- anchors.margins: Appearance.padding.large + Appearance.padding.normal
- anchors.leftMargin: Appearance.padding.large
- anchors.rightMargin: Appearance.padding.large
-
- asynchronous: true
- sourceComponent: taskbarContentComponent
- }
- }
-
- InnerBorder {
- id: taskbarBorder
- leftThickness: 0
- rightThickness: Appearance.padding.normal
- }
-
- Component {
- id: taskbarContentComponent
-
- StyledFlickable {
- id: sidebarFlickable
- flickableDirection: Flickable.VerticalFlick
- contentHeight: sidebarLayout.height
-
- StyledScrollBar.vertical: StyledScrollBar {
- flickable: sidebarFlickable
- }
-
- ColumnLayout {
- id: sidebarLayout
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.top: parent.top
-
- spacing: Appearance.spacing.normal
-
- RowLayout {
- spacing: Appearance.spacing.smaller
-
- StyledText {
- text: qsTr("Taskbar")
- font.pointSize: Appearance.font.size.large
- font.weight: 500
- }
- }
-
- SectionContainer {
- Layout.fillWidth: true
- alignTop: true
-
- StyledText {
- text: qsTr("Status Icons")
- font.pointSize: Appearance.font.size.normal
- }
-
- ConnectedButtonGroup {
- rootItem: root
-
- options: [
- {
- label: qsTr("Speakers"),
- propertyName: "showAudio",
- onToggled: function(checked) {
- root.showAudio = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Microphone"),
- propertyName: "showMicrophone",
- onToggled: function(checked) {
- root.showMicrophone = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Keyboard"),
- propertyName: "showKbLayout",
- onToggled: function(checked) {
- root.showKbLayout = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Network"),
- propertyName: "showNetwork",
- onToggled: function(checked) {
- root.showNetwork = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Bluetooth"),
- propertyName: "showBluetooth",
- onToggled: function(checked) {
- root.showBluetooth = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Battery"),
- propertyName: "showBattery",
- onToggled: function(checked) {
- root.showBattery = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Capslock"),
- propertyName: "showLockStatus",
- onToggled: function(checked) {
- root.showLockStatus = checked;
- root.saveConfig();
- }
- }
- ]
- }
- }
-
- RowLayout {
- id: mainRowLayout
- Layout.fillWidth: true
- spacing: Appearance.spacing.normal
-
- ColumnLayout {
- id: leftColumnLayout
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignTop
- spacing: Appearance.spacing.normal
-
- SectionContainer {
- Layout.fillWidth: true
- alignTop: true
-
- StyledText {
- text: qsTr("Workspaces")
- font.pointSize: Appearance.font.size.normal
- }
-
- StyledRect {
- Layout.fillWidth: true
- implicitHeight: workspacesShownRow.implicitHeight + Appearance.padding.large * 2
- radius: Appearance.rounding.normal
- color: Colours.layer(Colours.palette.m3surfaceContainer, 2)
-
- Behavior on implicitHeight {
- Anim {}
- }
-
- RowLayout {
- id: workspacesShownRow
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.large
- spacing: Appearance.spacing.normal
-
- StyledText {
- Layout.fillWidth: true
- text: qsTr("Shown")
- }
-
- CustomSpinBox {
- min: 1
- max: 20
- value: root.workspacesShown
- onValueModified: value => {
- root.workspacesShown = value;
- root.saveConfig();
- }
- }
- }
- }
-
- StyledRect {
- Layout.fillWidth: true
- implicitHeight: workspacesActiveIndicatorRow.implicitHeight + Appearance.padding.large * 2
- radius: Appearance.rounding.normal
- color: Colours.layer(Colours.palette.m3surfaceContainer, 2)
-
- Behavior on implicitHeight {
- Anim {}
- }
-
- RowLayout {
- id: workspacesActiveIndicatorRow
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.large
- spacing: Appearance.spacing.normal
-
- StyledText {
- Layout.fillWidth: true
- text: qsTr("Active indicator")
- }
-
- StyledSwitch {
- checked: root.workspacesActiveIndicator
- onToggled: {
- root.workspacesActiveIndicator = checked;
- root.saveConfig();
- }
- }
- }
- }
-
- StyledRect {
- Layout.fillWidth: true
- implicitHeight: workspacesOccupiedBgRow.implicitHeight + Appearance.padding.large * 2
- radius: Appearance.rounding.normal
- color: Colours.layer(Colours.palette.m3surfaceContainer, 2)
-
- Behavior on implicitHeight {
- Anim {}
- }
-
- RowLayout {
- id: workspacesOccupiedBgRow
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.large
- spacing: Appearance.spacing.normal
-
- StyledText {
- Layout.fillWidth: true
- text: qsTr("Occupied background")
- }
-
- StyledSwitch {
- checked: root.workspacesOccupiedBg
- onToggled: {
- root.workspacesOccupiedBg = checked;
- root.saveConfig();
- }
- }
- }
- }
-
- StyledRect {
- Layout.fillWidth: true
- implicitHeight: workspacesShowWindowsRow.implicitHeight + Appearance.padding.large * 2
- radius: Appearance.rounding.normal
- color: Colours.layer(Colours.palette.m3surfaceContainer, 2)
-
- Behavior on implicitHeight {
- Anim {}
- }
-
- RowLayout {
- id: workspacesShowWindowsRow
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.large
- spacing: Appearance.spacing.normal
-
- StyledText {
- Layout.fillWidth: true
- text: qsTr("Show windows")
- }
-
- StyledSwitch {
- checked: root.workspacesShowWindows
- onToggled: {
- root.workspacesShowWindows = checked;
- root.saveConfig();
- }
- }
- }
- }
-
- StyledRect {
- Layout.fillWidth: true
- implicitHeight: workspacesPerMonitorRow.implicitHeight + Appearance.padding.large * 2
- radius: Appearance.rounding.normal
- color: Colours.layer(Colours.palette.m3surfaceContainer, 2)
-
- Behavior on implicitHeight {
- Anim {}
- }
-
- RowLayout {
- id: workspacesPerMonitorRow
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.large
- spacing: Appearance.spacing.normal
-
- StyledText {
- Layout.fillWidth: true
- text: qsTr("Per monitor workspaces")
- }
-
- StyledSwitch {
- checked: root.workspacesPerMonitor
- onToggled: {
- root.workspacesPerMonitor = checked;
- root.saveConfig();
- }
- }
- }
- }
- }
-
- SectionContainer {
- Layout.fillWidth: true
- alignTop: true
-
- StyledText {
- text: qsTr("Scroll Actions")
- font.pointSize: Appearance.font.size.normal
- }
-
- ConnectedButtonGroup {
- rootItem: root
-
- options: [
- {
- label: qsTr("Workspaces"),
- propertyName: "scrollWorkspaces",
- onToggled: function(checked) {
- root.scrollWorkspaces = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Volume"),
- propertyName: "scrollVolume",
- onToggled: function(checked) {
- root.scrollVolume = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Brightness"),
- propertyName: "scrollBrightness",
- onToggled: function(checked) {
- root.scrollBrightness = checked;
- root.saveConfig();
- }
- }
- ]
- }
- }
- }
-
- ColumnLayout {
- id: middleColumnLayout
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignTop
- spacing: Appearance.spacing.normal
-
- SectionContainer {
- Layout.fillWidth: true
- alignTop: true
-
- StyledText {
- text: qsTr("Clock")
- font.pointSize: Appearance.font.size.normal
- }
-
- SwitchRow {
- label: qsTr("Show clock icon")
- checked: root.clockShowIcon
- onToggled: checked => {
- root.clockShowIcon = checked;
- root.saveConfig();
- }
- }
- }
-
- SectionContainer {
- Layout.fillWidth: true
- alignTop: true
-
- StyledText {
- text: qsTr("Bar Behavior")
- font.pointSize: Appearance.font.size.normal
- }
-
- SwitchRow {
- label: qsTr("Persistent")
- checked: root.persistent
- onToggled: checked => {
- root.persistent = checked;
- root.saveConfig();
- }
- }
-
- SwitchRow {
- label: qsTr("Show on hover")
- checked: root.showOnHover
- onToggled: checked => {
- root.showOnHover = checked;
- root.saveConfig();
- }
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.normal
-
- SliderInput {
- Layout.fillWidth: true
-
- label: qsTr("Drag threshold")
- value: root.dragThreshold
- from: 0
- to: 100
- suffix: "px"
- validator: IntValidator { bottom: 0; top: 100 }
- formatValueFunction: (val) => Math.round(val).toString()
- parseValueFunction: (text) => parseInt(text)
-
- onValueModified: (newValue) => {
- root.dragThreshold = Math.round(newValue);
- root.saveConfig();
- }
- }
- }
- }
- }
-
- ColumnLayout {
- id: rightColumnLayout
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignTop
- spacing: Appearance.spacing.normal
-
- SectionContainer {
- Layout.fillWidth: true
- alignTop: true
-
- StyledText {
- text: qsTr("Popouts")
- font.pointSize: Appearance.font.size.normal
- }
-
- SwitchRow {
- label: qsTr("Active window")
- checked: root.popoutActiveWindow
- onToggled: checked => {
- root.popoutActiveWindow = checked;
- root.saveConfig();
- }
- }
-
- SwitchRow {
- label: qsTr("Tray")
- checked: root.popoutTray
- onToggled: checked => {
- root.popoutTray = checked;
- root.saveConfig();
- }
- }
-
- SwitchRow {
- label: qsTr("Status icons")
- checked: root.popoutStatusIcons
- onToggled: checked => {
- root.popoutStatusIcons = checked;
- root.saveConfig();
- }
- }
- }
-
- SectionContainer {
- Layout.fillWidth: true
- alignTop: true
-
- StyledText {
- text: qsTr("Tray Settings")
- font.pointSize: Appearance.font.size.normal
- }
-
- ConnectedButtonGroup {
- rootItem: root
-
- options: [
- {
- label: qsTr("Background"),
- propertyName: "trayBackground",
- onToggled: function(checked) {
- root.trayBackground = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Compact"),
- propertyName: "trayCompact",
- onToggled: function(checked) {
- root.trayCompact = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Recolour"),
- propertyName: "trayRecolour",
- onToggled: function(checked) {
- root.trayRecolour = checked;
- root.saveConfig();
- }
- }
- ]
- }
- }
- }
- }
-
- }
- }
- }
-}
diff --git a/modules/launcher/services/Apps.qml b/modules/launcher/services/Apps.qml
index c409a7b..79f3754 100644
--- a/modules/launcher/services/Apps.qml
+++ b/modules/launcher/services/Apps.qml
@@ -13,7 +13,7 @@ Searcher {
if (entry.runInTerminal)
Quickshell.execDetached({
- command: ["app2unit", "--", ...Config.general.apps.terminal, `${Quickshell.shellDir}/assets/wrap_term_launch.sh`, ...entry.command],
+ command: ["app2unit", "--", ...Config.general.apps.terminal, ...entry.command],
workingDirectory: entry.workingDirectory
});
else
diff --git a/modules/utilities/cards/Toggles.qml b/modules/utilities/cards/Toggles.qml
index 51e991e..e62d3c7 100644
--- a/modules/utilities/cards/Toggles.qml
+++ b/modules/utilities/cards/Toggles.qml
@@ -73,12 +73,6 @@ StyledRect {
}
Toggle {
- icon: "gamepad"
- checked: GameMode.enabled
- onClicked: GameMode.enabled = !GameMode.enabled
- }
-
- Toggle {
icon: "notifications_off"
checked: Notifs.dnd
onClicked: Notifs.dnd = !Notifs.dnd