X-Git-Url: https://gitweb.stoutner.com/?a=blobdiff_plain;f=src%2Fwindows%2FBrowserWindow.cpp;h=236b8b4f0e07962f2cdbc49757ba1cc9f9bed017;hb=8f1b160582ac3bd86b6e7aeaafcae059aff609c0;hp=c2497aa3f94cff825b2589158fc999d87c7db407;hpb=2cdfb2ff48e9933d9d957fd706a449bf5a6f322f;p=PrivacyBrowserPC.git diff --git a/src/windows/BrowserWindow.cpp b/src/windows/BrowserWindow.cpp index c2497aa..236b8b4 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); + KStandardAction::zoomIn(this, SLOT(incrementZoom()), actionCollectionPointer); + 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,6 +77,9 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow() // Add the custom actions. QAction *newTabActionPointer = actionCollectionPointer->addAction(QLatin1String("new_tab")); QAction *newWindowActionPointer = actionCollectionPointer->addAction(QLatin1String("new_window")); + 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")); @@ -127,6 +132,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); @@ -148,8 +154,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")); + 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); userAgentFirefoxLinuxActionPointer->setText(userAgentHelperPointer->FIREFOX_LINUX_TRANSLATED); @@ -176,17 +185,17 @@ 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"))); + 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")))); @@ -207,6 +216,9 @@ 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 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")); @@ -231,6 +243,9 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow() // Set the action key sequences. actionCollectionPointer->setDefaultShortcut(newTabActionPointer, ctrlTKeySequence); actionCollectionPointer->setDefaultShortcut(newWindowActionPointer, ctrlNKeySequence); + actionCollectionPointer->setDefaultShortcut(reloadAndBypassCacheActionPointer, ctrlF5KeySequence); + actionCollectionPointer->setDefaultShortcut(viewSourceActionPointer, ctrlUKeySequence); + actionCollectionPointer->setDefaultShortcut(viewSourceInNewTabActionPointer, ctrlShiftUKeySequence); actionCollectionPointer->setDefaultShortcut(printPreviewActionPointer, ctrlShiftPKeySequence); actionCollectionPointer->setDefaultShortcut(userAgentPrivacyBrowserActionPointer, ctrlAltPKeySequence); actionCollectionPointer->setDefaultShortcut(userAgentWebEngineDefaultActionPointer, ctrlAltWKeySequence); @@ -255,6 +270,9 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow() // Execute the actions. connect(newTabActionPointer, SIGNAL(triggered()), tabWidgetPointer, SLOT(addTab())); connect(newWindowActionPointer, SIGNAL(triggered()), this, SLOT(newWindow())); + 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())); @@ -383,11 +401,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(); + QPushButton *zoomMinusButtonPointer = new QPushButton(); + currentZoomButtonPointer = new QPushButton(); + QPushButton *zoomPlusButtonPointer = new QPushButton(); - // Add the progress bar to to the status bar. + // 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())); + + // 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))); @@ -458,17 +499,11 @@ void BrowserWindow::addOrEditDomainSettings() const domainSettingsDialogPointer = new DomainSettingsDialog(DomainSettingsDialog::EDIT_DOMAIN, currentDomainSettingsName); } - // Set the dialog window title. - domainSettingsDialogPointer->setWindowTitle(i18nc("The domain settings dialog title", "Domain Settings")); - - // Set the modality. - domainSettingsDialogPointer->setWindowModality(Qt::WindowModality::WindowModal);; + // Reload the tabs when domain settings are updated. + connect(domainSettingsDialogPointer, SIGNAL(domainSettingsUpdated()), tabWidgetPointer, SLOT(applyDomainSettingsAndReload())); // Show the dialog. domainSettingsDialogPointer->show(); - - // Reload the tabs when domain settings are updated. - connect(domainSettingsDialogPointer, SIGNAL(domainSettingsUpdated()), tabWidgetPointer, SLOT(applyDomainSettingsAndReload())); } void BrowserWindow::back() const @@ -486,6 +521,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. + updateZoomFactorAction(currentZoomFactor); +} + void BrowserWindow::escape() const { // Process the escape according to the status of the browser. @@ -580,9 +631,6 @@ 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); @@ -611,6 +659,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. + updateZoomFactorAction(currentZoomFactor); +} + void BrowserWindow::loadUrlFromLineEdit(const QString &url) const { // Remove the focus from the URL line edit. @@ -635,6 +699,15 @@ void BrowserWindow::refresh() const tabWidgetPointer->refresh(); } +void BrowserWindow::reloadAndBypassCache() const +{ + // Remove the focus from the URL line edit. + urlLineEditPointer->clearFocus(); + + // Refresh the web page. + tabWidgetPointer->refresh(); +} + void BrowserWindow::showCookiesDialog() { // Remove the focus from the URL line edit. @@ -685,11 +758,11 @@ void BrowserWindow::showDomainSettingsDialog() const // Instantiate the domain settings dialog. DomainSettingsDialog *domainSettingsDialogPointer = new DomainSettingsDialog(); - // Show the dialog. - domainSettingsDialogPointer->show(); - // Reload the tabs when domain settings are updated. connect(domainSettingsDialogPointer, SIGNAL(domainSettingsUpdated()), tabWidgetPointer, SLOT(applyDomainSettingsAndReload())); + + // Show the dialog. + domainSettingsDialogPointer->show(); } void BrowserWindow::showFindTextActions() const @@ -977,6 +1050,48 @@ 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. @@ -1046,7 +1161,7 @@ void BrowserWindow::updateLocalStorageAction(const bool &isEnabled) // Update the icon. On Gnome, the toolbar icons don't pick up unless the size is explicit, probably because the toolbar ends up being an intermediate size. if (localStorageEnabled) - localStorageActionPointer->setIcon(QIcon::fromTheme(QLatin1String("disk-quota-high"), QIcon(QLatin1String("/usr/share/icons/gnome/32x32/actions/filesaveas.png")))); + localStorageActionPointer->setIcon(QIcon::fromTheme(QLatin1String("disk-quota-high"), QIcon(QLatin1String("/usr/share/icons/gnome/32x32/actions/document-save-as.png")))); else localStorageActionPointer->setIcon(QIcon::fromTheme(QLatin1String("disk-quota"), QIcon(QLatin1String("/usr/share/icons/gnome/32x32/apps/kfm.png")))); @@ -1305,8 +1420,11 @@ void BrowserWindow::updateZoomFactorAction(const double &zoomFactor) // 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 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::updateSearchEngineLabel(const QString &searchEngineString) const @@ -1317,12 +1435,30 @@ void BrowserWindow::updateSearchEngineLabel(const QString &searchEngineString) c 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()) { - // Get the new URL string. - QString newUrlString = newUrl.toString(); - // Update the URL line edit. urlLineEditPointer->setText(newUrlString);