From 35d8464f8975ab35c1e2f1a076302d9f95bfb22c Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Tue, 11 Mar 2025 23:02:44 +0530 Subject: Refactor browsermanager to webviewstack --- src/widgets/BrowserManager.cpp | 151 ----------------------------------------- src/widgets/MainWindow.cpp | 29 ++++---- src/widgets/WebViewStack.cpp | 136 +++++++++++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+), 165 deletions(-) delete mode 100644 src/widgets/BrowserManager.cpp create mode 100644 src/widgets/WebViewStack.cpp (limited to 'src/widgets') diff --git a/src/widgets/BrowserManager.cpp b/src/widgets/BrowserManager.cpp deleted file mode 100644 index 5ac6479..0000000 --- a/src/widgets/BrowserManager.cpp +++ /dev/null @@ -1,151 +0,0 @@ -#include -#include -#include - -#include "widgets/BrowserManager.hpp" - -BrowserManager::BrowserManager(QWebEngineProfile *profile) : QWidget() { - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - - layout = new QStackedLayout(this); - layout->setStackingMode(QStackedLayout::StackAll); - layout->setContentsMargins(0, 0, 0, 0); - - this->profile = profile; - - createNewWebView(BrowserManager::NewtabURL, true); -} - -void BrowserManager::openUrl(QUrl url, OpenType openType) { - switch (openType) { - case OpenType::OpenUrl: - setCurrentUrl(url); - break; - case OpenType::OpenUrlInTab: - createNewWebView(url, true); - break; - case OpenType::OpenUrlInBgTab: - createNewWebView(url, false); - break; - case OpenType::OpenUrlInWindow: - // TODO: impl - break; - } -} - -QWebEngineView *BrowserManager::createNewWebView(QUrl url, bool focus) { - auto webview = new QWebEngineView(profile); - webview->setUrl(url); - layout->addWidget(webview); - webViewList.append(webview); - - connect(webview->page(), &QWebEnginePage::newWindowRequested, this, - &BrowserManager::onNewWebViewRequest); - // connect(webview->page(), &QWebEnginePage::windowCloseRequested, this, - // [this, webview]() { - // for (int i = 0; i <= this->webViewList.length(); i++) { - // auto w = this->webViewList.at(0); - // printf("::::: %d\n\n", w == webview); - // if (w == webview) { - // this->closeWebView(i); - // } - // } - // }); - - if (focus) - focusWebView(webViewList.length() - 1); - - return webview; -} - -void BrowserManager::onNewWebViewRequest(QWebEngineNewWindowRequest &request) { - switch (request.destination()) { - case QWebEngineNewWindowRequest::InNewTab: - createNewWebView(request.requestedUrl(), true); - break; - case QWebEngineNewWindowRequest::InNewBackgroundTab: - createNewWebView(request.requestedUrl(), false); - break; - case QWebEngineNewWindowRequest::InNewWindow: - // TODO: Impl - createNewWebView(request.requestedUrl(), true); - break; - case QWebEngineNewWindowRequest::InNewDialog: - // TODO: Impl - createNewWebView(request.requestedUrl(), true); - break; - } -} - -void BrowserManager::nextWebView() { - if (webViewList.isEmpty()) - return; - auto index = currentWebViewIndex() + 1; - auto total = webViewList.length(); - index = index >= total ? index % total : index; - focusWebView(index); -} - -void BrowserManager::previousWebView() { - if (webViewList.isEmpty()) - return; - auto index = currentWebViewIndex() - 1; - auto total = webViewList.length(); - index = index < 0 ? total + index : index; - focusWebView(index); -} - -void BrowserManager::closeCurrentWebView() { - closeWebView(currentWebViewIndex()); -} - -void BrowserManager::closeWebView(long index) { - if (index < 0 || index >= webViewList.length()) - return; - - auto webview = webViewList.at(index); - layout->removeWidget(webview); - webViewList.removeAt(index); - disconnect(webview->page()); - webview->deleteLater(); - - focusWebView(currentWebViewIndex()); - - if (webViewList.isEmpty()) { - createNewWebView(BrowserManager::NewtabURL, true); - } -} - -std::vector BrowserManager::webViewUrls() { - std::vector urls; - for (auto &view : webViewList) - urls.push_back(view->url()); - return urls; -} - -u_int32_t BrowserManager::currentWebViewIndex() { - return layout->currentIndex(); -} -u_int32_t BrowserManager::webViewCount() { return webViewList.length(); } - -void BrowserManager::focusWebView(long index) { - if (webViewList.isEmpty()) - return; - - index = std::max((long)0, std::min(index, (long)webViewList.length() - 1)); - layout->setCurrentIndex(index); -} - -QUrl BrowserManager::currentUrl() { - if (currentWebViewIndex() >= webViewList.length()) - return QUrl("about:newtab"); - - return webViewList.at(currentWebViewIndex())->url(); -} - -void BrowserManager::setCurrentUrl(QUrl url) { - if (currentWebViewIndex() >= webViewList.length()) - return; - - webViewList.at(currentWebViewIndex())->setUrl(url); -} diff --git a/src/widgets/MainWindow.cpp b/src/widgets/MainWindow.cpp index f2825e8..2d936aa 100644 --- a/src/widgets/MainWindow.cpp +++ b/src/widgets/MainWindow.cpp @@ -7,9 +7,9 @@ #include "CommandParser.hpp" #include "completion/CommandsAdapter.hpp" #include "completion/UrlAdapter.hpp" -#include "widgets/BrowserManager.hpp" #include "widgets/InputLine.hpp" #include "widgets/MainWindow.hpp" +#include "widgets/WebViewStack.hpp" MainWindow::MainWindow() { setStyleSheet("background-color: #000; color: #fff;"); @@ -23,8 +23,8 @@ MainWindow::MainWindow() { centralWidget()->setLayout(layout); // Web engine - browserManager = new BrowserManager(new QWebEngineProfile("web-browser")); - layout->addWidget(browserManager); + webViewStack = new WebViewStack(new QWebEngineProfile("web-browser")); + layout->addWidget(webViewStack); // Command input inputLine = new InputLine; @@ -38,7 +38,7 @@ MainWindow::MainWindow() { luaRuntime = LuaRuntime::instance(); connect(luaRuntime, &LuaRuntime::urlOpened, this, [this](QString url, OpenType openType) { - browserManager->openUrl(QUrl(url), openType); + webViewStack->openUrl(QUrl(url), openType); }); } @@ -78,7 +78,7 @@ void MainWindow::onInputSubmit(QString input) { if (dynamic_cast(currentEvaluationType)) { evaluateCommand(input); } else if (auto urlEval = dynamic_cast(currentEvaluationType)) { - browserManager->openUrl(input, urlEval->type()); + webViewStack->openUrl(input, urlEval->type()); } } @@ -94,19 +94,19 @@ void MainWindow::evaluateCommand(QString command) { if (cmd.argsString.trimmed().isEmpty()) showURLInput("", OpenType::OpenUrl); else - browserManager->openUrl(cmd.argsString, OpenType::OpenUrl); + webViewStack->openUrl(cmd.argsString, OpenType::OpenUrl); break; case CommandType::TabOpen: if (cmd.argsString.trimmed().isEmpty()) showURLInput("", OpenType::OpenUrlInTab); else - browserManager->openUrl(cmd.argsString, OpenType::OpenUrlInTab); + webViewStack->openUrl(cmd.argsString, OpenType::OpenUrlInTab); break; case CommandType::TabNext: - browserManager->nextWebView(); + webViewStack->next(); break; case CommandType::TabPrev: - browserManager->previousWebView(); + webViewStack->previous(); break; case CommandType::Noop: break; @@ -117,21 +117,22 @@ void MainWindow::keyPressEvent(QKeyEvent *event) { auto combo = event->keyCombination(); if (combo.key() == Qt::Key_L && combo.keyboardModifiers().testFlag(Qt::ControlModifier)) { - showURLInput(browserManager->currentUrl().toString(), OpenType::OpenUrl); + showURLInput(webViewStack->currentUrl().toString(), OpenType::OpenUrl); } else if (combo.key() == Qt::Key_Semicolon && combo.keyboardModifiers().testFlag(Qt::ControlModifier)) { showCommandInput(""); } else if (combo.key() == Qt::Key_T && combo.keyboardModifiers().testFlag(Qt::ControlModifier)) { - browserManager->createNewWebView(QUrl("https://lite.duckduckgo.com"), true); + webViewStack->openUrl(QUrl("https://lite.duckduckgo.com"), + OpenType::OpenUrlInTab); } else if (combo.key() == Qt::Key_J && combo.keyboardModifiers().testFlag(Qt::ControlModifier)) { - browserManager->nextWebView(); + webViewStack->next(); } else if (combo.key() == Qt::Key_K && combo.keyboardModifiers().testFlag(Qt::ControlModifier)) { - browserManager->previousWebView(); + webViewStack->previous(); } else if (combo.key() == Qt::Key_W && combo.keyboardModifiers().testFlag(Qt::ControlModifier)) { - browserManager->closeCurrentWebView(); + webViewStack->closeCurrent(); } } diff --git a/src/widgets/WebViewStack.cpp b/src/widgets/WebViewStack.cpp new file mode 100644 index 0000000..8102351 --- /dev/null +++ b/src/widgets/WebViewStack.cpp @@ -0,0 +1,136 @@ +#include +#include +#include + +#include "widgets/WebViewStack.hpp" + +WebViewStack::WebViewStack(QWebEngineProfile *profile, QWidget *parent) + : QWidget(parent), profile(profile) { + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + + layout = new QStackedLayout(this); + layout->setStackingMode(QStackedLayout::StackAll); + layout->setContentsMargins(0, 0, 0, 0); + + createNewWebView(WebViewStack::NewtabURL, true); +} + +void WebViewStack::openUrl(QUrl url, OpenType openType) { + switch (openType) { + case OpenType::OpenUrl: + setCurrentUrl(url); + break; + case OpenType::OpenUrlInTab: + createNewWebView(url, true); + break; + case OpenType::OpenUrlInBgTab: + createNewWebView(url, false); + break; + case OpenType::OpenUrlInWindow: + createNewWebView(url, true); + break; + } +} + +QWebEngineView *WebViewStack::createNewWebView(QUrl url, bool focus) { + auto webview = new QWebEngineView(profile); + webview->setUrl(url); + layout->addWidget(webview); + webViewList.append(webview); + + connect(webview->page(), &QWebEnginePage::newWindowRequested, this, + &WebViewStack::onNewWebViewRequest); + + if (focus) + focusWebView(webViewList.length() - 1); + + return webview; +} + +void WebViewStack::onNewWebViewRequest(QWebEngineNewWindowRequest &request) { + switch (request.destination()) { + case QWebEngineNewWindowRequest::InNewTab: + createNewWebView(request.requestedUrl(), true); + break; + case QWebEngineNewWindowRequest::InNewBackgroundTab: + createNewWebView(request.requestedUrl(), false); + break; + case QWebEngineNewWindowRequest::InNewWindow: + // TODO: Impl + createNewWebView(request.requestedUrl(), true); + break; + case QWebEngineNewWindowRequest::InNewDialog: + // TODO: Impl + createNewWebView(request.requestedUrl(), true); + break; + } +} + +void WebViewStack::next() { + if (webViewList.isEmpty()) + return; + auto index = currentWebViewIndex() + 1; + auto total = webViewList.length(); + index = index >= total ? index % total : index; + focusWebView(index); +} + +void WebViewStack::previous() { + if (webViewList.isEmpty()) + return; + auto index = currentWebViewIndex() - 1; + auto total = webViewList.length(); + index = index < 0 ? total + index : index; + focusWebView(index); +} + +void WebViewStack::closeCurrent() { close(currentWebViewIndex()); } + +void WebViewStack::close(long index) { + if (index < 0 || index >= webViewList.length()) + return; + + auto webview = webViewList.at(index); + layout->removeWidget(webview); + webViewList.removeAt(index); + disconnect(webview->page()); + webview->deleteLater(); + + focusWebView(currentWebViewIndex()); + + if (webViewList.isEmpty()) { + createNewWebView(WebViewStack::NewtabURL, true); + } +} + +std::vector WebViewStack::urls() { + std::vector urls; + for (auto &view : webViewList) + urls.push_back(view->url()); + return urls; +} + +u_int32_t WebViewStack::currentWebViewIndex() { return layout->currentIndex(); } +u_int32_t WebViewStack::count() { return webViewList.length(); } + +void WebViewStack::focusWebView(long index) { + if (webViewList.isEmpty()) + return; + + index = std::max((long)0, std::min(index, (long)webViewList.length() - 1)); + layout->setCurrentIndex(index); +} + +QUrl WebViewStack::currentUrl() { + if (currentWebViewIndex() >= webViewList.length()) + return QUrl(""); + + return webViewList.at(currentWebViewIndex())->url(); +} + +void WebViewStack::setCurrentUrl(QUrl url) { + if (currentWebViewIndex() >= webViewList.length()) + return; + + webViewList.at(currentWebViewIndex())->setUrl(url); +} -- cgit v1.3.1