From 3bee0365e986d57e77264733af4d05fa8a830e14 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Thu, 1 Mar 2018 20:19:38 +0800 Subject: [PATCH] support SavePage action in reading mode --- src/vexporter.cpp | 2 ++ src/vmdtab.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++++ src/vmdtab.h | 7 ++++++ src/vwebview.cpp | 7 ++++++ src/vwebview.h | 2 ++ 5 files changed, 76 insertions(+) diff --git a/src/vexporter.cpp b/src/vexporter.cpp index 7cee8ad2..5a7aec02 100644 --- a/src/vexporter.cpp +++ b/src/vexporter.cpp @@ -398,6 +398,8 @@ bool VExporter::exportToMHTML(VWebView *p_webViewer, const ExportHTMLOption &p_opt, const QString &p_filePath) { + Q_UNUSED(p_opt); + m_downloadState = QWebEngineDownloadItem::DownloadRequested; p_webViewer->page()->save(p_filePath, QWebEngineDownloadItem::MimeHtmlSaveFormat); diff --git a/src/vmdtab.cpp b/src/vmdtab.cpp index 5934126b..55d2ad9d 100644 --- a/src/vmdtab.cpp +++ b/src/vmdtab.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "vmdtab.h" #include "vdocument.h" #include "vnote.h" @@ -383,10 +384,14 @@ void VMdTab::setupMarkdownViewer() m_webViewer = new VWebView(m_file, this); connect(m_webViewer, &VWebView::editNote, this, &VMdTab::editFile); + connect(m_webViewer, &VWebView::requestSavePage, + this, &VMdTab::handleSavePageRequested); VPreviewPage *page = new VPreviewPage(m_webViewer); m_webViewer->setPage(page); m_webViewer->setZoomFactor(g_config->getWebZoomFactor()); + connect(page->profile(), &QWebEngineProfile::downloadRequested, + this, &VMdTab::handleDownloadRequested); // Avoid white flash before loading content. page->setBackgroundColor(Qt::transparent); @@ -1199,3 +1204,56 @@ bool VMdTab::executeVimCommandInWebView(const QString &p_cmd) return validCommand; } + +void VMdTab::handleDownloadRequested(QWebEngineDownloadItem *p_item) +{ + connect(p_item, &QWebEngineDownloadItem::stateChanged, + this, [p_item, this](QWebEngineDownloadItem::DownloadState p_state) { + QString msg; + switch (p_state) { + case QWebEngineDownloadItem::DownloadCompleted: + emit statusMessage(tr("Page saved to %1").arg(p_item->path())); + break; + + case QWebEngineDownloadItem::DownloadCancelled: + case QWebEngineDownloadItem::DownloadInterrupted: + emit statusMessage(tr("Fail to save page to %1").arg(p_item->path())); + break; + + default: + break; + } + }); +} + +void VMdTab::handleSavePageRequested() +{ + static QString lastPath = g_config->getDocumentPathOrHomePath(); + + QStringList filters; + filters << tr("Single HTML (*.html)") << tr("Complete HTML (*.html)") << tr("MIME HTML (*.mht)"); + QList formats; + formats << QWebEngineDownloadItem::SingleHtmlSaveFormat + << QWebEngineDownloadItem::CompleteHtmlSaveFormat + << QWebEngineDownloadItem::MimeHtmlSaveFormat; + + QString selectedFilter = filters[1]; + QString fileName = QFileDialog::getSaveFileName(this, + tr("Save Page"), + lastPath, + filters.join(";;"), + &selectedFilter); + if (fileName.isEmpty()) { + return; + } + + lastPath = QFileInfo(fileName).path(); + + QWebEngineDownloadItem::SavePageFormat format = formats.at(filters.indexOf(selectedFilter)); + + qDebug() << "save page as" << format << "to" << fileName; + + emit statusMessage(tr("Saving page to %1").arg(fileName)); + + m_webViewer->page()->save(fileName, format); +} diff --git a/src/vmdtab.h b/src/vmdtab.h index 5ddfd9db..adaa4305 100644 --- a/src/vmdtab.h +++ b/src/vmdtab.h @@ -14,6 +14,7 @@ class VDocument; class VMdEditor; class VInsertSelector; class QTimer; +class QWebEngineDownloadItem; class VMdTab : public VEditTab { @@ -132,6 +133,12 @@ private slots: // Restore from m_infoToRestore. void restoreFromTabInfo(); + // Handle download request from web page. + void handleDownloadRequested(QWebEngineDownloadItem *p_item); + + // Handle save page request. + void handleSavePageRequested(); + private: enum TabReady { None = 0, ReadMode = 0x1, EditMode = 0x2 }; diff --git a/src/vwebview.cpp b/src/vwebview.cpp index 99940807..99863851 100644 --- a/src/vwebview.cpp +++ b/src/vwebview.cpp @@ -95,6 +95,13 @@ void VWebView::contextMenuEvent(QContextMenuEvent *p_event) defaultCopyImageAct->setVisible(false); } + if (!hasSelection()) { + QAction *savePageAct = new QAction(QWebEnginePage::tr("Save &Page"), menu); + connect(savePageAct, &QAction::triggered, + this, &VWebView::requestSavePage); + menu->addAction(savePageAct); + } + // Add Copy All As menu. initCopyAllAsMenu(menu); diff --git a/src/vwebview.h b/src/vwebview.h index 2db5b046..e6388a65 100644 --- a/src/vwebview.h +++ b/src/vwebview.h @@ -18,6 +18,8 @@ public: signals: void editNote(); + void requestSavePage(); + protected: void contextMenuEvent(QContextMenuEvent *p_event);