From 99cf497ddcde3759080df19098cbfa434a4f6e84 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Tue, 24 Apr 2018 07:52:43 +0800 Subject: [PATCH] preview: bug fix with no-update issue --- .../themes/v_native/v_native.palette | 4 +-- src/vpreviewmanager.cpp | 34 ++++++++++++------- src/vpreviewmanager.h | 2 ++ src/vtextdocumentlayout.cpp | 7 ++-- src/vtextdocumentlayout.h | 10 ++++-- src/vtextedit.cpp | 32 +++++++++++++++-- src/vtextedit.h | 10 ++++-- 7 files changed, 76 insertions(+), 23 deletions(-) diff --git a/src/resources/themes/v_native/v_native.palette b/src/resources/themes/v_native/v_native.palette index 744f7ba8..4db985c4 100644 --- a/src/resources/themes/v_native/v_native.palette +++ b/src/resources/themes/v_native/v_native.palette @@ -14,8 +14,8 @@ version=9 base_fg=#000000 base_bg=#F5F5F5 -title_fg=#000000 -title_bg=#DADBDB +title_fg=@base_fg +title_bg=transparent hover_fg=#000000 hover_bg=#C0C0C0 diff --git a/src/vpreviewmanager.cpp b/src/vpreviewmanager.cpp index cb2c5b66..55dd6f87 100644 --- a/src/vpreviewmanager.cpp +++ b/src/vpreviewmanager.cpp @@ -323,7 +323,7 @@ int VPreviewManager::calculateBlockMargin(const QTextBlock &p_block, int p_tabSt void VPreviewManager::updateBlockPreviewInfo(TS p_timeStamp, const QVector &p_imageLinks) { - QSet affectedBlocks; + OrderedIntSet affectedBlocks; for (auto const & link : p_imageLinks) { QTextBlock block = m_document->findBlockByNumber(link.m_blockNumber); if (!block.isValid()) { @@ -350,7 +350,7 @@ void VPreviewManager::updateBlockPreviewInfo(TS p_timeStamp, 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); + affectedBlocks.insert(link.m_blockNumber, QMapDummyValue()); m_highlighter->addPossiblePreviewBlock(link.m_blockNumber); } @@ -359,15 +359,14 @@ void VPreviewManager::updateBlockPreviewInfo(TS p_timeStamp, << blockData->toString(); } - m_editor->relayout(affectedBlocks); - m_editor->update(); + relayoutEditor(affectedBlocks); } void VPreviewManager::updateBlockPreviewInfo(TS p_timeStamp, PreviewSource p_source, const QVector > &p_images) { - QSet affectedBlocks; + OrderedIntSet affectedBlocks; for (auto const & img : p_images) { if (img.isNull()) { continue; @@ -397,14 +396,13 @@ void VPreviewManager::updateBlockPreviewInfo(TS p_timeStamp, imageCache(p_source).insert(name, p_timeStamp); if (!tsUpdated) { // No need to relayout the block if only timestamp is updated. - affectedBlocks.insert(img->m_blockNumber); + affectedBlocks.insert(img->m_blockNumber, QMapDummyValue()); m_highlighter->addPossiblePreviewBlock(img->m_blockNumber); } } // Relayout these blocks since they may not have been changed. - m_editor->relayout(affectedBlocks); - m_editor->update(); + relayoutEditor(affectedBlocks); } void VPreviewManager::clearObsoleteImages(long long p_timeStamp, PreviewSource p_source) @@ -424,7 +422,7 @@ void VPreviewManager::clearObsoleteImages(long long p_timeStamp, PreviewSource p void VPreviewManager::clearBlockObsoletePreviewInfo(long long p_timeStamp, PreviewSource p_source) { - QSet affectedBlocks; + OrderedIntSet affectedBlocks; QVector obsoleteBlocks; const QSet &blocks = m_highlighter->getPossiblePreviewBlocks(); for (auto i : blocks) { @@ -440,7 +438,7 @@ void VPreviewManager::clearBlockObsoletePreviewInfo(long long p_timeStamp, } if (blockData->clearObsoletePreview(p_timeStamp, p_source)) { - affectedBlocks.insert(i); + affectedBlocks.insert(i, QMapDummyValue()); } if (blockData->getPreviews().isEmpty()) { @@ -501,7 +499,7 @@ void VPreviewManager::checkBlocksForObsoletePreview(const QList &p_blocks) return; } - QSet affectedBlocks; + OrderedIntSet affectedBlocks; for (auto i : p_blocks) { QTextBlock block = m_document->findBlockByNumber(i); if (!block.isValid()) { @@ -524,10 +522,22 @@ void VPreviewManager::checkBlocksForObsoletePreview(const QList &p_blocks) PreviewSource ps = static_cast(i); if (blockData->clearObsoletePreview(timeStamp(ps), ps)) { - affectedBlocks.insert(i); + affectedBlocks.insert(i, QMapDummyValue()); } } } m_editor->relayout(affectedBlocks); } + +void VPreviewManager::relayoutEditor(const OrderedIntSet &p_blocks) +{ + OrderedIntSet bs(p_blocks); + int first, last; + m_editor->visibleBlockRange(first, last); + for (int i = first; i <= last; ++i) { + bs.insert(i, QMapDummyValue()); + } + + m_editor->relayout(bs); +} diff --git a/src/vpreviewmanager.h b/src/vpreviewmanager.h index 0445a95b..2e3d7cf3 100644 --- a/src/vpreviewmanager.h +++ b/src/vpreviewmanager.h @@ -180,6 +180,8 @@ private: TS &timeStamp(PreviewSource p_source); + void relayoutEditor(const OrderedIntSet &p_blocks); + VMdEditor *m_editor; QTextDocument *m_document; diff --git a/src/vtextdocumentlayout.cpp b/src/vtextdocumentlayout.cpp index 7b47491e..022a15c6 100644 --- a/src/vtextdocumentlayout.cpp +++ b/src/vtextdocumentlayout.cpp @@ -985,7 +985,7 @@ void VTextDocumentLayout::relayout() emit update(QRectF(0., 0., 1000000000., 1000000000.)); } -void VTextDocumentLayout::relayout(const QSet &p_blocks) +void VTextDocumentLayout::relayout(const OrderedIntSet &p_blocks) { if (p_blocks.isEmpty()) { return; @@ -993,8 +993,9 @@ void VTextDocumentLayout::relayout(const QSet &p_blocks) QTextDocument *doc = document(); - for (auto bn : p_blocks) { - QTextBlock block = doc->findBlockByNumber(bn); + // Need to relayout and update blocks in ascending order. + for (auto bn = p_blocks.keyBegin(); bn != p_blocks.keyEnd(); ++bn) { + QTextBlock block = doc->findBlockByNumber(*bn); if (block.isValid()) { clearBlockLayout(block); layoutBlock(block); diff --git a/src/vtextdocumentlayout.h b/src/vtextdocumentlayout.h index f0de9df7..b46ea3a7 100644 --- a/src/vtextdocumentlayout.h +++ b/src/vtextdocumentlayout.h @@ -4,13 +4,19 @@ #include #include #include -#include +#include + #include "vconstants.h" class VImageResourceManager2; struct VPreviewedImageInfo; struct VPreviewInfo; +struct QMapDummyValue +{ +}; + +typedef QMap OrderedIntSet; class VTextDocumentLayout : public QAbstractTextDocumentLayout { @@ -51,7 +57,7 @@ public: void relayout(); // Relayout @p_blocks. - void relayout(const QSet &p_blocks); + void relayout(const OrderedIntSet &p_blocks); void setImageLineColor(const QColor &p_color); diff --git a/src/vtextedit.cpp b/src/vtextedit.cpp index 9598714e..175c977e 100644 --- a/src/vtextedit.cpp +++ b/src/vtextedit.cpp @@ -5,7 +5,6 @@ #include #include -#include "vtextdocumentlayout.h" #include "vimageresourcemanager2.h" #define VIRTUAL_CURSOR_BLOCK_WIDTH 8 @@ -286,6 +285,22 @@ QTextBlock VTextEdit::firstVisibleBlock() const return document()->findBlockByNumber(blockNumber); } +QTextBlock VTextEdit::lastVisibleBlock() const +{ + VTextDocumentLayout *layout = getLayout(); + Q_ASSERT(layout); + int blockNumber = layout->findBlockByPosition(QPointF(0, -contentOffsetY() + contentsRect().height())); + return document()->findBlockByNumber(blockNumber); +} + +void VTextEdit::visibleBlockRange(int &p_first, int &p_last) const +{ + VTextDocumentLayout *layout = getLayout(); + Q_ASSERT(layout); + p_first = layout->findBlockByPosition(QPointF(0, -contentOffsetY())); + p_last = layout->findBlockByPosition(QPointF(0, -contentOffsetY() + contentsRect().height())); +} + int VTextEdit::contentOffsetY() const { QScrollBar *sb = verticalScrollBar(); @@ -299,11 +314,24 @@ void VTextEdit::clearBlockImages() getLayout()->relayout(); } -void VTextEdit::relayout(const QSet &p_blocks) +void VTextEdit::relayout(const OrderedIntSet &p_blocks) { getLayout()->relayout(p_blocks); } +void VTextEdit::relayoutVisibleBlocks() +{ + int first, last; + visibleBlockRange(first, last); + OrderedIntSet blocks; + + for (int i = first; i <= last; ++i) { + blocks.insert(i, QMapDummyValue()); + } + + getLayout()->relayout(blocks); +} + bool VTextEdit::containsImage(const QString &p_imageName) const { return m_imageMgr->contains(p_imageName); diff --git a/src/vtextedit.h b/src/vtextedit.h index c17b525d..daba93b3 100644 --- a/src/vtextedit.h +++ b/src/vtextedit.h @@ -5,7 +5,7 @@ #include #include "vlinenumberarea.h" -#include "vconstants.h" +#include "vtextdocumentlayout.h" class VTextDocumentLayout; class QPainter; @@ -35,6 +35,10 @@ public: QTextBlock firstVisibleBlock() const; + QTextBlock lastVisibleBlock() const; + + void visibleBlockRange(int &p_first, int &p_last) const; + void clearBlockImages(); // Whether the resoruce manager contains image of name @p_imageName. @@ -55,7 +59,7 @@ public: void setImageLineColor(const QColor &p_color); - void relayout(const QSet &p_blocks); + void relayout(const OrderedIntSet &p_blocks); void setCursorBlockMode(CursorBlock p_mode); @@ -65,6 +69,8 @@ public: void relayout(); + void relayoutVisibleBlocks(); + void setDisplayScaleFactor(qreal p_factor); protected: