From ad5d3367c7fef4c3c11188a768f21a2ee2b3c025 Mon Sep 17 00:00:00 2001 From: Felix Ernst Date: Sun, 14 Jun 2020 16:20:02 +0200 Subject: 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. --- src/dolphinurlnavigator.cpp | 160 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 src/dolphinurlnavigator.cpp (limited to 'src/dolphinurlnavigator.cpp') diff --git a/src/dolphinurlnavigator.cpp b/src/dolphinurlnavigator.cpp new file mode 100644 index 000000000..70f780e55 --- /dev/null +++ b/src/dolphinurlnavigator.cpp @@ -0,0 +1,160 @@ +/* + * Copyright 2020 Felix Ernst + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ + +#include "dolphinurlnavigator.h" + +#include "dolphin_generalsettings.h" +#include "dolphinplacesmodelsingleton.h" +#include "global.h" + +#include +#include +#include + +#include +#include + +DolphinUrlNavigator::DolphinUrlNavigator(QWidget *parent) : + KUrlNavigator(DolphinPlacesModelSingleton::instance().placesModel(), QUrl(), parent) +{ + init(); +} + +DolphinUrlNavigator::DolphinUrlNavigator(const QUrl &url, QWidget *parent) : + KUrlNavigator(DolphinPlacesModelSingleton::instance().placesModel(), url, parent) +{ + init(); +} + +void DolphinUrlNavigator::init() +{ + const GeneralSettings* settings = GeneralSettings::self(); + setUrlEditable(settings->editableUrl()); + setShowFullPath(settings->showFullPath()); + setHomeUrl(Dolphin::homeUrl()); + setPlacesSelectorVisible(s_placesSelectorVisible); + editor()->setCompletionMode(KCompletion::CompletionMode(settings->urlCompletionMode())); + editor()->lineEdit()->installEventFilter(this); + installEventFilter(this); + setWhatsThis(xi18nc("@info:whatsthis location bar", + "This line describes the location of the files and folders " + "displayed below.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 path to the current location because " + "following these folders from left to right leads here." + "This interactive path " + "is more powerful than one would expect. To learn more " + "about the basic and advanced features of the location bar " + "click here. " + "This will open the dedicated page in the Handbook.")); + + s_instances.push_front(this); + + connect(this, &DolphinUrlNavigator::returnPressed, + this, &DolphinUrlNavigator::slotReturnPressed); + connect(editor(), &KUrlComboBox::completionModeChanged, + this, DolphinUrlNavigator::setCompletionMode); +} + +DolphinUrlNavigator::~DolphinUrlNavigator() +{ + s_instances.remove(this); +} + +bool DolphinUrlNavigator::eventFilter(QObject* watched, QEvent* event) +{ + Q_UNUSED(watched) + if (event->type() == QEvent::ChildPolished) { + QChildEvent *childEvent = static_cast(event); + QMenu *popup = qobject_cast(childEvent->child()); + if (popup) { + // The popups of the "breadcrumb mode" navigation buttons + // should not get the action added. They can currently be + // identified by their number of separators: 0 or 1 + // The popups we are interested in have 2 or more separators. + int separatorCount = 0; + for (QAction *action : popup->actions()) { + if (action->isSeparator()) { + separatorCount++; + } + } + if (separatorCount > 1) { + q_check_ptr(s_ActionForContextMenu); + popup->addAction(s_ActionForContextMenu); + } + } + } + return false; +} + +void DolphinUrlNavigator::slotReadSettings() +{ + // 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 navigators and split view. + if (GeneralSettings::modifiedStartupSettings()) { + for (DolphinUrlNavigator *urlNavigator : s_instances) { + urlNavigator->setUrlEditable(GeneralSettings::editableUrl()); + urlNavigator->setShowFullPath(GeneralSettings::showFullPath()); + urlNavigator->setHomeUrl(Dolphin::homeUrl()); + } + } +} + +void DolphinUrlNavigator::slotReturnPressed() +{ + if (!GeneralSettings::editableUrl()) { + setUrlEditable(false); + } +} + +void DolphinUrlNavigator::addToContextMenu(QAction* action) +{ + s_ActionForContextMenu = action; +} + + +void DolphinUrlNavigator::slotPlacesPanelVisibilityChanged(bool visible) +{ + // The places-selector from the URL navigator should only be shown + // if the places dock is invisible + s_placesSelectorVisible = !visible; + + for (DolphinUrlNavigator *urlNavigator : s_instances) { + urlNavigator->setPlacesSelectorVisible(s_placesSelectorVisible); + } +} + +void DolphinUrlNavigator::setCompletionMode(const KCompletion::CompletionMode completionMode) +{ + if (completionMode != GeneralSettings::urlCompletionMode()) + { + GeneralSettings::setUrlCompletionMode(completionMode); + for (const DolphinUrlNavigator *urlNavigator : s_instances) + { + urlNavigator->editor()->setCompletionMode(completionMode); + } + } +} + +std::forward_list DolphinUrlNavigator::s_instances; +bool DolphinUrlNavigator::s_placesSelectorVisible = true; +QAction *DolphinUrlNavigator::s_ActionForContextMenu = nullptr; -- cgit v1.3