Browse Source

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

Le Tan 7 years ago
parent
commit
5dbdcb8cba

+ 12 - 12
src/vlivepreviewhelper.cpp

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

+ 2 - 0
src/vlivepreviewhelper.h

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

+ 16 - 14
src/vmathjaxinplacepreviewhelper.cpp

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

+ 1 - 0
src/vmathjaxinplacepreviewhelper.h

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