add config for inplace preview sources

This commit is contained in:
Le Tan 2021-07-17 14:48:29 +08:00
parent 3d7cd68707
commit 91527aed58
10 changed files with 211 additions and 28 deletions

@ -1 +1 @@
Subproject commit 34ad7467eb42b5d1d228228d875a7675814f222b
Subproject commit 8bcd2f0416df45409bb3b97c330adea7e3e3295b

View File

@ -48,7 +48,7 @@ void MarkdownEditorConfig::init(const QJsonObject &p_app, const QJsonObject &p_u
m_sectionNumberStyle = stringToSectionNumberStyle(READSTR(QStringLiteral("section_number_style")));
m_constrainImageWidthEnabled = READBOOL(QStringLiteral("constrain_image_width"));
m_constrainInPlacePreviewWidthEnabled = READBOOL(QStringLiteral("constrain_inplace_preview_width"));
m_constrainInplacePreviewWidthEnabled = READBOOL(QStringLiteral("constrain_inplace_preview_width"));
m_zoomFactorInReadMode = READREAL(QStringLiteral("zoom_factor_in_read_mode"));
m_fetchImagesInParseAndPaste = READBOOL(QStringLiteral("fetch_images_in_parse_and_paste"));
@ -64,6 +64,14 @@ void MarkdownEditorConfig::init(const QJsonObject &p_app, const QJsonObject &p_u
m_spellCheckEnabled = READBOOL(QStringLiteral("spell_check"));
m_editorOverriddenFontFamily = READSTR(QStringLiteral("editor_overridden_font_family"));
{
m_inplacePreviewSources = InplacePreviewSource::NoInplacePreview;
auto srcs = READSTR(QStringLiteral("inplace_preview_sources")).split(QLatin1Char(';'));
for (const auto &src : srcs) {
m_inplacePreviewSources |= stringToInplacePreviewSource(src);
}
}
}
QJsonObject MarkdownEditorConfig::toJson() const
@ -85,7 +93,7 @@ QJsonObject MarkdownEditorConfig::toJson() const
obj[QStringLiteral("section_number_style")] = sectionNumberStyleToString(m_sectionNumberStyle);
obj[QStringLiteral("constrain_image_width")] = m_constrainImageWidthEnabled;
obj[QStringLiteral("constrain_inplace_preview_width")] = m_constrainInPlacePreviewWidthEnabled;
obj[QStringLiteral("constrain_inplace_preview_width")] = m_constrainInplacePreviewWidthEnabled;
obj[QStringLiteral("zoom_factor_in_read_mode")] = m_zoomFactorInReadMode;
obj[QStringLiteral("fetch_images_in_parse_and_paste")] = m_fetchImagesInParseAndPaste;
obj[QStringLiteral("protect_from_xss")] = m_protectFromXss;
@ -97,6 +105,21 @@ QJsonObject MarkdownEditorConfig::toJson() const
obj[QStringLiteral("smart_table_interval")] = m_smartTableInterval;
obj[QStringLiteral("spell_check")] = m_spellCheckEnabled;
obj[QStringLiteral("editor_overridden_font_family")] = m_editorOverriddenFontFamily;
{
QStringList srcs;
if (m_inplacePreviewSources & InplacePreviewSource::ImageLink) {
srcs << inplacePreviewSourceToString(InplacePreviewSource::ImageLink);
}
if (m_inplacePreviewSources & InplacePreviewSource::CodeBlock) {
srcs << inplacePreviewSourceToString(InplacePreviewSource::CodeBlock);
}
if (m_inplacePreviewSources & InplacePreviewSource::Math) {
srcs << inplacePreviewSourceToString(InplacePreviewSource::Math);
}
obj[QStringLiteral("inplace_preview_sources")] = srcs.join(QLatin1Char(';'));
}
return obj;
}
@ -257,14 +280,14 @@ void MarkdownEditorConfig::setConstrainImageWidthEnabled(bool p_enabled)
updateConfig(m_constrainImageWidthEnabled, p_enabled, this);
}
bool MarkdownEditorConfig::getConstrainInPlacePreviewWidthEnabled() const
bool MarkdownEditorConfig::getConstrainInplacePreviewWidthEnabled() const
{
return m_constrainInPlacePreviewWidthEnabled;
return m_constrainInplacePreviewWidthEnabled;
}
void MarkdownEditorConfig::setConstrainInPlacePreviewWidthEnabled(bool p_enabled)
void MarkdownEditorConfig::setConstrainInplacePreviewWidthEnabled(bool p_enabled)
{
updateConfig(m_constrainInPlacePreviewWidthEnabled, p_enabled, this);
updateConfig(m_constrainInplacePreviewWidthEnabled, p_enabled, this);
}
qreal MarkdownEditorConfig::getZoomFactorInReadMode() const
@ -379,6 +402,37 @@ MarkdownEditorConfig::SectionNumberStyle MarkdownEditorConfig::stringToSectionNu
}
}
QString MarkdownEditorConfig::inplacePreviewSourceToString(InplacePreviewSource p_src) const
{
switch (p_src) {
case InplacePreviewSource::ImageLink:
return QStringLiteral("imagelink");
case InplacePreviewSource::CodeBlock:
return QStringLiteral("codeblock");
case InplacePreviewSource::Math:
return QStringLiteral("math");
default:
return "";
}
}
MarkdownEditorConfig::InplacePreviewSource MarkdownEditorConfig::stringToInplacePreviewSource(const QString &p_str) const
{
auto src = p_str.toLower();
if (src == QStringLiteral("imagelink")) {
return InplacePreviewSource::ImageLink;
} else if (src == QStringLiteral("codeblock")) {
return InplacePreviewSource::CodeBlock;
} else if (src == QStringLiteral("math")) {
return InplacePreviewSource::Math;
} else {
return InplacePreviewSource::NoInplacePreview;
}
}
MarkdownEditorConfig::SectionNumberMode MarkdownEditorConfig::getSectionNumberMode() const
{
return m_sectionNumberMode;
@ -443,3 +497,13 @@ void MarkdownEditorConfig::setEditorOverriddenFontFamily(const QString &p_family
{
updateConfig(m_editorOverriddenFontFamily, p_family, this);
}
MarkdownEditorConfig::InplacePreviewSources MarkdownEditorConfig::getInplacePreviewSources() const
{
return m_inplacePreviewSources;
}
void MarkdownEditorConfig::setInplacePreviewSources(InplacePreviewSources p_src)
{
updateConfig(m_inplacePreviewSources, p_src, this);
}

View File

@ -30,6 +30,15 @@ namespace vnotex
DigDotDig
};
enum InplacePreviewSource
{
NoInplacePreview = 0,
ImageLink = 0x1,
CodeBlock = 0x2,
Math = 0x4
};
Q_DECLARE_FLAGS(InplacePreviewSources, InplacePreviewSource);
MarkdownEditorConfig(ConfigMgr *p_mgr,
IConfig *p_topConfig,
const QSharedPointer<TextEditorConfig> &p_textEditorConfig);
@ -81,8 +90,8 @@ namespace vnotex
bool getConstrainImageWidthEnabled() const;
void setConstrainImageWidthEnabled(bool p_enabled);
bool getConstrainInPlacePreviewWidthEnabled() const;
void setConstrainInPlacePreviewWidthEnabled(bool p_enabled);
bool getConstrainInplacePreviewWidthEnabled() const;
void setConstrainInplacePreviewWidthEnabled(bool p_enabled);
qreal getZoomFactorInReadMode() const;
void setZoomFactorInReadMode(qreal p_factor);
@ -115,6 +124,9 @@ namespace vnotex
const QString &getEditorOverriddenFontFamily() const;
void setEditorOverriddenFontFamily(const QString &p_family);
InplacePreviewSources getInplacePreviewSources() const;
void setInplacePreviewSources(InplacePreviewSources p_src);
private:
QString sectionNumberModeToString(SectionNumberMode p_mode) const;
SectionNumberMode stringToSectionNumberMode(const QString &p_str) const;
@ -128,6 +140,9 @@ namespace vnotex
void loadExportResource(const QJsonObject &p_app, const QJsonObject &p_user);
QJsonObject saveExportResource() const;
QString inplacePreviewSourceToString(InplacePreviewSource p_src) const;
InplacePreviewSource stringToInplacePreviewSource(const QString &p_str) const;
QSharedPointer<TextEditorConfig> m_textEditorConfig;
WebResource m_viewerResource;
@ -171,7 +186,7 @@ namespace vnotex
bool m_constrainImageWidthEnabled = true;
// Whether enable in-place preview width constraint.
bool m_constrainInPlacePreviewWidthEnabled = false;
bool m_constrainInplacePreviewWidthEnabled = false;
qreal m_zoomFactorInReadMode = 1.0;
@ -203,7 +218,11 @@ namespace vnotex
// Font family to override the editor's theme.
QString m_editorOverriddenFontFamily;
InplacePreviewSources m_inplacePreviewSources = InplacePreviewSource::NoInplacePreview;
};
}
Q_DECLARE_OPERATORS_FOR_FLAGS(vnotex::MarkdownEditorConfig::InplacePreviewSources)
#endif // MARKDOWNEDITORCONFIG_H

View File

@ -330,7 +330,10 @@
"//comment" : "Time interval (milliseconds) to do smart table formatting",
"smart_table_interval" : 1000,
"spell_check" : true,
"editor_overridden_font_family" : ""
"editor_overridden_font_family" : "",
"//comment" : "Sources to enable inplace preview, separated by ;",
"//comment" : "imagelink/codeblock/math",
"inplace_preview_sources" : "imagelink;codeblock;math"
}
},
"widget" : {

View File

@ -69,7 +69,14 @@ void MarkdownEditorPage::loadInternal()
m_zoomFactorSpinBox->setValue(markdownConfig.getZoomFactorInReadMode());
m_constrainInPlacePreviewWidthCheckBox->setChecked(markdownConfig.getConstrainInPlacePreviewWidthEnabled());
m_constrainInplacePreviewWidthCheckBox->setChecked(markdownConfig.getConstrainInplacePreviewWidthEnabled());
{
auto srcs = markdownConfig.getInplacePreviewSources();
m_inplacePreviewSourceImageLinkCheckBox->setChecked(srcs & MarkdownEditorConfig::InplacePreviewSource::ImageLink);
m_inplacePreviewSourceCodeBlockCheckBox->setChecked(srcs & MarkdownEditorConfig::InplacePreviewSource::CodeBlock);
m_inplacePreviewSourceMathCheckBox->setChecked(srcs & MarkdownEditorConfig::InplacePreviewSource::Math);
}
m_fetchImagesToLocalCheckBox->setChecked(markdownConfig.getFetchImagesInParseAndPaste());
@ -134,7 +141,22 @@ void MarkdownEditorPage::saveInternal()
markdownConfig.setZoomFactorInReadMode(m_zoomFactorSpinBox->value());
markdownConfig.setConstrainInPlacePreviewWidthEnabled(m_constrainInPlacePreviewWidthCheckBox->isChecked());
markdownConfig.setConstrainInplacePreviewWidthEnabled(m_constrainInplacePreviewWidthCheckBox->isChecked());
{
MarkdownEditorConfig::InplacePreviewSources srcs = MarkdownEditorConfig::InplacePreviewSource::NoInplacePreview;
if (m_inplacePreviewSourceImageLinkCheckBox->isChecked()) {
srcs |= MarkdownEditorConfig::InplacePreviewSource::ImageLink;
}
if (m_inplacePreviewSourceCodeBlockCheckBox->isChecked()) {
srcs |= MarkdownEditorConfig::InplacePreviewSource::CodeBlock;
}
if (m_inplacePreviewSourceMathCheckBox->isChecked()) {
srcs |= MarkdownEditorConfig::InplacePreviewSource::Math;
}
markdownConfig.setInplacePreviewSources(srcs);
}
markdownConfig.setFetchImagesInParseAndPaste(m_fetchImagesToLocalCheckBox->isChecked());
@ -260,11 +282,31 @@ QGroupBox *MarkdownEditorPage::setupEditGroup()
{
const QString label(tr("Constrain in-place preview width"));
m_constrainInPlacePreviewWidthCheckBox = WidgetsFactory::createCheckBox(label, box);
m_constrainInPlacePreviewWidthCheckBox->setToolTip(tr("Constrain in-place preview width to the window"));
layout->addRow(m_constrainInPlacePreviewWidthCheckBox);
addSearchItem(label, m_constrainInPlacePreviewWidthCheckBox->toolTip(), m_constrainInPlacePreviewWidthCheckBox);
connect(m_constrainInPlacePreviewWidthCheckBox, &QCheckBox::stateChanged,
m_constrainInplacePreviewWidthCheckBox = WidgetsFactory::createCheckBox(label, box);
m_constrainInplacePreviewWidthCheckBox->setToolTip(tr("Constrain in-place preview width to the window"));
layout->addRow(m_constrainInplacePreviewWidthCheckBox);
addSearchItem(label, m_constrainInplacePreviewWidthCheckBox->toolTip(), m_constrainInplacePreviewWidthCheckBox);
connect(m_constrainInplacePreviewWidthCheckBox, &QCheckBox::stateChanged,
this, &MarkdownEditorPage::pageIsChanged);
}
{
auto srcLayout = new QVBoxLayout();
layout->addRow(tr("In-place preview sources:"), srcLayout);
m_inplacePreviewSourceImageLinkCheckBox = WidgetsFactory::createCheckBox(tr("Image link"), box);
srcLayout->addWidget(m_inplacePreviewSourceImageLinkCheckBox);
connect(m_inplacePreviewSourceImageLinkCheckBox, &QCheckBox::stateChanged,
this, &MarkdownEditorPage::pageIsChanged);
m_inplacePreviewSourceCodeBlockCheckBox = WidgetsFactory::createCheckBox(tr("Code block"), box);
srcLayout->addWidget(m_inplacePreviewSourceCodeBlockCheckBox);
connect(m_inplacePreviewSourceCodeBlockCheckBox, &QCheckBox::stateChanged,
this, &MarkdownEditorPage::pageIsChanged);
m_inplacePreviewSourceMathCheckBox = WidgetsFactory::createCheckBox(tr("Math"), box);
srcLayout->addWidget(m_inplacePreviewSourceMathCheckBox);
connect(m_inplacePreviewSourceMathCheckBox, &QCheckBox::stateChanged,
this, &MarkdownEditorPage::pageIsChanged);
}

View File

@ -40,7 +40,13 @@ namespace vnotex
QCheckBox *m_constrainImageWidthCheckBox = nullptr;
QCheckBox *m_constrainInPlacePreviewWidthCheckBox = nullptr;
QCheckBox *m_constrainInplacePreviewWidthCheckBox = nullptr;
QCheckBox *m_inplacePreviewSourceImageLinkCheckBox = nullptr;
QCheckBox *m_inplacePreviewSourceCodeBlockCheckBox = nullptr;
QCheckBox *m_inplacePreviewSourceMathCheckBox = nullptr;
QCheckBox *m_fetchImagesToLocalCheckBox = nullptr;

View File

@ -142,7 +142,7 @@ void PreviewHelper::codeBlocksUpdated(vte::TimeStamp p_timeStamp,
const QVector<vte::peg::FencedCodeBlock> &p_codeBlocks)
{
Q_UNUSED(p_timeStamp);
if (!m_inplacePreviewEnabled) {
if (!m_inplacePreviewCodeBlocksEnabled) {
return;
}
@ -180,7 +180,7 @@ void PreviewHelper::handleCodeBlocksUpdate()
m_tabStopWidth);
}
if (m_inplacePreviewEnabled && needPreview.first && !cacheHit) {
if (m_inplacePreviewCodeBlocksEnabled && needPreview.first && !cacheHit) {
m_codeBlocksData[blockPreviewIdx].m_text = cb.m_text;
needPreviewBlocks.push_back(blockPreviewIdx);
}
@ -354,7 +354,7 @@ void PreviewHelper::setMarkdownEditor(MarkdownEditor *p_editor)
void PreviewHelper::mathBlocksUpdated(const QVector<vte::peg::MathBlock> &p_mathBlocks)
{
if (!m_inplacePreviewEnabled || !isInplacePreviewSourceEnabled(SourceFlag::Math)) {
if (!m_inplacePreviewMathBlocksEnabled || !isInplacePreviewSourceEnabled(SourceFlag::Math)) {
return;
}
@ -528,3 +528,18 @@ bool PreviewHelper::needForcedBackground(const QString &p_lang) const
return false;
}
void PreviewHelper::setInplacePreviewSources(SourceFlags p_srcs)
{
m_inplacePreviewSources = p_srcs;
}
void PreviewHelper::setInplacePreviewCodeBlocksEnabled(bool p_enabled)
{
m_inplacePreviewCodeBlocksEnabled = p_enabled;
}
void PreviewHelper::setInplacePreviewMathBlocksEnabled(bool p_enabled)
{
m_inplacePreviewMathBlocksEnabled = p_enabled;
}

View File

@ -47,6 +47,12 @@ namespace vnotex
void setWebGraphvizEnabled(bool p_enabled);
void setInplacePreviewSources(SourceFlags p_srcs);
void setInplacePreviewCodeBlocksEnabled(bool p_enabled);
void setInplacePreviewMathBlocksEnabled(bool p_enabled);
public slots:
void codeBlocksUpdated(vte::TimeStamp p_timeStamp,
const QVector<vte::peg::FencedCodeBlock> &p_codeBlocks);
@ -201,7 +207,9 @@ namespace vnotex
// Need to init it in the constructor.
SourceFlags m_inplacePreviewSources;
bool m_inplacePreviewEnabled = true;
bool m_inplacePreviewCodeBlocksEnabled = true;
bool m_inplacePreviewMathBlocksEnabled = true;
TimeStamp m_codeBlockTimeStamp = 0;

View File

@ -179,8 +179,7 @@ void MarkdownViewWindow::handleEditorConfigChange()
if (markdownEditorConfig.revision() != m_markdownEditorConfigRevision) {
m_markdownEditorConfigRevision = markdownEditorConfig.revision();
m_previewHelper->setWebPlantUmlEnabled(markdownEditorConfig.getWebPlantUml());
m_previewHelper->setWebGraphvizEnabled(markdownEditorConfig.getWebGraphviz());
updatePreviewHelperFromConfig(markdownEditorConfig);
HtmlTemplateHelper::updateMarkdownViewerTemplate(markdownEditorConfig);
@ -792,7 +791,23 @@ QSharedPointer<vte::MarkdownEditorConfig> MarkdownViewWindow::createMarkdownEdit
auto editorConfig = QSharedPointer<vte::MarkdownEditorConfig>::create(textEditorConfig);
editorConfig->overrideTextFontFamily(p_config.getEditorOverriddenFontFamily());
editorConfig->m_constrainInPlacePreviewWidthEnabled = p_config.getConstrainInPlacePreviewWidthEnabled();
editorConfig->m_constrainInplacePreviewWidthEnabled = p_config.getConstrainInplacePreviewWidthEnabled();
{
auto srcs = p_config.getInplacePreviewSources();
vte::MarkdownEditorConfig::InplacePreviewSources editorSrcs = vte::MarkdownEditorConfig::NoInplacePreview;
if (srcs & MarkdownEditorConfig::InplacePreviewSource::ImageLink) {
editorSrcs |= vte::MarkdownEditorConfig::ImageLink;
}
if (srcs & MarkdownEditorConfig::InplacePreviewSource::CodeBlock) {
editorSrcs |= vte::MarkdownEditorConfig::CodeBlock;
}
if (srcs & MarkdownEditorConfig::InplacePreviewSource::Math) {
editorSrcs |= vte::MarkdownEditorConfig::Math;
}
editorConfig->m_inplacePreviewSources = editorSrcs;
}
return editorConfig;
}
@ -967,8 +982,7 @@ void MarkdownViewWindow::setupPreviewHelper()
m_previewHelper = new PreviewHelper(nullptr, this);
const auto &markdownEditorConfig = ConfigMgr::getInst().getEditorConfig().getMarkdownEditorConfig();
m_previewHelper->setWebPlantUmlEnabled(markdownEditorConfig.getWebPlantUml());
m_previewHelper->setWebGraphvizEnabled(markdownEditorConfig.getWebGraphviz());
updatePreviewHelperFromConfig(markdownEditorConfig);
PlantUmlHelper::getInst().init(markdownEditorConfig.getPlantUmlJar(),
markdownEditorConfig.getGraphvizExe(),
@ -976,6 +990,16 @@ void MarkdownViewWindow::setupPreviewHelper()
GraphvizHelper::getInst().init(markdownEditorConfig.getGraphvizExe());
}
void MarkdownViewWindow::updatePreviewHelperFromConfig(const MarkdownEditorConfig &p_config)
{
m_previewHelper->setWebPlantUmlEnabled(p_config.getWebPlantUml());
m_previewHelper->setWebGraphvizEnabled(p_config.getWebGraphviz());
const auto srcs = p_config.getInplacePreviewSources();
m_previewHelper->setInplacePreviewCodeBlocksEnabled(srcs & MarkdownEditorConfig::CodeBlock);
m_previewHelper->setInplacePreviewMathBlocksEnabled(srcs & MarkdownEditorConfig::Math);
}
void MarkdownViewWindow::applySnippet(const QString &p_name)
{
if (isReadMode()) {

View File

@ -145,6 +145,8 @@ namespace vnotex
bool isReadMode() const;
void updatePreviewHelperFromConfig(const MarkdownEditorConfig &p_config);
template <class T>
static QSharedPointer<Outline> headingsToOutline(const QVector<T> &p_headings);