// KDE Frameworks headers.
#include <KActionCollection>
+#include <KColorScheme>
#include <KToolBar>
// Qt toolkit headers.
#include <QMenuBar>
#include <QShortcut>
#include <QStatusBar>
+#include <QWebEngineFindTextResult>
// Construct the class.
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"));
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);
javaScriptActionPointer->setCheckable(true);
localStorageActionPointer->setCheckable(true);
domStorageActionPointer->setCheckable(true);
+ findCaseSensitiveActionPointer->setCheckable(true);
userAgentPrivacyBrowserActionPointer->setCheckable(true);
userAgentWebEngineDefaultActionPointer->setCheckable(true);
userAgentFirefoxLinuxActionPointer->setCheckable(true);
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"));
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)));
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();
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);
// 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)));
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)));
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
(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.
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.
{
// 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)