/* * This file is part of smolbote. It's copyrighted by the contributors recorded * in the version control history of the file, available from its original * location: https://neueland.iserlohn-fortress.net/smolbote.hg * * SPDX-License-Identifier: GPL-3.0 */ #include "webview.h" #include "mainwindow/mainwindow.h" #include "mainwindow/widgets/tabbar.h" #include "widgets/pagemenu.h" #include "widgets/pagetoolsmenu.h" #include #include #include WebView::WebView(MainWindow *parentMainWindow, QWidget *parent) : QWebEngineView(parent) { Q_CHECK_PTR(parentMainWindow); m_parent = parentMainWindow; // load status and progress connect(this, &QWebEngineView::loadStarted, this, [this]() { m_loaded = false; }); connect(this, &QWebEngineView::loadFinished, this, [this]() { m_loaded = true; }); connect(this, &QWebEngineView::loadProgress, this, [this](int progress) { m_loadProgress = progress; if(m_loadProgress == 100) { m_loaded = true; emit loaded(); } }); m_pageMenu = new PageMenu(this); m_toolsMenu = new PageToolsMenu(this); } WebView::~WebView() { delete m_pageMenu; } QMenu *WebView::pageMenu() { Q_CHECK_PTR(m_pageMenu); return m_pageMenu; } void WebView::setPage(QWebEnginePage *page) { Q_CHECK_PTR(page); // make sure the page gets cleaned up if we replace it by taking ownership page->setParent(this); connect(page, &QWebEnginePage::linkHovered, this, &WebView::handleLinkHovered); QWebEngineView::setPage(page); } bool WebView::isLoaded() const { return m_loaded; } int WebView::loadProgress() const { return m_loadProgress; } WebView *WebView::createWindow(QWebEnginePage::WebWindowType type) { WebView *view = new WebView(m_parent); switch(type) { case QWebEnginePage::WebBrowserWindow: // a complete web browser window m_parent->newWindow()->tabBar->addTab(view); break; case QWebEnginePage::WebBrowserTab: // a web browser tab m_parent->tabBar->setCurrentIndex(m_parent->tabBar->addTab(view)); break; case QWebEnginePage::WebDialog: // a window without decorations m_parent->newWindow()->tabBar->addTab(view); break; case QWebEnginePage::WebBrowserBackgroundTab: // a web browser tab, but don't swap to it m_parent->tabBar->addTab(view); break; } return view; } void WebView::handleLinkHovered(const QString &url) { if(isVisible()) { m_parent->statusBar()->showMessage(url, 3000); } } void WebView::triggerViewAction(WebView::ViewAction action) { switch(action) { case BookmarkPage: emit newBookmark(this->title(), this->url()); break; } } WebView *createWebView(const QUrl &url, WebEngineProfile *profile, MainWindow *parent) { auto *view = new WebView(parent); auto *page = new WebPage(profile); view->setPage(page); page->load(url); return view; }