X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/ced9de5b82046d6eb6f6b828fa9bbc874bbea857..2bdc5eff541c1e60fa197750e6aa73cee116beac:/src/views/dolphinview.cpp diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index d1e154f68..9a4b8633e 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -33,6 +33,8 @@ #include #include +#include +#include #include #include #include @@ -102,6 +104,7 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) : m_restoredContentsPosition(), m_selectedUrls(), m_clearSelectionBeforeSelectingNewItems(false), + m_markFirstNewlySelectedItemAsCurrent(false), m_versionControlObserver(0) { m_topLayout = new QVBoxLayout(this); @@ -809,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); } @@ -826,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()); } } @@ -1034,6 +1041,8 @@ void DolphinView::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* even m_clearSelectionBeforeSelectingNewItems = true; connect(op, SIGNAL(urlPasted(KUrl)), this, SLOT(slotUrlPasted(KUrl))); } + + setActive(true); } void DolphinView::slotModelChanged(KItemModelBase* current, KItemModelBase* previous) @@ -1070,7 +1079,13 @@ void DolphinView::slotMouseButtonPressed(int itemIndex, Qt::MouseButtons buttons void DolphinView::slotAboutToCreate(const KUrl::List& urls) { - m_selectedUrls << urls; + if (!urls.isEmpty()) { + if (m_markFirstNewlySelectedItemAsCurrent) { + markUrlAsCurrent(urls.first()); + m_markFirstNewlySelectedItemAsCurrent = false; + } + m_selectedUrls << urls; + } } void DolphinView::slotSelectionChanged(const QSet& current, const QSet& previous) @@ -1195,6 +1210,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) { @@ -1225,10 +1280,11 @@ void DolphinView::updateViewState() m_view->scrollToItem(currentIndex); m_scrollToCurrentItem = false; } + + m_currentItemUrl = KUrl(); } else { selectionManager->setCurrentItem(0); } - m_currentItemUrl = KUrl(); } if (!m_restoredContentsPosition.isNull()) { @@ -1533,6 +1589,7 @@ void DolphinView::pasteToUrl(const KUrl& url) KonqOperations* op = KonqOperations::doPasteV2(this, url); if (op) { m_clearSelectionBeforeSelectingNewItems = true; + m_markFirstNewlySelectedItemAsCurrent = true; connect(op, SIGNAL(aboutToCreate(KUrl::List)), this, SLOT(slotAboutToCreate(KUrl::List))); } }