diff --git a/Droidnix/README.html b/Droidnix/README.html index a7fd5aa0e..08d269d50 100644 --- a/Droidnix/README.html +++ b/Droidnix/README.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Droidnix: A Dendritic NixOS + Home Manager Configuration NixOS Configuration Structure @@ -204,143 +204,142 @@

Table of Contents

-
-

Shortcuts

-
+
+

Shortcuts

+

Introduction The Assets Folder @@ -356,25 +355,25 @@

Introduction   intro

-
-

What is Droidnix

-
+
+

What is Droidnix

+

Droidnix is a modular, declarative NixOS + Home Manager configuration system. with configurations managed via Emacs Org and Nix Flakes. The project is designed for reproducibility, maintainability, and cross-machine compatibility.

-
-

Installed components:

-
+
+

Installed components:

+
    -
  • Core
  • -
  • Hyprland
  • +
  • Core
  • +
  • Hyprland
-
-

Goals, project Structure, import hierarchy

-
+
+

Goals, project Structure, import hierarchy

+

This project uses a modular NixOS configuration with Hyprland support, designed for literate programming and cross-device reusability. The Droidnix repository is organized into two main parts: @@ -387,9 +386,9 @@ The Droidnix repository is organized into two main parts:

-
-

Root Level

-
+
+

Root Level

+
  • = is the entry point and imports:
      @@ -400,16 +399,16 @@ The Droidnix repository is organized into two main parts:
-
-

Generated Structure

-
+
+

Generated Structure

+

The generated/ directory contains all generated configurations, divided into three main groups: system, hyprland, and mangowc.

-
-

First Setup

-
+
+

First Setup

+
  1. Clone this repository.
  2. Run the setup script: ./setup_droid.
  3. @@ -430,9 +429,9 @@ The generated/ directory contains all generated configurations, div The .assets/ folder contains all static files, such as configs, scripts, and themes. These files are not generated and can be edited directly.

-
-

generated/assets/2_b_installed.conf

-
+
+

generated/assets/2_b_installed.conf

+

This is a list of additional apps to install

@@ -510,9 +509,9 @@ com.logseq.Logseq
-
-

generated/assets/aliases.conf

-
+
+

generated/assets/aliases.conf

+

This is a list of additional apps to install

@@ -554,9 +553,9 @@ keys=hyprctl binds This section contains the Org blocks for tangling Nix code into the generated folders.

-
-

generated/flake.nix

-
+
+

generated/flake.nix

+

The Nix flake definition for Droidnix.

@@ -647,9 +646,9 @@ The Nix flake definition for Droidnix.
-
-

generated/modules/traveldroid/system/colors.nix

-
+
+

generated/modules/traveldroid/system/colors.nix

+

Setting the colors for Droidnix.

@@ -726,9 +725,9 @@ in
-
-

generated/hosts/traveldroid/boot.nix

-
+
+

generated/hosts/traveldroid/boot.nix

+
# --- This file has been auto-generated. For permanent changes alter the appropriate block in the README.org. ---
 { config, pkgs, lib, flakeRoot, ... }:
@@ -797,9 +796,9 @@ in
 
-
-

generated/hosts/traveldroid/hardware-configuration.nix

-
+
+

generated/hosts/traveldroid/hardware-configuration.nix

+
  1. Boot into NixOS Live ISO or your installed system.
  2. Open a terminal.
  3. @@ -857,9 +856,9 @@ in
-
-

generated/hosts/traveldroid/host.nix

-
+
+

generated/hosts/traveldroid/host.nix

+
{ lib, config, pkgs, flakeRoot, import-tree, home-manager, ... }:
 
@@ -919,13 +918,13 @@ in
 
-
-

generated/traveldroid/modules/apps

-
+
+

generated/traveldroid/modules/apps

+
-
-

generated/modules/traveldroid/apps/2_b_installed.nix

-
+
+

generated/modules/traveldroid/apps/2_b_installed.nix

+

This installs a list of apps

@@ -1033,9 +1032,9 @@ in {
-
-

generated/modules/traveldroid/apps/emacs/emacs.nix

-
+
+

generated/modules/traveldroid/apps/emacs/emacs.nix

+

This installs emacs

@@ -1131,9 +1130,9 @@ in
-
-

generated/disabled/modules/traveldroid/apps/flameshot.nix

-
+
+

generated/disabled/modules/traveldroid/apps/flameshot.nix

+

This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder

@@ -1193,9 +1192,9 @@ in
-
-

generated/modules/traveldroid/apps/kdeconnect.nix

-
+
+

generated/modules/traveldroid/apps/kdeconnect.nix

+

This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder

@@ -1224,9 +1223,9 @@ in
-
-

generated/modules/traveldroid/apps/kitty.nix

-
+
+

generated/modules/traveldroid/apps/kitty.nix

+

This file sets up Kitty terminal

@@ -1278,9 +1277,9 @@ in
-
-

generated/modules/traveldroid/apps/starship.nix

-
+
+

generated/modules/traveldroid/apps/starship.nix

+

This file sets up starship prompt

@@ -1319,9 +1318,9 @@ in
-
-

generated/modules/traveldroid/apps/thunar.nix

-
+
+

generated/modules/traveldroid/apps/thunar.nix

+

This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder

@@ -1367,9 +1366,9 @@ in
-
-

generated/modules/traveldroid/apps/wofi.nix

-
+
+

generated/modules/traveldroid/apps/wofi.nix

+

This is the install for Wofi, the launcher

@@ -1404,9 +1403,9 @@ in
-
-

generated/modules/traveldroid/apps/zenbrowser.nix

-
+
+

generated/modules/traveldroid/apps/zenbrowser.nix

+

This installs zen browser

@@ -1426,9 +1425,9 @@ in
-
-

generated/modules/traveldroid/apps/zeditor.nix

-
+
+

generated/modules/traveldroid/apps/zeditor.nix

+

This sets Zed Editor

@@ -1484,9 +1483,9 @@ in
-
-

generated/modules/traveldroid/apps/zsh.nix

-
+
+

generated/modules/traveldroid/apps/zsh.nix

+

This sets up the zsh in the terminal

@@ -1600,13 +1599,13 @@ in
-
-

generated/modules/traveldroid/desktop

-
+
+

generated/modules/traveldroid/desktop

+
-
-

generated/modules/traveldroid/desktop/fonts.nix

-
+
+

generated/modules/traveldroid/desktop/fonts.nix

+

This file installs and configures fonts

@@ -1624,9 +1623,9 @@ This file installs and configures fonts
-
-

generated/modules/traveldroid/desktop/gtk.nix

-
+
+

generated/modules/traveldroid/desktop/gtk.nix

+

Setting up GTK

@@ -1652,9 +1651,9 @@ in
-
-

generated/modules/traveldroid/desktop/hyprland.nix

-
+
+

generated/modules/traveldroid/desktop/hyprland.nix

+

Setting up Hyprland

@@ -1699,9 +1698,9 @@ in
-
-

generated/modules/traveldroid/desktop/stylix.nix

-
+
+

generated/modules/traveldroid/desktop/stylix.nix

+
{ lib, config, pkgs, flakeRoot, stylix, ... }:
 
@@ -1788,9 +1787,9 @@ in
 
-
-

generated/modules/traveldroid/desktop/wallpaper.nix

-
+
+

generated/modules/traveldroid/desktop/wallpaper.nix

+

Setting up wallpaper engine + wallpaper gui

@@ -1889,9 +1888,9 @@ in
-
-

generated/modules/traveldroid/desktop/waybar.nix

-
+
+

generated/modules/traveldroid/desktop/waybar.nix

+

This file installs and configures waybar

@@ -1937,9 +1936,9 @@ in
-
-

generated/modules/traveldroid/desktop/wayland.nix

-
+
+

generated/modules/traveldroid/desktop/wayland.nix

+
{ lib, config, pkgs, ... }:
 
@@ -1969,9 +1968,9 @@ in
 
-
-

generated/modules/traveldroid/desktop/xdg.nix

-
+
+

generated/modules/traveldroid/desktop/xdg.nix

+

This sets the XDG implementation

@@ -2042,13 +2041,13 @@ in
-
-

generated/modules/traveldroid/system

-
+
+

generated/modules/traveldroid/system

+
-
-

generated/modules/traveldroid/system/audio.nix

-
+
+

generated/modules/traveldroid/system/audio.nix

+
{ lib, config, pkgs, ... }:
 
@@ -2067,9 +2066,9 @@ in
 
-
-

generated/modules/traveldroid/system/avahi.nix

-
+
+

generated/modules/traveldroid/system/avahi.nix

+

Avahi helps discovering services

@@ -2089,9 +2088,9 @@ Avahi helps discovering services
-
-

generated/modules/traveldroid/system/bluetooth.nix

-
+
+

generated/modules/traveldroid/system/bluetooth.nix

+

Installing Bluetooth services and supporting aps

@@ -2118,9 +2117,9 @@ in
-
-

generated/modules/traveldroid/system/copy_scripts.nix

-
+
+

generated/modules/traveldroid/system/copy_scripts.nix

+

This copies any scripts from generated.config/scripts to ~/.config/scripts and makes any .sh files executable.

@@ -2161,9 +2160,9 @@ in
-
-

generated/modules/traveldroid/system/dbus.nix

-
+
+

generated/modules/traveldroid/system/dbus.nix

+

This sets the dbus implementation

@@ -2190,9 +2189,9 @@ This sets the dbus implementation
-
-

generated/modules/traveldroid/system/firewall.nix

-
+
+

generated/modules/traveldroid/system/firewall.nix

+

This sets the firewall.

@@ -2273,9 +2272,9 @@ This sets the firewall.
-
-

generated/modules/traveldroid/system/hypridle.nix

-
+
+

generated/modules/traveldroid/system/hypridle.nix

+

This installs hypridle

@@ -2331,9 +2330,9 @@ in
-
-

generated/modules/traveldroid/system/hyprlock.nix

-
+
+

generated/modules/traveldroid/system/hyprlock.nix

+

This installs hyprlock

@@ -2390,9 +2389,9 @@ in
-
-

generated/modules/traveldroid/system/gnome-keyring.nix

-
+
+

generated/modules/traveldroid/system/gnome-keyring.nix

+

This sets the dbus implementation

@@ -2440,9 +2439,9 @@ This sets the dbus implementation
-
-

generated/modules/traveldroid/system/login-tuigreet.nix

-
+
+

generated/modules/traveldroid/system/login-tuigreet.nix

+

This sets up tuigreeter which is not fancy but imho fits the aesthetic I am aiming for

@@ -2489,9 +2488,9 @@ in
-
-

generated/modules/traveldroid/system/networking.nix

-
+
+

generated/modules/traveldroid/system/networking.nix

+

This sets the networking.

@@ -2540,9 +2539,9 @@ This sets the networking.
-
-

generated/modules/traveldroid/system/nix.nix

-
+
+

generated/modules/traveldroid/system/nix.nix

+
{ lib, config, ... }:
 {
@@ -2565,9 +2564,9 @@ This sets the networking.
 
-
-

generated/modules/traveldroid/system/printing.nix

-
+
+

generated/modules/traveldroid/system/printing.nix

+

This sets the dbus implementation

@@ -2591,9 +2590,9 @@ This sets the dbus implementation
-
-

generated/modules/traveldroid/system/quickshell.nix

-
+
+

generated/modules/traveldroid/system/quickshell.nix

+

This sets the quickshell implementation

@@ -2639,9 +2638,9 @@ in
-
-

generated/modules/traveldroid/system/swaync.nix

-
+
+

generated/modules/traveldroid/system/swaync.nix

+

This sets the dbus implementation

@@ -2690,13 +2689,13 @@ in
-
-

generated/users

-
+
+

generated/users

+
-
-

generated/users/

-
+
+

generated/users/

+

This is the default user, just search and replace henrov another name if you want to change

@@ -2758,9 +2757,9 @@ in

These are all the prepared config files

-
-

generated/.config/emacs/early-init.el

-
+
+

generated/.config/emacs/early-init.el

+

This contaions emacs

@@ -2861,9 +2860,9 @@ package-archive-priorities '(("gnu" . 99)
-
-

generated/.config/emacs/init.el

-
+
+

generated/.config/emacs/init.el

+

This contaions emacs

@@ -3273,9 +3272,9 @@ the top of the file."
-
-

generated/.config/hypr/animations.conf

-
+
+

generated/.config/hypr/animations.conf

+

These are config files for .config/hypr

@@ -3294,9 +3293,9 @@ These are config files for .config/hypr
-
-

generated/.config/hypr/behaviour.conf

-
+
+

generated/.config/hypr/behaviour.conf

+

These are config files for .config/hypr

@@ -3318,9 +3317,9 @@ input {
-
-

generated/.config/hypr/bindings.conf

-
+
+

generated/.config/hypr/bindings.conf

+

These are config files for .config/hypr

@@ -3497,9 +3496,9 @@ bind = $mainMod, U, exec, qs -c updater
-
-

generated/.config/hypr/exec-once.conf

-
+
+

generated/.config/hypr/exec-once.conf

+

These are config files for .config/hypr

@@ -3520,9 +3519,9 @@ exec-once = waybar
-
-

generated/.config/hypr/hypridle.conf

-
+
+

generated/.config/hypr/hypridle.conf

+

These are config files for .config/hypr

@@ -3553,9 +3552,9 @@ listener {
-
-

generated/.config/hypr/hyprlock.conf

-
+
+

generated/.config/hypr/hyprlock.conf

+

These are config files for .config/hypr

@@ -3585,9 +3584,9 @@ input-field {
-
-

generated/.config/hypr/hyprland.conf

-
+
+

generated/.config/hypr/hyprland.conf

+

These are config files for .config/hypr

@@ -3606,9 +3605,9 @@ source = ./workspace-rules.conf
-
-

generated/.config/hypr/layer-rules.conf

-
+
+

generated/.config/hypr/layer-rules.conf

+

These are config files for .config/hypr

@@ -3621,9 +3620,9 @@ layerrule = xray 1, match:namespace swaync-control-center
-
-

generated/.config/hypr/layout.conf

-
+
+

generated/.config/hypr/layout.conf

+

These settings control Hyprland config

@@ -3638,9 +3637,9 @@ scrolling {
-
-

generated/.config/hypr/monitor-rules.conf

-
+
+

generated/.config/hypr/monitor-rules.conf

+

These are config files for .config/hypr

@@ -3651,9 +3650,9 @@ monitor = eDP-1, preferred, auto-left, 1.5
-
-

generated/.config/hypr/theming.conf

-
+
+

generated/.config/hypr/theming.conf

+

These are config files for .config/hypr

@@ -3719,9 +3718,9 @@ misc {
-
-

generated/.config/hypr/window-rules.conf

-
+
+

generated/.config/hypr/window-rules.conf

+

These are config files for .config/hypr

@@ -3812,9 +3811,9 @@ windowrule {
-
-

generated/.config/hypr/workspace-rules.conf

-
+
+

generated/.config/hypr/workspace-rules.conf

+

These setttings configure rules for workspaces

@@ -3829,9 +3828,9 @@ workspace = 6, monitor:DP-1 #, layout:dwindle
-
-

generated/.config/quickshell/media/shell.qml

-
+
+

generated/.config/quickshell/media/shell.qml

+

offers a audio widget

@@ -4225,9 +4224,9 @@ ShellRoot {
-
-

generated/.config/quickshell/powermenu/shell.qml

-
+
+

generated/.config/quickshell/powermenu/shell.qml

+

Provides a powermenu

@@ -4375,60 +4374,284 @@ ShellRoot {
-
-

generated/.config/quickshell/updater/shell.qml

-
+
+

generated/.config/quickshell/updater/shell.qml

+

Updates the system

-
import QtQuick
-import QtQuick.Controls
+
// --- This file has been auto-generated. For permanent changes alter the appropriate block in the README.org. ---
+import Quickshell
+import Quickshell.Io
+import QtQuick
+import QtQuick.Layouts
 
-Window {
-    width: 500
-    height: 200
-    visible: true
-    title: "System Updater"
+ShellRoot {
+    QtObject {
+        id: colors
+        readonly property color base:     "#1e1e2e"
+        readonly property color surface0: "#313244"
+        readonly property color surface1: "#45475a"
+        readonly property color text:     "#cdd6f4"
+        readonly property color subtext0: "#a6adc8"
+        readonly property color green:    "#a6e3a1"
+        readonly property color blue:     "#89b4fa"
+        readonly property color red:      "#f38ba8"
+        readonly property color yellow:   "#f9e2af"
+        readonly property color peach:    "#fab387"
+    }
 
-    property int progress: 0
-    property string status: "Waiting..."
+    QtObject {
+        id: state
+        property int    step:    0
+        property bool   running: false
+        property bool   failed:  false
+        property string log:     ""
 
-    Timer {
-        interval: 300
-        running: true
-        repeat: true
+        readonly property var steps: [
+            { label: "Updating flake.lock",   cmd: ["nix", "flake", "update"],                                                     cwd: "/home/henrov/Repos/nixos/Droidnix" },
+            { label: "Updating Flatpaks",      cmd: ["flatpak", "update", "-y"],                                                    cwd: "/home/henrov" },
+            { label: "Staging changes",        cmd: ["git", "add", "."],                                                            cwd: "/home/henrov/Repos/nixos/Droidnix" },
+            { label: "Committing changes",     cmd: ["git", "commit", "-m", "Updated system"],                                      cwd: "/home/henrov/Repos/nixos/Droidnix" },
+            { label: "Pushing to remote",      cmd: ["git", "push"],                                                                cwd: "/home/henrov/Repos/nixos/Droidnix" },
+            { label: "Rebuilding NixOS",       cmd: ["sudo", "nixos-rebuild", "switch", "--flake", ".#traveldroid"],                cwd: "/home/henrov/Repos/nixos/Droidnix" },
+            { label: "Reloading Hyprland",     cmd: ["hyprctl", "reload"],                                                         cwd: "/home/henrov" },
+        ]
+    }
 
-        onTriggered: {
-            let file = "/tmp/nixos-updater-status"
+    function runStep(index) {
+        if (index >= state.steps.length) {
+            state.running = false
+            state.step = state.steps.length
+            return
+        }
+        state.step    = index
+        state.running = true
+        stepProc.command        = state.steps[index].cmd
+        stepProc.workingDirectory = state.steps[index].cwd
+        stepProc.running        = true
+    }
 
-            let xhr = new XMLHttpRequest()
-            xhr.open("GET", "file://" + file)
-            xhr.onreadystatechange = function() {
-                if (xhr.readyState === XMLHttpRequest.DONE) {
-                    let parts = xhr.responseText.trim().split("|")
+    Process {
+        id: stepProc
 
-                    if (parts.length === 2) {
-                        progress = parseInt(parts[0])
-                        status = parts[1]
-                    }
-                }
+        stdout: StdioCollector {
+            onStreamFinished: {
+                state.log = text.split("\n").slice(-6).join("\n")
+            }
+        }
+
+        stderr: StdioCollector {
+            onStreamFinished: {
+                if (text.trim() !== "")
+                    state.log = text.split("\n").slice(-6).join("\n")
+            }
+        }
+
+        onExited: (code) => {
+            if (code !== 0 && state.step !== 3) {
+                // step 3 is git commit — may exit 1 if nothing to commit, that's fine
+                state.failed  = true
+                state.running = false
+            } else {
+                runStep(state.step + 1)
             }
-            xhr.send()
         }
     }
 
-    Column {
-        anchors.centerIn: parent
-        spacing: 10
+    FloatingWindow {
+        id: root
+        title:   "quickshell-updater"
+        visible: true
+        width:   520
+        height:  contentCol.implicitHeight + 32
+        color:   "transparent"
 
-        Text { text: status }
+        Shortcut {
+            sequence: "Escape"
+            onActivated: Qt.quit()
+        }
 
-        ProgressBar {
-            from: 0
-            to: 100
-            value: progress
-            width: 300
+        // Gradient border
+        Rectangle {
+            anchors.fill:    parent
+            anchors.margins: -2
+            radius:          18
+            z:               -1
+            gradient: Gradient {
+                orientation: Gradient.Horizontal
+                GradientStop { position: 0.0; color: colors.blue  }
+                GradientStop { position: 1.0; color: colors.green }
+            }
+        }
+
+        Rectangle {
+            anchors.fill: parent
+            radius:       16
+            color:        colors.base
+
+            ColumnLayout {
+                id: contentCol
+                anchors {
+                    top:     parent.top
+                    left:    parent.left
+                    right:   parent.right
+                    margins: 20
+                }
+                spacing: 12
+
+                // Title
+                Text {
+                    text:           "  System Update"
+                    color:          colors.text
+                    font.pixelSize: 15
+                    font.bold:      true
+                    Layout.topMargin: 4
+                }
+
+                // Steps list
+                Repeater {
+                    model: state.steps.length
+
+                    delegate: RowLayout {
+                        spacing: 10
+                        Layout.fillWidth: true
+
+                        // Icon
+                        Text {
+                            font.pixelSize: 14
+                            text: {
+                                if (state.failed && index === state.step) return "✗"
+                                if (index < state.step || (!state.running && index === state.step)) return "✓"
+                                if (index === state.step && state.running) return "…"
+                                return "○"
+                            }
+                            color: {
+                                if (state.failed && index === state.step) return colors.red
+                                if (index < state.step || (!state.running && !state.failed && index === state.step)) return colors.green
+                                if (index === state.step && state.running) return colors.yellow
+                                return colors.surface1
+                            }
+                        }
+
+                        Text {
+                            text:           state.steps[index].label
+                            font.pixelSize: 13
+                            color: {
+                                if (state.failed && index === state.step) return colors.red
+                                if (index < state.step)                   return colors.subtext0
+                                if (index === state.step)                 return colors.text
+                                return colors.surface1
+                            }
+                        }
+
+                        // Spinner for active step
+                        Text {
+                            visible:        index === state.step && state.running
+                            text:           "⠋"
+                            color:          colors.blue
+                            font.pixelSize: 13
+
+                            RotationAnimation on rotation {
+                                running:  index === state.step && state.running
+                                from:     0; to: 360
+                                duration: 1000
+                                loops:    Animation.Infinite
+                            }
+                        }
+                    }
+                }
+
+                // Log output
+                Rectangle {
+                    Layout.fillWidth:    true
+                    height:              80
+                    radius:              8
+                    color:               colors.surface0
+                    visible:             state.log !== ""
+
+                    Text {
+                        anchors {
+                            fill:    parent
+                            margins: 8
+                        }
+                        text:            state.log
+                        color:           colors.subtext0
+                        font.pixelSize:  11
+                        font.family:     "monospace"
+                        wrapMode:        Text.WrapAnywhere
+                        elide:           Text.ElideLeft
+                        verticalAlignment: Text.AlignBottom
+                    }
+                }
+
+                // Status / close
+                RowLayout {
+                    Layout.fillWidth: true
+                    Layout.bottomMargin: 4
+
+                    Text {
+                        text: {
+                            if (state.failed)                          return "✗ Failed at: " + state.steps[state.step].label
+                            if (state.step === state.steps.length)     return "✓ Done!"
+                            if (state.running)                         return "Running…"
+                            return "Press Start"
+                        }
+                        color: {
+                            if (state.failed)                      return colors.red
+                            if (state.step === state.steps.length) return colors.green
+                            return colors.subtext0
+                        }
+                        font.pixelSize: 12
+                    }
+
+                    Item { Layout.fillWidth: true }
+
+                    // Start button
+                    Rectangle {
+                        visible: !state.running && state.step === 0
+                        width:  80; height: 28
+                        radius: 14
+                        gradient: Gradient {
+                            orientation: Gradient.Horizontal
+                            GradientStop { position: 0.0; color: colors.blue  }
+                            GradientStop { position: 1.0; color: colors.green }
+                        }
+                        Text {
+                            anchors.centerIn: parent
+                            text:  "Start"
+                            color: colors.base
+                            font.pixelSize: 12
+                            font.bold: true
+                        }
+                        MouseArea {
+                            anchors.fill: parent
+                            cursorShape:  Qt.PointingHandCursor
+                            onClicked:    runStep(0)
+                        }
+                    }
+
+                    // Close button
+                    Rectangle {
+                        visible: !state.running && state.step > 0
+                        width:  80; height: 28
+                        radius: 14
+                        color:  colors.surface1
+                        Text {
+                            anchors.centerIn: parent
+                            text:  "Close"
+                            color: colors.text
+                            font.pixelSize: 12
+                        }
+                        MouseArea {
+                            anchors.fill: parent
+                            cursorShape:  Qt.PointingHandCursor
+                            onClicked:    Qt.quit()
+                        }
+                    }
+                }
+            }
         }
     }
 }
@@ -4436,9 +4659,9 @@ Window {
 
-
-

generated/.config/quickshell/layoutswitcher/shell.qml

-
+
+

generated/.config/quickshell/layoutswitcher/shell.qml

+

Provides a layout menu

@@ -4585,9 +4808,9 @@ ShellRoot {
-
-

generated/.config/waybar/scripts/batterywarn.sh

-
+
+

generated/.config/waybar/scripts/batterywarn.sh

+

Providing an media

@@ -4604,9 +4827,9 @@ fi
-
-

generated/.config/waybar/scripts/media.sh

-
+
+

generated/.config/waybar/scripts/media.sh

+

Providing an media

@@ -4705,9 +4928,9 @@ jq -c -n \
-
-

generated/.config/scripts/numlock-check.sh

-
+
+

generated/.config/scripts/numlock-check.sh

+

Count keyboards and enable numlock if more then 1, else disable

@@ -4729,9 +4952,9 @@ fi
-
-

generated/.config/scripts/power.sh

-
+
+

generated/.config/scripts/power.sh

+

Enables a terminal power menu

@@ -4786,42 +5009,9 @@ main
-
-

generated/.config/scripts/update-engine.sh

-
-

-A file containing color variables -

-
-
-STATUS_FILE="/tmp/nixos-updater-status"
-
-echo "0|Starting" > "$STATUS_FILE"
-
-update_step() {
-    echo "$1|$2" > "$STATUS_FILE"
-}
-
-update_step 10 "Fixing ownership"
-sudo chown -R "$USER":"wheel" "$REPO"
-
-update_step 30 "Updating flake"
-nix flake update
-
-update_step 60 "Rebuilding system"
-sudo nixos-rebuild switch --flake ".#$HOSTNAME"
-
-update_step 90 "Updating Flatpaks"
-flatpak update -y
-
-update_step 100 "Done"
-
-
-
-
-
-

generated/.config/wofi/scripts/wofi-launcher.sh

-
+
+

generated/.config/wofi/scripts/wofi-launcher.sh

+

Providing an media

@@ -4836,9 +5026,9 @@ Providing an media
-
-

generated/.config/shared/colors.css

-
+
+

generated/.config/shared/colors.css

+

A file containing color variables

@@ -4879,9 +5069,9 @@ A file containing color variables
-
-

generated/.config/starship.toml

-
+
+

generated/.config/starship.toml

+

These are config files for Starship

@@ -5169,9 +5359,9 @@ crust = "#181926"
-
-

generated/.config/stylix/stylix.conf

-
+
+

generated/.config/stylix/stylix.conf

+

These are config files for .config/stylix

@@ -5208,9 +5398,9 @@ icons = {
-
-

generated/.config/stylix/palette.json

-
+
+

generated/.config/stylix/palette.json

+

These are config files for .config/stylix

@@ -5240,9 +5430,9 @@ These are config files for .config/stylix
-
-

generated/.config/stylix/palette.html

-
+
+

generated/.config/stylix/palette.html

+

These are config files for .config/stylix

@@ -5319,9 +5509,9 @@ These are config files for .config/stylix
-
-

generated/.config/swaync/config.json

-
+
+

generated/.config/swaync/config.json

+

These are config files for waybar

@@ -5382,9 +5572,9 @@ These are config files for waybar
-
-

generated/.config/swaync/style.css

-
+
+

generated/.config/swaync/style.css

+

These are config files for waybar

@@ -5577,9 +5767,9 @@ These are config files for waybar
-
-

generated/.config/waybar/config.jsonc

-
+
+

generated/.config/waybar/config.jsonc

+

These are config files for waybar

@@ -5916,9 +6106,9 @@ These are config files for waybar
-
-

generated/.config/waybar/style-dark.css

-
+
+

generated/.config/waybar/style-dark.css

+

This file contains all css for waybar

@@ -6178,9 +6368,9 @@ label#custom-windows:not(.active) {
-
-

generated/.config/waybar/scripts/bluetooth-status.sh

-
+
+

generated/.config/waybar/scripts/bluetooth-status.sh

+

These are config files for waybar

@@ -6205,9 +6395,9 @@ printf '{"text": "%s", "tooltip": "%s"}\n' "$icon" "$tooltip"
-
-

generated/.config/waybar/scripts/hypr-workspaces.sh

-
+
+

generated/.config/waybar/scripts/hypr-workspaces.sh

+

These are config files for waybar

@@ -6249,9 +6439,9 @@ jq -c -n \
-
-

generated/.config/waybar/scripts/hypr-workspacesmenu.sh

-
+
+

generated/.config/waybar/scripts/hypr-workspacesmenu.sh

+

These are config files for waybar

@@ -6273,9 +6463,9 @@ hyprctl dispatch focuswindow address:"$addr"
-
-

generated/.config/waybar/scripts/kdeconnect-status.sh

-
+
+

generated/.config/waybar/scripts/kdeconnect-status.sh

+

These are config files for waybar

@@ -6299,9 +6489,9 @@ fi
-
-

generated/.config/waypaper/config.ini

-
+
+

generated/.config/waypaper/config.ini

+

These are config files for waypaper

@@ -6338,9 +6528,9 @@ keybindings = ~/.config/waypaper/keybindings.ini
-
-

generated/.config/waypaper/config.ini

-
+
+

generated/.config/waypaper/config.ini

+

These are config files for .config/waypaper

@@ -6376,9 +6566,9 @@ keybindings = ~/.config/waypaper/keybindings.ini
-
-

generated/.config/wofi/config

-
+
+

generated/.config/wofi/config

+

These are config files for .config/wofi

@@ -6405,9 +6595,9 @@ prompt = > ...
-
-

generated/.config/wofi/style.css

-
+
+

generated/.config/wofi/style.css

+

This is the default layout for wofi

@@ -6503,9 +6693,9 @@ This is the default layout for wofi
-
-

generated/.config/zed/settings.json

-
+
+

generated/.config/zed/settings.json

+

These are config files for Zed editor

@@ -6543,9 +6733,9 @@ These are config files for Zed editor
-
-

generated/.config/zsh/.zshrc

-
+
+

generated/.config/zsh/.zshrc

+

This sets up the zsh in the terminal

@@ -6582,7 +6772,7 @@ cd() {

Author: Henro Veijer

-

Created: 2026-04-29 wo 12:36

+

Created: 2026-04-29 wo 12:47

Validate

diff --git a/Droidnix/README.org b/Droidnix/README.org index 771df7794..3678b69a3 100644 --- a/Droidnix/README.org +++ b/Droidnix/README.org @@ -3666,53 +3666,277 @@ ShellRoot { ** =generated/.config/quickshell/updater/shell.qml= Updates the system #+BEGIN_SRC qml :tangle generated/.config/quickshell/updater/shell.qml :noweb yes :mkdirp yes :eval never +// --- This file has been auto-generated. For permanent changes alter the appropriate block in the README.org. --- +import Quickshell +import Quickshell.Io import QtQuick -import QtQuick.Controls +import QtQuick.Layouts -Window { - width: 500 - height: 200 - visible: true - title: "System Updater" +ShellRoot { + QtObject { + id: colors + readonly property color base: "#1e1e2e" + readonly property color surface0: "#313244" + readonly property color surface1: "#45475a" + readonly property color text: "#cdd6f4" + readonly property color subtext0: "#a6adc8" + readonly property color green: "#a6e3a1" + readonly property color blue: "#89b4fa" + readonly property color red: "#f38ba8" + readonly property color yellow: "#f9e2af" + readonly property color peach: "#fab387" + } - property int progress: 0 - property string status: "Waiting..." + QtObject { + id: state + property int step: 0 + property bool running: false + property bool failed: false + property string log: "" - Timer { - interval: 300 - running: true - repeat: true + readonly property var steps: [ + { label: "Updating flake.lock", cmd: ["nix", "flake", "update"], cwd: "/home/henrov/Repos/nixos/Droidnix" }, + { label: "Updating Flatpaks", cmd: ["flatpak", "update", "-y"], cwd: "/home/henrov" }, + { label: "Staging changes", cmd: ["git", "add", "."], cwd: "/home/henrov/Repos/nixos/Droidnix" }, + { label: "Committing changes", cmd: ["git", "commit", "-m", "Updated system"], cwd: "/home/henrov/Repos/nixos/Droidnix" }, + { label: "Pushing to remote", cmd: ["git", "push"], cwd: "/home/henrov/Repos/nixos/Droidnix" }, + { label: "Rebuilding NixOS", cmd: ["sudo", "nixos-rebuild", "switch", "--flake", ".#traveldroid"], cwd: "/home/henrov/Repos/nixos/Droidnix" }, + { label: "Reloading Hyprland", cmd: ["hyprctl", "reload"], cwd: "/home/henrov" }, + ] + } - onTriggered: { - let file = "/tmp/nixos-updater-status" + function runStep(index) { + if (index >= state.steps.length) { + state.running = false + state.step = state.steps.length + return + } + state.step = index + state.running = true + stepProc.command = state.steps[index].cmd + stepProc.workingDirectory = state.steps[index].cwd + stepProc.running = true + } - let xhr = new XMLHttpRequest() - xhr.open("GET", "file://" + file) - xhr.onreadystatechange = function() { - if (xhr.readyState === XMLHttpRequest.DONE) { - let parts = xhr.responseText.trim().split("|") + Process { + id: stepProc - if (parts.length === 2) { - progress = parseInt(parts[0]) - status = parts[1] - } - } + stdout: StdioCollector { + onStreamFinished: { + state.log = text.split("\n").slice(-6).join("\n") + } + } + + stderr: StdioCollector { + onStreamFinished: { + if (text.trim() !== "") + state.log = text.split("\n").slice(-6).join("\n") + } + } + + onExited: (code) => { + if (code !== 0 && state.step !== 3) { + // step 3 is git commit — may exit 1 if nothing to commit, that's fine + state.failed = true + state.running = false + } else { + runStep(state.step + 1) } - xhr.send() } } - Column { - anchors.centerIn: parent - spacing: 10 + FloatingWindow { + id: root + title: "quickshell-updater" + visible: true + width: 520 + height: contentCol.implicitHeight + 32 + color: "transparent" - Text { text: status } + Shortcut { + sequence: "Escape" + onActivated: Qt.quit() + } - ProgressBar { - from: 0 - to: 100 - value: progress - width: 300 + // Gradient border + Rectangle { + anchors.fill: parent + anchors.margins: -2 + radius: 18 + z: -1 + gradient: Gradient { + orientation: Gradient.Horizontal + GradientStop { position: 0.0; color: colors.blue } + GradientStop { position: 1.0; color: colors.green } + } + } + + Rectangle { + anchors.fill: parent + radius: 16 + color: colors.base + + ColumnLayout { + id: contentCol + anchors { + top: parent.top + left: parent.left + right: parent.right + margins: 20 + } + spacing: 12 + + // Title + Text { + text: " System Update" + color: colors.text + font.pixelSize: 15 + font.bold: true + Layout.topMargin: 4 + } + + // Steps list + Repeater { + model: state.steps.length + + delegate: RowLayout { + spacing: 10 + Layout.fillWidth: true + + // Icon + Text { + font.pixelSize: 14 + text: { + if (state.failed && index === state.step) return "✗" + if (index < state.step || (!state.running && index === state.step)) return "✓" + if (index === state.step && state.running) return "…" + return "○" + } + color: { + if (state.failed && index === state.step) return colors.red + if (index < state.step || (!state.running && !state.failed && index === state.step)) return colors.green + if (index === state.step && state.running) return colors.yellow + return colors.surface1 + } + } + + Text { + text: state.steps[index].label + font.pixelSize: 13 + color: { + if (state.failed && index === state.step) return colors.red + if (index < state.step) return colors.subtext0 + if (index === state.step) return colors.text + return colors.surface1 + } + } + + // Spinner for active step + Text { + visible: index === state.step && state.running + text: "⠋" + color: colors.blue + font.pixelSize: 13 + + RotationAnimation on rotation { + running: index === state.step && state.running + from: 0; to: 360 + duration: 1000 + loops: Animation.Infinite + } + } + } + } + + // Log output + Rectangle { + Layout.fillWidth: true + height: 80 + radius: 8 + color: colors.surface0 + visible: state.log !== "" + + Text { + anchors { + fill: parent + margins: 8 + } + text: state.log + color: colors.subtext0 + font.pixelSize: 11 + font.family: "monospace" + wrapMode: Text.WrapAnywhere + elide: Text.ElideLeft + verticalAlignment: Text.AlignBottom + } + } + + // Status / close + RowLayout { + Layout.fillWidth: true + Layout.bottomMargin: 4 + + Text { + text: { + if (state.failed) return "✗ Failed at: " + state.steps[state.step].label + if (state.step === state.steps.length) return "✓ Done!" + if (state.running) return "Running…" + return "Press Start" + } + color: { + if (state.failed) return colors.red + if (state.step === state.steps.length) return colors.green + return colors.subtext0 + } + font.pixelSize: 12 + } + + Item { Layout.fillWidth: true } + + // Start button + Rectangle { + visible: !state.running && state.step === 0 + width: 80; height: 28 + radius: 14 + gradient: Gradient { + orientation: Gradient.Horizontal + GradientStop { position: 0.0; color: colors.blue } + GradientStop { position: 1.0; color: colors.green } + } + Text { + anchors.centerIn: parent + text: "Start" + color: colors.base + font.pixelSize: 12 + font.bold: true + } + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: runStep(0) + } + } + + // Close button + Rectangle { + visible: !state.running && state.step > 0 + width: 80; height: 28 + radius: 14 + color: colors.surface1 + Text { + anchors.centerIn: parent + text: "Close" + color: colors.text + font.pixelSize: 12 + } + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: Qt.quit() + } + } + } + } } } } @@ -4038,33 +4262,6 @@ main() { main #+END_SRC -** =generated/.config/scripts/update-engine.sh= -A file containing color variables -#+BEGIN_SRC sh :tangle generated/.config/scripts/update-engine.sh :shebang "#!/usr/bin/env bash" :noweb yes :mkdirp yes :eval never - -STATUS_FILE="/tmp/nixos-updater-status" - -echo "0|Starting" > "$STATUS_FILE" - -update_step() { - echo "$1|$2" > "$STATUS_FILE" -} - -update_step 10 "Fixing ownership" -sudo chown -R "$USER":"wheel" "$REPO" - -update_step 30 "Updating flake" -nix flake update - -update_step 60 "Rebuilding system" -sudo nixos-rebuild switch --flake ".#$HOSTNAME" - -update_step 90 "Updating Flatpaks" -flatpak update -y - -update_step 100 "Done" -#+END_SRC - ** =generated/.config/wofi/scripts/wofi-launcher.sh= Providing an media #+BEGIN_SRC sh :tangle generated/.config/wofi/scripts/wofi-launcher.sh :shebang "#!/usr/bin/env bash" :noweb yes :mkdirp yes :eval never diff --git a/Droidnix/generated/.config/quickshell/updater/shell.qml b/Droidnix/generated/.config/quickshell/updater/shell.qml index 659c00250..3f683c342 100644 --- a/Droidnix/generated/.config/quickshell/updater/shell.qml +++ b/Droidnix/generated/.config/quickshell/updater/shell.qml @@ -1,51 +1,275 @@ // --- This file has been auto-generated. For permanent changes alter the appropriate block in the README.org. --- +// --- This file has been auto-generated. For permanent changes alter the appropriate block in the README.org. --- +import Quickshell +import Quickshell.Io import QtQuick -import QtQuick.Controls +import QtQuick.Layouts -Window { - width: 500 - height: 200 - visible: true - title: "System Updater" +ShellRoot { + QtObject { + id: colors + readonly property color base: "#1e1e2e" + readonly property color surface0: "#313244" + readonly property color surface1: "#45475a" + readonly property color text: "#cdd6f4" + readonly property color subtext0: "#a6adc8" + readonly property color green: "#a6e3a1" + readonly property color blue: "#89b4fa" + readonly property color red: "#f38ba8" + readonly property color yellow: "#f9e2af" + readonly property color peach: "#fab387" + } - property int progress: 0 - property string status: "Waiting..." + QtObject { + id: state + property int step: 0 + property bool running: false + property bool failed: false + property string log: "" - Timer { - interval: 300 - running: true - repeat: true + readonly property var steps: [ + { label: "Updating flake.lock", cmd: ["nix", "flake", "update"], cwd: "/home/henrov/Repos/nixos/Droidnix" }, + { label: "Updating Flatpaks", cmd: ["flatpak", "update", "-y"], cwd: "/home/henrov" }, + { label: "Staging changes", cmd: ["git", "add", "."], cwd: "/home/henrov/Repos/nixos/Droidnix" }, + { label: "Committing changes", cmd: ["git", "commit", "-m", "Updated system"], cwd: "/home/henrov/Repos/nixos/Droidnix" }, + { label: "Pushing to remote", cmd: ["git", "push"], cwd: "/home/henrov/Repos/nixos/Droidnix" }, + { label: "Rebuilding NixOS", cmd: ["sudo", "nixos-rebuild", "switch", "--flake", ".#traveldroid"], cwd: "/home/henrov/Repos/nixos/Droidnix" }, + { label: "Reloading Hyprland", cmd: ["hyprctl", "reload"], cwd: "/home/henrov" }, + ] + } - onTriggered: { - let file = "/tmp/nixos-updater-status" + function runStep(index) { + if (index >= state.steps.length) { + state.running = false + state.step = state.steps.length + return + } + state.step = index + state.running = true + stepProc.command = state.steps[index].cmd + stepProc.workingDirectory = state.steps[index].cwd + stepProc.running = true + } - let xhr = new XMLHttpRequest() - xhr.open("GET", "file://" + file) - xhr.onreadystatechange = function() { - if (xhr.readyState === XMLHttpRequest.DONE) { - let parts = xhr.responseText.trim().split("|") + Process { + id: stepProc - if (parts.length === 2) { - progress = parseInt(parts[0]) - status = parts[1] + stdout: StdioCollector { + onStreamFinished: { + state.log = text.split("\n").slice(-6).join("\n") + } + } + + stderr: StdioCollector { + onStreamFinished: { + if (text.trim() !== "") + state.log = text.split("\n").slice(-6).join("\n") + } + } + + onExited: (code) => { + if (code !== 0 && state.step !== 3) { + // step 3 is git commit — may exit 1 if nothing to commit, that's fine + state.failed = true + state.running = false + } else { + runStep(state.step + 1) + } + } + } + + FloatingWindow { + id: root + title: "quickshell-updater" + visible: true + width: 520 + height: contentCol.implicitHeight + 32 + color: "transparent" + + Shortcut { + sequence: "Escape" + onActivated: Qt.quit() + } + + // Gradient border + Rectangle { + anchors.fill: parent + anchors.margins: -2 + radius: 18 + z: -1 + gradient: Gradient { + orientation: Gradient.Horizontal + GradientStop { position: 0.0; color: colors.blue } + GradientStop { position: 1.0; color: colors.green } + } + } + + Rectangle { + anchors.fill: parent + radius: 16 + color: colors.base + + ColumnLayout { + id: contentCol + anchors { + top: parent.top + left: parent.left + right: parent.right + margins: 20 + } + spacing: 12 + + // Title + Text { + text: " System Update" + color: colors.text + font.pixelSize: 15 + font.bold: true + Layout.topMargin: 4 + } + + // Steps list + Repeater { + model: state.steps.length + + delegate: RowLayout { + spacing: 10 + Layout.fillWidth: true + + // Icon + Text { + font.pixelSize: 14 + text: { + if (state.failed && index === state.step) return "✗" + if (index < state.step || (!state.running && index === state.step)) return "✓" + if (index === state.step && state.running) return "…" + return "○" + } + color: { + if (state.failed && index === state.step) return colors.red + if (index < state.step || (!state.running && !state.failed && index === state.step)) return colors.green + if (index === state.step && state.running) return colors.yellow + return colors.surface1 + } + } + + Text { + text: state.steps[index].label + font.pixelSize: 13 + color: { + if (state.failed && index === state.step) return colors.red + if (index < state.step) return colors.subtext0 + if (index === state.step) return colors.text + return colors.surface1 + } + } + + // Spinner for active step + Text { + visible: index === state.step && state.running + text: "⠋" + color: colors.blue + font.pixelSize: 13 + + RotationAnimation on rotation { + running: index === state.step && state.running + from: 0; to: 360 + duration: 1000 + loops: Animation.Infinite + } + } + } + } + + // Log output + Rectangle { + Layout.fillWidth: true + height: 80 + radius: 8 + color: colors.surface0 + visible: state.log !== "" + + Text { + anchors { + fill: parent + margins: 8 + } + text: state.log + color: colors.subtext0 + font.pixelSize: 11 + font.family: "monospace" + wrapMode: Text.WrapAnywhere + elide: Text.ElideLeft + verticalAlignment: Text.AlignBottom + } + } + + // Status / close + RowLayout { + Layout.fillWidth: true + Layout.bottomMargin: 4 + + Text { + text: { + if (state.failed) return "✗ Failed at: " + state.steps[state.step].label + if (state.step === state.steps.length) return "✓ Done!" + if (state.running) return "Running…" + return "Press Start" + } + color: { + if (state.failed) return colors.red + if (state.step === state.steps.length) return colors.green + return colors.subtext0 + } + font.pixelSize: 12 + } + + Item { Layout.fillWidth: true } + + // Start button + Rectangle { + visible: !state.running && state.step === 0 + width: 80; height: 28 + radius: 14 + gradient: Gradient { + orientation: Gradient.Horizontal + GradientStop { position: 0.0; color: colors.blue } + GradientStop { position: 1.0; color: colors.green } + } + Text { + anchors.centerIn: parent + text: "Start" + color: colors.base + font.pixelSize: 12 + font.bold: true + } + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: runStep(0) + } + } + + // Close button + Rectangle { + visible: !state.running && state.step > 0 + width: 80; height: 28 + radius: 14 + color: colors.surface1 + Text { + anchors.centerIn: parent + text: "Close" + color: colors.text + font.pixelSize: 12 + } + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: Qt.quit() + } } } } - xhr.send() - } - } - - Column { - anchors.centerIn: parent - spacing: 10 - - Text { text: status } - - ProgressBar { - from: 0 - to: 100 - value: progress - width: 300 } } }