From 6fe82d3db0f9dd7e1392e738afa7ae15191b0d26 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Fri, 20 Apr 2018 19:55:28 +0800 Subject: [PATCH] highlighter fix --- src/dialog/vsettingsdialog.cpp | 4 +-- src/hgmarkdownhighlighter.cpp | 64 ++++++++++++++++------------------ src/hgmarkdownhighlighter.h | 7 +++- src/vlistwidget.cpp | 12 +++++-- src/vmdeditor.cpp | 2 +- src/vpreviewmanager.cpp | 12 +++++-- 6 files changed, 59 insertions(+), 42 deletions(-) diff --git a/src/dialog/vsettingsdialog.cpp b/src/dialog/vsettingsdialog.cpp index fcfbd8f9..4b044d28 100644 --- a/src/dialog/vsettingsdialog.cpp +++ b/src/dialog/vsettingsdialog.cpp @@ -856,7 +856,7 @@ VMarkdownTab::VMarkdownTab(QWidget *p_parent) { // Default note open mode. m_openModeCombo = VUtils::getComboBox(); - m_openModeCombo->setToolTip(tr("Default mode to open a note")); + m_openModeCombo->setToolTip(tr("Default mode to open an internal note")); m_openModeCombo->addItem(tr("Read Mode"), (int)OpenFileMode::Read); m_openModeCombo->addItem(tr("Edit Mode"), (int)OpenFileMode::Edit); @@ -865,7 +865,7 @@ VMarkdownTab::VMarkdownTab(QWidget *p_parent) m_headingSequenceTypeCombo->setToolTip(tr("Enable auto sequence for all headings (in the form like 1.2.3.4.)")); m_headingSequenceTypeCombo->addItem(tr("Disabled"), (int)HeadingSequenceType::Disabled); m_headingSequenceTypeCombo->addItem(tr("Enabled"), (int)HeadingSequenceType::Enabled); - m_headingSequenceTypeCombo->addItem(tr("Enabled for notes only"), (int)HeadingSequenceType::EnabledNoteOnly); + m_headingSequenceTypeCombo->addItem(tr("Enabled for intrenal notes only"), (int)HeadingSequenceType::EnabledNoteOnly); m_headingSequenceLevelCombo = VUtils::getComboBox(); m_headingSequenceLevelCombo->setToolTip(tr("Base level to start heading sequence")); diff --git a/src/hgmarkdownhighlighter.cpp b/src/hgmarkdownhighlighter.cpp index febabe9b..a98f219a 100644 --- a/src/hgmarkdownhighlighter.cpp +++ b/src/hgmarkdownhighlighter.cpp @@ -36,6 +36,7 @@ HGMarkdownHighlighter::HGMarkdownHighlighter(const QVector &s m_blockHLResultReady(false), waitInterval(waitInterval), m_enableMathjax(false), + m_signalOut(false), content(NULL), capacity(0), result(NULL) @@ -82,15 +83,12 @@ HGMarkdownHighlighter::HGMarkdownHighlighter(const QVector &s startParseAndHighlight(false); }); - static const int completeWaitTime = 500; + const int completeWaitTime = 400; m_completeTimer = new QTimer(this); m_completeTimer->setSingleShot(true); m_completeTimer->setInterval(completeWaitTime); connect(m_completeTimer, &QTimer::timeout, - this, [this]() { - updateMathjaxBlocks(); - emit highlightCompleted(); - }); + this, &HGMarkdownHighlighter::completeHighlight); connect(document, &QTextDocument::contentsChange, this, &HGMarkdownHighlighter::handleContentChange); @@ -331,7 +329,6 @@ void HGMarkdownHighlighter::initImageRegionsFromResult() m_imageRegions.clear(); if (!result) { - emit imageLinksUpdated(m_imageRegions); return; } @@ -345,10 +342,6 @@ void HGMarkdownHighlighter::initImageRegionsFromResult() m_imageRegions.push_back(VElementRegion(elem->pos, elem->end)); elem = elem->next; } - - qDebug() << "highlighter: parse" << m_imageRegions.size() << "image regions"; - - emit imageLinksUpdated(m_imageRegions); } void HGMarkdownHighlighter::initVerbatimBlocksFromResult() @@ -383,7 +376,6 @@ void HGMarkdownHighlighter::initHeaderRegionsFromResult() m_headerRegions.clear(); if (!result) { - emit headersUpdated(m_headerRegions); return; } @@ -410,10 +402,6 @@ void HGMarkdownHighlighter::initHeaderRegionsFromResult() } std::sort(m_headerRegions.begin(), m_headerRegions.end()); - - qDebug() << "highlighter: parse" << m_headerRegions.size() << "header regions"; - - emit headersUpdated(m_headerRegions); } void HGMarkdownHighlighter::initBlockHighlihgtOne(unsigned long pos, @@ -756,7 +744,7 @@ void HGMarkdownHighlighter::highlightLinkWithSpacesInURL(const QString &p_text) } } -void HGMarkdownHighlighter::parse(bool p_fast) +void HGMarkdownHighlighter::parse() { if (!parsing.testAndSetRelaxed(0, 1)) { return; @@ -776,21 +764,19 @@ void HGMarkdownHighlighter::parse(bool p_fast) m_blockHLResultReady = true; - if (!p_fast) { - initHtmlCommentRegionsFromResult(); + initHtmlCommentRegionsFromResult(); - initImageRegionsFromResult(); + initImageRegionsFromResult(); - initHeaderRegionsFromResult(); + initHeaderRegionsFromResult(); - initVerbatimBlocksFromResult(); + initVerbatimBlocksFromResult(); - initInlineCodeRegionsFromResult(); + initInlineCodeRegionsFromResult(); - initBoldItalicRegionsFromResult(); + initBoldItalicRegionsFromResult(); - initLinkRegionsFromResult(); - } + initLinkRegionsFromResult(); if (result) { pmh_free_elements(result); @@ -834,6 +820,8 @@ void HGMarkdownHighlighter::handleContentChange(int /* position */, int charsRem return; } + m_signalOut = false; + timer->stop(); timer->start(); } @@ -841,17 +829,15 @@ void HGMarkdownHighlighter::handleContentChange(int /* position */, int charsRem void HGMarkdownHighlighter::startParseAndHighlight(bool p_fast) { qDebug() << "HGMarkdownHighlighter start a new parse (fast" << p_fast << ")"; - parse(p_fast); + parse(); - if (p_fast) { - rehighlight(); - } else { - if (!updateCodeBlocks()) { - rehighlight(); - } + m_signalOut = !p_fast; - highlightChanged(); + if (!p_fast) { + updateCodeBlocks(); } + + rehighlight(); } void HGMarkdownHighlighter::updateHighlight() @@ -1341,3 +1327,15 @@ bool HGMarkdownHighlighter::isValidMathjaxRegion(int p_blockNumber, return true; } + +void HGMarkdownHighlighter::completeHighlight() +{ + if (m_signalOut) { + m_signalOut = false; + updateMathjaxBlocks(); + emit imageLinksUpdated(m_imageRegions); + emit headersUpdated(m_headerRegions); + } + + emit highlightCompleted(); +} diff --git a/src/hgmarkdownhighlighter.h b/src/hgmarkdownhighlighter.h index d48bc723..2b61bc08 100644 --- a/src/hgmarkdownhighlighter.h +++ b/src/hgmarkdownhighlighter.h @@ -241,6 +241,8 @@ private slots: // @p_fast: if true, just parse and update styles. void startParseAndHighlight(bool p_fast = false); + void completeHighlight(); + private: struct HeaderBlockInfo { @@ -330,6 +332,9 @@ private: // Comment regions for each block. QHash> m_commentRegions; + // Whether need to signal out changes when highlight completes. + bool m_signalOut; + char *content; int capacity; pmh_element **result; @@ -347,7 +352,7 @@ private: // intended to complement this. void highlightLinkWithSpacesInURL(const QString &p_text); - void parse(bool p_fast = false); + void parse(); void parseInternal(); diff --git a/src/vlistwidget.cpp b/src/vlistwidget.cpp index e891aa3e..52b9093d 100644 --- a/src/vlistwidget.cpp +++ b/src/vlistwidget.cpp @@ -82,8 +82,16 @@ void VListWidget::resizeEvent(QResizeEvent *p_event) void VListWidget::handleSearchModeTriggered(bool p_inSearchMode, bool p_focus) { - setSearchInputVisible(p_inSearchMode); - if (!p_inSearchMode) { + if (p_inSearchMode) { + setSearchInputVisible(p_inSearchMode); + } else { + // Hiding search input will make QWebEngine get focus which will consume + // the Esc key sequence by mistake. + if (p_focus) { + setFocus(); + } + + setSearchInputVisible(p_inSearchMode); clearItemsHighlight(); } diff --git a/src/vmdeditor.cpp b/src/vmdeditor.cpp index 229c48b8..1b59df0d 100644 --- a/src/vmdeditor.cpp +++ b/src/vmdeditor.cpp @@ -496,7 +496,7 @@ void VMdEditor::updateHeaders(const QVector &p_headerRegions) << block.text(); } - if ((block.userState() == HighlightBlockState::Normal) + if ((block.userState() == HighlightBlockState::Header) && headerReg.exactMatch(block.text())) { int level = headerReg.cap(1).length(); VTableOfContentItem header(headerReg.cap(2).trimmed(), diff --git a/src/vpreviewmanager.cpp b/src/vpreviewmanager.cpp index 8dde8ba9..cb2c5b66 100644 --- a/src/vpreviewmanager.cpp +++ b/src/vpreviewmanager.cpp @@ -323,6 +323,7 @@ int VPreviewManager::calculateBlockMargin(const QTextBlock &p_block, int p_tabSt void VPreviewManager::updateBlockPreviewInfo(TS p_timeStamp, const QVector &p_imageLinks) { + QSet affectedBlocks; for (auto const & link : p_imageLinks) { QTextBlock block = m_document->findBlockByNumber(link.m_blockNumber); if (!block.isValid()) { @@ -345,16 +346,21 @@ void VPreviewManager::updateBlockPreviewInfo(TS p_timeStamp, !link.m_isBlock, name, m_editor->imageSize(name)); - blockData->insertPreviewInfo(info); - + bool tsUpdated = blockData->insertPreviewInfo(info); imageCache(PreviewSource::ImageLink).insert(name, p_timeStamp); + if (!tsUpdated) { + // No need to relayout the block if only timestamp is updated. + affectedBlocks.insert(link.m_blockNumber); + m_highlighter->addPossiblePreviewBlock(link.m_blockNumber); + } qDebug() << "block" << link.m_blockNumber << imageCache(PreviewSource::ImageLink).size() << blockData->toString(); } - // TODO: may need to call m_editor->update()? + m_editor->relayout(affectedBlocks); + m_editor->update(); } void VPreviewManager::updateBlockPreviewInfo(TS p_timeStamp,