summaryrefslogtreecommitdiff
path: root/src/plugins/help/macwebkithelpviewer.mm
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/help/macwebkithelpviewer.mm')
-rw-r--r--src/plugins/help/macwebkithelpviewer.mm91
1 files changed, 84 insertions, 7 deletions
diff --git a/src/plugins/help/macwebkithelpviewer.mm b/src/plugins/help/macwebkithelpviewer.mm
index 9fb1c26041..096d0c3412 100644
--- a/src/plugins/help/macwebkithelpviewer.mm
+++ b/src/plugins/help/macwebkithelpviewer.mm
@@ -39,7 +39,10 @@
#include <QApplication>
#include <QClipboard>
#include <QHelpEngine>
+#include <QStyle>
+#include <QTimer>
#include <QtMac>
+#include <QToolTip>
#include <QUrl>
#include <QVBoxLayout>
@@ -86,6 +89,22 @@ AutoreleasePool::~AutoreleasePool()
[pool release];
}
+// #pragma mark -- mac helpers
+
+// copy from qcocoahelpers.mm
+static int mainScreenHeight()
+{
+ // The first screen in the screens array is documented
+ // to have the (0,0) origin.
+ NSRect screenFrame = [[[NSScreen screens] firstObject] frame];
+ return screenFrame.size.height;
+}
+
+static QPoint flipPoint(const NSPoint &p)
+{
+ return QPoint(p.x, mainScreenHeight() - p.y);
+}
+
// #pragma mark -- DOMNodeIterator (PrivateExtensions)
@interface DOMNodeIterator (PrivateExtensions)
@@ -212,6 +231,7 @@ static void ensureProtocolHandler()
- (void)webView:(WebView *)sender didStartProvisionalLoadForFrame:(WebFrame *)frame;
- (void)webView:(WebView *)sender didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame;
- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame;
+- (void)webView:(WebView *)sender didFailProvisionalLoadWithError:(NSError *)error forFrame:(WebFrame *)frame;
@end
@@ -249,28 +269,37 @@ static void ensureProtocolHandler()
viewer->slotLoadFinished();
}
+- (void)webView:(WebView *)sender didFailProvisionalLoadWithError:(NSError *)error forFrame:(WebFrame *)frame
+{
+ Q_UNUSED(sender)
+ Q_UNUSED(error)
+ if (frame == mainFrame)
+ viewer->slotLoadFinished();
+}
+
@end
// #pragma mark -- UIDelegate
@interface UIDelegate : NSObject
{
- QWidget *widget;
+ Help::Internal::MacWebKitHelpWidget *widget;
}
@property (assign) BOOL openInNewPageActionVisible;
-- (id)initWithWidget:(QWidget *)theWidget;
+- (id)initWithWidget:(Help::Internal::MacWebKitHelpWidget *)theWidget;
- (void)webView:(WebView *)sender makeFirstResponder:(NSResponder *)responder;
- (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element
defaultMenuItems:(NSArray *)defaultMenuItems;
- (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request;
-
+- (void)webView:(WebView *)sender mouseDidMoveOverElement:(NSDictionary *)elementInformation
+ modifierFlags:(NSUInteger)modifierFlags;
@end
@implementation UIDelegate
-- (id)initWithWidget:(QWidget *)theWidget
+- (id)initWithWidget:(Help::Internal::MacWebKitHelpWidget *)theWidget
{
self = [super init];
if (self) {
@@ -334,6 +363,23 @@ static void ensureProtocolHandler()
return viewer->widget()->webView();
}
+- (void)webView:(WebView *)sender mouseDidMoveOverElement:(NSDictionary *)elementInformation
+ modifierFlags:(NSUInteger)modifierFlags
+{
+ Q_UNUSED(sender)
+ if (!elementInformation || (modifierFlags & NSDeviceIndependentModifierFlagsMask) != 0) {
+ widget->hideToolTip();
+ return;
+ }
+ NSURL *url = [elementInformation objectForKey:WebElementLinkURLKey];
+ if (!url) {
+ widget->hideToolTip();
+ return;
+ }
+ widget->startToolTipTimer(flipPoint(NSEvent.mouseLocation),
+ QString::fromNSString(url.absoluteString));
+}
+
@end
// #pragma mark -- MyWebView
@@ -396,6 +442,9 @@ public:
FrameLoadDelegate *m_frameLoadDelegate;
UIDelegate *m_uiDelegate;
NSResponder *m_savedResponder;
+ QTimer m_toolTipTimer;
+ QPoint m_toolTipPos;
+ QString m_toolTipText;
};
// #pragma mark -- MacWebKitHelpWidget
@@ -404,8 +453,13 @@ MacWebKitHelpWidget::MacWebKitHelpWidget(MacWebKitHelpViewer *parent)
: QMacCocoaViewContainer(0, parent),
d(new MacWebKitHelpWidgetPrivate)
{
+ d->m_toolTipTimer.setSingleShot(true);
+ connect(&d->m_toolTipTimer, &QTimer::timeout, this, &MacWebKitHelpWidget::showToolTip);
AutoreleasePool pool; Q_UNUSED(pool)
d->m_webView = [[MyWebView alloc] init];
+ // Turn layered rendering on.
+ // Otherwise the WebView will render empty after any QQuickWidget was shown.
+ d->m_webView.wantsLayer = YES;
d->m_frameLoadDelegate = [[FrameLoadDelegate alloc] initWithMainFrame:d->m_webView.mainFrame
viewer:parent];
[d->m_webView setFrameLoadDelegate:d->m_frameLoadDelegate];
@@ -430,6 +484,20 @@ WebView *MacWebKitHelpWidget::webView() const
return d->m_webView;
}
+void MacWebKitHelpWidget::startToolTipTimer(const QPoint &pos, const QString &text)
+{
+ int delay = style()->styleHint(QStyle::SH_ToolTip_WakeUpDelay, 0, this, 0);
+ d->m_toolTipPos = pos;
+ d->m_toolTipText = text;
+ d->m_toolTipTimer.start(delay);
+}
+
+void MacWebKitHelpWidget::hideToolTip()
+{
+ d->m_toolTipTimer.stop();
+ QToolTip::showText(QPoint(), QString());
+}
+
void MacWebKitHelpWidget::hideEvent(QHideEvent *)
{
[d->m_webView setHidden:YES];
@@ -440,9 +508,14 @@ void MacWebKitHelpWidget::showEvent(QShowEvent *)
[d->m_webView setHidden:NO];
}
+void MacWebKitHelpWidget::showToolTip()
+{
+ QToolTip::showText(d->m_toolTipPos, d->m_toolTipText, this);
+}
+
// #pragma mark -- MacWebKitHelpViewer
-MacWebKitHelpViewer::MacWebKitHelpViewer(qreal zoom, QWidget *parent)
+MacWebKitHelpViewer::MacWebKitHelpViewer(QWidget *parent)
: HelpViewer(parent),
m_widget(new MacWebKitHelpWidget(this))
{
@@ -457,7 +530,6 @@ MacWebKitHelpViewer::MacWebKitHelpViewer(qreal zoom, QWidget *parent)
setLayout(layout);
layout->setContentsMargins(0, 0, 0, 0);
layout->addWidget(m_widget, 10);
- m_widget->webView().textSizeMultiplier = (zoom == 0.0 ? 1.0 : zoom);
}
MacWebKitHelpViewer::~MacWebKitHelpViewer()
@@ -503,7 +575,12 @@ void MacWebKitHelpViewer::resetScale()
qreal MacWebKitHelpViewer::scale() const
{
AutoreleasePool pool; Q_UNUSED(pool)
- return m_widget->webView().textSizeMultiplier;
+ return m_widget->webView().textSizeMultiplier;
+}
+
+void MacWebKitHelpViewer::setScale(qreal scale)
+{
+ m_widget->webView().textSizeMultiplier = (scale <= 0.0 ? 1.0 : scale);
}
QString MacWebKitHelpViewer::title() const