Removed that webengine shit.
This commit is contained in:
parent
36aadcaa1e
commit
322aef972d
31 changed files with 92 additions and 1673 deletions
|
@ -223,9 +223,9 @@ endif(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
|
||||||
# Setup libraries.
|
# Setup libraries.
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
# On Unices, enable D-Bus support.
|
# On Unices, enable D-Bus support.
|
||||||
find_package(Qt5 REQUIRED DBus Sql WebEngineCore WebEngineWidgets Widgets Xml XmlPatterns Network LinguistTools PrintSupport)
|
find_package(Qt5 REQUIRED DBus Sql Widgets Xml XmlPatterns Network LinguistTools PrintSupport)
|
||||||
else(UNIX)
|
else(UNIX)
|
||||||
find_package(Qt5 REQUIRED Sql WebEngineCore WebEngineWidgets Widgets Xml XmlPatterns Network LinguistTools PrintSupport)
|
find_package(Qt5 REQUIRED Sql Widgets Xml XmlPatterns Network LinguistTools PrintSupport)
|
||||||
endif(UNIX)
|
endif(UNIX)
|
||||||
|
|
||||||
message(STATUS "[${APP_LOW_NAME}] Found Qt version: '${Qt5_VERSION}'.")
|
message(STATUS "[${APP_LOW_NAME}] Found Qt version: '${Qt5_VERSION}'.")
|
||||||
|
@ -413,8 +413,6 @@ if(UNIX)
|
||||||
Sql
|
Sql
|
||||||
Network
|
Network
|
||||||
Xml
|
Xml
|
||||||
WebEngineCore
|
|
||||||
WebEngineWidgets
|
|
||||||
PrintSupport
|
PrintSupport
|
||||||
)
|
)
|
||||||
else(UNIX)
|
else(UNIX)
|
||||||
|
@ -425,8 +423,6 @@ else(UNIX)
|
||||||
Sql
|
Sql
|
||||||
Network
|
Network
|
||||||
Xml
|
Xml
|
||||||
WebEngineCore
|
|
||||||
WebEngineWidgets
|
|
||||||
PrintSupport
|
PrintSupport
|
||||||
)
|
)
|
||||||
endif(UNIX)
|
endif(UNIX)
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#include "miscellaneous/databasefactory.h"
|
#include "miscellaneous/databasefactory.h"
|
||||||
#include "miscellaneous/iconfactory.h"
|
#include "miscellaneous/iconfactory.h"
|
||||||
#include "network-web/webfactory.h"
|
#include "network-web/webfactory.h"
|
||||||
#include "network-web/webbrowser.h"
|
|
||||||
#include "gui/feedsview.h"
|
#include "gui/feedsview.h"
|
||||||
#include "gui/messagebox.h"
|
#include "gui/messagebox.h"
|
||||||
#include "gui/systemtrayicon.h"
|
#include "gui/systemtrayicon.h"
|
||||||
|
@ -84,9 +83,6 @@ FormMain::FormMain(QWidget *parent, Qt::WindowFlags f)
|
||||||
loadSize();
|
loadSize();
|
||||||
|
|
||||||
m_statusBar->loadChangeableActions();
|
m_statusBar->loadChangeableActions();
|
||||||
|
|
||||||
// Initialize the web factory.
|
|
||||||
WebFactory::instance()->loadState();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FormMain::~FormMain() {
|
FormMain::~FormMain() {
|
||||||
|
@ -113,14 +109,8 @@ QList<QAction*> FormMain::allActions() const {
|
||||||
actions << m_ui->m_actionSwitchStatusBar;
|
actions << m_ui->m_actionSwitchStatusBar;
|
||||||
actions << m_ui->m_actionSwitchMessageListOrientation;
|
actions << m_ui->m_actionSwitchMessageListOrientation;
|
||||||
|
|
||||||
// Add web browser actions.
|
|
||||||
actions << m_ui->m_actionAddBrowser;
|
|
||||||
actions << m_ui->m_actionCloseCurrentTab;
|
|
||||||
actions << m_ui->m_actionCloseAllTabs;
|
|
||||||
|
|
||||||
// Add feeds/messages actions.
|
// Add feeds/messages actions.
|
||||||
actions << m_ui->m_actionOpenSelectedSourceArticlesExternally;
|
actions << m_ui->m_actionOpenSelectedSourceArticlesExternally;
|
||||||
actions << m_ui->m_actionOpenSelectedSourceArticlesInternally;
|
|
||||||
actions << m_ui->m_actionOpenSelectedMessagesInternally;
|
actions << m_ui->m_actionOpenSelectedMessagesInternally;
|
||||||
actions << m_ui->m_actionMarkAllItemsRead;
|
actions << m_ui->m_actionMarkAllItemsRead;
|
||||||
actions << m_ui->m_actionMarkSelectedItemsAsRead;
|
actions << m_ui->m_actionMarkSelectedItemsAsRead;
|
||||||
|
@ -362,16 +352,6 @@ void FormMain::setupIcons() {
|
||||||
m_ui->m_actionSwitchMessageListOrientation->setIcon(icon_theme_factory->fromTheme(QSL("view-switch-layout-direction")));
|
m_ui->m_actionSwitchMessageListOrientation->setIcon(icon_theme_factory->fromTheme(QSL("view-switch-layout-direction")));
|
||||||
m_ui->m_menuShowHide->setIcon(icon_theme_factory->fromTheme(QSL("view-switch")));
|
m_ui->m_menuShowHide->setIcon(icon_theme_factory->fromTheme(QSL("view-switch")));
|
||||||
|
|
||||||
// Web browser.
|
|
||||||
m_ui->m_actionAddBrowser->setIcon(icon_theme_factory->fromTheme(QSL("list-add")));
|
|
||||||
m_ui->m_actionCloseCurrentTab->setIcon(icon_theme_factory->fromTheme(QSL("list-remove")));
|
|
||||||
m_ui->m_actionCloseAllTabs->setIcon(icon_theme_factory->fromTheme(QSL("list-remove")));
|
|
||||||
m_ui->m_menuCurrentTab->setIcon(icon_theme_factory->fromTheme(QSL("list-current")));
|
|
||||||
m_ui->m_menuWebSettings->setIcon(icon_theme_factory->fromTheme(QSL("application-settings")));
|
|
||||||
m_ui->m_actionWebAutoloadImages->setIcon(icon_theme_factory->fromTheme(QSL("image-generic")));
|
|
||||||
m_ui->m_actionWebEnableExternalPlugins->setIcon(icon_theme_factory->fromTheme(QSL("web-flash")));
|
|
||||||
m_ui->m_actionWebEnableJavascript->setIcon(icon_theme_factory->fromTheme(QSL("web-javascript")));
|
|
||||||
|
|
||||||
// Feeds/messages.
|
// Feeds/messages.
|
||||||
m_ui->m_menuAddItem->setIcon(icon_theme_factory->fromTheme(QSL("item-new")));
|
m_ui->m_menuAddItem->setIcon(icon_theme_factory->fromTheme(QSL("item-new")));
|
||||||
m_ui->m_actionStopRunningItemsUpdate->setIcon(icon_theme_factory->fromTheme(QSL("go-stop")));
|
m_ui->m_actionStopRunningItemsUpdate->setIcon(icon_theme_factory->fromTheme(QSL("go-stop")));
|
||||||
|
@ -388,7 +368,6 @@ void FormMain::setupIcons() {
|
||||||
m_ui->m_actionMarkSelectedMessagesAsRead->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-read")));
|
m_ui->m_actionMarkSelectedMessagesAsRead->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-read")));
|
||||||
m_ui->m_actionMarkSelectedMessagesAsUnread->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-unread")));
|
m_ui->m_actionMarkSelectedMessagesAsUnread->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-unread")));
|
||||||
m_ui->m_actionSwitchImportanceOfSelectedMessages->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-favorite")));
|
m_ui->m_actionSwitchImportanceOfSelectedMessages->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-favorite")));
|
||||||
m_ui->m_actionOpenSelectedSourceArticlesInternally->setIcon(icon_theme_factory->fromTheme(QSL("item-open-internal")));
|
|
||||||
m_ui->m_actionOpenSelectedSourceArticlesExternally->setIcon(icon_theme_factory->fromTheme(QSL("item-open-external")));
|
m_ui->m_actionOpenSelectedSourceArticlesExternally->setIcon(icon_theme_factory->fromTheme(QSL("item-open-external")));
|
||||||
m_ui->m_actionOpenSelectedMessagesInternally->setIcon(icon_theme_factory->fromTheme(QSL("item-open-internal")));
|
m_ui->m_actionOpenSelectedMessagesInternally->setIcon(icon_theme_factory->fromTheme(QSL("item-open-internal")));
|
||||||
m_ui->m_actionSendMessageViaEmail->setIcon(icon_theme_factory->fromTheme(QSL("item-send-email")));
|
m_ui->m_actionSendMessageViaEmail->setIcon(icon_theme_factory->fromTheme(QSL("item-send-email")));
|
||||||
|
@ -409,11 +388,6 @@ void FormMain::setupIcons() {
|
||||||
m_ui->m_actionAddFeedIntoSelectedAccount->setIcon(icon_theme_factory->fromTheme(QSL("folder-feed")));
|
m_ui->m_actionAddFeedIntoSelectedAccount->setIcon(icon_theme_factory->fromTheme(QSL("folder-feed")));
|
||||||
m_ui->m_actionAddCategoryIntoSelectedAccount->setIcon(icon_theme_factory->fromTheme(QSL("folder-category")));
|
m_ui->m_actionAddCategoryIntoSelectedAccount->setIcon(icon_theme_factory->fromTheme(QSL("folder-category")));
|
||||||
|
|
||||||
// Setup icons for underlying components: opened web browsers...
|
|
||||||
foreach (WebBrowser *browser, WebBrowser::runningWebBrowsers()) {
|
|
||||||
browser->setupIcons();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setup icons on TabWidget too.
|
// Setup icons on TabWidget too.
|
||||||
m_ui->m_tabWidget->setupIcons();
|
m_ui->m_tabWidget->setupIcons();
|
||||||
|
|
||||||
|
@ -508,39 +482,6 @@ void FormMain::createConnections() {
|
||||||
connect(m_ui->m_actionReportBugBitBucket, SIGNAL(triggered()), this, SLOT(reportABugOnBitBucket()));
|
connect(m_ui->m_actionReportBugBitBucket, SIGNAL(triggered()), this, SLOT(reportABugOnBitBucket()));
|
||||||
connect(m_ui->m_actionDonate, SIGNAL(triggered()), this, SLOT(donate()));
|
connect(m_ui->m_actionDonate, SIGNAL(triggered()), this, SLOT(donate()));
|
||||||
connect(m_ui->m_actionDisplayWiki, SIGNAL(triggered()), this, SLOT(showWiki()));
|
connect(m_ui->m_actionDisplayWiki, SIGNAL(triggered()), this, SLOT(showWiki()));
|
||||||
|
|
||||||
// Menu "Web browser" connections.
|
|
||||||
connect(m_ui->m_tabWidget, SIGNAL(currentChanged(int)), this, SLOT(loadWebBrowserMenu(int)));
|
|
||||||
connect(m_ui->m_actionCloseCurrentTab, SIGNAL(triggered()), m_ui->m_tabWidget, SLOT(closeCurrentTab()));
|
|
||||||
connect(m_ui->m_actionAddBrowser, SIGNAL(triggered()), m_ui->m_tabWidget, SLOT(addEmptyBrowser()));
|
|
||||||
connect(m_ui->m_actionCloseAllTabs, SIGNAL(triggered()), m_ui->m_tabWidget, SLOT(closeAllTabsExceptCurrent()));
|
|
||||||
connect(m_ui->m_actionWebAutoloadImages, SIGNAL(toggled(bool)), WebFactory::instance(), SLOT(switchImages(bool)));
|
|
||||||
connect(m_ui->m_actionWebEnableExternalPlugins, SIGNAL(toggled(bool)), WebFactory::instance(), SLOT(switchPlugins(bool)));
|
|
||||||
connect(m_ui->m_actionWebEnableJavascript, SIGNAL(toggled(bool)), WebFactory::instance(), SLOT(switchJavascript(bool)));
|
|
||||||
|
|
||||||
connect(WebFactory::instance(), SIGNAL(imagesLoadingSwitched(bool)), m_ui->m_actionWebAutoloadImages, SLOT(setChecked(bool)));
|
|
||||||
connect(WebFactory::instance(), SIGNAL(javascriptSwitched(bool)), m_ui->m_actionWebEnableJavascript, SLOT(setChecked(bool)));
|
|
||||||
connect(WebFactory::instance(), SIGNAL(pluginsSwitched(bool)), m_ui->m_actionWebEnableExternalPlugins, SLOT(setChecked(bool)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void FormMain::loadWebBrowserMenu(int index) {
|
|
||||||
const WebBrowser *active_browser = m_ui->m_tabWidget->widget(index)->webBrowser();
|
|
||||||
|
|
||||||
m_ui->m_menuCurrentTab->clear();
|
|
||||||
|
|
||||||
if (active_browser != NULL) {
|
|
||||||
m_ui->m_menuCurrentTab->setEnabled(true);
|
|
||||||
m_ui->m_menuCurrentTab->addActions(active_browser->globalMenu());
|
|
||||||
|
|
||||||
if (m_ui->m_menuCurrentTab->actions().size() == 0) {
|
|
||||||
m_ui->m_menuCurrentTab->insertAction(NULL, m_ui->m_actionNoActions);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_ui->m_menuCurrentTab->setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_ui->m_actionCloseCurrentTab->setEnabled(m_ui->m_tabWidget->tabBar()->tabType(index) == TabBar::Closable);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormMain::backupDatabaseSettings() {
|
void FormMain::backupDatabaseSettings() {
|
||||||
|
|
|
@ -78,9 +78,6 @@ class FormMain : public QMainWindow {
|
||||||
void updateRecycleBinMenu();
|
void updateRecycleBinMenu();
|
||||||
void updateAccountsMenu();
|
void updateAccountsMenu();
|
||||||
|
|
||||||
// Loads web browser menu if user selects to change tabs.
|
|
||||||
void loadWebBrowserMenu(int index);
|
|
||||||
|
|
||||||
// Displays various dialogs.
|
// Displays various dialogs.
|
||||||
void backupDatabaseSettings();
|
void backupDatabaseSettings();
|
||||||
void restoreDatabaseSettings();
|
void restoreDatabaseSettings();
|
||||||
|
|
|
@ -100,30 +100,6 @@
|
||||||
<addaction name="m_actionCleanupDatabase"/>
|
<addaction name="m_actionCleanupDatabase"/>
|
||||||
<addaction name="m_actionDownloadManager"/>
|
<addaction name="m_actionDownloadManager"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="m_menuWebBrowser">
|
|
||||||
<property name="title">
|
|
||||||
<string>&Web browser</string>
|
|
||||||
</property>
|
|
||||||
<widget class="QMenu" name="m_menuCurrentTab">
|
|
||||||
<property name="title">
|
|
||||||
<string>&Current tab</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
<widget class="QMenu" name="m_menuWebSettings">
|
|
||||||
<property name="title">
|
|
||||||
<string>Settings</string>
|
|
||||||
</property>
|
|
||||||
<addaction name="m_actionWebEnableJavascript"/>
|
|
||||||
<addaction name="m_actionWebEnableExternalPlugins"/>
|
|
||||||
<addaction name="m_actionWebAutoloadImages"/>
|
|
||||||
</widget>
|
|
||||||
<addaction name="m_actionAddBrowser"/>
|
|
||||||
<addaction name="m_actionCloseCurrentTab"/>
|
|
||||||
<addaction name="m_actionCloseAllTabs"/>
|
|
||||||
<addaction name="separator"/>
|
|
||||||
<addaction name="m_menuWebSettings"/>
|
|
||||||
<addaction name="m_menuCurrentTab"/>
|
|
||||||
</widget>
|
|
||||||
<widget class="QMenu" name="m_menuFeeds">
|
<widget class="QMenu" name="m_menuFeeds">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Feeds && categories</string>
|
<string>Feeds && categories</string>
|
||||||
|
@ -160,7 +136,6 @@
|
||||||
<string>&Messages</string>
|
<string>&Messages</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="m_actionOpenSelectedSourceArticlesExternally"/>
|
<addaction name="m_actionOpenSelectedSourceArticlesExternally"/>
|
||||||
<addaction name="m_actionOpenSelectedSourceArticlesInternally"/>
|
|
||||||
<addaction name="m_actionOpenSelectedMessagesInternally"/>
|
<addaction name="m_actionOpenSelectedMessagesInternally"/>
|
||||||
<addaction name="m_actionSendMessageViaEmail"/>
|
<addaction name="m_actionSendMessageViaEmail"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
|
@ -195,7 +170,6 @@
|
||||||
<addaction name="m_menuFeeds"/>
|
<addaction name="m_menuFeeds"/>
|
||||||
<addaction name="m_menuMessages"/>
|
<addaction name="m_menuMessages"/>
|
||||||
<addaction name="m_menuRecycleBin"/>
|
<addaction name="m_menuRecycleBin"/>
|
||||||
<addaction name="m_menuWebBrowser"/>
|
|
||||||
<addaction name="m_menuTools"/>
|
<addaction name="m_menuTools"/>
|
||||||
<addaction name="m_menuHelp"/>
|
<addaction name="m_menuHelp"/>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -252,39 +226,6 @@
|
||||||
<string notr="true">F</string>
|
<string notr="true">F</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="m_actionAddBrowser">
|
|
||||||
<property name="text">
|
|
||||||
<string>&Add tab</string>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Add new web browser tab.</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string notr="true">Ctrl+T</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="m_actionCloseAllTabs">
|
|
||||||
<property name="text">
|
|
||||||
<string>&Close all tabs except current one</string>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Close all tabs except current one.</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string notr="true"/>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="m_actionCloseCurrentTab">
|
|
||||||
<property name="text">
|
|
||||||
<string>&Close current tab</string>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Close current web browser tab.</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string notr="true"/>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="m_actionUpdateAllItems">
|
<action name="m_actionUpdateAllItems">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Update &all items</string>
|
<string>Update &all items</string>
|
||||||
|
@ -398,14 +339,6 @@
|
||||||
<string notr="true"/>
|
<string notr="true"/>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="m_actionOpenSelectedSourceArticlesInternally">
|
|
||||||
<property name="text">
|
|
||||||
<string>Open selected source articles in &internal browser</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string notr="true"/>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="m_actionNoActions">
|
<action name="m_actionNoActions">
|
||||||
<property name="enabled">
|
<property name="enabled">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
|
@ -544,39 +477,6 @@
|
||||||
<string notr="true">M</string>
|
<string notr="true">M</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="m_actionWebEnableJavascript">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable &JavaScript</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string notr="true">J</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="m_actionWebEnableExternalPlugins">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable external &plugins</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string notr="true">P</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="m_actionWebAutoloadImages">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Auto-load &images</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string notr="true">I</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="m_actionReportBugGitHub">
|
<action name="m_actionReportBugGitHub">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Report a &bug (GitHub)...</string>
|
<string>Report a &bug (GitHub)...</string>
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
#include "miscellaneous/textfactory.h"
|
#include "miscellaneous/textfactory.h"
|
||||||
#include "network-web/webfactory.h"
|
#include "network-web/webfactory.h"
|
||||||
#include "network-web/silentnetworkaccessmanager.h"
|
#include "network-web/silentnetworkaccessmanager.h"
|
||||||
#include "network-web/webbrowser.h"
|
|
||||||
#include "gui/systemtrayicon.h"
|
#include "gui/systemtrayicon.h"
|
||||||
#include "gui/feedmessageviewer.h"
|
#include "gui/feedmessageviewer.h"
|
||||||
#include "gui/feedsview.h"
|
#include "gui/feedsview.h"
|
||||||
|
@ -382,15 +381,10 @@ void FormSettings::onProxyTypeChanged(int index) {
|
||||||
|
|
||||||
void FormSettings::loadBrowser() {
|
void FormSettings::loadBrowser() {
|
||||||
// Load settings of web browser GUI.
|
// Load settings of web browser GUI.
|
||||||
m_ui->m_checkQueueTabs->setChecked(m_settings->value(GROUP(Browser), SETTING(Browser::QueueTabs)).toBool());
|
|
||||||
m_ui->m_cmbExternalBrowserPreset->addItem(tr("Opera 12 or older"), QSL("-nosession %1"));
|
m_ui->m_cmbExternalBrowserPreset->addItem(tr("Opera 12 or older"), QSL("-nosession %1"));
|
||||||
m_ui->m_txtExternalBrowserExecutable->setText(m_settings->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserExecutable)).toString());
|
m_ui->m_txtExternalBrowserExecutable->setText(m_settings->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserExecutable)).toString());
|
||||||
m_ui->m_txtExternalBrowserArguments->setText(m_settings->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserArguments)).toString());
|
m_ui->m_txtExternalBrowserArguments->setText(m_settings->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserArguments)).toString());
|
||||||
m_ui->m_grpCustomExternalBrowser->setChecked(m_settings->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserEnabled)).toBool());
|
m_ui->m_grpCustomExternalBrowser->setChecked(m_settings->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserEnabled)).toBool());
|
||||||
m_ui->m_checkAutoLoadImages->setChecked(WebFactory::instance()->autoloadImages());
|
|
||||||
m_ui->m_checkEnableJavascript->setChecked(WebFactory::instance()->javascriptEnabled());
|
|
||||||
m_ui->m_checkEnablePlugins->setChecked(WebFactory::instance()->pluginsEnabled());
|
|
||||||
m_ui->m_checkRememberOpenedTabs->setChecked(m_settings->value(GROUP(Browser), SETTING(Browser::RememberBrowserTabs)).toBool());
|
|
||||||
|
|
||||||
// Load settings of e-mail.
|
// Load settings of e-mail.
|
||||||
m_ui->m_cmbExternalEmailPreset->addItem(tr("Mozilla Thunderbird"), QSL("-compose \"subject='%1',body='%2'\""));
|
m_ui->m_cmbExternalEmailPreset->addItem(tr("Mozilla Thunderbird"), QSL("-compose \"subject='%1',body='%2'\""));
|
||||||
|
@ -402,19 +396,13 @@ void FormSettings::loadBrowser() {
|
||||||
void FormSettings::saveBrowser() {
|
void FormSettings::saveBrowser() {
|
||||||
// Save settings of GUI of web browser.
|
// Save settings of GUI of web browser.
|
||||||
m_settings->setValue(GROUP(Browser), Browser::CustomExternalBrowserEnabled, m_ui->m_grpCustomExternalBrowser->isChecked());
|
m_settings->setValue(GROUP(Browser), Browser::CustomExternalBrowserEnabled, m_ui->m_grpCustomExternalBrowser->isChecked());
|
||||||
m_settings->setValue(GROUP(Browser), Browser::QueueTabs, m_ui->m_checkQueueTabs->isChecked());
|
|
||||||
m_settings->setValue(GROUP(Browser), Browser::CustomExternalBrowserExecutable, m_ui->m_txtExternalBrowserExecutable->text());
|
m_settings->setValue(GROUP(Browser), Browser::CustomExternalBrowserExecutable, m_ui->m_txtExternalBrowserExecutable->text());
|
||||||
m_settings->setValue(GROUP(Browser), Browser::CustomExternalBrowserArguments, m_ui->m_txtExternalBrowserArguments->text());
|
m_settings->setValue(GROUP(Browser), Browser::CustomExternalBrowserArguments, m_ui->m_txtExternalBrowserArguments->text());
|
||||||
m_settings->setValue(GROUP(Browser), Browser::RememberBrowserTabs, m_ui->m_checkRememberOpenedTabs->isChecked());
|
|
||||||
|
|
||||||
// Save settings of e-mail.
|
// Save settings of e-mail.
|
||||||
m_settings->setValue(GROUP(Browser), Browser::CustomExternalEmailExecutable, m_ui->m_txtExternalEmailExecutable->text());
|
m_settings->setValue(GROUP(Browser), Browser::CustomExternalEmailExecutable, m_ui->m_txtExternalEmailExecutable->text());
|
||||||
m_settings->setValue(GROUP(Browser), Browser::CustomExternalEmailArguments, m_ui->m_txtExternalEmailArguments->text());
|
m_settings->setValue(GROUP(Browser), Browser::CustomExternalEmailArguments, m_ui->m_txtExternalEmailArguments->text());
|
||||||
m_settings->setValue(GROUP(Browser), Browser::CustomExternalEmailEnabled, m_ui->m_grpCustomExternalEmail->isChecked());
|
m_settings->setValue(GROUP(Browser), Browser::CustomExternalEmailEnabled, m_ui->m_grpCustomExternalEmail->isChecked());
|
||||||
|
|
||||||
WebFactory::instance()->switchImages(m_ui->m_checkAutoLoadImages->isChecked());
|
|
||||||
WebFactory::instance()->switchJavascript(m_ui->m_checkEnableJavascript->isChecked());
|
|
||||||
WebFactory::instance()->switchPlugins(m_ui->m_checkEnablePlugins->isChecked());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormSettings::loadProxy() {
|
void FormSettings::loadProxy() {
|
||||||
|
|
|
@ -888,44 +888,6 @@ Authors of this application are NOT responsible for lost data.</string>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="m_tabInternalBrowser">
|
|
||||||
<attribute name="title">
|
|
||||||
<string>Internal web browser</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QFormLayout" name="formLayout_4">
|
|
||||||
<property name="fieldGrowthPolicy">
|
|
||||||
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
|
|
||||||
</property>
|
|
||||||
<item row="0" column="0" colspan="2">
|
|
||||||
<widget class="QCheckBox" name="m_checkQueueTabs">
|
|
||||||
<property name="text">
|
|
||||||
<string>Queue new tabs (with hyperlinks) after the active tab</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QCheckBox" name="m_checkEnableJavascript">
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable JavaScript</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QCheckBox" name="m_checkEnablePlugins">
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable external plugins</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QCheckBox" name="m_checkAutoLoadImages">
|
|
||||||
<property name="text">
|
|
||||||
<string>Auto-load images</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<widget class="QWidget" name="m_tabExternalBrowser">
|
<widget class="QWidget" name="m_tabExternalBrowser">
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>External web browser</string>
|
<string>External web browser</string>
|
||||||
|
@ -1609,10 +1571,6 @@ Authors of this application are NOT responsible for lost data.</string>
|
||||||
<tabstop>m_cmbSelectToolBar</tabstop>
|
<tabstop>m_cmbSelectToolBar</tabstop>
|
||||||
<tabstop>m_treeLanguages</tabstop>
|
<tabstop>m_treeLanguages</tabstop>
|
||||||
<tabstop>m_tabBrowserProxy</tabstop>
|
<tabstop>m_tabBrowserProxy</tabstop>
|
||||||
<tabstop>m_checkQueueTabs</tabstop>
|
|
||||||
<tabstop>m_checkEnableJavascript</tabstop>
|
|
||||||
<tabstop>m_checkEnablePlugins</tabstop>
|
|
||||||
<tabstop>m_checkAutoLoadImages</tabstop>
|
|
||||||
<tabstop>m_grpCustomExternalBrowser</tabstop>
|
<tabstop>m_grpCustomExternalBrowser</tabstop>
|
||||||
<tabstop>m_txtExternalBrowserExecutable</tabstop>
|
<tabstop>m_txtExternalBrowserExecutable</tabstop>
|
||||||
<tabstop>m_btnExternalBrowserExecutable</tabstop>
|
<tabstop>m_btnExternalBrowserExecutable</tabstop>
|
||||||
|
|
|
@ -1,92 +0,0 @@
|
||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "gui/discoverfeedsbutton.h"
|
|
||||||
|
|
||||||
#include "miscellaneous/application.h"
|
|
||||||
#include "miscellaneous/iconfactory.h"
|
|
||||||
#include "gui/dialogs/formmain.h"
|
|
||||||
#include "gui/tabwidget.h"
|
|
||||||
#include "gui/feedmessageviewer.h"
|
|
||||||
#include "gui/feedsview.h"
|
|
||||||
#include "core/feedsmodel.h"
|
|
||||||
#include "services/abstract/serviceroot.h"
|
|
||||||
|
|
||||||
#include <QVariant>
|
|
||||||
|
|
||||||
|
|
||||||
DiscoverFeedsButton::DiscoverFeedsButton(QWidget *parent) : QToolButton(parent), m_addresses(QStringList()) {
|
|
||||||
setEnabled(false);
|
|
||||||
setIcon(qApp->icons()->fromTheme(QSL("folder-feed")));
|
|
||||||
setPopupMode(QToolButton::InstantPopup);
|
|
||||||
}
|
|
||||||
|
|
||||||
DiscoverFeedsButton::~DiscoverFeedsButton() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void DiscoverFeedsButton::clearFeedAddresses() {
|
|
||||||
setFeedAddresses(QStringList());
|
|
||||||
}
|
|
||||||
|
|
||||||
void DiscoverFeedsButton::setFeedAddresses(const QStringList &addresses) {
|
|
||||||
setEnabled(!addresses.isEmpty());
|
|
||||||
setToolTip(addresses.isEmpty() ?
|
|
||||||
tr("This website does not contain any feeds.") :
|
|
||||||
tr("Click me to add feeds from this website.\nThis website contains %n feed(s).", 0, addresses.size()));
|
|
||||||
|
|
||||||
if (menu() == NULL) {
|
|
||||||
// Initialize the menu.
|
|
||||||
setMenu(new QMenu(this));
|
|
||||||
connect(menu(), SIGNAL(triggered(QAction*)), this, SLOT(linkTriggered(QAction*)));
|
|
||||||
connect(menu(), SIGNAL(aboutToShow()), this, SLOT(fillMenu()));
|
|
||||||
}
|
|
||||||
|
|
||||||
menu()->hide();
|
|
||||||
m_addresses = addresses;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DiscoverFeedsButton::linkTriggered(QAction *action) {
|
|
||||||
const QString url = action->property("url").toString();
|
|
||||||
ServiceRoot *root = static_cast<ServiceRoot*>(action->property("root").value<void*>());
|
|
||||||
|
|
||||||
if (root->supportsFeedAdding()) {
|
|
||||||
root->addNewFeed(url);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
qApp->showGuiMessage(tr("Not supported"),
|
|
||||||
tr("Given account does not support adding feeds."),
|
|
||||||
QSystemTrayIcon::Warning,
|
|
||||||
qApp->mainForm(), true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DiscoverFeedsButton::fillMenu() {
|
|
||||||
menu()->clear();
|
|
||||||
|
|
||||||
foreach (const ServiceRoot *root, qApp->mainForm()->tabWidget()->feedMessageViewer()->feedsView()->sourceModel()->serviceRoots()) {
|
|
||||||
QMenu *root_menu = menu()->addMenu(root->icon(), root->title());
|
|
||||||
|
|
||||||
foreach (const QString &url, m_addresses) {
|
|
||||||
if (root->supportsFeedAdding()) {
|
|
||||||
QAction *url_action = root_menu->addAction(root->icon(), url);
|
|
||||||
|
|
||||||
url_action->setProperty("url", url);
|
|
||||||
url_action->setProperty("root", QVariant::fromValue((void*) root));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef DISCOVERFEEDSBUTTON_H
|
|
||||||
#define DISCOVERFEEDSBUTTON_H
|
|
||||||
|
|
||||||
#include <QToolButton>
|
|
||||||
|
|
||||||
|
|
||||||
class DiscoverFeedsButton : public QToolButton {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructors.
|
|
||||||
explicit DiscoverFeedsButton(QWidget *parent = 0);
|
|
||||||
virtual ~DiscoverFeedsButton();
|
|
||||||
|
|
||||||
// Feed addresses manipulators.
|
|
||||||
void clearFeedAddresses();
|
|
||||||
void setFeedAddresses(const QStringList &addresses);
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
// User chose any of addresses.
|
|
||||||
void linkTriggered(QAction *action);
|
|
||||||
void fillMenu();
|
|
||||||
|
|
||||||
private:
|
|
||||||
QStringList m_addresses;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // DISCOVERFEEDSBUTTON_H
|
|
|
@ -29,7 +29,6 @@
|
||||||
#include "services/standard/standardserviceroot.h"
|
#include "services/standard/standardserviceroot.h"
|
||||||
#include "services/standard/standardfeed.h"
|
#include "services/standard/standardfeed.h"
|
||||||
#include "services/standard/standardfeedsimportexportmodel.h"
|
#include "services/standard/standardfeedsimportexportmodel.h"
|
||||||
#include "network-web/webbrowser.h"
|
|
||||||
#include "gui/messagesview.h"
|
#include "gui/messagesview.h"
|
||||||
#include "gui/feedsview.h"
|
#include "gui/feedsview.h"
|
||||||
#include "gui/statusbar.h"
|
#include "gui/statusbar.h"
|
||||||
|
@ -53,7 +52,6 @@
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
#include <QProgressBar>
|
#include <QProgressBar>
|
||||||
#include <QStatusBar>
|
#include <QStatusBar>
|
||||||
#include <QWebEngineSettings>
|
|
||||||
#include <QPointer>
|
#include <QPointer>
|
||||||
|
|
||||||
|
|
||||||
|
@ -65,7 +63,7 @@ FeedMessageViewer::FeedMessageViewer(QWidget *parent)
|
||||||
m_toolBarMessages(new MessagesToolBar(tr("Toolbar for messages"), this)),
|
m_toolBarMessages(new MessagesToolBar(tr("Toolbar for messages"), this)),
|
||||||
m_messagesView(new MessagesView(this)),
|
m_messagesView(new MessagesView(this)),
|
||||||
m_feedsView(new FeedsView(this)),
|
m_feedsView(new FeedsView(this)),
|
||||||
m_messagesBrowser(new WebBrowser(this)) {
|
m_messagesBrowser(new QTextBrowser(this)) {
|
||||||
initialize();
|
initialize();
|
||||||
initializeViews();
|
initializeViews();
|
||||||
loadMessageViewerFonts();
|
loadMessageViewerFonts();
|
||||||
|
@ -119,10 +117,12 @@ void FeedMessageViewer::loadSize() {
|
||||||
|
|
||||||
void FeedMessageViewer::loadMessageViewerFonts() {
|
void FeedMessageViewer::loadMessageViewerFonts() {
|
||||||
const Settings *settings = qApp->settings();
|
const Settings *settings = qApp->settings();
|
||||||
QWebEngineSettings *view_settings = m_messagesBrowser->view()->settings();
|
|
||||||
|
// TODO: TODO
|
||||||
|
//QWebEngineSettings *view_settings = m_messagesBrowser->view()->settings();
|
||||||
|
|
||||||
view_settings->setFontFamily(QWebEngineSettings::StandardFont, settings->value(GROUP(Messages),
|
//view_settings->setFontFamily(QWebEngineSettings::StandardFont, settings->value(GROUP(Messages),
|
||||||
SETTING(Messages::PreviewerFontStandard)).toString());
|
// SETTING(Messages::PreviewerFontStandard)).toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void FeedMessageViewer::quit() {
|
void FeedMessageViewer::quit() {
|
||||||
|
@ -193,7 +193,6 @@ void FeedMessageViewer::updateMessageButtonsAvailability() {
|
||||||
form_main->m_ui->m_actionMarkSelectedMessagesAsUnread->setEnabled(atleast_one_message_selected);
|
form_main->m_ui->m_actionMarkSelectedMessagesAsUnread->setEnabled(atleast_one_message_selected);
|
||||||
form_main->m_ui->m_actionOpenSelectedMessagesInternally->setEnabled(atleast_one_message_selected);
|
form_main->m_ui->m_actionOpenSelectedMessagesInternally->setEnabled(atleast_one_message_selected);
|
||||||
form_main->m_ui->m_actionOpenSelectedSourceArticlesExternally->setEnabled(atleast_one_message_selected);
|
form_main->m_ui->m_actionOpenSelectedSourceArticlesExternally->setEnabled(atleast_one_message_selected);
|
||||||
form_main->m_ui->m_actionOpenSelectedSourceArticlesInternally->setEnabled(atleast_one_message_selected);
|
|
||||||
form_main->m_ui->m_actionSendMessageViaEmail->setEnabled(one_message_selected);
|
form_main->m_ui->m_actionSendMessageViaEmail->setEnabled(one_message_selected);
|
||||||
form_main->m_ui->m_actionSwitchImportanceOfSelectedMessages->setEnabled(atleast_one_message_selected);
|
form_main->m_ui->m_actionSwitchImportanceOfSelectedMessages->setEnabled(atleast_one_message_selected);
|
||||||
}
|
}
|
||||||
|
@ -240,7 +239,7 @@ void FeedMessageViewer::createConnections() {
|
||||||
|
|
||||||
// Message changers.
|
// Message changers.
|
||||||
connect(m_messagesView, SIGNAL(currentMessagesRemoved()), m_messagesBrowser, SLOT(clear()));
|
connect(m_messagesView, SIGNAL(currentMessagesRemoved()), m_messagesBrowser, SLOT(clear()));
|
||||||
connect(m_messagesView, SIGNAL(currentMessagesChanged(QList<Message>)), m_messagesBrowser, SLOT(navigateToMessages(QList<Message>)));
|
connect(m_messagesView, SIGNAL(currentMessagesChanged(QList<Message>)), this, SLOT(navigateToMessages(QList<Message>)));
|
||||||
connect(m_messagesView, SIGNAL(currentMessagesRemoved()), this, SLOT(updateMessageButtonsAvailability()));
|
connect(m_messagesView, SIGNAL(currentMessagesRemoved()), this, SLOT(updateMessageButtonsAvailability()));
|
||||||
connect(m_messagesView, SIGNAL(currentMessagesChanged(QList<Message>)), this, SLOT(updateMessageButtonsAvailability()));
|
connect(m_messagesView, SIGNAL(currentMessagesChanged(QList<Message>)), this, SLOT(updateMessageButtonsAvailability()));
|
||||||
|
|
||||||
|
@ -283,8 +282,6 @@ void FeedMessageViewer::createConnections() {
|
||||||
SIGNAL(triggered()), m_messagesView, SLOT(markSelectedMessagesUnread()));
|
SIGNAL(triggered()), m_messagesView, SLOT(markSelectedMessagesUnread()));
|
||||||
connect(form_main->m_ui->m_actionOpenSelectedSourceArticlesExternally,
|
connect(form_main->m_ui->m_actionOpenSelectedSourceArticlesExternally,
|
||||||
SIGNAL(triggered()), m_messagesView, SLOT(openSelectedSourceMessagesExternally()));
|
SIGNAL(triggered()), m_messagesView, SLOT(openSelectedSourceMessagesExternally()));
|
||||||
connect(form_main->m_ui->m_actionOpenSelectedSourceArticlesInternally,
|
|
||||||
SIGNAL(triggered()), m_messagesView, SLOT(openSelectedSourceMessagesInternally()));
|
|
||||||
connect(form_main->m_ui->m_actionOpenSelectedMessagesInternally,
|
connect(form_main->m_ui->m_actionOpenSelectedMessagesInternally,
|
||||||
SIGNAL(triggered()), m_messagesView, SLOT(openSelectedMessagesInternally()));
|
SIGNAL(triggered()), m_messagesView, SLOT(openSelectedMessagesInternally()));
|
||||||
connect(form_main->m_ui->m_actionSendMessageViaEmail,
|
connect(form_main->m_ui->m_actionSendMessageViaEmail,
|
||||||
|
@ -352,10 +349,7 @@ void FeedMessageViewer::initialize() {
|
||||||
m_toolBarMessages->setMovable(false);
|
m_toolBarMessages->setMovable(false);
|
||||||
m_toolBarMessages->setAllowedAreas(Qt::TopToolBarArea);
|
m_toolBarMessages->setAllowedAreas(Qt::TopToolBarArea);
|
||||||
m_toolBarMessages->loadChangeableActions();
|
m_toolBarMessages->loadChangeableActions();
|
||||||
|
|
||||||
// Finish web/message browser setup.
|
|
||||||
m_messagesBrowser->setNavigationBarVisible(false);
|
|
||||||
|
|
||||||
// Now refresh visual setup.
|
// Now refresh visual setup.
|
||||||
refreshVisualProperties();
|
refreshVisualProperties();
|
||||||
}
|
}
|
||||||
|
@ -444,6 +438,43 @@ void FeedMessageViewer::refreshVisualProperties() {
|
||||||
m_toolBarMessages->setToolButtonStyle(button_style);
|
m_toolBarMessages->setToolButtonStyle(button_style);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FeedMessageViewer::navigateToMessages(const QList<Message> &messages) {
|
||||||
|
Skin skin = qApp->skins()->currentSkin();
|
||||||
|
QString messages_layout;
|
||||||
|
QString single_message_layout = skin.m_layoutMarkup;
|
||||||
|
|
||||||
|
foreach (const Message &message, messages) {
|
||||||
|
QString enclosures;
|
||||||
|
|
||||||
|
foreach (const Enclosure &enclosure, message.m_enclosures) {
|
||||||
|
enclosures += skin.m_enclosureMarkup.arg(enclosure.m_url);
|
||||||
|
|
||||||
|
if (!enclosure.m_mimeType.isEmpty()) {
|
||||||
|
enclosures += QL1S(" [") + enclosure.m_mimeType + QL1S("]");
|
||||||
|
}
|
||||||
|
|
||||||
|
enclosures += QL1S("<br>");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!enclosures.isEmpty()) {
|
||||||
|
enclosures = enclosures.prepend(QSL("<br>"));
|
||||||
|
}
|
||||||
|
|
||||||
|
messages_layout.append(single_message_layout.arg(message.m_title,
|
||||||
|
tr("Written by ") + (message.m_author.isEmpty() ?
|
||||||
|
tr("unknown author") :
|
||||||
|
message.m_author),
|
||||||
|
message.m_url,
|
||||||
|
message.m_contents,
|
||||||
|
message.m_created.toString(Qt::DefaultLocaleShortDate),
|
||||||
|
enclosures));
|
||||||
|
}
|
||||||
|
|
||||||
|
QString layout_wrapper = skin.m_layoutMarkupWrapper.arg(messages.size() == 1 ? messages.at(0).m_title : tr("Newspaper view"), messages_layout);
|
||||||
|
|
||||||
|
m_messagesBrowser->setHtml(layout_wrapper);
|
||||||
|
}
|
||||||
|
|
||||||
void FeedMessageViewer::onFeedsUpdateFinished() {
|
void FeedMessageViewer::onFeedsUpdateFinished() {
|
||||||
m_messagesView->reloadSelections(true);
|
m_messagesView->reloadSelections(true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
#include "core/messagesmodel.h"
|
#include "core/messagesmodel.h"
|
||||||
#include "core/feeddownloader.h"
|
#include "core/feeddownloader.h"
|
||||||
|
|
||||||
|
#include <QTextBrowser>
|
||||||
|
|
||||||
|
|
||||||
class WebBrowser;
|
class WebBrowser;
|
||||||
class MessagesView;
|
class MessagesView;
|
||||||
|
@ -44,7 +46,7 @@ class FeedMessageViewer : public TabContent {
|
||||||
|
|
||||||
// WebBrowser getter from TabContent interface.
|
// WebBrowser getter from TabContent interface.
|
||||||
inline WebBrowser *webBrowser() const {
|
inline WebBrowser *webBrowser() const {
|
||||||
return m_messagesBrowser;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FeedsView getter.
|
// FeedsView getter.
|
||||||
|
@ -93,6 +95,8 @@ class FeedMessageViewer : public TabContent {
|
||||||
// Reloads some changeable visual settings.
|
// Reloads some changeable visual settings.
|
||||||
void refreshVisualProperties();
|
void refreshVisualProperties();
|
||||||
|
|
||||||
|
void navigateToMessages(const QList<Message> &messages);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
// Called when feed update finishes.
|
// Called when feed update finishes.
|
||||||
void onFeedsUpdateFinished();
|
void onFeedsUpdateFinished();
|
||||||
|
@ -131,7 +135,7 @@ class FeedMessageViewer : public TabContent {
|
||||||
FeedsView *m_feedsView;
|
FeedsView *m_feedsView;
|
||||||
QWidget *m_feedsWidget;
|
QWidget *m_feedsWidget;
|
||||||
QWidget *m_messagesWidget;
|
QWidget *m_messagesWidget;
|
||||||
WebBrowser *m_messagesBrowser;
|
QTextBrowser *m_messagesBrowser;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // FEEDMESSAGEVIEWER_H
|
#endif // FEEDMESSAGEVIEWER_H
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "gui/locationlineedit.h"
|
|
||||||
|
|
||||||
#include "network-web/googlesuggest.h"
|
|
||||||
|
|
||||||
#include <QMouseEvent>
|
|
||||||
|
|
||||||
|
|
||||||
LocationLineEdit::LocationLineEdit(QWidget *parent)
|
|
||||||
: BaseLineEdit(parent), m_mouseSelectsAllText(true), m_googleSuggest(new GoogleSuggest(this)) {
|
|
||||||
setPlaceholderText(tr("Website address goes here"));
|
|
||||||
connect(this, SIGNAL(submitted(QString)), m_googleSuggest, SLOT(preventSuggest()));
|
|
||||||
}
|
|
||||||
|
|
||||||
LocationLineEdit::~LocationLineEdit() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void LocationLineEdit::focusOutEvent(QFocusEvent *event) {
|
|
||||||
BaseLineEdit::focusOutEvent(event);
|
|
||||||
|
|
||||||
// User now left text box, when he enters it again and clicks,
|
|
||||||
// then all text should be selected.
|
|
||||||
m_mouseSelectsAllText = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LocationLineEdit::mousePressEvent(QMouseEvent *event) {
|
|
||||||
if (m_mouseSelectsAllText) {
|
|
||||||
event->ignore();
|
|
||||||
selectAll();
|
|
||||||
|
|
||||||
// User clicked and all text was selected.
|
|
||||||
m_mouseSelectsAllText = false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
BaseLineEdit::mousePressEvent(event);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef LOCATIONLINEEDIT_H
|
|
||||||
#define LOCATIONLINEEDIT_H
|
|
||||||
|
|
||||||
#include "gui/baselineedit.h"
|
|
||||||
|
|
||||||
|
|
||||||
class WebBrowser;
|
|
||||||
class GoogleSuggest;
|
|
||||||
|
|
||||||
class LocationLineEdit : public BaseLineEdit {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructors and destructors.
|
|
||||||
explicit LocationLineEdit(QWidget *parent = 0);
|
|
||||||
virtual ~LocationLineEdit();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void focusOutEvent(QFocusEvent *event);
|
|
||||||
void mousePressEvent(QMouseEvent *event);
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool m_mouseSelectsAllText;
|
|
||||||
GoogleSuggest *m_googleSuggest;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // LOCATIONLINEEDIT_H
|
|
|
@ -51,7 +51,7 @@ MessagesView::~MessagesView() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessagesView::createConnections() {
|
void MessagesView::createConnections() {
|
||||||
connect(this, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(openSelectedSourceMessagesInternallyNoNewTab()));
|
connect(this, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(openSelectedSourceMessagesExternally()));
|
||||||
|
|
||||||
// Adjust columns when layout gets changed.
|
// Adjust columns when layout gets changed.
|
||||||
connect(header(), SIGNAL(geometriesChanged()), this, SLOT(adjustColumns()));
|
connect(header(), SIGNAL(geometriesChanged()), this, SLOT(adjustColumns()));
|
||||||
|
@ -149,7 +149,6 @@ void MessagesView::initializeContextMenu() {
|
||||||
m_contextMenu->addActions(QList<QAction*>() <<
|
m_contextMenu->addActions(QList<QAction*>() <<
|
||||||
qApp->mainForm()->m_ui->m_actionSendMessageViaEmail <<
|
qApp->mainForm()->m_ui->m_actionSendMessageViaEmail <<
|
||||||
qApp->mainForm()->m_ui->m_actionOpenSelectedSourceArticlesExternally <<
|
qApp->mainForm()->m_ui->m_actionOpenSelectedSourceArticlesExternally <<
|
||||||
qApp->mainForm()->m_ui->m_actionOpenSelectedSourceArticlesInternally <<
|
|
||||||
qApp->mainForm()->m_ui->m_actionOpenSelectedMessagesInternally <<
|
qApp->mainForm()->m_ui->m_actionOpenSelectedMessagesInternally <<
|
||||||
qApp->mainForm()->m_ui->m_actionMarkSelectedMessagesAsRead <<
|
qApp->mainForm()->m_ui->m_actionMarkSelectedMessagesAsRead <<
|
||||||
qApp->mainForm()->m_ui->m_actionMarkSelectedMessagesAsUnread <<
|
qApp->mainForm()->m_ui->m_actionMarkSelectedMessagesAsUnread <<
|
||||||
|
@ -181,12 +180,6 @@ void MessagesView::mousePressEvent(QMouseEvent *event) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case Qt::MiddleButton: {
|
|
||||||
// Open selected messages in new tab on mouse middle button click.
|
|
||||||
openSelectedSourceMessagesInternally();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -256,34 +249,6 @@ void MessagesView::openSelectedSourceMessagesExternally() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessagesView::openSelectedSourceMessagesInternally() {
|
|
||||||
foreach (const QModelIndex &index, selectionModel()->selectedRows()) {
|
|
||||||
const Message message = m_sourceModel->messageAt(m_proxyModel->mapToSource(index).row());
|
|
||||||
|
|
||||||
if (message.m_url.isEmpty()) {
|
|
||||||
MessageBox::show(this,
|
|
||||||
QMessageBox::Warning,
|
|
||||||
tr("Meesage without URL"),
|
|
||||||
tr("Message '%s' does not contain URL.").arg(message.m_title));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
emit openLinkNewTab(message.m_url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finally, mark opened messages as read.
|
|
||||||
if (!selectionModel()->selectedRows().isEmpty()) {
|
|
||||||
QTimer::singleShot(0, this, SLOT(markSelectedMessagesRead()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MessagesView::openSelectedSourceMessagesInternallyNoNewTab() {
|
|
||||||
if (selectionModel()->selectedRows().size() == 1) {
|
|
||||||
emit openLinkMiniBrowser(
|
|
||||||
m_sourceModel->messageAt(m_proxyModel->mapToSource(selectionModel()->selectedRows().at(0)).row()).m_url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MessagesView::openSelectedMessagesInternally() {
|
void MessagesView::openSelectedMessagesInternally() {
|
||||||
QList<Message> messages;
|
QList<Message> messages;
|
||||||
|
|
||||||
|
|
|
@ -59,8 +59,6 @@ class MessagesView : public QTreeView {
|
||||||
|
|
||||||
// Message manipulators.
|
// Message manipulators.
|
||||||
void openSelectedSourceMessagesExternally();
|
void openSelectedSourceMessagesExternally();
|
||||||
void openSelectedSourceMessagesInternally();
|
|
||||||
void openSelectedSourceMessagesInternallyNoNewTab();
|
|
||||||
void openSelectedMessagesInternally();
|
void openSelectedMessagesInternally();
|
||||||
void sendSelectedMessageViaEmail();
|
void sendSelectedMessageViaEmail();
|
||||||
|
|
||||||
|
|
|
@ -21,8 +21,6 @@
|
||||||
#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
|
||||||
|
@ -43,10 +41,6 @@ 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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#include "miscellaneous/settings.h"
|
#include "miscellaneous/settings.h"
|
||||||
#include "miscellaneous/textfactory.h"
|
#include "miscellaneous/textfactory.h"
|
||||||
#include "miscellaneous/iconfactory.h"
|
#include "miscellaneous/iconfactory.h"
|
||||||
#include "network-web/webbrowser.h"
|
|
||||||
#include "gui/tabbar.h"
|
#include "gui/tabbar.h"
|
||||||
#include "gui/feedmessageviewer.h"
|
#include "gui/feedmessageviewer.h"
|
||||||
#include "gui/plaintoolbutton.h"
|
#include "gui/plaintoolbutton.h"
|
||||||
|
@ -34,7 +33,6 @@
|
||||||
|
|
||||||
TabWidget::TabWidget(QWidget *parent) : QTabWidget(parent), m_menuMain(NULL) {
|
TabWidget::TabWidget(QWidget *parent) : QTabWidget(parent), m_menuMain(NULL) {
|
||||||
setTabBar(new TabBar(this));
|
setTabBar(new TabBar(this));
|
||||||
setupCornerButton();
|
|
||||||
setupMainMenuButton();
|
setupMainMenuButton();
|
||||||
createConnections();
|
createConnections();
|
||||||
}
|
}
|
||||||
|
@ -43,16 +41,6 @@ TabWidget::~TabWidget() {
|
||||||
qDebug("Destroying TabWidget instance.");
|
qDebug("Destroying TabWidget instance.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void TabWidget::setupCornerButton() {
|
|
||||||
m_btnAddTab = new PlainToolButton(this);
|
|
||||||
m_btnAddTab->setAutoRaise(true);
|
|
||||||
m_btnAddTab->setPadding(3);
|
|
||||||
m_btnAddTab->setToolTip(tr("Open new web browser tab."));
|
|
||||||
m_btnAddTab->setIcon(qApp->icons()->fromTheme(QSL("list-add")));
|
|
||||||
|
|
||||||
connect(m_btnAddTab, SIGNAL(clicked()), this, SLOT(addEmptyBrowser()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void TabWidget::setupMainMenuButton() {
|
void TabWidget::setupMainMenuButton() {
|
||||||
m_btnMainMenu = new PlainToolButton(this);
|
m_btnMainMenu = new PlainToolButton(this);
|
||||||
m_btnMainMenu->setAutoRaise(true);
|
m_btnMainMenu->setAutoRaise(true);
|
||||||
|
@ -71,7 +59,6 @@ void TabWidget::openMainMenu() {
|
||||||
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuView);
|
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuView);
|
||||||
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuFeeds);
|
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuFeeds);
|
||||||
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuMessages);
|
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuMessages);
|
||||||
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuWebBrowser);
|
|
||||||
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuTools);
|
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuTools);
|
||||||
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuHelp);
|
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuHelp);
|
||||||
}
|
}
|
||||||
|
@ -104,17 +91,12 @@ void TabWidget::checkTabBarVisibility() {
|
||||||
|
|
||||||
if (should_be_visible) {
|
if (should_be_visible) {
|
||||||
setCornerWidget(m_btnMainMenu, Qt::TopLeftCorner);
|
setCornerWidget(m_btnMainMenu, Qt::TopLeftCorner);
|
||||||
setCornerWidget(m_btnAddTab, Qt::TopRightCorner);
|
|
||||||
|
|
||||||
m_btnMainMenu->setVisible(true);
|
m_btnMainMenu->setVisible(true);
|
||||||
m_btnAddTab->setVisible(true);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
setCornerWidget(0, Qt::TopLeftCorner);
|
setCornerWidget(0, Qt::TopLeftCorner);
|
||||||
setCornerWidget(0, Qt::TopRightCorner);
|
setCornerWidget(0, Qt::TopRightCorner);
|
||||||
|
|
||||||
m_btnMainMenu->setVisible(false);
|
m_btnMainMenu->setVisible(false);
|
||||||
m_btnAddTab->setVisible(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tabBar()->setVisible(should_be_visible);
|
tabBar()->setVisible(should_be_visible);
|
||||||
|
@ -158,13 +140,6 @@ void TabWidget::initializeTabs() {
|
||||||
tr("Feeds"),
|
tr("Feeds"),
|
||||||
TabBar::FeedReader);
|
TabBar::FeedReader);
|
||||||
setTabToolTip(index_of_browser, tr("Browse your feeds and messages"));
|
setTabToolTip(index_of_browser, tr("Browse your feeds and messages"));
|
||||||
|
|
||||||
if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::RememberBrowserTabs)).toBool()) {
|
|
||||||
foreach (const QString &url, qApp->settings()->value(GROUP(Browser), SETTING(Browser::OpenedBrowserTabs)).toString().split(QL1S("##"),
|
|
||||||
QString::SkipEmptyParts)) {
|
|
||||||
addBrowser(true, false, QUrl::fromUserInput(url));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TabWidget::setupIcons() {
|
void TabWidget::setupIcons() {
|
||||||
|
@ -175,38 +150,6 @@ void TabWidget::setupIcons() {
|
||||||
if (tabBar()->tabType(index) == TabBar::FeedReader) {
|
if (tabBar()->tabType(index) == TabBar::FeedReader) {
|
||||||
setTabIcon(index, qApp->icons()->fromTheme(QSL("folder-feed")));
|
setTabIcon(index, qApp->icons()->fromTheme(QSL("folder-feed")));
|
||||||
}
|
}
|
||||||
// Other indexes probably contain WebBrowsers.
|
|
||||||
else {
|
|
||||||
const WebBrowser *active_browser = widget(index)->webBrowser();
|
|
||||||
|
|
||||||
if (active_browser != NULL && active_browser->icon().isNull()) {
|
|
||||||
// We found WebBrowser instance of this tab page, which
|
|
||||||
// has no suitable icon, load a new one from the icon theme.
|
|
||||||
setTabIcon(index, qApp->icons()->fromTheme(QSL("text-html")));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setup corner button icon.
|
|
||||||
m_btnAddTab->setIcon(qApp->icons()->fromTheme(QSL("list-add")));
|
|
||||||
}
|
|
||||||
|
|
||||||
void TabWidget::quit() {
|
|
||||||
if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::RememberBrowserTabs)).toBool()) {
|
|
||||||
QStringList store_urls;
|
|
||||||
|
|
||||||
for (int i = 0; i < count(); i++) {
|
|
||||||
if (tabBar()->tabType(i) == TabBar::Closable) {
|
|
||||||
// We have tab with web browser.
|
|
||||||
QUrl url = widget(i)->webBrowser()->view()->url();
|
|
||||||
|
|
||||||
if (url.isValid() && !url.isEmpty()) {
|
|
||||||
store_urls.append(url.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
qApp->settings()->setValue(GROUP(Browser), Browser::OpenedBrowserTabs, store_urls.join(QSL("##")));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,66 +240,9 @@ int TabWidget::insertTab(int index, QWidget *widget, const QString &label, const
|
||||||
}
|
}
|
||||||
|
|
||||||
int TabWidget::addBrowserWithMessages(const QList<Message> &messages) {
|
int TabWidget::addBrowserWithMessages(const QList<Message> &messages) {
|
||||||
const int new_index = addBrowser(false, true);
|
// TODO: TODO - volano kdyz se maji zobrazit zpravy v novinovem nahledu
|
||||||
WebBrowser *browser = static_cast<WebBrowser*>(widget(new_index));
|
|
||||||
|
|
||||||
browser->setNavigationBarVisible(false);
|
return 0; /* new index */
|
||||||
browser->navigateToMessages(messages);
|
|
||||||
|
|
||||||
return new_index;
|
|
||||||
}
|
|
||||||
|
|
||||||
int TabWidget::addEmptyBrowser() {
|
|
||||||
return addBrowser(false, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
int TabWidget::addLinkedBrowser(const QString &initial_url) {
|
|
||||||
return addLinkedBrowser(QUrl(initial_url));
|
|
||||||
}
|
|
||||||
|
|
||||||
int TabWidget::addLinkedBrowser(const QUrl &initial_url) {
|
|
||||||
return addBrowser(qApp->settings()->value(GROUP(Browser), SETTING(Browser::QueueTabs)).toBool(), false, initial_url);
|
|
||||||
}
|
|
||||||
|
|
||||||
int TabWidget::addBrowser(bool move_after_current, bool make_active, const QUrl &initial_url) {
|
|
||||||
// Create new WebBrowser.
|
|
||||||
WebBrowser *browser = new WebBrowser(this);
|
|
||||||
browser->setupIcons();
|
|
||||||
|
|
||||||
int final_index;
|
|
||||||
|
|
||||||
if (move_after_current) {
|
|
||||||
// Insert web browser after current tab.
|
|
||||||
final_index = insertTab(currentIndex() + 1, browser, qApp->icons()->fromTheme(QSL("text-html")),
|
|
||||||
tr("Web browser"), TabBar::Closable);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Add new browser as the last tab.
|
|
||||||
final_index = addTab(browser, qApp->icons()->fromTheme(QSL("text-html")),
|
|
||||||
//: Web browser default tab title.
|
|
||||||
tr("Web browser"),
|
|
||||||
TabBar::Closable);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make connections.
|
|
||||||
connect(browser, SIGNAL(titleChanged(int,QString)), this, SLOT(changeTitle(int,QString)));
|
|
||||||
connect(browser, SIGNAL(iconChanged(int,QIcon)), this, SLOT(changeIcon(int,QIcon)));
|
|
||||||
|
|
||||||
// Setup the tab index.
|
|
||||||
browser->setIndex(final_index);
|
|
||||||
|
|
||||||
// Load initial web page if desired.
|
|
||||||
if (initial_url.isValid()) {
|
|
||||||
browser->navigateToUrl(initial_url);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make new web browser active if desired.
|
|
||||||
if (make_active) {
|
|
||||||
setCurrentIndex(final_index);
|
|
||||||
browser->setFocus(Qt::OtherFocusReason);
|
|
||||||
}
|
|
||||||
|
|
||||||
return final_index;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TabWidget::changeIcon(int index, const QIcon &new_icon) {
|
void TabWidget::changeIcon(int index, const QIcon &new_icon) {
|
||||||
|
|
|
@ -75,14 +75,11 @@ class TabWidget : public QTabWidget {
|
||||||
return m_feedMessageViewer;
|
return m_feedMessageViewer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void quit();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Creates necesary connections.
|
// Creates necesary connections.
|
||||||
void createConnections();
|
void createConnections();
|
||||||
|
|
||||||
// Sets up properties of custom corner button.
|
// Sets up properties of custom corner button.
|
||||||
void setupCornerButton();
|
|
||||||
void setupMainMenuButton();
|
void setupMainMenuButton();
|
||||||
|
|
||||||
// Handlers of insertin/removing of tabs.
|
// Handlers of insertin/removing of tabs.
|
||||||
|
@ -116,19 +113,7 @@ class TabWidget : public QTabWidget {
|
||||||
// Open single or multiple (newspaper mode) messages in new tab.
|
// Open single or multiple (newspaper mode) messages in new tab.
|
||||||
int addBrowserWithMessages(const QList<Message> &messages);
|
int addBrowserWithMessages(const QList<Message> &messages);
|
||||||
|
|
||||||
// Adds new WebBrowser tab to global TabWidget.
|
|
||||||
int addEmptyBrowser();
|
|
||||||
|
|
||||||
// Adds new WebBrowser with link. This is used when user
|
|
||||||
// selects to "Open link in new tab.".
|
|
||||||
int addLinkedBrowser(const QUrl &initial_url = QUrl());
|
|
||||||
int addLinkedBrowser(const QString &initial_url);
|
|
||||||
|
|
||||||
// General method for adding WebBrowsers.
|
|
||||||
int addBrowser(bool move_after_current, bool make_active, const QUrl &initial_url = QUrl());
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PlainToolButton *m_btnAddTab;
|
|
||||||
PlainToolButton *m_btnMainMenu;
|
PlainToolButton *m_btnMainMenu;
|
||||||
QMenu *m_menuMain;
|
QMenu *m_menuMain;
|
||||||
FeedMessageViewer *m_feedMessageViewer;
|
FeedMessageViewer *m_feedMessageViewer;
|
||||||
|
|
|
@ -36,7 +36,6 @@
|
||||||
#include <QTranslator>
|
#include <QTranslator>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QWebEngineProfile>
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
@ -134,10 +133,6 @@ int main(int argc, char *argv[]) {
|
||||||
QTimer::singleShot(STARTUP_UPDATE_DELAY, application.system(), SLOT(checkForUpdatesOnStartup()));
|
QTimer::singleShot(STARTUP_UPDATE_DELAY, application.system(), SLOT(checkForUpdatesOnStartup()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make sure that all download requests from web views are handled.
|
|
||||||
QObject::connect(QWebEngineProfile::defaultProfile(), SIGNAL(downloadRequested(QWebEngineDownloadItem*)),
|
|
||||||
qApp->downloadManager(), SLOT(download(QWebEngineDownloadItem*)));
|
|
||||||
|
|
||||||
// Enter global event loop.
|
// Enter global event loop.
|
||||||
return Application::exec();
|
return Application::exec();
|
||||||
}
|
}
|
||||||
|
|
|
@ -281,7 +281,6 @@ void Application::onAboutToQuit() {
|
||||||
system()->removeTrolltechJunkRegistryKeys();
|
system()->removeTrolltechJunkRegistryKeys();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mainForm()->tabWidget()->quit();
|
|
||||||
mainForm()->tabWidget()->feedMessageViewer()->quit();
|
mainForm()->tabWidget()->feedMessageViewer()->quit();
|
||||||
database()->saveDatabase();
|
database()->saveDatabase();
|
||||||
mainForm()->saveSize();
|
mainForm()->saveSize();
|
||||||
|
|
|
@ -22,9 +22,7 @@
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QPointer>
|
#include <QPointer>
|
||||||
#include <QWebEngineSettings>
|
|
||||||
#include <QLocale>
|
#include <QLocale>
|
||||||
#include <QWebEngineProfile>
|
|
||||||
|
|
||||||
|
|
||||||
// Feeds.
|
// Feeds.
|
||||||
|
@ -238,21 +236,6 @@ DKEY Keyboard::ID = "keyboard";
|
||||||
// Web browser.
|
// Web browser.
|
||||||
DKEY Browser::ID = "browser";
|
DKEY Browser::ID = "browser";
|
||||||
|
|
||||||
DKEY Browser::JavascriptEnabled = "enable_javascript";
|
|
||||||
DVALUE(bool) Browser::JavascriptEnabledDef = true;
|
|
||||||
|
|
||||||
DKEY Browser::ImagesEnabled = "enable_images";
|
|
||||||
DVALUE(bool) Browser::ImagesEnabledDef = true;
|
|
||||||
|
|
||||||
DKEY Browser::PluginsEnabled = "enable_plugins";
|
|
||||||
DVALUE(bool) Browser::PluginsEnabledDef = false;
|
|
||||||
|
|
||||||
DKEY Browser::RememberBrowserTabs = "remember_browser_tabs";
|
|
||||||
DVALUE(bool)Browser::RememberBrowserTabsDef = false;
|
|
||||||
|
|
||||||
DKEY Browser::OpenedBrowserTabs = "opened_browser_tabs";
|
|
||||||
DVALUE(QString)Browser::OpenedBrowserTabsDef = QString();
|
|
||||||
|
|
||||||
DKEY Browser::CustomExternalBrowserEnabled = "custom_external_browser";
|
DKEY Browser::CustomExternalBrowserEnabled = "custom_external_browser";
|
||||||
DVALUE(bool) Browser::CustomExternalBrowserEnabledDef = false;
|
DVALUE(bool) Browser::CustomExternalBrowserEnabledDef = false;
|
||||||
|
|
||||||
|
@ -271,8 +254,6 @@ DVALUE(QString) Browser::CustomExternalEmailExecutableDef = QString();
|
||||||
DKEY Browser::CustomExternalEmailArguments = "external_email_arguments";
|
DKEY Browser::CustomExternalEmailArguments = "external_email_arguments";
|
||||||
DVALUE(char*) Browser::CustomExternalEmailArgumentsDef = "";
|
DVALUE(char*) Browser::CustomExternalEmailArgumentsDef = "";
|
||||||
|
|
||||||
DKEY Browser::QueueTabs = "queue_tabs";
|
|
||||||
DVALUE(bool) Browser::QueueTabsDef = true;
|
|
||||||
|
|
||||||
// Categories.
|
// Categories.
|
||||||
DKEY CategoriesExpandStates::ID = "categories_expand_states";
|
DKEY CategoriesExpandStates::ID = "categories_expand_states";
|
||||||
|
@ -280,7 +261,7 @@ DKEY CategoriesExpandStates::ID = "categories_expand_sta
|
||||||
Settings::Settings(const QString &file_name, Format format, const SettingsProperties::SettingsType &status, QObject *parent)
|
Settings::Settings(const QString &file_name, Format format, const SettingsProperties::SettingsType &status, QObject *parent)
|
||||||
: QSettings(file_name, format, parent), m_initializationStatus(status) {
|
: QSettings(file_name, format, parent), m_initializationStatus(status) {
|
||||||
// Perform last-minute initializations.
|
// Perform last-minute initializations.
|
||||||
Messages::PreviewerFontStandardDef = QWebEngineSettings::globalSettings()->fontFamily(QWebEngineSettings::StandardFont);
|
Messages::PreviewerFontStandardDef = qApp->font().family();
|
||||||
}
|
}
|
||||||
|
|
||||||
Settings::~Settings() {
|
Settings::~Settings() {
|
||||||
|
|
|
@ -267,21 +267,6 @@ namespace Keyboard {
|
||||||
namespace Browser {
|
namespace Browser {
|
||||||
KEY ID;
|
KEY ID;
|
||||||
|
|
||||||
KEY JavascriptEnabled;
|
|
||||||
VALUE(bool) JavascriptEnabledDef;
|
|
||||||
|
|
||||||
KEY ImagesEnabled;
|
|
||||||
VALUE(bool) ImagesEnabledDef;
|
|
||||||
|
|
||||||
KEY PluginsEnabled;
|
|
||||||
VALUE(bool) PluginsEnabledDef;
|
|
||||||
|
|
||||||
KEY RememberBrowserTabs;
|
|
||||||
VALUE(bool)RememberBrowserTabsDef;
|
|
||||||
|
|
||||||
KEY OpenedBrowserTabs;
|
|
||||||
VALUE(QString)OpenedBrowserTabsDef;
|
|
||||||
|
|
||||||
KEY CustomExternalBrowserEnabled;
|
KEY CustomExternalBrowserEnabled;
|
||||||
VALUE(bool) CustomExternalBrowserEnabledDef;
|
VALUE(bool) CustomExternalBrowserEnabledDef;
|
||||||
|
|
||||||
|
@ -299,9 +284,6 @@ namespace Browser {
|
||||||
|
|
||||||
KEY CustomExternalEmailArguments;
|
KEY CustomExternalEmailArguments;
|
||||||
VALUE(char*) CustomExternalEmailArgumentsDef;
|
VALUE(char*) CustomExternalEmailArgumentsDef;
|
||||||
|
|
||||||
KEY QueueTabs;
|
|
||||||
VALUE(bool) QueueTabsDef;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Categories.
|
// Categories.
|
||||||
|
|
|
@ -38,8 +38,6 @@
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QWebEngineSettings>
|
|
||||||
#include <QWebEngineDownloadItem>
|
|
||||||
|
|
||||||
|
|
||||||
DownloadItem::DownloadItem(bool is_direct_download, QNetworkReply *reply, QWidget *parent) : QWidget(parent),
|
DownloadItem::DownloadItem(bool is_direct_download, QNetworkReply *reply, QWidget *parent) : QWidget(parent),
|
||||||
|
@ -513,10 +511,6 @@ void DownloadManager::download(const QUrl &url, bool direct_download) {
|
||||||
download(QNetworkRequest(url), direct_download);
|
download(QNetworkRequest(url), direct_download);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DownloadManager::download(QWebEngineDownloadItem *down) {
|
|
||||||
download(down->url(), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DownloadManager::handleUnsupportedContent(QNetworkReply *reply, bool direct_download) {
|
void DownloadManager::handleUnsupportedContent(QNetworkReply *reply, bool direct_download) {
|
||||||
if (reply == NULL || reply->url().isEmpty()) {
|
if (reply == NULL || reply->url().isEmpty()) {
|
||||||
return;
|
return;
|
||||||
|
@ -832,7 +826,3 @@ QMimeData *DownloadModel::mimeData(const QModelIndexList &indexes) const {
|
||||||
mimeData->setUrls(urls);
|
mimeData->setUrls(urls);
|
||||||
return mimeData;
|
return mimeData;
|
||||||
}
|
}
|
||||||
|
|
||||||
WebBrowser *DownloadManager::webBrowser() const {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
|
@ -32,7 +32,6 @@ class AutoSaver;
|
||||||
class DownloadModel;
|
class DownloadModel;
|
||||||
class QFileIconProvider;
|
class QFileIconProvider;
|
||||||
class QMimeData;
|
class QMimeData;
|
||||||
class QWebEngineDownloadItem;
|
|
||||||
|
|
||||||
class DownloadItem : public QWidget {
|
class DownloadItem : public QWidget {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -109,7 +108,6 @@ class DownloadManager : public TabContent {
|
||||||
explicit DownloadManager(QWidget *parent = 0);
|
explicit DownloadManager(QWidget *parent = 0);
|
||||||
virtual ~DownloadManager();
|
virtual ~DownloadManager();
|
||||||
|
|
||||||
WebBrowser *webBrowser() const;
|
|
||||||
QNetworkAccessManager *networkManager() const;
|
QNetworkAccessManager *networkManager() const;
|
||||||
|
|
||||||
int totalDownloads() const;
|
int totalDownloads() const;
|
||||||
|
@ -128,7 +126,6 @@ class DownloadManager : public TabContent {
|
||||||
public slots:
|
public slots:
|
||||||
void download(const QNetworkRequest &request, bool direct_download = false);
|
void download(const QNetworkRequest &request, bool direct_download = false);
|
||||||
void download(const QUrl &url, bool direct_download = false);
|
void download(const QUrl &url, bool direct_download = false);
|
||||||
void download(QWebEngineDownloadItem *down);
|
|
||||||
void handleUnsupportedContent(QNetworkReply *reply, bool direct_download = false);
|
void handleUnsupportedContent(QNetworkReply *reply, bool direct_download = false);
|
||||||
void cleanup();
|
void cleanup();
|
||||||
|
|
||||||
|
|
|
@ -1,204 +0,0 @@
|
||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// You may use this file under the terms of the BSD license as follows:
|
|
||||||
//
|
|
||||||
// "Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer in
|
|
||||||
// the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
|
|
||||||
// of its contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
|
||||||
|
|
||||||
#include "network-web/googlesuggest.h"
|
|
||||||
|
|
||||||
#include "definitions/definitions.h"
|
|
||||||
#include "network-web/silentnetworkaccessmanager.h"
|
|
||||||
#include "gui/locationlineedit.h"
|
|
||||||
|
|
||||||
#include <QListWidget>
|
|
||||||
#include <QXmlStreamReader>
|
|
||||||
#include <QTimer>
|
|
||||||
#include <QNetworkRequest>
|
|
||||||
#include <QNetworkReply>
|
|
||||||
#include <QKeyEvent>
|
|
||||||
#include <QDomDocument>
|
|
||||||
#include <QTextCodec>
|
|
||||||
|
|
||||||
|
|
||||||
GoogleSuggest::GoogleSuggest(LocationLineEdit *editor, QObject *parent)
|
|
||||||
: QObject(parent), editor(editor), popup(new QListWidget()), m_enteredText(QString()) {
|
|
||||||
popup->setWindowFlags(Qt::Popup);
|
|
||||||
popup->setFocusPolicy(Qt::NoFocus);
|
|
||||||
popup->setFocusProxy(editor);
|
|
||||||
popup->setMouseTracking(true);
|
|
||||||
popup->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|
||||||
popup->setFrameStyle(QFrame::Box | QFrame::Plain);
|
|
||||||
popup->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
||||||
popup->installEventFilter(this);
|
|
||||||
|
|
||||||
timer = new QTimer(this);
|
|
||||||
timer->setSingleShot(true);
|
|
||||||
timer->setInterval(500);
|
|
||||||
|
|
||||||
connect(popup.data(), SIGNAL(itemClicked(QListWidgetItem*)), SLOT(doneCompletion()));
|
|
||||||
connect(timer, SIGNAL(timeout()), SLOT(autoSuggest()));
|
|
||||||
connect(editor, SIGNAL(textEdited(QString)), timer, SLOT(start()));
|
|
||||||
}
|
|
||||||
|
|
||||||
GoogleSuggest::~GoogleSuggest() {
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GoogleSuggest::eventFilter(QObject *object, QEvent *event) {
|
|
||||||
if (object != popup.data()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event->type() == QEvent::MouseButtonPress) {
|
|
||||||
popup->hide();
|
|
||||||
editor->setFocus();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event->type() == QEvent::KeyPress) {
|
|
||||||
bool consumed = false;
|
|
||||||
const int key = static_cast<QKeyEvent*>(event)->key();
|
|
||||||
|
|
||||||
switch (key) {
|
|
||||||
case Qt::Key_Enter:
|
|
||||||
case Qt::Key_Return:
|
|
||||||
doneCompletion();
|
|
||||||
consumed = true;
|
|
||||||
|
|
||||||
case Qt::Key_Escape:
|
|
||||||
editor->setFocus();
|
|
||||||
popup->hide();
|
|
||||||
consumed = true;
|
|
||||||
|
|
||||||
case Qt::Key_Up:
|
|
||||||
case Qt::Key_Down:
|
|
||||||
case Qt::Key_Home:
|
|
||||||
case Qt::Key_End:
|
|
||||||
case Qt::Key_PageUp:
|
|
||||||
case Qt::Key_PageDown:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
editor->setFocus();
|
|
||||||
editor->event(event);
|
|
||||||
popup->hide();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return consumed;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void GoogleSuggest::showCompletion(const QStringList &choices) {
|
|
||||||
if (choices.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
popup->setUpdatesEnabled(false);
|
|
||||||
popup->clear();
|
|
||||||
|
|
||||||
foreach (const QString &choice, choices) {
|
|
||||||
new QListWidgetItem(choice, popup.data());
|
|
||||||
}
|
|
||||||
|
|
||||||
popup->setCurrentItem(popup->item(0));
|
|
||||||
popup->adjustSize();
|
|
||||||
popup->setUpdatesEnabled(true);
|
|
||||||
popup->resize(editor->width(), popup->sizeHintForRow(0) * qMin(7, choices.count()) + 3);
|
|
||||||
popup->move(editor->mapToGlobal(QPoint(0, editor->height())));
|
|
||||||
popup->setFocus();
|
|
||||||
popup->show();
|
|
||||||
}
|
|
||||||
|
|
||||||
void GoogleSuggest::doneCompletion() {
|
|
||||||
timer->stop();
|
|
||||||
popup->hide();
|
|
||||||
editor->setFocus();
|
|
||||||
|
|
||||||
QListWidgetItem *item = popup->currentItem();
|
|
||||||
|
|
||||||
if (item != NULL) {
|
|
||||||
editor->submit(QString(GOOGLE_SEARCH_URL).arg(item->text()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void GoogleSuggest::preventSuggest() {
|
|
||||||
timer->stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
void GoogleSuggest::autoSuggest() {
|
|
||||||
m_enteredText = QUrl::toPercentEncoding(editor->text());
|
|
||||||
QString url = QString(GOOGLE_SUGGEST_URL).arg(m_enteredText);
|
|
||||||
|
|
||||||
connect(SilentNetworkAccessManager::instance()->get(QNetworkRequest(QString(url))), SIGNAL(finished()),
|
|
||||||
this, SLOT(handleNetworkData()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void GoogleSuggest::handleNetworkData() {
|
|
||||||
QScopedPointer<QNetworkReply> reply(static_cast<QNetworkReply*>(sender()));
|
|
||||||
|
|
||||||
if (!reply->error()) {
|
|
||||||
QStringList choices;
|
|
||||||
QDomDocument xml;
|
|
||||||
QByteArray response = reply->readAll();
|
|
||||||
|
|
||||||
const QTextCodec *c = QTextCodec::codecForUtfText(response);
|
|
||||||
xml.setContent(c->toUnicode(response));
|
|
||||||
|
|
||||||
QDomNodeList suggestions = xml.elementsByTagName(QSL("suggestion"));
|
|
||||||
|
|
||||||
for (int i = 0; i < suggestions.size(); i++) {
|
|
||||||
const QDomElement element = suggestions.at(i).toElement();
|
|
||||||
|
|
||||||
if (element.attributes().contains(QSL("data"))) {
|
|
||||||
choices.append(element.attribute(QSL("data")));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (choices.isEmpty()) {
|
|
||||||
choices.append(m_enteredText);
|
|
||||||
}
|
|
||||||
|
|
||||||
showCompletion(choices);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,82 +0,0 @@
|
||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// You may use this file under the terms of the BSD license as follows:
|
|
||||||
//
|
|
||||||
// "Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer in
|
|
||||||
// the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
|
|
||||||
// of its contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
|
||||||
|
|
||||||
#ifndef GOOGLESUGGEST_H
|
|
||||||
#define GOOGLESUGGEST_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
|
|
||||||
|
|
||||||
class LocationLineEdit;
|
|
||||||
class QNetworkReply;
|
|
||||||
class QTimer;
|
|
||||||
class QListWidget;
|
|
||||||
class QNetworkAccessManager;
|
|
||||||
|
|
||||||
class GoogleSuggest : public QObject {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructors.
|
|
||||||
explicit GoogleSuggest(LocationLineEdit *editor, QObject *parent = 0);
|
|
||||||
virtual ~GoogleSuggest();
|
|
||||||
|
|
||||||
bool eventFilter(QObject *object, QEvent *event);
|
|
||||||
void showCompletion(const QStringList &choices);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void doneCompletion();
|
|
||||||
void preventSuggest();
|
|
||||||
void autoSuggest();
|
|
||||||
void handleNetworkData();
|
|
||||||
|
|
||||||
private:
|
|
||||||
LocationLineEdit *editor;
|
|
||||||
QScopedPointer<QListWidget> popup;
|
|
||||||
QTimer *timer;
|
|
||||||
QString m_enteredText;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // GOOGLESUGGEST_H
|
|
|
@ -1,328 +0,0 @@
|
||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "network-web/webbrowser.h"
|
|
||||||
|
|
||||||
#include "definitions/definitions.h"
|
|
||||||
#include "network-web/webview.h"
|
|
||||||
#include "network-web/networkfactory.h"
|
|
||||||
#include "miscellaneous/skinfactory.h"
|
|
||||||
#include "gui/dialogs/formmain.h"
|
|
||||||
#include "gui/tabwidget.h"
|
|
||||||
#include "gui/feedmessageviewer.h"
|
|
||||||
#include "gui/feedsview.h"
|
|
||||||
#include "services/standard/standardserviceroot.h"
|
|
||||||
|
|
||||||
#include <QVBoxLayout>
|
|
||||||
#include <QHBoxLayout>
|
|
||||||
#include <QToolBar>
|
|
||||||
#include <QAction>
|
|
||||||
#include <QWebEnginePage>
|
|
||||||
#include <QWidgetAction>
|
|
||||||
#include <QSlider>
|
|
||||||
#include <QLabel>
|
|
||||||
#include <QProgressBar>
|
|
||||||
#include <QToolButton>
|
|
||||||
#include <QClipboard>
|
|
||||||
|
|
||||||
|
|
||||||
QList<WebBrowser*> WebBrowser::m_runningWebBrowsers;
|
|
||||||
|
|
||||||
WebBrowser::WebBrowser(QWidget *parent)
|
|
||||||
: TabContent(parent),
|
|
||||||
m_layout(new QVBoxLayout(this)),
|
|
||||||
m_toolBar(new QToolBar(tr("Navigation panel"), this)),
|
|
||||||
m_webView(new WebView(this)),
|
|
||||||
m_txtLocation(new LocationLineEdit(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)) {
|
|
||||||
// Add this new instance to the global list of web browsers.
|
|
||||||
// NOTE: This is used primarily for dynamic icon theme switching.
|
|
||||||
m_runningWebBrowsers.append(this);
|
|
||||||
|
|
||||||
// Initialize the components and layout.
|
|
||||||
initializeLayout();
|
|
||||||
|
|
||||||
setTabOrder(m_txtLocation, m_toolBar);
|
|
||||||
setTabOrder(m_toolBar, m_webView);
|
|
||||||
|
|
||||||
createConnections();
|
|
||||||
initializeZoomWidget();
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::initializeZoomWidget() {
|
|
||||||
// Initializations.
|
|
||||||
m_zoomButtons = new QWidget(this);
|
|
||||||
QLabel *zoom_label = new QLabel(tr("Zoom "), m_zoomButtons);
|
|
||||||
QHBoxLayout *layout = new QHBoxLayout(m_zoomButtons);
|
|
||||||
QToolButton *button_decrease = new QToolButton(m_zoomButtons);
|
|
||||||
m_btnResetZoom = new QToolButton(m_zoomButtons);
|
|
||||||
QToolButton *button_increase = new QToolButton(m_zoomButtons);
|
|
||||||
|
|
||||||
// Set texts.
|
|
||||||
button_decrease->setText(QSL("-"));
|
|
||||||
button_decrease->setToolTip(tr("Decrease zoom."));
|
|
||||||
m_btnResetZoom->setText(QSL("100%"));
|
|
||||||
m_btnResetZoom->setToolTip(tr("Reset zoom to default."));
|
|
||||||
button_increase->setText(QSL("+"));
|
|
||||||
button_increase->setToolTip(tr("Increase zoom."));
|
|
||||||
|
|
||||||
// Setup layout.
|
|
||||||
layout->addWidget(zoom_label);
|
|
||||||
layout->addWidget(button_decrease);
|
|
||||||
layout->addWidget(m_btnResetZoom);
|
|
||||||
layout->addWidget(button_increase);
|
|
||||||
layout->setSpacing(2);
|
|
||||||
layout->setMargin(3);
|
|
||||||
m_zoomButtons->setLayout(layout);
|
|
||||||
|
|
||||||
// Make connections.
|
|
||||||
connect(button_increase, SIGNAL(clicked()), this, SLOT(increaseZoom()));
|
|
||||||
connect(button_decrease, SIGNAL(clicked()), this, SLOT(decreaseZoom()));
|
|
||||||
connect(m_btnResetZoom, SIGNAL(clicked()), this, SLOT(resetZoom()));
|
|
||||||
|
|
||||||
m_actionZoom = new QWidgetAction(this);
|
|
||||||
m_actionZoom->setDefaultWidget(m_zoomButtons);
|
|
||||||
}
|
|
||||||
|
|
||||||
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."));
|
|
||||||
|
|
||||||
m_btnDiscoverFeeds = new DiscoverFeedsButton(this);
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
m_loadingWidget = new QWidget(this);
|
|
||||||
m_loadingWidget->setFixedHeight(15);
|
|
||||||
|
|
||||||
// Initialize dynamic progress bar which will be displayed
|
|
||||||
// at the bottom of web browser.
|
|
||||||
m_lblProgress = new QLabel(this);
|
|
||||||
m_loadingProgress = new QProgressBar(this);
|
|
||||||
m_loadingProgress->setFixedHeight(15);
|
|
||||||
m_loadingProgress->setMinimum(0);
|
|
||||||
m_loadingProgress->setTextVisible(false);
|
|
||||||
m_loadingProgress->setMaximum(100);
|
|
||||||
m_loadingProgress->setAttribute(Qt::WA_TranslucentBackground);
|
|
||||||
|
|
||||||
m_loadingLayout = new QHBoxLayout();
|
|
||||||
m_loadingLayout->setMargin(0);
|
|
||||||
m_loadingLayout->addWidget(m_lblProgress, 0, Qt::AlignVCenter);
|
|
||||||
m_loadingLayout->addWidget(m_loadingProgress, 1, Qt::AlignVCenter);
|
|
||||||
m_loadingWidget->setLayout(m_loadingLayout);
|
|
||||||
|
|
||||||
// Setup layout.
|
|
||||||
m_layout->addWidget(m_toolBar);
|
|
||||||
m_layout->addWidget(m_webView);
|
|
||||||
m_layout->addWidget(m_loadingWidget);
|
|
||||||
m_layout->setMargin(0);
|
|
||||||
m_layout->setSpacing(0);
|
|
||||||
|
|
||||||
m_loadingWidget->hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::onLoadingStarted() {
|
|
||||||
m_loadingProgress->setValue(0);
|
|
||||||
m_loadingWidget->show();
|
|
||||||
m_btnDiscoverFeeds->setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::onLoadingProgress(int progress) {
|
|
||||||
m_loadingProgress->setValue(progress);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::onLoadingFinished(bool success) {
|
|
||||||
if (success) {
|
|
||||||
m_webView->page()->toHtml([this](const QString &html) {
|
|
||||||
this->m_btnDiscoverFeeds->setFeedAddresses(NetworkFactory::extractFeedLinksFromHtmlPage(m_webView->url(), html));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_btnDiscoverFeeds->clearFeedAddresses();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_loadingWidget->hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::createConnections() {
|
|
||||||
// When user confirms new url, then redirect to it.
|
|
||||||
connect(m_txtLocation,SIGNAL(submitted(QString)), this, SLOT(navigateToUrl(QString)));
|
|
||||||
// If new page loads, then update current url.
|
|
||||||
connect(m_webView, SIGNAL(urlChanged(QUrl)), this, SLOT(updateUrl(QUrl)));
|
|
||||||
|
|
||||||
// Connect this WebBrowser to global TabWidget.
|
|
||||||
TabWidget *tab_widget = qApp->mainForm()->tabWidget();
|
|
||||||
|
|
||||||
// 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(iconUrlChanged(QUrl)), this, SLOT(onIconChanged()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::onIconChanged() {
|
|
||||||
emit iconChanged(m_index, icon());
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::onTitleChanged(const QString &new_title) {
|
|
||||||
if (new_title.isEmpty()) {
|
|
||||||
//: Webbrowser tab title when no title is available.
|
|
||||||
emit titleChanged(m_index, tr("No title"));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
emit titleChanged(m_index, new_title);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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::navigateToUrl(const QUrl &url) {
|
|
||||||
if (url.isValid()) {
|
|
||||||
m_webView->load(url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::navigateToMessages(const QList<Message> &messages) {
|
|
||||||
Skin skin = qApp->skins()->currentSkin();
|
|
||||||
QString messages_layout;
|
|
||||||
QString single_message_layout = skin.m_layoutMarkup;
|
|
||||||
|
|
||||||
foreach (const Message &message, messages) {
|
|
||||||
QString enclosures;
|
|
||||||
|
|
||||||
foreach (const Enclosure &enclosure, message.m_enclosures) {
|
|
||||||
enclosures += skin.m_enclosureMarkup.arg(enclosure.m_url);
|
|
||||||
|
|
||||||
if (!enclosure.m_mimeType.isEmpty()) {
|
|
||||||
enclosures += QL1S(" [") + enclosure.m_mimeType + QL1S("]");
|
|
||||||
}
|
|
||||||
|
|
||||||
enclosures += QL1S("<br>");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!enclosures.isEmpty()) {
|
|
||||||
enclosures = enclosures.prepend(QSL("<br>"));
|
|
||||||
}
|
|
||||||
|
|
||||||
messages_layout.append(single_message_layout.arg(message.m_title,
|
|
||||||
tr("Written by ") + (message.m_author.isEmpty() ?
|
|
||||||
tr("unknown author") :
|
|
||||||
message.m_author),
|
|
||||||
message.m_url,
|
|
||||||
message.m_contents,
|
|
||||||
message.m_created.toString(Qt::DefaultLocaleShortDate),
|
|
||||||
enclosures));
|
|
||||||
}
|
|
||||||
|
|
||||||
QString layout_wrapper = skin.m_layoutMarkupWrapper.arg(messages.size() == 1 ? messages.at(0).m_title : tr("Newspaper view"), messages_layout);
|
|
||||||
|
|
||||||
m_webView->setHtml(layout_wrapper, QUrl(INTERNAL_URL_NEWSPAPER));
|
|
||||||
emit iconChanged(m_index, qApp->icons()->fromTheme(QSL("item-newspaper")));
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::updateZoomGui() {
|
|
||||||
m_btnResetZoom->setText(QString(QSL("%1%")).arg(QString::number(m_webView->zoomFactor() * 100, 'f', 0)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::increaseZoom() {
|
|
||||||
m_webView->increaseWebPageZoom();
|
|
||||||
updateZoomGui();
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::decreaseZoom() {
|
|
||||||
m_webView->decreaseWebPageZoom();
|
|
||||||
updateZoomGui();
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::resetZoom() {
|
|
||||||
m_webView->resetWebPageZoom();
|
|
||||||
updateZoomGui();
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::navigateToUrl(const QString &textual_url) {
|
|
||||||
// Prepare input url.
|
|
||||||
QString better_url = textual_url;
|
|
||||||
better_url = better_url.replace(QL1C('\\'), QL1C('/'));
|
|
||||||
|
|
||||||
navigateToUrl(QUrl::fromUserInput(better_url));
|
|
||||||
}
|
|
||||||
|
|
||||||
WebBrowser::~WebBrowser() {
|
|
||||||
qDebug("Destroying WebBrowser instance.");
|
|
||||||
|
|
||||||
// Remove this instance from the global list of web browsers.
|
|
||||||
m_runningWebBrowsers.removeAll(this);
|
|
||||||
|
|
||||||
// Delete members. Do not use scoped pointers here.
|
|
||||||
delete m_layout;
|
|
||||||
delete m_zoomButtons;
|
|
||||||
delete m_actionZoom;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::setupIcons() {
|
|
||||||
m_actionBack->setIcon(qApp->icons()->fromTheme(QSL("go-previous")));
|
|
||||||
m_actionForward->setIcon(qApp->icons()->fromTheme(QSL("go-next")));
|
|
||||||
m_actionReload->setIcon(qApp->icons()->fromTheme(QSL("go-refresh")));
|
|
||||||
m_actionStop->setIcon(qApp->icons()->fromTheme(QSL("go-stop")));
|
|
||||||
}
|
|
||||||
|
|
||||||
QIcon WebBrowser::icon() const {
|
|
||||||
QUrl url = m_webView->iconUrl();
|
|
||||||
|
|
||||||
if (url.isValid()) {
|
|
||||||
QByteArray output;
|
|
||||||
if (NetworkFactory::downloadFile(url.toString(), DOWNLOAD_TIMEOUT, output).first == QNetworkReply::NoError) {
|
|
||||||
QPixmap icon_pixmap;
|
|
||||||
icon_pixmap.loadFromData(output);
|
|
||||||
return QIcon(icon_pixmap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return QIcon();
|
|
||||||
}
|
|
|
@ -1,168 +0,0 @@
|
||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef WEBBROWSER_H
|
|
||||||
#define WEBBROWSER_H
|
|
||||||
|
|
||||||
#include "gui/tabcontent.h"
|
|
||||||
|
|
||||||
#include "core/messagesmodel.h"
|
|
||||||
#include "network-web/webview.h"
|
|
||||||
#include "gui/locationlineedit.h"
|
|
||||||
#include "gui/discoverfeedsbutton.h"
|
|
||||||
|
|
||||||
#include <QWidget>
|
|
||||||
#include <QWidgetAction>
|
|
||||||
#include <QUrl>
|
|
||||||
#include <QToolBar>
|
|
||||||
|
|
||||||
|
|
||||||
class QToolButton;
|
|
||||||
class QVBoxLayout;
|
|
||||||
class QHBoxLayout;
|
|
||||||
class QProgressBar;
|
|
||||||
class QMenu;
|
|
||||||
class QLabel;
|
|
||||||
class TabWidget;
|
|
||||||
|
|
||||||
class WebBrowser : public TabContent {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructors and destructors.
|
|
||||||
explicit WebBrowser(QWidget *parent = 0);
|
|
||||||
virtual ~WebBrowser();
|
|
||||||
|
|
||||||
// Reloads icons for all buttons.
|
|
||||||
void setupIcons();
|
|
||||||
|
|
||||||
// Returns icon associated with currently loaded website.
|
|
||||||
QIcon icon() const;
|
|
||||||
|
|
||||||
inline WebView *view() const {
|
|
||||||
return m_webView;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sets this WebBrowser instance as focused.
|
|
||||||
inline void setFocus(Qt::FocusReason reason) {
|
|
||||||
m_txtLocation->setFocus(reason);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns this instance.
|
|
||||||
// NOTE: This is needed due to TabContent interface.
|
|
||||||
inline WebBrowser *webBrowser() const {
|
|
||||||
return const_cast<WebBrowser*>(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns global menu for this web browser.
|
|
||||||
inline virtual QList<QAction*> globalMenu() const {
|
|
||||||
QList<QAction*> browser_menu;
|
|
||||||
|
|
||||||
// Add needed actions into the menu.
|
|
||||||
browser_menu.append(m_actionZoom);
|
|
||||||
|
|
||||||
return browser_menu;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns list of all running web browsers.
|
|
||||||
static inline QList<WebBrowser*> runningWebBrowsers() {
|
|
||||||
return m_runningWebBrowsers;
|
|
||||||
}
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
// Switches visibility of navigation bar.
|
|
||||||
inline void setNavigationBarVisible(bool visible) {
|
|
||||||
m_toolBar->setVisible(visible);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Loads new url into the web browser.
|
|
||||||
void navigateToUrl(const QString &url);
|
|
||||||
void navigateToUrl(const QUrl &url);
|
|
||||||
|
|
||||||
// Navigates to messages, used also as "newspaper" view.
|
|
||||||
void navigateToMessages(const QList<Message> &messages);
|
|
||||||
|
|
||||||
// Clears contents.
|
|
||||||
inline void clear() {
|
|
||||||
if (m_webView->url() != QUrl()) {
|
|
||||||
m_webView->setHtml("<html><body></body></html>", QUrl(INTERNAL_URL_EMPTY));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Zoom manipulators.
|
|
||||||
void increaseZoom();
|
|
||||||
void decreaseZoom();
|
|
||||||
void resetZoom();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// Creates necessary connections.
|
|
||||||
void createConnections();
|
|
||||||
|
|
||||||
// Initializes all buttons and widgets, which are needed for "Zoom" menu item.
|
|
||||||
void initializeZoomWidget();
|
|
||||||
|
|
||||||
// Initializes layout.
|
|
||||||
void initializeLayout();
|
|
||||||
|
|
||||||
protected slots:
|
|
||||||
void onLoadingStarted();
|
|
||||||
void onLoadingProgress(int progress);
|
|
||||||
void onLoadingFinished(bool success);
|
|
||||||
|
|
||||||
// Updates zoom-related gui.
|
|
||||||
void updateZoomGui();
|
|
||||||
|
|
||||||
// Updates url (for example on location text box).
|
|
||||||
void updateUrl(const QUrl &url);
|
|
||||||
|
|
||||||
// Title/icon is changed.
|
|
||||||
void onTitleChanged(const QString &new_title);
|
|
||||||
void onIconChanged();
|
|
||||||
|
|
||||||
signals:
|
|
||||||
// User requests opening of new tab or clicks the link
|
|
||||||
// with middle mouse button
|
|
||||||
void newTabRequested();
|
|
||||||
void linkMiddleClicked(const QUrl &link_url);
|
|
||||||
|
|
||||||
// Title/icon is changed.
|
|
||||||
void iconChanged(int index, const QIcon &icon);
|
|
||||||
void titleChanged(int index, const QString &title);
|
|
||||||
|
|
||||||
private:
|
|
||||||
QVBoxLayout *m_layout;
|
|
||||||
QToolBar *m_toolBar;
|
|
||||||
WebView *m_webView;
|
|
||||||
LocationLineEdit *m_txtLocation;
|
|
||||||
QWidget *m_zoomButtons;
|
|
||||||
QToolButton *m_btnResetZoom;
|
|
||||||
QWidget *m_loadingWidget;
|
|
||||||
QHBoxLayout *m_loadingLayout;
|
|
||||||
QProgressBar *m_loadingProgress;
|
|
||||||
QLabel *m_lblProgress;
|
|
||||||
DiscoverFeedsButton *m_btnDiscoverFeeds;
|
|
||||||
|
|
||||||
QWidgetAction *m_actionZoom;
|
|
||||||
QAction *m_actionBack;
|
|
||||||
QAction *m_actionForward;
|
|
||||||
QAction *m_actionReload;
|
|
||||||
QAction *m_actionStop;
|
|
||||||
|
|
||||||
static QList<WebBrowser*> m_runningWebBrowsers;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // WEBBROWSER_H
|
|
|
@ -1,9 +1,25 @@
|
||||||
|
// This file is part of RSS Guard.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
||||||
|
//
|
||||||
|
// RSS Guard is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// RSS Guard is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#include "network-web/webfactory.h"
|
#include "network-web/webfactory.h"
|
||||||
|
|
||||||
#include "miscellaneous/application.h"
|
#include "miscellaneous/application.h"
|
||||||
|
|
||||||
#include <QRegExp>
|
#include <QRegExp>
|
||||||
#include <QWebEngineSettings>
|
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
#include <QDesktopServices>
|
#include <QDesktopServices>
|
||||||
|
@ -13,21 +29,12 @@ QPointer<WebFactory> WebFactory::s_instance;
|
||||||
|
|
||||||
WebFactory::WebFactory(QObject *parent)
|
WebFactory::WebFactory(QObject *parent)
|
||||||
: QObject(parent), m_escapes(QMap<QString, QString>()),
|
: QObject(parent), m_escapes(QMap<QString, QString>()),
|
||||||
m_deEscapes(QMap<QString, QString>()),
|
m_deEscapes(QMap<QString, QString>()) {
|
||||||
m_globalSettings(QWebEngineSettings::globalSettings()) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WebFactory::~WebFactory() {
|
WebFactory::~WebFactory() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebFactory::loadState() {
|
|
||||||
const Settings *settings = qApp->settings();
|
|
||||||
|
|
||||||
switchJavascript(settings->value(GROUP(Browser), SETTING(Browser::JavascriptEnabled)).toBool(), false);
|
|
||||||
switchImages(settings->value(GROUP(Browser), SETTING(Browser::ImagesEnabled)).toBool(), false);
|
|
||||||
switchPlugins(settings->value(GROUP(Browser), SETTING(Browser::PluginsEnabled)).toBool(), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WebFactory::sendMessageViaEmail(const Message &message) {
|
bool WebFactory::sendMessageViaEmail(const Message &message) {
|
||||||
if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailEnabled)).toBool()) {
|
if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailEnabled)).toBool()) {
|
||||||
const QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailExecutable)).toString();
|
const QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailExecutable)).toString();
|
||||||
|
@ -66,33 +73,6 @@ bool WebFactory::openUrlInExternalBrowser(const QString &url) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebFactory::switchJavascript(bool enable, bool save_settings) {
|
|
||||||
if (save_settings) {
|
|
||||||
qApp->settings()->setValue(GROUP(Browser), Browser::JavascriptEnabled, enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_globalSettings->setAttribute(QWebEngineSettings::JavascriptEnabled, enable);
|
|
||||||
emit javascriptSwitched(enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebFactory::switchPlugins(bool enable, bool save_settings) {
|
|
||||||
if (save_settings) {
|
|
||||||
qApp->settings()->setValue(GROUP(Browser), Browser::PluginsEnabled, enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_globalSettings->setAttribute(QWebEngineSettings::PluginsEnabled, enable);
|
|
||||||
emit pluginsSwitched(enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebFactory::switchImages(bool enable, bool save_settings) {
|
|
||||||
if (save_settings) {
|
|
||||||
qApp->settings()->setValue(GROUP(Browser), Browser::ImagesEnabled, enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_globalSettings->setAttribute(QWebEngineSettings::AutoLoadImages, enable);
|
|
||||||
emit imagesLoadingSwitched(enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
WebFactory *WebFactory::instance() {
|
WebFactory *WebFactory::instance() {
|
||||||
if (s_instance.isNull()) {
|
if (s_instance.isNull()) {
|
||||||
s_instance = new WebFactory(qApp);
|
s_instance = new WebFactory(qApp);
|
||||||
|
@ -101,18 +81,6 @@ WebFactory *WebFactory::instance() {
|
||||||
return s_instance;
|
return s_instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WebFactory::javascriptEnabled() const {
|
|
||||||
return m_globalSettings->testAttribute(QWebEngineSettings::JavascriptEnabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WebFactory::pluginsEnabled() const {
|
|
||||||
return m_globalSettings->testAttribute(QWebEngineSettings::PluginsEnabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WebFactory::autoloadImages() const {
|
|
||||||
return m_globalSettings->testAttribute(QWebEngineSettings::AutoLoadImages);
|
|
||||||
}
|
|
||||||
|
|
||||||
QString WebFactory::stripTags(QString text) {
|
QString WebFactory::stripTags(QString text) {
|
||||||
return text.remove(QRegExp(QSL("<[^>]*>")));
|
return text.remove(QRegExp(QSL("<[^>]*>")));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,20 @@
|
||||||
|
// This file is part of RSS Guard.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
||||||
|
//
|
||||||
|
// RSS Guard is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// RSS Guard is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#ifndef WEBFACTORY_H
|
#ifndef WEBFACTORY_H
|
||||||
#define WEBFACTORY_H
|
#define WEBFACTORY_H
|
||||||
|
|
||||||
|
@ -18,11 +35,6 @@ class WebFactory : public QObject {
|
||||||
// Destructor.
|
// Destructor.
|
||||||
virtual ~WebFactory();
|
virtual ~WebFactory();
|
||||||
|
|
||||||
// Loads the web settings directly from
|
|
||||||
// application settings and notifies the rest of
|
|
||||||
// the world about current situation.
|
|
||||||
void loadState();
|
|
||||||
|
|
||||||
// Strips "<....>" (HTML, XML) tags from given text.
|
// Strips "<....>" (HTML, XML) tags from given text.
|
||||||
QString stripTags(QString text);
|
QString stripTags(QString text);
|
||||||
|
|
||||||
|
@ -34,11 +46,6 @@ class WebFactory : public QObject {
|
||||||
// count .co.uk (and others) as second-level domain
|
// count .co.uk (and others) as second-level domain
|
||||||
QString toSecondLevelDomain(const QUrl &url);
|
QString toSecondLevelDomain(const QUrl &url);
|
||||||
|
|
||||||
// Switchers.
|
|
||||||
bool javascriptEnabled() const;
|
|
||||||
bool pluginsEnabled() const;
|
|
||||||
bool autoloadImages() const;
|
|
||||||
|
|
||||||
// Singleton getter.
|
// Singleton getter.
|
||||||
static WebFactory *instance();
|
static WebFactory *instance();
|
||||||
|
|
||||||
|
@ -47,16 +54,6 @@ class WebFactory : public QObject {
|
||||||
bool openUrlInExternalBrowser(const QString &url);
|
bool openUrlInExternalBrowser(const QString &url);
|
||||||
bool sendMessageViaEmail(const Message &message);
|
bool sendMessageViaEmail(const Message &message);
|
||||||
|
|
||||||
// Switchers.
|
|
||||||
void switchJavascript(bool enable, bool save_settings = true);
|
|
||||||
void switchPlugins(bool enable, bool save_settings = true);
|
|
||||||
void switchImages(bool enable, bool save_settings = true);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void javascriptSwitched(bool enabled);
|
|
||||||
void pluginsSwitched(bool enabled);
|
|
||||||
void imagesLoadingSwitched(bool enabled);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Constructor.
|
// Constructor.
|
||||||
explicit WebFactory(QObject *parent = 0);
|
explicit WebFactory(QObject *parent = 0);
|
||||||
|
@ -67,7 +64,6 @@ class WebFactory : public QObject {
|
||||||
|
|
||||||
QMap<QString, QString> m_escapes;
|
QMap<QString, QString> m_escapes;
|
||||||
QMap<QString, QString> m_deEscapes;
|
QMap<QString, QString> m_deEscapes;
|
||||||
QWebEngineSettings *m_globalSettings;
|
|
||||||
|
|
||||||
// Singleton.
|
// Singleton.
|
||||||
static QPointer<WebFactory> s_instance;
|
static QPointer<WebFactory> s_instance;
|
||||||
|
|
|
@ -1,69 +0,0 @@
|
||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "network-web/webview.h"
|
|
||||||
|
|
||||||
#include "definitions/definitions.h"
|
|
||||||
|
|
||||||
#include <QWebEnginePage>
|
|
||||||
#include <QWheelEvent>
|
|
||||||
|
|
||||||
|
|
||||||
WebView::WebView(QWidget *parent)
|
|
||||||
: QWebEngineView(parent), m_page(new QWebEnginePage(this)) {
|
|
||||||
setPage(m_page);
|
|
||||||
}
|
|
||||||
|
|
||||||
WebView::~WebView() {
|
|
||||||
qDebug("Destroying WebView.");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WebView::increaseWebPageZoom() {
|
|
||||||
const qreal new_factor = zoomFactor() + 0.1;
|
|
||||||
|
|
||||||
if (new_factor >= 0.0 && new_factor <= MAX_ZOOM_FACTOR) {
|
|
||||||
setZoomFactor(new_factor);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WebView::decreaseWebPageZoom() {
|
|
||||||
const qreal new_factor = zoomFactor() - 0.1;
|
|
||||||
|
|
||||||
if (new_factor >= 0.0 && new_factor <= MAX_ZOOM_FACTOR) {
|
|
||||||
setZoomFactor(new_factor);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WebView::resetWebPageZoom() {
|
|
||||||
const qreal new_factor = 1.0;
|
|
||||||
|
|
||||||
if (new_factor != zoomFactor()) {
|
|
||||||
setZoomFactor(new_factor);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,47 +0,0 @@
|
||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef BASEWEBVIEW_H
|
|
||||||
#define BASEWEBVIEW_H
|
|
||||||
|
|
||||||
#include <QWebEngineView>
|
|
||||||
|
|
||||||
|
|
||||||
class WebView : public QWebEngineView {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructors and destructors.
|
|
||||||
explicit WebView(QWidget *parent = 0);
|
|
||||||
virtual ~WebView();
|
|
||||||
|
|
||||||
// Page accessor.
|
|
||||||
inline QWebEnginePage *page() const {
|
|
||||||
return m_page;
|
|
||||||
}
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
// Page zoom modifiers.
|
|
||||||
bool increaseWebPageZoom();
|
|
||||||
bool decreaseWebPageZoom();
|
|
||||||
bool resetWebPageZoom();
|
|
||||||
|
|
||||||
private:
|
|
||||||
QWebEnginePage *m_page;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // BASEWEBVIEW_H
|
|
Loading…
Add table
Reference in a new issue