1*4882a593Smuzhiyun #include "browser.h"
2*4882a593Smuzhiyun #include "browserwindow.h"
3*4882a593Smuzhiyun #include "downloadmanagerwidget.h"
4*4882a593Smuzhiyun #include "tabwidget.h"
5*4882a593Smuzhiyun #include "webview.h"
6*4882a593Smuzhiyun #include <QApplication>
7*4882a593Smuzhiyun #include <QCloseEvent>
8*4882a593Smuzhiyun #include <QDesktopWidget>
9*4882a593Smuzhiyun #include <QEvent>
10*4882a593Smuzhiyun #include <QFileDialog>
11*4882a593Smuzhiyun #include <QInputDialog>
12*4882a593Smuzhiyun #include <QMenuBar>
13*4882a593Smuzhiyun #include <QMessageBox>
14*4882a593Smuzhiyun #include <QProgressBar>
15*4882a593Smuzhiyun #include <QStatusBar>
16*4882a593Smuzhiyun #include <QToolBar>
17*4882a593Smuzhiyun #include <QVBoxLayout>
18*4882a593Smuzhiyun #include <QWebEngineProfile>
19*4882a593Smuzhiyun
BrowserWindow(Browser * browser,QWebEngineProfile * profile)20*4882a593Smuzhiyun BrowserWindow::BrowserWindow(Browser *browser, QWebEngineProfile *profile)
21*4882a593Smuzhiyun : m_browser(browser)
22*4882a593Smuzhiyun , m_profile(profile)
23*4882a593Smuzhiyun , m_tabWidget(new TabWidget(profile, this))
24*4882a593Smuzhiyun , m_progressBar(new QProgressBar(this))
25*4882a593Smuzhiyun , m_historyBackAction(nullptr)
26*4882a593Smuzhiyun , m_historyForwardAction(nullptr)
27*4882a593Smuzhiyun , m_stopAction(nullptr)
28*4882a593Smuzhiyun , m_reloadAction(nullptr)
29*4882a593Smuzhiyun , m_stopReloadAction(nullptr)
30*4882a593Smuzhiyun , m_urlLineEdit(nullptr)
31*4882a593Smuzhiyun , m_favAction(nullptr)
32*4882a593Smuzhiyun {
33*4882a593Smuzhiyun setAttribute(Qt::WA_DeleteOnClose, true);
34*4882a593Smuzhiyun setFocusPolicy(Qt::ClickFocus);
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun QToolBar *toolbar = createToolBar();
37*4882a593Smuzhiyun addToolBar(toolbar);
38*4882a593Smuzhiyun menuBar()->addMenu(createFileMenu(m_tabWidget));
39*4882a593Smuzhiyun menuBar()->addMenu(createEditMenu());
40*4882a593Smuzhiyun menuBar()->addMenu(createViewMenu(toolbar));
41*4882a593Smuzhiyun menuBar()->addMenu(createWindowMenu(m_tabWidget));
42*4882a593Smuzhiyun menuBar()->addMenu(createHelpMenu());
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun QWidget *centralWidget = new QWidget(this);
45*4882a593Smuzhiyun QVBoxLayout *layout = new QVBoxLayout;
46*4882a593Smuzhiyun layout->setSpacing(0);
47*4882a593Smuzhiyun layout->setMargin(0);
48*4882a593Smuzhiyun addToolBarBreak();
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun m_progressBar->setMaximumHeight(1);
51*4882a593Smuzhiyun m_progressBar->setTextVisible(false);
52*4882a593Smuzhiyun m_progressBar->setStyleSheet(QStringLiteral("QProgressBar {border: 0px} QProgressBar::chunk {background-color: #da4453}"));
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun layout->addWidget(m_progressBar);
55*4882a593Smuzhiyun layout->addWidget(m_tabWidget);
56*4882a593Smuzhiyun centralWidget->setLayout(layout);
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun QHBoxLayout *hLayout = new QHBoxLayout(this);
59*4882a593Smuzhiyun hLayout->addWidget(centralWidget);
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun connect(m_tabWidget, &TabWidget::titleChanged, this, &BrowserWindow::handleWebViewTitleChanged);
62*4882a593Smuzhiyun connect(m_tabWidget, &TabWidget::linkHovered, [this](const QString& url) {
63*4882a593Smuzhiyun statusBar()->showMessage(url);
64*4882a593Smuzhiyun });
65*4882a593Smuzhiyun connect(m_tabWidget, &TabWidget::loadProgress, this, &BrowserWindow::handleWebViewLoadProgress);
66*4882a593Smuzhiyun connect(m_tabWidget, &TabWidget::webActionEnabledChanged, this, &BrowserWindow::handleWebActionEnabledChanged);
67*4882a593Smuzhiyun connect(m_tabWidget, &TabWidget::urlChanged, [this](const QUrl &url) {
68*4882a593Smuzhiyun m_urlLineEdit->setText(url.toDisplayString());
69*4882a593Smuzhiyun });
70*4882a593Smuzhiyun connect(m_tabWidget, &TabWidget::favIconChanged, m_favAction, &QAction::setIcon);
71*4882a593Smuzhiyun connect(m_urlLineEdit, &QLineEdit::returnPressed, [this]() {
72*4882a593Smuzhiyun m_tabWidget->setUrl(QUrl::fromUserInput(m_urlLineEdit->text()));
73*4882a593Smuzhiyun });
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun QAction *focusUrlLineEditAction = new QAction(this);
76*4882a593Smuzhiyun addAction(focusUrlLineEditAction);
77*4882a593Smuzhiyun focusUrlLineEditAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_L));
78*4882a593Smuzhiyun connect(focusUrlLineEditAction, &QAction::triggered, this, [this] () {
79*4882a593Smuzhiyun m_urlLineEdit->setFocus(Qt::ShortcutFocusReason);
80*4882a593Smuzhiyun });
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun handleWebViewTitleChanged(QString());
83*4882a593Smuzhiyun m_tabWidget->createTab();
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun
sizeHint() const86*4882a593Smuzhiyun QSize BrowserWindow::sizeHint() const
87*4882a593Smuzhiyun {
88*4882a593Smuzhiyun QRect desktopRect = QApplication::desktop()->screenGeometry();
89*4882a593Smuzhiyun QSize size = desktopRect.size() * qreal(0.9);
90*4882a593Smuzhiyun return size;
91*4882a593Smuzhiyun }
92*4882a593Smuzhiyun
createFileMenu(TabWidget * tabWidget)93*4882a593Smuzhiyun QMenu *BrowserWindow::createFileMenu(TabWidget *tabWidget)
94*4882a593Smuzhiyun {
95*4882a593Smuzhiyun QMenu *fileMenu = new QMenu(tr("&File"));
96*4882a593Smuzhiyun fileMenu->addAction(tr("&New Window"), this, &BrowserWindow::handleNewWindowTriggered, QKeySequence::New);
97*4882a593Smuzhiyun fileMenu->addAction(tr("New &Incognito Window"), this, &BrowserWindow::handleNewIncognitoWindowTriggered);
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun QAction *newTabAction = new QAction(tr("New &Tab"), this);
100*4882a593Smuzhiyun newTabAction->setShortcuts(QKeySequence::AddTab);
101*4882a593Smuzhiyun connect(newTabAction, &QAction::triggered, tabWidget, &TabWidget::createTab);
102*4882a593Smuzhiyun fileMenu->addAction(newTabAction);
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun fileMenu->addAction(tr("&Open File..."), this, &BrowserWindow::handleFileOpenTriggered, QKeySequence::Open);
105*4882a593Smuzhiyun fileMenu->addSeparator();
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun QAction *closeTabAction = new QAction(tr("&Close Tab"), this);
108*4882a593Smuzhiyun closeTabAction->setShortcuts(QKeySequence::Close);
109*4882a593Smuzhiyun connect(closeTabAction, &QAction::triggered, [tabWidget]() {
110*4882a593Smuzhiyun tabWidget->closeTab(tabWidget->currentIndex());
111*4882a593Smuzhiyun });
112*4882a593Smuzhiyun fileMenu->addAction(closeTabAction);
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun QAction *closeAction = new QAction(tr("&Quit"),this);
115*4882a593Smuzhiyun closeAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q));
116*4882a593Smuzhiyun connect(closeAction, &QAction::triggered, this, &QWidget::close);
117*4882a593Smuzhiyun fileMenu->addAction(closeAction);
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun connect(fileMenu, &QMenu::aboutToShow, [this, closeAction]() {
120*4882a593Smuzhiyun if (m_browser->windows().count() == 1)
121*4882a593Smuzhiyun closeAction->setText(tr("&Quit"));
122*4882a593Smuzhiyun else
123*4882a593Smuzhiyun closeAction->setText(tr("&Close Window"));
124*4882a593Smuzhiyun });
125*4882a593Smuzhiyun return fileMenu;
126*4882a593Smuzhiyun }
127*4882a593Smuzhiyun
createEditMenu()128*4882a593Smuzhiyun QMenu *BrowserWindow::createEditMenu()
129*4882a593Smuzhiyun {
130*4882a593Smuzhiyun QMenu *editMenu = new QMenu(tr("&Edit"));
131*4882a593Smuzhiyun QAction *findAction = editMenu->addAction(tr("&Find"));
132*4882a593Smuzhiyun findAction->setShortcuts(QKeySequence::Find);
133*4882a593Smuzhiyun connect(findAction, &QAction::triggered, this, &BrowserWindow::handleFindActionTriggered);
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun QAction *findNextAction = editMenu->addAction(tr("Find &Next"));
136*4882a593Smuzhiyun findNextAction->setShortcut(QKeySequence::FindNext);
137*4882a593Smuzhiyun connect(findNextAction, &QAction::triggered, [this]() {
138*4882a593Smuzhiyun if (!currentTab() || m_lastSearch.isEmpty())
139*4882a593Smuzhiyun return;
140*4882a593Smuzhiyun currentTab()->findText(m_lastSearch);
141*4882a593Smuzhiyun });
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun QAction *findPreviousAction = editMenu->addAction(tr("Find &Previous"));
144*4882a593Smuzhiyun findPreviousAction->setShortcut(QKeySequence::FindPrevious);
145*4882a593Smuzhiyun connect(findPreviousAction, &QAction::triggered, [this]() {
146*4882a593Smuzhiyun if (!currentTab() || m_lastSearch.isEmpty())
147*4882a593Smuzhiyun return;
148*4882a593Smuzhiyun currentTab()->findText(m_lastSearch, QWebEnginePage::FindBackward);
149*4882a593Smuzhiyun });
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun return editMenu;
152*4882a593Smuzhiyun }
153*4882a593Smuzhiyun
createViewMenu(QToolBar * toolbar)154*4882a593Smuzhiyun QMenu *BrowserWindow::createViewMenu(QToolBar *toolbar)
155*4882a593Smuzhiyun {
156*4882a593Smuzhiyun QMenu *viewMenu = new QMenu(tr("&View"));
157*4882a593Smuzhiyun m_stopAction = viewMenu->addAction(tr("&Stop"));
158*4882a593Smuzhiyun QList<QKeySequence> shortcuts;
159*4882a593Smuzhiyun shortcuts.append(QKeySequence(Qt::CTRL | Qt::Key_Period));
160*4882a593Smuzhiyun shortcuts.append(Qt::Key_Escape);
161*4882a593Smuzhiyun m_stopAction->setShortcuts(shortcuts);
162*4882a593Smuzhiyun connect(m_stopAction, &QAction::triggered, [this]() {
163*4882a593Smuzhiyun m_tabWidget->triggerWebPageAction(QWebEnginePage::Stop);
164*4882a593Smuzhiyun });
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun m_reloadAction = viewMenu->addAction(tr("Reload Page"));
167*4882a593Smuzhiyun m_reloadAction->setShortcuts(QKeySequence::Refresh);
168*4882a593Smuzhiyun connect(m_reloadAction, &QAction::triggered, [this]() {
169*4882a593Smuzhiyun m_tabWidget->triggerWebPageAction(QWebEnginePage::Reload);
170*4882a593Smuzhiyun });
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun QAction *zoomIn = viewMenu->addAction(tr("Zoom &In"));
173*4882a593Smuzhiyun zoomIn->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Plus));
174*4882a593Smuzhiyun connect(zoomIn, &QAction::triggered, [this]() {
175*4882a593Smuzhiyun if (currentTab())
176*4882a593Smuzhiyun currentTab()->setZoomFactor(currentTab()->zoomFactor() + 0.1);
177*4882a593Smuzhiyun });
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun QAction *zoomOut = viewMenu->addAction(tr("Zoom &Out"));
180*4882a593Smuzhiyun zoomOut->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Minus));
181*4882a593Smuzhiyun connect(zoomOut, &QAction::triggered, [this]() {
182*4882a593Smuzhiyun if (currentTab())
183*4882a593Smuzhiyun currentTab()->setZoomFactor(currentTab()->zoomFactor() - 0.1);
184*4882a593Smuzhiyun });
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun QAction *resetZoom = viewMenu->addAction(tr("Reset &Zoom"));
187*4882a593Smuzhiyun resetZoom->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_0));
188*4882a593Smuzhiyun connect(resetZoom, &QAction::triggered, [this]() {
189*4882a593Smuzhiyun if (currentTab())
190*4882a593Smuzhiyun currentTab()->setZoomFactor(1.0);
191*4882a593Smuzhiyun });
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun viewMenu->addSeparator();
195*4882a593Smuzhiyun QAction *viewToolbarAction = new QAction(tr("Hide Toolbar"),this);
196*4882a593Smuzhiyun viewToolbarAction->setShortcut(tr("Ctrl+|"));
197*4882a593Smuzhiyun connect(viewToolbarAction, &QAction::triggered, [toolbar,viewToolbarAction]() {
198*4882a593Smuzhiyun if (toolbar->isVisible()) {
199*4882a593Smuzhiyun viewToolbarAction->setText(tr("Show Toolbar"));
200*4882a593Smuzhiyun toolbar->close();
201*4882a593Smuzhiyun } else {
202*4882a593Smuzhiyun viewToolbarAction->setText(tr("Hide Toolbar"));
203*4882a593Smuzhiyun toolbar->show();
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun });
206*4882a593Smuzhiyun viewMenu->addAction(viewToolbarAction);
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun QAction *viewStatusbarAction = new QAction(tr("Hide Status Bar"), this);
209*4882a593Smuzhiyun viewStatusbarAction->setShortcut(tr("Ctrl+/"));
210*4882a593Smuzhiyun connect(viewStatusbarAction, &QAction::triggered, [this, viewStatusbarAction]() {
211*4882a593Smuzhiyun if (statusBar()->isVisible()) {
212*4882a593Smuzhiyun viewStatusbarAction->setText(tr("Show Status Bar"));
213*4882a593Smuzhiyun statusBar()->close();
214*4882a593Smuzhiyun } else {
215*4882a593Smuzhiyun viewStatusbarAction->setText(tr("Hide Status Bar"));
216*4882a593Smuzhiyun statusBar()->show();
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun });
219*4882a593Smuzhiyun viewMenu->addAction(viewStatusbarAction);
220*4882a593Smuzhiyun return viewMenu;
221*4882a593Smuzhiyun }
222*4882a593Smuzhiyun
createWindowMenu(TabWidget * tabWidget)223*4882a593Smuzhiyun QMenu *BrowserWindow::createWindowMenu(TabWidget *tabWidget)
224*4882a593Smuzhiyun {
225*4882a593Smuzhiyun QMenu *menu = new QMenu(tr("&Window"));
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun QAction *nextTabAction = new QAction(tr("Show Next Tab"), this);
228*4882a593Smuzhiyun QList<QKeySequence> shortcuts;
229*4882a593Smuzhiyun shortcuts.append(QKeySequence(Qt::CTRL | Qt::Key_BraceRight));
230*4882a593Smuzhiyun shortcuts.append(QKeySequence(Qt::CTRL | Qt::Key_PageDown));
231*4882a593Smuzhiyun shortcuts.append(QKeySequence(Qt::CTRL | Qt::Key_BracketRight));
232*4882a593Smuzhiyun shortcuts.append(QKeySequence(Qt::CTRL | Qt::Key_Less));
233*4882a593Smuzhiyun nextTabAction->setShortcuts(shortcuts);
234*4882a593Smuzhiyun connect(nextTabAction, &QAction::triggered, tabWidget, &TabWidget::nextTab);
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun QAction *previousTabAction = new QAction(tr("Show Previous Tab"), this);
237*4882a593Smuzhiyun shortcuts.clear();
238*4882a593Smuzhiyun shortcuts.append(QKeySequence(Qt::CTRL | Qt::Key_BraceLeft));
239*4882a593Smuzhiyun shortcuts.append(QKeySequence(Qt::CTRL | Qt::Key_PageUp));
240*4882a593Smuzhiyun shortcuts.append(QKeySequence(Qt::CTRL | Qt::Key_BracketLeft));
241*4882a593Smuzhiyun shortcuts.append(QKeySequence(Qt::CTRL | Qt::Key_Greater));
242*4882a593Smuzhiyun previousTabAction->setShortcuts(shortcuts);
243*4882a593Smuzhiyun connect(previousTabAction, &QAction::triggered, tabWidget, &TabWidget::previousTab);
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun connect(menu, &QMenu::aboutToShow, [this, menu, nextTabAction, previousTabAction]() {
246*4882a593Smuzhiyun menu->clear();
247*4882a593Smuzhiyun menu->addAction(nextTabAction);
248*4882a593Smuzhiyun menu->addAction(previousTabAction);
249*4882a593Smuzhiyun menu->addSeparator();
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun QVector<BrowserWindow*> windows = m_browser->windows();
252*4882a593Smuzhiyun int index(-1);
253*4882a593Smuzhiyun for (auto window : windows) {
254*4882a593Smuzhiyun QAction *action = menu->addAction(window->windowTitle(), this, &BrowserWindow::handleShowWindowTriggered);
255*4882a593Smuzhiyun action->setData(++index);
256*4882a593Smuzhiyun action->setCheckable(true);
257*4882a593Smuzhiyun if (window == this)
258*4882a593Smuzhiyun action->setChecked(true);
259*4882a593Smuzhiyun }
260*4882a593Smuzhiyun });
261*4882a593Smuzhiyun return menu;
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun
createHelpMenu()264*4882a593Smuzhiyun QMenu *BrowserWindow::createHelpMenu()
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun QMenu *helpMenu = new QMenu(tr("&Help"));
267*4882a593Smuzhiyun helpMenu->addAction(tr("About &Qt"), qApp, QApplication::aboutQt);
268*4882a593Smuzhiyun return helpMenu;
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun
createToolBar()271*4882a593Smuzhiyun QToolBar *BrowserWindow::createToolBar()
272*4882a593Smuzhiyun {
273*4882a593Smuzhiyun QToolBar *navigationBar = new QToolBar(tr("Navigation"));
274*4882a593Smuzhiyun navigationBar->setMovable(false);
275*4882a593Smuzhiyun navigationBar->toggleViewAction()->setEnabled(false);
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun m_historyBackAction = new QAction(this);
278*4882a593Smuzhiyun QList<QKeySequence> backShortcuts = QKeySequence::keyBindings(QKeySequence::Back);
279*4882a593Smuzhiyun for (auto it = backShortcuts.begin(); it != backShortcuts.end();) {
280*4882a593Smuzhiyun // Chromium already handles navigate on backspace when appropriate.
281*4882a593Smuzhiyun if ((*it)[0] == Qt::Key_Backspace)
282*4882a593Smuzhiyun it = backShortcuts.erase(it);
283*4882a593Smuzhiyun else
284*4882a593Smuzhiyun ++it;
285*4882a593Smuzhiyun }
286*4882a593Smuzhiyun // For some reason Qt doesn't bind the dedicated Back key to Back.
287*4882a593Smuzhiyun backShortcuts.append(QKeySequence(Qt::Key_Back));
288*4882a593Smuzhiyun m_historyBackAction->setShortcuts(backShortcuts);
289*4882a593Smuzhiyun m_historyBackAction->setIconVisibleInMenu(false);
290*4882a593Smuzhiyun m_historyBackAction->setIcon(QIcon(QStringLiteral(":go-previous.png")));
291*4882a593Smuzhiyun m_historyBackAction->setToolTip(tr("Go back in history"));
292*4882a593Smuzhiyun connect(m_historyBackAction, &QAction::triggered, [this]() {
293*4882a593Smuzhiyun m_tabWidget->triggerWebPageAction(QWebEnginePage::Back);
294*4882a593Smuzhiyun });
295*4882a593Smuzhiyun navigationBar->addAction(m_historyBackAction);
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun m_historyForwardAction = new QAction(this);
298*4882a593Smuzhiyun QList<QKeySequence> fwdShortcuts = QKeySequence::keyBindings(QKeySequence::Forward);
299*4882a593Smuzhiyun for (auto it = fwdShortcuts.begin(); it != fwdShortcuts.end();) {
300*4882a593Smuzhiyun if (((*it)[0] & Qt::Key_unknown) == Qt::Key_Backspace)
301*4882a593Smuzhiyun it = fwdShortcuts.erase(it);
302*4882a593Smuzhiyun else
303*4882a593Smuzhiyun ++it;
304*4882a593Smuzhiyun }
305*4882a593Smuzhiyun fwdShortcuts.append(QKeySequence(Qt::Key_Forward));
306*4882a593Smuzhiyun m_historyForwardAction->setShortcuts(fwdShortcuts);
307*4882a593Smuzhiyun m_historyForwardAction->setIconVisibleInMenu(false);
308*4882a593Smuzhiyun m_historyForwardAction->setIcon(QIcon(QStringLiteral(":go-next.png")));
309*4882a593Smuzhiyun m_historyForwardAction->setToolTip(tr("Go forward in history"));
310*4882a593Smuzhiyun connect(m_historyForwardAction, &QAction::triggered, [this]() {
311*4882a593Smuzhiyun m_tabWidget->triggerWebPageAction(QWebEnginePage::Forward);
312*4882a593Smuzhiyun });
313*4882a593Smuzhiyun navigationBar->addAction(m_historyForwardAction);
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun m_stopReloadAction = new QAction(this);
316*4882a593Smuzhiyun connect(m_stopReloadAction, &QAction::triggered, [this]() {
317*4882a593Smuzhiyun m_tabWidget->triggerWebPageAction(QWebEnginePage::WebAction(m_stopReloadAction->data().toInt()));
318*4882a593Smuzhiyun });
319*4882a593Smuzhiyun navigationBar->addAction(m_stopReloadAction);
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun m_urlLineEdit = new QLineEdit(this);
322*4882a593Smuzhiyun m_favAction = new QAction(this);
323*4882a593Smuzhiyun m_urlLineEdit->addAction(m_favAction, QLineEdit::LeadingPosition);
324*4882a593Smuzhiyun m_urlLineEdit->setClearButtonEnabled(true);
325*4882a593Smuzhiyun navigationBar->addWidget(m_urlLineEdit);
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun auto downloadsAction = new QAction(this);
328*4882a593Smuzhiyun downloadsAction->setIcon(QIcon(QStringLiteral(":go-bottom.png")));
329*4882a593Smuzhiyun downloadsAction->setToolTip(tr("Show downloads"));
330*4882a593Smuzhiyun navigationBar->addAction(downloadsAction);
331*4882a593Smuzhiyun connect(downloadsAction, &QAction::triggered, [this]() {
332*4882a593Smuzhiyun m_browser->downloadManagerWidget().show();
333*4882a593Smuzhiyun });
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun return navigationBar;
336*4882a593Smuzhiyun }
337*4882a593Smuzhiyun
handleWebActionEnabledChanged(QWebEnginePage::WebAction action,bool enabled)338*4882a593Smuzhiyun void BrowserWindow::handleWebActionEnabledChanged(QWebEnginePage::WebAction action, bool enabled)
339*4882a593Smuzhiyun {
340*4882a593Smuzhiyun switch (action) {
341*4882a593Smuzhiyun case QWebEnginePage::Back:
342*4882a593Smuzhiyun m_historyBackAction->setEnabled(enabled);
343*4882a593Smuzhiyun break;
344*4882a593Smuzhiyun case QWebEnginePage::Forward:
345*4882a593Smuzhiyun m_historyForwardAction->setEnabled(enabled);
346*4882a593Smuzhiyun break;
347*4882a593Smuzhiyun case QWebEnginePage::Reload:
348*4882a593Smuzhiyun m_reloadAction->setEnabled(enabled);
349*4882a593Smuzhiyun break;
350*4882a593Smuzhiyun case QWebEnginePage::Stop:
351*4882a593Smuzhiyun m_stopAction->setEnabled(enabled);
352*4882a593Smuzhiyun break;
353*4882a593Smuzhiyun default:
354*4882a593Smuzhiyun qWarning("Unhandled webActionChanged signal");
355*4882a593Smuzhiyun }
356*4882a593Smuzhiyun }
357*4882a593Smuzhiyun
handleWebViewTitleChanged(const QString & title)358*4882a593Smuzhiyun void BrowserWindow::handleWebViewTitleChanged(const QString &title)
359*4882a593Smuzhiyun {
360*4882a593Smuzhiyun QString suffix = m_profile->isOffTheRecord()
361*4882a593Smuzhiyun ? tr("Qt Simple Browser (Incognito)")
362*4882a593Smuzhiyun : tr("Qt Simple Browser");
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun if (title.isEmpty())
365*4882a593Smuzhiyun setWindowTitle(suffix);
366*4882a593Smuzhiyun else
367*4882a593Smuzhiyun setWindowTitle(title + " - " + suffix);
368*4882a593Smuzhiyun }
369*4882a593Smuzhiyun
handleNewWindowTriggered()370*4882a593Smuzhiyun void BrowserWindow::handleNewWindowTriggered()
371*4882a593Smuzhiyun {
372*4882a593Smuzhiyun m_browser->createWindow();
373*4882a593Smuzhiyun }
374*4882a593Smuzhiyun
handleNewIncognitoWindowTriggered()375*4882a593Smuzhiyun void BrowserWindow::handleNewIncognitoWindowTriggered()
376*4882a593Smuzhiyun {
377*4882a593Smuzhiyun m_browser->createWindow(/* offTheRecord: */ true);
378*4882a593Smuzhiyun }
379*4882a593Smuzhiyun
handleFileOpenTriggered()380*4882a593Smuzhiyun void BrowserWindow::handleFileOpenTriggered()
381*4882a593Smuzhiyun {
382*4882a593Smuzhiyun QUrl url = QFileDialog::getOpenFileUrl(this, tr("Open Web Resource"), QString(),
383*4882a593Smuzhiyun tr("Web Resources (*.html *.htm *.svg *.png *.gif *.svgz);;All files (*.*)"));
384*4882a593Smuzhiyun if (url.isEmpty())
385*4882a593Smuzhiyun return;
386*4882a593Smuzhiyun currentTab()->setUrl(url);
387*4882a593Smuzhiyun }
388*4882a593Smuzhiyun
handleFindActionTriggered()389*4882a593Smuzhiyun void BrowserWindow::handleFindActionTriggered()
390*4882a593Smuzhiyun {
391*4882a593Smuzhiyun if (!currentTab())
392*4882a593Smuzhiyun return;
393*4882a593Smuzhiyun bool ok = false;
394*4882a593Smuzhiyun QString search = QInputDialog::getText(this, tr("Find"),
395*4882a593Smuzhiyun tr("Find:"), QLineEdit::Normal,
396*4882a593Smuzhiyun m_lastSearch, &ok);
397*4882a593Smuzhiyun if (ok && !search.isEmpty()) {
398*4882a593Smuzhiyun m_lastSearch = search;
399*4882a593Smuzhiyun currentTab()->findText(m_lastSearch, 0, [this](bool found) {
400*4882a593Smuzhiyun if (!found)
401*4882a593Smuzhiyun statusBar()->showMessage(tr("\"%1\" not found.").arg(m_lastSearch));
402*4882a593Smuzhiyun });
403*4882a593Smuzhiyun }
404*4882a593Smuzhiyun }
405*4882a593Smuzhiyun
closeEvent(QCloseEvent * event)406*4882a593Smuzhiyun void BrowserWindow::closeEvent(QCloseEvent *event)
407*4882a593Smuzhiyun {
408*4882a593Smuzhiyun if (m_tabWidget->count() > 1) {
409*4882a593Smuzhiyun int ret = QMessageBox::warning(this, tr("Confirm close"),
410*4882a593Smuzhiyun tr("Are you sure you want to close the window ?\n"
411*4882a593Smuzhiyun "There are %1 tabs open.").arg(m_tabWidget->count()),
412*4882a593Smuzhiyun QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
413*4882a593Smuzhiyun if (ret == QMessageBox::No) {
414*4882a593Smuzhiyun event->ignore();
415*4882a593Smuzhiyun return;
416*4882a593Smuzhiyun }
417*4882a593Smuzhiyun }
418*4882a593Smuzhiyun event->accept();
419*4882a593Smuzhiyun deleteLater();
420*4882a593Smuzhiyun }
421*4882a593Smuzhiyun
tabWidget() const422*4882a593Smuzhiyun TabWidget *BrowserWindow::tabWidget() const
423*4882a593Smuzhiyun {
424*4882a593Smuzhiyun return m_tabWidget;
425*4882a593Smuzhiyun }
426*4882a593Smuzhiyun
currentTab() const427*4882a593Smuzhiyun WebView *BrowserWindow::currentTab() const
428*4882a593Smuzhiyun {
429*4882a593Smuzhiyun return m_tabWidget->currentWebView();
430*4882a593Smuzhiyun }
431*4882a593Smuzhiyun
id()432*4882a593Smuzhiyun QString BrowserWindow::id()
433*4882a593Smuzhiyun {
434*4882a593Smuzhiyun return "OKSIMPLEBROSSER";
435*4882a593Smuzhiyun }
436*4882a593Smuzhiyun
handleWebViewLoadProgress(int progress)437*4882a593Smuzhiyun void BrowserWindow::handleWebViewLoadProgress(int progress)
438*4882a593Smuzhiyun {
439*4882a593Smuzhiyun static QIcon stopIcon(QStringLiteral(":process-stop.png"));
440*4882a593Smuzhiyun static QIcon reloadIcon(QStringLiteral(":view-refresh.png"));
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun if (0 < progress && progress < 100) {
443*4882a593Smuzhiyun m_stopReloadAction->setData(QWebEnginePage::Stop);
444*4882a593Smuzhiyun m_stopReloadAction->setIcon(stopIcon);
445*4882a593Smuzhiyun m_stopReloadAction->setToolTip(tr("Stop loading the current page"));
446*4882a593Smuzhiyun m_progressBar->setValue(progress);
447*4882a593Smuzhiyun } else {
448*4882a593Smuzhiyun m_stopReloadAction->setData(QWebEnginePage::Reload);
449*4882a593Smuzhiyun m_stopReloadAction->setIcon(reloadIcon);
450*4882a593Smuzhiyun m_stopReloadAction->setToolTip(tr("Reload the current page"));
451*4882a593Smuzhiyun m_progressBar->setValue(0);
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun }
454*4882a593Smuzhiyun
handleShowWindowTriggered()455*4882a593Smuzhiyun void BrowserWindow::handleShowWindowTriggered()
456*4882a593Smuzhiyun {
457*4882a593Smuzhiyun if (QAction *action = qobject_cast<QAction*>(sender())) {
458*4882a593Smuzhiyun int offset = action->data().toInt();
459*4882a593Smuzhiyun QVector<BrowserWindow*> windows = m_browser->windows();
460*4882a593Smuzhiyun windows.at(offset)->activateWindow();
461*4882a593Smuzhiyun windows.at(offset)->currentTab()->setFocus();
462*4882a593Smuzhiyun }
463*4882a593Smuzhiyun }
464