From c50f76c40a1c704c46b6933c6be1ff0a927d3b90 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Sat, 19 Jun 2021 12:24:41 +0800 Subject: [PATCH] delay to preview after code/math blocks update to avoid blink --- src/widgets/editors/previewhelper.cpp | 38 ++++++++++++++++++++++++--- src/widgets/editors/previewhelper.h | 12 +++++++++ 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/widgets/editors/previewhelper.cpp b/src/widgets/editors/previewhelper.cpp index 9c837794..45143eae 100644 --- a/src/widgets/editors/previewhelper.cpp +++ b/src/widgets/editors/previewhelper.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -123,6 +124,19 @@ PreviewHelper::PreviewHelper(MarkdownEditor *p_editor, QObject *p_parent) m_mathBlockCache(100, nullptr) { setMarkdownEditor(p_editor); + + const int interval = 1000; + m_codeBlockTimer = new QTimer(this); + m_codeBlockTimer->setSingleShot(true); + m_codeBlockTimer->setInterval(interval); + connect(m_codeBlockTimer, &QTimer::timeout, + this, &PreviewHelper::handleCodeBlocksUpdate); + + m_mathBlockTimer = new QTimer(this); + m_mathBlockTimer->setSingleShot(true); + m_mathBlockTimer->setInterval(interval); + connect(m_mathBlockTimer, &QTimer::timeout, + this, &PreviewHelper::handleMathBlocksUpdate); } void PreviewHelper::codeBlocksUpdated(vte::TimeStamp p_timeStamp, @@ -133,13 +147,19 @@ void PreviewHelper::codeBlocksUpdated(vte::TimeStamp p_timeStamp, return; } + m_pendingCodeBlocks = p_codeBlocks; + m_codeBlockTimer->start(); +} + +void PreviewHelper::handleCodeBlocksUpdate() +{ ++m_codeBlockTimeStamp; m_codeBlocksData.clear(); QVector needPreviewBlocks; - for (int i = 0; i < p_codeBlocks.size(); ++i) { - const auto &cb = p_codeBlocks[i]; + for (int i = 0; i < m_pendingCodeBlocks.size(); ++i) { + const auto &cb = m_pendingCodeBlocks[i]; const auto needPreview = isLangNeedPreview(cb.m_lang); if (!needPreview.first && !needPreview.second) { @@ -172,6 +192,8 @@ void PreviewHelper::codeBlocksUpdated(vte::TimeStamp p_timeStamp, } updateEditorInplacePreviewCodeBlock(); + + m_pendingCodeBlocks.clear(); } bool PreviewHelper::checkPreviewSourceLang(SourceFlag p_flag, const QString &p_lang) const @@ -337,13 +359,19 @@ void PreviewHelper::mathBlocksUpdated(const QVector &p_math return; } + m_pendingMathBlocks = p_mathBlocks; + m_mathBlockTimer->start(); +} + +void PreviewHelper::handleMathBlocksUpdate() +{ ++m_mathBlockTimeStamp; m_mathBlocksData.clear(); - m_mathBlocksData.reserve(p_mathBlocks.size()); + m_mathBlocksData.reserve(m_pendingMathBlocks.size()); bool needUpdateEditorInplacePreview = true; - for (const auto &mb : p_mathBlocks) { + for (const auto &mb : m_pendingMathBlocks) { m_mathBlocksData.append(MathBlockPreviewData(mb)); const int blockPreviewIdx = m_mathBlocksData.size() - 1; @@ -368,6 +396,8 @@ void PreviewHelper::mathBlocksUpdated(const QVector &p_math if (needUpdateEditorInplacePreview) { updateEditorInplacePreviewMathBlock(); } + + m_pendingMathBlocks.clear(); } void PreviewHelper::inplacePreviewMathBlock(int p_blockPreviewIdx) diff --git a/src/widgets/editors/previewhelper.h b/src/widgets/editors/previewhelper.h index d539c751..06be1040 100644 --- a/src/widgets/editors/previewhelper.h +++ b/src/widgets/editors/previewhelper.h @@ -194,6 +194,10 @@ namespace vnotex bool needForcedBackground(const QString &p_lang) const; + void handleCodeBlocksUpdate(); + + void handleMathBlocksUpdate(); + MarkdownEditor *m_editor = nullptr; QTextDocument *m_document = nullptr; @@ -229,6 +233,14 @@ namespace vnotex bool m_webPlantUmlEnabled = true; bool m_webGraphvizEnabled = true; + + QVector m_pendingCodeBlocks; + + QTimer *m_codeBlockTimer = nullptr; + + QVector m_pendingMathBlocks; + + QTimer *m_mathBlockTimer = nullptr; }; }