/******************************************************************************* ** ** smolbote: yet another qute browser ** Copyright (C) 2017 Xian Nox ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . ** ******************************************************************************/ #include "urllineedit.h" #include #include #include #include #include UrlLineEdit::UrlLineEdit(QWidget *parent) : QLineEdit(parent) { setPlaceholderText(tr("Enter address")); setContextMenuPolicy(Qt::NoContextMenu); QTextCharFormat hostnameFormat; hostnameFormat.setFontWeight(QFont::Bold); m_hostFormat.format = hostnameFormat; m_contextMenu = new QMenu(this); m_contextMenu->addAction("Copy URL", this, SLOT(copyUrl())); m_contextMenu->addAction("Paste URL", this, SLOT(pasteUrl())); m_contextMenu->addAction("Paste URL and go", this, SLOT(pasteUrlAndGo())); m_contextMenu->addSeparator(); m_contextMenu->addAction("Bookmark this page", this, SLOT(bookmarkUrl()))->setEnabled(false); QAction *contextAction = addAction(style()->standardIcon(QStyle::SP_TitleBarMinButton), ActionPosition::TrailingPosition); contextAction->setShortcut(QKeySequence::fromString("F3")); connect(contextAction, SIGNAL(triggered()), this, SLOT(showMenu())); 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 signals connect(this, SIGNAL(textEdited(QString)), this, SLOT(showCompleter(QString))); connect(this, &QLineEdit::returnPressed, [this]() { m_menu->hide(); }); } 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(); } // Menu void UrlLineEdit::showMenu() { m_contextMenu->exec(mapToGlobal(QPoint(width() - m_contextMenu->width(), height()))); } void UrlLineEdit::copyUrl() { selectAll(); copy(); deselect(); } void UrlLineEdit::pasteUrl() { clear(); paste(); } void UrlLineEdit::pasteUrlAndGo() { clear(); paste(); emit returnPressed(); } void UrlLineEdit::bookmarkUrl() { qDebug("TODO: bookmarkUrl()"); }