aboutsummaryrefslogtreecommitdiff
path: root/src/widgets/WebViewStack.cpp
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2025-03-11 23:02:44 +0530
committerAkshay Nair <phenax5@gmail.com>2025-03-12 00:13:47 +0530
commit35d8464f8975ab35c1e2f1a076302d9f95bfb22c (patch)
tree0b4e26e36fb27dd32c0e174e4ef829f1f77c1daf /src/widgets/WebViewStack.cpp
parent0d5b7cb2a8bea5d91c58dd40f80d60bca384b766 (diff)
downloadnull-browser-35d8464f8975ab35c1e2f1a076302d9f95bfb22c.tar.gz
null-browser-35d8464f8975ab35c1e2f1a076302d9f95bfb22c.zip
Refactor browsermanager to webviewstack
Diffstat (limited to 'src/widgets/WebViewStack.cpp')
-rw-r--r--src/widgets/WebViewStack.cpp136
1 files changed, 136 insertions, 0 deletions
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 <QStackedLayout>
+#include <QWebEngineNewWindowRequest>
+#include <QWebEngineView>
+
+#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<QUrl> WebViewStack::urls() {
+ std::vector<QUrl> 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);
+}