forked from Shinonome/dots-hyprland
127 lines
3.7 KiB
QML
127 lines
3.7 KiB
QML
pragma ComponentBehavior: Bound
|
|
|
|
import qs.modules.common
|
|
import qs.modules.common.widgets
|
|
import qs.modules.common.functions
|
|
import QtQuick
|
|
import QtQuick.Controls
|
|
import QtQuick.Layouts
|
|
import Quickshell
|
|
import Quickshell.Widgets
|
|
|
|
RippleButton {
|
|
id: root
|
|
required property QsMenuEntry menuEntry
|
|
property bool forceIconColumn: false
|
|
property bool forceSpecialInteractionColumn: false
|
|
readonly property bool hasIcon: menuEntry.icon.length > 0
|
|
readonly property bool hasSpecialInteraction: menuEntry.buttonType !== QsMenuButtonType.None
|
|
|
|
signal dismiss()
|
|
signal openSubmenu(handle: QsMenuHandle)
|
|
|
|
colBackground: menuEntry.isSeparator ? Appearance.m3colors.m3outlineVariant : ColorUtils.transparentize(Appearance.colors.colLayer0)
|
|
enabled: !menuEntry.isSeparator
|
|
opacity: 1
|
|
|
|
horizontalPadding: 12
|
|
implicitWidth: contentItem.implicitWidth + horizontalPadding * 2
|
|
implicitHeight: menuEntry.isSeparator ? 1 : 36
|
|
Layout.topMargin: menuEntry.isSeparator ? 4 : 0
|
|
Layout.bottomMargin: menuEntry.isSeparator ? 4 : 0
|
|
Layout.fillWidth: true
|
|
|
|
Component.onCompleted: {
|
|
if (menuEntry.isSeparator) {
|
|
root.buttonColor = root.colBackground;
|
|
}
|
|
}
|
|
|
|
releaseAction: () => {
|
|
if (menuEntry.hasChildren) {
|
|
root.openSubmenu(root.menuEntry);
|
|
return;
|
|
}
|
|
menuEntry.triggered();
|
|
root.dismiss();
|
|
}
|
|
altAction: (event) => { // Not hog right-click
|
|
event.accepted = false;
|
|
}
|
|
|
|
contentItem: RowLayout {
|
|
id: contentItem
|
|
anchors {
|
|
verticalCenter: parent.verticalCenter
|
|
left: parent.left
|
|
right: parent.right
|
|
leftMargin: root.horizontalPadding
|
|
rightMargin: root.horizontalPadding
|
|
}
|
|
spacing: 8
|
|
visible: !root.menuEntry.isSeparator
|
|
|
|
// Interaction: checkbox or radio button
|
|
Item {
|
|
visible: root.hasSpecialInteraction || root.forceSpecialInteractionColumn
|
|
implicitWidth: 20
|
|
implicitHeight: 20
|
|
|
|
Loader {
|
|
anchors.fill: parent
|
|
active: root.menuEntry.buttonType === QsMenuButtonType.RadioButton
|
|
|
|
sourceComponent: StyledRadioButton {
|
|
enabled: false
|
|
padding: 0
|
|
checked: root.menuEntry.checkState === Qt.Checked
|
|
}
|
|
}
|
|
|
|
Loader {
|
|
anchors.fill: parent
|
|
active: root.menuEntry.buttonType === QsMenuButtonType.CheckBox && root.menuEntry.checkState !== Qt.Unchecked
|
|
|
|
sourceComponent: MaterialSymbol {
|
|
text: root.menuEntry.checkState === Qt.PartiallyChecked ? "check_indeterminate_small" : "check"
|
|
iconSize: 20
|
|
}
|
|
}
|
|
}
|
|
|
|
// Button icon
|
|
Item {
|
|
visible: root.hasIcon || root.forceIconColumn
|
|
implicitWidth: 20
|
|
implicitHeight: 20
|
|
|
|
Loader {
|
|
anchors.centerIn: parent
|
|
active: root.menuEntry.icon.length > 0
|
|
sourceComponent: IconImage {
|
|
asynchronous: true
|
|
source: root.menuEntry.icon
|
|
implicitSize: 20
|
|
mipmap: true
|
|
}
|
|
}
|
|
}
|
|
|
|
StyledText {
|
|
id: label
|
|
text: root.menuEntry.text
|
|
font.pixelSize: Appearance.font.pixelSize.smallie
|
|
Layout.fillWidth: true
|
|
}
|
|
|
|
Loader {
|
|
active: root.menuEntry.hasChildren
|
|
|
|
sourceComponent: MaterialSymbol {
|
|
text: "chevron_right"
|
|
iconSize: 20
|
|
}
|
|
}
|
|
}
|
|
}
|