diff options
Diffstat (limited to 'src/dolphinurlnavigator.cpp')
| -rw-r--r-- | src/dolphinurlnavigator.cpp | 160 |
1 files changed, 160 insertions, 0 deletions
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 <[email protected]> + * + * 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 <https://www.gnu.org/licenses/>. + */ + +#include "dolphinurlnavigator.h" + +#include "dolphin_generalsettings.h" +#include "dolphinplacesmodelsingleton.h" +#include "global.h" + +#include <KToggleAction> +#include <KUrlComboBox> +#include <KLocalizedString> + +#include <QLineEdit> +#include <QMenu> + +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", + "<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>This interactive path " + "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>")); + + 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<QChildEvent *>(event); + QMenu *popup = qobject_cast<QMenu *>(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 *> DolphinUrlNavigator::s_instances; +bool DolphinUrlNavigator::s_placesSelectorVisible = true; +QAction *DolphinUrlNavigator::s_ActionForContextMenu = nullptr; |
