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);
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"));
localStorageActionPointer->setCheckable(true);
domStorageActionPointer->setCheckable(true);
findCaseSensitiveActionPointer->setCheckable(true);
+ viewSourceActionPointer->setCheckable(true);
userAgentPrivacyBrowserActionPointer->setCheckable(true);
userAgentWebEngineDefaultActionPointer->setCheckable(true);
userAgentFirefoxLinuxActionPointer->setCheckable(true);
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"));
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"))));
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"));
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);
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()));
// 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)));
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.
// 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);
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.
}
}
+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.
// 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
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);