multiple fixes

This commit is contained in:
Martin Rotter 2022-03-29 13:34:19 +02:00
parent 1787368ee1
commit 982a3dc004
9 changed files with 70 additions and 47 deletions

View File

@ -29,7 +29,7 @@ LiteHtmlViewer::LiteHtmlViewer(QWidget* parent) : QLiteHtmlWidget(parent), m_dow
return handleResource(url); return handleResource(url);
}); });
connect(this, &LiteHtmlViewer::linkClicked, this, &LiteHtmlViewer::setUrl); connect(this, &LiteHtmlViewer::linkClicked, this, &LiteHtmlViewer::onLinkClicked);
connect(this, &LiteHtmlViewer::copyAvailable, this, &LiteHtmlViewer::selectedTextChanged); connect(this, &LiteHtmlViewer::copyAvailable, this, &LiteHtmlViewer::selectedTextChanged);
connect(this, &LiteHtmlViewer::contextMenuRequested, this, &LiteHtmlViewer::showContextMenu); connect(this, &LiteHtmlViewer::contextMenuRequested, this, &LiteHtmlViewer::showContextMenu);
} }
@ -50,8 +50,6 @@ void LiteHtmlViewer::bindToBrowser(WebBrowser* browser) {
// right away. // right away.
browser->m_actionStop->setEnabled(false); browser->m_actionStop->setEnabled(false);
connect(this, &LiteHtmlViewer::zoomFactorChanged, browser, &WebBrowser::onZoomFactorChanged);
connect(this, &LiteHtmlViewer::linkHighlighted, browser, [browser](const QUrl& url) { connect(this, &LiteHtmlViewer::linkHighlighted, browser, [browser](const QUrl& url) {
browser->onLinkHovered(url.toString()); browser->onLinkHovered(url.toString());
}); });
@ -60,6 +58,11 @@ void LiteHtmlViewer::bindToBrowser(WebBrowser* browser) {
connect(this, &LiteHtmlViewer::loadStarted, browser, &WebBrowser::onLoadingStarted); connect(this, &LiteHtmlViewer::loadStarted, browser, &WebBrowser::onLoadingStarted);
connect(this, &LiteHtmlViewer::loadProgress, browser, &WebBrowser::onLoadingProgress); connect(this, &LiteHtmlViewer::loadProgress, browser, &WebBrowser::onLoadingProgress);
connect(this, &LiteHtmlViewer::loadFinished, browser, &WebBrowser::onLoadingFinished); connect(this, &LiteHtmlViewer::loadFinished, browser, &WebBrowser::onLoadingFinished);
connect(this, &LiteHtmlViewer::newWindowRequested, browser, &WebBrowser::newWindowRequested);
// TODO: add "Open in new tab" to context menu.
//
//connect(page(), &WebEnginePage::windowCloseRequested, browser, &WebBrowser::windowCloseRequested);
} }
void LiteHtmlViewer::findText(const QString& text, bool backwards) { void LiteHtmlViewer::findText(const QString& text, bool backwards) {
@ -255,6 +258,18 @@ void LiteHtmlViewer::selectedTextChanged(bool available) {
} }
} }
void LiteHtmlViewer::onLinkClicked(const QUrl& link) {
if ((QApplication::queryKeyboardModifiers() & Qt::KeyboardModifier::ControlModifier) > 0) {
LiteHtmlViewer* viewer = new LiteHtmlViewer(this);
emit newWindowRequested(viewer);
viewer->setUrl(link);
}
else {
setUrl(link);
}
}
void LiteHtmlViewer::showContextMenu(const QPoint& pos, const QUrl& url) { void LiteHtmlViewer::showContextMenu(const QPoint& pos, const QUrl& url) {
if (m_contextMenu.isNull()) { if (m_contextMenu.isNull()) {
m_contextMenu.reset(new QMenu("Context menu for web browser", this)); m_contextMenu.reset(new QMenu("Context menu for web browser", this));

View File

@ -39,15 +39,16 @@ class LiteHtmlViewer : public QLiteHtmlWidget, public WebViewer {
private slots: private slots:
void selectedTextChanged(bool available); void selectedTextChanged(bool available);
void onLinkClicked(const QUrl& link);
void showContextMenu(const QPoint& pos, const QUrl& url); void showContextMenu(const QPoint& pos, const QUrl& url);
signals: signals:
void zoomFactorChanged();
void titleChanged(const QString& new_title); void titleChanged(const QString& new_title);
void urlChanged(const QUrl& url); void urlChanged(const QUrl& url);
void loadStarted(); void loadStarted();
void loadProgress(int progress); void loadProgress(int progress);
void loadFinished(bool success); void loadFinished(bool success);
void newWindowRequested(WebViewer* viewer);
protected: protected:
virtual void keyPressEvent(QKeyEvent* event); virtual void keyPressEvent(QKeyEvent* event);

View File

@ -42,7 +42,7 @@ void MessagePreviewer::createConnections() {
MessagePreviewer::MessagePreviewer(QWidget* parent) MessagePreviewer::MessagePreviewer(QWidget* parent)
: QWidget(parent), m_layout(new QGridLayout(this)), m_toolBar(new QToolBar(this)), : QWidget(parent), m_layout(new QGridLayout(this)), m_toolBar(new QToolBar(this)),
m_separator(nullptr), m_btnLabels(QList<QPair<LabelButton*, QAction*>>()) { m_separator(nullptr), m_btnLabels(QList<QPair<LabelButton*, QAction*>>()) {
m_txtMessage = new WebBrowser(this); m_txtMessage = new WebBrowser(nullptr, this);
m_toolBar->setOrientation(Qt::Orientation::Vertical); m_toolBar->setOrientation(Qt::Orientation::Vertical);

View File

@ -186,7 +186,7 @@ void TabWidget::closeCurrentTab() {
} }
int TabWidget::addNewspaperView(RootItem* root, const QList<Message>& messages) { int TabWidget::addNewspaperView(RootItem* root, const QList<Message>& messages) {
WebBrowser* browser = new WebBrowser(this); WebBrowser* browser = new WebBrowser(nullptr, this);
int index = addTab(browser, int index = addTab(browser,
qApp->icons()->fromTheme(QSL("format-justify-fill")), qApp->icons()->fromTheme(QSL("format-justify-fill")),
tr("Newspaper view"), tr("Newspaper view"),
@ -211,12 +211,10 @@ int TabWidget::addLinkedBrowser(const QUrl& initial_url) {
} }
int TabWidget::addLinkedBrowser(const QString& initial_url) { int TabWidget::addLinkedBrowser(const QString& initial_url) {
return addLinkedBrowser(QUrl(initial_url)); return addLinkedBrowser(QUrl::fromUserInput(initial_url));
} }
int TabWidget::addBrowser(bool move_after_current, bool make_active, const QUrl& initial_url) { int TabWidget::addBrowser(bool move_after_current, bool make_active, WebBrowser* browser) {
// Create new WebBrowser.
WebBrowser* browser = new WebBrowser(this);
int final_index; int final_index;
QString browser_tab_name = tr("Web browser"); QString browser_tab_name = tr("Web browser");
@ -243,11 +241,6 @@ int TabWidget::addBrowser(bool move_after_current, bool make_active, const QUrl&
// Setup the tab index. // Setup the tab index.
browser->setIndex(final_index); browser->setIndex(final_index);
// Load initial web page if desired.
if (initial_url.isValid()) {
browser->loadUrl(initial_url);
}
// Make new web browser active if desired. // Make new web browser active if desired.
if (make_active) { if (make_active) {
setCurrentIndex(final_index); setCurrentIndex(final_index);
@ -257,6 +250,19 @@ int TabWidget::addBrowser(bool move_after_current, bool make_active, const QUrl&
return final_index; return final_index;
} }
int TabWidget::addBrowser(bool move_after_current, bool make_active, const QUrl& initial_url) {
// Create new WebBrowser.
WebBrowser* browser = new WebBrowser(nullptr, this);
int index = addBrowser(move_after_current, make_active, browser);
// Load initial web page if desired.
if (initial_url.isValid()) {
browser->loadUrl(initial_url);
}
return index;
}
void TabWidget::gotoNextTab() { void TabWidget::gotoNextTab() {
if (currentIndex() == count() - 1) { if (currentIndex() == count() - 1) {
setCurrentIndex(0); setCurrentIndex(0);

View File

@ -80,6 +80,7 @@ class TabWidget : public QTabWidget {
// General method for adding WebBrowsers. // General method for adding WebBrowsers.
int addBrowser(bool move_after_current, bool make_active, const QUrl& initial_url = QUrl()); int addBrowser(bool move_after_current, bool make_active, const QUrl& initial_url = QUrl());
int addBrowser(bool move_after_current, bool make_active, WebBrowser* browser);
void gotoNextTab(); void gotoNextTab();
void gotoPreviousTab(); void gotoPreviousTab();

View File

@ -3,11 +3,13 @@
#include "gui/webbrowser.h" #include "gui/webbrowser.h"
#include "database/databasequeries.h" #include "database/databasequeries.h"
#include "gui/dialogs/formmain.h"
#include "gui/litehtml/litehtmlviewer.h" // QLiteHtml-based web browsing. #include "gui/litehtml/litehtmlviewer.h" // QLiteHtml-based web browsing.
#include "gui/messagebox.h" #include "gui/messagebox.h"
#include "gui/reusable/discoverfeedsbutton.h" #include "gui/reusable/discoverfeedsbutton.h"
#include "gui/reusable/locationlineedit.h" #include "gui/reusable/locationlineedit.h"
#include "gui/reusable/searchtextwidget.h" #include "gui/reusable/searchtextwidget.h"
#include "gui/tabwidget.h"
#include "gui/webviewer.h" #include "gui/webviewer.h"
#include "miscellaneous/application.h" #include "miscellaneous/application.h"
#include "miscellaneous/iconfactory.h" #include "miscellaneous/iconfactory.h"
@ -27,9 +29,10 @@
#include <QToolTip> #include <QToolTip>
#include <QWidgetAction> #include <QWidgetAction>
WebBrowser::WebBrowser(QWidget* parent) : TabContent(parent), WebBrowser::WebBrowser(WebViewer* viewer, QWidget* parent) : TabContent(parent),
m_layout(new QVBoxLayout(this)), m_layout(new QVBoxLayout(this)),
m_toolBar(new QToolBar(tr("Navigation panel"), this)), m_toolBar(new QToolBar(tr("Navigation panel"), this)),
m_webView(viewer),
m_searchWidget(new SearchTextWidget(this)), m_searchWidget(new SearchTextWidget(this)),
m_txtLocation(new LocationLineEdit(this)), m_txtLocation(new LocationLineEdit(this)),
m_btnDiscoverFeeds(new DiscoverFeedsButton(this)), m_btnDiscoverFeeds(new DiscoverFeedsButton(this)),
@ -39,17 +42,18 @@ WebBrowser::WebBrowser(QWidget* parent) : TabContent(parent),
m_actionReadabilePage(new QAction(qApp->icons()->fromTheme(QSL("text-html")), m_actionReadabilePage(new QAction(qApp->icons()->fromTheme(QSL("text-html")),
tr("View website in reader mode"), tr("View website in reader mode"),
this)) { this)) {
if (m_webView == nullptr) {
#if !defined(USE_WEBENGINE) #if !defined(USE_WEBENGINE)
m_webView = new LiteHtmlViewer(this), m_webView = new LiteHtmlViewer(this),
#else #else
if (qApp->forcedNoWebEngine()) { if (qApp->forcedNoWebEngine()) {
m_webView = new LiteHtmlViewer(this); m_webView = new LiteHtmlViewer(this);
} }
else { else {
m_webView = new WebEngineViewer(this); m_webView = new WebEngineViewer(this);
} }
#endif #endif
}
// Initialize the components and layout. // Initialize the components and layout.
m_webView->bindToBrowser(this); m_webView->bindToBrowser(this);
@ -229,7 +233,7 @@ void WebBrowser::onTitleChanged(const QString& new_title) {
emit titleChanged(m_index, tr("No title")); emit titleChanged(m_index, tr("No title"));
} }
else { else {
emit titleChanged(m_index, new_title); emit titleChanged(m_index, new_title.simplified());
} }
} }
@ -245,6 +249,12 @@ void WebBrowser::onLinkHovered(const QString& url) {
{ false, false, true }); { false, false, true });
} }
void WebBrowser::newWindowRequested(WebViewer* viewer) {
WebBrowser* browser = new WebBrowser(viewer, this);
qApp->mainForm()->tabWidget()->addBrowser(false, false, browser);
}
void WebBrowser::setReadabledHtml(const QString& better_html) { void WebBrowser::setReadabledHtml(const QString& better_html) {
if (!better_html.isEmpty()) { if (!better_html.isEmpty()) {
m_webView->setHtml(better_html, m_webView->url()); m_webView->setHtml(better_html, m_webView->url());

View File

@ -30,19 +30,19 @@ class WebBrowser : public TabContent {
friend class LiteHtmlViewer; friend class LiteHtmlViewer;
public: public:
explicit WebBrowser(QWidget* parent = nullptr); explicit WebBrowser(WebViewer* viewer = nullptr, QWidget* parent = nullptr);
virtual ~WebBrowser(); virtual ~WebBrowser();
virtual WebBrowser* webBrowser() const; virtual WebBrowser* webBrowser() const;
WebViewer* viewer() const; WebViewer* viewer() const;
void reloadFontSettings();
double verticalScrollBarPosition() const; double verticalScrollBarPosition() const;
void setVerticalScrollBarPosition(double pos); void setVerticalScrollBarPosition(double pos);
public slots: public slots:
void reloadFontSettings();
void clear(bool also_hide); void clear(bool also_hide);
void loadUrl(const QString& url); void loadUrl(const QString& url);
void loadUrl(const QUrl& url); void loadUrl(const QUrl& url);
@ -62,13 +62,14 @@ class WebBrowser : public TabContent {
void onTitleChanged(const QString& new_title); void onTitleChanged(const QString& new_title);
void onIconChanged(const QIcon& icon); void onIconChanged(const QIcon& icon);
void onLinkHovered(const QString& url); void onLinkHovered(const QString& url);
void newWindowRequested(WebViewer* viewer);
void readabilePage(); void readabilePage();
void setReadabledHtml(const QString& better_html); void setReadabledHtml(const QString& better_html);
void readabilityFailed(const QString& error); void readabilityFailed(const QString& error);
signals: signals:
void closeRequested(); void windowCloseRequested();
void iconChanged(int index, const QIcon& icon); void iconChanged(int index, const QIcon& icon);
void titleChanged(int index, const QString& title); void titleChanged(int index, const QString& title);

View File

@ -52,10 +52,6 @@ WebEnginePage* WebEngineViewer::page() const {
return qobject_cast<WebEnginePage*>(QWebEngineView::page()); return qobject_cast<WebEnginePage*>(QWebEngineView::page());
} }
void WebEngineViewer::displayMessage() {
setHtml(m_messageContents, m_messageBaseUrl /*, QUrl::fromUserInput(INTERNAL_URL_MESSAGE)*/);
}
void WebEngineViewer::loadMessages(const QList<Message>& messages, RootItem* root) { void WebEngineViewer::loadMessages(const QList<Message>& messages, RootItem* root) {
Skin skin = qApp->skins()->currentSkin(); Skin skin = qApp->skins()->currentSkin();
QString messages_layout; QString messages_layout;
@ -134,7 +130,7 @@ void WebEngineViewer::loadMessages(const QList<Message>& messages, RootItem* roo
bool previously_enabled = isEnabled(); bool previously_enabled = isEnabled();
setEnabled(false); setEnabled(false);
displayMessage(); setHtml(m_messageContents, m_messageBaseUrl /*, QUrl::fromUserInput(INTERNAL_URL_MESSAGE)*/);
setEnabled(previously_enabled); setEnabled(previously_enabled);
page()->runJavaScript(QSL("window.scrollTo(0, 0);")); page()->runJavaScript(QSL("window.scrollTo(0, 0);"));
@ -216,15 +212,10 @@ void WebEngineViewer::contextMenuEvent(QContextMenuEvent* event) {
} }
QWebEngineView* WebEngineViewer::createWindow(QWebEnginePage::WebWindowType type) { QWebEngineView* WebEngineViewer::createWindow(QWebEnginePage::WebWindowType type) {
Q_UNUSED(type) auto* viewer = new WebEngineViewer(this);
int index = qApp->mainForm()->tabWidget()->addBrowser(false, false); emit newWindowRequested(viewer);
if (index >= 0) { return viewer;
return dynamic_cast<QWebEngineView*>(qApp->mainForm()->tabWidget()->widget(index)->webBrowser()->viewer());
}
else {
return nullptr;
}
} }
void WebEngineViewer::openUrlWithExternalTool(ExternalTool tool, const QString& target_url) { void WebEngineViewer::openUrlWithExternalTool(ExternalTool tool, const QString& target_url) {
@ -243,16 +234,15 @@ void WebEngineViewer::bindToBrowser(WebBrowser* browser) {
browser->m_actionReload = pageAction(QWebEnginePage::WebAction::Reload); browser->m_actionReload = pageAction(QWebEnginePage::WebAction::Reload);
browser->m_actionStop = pageAction(QWebEnginePage::WebAction::Stop); browser->m_actionStop = pageAction(QWebEnginePage::WebAction::Stop);
connect(this, &WebEngineViewer::zoomFactorChanged, browser, &WebBrowser::onZoomFactorChanged);
connect(this, &WebEngineViewer::loadStarted, browser, &WebBrowser::onLoadingStarted); connect(this, &WebEngineViewer::loadStarted, browser, &WebBrowser::onLoadingStarted);
connect(this, &WebEngineViewer::loadProgress, browser, &WebBrowser::onLoadingProgress); connect(this, &WebEngineViewer::loadProgress, browser, &WebBrowser::onLoadingProgress);
connect(this, &WebEngineViewer::loadFinished, browser, &WebBrowser::onLoadingFinished); connect(this, &WebEngineViewer::loadFinished, browser, &WebBrowser::onLoadingFinished);
connect(this, &WebEngineViewer::titleChanged, browser, &WebBrowser::onTitleChanged); connect(this, &WebEngineViewer::titleChanged, browser, &WebBrowser::onTitleChanged);
connect(this, &WebEngineViewer::iconChanged, browser, &WebBrowser::onIconChanged); connect(this, &WebEngineViewer::iconChanged, browser, &WebBrowser::onIconChanged);
connect(this, &WebEngineViewer::urlChanged, browser, &WebBrowser::updateUrl); connect(this, &WebEngineViewer::urlChanged, browser, &WebBrowser::updateUrl);
connect(this, &WebEngineViewer::newWindowRequested, browser, &WebBrowser::newWindowRequested);
connect(page(), &WebEnginePage::windowCloseRequested, browser, &WebBrowser::closeRequested); connect(page(), &WebEnginePage::windowCloseRequested, browser, &WebBrowser::windowCloseRequested);
connect(page(), &WebEnginePage::linkHovered, browser, &WebBrowser::onLinkHovered); connect(page(), &WebEnginePage::linkHovered, browser, &WebBrowser::onLinkHovered);
} }

View File

@ -42,7 +42,7 @@ class WebEngineViewer : public QWebEngineView, public WebViewer {
virtual QUrl url() const; virtual QUrl url() const;
signals: signals:
void zoomFactorChanged(); void newWindowRequested(WebViewer* viewer);
protected: protected:
virtual QWebEngineView* createWindow(QWebEnginePage::WebWindowType type); virtual QWebEngineView* createWindow(QWebEnginePage::WebWindowType type);
@ -50,7 +50,6 @@ class WebEngineViewer : public QWebEngineView, public WebViewer {
virtual bool event(QEvent* event); virtual bool event(QEvent* event);
private slots: private slots:
void displayMessage();
void openUrlWithExternalTool(ExternalTool tool, const QString& target_url); void openUrlWithExternalTool(ExternalTool tool, const QString& target_url);
private: private: