1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#include <QStackedLayout>
#include <QWebEngineNewWindowRequest>
#include <QWebEngineView>
#include "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);
}
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);
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<QUrl> BrowserManager::webViewUrls() {
std::vector<QUrl> 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);
}
|