Internal web browser now has its toolbar and basic functionality back.

This commit is contained in:
Martin Rotter 2016-06-20 07:53:53 +02:00
parent 752d507414
commit df91d10e3c
8 changed files with 175 additions and 16 deletions

View File

@ -265,7 +265,10 @@ HEADERS += src/core/feeddownloader.h \
src/services/tt-rss/ttrssserviceroot.h \ src/services/tt-rss/ttrssserviceroot.h \
src/gui/webviewer.h \ src/gui/webviewer.h \
src/gui/webbrowser.h \ src/gui/webbrowser.h \
src/network-web/webpage.h src/network-web/webpage.h \
src/gui/locationlineedit.h \
src/network-web/googlesuggest.h \
src/gui/discoverfeedsbutton.h
SOURCES += src/core/feeddownloader.cpp \ SOURCES += src/core/feeddownloader.cpp \
src/core/feedsmodel.cpp \ src/core/feedsmodel.cpp \
@ -373,7 +376,10 @@ SOURCES += src/core/feeddownloader.cpp \
src/services/tt-rss/ttrssserviceroot.cpp \ src/services/tt-rss/ttrssserviceroot.cpp \
src/gui/webviewer.cpp \ src/gui/webviewer.cpp \
src/gui/webbrowser.cpp \ src/gui/webbrowser.cpp \
src/network-web/webpage.cpp src/network-web/webpage.cpp \
src/gui/locationlineedit.cpp \
src/network-web/googlesuggest.cpp \
src/gui/discoverfeedsbutton.cpp
FORMS += \ FORMS += \
src/gui/toolbareditor.ui \ src/gui/toolbareditor.ui \

View File

@ -47,7 +47,7 @@ class FeedMessageViewer : public TabContent {
// WebBrowser getter from TabContent interface. // WebBrowser getter from TabContent interface.
inline WebBrowser *webBrowser() const { inline WebBrowser *webBrowser() const {
return NULL; return m_messagesBrowser;
} }
// FeedsView getter. // FeedsView getter.

View File

@ -21,6 +21,8 @@
#include <QWidget> #include <QWidget>
class WebBrowser;
// Base class for all widgets which are placed inside tabs of TabWidget // Base class for all widgets which are placed inside tabs of TabWidget
class TabContent : public QWidget { class TabContent : public QWidget {
Q_OBJECT Q_OBJECT
@ -41,6 +43,10 @@ class TabContent : public QWidget {
m_index = index; m_index = index;
} }
// Obtains instance contained in this TabContent or nullptr.
// This can be used for obtaining the menu from the instance and so on.
virtual WebBrowser *webBrowser() const = 0;
protected: protected:
int m_index; int m_index;
}; };

View File

@ -18,9 +18,13 @@
#include "gui/webbrowser.h" #include "gui/webbrowser.h"
#include "miscellaneous/application.h" #include "miscellaneous/application.h"
#include "network-web/webfactory.h"
#include "miscellaneous/databasequeries.h" #include "miscellaneous/databasequeries.h"
#include "network-web/networkfactory.h"
#include "network-web/webfactory.h"
#include "gui/messagebox.h" #include "gui/messagebox.h"
#include "gui/webviewer.h"
#include "gui/discoverfeedsbutton.h"
#include "gui/locationlineedit.h"
#include "gui/dialogs/formmain.h" #include "gui/dialogs/formmain.h"
#include "services/abstract/serviceroot.h" #include "services/abstract/serviceroot.h"
@ -28,15 +32,59 @@
#include <QToolBar> #include <QToolBar>
#include <QWebEngineSettings> #include <QWebEngineSettings>
#include <QToolTip> #include <QToolTip>
#include <QWidgetAction>
void WebBrowser::createConnections() { void WebBrowser::createConnections() {
connect(m_ui->m_webMessage, &WebViewer::messageStatusChangeRequested, this, &WebBrowser::receiveMessageStatusChangeRequest); connect(m_webView, &WebViewer::messageStatusChangeRequested, this, &WebBrowser::receiveMessageStatusChangeRequest);
connect(m_txtLocation,SIGNAL(submitted(QString)), this, SLOT(loadUrl(QString)));
connect(m_webView, SIGNAL(urlChanged(QUrl)), this, SLOT(updateUrl(QUrl)));
// Connect this WebBrowser to global TabWidget.
//TabWidget *tab_widget = qApp->mainForm()->tabWidget();
//connect(m_webView, SIGNAL(newTabRequested()), tab_widget, SLOT(addEmptyBrowser()));
//connect(m_webView, SIGNAL(linkMiddleClicked(QUrl)), tab_widget, SLOT(addLinkedBrowser(QUrl)));
// Change location textbox status according to webpage status.
connect(m_webView, SIGNAL(loadStarted()), this, SLOT(onLoadingStarted()));
//connect(m_webView, SIGNAL(loadProgress(int)), this, SLOT(onLoadingProgress(int)));
connect(m_webView, SIGNAL(loadFinished(bool)), this, SLOT(onLoadingFinished(bool)));
// Forward title/icon changes.
//connect(m_webView, SIGNAL(titleChanged(QString)), this, SLOT(onTitleChanged(QString)));
//connect(m_webView, SIGNAL(iconChanged(QIcon)), this, SLOT(onIconChanged(QIcon)));
}
void WebBrowser::updateUrl(const QUrl &url) {
QString url_string = url.toString();
m_txtLocation->setText(url_string);
//setNavigationBarVisible(url_string != INTERNAL_URL_EMPTY && url_string != INTERNAL_URL_NEWSPAPER);
}
void WebBrowser::loadUrl(const QUrl &url) {
if (url.isValid()) {
m_webView->load(url);
}
} }
WebBrowser::WebBrowser(QWidget *parent) : TabContent(parent), WebBrowser::WebBrowser(QWidget *parent) : TabContent(parent),
m_ui(new Ui::WebBrowser) { m_layout(new QVBoxLayout(this)),
m_ui->setupUi(this); m_toolBar(new QToolBar(tr("Navigation panel"), this)),
m_webView(new WebViewer(this)),
m_txtLocation(new LocationLineEdit(this)),
m_btnDiscoverFeeds(new DiscoverFeedsButton(this)),
m_actionBack(m_webView->pageAction(QWebEnginePage::Back)),
m_actionForward(m_webView->pageAction(QWebEnginePage::Forward)),
m_actionReload(m_webView->pageAction(QWebEnginePage::Reload)),
m_actionStop(m_webView->pageAction(QWebEnginePage::Stop)) {
// Initialize the components and layout.
initializeLayout();
setTabOrder(m_txtLocation, m_toolBar);
setTabOrder(m_toolBar, m_webView);
createConnections(); createConnections();
reloadFontSettings(); reloadFontSettings();
@ -44,6 +92,8 @@ WebBrowser::WebBrowser(QWidget *parent) : TabContent(parent),
} }
WebBrowser::~WebBrowser() { WebBrowser::~WebBrowser() {
// Delete members. Do not use scoped pointers here.
delete m_layout;
} }
void WebBrowser::reloadFontSettings() { void WebBrowser::reloadFontSettings() {
@ -56,10 +106,14 @@ void WebBrowser::reloadFontSettings() {
} }
void WebBrowser::clear() { void WebBrowser::clear() {
m_ui->m_webMessage->clear(); m_webView->clear();
hide(); hide();
} }
void WebBrowser::loadUrl(const QString &url) {
return loadUrl(QUrl::fromUserInput(url));
}
void WebBrowser::loadMessages(const QList<Message> &messages, RootItem *root) { void WebBrowser::loadMessages(const QList<Message> &messages, RootItem *root) {
if (m_messages.size() == messages.size()) { if (m_messages.size() == messages.size()) {
for (int i = 0; i < messages.size(); i++) { for (int i = 0; i < messages.size(); i++) {
@ -78,7 +132,7 @@ void WebBrowser::loadMessages(const QList<Message> &messages, RootItem *root) {
m_root = root; m_root = root;
if (!m_root.isNull()) { if (!m_root.isNull()) {
m_ui->m_webMessage->loadMessages(messages); m_webView->loadMessages(messages);
show(); show();
} }
} }
@ -110,6 +164,57 @@ void WebBrowser::receiveMessageStatusChangeRequest(int message_id, WebPage::Mess
} }
} }
void WebBrowser::initializeLayout() {
m_toolBar->setFloatable(false);
m_toolBar->setMovable(false);
m_toolBar->setAllowedAreas(Qt::TopToolBarArea);
// Modify action texts.
m_actionBack->setText(tr("Back"));
m_actionBack->setToolTip(tr("Go back."));
m_actionForward->setText(tr("Forward"));
m_actionForward->setToolTip(tr("Go forward."));
m_actionReload->setText(tr("Reload"));
m_actionReload->setToolTip(tr("Reload current web page."));
m_actionStop->setText(tr("Stop"));
m_actionStop->setToolTip(tr("Stop web page loading."));
QWidgetAction *act_discover = new QWidgetAction(this);
act_discover->setDefaultWidget(m_btnDiscoverFeeds);
// Add needed actions into toolbar.
m_toolBar->addAction(m_actionBack);
m_toolBar->addAction(m_actionForward);
m_toolBar->addAction(m_actionReload);
m_toolBar->addAction(m_actionStop);
m_toolBar->addAction(act_discover);
m_toolBar->addWidget(m_txtLocation);
// Setup layout.
m_layout->addWidget(m_toolBar);
m_layout->addWidget(m_webView);
m_layout->setMargin(0);
m_layout->setSpacing(0);
}
void WebBrowser::onLoadingStarted() {
m_btnDiscoverFeeds->clearFeedAddresses();
}
void WebBrowser::onLoadingFinished(bool success) {
if (success) {
// Let's check if there are any feeds defined on the web and eventually
// display "Add feeds" button.
m_webView->page()->toHtml([this](const QString &result){
this->m_btnDiscoverFeeds->setFeedAddresses(NetworkFactory::extractFeedLinksFromHtmlPage(m_webView->url(), result));
});
}
else {
m_btnDiscoverFeeds->clearFeedAddresses();
}
}
void WebBrowser::markMessageAsRead(int id, bool read) { void WebBrowser::markMessageAsRead(int id, bool read) {
if (!m_root.isNull()) { if (!m_root.isNull()) {
Message *msg = findMessage(id); Message *msg = findMessage(id);

View File

@ -20,19 +20,30 @@
#include "gui/tabcontent.h" #include "gui/tabcontent.h"
#include "ui_webbrowser.h" //#include "ui_webbrowser.h"
#include "core/message.h" #include "core/message.h"
#include "network-web/webpage.h"
#include "services/abstract/rootitem.h" #include "services/abstract/rootitem.h"
#include <QPointer> #include <QPointer>
#include <QToolBar>
namespace Ui { /*namespace Ui {
class MessagePreviewer; class MessagePreviewer;
} }*/
class QToolBar; class QToolButton;
class QVBoxLayout;
class QHBoxLayout;
class QProgressBar;
class QMenu;
class QLabel;
class TabWidget;
class WebViewer;
class LocationLineEdit;
class DiscoverFeedsButton;
class WebBrowser : public TabContent { class WebBrowser : public TabContent {
Q_OBJECT Q_OBJECT
@ -41,14 +52,28 @@ class WebBrowser : public TabContent {
explicit WebBrowser(QWidget *parent = 0); explicit WebBrowser(QWidget *parent = 0);
virtual ~WebBrowser(); virtual ~WebBrowser();
WebBrowser *webBrowser() const {
return const_cast<WebBrowser*>(this);
}
void reloadFontSettings(); void reloadFontSettings();
public slots: public slots:
void clear(); void clear();
void loadUrl(const QString &url);
void loadUrl(const QUrl &url);
void loadMessages(const QList<Message> &messages, RootItem *root); void loadMessages(const QList<Message> &messages, RootItem *root);
void loadMessage(const Message &message, RootItem *root); void loadMessage(const Message &message, RootItem *root);
// Switches visibility of navigation bar.
inline void setNavigationBarVisible(bool visible) {
m_toolBar->setVisible(visible);
}
private slots: private slots:
void updateUrl(const QUrl &url);
void onLoadingStarted();
void onLoadingFinished(bool success);
void receiveMessageStatusChangeRequest(int message_id, WebPage::MessageStatusChange change); void receiveMessageStatusChangeRequest(int message_id, WebPage::MessageStatusChange change);
signals: signals:
@ -57,12 +82,25 @@ class WebBrowser : public TabContent {
void requestMessageListReload(bool mark_current_as_read); void requestMessageListReload(bool mark_current_as_read);
private: private:
void initializeLayout();
Message *findMessage(int id); Message *findMessage(int id);
void markMessageAsRead(int id, bool read); void markMessageAsRead(int id, bool read);
void switchMessageImportance(int id, bool checked); void switchMessageImportance(int id, bool checked);
void createConnections(); void createConnections();
QScopedPointer<Ui::WebBrowser> m_ui; QVBoxLayout *m_layout;
QToolBar *m_toolBar;
WebViewer *m_webView;
LocationLineEdit *m_txtLocation;
DiscoverFeedsButton *m_btnDiscoverFeeds;
QAction *m_actionBack;
QAction *m_actionForward;
QAction *m_actionReload;
QAction *m_actionStop;
//QScopedPointer<Ui::WebBrowser> m_ui;
QList<Message> m_messages; QList<Message> m_messages;
QPointer<RootItem> m_root; QPointer<RootItem> m_root;
}; };

View File

@ -26,8 +26,7 @@
WebViewer::WebViewer(QWidget *parent) : QWebEngineView(parent) { WebViewer::WebViewer(QWidget *parent) : QWebEngineView(parent) {
WebPage *page = new WebPage(this); WebPage *page = new WebPage(this);
connect(page, &WebPage::messageStatusChangeRequested, connect(page, &WebPage::messageStatusChangeRequested, this, &WebViewer::messageStatusChangeRequested);
this, &WebViewer::messageStatusChangeRequested);
setPage(page); setPage(page);
} }

View File

@ -299,4 +299,5 @@ void Application::onAboutToQuit() {
void Application::downloadRequested(QWebEngineDownloadItem *download_item) { void Application::downloadRequested(QWebEngineDownloadItem *download_item) {
downloadManager()->download(download_item->url()); downloadManager()->download(download_item->url());
download_item->cancel(); download_item->cancel();
download_item->deleteLater();
} }

View File

@ -108,6 +108,10 @@ class DownloadManager : public TabContent {
explicit DownloadManager(QWidget *parent = 0); explicit DownloadManager(QWidget *parent = 0);
virtual ~DownloadManager(); virtual ~DownloadManager();
WebBrowser *webBrowser() const {
return nullptr;
}
QNetworkAccessManager *networkManager() const; QNetworkAccessManager *networkManager() const;
int totalDownloads() const; int totalDownloads() const;