2012-02-20 21:47:14 +00:00
|
|
|
/* This file is (c) 2008-2012 Konstantin Isakov <ikm@goldendict.org>
|
2009-10-22 11:38:11 +00:00
|
|
|
* Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */
|
|
|
|
|
2023-04-17 20:12:27 +00:00
|
|
|
#include "articlewebpage.hh"
|
2009-10-22 11:38:11 +00:00
|
|
|
#include "articlewebview.hh"
|
|
|
|
#include <QMouseEvent>
|
2021-07-06 13:01:50 +00:00
|
|
|
#include <QWebEngineView>
|
2012-09-26 13:59:48 +00:00
|
|
|
#include <QApplication>
|
2021-12-09 08:02:29 +00:00
|
|
|
#include <QTimer>
|
2022-03-10 16:41:35 +00:00
|
|
|
#include <QDialog>
|
|
|
|
#include <QMainWindow>
|
2013-09-26 14:57:59 +00:00
|
|
|
#ifdef Q_OS_WIN32
|
2023-07-12 01:50:55 +00:00
|
|
|
#include <qt_windows.h>
|
2013-09-26 14:57:59 +00:00
|
|
|
#endif
|
|
|
|
|
2023-07-12 01:50:55 +00:00
|
|
|
ArticleWebView::ArticleWebView( QWidget * parent ):
|
2021-07-06 13:01:50 +00:00
|
|
|
QWebEngineView( parent ),
|
2013-05-30 02:18:28 +00:00
|
|
|
midButtonPressed( false ),
|
2023-03-20 04:44:28 +00:00
|
|
|
selectionBySingleClick( false )
|
2013-05-30 02:18:28 +00:00
|
|
|
{
|
2023-03-20 04:44:28 +00:00
|
|
|
auto page = new ArticleWebPage( this );
|
2022-05-18 14:31:47 +00:00
|
|
|
connect( page, &ArticleWebPage::linkClicked, this, &ArticleWebView::linkClicked );
|
|
|
|
this->setPage( page );
|
2013-05-30 02:18:28 +00:00
|
|
|
}
|
|
|
|
|
2023-03-20 04:44:28 +00:00
|
|
|
void ArticleWebView::setUp( Config::Class * cfg )
|
|
|
|
{
|
|
|
|
this->cfg = cfg;
|
2023-07-12 01:50:55 +00:00
|
|
|
setZoomFactor( cfg->preferences.zoomFactor );
|
2023-03-20 04:44:28 +00:00
|
|
|
}
|
|
|
|
|
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 ) {
|
|
|
|
QMainWindow * dlg = new QMainWindow( this );
|
2022-03-14 15:18:53 +00:00
|
|
|
QWebEngineView * view = new QWebEngineView( dlg );
|
2023-07-12 01:50:55 +00:00
|
|
|
dlg->setCentralWidget( view );
|
|
|
|
dlg->resize( 400, 400 );
|
2022-03-14 15:18:53 +00:00
|
|
|
dlg->show();
|
2022-03-10 16:41:35 +00:00
|
|
|
|
2022-03-14 15:18:53 +00:00
|
|
|
return view;
|
|
|
|
}
|
2023-07-12 01:50:55 +00:00
|
|
|
return QWebEngineView::createWindow( type );
|
2022-03-10 16:41:35 +00:00
|
|
|
}
|
|
|
|
|
2013-05-30 02:18:28 +00:00
|
|
|
bool ArticleWebView::event( QEvent * event )
|
|
|
|
{
|
2023-07-12 01:50:55 +00:00
|
|
|
if ( event->type() == QEvent::ChildAdded ) {
|
2022-03-14 15:18:53 +00:00
|
|
|
QChildEvent * child_ev = static_cast< QChildEvent * >( event );
|
|
|
|
child_ev->child()->installEventFilter( this );
|
|
|
|
}
|
2021-12-05 06:50:54 +00:00
|
|
|
|
2022-03-14 15:18:53 +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 & )
|
|
|
|
{
|
2022-01-14 00:19:49 +00:00
|
|
|
//disable single click to simulate dbclick action on the new loaded pages.
|
2023-07-12 01:50:55 +00:00
|
|
|
singleClickToDbClick = false;
|
2022-01-14 00:19:49 +00:00
|
|
|
}
|
2022-01-10 14:13:31 +00:00
|
|
|
|
2023-07-12 01:50:55 +00:00
|
|
|
bool ArticleWebView::eventFilter( QObject * obj, QEvent * ev )
|
|
|
|
{
|
|
|
|
if ( ev->type() == QEvent::MouseButtonDblClick ) {
|
|
|
|
QMouseEvent * pe = static_cast< QMouseEvent * >( ev );
|
|
|
|
if ( Qt::MouseEventSynthesizedByApplication != pe->source() ) {
|
|
|
|
singleClickToDbClick = false;
|
|
|
|
dbClicked = true;
|
2021-12-09 08:02:29 +00:00
|
|
|
}
|
2023-07-12 01:50:55 +00:00
|
|
|
}
|
|
|
|
if ( ev->type() == QEvent::MouseMove ) {
|
|
|
|
singleClickToDbClick = false;
|
|
|
|
}
|
|
|
|
if ( ev->type() == QEvent::MouseButtonPress ) {
|
|
|
|
QMouseEvent * pe = static_cast< QMouseEvent * >( ev );
|
|
|
|
if ( pe->button() == Qt::LeftButton ) {
|
|
|
|
singleClickToDbClick = true;
|
|
|
|
dbClicked = false;
|
|
|
|
QTimer::singleShot( QApplication::doubleClickInterval(), this, [ = ]() {
|
|
|
|
singleClickAction( pe );
|
|
|
|
} );
|
2021-12-09 08:02:29 +00:00
|
|
|
}
|
2023-07-12 01:50:55 +00:00
|
|
|
mousePressEvent( pe );
|
|
|
|
}
|
|
|
|
if ( ev->type() == QEvent::MouseButtonRelease ) {
|
|
|
|
QMouseEvent * pe = static_cast< QMouseEvent * >( ev );
|
|
|
|
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 ) {
|
|
|
|
QWheelEvent * pe = static_cast< QWheelEvent * >( ev );
|
|
|
|
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 );
|
2013-05-30 02:18:28 +00:00
|
|
|
}
|
2009-10-22 11:38:11 +00:00
|
|
|
|
2023-07-12 01:50:55 +00:00
|
|
|
void ArticleWebView::mousePressEvent( QMouseEvent * event )
|
2021-12-11 02:21:31 +00:00
|
|
|
{
|
2023-07-12 01:50:55 +00:00
|
|
|
if ( event->buttons() & Qt::MiddleButton )
|
2022-05-05 13:37:23 +00:00
|
|
|
midButtonPressed = true;
|
|
|
|
|
2023-07-12 01:50:55 +00:00
|
|
|
if ( event->buttons() & Qt::XButton1 ) {
|
2022-05-05 13:37:23 +00:00
|
|
|
back();
|
|
|
|
}
|
2023-07-12 01:50:55 +00:00
|
|
|
if ( event->buttons() & Qt::XButton2 ) {
|
2022-05-05 13:37:23 +00:00
|
|
|
forward();
|
|
|
|
}
|
2021-12-11 02:21:31 +00:00
|
|
|
}
|
|
|
|
|
2023-07-12 01:50:55 +00:00
|
|
|
void ArticleWebView::singleClickAction( QMouseEvent * event )
|
2009-10-22 11:38:11 +00:00
|
|
|
{
|
2023-07-12 01:50:55 +00:00
|
|
|
if ( !singleClickToDbClick )
|
2021-12-09 08:02:29 +00:00
|
|
|
return;
|
2021-12-11 02:21:31 +00:00
|
|
|
|
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 );
|
2012-09-26 13:59:48 +00:00
|
|
|
}
|
2009-10-22 11:38:11 +00:00
|
|
|
}
|
|
|
|
|
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
|
|
|
|
2022-01-10 13:40:21 +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::mouseReleaseEvent( QMouseEvent * event )
|
|
|
|
{
|
2021-12-26 11:01:05 +00:00
|
|
|
bool noMidButton = !( event->buttons() & Qt::MiddleButton );
|
2009-10-22 11:38:11 +00:00
|
|
|
|
2023-07-12 01:50:55 +00:00
|
|
|
// if ( midButtonPressed & noMidButton )
|
|
|
|
// midButtonPressed = false;
|
2009-10-22 11:38:11 +00:00
|
|
|
}
|
|
|
|
|
2023-07-12 01:50:55 +00:00
|
|
|
void ArticleWebView::doubleClickAction( QMouseEvent * event )
|
|
|
|
{
|
|
|
|
if ( Qt::MouseEventSynthesizedByApplication != event->source() ) {
|
|
|
|
emit doubleClicked( event->pos() );
|
2011-07-05 19:58:02 +00:00
|
|
|
}
|
2010-04-08 20:37:59 +00:00
|
|
|
}
|
2011-09-03 14:45:43 +00:00
|
|
|
|
2023-07-12 01:50:55 +00:00
|
|
|
void ArticleWebView::wheelEvent( QWheelEvent * ev )
|
2013-01-01 23:05:29 +00:00
|
|
|
{
|
2013-09-26 14:57:59 +00:00
|
|
|
#ifdef Q_OS_WIN32
|
|
|
|
|
2021-07-06 13:01:50 +00:00
|
|
|
// Avoid wrong mouse wheel handling in QWebEngineView
|
2013-09-26 14:57:59 +00:00
|
|
|
// if system preferences is set to "scroll by page"
|
|
|
|
|
2023-07-12 01:50:55 +00:00
|
|
|
if ( ev->modifiers() == Qt::NoModifier ) {
|
2013-09-26 14:57:59 +00:00
|
|
|
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 );
|
2022-01-10 13:40:21 +00:00
|
|
|
auto childrens = this->children();
|
2023-07-12 01:50:55 +00:00
|
|
|
for ( auto child : childrens ) {
|
|
|
|
QApplication::sendEvent( child, &kev );
|
2022-01-10 13:40:21 +00:00
|
|
|
}
|
2013-09-26 14:57:59 +00:00
|
|
|
|
|
|
|
ev->accept();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2023-07-12 01:50:55 +00:00
|
|
|
if ( ev->modifiers().testFlag( Qt::ControlModifier ) ) {
|
|
|
|
ev->ignore();
|
2013-01-01 23:05:29 +00:00
|
|
|
}
|
2023-07-12 01:50:55 +00:00
|
|
|
else {
|
|
|
|
QWebEngineView::wheelEvent( ev );
|
2013-01-01 23:05:29 +00:00
|
|
|
}
|
|
|
|
}
|