goldendict-ng/src/ui/articlewebview.cc

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

180 lines
5 KiB
C++
Raw Normal View History

2012-02-20 21:47:14 +00:00
/* This file is (c) 2008-2012 Konstantin Isakov <ikm@goldendict.org>
* Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */
#include "articlewebpage.hh"
#include "articlewebview.hh"
#include <QMouseEvent>
2021-07-06 13:01:50 +00:00
#include <QWebEngineView>
#include <QApplication>
#include <QTimer>
2022-03-10 16:41:35 +00:00
#include <QDialog>
#include <QMainWindow>
#ifdef Q_OS_WIN32
2023-07-12 01:50:55 +00:00
#include <qt_windows.h>
#endif
2023-07-12 01:50:55 +00:00
ArticleWebView::ArticleWebView( QWidget * parent ):
2021-07-06 13:01:50 +00:00
QWebEngineView( parent ),
midButtonPressed( false ),
selectionBySingleClick( false )
{
auto page = new ArticleWebPage( this );
connect( page, &ArticleWebPage::linkClicked, this, &ArticleWebView::linkClicked );
this->setPage( page );
}
2023-07-11 16:54:15 +00:00
void ArticleWebView::setUp( Config::Class * _cfg )
{
2023-07-11 16:54:15 +00:00
this->cfg = _cfg;
setZoomFactor( _cfg->preferences.zoomFactor );
}
2022-03-10 16:41:35 +00:00
QWebEngineView * ArticleWebView::createWindow( QWebEnginePage::WebWindowType type )
{
2023-07-12 01:50:55 +00:00
if ( type == QWebEnginePage::WebWindowType::WebDialog ) {
2023-07-11 16:54:15 +00:00
auto dlg = new QMainWindow( this );
auto view = new QWebEngineView( dlg );
2023-07-12 01:50:55 +00:00
dlg->setCentralWidget( view );
dlg->resize( 400, 400 );
dlg->show();
2022-03-10 16:41:35 +00:00
return view;
}
2023-07-12 01:50:55 +00:00
return QWebEngineView::createWindow( type );
2022-03-10 16:41:35 +00:00
}
bool ArticleWebView::event( QEvent * event )
{
2023-07-12 01:50:55 +00:00
if ( event->type() == QEvent::ChildAdded ) {
2023-07-11 16:54:15 +00:00
auto child_ev = dynamic_cast< QChildEvent * >( event );
child_ev->child()->installEventFilter( this );
}
2021-12-05 06:50:54 +00:00
return QWebEngineView::event( event );
2021-12-05 06:50:54 +00:00
}
2023-07-12 01:50:55 +00:00
void ArticleWebView::linkClickedInHtml( QUrl const & )
{
//disable single click to simulate dbclick action on the new loaded pages.
2023-07-12 01:50:55 +00:00
singleClickToDbClick = false;
}
2023-07-12 01:50:55 +00:00
bool ArticleWebView::eventFilter( QObject * obj, QEvent * ev )
{
if ( ev->type() == QEvent::MouseButtonDblClick ) {
2023-07-11 16:54:15 +00:00
auto pe = dynamic_cast< QMouseEvent * >( ev );
2023-07-12 01:50:55 +00:00
if ( Qt::MouseEventSynthesizedByApplication != pe->source() ) {
singleClickToDbClick = false;
dbClicked = true;
}
2023-07-12 01:50:55 +00:00
}
if ( ev->type() == QEvent::MouseMove ) {
singleClickToDbClick = false;
}
if ( ev->type() == QEvent::MouseButtonPress ) {
2023-07-11 16:54:15 +00:00
auto pe = dynamic_cast< QMouseEvent * >( ev );
2023-07-12 01:50:55 +00:00
if ( pe->button() == Qt::LeftButton ) {
singleClickToDbClick = true;
dbClicked = false;
QTimer::singleShot( QApplication::doubleClickInterval(), this, [ = ]() {
singleClickAction( pe );
} );
}
2024-01-04 12:17:51 +00:00
if ( pe->buttons() & Qt::MiddleButton ) {
midButtonPressed = true;
2024-01-04 12:17:51 +00:00
QTimer::singleShot( 100, this, [ = ]() {
sendCustomMouseEvent( QEvent::MouseButtonPress );
sendCustomMouseEvent( QEvent::MouseButtonRelease );
} );
return false;
}
2023-07-12 01:50:55 +00:00
}
if ( ev->type() == QEvent::MouseButtonRelease ) {
2023-07-11 16:54:15 +00:00
auto pe = dynamic_cast< QMouseEvent * >( ev );
2023-07-12 01:50:55 +00:00
mouseReleaseEvent( pe );
if ( dbClicked ) {
//emit the signal after button release.emit earlier(in MouseButtonDblClick event) can not get selected text;
doubleClickAction( pe );
2021-12-05 06:50:54 +00:00
}
2023-07-12 01:50:55 +00:00
}
if ( ev->type() == QEvent::Wheel ) {
2023-07-11 16:54:15 +00:00
auto pe = dynamic_cast< QWheelEvent * >( ev );
2023-07-12 01:50:55 +00:00
wheelEvent( pe );
if ( pe->modifiers().testFlag( Qt::ControlModifier ) ) {
return true;
2021-12-05 06:50:54 +00:00
}
2023-07-12 01:50:55 +00:00
}
2021-12-05 06:50:54 +00:00
2023-07-12 01:50:55 +00:00
return QWebEngineView::eventFilter( obj, ev );
}
2023-07-12 01:50:55 +00:00
void ArticleWebView::singleClickAction( QMouseEvent * event )
{
2023-07-12 01:50:55 +00:00
if ( !singleClickToDbClick )
return;
2023-07-12 01:50:55 +00:00
if ( selectionBySingleClick ) {
findText( "" ); // clear the selection first, if any
//send dbl click event twice? send one time seems not work .weird really. need further investigate.
sendCustomMouseEvent( QEvent::MouseButtonDblClick );
sendCustomMouseEvent( QEvent::MouseButtonDblClick );
}
}
2023-07-12 01:50:55 +00:00
void ArticleWebView::sendCustomMouseEvent( QEvent::Type type )
{
QPoint pt = mapFromGlobal( QCursor::pos() );
QMouseEvent ev( type,
pt,
pt,
QCursor::pos(),
Qt::LeftButton,
Qt::LeftButton,
Qt::NoModifier,
Qt::MouseEventSynthesizedByApplication );
2022-01-02 16:50:46 +00:00
auto childrens = this->children();
2023-07-12 01:50:55 +00:00
for ( auto child : childrens ) {
QApplication::sendEvent( child, &ev );
2022-01-08 07:39:09 +00:00
}
}
2021-12-11 16:34:37 +00:00
2023-07-12 01:50:55 +00:00
void ArticleWebView::doubleClickAction( QMouseEvent * event )
{
if ( Qt::MouseEventSynthesizedByApplication != event->source() ) {
emit doubleClicked( event->pos() );
}
}
2023-07-12 01:50:55 +00:00
void ArticleWebView::wheelEvent( QWheelEvent * ev )
{
#ifdef Q_OS_WIN32
2021-07-06 13:01:50 +00:00
// Avoid wrong mouse wheel handling in QWebEngineView
// if system preferences is set to "scroll by page"
2023-07-12 01:50:55 +00:00
if ( ev->modifiers() == Qt::NoModifier ) {
unsigned nLines;
SystemParametersInfo( SPI_GETWHEELSCROLLLINES, 0, &nLines, 0 );
2023-07-12 01:50:55 +00:00
if ( nLines == WHEEL_PAGESCROLL ) {
QKeyEvent kev( QEvent::KeyPress, ev->angleDelta().y() > 0 ? Qt::Key_PageUp : Qt::Key_PageDown, Qt::NoModifier );
auto childrens = this->children();
2023-07-12 01:50:55 +00:00
for ( auto child : childrens ) {
QApplication::sendEvent( child, &kev );
}
ev->accept();
return;
}
}
#endif
2023-07-12 01:50:55 +00:00
if ( ev->modifiers().testFlag( Qt::ControlModifier ) ) {
ev->ignore();
}
2023-07-12 01:50:55 +00:00
else {
QWebEngineView::wheelEvent( ev );
}
}