diff --git a/src/vdirectory.cpp b/src/vdirectory.cpp index 64f4c37f..0d9a06b4 100644 --- a/src/vdirectory.cpp +++ b/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) { diff --git a/src/vdirectory.h b/src/vdirectory.h index 4375a7b1..cc102960 100644 --- a/src/vdirectory.h +++ b/src/vdirectory.h @@ -57,6 +57,7 @@ public: inline const VNotebook *getNotebook() const; inline const QVector &getFiles() const; inline QString retrivePath() const; + QString retriveBasePath() const; inline QString retriveRelativePath() const; inline QString getNotebookName() const; inline bool isExpanded() const; diff --git a/src/vdirectorytree.cpp b/src/vdirectorytree.cpp index c872bbbb..782ce222 100644 --- a/src/vdirectorytree.cpp +++ b/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 items = selectedItems(); diff --git a/src/vdirectorytree.h b/src/vdirectorytree.h index 678aaf9e..5e140dd7 100644 --- a/src/vdirectorytree.h +++ b/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 getVDirectory(QTreeWidgetItem *p_item); + inline QPointer 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 m_naviLabels; }; -inline QPointer VDirectoryTree::getVDirectory(QTreeWidgetItem *p_item) +inline QPointer VDirectoryTree::getVDirectory(QTreeWidgetItem *p_item) const { Q_ASSERT(p_item); return p_item->data(0, Qt::UserRole).value(); diff --git a/src/vfilelist.cpp b/src/vfilelist.cpp index df30a8d3..31238f24 100644 --- a/src/vfilelist.cpp +++ b/src/vfilelist.cpp @@ -1,5 +1,6 @@ #include #include +#include #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)); } diff --git a/src/vfilelist.h b/src/vfilelist.h index e4f40989..778d9f9c 100644 --- a/src/vfilelist.h +++ b/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.