Add a keybindings manager widget

This commit is contained in:
SirBlob committed 2026-09-24 04:58:56 +00:00
1 parent 2df1454219
commit 010ab5fd4c
15 files changed
+926 -1

No files matched your search

@@ -0,0 +1,121 @@
import QtQuick
import qs.Commons
import qs.Ui
Rectangle {
id: root
property var binding: null
signal editRequested()
signal resetRequested()
signal disableRequested()
readonly property bool personal: binding ? binding.origin === "personal" : false
readonly property bool active: binding ? binding.state === "active" : false
readonly property string stateText: {
if (!binding) return ""
if (binding.state === "overridden") return "Replaced by your binding"
if (binding.state === "disabled") return "Disabled"
return binding.kind === "exec" ? binding.action : "Hyprland: " + binding.action
}
implicitHeight: Style.spaceReal(46)
radius: Style.cardRadius
color: hover.hovered ? Util.alpha(Color.foreground, 0.08) : Util.alpha(Color.background, Style.cardFillAlpha)
HoverHandler {
id: hover
}
Rectangle {
id: keysChip
anchors.left: parent.left
anchors.leftMargin: Style.spaceReal(8)
anchors.verticalCenter: parent.verticalCenter
width: Style.spaceReal(200)
height: Style.spaceReal(26)
radius: Style.cardRadius
color: root.personal ? Util.alpha(Color.accent, 0.25) : Util.alpha(Color.foreground, 0.1)
border.width: 1
border.color: root.personal ? Color.accent : Util.alpha(Color.foreground, 0.2)
opacity: root.active ? 1 : 0.5
Text {
anchors.fill: parent
anchors.leftMargin: Style.spaceReal(8)
anchors.rightMargin: Style.spaceReal(8)
verticalAlignment: Text.AlignVCenter
text: root.binding ? root.binding.keys : ""
textFormat: Text.PlainText
elide: Text.ElideRight
color: Color.foreground
font.family: Style.font.family
font.pixelSize: Style.font.bodySmall
font.bold: true
}
}
Column {
anchors.left: keysChip.right
anchors.leftMargin: Style.spaceReal(12)
anchors.right: buttons.left
anchors.rightMargin: Style.spaceReal(8)
anchors.verticalCenter: parent.verticalCenter
spacing: Style.spaceReal(2)
opacity: root.active ? 1 : 0.6
Text {
width: parent.width
text: root.binding ? root.binding.description : ""
textFormat: Text.PlainText
elide: Text.ElideRight
color: Color.foreground
font.family: Style.font.family
font.pixelSize: Style.font.bodySmall
font.bold: true
}
Text {
width: parent.width
text: root.stateText
textFormat: Text.PlainText
elide: Text.ElideRight
color: root.active ? Util.alpha(Color.foreground, 0.6) : Color.urgent
font.family: Style.font.family
font.pixelSize: Style.font.caption
}
}
Row {
id: buttons
anchors.right: parent.right
anchors.rightMargin: Style.spaceReal(8)
anchors.verticalCenter: parent.verticalCenter
spacing: Style.spaceReal(4)
CardIconButton {
visible: root.active
icon: ""
onActivated: root.editRequested()
}
CardIconButton {
visible: root.personal
icon: ""
onActivated: root.resetRequested()
}
CardIconButton {
visible: !root.personal && root.active
icon: ""
onActivated: root.disableRequested()
}
CardIconButton {
visible: !root.personal && !root.active
icon: ""
onActivated: root.resetRequested()
}
}
}