diff options
-rw-r--r-- | examples/quick/controls/gallery/main.qml | 36 | ||||
-rw-r--r-- | src/controls/ComboBox.qml | 5 | ||||
-rw-r--r-- | src/controls/Private/EditMenu.qml | 22 | ||||
-rw-r--r-- | src/controls/Private/EditMenu_base.qml | 63 | ||||
-rw-r--r-- | src/controls/Private/EditMenu_ios.qml | 10 | ||||
-rw-r--r-- | src/controls/SpinBox.qml | 5 | ||||
-rw-r--r-- | src/controls/TextArea.qml | 7 | ||||
-rw-r--r-- | src/controls/TextField.qml | 5 |
8 files changed, 90 insertions, 63 deletions
diff --git a/examples/quick/controls/gallery/main.qml b/examples/quick/controls/gallery/main.qml index 0a385a1b..a6f4ce39 100644 --- a/examples/quick/controls/gallery/main.qml +++ b/examples/quick/controls/gallery/main.qml @@ -140,25 +140,27 @@ ApplicationWindow { ChildWindow { id: window1 } - Menu { + Component { id: editmenu - MenuItem { action: cutAction } - MenuItem { action: copyAction } - MenuItem { action: pasteAction } - MenuSeparator {} Menu { - title: "Text &Format" - MenuItem { action: a1 } - MenuItem { action: a2 } - MenuItem { action: a3 } - MenuSeparator { } - MenuItem { text: "Allow &Hyphenation"; checkable: true } - } - Menu { - title: "Font &Style" - MenuItem { text: "&Bold"; checkable: true } - MenuItem { text: "&Italic"; checkable: true } - MenuItem { text: "&Underline"; checkable: true } + MenuItem { action: cutAction } + MenuItem { action: copyAction } + MenuItem { action: pasteAction } + MenuSeparator {} + Menu { + title: "Text &Format" + MenuItem { action: a1 } + MenuItem { action: a2 } + MenuItem { action: a3 } + MenuSeparator { } + MenuItem { text: "Allow &Hyphenation"; checkable: true } + } + Menu { + title: "Font &Style" + MenuItem { text: "&Bold"; checkable: true } + MenuItem { text: "&Italic"; checkable: true } + MenuItem { text: "&Underline"; checkable: true } + } } } diff --git a/src/controls/ComboBox.qml b/src/controls/ComboBox.qml index 1dba6b7e..55161d39 100644 --- a/src/controls/ComboBox.qml +++ b/src/controls/ComboBox.qml @@ -222,16 +222,15 @@ Control { property alias validator: input.validator /*! - \qmlproperty Menu ComboBox::menu \since QtQuick.Controls 1.3 - This property contains the edit menu for working + This property contains the edit \l Menu for working with text selection. Set it to \c null if no menu is wanted. \note The menu is only in use when \l editable is \c true */ - property Menu menu: input.editMenu.defaultMenu + property Component menu: input.editMenu.defaultMenu /*! \qmlproperty bool ComboBox::acceptableInput diff --git a/src/controls/Private/EditMenu.qml b/src/controls/Private/EditMenu.qml index c0faf9ff..f4d80bd5 100644 --- a/src/controls/Private/EditMenu.qml +++ b/src/controls/Private/EditMenu.qml @@ -47,7 +47,27 @@ Loader { property Item cursorHandle property Item selectionHandle property Flickable flickable - property Menu defaultMenu: item && item.defaultMenu ? item.defaultMenu : null + property Component defaultMenu: item && item.defaultMenu ? item.defaultMenu : null + property Menu menuInstance: null + + Connections { + target: control + onMenuChanged: { + if (menuInstance !== null) { + menuInstance.destroy() + menuInstance = null + } + } + } + + function getMenuInstance() + { + // Lazy load menu when first requested + if (!menuInstance && control.menu) { + menuInstance = control.menu.createObject(input); + } + return menuInstance; + } source: Qt.resolvedUrl("EditMenu_" + (Qt.platform.os === "ios" ? "ios" : "base") + ".qml") } diff --git a/src/controls/Private/EditMenu_base.qml b/src/controls/Private/EditMenu_base.qml index 88cef62a..aed4e464 100644 --- a/src/controls/Private/EditMenu_base.qml +++ b/src/controls/Private/EditMenu_base.qml @@ -42,45 +42,52 @@ import QtQuick.Controls 1.2 import QtQuick.Controls.Private 1.0 Item { + id: editMenuBase anchors.fill: parent - Action { + Component { id: cutAction - text: "Cu&t" - shortcut: StandardKey.Cut - iconName: "edit-cut" - enabled: !input.readOnly && selectionStart !== selectionEnd - onTriggered: { - input.cut(); - input.select(input.cursorPosition, input.cursorPosition); + Action { + text: "Cu&t" + shortcut: StandardKey.Cut + iconName: "edit-cut" + enabled: !input.readOnly && selectionStart !== selectionEnd + onTriggered: { + input.cut(); + input.select(input.cursorPosition, input.cursorPosition); + } } } - Action { + Component { id: copyAction - text: "&Copy" - shortcut: StandardKey.Copy - iconName: "edit-copy" - enabled: input.selectionStart !== input.selectionEnd - onTriggered: { - input.copy(); - input.select(input.cursorPosition, input.cursorPosition); + Action { + text: "&Copy" + shortcut: StandardKey.Copy + iconName: "edit-copy" + enabled: input.selectionStart !== input.selectionEnd + onTriggered: { + input.copy(); + input.select(input.cursorPosition, input.cursorPosition); + } } } - Action { + Component { id: pasteAction - text: "&Paste" - shortcut: StandardKey.Paste - iconName: "edit-paste" - enabled: input.canPaste - onTriggered: input.paste() + Action { + text: "&Paste" + shortcut: StandardKey.Paste + iconName: "edit-paste" + enabled: input.canPaste + onTriggered: input.paste() + } } - property Menu defaultMenu: Menu { - MenuItem { action: cutAction } - MenuItem { action: copyAction } - MenuItem { action: pasteAction } + property Component defaultMenu: Menu { + MenuItem { action: cutAction.createObject(editMenuBase) } + MenuItem { action: copyAction.createObject(editMenuBase) } + MenuItem { action: pasteAction.createObject(editMenuBase) } } MouseArea { @@ -97,9 +104,9 @@ Item { input.activate() if (control.menu) { - control.menu.__dismissMenu(); + getMenuInstance().__dismissMenu(); var menuPos = mapToItem(null, mouse.x, mouse.y) - control.menu.__popup(menuPos.x, menuPos.y, -1, MenuPrivate.EditMenu); + getMenuInstance().__popup(menuPos.x, menuPos.y, -1, MenuPrivate.EditMenu); } } } diff --git a/src/controls/Private/EditMenu_ios.qml b/src/controls/Private/EditMenu_ios.qml index e41e0cb6..1fe92e46 100644 --- a/src/controls/Private/EditMenu_ios.qml +++ b/src/controls/Private/EditMenu_ios.qml @@ -46,7 +46,7 @@ Item { anchors.fill: parent property bool __showMenuFromTouchAndHold: false - property Menu defaultMenu: Menu { + property Component defaultMenu: Menu { MenuItem { text: "cut" visible: !input.readOnly && selectionStart !== selectionEnd @@ -99,7 +99,7 @@ Item { } onClicked: { - if (control.menu && control.menu.__popupVisible) { + if (control.menu && getMenuInstance().__popupVisible) { select(input.cursorPosition, input.cursorPosition); } else { input.activate(); @@ -180,10 +180,10 @@ Item { var xMax = Math.max(r1.x, r2.x); var centerX = xMin + ((xMax - xMin) / 2); var popupPos = input.mapToItem(null, centerX, r1.y); - control.menu.__dismissMenu(); - control.menu.__popup(popupPos.x, popupPos.y, -1, MenuPrivate.EditMenu); + getMenuInstance().__dismissMenu(); + getMenuInstance().__popup(popupPos.x, popupPos.y, -1, MenuPrivate.EditMenu); } else { - control.menu.__dismissMenu(); + getMenuInstance().__dismissMenu(); } } } diff --git a/src/controls/SpinBox.qml b/src/controls/SpinBox.qml index f4b89ae6..f13e81dc 100644 --- a/src/controls/SpinBox.qml +++ b/src/controls/SpinBox.qml @@ -204,14 +204,13 @@ Control { readonly property bool inputMethodComposing: !!input.inputMethodComposing /*! - \qmlproperty Menu SpinBox::menu \since QtQuick.Controls 1.3 - This property contains the edit menu for working + This property contains the edit \l Menu for working with text selection. Set it to \c null if no menu is wanted. */ - property Menu menu: input.editMenu.defaultMenu + property Component menu: input.editMenu.defaultMenu style: Qt.createComponent(Settings.style + "/SpinBoxStyle.qml", spinbox) diff --git a/src/controls/TextArea.qml b/src/controls/TextArea.qml index d8181ab9..d2663e17 100644 --- a/src/controls/TextArea.qml +++ b/src/controls/TextArea.qml @@ -436,14 +436,15 @@ ScrollView { readonly property alias hoveredLink: edit.hoveredLink /*! - \qmlproperty Menu TextArea::menu \since QtQuick.Controls 1.3 - This property contains the edit menu for working + This property contains the edit \l Menu for working with text selection. Set it to \c null if no menu is wanted. + + \sa Menu */ - property Menu menu: editMenu.defaultMenu + property Component menu: editMenu.defaultMenu /*! \qmlmethod TextArea::append(string) diff --git a/src/controls/TextField.qml b/src/controls/TextField.qml index 7417beb8..4d31e9b8 100644 --- a/src/controls/TextField.qml +++ b/src/controls/TextField.qml @@ -434,14 +434,13 @@ Control { property alias validator: textInput.validator /*! - \qmlproperty Menu TextField::menu \since QtQuick.Controls 1.3 - This property contains the edit menu for working + This property contains the edit \l Menu for working with text selection. Set it to \c null if no menu is wanted. */ - property Menu menu: textInput.editMenu.defaultMenu + property Component menu: textInput.editMenu.defaultMenu /*! \qmlsignal TextField::accepted() |