Browse Source

QuickAccess: update VxUrl list when accessing or changing entries (#2642)

Ensure that the path is always displayed correctly when the QuickAccess list is
modified or read, to fix display inconsistencies caused by outdated VxUrl paths.
SchipsWong 2 months ago
parent
commit
782b99f723

+ 1 - 0
src/core/quickaccesshelper.cpp

@@ -12,6 +12,7 @@ void QuickAccessHelper::pinToQuickAccess(const QStringList &p_files)
     }
 
     auto &sessionConfig = ConfigMgr::getInst().getSessionConfig();
+    sessionConfig.tryCorrectQuickAccessFiles();
     auto qaFiles = sessionConfig.getQuickAccessFiles();
     qaFiles.append(p_files);
     qaFiles.removeDuplicates();

+ 83 - 0
src/core/sessionconfig.cpp

@@ -5,7 +5,12 @@
 #include <QJsonArray>
 #include <QJsonDocument>
 
+#include <core/vnotex.h>
+#include <core/notebookmgr.h>
+
 #include <utils/fileutils.h>
+#include <utils/pathutils.h>
+#include <utils/vxurlutils.h>
 
 #include "configmgr.h"
 #include "mainconfig.h"
@@ -462,15 +467,93 @@ void SessionConfig::setQuickAccessFiles(const QStringList &p_files)
         }
     }
     updateConfig(m_quickAccessFiles, files, this);
+    if(tryCorrectQuickAccessFiles())
+    {
+        update();
+    }
 }
 
 void SessionConfig::removeQuickAccessFile(const QString &p_file)
 {
     if (m_quickAccessFiles.removeOne(p_file)) {
+        tryCorrectQuickAccessFiles();
         update();
     }
 }
 
+bool SessionConfig::tryCorrectQuickAccessFiles(void)
+{
+    auto notebook = VNoteX::getInst().getNotebookMgr().getCurrentNotebook();
+    if (!notebook) {
+        return false;
+    }
+
+    QStringList oldResult = m_quickAccessFiles;
+    QStringList newResult;
+    for (const auto &file : m_quickAccessFiles) {
+        auto fi = file.trimmed();
+        if (fi.isEmpty()) {
+            continue;
+        }
+        // check absolute path
+        if (!file.startsWith("#")) {
+            if (QFileInfo(file).exists()) {
+                newResult << file;
+            }
+            continue;
+        }
+
+        // update VxURL if file path is changed
+        const QString rootPath = notebook->getRootFolderAbsolutePath();
+        QString signature = VxUrlUtils::getSignatureFromVxURL(file);
+        QString oldFilePath = VxUrlUtils::getFilePathFromVxURL(file);
+
+        // Start searching for the file from oldFilePath until reaching rootPath
+        QString newFilePath;
+        QString currentDir = PathUtils::parentDirPath(oldFilePath);
+        while (true) {
+            // make sure currentDir is under rootPath
+            if (!currentDir.startsWith(rootPath)) {
+                break;
+            }
+
+            newFilePath = VxUrlUtils::getFilePathFromSignature(currentDir, signature);
+            if (!newFilePath.isEmpty()) {
+                break;
+            }
+            // invalid path
+            if (currentDir.isEmpty() || QDir(currentDir).isRoot()) {
+                break;
+            }
+
+            currentDir = PathUtils::parentDirPath(currentDir);
+        }
+
+        // file deleted
+        if (newFilePath.isEmpty()) {
+            continue;
+        }
+        // file path not changed
+        if (oldFilePath == newFilePath) {
+            newResult << file;
+            continue;
+        }
+        // file path changed, but not exists
+        if (!QFileInfo(newFilePath).exists()) {
+            continue;
+        }
+        QString newVxURL = VxUrlUtils::generateVxURL(signature, newFilePath);
+        newResult << newVxURL;
+    }
+    newResult.removeDuplicates();
+    m_quickAccessFiles = newResult;
+
+    if (oldResult != newResult) {
+        return true;
+    }
+    return false;
+}
+
 void SessionConfig::loadExternalPrograms(const QJsonObject &p_session)
 {
     const auto arr = p_session.value(QStringLiteral("external_programs")).toArray();

+ 1 - 0
src/core/sessionconfig.h

@@ -159,6 +159,7 @@ namespace vnotex
         void setQuickAccessFiles(const QStringList &p_files);
 
         void removeQuickAccessFile(const QString &p_file);
+        bool tryCorrectQuickAccessFiles(void);
 
         const QVector<ExternalProgram> &getExternalPrograms() const;
         const ExternalProgram *findExternalProgram(const QString &p_name) const;

+ 4 - 1
src/widgets/toolbarhelper.cpp

@@ -486,7 +486,10 @@ void ToolBarHelper::addSpacer(QToolBar *p_toolBar)
 void ToolBarHelper::updateQuickAccessMenu(QMenu *p_menu)
 {
     p_menu->clear();
-    const auto &quickAccess = ConfigMgr::getInst().getSessionConfig().getQuickAccessFiles();
+    auto &sessionConfig = ConfigMgr::getInst().getSessionConfig();
+    sessionConfig.tryCorrectQuickAccessFiles();
+
+    const auto &quickAccess = sessionConfig.getQuickAccessFiles();
     if (quickAccess.isEmpty()) {
         auto act = p_menu->addAction(MainWindow::tr("Quick Access Not Set"));
         act->setEnabled(false);