diff options
| author | Felix Ernst <[email protected]> | 2020-06-14 16:20:02 +0200 |
|---|---|---|
| committer | Elvis Angelaccio <[email protected]> | 2020-11-09 23:49:07 +0100 |
| commit | ad5d3367c7fef4c3c11188a768f21a2ee2b3c025 (patch) | |
| tree | fa59507fdc29060eba061b776c74c53e57b8b668 /src/dolphinviewcontainer.cpp | |
| parent | 880766bd56c0331f39ecffaa08974b5117e3d72a (diff) | |
Add an option to use an UrlNavigator in the toolbar instead
This commit adds a locationInToolbar KToggleAction to switch between
using a location bar to navigate or using a new custom QWidgetAction
in the toolbar.
A big portion of this MR is refactoring because until now the
UrlNavigator was tightly intertwined with the DolphinViewContainer.
With this MR an UrlNavigator for controlling a View can be freely
connected or disconnected with a single method call.
A DolphinUrlNavigator class is created in the process which contains all
Dolphin-specific UrlNavigator code which did previously reside in the
DolphinViewContainer class. Other application parts that belong to
UrlNavigator-management are also moved here.
Diffstat (limited to 'src/dolphinviewcontainer.cpp')
| -rw-r--r-- | src/dolphinviewcontainer.cpp | 177 |
1 files changed, 108 insertions, 69 deletions
diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp index b1b67447f..da3504187 100644 --- a/src/dolphinviewcontainer.cpp +++ b/src/dolphinviewcontainer.cpp @@ -7,8 +7,8 @@ #include "dolphinviewcontainer.h" #include "dolphin_generalsettings.h" -#include "dolphinplacesmodelsingleton.h" #include "dolphindebug.h" +#include "dolphinplacesmodelsingleton.h" #include "filterbar/filterbar.h" #include "global.h" #include "search/dolphinsearchbox.h" @@ -31,6 +31,7 @@ #include <KProtocolManager> #include <KShell> #include <KUrlComboBox> +#include <KUrlNavigator> #include <QDropEvent> #include <QLoggingCategory> @@ -45,6 +46,7 @@ DolphinViewContainer::DolphinViewContainer(const QUrl& url, QWidget* parent) : m_topLayout(nullptr), m_navigatorWidget(nullptr), m_urlNavigator(nullptr), + m_urlNavigatorConnected(nullptr), m_emptyTrashButton(nullptr), m_searchBox(nullptr), m_searchModeEnabled(false), @@ -66,34 +68,11 @@ DolphinViewContainer::DolphinViewContainer(const QUrl& url, QWidget* parent) : m_topLayout->setContentsMargins(0, 0, 0, 0); m_navigatorWidget = new QWidget(this); + m_navigatorWidget->setVisible(false); QHBoxLayout* navigatorLayout = new QHBoxLayout(m_navigatorWidget); navigatorLayout->setSpacing(0); navigatorLayout->setContentsMargins(0, 0, 0, 0); - m_navigatorWidget->setWhatsThis(xi18nc("@info:whatsthis location bar", - "<para>This line describes the location of the files and folders " - "displayed below.</para><para>The name of the currently viewed " - "folder can be read at the very right. To the left of it is the " - "name of the folder that contains it. The whole line is called " - "the <emphasis>path</emphasis> to the current location because " - "following these folders from left to right leads here.</para>" - "<para>The path is displayed on the <emphasis>location bar</emphasis> " - "which is more powerful than one would expect. To learn more " - "about the basic and advanced features of the location bar " - "<link url='help:/dolphin/location-bar.html'>click here</link>. " - "This will open the dedicated page in the Handbook.</para>")); - - m_urlNavigator = new KUrlNavigator(DolphinPlacesModelSingleton::instance().placesModel(), url, this); - connect(m_urlNavigator, &KUrlNavigator::activated, - this, &DolphinViewContainer::activate); - connect(m_urlNavigator->editor(), &KUrlComboBox::completionModeChanged, - this, &DolphinViewContainer::saveUrlCompletionMode); - - const GeneralSettings* settings = GeneralSettings::self(); - m_urlNavigator->setUrlEditable(settings->editableUrl()); - m_urlNavigator->setShowFullPath(settings->showFullPath()); - m_urlNavigator->setHomeUrl(Dolphin::homeUrl()); - KUrlComboBox* editor = m_urlNavigator->editor(); - editor->setCompletionMode(KCompletion::CompletionMode(settings->urlCompletionMode())); + m_urlNavigator = new DolphinUrlNavigator(url, m_navigatorWidget); m_emptyTrashButton = new QPushButton(QIcon::fromTheme(QStringLiteral("user-trash")), i18nc("@action:button", "Empty Trash"), this); m_emptyTrashButton->setFlat(true); @@ -135,7 +114,7 @@ DolphinViewContainer::DolphinViewContainer(const QUrl& url, QWidget* parent) : // Initialize filter bar m_filterBar = new FilterBar(this); - m_filterBar->setVisible(settings->filterBar()); + m_filterBar->setVisible(GeneralSettings::filterBar()); connect(m_filterBar, &FilterBar::filterChanged, this, &DolphinViewContainer::setNameFilter); @@ -149,9 +128,13 @@ DolphinViewContainer::DolphinViewContainer(const QUrl& url, QWidget* parent) : connect(m_view, &DolphinView::urlChanged, m_filterBar, &FilterBar::slotUrlChanged); connect(m_view, &DolphinView::urlChanged, - m_urlNavigator, &KUrlNavigator::setLocationUrl); - connect(m_view, &DolphinView::urlChanged, m_messageWidget, &KMessageWidget::hide); + // m_urlNavigator stays in sync with m_view's location changes and + // keeps track of them so going back and forth in the history works. + connect(m_view, &DolphinView::urlChanged, + m_urlNavigator, &DolphinUrlNavigator::setLocationUrl); + connect(m_urlNavigator, &DolphinUrlNavigator::urlChanged, + this, &DolphinViewContainer::slotUrlNavigatorLocationChanged); connect(m_view, &DolphinView::writeStateChanged, this, &DolphinViewContainer::writeStateChanged); connect(m_view, &DolphinView::requestItemInfo, @@ -183,18 +166,6 @@ DolphinViewContainer::DolphinViewContainer(const QUrl& url, QWidget* parent) : 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::urlSelectionRequested, - this, &DolphinViewContainer::slotUrlSelectionRequested); - connect(m_urlNavigator, &KUrlNavigator::returnPressed, - this, &DolphinViewContainer::slotReturnPressed); - connect(m_urlNavigator, &KUrlNavigator::urlsDropped, this, [=](const QUrl &destination, QDropEvent *event) { - m_view->dropUrls(destination, event, m_urlNavigator->dropWidget()); - }); - connect(m_view, &DolphinView::directoryLoadingCompleted, this, [this]() { m_emptyTrashButton->setVisible(m_view->url().scheme() == QLatin1String("trash")); }); @@ -235,6 +206,9 @@ DolphinViewContainer::DolphinViewContainer(const QUrl& url, QWidget* parent) : m_topLayout->addWidget(m_filterBar); m_topLayout->addWidget(m_statusBar); + if (!GeneralSettings::locationInToolbar()) { + connectToInternalUrlNavigator(); + } setSearchModeEnabled(isSearchUrl(url)); connect(DetailsModeSettings::self(), &KCoreConfigSkeleton::configChanged, this, [=]() { @@ -277,7 +251,7 @@ void DolphinViewContainer::setActive(bool active) bool DolphinViewContainer::isActive() const { - Q_ASSERT(m_view->isActive() == m_urlNavigator->isActive()); + Q_ASSERT(!m_urlNavigatorConnected || m_urlNavigatorConnected->isActive() == m_view->isActive()); return m_view->isActive(); } @@ -306,12 +280,22 @@ DolphinStatusBar* DolphinViewContainer::statusBar() return m_statusBar; } -const KUrlNavigator* DolphinViewContainer::urlNavigator() const +const DolphinUrlNavigator* DolphinViewContainer::urlNavigator() const +{ + return m_urlNavigatorConnected; +} + +DolphinUrlNavigator* DolphinViewContainer::urlNavigator() +{ + return m_urlNavigatorConnected; +} + +const DolphinUrlNavigator *DolphinViewContainer::urlNavigatorInternal() const { return m_urlNavigator; } -KUrlNavigator* DolphinViewContainer::urlNavigator() +DolphinUrlNavigator *DolphinViewContainer::urlNavigatorInternal() { return m_urlNavigator; } @@ -326,6 +310,63 @@ DolphinView* DolphinViewContainer::view() return m_view; } +void DolphinViewContainer::connectUrlNavigator(DolphinUrlNavigator *urlNavigator) +{ + Q_CHECK_PTR(urlNavigator); + Q_ASSERT(!m_urlNavigatorConnected); + Q_CHECK_PTR(m_view); + + m_urlNavigatorConnected = urlNavigator; + + // m_urlNavigator is already connected through urlChanged signals. + if (urlNavigator != m_urlNavigator) { + urlNavigator->setLocationUrl(m_view->url()); + connect(m_view, &DolphinView::urlChanged, + urlNavigator, &DolphinUrlNavigator::setLocationUrl); + connect(urlNavigator, &DolphinUrlNavigator::urlChanged, + this, &DolphinViewContainer::slotUrlNavigatorLocationChanged); + } + + connect(urlNavigator, &DolphinUrlNavigator::activated, + this, &DolphinViewContainer::activate); + connect(urlNavigator, &DolphinUrlNavigator::urlAboutToBeChanged, + this, &DolphinViewContainer::slotUrlNavigatorLocationAboutToBeChanged); + connect(urlNavigator, &DolphinUrlNavigator::urlSelectionRequested, + this, &DolphinViewContainer::slotUrlSelectionRequested); + connect(urlNavigator, &DolphinUrlNavigator::urlsDropped, this, [=](const QUrl &destination, QDropEvent *event) { + m_view->dropUrls(destination, event, urlNavigator->dropWidget()); + }); + + updateNavigatorWidgetVisibility(); +} + +void DolphinViewContainer::disconnectUrlNavigator() +{ + if (!m_urlNavigatorConnected) { + return; + } + + // m_urlNavigator stays connected through the urlChanged signals. + if (m_urlNavigatorConnected != m_urlNavigator) { + disconnect(m_view, &DolphinView::urlChanged, + m_urlNavigatorConnected, &DolphinUrlNavigator::setLocationUrl); + disconnect(m_urlNavigatorConnected, &DolphinUrlNavigator::urlChanged, + this, &DolphinViewContainer::slotUrlNavigatorLocationChanged); + } + + disconnect(m_urlNavigatorConnected, &DolphinUrlNavigator::activated, + this, &DolphinViewContainer::activate); + disconnect(m_urlNavigatorConnected, &DolphinUrlNavigator::urlAboutToBeChanged, + this, &DolphinViewContainer::slotUrlNavigatorLocationAboutToBeChanged); + disconnect(m_urlNavigatorConnected, &DolphinUrlNavigator::urlSelectionRequested, + this, &DolphinViewContainer::slotUrlSelectionRequested); + disconnect(m_urlNavigatorConnected, &DolphinUrlNavigator::urlsDropped, + this, nullptr); + + m_urlNavigatorConnected = nullptr; + updateNavigatorWidgetVisibility(); +} + void DolphinViewContainer::showMessage(const QString& msg, MessageType type) { if (msg.isEmpty()) { @@ -359,13 +400,10 @@ void DolphinViewContainer::showMessage(const QString& msg, MessageType type) void DolphinViewContainer::readSettings() { + // The startup settings should (only) get applied if they have been + // modified by the user. Otherwise keep the (possibly) different current + // setting of the filterbar. if (GeneralSettings::modifiedStartupSettings()) { - // The startup settings should only get applied if they have been - // modified by the user. Otherwise keep the (possibly) different current - // settings of the URL navigator and the filterbar. - m_urlNavigator->setUrlEditable(GeneralSettings::editableUrl()); - m_urlNavigator->setShowFullPath(GeneralSettings::showFullPath()); - m_urlNavigator->setHomeUrl(Dolphin::homeUrl()); setFilterBarVisible(GeneralSettings::filterBar()); } @@ -381,10 +419,10 @@ bool DolphinViewContainer::isFilterBarVisible() const void DolphinViewContainer::setSearchModeEnabled(bool enabled) { m_searchBox->setVisible(enabled); - m_navigatorWidget->setVisible(!enabled); + updateNavigatorWidgetVisibility(); if (enabled) { - const QUrl& locationUrl = m_urlNavigator->locationUrl(); + const QUrl& locationUrl = m_urlNavigatorConnected->locationUrl(); m_searchBox->fromSearchUrl(locationUrl); } @@ -405,7 +443,7 @@ void DolphinViewContainer::setSearchModeEnabled(bool enabled) if (url.isEmpty() || !url.isValid() || isSearchUrl(url)) { url = Dolphin::homeUrl(); } - m_urlNavigator->setLocationUrl(url); + m_urlNavigatorConnected->setLocationUrl(url); } m_searchModeEnabled = enabled; @@ -498,8 +536,9 @@ QString DolphinViewContainer::caption() const void DolphinViewContainer::setUrl(const QUrl& newUrl) { - if (newUrl != m_urlNavigator->locationUrl()) { - m_urlNavigator->setLocationUrl(newUrl); + Q_CHECK_PTR(m_urlNavigatorConnected); + if (newUrl != m_urlNavigatorConnected->locationUrl()) { + m_urlNavigatorConnected->setLocationUrl(newUrl); } #ifdef HAVE_KACTIVITIES @@ -560,6 +599,15 @@ void DolphinViewContainer::updateDirectorySortingProgress(int percent) m_statusBar->setProgress(percent); } +void DolphinViewContainer::updateNavigatorWidgetVisibility() +{ + if (m_urlNavigatorConnected == m_urlNavigator && !m_searchBox->isVisible()) { + m_navigatorWidget->setVisible(true); + } else { + m_navigatorWidget->setVisible(false); + } +} + void DolphinViewContainer::slotDirectoryLoadingStarted() { if (isSearchUrl(url())) { @@ -680,7 +728,9 @@ void DolphinViewContainer::slotUrlNavigatorLocationAboutToBeChanged(const QUrl&) void DolphinViewContainer::slotUrlNavigatorLocationChanged(const QUrl& url) { - slotReturnPressed(); + if (m_urlNavigatorConnected) { + m_urlNavigatorConnected->slotReturnPressed(); + } if (KProtocolManager::supportsListing(url)) { setSearchModeEnabled(isSearchUrl(url)); @@ -739,24 +789,13 @@ void DolphinViewContainer::requestFocus() m_view->setFocus(); } -void DolphinViewContainer::saveUrlCompletionMode(KCompletion::CompletionMode completion) -{ - GeneralSettings::setUrlCompletionMode(completion); -} - -void DolphinViewContainer::slotReturnPressed() -{ - if (!GeneralSettings::editableUrl()) { - m_urlNavigator->setUrlEditable(false); - } -} - void DolphinViewContainer::startSearching() { + Q_CHECK_PTR(m_urlNavigatorConnected); const QUrl url = m_searchBox->urlForSearching(); if (url.isValid() && !url.isEmpty()) { m_view->setViewPropertiesContext(QStringLiteral("search")); - m_urlNavigator->setLocationUrl(url); + m_urlNavigatorConnected->setLocationUrl(url); } } |
