Browse Source

clear unused images when finishing editing markdown

1. Clear existing images deleted by this edit;
2. Clear newly inserted images which were deleted before saving the
file;

Signed-off-by: Le Tan <[email protected]>
Le Tan 9 years ago
parent
commit
ac2552603b
4 changed files with 79 additions and 1 deletions
  1. 68 0
      src/vedit.cpp
  2. 6 0
      src/vedit.h
  3. 1 1
      src/vedittab.cpp
  4. 4 0
      src/vmdeditoperations.cpp

+ 68 - 0
src/vedit.cpp

@@ -6,6 +6,7 @@
 #include "hgmarkdownhighlighter.h"
 #include "vmdeditoperations.h"
 #include "vtoc.h"
+#include "utils/vutils.h"
 
 extern VConfigManager vconfig;
 
@@ -93,12 +94,21 @@ void VEdit::beginEdit()
     case DocType::Markdown:
         setFont(vconfig.getMdEditFont());
         setPlainText(noteFile->content);
+        initInitImages();
         break;
     default:
         qWarning() << "error: unknown doc type" << int(noteFile->docType);
     }
 }
 
+void VEdit::endEdit()
+{
+    setReadOnly(true);
+    if (noteFile->docType == DocType::Markdown) {
+        clearUnusedImages();
+    }
+}
+
 void VEdit::saveFile()
 {
     if (!document()->isModified()) {
@@ -218,3 +228,61 @@ void VEdit::updateCurHeader()
     }
     emit curHeaderChanged(curHeader);
 }
+
+void VEdit::insertImage(const QString &name)
+{
+    m_insertedImages.append(name);
+}
+
+void VEdit::initInitImages()
+{
+    m_initImages = VUtils::imagesFromMarkdownFile(QDir(noteFile->basePath).filePath(noteFile->fileName));
+}
+
+void VEdit::clearUnusedImages()
+{
+    QVector<QString> images = VUtils::imagesFromMarkdownFile(QDir(noteFile->basePath).filePath(noteFile->fileName));
+
+    if (!m_insertedImages.isEmpty()) {
+        QVector<QString> imageNames(images.size());
+        for (int i = 0; i < imageNames.size(); ++i) {
+            imageNames[i] = VUtils::fileNameFromPath(images[i]);
+        }
+
+        QDir dir = QDir(QDir(noteFile->basePath).filePath("images"));
+        for (int i = 0; i < m_insertedImages.size(); ++i) {
+            QString name = m_insertedImages[i];
+            int j;
+            for (j = 0; j < imageNames.size(); ++j) {
+                if (name == imageNames[j]) {
+                    break;
+                }
+            }
+
+            // Delete it
+            if (j == imageNames.size()) {
+                QString imagePath = dir.filePath(name);
+                QFile(imagePath).remove();
+                qDebug() << "delete inserted image" << imagePath;
+            }
+        }
+        m_insertedImages.clear();
+    }
+
+    for (int i = 0; i < m_initImages.size(); ++i) {
+        QString imagePath = m_initImages[i];
+        int j;
+        for (j = 0; j < images.size(); ++j) {
+            if (imagePath == images[j]) {
+                break;
+            }
+        }
+
+        // Delete it
+        if (j == images.size()) {
+            QFile(imagePath).remove();
+            qDebug() << "delete existing image" << imagePath;
+        }
+    }
+    m_initImages.clear();
+}

+ 6 - 0
src/vedit.h

@@ -17,6 +17,7 @@ public:
     VEdit(VNoteFile *noteFile, QWidget *parent = 0);
     ~VEdit();
     void beginEdit();
+    void endEdit();
 
     // Save buffer content to noteFile->content.
     void saveFile();
@@ -26,6 +27,7 @@ public:
 
     void reloadFile();
     void scrollToLine(int lineNumber);
+    void insertImage(const QString &name);
 
 signals:
     void headersChanged(const QVector<VHeader> &headers);
@@ -43,6 +45,8 @@ private slots:
 private:
     void updateTabSettings();
     void updateFontAndPalette();
+    void initInitImages();
+    void clearUnusedImages();
 
     bool isExpandTab;
     QString tabSpaces;
@@ -50,6 +54,8 @@ private:
     HGMarkdownHighlighter *mdHighlighter;
     VEditOperations *editOps;
     QVector<VHeader> headers;
+    QVector<QString> m_insertedImages;
+    QVector<QString> m_initImages;
 };
 
 

+ 1 - 1
src/vedittab.cpp

@@ -164,7 +164,7 @@ void VEditTab::readFile()
             return;
         }
     }
-    textEditor->setReadOnly(true);
+    textEditor->endEdit();
     showFileReadMode();
 }
 

+ 4 - 0
src/vmdeditoperations.cpp

@@ -55,6 +55,8 @@ void VMdEditOperations::insertImageFromQImage(const QString &title, const QStrin
 
     QString md = QString("![%1](images/%2)").arg(title).arg(fileName);
     insertTextAtCurPos(md);
+
+    editor->insertImage(fileName);
 }
 
 void VMdEditOperations::insertImageFromPath(const QString &title,
@@ -76,6 +78,8 @@ void VMdEditOperations::insertImageFromPath(const QString &title,
 
     QString md = QString("![%1](images/%2)").arg(title).arg(fileName);
     insertTextAtCurPos(md);
+
+    editor->insertImage(fileName);
 }
 
 bool VMdEditOperations::insertImageFromURL(const QUrl &imageUrl)