diff options
| author | Freya Murphy <freya@freyacat.org> | 2026-01-09 15:15:49 -0500 |
|---|---|---|
| committer | Freya Murphy <freya@freyacat.org> | 2026-01-09 15:15:49 -0500 |
| commit | d8efeffaf11bca0fd4d14b67b5dcc3ffa4cb972d (patch) | |
| tree | 38b012373dce50c8eecdfaad36332fb6a362f698 | |
| parent | only show active workspaces, fix colors (diff) | |
| download | caelestia-shell-d8efeffaf11bca0fd4d14b67b5dcc3ffa4cb972d.tar.gz caelestia-shell-d8efeffaf11bca0fd4d14b67b5dcc3ffa4cb972d.tar.bz2 caelestia-shell-d8efeffaf11bca0fd4d14b67b5dcc3ffa4cb972d.zip | |
remove more stuffff
35 files changed, 16 insertions, 4191 deletions
@@ -1,722 +1,5 @@ -<h1 align=center>caelestia-shell</h1> +# Caelestia shell -<div align=center> +This is a HARD fork of the caelestia shell with MANY modifications. - - - -[](https://ko-fi.com/soramane) - -</div> - -https://github.com/user-attachments/assets/0840f496-575c-4ca6-83a8-87bb01a85c5f - -## Components - -- Widgets: [`Quickshell`](https://quickshell.outfoxxed.me) -- Window manager: [`Hyprland`](https://hyprland.org) -- Dots: [`caelestia`](https://github.com/caelestia-dots) - -## Installation - -> [!NOTE] -> This repo is for the desktop shell of the caelestia dots. If you want installation instructions -> for the entire dots, head to [the main repo](https://github.com/caelestia-dots/caelestia) instead. - -### Arch linux - -> [!NOTE] -> If you want to make your own changes/tweaks to the shell do NOT edit the files installed by the AUR -> package. Instead, follow the instructions in the [manual installation section](#manual-installation). - -The shell is available from the AUR as `caelestia-shell`. You can install it with an AUR helper -like [`yay`](https://github.com/Jguer/yay) or manually downloading the PKGBUILD and running `makepkg -si`. - -A package following the latest commit also exists as `caelestia-shell-git`. This is bleeding edge -and likely to be unstable/have bugs. Regular users are recommended to use the stable package -(`caelestia-shell`). - -### Nix - -You can run the shell directly via `nix run`: - -```sh -nix run github:caelestia-dots/shell -``` - -Or add it to your system configuration: - -```nix -{ - inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; - - caelestia-shell = { - url = "github:caelestia-dots/shell"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - }; -} -``` - -The package is available as `caelestia-shell.packages.<system>.default`, which can be added to your -`environment.systemPackages`, `users.users.<username>.packages`, `home.packages` if using home-manager, -or a devshell. The shell can then be run via `caelestia-shell`. - -> [!TIP] -> The default package does not have the CLI enabled by default, which is required for full funcionality. -> To enable the CLI, use the `with-cli` package. - -For home-manager, you can also use the Caelestia's home manager module (explained in [configuring](https://github.com/caelestia-dots/shell?tab=readme-ov-file#home-manager-module)) that installs and configures the shell and the CLI. - -### Manual installation - -Dependencies: - -- [`caelestia-cli`](https://github.com/caelestia-dots/cli) -- [`quickshell-git`](https://quickshell.outfoxxed.me) - this has to be the git version, not the latest tagged version -- [`ddcutil`](https://github.com/rockowitz/ddcutil) -- [`brightnessctl`](https://github.com/Hummer12007/brightnessctl) -- [`app2unit`](https://github.com/Vladimir-csp/app2unit) -- [`libcava`](https://github.com/LukashonakV/cava) -- [`networkmanager`](https://networkmanager.dev) -- [`lm-sensors`](https://github.com/lm-sensors/lm-sensors) -- [`fish`](https://github.com/fish-shell/fish-shell) -- [`aubio`](https://github.com/aubio/aubio) -- [`libpipewire`](https://pipewire.org) -- `glibc` -- `qt6-declarative` -- `gcc-libs` -- [`material-symbols`](https://fonts.google.com/icons) -- [`caskaydia-cove-nerd`](https://www.nerdfonts.com/font-downloads) -- [`swappy`](https://github.com/jtheoof/swappy) -- [`libqalculate`](https://github.com/Qalculate/libqalculate) -- [`bash`](https://www.gnu.org/software/bash) -- `qt6-base` -- `qt6-declarative` - -Build dependencies: - -- [`cmake`](https://cmake.org) -- [`ninja`](https://github.com/ninja-build/ninja) - -To install the shell manually, install all dependencies and clone this repo to `$XDG_CONFIG_HOME/quickshell/caelestia`. -Then simply build and install using `cmake`. - -```sh -cd $XDG_CONFIG_HOME/quickshell -git clone https://github.com/caelestia-dots/shell.git caelestia - -cd caelestia -cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/ -cmake --build build -sudo cmake --install build -``` - -> [!TIP] -> You can customise the installation location via the `cmake` flags `INSTALL_LIBDIR`, `INSTALL_QMLDIR` and -> `INSTALL_QSCONFDIR` for the libraries (the beat detector), QML plugin and Quickshell config directories -> respectively. If changing the library directory, remember to set the `CAELESTIA_LIB_DIR` environment -> variable to the custom directory when launching the shell. -> -> e.g. installing to `~/.config/quickshell/caelestia` for easy local changes: -> -> ```sh -> mkdir -p ~/.config/quickshell/caelestia -> cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/ -DINSTALL_QSCONFDIR=~/.config/quickshell/caelestia -> cmake --build build -> sudo cmake --install build -> sudo chown -R $USER ~/.config/quickshell/caelestia -> ``` - -## Usage - -The shell can be started via the `caelestia shell -d` command or `qs -c caelestia`. -If the entire caelestia dots are installed, the shell will be autostarted on login -via an `exec-once` in the hyprland config. - -### Shortcuts/IPC - -All keybinds are accessible via Hyprland [global shortcuts](https://wiki.hyprland.org/Configuring/Binds/#dbus-global-shortcuts). -If using the entire caelestia dots, the keybinds are already configured for you. -Otherwise, [this file](https://github.com/caelestia-dots/caelestia/blob/main/hypr/hyprland/keybinds.conf#L1-L39) -contains an example on how to use global shortcuts. - -All IPC commands can be accessed via `caelestia shell ...`. For example - -```sh -caelestia shell mpris getActive trackTitle -``` - -The list of IPC commands can be shown via `caelestia shell -s`: - -``` -$ caelestia shell -s -target drawers - function toggle(drawer: string): void - function list(): string -target notifs - function clear(): void -target lock - function lock(): void - function unlock(): void - function isLocked(): bool -target mpris - function playPause(): void - function getActive(prop: string): string - function next(): void - function stop(): void - function play(): void - function list(): string - function pause(): void - function previous(): void -target picker - function openFreeze(): void - function open(): void -target wallpaper - function set(path: string): void - function get(): string - function list(): string -``` - -### PFP/Wallpapers - -The profile picture for the dashboard is read from the file `~/.face`, so to set -it you can copy your image to there or set it via the dashboard. - -The wallpapers for the wallpaper switcher are read from `~/Pictures/Wallpapers` -by default. To change it, change the wallpapers path in `~/.config/caelestia/shell.json`. - -To set the wallpaper, you can use the command `caelestia wallpaper`. Use `caelestia wallpaper -h` for more info about -the command. - -## Updating - -If installed via the AUR package, simply update your system (e.g. using `yay`). - -If installed manually, you can update by running `git pull` in `$XDG_CONFIG_HOME/quickshell/caelestia`. - -```sh -cd $XDG_CONFIG_HOME/quickshell/caelestia -git pull -``` - -## Configuring - -All configuration options should be put in `~/.config/caelestia/shell.json`. This file is _not_ created by -default, you must create it manually. - -### Example configuration - -> [!NOTE] -> The example configuration only includes recommended configuration options. For more advanced customisation -> such as modifying the size of individual items or changing constants in the code, there are some other -> options which can be found in the source files in the `config` directory. - -<details><summary>Example</summary> - -```json -{ - "appearance": { - "anim": { - "durations": { - "scale": 1 - } - }, - "font": { - "family": { - "clock": "Rubik", - "material": "Material Symbols Rounded", - "mono": "CaskaydiaCove NF", - "sans": "Rubik" - }, - "size": { - "scale": 1 - } - }, - "padding": { - "scale": 1 - }, - "rounding": { - "scale": 1 - }, - "spacing": { - "scale": 1 - }, - "transparency": { - "enabled": false, - "base": 0.85, - "layers": 0.4 - } - }, - "general": { - "apps": { - "terminal": ["foot"], - "audio": ["pavucontrol"], - "playback": ["mpv"], - "explorer": ["thunar"] - }, - "battery": { - "warnLevels": [ - { - "level": 20, - "title": "Low battery", - "message": "You might want to plug in a charger", - "icon": "battery_android_frame_2" - }, - { - "level": 10, - "title": "Did you see the previous message?", - "message": "You should probably plug in a charger <b>now</b>", - "icon": "battery_android_frame_1" - }, - { - "level": 5, - "title": "Critical battery level", - "message": "PLUG THE CHARGER RIGHT NOW!!", - "icon": "battery_android_alert", - "critical": true - } - ], - "criticalLevel": 3 - }, - "idle": { - "lockBeforeSleep": true, - "inhibitWhenAudio": true, - "timeouts": [ - { - "timeout": 180, - "idleAction": "lock" - }, - { - "timeout": 300, - "idleAction": "dpms off", - "returnAction": "dpms on" - }, - { - "timeout": 600, - "idleAction": ["systemctl", "suspend-then-hibernate"] - } - ] - } - }, - "background": { - "desktopClock": { - "enabled": false - }, - "enabled": true, - "visualiser": { - "blur": false, - "enabled": false, - "autoHide": true, - "rounding": 1, - "spacing": 1 - } - }, - "bar": { - "clock": { - "showIcon": true - }, - "dragThreshold": 20, - "entries": [ - { - "id": "logo", - "enabled": true - }, - { - "id": "workspaces", - "enabled": true - }, - { - "id": "spacer", - "enabled": true - }, - { - "id": "activeWindow", - "enabled": true - }, - { - "id": "spacer", - "enabled": true - }, - { - "id": "tray", - "enabled": true - }, - { - "id": "clock", - "enabled": true - }, - { - "id": "statusIcons", - "enabled": true - }, - { - "id": "power", - "enabled": true - } - ], - "persistent": true, - "popouts": { - "activeWindow": true, - "statusIcons": true, - "tray": true - }, - "scrollActions": { - "brightness": true, - "workspaces": true, - "volume": true - }, - "showOnHover": true, - "status": { - "showAudio": false, - "showBattery": true, - "showBluetooth": true, - "showKbLayout": false, - "showMicrophone": false, - "showNetwork": true, - "showLockStatus": true - }, - "tray": { - "background": false, - "compact": false, - "iconSubs": [], - "recolour": false - }, - "workspaces": { - "activeIndicator": true, - "activeLabel": "", - "activeTrail": false, - "label": " ", - "occupiedBg": false, - "occupiedLabel": "", - "perMonitorWorkspaces": true, - "showWindows": true, - "shown": 5, - "specialWorkspaceIcons": [ - { - "name": "steam", - "icon": "sports_esports" - } - ] - }, - "excludedScreens": [""], - "activeWindow": { - "inverted": false - } - }, - "border": { - "rounding": 25, - "thickness": 10 - }, - "dashboard": { - "enabled": true, - "dragThreshold": 50, - "mediaUpdateInterval": 500, - "showOnHover": true - }, - "launcher": { - "actionPrefix": ">", - "actions": [ - { - "name": "Calculator", - "icon": "calculate", - "description": "Do simple math equations (powered by Qalc)", - "command": ["autocomplete", "calc"], - "enabled": true, - "dangerous": false - }, - { - "name": "Scheme", - "icon": "palette", - "description": "Change the current colour scheme", - "command": ["autocomplete", "scheme"], - "enabled": true, - "dangerous": false - }, - { - "name": "Wallpaper", - "icon": "image", - "description": "Change the current wallpaper", - "command": ["autocomplete", "wallpaper"], - "enabled": true, - "dangerous": false - }, - { - "name": "Variant", - "icon": "colors", - "description": "Change the current scheme variant", - "command": ["autocomplete", "variant"], - "enabled": true, - "dangerous": false - }, - { - "name": "Transparency", - "icon": "opacity", - "description": "Change shell transparency", - "command": ["autocomplete", "transparency"], - "enabled": false, - "dangerous": false - }, - { - "name": "Random", - "icon": "casino", - "description": "Switch to a random wallpaper", - "command": ["caelestia", "wallpaper", "-r"], - "enabled": true, - "dangerous": false - }, - { - "name": "Light", - "icon": "light_mode", - "description": "Change the scheme to light mode", - "command": ["setMode", "light"], - "enabled": true, - "dangerous": false - }, - { - "name": "Dark", - "icon": "dark_mode", - "description": "Change the scheme to dark mode", - "command": ["setMode", "dark"], - "enabled": true, - "dangerous": false - }, - { - "name": "Shutdown", - "icon": "power_settings_new", - "description": "Shutdown the system", - "command": ["systemctl", "poweroff"], - "enabled": true, - "dangerous": true - }, - { - "name": "Reboot", - "icon": "cached", - "description": "Reboot the system", - "command": ["systemctl", "reboot"], - "enabled": true, - "dangerous": true - }, - { - "name": "Logout", - "icon": "exit_to_app", - "description": "Log out of the current session", - "command": ["loginctl", "terminate-user", ""], - "enabled": true, - "dangerous": true - }, - { - "name": "Lock", - "icon": "lock", - "description": "Lock the current session", - "command": ["loginctl", "lock-session"], - "enabled": true, - "dangerous": false - }, - { - "name": "Sleep", - "icon": "bedtime", - "description": "Suspend then hibernate", - "command": ["systemctl", "suspend-then-hibernate"], - "enabled": true, - "dangerous": false - } - ], - "dragThreshold": 50, - "vimKeybinds": false, - "enableDangerousActions": false, - "maxShown": 7, - "maxWallpapers": 9, - "specialPrefix": "@", - "useFuzzy": { - "apps": false, - "actions": false, - "schemes": false, - "variants": false, - "wallpapers": false - }, - "showOnHover": false, - "hiddenApps": [] - }, - "lock": { - "recolourLogo": false - }, - "notifs": { - "actionOnClick": false, - "clearThreshold": 0.3, - "defaultExpireTimeout": 5000, - "expandThreshold": 20, - "openExpanded": false, - "expire": false - }, - "osd": { - "enabled": true, - "enableBrightness": true, - "enableMicrophone": false, - "hideDelay": 2000 - }, - "paths": { - "mediaGif": "root:/assets/bongocat.gif", - "sessionGif": "root:/assets/kurukuru.gif", - "wallpaperDir": "~/Pictures/Wallpapers" - }, - "services": { - "audioIncrement": 0.1, - "brightnessIncrement": 0.1, - "maxVolume": 1.0, - "defaultPlayer": "Spotify", - "gpuType": "", - "playerAliases": [{ "from": "com.github.th_ch.youtube_music", "to": "YT Music" }], - "weatherLocation": "", - "useFahrenheit": false, - "useTwelveHourClock": false, - "smartScheme": true, - "visualiserBars": 45 - }, - "session": { - "dragThreshold": 30, - "enabled": true, - "vimKeybinds": false, - "commands": { - "logout": ["loginctl", "terminate-user", ""], - "shutdown": ["systemctl", "poweroff"], - "hibernate": ["systemctl", "hibernate"], - "reboot": ["systemctl", "reboot"] - } - }, - "sidebar": { - "dragThreshold": 80, - "enabled": true - }, - "utilities": { - "enabled": true, - "maxToasts": 4, - "toasts": { - "audioInputChanged": true, - "audioOutputChanged": true, - "capsLockChanged": true, - "chargingChanged": true, - "configLoaded": true, - "dndChanged": true, - "gameModeChanged": true, - "kbLayoutChanged": true, - "numLockChanged": true, - "vpnChanged": true, - "nowPlaying": false - }, - "vpn": { - "enabled": false, - "provider": [ - { - "name": "wireguard", - "interface": "your-connection-name", - "displayName": "Wireguard (Your VPN)" - } - ] - } - } -} -``` - -</details> - -### Home Manager Module - -For NixOS users, a home manager module is also available. - -<details><summary><code>home.nix</code></summary> - -```nix -programs.caelestia = { - enable = true; - systemd = { - enable = false; # if you prefer starting from your compositor - target = "graphical-session.target"; - environment = []; - }; - settings = { - bar.status = { - showBattery = false; - }; - paths.wallpaperDir = "~/Images"; - }; - cli = { - enable = true; # Also add caelestia-cli to path - settings = { - theme.enableGtk = false; - }; - }; -}; -``` - -The module automatically adds Caelestia shell to the path with **full functionality**. The CLI is not required, however you have the option to enable and configure it. - -</details> - -## FAQ - -### My screen is flickering, help pls! - -Try disabling VRR in the hyprland config. You can do this by adding the following to `~/.config/caelestia/hypr-user.conf`: - -```conf -misc { - vrr = 0 -} -``` - -### I want to make my own changes to the hyprland config! - -You can add your custom hyprland configs to `~/.config/caelestia/hypr-user.conf`. - -### I want to make my own changes to other stuff! - -See the [manual installation](https://github.com/caelestia-dots/shell?tab=readme-ov-file#manual-installation) section -for the corresponding repo. - -### I want to disable XXX feature! - -Please read the [configuring](https://github.com/caelestia-dots/shell?tab=readme-ov-file#configuring) section in the readme. -If there is no corresponding option, make feature request. - -### How do I make my colour scheme change with my wallpaper? - -Set a wallpaper via the launcher or `caelestia wallpaper` and set the scheme to the dynamic scheme via the launcher -or `caelestia scheme set`. e.g. - -```sh -caelestia wallpaper -f <path/to/file> -caelestia scheme set -n dynamic -``` - -### My wallpapers aren't showing up in the launcher! - -The launcher pulls wallpapers from `~/Pictures/Wallpapers` by default. You can change this in the config. Additionally, -the launcher only shows an odd number of wallpapers at one time. If you only have 2 wallpapers, consider getting more -(or just putting one). - -## Credits - -Thanks to the Hyprland discord community (especially the homies in #rice-discussion) for all the help and suggestions -for improving these dots! - -A special thanks to [@outfoxxed](https://github.com/outfoxxed) for making Quickshell and the effort put into fixing issues -and implementing various feature requests. - -Another special thanks to [@end_4](https://github.com/end-4) for his [config](https://github.com/end-4/dots-hyprland) -which helped me a lot with learning how to use Quickshell. - -Finally another thank you to all the configs I took inspiration from (only one for now): - -- [Axenide/Ax-Shell](https://github.com/Axenide/Ax-Shell) - -## Stonks 📈 - -<a href="https://www.star-history.com/#caelestia-dots/shell&Date"> - <picture> - <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=caelestia-dots/shell&type=Date&theme=dark" /> - <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=caelestia-dots/shell&type=Date" /> - <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=caelestia-dots/shell&type=Date" /> - </picture> -</a> +See the origional [here](https://github.com/caelestia-dots/shell). diff --git a/assets/wrap_term_launch.sh b/assets/wrap_term_launch.sh deleted file mode 100755 index caf60c7..0000000 --- a/assets/wrap_term_launch.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env sh - -cat ~/.local/state/caelestia/sequences.txt 2>/dev/null - -exec "$@" diff --git a/config/BackgroundConfig.qml b/config/BackgroundConfig.qml index ec6b299..9bcca87 100644 --- a/config/BackgroundConfig.qml +++ b/config/BackgroundConfig.qml @@ -2,18 +2,4 @@ import Quickshell.Io JsonObject { property bool enabled: true - property DesktopClock desktopClock: DesktopClock {} - property Visualiser visualiser: Visualiser {} - - component DesktopClock: JsonObject { - property bool enabled: false - } - - component Visualiser: JsonObject { - property bool enabled: false - property bool autoHide: true - property bool blur: false - property real rounding: 1 - property real spacing: 1 - } } diff --git a/config/Config.qml b/config/Config.qml index cc268e9..8927a16 100644 --- a/config/Config.qml +++ b/config/Config.qml @@ -147,16 +147,6 @@ Singleton { function serializeBackground(): var { return { enabled: background.enabled, - desktopClock: { - enabled: background.desktopClock.enabled - }, - visualiser: { - enabled: background.visualiser.enabled, - autoHide: background.visualiser.autoHide, - blur: background.visualiser.blur, - rounding: background.visualiser.rounding, - spacing: background.visualiser.spacing - } }; } @@ -271,9 +261,6 @@ Singleton { hiddenApps: launcher.hiddenApps, useFuzzy: { apps: launcher.useFuzzy.apps, - schemes: launcher.useFuzzy.schemes, - variants: launcher.useFuzzy.variants, - wallpapers: launcher.useFuzzy.wallpapers }, sizes: { itemWidth: launcher.sizes.itemWidth, @@ -363,7 +350,6 @@ Singleton { toasts: { configLoaded: utilities.toasts.configLoaded, chargingChanged: utilities.toasts.chargingChanged, - gameModeChanged: utilities.toasts.gameModeChanged, dndChanged: utilities.toasts.dndChanged, audioOutputChanged: utilities.toasts.audioOutputChanged, audioInputChanged: utilities.toasts.audioInputChanged, diff --git a/config/LauncherConfig.qml b/config/LauncherConfig.qml index 896882f..6ab44d1 100644 --- a/config/LauncherConfig.qml +++ b/config/LauncherConfig.qml @@ -13,9 +13,6 @@ JsonObject { component UseFuzzy: JsonObject { property bool apps: false - property bool schemes: false - property bool variants: false - property bool wallpapers: false } component Sizes: JsonObject { diff --git a/config/UtilitiesConfig.qml b/config/UtilitiesConfig.qml index 5779d88..64eca91 100644 --- a/config/UtilitiesConfig.qml +++ b/config/UtilitiesConfig.qml @@ -16,7 +16,6 @@ JsonObject { component Toasts: JsonObject { property bool configLoaded: true property bool chargingChanged: true - property bool gameModeChanged: true property bool dndChanged: true property bool audioOutputChanged: true property bool audioInputChanged: true 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 diff --git a/nix/default.nix b/nix/default.nix index 67747b2..bd246a6 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -140,9 +140,6 @@ in mkdir -p $out/lib ln -s ${extras}/lib/* $out/lib/ - - # Ensure wrap_term_launch.sh is executable - chmod 755 $out/share/caelestia-shell/assets/wrap_term_launch.sh ''; passthru = { diff --git a/services/Colours.qml b/services/Colours.qml index d6f4812..cc07959 100644 --- a/services/Colours.qml +++ b/services/Colours.qml @@ -88,7 +88,7 @@ Singleton { ImageAnalyser { id: analyser - source: Wallpapers.current + source: Paths.wallpaper } component Transparency: QtObject { diff --git a/services/GameMode.qml b/services/GameMode.qml deleted file mode 100644 index 83770b7..0000000 --- a/services/GameMode.qml +++ /dev/null @@ -1,76 +0,0 @@ -pragma Singleton - -import qs.services -import qs.config -import Caelestia -import Quickshell -import Quickshell.Io -import QtQuick - -Singleton { - id: root - - property alias enabled: props.enabled - - function setDynamicConfs(): void { - Hypr.extras.applyOptions({ - "animations:enabled": 0, - "decoration:shadow:enabled": 0, - "decoration:blur:enabled": 0, - "general:gaps_in": 0, - "general:gaps_out": 0, - "general:border_size": 1, - "decoration:rounding": 0, - "general:allow_tearing": 1 - }); - } - - onEnabledChanged: { - if (enabled) { - setDynamicConfs(); - if (Config.utilities.toasts.gameModeChanged) - Toaster.toast(qsTr("Game mode enabled"), qsTr("Disabled Hyprland animations, blur, gaps and shadows"), "gamepad"); - } else { - Hypr.extras.message("reload"); - if (Config.utilities.toasts.gameModeChanged) - Toaster.toast(qsTr("Game mode disabled"), qsTr("Hyprland settings restored"), "gamepad"); - } - } - - PersistentProperties { - id: props - - property bool enabled: Hypr.options["animations:enabled"] === 0 - - reloadableId: "gameMode" - } - - Connections { - target: Hypr - - function onConfigReloaded(): void { - if (props.enabled) - root.setDynamicConfs(); - } - } - - IpcHandler { - target: "gameMode" - - function isEnabled(): bool { - return props.enabled; - } - - function toggle(): void { - props.enabled = !props.enabled; - } - - function enable(): void { - props.enabled = true; - } - - function disable(): void { - props.enabled = false; - } - } -} diff --git a/services/Wallpapers.qml b/services/Wallpapers.qml deleted file mode 100644 index 443b416..0000000 --- a/services/Wallpapers.qml +++ /dev/null @@ -1,45 +0,0 @@ -pragma Singleton - -import qs.config -import qs.utils -import Caelestia.Models -import Quickshell -import Quickshell.Io -import QtQuick - -Searcher { - id: root - - readonly property list<string> smartArg: Config.services.smartScheme ? [] : ["--no-smart"] - - property bool showPreview: false - readonly property string current: Paths.wallpaper - - function setWallpaper(path: string): void { - actualCurrent = path; - Quickshell.execDetached(["caelestia", "wallpaper", "-f", path, ...smartArg]); - } - - list: wallpapers.entries - key: "relativePath" - useFuzzy: Config.launcher.useFuzzy.wallpapers - extraOpts: useFuzzy ? ({}) : ({ - forward: false - }) - - IpcHandler { - target: "wallpaper" - - function get(): string { - return root.actualCurrent; - } - - function set(path: string): void { - root.setWallpaper(path); - } - - function list(): string { - return root.list.map(w => w.path).join("\n"); - } - } -} @@ -5,14 +5,12 @@ import "modules" import "modules/drawers" import "modules/background" -import "modules/areapicker" import "modules/lock" import Quickshell ShellRoot { Background {} Drawers {} - AreaPicker {} Lock { id: lock } |