ui: Refactor content hit testing in WebView

This commit is contained in:
Oleg Shparber 2018-01-07 00:42:55 +02:00
parent 57fbea15c2
commit 5cec65591b
2 changed files with 21 additions and 17 deletions

View File

@ -29,7 +29,6 @@
#include <core/application.h>
#include <QApplication>
#include <QWebFrame>
#include <QWheelEvent>
using namespace Zeal::WidgetUi;
@ -105,19 +104,23 @@ void WebView::mousePressEvent(QMouseEvent *event)
case Qt::BackButton:
back();
event->accept();
break;
return;
case Qt::ForwardButton:
forward();
event->accept();
break;
return;
case Qt::LeftButton:
if (!(event->modifiers() & Qt::ControlModifier || event->modifiers() & Qt::ShiftModifier))
if (!(event->modifiers() & Qt::ControlModifier || event->modifiers() & Qt::ShiftModifier)) {
break;
}
case Qt::MiddleButton:
m_clickedLink = clickedLink(event->pos());
if (m_clickedLink.isValid())
event->accept();
break;
m_clickedLink = hitTestContent(event->pos()).linkUrl();
if (!m_clickedLink.isValid()) {
break;
}
event->accept();
return;
default:
break;
}
@ -129,19 +132,22 @@ void WebView::mouseReleaseEvent(QMouseEvent *event)
{
switch (event->button()) {
case Qt::LeftButton:
if (!(event->modifiers() & Qt::ControlModifier || event->modifiers() & Qt::ShiftModifier))
if (!(event->modifiers() & Qt::ControlModifier || event->modifiers() & Qt::ShiftModifier)) {
break;
}
case Qt::MiddleButton:
if (m_clickedLink == clickedLink(event->pos()) && m_clickedLink.isValid()) {
if (!m_clickedLink.isEmpty() && m_clickedLink == hitTestContent(event->pos()).linkUrl()) {
QWebView *webView = createWindow(QWebPage::WebBrowserWindow);
webView->load(m_clickedLink);
event->accept();
return;
}
break;
default:
break;
}
QWebView::mouseReleaseEvent(event);
}
@ -166,11 +172,7 @@ void WebView::wheelEvent(QWheelEvent *event)
QWebView::wheelEvent(event);
}
QUrl WebView::clickedLink(const QPoint &pos) const
QWebHitTestResult WebView::hitTestContent(const QPoint &pos) const
{
QWebFrame *frame = page()->frameAt(pos);
if (!frame)
return QUrl();
return frame->hitTestContent(pos).linkUrl();
return page()->mainFrame()->hitTestContent(pos);
}

View File

@ -25,6 +25,7 @@
#define ZEAL_WIDGETUI_WEBVIEW_H
#include <QVector>
#include <QWebFrame>
#include <QWebView>
namespace Zeal {
@ -57,8 +58,9 @@ protected:
void wheelEvent(QWheelEvent *event) override;
private:
QUrl clickedLink(const QPoint &pos) const;
QWebHitTestResult hitTestContent(const QPoint &pos) const;
QMenu *m_contextMenu = nullptr;
QUrl m_clickedLink;
int m_zoomLevel = defaultZoomLevel();
};