Enable the forward and back mouse buttons.
[PrivacyBrowserPC.git] / src / mainview.cpp
1 /*
2  * Copyright © 2022 Soren Stoutner <soren@stoutner.com>.
3  *
4  * This file is part of Privacy Browser PC <https://www.stoutner.com/privacy-browser-pc>.
5  *
6  * Privacy Browser PC is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * Privacy Browser PC is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Privacy Browser PC.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 // Application headers
21 #include "browserwindow.h"
22 #include "mainview.h"
23 #include "mouseeventfilter.h"
24 #include "settings.h"
25
26 // KDE Framework headers.
27 #include <KLineEdit>
28
29 // Qt headers.
30 #include <QWebEngineHistory>
31 #include <QWebEngineView>
32
33 MainView::MainView(QWidget *parent) : QWidget(parent)
34 {
35     // Instantiate the mainview UI.
36     Ui::MainView mainViewUi;
37
38     // Setup the UI.
39     mainViewUi.setupUi(this);
40
41     // Get handles for the views.
42     backButtonPointer = mainViewUi.backButton;
43     forwardButtonPointer = mainViewUi.forwardButton;
44     urlLineEditPointer = mainViewUi.urlLineEdit;
45     webEngineViewPointer = mainViewUi.webEngineView;
46
47     // Get handles for the webpage and history.
48     QWebEnginePage *webEnginePagePointer = webEngineViewPointer->page();
49     webEngineHistoryPointer = webEnginePagePointer->history();
50
51     // Update the webengine view from the URL line edit.
52     connect(urlLineEditPointer, SIGNAL(returnKeyPressed(const QString)), this, SLOT(loadUrl(const QString)));
53
54     // Update the URL line edit form the webengine view.
55     connect(webEngineViewPointer, SIGNAL(loadStarted()), this, SLOT(updateInterface()));
56     connect(webEngineViewPointer, SIGNAL(loadProgress(int)), this, SLOT(updateInterface()));
57     connect(webEngineViewPointer, SIGNAL(loadFinished(bool)), this, SLOT(updateInterface()));
58
59     // Setup the forward and back buttons.
60     connect(backButtonPointer, SIGNAL(clicked()), webEngineViewPointer, SLOT(back()));
61     connect(forwardButtonPointer, SIGNAL(clicked()), webEngineViewPointer, SLOT(forward()));
62
63     // Instantiate the mouse event pointer.
64     MouseEventFilter *mouseEventFilterPointer = new MouseEventFilter(webEngineViewPointer);
65
66     // Install the mouse event filter.
67     qApp->installEventFilter(mouseEventFilterPointer);
68
69     // Listen for hovered link URLs.
70     connect(webEnginePagePointer, SIGNAL(linkHovered(QString)), this, SLOT(pageLinkHovered(QString)));
71
72     // Set the zoom factor.
73     webEngineViewPointer->setZoomFactor(Settings::zoomFactor());
74
75     // Set the focus on the WebEngine view.
76     webEngineViewPointer->setFocus();
77
78     // Load the homepage.  TODO.  Consider sanitizing the homepage input and adding things like protocols if they are missing.
79     webEngineViewPointer->setUrl(Settings::homepage());
80 }
81
82 void MainView::loadUrl(const QString &urlFromUser)
83 {
84     // Remove the focus from the URL line edit.
85     urlLineEditPointer->clearFocus();
86
87     // Load the URL, adding standard protocol sections if needed.  TODO.  Replace this with logic that prefers HTTPS.
88     webEngineViewPointer->setUrl(QUrl::fromUserInput(urlFromUser));
89 }
90
91 void MainView::pageLinkHovered(const QString &linkUrl)
92 {
93     // Emit a signal so that the browser window can update the status bar.
94     emit linkHovered(linkUrl);
95 }
96
97 void MainView::updateInterface()
98 {
99     // Update the URL line edit if it does not have focus.
100     if (!urlLineEditPointer->hasFocus())
101     {
102         // Update the URL line edit.
103         urlLineEditPointer->setUrl(webEngineViewPointer->url().toString());
104     }
105
106     // Update the status of the forward and back buttons.
107     backButtonPointer->setEnabled(webEngineHistoryPointer->canGoBack());
108     forwardButtonPointer->setEnabled(webEngineHistoryPointer->canGoForward());
109
110     // Reapply the zoom factor.  This is a bug in QWebEngineView that resets the zoom with every load.  Hopefully it will be fixed in Qt6.  <https://bugreports.qt.io/browse/QTBUG-51992>
111     webEngineViewPointer->setZoomFactor(Settings::zoomFactor());
112 }