Browse Source

add Open File Location in directory tree and file list

Le Tan 8 years ago
parent
commit
03c0fdc49d
6 changed files with 48 additions and 5 deletions
  1. 5 0
      src/vdirectory.cpp
  2. 1 0
      src/vdirectory.h
  3. 14 0
      src/vdirectorytree.cpp
  4. 4 2
      src/vdirectorytree.h
  5. 22 3
      src/vfilelist.cpp
  6. 2 0
      src/vfilelist.h

+ 5 - 0
src/vdirectory.cpp

@@ -72,6 +72,11 @@ void VDirectory::close()
     m_opened = false;
 }
 
+QString VDirectory::retriveBasePath() const
+{
+    return VUtils::basePathFromPath(retrivePath());
+}
+
 QString VDirectory::retrivePath(const VDirectory *p_dir) const
 {
     if (!p_dir) {

+ 1 - 0
src/vdirectory.h

@@ -57,6 +57,7 @@ public:
     inline const VNotebook *getNotebook() const;
     inline const QVector<VFile *> &getFiles() const;
     inline QString retrivePath() const;
+    QString retriveBasePath() const;
     inline QString retriveRelativePath() const;
     inline QString getNotebookName() const;
     inline bool isExpanded() const;

+ 14 - 0
src/vdirectorytree.cpp

@@ -73,6 +73,11 @@ void VDirectoryTree::initActions()
     pasteAct->setToolTip(tr("Paste directories under this directory"));
     connect(pasteAct, &QAction::triggered,
             this, &VDirectoryTree::pasteDirectoriesInCurDir);
+
+    m_openLocationAct = new QAction(tr("&Open Directory Location"), this);
+    m_openLocationAct->setToolTip(tr("Open the folder containing this directory in operating system"));
+    connect(m_openLocationAct, &QAction::triggered,
+            this, &VDirectoryTree::openDirectoryLocation);
 }
 
 void VDirectoryTree::setNotebook(VNotebook *p_notebook)
@@ -306,6 +311,7 @@ void VDirectoryTree::contextMenuRequested(QPoint pos)
 
     if (item) {
         menu.addSeparator();
+        menu.addAction(m_openLocationAct);
         menu.addAction(dirInfoAct);
     }
 
@@ -466,6 +472,14 @@ void VDirectoryTree::editDirectoryInfo()
     } while (true);
 }
 
+void VDirectoryTree::openDirectoryLocation() const
+{
+    QTreeWidgetItem *curItem = currentItem();
+    V_ASSERT(curItem);
+    QUrl url = QUrl::fromLocalFile(getVDirectory(curItem)->retriveBasePath());
+    QDesktopServices::openUrl(url);
+}
+
 void VDirectoryTree::copySelectedDirectories(bool p_cut)
 {
     QList<QTreeWidgetItem *> items = selectedItems();

+ 4 - 2
src/vdirectorytree.h

@@ -51,6 +51,7 @@ private slots:
     void copySelectedDirectories(bool p_cut = false);
     void cutSelectedDirectories();
     void pasteDirectoriesInCurDir();
+    void openDirectoryLocation() const;
 
 protected:
     void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
@@ -66,7 +67,7 @@ private:
     // Find the corresponding item of @p_dir;
     // Return's NULL if no item is found and it is the root directory if @p_widget is true.
     QTreeWidgetItem *findVDirectory(const VDirectory *p_dir, bool &p_widget);
-    inline QPointer<VDirectory> getVDirectory(QTreeWidgetItem *p_item);
+    inline QPointer<VDirectory> getVDirectory(QTreeWidgetItem *p_item) const;
     void copyDirectoryInfoToClipboard(const QJsonArray &p_dirs, bool p_cut);
     void pasteDirectories(VDirectory *p_destDir);
     bool copyDirectory(VDirectory *p_destDir, const QString &p_destName,
@@ -96,6 +97,7 @@ private:
     QAction *copyAct;
     QAction *cutAct;
     QAction *pasteAct;
+    QAction *m_openLocationAct;
 
     // Navigation Mode.
     // Map second key to QTreeWidgetItem.
@@ -103,7 +105,7 @@ private:
     QVector<QLabel *> m_naviLabels;
 };
 
-inline QPointer<VDirectory> VDirectoryTree::getVDirectory(QTreeWidgetItem *p_item)
+inline QPointer<VDirectory> VDirectoryTree::getVDirectory(QTreeWidgetItem *p_item) const
 {
     Q_ASSERT(p_item);
     return p_item->data(0, Qt::UserRole).value<VDirectory *>();

+ 22 - 3
src/vfilelist.cpp

@@ -1,5 +1,6 @@
 #include <QtDebug>
 #include <QtWidgets>
+#include <QUrl>
 #include "vfilelist.h"
 #include "vconfigmanager.h"
 #include "dialog/vnewfiledialog.h"
@@ -79,6 +80,11 @@ void VFileList::initActions()
     pasteAct->setToolTip(tr("Paste notes in current directory"));
     connect(pasteAct, &QAction::triggered,
             this, &VFileList::pasteFilesInCurDir);
+
+    m_openLocationAct = new QAction(tr("&Open Note Location"), this);
+    m_openLocationAct->setToolTip(tr("Open the folder containing this note in operating system"));
+    connect(m_openLocationAct, &QAction::triggered,
+            this, &VFileList::openFileLocation);
 }
 
 void VFileList::setDirectory(VDirectory *p_directory)
@@ -112,10 +118,18 @@ void VFileList::updateFileList()
 void VFileList::fileInfo()
 {
     QListWidgetItem *curItem = fileList->currentItem();
-    Q_ASSERT(curItem);
+    V_ASSERT(curItem);
     fileInfo(getVFile(curItem));
 }
 
+void VFileList::openFileLocation() const
+{
+    QListWidgetItem *curItem = fileList->currentItem();
+    V_ASSERT(curItem);
+    QUrl url = QUrl::fromLocalFile(getVFile(curItem)->retriveBasePath());
+    QDesktopServices::openUrl(url);
+}
+
 void VFileList::fileInfo(VFile *p_file)
 {
     if (!p_file) {
@@ -297,10 +311,15 @@ void VFileList::contextMenuRequested(QPoint pos)
         menu.addAction(pasteAct);
     }
 
-    if (item && fileList->selectedItems().size() == 1) {
+    if (item) {
         menu.addSeparator();
-        menu.addAction(fileInfoAct);
+        menu.addAction(m_openLocationAct);
+
+        if (fileList->selectedItems().size() == 1) {
+            menu.addAction(fileInfoAct);
+        }
     }
+
     menu.exec(fileList->mapToGlobal(pos));
 }
 

+ 2 - 0
src/vfilelist.h

@@ -49,6 +49,7 @@ private slots:
     void contextMenuRequested(QPoint pos);
     void handleItemClicked(QListWidgetItem *currentItem);
     void fileInfo();
+    void openFileLocation() const;
     // m_copiedFiles will keep the files's VFile.
     void copySelectedFiles(bool p_isCut = false);
     void cutSelectedFiles();
@@ -93,6 +94,7 @@ private:
     QAction *copyAct;
     QAction *cutAct;
     QAction *pasteAct;
+    QAction *m_openLocationAct;
 
     // Navigation Mode.
     // Map second key to QListWidgetItem.