242 lines
9.3 KiB
QML
242 lines
9.3 KiB
QML
// --- 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()
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|