Files
nixos/Droidnix/generated/.config/quickshell/updater/shell.qml
T
2026-05-01 10:36:17 +02:00

300 lines
12 KiB
QML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// --- 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
property string sudoPassword: ""
readonly property int rebuildStep: 5
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", "-S", "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()
}
}
onStarted: {
if (currentStep === rebuildStep) {
stdin.write(sudoPassword + "\n")
stdin.close()
}
}
onExited: (code) => {
if (code !== 0 && currentStep !== 3) {
isFailed = true
isRunning = false
} else {
runStep(currentStep + 1)
}
}
}
FloatingWindow {
title: "quickshell-updater"
visible: true
width: 640
height: contentCol.implicitHeight + 48
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: 12
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
Text {
font.pixelSize: 14
text: failed ? "✗" : done ? "✓" : active ? "" : "○"
color: failed ? colors.red : done ? colors.green : active ? colors.yellow : colors.surface1
}
Text {
text: steps[index].label
font.pixelSize: 13
color: failed ? colors.red : done ? colors.green : active ? colors.text : colors.surface1
}
}
}
// Password field — only shown before start
Rectangle {
visible: !started
Layout.fillWidth: true
height: 38
radius: 8
color: colors.surface0
RowLayout {
anchors {
fill: parent
margins: 10
}
spacing: 8
Text {
text: "󰌾"
color: colors.subtext0
font.pixelSize: 14
}
TextInput {
id: passwordInput
Layout.fillWidth: true
echoMode: TextInput.Password
color: colors.text
font.pixelSize: 13
onTextChanged: sudoPassword = text
Keys.onReturnPressed: {
if (sudoPassword !== "") {
started = true
runStep(0)
}
}
}
Text {
text: sudoPassword === "" ? "enter sudo password" : ""
color: colors.surface1
font.pixelSize: 13
// manual placeholder since Qt's built-in isn't always available
}
}
}
// Log box
Rectangle {
Layout.fillWidth: true
height: 220
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 "Enter your sudo password, then press Start"
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
opacity: sudoPassword === "" ? 0.4 : 1.0
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: sudoPassword === "" ? Qt.ArrowCursor : Qt.PointingHandCursor
onClicked: {
if (sudoPassword !== "") {
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()
}
}
}
}
}
}
}