mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-12 12:54:29 +00:00
![Nate Graham](/assets/img/avatar_default.png)
Right now it is not super obvious how you connect to a remote server in Dolphin when you already know the URL. Users will go to the "Network" item in the Places panel, but from there it is not totally clear. The "Add Network Folder" icon in the view opens a complicated wizard and it's also a bit of an odd UX to have it living in the view as opposed to being a toolbar button. Old hands and developers know that the URL navigator is, well, a URL navigator, and as such, it accepts arbitrary URLs from any view. However this may not be obvious to other more casual users, for two reasons: 1. The URL navigator is in breadcrumbs view nearly all of the time and by default, so may users may not know that it can accept text at all 2. Even when it's displaying URLs, they are almost always local paths, so users may not make the connection that it can accept remote URLs rather that just local paths To improve the discoverability of this feature, this commit makes the following change: When the view is displaying the remote:/ ioslave (i.e. the "Networks" place), the URL navigator is put into URL entry mode and given some placeholder text that hints at what it can do. It reverts to breadcrumbs mode when you leave. BUG: 414670 FIXED-IN: 21.04
120 lines
4.2 KiB
C++
120 lines
4.2 KiB
C++
/*
|
|
This file is part of the KDE project
|
|
SPDX-FileCopyrightText: 2020 Felix Ernst <fe.a.ernst@gmail.com>
|
|
|
|
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 <KUrlComboBox>
|
|
#include <KLocalizedString>
|
|
|
|
#include <QAbstractButton>
|
|
#include <QLayout>
|
|
#include <QLineEdit>
|
|
|
|
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",
|
|
"<para>This 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>"));
|
|
|
|
DolphinUrlNavigatorsController::registerDolphinUrlNavigator(this);
|
|
|
|
connect(this, &KUrlNavigator::returnPressed,
|
|
this, &DolphinUrlNavigator::slotReturnPressed);
|
|
}
|
|
|
|
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<QAbstractButton *>(widget);
|
|
if (button && button->icon().isNull()) {
|
|
widthHint += widget->minimumSizeHint().width();
|
|
}
|
|
}
|
|
return QSize(widthHint, KUrlNavigator::sizeHint().height());
|
|
}
|
|
|
|
std::unique_ptr<DolphinUrlNavigator::VisualState> DolphinUrlNavigator::visualState() const
|
|
{
|
|
std::unique_ptr<VisualState> 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::slotReturnPressed()
|
|
{
|
|
if (!GeneralSettings::editableUrl()) {
|
|
setUrlEditable(false);
|
|
}
|
|
}
|