Guard bar tooltips with live hover state

This commit is contained in:
David Heinemeier Hansson
2026-05-20 15:52:43 +02:00
parent 9e77ea3aca
commit 5110b0d753
2 changed files with 35 additions and 14 deletions
+1
View File
@@ -56,6 +56,7 @@ Item {
readonly property real scaledHorizontalMargin: Style.spaceReal(horizontalMargin) readonly property real scaledHorizontalMargin: Style.spaceReal(horizontalMargin)
readonly property real scaledRightExtraMargin: Style.spaceReal(rightExtraMargin) readonly property real scaledRightExtraMargin: Style.spaceReal(rightExtraMargin)
readonly property real scaledVerticalPadding: Style.spaceReal(verticalPadding) readonly property real scaledVerticalPadding: Style.spaceReal(verticalPadding)
readonly property bool tooltipHovered: visible && interactive && !concealed && mouseArea.containsMouse
visible: text !== "" || keepSpace visible: text !== "" || keepSpace
opacity: text === "" || concealed ? 0 : (dimmed ? 0.45 : 1) opacity: text === "" || concealed ? 0 : (dimmed ? 0.45 : 1)
+34 -14
View File
@@ -104,6 +104,19 @@ Item {
return !!target && !!window && targetWindow(target) === window return !!target && !!window && targetWindow(target) === window
} }
function targetTooltipHovered(target) {
return !!target && target.visible !== false && target.opacity !== 0 && target.tooltipHovered === true
}
function clearTooltip() {
tooltipTimer.stop()
pendingTooltipTarget = null
pendingTooltipText = ""
tooltipTarget = null
tooltipText = ""
tooltipShown = false
}
function requestPopout(owner) { function requestPopout(owner) {
if (activePopout === owner) return if (activePopout === owner) return
if (activePopout && "close" in activePopout) activePopout.close() if (activePopout && "close" in activePopout) activePopout.close()
@@ -388,14 +401,9 @@ Item {
} }
function showTooltip(target, text) { function showTooltip(target, text) {
tooltipTimer.stop() clearTooltip()
tooltipTarget = null
tooltipText = ""
tooltipShown = false
if (!target || !text) { if (!targetTooltipHovered(target) || !text) {
pendingTooltipTarget = null
pendingTooltipText = ""
tooltipRequest += 1 tooltipRequest += 1
return return
} }
@@ -407,6 +415,10 @@ Item {
Qt.callLater(function() { Qt.callLater(function() {
if (request !== tooltipRequest) return if (request !== tooltipRequest) return
if (!targetTooltipHovered(pendingTooltipTarget)) {
clearTooltip()
return
}
tooltipTarget = pendingTooltipTarget tooltipTarget = pendingTooltipTarget
tooltipText = pendingTooltipText tooltipText = pendingTooltipText
pendingTooltipTarget = null pendingTooltipTarget = null
@@ -418,13 +430,8 @@ Item {
function hideTooltip(target) { function hideTooltip(target) {
if (tooltipTarget !== target && pendingTooltipTarget !== target) return if (tooltipTarget !== target && pendingTooltipTarget !== target) return
tooltipTimer.stop()
tooltipRequest += 1 tooltipRequest += 1
pendingTooltipTarget = null clearTooltip()
pendingTooltipText = ""
tooltipTarget = null
tooltipText = ""
tooltipShown = false
} }
function refreshUpdate() { function refreshUpdate() {
@@ -510,7 +517,17 @@ Item {
Timer { Timer {
id: tooltipTimer id: tooltipTimer
interval: 400 interval: 400
onTriggered: root.tooltipShown = true onTriggered: {
if (root.targetTooltipHovered(root.tooltipTarget)) root.tooltipShown = true
else root.clearTooltip()
}
}
Timer {
interval: 100
running: root.tooltipShown
repeat: true
onTriggered: if (!root.targetTooltipHovered(root.tooltipTarget)) root.hideTooltip(root.tooltipTarget)
} }
Timer { Timer {
@@ -1053,6 +1070,7 @@ Item {
property real fixedWidth: -1 property real fixedWidth: -1
property real fixedHeight: -1 property real fixedHeight: -1
property string tooltipText: "" property string tooltipText: ""
readonly property bool tooltipHovered: visible && opacity > 0 && mouseArea.containsMouse
signal pressed(int button) signal pressed(int button)
signal wheelMoved(int delta) signal wheelMoved(int delta)
@@ -1743,6 +1761,8 @@ Item {
trayItemRoot.modelData.scroll(wheel.angleDelta.y, false) trayItemRoot.modelData.scroll(wheel.angleDelta.y, false)
} }
} }
readonly property bool tooltipHovered: visible && opacity > 0 && mouseArea.containsMouse
} }
} }