mirror of
https://github.com/belsabbagh/dotfiles.git
synced 2026-04-11 17:47:09 +00:00
186 lines
5.0 KiB
QML
186 lines
5.0 KiB
QML
import QtQuick
|
|
import QtQuick.Controls
|
|
import QtQuick.Layouts
|
|
import Quickshell
|
|
import qs.config
|
|
import qs.modules.functions
|
|
|
|
Control {
|
|
id: root
|
|
|
|
property alias text: label.text
|
|
property string icon: ""
|
|
property int iconSize: Metrics.iconSize(20)
|
|
property alias radius: background.radius
|
|
property alias topLeftRadius: background.topLeftRadius
|
|
property alias topRightRadius: background.topRightRadius
|
|
property alias bottomLeftRadius: background.bottomLeftRadius
|
|
property alias bottomRightRadius: background.bottomRightRadius
|
|
property bool checkable: false
|
|
property bool checked: true
|
|
property bool secondary: false
|
|
property string tooltipText: ""
|
|
property bool usePrimary: secondary ? false : checked
|
|
property color base_bg: usePrimary ? Appearance.m3colors.m3primary : Appearance.m3colors.m3secondaryContainer
|
|
property color base_fg: usePrimary ? Appearance.m3colors.m3onPrimary : Appearance.m3colors.m3onSecondaryContainer
|
|
property color disabled_bg: ColorUtils.transparentize(base_bg, 0.4)
|
|
property color disabled_fg: ColorUtils.transparentize(base_fg, 0.4)
|
|
property color hover_bg: Qt.lighter(base_bg, 1.1)
|
|
property color pressed_bg: Qt.darker(base_bg, 1.2)
|
|
property color backgroundColor: !root.enabled ? disabled_bg : mouse_area.pressed ? pressed_bg : mouse_area.containsMouse ? hover_bg : base_bg
|
|
property color textColor: !root.enabled ? disabled_fg : base_fg
|
|
property bool beingHovered: mouse_area.containsMouse
|
|
|
|
signal clicked()
|
|
signal toggled(bool checked)
|
|
|
|
implicitWidth: (label.text === "" && icon !== "") ? implicitHeight : row.implicitWidth + implicitHeight
|
|
implicitHeight: 40
|
|
|
|
MouseArea {
|
|
id: mouse_area
|
|
|
|
anchors.fill: parent
|
|
hoverEnabled: root.enabled
|
|
cursorShape: root.enabled ? Qt.PointingHandCursor : Qt.ForbiddenCursor
|
|
onClicked: {
|
|
if (!root.enabled)
|
|
return ;
|
|
|
|
if (root.checkable) {
|
|
root.checked = !root.checked;
|
|
root.toggled(root.checked);
|
|
}
|
|
root.clicked();
|
|
}
|
|
}
|
|
|
|
HoverHandler {
|
|
id: hover
|
|
|
|
enabled: root.tooltipText !== ""
|
|
}
|
|
|
|
LazyLoader {
|
|
active: root.tooltipText !== ""
|
|
|
|
StyledPopout {
|
|
hoverTarget: hover
|
|
hoverDelay: Metrics.chronoDuration(500)
|
|
|
|
Component {
|
|
StyledText {
|
|
text: root.tooltipText
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
contentItem: Item {
|
|
anchors.fill: parent
|
|
|
|
Row {
|
|
id: row
|
|
|
|
anchors.centerIn: parent
|
|
spacing: root.icon !== "" && label.text !== "" ? 5 : 0
|
|
|
|
MaterialSymbol {
|
|
visible: root.icon !== ""
|
|
icon: root.icon
|
|
font.pixelSize: root.iconSize
|
|
color: root.textColor
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
Behavior on color {
|
|
ColorAnimation {
|
|
duration: Metrics.chronoDuration("small") / 2
|
|
easing.type: Appearance.animation.easing
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
StyledText {
|
|
id: label
|
|
|
|
color: root.textColor
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
elide: Text.ElideRight
|
|
|
|
Behavior on color {
|
|
ColorAnimation {
|
|
duration: Metrics.chronoDuration("small") / 2
|
|
easing.type: Appearance.animation.easing
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
background: Rectangle {
|
|
id: background
|
|
|
|
radius: Metrics.radius("large")
|
|
color: root.backgroundColor
|
|
|
|
Behavior on color {
|
|
ColorAnimation {
|
|
duration: Metrics.chronoDuration("small") / 2
|
|
easing.type: Appearance.animation.easing
|
|
}
|
|
|
|
}
|
|
|
|
Behavior on radius {
|
|
NumberAnimation {
|
|
duration: Metrics.chronoDuration("small") / 2
|
|
easing.type: Appearance.animation.easing
|
|
}
|
|
|
|
}
|
|
|
|
Behavior on topLeftRadius {
|
|
NumberAnimation {
|
|
duration: Metrics.chronoDuration("small")
|
|
easing.type: Appearance.animation.easing
|
|
}
|
|
|
|
}
|
|
|
|
Behavior on topRightRadius {
|
|
NumberAnimation {
|
|
duration: Metrics.chronoDuration("small")
|
|
easing.type: Appearance.animation.easing
|
|
}
|
|
|
|
}
|
|
|
|
Behavior on bottomLeftRadius {
|
|
NumberAnimation {
|
|
duration: Metrics.chronoDuration("small")
|
|
easing.type: Appearance.animation.easing
|
|
}
|
|
|
|
}
|
|
|
|
Behavior on bottomRightRadius {
|
|
NumberAnimation {
|
|
duration: Metrics.chronoDuration("small")
|
|
easing.type: Appearance.animation.easing
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|