74 lines
2.0 KiB
QML
74 lines
2.0 KiB
QML
// A bar module container: rounded, hover-highlighted, optionally clickable.
|
|
// Every widget that sits in the top bar wraps itself in one of these so
|
|
// spacing, hover feedback and press feedback stay identical across the bar.
|
|
|
|
import QtQuick
|
|
import qs.config
|
|
|
|
Rectangle {
|
|
id: root
|
|
|
|
// Fired on left click; if nothing is connected the pill is inert and
|
|
// shows no hover affordance.
|
|
signal activated
|
|
signal secondaryActivated
|
|
signal scrolled(int delta)
|
|
|
|
property alias hovered: mouse.containsMouse
|
|
property bool interactive: true
|
|
property int horizontalPadding: 10
|
|
|
|
default property alias content: layout.data
|
|
|
|
implicitWidth: layout.implicitWidth + horizontalPadding * 2
|
|
implicitHeight: Theme.barHeight - 8
|
|
|
|
radius: Theme.pillRadius
|
|
// border.width: 0 works around QTBUG-137166, where transparent rounded
|
|
// rectangles can render with holes at the corners.
|
|
border.width: 0
|
|
|
|
color: {
|
|
if (!interactive)
|
|
return "transparent";
|
|
if (mouse.pressed)
|
|
return Theme.alpha(Theme.accent, Theme.activeAlpha);
|
|
if (mouse.containsMouse)
|
|
return Theme.alpha(Theme.fg, Theme.hoverAlpha);
|
|
return "transparent";
|
|
}
|
|
|
|
Behavior on color {
|
|
ColorAnimation {
|
|
duration: Theme.durFast
|
|
easing.type: Easing.OutQuad
|
|
}
|
|
}
|
|
|
|
Row {
|
|
id: layout
|
|
anchors.centerIn: parent
|
|
spacing: 6
|
|
}
|
|
|
|
MouseArea {
|
|
id: mouse
|
|
anchors.fill: parent
|
|
enabled: root.interactive
|
|
hoverEnabled: true
|
|
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
|
cursorShape: root.interactive ? Qt.PointingHandCursor : Qt.ArrowCursor
|
|
|
|
onClicked: event => {
|
|
if (event.button === Qt.RightButton)
|
|
root.secondaryActivated();
|
|
else
|
|
root.activated();
|
|
}
|
|
|
|
onWheel: event => {
|
|
root.scrolled(event.angleDelta.y > 0 ? 1 : -1);
|
|
}
|
|
}
|
|
}
|