preview: bug fix with no-update issue

This commit is contained in:
Le Tan 2018-04-24 07:52:43 +08:00
parent 16399ded29
commit 99cf497ddc
7 changed files with 76 additions and 23 deletions

View File

@ -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

View File

@ -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);
}

View File

@ -180,6 +180,8 @@ private:
TS &timeStamp(PreviewSource p_source);
void relayoutEditor(const OrderedIntSet &p_blocks);
VMdEditor *m_editor;
QTextDocument *m_document;

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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: