import QtQuick
import Quickshell
import Quickshell.Io
import qs.Commons
import qs.Ui
BarWidget {
id: root
moduleName: "deomarchy.docker-status"
property int runningCount: 0
property int unhealthyCount: 0
property bool dockerAvailable: false
visible: dockerAvailable
implicitWidth: button.implicitWidth
implicitHeight: button.implicitHeight
function refresh() {
if (!dockerProc.running) dockerProc.running = true
}
function updateStatus(raw) {
var lines = String(raw || "").trim().split("\n")
var running = 0
var unhealthy = 0
for (var i = 0; i < lines.length; i++) {
var line = lines[i].trim()
if (line === "") continue
var parts = line.split("|")
if (parts.length < 2) continue
var status = parts[1].toLowerCase()
if (status.indexOf("up") !== -1) {
running++
if (status.indexOf("unhealthy") !== -1) unhealthy++
}
}
runningCount = running
unhealthyCount = unhealthy
dockerAvailable = true
}
function statusText() {
if (unhealthyCount > 0)
return runningCount + " up, " + unhealthyCount + " unhealthy"
return runningCount + " running"
}
Component.onCompleted: refresh()
Process {
id: dockerProc
command: ["docker", "ps", "--format", "{{.Names}}|{{.Status}}"]
onExited: function(exitCode) {
if (exitCode !== 0) {
dockerAvailable = false
return
}
}
stdout: StdioCollector {
waitForEnd: true
onStreamFinished: root.updateStatus(text)
}
}
Timer {
interval: 5000
running: true
repeat: true
onTriggered: root.refresh()
}
IpcHandler {
target: "deomarchy.docker-status"
function refresh(): void { root.refresh() }
}
BarIconButton {
id: button
anchors.fill: parent
bar: root.bar
text: "\uf308"
slotSize: Style.bar.statusSlot
fontSize: Style.font.caption
tooltipText: "Docker: " + root.statusText()
onPressed: root.refresh()
}
}