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/gui/webviewer.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 \
src/core/feedsmodel.cpp \
@ -373,7 +376,10 @@ SOURCES += src/core/feeddownloader.cpp \
src/services/tt-rss/ttrssserviceroot.cpp \
src/gui/webviewer.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 += \
src/gui/toolbareditor.ui \

View File

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

View File

@ -21,6 +21,8 @@
#include <QWidget>
class WebBrowser;
// Base class for all widgets which are placed inside tabs of TabWidget
class TabContent : public QWidget {
Q_OBJECT
@ -41,6 +43,10 @@ class TabContent : public QWidget {
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:
int m_index;
};

View File

@ -18,9 +18,13 @@
#include "gui/webbrowser.h"
#include "miscellaneous/application.h"
#include "network-web/webfactory.h"
#include "miscellaneous/databasequeries.h"
#include "network-web/networkfactory.h"
#include "network-web/webfactory.h"
#include "gui/messagebox.h"
#include "gui/webviewer.h"
#include "gui/discoverfeedsbutton.h"
#include "gui/locationlineedit.h"
#include "gui/dialogs/formmain.h"
#include "services/abstract/serviceroot.h"
@ -28,15 +32,59 @@
#include <QToolBar>
#include <QWebEngineSettings>
#include <QToolTip>
#include <QWidgetAction>
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),
m_ui(new Ui::WebBrowser) {
m_ui->setupUi(this);
m_layout(new QVBoxLayout(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();
reloadFontSettings();
@ -44,6 +92,8 @@ WebBrowser::WebBrowser(QWidget *parent) : TabContent(parent),
}
WebBrowser::~WebBrowser() {
// Delete members. Do not use scoped pointers here.
delete m_layout;
}
void WebBrowser::reloadFontSettings() {
@ -56,10 +106,14 @@ void WebBrowser::reloadFontSettings() {
}
void WebBrowser::clear() {
m_ui->m_webMessage->clear();
m_webView->clear();
hide();
}
void WebBrowser::loadUrl(const QString &url) {
return loadUrl(QUrl::fromUserInput(url));
}
void WebBrowser::loadMessages(const QList<Message> &messages, RootItem *root) {
if (m_messages.size() == messages.size()) {
for (int i = 0; i < messages.size(); i++) {
@ -78,7 +132,7 @@ void WebBrowser::loadMessages(const QList<Message> &messages, RootItem *root) {
m_root = root;
if (!m_root.isNull()) {
m_ui->m_webMessage->loadMessages(messages);
m_webView->loadMessages(messages);
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) {
if (!m_root.isNull()) {
Message *msg = findMessage(id);

View File

@ -20,19 +20,30 @@
#include "gui/tabcontent.h"
#include "ui_webbrowser.h"
//#include "ui_webbrowser.h"
#include "core/message.h"
#include "network-web/webpage.h"
#include "services/abstract/rootitem.h"
#include <QPointer>
#include <QToolBar>
namespace Ui {
/*namespace Ui {
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 {
Q_OBJECT
@ -41,14 +52,28 @@ class WebBrowser : public TabContent {
explicit WebBrowser(QWidget *parent = 0);
virtual ~WebBrowser();
WebBrowser *webBrowser() const {
return const_cast<WebBrowser*>(this);
}
void reloadFontSettings();
public slots:
void clear();
void loadUrl(const QString &url);
void loadUrl(const QUrl &url);
void loadMessages(const QList<Message> &messages, 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:
void updateUrl(const QUrl &url);
void onLoadingStarted();
void onLoadingFinished(bool success);
void receiveMessageStatusChangeRequest(int message_id, WebPage::MessageStatusChange change);
signals:
@ -57,12 +82,25 @@ class WebBrowser : public TabContent {
void requestMessageListReload(bool mark_current_as_read);
private:
void initializeLayout();
Message *findMessage(int id);
void markMessageAsRead(int id, bool read);
void switchMessageImportance(int id, bool checked);
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;
QPointer<RootItem> m_root;
};

View File

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

View File

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

View File

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