aboutsummaryrefslogtreecommitdiff
path: root/src/widgets/BrowserManager.cpp
blob: a2390fcad5b7b460d4444a9e3b31056c98ce9242 (plain) (blame)
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 "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);
}

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);
}