/* * 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: git://neueland.iserlohn-fortress.net/smolbote.git * * SPDX-License-Identifier: GPL-3.0 */ #include "urllineedit.h" #include #include #include #include #include #include UrlLineEdit::UrlLineEdit(QWidget *parent) : QLineEdit(parent) { setPlaceholderText(tr("Enter address")); // test action m_sslAction = addAction(style()->standardIcon(QStyle::SP_ComputerIcon), QLineEdit::LeadingPosition); m_sslAction->setToolTip(tr("TODO: Display SSL Status popup here")); QAction *completerAction = addAction(style()->standardIcon(QStyle::SP_TitleBarMinButton), QLineEdit::TrailingPosition); m_pageAction = addAction(style()->standardIcon(QStyle::SP_FileIcon), QLineEdit::TrailingPosition); m_pageAction->setShortcut(QKeySequence("F10")); m_pageAction->setToolTip(tr("Page Actions")); connect(m_pageAction, &QAction::triggered, m_pageAction, [&]() { //this->deselect(); if(m_pageAction->menu() != nullptr) { m_pageAction->menu()->exec(this->mapToGlobal(QPoint(width(), height()))); } }); QTextCharFormat hostnameFormat; hostnameFormat.setFontWeight(QFont::Bold); m_hostFormat.format = hostnameFormat; m_menu = new QMenu(this); m_menu->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); listWidget = new QListWidget(); listWidget->addItem("start.duckduckgo.com"); listWidget->addItem("neueland.iserlohn-fortress.net"); connect(listWidget, &QListWidget::itemSelectionChanged, this, [&]() { setText(listWidget->currentItem()->text()); }); connect(listWidget, &QListWidget::itemActivated, this, [&](QListWidgetItem *item) { setText(item->text());; m_menu->hide(); }); QWidgetAction *listAction = new QWidgetAction(m_menu); listAction->setDefaultWidget(listWidget); m_menu->addAction(listAction); QAction *closeAction = m_menu->addAction("Close"); connect(closeAction, SIGNAL(triggered()), m_menu, SLOT(hide())); connect(completerAction, &QAction::triggered, this, [this]() { this->showCompleter(this->text()); }); // connect signals connect(this, SIGNAL(textEdited(QString)), this, SLOT(showCompleter(QString))); connect(this, &QLineEdit::returnPressed, [this]() { if(this->text().startsWith('#')) { emit searchTermEntered(this->text().mid(1)); } else { emit addressEntered(QUrl::fromUserInput(this->text())); } m_menu->hide(); this->clearFocus(); }); } QAction *UrlLineEdit::sslAction() { Q_CHECK_PTR(m_sslAction); return m_sslAction; } QAction *UrlLineEdit::pageAction() { Q_CHECK_PTR(m_pageAction); return m_pageAction; } 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::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::resizeEvent(QResizeEvent *event) { QLineEdit::resizeEvent(event); m_menu->setFixedWidth(width()); } void UrlLineEdit::keyPressEvent(QKeyEvent *event) { if(event->key() == Qt::Key_Down) { if(!listWidget->isVisible()) { showCompleter(text()); return; } else { // listWidget is visible int newIndex = listWidget->currentRow()+1; if(newIndex < listWidget->count()) { listWidget->setCurrentRow(newIndex, QItemSelectionModel::SelectCurrent); } return; } } else if(event->key() == Qt::Key_Up) { if(listWidget->isVisible()) { int newIndex = listWidget->currentRow()-1; if(newIndex >= 0) { listWidget->setCurrentRow(newIndex, QItemSelectionModel::SelectCurrent); } 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()); } // Completer void UrlLineEdit::showCompleter(const QString &text) { m_menu->move(mapToGlobal(QPoint(0, height()))); //listWidget->setCurrentRow(0, QItemSelectionModel::SelectCurrent); m_menu->exec(); }