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 ++++++++++++++ src/mainwindow.h | 2 +- src/widgets/urllineedit.cpp | 184 ------------------------------------- src/widgets/urllineedit.h | 68 -------------- 6 files changed, 274 insertions(+), 253 deletions(-) create mode 100644 src/lib/navigation/navigation.qbs create mode 100644 src/lib/navigation/urllineedit.cpp create mode 100644 src/lib/navigation/urllineedit.h delete mode 100644 src/widgets/urllineedit.cpp delete mode 100644 src/widgets/urllineedit.h (limited to 'src') 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 diff --git a/src/mainwindow.h b/src/mainwindow.h index 4e0ed3a..12ebb0d 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -23,7 +23,7 @@ #include #include -#include "widgets/urllineedit.h" +#include #include #include "webengine/webengineprofile.h" #include diff --git a/src/widgets/urllineedit.cpp b/src/widgets/urllineedit.cpp deleted file mode 100644 index 871cd53..0000000 --- a/src/widgets/urllineedit.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/******************************************************************************* - ** - ** 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/widgets/urllineedit.h b/src/widgets/urllineedit.h deleted file mode 100644 index 548000a..0000000 --- a/src/widgets/urllineedit.h +++ /dev/null @@ -1,68 +0,0 @@ -/******************************************************************************* - ** - ** 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