diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -193,7 +193,10 @@ const KFileItemListProperties& selectedItemsProps = selectedItemsProperties(); if (m_selectedItems.count() == 1) { - if (m_fileInfo.isDir()) { + if (m_fileInfo.isLink()) { + addAction(m_mainWindow->actionCollection()->action(QStringLiteral("show_original"))); + addSeparator(); + } else if (m_fileInfo.isDir()) { // setup 'Create New' menu DolphinNewFileMenu* newFileMenu = new DolphinNewFileMenu(m_mainWindow->actionCollection(), m_mainWindow); const DolphinView* view = m_mainWindow->activeViewContainer()->view(); diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -51,6 +51,7 @@ #include #include #include +#include #include #include #include @@ -69,6 +70,7 @@ #include #include #include +#include #include #include #include @@ -1213,6 +1215,24 @@ actionCollection()->setDefaultShortcuts(activatePrevTab, prevTabKeys); // for context menu + QAction* showOriginal = actionCollection()->addAction(QStringLiteral("show_original")); + showOriginal->setText(i18nc("@action:inmenu", "Show Original")); + showOriginal->setIcon(QIcon::fromTheme(QStringLiteral("document-open-folder"))); + showOriginal->setEnabled(false); + connect(showOriginal, &QAction::triggered, [this]() { + const auto link = m_activeViewContainer->view()->selectedItems().at(0); + const auto linkLocationDir = QFileInfo(link.localPath()).absoluteDir(); + auto linkDestination = link.linkDest(); + if (QFileInfo(linkDestination).isRelative()) + linkDestination = linkLocationDir.filePath(linkDestination); + if (QFileInfo(linkDestination).exists()) { + KIO::highlightInFileManager({QUrl::fromLocalFile(linkDestination).adjusted(QUrl::StripTrailingSlash)}); + } else { + m_activeViewContainer->showMessage( + i18n("Could not access \"%1\".").arg(linkDestination), DolphinViewContainer::Warning); + } + }); + QAction* openInNewTab = actionCollection()->addAction(QStringLiteral("open_in_new_tab")); openInNewTab->setText(i18nc("@action:inmenu", "Open in New Tab")); openInNewTab->setIcon(QIcon::fromTheme(QStringLiteral("tab-new"))); @@ -1373,11 +1393,12 @@ stateChanged(QStringLiteral("has_selection")); KActionCollection* col = actionCollection(); - QAction* renameAction = col->action(KStandardAction::name(KStandardAction::RenameFile)); - QAction* moveToTrashAction = col->action(KStandardAction::name(KStandardAction::MoveToTrash)); - QAction* deleteAction = col->action(KStandardAction::name(KStandardAction::DeleteFile)); - QAction* cutAction = col->action(KStandardAction::name(KStandardAction::Cut)); + QAction* renameAction = col->action(KStandardAction::name(KStandardAction::RenameFile)); + QAction* moveToTrashAction = col->action(KStandardAction::name(KStandardAction::MoveToTrash)); + QAction* deleteAction = col->action(KStandardAction::name(KStandardAction::DeleteFile)); + QAction* cutAction = col->action(KStandardAction::name(KStandardAction::Cut)); QAction* deleteWithTrashShortcut = col->action(QStringLiteral("delete_shortcut")); // see DolphinViewActionHandler + QAction* showOriginal = col->action(QStringLiteral("show_original")); KFileItemListProperties capabilities(list); const bool enableMoveToTrash = capabilities.isLocal() && capabilities.supportsMoving(); @@ -1387,6 +1408,7 @@ deleteAction->setEnabled(capabilities.supportsDeleting()); deleteWithTrashShortcut->setEnabled(capabilities.supportsDeleting() && !enableMoveToTrash); cutAction->setEnabled(capabilities.supportsMoving()); + showOriginal->setEnabled(list.at(0).isLink()); } } diff --git a/src/dolphinui.rc b/src/dolphinui.rc --- a/src/dolphinui.rc +++ b/src/dolphinui.rc @@ -1,5 +1,5 @@ - + @@ -12,6 +12,8 @@ + +