X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/bd30bb6ca98374b37db20d14a41542c21acdd5e0..ed68687614472e18904c4a3f613d01df2f5bb90e:/src/dolphinviewcontainer.cpp diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp index bdeaab258..9d33329e5 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,28 +47,25 @@ #include #include +#include "dolphin_generalsettings.h" #include "dolphinmodel.h" #include "dolphincolumnview.h" -#include "dolphincontroller.h" +#include "dolphinviewcontroller.h" #include "dolphinmainwindow.h" #include "dolphindirlister.h" #include "dolphinsortfilterproxymodel.h" #include "dolphindetailsview.h" #include "dolphiniconsview.h" -#include "dolphincontextmenu.h" #include "draganddrophelper.h" #include "filterbar.h" +#include "settings/dolphinsettings.h" #include "statusbar/dolphinstatusbar.h" +#include "viewmodecontroller.h" #include "viewproperties.h" -#include "settings/dolphinsettings.h" -#include "dolphin_generalsettings.h" -DolphinViewContainer::DolphinViewContainer(DolphinMainWindow* mainWindow, - QWidget* parent, - const KUrl& url) : +DolphinViewContainer::DolphinViewContainer(const KUrl& url, QWidget* parent) : QWidget(parent), m_isFolderWritable(false), - m_mainWindow(mainWindow), m_topLayout(0), m_urlNavigator(0), m_view(0), @@ -95,7 +92,7 @@ DolphinViewContainer::DolphinViewContainer(DolphinMainWindow* mainWindow, const GeneralSettings* settings = DolphinSettings::instance().generalSettings(); m_urlNavigator->setUrlEditable(settings->editableUrl()); m_urlNavigator->setShowFullPath(settings->showFullPath()); - m_urlNavigator->setHomeUrl(settings->homeUrl()); + m_urlNavigator->setHomeUrl(KUrl(settings->homeUrl())); KUrlComboBox* editor = m_urlNavigator->editor(); editor->setCompletionMode(KGlobalSettings::Completion(settings->urlCompletionMode())); @@ -132,10 +129,6 @@ DolphinViewContainer::DolphinViewContainer(DolphinMainWindow* mainWindow, m_view = new DolphinView(this, url, m_proxyModel); connect(m_view, SIGNAL(urlChanged(const KUrl&)), m_urlNavigator, SLOT(setUrl(const KUrl&))); - connect(m_view, SIGNAL(requestContextMenu(KFileItem, const KUrl&, const QList&)), - this, SLOT(openContextMenu(KFileItem, const KUrl&, const QList&))); - connect(m_view, SIGNAL(contentsMoved(int, int)), - this, SLOT(saveContentsPos(int, int))); connect(m_view, SIGNAL(requestItemInfo(KFileItem)), this, SLOT(showItemInfo(KFileItem))); connect(m_view, SIGNAL(errorMessage(const QString&)), @@ -146,18 +139,19 @@ DolphinViewContainer::DolphinViewContainer(DolphinMainWindow* mainWindow, this, SLOT(showOperationCompletedMessage(const QString&))); connect(m_view, SIGNAL(itemTriggered(KFileItem)), this, SLOT(slotItemTriggered(KFileItem))); - connect(m_view, SIGNAL(startedPathLoading(const KUrl&)), - this, SLOT(saveRootUrl(const KUrl&))); connect(m_view, SIGNAL(redirection(KUrl, KUrl)), this, SLOT(redirect(KUrl, KUrl))); connect(m_view, SIGNAL(selectionChanged(const KFileItemList&)), this, SLOT(delayedStatusBarUpdate())); connect(m_urlNavigator, SIGNAL(urlChanged(const KUrl&)), - this, SLOT(restoreView(const KUrl&))); + this, SLOT(slotUrlNavigatorLocationChanged(const KUrl&))); + connect(m_urlNavigator, SIGNAL(urlAboutToBeChanged(const KUrl&)), + this, SLOT(saveViewState())); connect(m_urlNavigator, SIGNAL(historyChanged()), this, SLOT(slotHistoryChanged())); + // initialize status bar m_statusBar = new DolphinStatusBar(this, m_view); m_statusBarTimer = new QTimer(this); m_statusBarTimer->setSingleShot(true); @@ -165,6 +159,11 @@ DolphinViewContainer::DolphinViewContainer(DolphinMainWindow* mainWindow, connect(m_statusBarTimer, SIGNAL(timeout()), this, SLOT(updateStatusBar())); + KIO::FileUndoManager* undoManager = KIO::FileUndoManager::self(); + connect(undoManager, SIGNAL(jobRecordingFinished(CommandType)), + this, SLOT(delayedStatusBarUpdate())); + + // initialize filter bar m_filterBar = new FilterBar(this); m_filterBar->setVisible(settings->filterBar()); connect(m_filterBar, SIGNAL(filterChanged(const QString&)), @@ -191,23 +190,9 @@ DolphinViewContainer::~DolphinViewContainer() m_dirLister = 0; // deleted by m_dolphinModel } -void DolphinViewContainer::setUrl(const KUrl& newUrl) -{ - if (newUrl != m_urlNavigator->url()) { - m_urlNavigator->setUrl(newUrl); - // Temporary disable the 'File'->'Create New...' menu until - // the write permissions can be checked in a fast way at - // DolphinViewContainer::slotDirListerCompleted(). - m_isFolderWritable = false; - if (isActive()) { - m_mainWindow->newMenu()->menu()->setEnabled(false); - } - } -} - -const KUrl& DolphinViewContainer::url() const +KUrl DolphinViewContainer::url() const { - return m_urlNavigator->url(); + return m_urlNavigator->locationUrl(); } void DolphinViewContainer::setActive(bool active) @@ -215,7 +200,7 @@ void DolphinViewContainer::setActive(bool active) m_urlNavigator->setActive(active); m_view->setActive(active); if (active) { - m_mainWindow->newMenu()->menu()->setEnabled(m_isFolderWritable); + emit writeStateChanged(m_isFolderWritable); } } @@ -236,6 +221,20 @@ bool DolphinViewContainer::isFilterBarVisible() const return m_filterBar->isVisible(); } +void DolphinViewContainer::setUrl(const KUrl& newUrl) +{ + if (newUrl != m_urlNavigator->locationUrl()) { + m_urlNavigator->setLocationUrl(newUrl); + // Temporary disable the 'File'->'Create New...' menu until + // the write permissions can be checked in a fast way at + // DolphinViewContainer::slotDirListerCompleted(). + m_isFolderWritable = false; + if (isActive()) { + emit writeStateChanged(false); + } + } +} + void DolphinViewContainer::showFilterBar(bool show) { Q_ASSERT(m_filterBar != 0); @@ -246,11 +245,6 @@ void DolphinViewContainer::showFilterBar(bool show) } } -bool DolphinViewContainer::isUrlEditable() const -{ - return m_urlNavigator->isUrlEditable(); -} - void DolphinViewContainer::delayedStatusBarUpdate() { // Invoke updateStatusBar() with a small delay. This assures that @@ -274,7 +268,7 @@ void DolphinViewContainer::updateStatusBar() || (m_statusBar->type() == DolphinStatusBar::Information)) && (m_statusBar->progress() == 100); - const QString text(m_view->statusBarText()); + const QString text = m_view->statusBarText(); m_statusBar->setDefaultText(text); if (updateStatusBarMsg) { @@ -284,8 +278,8 @@ void DolphinViewContainer::updateStatusBar() void DolphinViewContainer::initializeProgress() { - if (m_view->url().protocol() == "nepomuksearch") { - // The Nepomuk IO-slave does not provide any progress information. Give + if (url().protocol() == "nepomuksearch") { + // The Nepomuk IO-slave does not provide progress information right away. Give // an immediate hint to the user that a searching is done: m_statusBar->setProgressText(i18nc("@info", "Searching...")); m_statusBar->setProgress(-1); @@ -307,8 +301,13 @@ void DolphinViewContainer::slotDirListerCompleted() m_statusBar->setProgress(100); } - updateStatusBar(); - QMetaObject::invokeMethod(this, "restoreContentsPos", Qt::QueuedConnection); + if ((url().protocol() == "nepomuksearch") && (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(); + } // Enable the 'File'->'Create New...' menu only if the directory // supports writing. @@ -322,7 +321,7 @@ void DolphinViewContainer::slotDirListerCompleted() } if (isActive()) { - m_mainWindow->newMenu()->menu()->setEnabled(m_isFolderWritable); + emit writeStateChanged(m_isFolderWritable); } } @@ -370,37 +369,23 @@ void DolphinViewContainer::setNameFilter(const QString& nameFilter) delayedStatusBarUpdate(); } -void DolphinViewContainer::openContextMenu(const KFileItem& item, - const KUrl& url, - const QList& customActions) -{ - DolphinContextMenu contextMenu(m_mainWindow, item, url); - contextMenu.setCustomActions(customActions); - contextMenu.open(); -} - -void DolphinViewContainer::saveContentsPos(int x, int y) -{ - m_urlNavigator->savePosition(x, y); -} - -void DolphinViewContainer::restoreContentsPos() +void DolphinViewContainer::activate() { - if (!url().isEmpty()) { - const QPoint pos = m_urlNavigator->savedPosition(); - m_view->setContentsPosition(pos.x(), pos.y()); - } + setActive(true); } -void DolphinViewContainer::activate() +void DolphinViewContainer::saveViewState() { - setActive(true); + QByteArray locationState; + QDataStream stream(&locationState, QIODevice::WriteOnly); + m_view->saveState(stream); + m_urlNavigator->saveLocationState(locationState); } -void DolphinViewContainer::restoreView(const KUrl& url) +void DolphinViewContainer::slotUrlNavigatorLocationChanged(const KUrl& url) { if (KProtocolManager::supportsListing(url)) { - m_view->updateView(url, m_urlNavigator->savedRootUrl()); + 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 @@ -438,12 +423,6 @@ void DolphinViewContainer::restoreView(const KUrl& url) } } -void DolphinViewContainer::saveRootUrl(const KUrl& url) -{ - Q_UNUSED(url); - m_urlNavigator->saveRootUrl(m_view->rootUrl()); -} - void DolphinViewContainer::dropUrls(const KUrl& destination, QDropEvent* event) { DragAndDropHelper::instance().dropUrls(KFileItem(), destination, event, this); @@ -454,7 +433,13 @@ void DolphinViewContainer::redirect(const KUrl& oldUrl, const KUrl& newUrl) Q_UNUSED(oldUrl); const bool block = m_urlNavigator->signalsBlocked(); m_urlNavigator->blockSignals(true); - m_urlNavigator->setUrl(newUrl); + + // 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); } @@ -472,12 +457,11 @@ 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->historyUrl(index - 1); - m_view->activateItem(url); + QByteArray locationState = m_urlNavigator->locationState(); + + if (!locationState.isEmpty()) { + QDataStream stream(&locationState, QIODevice::ReadOnly); + m_view->restoreState(stream); } } @@ -506,6 +490,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(); }