From 8091212801c82bbbcf2ef6e22f948c71b39f0f54 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Tue, 7 Aug 2018 13:01:36 +0200 Subject: AddressBar: prevent URL formatting caused by context menu --- lib/addressbar/CMakeLists.txt | 1 + lib/addressbar/addressbar.cpp | 43 ++++++++++++------------------ lib/addressbar/addressbar.h | 9 ++++--- lib/addressbar/addressbar.ui | 59 ++++++++++++++++++++++++++++++++++++++++++ lib/addressbar/urllineedit.cpp | 14 ++++++++++ 5 files changed, 95 insertions(+), 31 deletions(-) create mode 100644 lib/addressbar/addressbar.ui (limited to 'lib') diff --git a/lib/addressbar/CMakeLists.txt b/lib/addressbar/CMakeLists.txt index 63cf2bc..3a1ab2d 100644 --- a/lib/addressbar/CMakeLists.txt +++ b/lib/addressbar/CMakeLists.txt @@ -9,6 +9,7 @@ set(CMAKE_AUTORCC ON) add_library(addressbar addressbar.cpp addressbar.h + addressbar.ui completer.cpp completer.h urllineedit.cpp diff --git a/lib/addressbar/addressbar.cpp b/lib/addressbar/addressbar.cpp index 355393e..82c2d2e 100644 --- a/lib/addressbar/addressbar.cpp +++ b/lib/addressbar/addressbar.cpp @@ -7,51 +7,40 @@ */ #include "addressbar.h" -#include "urllineedit.h" -#include +#include "ui_addressbar.h" #include -#include AddressBar::AddressBar(const QHash &config, QWidget *parent) : QWidget(parent) + , ui(new Ui::AddressBar) { - setLayout(new QVBoxLayout()); - layout()->setContentsMargins(0, 0, 0, 0); - layout()->setSpacing(0); + ui->setupUi(this); - urlBar = new UrlLineEdit(this); - urlBar->menuAction->setShortcut(QKeySequence(config.value("addressbar.shortcuts.menu"))); - layout()->addWidget(urlBar); + ui->urlBar->menuAction->setShortcut(QKeySequence(config.value("addressbar.shortcuts.menu"))); auto *focusShortcut = new QShortcut(QKeySequence(config.value("addressbar.shortcuts.focus")), parent); - connect(focusShortcut, &QShortcut::activated, urlBar, [=]() { - urlBar->setFocus(); - urlBar->selectAll(); + connect(focusShortcut, &QShortcut::activated, ui->urlBar, [=]() { + ui->urlBar->setFocus(); + ui->urlBar->selectAll(); }); - connect(urlBar, &UrlLineEdit::textEdited, [=](const QString &text) { - std::function callback = std::bind(&UrlLineEdit::updateCompleter, urlBar, std::placeholders::_1); + connect(ui->urlBar, &UrlLineEdit::textEdited, [=](const QString &text) { + std::function callback = std::bind(&UrlLineEdit::updateCompleter, ui->urlBar, std::placeholders::_1); emit complete(text, callback); }); - connect(urlBar, &UrlLineEdit::returnPressed, [=]() { - const QUrl url = QUrl::fromUserInput(urlBar->text()); + connect(ui->urlBar, &UrlLineEdit::returnPressed, [=]() { + const QUrl url = QUrl::fromUserInput(ui->urlBar->text()); // check if url contains \w+:// (matches protocol://) or contains a '.' (matches site.domain) // this is because single words are valid URLs for QUrl (searchterm becomes http://searchterm) // check for protocol://site because \. wouldn't match it (localhost is a search term; http://localhost is an address) - if(urlBar->text().contains(QRegularExpression("\\w+://|\\.")) && url.isValid()) { + if(ui->urlBar->text().contains(QRegularExpression("\\w+://|\\.")) && url.isValid()) { emit load(url); } else { - emit search(urlBar->text()); + emit search(ui->urlBar->text()); } }); - - progressBar = new QProgressBar(this); - progressBar->setObjectName("LoadingBar"); - progressBar->setMaximumHeight(5); - progressBar->setTextVisible(false); - layout()->addWidget(progressBar); } AddressBar::~AddressBar() @@ -62,11 +51,11 @@ AddressBar::~AddressBar() void AddressBar::setUrl(const QUrl &url) { if(url.isEmpty()) - urlBar->clear(); + ui->urlBar->clear(); else - urlBar->setUrl(url); + ui->urlBar->setUrl(url); } void AddressBar::setProgress(int value) { - progressBar->setValue(std::min(value, 100)); + ui->loadingBar->setValue(std::min(value, 100)); } diff --git a/lib/addressbar/addressbar.h b/lib/addressbar/addressbar.h index 6ee9b74..0da9cb3 100644 --- a/lib/addressbar/addressbar.h +++ b/lib/addressbar/addressbar.h @@ -12,8 +12,10 @@ #include #include -class UrlLineEdit; -class QProgressBar; +namespace Ui { +class AddressBar; +} + class AddressBar : public QWidget { Q_OBJECT @@ -34,8 +36,7 @@ public slots: void setProgress(int value); private: - UrlLineEdit *urlBar; - QProgressBar *progressBar; + Ui::AddressBar *ui; }; #endif // SMOLBOTE_ADDRESSBAR_H diff --git a/lib/addressbar/addressbar.ui b/lib/addressbar/addressbar.ui new file mode 100644 index 0000000..a5b4a4d --- /dev/null +++ b/lib/addressbar/addressbar.ui @@ -0,0 +1,59 @@ + + + AddressBar + + + + 0 + 0 + 400 + 31 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + 16777215 + 5 + + + + false + + + + + + + + UrlLineEdit + QLineEdit +
urllineedit.h
+
+
+ + +
diff --git a/lib/addressbar/urllineedit.cpp b/lib/addressbar/urllineedit.cpp index edbe327..6af6cf5 100644 --- a/lib/addressbar/urllineedit.cpp +++ b/lib/addressbar/urllineedit.cpp @@ -101,12 +101,26 @@ void UrlLineEdit::updateCompleter(const QStringList &l) void UrlLineEdit::focusInEvent(QFocusEvent *event) { + // a context menu event also causes a focusInEvent, so if text is selected + // skip the formatting step + if(event->reason() == Qt::PopupFocusReason) { + QLineEdit::focusInEvent(event); + return; + } + clearTextFormat(); QLineEdit::focusInEvent(event); } void UrlLineEdit::focusOutEvent(QFocusEvent *event) { + // a context menu event causes a focusOutEvent, and setUrl will clear the + // selection, and this would prevent the menu from working properly + if(event->reason() == Qt::PopupFocusReason) { + QLineEdit::focusOutEvent(event); + return; + } + const QUrl url = QUrl::fromUserInput(text()); if(url.isValid()) setUrl(url); -- cgit v1.2.1