diff options
-rw-r--r-- | src/webengine/api/qquickwebengineview.cpp | 5 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview_p_p.h | 2 | ||||
-rw-r--r-- | src/webengine/ui/ToolTip.qml | 91 | ||||
-rw-r--r-- | src/webengine/ui/ui.pro | 3 | ||||
-rw-r--r-- | src/webengine/ui_delegates_manager.cpp | 64 | ||||
-rw-r--r-- | src/webengine/ui_delegates_manager.h | 5 |
6 files changed, 167 insertions, 3 deletions
diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index b660b06be..983e8c30e 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -1106,6 +1106,11 @@ bool QQuickWebEngineViewPrivate::isEnabled() const return q->isEnabled(); } +void QQuickWebEngineViewPrivate::setToolTip(const QString &toolTipText) +{ + ui()->showToolTip(toolTipText); +} + bool QQuickWebEngineView::isLoading() const { Q_D(const QQuickWebEngineView); diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h index e82aebbd4..45332ddb1 100644 --- a/src/webengine/api/qquickwebengineview_p_p.h +++ b/src/webengine/api/qquickwebengineview_p_p.h @@ -188,7 +188,7 @@ public: void startDragging(const content::DropData &dropData, Qt::DropActions allowedActions, const QPixmap &pixmap, const QPoint &offset) Q_DECL_OVERRIDE; virtual bool isEnabled() const Q_DECL_OVERRIDE; - virtual void setToolTip(const QString &toolTipText) Q_DECL_OVERRIDE { Q_UNUSED(toolTipText); } + virtual void setToolTip(const QString &toolTipText) Q_DECL_OVERRIDE; const QObject *holdingQObject() const Q_DECL_OVERRIDE; virtual QSharedPointer<QtWebEngineCore::BrowserContextAdapter> browserContextAdapter() Q_DECL_OVERRIDE; diff --git a/src/webengine/ui/ToolTip.qml b/src/webengine/ui/ToolTip.qml new file mode 100644 index 000000000..96033e8f1 --- /dev/null +++ b/src/webengine/ui/ToolTip.qml @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/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.LGPL3 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-3.0.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 (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 + +Item { + id: toolTipContainer + z: 9999 + width: content.width + height: content.height + visible: false + + property alias text: toolTip.text + property int delayTimerInterval: 1000 + property int hideTimerInterval: 1500 + + Timer { + id: delayTimer + interval: delayTimerInterval + onTriggered: { + toolTipContainer.visible = true + hideTimer.start() + } + } + + Timer { + id: hideTimer + interval: hideTimerInterval + onTriggered: toolTipContainer.visible = false + } + + Rectangle { + id: content + color: "#f8eabf" + border.color: "black" + anchors.centerIn: parent + width: toolTip.contentWidth + 10 + height: toolTip.contentHeight + 10 + radius: 3 + + Text { + id: toolTip + anchors {fill: parent; margins: 5} + wrapMode: Text.WrapAnywhere + } + } + + function open() { + delayTimer.start(); + } + + function hide() { + hideTimer.start(); + } +} diff --git a/src/webengine/ui/ui.pro b/src/webengine/ui/ui.pro index 249d7dcfd..60dab61d6 100644 --- a/src/webengine/ui/ui.pro +++ b/src/webengine/ui/ui.pro @@ -14,6 +14,7 @@ QML_FILES += \ MenuItem.qml \ MenuSeparator.qml \ # Message Bubble - MessageBubble.qml + MessageBubble.qml \ + ToolTip.qml load(qml_module) diff --git a/src/webengine/ui_delegates_manager.cpp b/src/webengine/ui_delegates_manager.cpp index 6ff12b53f..769a30016 100644 --- a/src/webengine/ui_delegates_manager.cpp +++ b/src/webengine/ui_delegates_manager.cpp @@ -50,6 +50,10 @@ #include <QQmlContext> #include <QQmlEngine> #include <QQmlProperty> +#include <QCursor> +#include <QList> +#include <QScreen> +#include <QGuiApplication> // Uncomment for QML debugging //#define UI_DELEGATES_DEBUG @@ -93,6 +97,31 @@ static QString getUIDelegatesImportDir(QQmlEngine *engine) { return importDir; } +static QPoint calculateToolTipPosition(QPoint &position, QSize &toolTip) { + QRect screen; + QList<QScreen *> screens = QGuiApplication::screens(); + Q_FOREACH (const QScreen *src, screens) + if (src->availableGeometry().contains(position)) + screen = src->availableGeometry(); + + position += QPoint(2, 16); + + if (position.x() + toolTip.width() > screen.x() + screen.width()) + position.rx() -= 4 + toolTip.width(); + if (position.y() + toolTip.height() > screen.y() + screen.height()) + position.ry() -= 24 + toolTip.height(); + if (position.y() < screen.y()) + position.setY(screen.y()); + if (position.x() + toolTip.width() > screen.x() + screen.width()) + position.setX(screen.x() + screen.width() - toolTip.width()); + if (position.x() < screen.x()) + position.setX(screen.x()); + if (position.y() + toolTip.height() > screen.y() + screen.height()) + position.setY(screen.y() + screen.height() - toolTip.height()); + + return position; +} + const char *defaultPropertyName(QObject *obj) { const QMetaObject *metaObject = obj->metaObject(); @@ -116,6 +145,7 @@ MenuItemHandler::MenuItemHandler(QObject *parent) UIDelegatesManager::UIDelegatesManager(QQuickWebEngineView *view) : m_view(view) , m_messageBubbleItem(0) + , m_toolTip(nullptr) FOR_EACH_COMPONENT_TYPE(COMPONENT_MEMBER_INIT, NO_SEPARATOR) { } @@ -493,4 +523,38 @@ void UIDelegatesManager::moveMessageBubble(const QRect &anchor) QQmlProperty(m_messageBubbleItem.data(), QStringLiteral("y")).write(anchor.y() + anchor.size().height()); } +void UIDelegatesManager::showToolTip(const QString &text) +{ + if (!ensureComponentLoaded(ToolTip)) + return; + + if (text.isEmpty()) { + m_toolTip.reset(); + return; + } + + if (!m_toolTip.isNull()) + return; + + QQmlContext *context = qmlContext(m_view); + m_toolTip.reset(toolTipComponent->beginCreate(context)); + if (QQuickItem *item = qobject_cast<QQuickItem *>(m_toolTip.data())) + item->setParentItem(m_view); + m_toolTip->setParent(m_view); + toolTipComponent->completeCreate(); + + QQmlProperty(m_toolTip.data(), QStringLiteral("text")).write(text); + + int height = QQmlProperty(m_toolTip.data(), QStringLiteral("height")).read().toInt(); + int width = QQmlProperty(m_toolTip.data(), QStringLiteral("width")).read().toInt(); + QSize toolTipSize(width, height); + QPoint position = m_view->cursor().pos(); + position = m_view->mapFromGlobal(calculateToolTipPosition(position, toolTipSize)).toPoint(); + + QQmlProperty(m_toolTip.data(), QStringLiteral("x")).write(position.x()); + QQmlProperty(m_toolTip.data(), QStringLiteral("y")).write(position.y()); + + QMetaObject::invokeMethod(m_toolTip.data(), "open"); +} + } // namespace QtWebEngineCore diff --git a/src/webengine/ui_delegates_manager.h b/src/webengine/ui_delegates_manager.h index b63aa91f1..43d1e6985 100644 --- a/src/webengine/ui_delegates_manager.h +++ b/src/webengine/ui_delegates_manager.h @@ -59,7 +59,8 @@ F(PromptDialog, promptDialog) SEPARATOR \ F(FilePicker, filePicker) SEPARATOR \ F(MessageBubble, messageBubble) SEPARATOR \ - F(AuthenticationDialog, authenticationDialog) SEPARATOR + F(AuthenticationDialog, authenticationDialog) SEPARATOR \ + F(ToolTip, toolTip) SEPARATOR \ #define COMMA_SEPARATOR , #define SEMICOLON_SEPARATOR ; @@ -115,12 +116,14 @@ public: void showMessageBubble(const QRect &anchor, const QString &mainText, const QString &subText); void hideMessageBubble(); void moveMessageBubble(const QRect &anchor); + void showToolTip(const QString &text); private: bool ensureComponentLoaded(ComponentType); QQuickWebEngineView *m_view; QScopedPointer<QQuickItem> m_messageBubbleItem; + QScopedPointer<QObject> m_toolTip; FOR_EACH_COMPONENT_TYPE(MEMBER_DECLARATION, SEMICOLON_SEPARATOR) |