diff --git a/applets/mediacontroller/contents/ui/ExpandedRepresentation.qml b/applets/mediacontroller/contents/ui/ExpandedRepresentation.qml index 989c1737f..dbfe0a5e5 100644 --- a/applets/mediacontroller/contents/ui/ExpandedRepresentation.qml +++ b/applets/mediacontroller/contents/ui/ExpandedRepresentation.qml @@ -7,7 +7,7 @@ SPDX-License-Identifier: LGPL-2.0-or-later */ -import QtQuick 2.8 +import QtQuick 2.15 import QtQuick.Layouts 1.1 import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.core 2.0 as PlasmaCore @@ -393,6 +393,45 @@ PlasmaExtras.Representation { queuedPositionUpdate.restart() } } + onPressedChanged: { + // Property binding evaluation is non-deterministic + // so binding visible to pressed and delay to 0 when pressed + // will not make the tooltip show up immediately. + if (pressed) { + seekToolTip.delay = 0; + seekToolTip.visible = true; + } else { + seekToolTip.delay = Qt.binding(() => Kirigami.Units.toolTipDelay); + seekToolTip.visible = Qt.binding(() => seekToolTipHandler.hovered); + } + } + + HoverHandler { + id: seekToolTipHandler + } + + PlasmaComponents3.ToolTip { + id: seekToolTip + readonly property real position: { + if (seekSlider.pressed) { + return seekSlider.visualPosition; + } + // does not need mirroring since we work on raw mouse coordinates + const mousePos = seekToolTipHandler.point.position.x - seekSlider.handle.width / 2; + return Math.max(0, Math.min(1, mousePos / (seekSlider.width - seekSlider.handle.width))); + } + x: Math.round(seekSlider.handle.width / 2 + position * (seekSlider.width - seekSlider.handle.width) - width / 2) + // Never hide (not on press, no timeout) as long as the mouse is hovered + closePolicy: PlasmaComponents3.Popup.NoAutoClose + timeout: -1 + text: { + // Label text needs mirrored position again + const effectivePosition = seekSlider.mirrored ? (1 - position) : position; + return KCoreAddons.Format.formatDuration((seekSlider.to - seekSlider.from) * effectivePosition / 1000, expandedRepresentation.durationFormattingOptions) + } + // NOTE also controlled in onPressedChanged handler above + visible: seekToolTipHandler.hovered + } Timer { id: seekTimer