summaryrefslogtreecommitdiff
path: root/src/controls/Menu.qml
diff options
context:
space:
mode:
Diffstat (limited to 'src/controls/Menu.qml')
-rw-r--r--src/controls/Menu.qml195
1 files changed, 3 insertions, 192 deletions
diff --git a/src/controls/Menu.qml b/src/controls/Menu.qml
index 689505ac..9c766846 100644
--- a/src/controls/Menu.qml
+++ b/src/controls/Menu.qml
@@ -141,201 +141,12 @@ MenuPrivate {
/*! \internal */
__contentItem: Loader {
- sourceComponent: __menuComponent
+ sourceComponent: MenuContentItem {
+ menu: root
+ }
active: !root.__isNative && root.__popupVisible
focus: true
Keys.forwardTo: item ? [item, root.__parentContentItem] : []
property bool altPressed: root.__parentContentItem ? root.__parentContentItem.altPressed : false
}
-
- /*! \internal */
- property Component __menuComponent: Loader {
- id: menuFrameLoader
-
- readonly property Style __style: styleLoader.item
- readonly property Component menuItemStyle: __style ? __style.menuItem : null
-
- readonly property var control: root
- property alias contentWidth: content.width
- property alias contentHeight: content.height
-
- readonly property int subMenuXPos: width + (item && item["subMenuOverlap"] || 0)
-
- visible: status === Loader.Ready
- sourceComponent: __style ? __style.frame : undefined
-
- Loader {
- id: styleLoader
- active: !root.isNative
- sourceComponent: root.style
- property alias __control: menuFrameLoader
- onStatusChanged: {
- if (status === Loader.Error)
- console.error("Failed to load Style for", root)
- }
- }
-
- focus: true
- property var mnemonicsMap: ({})
-
- Keys.onPressed: {
- var item = null
- if (!(event.modifiers & Qt.AltModifier)
- && (item = mnemonicsMap[event.text.toUpperCase()])) {
- if (item.isSubmenu) {
- root.__currentIndex = item.menuItemIndex
- item.showSubMenu(true)
- item.menuItem.__currentIndex = 0
- } else {
- triggerAndDismiss(item)
- }
- event.accepted = true
- } else {
- event.accepted = false
- }
- }
-
- Keys.onEscapePressed: root.__dismissMenu()
-
- Keys.onDownPressed: {
- if (root.__currentIndex < 0)
- root.__currentIndex = -1
-
- for (var i = root.__currentIndex + 1;
- i < root.items.length && !canBeHovered(i); i++)
- ;
- event.accepted = true
- }
-
- Keys.onUpPressed: {
- for (var i = root.__currentIndex - 1;
- i >= 0 && !canBeHovered(i); i--)
- ;
- event.accepted = true
- }
-
- function canBeHovered(index) {
- var item = content.menuItemAt(index)
- if (item && !item["isSeparator"] && item.enabled) {
- root.__currentIndex = index
- return true
- }
- return false
- }
-
- Keys.onLeftPressed: {
- if ((event.accepted = root.__parentMenu.hasOwnProperty("title")))
- __closeMenu()
- }
-
- Keys.onRightPressed: {
- var item = content.menuItemAt(root.__currentIndex)
- if ((event.accepted = (item && item.isSubmenu))) {
- item.showSubMenu(true)
- item.menuItem.__currentIndex = 0
- }
- }
-
- Keys.onSpacePressed: triggerCurrent()
- Keys.onReturnPressed: triggerCurrent()
- Keys.onEnterPressed: triggerCurrent()
-
- function triggerCurrent() {
- var item = content.menuItemAt(root.__currentIndex)
- if (item)
- content.triggered(item)
- }
-
- function triggerAndDismiss(item) {
- if (item && !item.isSeparator) {
- root.__dismissMenu()
- if (!item.isSubmenu)
- item.menuItem.trigger()
- }
- }
-
- Binding {
- // Make sure the styled frame is in the background
- target: item
- property: "z"
- value: content.z - 1
- }
-
- ColumnMenuContent {
- id: content
- menuItemDelegate: menuItemComponent
- scrollerStyle: __style ? __style.scrollerStyle : undefined
- itemsModel: root.items
- margin: menuFrameLoader.item ? menuFrameLoader.item.margin : 0
- minWidth: root.__minimumWidth
- maxHeight: menuFrameLoader.item ? menuFrameLoader.item.maxHeight : 0
- onTriggered: triggerAndDismiss(item)
- }
-
- Component {
- id: menuItemComponent
- Loader {
- id: menuItemLoader
-
- property var menuItem: modelData
- readonly property bool isSeparator: !!menuItem && menuItem.type === MenuItemType.Separator
- readonly property bool isSubmenu: !!menuItem && menuItem.type === MenuItemType.Menu
- property bool selected: !(isSeparator || !!scrollerDirection) && root.__currentIndex === index
- property string text: isSubmenu ? menuItem.title : !(isSeparator || !!scrollerDirection) ? menuItem.text : ""
- property bool showUnderlined: __contentItem.altPressed
- readonly property var scrollerDirection: menuItem["scrollerDirection"]
-
- property int menuItemIndex: index
-
- sourceComponent: menuFrameLoader.menuItemStyle
- enabled: visible && !isSeparator && !!menuItem && menuItem.enabled
- visible: !!menuItem && menuItem.visible
- active: visible
-
- function showSubMenu(immediately) {
- if (immediately) {
- if (root.__currentIndex === menuItemIndex)
- menuItem.__popup(menuFrameLoader.subMenuXPos, 0, -1)
- } else {
- openMenuTimer.start()
- }
- }
-
- Timer {
- id: openMenuTimer
- interval: 50
- onTriggered: menuItemLoader.showSubMenu(true)
- }
-
- function closeSubMenu() { closeMenuTimer.start() }
-
- Timer {
- id: closeMenuTimer
- interval: 1
- onTriggered: {
- if (root.__currentIndex !== menuItemIndex)
- menuItem.__closeMenu()
- }
- }
-
- onLoaded: {
- menuItem.__visualItem = menuItemLoader
-
- if (content.width < item.implicitWidth)
- content.width = item.implicitWidth
-
- var title = text
- var ampersandPos = title.indexOf("&")
- if (ampersandPos !== -1)
- menuFrameLoader.mnemonicsMap[title[ampersandPos + 1].toUpperCase()] = menuItemLoader
- }
-
- Binding {
- target: menuItemLoader.item
- property: "width"
- value: Math.max(root.__minimumWidth, content.width)
- }
- }
- }
- }
}