From c6387df39232bde23809de1a1e59fb69477661e2 Mon Sep 17 00:00:00 2001 From: YiFang Xiao Date: Sun, 3 Nov 2024 17:11:02 +0800 Subject: [PATCH] 1 --- src/ui/articleview.cc | 270 +++++++++++++++++++++++------------------- src/ui/articleview.hh | 8 +- src/ui/mainwindow.cc | 8 +- src/ui/mainwindow.hh | 2 +- 4 files changed, 157 insertions(+), 131 deletions(-) diff --git a/src/ui/articleview.cc b/src/ui/articleview.cc index 722fde5a..fb9b3a8a 100644 --- a/src/ui/articleview.cc +++ b/src/ui/articleview.cc @@ -85,7 +85,144 @@ QString ArticleView::scrollToFromDictionaryId( QString const & dictionaryId ) Q_ASSERT( !isScrollTo( dictionaryId ) ); return scrollToPrefix + dictionaryId; } +ArticleView::ArticleView( QWidget * parent, + ArticleNetworkAccessManager & nm, + AudioPlayerPtr const & audioPlayer_, + Config::Class const & cfg_ ): + QWidget( parent ), + articleNetMgr( nm ), + audioPlayer( audioPlayer_ ), + cfg( cfg_ ) +{ + // setup GUI + setupWebview(); +} +void ArticleView::setupWebview() +{ // setup GUI + this->webview = new ArticleWebView( this ); + this->ftsSearchPanel = new FtsSearchPanel( this ); + this->searchPanel = new SearchPanel( this ); + this->searchPanel->hide(); + this->ftsSearchPanel->hide(); + // Layout + auto * mainLayout = new QVBoxLayout( this ); + mainLayout->addWidget( this->webview ); + mainLayout->addWidget( this->ftsSearchPanel ); + mainLayout->addWidget( this->searchPanel ); + this->webview->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); + this->ftsSearchPanel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ); + this->searchPanel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ); + + mainLayout->setContentsMargins( 0, 0, 0, 0 ); + + // end UI setup + + connect( this->searchPanel->previous, &QPushButton::clicked, this, &ArticleView::on_searchPrevious_clicked ); + connect( this->searchPanel->next, &QPushButton::clicked, this, &ArticleView::on_searchNext_clicked ); + connect( this->searchPanel->close, &QPushButton::clicked, this, &ArticleView::on_searchCloseButton_clicked ); + connect( this->searchPanel->caseSensitive, &QCheckBox::toggled, this, &ArticleView::on_searchCaseSensitive_clicked ); + connect( this->searchPanel->lineEdit, &QLineEdit::textEdited, this, &ArticleView::on_searchText_textEdited ); + connect( this->searchPanel->lineEdit, &QLineEdit::returnPressed, this, &ArticleView::on_searchText_returnPressed ); + connect( this->ftsSearchPanel->next, &QPushButton::clicked, this, &ArticleView::on_ftsSearchNext_clicked ); + connect( this->ftsSearchPanel->previous, &QPushButton::clicked, this, &ArticleView::on_ftsSearchPrevious_clicked ); + + // + + this->webview->setUp( const_cast< Config::Class * >( &this->cfg ) ); + + this->syncBackgroundColorWithCfgDarkReader(); + + this->goBackAction.setShortcut( QKeySequence( "Alt+Left" ) ); + this->webview->addAction( &this->goBackAction ); + connect( &this->goBackAction, &QAction::triggered, this, &ArticleView::back ); + + this->goForwardAction.setShortcut( QKeySequence( "Alt+Right" ) ); + this->webview->addAction( &this->goForwardAction ); + connect( &this->goForwardAction, &QAction::triggered, this, &ArticleView::forward ); + + this->webview->pageAction( QWebEnginePage::Copy )->setShortcut( QKeySequence::Copy ); + this->webview->addAction( this->webview->pageAction( QWebEnginePage::Copy ) ); + + QAction * selectAll = this->webview->pageAction( QWebEnginePage::SelectAll ); + selectAll->setShortcut( QKeySequence::SelectAll ); + selectAll->setShortcutContext( Qt::WidgetWithChildrenShortcut ); + this->webview->addAction( selectAll ); + + this->webview->setContextMenuPolicy( Qt::CustomContextMenu ); + + connect( this->webview, &QWebEngineView::loadFinished, this, &ArticleView::loadFinished ); + + connect( this->webview, &ArticleWebView::linkClicked, this, &ArticleView::linkClicked ); + + connect( this->webview->page(), &QWebEnginePage::titleChanged, this, &ArticleView::handleTitleChanged ); + + connect( this->webview, &QWidget::customContextMenuRequested, this, &ArticleView::contextMenuRequested ); + + connect( this->webview->page(), &QWebEnginePage::linkHovered, this, &ArticleView::linkHovered ); + + connect( this->webview, &ArticleWebView::doubleClicked, this, &ArticleView::doubleClicked ); + + this->pasteAction.setShortcut( QKeySequence::Paste ); + this->webview->addAction( &this->pasteAction ); + connect( &this->pasteAction, &QAction::triggered, this, &ArticleView::pasteTriggered ); + + this->articleUpAction.setShortcut( QKeySequence( "Alt+Up" ) ); + this->webview->addAction( &this->articleUpAction ); + connect( &this->articleUpAction, &QAction::triggered, this, &ArticleView::moveOneArticleUp ); + + this->articleDownAction.setShortcut( QKeySequence( "Alt+Down" ) ); + this->webview->addAction( &this->articleDownAction ); + connect( &this->articleDownAction, &QAction::triggered, this, &ArticleView::moveOneArticleDown ); + + this->selectCurrentArticleAction.setShortcut( QKeySequence( "Ctrl+Shift+A" ) ); + this->selectCurrentArticleAction.setText( tr( "Select Current Article" ) ); + this->webview->addAction( &this->selectCurrentArticleAction ); + connect( &this->selectCurrentArticleAction, &QAction::triggered, this, &ArticleView::selectCurrentArticle ); + + this->copyAsTextAction.setShortcut( QKeySequence( "Ctrl+Shift+C" ) ); + this->copyAsTextAction.setText( tr( "Copy as text" ) ); + this->webview->addAction( &this->copyAsTextAction ); + connect( &this->copyAsTextAction, &QAction::triggered, this, &ArticleView::copyAsText ); + + this->inspectAction.setShortcut( QKeySequence( Qt::Key_F12 ) ); + this->inspectAction.setText( tr( "Inspect" ) ); + this->webview->addAction( &this->inspectAction ); + + + connect( &this->inspectAction, &QAction::triggered, this, &ArticleView::inspectElement ); + + this->webview->installEventFilter( this ); + this->searchPanel->installEventFilter( this ); + this->ftsSearchPanel->installEventFilter( this ); + + QWebEngineSettings * settings = this->webview->settings(); + settings->setUnknownUrlSchemePolicy( QWebEngineSettings::UnknownUrlSchemePolicy::DisallowUnknownUrlSchemes ); +#if ( QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) ) + settings->defaultSettings()->setAttribute( QWebEngineSettings::LocalContentCanAccessRemoteUrls, true ); + settings->defaultSettings()->setAttribute( QWebEngineSettings::LocalContentCanAccessFileUrls, true ); + settings->defaultSettings()->setAttribute( QWebEngineSettings::ErrorPageEnabled, false ); + settings->defaultSettings()->setAttribute( QWebEngineSettings::LinksIncludedInFocusChain, false ); + settings->defaultSettings()->setAttribute( QWebEngineSettings::PlaybackRequiresUserGesture, false ); + settings->defaultSettings()->setAttribute( QWebEngineSettings::JavascriptCanAccessClipboard, true ); + settings->defaultSettings()->setAttribute( QWebEngineSettings::PrintElementBackgrounds, false ); +#else + settings->setAttribute( QWebEngineSettings::LocalContentCanAccessRemoteUrls, true ); + settings->setAttribute( QWebEngineSettings::LocalContentCanAccessFileUrls, true ); + settings->setAttribute( QWebEngineSettings::ErrorPageEnabled, false ); + settings->setAttribute( QWebEngineSettings::LinksIncludedInFocusChain, false ); + settings->setAttribute( QWebEngineSettings::PlaybackRequiresUserGesture, false ); + settings->setAttribute( QWebEngineSettings::JavascriptCanAccessClipboard, true ); + settings->setAttribute( QWebEngineSettings::PrintElementBackgrounds, false ); +#endif + + + this->expandOptionalParts = this->cfg.preferences.alwaysExpandOptionalParts; +#ifndef Q_OS_MACOS + this->webview->grabGesture( Gestures::GDPinchGestureType ); + this->webview->grabGesture( Gestures::GDSwipeGestureType ); +#endif +} ArticleView::ArticleView( QWidget * parent, ArticleNetworkAccessManager & nm, AudioPlayerPtr const & audioPlayer_, @@ -115,133 +252,11 @@ ArticleView::ArticleView( QWidget * parent, translateLine( translateLine_ ) { // setup GUI - webview = new ArticleWebView( this ); - ftsSearchPanel = new FtsSearchPanel( this ); - searchPanel = new SearchPanel( this ); - searchPanel->hide(); - ftsSearchPanel->hide(); - // Layout - auto * mainLayout = new QVBoxLayout( this ); - mainLayout->addWidget( webview ); - mainLayout->addWidget( ftsSearchPanel ); - mainLayout->addWidget( searchPanel ); + setupWebview(); - webview->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); - ftsSearchPanel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ); - searchPanel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ); - - mainLayout->setContentsMargins( 0, 0, 0, 0 ); - - // end UI setup - - connect( searchPanel->previous, &QPushButton::clicked, this, &ArticleView::on_searchPrevious_clicked ); - connect( searchPanel->next, &QPushButton::clicked, this, &ArticleView::on_searchNext_clicked ); - connect( searchPanel->close, &QPushButton::clicked, this, &ArticleView::on_searchCloseButton_clicked ); - connect( searchPanel->caseSensitive, &QCheckBox::toggled, this, &ArticleView::on_searchCaseSensitive_clicked ); - connect( searchPanel->lineEdit, &QLineEdit::textEdited, this, &ArticleView::on_searchText_textEdited ); - connect( searchPanel->lineEdit, &QLineEdit::returnPressed, this, &ArticleView::on_searchText_returnPressed ); - connect( ftsSearchPanel->next, &QPushButton::clicked, this, &ArticleView::on_ftsSearchNext_clicked ); - connect( ftsSearchPanel->previous, &QPushButton::clicked, this, &ArticleView::on_ftsSearchPrevious_clicked ); - - // - - webview->setUp( const_cast< Config::Class * >( &cfg ) ); - - syncBackgroundColorWithCfgDarkReader(); - - goBackAction.setShortcut( QKeySequence( "Alt+Left" ) ); - webview->addAction( &goBackAction ); - connect( &goBackAction, &QAction::triggered, this, &ArticleView::back ); - - goForwardAction.setShortcut( QKeySequence( "Alt+Right" ) ); - webview->addAction( &goForwardAction ); - connect( &goForwardAction, &QAction::triggered, this, &ArticleView::forward ); - - webview->pageAction( QWebEnginePage::Copy )->setShortcut( QKeySequence::Copy ); - webview->addAction( webview->pageAction( QWebEnginePage::Copy ) ); - - QAction * selectAll = webview->pageAction( QWebEnginePage::SelectAll ); - selectAll->setShortcut( QKeySequence::SelectAll ); - selectAll->setShortcutContext( Qt::WidgetWithChildrenShortcut ); - webview->addAction( selectAll ); - - webview->setContextMenuPolicy( Qt::CustomContextMenu ); - - connect( webview, &QWebEngineView::loadFinished, this, &ArticleView::loadFinished ); - - connect( webview, &ArticleWebView::linkClicked, this, &ArticleView::linkClicked ); - - connect( webview->page(), &QWebEnginePage::titleChanged, this, &ArticleView::handleTitleChanged ); - - connect( webview, &QWidget::customContextMenuRequested, this, &ArticleView::contextMenuRequested ); - - connect( webview->page(), &QWebEnginePage::linkHovered, this, &ArticleView::linkHovered ); - - connect( webview, &ArticleWebView::doubleClicked, this, &ArticleView::doubleClicked ); - - pasteAction.setShortcut( QKeySequence::Paste ); - webview->addAction( &pasteAction ); - connect( &pasteAction, &QAction::triggered, this, &ArticleView::pasteTriggered ); - - articleUpAction.setShortcut( QKeySequence( "Alt+Up" ) ); - webview->addAction( &articleUpAction ); - connect( &articleUpAction, &QAction::triggered, this, &ArticleView::moveOneArticleUp ); - - articleDownAction.setShortcut( QKeySequence( "Alt+Down" ) ); - webview->addAction( &articleDownAction ); - connect( &articleDownAction, &QAction::triggered, this, &ArticleView::moveOneArticleDown ); - - selectCurrentArticleAction.setShortcut( QKeySequence( "Ctrl+Shift+A" ) ); - selectCurrentArticleAction.setText( tr( "Select Current Article" ) ); - webview->addAction( &selectCurrentArticleAction ); - connect( &selectCurrentArticleAction, &QAction::triggered, this, &ArticleView::selectCurrentArticle ); - - copyAsTextAction.setShortcut( QKeySequence( "Ctrl+Shift+C" ) ); - copyAsTextAction.setText( tr( "Copy as text" ) ); - webview->addAction( ©AsTextAction ); - connect( ©AsTextAction, &QAction::triggered, this, &ArticleView::copyAsText ); - - inspectAction.setShortcut( QKeySequence( Qt::Key_F12 ) ); - inspectAction.setText( tr( "Inspect" ) ); - webview->addAction( &inspectAction ); - - - connect( &inspectAction, &QAction::triggered, this, &ArticleView::inspectElement ); - - webview->installEventFilter( this ); - searchPanel->installEventFilter( this ); - ftsSearchPanel->installEventFilter( this ); - - QWebEngineSettings * settings = webview->settings(); - settings->setUnknownUrlSchemePolicy( QWebEngineSettings::UnknownUrlSchemePolicy::DisallowUnknownUrlSchemes ); -#if ( QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) ) - settings->defaultSettings()->setAttribute( QWebEngineSettings::LocalContentCanAccessRemoteUrls, true ); - settings->defaultSettings()->setAttribute( QWebEngineSettings::LocalContentCanAccessFileUrls, true ); - settings->defaultSettings()->setAttribute( QWebEngineSettings::ErrorPageEnabled, false ); - settings->defaultSettings()->setAttribute( QWebEngineSettings::LinksIncludedInFocusChain, false ); - settings->defaultSettings()->setAttribute( QWebEngineSettings::PlaybackRequiresUserGesture, false ); - settings->defaultSettings()->setAttribute( QWebEngineSettings::JavascriptCanAccessClipboard, true ); - settings->defaultSettings()->setAttribute( QWebEngineSettings::PrintElementBackgrounds, false ); -#else - settings->setAttribute( QWebEngineSettings::LocalContentCanAccessRemoteUrls, true ); - settings->setAttribute( QWebEngineSettings::LocalContentCanAccessFileUrls, true ); - settings->setAttribute( QWebEngineSettings::ErrorPageEnabled, false ); - settings->setAttribute( QWebEngineSettings::LinksIncludedInFocusChain, false ); - settings->setAttribute( QWebEngineSettings::PlaybackRequiresUserGesture, false ); - settings->setAttribute( QWebEngineSettings::JavascriptCanAccessClipboard, true ); - settings->setAttribute( QWebEngineSettings::PrintElementBackgrounds, false ); -#endif - - auto html = articleNetMgr.getHtml( ResourceType::UNTITLE ); - - webview->setHtml( QString::fromStdString( html ) ); - - expandOptionalParts = cfg.preferences.alwaysExpandOptionalParts; -#ifndef Q_OS_MACOS - webview->grabGesture( Gestures::GDPinchGestureType ); - webview->grabGesture( Gestures::GDSwipeGestureType ); -#endif + auto html = this->articleNetMgr.getHtml( ResourceType::UNTITLE ); + this->webview->setHtml( QString::fromStdString( html ) ); connect( GlobalBroadcaster::instance(), &GlobalBroadcaster::dictionaryChanges, this, &ArticleView::setActiveDictIds ); connect( GlobalBroadcaster::instance(), &GlobalBroadcaster::dictionaryClear, this, &ArticleView::dictionaryClear ); @@ -2165,6 +2180,11 @@ void ArticleView::clearContent() webview->setHtml( QString::fromStdString( html ) ); } +void ArticleView::load( QString url ) +{ + webview->load( QUrl( url ) ); +} + ResourceToSaveHandler::ResourceToSaveHandler( ArticleView * view, QString fileName ): QObject( view ), diff --git a/src/ui/articleview.hh b/src/ui/articleview.hh index 58d5b5fa..fc9d7c70 100644 --- a/src/ui/articleview.hh +++ b/src/ui/articleview.hh @@ -96,7 +96,10 @@ public: QLineEdit const * translateLine, QAction * dictionaryBarToggled = nullptr, unsigned currentGroupId = 0 ); - + explicit ArticleView( QWidget * parent, + ArticleNetworkAccessManager & nm, + AudioPlayerPtr const & audioPlayer_, + Config::Class const & cfg_ ); void setCurrentGroupId( unsigned currengGrgId ); unsigned getCurrentGroupId(); @@ -109,7 +112,7 @@ public: ~ArticleView(); - + void load( QString url ); /// Returns "gdfrom-" + dictionaryId. static QString scrollToFromDictionaryId( QString const & dictionaryId ); @@ -412,6 +415,7 @@ private: QString getMutedForGroup( unsigned group ); QStringList getMutedDictionaries( unsigned group ); + void setupWebview(); }; class ResourceToSaveHandler: public QObject diff --git a/src/ui/mainwindow.cc b/src/ui/mainwindow.cc index 28db0f3a..f8248309 100644 --- a/src/ui/mainwindow.cc +++ b/src/ui/mainwindow.cc @@ -4370,12 +4370,14 @@ void MainWindow::showFTSIndexingName( QString const & name ) } } -void MainWindow::openWebsiteInNewTab( QString const & name, QString const & url ) +void MainWindow::openWebsiteInNewTab( QString name, QString url ) { QString escaped = Utils::escapeAmps( name ); - auto view = new QWebEngineView( this ); - view->load( QUrl( url ) ); + auto * view = new ArticleView( this, articleNetMgr, audioPlayerFactory.player(), cfg ); + + connect( view, &ArticleView::inspectSignal, this, &MainWindow::inspectElement ); + view->load( url ); int index = cfg.preferences.newTabsOpenAfterCurrentOne ? ui.tabWidget->currentIndex() + 1 : ui.tabWidget->count(); ui.tabWidget->insertTab( index, view, escaped ); diff --git a/src/ui/mainwindow.hh b/src/ui/mainwindow.hh index 3172413d..4a153b26 100644 --- a/src/ui/mainwindow.hh +++ b/src/ui/mainwindow.hh @@ -293,7 +293,7 @@ private slots: void openDictionaryFolder( QString const & id ); void showFTSIndexingName( QString const & name ); - void openWebsiteInNewTab( QString const & name, QString const & url ); + void openWebsiteInNewTab( QString name, QString url ); void handleAddToFavoritesButton();