import QtQuick import qs.Commons Item { id: root property var bar: null property string text: "" property string fontFamily: bar ? bar.fontFamily : Style.font.family property real fontSize: Style.font.body property color foreground: bar ? bar.foreground : Color.foreground property color activeColor: bar ? bar.urgent : Color.urgent property bool active: false property real horizontalMargin: 8.5 property real rightExtraMargin: 0 property real verticalPadding: 6 property real fixedWidth: -1 property real fixedHeight: -1 property real textRotation: 0 property bool keepSpace: false property bool dimmed: false property bool concealed: false property bool interactive: true property bool pressable: true property bool useActiveColor: true property bool maintainIndicatorReveal: false property var revealHost: bar property string tooltipText: "" property var registeredBar: null signal pressed(int button) signal wheelMoved(int delta) function triggerPress(button) { if (root.bar) root.bar.hideTooltip(root) root.pressed(button) } function hideOwnTooltip() { if (root.bar) root.bar.hideTooltip(root) } function syncClickRegistration() { if (registeredBar && registeredBar.unregisterClickTarget) registeredBar.unregisterClickTarget(root) registeredBar = root.bar if (registeredBar && registeredBar.registerClickTarget) registeredBar.registerClickTarget(root) } onBarChanged: syncClickRegistration() onVisibleChanged: if (!visible) hideOwnTooltip() onInteractiveChanged: if (!interactive) hideOwnTooltip() onConcealedChanged: if (concealed) hideOwnTooltip() Component.onCompleted: syncClickRegistration() Component.onDestruction: if (registeredBar && registeredBar.unregisterClickTarget) registeredBar.unregisterClickTarget(root) readonly property bool vertical: bar ? bar.vertical : false readonly property int barSize: bar ? bar.barSize : Style.bar.sizeHorizontal readonly property real scaledHorizontalMargin: Style.spaceReal(horizontalMargin) readonly property real scaledRightExtraMargin: Style.spaceReal(rightExtraMargin) readonly property real scaledVerticalPadding: Style.spaceReal(verticalPadding) readonly property bool tooltipHovered: visible && interactive && !concealed && mouseArea.containsMouse visible: text !== "" || keepSpace opacity: text === "" || concealed ? 0 : (dimmed ? 0.45 : 1) implicitWidth: fixedWidth > 0 ? fixedWidth : (vertical ? barSize : Math.max(12, label.implicitWidth + scaledHorizontalMargin * 2 + scaledRightExtraMargin)) implicitHeight: fixedHeight > 0 ? fixedHeight : (vertical ? Math.max(12, label.implicitHeight + scaledVerticalPadding * 2) : barSize) Behavior on opacity { NumberAnimation { duration: 140; easing.type: Easing.OutCubic } } Text { id: label anchors.centerIn: parent anchors.horizontalCenterOffset: root.vertical ? 0 : -root.scaledRightExtraMargin / 2 text: root.text color: root.active && root.useActiveColor ? root.activeColor : root.foreground font.family: root.fontFamily font.pixelSize: root.fontSize renderType: Text.NativeRendering rotation: root.textRotation horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter Behavior on color { ColorAnimation { duration: 160 } } } MouseArea { id: mouseArea anchors.fill: parent acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton enabled: root.interactive hoverEnabled: true cursorShape: root.pressable ? Qt.PointingHandCursor : Qt.ArrowCursor onEntered: { if (root.bar) { root.bar.showTooltip(root, root.tooltipText) } if (root.maintainIndicatorReveal && root.revealHost && root.revealHost.setIndicatorItemHovered) root.revealHost.setIndicatorItemHovered(true) } onExited: { if (root.bar) { root.bar.hideTooltip(root) } if (root.maintainIndicatorReveal && root.revealHost && root.revealHost.setIndicatorItemHovered) root.revealHost.setIndicatorItemHovered(false) } onClicked: function(mouse) { if (root.pressable) root.triggerPress(mouse.button) } onWheel: function(wheel) { root.wheelMoved(wheel.angleDelta.y) } } }