From e0d4d8376a2481f2f5daeaec1c9967e62b0bb8b0 Mon Sep 17 00:00:00 2001 From: aqua Date: Sun, 4 Sep 2022 14:46:52 +0300 Subject: UrlBar: add completer --- src/urlbar/completer.cpp | 132 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 src/urlbar/completer.cpp (limited to 'src/urlbar/completer.cpp') diff --git a/src/urlbar/completer.cpp b/src/urlbar/completer.cpp new file mode 100644 index 00000000..df864e05 --- /dev/null +++ b/src/urlbar/completer.cpp @@ -0,0 +1,132 @@ +/* ============================================================ + * The rekonq project + * ============================================================ + * SPDX-License-Identifier: BSD-3-Clause + * Copyright (C) 2016 The Qt Company Ltd. + * SPDX-License-Identifier: GPL-3.0-only + * Copyright (C) 2022 aqua + * ============================================================ */ + +#include "completer.hpp" +#include "urlbar.hpp" +#include +#include +#include +#include + +static const QString searchUrl{"https://duckduckgo.com/?q=%1"}; + +// ------------------------------------------------------------------------ +// Ctor and Dtor + +UrlSuggester::UrlSuggester(UrlBar *parent) : QObject(parent), m_editor(parent), m_popup(new QTreeWidget) +{ + m_popup->setWindowFlags(Qt::Popup); + m_popup->setFocusPolicy(Qt::NoFocus); + m_popup->setFocusProxy(parent); + m_popup->setMouseTracking(true); + + m_popup->setColumnCount(2); + m_popup->setUniformRowHeights(true); + m_popup->setRootIsDecorated(false); + m_popup->setEditTriggers(QTreeWidget::NoEditTriggers); + m_popup->setSelectionBehavior(QTreeWidget::SelectRows); + m_popup->setFrameStyle(QFrame::Box | QFrame::Plain); + m_popup->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + m_popup->header()->hide(); + + m_popup->installEventFilter(this); +} + +UrlSuggester::~UrlSuggester() { delete m_popup; } + +bool UrlSuggester::eventFilter(QObject *obj, QEvent *ev) +{ + if (obj != m_popup) return false; + + if (ev->type() == QEvent::MouseButtonPress) { + m_popup->hide(); + m_editor->setFocus(); + return true; + } + + if (ev->type() == QEvent::KeyPress) { + bool consumed = false; + int key = static_cast(ev)->key(); + switch (key) { + case Qt::Key_Enter: + case Qt::Key_Return: + doneCompletion(); + consumed = true; + break; + + case Qt::Key_Escape: + m_editor->setFocus(); + m_popup->hide(); + consumed = true; + break; + + case Qt::Key_Up: + case Qt::Key_Down: + case Qt::Key_Home: + case Qt::Key_End: + case Qt::Key_PageUp: + case Qt::Key_PageDown: + break; + + default: + m_editor->setFocus(); + m_editor->event(ev); + // m_popup->hide(); + break; + } + + return consumed; + } + + return false; +} + +// ------------------------------------------------------------------------ +// slots + +void UrlSuggester::showCompletions(const QString &text) +{ + if (text.isEmpty()) return; + + m_popup->setUpdatesEnabled(false); + m_popup->clear(); + + { // go item + auto *item = new QTreeWidgetItem(m_popup); + item->setIcon(0, QIcon::fromTheme("go-jump")); + item->setText(0, tr("Go to %1").arg(text)); + item->setText(1, QUrl::fromUserInput(text).toString()); + } + { // search item + auto *item = new QTreeWidgetItem(m_popup); + item->setIcon(0, QIcon::fromTheme("search")); + item->setText(0, tr("Search for %1").arg(text)); + item->setText(1, searchUrl.arg(QUrl::toPercentEncoding(text))); + } + + m_popup->setCurrentItem(m_popup->topLevelItem(0)); + m_popup->resizeColumnToContents(0); + m_popup->setUpdatesEnabled(true); + + m_popup->move(m_editor->mapToGlobal(QPoint(0, m_editor->height()))); + m_popup->resize(m_editor->width(), 250); + m_popup->setFocus(); + m_popup->show(); +} + +void UrlSuggester::doneCompletion() +{ + m_popup->hide(); + m_editor->setFocus(); + auto *item = m_popup->currentItem(); + if (item) { + m_editor->setText(item->text(1)); + emit m_editor->returnPressed(); + } +} -- cgit v1.2.1