From 3810a2bff06a38c9d4098560cd94a17a24031e23 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Wed, 23 Aug 2017 14:52:58 +0200 Subject: Split address bar off into static library --- src/lib/navigation/navigation.qbs | 21 +++++ src/lib/navigation/urllineedit.cpp | 184 +++++++++++++++++++++++++++++++++++++ src/lib/navigation/urllineedit.h | 68 ++++++++++++++ 3 files changed, 273 insertions(+) create mode 100644 src/lib/navigation/navigation.qbs create mode 100644 src/lib/navigation/urllineedit.cpp create mode 100644 src/lib/navigation/urllineedit.h (limited to 'src/lib/navigation') 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 . + ** + ******************************************************************************/ + +#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()"); +} 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 . + ** + ******************************************************************************/ + +#ifndef URLLINEEDIT_H +#define URLLINEEDIT_H + +#include +#include +#include + +#include + +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 -- cgit v1.2.1