// --- 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 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" } property int currentStep: 0 property bool isRunning: false property bool isFailed: false property string currentLog: "" property bool started: false 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" }, ] function runStep(index) { if (index >= steps.length) { isRunning = false currentStep = steps.length return } currentStep = index currentLog = "" isRunning = true stepProc.command = steps[index].cmd stepProc.workingDirectory = steps[index].cwd stepProc.running = true } Process { id: stepProc stdout: SplitParser { onRead: (line) => { currentLog = (currentLog + "\n" + line).split("\n").slice(-8).join("\n").trim() } } stderr: SplitParser { onRead: (line) => { if (line.trim() !== "") currentLog = (currentLog + "\n" + line).split("\n").slice(-8).join("\n").trim() } } onExited: (code) => { if (code !== 0 && currentStep !== 3) { isFailed = true isRunning = false } else { runStep(currentStep + 1) } } } FloatingWindow { title: "quickshell-updater" visible: true width: 540 height: contentCol.implicitHeight + 32 color: "transparent" Shortcut { sequence: "Escape" onActivated: Qt.quit() } 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: 8 Text { text: " System Update" color: colors.text font.pixelSize: 15 font.bold: true Layout.topMargin: 8 } // Steps Repeater { model: steps.length delegate: RowLayout { spacing: 10 Layout.fillWidth: true readonly property bool done: !isFailed && (index < currentStep || (!isRunning && currentStep === steps.length)) readonly property bool active: isRunning && index === currentStep readonly property bool failed: isFailed && index === currentStep readonly property bool pending: !done && !active && !failed // icon Text { font.pixelSize: 14 text: failed ? "✗" : done ? "✓" : active ? "›" : "○" color: failed ? colors.red : done ? colors.green : active ? colors.yellow : colors.surface1 } // label Text { text: steps[index].label font.pixelSize: 13 color: failed ? colors.red : done ? colors.green : active ? colors.text : colors.surface1 } } } // Log box Rectangle { Layout.fillWidth: true height: 160 radius: 8 color: colors.surface0 visible: currentLog !== "" && started Text { anchors { fill: parent margins: 10 } text: currentLog color: colors.subtext0 font.pixelSize: 11 font.family: "monospace" wrapMode: Text.WrapAnywhere verticalAlignment: Text.AlignBottom } } // Bottom bar RowLayout { Layout.fillWidth: true Layout.bottomMargin: 8 Text { font.pixelSize: 12 text: { if (!started) return "Press Start to begin" if (isFailed) return "✗ Failed at: " + steps[currentStep].label if (currentStep === steps.length) return "✓ All done!" if (isRunning) return steps[currentStep].label + "…" return "" } color: isFailed ? colors.red : currentStep === steps.length ? colors.green : colors.subtext0 } Item { Layout.fillWidth: true } Rectangle { visible: !started 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: { started = true runStep(0) } } } Rectangle { visible: !isRunning && started width: 80; height: 28 radius: 14 color: colors.surface1 Text { anchors.centerIn: parent text: currentStep === steps.length ? "Close" : "Dismiss" color: colors.text font.pixelSize: 12 } MouseArea { anchors.fill: parent cursorShape: Qt.PointingHandCursor onClicked: Qt.quit() } } } } } } }