/* This file is part of the KDE project SPDX-FileCopyrightText: 2020 Felix Ernst SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL */ #include "dolphinurlnavigator.h" #include "dolphin_generalsettings.h" #include "dolphinplacesmodelsingleton.h" #include "dolphinurlnavigatorscontroller.h" #include "global.h" #include #include #include #include #include #include #include DolphinUrlNavigator::DolphinUrlNavigator(QWidget *parent) : DolphinUrlNavigator(QUrl(), parent) { } DolphinUrlNavigator::DolphinUrlNavigator(const QUrl &url, QWidget *parent) : KUrlNavigator(DolphinPlacesModelSingleton::instance().placesModel(), url, parent) { const GeneralSettings *settings = GeneralSettings::self(); setUrlEditable(settings->editableUrl()); setShowFullPath(settings->showFullPath()); setHomeUrl(Dolphin::homeUrl()); setPlacesSelectorVisible(DolphinUrlNavigatorsController::placesSelectorVisible()); editor()->setCompletionMode(KCompletion::CompletionMode(settings->urlCompletionMode())); setWhatsThis(xi18nc("@info:whatsthis location bar", "This 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.")); DolphinUrlNavigatorsController::registerDolphinUrlNavigator(this); connect(this, &KUrlNavigator::returnPressed, this, &DolphinUrlNavigator::slotReturnPressed); auto readOnlyBadge = new QLabel(); readOnlyBadge->setPixmap(QIcon::fromTheme(QStringLiteral("emblem-readonly")).pixmap(12, 12)); readOnlyBadge->setToolTip(i18nc("@info:tooltip of a 'locked' symbol in url navigator", "This folder is not writable for you.")); readOnlyBadge->hide(); setBadgeWidget(readOnlyBadge); } DolphinUrlNavigator::~DolphinUrlNavigator() { DolphinUrlNavigatorsController::unregisterDolphinUrlNavigator(this); } QSize DolphinUrlNavigator::sizeHint() const { if (isUrlEditable()) { return editor()->lineEdit()->sizeHint(); } int widthHint = 0; for (int i = 0; i < layout()->count(); ++i) { QWidget *widget = layout()->itemAt(i)->widget(); const QAbstractButton *button = qobject_cast(widget); if (button && button->icon().isNull()) { widthHint += widget->minimumSizeHint().width(); } } if (readOnlyBadgeVisible()) { widthHint += badgeWidget()->sizeHint().width(); } return QSize(widthHint, KUrlNavigator::sizeHint().height()); } std::unique_ptr DolphinUrlNavigator::visualState() const { std::unique_ptr visualState{new VisualState}; visualState->isUrlEditable = (isUrlEditable()); const QLineEdit *lineEdit = editor()->lineEdit(); visualState->hasFocus = lineEdit->hasFocus(); visualState->text = lineEdit->text(); visualState->cursorPosition = lineEdit->cursorPosition(); visualState->selectionStart = lineEdit->selectionStart(); visualState->selectionLength = lineEdit->selectionLength(); return visualState; } void DolphinUrlNavigator::setVisualState(const VisualState &visualState) { setUrlEditable(visualState.isUrlEditable); if (!visualState.isUrlEditable) { return; } editor()->lineEdit()->setText(visualState.text); if (visualState.hasFocus) { editor()->lineEdit()->setFocus(); editor()->lineEdit()->setCursorPosition(visualState.cursorPosition); if (visualState.selectionStart != -1) { editor()->lineEdit()->setSelection(visualState.selectionStart, visualState.selectionLength); } } } void DolphinUrlNavigator::clearText() const { editor()->lineEdit()->clear(); } void DolphinUrlNavigator::setPlaceholderText(const QString &text) { editor()->lineEdit()->setPlaceholderText(text); } void DolphinUrlNavigator::setReadOnlyBadgeVisible(bool visible) { QWidget *readOnlyBadge = badgeWidget(); if (readOnlyBadge) { readOnlyBadge->setVisible(visible); } } bool DolphinUrlNavigator::readOnlyBadgeVisible() const { QWidget *readOnlyBadge = badgeWidget(); if (readOnlyBadge) { return readOnlyBadge->isVisible(); } return false; } void DolphinUrlNavigator::slotReturnPressed() { if (!GeneralSettings::editableUrl()) { setUrlEditable(false); } } void DolphinUrlNavigator::keyPressEvent(QKeyEvent *keyEvent) { if (keyEvent->key() == Qt::Key_Escape && !isUrlEditable()) { Q_EMIT requestToLoseFocus(); return; } KUrlNavigator::keyPressEvent(keyEvent); } #include "moc_dolphinurlnavigator.cpp"