diff options
| author | Mitch Curtis <mitch.curtis@qt.io> | 2024-12-17 16:18:05 +0800 |
|---|---|---|
| committer | Mitch Curtis <mitch.curtis@qt.io> | 2025-02-28 08:48:48 +0800 |
| commit | 3b598b6f7509f57e198e7de1f04e4333555e7227 (patch) | |
| tree | 77d24ee4d3e06dbfd82730a1062f134643e80fb3 /src | |
| parent | 121eec233e457f561c535d090ae7be47cd8e0c40 (diff) | |
ContextMenu: add to text editing controls
[ChangeLog][Controls] TextField and TextArea now provide a ContextMenu
by default. If you already have a custom context menu for these types,
ContextMenu will not open its own on e.g. right click.
Fixes: QTBUG-35598
Pick-to: 6.9
Change-Id: I0897a7ba5e1b5b6d5425c80cbc6f2550c904605b
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src')
76 files changed, 789 insertions, 1 deletions
diff --git a/src/quickcontrols/basic/TextArea.qml b/src/quickcontrols/basic/TextArea.qml index 0dc7c4558e..9a86c8ae66 100644 --- a/src/quickcontrols/basic/TextArea.qml +++ b/src/quickcontrols/basic/TextArea.qml @@ -3,6 +3,7 @@ import QtQuick import QtQuick.Controls.impl +import QtQuick.Controls.Basic.impl import QtQuick.Templates as T T.TextArea { @@ -23,6 +24,10 @@ T.TextArea { selectionColor: control.palette.highlight selectedTextColor: control.palette.highlightedText + ContextMenu.menu: TextEditingContextMenu { + control: control + } + PlaceholderText { id: placeholder x: control.leftPadding diff --git a/src/quickcontrols/basic/TextField.qml b/src/quickcontrols/basic/TextField.qml index cf542a6886..67f9533694 100644 --- a/src/quickcontrols/basic/TextField.qml +++ b/src/quickcontrols/basic/TextField.qml @@ -3,6 +3,7 @@ import QtQuick import QtQuick.Controls.impl +import QtQuick.Controls.Basic.impl import QtQuick.Templates as T T.TextField { @@ -23,6 +24,10 @@ T.TextField { placeholderTextColor: control.palette.placeholderText verticalAlignment: TextInput.AlignVCenter + ContextMenu.menu: TextEditingContextMenu { + control: control + } + PlaceholderText { id: placeholder x: control.leftPadding diff --git a/src/quickcontrols/basic/impl/CMakeLists.txt b/src/quickcontrols/basic/impl/CMakeLists.txt index 7f828c0350..f731e08502 100644 --- a/src/quickcontrols/basic/impl/CMakeLists.txt +++ b/src/quickcontrols/basic/impl/CMakeLists.txt @@ -16,6 +16,8 @@ qt_internal_add_qml_module(QuickControls2BasicStyleImpl qquickbasicbusyindicator.cpp qquickbasicbusyindicator_p.h qquickbasicdial.cpp qquickbasicdial_p.h qquickbasicprogressbar.cpp qquickbasicprogressbar_p.h + QML_FILES + TextEditingContextMenu.qml DEFINES QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII diff --git a/src/quickcontrols/basic/impl/TextEditingContextMenu.qml b/src/quickcontrols/basic/impl/TextEditingContextMenu.qml new file mode 100644 index 0000000000..81153c376d --- /dev/null +++ b/src/quickcontrols/basic/impl/TextEditingContextMenu.qml @@ -0,0 +1,31 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.Basic +import QtQuick.Controls.impl + +Menu { + id: menu + popupType: Popup.Window + + required property var control + + CutAction { + control: menu.control + } + CopyAction { + control: menu.control + } + PasteAction { + control: menu.control + } + DeleteAction { + control: menu.control + } + + MenuSeparator {} + + SelectAllAction { + control: menu.control + } +} diff --git a/src/quickcontrols/fluentwinui3/TextArea.qml b/src/quickcontrols/fluentwinui3/TextArea.qml index 9d94a3084b..0932cbeea0 100644 --- a/src/quickcontrols/fluentwinui3/TextArea.qml +++ b/src/quickcontrols/fluentwinui3/TextArea.qml @@ -38,6 +38,10 @@ T.TextArea { ].filter(Boolean).join("_") || "normal" readonly property var config: Config.controls.textarea[__currentState] || {} + ContextMenu.menu: Impl.TextEditingContextMenu { + control: control + } + PlaceholderText { id: placeholder x: control.leftPadding diff --git a/src/quickcontrols/fluentwinui3/TextField.qml b/src/quickcontrols/fluentwinui3/TextField.qml index 37131167fd..c24328938a 100644 --- a/src/quickcontrols/fluentwinui3/TextField.qml +++ b/src/quickcontrols/fluentwinui3/TextField.qml @@ -38,6 +38,10 @@ T.TextField { placeholderTextColor: control.palette.placeholderText verticalAlignment: Text.AlignVCenter + ContextMenu.menu: Impl.TextEditingContextMenu { + control: control + } + PlaceholderText { id: placeholder x: control.leftPadding diff --git a/src/quickcontrols/fluentwinui3/impl/CMakeLists.txt b/src/quickcontrols/fluentwinui3/impl/CMakeLists.txt index 19536cc793..74c21d095c 100644 --- a/src/quickcontrols/fluentwinui3/impl/CMakeLists.txt +++ b/src/quickcontrols/fluentwinui3/impl/CMakeLists.txt @@ -7,10 +7,16 @@ set(qml_files "ButtonBackground.qml" "CheckIndicator.qml" + "CopyAction.qml" + "CutAction.qml" + "DeleteAction.qml" + "PasteAction.qml" "RadioIndicator.qml" + "SelectAllAction.qml" "SwitchIndicator.qml" "FocusFrame.qml" "StyleImage.qml" + "TextEditingContextMenu.qml" ) qt_internal_add_qml_module(QuickControls2FluentWinUI3StyleImpl diff --git a/src/quickcontrols/fluentwinui3/impl/CopyAction.qml b/src/quickcontrols/fluentwinui3/impl/CopyAction.qml new file mode 100644 index 0000000000..f6df184b08 --- /dev/null +++ b/src/quickcontrols/fluentwinui3/impl/CopyAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +CopyAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/fluentwinui3/impl/CutAction.qml b/src/quickcontrols/fluentwinui3/impl/CutAction.qml new file mode 100644 index 0000000000..9e5538d0e9 --- /dev/null +++ b/src/quickcontrols/fluentwinui3/impl/CutAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +CutAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/fluentwinui3/impl/DeleteAction.qml b/src/quickcontrols/fluentwinui3/impl/DeleteAction.qml new file mode 100644 index 0000000000..689be74b13 --- /dev/null +++ b/src/quickcontrols/fluentwinui3/impl/DeleteAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +DeleteAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/fluentwinui3/impl/PasteAction.qml b/src/quickcontrols/fluentwinui3/impl/PasteAction.qml new file mode 100644 index 0000000000..c68c86f5d2 --- /dev/null +++ b/src/quickcontrols/fluentwinui3/impl/PasteAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +PasteAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/fluentwinui3/impl/SelectAllAction.qml b/src/quickcontrols/fluentwinui3/impl/SelectAllAction.qml new file mode 100644 index 0000000000..f60c29f560 --- /dev/null +++ b/src/quickcontrols/fluentwinui3/impl/SelectAllAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +SelectAllAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/fluentwinui3/impl/TextEditingContextMenu.qml b/src/quickcontrols/fluentwinui3/impl/TextEditingContextMenu.qml new file mode 100644 index 0000000000..2b921b6c59 --- /dev/null +++ b/src/quickcontrols/fluentwinui3/impl/TextEditingContextMenu.qml @@ -0,0 +1,31 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.FluentWinUI3 +import QtQuick.Controls.FluentWinUI3.impl as FluentWinUI3Impl + +Menu { + id: menu + popupType: Popup.Window + + required property var control + + FluentWinUI3Impl.CutAction { + control: menu.control + } + FluentWinUI3Impl.CopyAction { + control: menu.control + } + FluentWinUI3Impl.PasteAction { + control: menu.control + } + FluentWinUI3Impl.DeleteAction { + control: menu.control + } + + MenuSeparator {} + + FluentWinUI3Impl.SelectAllAction { + control: menu.control + } +} diff --git a/src/quickcontrols/fusion/TextArea.qml b/src/quickcontrols/fusion/TextArea.qml index 5e1ecfa905..20250656e0 100644 --- a/src/quickcontrols/fusion/TextArea.qml +++ b/src/quickcontrols/fusion/TextArea.qml @@ -25,6 +25,10 @@ T.TextArea { selectedTextColor: control.palette.highlightedText placeholderTextColor: control.palette.placeholderText + ContextMenu.menu: TextEditingContextMenu { + control: control + } + PlaceholderText { id: placeholder x: control.leftPadding diff --git a/src/quickcontrols/fusion/TextField.qml b/src/quickcontrols/fusion/TextField.qml index b358c668d8..dac0b3787b 100644 --- a/src/quickcontrols/fusion/TextField.qml +++ b/src/quickcontrols/fusion/TextField.qml @@ -24,6 +24,10 @@ T.TextField { placeholderTextColor: control.palette.placeholderText verticalAlignment: TextInput.AlignVCenter + ContextMenu.menu: TextEditingContextMenu { + control: control + } + PlaceholderText { id: placeholder x: control.leftPadding diff --git a/src/quickcontrols/fusion/impl/CMakeLists.txt b/src/quickcontrols/fusion/impl/CMakeLists.txt index 64ee4851fb..5f977f1193 100644 --- a/src/quickcontrols/fusion/impl/CMakeLists.txt +++ b/src/quickcontrols/fusion/impl/CMakeLists.txt @@ -8,10 +8,16 @@ set(qml_files "ButtonPanel.qml" "CheckIndicator.qml" + "CopyAction.qml" + "CutAction.qml" + "DeleteAction.qml" + "PasteAction.qml" "RadioIndicator.qml" + "SelectAllAction.qml" "SliderGroove.qml" "SliderHandle.qml" "SwitchIndicator.qml" + "TextEditingContextMenu.qml" ) qt_internal_add_qml_module(QuickControls2FusionStyleImpl diff --git a/src/quickcontrols/fusion/impl/CopyAction.qml b/src/quickcontrols/fusion/impl/CopyAction.qml new file mode 100644 index 0000000000..f6df184b08 --- /dev/null +++ b/src/quickcontrols/fusion/impl/CopyAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +CopyAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/fusion/impl/CutAction.qml b/src/quickcontrols/fusion/impl/CutAction.qml new file mode 100644 index 0000000000..9e5538d0e9 --- /dev/null +++ b/src/quickcontrols/fusion/impl/CutAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +CutAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/fusion/impl/DeleteAction.qml b/src/quickcontrols/fusion/impl/DeleteAction.qml new file mode 100644 index 0000000000..689be74b13 --- /dev/null +++ b/src/quickcontrols/fusion/impl/DeleteAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +DeleteAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/fusion/impl/PasteAction.qml b/src/quickcontrols/fusion/impl/PasteAction.qml new file mode 100644 index 0000000000..c68c86f5d2 --- /dev/null +++ b/src/quickcontrols/fusion/impl/PasteAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +PasteAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/fusion/impl/SelectAllAction.qml b/src/quickcontrols/fusion/impl/SelectAllAction.qml new file mode 100644 index 0000000000..f60c29f560 --- /dev/null +++ b/src/quickcontrols/fusion/impl/SelectAllAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +SelectAllAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/fusion/impl/TextEditingContextMenu.qml b/src/quickcontrols/fusion/impl/TextEditingContextMenu.qml new file mode 100644 index 0000000000..5149785c13 --- /dev/null +++ b/src/quickcontrols/fusion/impl/TextEditingContextMenu.qml @@ -0,0 +1,31 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.Fusion +import QtQuick.Controls.Fusion.impl as FusionImpl + +Menu { + id: menu + popupType: Popup.Window + + required property var control + + FusionImpl.CutAction { + control: menu.control + } + FusionImpl.CopyAction { + control: menu.control + } + FusionImpl.PasteAction { + control: menu.control + } + FusionImpl.DeleteAction { + control: menu.control + } + + MenuSeparator {} + + FusionImpl.SelectAllAction { + control: menu.control + } +} diff --git a/src/quickcontrols/imagine/TextArea.qml b/src/quickcontrols/imagine/TextArea.qml index d47ffffbd7..49492c72f7 100644 --- a/src/quickcontrols/imagine/TextArea.qml +++ b/src/quickcontrols/imagine/TextArea.qml @@ -33,6 +33,10 @@ T.TextArea { verticalAlignment: Qt.AlignVCenter placeholderTextColor: control.palette.placeholderText + ContextMenu.menu: TextEditingContextMenu { + control: control + } + PlaceholderText { id: placeholder x: control.leftPadding diff --git a/src/quickcontrols/imagine/TextField.qml b/src/quickcontrols/imagine/TextField.qml index 9c0ddd1f25..467e9cbad4 100644 --- a/src/quickcontrols/imagine/TextField.qml +++ b/src/quickcontrols/imagine/TextField.qml @@ -32,6 +32,10 @@ T.TextField { placeholderTextColor: control.palette.placeholderText verticalAlignment: Qt.AlignVCenter + ContextMenu.menu: TextEditingContextMenu { + control: control + } + PlaceholderText { id: placeholder x: control.leftPadding diff --git a/src/quickcontrols/imagine/impl/CMakeLists.txt b/src/quickcontrols/imagine/impl/CMakeLists.txt index 5dd12b5de5..08888f0d37 100644 --- a/src/quickcontrols/imagine/impl/CMakeLists.txt +++ b/src/quickcontrols/imagine/impl/CMakeLists.txt @@ -7,6 +7,7 @@ set(qml_files "OpacityMask.qml" + "TextEditingContextMenu.qml" ) qt_internal_add_qml_module(QuickControls2ImagineStyleImpl diff --git a/src/quickcontrols/imagine/impl/TextEditingContextMenu.qml b/src/quickcontrols/imagine/impl/TextEditingContextMenu.qml new file mode 100644 index 0000000000..5cf34cf978 --- /dev/null +++ b/src/quickcontrols/imagine/impl/TextEditingContextMenu.qml @@ -0,0 +1,31 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl +import QtQuick.Controls.Imagine + +Menu { + id: menu + popupType: Popup.Window + + required property var control + + CutAction { + control: menu.control + } + CopyAction { + control: menu.control + } + PasteAction { + control: menu.control + } + DeleteAction { + control: menu.control + } + + MenuSeparator {} + + SelectAllAction { + control: menu.control + } +} diff --git a/src/quickcontrols/ios/TextArea.qml b/src/quickcontrols/ios/TextArea.qml index 582af1bb64..e73356ef5d 100644 --- a/src/quickcontrols/ios/TextArea.qml +++ b/src/quickcontrols/ios/TextArea.qml @@ -25,6 +25,10 @@ T.TextArea { placeholderTextColor: control.palette.placeholderText cursorDelegate: CursorDelegate {} + ContextMenu.menu: TextEditingContextMenu { + control: control + } + PlaceholderText { id: placeholder x: control.leftPadding diff --git a/src/quickcontrols/ios/TextField.qml b/src/quickcontrols/ios/TextField.qml index 4b5a1fb48e..f3e2ae7740 100644 --- a/src/quickcontrols/ios/TextField.qml +++ b/src/quickcontrols/ios/TextField.qml @@ -27,6 +27,10 @@ T.TextField { verticalAlignment: Qt.AlignVCenter cursorDelegate: CursorDelegate {} + ContextMenu.menu: TextEditingContextMenu { + control: control + } + PlaceholderText { id: placeholder x: control.leftPadding diff --git a/src/quickcontrols/ios/impl/CMakeLists.txt b/src/quickcontrols/ios/impl/CMakeLists.txt index a19704ad11..b28e5f3970 100644 --- a/src/quickcontrols/ios/impl/CMakeLists.txt +++ b/src/quickcontrols/ios/impl/CMakeLists.txt @@ -6,8 +6,14 @@ ##################################################################### set(qml_files + "CopyAction.qml" "CursorDelegate.qml" + "CutAction.qml" + "DeleteAction.qml" "DialogButtonBoxDelegate.qml" + "PasteAction.qml" + "SelectAllAction.qml" + "TextEditingContextMenu.qml" ) qt_internal_add_qml_module(QuickControls2IOSStyleImpl diff --git a/src/quickcontrols/ios/impl/CopyAction.qml b/src/quickcontrols/ios/impl/CopyAction.qml new file mode 100644 index 0000000000..c66f2d605c --- /dev/null +++ b/src/quickcontrols/ios/impl/CopyAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +CopyAction { + icon.width: 19 + icon.height: 19 +} diff --git a/src/quickcontrols/ios/impl/CutAction.qml b/src/quickcontrols/ios/impl/CutAction.qml new file mode 100644 index 0000000000..c728dc0ef5 --- /dev/null +++ b/src/quickcontrols/ios/impl/CutAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +CutAction { + icon.width: 19 + icon.height: 19 +} diff --git a/src/quickcontrols/ios/impl/DeleteAction.qml b/src/quickcontrols/ios/impl/DeleteAction.qml new file mode 100644 index 0000000000..930a9dfcaf --- /dev/null +++ b/src/quickcontrols/ios/impl/DeleteAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +DeleteAction { + icon.width: 19 + icon.height: 19 +} diff --git a/src/quickcontrols/ios/impl/PasteAction.qml b/src/quickcontrols/ios/impl/PasteAction.qml new file mode 100644 index 0000000000..0ce258d2f9 --- /dev/null +++ b/src/quickcontrols/ios/impl/PasteAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +PasteAction { + icon.width: 19 + icon.height: 19 +} diff --git a/src/quickcontrols/ios/impl/SelectAllAction.qml b/src/quickcontrols/ios/impl/SelectAllAction.qml new file mode 100644 index 0000000000..481c3befe3 --- /dev/null +++ b/src/quickcontrols/ios/impl/SelectAllAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +SelectAllAction { + icon.width: 19 + icon.height: 19 +} diff --git a/src/quickcontrols/ios/impl/TextEditingContextMenu.qml b/src/quickcontrols/ios/impl/TextEditingContextMenu.qml new file mode 100644 index 0000000000..a70aa94299 --- /dev/null +++ b/src/quickcontrols/ios/impl/TextEditingContextMenu.qml @@ -0,0 +1,31 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.iOS +import QtQuick.Controls.iOS.impl as IOSImpl + +Menu { + id: menu + popupType: Popup.Native + + required property var control + + IOSImpl.CutAction { + control: menu.control + } + IOSImpl.CopyAction { + control: menu.control + } + IOSImpl.PasteAction { + control: menu.control + } + IOSImpl.DeleteAction { + control: menu.control + } + + MenuSeparator {} + + IOSImpl.SelectAllAction { + control: menu.control + } +} diff --git a/src/quickcontrols/macos/TextArea.qml b/src/quickcontrols/macos/TextArea.qml index 9dbd0863bd..8486c3b95d 100644 --- a/src/quickcontrols/macos/TextArea.qml +++ b/src/quickcontrols/macos/TextArea.qml @@ -3,6 +3,12 @@ import QtQuick import QtQuick.NativeStyle as NativeStyle +import QtQuick.Controls.macOS.impl NativeStyle.DefaultTextArea { + id: control + + ContextMenu.menu: TextEditingContextMenu { + control: control + } } diff --git a/src/quickcontrols/macos/TextField.qml b/src/quickcontrols/macos/TextField.qml index 041b218a13..e87b435881 100644 --- a/src/quickcontrols/macos/TextField.qml +++ b/src/quickcontrols/macos/TextField.qml @@ -3,8 +3,13 @@ import QtQuick import QtQuick.NativeStyle as NativeStyle +import QtQuick.Controls.macOS.impl NativeStyle.DefaultTextField { id: control readonly property Item __focusFrameTarget: control + + ContextMenu.menu: TextEditingContextMenu { + control: control + } } diff --git a/src/quickcontrols/macos/impl/CMakeLists.txt b/src/quickcontrols/macos/impl/CMakeLists.txt index 3e0a5af8be..6456feff2d 100644 --- a/src/quickcontrols/macos/impl/CMakeLists.txt +++ b/src/quickcontrols/macos/impl/CMakeLists.txt @@ -3,8 +3,14 @@ set(qml_files "CheckIndicator.qml" + "CopyAction.qml" + "CutAction.qml" + "DeleteAction.qml" + "PasteAction.qml" + "SelectAllAction.qml" "SwitchHandle.qml" "SwitchIndicator.qml" + "TextEditingContextMenu.qml" ) qt_internal_add_qml_module(QuickControls2MacOSStyleImpl diff --git a/src/quickcontrols/macos/impl/CopyAction.qml b/src/quickcontrols/macos/impl/CopyAction.qml new file mode 100644 index 0000000000..f6df184b08 --- /dev/null +++ b/src/quickcontrols/macos/impl/CopyAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +CopyAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/macos/impl/CutAction.qml b/src/quickcontrols/macos/impl/CutAction.qml new file mode 100644 index 0000000000..9e5538d0e9 --- /dev/null +++ b/src/quickcontrols/macos/impl/CutAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +CutAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/macos/impl/DeleteAction.qml b/src/quickcontrols/macos/impl/DeleteAction.qml new file mode 100644 index 0000000000..689be74b13 --- /dev/null +++ b/src/quickcontrols/macos/impl/DeleteAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +DeleteAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/macos/impl/PasteAction.qml b/src/quickcontrols/macos/impl/PasteAction.qml new file mode 100644 index 0000000000..c68c86f5d2 --- /dev/null +++ b/src/quickcontrols/macos/impl/PasteAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +PasteAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/macos/impl/SelectAllAction.qml b/src/quickcontrols/macos/impl/SelectAllAction.qml new file mode 100644 index 0000000000..f60c29f560 --- /dev/null +++ b/src/quickcontrols/macos/impl/SelectAllAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +SelectAllAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/macos/impl/TextEditingContextMenu.qml b/src/quickcontrols/macos/impl/TextEditingContextMenu.qml new file mode 100644 index 0000000000..4b3bd75609 --- /dev/null +++ b/src/quickcontrols/macos/impl/TextEditingContextMenu.qml @@ -0,0 +1,31 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.macOS +import QtQuick.Controls.macOS.impl as MacOSImpl + +Menu { + id: menu + popupType: Popup.Window + + required property var control + + MacOSImpl.CutAction { + control: menu.control + } + MacOSImpl.CopyAction { + control: menu.control + } + MacOSImpl.PasteAction { + control: menu.control + } + MacOSImpl.DeleteAction { + control: menu.control + } + + MenuSeparator {} + + MacOSImpl.SelectAllAction { + control: menu.control + } +} diff --git a/src/quickcontrols/material/TextArea.qml b/src/quickcontrols/material/TextArea.qml index 99efa222cf..eadaceca66 100644 --- a/src/quickcontrols/material/TextArea.qml +++ b/src/quickcontrols/material/TextArea.qml @@ -38,6 +38,10 @@ T.TextArea { Material.containerStyle: Material.Outlined + ContextMenu.menu: TextEditingContextMenu { + control: control + } + cursorDelegate: CursorDelegate { } FloatingPlaceholderText { diff --git a/src/quickcontrols/material/TextField.qml b/src/quickcontrols/material/TextField.qml index 9294146fac..94b1a61a5f 100644 --- a/src/quickcontrols/material/TextField.qml +++ b/src/quickcontrols/material/TextField.qml @@ -38,6 +38,10 @@ T.TextField { Material.containerStyle: Material.Outlined + ContextMenu.menu: TextEditingContextMenu { + control: control + } + cursorDelegate: CursorDelegate { } FloatingPlaceholderText { diff --git a/src/quickcontrols/material/impl/CMakeLists.txt b/src/quickcontrols/material/impl/CMakeLists.txt index 774655c2ff..8132444e1d 100644 --- a/src/quickcontrols/material/impl/CMakeLists.txt +++ b/src/quickcontrols/material/impl/CMakeLists.txt @@ -15,6 +15,7 @@ set(qml_files "RoundedElevationEffect.qml" "SliderHandle.qml" "SwitchIndicator.qml" + "TextEditingContextMenu.qml" ) qt_internal_add_qml_module(QuickControls2MaterialStyleImpl diff --git a/src/quickcontrols/material/impl/TextEditingContextMenu.qml b/src/quickcontrols/material/impl/TextEditingContextMenu.qml new file mode 100644 index 0000000000..0d6e9bae23 --- /dev/null +++ b/src/quickcontrols/material/impl/TextEditingContextMenu.qml @@ -0,0 +1,31 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl +import QtQuick.Controls.Material + +Menu { + id: menu + popupType: Popup.Window + + required property var control + + CutAction { + control: menu.control + } + CopyAction { + control: menu.control + } + PasteAction { + control: menu.control + } + DeleteAction { + control: menu.control + } + + MenuSeparator {} + + SelectAllAction { + control: menu.control + } +} diff --git a/src/quickcontrols/universal/TextArea.qml b/src/quickcontrols/universal/TextArea.qml index 8a3cdd1119..af732a7990 100644 --- a/src/quickcontrols/universal/TextArea.qml +++ b/src/quickcontrols/universal/TextArea.qml @@ -5,6 +5,7 @@ import QtQuick import QtQuick.Templates as T import QtQuick.Controls.impl import QtQuick.Controls.Universal +import QtQuick.Controls.Universal.impl T.TextArea { id: control @@ -31,6 +32,10 @@ T.TextArea { activeFocus ? Universal.chromeBlackMediumLowColor : Universal.baseMediumColor + ContextMenu.menu: TextEditingContextMenu { + control: control + } + PlaceholderText { id: placeholder x: control.leftPadding diff --git a/src/quickcontrols/universal/TextField.qml b/src/quickcontrols/universal/TextField.qml index fb20779156..3fa58a2dc6 100644 --- a/src/quickcontrols/universal/TextField.qml +++ b/src/quickcontrols/universal/TextField.qml @@ -5,6 +5,7 @@ import QtQuick import QtQuick.Templates as T import QtQuick.Controls.impl import QtQuick.Controls.Universal +import QtQuick.Controls.Universal.impl T.TextField { id: control @@ -31,6 +32,10 @@ T.TextField { Universal.baseMediumColor verticalAlignment: TextInput.AlignVCenter + ContextMenu.menu: TextEditingContextMenu { + control: control + } + PlaceholderText { id: placeholder x: control.leftPadding diff --git a/src/quickcontrols/universal/impl/CMakeLists.txt b/src/quickcontrols/universal/impl/CMakeLists.txt index 3bbd8e5b21..faf79407fc 100644 --- a/src/quickcontrols/universal/impl/CMakeLists.txt +++ b/src/quickcontrols/universal/impl/CMakeLists.txt @@ -7,8 +7,14 @@ set(qml_files "CheckIndicator.qml" + "CopyAction.qml" + "CutAction.qml" + "DeleteAction.qml" + "PasteAction.qml" "RadioIndicator.qml" + "SelectAllAction.qml" "SwitchIndicator.qml" + "TextEditingContextMenu.qml" ) qt_internal_add_qml_module(QuickControls2UniversalStyleImpl diff --git a/src/quickcontrols/universal/impl/CopyAction.qml b/src/quickcontrols/universal/impl/CopyAction.qml new file mode 100644 index 0000000000..dbdc61c102 --- /dev/null +++ b/src/quickcontrols/universal/impl/CopyAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +CopyAction { + icon.width: 20 + icon.height: 20 +} diff --git a/src/quickcontrols/universal/impl/CutAction.qml b/src/quickcontrols/universal/impl/CutAction.qml new file mode 100644 index 0000000000..b0ac71f999 --- /dev/null +++ b/src/quickcontrols/universal/impl/CutAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +CutAction { + icon.width: 20 + icon.height: 20 +} diff --git a/src/quickcontrols/universal/impl/DeleteAction.qml b/src/quickcontrols/universal/impl/DeleteAction.qml new file mode 100644 index 0000000000..08455c27c9 --- /dev/null +++ b/src/quickcontrols/universal/impl/DeleteAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +DeleteAction { + icon.width: 20 + icon.height: 20 +} diff --git a/src/quickcontrols/universal/impl/PasteAction.qml b/src/quickcontrols/universal/impl/PasteAction.qml new file mode 100644 index 0000000000..8708871186 --- /dev/null +++ b/src/quickcontrols/universal/impl/PasteAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +PasteAction { + icon.width: 20 + icon.height: 20 +} diff --git a/src/quickcontrols/universal/impl/SelectAllAction.qml b/src/quickcontrols/universal/impl/SelectAllAction.qml new file mode 100644 index 0000000000..81246703bd --- /dev/null +++ b/src/quickcontrols/universal/impl/SelectAllAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +SelectAllAction { + icon.width: 20 + icon.height: 20 +} diff --git a/src/quickcontrols/universal/impl/TextEditingContextMenu.qml b/src/quickcontrols/universal/impl/TextEditingContextMenu.qml new file mode 100644 index 0000000000..6e666bc432 --- /dev/null +++ b/src/quickcontrols/universal/impl/TextEditingContextMenu.qml @@ -0,0 +1,31 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.Universal +import QtQuick.Controls.Universal.impl as UniversalImpl + +Menu { + id: menu + popupType: Popup.Window + + required property var control + + UniversalImpl.CutAction { + control: menu.control + } + UniversalImpl.CopyAction { + control: menu.control + } + UniversalImpl.PasteAction { + control: menu.control + } + UniversalImpl.DeleteAction { + control: menu.control + } + + MenuSeparator {} + + UniversalImpl.SelectAllAction { + control: menu.control + } +} diff --git a/src/quickcontrols/windows/TextArea.qml b/src/quickcontrols/windows/TextArea.qml index 9dbd0863bd..b9cd7c5a9b 100644 --- a/src/quickcontrols/windows/TextArea.qml +++ b/src/quickcontrols/windows/TextArea.qml @@ -3,6 +3,12 @@ import QtQuick import QtQuick.NativeStyle as NativeStyle +import QtQuick.Controls.Windows.impl as WindowsImpl NativeStyle.DefaultTextArea { + id: control + + ContextMenu.menu: WindowsImpl.TextEditingContextMenu { + control: control + } } diff --git a/src/quickcontrols/windows/TextField.qml b/src/quickcontrols/windows/TextField.qml index 1cedb17389..e62bfe5e90 100644 --- a/src/quickcontrols/windows/TextField.qml +++ b/src/quickcontrols/windows/TextField.qml @@ -3,6 +3,12 @@ import QtQuick import QtQuick.NativeStyle as NativeStyle +import QtQuick.Controls.Windows.impl NativeStyle.DefaultTextField { + id: control + + ContextMenu.menu: TextEditingContextMenu { + control: control + } } diff --git a/src/quickcontrols/windows/impl/CMakeLists.txt b/src/quickcontrols/windows/impl/CMakeLists.txt index 8b86db1fa3..fc16acd0e5 100644 --- a/src/quickcontrols/windows/impl/CMakeLists.txt +++ b/src/quickcontrols/windows/impl/CMakeLists.txt @@ -3,7 +3,13 @@ set(qml_files "CheckIndicator.qml" + "CopyAction.qml" + "CutAction.qml" + "DeleteAction.qml" + "PasteAction.qml" + "SelectAllAction.qml" "SwitchIndicator.qml" + "TextEditingContextMenu.qml" ) qt_internal_add_qml_module(QuickControls2WindowsStyleImpl diff --git a/src/quickcontrols/windows/impl/CopyAction.qml b/src/quickcontrols/windows/impl/CopyAction.qml new file mode 100644 index 0000000000..f6df184b08 --- /dev/null +++ b/src/quickcontrols/windows/impl/CopyAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +CopyAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/windows/impl/CutAction.qml b/src/quickcontrols/windows/impl/CutAction.qml new file mode 100644 index 0000000000..9e5538d0e9 --- /dev/null +++ b/src/quickcontrols/windows/impl/CutAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +CutAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/windows/impl/DeleteAction.qml b/src/quickcontrols/windows/impl/DeleteAction.qml new file mode 100644 index 0000000000..689be74b13 --- /dev/null +++ b/src/quickcontrols/windows/impl/DeleteAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +DeleteAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/windows/impl/PasteAction.qml b/src/quickcontrols/windows/impl/PasteAction.qml new file mode 100644 index 0000000000..c68c86f5d2 --- /dev/null +++ b/src/quickcontrols/windows/impl/PasteAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +PasteAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/windows/impl/SelectAllAction.qml b/src/quickcontrols/windows/impl/SelectAllAction.qml new file mode 100644 index 0000000000..f60c29f560 --- /dev/null +++ b/src/quickcontrols/windows/impl/SelectAllAction.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.impl + +SelectAllAction { + icon.width: 16 + icon.height: 16 +} diff --git a/src/quickcontrols/windows/impl/TextEditingContextMenu.qml b/src/quickcontrols/windows/impl/TextEditingContextMenu.qml new file mode 100644 index 0000000000..4f92d894f1 --- /dev/null +++ b/src/quickcontrols/windows/impl/TextEditingContextMenu.qml @@ -0,0 +1,31 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick.Controls.Windows +import QtQuick.Controls.Windows.impl as WindowsImpl + +Menu { + id: menu + popupType: Popup.Window + + required property var control + + WindowsImpl.CutAction { + control: menu.control + } + WindowsImpl.CopyAction { + control: menu.control + } + WindowsImpl.PasteAction { + control: menu.control + } + WindowsImpl.DeleteAction { + control: menu.control + } + + MenuSeparator {} + + WindowsImpl.SelectAllAction { + control: menu.control + } +} diff --git a/src/quickcontrolsimpl/CMakeLists.txt b/src/quickcontrolsimpl/CMakeLists.txt index f50e671ce9..21cb16706d 100644 --- a/src/quickcontrolsimpl/CMakeLists.txt +++ b/src/quickcontrolsimpl/CMakeLists.txt @@ -31,6 +31,12 @@ qt_internal_add_qml_module(QuickControls2Impl qquickplaceholdertext.cpp qquickplaceholdertext_p.h qquickplatformtheme.cpp qquickplatformtheme_p.h qtquickcontrols2implglobal_p.h + QML_FILES + CopyAction.qml + CutAction.qml + DeleteAction.qml + PasteAction.qml + SelectAllAction.qml DEFINES QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII diff --git a/src/quickcontrolsimpl/CopyAction.qml b/src/quickcontrolsimpl/CopyAction.qml new file mode 100644 index 0000000000..3ee11a9478 --- /dev/null +++ b/src/quickcontrolsimpl/CopyAction.qml @@ -0,0 +1,17 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick +import QtQuick.Templates as T + +T.Action { + text: qsTr("Copy") + icon.name: "edit-copy" + icon.width: 24 + icon.height: 24 + shortcut: StandardKey.Copy + enabled: control.selectedText.length > 0 && control.hasOwnProperty("copy") + onTriggered: control.copy() + + required property var control +} diff --git a/src/quickcontrolsimpl/CutAction.qml b/src/quickcontrolsimpl/CutAction.qml new file mode 100644 index 0000000000..7329a70e94 --- /dev/null +++ b/src/quickcontrolsimpl/CutAction.qml @@ -0,0 +1,24 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick +import QtQuick.Templates as T + +T.Action { + text: qsTr("Cut") + icon.name: "edit-cut" + // A few styles use these values, so set them as our default + // so that they can simply use us instead of defining their own actions. + icon.width: 24 + icon.height: 24 + // This ensures that QIOSMenu::filterFirstResponderActions filters out any + // duplicate actions (at least when QT_NO_SHORTCUT is not defined). + shortcut: StandardKey.Cut + // If the control has no cut property, Qt was built without clipboard support. + enabled: !control.readOnly && control.selectedText.length > 0 && control.hasOwnProperty("cut") + onTriggered: control.cut() + + // Can't be T.Control because otherwise it would fail to assign TextField/TextArea to it, + // and we'd need TextFieldCutAction and TextAreaCutAction. + required property var control +} diff --git a/src/quickcontrolsimpl/DeleteAction.qml b/src/quickcontrolsimpl/DeleteAction.qml new file mode 100644 index 0000000000..bbc88a9130 --- /dev/null +++ b/src/quickcontrolsimpl/DeleteAction.qml @@ -0,0 +1,17 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick +import QtQuick.Templates as T + +T.Action { + text: qsTr("Delete") + icon.name: "edit-delete" + icon.width: 24 + icon.height: 24 + shortcut: StandardKey.Delete + enabled: !control.readOnly && control.selectedText.length > 0 + onTriggered: control.remove(control.selectionStart, control.selectionEnd) + + required property var control +} diff --git a/src/quickcontrolsimpl/PasteAction.qml b/src/quickcontrolsimpl/PasteAction.qml new file mode 100644 index 0000000000..ad6ed5be5b --- /dev/null +++ b/src/quickcontrolsimpl/PasteAction.qml @@ -0,0 +1,17 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick +import QtQuick.Templates as T + +T.Action { + text: qsTr("Paste") + icon.name: "edit-paste" + icon.width: 24 + icon.height: 24 + shortcut: StandardKey.Paste + enabled: !control.readOnly && control.hasOwnProperty("paste") + onTriggered: control.paste() + + required property var control +} diff --git a/src/quickcontrolsimpl/SelectAllAction.qml b/src/quickcontrolsimpl/SelectAllAction.qml new file mode 100644 index 0000000000..63c56f6694 --- /dev/null +++ b/src/quickcontrolsimpl/SelectAllAction.qml @@ -0,0 +1,16 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +import QtQuick +import QtQuick.Templates as T + +T.Action { + text: qsTr("Select All") + icon.name: "edit-select-all" + icon.width: 24 + icon.height: 24 + shortcut: StandardKey.SelectAll + onTriggered: control.selectAll() + + required property var control +} diff --git a/src/quicktemplates/qquickcontextmenu.cpp b/src/quicktemplates/qquickcontextmenu.cpp index de78882024..6fa3b134aa 100644 --- a/src/quicktemplates/qquickcontextmenu.cpp +++ b/src/quicktemplates/qquickcontextmenu.cpp @@ -11,6 +11,9 @@ #include <QtQuick/private/qquickitem_p.h> #include <QtQuickTemplates2/private/qquickdeferredexecute_p_p.h> #include <QtQuickTemplates2/private/qquickmenu_p.h> +#include <QtQuickTemplates2/private/qquickmenu_p_p.h> +#include <QtQuickTemplates2/private/qquicktextarea_p.h> +#include <QtQuickTemplates2/private/qquicktextfield_p.h> QT_BEGIN_NAMESPACE @@ -227,6 +230,14 @@ bool QQuickContextMenu::event(QEvent *event) return QObject::event(event); } + // On platforms like iOS, we want to use the native edit menu. + // TODO: test this on Android and desktop platforms (with popupType: Popup.Native) + if (menu && QQuickMenuPrivate::get(menu)->resolvedPopupType() == QQuickPopup::Native + && (qobject_cast<const QQuickTextField *>(attacheeItem) + || qobject_cast<const QQuickTextArea *>(attacheeItem))) { + QQuickMenuPrivate::get(menu)->makeEditMenu(); + } + menu->setParentItem(attacheeItem); qCDebug(lcContextMenu) << this << "showing" << menu << "at" << posRelativeToParent; diff --git a/src/quicktemplates/qquickmenu.cpp b/src/quicktemplates/qquickmenu.cpp index 57ae158182..c3d86ea73c 100644 --- a/src/quicktemplates/qquickmenu.cpp +++ b/src/quicktemplates/qquickmenu.cpp @@ -657,6 +657,12 @@ void QQuickMenuPrivate::setNativeMenuVisible(bool visible) } } +// Used by QQuickContextMenu when it's opened on a text-editing control. +void QQuickMenuPrivate::makeEditMenu() +{ + handle->setMenuType(QPlatformMenu::EditMenu); +} + QQuickItem *QQuickMenuPrivate::itemAt(int index) const { return qobject_cast<QQuickItem *>(contentModel->get(index)); diff --git a/src/quicktemplates/qquickmenu_p_p.h b/src/quicktemplates/qquickmenu_p_p.h index 3f652dcbef..1ceb2b8284 100644 --- a/src/quicktemplates/qquickmenu_p_p.h +++ b/src/quicktemplates/qquickmenu_p_p.h @@ -57,6 +57,8 @@ public: static void recursivelyDestroyNativeSubMenus(QQuickMenu *menu); void setNativeMenuVisible(bool visible); + void makeEditMenu(); + QQuickItem *itemAt(int index) const; void insertItem(int index, QQuickItem *item); void maybeCreateAndInsertNativeItem(int index, QQuickItem *item); diff --git a/src/quicktemplates/qquickpopupwindow.cpp b/src/quicktemplates/qquickpopupwindow.cpp index 643971a560..02529ecb3d 100644 --- a/src/quicktemplates/qquickpopupwindow.cpp +++ b/src/quicktemplates/qquickpopupwindow.cpp @@ -70,7 +70,7 @@ QQuickPopupWindow::QQuickPopupWindow(QQuickPopup *popup, QWindow *parent) setFlags(flags); - qCDebug(lcPopupWindow) << "Created popup window with parent:" << parent << "flags:" << flags; + qCDebug(lcPopupWindow) << "Created popup window" << this << "with parent" << parent; } QQuickPopup *QQuickPopupWindow::popup() const |
