Browse Source

preview: bug fix with no-update issue

Le Tan 7 years ago
parent
commit
99cf497ddc

+ 2 - 2
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

+ 22 - 12
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<ImageLinkInfo> &p_imageLinks)
 {
-    QSet<int> 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<QSharedPointer<VImageToPreview> > &p_images)
 {
-    QSet<int> 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<int> affectedBlocks;
+    OrderedIntSet affectedBlocks;
     QVector<int> obsoleteBlocks;
     const QSet<int> &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<int> &p_blocks)
         return;
     }
 
-    QSet<int> 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<int> &p_blocks)
 
             PreviewSource ps = static_cast<PreviewSource>(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);
+}

+ 2 - 0
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;

+ 4 - 3
src/vtextdocumentlayout.cpp

@@ -985,7 +985,7 @@ void VTextDocumentLayout::relayout()
     emit update(QRectF(0., 0., 1000000000., 1000000000.));
 }
 
-void VTextDocumentLayout::relayout(const QSet<int> &p_blocks)
+void VTextDocumentLayout::relayout(const OrderedIntSet &p_blocks)
 {
     if (p_blocks.isEmpty()) {
         return;
@@ -993,8 +993,9 @@ void VTextDocumentLayout::relayout(const QSet<int> &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);

+ 8 - 2
src/vtextdocumentlayout.h

@@ -4,13 +4,19 @@
 #include <QAbstractTextDocumentLayout>
 #include <QVector>
 #include <QSize>
-#include <QSet>
+#include <QMap>
+
 #include "vconstants.h"
 
 class VImageResourceManager2;
 struct VPreviewedImageInfo;
 struct VPreviewInfo;
 
+struct QMapDummyValue
+{
+};
+
+typedef QMap<int, QMapDummyValue> OrderedIntSet;
 
 class VTextDocumentLayout : public QAbstractTextDocumentLayout
 {
@@ -51,7 +57,7 @@ public:
     void relayout();
 
     // Relayout @p_blocks.
-    void relayout(const QSet<int> &p_blocks);
+    void relayout(const OrderedIntSet &p_blocks);
 
     void setImageLineColor(const QColor &p_color);
 

+ 30 - 2
src/vtextedit.cpp

@@ -5,7 +5,6 @@
 #include <QPainter>
 #include <QResizeEvent>
 
-#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<int> &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);

+ 8 - 2
src/vtextedit.h

@@ -5,7 +5,7 @@
 #include <QTextBlock>
 
 #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<int> &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: