/******************************************************************************* ** ** 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 "browser.h" #include UrlLineEdit::UrlLineEdit(QWidget *parent) : QLineEdit(parent) { //setStyleSheet("color: #808080"); 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); QListWidget *listWidget = new QListWidget(); listWidget->addItem("start.duckduckgo.com"); listWidget->addItem("neueland.iserlohn-fortress.net"); connect(listWidget, &QListWidget::itemActivated, [this](QListWidgetItem *item){ setUrl(urlFromUserInput(item->text())); this->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(this, SIGNAL(textEdited(QString)), this, SLOT(showCompleter(QString))); } 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); } QUrl UrlLineEdit::url() { return urlFromUserInput(text()); } 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())); //QTimer::singleShot(0, this, SLOT(showCompleter())); } void UrlLineEdit::focusOutEvent(QFocusEvent *event) { wasFocused = false; setUrl(urlFromUserInput(text())); QLineEdit::focusOutEvent(event); } void UrlLineEdit::resizeEvent(QResizeEvent *event) { QLineEdit::resizeEvent(event); m_menu->setFixedWidth(width()); } // 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()); } QUrl UrlLineEdit::urlFromUserInput(const QString &input) { if(input.startsWith('#')) { return QUrl::fromUserInput(qApp->settings()->value("general.search").toString().replace("$term", input.mid(1))); } return QUrl::fromUserInput(input); } // Completer void UrlLineEdit::showCompleter(const QString &text) { m_menu->move(mapToGlobal(QPoint(0, height()))); 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(); setUrl(urlFromUserInput(text())); } void UrlLineEdit::pasteUrlAndGo() { clear(); paste(); setUrl(urlFromUserInput(text())); emit returnPressed(); } void UrlLineEdit::bookmarkUrl() { qDebug("TODO: bookmarkUrl()"); }