From 935bb4d3b4e9e8963453db652cf8f5f37bd76052 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Thu, 1 Mar 2018 20:19:58 +0800 Subject: [PATCH] export: support exporting PDF via wkhtmltopdf tool --- src/dialog/vexportdialog.cpp | 298 +++++++++++++++--- src/dialog/vexportdialog.h | 110 ++++++- src/resources/export_template.html | 2 +- src/resources/markdown_template.html | 2 +- src/resources/simple_template.html | 2 +- .../v_moonlight/arrow_dropdown_disabled.svg | 9 + .../themes/v_moonlight/v_moonlight.palette | 2 + .../themes/v_moonlight/v_moonlight.qss | 14 + .../themes/v_pure/arrow_dropdown_disabled.svg | 9 + src/resources/themes/v_pure/v_pure.palette | 2 + src/resources/themes/v_pure/v_pure.qss | 14 + .../themes/v_white/arrow_dropdown.svg | 2 +- .../v_white/arrow_dropdown_disabled.svg | 9 + src/resources/themes/v_white/v_white.palette | 2 + src/resources/themes/v_white/v_white.qss | 14 + src/resources/vnote.ini | 8 + src/vconfigmanager.h | 28 ++ src/vexporter.cpp | 243 +++++++++++++- src/vexporter.h | 20 ++ src/vnote.qrc | 3 + 20 files changed, 729 insertions(+), 64 deletions(-) create mode 100644 src/resources/themes/v_moonlight/arrow_dropdown_disabled.svg create mode 100644 src/resources/themes/v_pure/arrow_dropdown_disabled.svg create mode 100644 src/resources/themes/v_white/arrow_dropdown_disabled.svg diff --git a/src/dialog/vexportdialog.cpp b/src/dialog/vexportdialog.cpp index 781df008..2e2f7139 100644 --- a/src/dialog/vexportdialog.cpp +++ b/src/dialog/vexportdialog.cpp @@ -2,6 +2,7 @@ #include #include +#include #ifndef QT_NO_PRINTER #include @@ -18,6 +19,7 @@ #include "vnotefile.h" #include "vnote.h" #include "vexporter.h" +#include "vlineedit.h" extern VConfigManager *g_config; @@ -25,7 +27,7 @@ extern VNote *g_vnote; QString VExportDialog::s_lastOutputFolder; -ExportFormat VExportDialog::s_lastExportFormat = ExportFormat::Markdown; +ExportOption VExportDialog::s_opt; #define LOGERR(x) do { QString msg = (x); \ VUtils::addErrMsg(p_errMsg, msg); \ @@ -45,7 +47,8 @@ VExportDialog::VExportDialog(VNotebook *p_notebook, m_cart(p_cart), m_pageLayout(QPageLayout(QPageSize(QPageSize::A4), QPageLayout::Portrait, - QMarginsF(0.3, 0.3, 0.3, 0.3))), + QMarginsF(10, 16, 10, 10), + QPageLayout::Millimeter)), m_inExport(false), m_askedToStop(false) { @@ -56,6 +59,10 @@ VExportDialog::VExportDialog(VNotebook *p_notebook, setupUI(); m_exporter = new VExporter(this); + connect(m_exporter, &VExporter::outputLog, + this, [this](const QString &p_log) { + appendLogLine(p_log); + }); initUIFields(p_renderer); @@ -68,6 +75,8 @@ void VExportDialog::setupUI() m_srcCB = VUtils::getComboBox(); m_srcCB->setToolTip(tr("Choose notes to export")); m_srcCB->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon); + connect(m_srcCB, SIGNAL(currentIndexChanged(int)), + this, SLOT(handleCurrentSrcChanged(int))); // Target format. m_formatCB = VUtils::getComboBox(); @@ -97,12 +106,12 @@ void VExportDialog::setupUI() m_outputEdit = new VLineEdit(s_lastOutputFolder); connect(m_outputEdit, &QLineEdit::textChanged, this, &VExportDialog::handleInputChanged); - m_browseBtn = new QPushButton(tr("&Browse")); - connect(m_browseBtn, &QPushButton::clicked, - this, &VExportDialog::handleBrowseBtnClicked); + QPushButton *browseBtn = new QPushButton(tr("&Browse")); + connect(browseBtn, &QPushButton::clicked, + this, &VExportDialog::handleOutputBrowseBtnClicked); QHBoxLayout *outputLayout = new QHBoxLayout(); outputLayout->addWidget(m_outputEdit); - outputLayout->addWidget(m_browseBtn); + outputLayout->addWidget(browseBtn); m_basicBox = new QGroupBox(tr("Information")); @@ -150,10 +159,12 @@ void VExportDialog::setupUI() m_basicBox->setLayout(basicLayout); // Settings box. + m_generalSettings = setupGeneralAdvancedSettings(); m_htmlSettings = setupHTMLAdvancedSettings(); m_pdfSettings = setupPDFAdvancedSettings(); QVBoxLayout *advLayout = new QVBoxLayout(); + advLayout->addWidget(m_generalSettings); advLayout->addWidget(m_htmlSettings); advLayout->addWidget(m_pdfSettings); @@ -190,8 +201,75 @@ QWidget *VExportDialog::setupPDFAdvancedSettings() layoutLayout->addWidget(layoutBtn); layoutLayout->addStretch(); + // Use wkhtmltopdf. + m_wkhtmltopdfCB = new QCheckBox(tr("Use wkhtmltopdf")); + m_wkhtmltopdfCB->setToolTip(tr("Use wkhtmltopdf tool to generate PDF (wkhtmltopdf needed to be installed)")); + connect(m_wkhtmltopdfCB, &QCheckBox::stateChanged, + this, [this](int p_state) { + bool checked = p_state == Qt::Checked; + m_wkPathEdit->setEnabled(checked); + m_wkPathBrowseBtn->setEnabled(checked); + m_wkBackgroundCB->setEnabled(checked); + m_wkTableOfContentsCB->setEnabled(checked); + m_wkPageNumberCB->setEnabled(checked); + m_wkExtraArgsEdit->setEnabled(checked); + }); + + QPushButton *wkBtn = new QPushButton(tr("Download wkhtmltopdf")); + connect(wkBtn, &QPushButton::clicked, + this, [this]() { + QString url("https://wkhtmltopdf.org/downloads.html"); + QDesktopServices::openUrl(QUrl(url)); + }); + + QHBoxLayout *wkLayout = new QHBoxLayout(); + wkLayout->addWidget(m_wkhtmltopdfCB); + wkLayout->addStretch(); + wkLayout->addWidget(wkBtn); + + // wkhtmltopdf Path. + m_wkPathEdit = new VLineEdit(); + m_wkPathEdit->setToolTip(tr("Tell VNote where to find wkhtmlpdf tool")); + m_wkPathEdit->setEnabled(m_wkhtmltopdfCB->isChecked()); + + m_wkPathBrowseBtn = new QPushButton(tr("&Browse")); + m_wkPathBrowseBtn->setEnabled(m_wkhtmltopdfCB->isChecked()); + connect(m_wkPathBrowseBtn, &QPushButton::clicked, + this, &VExportDialog::handleWkPathBrowseBtnClicked); + + QHBoxLayout *wkPathLayout = new QHBoxLayout(); + wkPathLayout->addWidget(m_wkPathEdit); + wkPathLayout->addWidget(m_wkPathBrowseBtn); + + // wkhtmltopdf enable background. + m_wkBackgroundCB = new QCheckBox(tr("Enable background")); + m_wkBackgroundCB->setToolTip(tr("Enable background when printing")); + m_wkBackgroundCB->setEnabled(m_wkhtmltopdfCB->isChecked()); + + // wkhtmltopdf enable table of contents. + m_wkTableOfContentsCB = new QCheckBox(tr("Enable Table Of Contents")); + m_wkTableOfContentsCB->setToolTip(tr("Add a table of contents to the document")); + m_wkTableOfContentsCB->setEnabled(m_wkhtmltopdfCB->isChecked()); + + // wkhtmltopdf page number. + m_wkPageNumberCB = VUtils::getComboBox(); + m_wkPageNumberCB->setToolTip(tr("Append page number as footer")); + m_wkPageNumberCB->setEnabled(m_wkhtmltopdfCB->isChecked()); + + // wkhtmltopdf extra argumnets. + m_wkExtraArgsEdit = new VLineEdit(); + m_wkExtraArgsEdit->setToolTip(tr("Additional arguments passed to wkhtmltopdf")); + m_wkExtraArgsEdit->setPlaceholderText(tr("Use \" to enclose arguments containing space")); + m_wkExtraArgsEdit->setEnabled(m_wkhtmltopdfCB->isChecked()); + QFormLayout *advLayout = new QFormLayout(); advLayout->addRow(tr("Page layout:"), layoutLayout); + advLayout->addRow(wkLayout); + advLayout->addRow(tr("wkhtmltopdf path:"), wkPathLayout); + advLayout->addRow(m_wkBackgroundCB); + advLayout->addRow(m_wkTableOfContentsCB); + advLayout->addRow(tr("Page number:"), m_wkPageNumberCB); + advLayout->addRow(tr("Additional arguments:"), m_wkExtraArgsEdit); advLayout->setContentsMargins(0, 0, 0, 0); @@ -206,14 +284,12 @@ QWidget *VExportDialog::setupHTMLAdvancedSettings() // Embed CSS styles. m_embedStyleCB = new QCheckBox(tr("Embed CSS styles"), this); m_embedStyleCB->setToolTip(tr("Embed CSS styles in HTML file")); - m_embedStyleCB->setChecked(true); // Complete HTML. m_completeHTMLCB = new QCheckBox(tr("Complete page"), this); m_completeHTMLCB->setToolTip(tr("Export the whole web page along with pictures " "which may not keep the HTML link structure of " "the original page")); - m_completeHTMLCB->setChecked(true); // Mime HTML. m_mimeHTMLCB = new QCheckBox(tr("MIME HTML"), this); @@ -238,6 +314,24 @@ QWidget *VExportDialog::setupHTMLAdvancedSettings() return wid; } +QWidget *VExportDialog::setupGeneralAdvancedSettings() +{ + // Include subfolders. + m_subfolderCB = new QCheckBox(tr("Process subfolders")); + m_subfolderCB->setToolTip(tr("Process subfolders recursively")); + m_subfolderCB->setChecked(true); + + QFormLayout *advLayout = new QFormLayout(); + advLayout->addRow(m_subfolderCB); + + advLayout->setContentsMargins(0, 0, 0, 0); + + QWidget *wid = new QWidget(); + wid->setLayout(advLayout); + + return wid; +} + void VExportDialog::initUIFields(MarkdownConverterType p_renderer) { // Notes to export. @@ -248,7 +342,7 @@ void VExportDialog::initUIFields(MarkdownConverterType p_renderer) if (m_directory) { m_srcCB->addItem(tr("Current Folder (%1)").arg(m_directory->getName()), - (int)ExportSource::CurrentDirectory); + (int)ExportSource::CurrentFolder); } if (m_notebook) { @@ -265,7 +359,7 @@ void VExportDialog::initUIFields(MarkdownConverterType p_renderer) m_formatCB->addItem(tr("Markdown"), (int)ExportFormat::Markdown); m_formatCB->addItem(tr("HTML"), (int)ExportFormat::HTML); m_formatCB->addItem(tr("PDF"), (int)ExportFormat::PDF); - m_formatCB->setCurrentIndex(m_formatCB->findData((int)s_lastExportFormat)); + m_formatCB->setCurrentIndex(m_formatCB->findData((int)s_opt.m_format)); // Markdown renderer. m_rendererCB->addItem(tr("Hoedown"), MarkdownConverterType::Hoedown); @@ -281,8 +375,11 @@ void VExportDialog::initUIFields(MarkdownConverterType p_renderer) m_renderBgCB->addItem(bgColors[i].m_name, bgColors[i].m_name); } - m_renderBgCB->setCurrentIndex( - m_renderBgCB->findData(g_config->getCurRenderBackgroundColor())); + if (s_opt.m_renderBg.isEmpty()) { + s_opt.m_renderBg = g_config->getCurRenderBackgroundColor(); + } + + m_renderBgCB->setCurrentIndex(m_renderBgCB->findData(s_opt.m_renderBg)); // Markdown rendering style. QList styles = g_config->getCssStyles(); @@ -301,6 +398,56 @@ void VExportDialog::initUIFields(MarkdownConverterType p_renderer) m_renderCodeBlockStyleCB->setCurrentIndex( m_renderCodeBlockStyleCB->findData(g_config->getCodeBlockCssStyle())); + + m_embedStyleCB->setChecked(s_opt.m_htmlOpt.m_embedCssStyle); + + m_completeHTMLCB->setChecked(s_opt.m_htmlOpt.m_completeHTML); + + m_mimeHTMLCB->setChecked(s_opt.m_htmlOpt.m_mimeHTML); + + m_wkhtmltopdfCB->setChecked(s_opt.m_pdfOpt.m_wkhtmltopdf); + + // wkhtmltopdf path. + m_wkPathEdit->setText(g_config->getWkhtmltopdfPath()); + + m_wkBackgroundCB->setChecked(s_opt.m_pdfOpt.m_wkEnableBackground); + + m_wkTableOfContentsCB->setChecked(s_opt.m_pdfOpt.m_wkEnableTableOfContents); + + // wkhtmltopdf page number. + m_wkPageNumberCB->addItem(tr("None"), (int)ExportPageNumber::None); + m_wkPageNumberCB->addItem(tr("Left"), (int)ExportPageNumber::Left); + m_wkPageNumberCB->addItem(tr("Center"), (int)ExportPageNumber::Center); + m_wkPageNumberCB->addItem(tr("Right"), (int)ExportPageNumber::Right); + m_wkPageNumberCB->setCurrentIndex(m_wkPageNumberCB->findData((int)s_opt.m_pdfOpt.m_wkPageNumber)); + + m_wkExtraArgsEdit->setText(g_config->getWkhtmltopdfArgs()); +} + +bool VExportDialog::checkWkhtmltopdfExecutable(const QString &p_file) +{ + QStringList args; + args << "--version"; + int ret = QProcess::execute(p_file, args); + switch (ret) { + case -2: + appendLogLine(tr("Fail to start wkhtmltopdf.")); + break; + + case -1: + appendLogLine(tr("wkhtmltopdf crashed.")); + break; + + case 0: + appendLogLine(tr("Use %1.").arg(p_file)); + break; + + default: + appendLogLine(tr("wkhtmltopdf returned %1.").arg(ret)); + break; + } + + return ret == 0; } void VExportDialog::startExport() @@ -315,45 +462,62 @@ void VExportDialog::startExport() QString outputFolder = QDir::cleanPath(QDir(getOutputDirectory()).absolutePath()); - ExportOption opt((ExportSource)m_srcCB->currentData().toInt(), - (ExportFormat)m_formatCB->currentData().toInt(), - (MarkdownConverterType)m_rendererCB->currentData().toInt(), - m_renderBgCB->currentData().toString(), - m_renderStyleCB->currentData().toString(), - m_renderCodeBlockStyleCB->currentData().toString(), - &m_pageLayout, - ExportHTMLOption(m_embedStyleCB->isChecked(), - m_completeHTMLCB->isChecked(), - m_mimeHTMLCB->isChecked())); - - s_lastExportFormat = opt.m_format; + s_opt = ExportOption((ExportSource)m_srcCB->currentData().toInt(), + (ExportFormat)m_formatCB->currentData().toInt(), + (MarkdownConverterType)m_rendererCB->currentData().toInt(), + m_renderBgCB->currentData().toString(), + m_renderStyleCB->currentData().toString(), + m_renderCodeBlockStyleCB->currentData().toString(), + m_subfolderCB->isChecked(), + ExportPDFOption(&m_pageLayout, + m_wkhtmltopdfCB->isChecked(), + QDir::toNativeSeparators(m_wkPathEdit->text()), + m_wkBackgroundCB->isChecked(), + m_wkTableOfContentsCB->isChecked(), + (ExportPageNumber)m_wkPageNumberCB->currentData().toInt(), + m_wkExtraArgsEdit->text()), + ExportHTMLOption(m_embedStyleCB->isChecked(), + m_completeHTMLCB->isChecked(), + m_mimeHTMLCB->isChecked())); m_consoleEdit->clear(); appendLogLine(tr("Export to %1.").arg(outputFolder)); - if (opt.m_format == ExportFormat::PDF - || opt.m_format == ExportFormat::HTML) { - m_exporter->prepareExport(opt); + if (s_opt.m_format == ExportFormat::PDF + || s_opt.m_format == ExportFormat::HTML) { + m_exporter->prepareExport(s_opt); + + if (s_opt.m_format == ExportFormat::PDF + && s_opt.m_pdfOpt.m_wkhtmltopdf) { + g_config->setWkhtmltopdfPath(s_opt.m_pdfOpt.m_wkPath); + g_config->setWkhtmltopdfArgs(s_opt.m_pdfOpt.m_wkExtraArgs); + + if (!checkWkhtmltopdfExecutable(s_opt.m_pdfOpt.m_wkPath)) { + m_inExport = false; + m_exportBtn->setEnabled(true); + return; + } + } } int ret = 0; QString msg; - switch ((int)opt.m_source) { - case (int)ExportSource::CurrentNote: - ret = doExport(m_file, opt, outputFolder, &msg); + switch (s_opt.m_source) { + case ExportSource::CurrentNote: + ret = doExport(m_file, s_opt, outputFolder, &msg); break; - case (int)ExportSource::CurrentDirectory: - ret = doExport(m_directory, opt, outputFolder, &msg); + case ExportSource::CurrentFolder: + ret = doExport(m_directory, s_opt, outputFolder, &msg); break; - case (int)ExportSource::CurrentNotebook: - ret = doExport(m_notebook, opt, outputFolder, &msg); + case ExportSource::CurrentNotebook: + ret = doExport(m_notebook, s_opt, outputFolder, &msg); break; - case (int)ExportSource::Cart: - ret = doExport(m_cart, opt, outputFolder, &msg); + case ExportSource::Cart: + ret = doExport(m_cart, s_opt, outputFolder, &msg); break; default: @@ -386,7 +550,7 @@ QString VExportDialog::getOutputDirectory() const return m_outputEdit->text(); } -void VExportDialog::handleBrowseBtnClicked() +void VExportDialog::handleOutputBrowseBtnClicked() { QString initPath = getOutputDirectory(); if (!QFileInfo::exists(initPath)) { @@ -405,6 +569,29 @@ void VExportDialog::handleBrowseBtnClicked() } } +void VExportDialog::handleWkPathBrowseBtnClicked() +{ + QString initPath = m_wkPathEdit->text(); + if (!QFileInfo::exists(initPath)) { + initPath = QCoreApplication::applicationDirPath(); + } + +#if defined(Q_OS_WIN) + QString filter = tr("Executable (*.exe)"); +#else + QString filter; +#endif + + QString filePath = QFileDialog::getOpenFileName(this, + tr("Select wkhtmltopdf Executable"), + initPath, + filter); + + if (!filePath.isEmpty()) { + m_wkPathEdit->setText(filePath); + } +} + void VExportDialog::handleInputChanged() { // Source. @@ -492,13 +679,15 @@ int VExportDialog::doExport(VDirectory *p_directory, ret += doExport(file, p_opt, outputPath, p_errMsg); } - // Export subfolder. - for (auto const & dir : p_directory->getSubDirs()) { - if (!checkUserAction()) { - goto exit; - } + // Export subfolders. + if (p_opt.m_processSubfolders) { + for (auto const & dir : p_directory->getSubDirs()) { + if (!checkUserAction()) { + goto exit; + } - ret += doExport(dir, p_opt, outputPath, p_errMsg); + ret += doExport(dir, p_opt, outputPath, p_errMsg); + } } exit: @@ -731,8 +920,9 @@ void VExportDialog::handleLayoutBtnClicked() return; } + m_pageLayout.setUnits(QPageLayout::Millimeter); m_pageLayout.setPageSize(printer.pageLayout().pageSize()); - m_pageLayout.setMargins(printer.pageLayout().margins()); + m_pageLayout.setMargins(printer.pageLayout().margins(QPageLayout::Millimeter)); m_pageLayout.setOrientation(printer.pageLayout().orientation()); updatePageLayoutLabel(); @@ -741,8 +931,6 @@ void VExportDialog::handleLayoutBtnClicked() void VExportDialog::updatePageLayoutLabel() { - qDebug() << "page layout margins:" << m_pageLayout.margins(); - m_layoutLabel->setText(QString("%1, %2").arg(m_pageLayout.pageSize().name()) .arg(m_pageLayout.orientation() == QPageLayout::Portrait ? tr("Portrait") : tr("Landscape"))); @@ -771,3 +959,21 @@ void VExportDialog::handleCurrentFormatChanged(int p_index) m_pdfSettings->setVisible(pdfEnabled); m_htmlSettings->setVisible(htmlEnabled); } + +void VExportDialog::handleCurrentSrcChanged(int p_index) +{ + bool subfolderEnabled = false; + + if (p_index >= 0) { + switch (m_srcCB->currentData().toInt()) { + case (int)ExportSource::CurrentFolder: + subfolderEnabled = true; + break; + + default: + break; + } + } + + m_subfolderCB->setVisible(subfolderEnabled); +} diff --git a/src/dialog/vexportdialog.h b/src/dialog/vexportdialog.h index 49e2f13c..ac7105e2 100644 --- a/src/dialog/vexportdialog.h +++ b/src/dialog/vexportdialog.h @@ -19,12 +19,13 @@ class VFile; class VCart; class VExporter; class QCheckBox; +class VLineEdit; enum class ExportSource { CurrentNote = 0, - CurrentDirectory, + CurrentFolder, CurrentNotebook, Cart }; @@ -38,8 +39,24 @@ enum class ExportFormat }; +enum class ExportPageNumber +{ + None = 0, + Left, + Center, + Right +}; + + struct ExportHTMLOption { + ExportHTMLOption() + : m_embedCssStyle(true), + m_completeHTML(true), + m_mimeHTML(false) + { + } + ExportHTMLOption(bool p_embedCssStyle, bool p_completeHTML, bool p_mimeHTML) @@ -55,15 +72,62 @@ struct ExportHTMLOption }; +struct ExportPDFOption +{ + ExportPDFOption() + : m_layout(NULL), + m_wkhtmltopdf(false), + m_wkEnableBackground(true), + m_wkEnableTableOfContents(false), + m_wkPageNumber(ExportPageNumber::None) + { + } + + ExportPDFOption(QPageLayout *p_layout, + bool p_wkhtmltopdf, + const QString &p_wkPath, + bool p_wkEnableBackground, + bool p_wkEnableTableOfContents, + ExportPageNumber p_wkPageNumber, + const QString &p_wkExtraArgs) + : m_layout(p_layout), + m_wkhtmltopdf(p_wkhtmltopdf), + m_wkPath(p_wkPath), + m_wkEnableBackground(p_wkEnableBackground), + m_wkEnableTableOfContents(p_wkEnableTableOfContents), + m_wkPageNumber(p_wkPageNumber), + m_wkExtraArgs(p_wkExtraArgs) + { + } + + QPageLayout *m_layout; + bool m_wkhtmltopdf; + QString m_wkPath; + bool m_wkEnableBackground; + bool m_wkEnableTableOfContents; + ExportPageNumber m_wkPageNumber; + QString m_wkExtraArgs; +}; + + struct ExportOption { + ExportOption() + : m_source(ExportSource::CurrentNote), + m_format(ExportFormat::Markdown), + m_renderer(MarkdownConverterType::MarkdownIt), + m_processSubfolders(false) + { + } + ExportOption(ExportSource p_source, ExportFormat p_format, MarkdownConverterType p_renderer, const QString &p_renderBg, const QString &p_renderStyle, const QString &p_renderCodeBlockStyle, - QPageLayout *p_layout, + bool p_processSubfolders, + const ExportPDFOption &p_pdfOpt, const ExportHTMLOption &p_htmlOpt) : m_source(p_source), m_format(p_format), @@ -71,7 +135,8 @@ struct ExportOption m_renderBg(p_renderBg), m_renderStyle(p_renderStyle), m_renderCodeBlockStyle(p_renderCodeBlockStyle), - m_layout(p_layout), + m_processSubfolders(p_processSubfolders), + m_pdfOpt(p_pdfOpt), m_htmlOpt(p_htmlOpt) { } @@ -85,7 +150,11 @@ struct ExportOption QString m_renderStyle; QString m_renderCodeBlockStyle; - QPageLayout *m_layout; + + // Whether process subfolders recursively when source is CurrentFolder. + bool m_processSubfolders; + + ExportPDFOption m_pdfOpt; ExportHTMLOption m_htmlOpt; }; @@ -105,7 +174,9 @@ public: private slots: void startExport(); - void handleBrowseBtnClicked(); + void handleOutputBrowseBtnClicked(); + + void handleWkPathBrowseBtnClicked(); void handleInputChanged(); @@ -113,6 +184,8 @@ private slots: void handleCurrentFormatChanged(int p_index); + void handleCurrentSrcChanged(int p_index); + private: void setupUI(); @@ -120,6 +193,8 @@ private: QWidget *setupHTMLAdvancedSettings(); + QWidget *setupGeneralAdvancedSettings(); + void initUIFields(MarkdownConverterType p_renderer); QString getOutputDirectory() const; @@ -167,6 +242,8 @@ private: void updatePageLayoutLabel(); + bool checkWkhtmltopdfExecutable(const QString &p_file); + QComboBox *m_srcCB; QComboBox *m_formatCB; @@ -181,8 +258,6 @@ private: VLineEdit *m_outputEdit; - QPushButton *m_browseBtn; - QGroupBox *m_basicBox; QGroupBox *m_settingBox; @@ -191,6 +266,8 @@ private: QWidget *m_htmlSettings; + QWidget *m_generalSettings; + QPlainTextEdit *m_consoleEdit; QDialogButtonBox *m_btnBox; @@ -201,12 +278,28 @@ private: QLabel *m_layoutLabel; + QCheckBox *m_wkhtmltopdfCB; + + VLineEdit *m_wkPathEdit; + + QPushButton *m_wkPathBrowseBtn; + + QCheckBox *m_wkBackgroundCB; + + QCheckBox *m_wkTableOfContentsCB; + + QComboBox *m_wkPageNumberCB; + + VLineEdit *m_wkExtraArgsEdit; + QCheckBox *m_embedStyleCB; QCheckBox *m_completeHTMLCB;; QCheckBox *m_mimeHTMLCB; + QCheckBox *m_subfolderCB; + VNotebook *m_notebook; VDirectory *m_directory; @@ -229,8 +322,7 @@ private: // Last output folder path. static QString s_lastOutputFolder; - // Last export format. - static ExportFormat s_lastExportFormat; + static ExportOption s_opt; }; #endif // VEXPORTDIALOG_H diff --git a/src/resources/export_template.html b/src/resources/export_template.html index da2b9751..ca4a0ec9 100644 --- a/src/resources/export_template.html +++ b/src/resources/export_template.html @@ -1,5 +1,5 @@ - +