X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/a7692611315065b308cd8243563cc50d40bd0f71..2e1cc199c3c2ef2eea5abd630821f80dfc9e0b16:/src/dolphinviewcontainer.cpp diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp index c1677dc43..bf8ac8812 100644 --- a/src/dolphinviewcontainer.cpp +++ b/src/dolphinviewcontainer.cpp @@ -18,60 +18,50 @@ ***************************************************************************/ #include "dolphinviewcontainer.h" -#include -#include -#include -#include -#include -#include -#include -#include +#include "dolphin_generalsettings.h" +#include "dolphinplacesmodelsingleton.h" +#include "dolphindebug.h" +#include "filterbar/filterbar.h" +#include "global.h" +#include "search/dolphinsearchbox.h" +#include "statusbar/dolphinstatusbar.h" +#include "trash/dolphintrash.h" +#include "views/viewmodecontroller.h" +#include "views/viewproperties.h" -#include -#include #include -#include -#include -#include -#include #include +#include #include -#include -#include -#include +#include +#include #include -#include #include #include -#include - -#ifdef KActivities_FOUND -#include -#endif +#include -#include "dolphin_generalsettings.h" -#include "filterbar/filterbar.h" -#include "search/dolphinsearchbox.h" -#include "statusbar/dolphinstatusbar.h" -#include "views/draganddrophelper.h" -#include "views/viewmodecontroller.h" -#include "views/viewproperties.h" +#include +#include +#include +#include +#include +#include -DolphinViewContainer::DolphinViewContainer(const KUrl& url, QWidget* parent) : +DolphinViewContainer::DolphinViewContainer(const QUrl& url, QWidget* parent) : QWidget(parent), - m_topLayout(0), - m_urlNavigator(0), - m_searchBox(0), - m_messageWidget(0), - m_view(0), - m_filterBar(0), - m_statusBar(0), - m_statusBarTimer(0), + m_topLayout(nullptr), + m_navigatorWidget(nullptr), + m_urlNavigator(nullptr), + m_emptyTrashButton(nullptr), + m_searchBox(nullptr), + m_messageWidget(nullptr), + m_view(nullptr), + m_filterBar(nullptr), + m_statusBar(nullptr), + m_statusBarTimer(nullptr), m_statusBarTimestamp(), - m_autoGrabFocus(true), - m_dropDestination(), - m_dropEvent(0) + m_autoGrabFocus(true) #ifdef KActivities_FOUND , m_activityResourceInstance(0) #endif @@ -82,9 +72,12 @@ DolphinViewContainer::DolphinViewContainer(const KUrl& url, QWidget* parent) : m_topLayout->setSpacing(0); m_topLayout->setMargin(0); - m_urlNavigator = new KUrlNavigator(new KFilePlacesModel(this), url, this); - connect(m_urlNavigator, &KUrlNavigator::urlsDropped, - this, &DolphinViewContainer::dropUrls); + m_navigatorWidget = new QWidget(this); + QHBoxLayout* navigatorLayout = new QHBoxLayout(m_navigatorWidget); + navigatorLayout->setSpacing(0); + navigatorLayout->setMargin(0); + + m_urlNavigator = new KUrlNavigator(DolphinPlacesModelSingleton::instance().placesModel(), url, this); connect(m_urlNavigator, &KUrlNavigator::activated, this, &DolphinViewContainer::activate); connect(m_urlNavigator->editor(), &KUrlComboBox::completionModeChanged, @@ -93,10 +86,17 @@ DolphinViewContainer::DolphinViewContainer(const KUrl& url, QWidget* parent) : const GeneralSettings* settings = GeneralSettings::self(); m_urlNavigator->setUrlEditable(settings->editableUrl()); m_urlNavigator->setShowFullPath(settings->showFullPath()); - m_urlNavigator->setHomeUrl(KUrl(settings->homeUrl())); + m_urlNavigator->setHomeUrl(Dolphin::homeUrl()); KUrlComboBox* editor = m_urlNavigator->editor(); editor->setCompletionMode(KCompletion::CompletionMode(settings->urlCompletionMode())); + m_emptyTrashButton = new QPushButton(QIcon::fromTheme(QStringLiteral("user-trash")), i18nc("@action:button", "Empty Trash"), this); + m_emptyTrashButton->setFlat(true); + connect(m_emptyTrashButton, &QPushButton::clicked, this, [this]() { Trash::empty(this); }); + connect(&Trash::instance(), &Trash::emptinessChanged, m_emptyTrashButton, &QPushButton::setDisabled); + m_emptyTrashButton->setDisabled(Trash::isEmpty()); + m_emptyTrashButton->hide(); + m_searchBox = new DolphinSearchBox(this); m_searchBox->hide(); connect(m_searchBox, &DolphinSearchBox::activated, this, &DolphinViewContainer::activate); @@ -110,7 +110,7 @@ DolphinViewContainer::DolphinViewContainer(const KUrl& url, QWidget* parent) : m_view = new DolphinView(url, this); connect(m_view, &DolphinView::urlChanged, - m_urlNavigator, &KUrlNavigator::setUrl); + m_urlNavigator, &KUrlNavigator::setLocationUrl); connect(m_view, &DolphinView::urlChanged, m_messageWidget, &KMessageWidget::hide); connect(m_view, &DolphinView::writeStateChanged, @@ -137,21 +137,33 @@ DolphinViewContainer::DolphinViewContainer(const KUrl& url, QWidget* parent) : this, &DolphinViewContainer::updateDirectorySortingProgress); connect(m_view, &DolphinView::selectionChanged, this, &DolphinViewContainer::delayedStatusBarUpdate); - connect(m_view, &DolphinView::urlAboutToBeChanged, - this, &DolphinViewContainer::slotViewUrlAboutToBeChanged); connect(m_view, &DolphinView::errorMessage, this, &DolphinViewContainer::showErrorMessage); connect(m_view, &DolphinView::urlIsFileError, this, &DolphinViewContainer::slotUrlIsFileError); + connect(m_view, &DolphinView::activated, + this, &DolphinViewContainer::activate); connect(m_urlNavigator, &KUrlNavigator::urlAboutToBeChanged, this, &DolphinViewContainer::slotUrlNavigatorLocationAboutToBeChanged); connect(m_urlNavigator, &KUrlNavigator::urlChanged, this, &DolphinViewContainer::slotUrlNavigatorLocationChanged); - connect(m_urlNavigator, &KUrlNavigator::historyChanged, - this, &DolphinViewContainer::slotHistoryChanged); + connect(m_urlNavigator, &KUrlNavigator::urlSelectionRequested, + this, &DolphinViewContainer::slotUrlSelectionRequested); connect(m_urlNavigator, &KUrlNavigator::returnPressed, this, &DolphinViewContainer::slotReturnPressed); + connect(m_urlNavigator, &KUrlNavigator::urlsDropped, this, [=](const QUrl &destination, QDropEvent *event) { +#if KIO_VERSION >= QT_VERSION_CHECK(5, 37, 0) + m_view->dropUrls(destination, event, m_urlNavigator->dropWidget()); +#else + // TODO: remove as soon as we can hard-depend of KF5 >= 5.37 + m_view->dropUrls(destination, event, m_view); +#endif + }); + + connect(m_view, &DolphinView::directoryLoadingCompleted, this, [this]() { + m_emptyTrashButton->setVisible(m_view->url().scheme() == QLatin1String("trash")); + }); // Initialize status bar m_statusBar = new DolphinStatusBar(this); @@ -191,7 +203,10 @@ DolphinViewContainer::DolphinViewContainer(const KUrl& url, QWidget* parent) : connect(m_view, &DolphinView::urlChanged, m_filterBar, &FilterBar::slotUrlChanged); - m_topLayout->addWidget(m_urlNavigator); + navigatorLayout->addWidget(m_urlNavigator); + navigatorLayout->addWidget(m_emptyTrashButton); + + m_topLayout->addWidget(m_navigatorWidget); m_topLayout->addWidget(m_searchBox); m_topLayout->addWidget(m_messageWidget); m_topLayout->addWidget(m_view); @@ -213,7 +228,7 @@ DolphinViewContainer::~DolphinViewContainer() { } -KUrl DolphinViewContainer::url() const +QUrl DolphinViewContainer::url() const { return m_view->url(); } @@ -249,6 +264,11 @@ bool DolphinViewContainer::autoGrabFocus() const return m_autoGrabFocus; } +QString DolphinViewContainer::currentSearchText() const +{ + return m_searchBox->text(); +} + const DolphinStatusBar* DolphinViewContainer::statusBar() const { return m_statusBar; @@ -300,6 +320,9 @@ void DolphinViewContainer::showMessage(const QString& msg, MessageType type) const int unwrappedWidth = m_messageWidget->sizeHint().width(); m_messageWidget->setWordWrap(unwrappedWidth > size().width()); + if (m_messageWidget->isVisible()) { + m_messageWidget->hide(); + } m_messageWidget->animatedShow(); } @@ -311,7 +334,7 @@ void DolphinViewContainer::readSettings() // settings of the URL navigator and the filterbar. m_urlNavigator->setUrlEditable(GeneralSettings::editableUrl()); m_urlNavigator->setShowFullPath(GeneralSettings::showFullPath()); - m_urlNavigator->setHomeUrl(KUrl(GeneralSettings::homeUrl())); + m_urlNavigator->setHomeUrl(Dolphin::homeUrl()); setFilterBarVisible(GeneralSettings::filterBar()); } @@ -335,19 +358,19 @@ void DolphinViewContainer::setSearchModeEnabled(bool enabled) } m_searchBox->setVisible(enabled); - m_urlNavigator->setVisible(!enabled); + m_navigatorWidget->setVisible(!enabled); if (enabled) { - const KUrl& locationUrl = m_urlNavigator->locationUrl(); + const QUrl& locationUrl = m_urlNavigator->locationUrl(); m_searchBox->fromSearchUrl(locationUrl); } else { m_view->setViewPropertiesContext(QString()); // Restore the URL for the URL navigator. If Dolphin has been // started with a search-URL, the home URL is used as fallback. - KUrl url = m_searchBox->searchPath(); + QUrl url = m_searchBox->searchPath(); if (url.isEmpty() || !url.isValid() || isSearchUrl(url)) { - url = GeneralSettings::self()->homeUrl(); + url = Dolphin::homeUrl(); } m_urlNavigator->setLocationUrl(url); } @@ -363,18 +386,27 @@ QString DolphinViewContainer::placesText() const QString text; if (isSearchModeEnabled()) { - text = m_searchBox->searchPath().fileName() + QLatin1String(": ") + m_searchBox->text(); + text = i18n("Search for %1 in %2", m_searchBox->text(), m_searchBox->searchPath().fileName()); } else { text = url().fileName(); if (text.isEmpty()) { text = url().host(); } + if (text.isEmpty()) { + text = url().scheme(); + } } return text; } -void DolphinViewContainer::setUrl(const KUrl& newUrl) +void DolphinViewContainer::reload() +{ + view()->reload(); + m_messageWidget->hide(); +} + +void DolphinViewContainer::setUrl(const QUrl& newUrl) { if (newUrl != m_urlNavigator->locationUrl()) { m_urlNavigator->setLocationUrl(newUrl); @@ -479,10 +511,19 @@ void DolphinViewContainer::slotDirectoryLoadingCanceled() m_statusBar->setText(QString()); } -void DolphinViewContainer::slotUrlIsFileError(const KUrl& url) +void DolphinViewContainer::slotUrlIsFileError(const QUrl& url) { - const KFileItem item(KFileItem::Unknown, KFileItem::Unknown, url); - slotItemActivated(item); + const KFileItem item(url); + + // Find out if the file can be opened in the view (for example, this is the + // case if the file is an archive). The mime type must be known for that. + item.determineMimeType(); + const QUrl& folderUrl = DolphinView::openItemAsFolderUrl(item, true); + if (!folderUrl.isEmpty()) { + setUrl(folderUrl); + } else { + slotItemActivated(item); + } } void DolphinViewContainer::slotItemActivated(const KFileItem& item) @@ -492,13 +533,14 @@ void DolphinViewContainer::slotItemActivated(const KFileItem& item) // results in an active view. m_view->setActive(true); - const KUrl& url = DolphinView::openItemAsFolderUrl(item, GeneralSettings::browseThroughArchives()); + const QUrl& url = DolphinView::openItemAsFolderUrl(item, GeneralSettings::browseThroughArchives()); if (!url.isEmpty()) { - m_view->setUrl(url); + setUrl(url); return; } - new KRun(item.targetUrl(), this); + KRun *run = new KRun(item.targetUrl(), this); + run->setShowScriptExecutionPrompt(true); } void DolphinViewContainer::slotItemsActivated(const KFileItemList& items) @@ -536,52 +578,34 @@ void DolphinViewContainer::activate() setActive(true); } -void DolphinViewContainer::slotViewUrlAboutToBeChanged(const KUrl& url) +void DolphinViewContainer::slotUrlNavigatorLocationAboutToBeChanged(const QUrl&) { - // URL changes of the view can happen in two ways: - // 1. The URL navigator gets changed and will trigger the view to update its URL - // 2. The URL of the view gets changed and will trigger the URL navigator to update - // its URL (e.g. by clicking on an item) - // In this scope the view-state may only get saved in case 2: - if (url != m_urlNavigator->locationUrl()) { - saveViewState(); - } -} - -void DolphinViewContainer::slotUrlNavigatorLocationAboutToBeChanged(const KUrl& url) -{ - // URL changes of the view can happen in two ways: - // 1. The URL navigator gets changed and will trigger the view to update its URL - // 2. The URL of the view gets changed and will trigger the URL navigator to update - // its URL (e.g. by clicking on an item) - // In this scope the view-state may only get saved in case 1: - if (url != m_view->url()) { - saveViewState(); - } + saveViewState(); } -void DolphinViewContainer::slotUrlNavigatorLocationChanged(const KUrl& url) +void DolphinViewContainer::slotUrlNavigatorLocationChanged(const QUrl& url) { slotReturnPressed(); if (KProtocolManager::supportsListing(url)) { setSearchModeEnabled(isSearchUrl(url)); m_view->setUrl(url); + tryRestoreViewState(); if (m_autoGrabFocus && isActive() && !isSearchUrl(url)) { // 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. - QTimer::singleShot(0, this, SLOT(requestFocus())); + QTimer::singleShot(0, this, &DolphinViewContainer::requestFocus); } } else if (KProtocolManager::isSourceProtocol(url)) { - QString app = "konqueror"; - if (url.protocol().startsWith(QLatin1String("http"))) { + QString app = QStringLiteral("konqueror"); + if (url.scheme().startsWith(QLatin1String("http"))) { showMessage(i18nc("@info:status", // krazy:exclude=qmethods "Dolphin does not support web pages, the web browser has been launched"), Information); - const KConfigGroup config(KSharedConfig::openConfig("kdeglobals"), "General"); + const KConfigGroup config(KSharedConfig::openConfig(QStringLiteral("kdeglobals")), "General"); const QString browser = config.readEntry("BrowserApplication"); if (!browser.isEmpty()) { app = browser; @@ -596,7 +620,7 @@ void DolphinViewContainer::slotUrlNavigatorLocationChanged(const KUrl& url) Information); } - const QString secureUrl = KShell::quoteArg(url.pathOrUrl()); + const QString secureUrl = KShell::quoteArg(url.toDisplayString(QUrl::PreferLocalFile)); const QString command = app + ' ' + secureUrl; KRun::runCommand(command, app, app, this); } else { @@ -604,42 +628,14 @@ void DolphinViewContainer::slotUrlNavigatorLocationChanged(const KUrl& url) } } -void DolphinViewContainer::dropUrls(const KUrl& destination, QDropEvent* event) +void DolphinViewContainer::slotUrlSelectionRequested(const QUrl& url) { - m_dropDestination = destination; - - const QMimeData* mimeData = event->mimeData(); - QMimeData* mimeDataCopy = new QMimeData; - foreach (const QString& format, mimeData->formats()) { - mimeDataCopy->setData(format, mimeData->data(format)); - } - - m_dropEvent.reset(new QDropEvent(event->pos(), - event->possibleActions(), - mimeDataCopy, - event->mouseButtons(), - event->keyboardModifiers())); - - QTimer::singleShot(0, this, SLOT(dropUrlsDelayed())); + qCDebug(DolphinDebug) << "slotUrlSelectionRequested: " << url; + m_view->markUrlsAsSelected({url}); + m_view->markUrlAsCurrent(url); // makes the item scroll into view } -void DolphinViewContainer::dropUrlsDelayed() -{ - if (m_dropEvent.isNull()) { - return; - } - - QString error; - DragAndDropHelper::dropUrls(KFileItem(), m_dropDestination, m_dropEvent.data(), error); - if (!error.isEmpty()) { - showMessage(error, Error); - } - - delete m_dropEvent->mimeData(); - m_dropEvent.reset(); -} - -void DolphinViewContainer::redirect(const KUrl& oldUrl, const KUrl& newUrl) +void DolphinViewContainer::redirect(const QUrl& oldUrl, const QUrl& newUrl) { Q_UNUSED(oldUrl); const bool block = m_urlNavigator->signalsBlocked(); @@ -665,15 +661,6 @@ void DolphinViewContainer::saveUrlCompletionMode(KCompletion::CompletionMode com GeneralSettings::setUrlCompletionMode(completion); } -void DolphinViewContainer::slotHistoryChanged() -{ - QByteArray locationState = m_urlNavigator->locationState(); - if (!locationState.isEmpty()) { - QDataStream stream(&locationState, QIODevice::ReadOnly); - m_view->restoreState(stream); - } -} - void DolphinViewContainer::slotReturnPressed() { if (!GeneralSettings::editableUrl()) { @@ -683,9 +670,9 @@ void DolphinViewContainer::slotReturnPressed() void DolphinViewContainer::startSearching() { - const KUrl url = m_searchBox->urlForSearching(); + const QUrl url = m_searchBox->urlForSearching(); if (url.isValid() && !url.isEmpty()) { - m_view->setViewPropertiesContext("search"); + m_view->setViewPropertiesContext(QStringLiteral("search")); m_urlNavigator->setLocationUrl(url); } } @@ -711,10 +698,9 @@ void DolphinViewContainer::showErrorMessage(const QString& msg) showMessage(msg, Error); } -bool DolphinViewContainer::isSearchUrl(const KUrl& url) const +bool DolphinViewContainer::isSearchUrl(const QUrl& url) const { - const QString protocol = url.protocol(); - return protocol.contains("search"); + return url.scheme().contains(QStringLiteral("search")); } void DolphinViewContainer::saveViewState() @@ -725,3 +711,11 @@ void DolphinViewContainer::saveViewState() m_urlNavigator->saveLocationState(locationState); } +void DolphinViewContainer::tryRestoreViewState() +{ + QByteArray locationState = m_urlNavigator->locationState(); + if (!locationState.isEmpty()) { + QDataStream stream(&locationState, QIODevice::ReadOnly); + m_view->restoreState(stream); + } +}