X-Git-Url: https://gitweb.stoutner.com/?a=blobdiff_plain;f=src%2Fwindows%2FBrowserWindow.cpp;h=efa87ab0ea6fe57d710ea04a6984251a93cec00c;hb=22e1626444752f99e32b8c85b27c7b9e2054a96e;hp=8d2417179119626908faa1576bb8df5bd41643fd;hpb=0d23ee5e9b43b247cdda0a4cbb73f8b1a70f4500;p=PrivacyBrowserPC.git diff --git a/src/windows/BrowserWindow.cpp b/src/windows/BrowserWindow.cpp index 8d24171..efa87ab 100644 --- a/src/windows/BrowserWindow.cpp +++ b/src/windows/BrowserWindow.cpp @@ -1,5 +1,5 @@ /* - * Copyright © 2022 Soren Stoutner . + * Copyright 2022-2023 Soren Stoutner . * * This file is part of Privacy Browser PC . * @@ -20,8 +20,9 @@ // Application headers. #include "BrowserWindow.h" #include "Settings.h" -#include "ui_SettingsPrivacy.h" #include "ui_SettingsGeneral.h" +#include "ui_SettingsPrivacy.h" +#include "ui_SettingsSpellCheck.h" #include "dialogs/CookiesDialog.h" #include "dialogs/DomainSettingsDialog.h" #include "helpers/SearchEngineHelper.h" @@ -29,6 +30,7 @@ // KDE Frameworks headers. #include +#include #include // Qt toolkit headers. @@ -38,9 +40,10 @@ #include #include #include +#include // Construct the class. -BrowserWindow::BrowserWindow() : KXmlGuiWindow() +BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow() { // Initialize the variables. javaScriptEnabled = false; @@ -66,6 +69,9 @@ BrowserWindow::BrowserWindow() : KXmlGuiWindow() QAction *forwardActionPointer = KStandardAction::forward(this, SLOT(forward()), actionCollectionPointer); KStandardAction::home(this, SLOT(home()), actionCollectionPointer); KStandardAction::preferences(this, SLOT(showSettingsDialog()), actionCollectionPointer); + KStandardAction::find(this, SLOT(focusFindLineEdit()), actionCollectionPointer); + QAction *findNextActionPointer = KStandardAction::findNext(this, SLOT(findNext()), actionCollectionPointer); + KStandardAction::findPrev(this, SLOT(findPrevious()), actionCollectionPointer); // Add the custom actions. userAgentPrivacyBrowserActionPointer = actionCollectionPointer->addAction(QStringLiteral("user_agent_privacy_browser")); @@ -90,6 +96,7 @@ BrowserWindow::BrowserWindow() : KXmlGuiWindow() javaScriptActionPointer = actionCollectionPointer->addAction(QStringLiteral("javascript")); localStorageActionPointer = actionCollectionPointer->addAction(QStringLiteral("local_storage")); domStorageActionPointer = actionCollectionPointer->addAction(QStringLiteral("dom_storage")); + findCaseSensitiveActionPointer = actionCollectionPointer->addAction(QStringLiteral("find_case_sensitive")); // Create the action groups QActionGroup *userAgentActionGroupPointer = new QActionGroup(this); @@ -117,6 +124,7 @@ BrowserWindow::BrowserWindow() : KXmlGuiWindow() javaScriptActionPointer->setCheckable(true); localStorageActionPointer->setCheckable(true); domStorageActionPointer->setCheckable(true); + findCaseSensitiveActionPointer->setCheckable(true); userAgentPrivacyBrowserActionPointer->setCheckable(true); userAgentWebEngineDefaultActionPointer->setCheckable(true); userAgentFirefoxLinuxActionPointer->setCheckable(true); @@ -134,15 +142,18 @@ BrowserWindow::BrowserWindow() : KXmlGuiWindow() searchEngineYahooActionPointer->setCheckable(true); searchEngineCustomActionPointer->setCheckable(true); + // Instantiate the user agent helper. + UserAgentHelper *userAgentHelperPointer = new UserAgentHelper(); + // Set the action text. - userAgentPrivacyBrowserActionPointer->setText(UserAgentHelper::PRIVACY_BROWSER_TRANSLATED); - userAgentWebEngineDefaultActionPointer->setText(UserAgentHelper::WEB_ENGINE_DEFAULT_TRANSLATED); - userAgentFirefoxLinuxActionPointer->setText(UserAgentHelper::FIREFOX_LINUX_TRANSLATED); - userAgentChromiumLinuxActionPointer->setText(UserAgentHelper::CHROMIUM_LINUX_TRANSLATED); - userAgentFirefoxWindowsActionPointer->setText(UserAgentHelper::FIREFOX_WINDOWS_TRANSLATED); - userAgentChromeWindowsActionPointer->setText(UserAgentHelper::CHROME_WINDOWS_TRANSLATED); - userAgentEdgeWindowsActionPointer->setText(UserAgentHelper::EDGE_WINDOWS_TRANSLATED); - userAgentSafariMacosActionPointer->setText(UserAgentHelper::SAFARI_MACOS_TRANSLATED); + userAgentPrivacyBrowserActionPointer->setText(userAgentHelperPointer->PRIVACY_BROWSER_TRANSLATED); + userAgentWebEngineDefaultActionPointer->setText(userAgentHelperPointer->WEB_ENGINE_DEFAULT_TRANSLATED); + userAgentFirefoxLinuxActionPointer->setText(userAgentHelperPointer->FIREFOX_LINUX_TRANSLATED); + userAgentChromiumLinuxActionPointer->setText(userAgentHelperPointer->CHROMIUM_LINUX_TRANSLATED); + userAgentFirefoxWindowsActionPointer->setText(userAgentHelperPointer->FIREFOX_WINDOWS_TRANSLATED); + userAgentChromeWindowsActionPointer->setText(userAgentHelperPointer->CHROME_WINDOWS_TRANSLATED); + userAgentEdgeWindowsActionPointer->setText(userAgentHelperPointer->EDGE_WINDOWS_TRANSLATED); + userAgentSafariMacosActionPointer->setText(userAgentHelperPointer->SAFARI_MACOS_TRANSLATED); searchEngineMojeekActionPointer->setText(i18nc("Search engine", "Mojeek")); searchEngineMonoclesActionPointer->setText(i18nc("Search engine", "Monocles")); searchEngineMetagerActionPointer->setText(i18nc("Search engine", "MetaGer")); @@ -154,6 +165,7 @@ BrowserWindow::BrowserWindow() : KXmlGuiWindow() javaScriptActionPointer->setText(i18nc("JavaScript action", "JavaScript")); localStorageActionPointer->setText(i18nc("The Local Storage action", "Local Storage")); domStorageActionPointer->setText(i18nc("DOM Storage action", "DOM Storage")); + findCaseSensitiveActionPointer->setText(i18nc("Find Case Sensitive action", "Find Case Sensitive")); // Set the action icons. userAgentPrivacyBrowserActionPointer->setIcon(QIcon(":/icons/privacy-mode")); @@ -175,7 +187,8 @@ BrowserWindow::BrowserWindow() : KXmlGuiWindow() zoomFactorActionPointer->setIcon(QIcon::fromTheme(QStringLiteral("zoom"))); domainSettingsActionPointer->setIcon(QIcon::fromTheme(QStringLiteral("settings-configure"))); cookiesActionPointer->setIcon(QIcon::fromTheme(QStringLiteral("preferences-web-browser-cookies"))); - domStorageActionPointer->setIcon(QIcon::fromTheme(QStringLiteral("view-web-browser-dom-tree"))); + domStorageActionPointer->setIcon(QIcon::fromTheme(QStringLiteral("code-class"))); + findCaseSensitiveActionPointer->setIcon(QIcon::fromTheme(QStringLiteral("format-text-lowercase"))); // Update the on-the-fly menus. connect(tabWidgetPointer, SIGNAL(updateUserAgentActions(QString, bool)), this, SLOT(updateUserAgentActions(QString, bool))); @@ -206,8 +219,11 @@ BrowserWindow::BrowserWindow() : KXmlGuiWindow() connect(tabWidgetPointer, SIGNAL(updateLocalStorageAction(bool)), this, SLOT(updateLocalStorageAction(bool))); connect(tabWidgetPointer, SIGNAL(updateDomStorageAction(bool)), this, SLOT(updateDomStorageAction(bool))); - // Setup the GUI based on the browser_ui.rc file. - setupGUI(StandardWindowOption::Default, ("browser_ui.rc")); + // Connect the find text actions. + connect(findCaseSensitiveActionPointer, SIGNAL(triggered()), this, SLOT(toggleFindCaseSensitive())); + + // Setup the GUI based on the browser_window_ui.rc file. + setupGUI(StandardWindowOption::Default, ("browserwindowui.rc")); // Get lists of the actions' associated widgets. QList userAgentAssociatedWidgetsPointerList = userAgentPrivacyBrowserActionPointer->associatedWidgets(); @@ -229,8 +245,33 @@ BrowserWindow::BrowserWindow() : KXmlGuiWindow() navigationToolBarPointer = toolBar(QStringLiteral("navigation_toolbar")); urlToolBarPointer = toolBar(QStringLiteral("url_toolbar")); - // Create a URL line edit. + // Create the line edits. urlLineEditPointer = new KLineEdit(); + findTextLineEditPointer = new KLineEdit(); + + // Get the line edit size policies. + QSizePolicy urlLineEditSizePolicy = urlLineEditPointer->sizePolicy(); + QSizePolicy findTextLineEditSizePolicy = findTextLineEditPointer->sizePolicy(); + + // Set the URL line edit horizontal stretch to be five times the find text line edit stretch. + urlLineEditSizePolicy.setHorizontalStretch(5); + findTextLineEditSizePolicy.setHorizontalStretch(1); + + // Set the policies. + urlLineEditPointer->setSizePolicy(urlLineEditSizePolicy); + findTextLineEditPointer->setSizePolicy(findTextLineEditSizePolicy); + + // Set the widths. + urlLineEditPointer->setMinimumWidth(350); + findTextLineEditPointer->setMinimumWidth(200); + findTextLineEditPointer->setMaximumWidth(350); + + // Set the placehold text. + urlLineEditPointer->setPlaceholderText(i18nc("The URL line edit placeholder text", "URL or Search Terms")); + findTextLineEditPointer->setPlaceholderText(i18nc("The find line edit placeholder text", "Find Text")); + + // Show the clear button on the find line edit. + findTextLineEditPointer->setClearButtonEnabled(true); // Add an edit or add domain settings action to the URL line edit. QAction *addOrEditDomainSettingsActionPointer = urlLineEditPointer->addAction(QIcon::fromTheme("settings-configure"), QLineEdit::TrailingPosition); @@ -238,15 +279,38 @@ BrowserWindow::BrowserWindow() : KXmlGuiWindow() // Add or edit the current domain settings. connect(addOrEditDomainSettingsActionPointer, SIGNAL(triggered()), this, SLOT(addOrEditDomainSettings())); - // Populate the URL toolbar. + // Create a find text label pointer. + findTextLabelPointer = new QLabel(); + + // Set the default label text. + findTextLabelPointer->setText(QStringLiteral(" ") + i18nc("Default find results.", "0/0") + QStringLiteral(" ")); + + // Insert the widgets into the toolbars. urlToolBarPointer->insertWidget(javaScriptActionPointer, urlLineEditPointer); + urlToolBarPointer->insertWidget(findNextActionPointer, findTextLineEditPointer); + urlToolBarPointer->insertWidget(findNextActionPointer, findTextLabelPointer); // Load a new URL from the URL line edit. connect(urlLineEditPointer, SIGNAL(returnKeyPressed(const QString)), this, SLOT(loadUrlFromLineEdit(const QString))); + // Find text as it is typed. + connect(findTextLineEditPointer, SIGNAL(textEdited(const QString &)), tabWidgetPointer, SLOT(findText(const QString &))); + + // Find next if the enter key is pressed. + connect(findTextLineEditPointer, SIGNAL(returnKeyPressed(const QString &)), tabWidgetPointer, SLOT(findText(const QString &))); + + // Update find text when switching tabs. + connect(tabWidgetPointer, SIGNAL(updateFindText(const QString &, const bool)), this, SLOT(updateFindText(const QString &, const bool))); + + // Update the find text results. + connect(tabWidgetPointer, SIGNAL(updateFindTextResults(const QWebEngineFindTextResult &)), this, SLOT(updateFindTextResults(const QWebEngineFindTextResult &))); + // Update the URL line edit on page loads. connect(tabWidgetPointer, SIGNAL(updateUrlLineEdit(QUrl)), this, SLOT(updateUrlLineEdit(QUrl))); + // Update the window title. + connect(tabWidgetPointer, SIGNAL(updateWindowTitle(const QString)), this, SLOT(updateWindowTitle(const QString))); + // Get a handle for the status bar. QStatusBar *statusBarPointer = statusBar(); @@ -267,11 +331,13 @@ BrowserWindow::BrowserWindow() : KXmlGuiWindow() connect(tabWidgetPointer, SIGNAL(clearUrlLineEditFocus()), this, SLOT(clearUrlLineEditFocus())); // Get the URL line edit palettes. - noDomainSettingsPalette = urlLineEditPointer->palette(); - domainSettingsPalette = urlLineEditPointer->palette(); + normalBackgroundPalette = urlLineEditPointer->palette(); + negativeBackgroundPalette = normalBackgroundPalette; + positiveBackgroundPalette = normalBackgroundPalette; - // Modify the domain settings palette. - domainSettingsPalette.setColor(QPalette::Base, QColor("#C8E6C9")); + // Modify the palettes. + KColorScheme::adjustBackground(negativeBackgroundPalette, KColorScheme::NegativeBackground); + KColorScheme::adjustBackground(positiveBackgroundPalette, KColorScheme::PositiveBackground); // Update the applied palette. connect(tabWidgetPointer, SIGNAL(updateDomainSettingsIndicator(const bool)), this, SLOT(updateDomainSettingsIndicator(const bool))); @@ -289,8 +355,17 @@ BrowserWindow::BrowserWindow() : KXmlGuiWindow() connect(f11ShortcutPointer, SIGNAL(activated()), fullScreenActionPointer, SLOT(trigger())); connect(escapeShortcutPointer, SIGNAL(activated()), this, SLOT(escape())); - // Load the initial website. - tabWidgetPointer->loadInitialWebsite(); + // Populate the UI. + // This must be done here, because otherwise, if a URL is loaded, like a local file, that does not trigger a call to TabWidget::applyDomainSettings, the UI will not be fully populated. + updateJavaScriptAction(Settings::javaScriptEnabled()); + updateLocalStorageAction(Settings::localStorageEnabled()); + updateDomStorageAction(Settings::domStorageEnabled()); + updateUserAgentActions(UserAgentHelper::getUserAgentFromDatabaseName(Settings::userAgent()), true); + updateZoomFactorAction(Settings::zoomFactor()); + + // Load the initial website if this is the first window. + if (firstWindow) + tabWidgetPointer->loadInitialWebsite(); } void BrowserWindow::addOrEditDomainSettings() const @@ -346,9 +421,20 @@ void BrowserWindow::clearUrlLineEditFocus() const void BrowserWindow::escape() const { - // Exit full screen browsing if it is enabled. - if (fullScreenActionPointer->isChecked()) + // Process the excape according to the status of the browser. + if (fullScreenActionPointer->isChecked()) // Full screen browsing is enabled. + { + // Exit full screen browsing. fullScreenActionPointer->trigger(); + } + else if (!findTextLineEditPointer->text().isEmpty()) // Find text is activated. + { + // Clear the text in the line edit. + findTextLineEditPointer->clear(); + + // Clear the search in the WebEngine. + tabWidgetPointer->findText(QStringLiteral("")); + } } void BrowserWindow::fileNew() const @@ -357,6 +443,35 @@ void BrowserWindow::fileNew() const (new BrowserWindow)->show(); } +void BrowserWindow::findNext() const +{ + // Get the find string. + const QString findString = findTextLineEditPointer->text(); + + // Search for the text if it is not empty. + if (!findString.isEmpty()) + tabWidgetPointer->findText(findString); +} + +void BrowserWindow::findPrevious() const +{ + // Get the find string. + const QString findString = findTextLineEditPointer->text(); + + // Search for the text if it is not empty. + if (!findString.isEmpty()) + tabWidgetPointer->findPrevious(findString); +} + +void BrowserWindow::focusFindLineEdit() const +{ + // Set the focus on the find line edit. + findTextLineEditPointer->setFocus(); + + // Select all the text in the find line edit. + findTextLineEditPointer->selectAll(); +} + void BrowserWindow::forward() const { // Remove the focus from the URL line edit. @@ -517,14 +632,17 @@ void BrowserWindow::showSettingsDialog() // Create the settings widgets. QWidget *privacySettingsWidgetPointer = new QWidget; QWidget *generalSettingsWidgetPointer = new QWidget; + QWidget *spellCheckSettingsWidgetPointer = new QWidget; // Instantiate the settings UI. Ui::PrivacySettings privacySettingsUi; Ui::GeneralSettings generalSettingsUi; + Ui::SpellCheckSettings spellCheckSettingsUi; // Setup the UI to display the settings widgets. privacySettingsUi.setupUi(privacySettingsWidgetPointer); generalSettingsUi.setupUi(generalSettingsWidgetPointer); + spellCheckSettingsUi.setupUi(spellCheckSettingsWidgetPointer); // Get handles for the widgets. QComboBox *userAgentComboBoxPointer = privacySettingsUi.kcfg_userAgent; @@ -533,6 +651,7 @@ void BrowserWindow::showSettingsDialog() searchEngineLabelPointer = generalSettingsUi.searchEngineLabel; downloadLocationComboBoxPointer = generalSettingsUi.kcfg_downloadLocation; QPushButton *browseButtonPointer = generalSettingsUi.browseButton; + QListWidget *spellCheckListWidgetPointer = spellCheckSettingsUi.spellCheckListWidget; // Populate the combo box labels. updateUserAgentLabel(userAgentComboBoxPointer->currentText()); @@ -545,12 +664,51 @@ void BrowserWindow::showSettingsDialog() // Connect the download location directory browse button. connect(browseButtonPointer, SIGNAL(clicked()), this, SLOT(showDownloadLocationBrowseDialog())); + // Create a dictionaries QDir from the `QTWEBENGINE_DICTIONARIES_PATH` environment variable. + QDir dictionariesDir = QDir(qEnvironmentVariable("QTWEBENGINE_DICTIONARIES_PATH")); + + // Get a dictionaries string list. + QStringList dictionariesStringList = dictionariesDir.entryList(QStringList(QLatin1String("*.bdic")), QDir::Files | QDir::NoSymLinks); + + // Remove the `.bdic` file extensions from the dictionaries list. + dictionariesStringList.replaceInStrings(QLatin1String(".bdic"), QLatin1String("")); + + // Get a list of the enabled spell check languages. + QStringList enabledSpellCheckLanguagesList = Settings::spellCheckLanguages(); + + // Add each dictionary to the spell check list widget. + foreach(QString dictionaryString, dictionariesStringList) + { + // Create a new list widget item pointer named after the dictionary string. + QListWidgetItem *listWidgetItemPointer = new QListWidgetItem(dictionaryString, spellCheckListWidgetPointer); + + // Set the list widget item pointer to be checkable. + listWidgetItemPointer->setFlags(listWidgetItemPointer->flags() | Qt::ItemIsUserCheckable); + + // Check the language if it is currently enabled. + if (enabledSpellCheckLanguagesList.contains(dictionaryString)) + listWidgetItemPointer->setCheckState(Qt::Checked); + else + listWidgetItemPointer->setCheckState(Qt::Unchecked); + + // Add the list widget item to the widget. + spellCheckListWidgetPointer->addItem(listWidgetItemPointer); + } + + // Get a handle for the KConfig skeleton. + KConfigSkeleton *kConfigSkeletonPointer = Settings::self(); + // Instantiate a settings config dialog from the settings.kcfg file. - configDialogPointer = new KConfigDialog(this, QStringLiteral("settings"), Settings::self()); + configDialogPointer = new KConfigDialog(this, QLatin1String("settings"), kConfigSkeletonPointer); // Add the settings widgets as config dialog pages. - configDialogPointer->addPage(privacySettingsWidgetPointer, i18nc("@title:tab", "Privacy"), QStringLiteral("privacy-browser")); - configDialogPointer->addPage(generalSettingsWidgetPointer, i18nc("@title:tab", "General"), QStringLiteral("breeze-settings")); + configDialogPointer->addPage(privacySettingsWidgetPointer, i18nc("Settings tab title", "Privacy"), QLatin1String("privacy-browser")); + configDialogPointer->addPage(generalSettingsWidgetPointer, i18nc("Settings tab title", "General"), QLatin1String("breeze-settings")); + configDialogPointer->addPage(spellCheckSettingsWidgetPointer, i18nc("Settings tab title", "Spell Check"), QLatin1String("tools-check-spelling")); + + // Get handles for the buttons. + QPushButton *applyButtonPointer = configDialogPointer->button(QDialogButtonBox::Apply); + QPushButton *okButtonPointer = configDialogPointer->button(QDialogButtonBox::Ok); // Prevent interaction with the parent window while the dialog is open. configDialogPointer->setWindowModality(Qt::WindowModal); @@ -567,7 +725,44 @@ void BrowserWindow::showSettingsDialog() // Expand the config dialog. configDialogPointer->resize(1000, 500); - // Apply the settings when they are updated. + // Create a save spell check languages lambda. + auto saveSpellCheckLanguages = [spellCheckListWidgetPointer, kConfigSkeletonPointer, this] () + { + // Create a list of enabled languages. + QStringList newSpellCheckLanguages = QStringList(); + + // Get a count of all the languages. + int allLanguagesCount = spellCheckListWidgetPointer->count(); + + // Get a list of all the checked languages. + for (int i = 0; i < allLanguagesCount; ++i) { + // Get the language item. + QListWidgetItem *languageItemPointer = spellCheckListWidgetPointer->item(i); + + // Add the item to the enabled languages if it is checked. + if (languageItemPointer->checkState() == Qt::Checked) + newSpellCheckLanguages.append(languageItemPointer->text()); + } + + // Update the spell check languages. + if (Settings::spellCheckLanguages() != newSpellCheckLanguages) + { + // Update the spell check languages. + Settings::setSpellCheckLanguages(newSpellCheckLanguages); + + // Write the settings to disk. + kConfigSkeletonPointer->save(); + } + + // Apply the spell check languages. + tabWidgetPointer->applySpellCheckLanguages(); + }; + + // Process + connect(applyButtonPointer, &QPushButton::clicked, this, saveSpellCheckLanguages); + connect(okButtonPointer, &QPushButton::clicked, this, saveSpellCheckLanguages); + + // Apply the settings handled by KConfig. connect(configDialogPointer, SIGNAL(settingsChanged(QString)), tabWidgetPointer, SLOT(applyApplicationSettings())); connect(configDialogPointer, SIGNAL(settingsChanged(QString)), tabWidgetPointer, SLOT(applyDomainSettingsAndReload())); } @@ -587,6 +782,15 @@ void BrowserWindow::toggleDomStorage() const tabWidgetPointer->toggleDomStorage(); } +void BrowserWindow::toggleFindCaseSensitive() const +{ + // Get the current find string. + const QString findString = findTextLineEditPointer->text(); + + // Toggle find case sensitive. + tabWidgetPointer->toggleFindCaseSensitive(findString); +} + void BrowserWindow::toggleJavaScript() const { // Remove the focus from the URL line edit. @@ -668,9 +872,32 @@ void BrowserWindow::updateDomainSettingsIndicator(const bool status) { // Set the domain palette according to the status. if (status) - urlLineEditPointer->setPalette(domainSettingsPalette); + urlLineEditPointer->setPalette(positiveBackgroundPalette); + else + urlLineEditPointer->setPalette(normalBackgroundPalette); +} + +void BrowserWindow::updateFindText(const QString &text, const bool findCaseSensitive) const +{ + // Set the text. + findTextLineEditPointer->setText(text); + + // Set the find case sensitive action checked status. + findCaseSensitiveActionPointer->setChecked(findCaseSensitive); +} + +void BrowserWindow::updateFindTextResults(const QWebEngineFindTextResult &findTextResult) const +{ + // Update the find text label. + findTextLabelPointer->setText(QStringLiteral(" %1/%2 ").arg(findTextResult.activeMatch()).arg(findTextResult.numberOfMatches())); + + // Set the background color according to the find status. + if (findTextLineEditPointer->text().isEmpty()) + findTextLineEditPointer->setPalette(normalBackgroundPalette); + else if (findTextResult.numberOfMatches() == 0) + findTextLineEditPointer->setPalette(negativeBackgroundPalette); else - urlLineEditPointer->setPalette(noDomainSettingsPalette); + findTextLineEditPointer->setPalette(positiveBackgroundPalette); } void BrowserWindow::updateJavaScriptAction(const bool &isEnabled) @@ -883,6 +1110,7 @@ void BrowserWindow::updateUserAgentActions(const QString &userAgent, const bool } // Update the custom user agent enabled boolean. + // This is not done when the current user agent is a custom one but it is temporarially being changed via on-the-fly settings so that the user can switch back to the custom user agent. if (updateCustomUserAgentStatus) customUserAgentEnabled = customUserAgent; @@ -943,3 +1171,9 @@ void BrowserWindow::updateUserAgentLabel(const QString &userAgentDatabaseName) c // Update the user agent label. userAgentLabelPointer->setText(UserAgentHelper::getUserAgentFromDatabaseName(userAgentDatabaseName)); } + +void BrowserWindow::updateWindowTitle(const QString &title) +{ + // Update the window title. + setWindowTitle(title); +}