diff --git a/resources/text/CHANGELOG b/resources/text/CHANGELOG
index 5f805b10f..5b354aacb 100644
--- a/resources/text/CHANGELOG
+++ b/resources/text/CHANGELOG
@@ -4,6 +4,7 @@
Fixed:
- Fixed issue #53 - removing of duplicate messages. Feature is available globally in "Settings -> Messages".
+- Fixed issue #100 - saving HTML web pages.
Added:
diff --git a/src/gui/formimportexport.cpp b/src/gui/formimportexport.cpp
index df16a21ca..48dfb7a41 100644
--- a/src/gui/formimportexport.cpp
+++ b/src/gui/formimportexport.cpp
@@ -107,8 +107,6 @@ void FormImportExport::selectExportFile() {
QString selected_file = QFileDialog::getSaveFileName(this, tr("Select file for feeds export"),
qApp->homeFolderPath(), filter, &selected_filter);
-
-
if (!selected_file.isEmpty()) {
if (selected_filter == filter_opml20) {
m_conversionType = OPML20;
diff --git a/src/gui/formmain.cpp b/src/gui/formmain.cpp
index fe6a7726e..b877758c1 100755
--- a/src/gui/formmain.cpp
+++ b/src/gui/formmain.cpp
@@ -376,13 +376,18 @@ void FormMain::loadWebBrowserMenu(int index) {
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);
}
diff --git a/src/gui/tabwidget.cpp b/src/gui/tabwidget.cpp
index 4bcc5541d..fe4f9ca2b 100755
--- a/src/gui/tabwidget.cpp
+++ b/src/gui/tabwidget.cpp
@@ -221,8 +221,7 @@ void TabWidget::removeTab(int index) {
QTabWidget::removeTab(index);
}
-int TabWidget::addTab(TabContent *widget, const QIcon &icon,
- const QString &label, const TabBar::TabType &type) {
+int TabWidget::addTab(TabContent *widget, const QIcon &icon, const QString &label, const TabBar::TabType &type) {
int index = QTabWidget::addTab(widget, icon, label);
tabBar()->setTabType(index, type);
@@ -236,16 +235,14 @@ int TabWidget::addTab(TabContent *widget, const QString &label, const TabBar::Ta
return index;
}
-int TabWidget::insertTab(int index, QWidget *widget, const QIcon &icon,
- const QString &label, const TabBar::TabType &type) {
+int TabWidget::insertTab(int index, QWidget *widget, const QIcon &icon, const QString &label, const TabBar::TabType &type) {
int tab_index = QTabWidget::insertTab(index, widget, icon, label);
tabBar()->setTabType(tab_index, type);
return tab_index;
}
-int TabWidget::insertTab(int index, QWidget *widget, const QString &label,
- const TabBar::TabType &type) {
+int TabWidget::insertTab(int index, QWidget *widget, const QString &label, const TabBar::TabType &type) {
int tab_index = QTabWidget::insertTab(index, widget, label);
tabBar()->setTabType(tab_index, type);
@@ -271,14 +268,10 @@ int TabWidget::addLinkedBrowser(const QString &initial_url) {
}
int TabWidget::addLinkedBrowser(const QUrl &initial_url) {
- return addBrowser(qApp->settings()->value(GROUP(Browser), SETTING(Browser::QueueTabs)).toBool(),
- false,
- 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) {
+int TabWidget::addBrowser(bool move_after_current, bool make_active, const QUrl &initial_url) {
// Create new WebBrowser.
WebBrowser *browser = new WebBrowser(this);
browser->setupIcons();
@@ -287,16 +280,12 @@ int TabWidget::addBrowser(bool move_after_current,
if (move_after_current) {
// Insert web browser after current tab.
- final_index = insertTab(currentIndex() + 1,
- browser,
- qApp->icons()->fromTheme("text-html"),
- tr("Web browser"),
- TabBar::Closable);
+ final_index = insertTab(currentIndex() + 1, browser, qApp->icons()->fromTheme("text-html"),
+ tr("Web browser"), TabBar::Closable);
}
else {
// Add new browser as the last tab.
- final_index = addTab(browser,
- qApp->icons()->fromTheme("text-html"),
+ final_index = addTab(browser, qApp->icons()->fromTheme("text-html"),
//: Web browser default tab title.
tr("Web browser"),
TabBar::Closable);
diff --git a/src/network-web/webview.cpp b/src/network-web/webview.cpp
index 1e054285a..b8eec7fe4 100755
--- a/src/network-web/webview.cpp
+++ b/src/network-web/webview.cpp
@@ -23,6 +23,7 @@
#include "miscellaneous/iconfactory.h"
#include "network-web/webpage.h"
#include "network-web/webfactory.h"
+#include "gui/messagebox.h"
#include
#include
@@ -33,6 +34,7 @@
#include
#include
#include
+#include
#if QT_VERSION >= 0x050000
#include
@@ -76,10 +78,41 @@ void WebView::openImageInNewTab() {
emit linkMiddleClicked(m_contextImageUrl);
}
+void WebView::saveCurrentPageToFile() {
+ QString filter_html = tr("HTML web pages (*.html)");
+
+ QString filter;
+ QString selected_filter;
+
+ // Add more filters here.
+ filter += filter_html;
+
+ QString selected_file = QFileDialog::getSaveFileName(this, tr("Select destination file for web page"),
+ qApp->homeFolderPath(), filter, &selected_filter);
+
+ if (!selected_file.isEmpty()) {
+ QFile selected_file_handle(selected_file);
+
+ if (selected_file_handle.open(QIODevice::WriteOnly | QIODevice::Unbuffered)) {
+ QString html_text = page()->mainFrame()->toHtml();
+ QTextStream str(&selected_file_handle);
+
+ str.setCodec("UTF-16");
+ str << html_text;
+ selected_file_handle.close();
+ }
+ else {
+ MessageBox::show(this, QMessageBox::Critical, tr("Cannot save web page"),
+ tr("Web page cannot be saved because destination file is not writtable."));
+ }
+ }
+}
+
void WebView::createConnections() {
connect(this, SIGNAL(loadFinished(bool)), this, SLOT(onLoadFinished(bool)));
connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(popupContextMenu(QPoint)));
+ connect(m_actionSavePageAs, SIGNAL(triggered()), this, SLOT(saveCurrentPageToFile()));
connect(m_actionPrint, SIGNAL(triggered()), this, SLOT(printCurrentPage()));
connect(m_actionOpenLinkNewTab, SIGNAL(triggered()), this, SLOT(openLinkInNewTab()));
connect(m_actionOpenImageNewTab, SIGNAL(triggered()), this, SLOT(openImageInNewTab()));
@@ -133,6 +166,8 @@ void WebView::initializeActions() {
m_actionCopyImage->setText(tr("Copy image"));
m_actionCopyImage->setToolTip(tr("Copy image to clipboard."));
+ m_actionSavePageAs = new QAction(qApp->icons()->fromTheme("document-export"), tr("Save page as..."), this);
+
#if QT_VERSION >= 0x040800
m_actionCopyImageUrl = pageAction(QWebPage::CopyImageUrlToClipboard);
m_actionCopyImageUrl->setParent(this);
@@ -197,6 +232,7 @@ void WebView::popupContextMenu(const QPoint &pos) {
}
context_menu.addAction(m_actionCopySelectedItem);
+ context_menu.addAction(m_actionSavePageAs);
QUrl hit_url = hit_result.linkUrl();
QUrl hit_image_url = hit_result.imageUrl();
diff --git a/src/network-web/webview.h b/src/network-web/webview.h
index ffeec7a2f..7281e3f2b 100644
--- a/src/network-web/webview.h
+++ b/src/network-web/webview.h
@@ -64,6 +64,7 @@ class WebView : public QWebView {
void openLinkInNewTab();
void openLinkExternally();
void openImageInNewTab();
+ void saveCurrentPageToFile();
// Provides custom context menu.
void popupContextMenu(const QPoint &pos);
@@ -95,6 +96,7 @@ class WebView : public QWebView {
QAction *m_actionCopySelectedItem;
QAction *m_actionCopyLink;
QAction *m_actionCopyImage;
+ QAction *m_actionSavePageAs;
#if QT_VERSION >= 0x040800
QAction *m_actionCopyImageUrl;