From ac2552603bf95f25bd7ca130db862796f2039579 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Sun, 20 Nov 2016 21:48:07 +0800 Subject: [PATCH] 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 --- src/vedit.cpp | 68 +++++++++++++++++++++++++++++++++++++++ src/vedit.h | 6 ++++ src/vedittab.cpp | 2 +- src/vmdeditoperations.cpp | 4 +++ 4 files changed, 79 insertions(+), 1 deletion(-) diff --git a/src/vedit.cpp b/src/vedit.cpp index 8a579f72..024b247c 100644 --- a/src/vedit.cpp +++ b/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 images = VUtils::imagesFromMarkdownFile(QDir(noteFile->basePath).filePath(noteFile->fileName)); + + if (!m_insertedImages.isEmpty()) { + QVector 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(); +} diff --git a/src/vedit.h b/src/vedit.h index c27d3ffe..d726f504 100644 --- a/src/vedit.h +++ b/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 &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 headers; + QVector m_insertedImages; + QVector m_initImages; }; diff --git a/src/vedittab.cpp b/src/vedittab.cpp index 7b0451e8..2b92d41a 100644 --- a/src/vedittab.cpp +++ b/src/vedittab.cpp @@ -164,7 +164,7 @@ void VEditTab::readFile() return; } } - textEditor->setReadOnly(true); + textEditor->endEdit(); showFileReadMode(); } diff --git a/src/vmdeditoperations.cpp b/src/vmdeditoperations.cpp index f5259937..3a742a27 100644 --- a/src/vmdeditoperations.cpp +++ b/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)