diff options
Diffstat (limited to 'src/plugins/help/macwebkithelpviewer.mm')
-rw-r--r-- | src/plugins/help/macwebkithelpviewer.mm | 91 |
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 |