/******************************************************************************* ** ** 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" 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())); } 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())); } void UrlLineEdit::focusOutEvent(QFocusEvent *event) { setUrl(urlFromUserInput(text())); QLineEdit::focusOutEvent(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()); } 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); } // 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()"); }