diff options
author | Aqua-sama <aqua@iserlohn-fortress.net> | 2018-01-26 00:41:09 +0100 |
---|---|---|
committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2018-01-26 00:41:09 +0100 |
commit | 1bc3c311551d53759ffdfb11904c45f1cc2f91ce (patch) | |
tree | ca22cf2d17611dfe3aa0cfbf3ac825ecb014b9f4 /lib/navigation | |
parent | Configuration class rework (diff) | |
download | smolbote-1bc3c311551d53759ffdfb11904c45f1cc2f91ce.tar.xz |
UrlLineEdit rework
- moved UrlLineEdit to src/addressbar
- added UrlLineEdit::connectWebView
- removed UrlLineEdit::pageAction
- UrlLineEdit restores the text format when losing focus
- Split off completer code into Completer class
- WebPage now displays a warning message box instead on certificate errors
Diffstat (limited to 'lib/navigation')
-rw-r--r-- | lib/navigation/CMakeLists.txt | 7 | ||||
-rw-r--r-- | lib/navigation/urllineedit.cpp | 195 | ||||
-rw-r--r-- | lib/navigation/urllineedit.h | 62 |
3 files changed, 0 insertions, 264 deletions
diff --git a/lib/navigation/CMakeLists.txt b/lib/navigation/CMakeLists.txt deleted file mode 100644 index 4f0208b..0000000 --- a/lib/navigation/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -cmake_minimum_required(VERSION 3.1.0) - -add_library(navigation - urllineedit.cpp - urllineedit.h) - -target_link_libraries(navigation Qt5::Widgets Qt5::WebEngineWidgets) diff --git a/lib/navigation/urllineedit.cpp b/lib/navigation/urllineedit.cpp deleted file mode 100644 index fdbfc63..0000000 --- a/lib/navigation/urllineedit.cpp +++ /dev/null @@ -1,195 +0,0 @@ -/* - * This file is part of smolbote. It's copyrighted by the contributors recorded - * in the version control history of the file, available from its original - * location: https://neueland.iserlohn-fortress.net/smolbote.hg - * - * SPDX-License-Identifier: GPL-3.0 - */ - -#include "urllineedit.h" -#include <QMenu> -#include <QStyle> -#include <QTimer> -#include <QWidgetAction> - -// ssl menu -#include <QLabel> - -// completer -#include <QListView> -#include <QStringListModel> - -UrlLineEdit::UrlLineEdit(QWidget *parent) - : QLineEdit(parent) - , m_listView(new QListView(this)) -{ - setPlaceholderText(tr("Enter address")); - - m_listView->setWindowFlags(Qt::ToolTip); - m_listView->setVisible(false); - connect(this, &UrlLineEdit::textEdited, this, &UrlLineEdit::updateCompleter); - - // ssl menu - m_sslMenu = new QMenu(this); - m_sslLabel = new QLabel(m_sslMenu); - QWidgetAction *sslErrorAction = new QWidgetAction(m_sslMenu); - sslErrorAction->setDefaultWidget(m_sslLabel); - m_sslMenu->addAction(sslErrorAction); - - m_sslAction = addAction(style()->standardIcon(QStyle::SP_DriveNetIcon), QLineEdit::LeadingPosition); - m_sslAction->setToolTip(tr("TODO: Display SSL Status popup here")); - m_sslAction->setMenu(m_sslMenu); - - connect(m_sslAction, &QAction::triggered, this, [this]() { - m_sslMenu->exec(this->mapToGlobal(QPoint(0, height()))); - }); - - m_pageAction = addAction(style()->standardIcon(QStyle::SP_FileIcon), QLineEdit::TrailingPosition); - m_pageAction->setShortcut(QKeySequence("F10")); - m_pageAction->setToolTip(tr("Page Actions")); - connect(m_pageAction, &QAction::triggered, m_pageAction, [&]() { - //this->deselect(); - if(m_pageAction->menu() != nullptr) { - m_pageAction->menu()->exec(this->mapToGlobal(QPoint(width(), height()))); - } - }); - - QTextCharFormat hostnameFormat; - hostnameFormat.setFontWeight(QFont::Bold); - m_hostFormat.format = hostnameFormat; - - // connect signals - connect(this, &QLineEdit::returnPressed, [this]() { - if(this->text().startsWith('#')) { - emit searchTermEntered(this->text().mid(1)); - } else { - emit addressEntered(QUrl::fromUserInput(this->text())); - } - this->clearFocus(); - }); -} - -QAction *UrlLineEdit::pageAction() -{ - Q_CHECK_PTR(m_pageAction); - return m_pageAction; -} - -void UrlLineEdit::setCompleterModel(QAbstractItemModel *model) -{ - Q_CHECK_PTR(model); - m_bookmarksModel = model; -} - -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); -} - -void UrlLineEdit::showSslError(const QString &message) -{ - m_sslLabel->setText(message); - m_sslAction->trigger(); -} - -void UrlLineEdit::updateCompleter(const QString &text) -{ - if(m_bookmarksModel == nullptr) { - return; - } - - const QModelIndexList res = m_bookmarksModel->match(QModelIndex(), Qt::EditRole, text, 7); - if(res.isEmpty()) { - m_listView->hide(); - return; - } - - QStringList l; - for(const QModelIndex &idx : res) { - l.append(idx.data(Qt::EditRole).toString()); - } - - auto *m = new QStringListModel(l, this); - - m_listView->setModel(m); - - // positioning - m_listView->setFixedWidth(width()); - m_listView->move(mapToGlobal(QPoint(0, height()))); - m_listView->show(); -} - -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::keyPressEvent(QKeyEvent *event) -{ - if(!m_listView->isHidden()) { - int key = event->key(); - int count = m_listView->model()->rowCount(); - QModelIndex currentIndex = m_listView->currentIndex(); - - switch(key) { - case Qt::Key_Down: - if(currentIndex.row() + 1 >= count) { - m_listView->setCurrentIndex(m_listView->model()->index(0, 0)); - } else { - m_listView->setCurrentIndex(m_listView->model()->index(currentIndex.row() + 1, 0)); - } - break; - case Qt::Key_Up: - if(currentIndex.row() == 0) { - m_listView->setCurrentIndex(m_listView->model()->index(count - 1, 0)); - } else { - m_listView->setCurrentIndex(m_listView->model()->index(currentIndex.row() - 1, 0)); - } - break; - - case Qt::Key_Enter: - case Qt::Key_Return: - if(currentIndex.isValid()) { - setText(currentIndex.data().toString()); - } - m_listView->hide(); - return; - case Qt::Key_Escape: - m_listView->hide(); - break; - default: - break; - } - } - QLineEdit::keyPressEvent(event); -} - -// 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()); -} diff --git a/lib/navigation/urllineedit.h b/lib/navigation/urllineedit.h deleted file mode 100644 index 2d2a267..0000000 --- a/lib/navigation/urllineedit.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This file is part of smolbote. It's copyrighted by the contributors recorded - * in the version control history of the file, available from its original - * location: https://neueland.iserlohn-fortress.net/smolbote.hg - * - * SPDX-License-Identifier: GPL-3.0 - */ - -#ifndef URLLINEEDIT_H -#define URLLINEEDIT_H - -#include <QAction> -#include <QLineEdit> -#include <QTextLayout> - -class QAbstractItemModel; -class QMenu; -class QLabel; -class QListView; -class UrlLineEdit : public QLineEdit -{ - Q_OBJECT -public: - explicit UrlLineEdit(QWidget *parent = nullptr); - - QAction *pageAction(); - - void setCompleterModel(QAbstractItemModel *model); - -signals: - void addressEntered(const QUrl &url); - void searchTermEntered(const QString &term); - -public slots: - void setUrl(const QUrl &url); - void showSslError(const QString &message); - - void updateCompleter(const QString &text); - -protected: - void focusInEvent(QFocusEvent *event); - void keyPressEvent(QKeyEvent *event); - -private: - void setTextFormat(const QTextLayout::FormatRange &format); - void clearTextFormat(); - - QTextLayout::FormatRange m_hostFormat; - - QAction *m_sslAction = nullptr; - QAction *m_pageAction = nullptr; - - // ssl menu - QMenu *m_sslMenu; - QLabel *m_sslLabel; - - // completer - QAbstractItemModel *m_bookmarksModel = nullptr; - QListView *m_listView; -}; - -#endif // URLLINEEDIT_H |