63 lines
2 KiB
QML
63 lines
2 KiB
QML
import Quickshell
|
|
import Quickshell.Io
|
|
import QtQuick
|
|
|
|
BarPill {
|
|
id: root
|
|
layer.enabled: true
|
|
|
|
property int currentIdx: 0
|
|
property var names: []
|
|
|
|
readonly property string shortName: {
|
|
if (names.length === 0) return "??"
|
|
const n = names[currentIdx] ?? ""
|
|
if (n.includes("Portuguese")) return "PT"
|
|
if (n.includes("English")) return "EN"
|
|
// fallback: first two chars of first word
|
|
return n.split(" ")[0].substring(0, 2).toUpperCase()
|
|
}
|
|
|
|
Process {
|
|
command: ["niri", "msg", "--json", "event-stream"]
|
|
running: true
|
|
stdout: SplitParser {
|
|
splitMarker: "\n"
|
|
onRead: data => {
|
|
try {
|
|
const ev = JSON.parse(data)
|
|
if (ev.KeyboardLayoutsChanged) {
|
|
const kl = ev.KeyboardLayoutsChanged.keyboard_layouts
|
|
root.currentIdx = kl.current_idx
|
|
root.names = kl.names
|
|
} else if (ev.KeyboardLayoutSwitched) {
|
|
root.currentIdx = ev.KeyboardLayoutSwitched.idx
|
|
}
|
|
} catch (e) {}
|
|
}
|
|
}
|
|
}
|
|
|
|
Text {
|
|
text: ""
|
|
color: Theme.purple
|
|
font.pixelSize: Theme.fontSize
|
|
font.family: Theme.font
|
|
}
|
|
Text {
|
|
id: shortNameText
|
|
text: root.shortName
|
|
color: Theme.text
|
|
font.pixelSize: Theme.fontSize
|
|
font.family: Theme.font
|
|
|
|
Behavior on text {
|
|
// Flash the label on layout change
|
|
SequentialAnimation {
|
|
PropertyAnimation { target: shortNameText; property: "opacity"; to: 0; duration: 80 }
|
|
PropertyAction { target: shortNameText; property: "text" }
|
|
PropertyAnimation { target: shortNameText; property: "opacity"; to: 1; duration: 80 }
|
|
}
|
|
}
|
|
}
|
|
}
|