From 93a191058e2de683bb7dd941ae03f094acdec8b1 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Sat, 20 Jul 2013 20:30:27 +0200 Subject: [PATCH] Work on web browser. --- CMakeLists.txt | 4 +-- src/core/basenetworkaccessmanager.h | 5 ++++ src/core/basewebpage.cpp | 16 +++++++++++ src/{gui => core}/basewebpage.h | 8 ++---- src/core/webbrowsernetworkaccessmanager.h | 3 ++ src/gui/baselineedit.h | 5 ++-- src/gui/basewebpage.cpp | 8 ------ src/gui/basewebview.cpp | 25 +++++++++++++++-- src/gui/basewebview.h | 16 ++++++++++- src/gui/dynamicshortcutswidget.h | 1 + src/gui/locationlineedit.cpp | 34 ++++++++++++++++++++++- src/gui/locationlineedit.h | 2 ++ src/gui/webbrowser.cpp | 6 ++-- src/gui/webbrowser.h | 12 ++++++++ 14 files changed, 121 insertions(+), 24 deletions(-) create mode 100644 src/core/basewebpage.cpp rename src/{gui => core}/basewebpage.h (75%) delete mode 100644 src/gui/basewebpage.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 181a01e6f..85793bdfd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -169,7 +169,6 @@ set(APP_SOURCES src/gui/dynamicshortcutswidget.cpp src/gui/webbrowser.cpp src/gui/basewebview.cpp - src/gui/basewebpage.cpp src/gui/baselineedit.cpp src/gui/locationlineedit.cpp @@ -181,6 +180,7 @@ set(APP_SOURCES src/core/localization.cpp src/core/dynamicshortcuts.cpp src/core/basenetworkaccessmanager.cpp + src/core/basewebpage.cpp src/core/webBrowsernetworkaccessmanager.cpp # Basic application sources. @@ -207,13 +207,13 @@ set(APP_HEADERS src/gui/dynamicshortcutswidget.h src/gui/webbrowser.h src/gui/basewebview.h - src/gui/basewebpage.h src/gui/baselineedit.h src/gui/locationlineedit.h # CORE headers. src/core/basenetworkaccessmanager.h src/core/webBrowsernetworkaccessmanager.h + src/core/basewebpage.h ) # Add form files. diff --git a/src/core/basenetworkaccessmanager.h b/src/core/basenetworkaccessmanager.h index 2c13f7422..1016c9aba 100644 --- a/src/core/basenetworkaccessmanager.h +++ b/src/core/basenetworkaccessmanager.h @@ -4,13 +4,18 @@ #include +// This is base class for all network access managers. class BaseNetworkAccessManager : public QNetworkAccessManager { Q_OBJECT + public: + // Constructors and desctructors. explicit BaseNetworkAccessManager(QObject *parent = 0); virtual ~BaseNetworkAccessManager(); public slots: + // Loads network settings for this instance. + // NOTE: This sets up proxy settings. virtual void loadSettings(); protected: diff --git a/src/core/basewebpage.cpp b/src/core/basewebpage.cpp new file mode 100644 index 000000000..496833369 --- /dev/null +++ b/src/core/basewebpage.cpp @@ -0,0 +1,16 @@ +#include +#include + +#include "core/webbrowsernetworkaccessmanager.h" +#include "core/basewebpage.h" +#include "gui/webbrowser.h" + + +BaseWebPage::BaseWebPage(QObject *parent) : QWebPage(parent) { + // Setup global network access manager. + // NOTE: This makes network settings easy for all web browsers. + setNetworkAccessManager(WebBrowser::globalNetworkManager()); +} + +BaseWebPage::~BaseWebPage() { +} diff --git a/src/gui/basewebpage.h b/src/core/basewebpage.h similarity index 75% rename from src/gui/basewebpage.h rename to src/core/basewebpage.h index 2fae84ebe..972097c97 100644 --- a/src/gui/basewebpage.h +++ b/src/core/basewebpage.h @@ -6,13 +6,11 @@ class BaseWebPage : public QWebPage { Q_OBJECT + public: + // Constructors and destructors. explicit BaseWebPage(QObject *parent = 0); - - signals: - - public slots: - + virtual ~BaseWebPage(); }; #endif // BASEWEBPAGE_H diff --git a/src/core/webbrowsernetworkaccessmanager.h b/src/core/webbrowsernetworkaccessmanager.h index f1ac0b98c..7bfc29a2e 100644 --- a/src/core/webbrowsernetworkaccessmanager.h +++ b/src/core/webbrowsernetworkaccessmanager.h @@ -4,9 +4,12 @@ #include "core/basenetworkaccessmanager.h" +// This is custom network access manager for web browsers. class WebBrowserNetworkAccessManager : public BaseNetworkAccessManager { Q_OBJECT + public: + // Constructors and destructors. explicit WebBrowserNetworkAccessManager(QObject *parent = 0); virtual ~WebBrowserNetworkAccessManager(); diff --git a/src/gui/baselineedit.h b/src/gui/baselineedit.h index 3fd87ebbd..628d9787d 100644 --- a/src/gui/baselineedit.h +++ b/src/gui/baselineedit.h @@ -7,6 +7,7 @@ class BaseLineEdit : public QLineEdit { Q_OBJECT public: + // Constructors and destructors. explicit BaseLineEdit(QWidget *parent = 0); virtual ~BaseLineEdit(); @@ -14,10 +15,8 @@ class BaseLineEdit : public QLineEdit { void keyPressEvent(QKeyEvent *event); signals: + // Emitted if user hits ENTER button. void submitted(const QString &text); - - public slots: - }; #endif // BASELINEEDIT_H diff --git a/src/gui/basewebpage.cpp b/src/gui/basewebpage.cpp deleted file mode 100644 index a5f87f552..000000000 --- a/src/gui/basewebpage.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "core/webbrowsernetworkaccessmanager.h" -#include "gui/basewebpage.h" -#include "gui/webbrowser.h" - - -BaseWebPage::BaseWebPage(QObject *parent) : QWebPage(parent) { - setNetworkAccessManager(WebBrowser::globalNetworkManager()); -} diff --git a/src/gui/basewebview.cpp b/src/gui/basewebview.cpp index 35c54ce04..172d37b32 100644 --- a/src/gui/basewebview.cpp +++ b/src/gui/basewebview.cpp @@ -1,12 +1,33 @@ #include +#include "core/basewebpage.h" #include "gui/basewebview.h" -#include "gui/basewebpage.h" BaseWebView::BaseWebView(QWidget *parent) : QWebView(parent), m_page(new BaseWebPage(this)) { setPage(m_page); + createConnections(); +} + +BaseWebView::~BaseWebView() { +} + +void BaseWebView::onLoadFinished(bool ok) { + // If page was not loaded, then display custom error page. + if (!ok) { + displayErrorPage(); + } +} + +void BaseWebView::createConnections() { + connect(this, &BaseWebView::loadFinished, + this, &BaseWebView::onLoadFinished); +} + +void BaseWebView::displayErrorPage() { + // TODO: Add better custom error page. + setHtml("error", url()); } void BaseWebView::paintEvent(QPaintEvent *event) { @@ -15,7 +36,7 @@ void BaseWebView::paintEvent(QPaintEvent *event) { // Draw additional frame. QPainter painter(this); QStyleOptionFrameV3 style_option; - int frame_shape = QFrame::Sunken & QFrame::Shape_Mask; + int frame_shape = QFrame::Sunken & QFrame::Shape_Mask; style_option.init(this); style_option.frameShape = QFrame::Shape(int(style_option.frameShape) | diff --git a/src/gui/basewebview.h b/src/gui/basewebview.h index 4904940a8..849094076 100644 --- a/src/gui/basewebview.h +++ b/src/gui/basewebview.h @@ -9,10 +9,24 @@ class BaseWebPage; class BaseWebView : public QWebView { Q_OBJECT + public: + // Constructors and destructors. explicit BaseWebView(QWidget *parent = 0); - + virtual ~BaseWebView(); + + protected slots: + // Executes if loading of any page is done. + void onLoadFinished(bool ok); + protected: + // Creates necessary connections. + void createConnections(); + + // Displays custom error page. + void displayErrorPage(); + + // Does additional painting. void paintEvent(QPaintEvent *event); private: diff --git a/src/gui/dynamicshortcutswidget.h b/src/gui/dynamicshortcutswidget.h index dc7fe821c..bc56e40ca 100644 --- a/src/gui/dynamicshortcutswidget.h +++ b/src/gui/dynamicshortcutswidget.h @@ -13,6 +13,7 @@ class DynamicShortcutsWidget : public QWidget { Q_OBJECT public: + // Constructors and destructors. explicit DynamicShortcutsWidget(QWidget *parent = 0); virtual ~DynamicShortcutsWidget(); diff --git a/src/gui/locationlineedit.cpp b/src/gui/locationlineedit.cpp index c1ab2b9b2..076a3181b 100644 --- a/src/gui/locationlineedit.cpp +++ b/src/gui/locationlineedit.cpp @@ -1,10 +1,16 @@ #include +#include +#include +#include #include "gui/locationlineedit.h" LocationLineEdit::LocationLineEdit(QWidget *parent) - : BaseLineEdit(parent), m_progress(0), m_mouseSelectsAllText(true) { + : BaseLineEdit(parent), + m_progress(0), + m_defaultPalette(palette()), + m_mouseSelectsAllText(true) { } LocationLineEdit::~LocationLineEdit() { @@ -12,6 +18,11 @@ LocationLineEdit::~LocationLineEdit() { void LocationLineEdit::setProgress(int progress) { m_progress = progress; + update(); +} + +void LocationLineEdit::clearProgress() { + setProgress(0); } void LocationLineEdit::focusOutEvent(QFocusEvent *event) { @@ -36,5 +47,26 @@ void LocationLineEdit::mousePressEvent(QMouseEvent *event) { } void LocationLineEdit::paintEvent(QPaintEvent *event) { + // Draw "progress bar" if needed. + if (m_progress > 0) { + QPalette current_palette = palette(); + QColor loadingColor = QColor(0, 255, 0, 100); + QLinearGradient gradient(0, 0, width(), 0); + qreal percentage_border = m_progress / 100.0; + + gradient.setColorAt(0, loadingColor); + gradient.setColorAt(percentage_border - 0.01, loadingColor); + gradient.setColorAt(percentage_border - 0.008, loadingColor.lighter(130)); + //gradient.setColorAt(percentage_border - 0.002, loadingColor); + gradient.setColorAt(percentage_border, QApplication::palette().color(QPalette::Base)); + current_palette.setBrush(QPalette::Base, gradient); + + setPalette(current_palette); + } + // No "progress bar" is needed, restore default palette. + else { + setPalette(m_defaultPalette); + } + BaseLineEdit::paintEvent(event); } diff --git a/src/gui/locationlineedit.h b/src/gui/locationlineedit.h index 022c41e3f..c006f7248 100644 --- a/src/gui/locationlineedit.h +++ b/src/gui/locationlineedit.h @@ -15,6 +15,7 @@ class LocationLineEdit : public BaseLineEdit { // Sets percentual value of web page loading action. // NOTE: Number ranging from 0 to 100 is expected. void setProgress(int progress); + void clearProgress(); protected: void focusOutEvent(QFocusEvent *event); @@ -23,6 +24,7 @@ class LocationLineEdit : public BaseLineEdit { private: int m_progress; + QPalette m_defaultPalette; bool m_mouseSelectsAllText; }; diff --git a/src/gui/webbrowser.cpp b/src/gui/webbrowser.cpp index 1b1a7fc1e..d9319fc65 100644 --- a/src/gui/webbrowser.cpp +++ b/src/gui/webbrowser.cpp @@ -8,8 +8,8 @@ #include "core/basenetworkaccessmanager.h" #include "core/webbrowsernetworkaccessmanager.h" +#include "core/basewebpage.h" #include "gui/basewebview.h" -#include "gui/basewebpage.h" #include "gui/webbrowser.h" #include "gui/locationlineedit.h" #include "gui/themefactory.h" @@ -77,8 +77,10 @@ void WebBrowser::createConnections() { this, &WebBrowser::updateUrl); // Change location textbox status according to webpage status. - connect(m_webView->page(), &BaseWebPage::loadProgress, + connect(m_webView, &BaseWebView::loadProgress, m_txtLocation, &LocationLineEdit::setProgress); + connect(m_webView, &BaseWebView::loadFinished, + m_txtLocation, &LocationLineEdit::clearProgress); } void WebBrowser::updateUrl(const QUrl &url) { diff --git a/src/gui/webbrowser.h b/src/gui/webbrowser.h index 53324df91..6ce5130da 100644 --- a/src/gui/webbrowser.h +++ b/src/gui/webbrowser.h @@ -14,19 +14,31 @@ class WebBrowser : public QWidget { Q_OBJECT public: + // Constructors and destructors. explicit WebBrowser(QWidget *parent = 0); ~WebBrowser(); + // Reloads icons for all buttons. void setupIcons(); + // Returns pointer to global network access manager + // for web browsers. + // NOTE: All web browsers use shared network access manager, + // which makes setting of custom network settings easy. static WebBrowserNetworkAccessManager *globalNetworkManager(); + + // Returns list of all running web browsers. static QList runningWebBrowsers(); protected: + // Creates necessary connections. void createConnections(); protected slots: + // Updates url (for example on location text box). void updateUrl(const QUrl &url); + + // Loads new url into the web browser. void navigateToUrl(const QString &url); private: