summaryrefslogtreecommitdiffstats
path: root/src/webengine
diff options
context:
space:
mode:
Diffstat (limited to 'src/webengine')
-rw-r--r--src/webengine/api/qquickwebengineview.cpp14
-rw-r--r--src/webengine/api/qquickwebengineview_p_p.h3
-rw-r--r--src/webengine/ui/MessageBubble.qml147
-rw-r--r--src/webengine/ui/ui.pro4
-rw-r--r--src/webengine/ui_delegates_manager.cpp33
-rw-r--r--src/webengine/ui_delegates_manager.h8
6 files changed, 207 insertions, 2 deletions
diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp
index 4bc6cd087..232d63b30 100644
--- a/src/webengine/api/qquickwebengineview.cpp
+++ b/src/webengine/api/qquickwebengineview.cpp
@@ -766,6 +766,20 @@ void QQuickWebEngineViewPrivate::didFindText(quint64 requestId, int matchCount)
args.append(QJSValue(matchCount));
callback.call(args);
}
+void QQuickWebEngineViewPrivate::showValidationMessage(const QRect &anchor, const QString &mainText, const QString &subText)
+{
+ ui()->showMessageBubble(anchor, mainText, subText);
+}
+
+void QQuickWebEngineViewPrivate::hideValidationMessage()
+{
+ ui()->hideMessageBubble();
+}
+
+void QQuickWebEngineViewPrivate::moveValidationMessage(const QRect &anchor)
+{
+ ui()->moveMessageBubble(anchor);
+}
bool QQuickWebEngineView::isLoading() const
{
diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h
index 36e590bff..ec8f83468 100644
--- a/src/webengine/api/qquickwebengineview_p_p.h
+++ b/src/webengine/api/qquickwebengineview_p_p.h
@@ -165,6 +165,9 @@ public:
virtual QtWebEngineCore::WebEngineSettings *webEngineSettings() const Q_DECL_OVERRIDE;
virtual void allowCertificateError(const QSharedPointer<CertificateErrorController> &errorController);
virtual void runGeolocationPermissionRequest(QUrl const&) Q_DECL_OVERRIDE;
+ virtual void showValidationMessage(const QRect &anchor, const QString &mainText, const QString &subText) Q_DECL_OVERRIDE;
+ virtual void hideValidationMessage() Q_DECL_OVERRIDE;
+ virtual void moveValidationMessage(const QRect &anchor) Q_DECL_OVERRIDE;
virtual QtWebEngineCore::BrowserContextAdapter *browserContextAdapter() Q_DECL_OVERRIDE;
diff --git a/src/webengine/ui/MessageBubble.qml b/src/webengine/ui/MessageBubble.qml
new file mode 100644
index 000000000..4328eae40
--- /dev/null
+++ b/src/webengine/ui/MessageBubble.qml
@@ -0,0 +1,147 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.1
+
+Item {
+ id: bubble
+
+ width: 1
+ height: 1
+
+ property int maxWidth: 0
+ property string mainText: "";
+ property string subText: "";
+
+ property int border: 1
+
+ property int arrowWidth: 18
+ property int arrowHeight: 18
+ property int arrowOffset: 18
+
+ property int marginLeft: border + 8
+ property int marginTop: border + arrowHeight + 6
+ property int marginRight: border + 8
+ property int marginBottom: border + 6
+
+ Column {
+ id: messageColumn
+
+ x: bubble.marginLeft
+ y: bubble.marginTop
+ z: 1
+
+ spacing: 5
+
+ Text {
+ id: message
+ width: bubble.maxWidth
+
+ wrapMode: Text.WordWrap
+ elide: Text.ElideNone
+ clip: true
+
+ font.pointSize: subMessage.font.pointSize + 4
+
+ text: bubble.mainText
+ }
+
+ Text {
+ id: subMessage
+ width: bubble.maxWidth
+
+ wrapMode: Text.WordWrap
+ elide: Text.ElideNone
+ clip: true
+
+ text: bubble.subText
+ }
+ }
+
+ Canvas {
+ id: bubbleCanvas
+
+ property int textWidth: Math.min(bubble.maxWidth, Math.max(message.paintedWidth, subMessage.paintedWidth))
+ property int textHeight: message.paintedHeight + (subMessage.paintedWidth > 0 ? (messageColumn.spacing + subMessage.paintedHeight) : 0)
+
+ width: textWidth + bubble.marginLeft + bubble.marginRight
+ height: textHeight + bubble.marginTop + bubble.marginBottom
+
+ property int cornerRadius: 7
+
+ property int messageBoxLeft: 0
+ property int messageBoxTop: bubble.arrowHeight
+ property int messageBoxRight: width - border
+ property int messageBoxBottom: height - border
+
+ onPaint: {
+ var ctx = getContext("2d")
+
+ ctx.lineWidth = bubble.border
+ ctx.strokeStyle = "#555"
+ ctx.fillStyle = "#ffffe1"
+
+ ctx.beginPath()
+
+ ctx.moveTo(messageBoxLeft + cornerRadius, messageBoxTop)
+
+ // Arrow
+ ctx.lineTo(messageBoxLeft + bubble.arrowOffset, messageBoxTop)
+ ctx.lineTo(messageBoxLeft + bubble.arrowOffset, messageBoxTop - bubble.arrowHeight)
+ ctx.lineTo(messageBoxLeft + bubble.arrowOffset + bubble.arrowWidth, messageBoxTop)
+
+ // Message Box
+ ctx.lineTo(messageBoxRight - cornerRadius, messageBoxTop)
+ ctx.quadraticCurveTo(messageBoxRight, messageBoxTop, messageBoxRight, messageBoxTop + cornerRadius)
+ ctx.lineTo(messageBoxRight, messageBoxBottom - cornerRadius)
+ ctx.quadraticCurveTo(messageBoxRight, messageBoxBottom, messageBoxRight - cornerRadius, messageBoxBottom)
+ ctx.lineTo(messageBoxLeft + cornerRadius, messageBoxBottom)
+ ctx.quadraticCurveTo(messageBoxLeft, messageBoxBottom, messageBoxLeft, messageBoxBottom - cornerRadius)
+ ctx.lineTo(messageBoxLeft, messageBoxTop + cornerRadius)
+ ctx.quadraticCurveTo(messageBoxLeft, messageBoxTop, messageBoxLeft + cornerRadius, messageBoxTop)
+
+ ctx.closePath()
+
+ ctx.fill()
+ ctx.stroke()
+ }
+
+ onPainted: {
+ bubble.width = bubbleCanvas.width
+ bubble.height = bubbleCanvas.height
+ }
+ }
+}
diff --git a/src/webengine/ui/ui.pro b/src/webengine/ui/ui.pro
index a5ae648cb..fdf7a85bc 100644
--- a/src/webengine/ui/ui.pro
+++ b/src/webengine/ui/ui.pro
@@ -9,6 +9,8 @@ QML_FILES += \
# Menus. Based on Qt Quick Controls
Menu.qml \
MenuItem.qml \
- MenuSeparator.qml
+ MenuSeparator.qml \
+ # Message Bubble
+ MessageBubble.qml
load(qml_module)
diff --git a/src/webengine/ui_delegates_manager.cpp b/src/webengine/ui_delegates_manager.cpp
index 615c6024d..d22e6546f 100644
--- a/src/webengine/ui_delegates_manager.cpp
+++ b/src/webengine/ui_delegates_manager.cpp
@@ -138,6 +138,7 @@ void NavigateMenuItem::onTriggered()
UIDelegatesManager::UIDelegatesManager(QQuickWebEngineView *view)
: m_view(view)
+ , m_messageBubbleItem(0)
FOR_EACH_COMPONENT_TYPE(COMPONENT_MEMBER_INIT, NO_SEPARATOR)
{
}
@@ -430,6 +431,38 @@ void UIDelegatesManager::showFilePicker(WebContentsAdapterClient::FileChooserMod
QMetaObject::invokeMethod(filePicker, "open");
}
+void UIDelegatesManager::showMessageBubble(const QRect &anchor, const QString &mainText, const QString &subText)
+{
+ if (!ensureComponentLoaded(MessageBubble))
+ return;
+
+ Q_ASSERT(m_messageBubbleItem.isNull());
+
+ QQmlContext *context = qmlContext(m_view);
+ m_messageBubbleItem.reset(qobject_cast<QQuickItem *>(messageBubbleComponent->beginCreate(context)));
+ m_messageBubbleItem->setParentItem(m_view);
+ messageBubbleComponent->completeCreate();
+
+ QQmlProperty(m_messageBubbleItem.data(), QStringLiteral("maxWidth")).write(anchor.size().width());
+ QQmlProperty(m_messageBubbleItem.data(), QStringLiteral("mainText")).write(mainText);
+ QQmlProperty(m_messageBubbleItem.data(), QStringLiteral("subText")).write(subText);
+ QQmlProperty(m_messageBubbleItem.data(), QStringLiteral("x")).write(anchor.x());
+ QQmlProperty(m_messageBubbleItem.data(), QStringLiteral("y")).write(anchor.y() + anchor.size().height());
+}
+
+void UIDelegatesManager::hideMessageBubble()
+{
+ m_messageBubbleItem.reset();
+}
+
+void UIDelegatesManager::moveMessageBubble(const QRect &anchor)
+{
+ Q_ASSERT(!m_messageBubbleItem.isNull());
+
+ QQmlProperty(m_messageBubbleItem.data(), QStringLiteral("x")).write(anchor.x());
+ QQmlProperty(m_messageBubbleItem.data(), QStringLiteral("y")).write(anchor.y() + anchor.size().height());
+}
+
} // namespace QtWebEngineCore
#include "ui_delegates_manager.moc"
diff --git a/src/webengine/ui_delegates_manager.h b/src/webengine/ui_delegates_manager.h
index b43006381..f2b78f792 100644
--- a/src/webengine/ui_delegates_manager.h
+++ b/src/webengine/ui_delegates_manager.h
@@ -54,7 +54,8 @@
F(AlertDialog, alertDialog) SEPARATOR \
F(ConfirmDialog, confirmDialog) SEPARATOR \
F(PromptDialog, promptDialog) SEPARATOR \
- F(FilePicker, filePicker) SEPARATOR
+ F(FilePicker, filePicker) SEPARATOR \
+ F(MessageBubble, messageBubble) SEPARATOR
#define COMMA_SEPARATOR ,
#define SEMICOLON_SEPARATOR ;
@@ -66,6 +67,7 @@
QT_BEGIN_NAMESPACE
class QObject;
class QQmlContext;
+class QQuickItem;
class QQuickWebEngineView;
QT_END_NAMESPACE
@@ -124,11 +126,15 @@ public:
void showDialog(QSharedPointer<JavaScriptDialogController>);
void showFilePicker(WebContentsAdapterClient::FileChooserMode, const QString &defaultFileName, const QStringList &acceptedMimeTypes
, const QExplicitlySharedDataPointer<WebContentsAdapter> &);
+ void showMessageBubble(const QRect &anchor, const QString &mainText, const QString &subText);
+ void hideMessageBubble();
+ void moveMessageBubble(const QRect &anchor);
private:
bool ensureComponentLoaded(ComponentType);
QQuickWebEngineView *m_view;
+ QScopedPointer<QQuickItem> m_messageBubbleItem;
FOR_EACH_COMPONENT_TYPE(MEMBER_DECLARATION, SEMICOLON_SEPARATOR)