forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.1 KiB
125 lines
3.1 KiB
/* |
|
SPDX-FileCopyrightText: 2013 Aurélien Gâteau <[email protected]> |
|
SPDX-FileCopyrightText: 2014-2015 Eike Hein <[email protected]> |
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later |
|
*/ |
|
|
|
import QtQuick 2.15 |
|
|
|
import org.kde.plasma.components 2.0 as PlasmaComponents |
|
|
|
Item { |
|
id: root |
|
|
|
property QtObject menu |
|
property Item visualParent |
|
property variant actionList |
|
property bool opened: menu ? (menu.status !== PlasmaComponents.DialogStatus.Closed) : false |
|
|
|
signal actionClicked(string actionId, variant actionArgument) |
|
signal closed |
|
|
|
onActionListChanged: refreshMenu(); |
|
|
|
onOpenedChanged: { |
|
if (!opened) { |
|
closed(); |
|
} |
|
} |
|
|
|
function open(x, y) { |
|
if (!actionList) { |
|
return; |
|
} |
|
|
|
if (x && y) { |
|
menu.open(x, y); |
|
} else { |
|
menu.open(); |
|
} |
|
} |
|
|
|
function refreshMenu() { |
|
if (menu) { |
|
menu.destroy(); |
|
} |
|
|
|
if (!actionList) { |
|
return; |
|
} |
|
|
|
menu = contextMenuComponent.createObject(root); |
|
|
|
fillMenu(menu, actionList); |
|
} |
|
|
|
function fillMenu(menu, items) { |
|
items.forEach(function(actionItem) { |
|
if (actionItem.subActions) { |
|
// This is a menu |
|
var submenuItem = contextSubmenuItemComponent.createObject( |
|
menu, { "actionItem" : actionItem }); |
|
|
|
fillMenu(submenuItem.submenu, actionItem.subActions); |
|
|
|
} else { |
|
var item = contextMenuItemComponent.createObject( |
|
menu, |
|
{ |
|
"actionItem": actionItem, |
|
} |
|
); |
|
} |
|
}); |
|
|
|
} |
|
|
|
Component { |
|
id: contextMenuComponent |
|
|
|
PlasmaComponents.ContextMenu { |
|
visualParent: root.visualParent |
|
} |
|
} |
|
|
|
Component { |
|
id: contextSubmenuItemComponent |
|
|
|
PlasmaComponents.MenuItem { |
|
id: submenuItem |
|
|
|
property variant actionItem |
|
|
|
text: actionItem.text ? actionItem.text : "" |
|
icon: actionItem.icon ? actionItem.icon : null |
|
|
|
property variant submenu : submenu_ |
|
|
|
PlasmaComponents.ContextMenu { |
|
id: submenu_ |
|
visualParent: submenuItem.action |
|
} |
|
} |
|
} |
|
|
|
Component { |
|
id: contextMenuItemComponent |
|
|
|
PlasmaComponents.MenuItem { |
|
property variant actionItem |
|
|
|
text : actionItem.text ? actionItem.text : "" |
|
enabled : actionItem.type !== "title" && ("enabled" in actionItem ? actionItem.enabled : true) |
|
separator : actionItem.type === "separator" |
|
section : actionItem.type === "title" |
|
icon : actionItem.icon ? actionItem.icon : null |
|
checkable : actionItem.checkable ? actionItem.checkable : false |
|
checked : actionItem.checked ? actionItem.checked : false |
|
|
|
onClicked: { |
|
root.actionClicked(actionItem.actionId, actionItem.actionArgument); |
|
} |
|
} |
|
} |
|
}
|
|
|