From 1ee841364215042f1f284e692ae191ebf7a64156 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Tue, 1 May 2018 15:54:49 +0200 Subject: Split off addressbar into lib/ --- lib/addressbar/urllineedit.cpp | 126 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 lib/addressbar/urllineedit.cpp (limited to 'lib/addressbar/urllineedit.cpp') 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 +#include +#include +#include +#include + +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 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()); +} -- cgit v1.2.1