From afcf8961f6666a912e0e6e5072a000837f7cf6aa Mon Sep 17 00:00:00 2001 From: Emmanuel Pescosta Date: Tue, 28 May 2013 17:31:14 +0200 Subject: [PATCH] Bug 196035 - middle clicking on archive files in dolphin does not open them in a new tab When 'browse through archives' is enabled, open archive files like folders on middle clicking, context menu -> new tab action and context menu -> new window action. BUG: 196035 REVIEW: 110487 --- dolphin/src/dolphincontextmenu.cpp | 9 ++++- dolphin/src/dolphinmainwindow.cpp | 10 +++--- dolphin/src/dolphinviewcontainer.cpp | 29 ++------------- dolphin/src/views/dolphinview.cpp | 54 +++++++++++++++++++++++++--- dolphin/src/views/dolphinview.h | 8 +++++ 5 files changed, 74 insertions(+), 36 deletions(-) diff --git a/dolphin/src/dolphincontextmenu.cpp b/dolphin/src/dolphincontextmenu.cpp index 4371bcdfd4..f668473346 100644 --- a/dolphin/src/dolphincontextmenu.cpp +++ b/dolphin/src/dolphincontextmenu.cpp @@ -235,12 +235,19 @@ void DolphinContextMenu::openItemContextMenu() this); addAction(openParentInNewTabAction); + addSeparator(); + } else if (!DolphinView::openItemAsFolderUrl(m_fileInfo).isEmpty()) { + // insert 'Open in new window' and 'Open in new tab' entries + addAction(m_mainWindow->actionCollection()->action("open_in_new_window")); + addAction(m_mainWindow->actionCollection()->action("open_in_new_tab")); + addSeparator(); } } else { bool selectionHasOnlyDirs = true; foreach (const KFileItem& item, m_selectedItems) { - if (!item.isDir()) { + const KUrl& url = DolphinView::openItemAsFolderUrl(item); + if (url.isEmpty()) { selectionHasOnlyDirs = false; break; } diff --git a/dolphin/src/dolphinmainwindow.cpp b/dolphin/src/dolphinmainwindow.cpp index 3b169a57da..73001bf54e 100644 --- a/dolphin/src/dolphinmainwindow.cpp +++ b/dolphin/src/dolphinmainwindow.cpp @@ -525,8 +525,9 @@ void DolphinMainWindow::openInNewTab() openNewTab(m_activeViewContainer->url()); } else { foreach (const KFileItem& item, list) { - if (item.isDir()) { - openNewTab(item.url()); + const KUrl& url = DolphinView::openItemAsFolderUrl(item); + if (!url.isEmpty()) { + openNewTab(url); } } } @@ -539,8 +540,9 @@ void DolphinMainWindow::openInNewWindow() const KFileItemList list = m_activeViewContainer->view()->selectedItems(); if (list.isEmpty()) { newWindowUrl = m_activeViewContainer->url(); - } else if ((list.count() == 1) && list[0].isDir()) { - newWindowUrl = list[0].url(); + } else if (list.count() == 1) { + const KFileItem& item = list.first(); + newWindowUrl = DolphinView::openItemAsFolderUrl(item); } if (!newWindowUrl.isEmpty()) { diff --git a/dolphin/src/dolphinviewcontainer.cpp b/dolphin/src/dolphinviewcontainer.cpp index 44d4ee36fc..71dc5fd7b5 100644 --- a/dolphin/src/dolphinviewcontainer.cpp +++ b/dolphin/src/dolphinviewcontainer.cpp @@ -482,37 +482,12 @@ void DolphinViewContainer::slotItemActivated(const KFileItem& item) // results in an active view. m_view->setActive(true); - KUrl url = item.targetUrl(); - - if (item.isDir()) { + const KUrl& url = DolphinView::openItemAsFolderUrl(item, GeneralSettings::browseThroughArchives()); + if (!url.isEmpty()) { m_view->setUrl(url); return; } - if (GeneralSettings::browseThroughArchives() && item.isFile() && url.isLocalFile()) { - // Generic mechanism for redirecting to tar:// when clicking on a tar file, - // zip:// when clicking on a zip file, etc. - // The .protocol file specifies the mimetype that the kioslave handles. - // Note that we don't use mimetype inheritance since we don't want to - // open OpenDocument files as zip folders... - const QString protocol = KProtocolManager::protocolForArchiveMimetype(item.mimetype()); - if (!protocol.isEmpty()) { - url.setProtocol(protocol); - m_view->setUrl(url); - return; - } - } - - if (item.mimetype() == QLatin1String("application/x-desktop")) { - // Redirect to the URL in Type=Link desktop files - KDesktopFile desktopFile(url.toLocalFile()); - if (desktopFile.hasLinkType()) { - url = desktopFile.readUrl(); - m_view->setUrl(url); - return; - } - } - item.run(); } diff --git a/dolphin/src/views/dolphinview.cpp b/dolphin/src/views/dolphinview.cpp index abf572fec8..6fadaa85c5 100644 --- a/dolphin/src/views/dolphinview.cpp +++ b/dolphin/src/views/dolphinview.cpp @@ -33,6 +33,8 @@ #include #include +#include +#include #include #include #include @@ -810,9 +812,10 @@ void DolphinView::slotItemsActivated(const QSet& indexes) while (it.hasNext()) { const int index = it.next(); KFileItem item = m_model->fileItem(index); + const KUrl& url = openItemAsFolderUrl(item); - if (item.isDir()) { // Open folders in new tabs - emit tabRequested(item.url()); + if (!url.isEmpty()) { // Open folders in new tabs + emit tabRequested(url); } else { items.append(item); } @@ -827,8 +830,11 @@ void DolphinView::slotItemsActivated(const QSet& indexes) void DolphinView::slotItemMiddleClicked(int index) { - const KFileItem item = m_model->fileItem(index); - if (item.isDir() || isTabsForFilesEnabled()) { + const KFileItem& item = m_model->fileItem(index); + const KUrl& url = openItemAsFolderUrl(item); + if (!url.isEmpty()) { + emit tabRequested(url); + } else if (isTabsForFilesEnabled()) { emit tabRequested(item.url()); } } @@ -1202,6 +1208,46 @@ QString DolphinView::viewPropertiesContext() const return m_viewPropertiesContext; } +KUrl DolphinView::openItemAsFolderUrl(const KFileItem& item, const bool browseThroughArchives) +{ + if (item.isNull()) { + return KUrl(); + } + + KUrl url = item.targetUrl(); + + if (item.isDir()) { + return url; + } + + if (item.isMimeTypeKnown()) { + const QString& mimetype = item.mimetype(); + + if (browseThroughArchives && item.isFile() && url.isLocalFile()) { + // Generic mechanism for redirecting to tar:// when clicking on a tar file, + // zip:// when clicking on a zip file, etc. + // The .protocol file specifies the mimetype that the kioslave handles. + // Note that we don't use mimetype inheritance since we don't want to + // open OpenDocument files as zip folders... + const QString& protocol = KProtocolManager::protocolForArchiveMimetype(mimetype); + if (!protocol.isEmpty()) { + url.setProtocol(protocol); + return url; + } + } + + if (mimetype == QLatin1String("application/x-desktop")) { + // Redirect to the URL in Type=Link desktop files + KDesktopFile desktopFile(url.toLocalFile()); + if (desktopFile.hasLinkType()) { + return desktopFile.readUrl(); + } + } + } + + return KUrl(); +} + void DolphinView::observeCreatedItem(const KUrl& url) { if (m_active) { diff --git a/dolphin/src/views/dolphinview.h b/dolphin/src/views/dolphinview.h index e50dffcd81..5a70c55022 100644 --- a/dolphin/src/views/dolphinview.h +++ b/dolphin/src/views/dolphinview.h @@ -304,6 +304,14 @@ public: void setViewPropertiesContext(const QString& context); QString viewPropertiesContext() const; + /** + * Checks if the given \a item can be opened as folder (e.g. archives). + * This function will also adjust the \a url (e.g. change the protocol). + * @return a valid and adjusted url if the item can be opened as folder, + * otherwise return an empty url. + */ + static KUrl openItemAsFolderUrl(const KFileItem& item, const bool browseThroughArchives = true); + public slots: /** * Changes the directory to \a url. If the current directory is equal to