X-Git-Url: https://gitweb.stoutner.com/?a=blobdiff_plain;f=src%2Fwindows%2FBrowserWindow.cpp;h=1277e7718501be9be5ce21300b95e7cc6ff2b66b;hb=425fed98271cd951cddef9904e5e271f0fb76fc1;hp=b5d062bb997f1863380c1d628ca6318968313cfb;hpb=c8dd222118f460f3cbcd15678597c3a3f4f986b2;p=PrivacyBrowserPC.git diff --git a/src/windows/BrowserWindow.cpp b/src/windows/BrowserWindow.cpp index b5d062b..1277e77 100644 --- a/src/windows/BrowserWindow.cpp +++ b/src/windows/BrowserWindow.cpp @@ -62,6 +62,8 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow() KStandardAction::print(tabWidgetPointer, SLOT(print()), actionCollectionPointer); QAction *printPreviewActionPointer = KStandardAction::printPreview(tabWidgetPointer, SLOT(printPreview()), actionCollectionPointer); KStandardAction::quit(qApp, SLOT(closeAllWindows()), actionCollectionPointer); + zoomInActionPointer = KStandardAction::zoomIn(this, SLOT(incrementZoom()), actionCollectionPointer); + zoomOutActionPointer = KStandardAction::zoomOut(this, SLOT(decrementZoom()), actionCollectionPointer); KStandardAction::redisplay(this, SLOT(refresh()), actionCollectionPointer); fullScreenActionPointer = KStandardAction::fullScreen(this, SLOT(toggleFullScreen()), this, actionCollectionPointer); QAction *backActionPointer = KStandardAction::back(this, SLOT(back()), actionCollectionPointer); @@ -75,7 +77,10 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow() // Add the custom actions. QAction *newTabActionPointer = actionCollectionPointer->addAction(QLatin1String("new_tab")); QAction *newWindowActionPointer = actionCollectionPointer->addAction(QLatin1String("new_window")); + zoomDefaultActionPointer = actionCollectionPointer->addAction(QLatin1String("zoom_default")); QAction *reloadAndBypassCacheActionPointer = actionCollectionPointer->addAction(QLatin1String("reload_and_bypass_cache")); + viewSourceActionPointer = actionCollectionPointer->addAction(QLatin1String("view_source")); + viewSourceInNewTabActionPointer = actionCollectionPointer->addAction(QLatin1String("view_source_in_new_tab")); userAgentPrivacyBrowserActionPointer = actionCollectionPointer->addAction(QLatin1String("user_agent_privacy_browser")); userAgentWebEngineDefaultActionPointer = actionCollectionPointer->addAction(QLatin1String("user_agent_webengine_default")); userAgentFirefoxLinuxActionPointer = actionCollectionPointer->addAction(QLatin1String("user_agent_firefox_linux")); @@ -128,6 +133,7 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow() localStorageActionPointer->setCheckable(true); domStorageActionPointer->setCheckable(true); findCaseSensitiveActionPointer->setCheckable(true); + viewSourceActionPointer->setCheckable(true); userAgentPrivacyBrowserActionPointer->setCheckable(true); userAgentWebEngineDefaultActionPointer->setCheckable(true); userAgentFirefoxLinuxActionPointer->setCheckable(true); @@ -149,8 +155,11 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow() UserAgentHelper *userAgentHelperPointer = new UserAgentHelper(); // Set the action text. + viewSourceActionPointer->setText(i18nc("View source action", "View Source")); + viewSourceInNewTabActionPointer->setText(i18nc("View source in new tab action", "View Source in New Tab")); newTabActionPointer->setText(i18nc("New tab action", "New Tab")); newWindowActionPointer->setText(i18nc("New window action", "New Window")); + zoomDefaultActionPointer->setText(i18nc("Zoom default action", "Zoom Default")); reloadAndBypassCacheActionPointer->setText(i18nc("Reload and bypass cache action", "Reload and Bypass Cache")); userAgentPrivacyBrowserActionPointer->setText(userAgentHelperPointer->PRIVACY_BROWSER_TRANSLATED); userAgentWebEngineDefaultActionPointer->setText(userAgentHelperPointer->WEB_ENGINE_DEFAULT_TRANSLATED); @@ -178,18 +187,18 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow() // The toolbar icons don't pick up unless the size is explicit, probably because the toolbar ends up being an intermediate size. newTabActionPointer->setIcon(QIcon::fromTheme(QLatin1String("tab-new"))); newWindowActionPointer->setIcon(QIcon::fromTheme(QLatin1String("window-new"))); + zoomDefaultActionPointer->setIcon(QIcon::fromTheme(QLatin1String("zoom-fit-best"))); reloadAndBypassCacheActionPointer->setIcon(QIcon::fromTheme(QLatin1String("view-refresh"))); + viewSourceActionPointer->setIcon(QIcon::fromTheme(QLatin1String("view-choose"), QIcon::fromTheme(QLatin1String("accessories-text-editor")))); + viewSourceInNewTabActionPointer->setIcon(QIcon::fromTheme(QLatin1String("view-choose"), QIcon::fromTheme(QLatin1String("accessories-text-editor")))); userAgentPrivacyBrowserActionPointer->setIcon(QIcon(":/icons/privacy-mode.svg")); - userAgentWebEngineDefaultActionPointer->setIcon(QIcon::fromTheme(QLatin1String("qtlogo"), QIcon::fromTheme(QLatin1String("user-group-properties"), - QIcon::fromTheme(QLatin1String("contact-new"))))); + userAgentWebEngineDefaultActionPointer->setIcon(QIcon::fromTheme(QLatin1String("qtlogo"), QIcon::fromTheme(QLatin1String("user-group-properties"), QIcon::fromTheme(QLatin1String("contact-new"))))); userAgentFirefoxLinuxActionPointer->setIcon(QIcon::fromTheme(QLatin1String("firefox-esr"), QIcon::fromTheme(QLatin1String("user-group-properties"), QIcon::fromTheme(QLatin1String("contact-new"))))); - userAgentChromiumLinuxActionPointer->setIcon(QIcon::fromTheme(QLatin1String("chromium"), QIcon::fromTheme(QLatin1String("user-group-properties"), - QIcon::fromTheme(QLatin1String("contact-new"))))); + userAgentChromiumLinuxActionPointer->setIcon(QIcon::fromTheme(QLatin1String("chromium"), QIcon::fromTheme(QLatin1String("user-group-properties"), QIcon::fromTheme(QLatin1String("contact-new"))))); userAgentFirefoxWindowsActionPointer->setIcon(QIcon::fromTheme(QLatin1String("firefox-esr"), QIcon::fromTheme(QLatin1String("user-group-properties"), QIcon::fromTheme(QLatin1String("contact-new"))))); - userAgentChromeWindowsActionPointer->setIcon(QIcon::fromTheme(QLatin1String("chromium"), QIcon::fromTheme(QLatin1String("user-group-properties"), - QIcon::fromTheme(QLatin1String("contact-new"))))); + userAgentChromeWindowsActionPointer->setIcon(QIcon::fromTheme(QLatin1String("chromium"), QIcon::fromTheme(QLatin1String("user-group-properties"), QIcon::fromTheme(QLatin1String("contact-new"))))); userAgentEdgeWindowsActionPointer->setIcon(QIcon::fromTheme(QLatin1String("user-group-properties"), QIcon::fromTheme(QLatin1String("contact-new")))); userAgentSafariMacosActionPointer->setIcon(QIcon::fromTheme(QLatin1String("user-group-properties"), QIcon::fromTheme(QLatin1String("contact-new")))); userAgentCustomActionPointer->setIcon(QIcon::fromTheme(QLatin1String("user-group-properties"), QIcon::fromTheme(QLatin1String("contact-new")))); @@ -210,7 +219,10 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow() // Create the key sequences. QKeySequence ctrlTKeySequence = QKeySequence(i18nc("The open new tab key sequence.", "Ctrl+T")); QKeySequence ctrlNKeySequence = QKeySequence(i18nc("The open new window key sequence.", "Ctrl+N")); + QKeySequence ctrl0KeySequence = QKeySequence(i18nc("The zoom default key sequence.", "Ctrl+0")); QKeySequence ctrlF5KeySequence = QKeySequence(i18nc("The reload and bypass cache key sequence.", "Ctrl+F5")); + QKeySequence ctrlUKeySequence = QKeySequence(i18nc("The view source key sequence.", "Ctrl+U")); + QKeySequence ctrlShiftUKeySequence = QKeySequence(i18nc("The view source in new tab key sequence.", "Ctrl+Shift+U")); QKeySequence ctrlShiftPKeySequence = QKeySequence(i18nc("The print preview key sequence.", "Ctrl+Shift+P")); QKeySequence ctrlAltPKeySequence = QKeySequence(i18nc("The Privacy Browser user agent key sequence.", "Ctrl+Alt+P")); QKeySequence ctrlAltWKeySequence = QKeySequence(i18nc("The WebEngine Default user agent key sequence.", "Ctrl+Alt+W")); @@ -235,7 +247,10 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow() // Set the action key sequences. actionCollectionPointer->setDefaultShortcut(newTabActionPointer, ctrlTKeySequence); actionCollectionPointer->setDefaultShortcut(newWindowActionPointer, ctrlNKeySequence); + actionCollectionPointer->setDefaultShortcut(zoomDefaultActionPointer, ctrl0KeySequence); actionCollectionPointer->setDefaultShortcut(reloadAndBypassCacheActionPointer, ctrlF5KeySequence); + actionCollectionPointer->setDefaultShortcut(viewSourceActionPointer, ctrlUKeySequence); + actionCollectionPointer->setDefaultShortcut(viewSourceInNewTabActionPointer, ctrlShiftUKeySequence); actionCollectionPointer->setDefaultShortcut(printPreviewActionPointer, ctrlShiftPKeySequence); actionCollectionPointer->setDefaultShortcut(userAgentPrivacyBrowserActionPointer, ctrlAltPKeySequence); actionCollectionPointer->setDefaultShortcut(userAgentWebEngineDefaultActionPointer, ctrlAltWKeySequence); @@ -260,14 +275,17 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow() // Execute the actions. connect(newTabActionPointer, SIGNAL(triggered()), tabWidgetPointer, SLOT(addTab())); connect(newWindowActionPointer, SIGNAL(triggered()), this, SLOT(newWindow())); + connect(zoomDefaultActionPointer, SIGNAL(triggered()), this, SLOT(zoomDefault())); connect(reloadAndBypassCacheActionPointer, SIGNAL(triggered()), this, SLOT(reloadAndBypassCache())); + connect(viewSourceActionPointer, SIGNAL(triggered()), this, SLOT(toggleViewSource())); + connect(viewSourceInNewTabActionPointer, SIGNAL(triggered()), this, SLOT(toggleViewSourceInNewTab())); connect(zoomFactorActionPointer, SIGNAL(triggered()), this, SLOT(getZoomFactorFromUser())); connect(cookiesActionPointer, SIGNAL(triggered()), this, SLOT(showCookiesDialog())); connect(domainSettingsActionPointer, SIGNAL(triggered()), this, SLOT(showDomainSettingsDialog())); // Update the on-the-fly menus. connect(tabWidgetPointer, SIGNAL(updateUserAgentActions(QString, bool)), this, SLOT(updateUserAgentActions(QString, bool))); - connect(tabWidgetPointer, SIGNAL(updateZoomFactorAction(double)), this, SLOT(updateZoomFactorAction(double))); + connect(tabWidgetPointer, SIGNAL(updateZoomActions(double)), this, SLOT(updateZoomActions(double))); connect(tabWidgetPointer, SIGNAL(updateSearchEngineActions(QString, bool)), this, SLOT(updateSearchEngineActions(QString, bool))); // Apply the on-the-fly settings when selected. @@ -277,6 +295,9 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow() // Process cookie changes. connect(tabWidgetPointer, SIGNAL(updateCookiesAction(int)), this, SLOT(updateCookiesAction(int))); + // Store the default zoom factor. + connect(tabWidgetPointer, SIGNAL(updateDefaultZoomFactor(double)), this, SLOT(updateDefaultZoomFactor(double))); + // Connect the URL toolbar actions. connect(javaScriptActionPointer, SIGNAL(triggered()), this, SLOT(toggleJavaScript())); connect(localStorageActionPointer, SIGNAL(triggered()), this, SLOT(toggleLocalStorage())); @@ -389,11 +410,34 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow() // Get a handle for the status bar. QStatusBar *statusBarPointer = statusBar(); - // Create a progress bar. + // Create the status bar widgets. progressBarPointer = new QProgressBar(); + zoomMinusButtonPointer = new QPushButton(); + currentZoomButtonPointer = new QPushButton(); + zoomPlusButtonPointer = new QPushButton(); + + // Set the button icons. + zoomMinusButtonPointer->setIcon(QIcon::fromTheme(QStringLiteral("list-remove-symbolic"))); + zoomPlusButtonPointer->setIcon(QIcon::fromTheme(QStringLiteral("list-add-symbolic"))); + + // Set the button icons to be flat (no borders). + zoomMinusButtonPointer->setFlat(true); + currentZoomButtonPointer->setFlat(true); + zoomPlusButtonPointer->setFlat(true); + + // Handle clicks on the zoom buttons. + connect(zoomMinusButtonPointer, SIGNAL(clicked()), this, SLOT(decrementZoom())); + connect(currentZoomButtonPointer, SIGNAL(clicked()), this, SLOT(getZoomFactorFromUser())); + connect(zoomPlusButtonPointer, SIGNAL(clicked()), this, SLOT(incrementZoom())); - // Add the progress bar to to the status bar. + // Remove the padding around the current zoom button text. + currentZoomButtonPointer->setStyleSheet("padding: 0px;"); + + // Add the widgets to the far right of the status bar. statusBarPointer->addPermanentWidget(progressBarPointer); + statusBarPointer->addPermanentWidget(zoomMinusButtonPointer); + statusBarPointer->addPermanentWidget(currentZoomButtonPointer); + statusBarPointer->addPermanentWidget(zoomPlusButtonPointer); // Update the status bar with the URL when a link is hovered. connect(tabWidgetPointer, SIGNAL(linkHovered(QString)), statusBarPointer, SLOT(showMessage(QString))); @@ -434,7 +478,7 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow() updateLocalStorageAction(Settings::localStorageEnabled()); updateDomStorageAction(Settings::domStorageEnabled()); updateUserAgentActions(UserAgentHelper::getUserAgentFromDatabaseName(Settings::userAgent()), true); - updateZoomFactorAction(Settings::zoomFactor()); + updateZoomActions(Settings::zoomFactor()); // Load the initial website if this is the first window. if (firstWindow) @@ -486,6 +530,22 @@ void BrowserWindow::clearUrlLineEditFocus() const urlLineEditPointer->clearFocus(); } +void BrowserWindow::decrementZoom() +{ + // Update the current zoom factor. + currentZoomFactor = currentZoomFactor - 0.25; + + // Check to make sure the zoom factor is in the valid range (0.25 to 5.00). + if (currentZoomFactor < 0.25) + currentZoomFactor = 0.25; + + // Set the new zoom factor. + tabWidgetPointer->applyOnTheFlyZoomFactor(currentZoomFactor); + + // Update the on-the-fly action text. + updateZoomActions(currentZoomFactor); +} + void BrowserWindow::escape() const { // Process the escape according to the status of the browser. @@ -580,14 +640,11 @@ void BrowserWindow::getZoomFactorFromUser() // Update the zoom factor if the user clicked OK. if (okClicked) { - // Update the current zoom factor. - currentZoomFactor = newZoomFactor; - // Set the new zoom factor. tabWidgetPointer->applyOnTheFlyZoomFactor(newZoomFactor); // Update the on-the-fly action text. - updateZoomFactorAction(newZoomFactor); + updateZoomActions(newZoomFactor); } } @@ -611,6 +668,22 @@ void BrowserWindow::home() const tabWidgetPointer->home(); } +void BrowserWindow::incrementZoom() +{ + // Update the current zoom factor. + currentZoomFactor = currentZoomFactor + 0.25; + + // Check to make sure the zoom factor is in the valid range (0.25 to 5.00). + if (currentZoomFactor > 5.0) + currentZoomFactor = 5.0; + + // Set the new zoom factor. + tabWidgetPointer->applyOnTheFlyZoomFactor(currentZoomFactor); + + // Update the on-the-fly action text. + updateZoomActions(currentZoomFactor); +} + void BrowserWindow::loadUrlFromLineEdit(const QString &url) const { // Remove the focus from the URL line edit. @@ -986,12 +1059,60 @@ void BrowserWindow::toggleFullScreen() } } +void BrowserWindow::toggleViewSource() const +{ + // Get the current URL. + QString url = urlLineEditPointer->text(); + + // Toggle the URL. + if (url.startsWith(QLatin1String("view-source:"))) // The source is currently being viewed. + { + // Remove `view-source:` from the URL. + url = url.remove(0, 12); + } + else // The source is not currently being viewed. + { + // Prepend `view-source:` from the URL. + url = url.prepend(QLatin1String("view-source:")); + } + + // Make it so. + loadUrlFromLineEdit(url); +} + +void BrowserWindow::toggleViewSourceInNewTab() const +{ + // Get the current URL. + QString url = urlLineEditPointer->text(); + + // Toggle the URL. + if (url.startsWith(QLatin1String("view-source:"))) // The source is currently being viewed. + { + // Remove `view-source:` from the URL. + url = url.remove(0, 12); + } + else // The source is not currently being viewed. + { + // Prepend `view-source:` from the URL. + url = url.prepend(QLatin1String("view-source:")); + } + + // Add the new tab. `true` removes the URL line edit focus, `false` does not open a background tab. + tabWidgetPointer->addTab(true, false, url); +} + void BrowserWindow::updateCookiesAction(const int numberOfCookies) const { // Update the action text. cookiesActionPointer->setText(i18nc("The Cookies action, which also displays the number of cookies", "Cookies - %1", numberOfCookies)); } +void BrowserWindow::updateDefaultZoomFactor(const double newDefaultZoomFactor) +{ + // Store the new default zoom factor. + defaultZoomFactor = newDefaultZoomFactor; +} + void BrowserWindow::updateDomStorageAction(const bool &isEnabled) const { // Set the action checked status. @@ -1175,6 +1296,50 @@ void BrowserWindow::updateSearchEngineActions(const QString &searchEngine, const } } +void BrowserWindow::updateSearchEngineLabel(const QString &searchEngineString) const +{ + // Update the search engine label. + searchEngineLabelPointer->setText(SearchEngineHelper::getSearchUrl(searchEngineString)); +} + +void BrowserWindow::updateUrlLineEdit(const QUrl &newUrl) +{ + // Get the new URL string. + QString newUrlString = newUrl.toString(); + + // Update the view source actions. + if (newUrlString.startsWith(QLatin1String("view-source:"))) // The source is currently being viewed. + { + // Mark the view source checkbox. + viewSourceActionPointer->setChecked(true); + + // Update the view in new tab action text. + viewSourceInNewTabActionPointer->setText(i18nc("View rendered website in new tab action", "View Rendered Website in New Tab")); + } + else // The source is not currently being viewed. + { + // Unmark the view source checkbox. + viewSourceActionPointer->setChecked(false); + + // Update the view in new tab action text. + viewSourceInNewTabActionPointer->setText(i18nc("View source in new tab action", "View Source in New Tab")); + } + + // Update the URL line edit if it does not have focus. + if (!urlLineEditPointer->hasFocus()) + { + // Update the URL line edit. + urlLineEditPointer->setText(newUrlString); + + // Set the focus if the new URL is blank. + if (newUrlString == QStringLiteral("")) + urlLineEditPointer->setFocus(); + } + + // Store the current URL. + currentUrl = newUrl; +} + void BrowserWindow::updateUserAgentActions(const QString &userAgent, const bool &updateCustomUserAgentStatus) { // Initialize the custom user agent flag. @@ -1309,49 +1474,47 @@ void BrowserWindow::updateUserAgentActions(const QString &userAgent, const bool } } -void BrowserWindow::updateZoomFactorAction(const double &zoomFactor) +void BrowserWindow::updateUserAgentLabel(const QString &userAgentDatabaseName) const { - // Set the current zoom factor. - currentZoomFactor = zoomFactor; - - // Update the zoom factor action text, formatting the double with 2 decimal places. - zoomFactorActionPointer->setText(ki18nc("@action", "Zoom Factor - %1").subs(zoomFactor, 0, '0', 2).toString()); + // Update the user agent label. + userAgentLabelPointer->setText(UserAgentHelper::getUserAgentFromDatabaseName(userAgentDatabaseName)); } -void BrowserWindow::updateSearchEngineLabel(const QString &searchEngineString) const +void BrowserWindow::updateWindowTitle(const QString &title) { - // Update the search engine label. - searchEngineLabelPointer->setText(SearchEngineHelper::getSearchUrl(searchEngineString)); + // Update the window title. + setWindowTitle(title); } -void BrowserWindow::updateUrlLineEdit(const QUrl &newUrl) +void BrowserWindow::updateZoomActions(const double &zoomFactor) { - // Update the URL line edit if it does not have focus. - if (!urlLineEditPointer->hasFocus()) - { - // Get the new URL string. - QString newUrlString = newUrl.toString(); + // Set the current zoom factor. + currentZoomFactor = zoomFactor; - // Update the URL line edit. - urlLineEditPointer->setText(newUrlString); + // Set the status of the default zoom action. + zoomDefaultActionPointer->setEnabled(currentZoomFactor != defaultZoomFactor); - // Set the focus if the new URL is blank. - if (newUrlString == QStringLiteral("")) - urlLineEditPointer->setFocus(); - } + // Set the status of the zoom in action and button. + zoomInActionPointer->setEnabled(currentZoomFactor <= 4.99); + zoomPlusButtonPointer->setEnabled(currentZoomFactor <= 4.99); - // Store the current URL. - currentUrl = newUrl; -} + // Set the status of the zoom out action and button. + zoomMinusButtonPointer->setEnabled(currentZoomFactor > 0.25); + zoomOutActionPointer->setEnabled(currentZoomFactor > 0.25); -void BrowserWindow::updateUserAgentLabel(const QString &userAgentDatabaseName) const -{ - // Update the user agent label. - userAgentLabelPointer->setText(UserAgentHelper::getUserAgentFromDatabaseName(userAgentDatabaseName)); + + // Update the zoom factor action text, formatting the double with 2 decimal places. `0` specifies no extra field width. `'0'` sets the format to not use scientific notation. + zoomFactorActionPointer->setText(ki18nc("The zoom factor action", "Zoom Factor - %1").subs(zoomFactor, 0, '0', 2).toString()); + + // Update the status bar zoom factor label. + currentZoomButtonPointer->setText(ki18nc("The status bar zoom, which is just the formatted zoom factor", "%1").subs(zoomFactor, 0, '0', 2).toString()); } -void BrowserWindow::updateWindowTitle(const QString &title) +void BrowserWindow::zoomDefault() { - // Update the window title. - setWindowTitle(title); + // Set the new zoom factor. + tabWidgetPointer->applyOnTheFlyZoomFactor(defaultZoomFactor); + + // Update the on-the-fly action text. + updateZoomActions(defaultZoomFactor); }