summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/quick/controls/gallery/main.qml36
-rw-r--r--src/controls/ComboBox.qml5
-rw-r--r--src/controls/Private/EditMenu.qml22
-rw-r--r--src/controls/Private/EditMenu_base.qml63
-rw-r--r--src/controls/Private/EditMenu_ios.qml10
-rw-r--r--src/controls/SpinBox.qml5
-rw-r--r--src/controls/TextArea.qml7
-rw-r--r--src/controls/TextField.qml5
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()