X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/e5eae108ca4511be9dae5f8bb4a4e1fbb0d89c7a..f1e9a8b35aaf972541d697f8c7555a7d3151c4fe:/src/dolphinviewcontainer.cpp diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp index 53b1c7529..2fb7565f1 100644 --- a/src/dolphinviewcontainer.cpp +++ b/src/dolphinviewcontainer.cpp @@ -21,13 +21,13 @@ #include #include -#include #include #include #include #include #include +#include #include #include #include @@ -47,26 +47,29 @@ #include #include -#include "dolphinmodel.h" -#include "dolphincolumnview.h" -#include "dolphincontroller.h" +#include "dolphin_generalsettings.h" #include "dolphinmainwindow.h" -#include "dolphindirlister.h" -#include "dolphinsortfilterproxymodel.h" -#include "dolphindetailsview.h" -#include "dolphiniconsview.h" -#include "draganddrophelper.h" -#include "filterbar.h" -#include "statusbar/dolphinstatusbar.h" -#include "viewproperties.h" +#include "filterbar/filterbar.h" +#include "search/dolphinsearchbox.h" #include "settings/dolphinsettings.h" -#include "dolphin_generalsettings.h" +#include "statusbar/dolphinstatusbar.h" +#include "views/dolphincolumnview.h" +#include "views/dolphindetailsview.h" +#include "views/dolphindirlister.h" +#include "views/dolphinsortfilterproxymodel.h" +#include "views/draganddrophelper.h" +#include "views/dolphiniconsview.h" +#include "views/dolphinmodel.h" +#include "views/dolphinviewcontroller.h" +#include "views/viewmodecontroller.h" +#include "views/viewproperties.h" DolphinViewContainer::DolphinViewContainer(const KUrl& url, QWidget* parent) : QWidget(parent), m_isFolderWritable(false), m_topLayout(0), m_urlNavigator(0), + m_searchBox(0), m_view(0), m_filterBar(0), m_statusBar(0), @@ -85,8 +88,6 @@ DolphinViewContainer::DolphinViewContainer(const KUrl& url, QWidget* parent) : this, SLOT(dropUrls(const KUrl&, QDropEvent*))); connect(m_urlNavigator, SIGNAL(activated()), this, SLOT(activate())); - //connect(m_urlNavigator, SIGNAL(tabRequested(const KUrl&)), - // this, connect(m_urlNavigator->editor(), SIGNAL(completionModeChanged(KGlobalSettings::Completion)), this, SLOT(saveUrlCompletionMode(KGlobalSettings::Completion))); @@ -97,6 +98,11 @@ DolphinViewContainer::DolphinViewContainer(const KUrl& url, QWidget* parent) : KUrlComboBox* editor = m_urlNavigator->editor(); editor->setCompletionMode(KGlobalSettings::Completion(settings->urlCompletionMode())); + m_searchBox = new DolphinSearchBox(this); + m_searchBox->hide(); + connect(m_searchBox, SIGNAL(closeRequest()), this, SLOT(closeSearchBox())); + connect(m_searchBox, SIGNAL(search(QString)), this, SLOT(startSearching(QString))); + m_dirLister = new DolphinDirLister(); m_dirLister->setAutoUpdate(true); m_dirLister->setMainWindow(window()); @@ -175,9 +181,12 @@ DolphinViewContainer::DolphinViewContainer(const KUrl& url, QWidget* parent) : m_filterBar, SLOT(clear())); m_topLayout->addWidget(m_urlNavigator); + m_topLayout->addWidget(m_searchBox); m_topLayout->addWidget(m_view); m_topLayout->addWidget(m_filterBar); m_topLayout->addWidget(m_statusBar); + + setSearchModeEnabled(isSearchUrl(url)); } DolphinViewContainer::~DolphinViewContainer() @@ -222,6 +231,33 @@ bool DolphinViewContainer::isFilterBarVisible() const return m_filterBar->isVisible(); } +void DolphinViewContainer::setSearchModeEnabled(bool enabled) +{ + m_searchBox->setVisible(enabled); + m_urlNavigator->setVisible(!enabled); + + if (enabled) { + // Remember the current URL, so that it can be restored + // when switching back to the URL navigator + const KUrl url = m_urlNavigator->locationUrl(); + m_searchBox->setSearchPath(url); + } else { + // Restore the URL for the URL navigator. If Dolphin has been + // started with a search-URL, the home URL is used as fallback. + const KUrl url = m_searchBox->searchPath(); + if (url.isValid() && !url.isEmpty() && !isSearchUrl(url)) { + m_urlNavigator->setLocationUrl(url); + } else { + m_urlNavigator->goHome(); + } + } +} + +bool DolphinViewContainer::isSearchModeEnabled() const +{ + return m_searchBox->isVisible(); +} + void DolphinViewContainer::setUrl(const KUrl& newUrl) { if (newUrl != m_urlNavigator->locationUrl()) { @@ -279,9 +315,10 @@ void DolphinViewContainer::updateStatusBar() void DolphinViewContainer::initializeProgress() { - if (url().protocol() == "nepomuksearch") { - // The Nepomuk IO-slave does not provide any progress information. Give + if (isSearchUrl(url())) { + // Search KIO-slaves usually don't provide any progress information. Give // an immediate hint to the user that a searching is done: + updateStatusBar(); m_statusBar->setProgressText(i18nc("@info", "Searching...")); m_statusBar->setProgress(-1); } @@ -302,14 +339,13 @@ void DolphinViewContainer::slotDirListerCompleted() m_statusBar->setProgress(100); } - if ((url().protocol() == "nepomuksearch") && (m_dirLister->items().count() == 0)) { + if (isSearchUrl(url()) && (m_dirLister->items().count() == 0)) { // The dir lister has been completed on a Nepomuk-URI and no items have been found. Instead // of showing the default status bar information ("0 items") a more helpful information is given: m_statusBar->setMessage(i18nc("@info:status", "No items found."), DolphinStatusBar::Information); } else { updateStatusBar(); } - QMetaObject::invokeMethod(this, "restoreViewState", Qt::QueuedConnection); // Enable the 'File'->'Create New...' menu only if the directory // supports writing. @@ -371,13 +407,6 @@ void DolphinViewContainer::setNameFilter(const QString& nameFilter) delayedStatusBarUpdate(); } -void DolphinViewContainer::restoreViewState() -{ - QByteArray locationState = m_urlNavigator->locationState(); - QDataStream stream(&locationState, QIODevice::ReadOnly); - m_view->restoreState(stream); -} - void DolphinViewContainer::activate() { setActive(true); @@ -394,15 +423,23 @@ void DolphinViewContainer::saveViewState() void DolphinViewContainer::slotUrlNavigatorLocationChanged(const KUrl& url) { if (KProtocolManager::supportsListing(url)) { + // Assure that the search box is shown instead of the URL navigator in case + // that the URL \p url is a search URL (e. g. nepomuksearch:// or filenamesearch://). + if (isSearchUrl(url)) { + if (!m_searchBox->isVisible()) { + m_searchBox->setVisible(true); + m_urlNavigator->setVisible(false); + } + } else if (!m_urlNavigator->isVisible()) { + m_urlNavigator->setVisible(true); + m_searchBox->setVisible(false); + } + m_view->setUrl(url); if (isActive()) { // When an URL has been entered, the view should get the focus. // The focus must be requested asynchronously, as changing the URL might create - // a new view widget. Using QTimer::singleShow() works reliable, however - // QMetaObject::invokeMethod() with a queued connection does not work, which might - // indicate that we should pass a hint to DolphinView::updateView() - // regarding the focus instead. To test: Enter an URL and press CTRL+Enter. - // Expected result: The view should get the focus. + // a new view widget. QTimer::singleShot(0, this, SLOT(requestFocus())); } } else if (KProtocolManager::isSourceProtocol(url)) { @@ -442,7 +479,13 @@ void DolphinViewContainer::redirect(const KUrl& oldUrl, const KUrl& newUrl) Q_UNUSED(oldUrl); const bool block = m_urlNavigator->signalsBlocked(); m_urlNavigator->blockSignals(true); + + // Assure that the location state is reset for redirection URLs. This + // allows to skip redirection URLs when going back or forward in the + // URL history. + m_urlNavigator->saveLocationState(QByteArray()); m_urlNavigator->setLocationUrl(newUrl); + m_urlNavigator->blockSignals(block); } @@ -460,15 +503,33 @@ void DolphinViewContainer::saveUrlCompletionMode(KGlobalSettings::Completion com void DolphinViewContainer::slotHistoryChanged() { - const int index = m_urlNavigator->historyIndex(); - if (index > 0) { - // The "Go Forward" action is enabled. Try to mark - // the previous directory as active item: - const KUrl url = m_urlNavigator->locationUrl(index - 1); - m_view->activateItem(url); + QByteArray locationState = m_urlNavigator->locationState(); + + if (!locationState.isEmpty()) { + QDataStream stream(&locationState, QIODevice::ReadOnly); + m_view->restoreState(stream); } } +void DolphinViewContainer::startSearching(const QString &text) +{ + Q_UNUSED(text); + const KUrl url = m_searchBox->urlForSearching(); + if (url.isValid() && !url.isEmpty()) { + m_urlNavigator->setLocationUrl(url); + } +} + +void DolphinViewContainer::closeSearchBox() +{ + setSearchModeEnabled(false); +} + +bool DolphinViewContainer::isSearchUrl(const KUrl& url) const +{ + return url.protocol().contains("search"); +} + void DolphinViewContainer::slotItemTriggered(const KFileItem& item) { KUrl url = item.targetUrl(); @@ -494,6 +555,16 @@ void DolphinViewContainer::slotItemTriggered(const KFileItem& item) } } + if (item.mimetype() == "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(); }