From a8681c040c33a88810f4bfb2f2d6db27798dfe10 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Mon, 17 Nov 2014 17:18:02 +0100 Subject: [PATCH] Printing now works on Windows, fixed sorting bug in feed list. --- CMakeLists.txt | 3 +- .../icons/mini-kfaenza/print-web-page.png | Bin 0 -> 5758 bytes resources/text/CHANGELOG | 3 +- src/definitions/definitions.h.in | 1 + src/gui/feedsview.cpp | 6 ++++ src/gui/feedsview.h | 2 ++ src/network-web/webview.cpp | 30 +++++++++++++++++- src/network-web/webview.h | 3 ++ 8 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 resources/graphics/icons/mini-kfaenza/print-web-page.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 9245835c9..6beb12d22 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -244,7 +244,7 @@ endif(${USE_QT_5}) # Setup librar ies. if(${USE_QT_5}) - find_package(Qt5 REQUIRED Sql WebKit WebKitWidgets Widgets Xml XmlPatterns Network LinguistTools) + find_package(Qt5 REQUIRED Sql WebKit WebKitWidgets Widgets Xml XmlPatterns Network LinguistTools PrintSupport) else(${USE_QT_5}) set(QT_MIN_VERSION ${MINIMUM_QT_VERSION}) find_package(Qt4 REQUIRED QtCore QtGui QtSql QtNetwork QtWebkit QtXml QtXmlPatterns) @@ -616,6 +616,7 @@ if(${USE_QT_5}) Xml WebKit WebKitWidgets + PrintSupport ) # Setup compilation for Qt 4. else(${USE_QT_5}) diff --git a/resources/graphics/icons/mini-kfaenza/print-web-page.png b/resources/graphics/icons/mini-kfaenza/print-web-page.png new file mode 100644 index 0000000000000000000000000000000000000000..c16344391dd90f277435f130b6632b803b40f115 GIT binary patch literal 5758 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 Lwlb -

2.0.5

+

2.1.0

Fixed:
    @@ -8,6 +8,7 @@ Fixed: Added:
      +
    • Embedded web browser supports printing of its contents, feature is accessible via web browser context menu.
    • Embedded web browser now displays navigation toolbar even in message preview mode/newspaper mode when user loads external links.
    diff --git a/src/definitions/definitions.h.in b/src/definitions/definitions.h.in index 73c5645a2..14f4b6faf 100755 --- a/src/definitions/definitions.h.in +++ b/src/definitions/definitions.h.in @@ -61,6 +61,7 @@ #define MIN_CATEGORY_NAME_LENGTH 3 #define INTERNAL_URL_NEWSPAPER "@APP_LOW_NAME@:newspaper" #define INTERNAL_URL_EMPTY "@APP_LOW_NAME@:empty" +#define INTERNAL_URL_BLANK "about:blank" #define DEFAULT_AUTO_UPDATE_INTERVAL 15 #define AUTO_UPDATE_INTERVAL 60000 #define STARTUP_UPDATE_DELAY 1500 diff --git a/src/gui/feedsview.cpp b/src/gui/feedsview.cpp index 682c29ec7..3000683d0 100755 --- a/src/gui/feedsview.cpp +++ b/src/gui/feedsview.cpp @@ -75,6 +75,12 @@ void FeedsView::quit() { } } +void FeedsView::setSortingEnabled(bool enable) { + disconnect(header(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), this, SLOT(saveSortState(int,Qt::SortOrder))); + QTreeView::setSortingEnabled(enable); + connect(header(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), this, SLOT(saveSortState(int,Qt::SortOrder))); +} + void FeedsView::updateAutoUpdateStatus() { // Restore global intervals. // NOTE: Specific per-feed interval are left intact. diff --git a/src/gui/feedsview.h b/src/gui/feedsview.h index c5a5f153e..7b8456ae1 100644 --- a/src/gui/feedsview.h +++ b/src/gui/feedsview.h @@ -50,6 +50,8 @@ class FeedsView : public QTreeView { // Does necessary job before quitting this component. void quit(); + void setSortingEnabled(bool enable); + // Resets global auto-update intervals according to settings // and starts/stop the timer as needed. void updateAutoUpdateStatus(); diff --git a/src/network-web/webview.cpp b/src/network-web/webview.cpp index 00fa9214c..9fb570c9b 100755 --- a/src/network-web/webview.cpp +++ b/src/network-web/webview.cpp @@ -34,6 +34,12 @@ #include #include +#if QT_VERSION >= 0x050000 +#include +#else +#include +#endif + WebView::WebView(QWidget *parent) : QWebView(parent), m_page(new WebPage(this)) { @@ -74,12 +80,14 @@ void WebView::createConnections() { connect(this, SIGNAL(loadFinished(bool)), this, SLOT(onLoadFinished(bool))); connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(popupContextMenu(QPoint))); + connect(m_actionPrint, SIGNAL(triggered()), this, SLOT(printCurrentPage())); connect(m_actionOpenLinkNewTab, SIGNAL(triggered()), this, SLOT(openLinkInNewTab())); connect(m_actionOpenImageNewTab, SIGNAL(triggered()), this, SLOT(openImageInNewTab())); connect(m_actionOpenLinkExternally, SIGNAL(triggered()), this, SLOT(openLinkExternally())); } void WebView::setupIcons() { + m_actionPrint->setIcon(qApp->icons()->fromTheme("print-web-page")); m_actionReload->setIcon(qApp->icons()->fromTheme("go-refresh")); m_actionCopySelectedItem->setIcon(qApp->icons()->fromTheme("edit-copy")); m_actionCopyLink->setIcon(qApp->icons()->fromTheme("edit-copy")); @@ -102,6 +110,9 @@ void WebView::initializeActions() { m_actionReload->setText(tr("Reload web page")); m_actionReload->setToolTip(tr("Reload current web page.")); + m_actionPrint = new QAction(tr("Print"), this); + m_actionPrint->setToolTip(tr("Print current web page.")); + m_actionCopySelectedItem = pageAction(QWebPage::Copy); m_actionCopySelectedItem->setParent(this); m_actionCopySelectedItem->setText(tr("Copy selection")); @@ -174,7 +185,17 @@ void WebView::popupContextMenu(const QPoint &pos) { link_submenu.setIcon(qApp->icons()->fromTheme("text-html")); // Assemble the menu from actions. - context_menu.addAction(m_actionReload); + + QString current_url = url().toString(); + + if (!current_url.isEmpty() && current_url != INTERNAL_URL_EMPTY && current_url != INTERNAL_URL_BLANK) { + context_menu.addAction(m_actionPrint); + + if (current_url != INTERNAL_URL_NEWSPAPER) { + context_menu.addAction(m_actionReload); + } + } + context_menu.addAction(m_actionCopySelectedItem); QUrl hit_url = hit_result.linkUrl(); @@ -209,6 +230,12 @@ void WebView::popupContextMenu(const QPoint &pos) { context_menu.exec(mapToGlobal(pos)); } +void WebView::printCurrentPage() { + QPointer print_preview = new QPrintPreviewDialog(this); + connect(print_preview.data(), SIGNAL(paintRequested(QPrinter*)), this, SLOT(print(QPrinter*))); + print_preview.data()->exec(); +} + void WebView::mousePressEvent(QMouseEvent *event) { if (event->button() & Qt::LeftButton && event->modifiers() & Qt::ControlModifier) { QWebHitTestResult hit_result = page()->mainFrame()->hitTestContent(event->pos()); @@ -239,6 +266,7 @@ void WebView::mousePressEvent(QMouseEvent *event) { void WebView::mouseReleaseEvent(QMouseEvent *event) { if (event->button() & Qt::MiddleButton) { bool are_gestures_enabled = qApp->settings()->value(GROUP(Browser), SETTING(Browser::GesturesEnabled)).toBool(); + if (are_gestures_enabled) { QPoint release_point = event->pos(); int left_move = m_gestureOrigin.x() - release_point.x(); diff --git a/src/network-web/webview.h b/src/network-web/webview.h index 590412d8b..a8b717c96 100644 --- a/src/network-web/webview.h +++ b/src/network-web/webview.h @@ -68,6 +68,8 @@ class WebView : public QWebView { // Provides custom context menu. void popupContextMenu(const QPoint &pos); + void printCurrentPage(); + protected: // Initializes all actions. void initializeActions(); @@ -89,6 +91,7 @@ class WebView : public QWebView { WebPage *m_page; QAction *m_actionReload; + QAction *m_actionPrint; QAction *m_actionCopySelectedItem; QAction *m_actionCopyLink; QAction *m_actionCopyImage;