improvements
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
import QtQuick
|
||||
import Quickshell
|
||||
import "root:/config"
|
||||
|
||||
// Calm, informational hover label for permanent chrome. It never takes focus
|
||||
// or participates in popup coordination; a delayed label should not dismiss or
|
||||
// displace the detail panel attached to the same rail control.
|
||||
PopupWindow {
|
||||
id: root
|
||||
|
||||
required property Item anchorItem
|
||||
property bool triggerHovered: false
|
||||
property string title: ""
|
||||
property string status: ""
|
||||
property string hint: ""
|
||||
property int delay: 400
|
||||
property bool suppressed: false
|
||||
|
||||
readonly property int pad: Theme.padS
|
||||
readonly property real textWidth: Math.max(titleText.implicitWidth,
|
||||
statusText.implicitWidth, hintText.implicitWidth)
|
||||
readonly property real contentWidth: Math.max(112, textWidth + pad * 4)
|
||||
readonly property real contentHeight: textColumn.implicitHeight + pad * 2
|
||||
|
||||
anchor.item: anchorItem
|
||||
anchor.edges: Edges.Left
|
||||
anchor.gravity: Edges.Left
|
||||
anchor.adjustment: PopupAdjustment.Flip | PopupAdjustment.SlideY
|
||||
anchor.margins.left: Theme.popoutGap
|
||||
|
||||
implicitWidth: contentWidth
|
||||
implicitHeight: contentHeight
|
||||
color: "transparent"
|
||||
visible: shown && title !== "" && !suppressed
|
||||
|
||||
property bool shown: false
|
||||
|
||||
onTriggerHoveredChanged: {
|
||||
if (triggerHovered && title !== "" && !suppressed) {
|
||||
hideTimer.stop();
|
||||
showTimer.restart();
|
||||
} else {
|
||||
showTimer.stop();
|
||||
hideTimer.restart();
|
||||
}
|
||||
}
|
||||
|
||||
onSuppressedChanged: {
|
||||
if (suppressed) {
|
||||
showTimer.stop();
|
||||
shown = false;
|
||||
} else if (triggerHovered) {
|
||||
showTimer.restart();
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: showTimer
|
||||
interval: root.delay
|
||||
onTriggered: root.shown = root.triggerHovered && !root.suppressed
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: hideTimer
|
||||
interval: 70
|
||||
onTriggered: root.shown = false
|
||||
}
|
||||
|
||||
ChromeSurface {
|
||||
anchors.fill: parent
|
||||
padding: root.pad
|
||||
lean: 0.06
|
||||
|
||||
Column {
|
||||
id: textColumn
|
||||
anchors.left: parent.left
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
spacing: 2
|
||||
|
||||
Text {
|
||||
id: titleText
|
||||
text: root.title.toUpperCase()
|
||||
color: Theme.text
|
||||
font.family: Theme.fontDisplay
|
||||
font.pixelSize: Theme.fsSmall
|
||||
font.weight: Theme.weightDisplay
|
||||
font.italic: true
|
||||
renderType: Text.NativeRendering
|
||||
}
|
||||
|
||||
Text {
|
||||
id: statusText
|
||||
visible: text !== ""
|
||||
text: root.status
|
||||
color: Theme.subtext
|
||||
font.family: Theme.fontMono
|
||||
font.pixelSize: Theme.fsMicro
|
||||
renderType: Text.NativeRendering
|
||||
}
|
||||
|
||||
Text {
|
||||
id: hintText
|
||||
visible: text !== ""
|
||||
text: root.hint.toUpperCase()
|
||||
color: Theme.accent
|
||||
font.family: Theme.fontMono
|
||||
font.pixelSize: Theme.fsMicro
|
||||
font.weight: Font.Bold
|
||||
font.letterSpacing: 0.8
|
||||
renderType: Text.NativeRendering
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user