Browse Source

delete notebook by deleting root directories

Le Tan 8 years ago
parent
commit
27b0d99965
4 changed files with 60 additions and 12 deletions
  1. 2 1
      src/dialog/vdeletenotebookdialog.cpp
  2. 35 9
      src/vnotebook.cpp
  3. 1 1
      src/vnotebook.h
  4. 22 1
      src/vnotebookselector.cpp

+ 2 - 1
src/dialog/vdeletenotebookdialog.cpp

@@ -111,7 +111,8 @@ void VDeleteNotebookDialog::notDeleteCheckChanged(int p_state)
                                   .arg(vconfig.c_dataTextStyle).arg(m_path));
     } else {
         m_warningLabel->setText(tr("<span style=\"%1\">WARNING</span>: "
-                                   "VNote will delete <b>ANY</b> files under directory <span style=\"%2\">%3</span>! "
+                                   "VNote may delete <b>ANY</b> files under directory <span style=\"%2\">%3</span>! "
+                                   "VNote will try to delete all the root directories within this notebook one by one. "
                                    "It may be UNRECOVERABLE!")
                                   .arg(vconfig.c_warningTextStyle).arg(vconfig.c_dataTextStyle).arg(m_path));
     }

+ 35 - 9
src/vnotebook.cpp

@@ -60,22 +60,48 @@ VNotebook *VNotebook::createNotebook(const QString &p_name, const QString &p_pat
     return nb;
 }
 
-void VNotebook::deleteNotebook(VNotebook *p_notebook, bool p_deleteFiles)
+bool VNotebook::deleteNotebook(VNotebook *p_notebook, bool p_deleteFiles)
 {
+    bool ret = true;
+
     if (!p_notebook) {
-        return;
+        return true;
     }
-    QString path = p_notebook->getPath();
-
-    p_notebook->close();
-    delete p_notebook;
 
     if (p_deleteFiles) {
-        QDir dir(path);
-        if (!dir.removeRecursively()) {
-            qWarning() << "fail to delete" << path;
+        if (!p_notebook->open()) {
+            qWarning() << "fail to open notebook" << p_notebook->getName()
+                       << "to delete";
+            ret = false;
+            goto exit;
+        }
+
+        VDirectory *rootDir = p_notebook->getRootDir();
+        QVector<VDirectory *> subdirs = rootDir->getSubDirs();
+        for (auto dir : subdirs) {
+            rootDir->deleteSubDirectory(dir);
+        }
+
+        // Delete the config file.
+        if (!VConfigManager::deleteDirectoryConfig(p_notebook->getPath())) {
+            ret = false;
+            goto exit;
+        }
+
+        // If it is now an empty directory, delete it.
+        QDir dir(p_notebook->getPath());
+        dir.cdUp();
+        if (!dir.rmdir(rootDir->getName())) {
+            qWarning() << "fail to delete notebook root directory" << rootDir->getName();
+            ret = false;
         }
     }
+
+exit:
+    p_notebook->close();
+    delete p_notebook;
+
+    return ret;
 }
 
 void VNotebook::rename(const QString &p_name)

+ 1 - 1
src/vnotebook.h

@@ -28,7 +28,7 @@ public:
 
     static VNotebook *createNotebook(const QString &p_name, const QString &p_path, bool p_import,
                                      QObject *p_parent = 0);
-    static void deleteNotebook(VNotebook *p_notebook, bool p_deleteFiles);
+    static bool deleteNotebook(VNotebook *p_notebook, bool p_deleteFiles);
 
 signals:
     void contentChanged();

+ 22 - 1
src/vnotebookselector.cpp

@@ -7,6 +7,8 @@
 #include <QGuiApplication>
 #include <QScreen>
 #include <QLabel>
+#include <QDesktopServices>
+#include <QUrl>
 #include "vnotebook.h"
 #include "vconfigmanager.h"
 #include "dialog/vnewnotebookdialog.h"
@@ -230,6 +232,8 @@ void VNotebookSelector::deleteNotebook()
 
 void VNotebookSelector::deleteNotebook(VNotebook *p_notebook, bool p_deleteFiles)
 {
+    V_ASSERT(p_notebook);
+
     int idx = indexOfNotebook(p_notebook);
 
     m_notebooks.remove(idx);
@@ -237,7 +241,24 @@ void VNotebookSelector::deleteNotebook(VNotebook *p_notebook, bool p_deleteFiles
 
     removeNotebookItem(idx);
 
-    VNotebook::deleteNotebook(p_notebook, p_deleteFiles);
+    QString name(p_notebook->getName());
+    QString path(p_notebook->getPath());
+    bool ret = VNotebook::deleteNotebook(p_notebook, p_deleteFiles);
+    if (!ret) {
+        // Notebook could not be deleted completely.
+        int cho = VUtils::showMessage(QMessageBox::Information, tr("Delete Notebook Folder From Disk"),
+                                      tr("Fail to delete the root folder of notebook "
+                                         "<span style=\"%1\">%2</span> from disk. You may open "
+                                         "the directory and check it manually.")
+                                        .arg(vconfig.c_dataTextStyle).arg(name), "",
+                                      QMessageBox::Open | QMessageBox::Ok,
+                                      QMessageBox::Ok, this);
+        if (cho == QMessageBox::Open) {
+            // Open the notebook location.
+            QUrl url = QUrl::fromLocalFile(path);
+            QDesktopServices::openUrl(url);
+        }
+    }
 }
 
 int VNotebookSelector::indexOfNotebook(const VNotebook *p_notebook)