]> gitweb.stoutner.com Git - PrivacyBrowserPC.git/blobdiff - src/windows/BrowserWindow.cpp
Implement finding of text withing a page.
[PrivacyBrowserPC.git] / src / windows / BrowserWindow.cpp
index 064c7eda22b7a70c4152306250e4fcd257f8bb30..716f2e0c58f57dea8d676a00c660ebf697ac58c1 100644 (file)
@@ -29,6 +29,7 @@
 
 // KDE Frameworks headers.
 #include <KActionCollection>
+#include <KColorScheme>
 #include <KToolBar>
 
 // Qt toolkit headers.
@@ -38,6 +39,7 @@
 #include <QMenuBar>
 #include <QShortcut>
 #include <QStatusBar>
+#include <QWebEngineFindTextResult>
 
 // Construct the class.
 BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow()
@@ -66,6 +68,9 @@ BrowserWindow::BrowserWindow(bool firstWindow) : 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 +95,7 @@ BrowserWindow::BrowserWindow(bool firstWindow) : 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 +123,7 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow()
     javaScriptActionPointer->setCheckable(true);
     localStorageActionPointer->setCheckable(true);
     domStorageActionPointer->setCheckable(true);
+    findCaseSensitiveActionPointer->setCheckable(true);
     userAgentPrivacyBrowserActionPointer->setCheckable(true);
     userAgentWebEngineDefaultActionPointer->setCheckable(true);
     userAgentFirefoxLinuxActionPointer->setCheckable(true);
@@ -154,6 +161,7 @@ BrowserWindow::BrowserWindow(bool firstWindow) : 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"));
@@ -176,6 +184,7 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow()
     domainSettingsActionPointer->setIcon(QIcon::fromTheme(QStringLiteral("settings-configure")));
     cookiesActionPointer->setIcon(QIcon::fromTheme(QStringLiteral("preferences-web-browser-cookies")));
     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 +215,11 @@ BrowserWindow::BrowserWindow(bool firstWindow) : 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, ("browser_window_ui.rc"));
 
     // Get lists of the actions' associated widgets.
     QList<QWidget*> userAgentAssociatedWidgetsPointerList = userAgentPrivacyBrowserActionPointer->associatedWidgets();
@@ -229,8 +241,33 @@ BrowserWindow::BrowserWindow(bool firstWindow) : 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,12 +275,32 @@ BrowserWindow::BrowserWindow(bool firstWindow) : 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)));
 
@@ -270,11 +327,13 @@ BrowserWindow::BrowserWindow(bool firstWindow) : 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)));
@@ -350,9 +409,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
@@ -361,6 +431,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.
@@ -591,6 +690,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.
@@ -672,9 +780,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)