diff options
author | Martin Negyokru <negyokru@inf.u-szeged.hu> | 2022-05-10 13:56:41 +0200 |
---|---|---|
committer | Martin Negyokru <negyokru@inf.u-szeged.hu> | 2022-12-12 18:31:33 +0100 |
commit | 117ed7f5c2bde195dd15a4b6b2cf9c03be088e1e (patch) | |
tree | d83b515c7593205804e5ee5d2db1aadf7c33ccf7 /src/webenginewidgets/api | |
parent | 48fa0fb2c32df11f0e8df0b8a46d6eddec4f46f3 (diff) |
Add touchSelectionMenu for widgets
[ChangeLog][QWebEngineWidgets] Added touch selection menu.
Task-number: QTBUG-100418
Task-number: QTBUG-91712
Change-Id: Iffb994e429b92389e64cd6a93a0b034d6aa07f66
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/webenginewidgets/api')
-rw-r--r-- | src/webenginewidgets/api/qwebengineview.cpp | 38 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview_p.h | 6 |
2 files changed, 44 insertions, 0 deletions
diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp index f75945942..bf975c96f 100644 --- a/src/webenginewidgets/api/qwebengineview.cpp +++ b/src/webenginewidgets/api/qwebengineview.cpp @@ -9,6 +9,7 @@ #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> @@ -18,6 +19,7 @@ #include "autofill_popup_controller.h" #include "color_chooser_controller.h" +#include "touch_selection_menu_controller.h" #include "web_contents_adapter.h" #include <QContextMenuEvent> @@ -1604,6 +1606,42 @@ QWebEngineViewPrivate::createTouchHandleDelegate(const QMap<int, QImage> &images 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_p.h b/src/webenginewidgets/api/qwebengineview_p.h index 9e0a40799..7c0f3fe60 100644 --- a/src/webenginewidgets/api/qwebengineview_p.h +++ b/src/webenginewidgets/api/qwebengineview_p.h @@ -25,11 +25,13 @@ class QWebEngineContextMenuRequest; class WebEngineQuickWidget; class RenderWidgetHostViewQtDelegate; class RenderWidgetHostViewQtDelegateClient; +class TouchSelectionMenuController; } namespace QtWebEngineWidgetUI { class AutofillPopupWidget; class TouchHandleDrawableDelegate; +class TouchSelectionMenuWidget; } QT_BEGIN_NAMESPACE @@ -75,6 +77,9 @@ public: 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); @@ -93,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 |