diff options
author | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2024-06-11 13:21:32 +0300 |
---|---|---|
committer | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2024-06-11 13:31:01 +0300 |
commit | 3cd4e0aa7961889eb06374885ed648f5b9bd85bc (patch) | |
tree | 6a089aedea155b1f1a74b553f4d1b57c70554a8f /src/webenginewidgets | |
parent | 6d029165d1593c514db08c34d6b08a00a4435d5e (diff) | |
parent | 38063a6332b9f948a0381763271e9a9ac7af0999 (diff) |
Merge tag 'v6.2.9-lts' into tqtc/lts-6.2-opensource6.2.9
Qt 6.2.9-lts release
Conflicts solved:
dependencies.yaml
examples/webenginewidgets/push-notifications/CMakeLists.txt
Change-Id: I0127c2575369f6939df89f3301659470d481b9bf
Diffstat (limited to 'src/webenginewidgets')
-rw-r--r-- | src/webenginewidgets/CMakeLists.txt | 12 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview.cpp | 61 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview.h | 2 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview_p.h | 9 | ||||
-rw-r--r-- | src/webenginewidgets/doc/snippets/push-notifications/commands | 19 | ||||
-rw-r--r-- | src/webenginewidgets/doc/snippets/simple/main.cpp | 11 | ||||
-rw-r--r-- | src/webenginewidgets/doc/src/qtwebenginewidgets-module.qdoc | 5 | ||||
-rw-r--r-- | src/webenginewidgets/doc/src/qwebengineview_lgpl.qdoc | 2 | ||||
-rw-r--r-- | src/webenginewidgets/plugins/qwebengineview/CMakeLists.txt | 3 | ||||
-rw-r--r-- | src/webenginewidgets/qwebengine_accessible.cpp | 4 | ||||
-rw-r--r-- | src/webenginewidgets/qwebengine_accessible.h | 7 | ||||
-rw-r--r-- | src/webenginewidgets/ui/touchhandlewidget.cpp | 59 | ||||
-rw-r--r-- | src/webenginewidgets/ui/touchhandlewidget_p.h | 50 | ||||
-rw-r--r-- | src/webenginewidgets/ui/touchselectionmenuwidget.cpp | 117 | ||||
-rw-r--r-- | src/webenginewidgets/ui/touchselectionmenuwidget_p.h | 52 |
15 files changed, 394 insertions, 19 deletions
diff --git a/src/webenginewidgets/CMakeLists.txt b/src/webenginewidgets/CMakeLists.txt index 97bde6b56..f9365adc9 100644 --- a/src/webenginewidgets/CMakeLists.txt +++ b/src/webenginewidgets/CMakeLists.txt @@ -1,3 +1,6 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + if(TARGET Qt::Designer) add_subdirectory(plugins/qwebengineview) else() @@ -8,13 +11,15 @@ qt_internal_add_module(WebEngineWidgets api/qtwebenginewidgetsglobal.h api/qwebenginenotificationpresenter.cpp api/qwebenginenotificationpresenter_p.h api/qwebengineview.cpp api/qwebengineview.h api/qwebengineview_p.h - qwebengine_accessible.cpp qwebengine_accessible.h ui/autofillpopupwidget.cpp ui/autofillpopupwidget_p.h + ui/touchhandlewidget.cpp ui/touchhandlewidget_p.h + ui/touchselectionmenuwidget.cpp ui/touchselectionmenuwidget_p.h DEFINES QT_BUILD_WEBENGINEWIDGETS_LIB INCLUDE_DIRECTORIES ../core api + ui LIBRARIES Qt::CorePrivate Qt::GuiPrivate @@ -29,6 +34,11 @@ qt_internal_add_module(WebEngineWidgets Qt::WebEngineCore ) +qt_internal_extend_target(WebEngineWidgets CONDITION QT_FEATURE_accessibility + SOURCES + qwebengine_accessible.cpp qwebengine_accessible.h +) + qt_internal_extend_target(WebEngineWidgets CONDITION QT_FEATURE_webengine_printing_and_pdf PUBLIC_LIBRARIES Qt::PrintSupport diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp index b9aef4a38..35fb98138 100644 --- a/src/webenginewidgets/api/qwebengineview.cpp +++ b/src/webenginewidgets/api/qwebengineview.cpp @@ -6,8 +6,9 @@ #include "qwebengineview_p.h" #include "render_widget_host_view_qt_delegate_client.h" #include "render_widget_host_view_qt_delegate_item.h" -#include "qwebengine_accessible.h" #include "ui/autofillpopupwidget_p.h" +#include "touchhandlewidget_p.h" +#include "touchselectionmenuwidget_p.h" #include <QtWebEngineCore/private/qwebenginepage_p.h> #include <QtWebEngineCore/qwebenginecontextmenurequest.h> @@ -17,6 +18,7 @@ #include "autofill_popup_controller.h" #include "color_chooser_controller.h" +#include "touch_selection_menu_controller.h" #include "web_contents_adapter.h" #include <QContextMenuEvent> @@ -28,6 +30,10 @@ #include <QGuiApplication> #include <QQuickWidget> +#if QT_CONFIG(accessibility) +#include "qwebengine_accessible.h" +#endif + #if QT_CONFIG(action) #include <QAction> #endif @@ -57,6 +63,7 @@ #if QT_CONFIG(webengine_printing_and_pdf) #include "printing/printer_worker.h" +#include <QPrintEngine> #include <QPrinter> #include <QThread> #endif @@ -807,7 +814,11 @@ void QWebEngineViewPrivate::didPrintPage(QPrinter *¤tPrinter, QSharedPoint printerWorker->m_documentCopies = currentPrinter->copyCount(); printerWorker->m_collateCopies = currentPrinter->collateCopies(); - QObject::connect(printerWorker, &QtWebEngineCore::PrinterWorker::resultReady, q, [q, ¤tPrinter](bool success) { + int oldCopyCount = currentPrinter->copyCount(); + currentPrinter->printEngine()->setProperty(QPrintEngine::PPK_CopyCount, 1); + + QObject::connect(printerWorker, &QtWebEngineCore::PrinterWorker::resultReady, q, [q, ¤tPrinter, oldCopyCount](bool success) { + currentPrinter->printEngine()->setProperty(QPrintEngine::PPK_CopyCount, oldCopyCount); currentPrinter = nullptr; Q_EMIT q->printFinished(success); }); @@ -1397,6 +1408,9 @@ void QWebEngineView::printToPdf(const std::function<void(const QByteArray&)> &re \note Printing runs on the browser process, which is by default not sandboxed. + \note The data generation step of printing can be interrupted for a short period of time using + the \l QWebEnginePage::Stop web action. + \note This function rasterizes the result when rendering onto \a printer. Please consider raising the default resolution of \a printer to at least 300 DPI or using printToPdf() to produce PDF file output more effectively. @@ -1591,6 +1605,49 @@ bool QContextMenuBuilder::isMenuItemEnabled(ContextMenuItem menuItem) } #endif // QT_CONFIG(action) +QtWebEngineCore::TouchHandleDrawableDelegate * +QWebEngineViewPrivate::createTouchHandleDelegate(const QMap<int, QImage> &images) +{ + Q_Q(QWebEngineView); + return new QtWebEngineWidgetUI::TouchHandleWidget(q, images); +} + +void QWebEngineViewPrivate::hideTouchSelectionMenu() +{ + if (m_touchSelectionMenu) + m_touchSelectionMenu->close(); +} + +void QWebEngineViewPrivate::showTouchSelectionMenu( + QtWebEngineCore::TouchSelectionMenuController *controller, const QRect &selectionBounds) +{ + Q_ASSERT(m_touchSelectionMenu == nullptr); + Q_Q(QWebEngineView); + + // Do not show outside of view + QSize parentSize = q->nativeParentWidget() ? q->nativeParentWidget()->size() : q->size(); + if (selectionBounds.x() < 0 || selectionBounds.x() > parentSize.width() + || selectionBounds.y() < 0 || selectionBounds.y() > parentSize.height()) + return; + + m_touchSelectionMenu = new QtWebEngineWidgetUI::TouchSelectionMenuWidget(q, controller); + + const int kSpacingBetweenButtons = 2; + const int kMenuButtonMinWidth = 80; + const int kMenuButtonMinHeight = 40; + + int buttonCount = controller->buttonCount(); + int width = (kSpacingBetweenButtons * (buttonCount + 1)) + (kMenuButtonMinWidth * buttonCount); + int height = kMenuButtonMinHeight + kSpacingBetweenButtons; + int x = (selectionBounds.x() + selectionBounds.x() + selectionBounds.width() - width) / 2; + int y = selectionBounds.y() - height - 2; + + QPoint pos = q->mapToGlobal(QPoint(x, y)); + + m_touchSelectionMenu->setGeometry(pos.x(), pos.y(), width, height); + m_touchSelectionMenu->show(); +} + QT_END_NAMESPACE #include "moc_qwebengineview.cpp" diff --git a/src/webenginewidgets/api/qwebengineview.h b/src/webenginewidgets/api/qwebengineview.h index 379fcae75..dc1393885 100644 --- a/src/webenginewidgets/api/qwebengineview.h +++ b/src/webenginewidgets/api/qwebengineview.h @@ -19,7 +19,6 @@ class AutofillPopupWidget; QT_BEGIN_NAMESPACE class QContextMenuEvent; -class QMenu; class QPrinter; class QUrl; class QWebEngineContextMenuRequest; @@ -28,6 +27,7 @@ class QWebEngineHttpRequest; class QWebEngineSettings; class QWebEngineViewAccessible; class QWebEngineViewPrivate; +class QMenu; class QWEBENGINEWIDGETS_EXPORT QWebEngineView : public QWidget { diff --git a/src/webenginewidgets/api/qwebengineview_p.h b/src/webenginewidgets/api/qwebengineview_p.h index 7855f9ef3..7c0f3fe60 100644 --- a/src/webenginewidgets/api/qwebengineview_p.h +++ b/src/webenginewidgets/api/qwebengineview_p.h @@ -25,10 +25,13 @@ class QWebEngineContextMenuRequest; class WebEngineQuickWidget; class RenderWidgetHostViewQtDelegate; class RenderWidgetHostViewQtDelegateClient; +class TouchSelectionMenuController; } namespace QtWebEngineWidgetUI { class AutofillPopupWidget; +class TouchHandleDrawableDelegate; +class TouchSelectionMenuWidget; } QT_BEGIN_NAMESPACE @@ -71,7 +74,12 @@ public: void showAutofillPopup(QtWebEngineCore::AutofillPopupController *controller, const QRect &bounds, bool autoselectFirstSuggestion) override; void hideAutofillPopup() override; + QtWebEngineCore::TouchHandleDrawableDelegate * + createTouchHandleDelegate(const QMap<int, QImage> &images) override; + void showTouchSelectionMenu(QtWebEngineCore::TouchSelectionMenuController *, + const QRect &) override; + void hideTouchSelectionMenu() override; QWebEngineViewPrivate(); virtual ~QWebEngineViewPrivate(); static void bindPageAndView(QWebEnginePage *page, QWebEngineView *view); @@ -90,6 +98,7 @@ public: mutable bool m_ownsPage; QWebEngineContextMenuRequest *m_contextRequest; QScopedPointer<QtWebEngineWidgetUI::AutofillPopupWidget> m_autofillPopupWidget; + QPointer<QtWebEngineWidgetUI::TouchSelectionMenuWidget> m_touchSelectionMenu; }; class QContextMenuBuilder : public QtWebEngineCore::RenderViewContextMenuQt diff --git a/src/webenginewidgets/doc/snippets/push-notifications/commands b/src/webenginewidgets/doc/snippets/push-notifications/commands new file mode 100644 index 000000000..aee9761c1 --- /dev/null +++ b/src/webenginewidgets/doc/snippets/push-notifications/commands @@ -0,0 +1,19 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +//! [0] +npm init -y +npm install web-push express +//! [0] + +//! [1] +"start": "node server.js" +//! [1] + +//! [2] +./node_odules/.bin/web-push generate-vapid-keys +//! [2] + +//! [3] +npm start +//! [3] diff --git a/src/webenginewidgets/doc/snippets/simple/main.cpp b/src/webenginewidgets/doc/snippets/simple/main.cpp index f887aabaa..08613906b 100644 --- a/src/webenginewidgets/doc/snippets/simple/main.cpp +++ b/src/webenginewidgets/doc/snippets/simple/main.cpp @@ -1,18 +1,19 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause +//! [Minimal Example] #include <QApplication> -#include <QUrl> #include <QWebEngineView> int main(int argc, char *argv[]) { QApplication app(argc, argv); - QWidget *parent = nullptr; //! [Using QWebEngineView] - QWebEngineView *view = new QWebEngineView(parent); - view->load(QUrl("http://qt-project.org/")); - view->show(); + QWebEngineView view; + view.load(QUrl("https://qt-project.org/")); + view.resize(1024, 750); + view.show(); //! [Using QWebEngineView] return app.exec(); } +//! [Minimal Example] diff --git a/src/webenginewidgets/doc/src/qtwebenginewidgets-module.qdoc b/src/webenginewidgets/doc/src/qtwebenginewidgets-module.qdoc index df06909df..ef5a1c4b5 100644 --- a/src/webenginewidgets/doc/src/qtwebenginewidgets-module.qdoc +++ b/src/webenginewidgets/doc/src/qtwebenginewidgets-module.qdoc @@ -24,4 +24,9 @@ \snippet qtwebenginewidgets_build_snippet.qdoc 2 \endif + + The minimum amount of code needed to load and display an HTML page requires just + implementing the \c QWebEngineView class. + + \snippet simple/main.cpp Minimal Example */ diff --git a/src/webenginewidgets/doc/src/qwebengineview_lgpl.qdoc b/src/webenginewidgets/doc/src/qwebengineview_lgpl.qdoc index 14e6c3ed8..84f71cf10 100644 --- a/src/webenginewidgets/doc/src/qwebengineview_lgpl.qdoc +++ b/src/webenginewidgets/doc/src/qwebengineview_lgpl.qdoc @@ -61,7 +61,7 @@ new windows, such as pop-up windows, you can subclass QWebEngineView and reimplement the createWindow() function. - \sa {WebEngine Widgets Simple Browser Example}, {WebEngine Content Manipulation Example}, {WebEngine Markdown Editor Example} + \sa {WebEngine Widgets Simple Browser Example}, {WebEngine Content Manipulation Example}, {WebEngine Recipe Browser Example} */ diff --git a/src/webenginewidgets/plugins/qwebengineview/CMakeLists.txt b/src/webenginewidgets/plugins/qwebengineview/CMakeLists.txt index 3e6f324da..0e7644bf7 100644 --- a/src/webenginewidgets/plugins/qwebengineview/CMakeLists.txt +++ b/src/webenginewidgets/plugins/qwebengineview/CMakeLists.txt @@ -1,3 +1,6 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + qt_internal_add_plugin(QWebEngineViewPlugin OUTPUT_NAME qwebengineview PLUGIN_TYPE designer diff --git a/src/webenginewidgets/qwebengine_accessible.cpp b/src/webenginewidgets/qwebengine_accessible.cpp index 53a812604..6880a5a3a 100644 --- a/src/webenginewidgets/qwebengine_accessible.cpp +++ b/src/webenginewidgets/qwebengine_accessible.cpp @@ -8,8 +8,6 @@ #include "web_contents_adapter.h" -#if QT_CONFIG(accessibility) - QT_BEGIN_NAMESPACE QWebEngineViewAccessible::QWebEngineViewAccessible(QWebEngineView *o) : QAccessibleWidget(o) @@ -102,5 +100,3 @@ QWebEngineViewAccessible *RenderWidgetHostViewQtDelegateWidgetAccessible::viewAc } } // namespace QtWebEngineCore - -#endif // QT_CONFIG(accessibility) diff --git a/src/webenginewidgets/qwebengine_accessible.h b/src/webenginewidgets/qwebengine_accessible.h index ac87bb343..f47996cf7 100644 --- a/src/webenginewidgets/qwebengine_accessible.h +++ b/src/webenginewidgets/qwebengine_accessible.h @@ -4,10 +4,8 @@ #ifndef QWEBENGINE_ACCESSIBLE_H #define QWEBENGINE_ACCESSIBLE_H -#include <QAccessibleWidget> -#include <QPointer> - -#if QT_CONFIG(accessibility) +#include <QtCore/QPointer> +#include <QtWidgets/QAccessibleWidget> QT_BEGIN_NAMESPACE class QWebEngineView; @@ -47,6 +45,5 @@ private: QPointer<QWebEngineView> m_view; }; } // namespace QtWebEngineCore -#endif // QT_CONFIG(accessibility) #endif // QWEBENGINE_ACCESSIBLE_H diff --git a/src/webenginewidgets/ui/touchhandlewidget.cpp b/src/webenginewidgets/ui/touchhandlewidget.cpp new file mode 100644 index 000000000..88af0ff36 --- /dev/null +++ b/src/webenginewidgets/ui/touchhandlewidget.cpp @@ -0,0 +1,59 @@ +// Copyright (C) 2022 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 + +#include "touchhandlewidget_p.h" +#include "qwebengineview.h" + +#include <QBoxLayout> +#include <QGraphicsOpacityEffect> +#include <QLabel> +#include <QWidget> + +namespace QtWebEngineWidgetUI { +TouchHandleWidget::TouchHandleWidget(QWebEngineView *view, const QMap<int, QImage> &images) + : m_widget(new QWidget(view)) + , m_label(new QLabel(m_widget)) + , m_opacityEffect(new QGraphicsOpacityEffect(m_widget)) + , m_images(images) +{ + m_widget->setAttribute(Qt::WA_AcceptTouchEvents, true); + m_widget->setAttribute(Qt::WA_TransparentForMouseEvents, true); +} + +TouchHandleWidget::~TouchHandleWidget() +{ +} + +void TouchHandleWidget::setImage(int orientation) +{ + const QImage &img = m_images[orientation]; + m_label->setPixmap(QPixmap::fromImage(img)); + m_label->setFrameStyle(QFrame::NoFrame); + m_label->resize(img.size()); + m_label->setVisible(true); + + QVBoxLayout layout; + layout.setSpacing(0); + layout.setContentsMargins(QMargins()); + layout.addWidget(m_label); + layout.setParent(m_widget); + m_widget->setLayout(&layout); + m_widget->resize(img.size()); +} + +void TouchHandleWidget::setBounds(const QRect &bounds) +{ + m_widget->setGeometry(bounds); +} + +void TouchHandleWidget::setVisible(bool visible) +{ + m_widget->setVisible(visible); +} + +void TouchHandleWidget::setOpacity(float opacity) +{ + m_opacityEffect->setOpacity(opacity); + m_widget->setGraphicsEffect(m_opacityEffect); +} +} // namespace QtWebEngineWidgetUI diff --git a/src/webenginewidgets/ui/touchhandlewidget_p.h b/src/webenginewidgets/ui/touchhandlewidget_p.h new file mode 100644 index 000000000..9f181c935 --- /dev/null +++ b/src/webenginewidgets/ui/touchhandlewidget_p.h @@ -0,0 +1,50 @@ +// Copyright (C) 2022 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 + +#ifndef TOUCHHANDLEWIDGET_P_H +#define TOUCHHANDLEWIDGET_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "touch_handle_drawable_client.h" + +#include <QImage> +#include <QMap> + +QT_BEGIN_NAMESPACE +class QGraphicsOpacityEffect; +class QLabel; +class QWebEngineView; +class QWidget; +QT_END_NAMESPACE + +namespace QtWebEngineWidgetUI { +class TouchHandleWidget : public QtWebEngineCore::TouchHandleDrawableDelegate +{ +public: + TouchHandleWidget(QWebEngineView *view, const QMap<int, QImage> &images); + ~TouchHandleWidget(); + + void setImage(int orientation) override; + void setBounds(const QRect &bounds) override; + void setVisible(bool visible) override; + void setOpacity(float opacity) override; + +private: + QWidget *m_widget; + QLabel *m_label; + QGraphicsOpacityEffect *m_opacityEffect; + QMap<int, QImage> m_images; +}; +} // namespace QtWebEngineWidgetUI + +#endif // TOUCHHANDLEWIDGET_P_H diff --git a/src/webenginewidgets/ui/touchselectionmenuwidget.cpp b/src/webenginewidgets/ui/touchselectionmenuwidget.cpp new file mode 100644 index 000000000..ff69fe84b --- /dev/null +++ b/src/webenginewidgets/ui/touchselectionmenuwidget.cpp @@ -0,0 +1,117 @@ +// Copyright (C) 2022 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 + +#include "touchselectionmenuwidget_p.h" +#include "qwebengineview.h" + +#include "touch_selection_menu_controller.h" + +#include <QBoxLayout> +#include <QEvent> + +namespace QtWebEngineWidgetUI { +namespace { +// The Widgets module is built with rtti in developer-build while Core is not. +// The MOC will throw "undefined reference to typeinfo..." errors if we connect slots +// from QtWebEngineCore via function pointers, because it expects rtti on them. +// To workaround this we use lambdas. +void connectButton(TouchSelectionMenuWidget::TouchButton *button, std::function<void()> callback) +{ + QObject::connect(button, &QPushButton::clicked, std::move(callback)); +} +} // namespace + +TouchSelectionMenuWidget::TouchButton::TouchButton(QString name, QWidget *parent) + : QPushButton(name, parent) +{ + setAttribute(Qt::WA_AcceptTouchEvents, true); +} + +TouchSelectionMenuWidget::TouchButton::~TouchButton() +{ +} + +bool TouchSelectionMenuWidget::TouchButton::event(QEvent *ev) +{ + switch (ev->type()) { + case QEvent::TouchBegin: + ev->accept(); + return true; + case QEvent::TouchEnd: + Q_EMIT clicked(); + ev->accept(); + return true; + default: + break; + } + + return QPushButton::event(ev); +} + +TouchSelectionMenuWidget::TouchSelectionMenuWidget( + QWebEngineView *view, QtWebEngineCore::TouchSelectionMenuController *controller) + : QWidget(view, + Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint + | Qt::WindowDoesNotAcceptFocus) +{ + setAttribute(Qt::WA_AcceptTouchEvents, true); + setAttribute(Qt::WA_TransparentForMouseEvents, true); + setAttribute(Qt::WA_DeleteOnClose, true); + + bool cutEnabled = + controller->isCommandEnabled(QtWebEngineCore::TouchSelectionMenuController::Cut); + bool copyEnabled = + controller->isCommandEnabled(QtWebEngineCore::TouchSelectionMenuController::Copy); + bool pasteEnabled = + controller->isCommandEnabled(QtWebEngineCore::TouchSelectionMenuController::Paste); + + QSizePolicy policy(QSizePolicy::Expanding, QSizePolicy::Expanding); + QHBoxLayout *layout = new QHBoxLayout(); + + if (cutEnabled) { + TouchButton *button = new TouchButton(tr("Cut"), this); + button->setSizePolicy(policy); + layout->addWidget(button); + connectButton(button, [controller]() { controller->cut(); }); + } + + if (copyEnabled) { + TouchButton *button = new TouchButton(tr("Copy"), this); + button->setSizePolicy(policy); + layout->addWidget(button); + connectButton(button, [controller]() { controller->copy(); }); + } + + if (pasteEnabled) { + TouchButton *button = new TouchButton(tr("Paste"), this); + button->setSizePolicy(policy); + layout->addWidget(button); + connectButton(button, [controller]() { controller->paste(); }); + } + + TouchButton *button = new TouchButton(tr("..."), this); + button->setSizePolicy(policy); + layout->addWidget(button); + connectButton(button, [controller]() { controller->runContextMenu(); }); + + layout->setSpacing(2); + layout->setSizeConstraint(QLayout::SetMinimumSize); + layout->setContentsMargins(0, 0, 0, 0); + setLayout(layout); + + nativeParentWidget()->installEventFilter(this); +} + +TouchSelectionMenuWidget::~TouchSelectionMenuWidget() +{ +} + +bool TouchSelectionMenuWidget::eventFilter(QObject *obj, QEvent *ev) +{ + // Close the menu if the window is moved + if (ev->type() == QEvent::Move) + close(); + + return QWidget::eventFilter(obj, ev); +} +} // QtWebEngineWidgetUI diff --git a/src/webenginewidgets/ui/touchselectionmenuwidget_p.h b/src/webenginewidgets/ui/touchselectionmenuwidget_p.h new file mode 100644 index 000000000..1f822023b --- /dev/null +++ b/src/webenginewidgets/ui/touchselectionmenuwidget_p.h @@ -0,0 +1,52 @@ +// Copyright (C) 2022 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 + +#ifndef TOUCHSELECTIONMENUWIDGET_P_H +#define TOUCHSELECTIONMENUWIDGET_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QPushButton> +#include <QWidget> + +namespace QtWebEngineCore { +class TouchSelectionMenuController; +} + +QT_BEGIN_NAMESPACE +class QWebEngineView; +QT_END_NAMESPACE + +namespace QtWebEngineWidgetUI { +class TouchSelectionMenuWidget : public QWidget +{ +public: + class TouchButton : public QPushButton + { + public: + TouchButton(QString name, QWidget *parent); + ~TouchButton(); + + protected: + bool event(QEvent *ev) override; + }; + + TouchSelectionMenuWidget(QWebEngineView *view, + QtWebEngineCore::TouchSelectionMenuController *controller); + ~TouchSelectionMenuWidget(); + +protected: + bool eventFilter(QObject *obj, QEvent *ev) override; +}; +} // namespace QtWebEngineWidgetUI + +#endif // TOUCHSELECTIONMENUWIDGET_P_H |