mirror of
https://github.com/arthur-pbty/arthur-os.git
synced 2026-08-04 20:28:23 +02:00
115 lines
4.2 KiB
QML
115 lines
4.2 KiB
QML
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) }
|
|
}
|
|
}
|