diff --git a/src/controls/Action.qml b/src/controls/Action.qml --- a/src/controls/Action.qml +++ b/src/controls/Action.qml @@ -140,6 +140,13 @@ * } * @endcode */ + + /** + * separator: bool + * Whether the action is is a separator action; defaults to false. + */ + property bool separator: false + default property alias children: root.__children property list __children property Shortcut __shortcut: Shortcut { diff --git a/src/controls/BasicListItem.qml b/src/controls/BasicListItem.qml --- a/src/controls/BasicListItem.qml +++ b/src/controls/BasicListItem.qml @@ -55,6 +55,13 @@ */ property alias reserveSpaceForIcon: iconItem.visible + /** + * reserveSpaceForLabel: bool + * If false, the label will not try to be as wide as possible + * It's useful in layouts containing entries without text + */ + property alias reserveSpaceForLabel: labelItem.visible + default property alias _basicDefault: layout.children contentItem: RowLayout { diff --git a/src/controls/ContextDrawer.qml b/src/controls/ContextDrawer.qml --- a/src/controls/ContextDrawer.qml +++ b/src/controls/ContextDrawer.qml @@ -132,14 +132,29 @@ } } delegate: BasicListItem { + id: listItem + + readonly property bool isSeparator: modelData.hasOwnProperty("separator") && modelData.separator + checked: modelData.checked icon: modelData.icon supportsMouseEvents: true separatorVisible: false + reserveSpaceForIcon: !isSeparator + reserveSpaceForLabel: !isSeparator + label: model ? (model.tooltip ? model.tooltip : model.text) : (modelData.tooltip ? modelData.tooltip : modelData.text) - enabled: model ? model.enabled : modelData.enabled + enabled: !isSeparator && (model ? model.enabled : modelData.enabled) visible: model ? model.visible : modelData.visible opacity: enabled ? 1.0 : 0.6 + + Separator { + id: separatorAction + + visible: listItem.isSeparator + Layout.fillWidth: true + } + onClicked: { root.drawerOpen = false; if (modelData && modelData.trigger !== undefined) { diff --git a/src/controls/GlobalDrawer.qml b/src/controls/GlobalDrawer.qml --- a/src/controls/GlobalDrawer.qml +++ b/src/controls/GlobalDrawer.qml @@ -460,12 +460,16 @@ id: listItem supportsMouseEvents: true readonly property bool wideMode: width > height * 2 + readonly property bool isSeparator: modelData.hasOwnProperty("separator") && modelData.separator + reserveSpaceForIcon: !isSeparator + reserveSpaceForLabel: !isSeparator checked: modelData.checked || (actionsMenu && actionsMenu.visible) width: parent.width icon: modelData.iconName label: width > height * 2 ? MnemonicData.richTextLabel : "" + MnemonicData.enabled: listItem.enabled && listItem.visible MnemonicData.controlType: MnemonicData.MenuItem MnemonicData.label: modelData.text @@ -494,8 +498,16 @@ easing.type: Easing.InOutQuad } } - enabled: (model && model.enabled != undefined) ? model.enabled : modelData.enabled + enabled: !isSeparator && ( (model && model.enabled != undefined) ? model.enabled : modelData.enabled) opacity: enabled ? 1.0 : 0.3 + + Separator { + id: separatorAction + + visible: listItem.isSeparator + Layout.fillWidth: true + } + Icon { Shortcut { sequence: listItem.MnemonicData.sequence @@ -509,11 +521,11 @@ selected: listItem.checked || listItem.pressed Layout.preferredWidth: Layout.preferredHeight source: (LayoutMirroring.enabled ? "go-next-symbolic-rtl" : "go-next-symbolic") - visible: modelData.children!==undefined && modelData.children.length > 0 + visible: !listItem.isSeparator && modelData.children!==undefined && modelData.children.length > 0 } data: [ QQC2.ToolTip { - visible: (modelData.tooltip.length || root.collapsed) && (!actionsMenu || !actionsMenu.visible) && listItem.hovered && text.length > 0 + visible: !listItem.isSeparator && (modelData.tooltip.length || root.collapsed) && (!actionsMenu || !actionsMenu.visible) && listItem.hovered && text.length > 0 text: modelData.tooltip.length ? modelData.tooltip : modelData.text delay: 1000 timeout: 5000 diff --git a/src/controls/private/ActionsMenu.qml b/src/controls/private/ActionsMenu.qml --- a/src/controls/private/ActionsMenu.qml +++ b/src/controls/private/ActionsMenu.qml @@ -19,14 +19,23 @@ import QtQuick 2.3 import QtQuick.Controls 2.1 as Controls +import org.kde.kirigami 2.4 as Kirigami Controls.Menu { id: theMenu property alias actions: actionsInstantiator.model property Component submenuComponent //renamed to work on both Qt 5.9 and 5.10 property Component itemDelegate: Component {ActionMenuItem {}} + property Component separatorDelegate: Component { + Controls.MenuSeparator { + contentItem: Rectangle { + implicitHeight: Math.floor(Kirigami.Units.devicePixelRatio) + color: Qt.tint(Kirigami.Theme.textColor, Qt.rgba(Kirigami.Theme.backgroundColor.r, Kirigami.Theme.backgroundColor.g, Kirigami.Theme.backgroundColor.b, 0.7)) + } + } + } Item { id: invisibleItems @@ -41,7 +50,12 @@ function create() { if (!action.children || action.children.length === 0) { - item = theMenu.itemDelegate.createObject(null, { ourAction: action }); + if (action.hasOwnProperty("separator") && action.separator) { + item = theMenu.separatorDelegate.createObject(null, {}); + } + else { + item = theMenu.itemDelegate.createObject(null, { ourAction: action }); + } theMenu.addItem(item) } else if (theMenu.submenuComponent) { item = theMenu.submenuComponent.createObject(null, { title: action.text, actions: action.children });