aboutsummaryrefslogtreecommitdiff
path: root/src/lib/navigation
diff options
context:
space:
mode:
authorAqua-sama <aqua@iserlohn-fortress.net>2017-08-23 14:52:58 +0200
committerAqua-sama <aqua@iserlohn-fortress.net>2017-08-23 14:52:58 +0200
commit3810a2bff06a38c9d4098560cd94a17a24031e23 (patch)
treed3f079161dcd3b7a37f3d2a737c6c72f8a49e187 /src/lib/navigation
parentAdded URL bar completer (diff)
downloadsmolbote-3810a2bff06a38c9d4098560cd94a17a24031e23.tar.xz
Split address bar off into static library
Diffstat (limited to 'src/lib/navigation')
-rw-r--r--src/lib/navigation/navigation.qbs21
-rw-r--r--src/lib/navigation/urllineedit.cpp184
-rw-r--r--src/lib/navigation/urllineedit.h68
3 files changed, 273 insertions, 0 deletions
diff --git a/src/lib/navigation/navigation.qbs b/src/lib/navigation/navigation.qbs
new file mode 100644
index 0000000..5f7ba41
--- /dev/null
+++ b/src/lib/navigation/navigation.qbs
@@ -0,0 +1,21 @@
+import qbs 1.0
+
+Project {
+ name: "navigation"
+
+ StaticLibrary {
+ id: navigation
+ name: "navigation"
+
+ Depends {
+ name: "Qt"
+ versionAtLeast: "5.9.0"
+ submodules: ["core", "widgets"]
+ }
+
+ files: [
+ "urllineedit.cpp",
+ "urllineedit.h",
+ ]
+ }
+}
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()");
+}
diff --git a/src/lib/navigation/urllineedit.h b/src/lib/navigation/urllineedit.h
new file mode 100644
index 0000000..548000a
--- /dev/null
+++ b/src/lib/navigation/urllineedit.h
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ **
+ ** 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/>.
+ **
+ ******************************************************************************/
+
+#ifndef URLLINEEDIT_H
+#define URLLINEEDIT_H
+
+#include <QLineEdit>
+#include <QTextLayout>
+#include <QMenu>
+
+#include <QListWidget>
+
+class UrlLineEdit : public QLineEdit
+{
+ Q_OBJECT
+public:
+ explicit UrlLineEdit(QWidget *parent = 0);
+
+signals:
+
+public slots:
+ void setUrl(const QUrl &url);
+ QUrl url();
+
+protected:
+ void focusInEvent(QFocusEvent *event);
+ void focusOutEvent(QFocusEvent *event);
+ void resizeEvent(QResizeEvent *event);
+
+private slots:
+ void showCompleter(const QString &text);
+ void showMenu();
+ void copyUrl();
+ void pasteUrl();
+ void pasteUrlAndGo();
+ void bookmarkUrl();
+
+private:
+ void setTextFormat(const QTextLayout::FormatRange &format);
+ void clearTextFormat();
+
+ QUrl urlFromUserInput(const QString &input);
+
+ QTextLayout::FormatRange m_hostFormat;
+ QMenu *m_contextMenu;
+
+ bool wasFocused = false;
+ QMenu *m_menu;
+};
+
+#endif // URLLINEEDIT_H