diff options
| author | 2023-03-07 21:11:06 +0600 | |
|---|---|---|
| committer | 2023-03-07 21:11:06 +0600 | |
| commit | d830bfc8ce7c6763d074beafdde7cab1835d31f9 (patch) | |
| tree | 179f81f3b42779b1f6fb69deed6b69dab39f4f89 /src/webview.cpp | |
| download | whatsie-d830bfc8ce7c6763d074beafdde7cab1835d31f9.tar.gz whatsie-d830bfc8ce7c6763d074beafdde7cab1835d31f9.zip | |
Import Upstream version 4.12.0upstream/4.12.0
Diffstat (limited to 'src/webview.cpp')
| -rw-r--r-- | src/webview.cpp | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/src/webview.cpp b/src/webview.cpp new file mode 100644 index 0000000..cfd9af9 --- /dev/null +++ b/src/webview.cpp @@ -0,0 +1,119 @@ +#include "webview.h" + +#include <QContextMenuEvent> +#include <QMenu> +#include <QWebEngineContextMenuData> +#include <QWebEngineProfile> +#include <mainwindow.h> + +WebView::WebView(QWidget *parent, QStringList dictionaries) + : QWebEngineView(parent) { + m_dictionaries = dictionaries; + + QObject *parentMainWindow = this->parent(); + while (!parentMainWindow->objectName().contains("MainWindow")) { + parentMainWindow = parentMainWindow->parent(); + } + MainWindow *mainWindow = dynamic_cast<MainWindow *>(parentMainWindow); + + connect(this, &WebView::titleChanged, mainWindow, + &MainWindow::handleWebViewTitleChanged); + connect(this, &WebView::loadFinished, mainWindow, + &MainWindow::handleLoadFinished); + connect(this, &WebView::renderProcessTerminated, + [this](QWebEnginePage::RenderProcessTerminationStatus termStatus, + int statusCode) { + QString status; + switch (termStatus) { + case QWebEnginePage::NormalTerminationStatus: + status = tr("Render process normal exit"); + break; + case QWebEnginePage::AbnormalTerminationStatus: + status = tr("Render process abnormal exit"); + break; + case QWebEnginePage::CrashedTerminationStatus: + status = tr("Render process crashed"); + break; + case QWebEnginePage::KilledTerminationStatus: + status = tr("Render process killed"); + break; + } + QMessageBox::StandardButton btn = + QMessageBox::question(window(), status, + tr("Render process exited with code: %1\n" + "Do you want to reload the page ?") + .arg(statusCode)); + if (btn == QMessageBox::Yes) + QTimer::singleShot(0, this, [this] { this->reload(); }); + }); +} + +void WebView::wheelEvent(QWheelEvent *event) { + if (event->modifiers().testFlag(Qt::ControlModifier)) { + qDebug() << "skipped ctrl + m_wheel event on webengineview"; + // do nothing + } else { + qDebug() << "wheel event on webengine view"; + QWebEngineView::wheelEvent(event); + } +} + +void WebView::contextMenuEvent(QContextMenuEvent *event) { + + QMenu *menu = page()->createStandardContextMenu(); + menu->setAttribute(Qt::WA_DeleteOnClose, true); + // hide reload, back, forward, savepage, copyimagelink menus + foreach (auto *action, menu->actions()) { + if (action == page()->action(QWebEnginePage::SavePage) || + action == page()->action(QWebEnginePage::Reload) || + action == page()->action(QWebEnginePage::Back) || + action == page()->action(QWebEnginePage::Forward) || + action == page()->action(QWebEnginePage::CopyImageUrlToClipboard)) { + action->setVisible(false); + } + } + + const QWebEngineContextMenuData &data = page()->contextMenuData(); + Q_ASSERT(data.isValid()); + + // allow context menu on image + if (data.mediaType() == QWebEngineContextMenuData::MediaTypeImage) { + QWebEngineView::contextMenuEvent(event); + return; + } + // if content is not editable + if (data.selectedText().isEmpty() && !data.isContentEditable()) { + event->ignore(); + return; + } + + QWebEngineProfile *profile = page()->profile(); + const QStringList &languages = profile->spellCheckLanguages(); + + menu->addSeparator(); + + QAction *spellcheckAction = new QAction(tr("Check Spelling"), menu); + spellcheckAction->setCheckable(true); + spellcheckAction->setChecked(profile->isSpellCheckEnabled()); + connect(spellcheckAction, &QAction::toggled, this, + [profile, this](bool toogled) { + profile->setSpellCheckEnabled(toogled); + settings.setValue("sc_enabled", toogled); + }); + menu->addAction(spellcheckAction); + + if (profile->isSpellCheckEnabled()) { + QMenu *subMenu = menu->addMenu(tr("Select Language")); + for (const QString &dict : qAsConst(m_dictionaries)) { + QAction *action = subMenu->addAction(dict); + action->setCheckable(true); + action->setChecked(languages.contains(dict)); + connect(action, &QAction::triggered, this, [profile, dict, this]() { + profile->setSpellCheckLanguages(QStringList() << dict); + settings.setValue("sc_dict", dict); + }); + } + } + connect(menu, &QMenu::aboutToHide, menu, &QObject::deleteLater); + menu->popup(event->globalPos()); +} |
