aboutsummaryrefslogtreecommitdiff
path: root/lib/addressbar/urllineedit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/addressbar/urllineedit.cpp')
-rw-r--r--lib/addressbar/urllineedit.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/lib/addressbar/urllineedit.cpp b/lib/addressbar/urllineedit.cpp
new file mode 100644
index 0000000..27acf60
--- /dev/null
+++ b/lib/addressbar/urllineedit.cpp
@@ -0,0 +1,126 @@
+/*
+ * This file is part of smolbote. It's copyrighted by the contributors recorded
+ * in the version control history of the file, available from its original
+ * location: https://neueland.iserlohn-fortress.net/smolbote.hg
+ *
+ * SPDX-License-Identifier: GPL-3.0
+ */
+
+#include "urllineedit.h"
+#include <QLabel>
+#include <QMenu>
+#include <QShortcut>
+#include <QTimer>
+#include <QWidgetAction>
+
+UrlLineEdit::UrlLineEdit(QWidget *parent)
+ : QLineEdit(parent)
+ , m_listView(new Completer(this))
+{
+ setPlaceholderText(tr("Enter address"));
+
+ m_listView->setVisible(false);
+
+ pageMenu_action = addAction(style()->standardIcon(QStyle::SP_DriveNetIcon), QLineEdit::LeadingPosition);
+ connect(pageMenu_action, &QAction::triggered, pageMenu_action, [&]() {
+ if(pageMenu_action->menu()) {
+ pageMenu_action->menu()->exec(this->mapToGlobal(QPoint(0, height())));
+ }
+ });
+
+ toolsMenu_action = addAction(style()->standardIcon(QStyle::SP_FileIcon), QLineEdit::TrailingPosition);
+ connect(toolsMenu_action, &QAction::triggered, toolsMenu_action, [&]() {
+ if(toolsMenu_action->menu()) {
+ toolsMenu_action->menu()->exec(this->mapToGlobal(QPoint(width(), height())));
+ }
+ });
+
+ QTextCharFormat hostnameFormat;
+ hostnameFormat.setFontWeight(QFont::Bold);
+ m_hostFormat.format = hostnameFormat;
+}
+
+void UrlLineEdit::setUrl(const QUrl &url)
+{
+ QString urlText = url.toString();
+ QString domain = url.host();
+
+ m_hostFormat.start = urlText.indexOf(domain);
+ m_hostFormat.length = domain.length();
+
+ clear();
+ clearTextFormat();
+ setTextFormat(m_hostFormat);
+ setText(urlText);
+}
+
+void UrlLineEdit::updateCompleter(const QStringList &l)
+{
+ if(!m_listView->updateItems(l)) {
+ m_listView->hide();
+ return;
+ }
+
+ // positioning
+ m_listView->setFixedWidth(width());
+ m_listView->move(mapToGlobal(QPoint(0, height())));
+ m_listView->show();
+}
+
+void UrlLineEdit::focusInEvent(QFocusEvent *event)
+{
+ clearTextFormat();
+
+ QLineEdit::focusInEvent(event);
+
+ // select the contents when receiving focus
+ // http://stackoverflow.com/a/35725950/1054406
+ // mousePressEvent triggers right after focusInEvent so text selected in focusInEvent unselects by mousePressEvent
+ //QTimer::singleShot(0, this, SLOT(selectAll()));
+}
+
+void UrlLineEdit::focusOutEvent(QFocusEvent *event)
+{
+ if(!text().startsWith('#'))
+ setUrl(QUrl::fromUserInput(text()));
+
+ QLineEdit::focusOutEvent(event);
+}
+
+void UrlLineEdit::keyPressEvent(QKeyEvent *event)
+{
+ if(m_listView->keyPressed(event)) {
+ int key = event->key();
+ QModelIndex currentIndex = m_listView->currentIndex();
+
+ if(key == Qt::Key::Key_Enter || key == Qt::Key_Return) {
+
+ if(currentIndex.isValid()) {
+ setText(currentIndex.data().toString());
+ }
+ m_listView->hide();
+ event->accept();
+ return;
+ }
+ } else if(event->key() == Qt::Key::Key_Escape) {
+ clearFocus();
+ event->accept();
+ return;
+ }
+
+ QLineEdit::keyPressEvent(event);
+}
+
+// formatting taken from: https://forum.qt.io/topic/60962/setting-qlineedit-text-bold
+void UrlLineEdit::setTextFormat(const QTextLayout::FormatRange &format)
+{
+ QList<QInputMethodEvent::Attribute> attributes;
+ attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat, format.start, format.length, format.format));
+ QInputMethodEvent ev(QString(), attributes);
+ event(&ev);
+}
+
+void UrlLineEdit::clearTextFormat()
+{
+ setTextFormat(QTextLayout::FormatRange());
+}