diff options
author | Michal Klocek <michal.klocek@theqtcompany.com> | 2016-06-13 13:29:51 +0200 |
---|---|---|
committer | Kai Koehne <kai.koehne@qt.io> | 2016-08-31 09:11:53 +0000 |
commit | 3f73e47130f3912f99376314a06a2033225b0dda (patch) | |
tree | 29a554b1299a1efe45032729303c047e368476f0 /src/core | |
parent | 3cbe59e29a2702a2c184be10845b9bdd342c24d0 (diff) |
Add context menu request to qml api
Introduce qml APIs to support custom context menus.
[ChangeLog][QtWebEngine][QML] Added ability to show custom
context menu.
Task-number: QTBUG-52554
Change-Id: Ief0cbbbf221f4c6849e16bbba7417dccee59ad61
Reviewed-by: Kai Koehne <kai.koehne@qt.io>
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/web_contents_adapter_client.h | 161 | ||||
-rw-r--r-- | src/core/web_contents_view_qt.cpp | 26 |
2 files changed, 150 insertions, 37 deletions
diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h index 865fd55d7..85a379409 100644 --- a/src/core/web_contents_adapter_client.h +++ b/src/core/web_contents_adapter_client.h @@ -71,23 +71,43 @@ class WebContentsAdapter; class WebContentsDelegateQt; class WebEngineSettings; -// FIXME: make this ref-counted and implicitely shared and expose as public API maybe ? -class WebEngineContextMenuData { + +class WebEngineContextMenuSharedData : public QSharedData { public: - WebEngineContextMenuData() - : mediaType(MediaTypeNone) - , hasImageContent(false) - , mediaFlags(0) + WebEngineContextMenuSharedData() + : hasImageContent(false) , isEditable(false) , isSpellCheckerEnabled(false) + , mediaType(0) + , mediaFlags(0) { } + bool hasImageContent; + bool isEditable; + bool isSpellCheckerEnabled; + uint mediaType; + uint mediaFlags; + QPoint pos; + QUrl linkUrl; + QUrl mediaUrl; + QString linkText; + QString selectedText; + QString suggestedFileName; + QString misspelledWord; + QStringList spellCheckerSuggestions; + // Some likely candidates for future additions as we add support for the related actions: + // bool isImageBlocked; + // <enum tbd> mediaType; + // ... +}; +class WebEngineContextMenuData { +public: // Must match blink::WebContextMenuData::MediaType: enum MediaType { // No special node is in context. - MediaTypeNone, + MediaTypeNone = 0x0, // An image node is selected. MediaTypeImage, // A video node is selected. @@ -117,25 +137,118 @@ public: MediaCanRotate = 0x200, }; - QPoint pos; - QUrl linkUrl; - QString linkText; - QString selectedText; - QUrl mediaUrl; - MediaType mediaType; - bool hasImageContent; - uint mediaFlags; - QString suggestedFileName; - bool isEditable; - bool isSpellCheckerEnabled; - QString misspelledWord; - QStringList spellCheckerSuggestions; -// Some likely candidates for future additions as we add support for the related actions: -// bool isImageBlocked; -// <enum tbd> mediaType; -// ... + WebEngineContextMenuData():d(new WebEngineContextMenuSharedData) { + } + + void setPosition(const QPoint &pos) { + d->pos = pos; + } + + QPoint position() const { + return d->pos; + } + + void setLinkUrl(const QUrl &url) { + d->linkUrl = url; + } + + QUrl linkUrl() const { + return d->linkUrl; + } + + void setLinkText(const QString &text) { + d->linkText = text; + } + + QString linkText() const { + return d->linkText; + } + + void setSelectedText(const QString &text) { + d->selectedText = text; + } + + QString selectedText() const { + return d->selectedText; + } + + void setMediaUrl(const QUrl &url) { + d->mediaUrl = url; + } + + QUrl mediaUrl() const { + return d->mediaUrl; + } + + void setMediaType(MediaType type) { + d->mediaType = type; + } + + MediaType mediaType() const { + return MediaType(d->mediaType); + } + + void setHasImageContent(bool imageContent) { + d->hasImageContent = imageContent; + } + + bool hasImageContent() const { + return d->hasImageContent; + } + + void setMediaFlags(MediaFlags flags) { + d->mediaFlags = flags; + } + + MediaFlags mediaFlags() const { + return MediaFlags(d->mediaFlags); + } + + void setSuggestedFileName(const QString &filename) { + d->suggestedFileName = filename; + } + + QString suggestedFileName() const { + return d->suggestedFileName; + } + + void setIsEditable(bool editable) { + d->isEditable = editable; + } + + bool isEditable() const { + return d->isEditable; + } + + void setIsSpellCheckerEnabled(bool spellCheckerEnabled) { + d->isSpellCheckerEnabled = spellCheckerEnabled; + } + + bool isSpellCheckerEnabled() const { + return d->isSpellCheckerEnabled; + } + + void setMisspelledWord(const QString &word) { + d->misspelledWord = word; + } + + QString misspelledWord() const { + return d->misspelledWord; + } + + void setSpellCheckerSuggestions(const QStringList &suggestions) { + d->spellCheckerSuggestions = suggestions; + } + + QStringList spellCheckerSuggestions() const { + return d->spellCheckerSuggestions; + } + +private: + QSharedDataPointer<WebEngineContextMenuSharedData> d; }; + class QWEBENGINE_EXPORT WebContentsAdapterClient { public: // This must match window_open_disposition_list.h. diff --git a/src/core/web_contents_view_qt.cpp b/src/core/web_contents_view_qt.cpp index e487fca46..ed6fdabff 100644 --- a/src/core/web_contents_view_qt.cpp +++ b/src/core/web_contents_view_qt.cpp @@ -155,19 +155,19 @@ ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaCanRotate, blink::WebContextMe static inline WebEngineContextMenuData fromParams(const content::ContextMenuParams ¶ms) { WebEngineContextMenuData ret; - ret.pos = QPoint(params.x, params.y); - ret.linkUrl = toQt(params.link_url); - ret.linkText = toQt(params.link_text.data()); - ret.selectedText = toQt(params.selection_text.data()); - ret.mediaUrl = toQt(params.src_url); - ret.mediaType = (WebEngineContextMenuData::MediaType)params.media_type; - ret.hasImageContent = params.has_image_contents; - ret.mediaFlags = params.media_flags; - ret.suggestedFileName = toQt(params.suggested_filename.data()); - ret.isEditable = params.is_editable; + ret.setPosition(QPoint(params.x, params.y)); + ret.setLinkUrl(toQt(params.link_url)); + ret.setLinkText(toQt(params.link_text.data())); + ret.setSelectedText(toQt(params.selection_text.data())); + ret.setMediaUrl(toQt(params.src_url)); + ret.setMediaType((WebEngineContextMenuData::MediaType)params.media_type); + ret.setHasImageContent(params.has_image_contents); + ret.setMediaFlags((WebEngineContextMenuData::MediaFlags)params.media_flags); + ret.setSuggestedFileName(toQt(params.suggested_filename.data())); + ret.setIsEditable(params.is_editable); #if defined(ENABLE_SPELLCHECK) - ret.misspelledWord = toQt(params.misspelled_word); - ret.spellCheckerSuggestions = fromVector(params.dictionary_suggestions); + ret.setMisspelledWord(toQt(params.misspelled_word)); + ret.setSpellCheckerSuggestions(fromVector(params.dictionary_suggestions)); #endif return ret; } @@ -183,7 +183,7 @@ void WebContentsViewQt::ShowContextMenu(content::RenderFrameHost *, const conten // must be initialized to true due to the way how the initialization sequence // in SpellCheck works ie. typing the first word triggers the creation // of the SpellcheckService. Use user preference store instead. - contextMenuData.isSpellCheckerEnabled = m_client->browserContextAdapter()->isSpellCheckEnabled(); + contextMenuData.setIsSpellCheckerEnabled(m_client->browserContextAdapter()->isSpellCheckEnabled()); #endif m_client->contextMenuRequested(contextMenuData); } |