aboutsummaryrefslogtreecommitdiff
path: root/src/lib/navigation/urllineedit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/navigation/urllineedit.cpp')
-rw-r--r--src/lib/navigation/urllineedit.cpp184
1 files changed, 184 insertions, 0 deletions
diff --git a/src/lib/navigation/urllineedit.cpp b/src/lib/navigation/urllineedit.cpp
new file mode 100644
index 0000000..8083088
--- /dev/null
+++ b/src/lib/navigation/urllineedit.cpp
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ **
+ ** 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 <http://www.gnu.org/licenses/>.
+ **
+ ******************************************************************************/
+
+#include "urllineedit.h"
+#include <QUrl>
+#include <QTimer>
+
+#include <QAction>
+#include <QStyle>
+//#include "browser.h"
+
+#include <QWidgetAction>
+
+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<QInputMethodEvent::Attribute> 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()");
+}