support SavePage action in reading mode

This commit is contained in:
Le Tan 2018-03-01 20:19:38 +08:00
parent bccc0b28db
commit 3bee0365e9
5 changed files with 76 additions and 0 deletions

View File

@ -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);

View File

@ -2,6 +2,7 @@
#include <QWebChannel>
#include <QFileInfo>
#include <QCoreApplication>
#include <QWebEngineProfile>
#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<QWebEngineDownloadItem::SavePageFormat> 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);
}

View File

@ -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 };

View File

@ -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);

View File

@ -18,6 +18,8 @@ public:
signals:
void editNote();
void requestSavePage();
protected:
void contextMenuEvent(QContextMenuEvent *p_event);