/* * 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;