bug-fix: try to fix the crash in CodeBlockPreviewInfo::updateInplacePreview()

This commit is contained in:
Le Tan 2018-04-28 21:37:26 +08:00
parent 9b114832f1
commit 5dbdcb8cba
4 changed files with 31 additions and 26 deletions

View File

@ -64,19 +64,19 @@ void CodeBlockPreviewInfo::updateInplacePreview(const VEditor *p_editor,
{ {
QTextBlock block = p_doc->findBlockByNumber(m_codeBlock.m_endBlock); QTextBlock block = p_doc->findBlockByNumber(m_codeBlock.m_endBlock);
if (block.isValid()) { if (block.isValid()) {
if (m_inplacePreview.isNull()) { VImageToPreview *preview = new VImageToPreview();
m_inplacePreview.reset(new VImageToPreview());
}
// m_image will be generated when signaling out. // m_image will be generated when signaling out.
m_inplacePreview->m_startPos = block.position(); preview->m_startPos = block.position();
m_inplacePreview->m_endPos = block.position() + block.length(); preview->m_endPos = block.position() + block.length();
m_inplacePreview->m_blockPos = block.position(); preview->m_blockPos = block.position();
m_inplacePreview->m_blockNumber = m_codeBlock.m_endBlock; preview->m_blockNumber = m_codeBlock.m_endBlock;
m_inplacePreview->m_padding = VPreviewManager::calculateBlockMargin(block, preview->m_padding = VPreviewManager::calculateBlockMargin(block,
p_editor->tabStopWidthW()); p_editor->tabStopWidthW());
m_inplacePreview->m_name = QString::number(getImageIndex()); preview->m_name = QString::number(getImageIndex());
m_inplacePreview->m_isBlock = true; preview->m_isBlock = true;
m_inplacePreview.reset(preview);
} else { } else {
m_inplacePreview->clear(); m_inplacePreview->clear();
} }
@ -158,7 +158,7 @@ void VLivePreviewHelper::updateCodeBlocks(const QVector<VCodeBlock> &p_codeBlock
} }
if (m_inplacePreviewEnabled if (m_inplacePreviewEnabled
&& !m_codeBlocks[idx].inplacePreviewReady()) { && (!cached || !m_codeBlocks[idx].inplacePreviewReady())) {
processForInplacePreview(idx); processForInplacePreview(idx);
manualInplacePreview = false; manualInplacePreview = false;
} }

View File

@ -83,6 +83,7 @@ public:
void setImageData(const QString &p_format, const QString &p_data) void setImageData(const QString &p_format, const QString &p_data)
{ {
m_imgDataBa.clear(); m_imgDataBa.clear();
m_inplacePreview.clear();
m_imgFormat = p_format; m_imgFormat = p_format;
m_imgData = p_data; m_imgData = p_data;
@ -91,6 +92,7 @@ public:
void setImageDataBa(const QString &p_format, const QByteArray &p_data) void setImageDataBa(const QString &p_format, const QByteArray &p_data)
{ {
m_imgData.clear(); m_imgData.clear();
m_inplacePreview.clear();
m_imgFormat = p_format; m_imgFormat = p_format;
m_imgDataBa = p_data; m_imgDataBa = p_data;

View File

@ -48,25 +48,25 @@ void MathjaxBlockPreviewInfo::updateInplacePreview(const VEditor *p_editor,
{ {
QTextBlock block = p_doc->findBlockByNumber(m_mathjaxBlock.m_blockNumber); QTextBlock block = p_doc->findBlockByNumber(m_mathjaxBlock.m_blockNumber);
if (block.isValid()) { if (block.isValid()) {
if (m_inplacePreview.isNull()) { VImageToPreview *preview = new VImageToPreview();
m_inplacePreview.reset(new VImageToPreview());
}
m_inplacePreview->m_startPos = block.position() + m_mathjaxBlock.m_index; preview->m_startPos = block.position() + m_mathjaxBlock.m_index;
m_inplacePreview->m_endPos = m_inplacePreview->m_startPos + m_mathjaxBlock.m_length; preview->m_endPos = preview->m_startPos + m_mathjaxBlock.m_length;
m_inplacePreview->m_blockPos = block.position(); preview->m_blockPos = block.position();
m_inplacePreview->m_blockNumber = m_mathjaxBlock.m_blockNumber; preview->m_blockNumber = m_mathjaxBlock.m_blockNumber;
m_inplacePreview->m_padding = VPreviewManager::calculateBlockMargin(block, preview->m_padding = VPreviewManager::calculateBlockMargin(block,
p_editor->tabStopWidthW()); p_editor->tabStopWidthW());
m_inplacePreview->m_name = QString::number(getImageIndex()); preview->m_name = QString::number(getImageIndex());
m_inplacePreview->m_isBlock = m_mathjaxBlock.m_previewedAsBlock; preview->m_isBlock = m_mathjaxBlock.m_previewedAsBlock;
if (hasImageDataBa()) { if (hasImageDataBa()) {
m_inplacePreview->m_image.loadFromData(m_imgDataBa, preview->m_image.loadFromData(m_imgDataBa,
m_imgFormat.toLocal8Bit().data()); m_imgFormat.toLocal8Bit().data());
} else { } else {
m_inplacePreview->m_image = QPixmap(); preview->m_image = QPixmap();
} }
m_inplacePreview.reset(preview);
} else { } else {
m_inplacePreview->clear(); m_inplacePreview->clear();
} }
@ -117,9 +117,11 @@ void VMathJaxInplacePreviewHelper::updateMathjaxBlocks(const QVector<VMathjaxBlo
int idx = 0; int idx = 0;
bool manualUpdate = true; bool manualUpdate = true;
for (auto const & vmb : p_blocks) { for (auto const & vmb : p_blocks) {
bool cached = false;
if (idx < m_mathjaxBlocks.size()) { if (idx < m_mathjaxBlocks.size()) {
MathjaxBlockPreviewInfo &mb = m_mathjaxBlocks[idx]; MathjaxBlockPreviewInfo &mb = m_mathjaxBlocks[idx];
if (mb.mathjaxBlock().equalContent(vmb)) { if (mb.mathjaxBlock().equalContent(vmb)) {
cached = true;
mb.updateNonContent(m_doc, m_editor, vmb); mb.updateNonContent(m_doc, m_editor, vmb);
} else { } else {
mb.setMathjaxBlock(vmb); mb.setMathjaxBlock(vmb);
@ -129,7 +131,7 @@ void VMathJaxInplacePreviewHelper::updateMathjaxBlocks(const QVector<VMathjaxBlo
} }
if (m_enabled if (m_enabled
&& !m_mathjaxBlocks[idx].inplacePreviewReady()) { && (!cached || !m_mathjaxBlocks[idx].inplacePreviewReady())) {
manualUpdate = false; manualUpdate = false;
processForInplacePreview(idx); processForInplacePreview(idx);
} }

View File

@ -56,6 +56,7 @@ public:
{ {
m_imgFormat = p_format; m_imgFormat = p_format;
m_imgDataBa = p_data; m_imgDataBa = p_data;
m_inplacePreview.clear();
} }
bool hasImageDataBa() const bool hasImageDataBa() const