/* This file is (c) 2008-2012 Konstantin Isakov * Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */ #include "articlewebview.hh" #include #include #include #ifdef Q_OS_WIN32 #include #endif ArticleWebView::ArticleWebView( QWidget *parent ): QWebEngineView( parent ), midButtonPressed( false ), selectionBySingleClick( false ), showInspectorDirectly( true ) { } ArticleWebView::~ArticleWebView() { } void ArticleWebView::setUp( Config::Class * cfg ) { this->cfg = cfg; } void ArticleWebView::triggerPageAction( QWebEnginePage::WebAction action, bool checked ) { QWebEngineView::triggerPageAction( action, checked ); } bool ArticleWebView::event( QEvent * event ) { if (event->type() == QEvent::ChildAdded) { QChildEvent *child_ev = static_cast(event); //should restrict the child event type? child_ev->child()->installEventFilter(this); } return QWebEngineView::event(event); } bool ArticleWebView::eventFilter(QObject *obj, QEvent *ev) { if (ev->type() == QEvent::MouseButtonDblClick) { QMouseEvent *pe = static_cast(ev); mouseDoubleClickEvent(pe); return true; } // if (ev->type() == QEvent::MouseButtonPress) { // QMouseEvent *pe = static_cast(ev); // mousePressEvent(pe); // return true; // } // if (ev->type() == QEvent::MouseButtonRelease) { // QMouseEvent *pe = static_cast(ev); // mouseReleaseEvent(pe); // return true; // } if (ev->type() == QEvent::Wheel) { QWheelEvent *pe = static_cast(ev); wheelEvent(pe); return true; } if (ev->type() == QEvent::FocusIn) { QFocusEvent *pe = static_cast(ev); focusInEvent(pe); return true; } return QWebEngineView::eventFilter(obj, ev); } void ArticleWebView::mousePressEvent( QMouseEvent * event ) { if ( event->buttons() & Qt::MidButton ) midButtonPressed = true; QWebEngineView::mousePressEvent(event); qDebug() << event->buttons(); if (selectionBySingleClick && (event->buttons() & Qt::LeftButton)) { // findText(""); // clear the selection first, if any // QMouseEvent ev( QEvent::MouseButtonDblClick, event->pos(), Qt::LeftButton, Qt::LeftButton, event->modifiers() ); // QApplication::sendEvent( page(), &ev ); } } void ArticleWebView::mouseReleaseEvent( QMouseEvent * event ) { bool noMidButton = !( event->buttons() & Qt::MidButton ); QWebEngineView::mouseReleaseEvent( event ); if ( midButtonPressed & noMidButton ) midButtonPressed = false; } void ArticleWebView::mouseDoubleClickEvent( QMouseEvent * event ) { //QWebEngineView::mouseDoubleClickEvent( event ); //todo int scrollBarWidth = 0; int scrollBarHeight = 0; // emit the signal only if we are not double-clicking on scrollbars if ((event->x() < width() - scrollBarWidth) && (event->y() < height() - scrollBarHeight)) { emit doubleClicked(event->pos()); } } void ArticleWebView::focusInEvent( QFocusEvent * event ) { QWebEngineView::focusInEvent( event ); switch( event->reason() ) { case Qt::MouseFocusReason: case Qt::TabFocusReason: case Qt::BacktabFocusReason: page()->runJavaScript("top.focus();"); break; default: break; } } void ArticleWebView::wheelEvent( QWheelEvent *ev ) { #ifdef Q_OS_WIN32 // Avoid wrong mouse wheel handling in QWebEngineView // if system preferences is set to "scroll by page" if( ev->modifiers() == Qt::NoModifier ) { unsigned nLines; SystemParametersInfo( SPI_GETWHEELSCROLLLINES, 0, &nLines, 0 ); if( nLines == WHEEL_PAGESCROLL ) { QKeyEvent kev( QEvent::KeyPress, ev->delta() > 0 ? Qt::Key_PageUp : Qt::Key_PageDown, Qt::NoModifier ); QApplication::sendEvent( this, &kev ); ev->accept(); return; } } #endif if ( ev->modifiers().testFlag( Qt::ControlModifier ) ) { ev->ignore(); } else { QWebEngineView::wheelEvent( ev ); } }