diff --git a/src/controls/private/PrivateActionToolButton.qml b/src/controls/private/PrivateActionToolButton.qml --- a/src/controls/private/PrivateActionToolButton.qml +++ b/src/controls/private/PrivateActionToolButton.qml @@ -48,28 +48,43 @@ //we need our own text delegate text: "" - checkable: kirigamiAction && kirigamiAction.checkable - checked: (kirigamiAction && kirigamiAction.checked) || menu.visible + checkable: (kirigamiAction && kirigamiAction.checkable) || (menu.actions && menu.actions.length > 0) + checked: (kirigamiAction && kirigamiAction.checked) enabled: kirigamiAction && kirigamiAction.enabled opacity: enabled ? 1 : 0.4 visible: kirigamiAction && kirigamiAction.visible onClicked: { if (kirigamiAction) { kirigamiAction.trigger(); } - if (kirigamiAction.hasOwnProperty("children") && kirigamiAction.children.length > 0 && !menu.visible) { - control.menuAboutToShow(); - menu.popup(control, 0, control.height) + } + + onToggled: { + if (menu.actions.length > 0) { + if (checked) { + control.menuAboutToShow(); + menu.popup(control, 0, control.height) + } else { + menu.dismiss() + } } } ActionsMenu { id: menu y: control.height actions: control.kirigamiAction && kirigamiAction.hasOwnProperty("children") ? control.kirigamiAction.children : null + + // Important: We handle the press on parent in the parent, so ignore it here. + closePolicy: Controls.Popup.CloseOnEscape | Controls.Popup.CloseOnPressOutsideParent + submenuComponent: Component { ActionsMenu {} } + + onClosed: { + control.checked = false + } } contentItem: MouseArea {