1 | /* |
2 | This file is part of the KDE libraries |
3 | SPDX-FileCopyrightText: 2001, 2002, 2003 Carsten Pfeiffer <pfeiffer@kde.org> |
4 | SPDX-FileCopyrightText: 2007 Kevin Ottens <ervin@kde.org> |
5 | |
6 | SPDX-License-Identifier: LGPL-2.0-only |
7 | */ |
8 | |
9 | #include "kfileplaceeditdialog.h" |
10 | |
11 | #include <KAboutData> |
12 | #include <KConfig> |
13 | #include <KIconButton> |
14 | #include <KLineEdit> // For KUrlRequester::lineEdit() |
15 | #include <KLocalizedString> |
16 | #include <kio/global.h> |
17 | #include <kprotocolinfo.h> |
18 | #include <kurlrequester.h> |
19 | |
20 | #include <QApplication> |
21 | #include <QCheckBox> |
22 | #include <QDialogButtonBox> |
23 | #include <QFormLayout> |
24 | #include <qdrawutil.h> |
25 | |
26 | #include <KConfigGroup> |
27 | #include <qplatformdefs.h> |
28 | |
29 | bool KFilePlaceEditDialog::getInformation(bool allowGlobal, |
30 | QUrl &url, |
31 | QString &label, |
32 | QString &icon, |
33 | bool isAddingNewPlace, |
34 | bool &appLocal, |
35 | int iconSize, |
36 | QWidget *parent) |
37 | { |
38 | KFilePlaceEditDialog *dialog = new KFilePlaceEditDialog(allowGlobal, url, label, icon, isAddingNewPlace, appLocal, iconSize, parent); |
39 | if (dialog->exec() == QDialog::Accepted) { |
40 | // set the return parameters |
41 | url = dialog->url(); |
42 | label = dialog->label(); |
43 | icon = dialog->icon(); |
44 | appLocal = dialog->applicationLocal(); |
45 | |
46 | delete dialog; |
47 | return true; |
48 | } |
49 | |
50 | delete dialog; |
51 | return false; |
52 | } |
53 | |
54 | KFilePlaceEditDialog::KFilePlaceEditDialog(bool allowGlobal, |
55 | const QUrl &url, |
56 | const QString &label, |
57 | const QString &icon, |
58 | bool isAddingNewPlace, |
59 | bool appLocal, |
60 | int iconSize, |
61 | QWidget *parent) |
62 | : QDialog(parent) |
63 | , m_iconButton(nullptr) |
64 | { |
65 | if (isAddingNewPlace) { |
66 | setWindowTitle(i18n("Add Places Entry" )); |
67 | } else { |
68 | setWindowTitle(i18n("Edit Places Entry" )); |
69 | } |
70 | setModal(true); |
71 | |
72 | QVBoxLayout *box = new QVBoxLayout(this); |
73 | |
74 | QFormLayout *layout = new QFormLayout(); |
75 | box->addLayout(layout); |
76 | |
77 | QString whatsThisText = i18n( |
78 | "<qt>This is the text that will appear in the Places panel.<br /><br />" |
79 | "The label should consist of one or two words " |
80 | "that will help you remember what this entry refers to. " |
81 | "If you do not enter a label, it will be derived from " |
82 | "the location's URL.</qt>" ); |
83 | m_labelEdit = new QLineEdit(this); |
84 | layout->addRow(i18n("L&abel:" ), field: m_labelEdit); |
85 | m_labelEdit->setText(label); |
86 | m_labelEdit->setPlaceholderText(i18n("Enter descriptive label here" )); |
87 | m_labelEdit->setWhatsThis(whatsThisText); |
88 | layout->labelForField(field: m_labelEdit)->setWhatsThis(whatsThisText); |
89 | |
90 | whatsThisText = i18n( |
91 | "<qt>This is the location associated with the entry. Any valid URL may be used. For example:<br /><br />" |
92 | "%1<br />http://www.kde.org<br />ftp://ftp.kde.org/pub/kde/stable<br /><br />" |
93 | "By clicking on the button next to the text edit box you can browse to an " |
94 | "appropriate URL.</qt>" , |
95 | QDir::homePath()); |
96 | m_urlEdit = new KUrlRequester(url, this); |
97 | m_urlEdit->setMode(KFile::Directory); |
98 | layout->addRow(i18n("&Location:" ), field: m_urlEdit); |
99 | m_urlEdit->setWhatsThis(whatsThisText); |
100 | layout->labelForField(field: m_urlEdit)->setWhatsThis(whatsThisText); |
101 | // Room for at least 40 chars (average char width is half of height) |
102 | m_urlEdit->setMinimumWidth(m_urlEdit->fontMetrics().height() * (40 / 2)); |
103 | |
104 | whatsThisText = i18n( |
105 | "<qt>This is the icon that will appear in the Places panel.<br /><br />" |
106 | "Click on the button to select a different icon.</qt>" ); |
107 | m_iconButton = new KIconButton(this); |
108 | m_iconButton->setObjectName(QStringLiteral("icon button" )); |
109 | m_iconButton->setIconSize(iconSize); |
110 | m_iconButton->setIconType(group: KIconLoader::NoGroup, context: KIconLoader::Place); |
111 | if (icon.isEmpty()) { |
112 | m_iconButton->setIcon(KIO::iconNameForUrl(url)); |
113 | } else { |
114 | m_iconButton->setIcon(icon); |
115 | } |
116 | m_iconButton->setWhatsThis(whatsThisText); |
117 | |
118 | if (url.scheme() == QLatin1String("trash" )) { |
119 | // Since there are separate trash icons when it is empty/non-empty, |
120 | // the trash item's icon is made non-editable for simplicity |
121 | m_iconButton->hide(); |
122 | // making the trash item's url editable misleads users into |
123 | // thinking that the actual trash location is configurable here |
124 | m_urlEdit->setDisabled(true); |
125 | } else { |
126 | layout->addRow(i18n("Choose an &icon:" ), field: m_iconButton); |
127 | layout->labelForField(field: m_iconButton)->setWhatsThis(whatsThisText); |
128 | } |
129 | |
130 | if (allowGlobal) { |
131 | QString appName; |
132 | appName = QGuiApplication::applicationDisplayName(); |
133 | if (appName.isEmpty()) { |
134 | appName = QCoreApplication::applicationName(); |
135 | } |
136 | m_appLocal = new QCheckBox(i18n("&Only show when using this application (%1)" , appName), this); |
137 | m_appLocal->setChecked(appLocal); |
138 | m_appLocal->setWhatsThis( |
139 | i18n("<qt>Select this setting if you want this " |
140 | "entry to show only when using the current application (%1).<br /><br />" |
141 | "If this setting is not selected, the entry will be available in all " |
142 | "applications.</qt>" , |
143 | appName)); |
144 | box->addWidget(m_appLocal); |
145 | } else { |
146 | m_appLocal = nullptr; |
147 | } |
148 | connect(sender: m_urlEdit->lineEdit(), signal: &QLineEdit::textChanged, context: this, slot: &KFilePlaceEditDialog::urlChanged); |
149 | if (!label.isEmpty()) { |
150 | // editing existing entry |
151 | m_labelEdit->setFocus(); |
152 | } else { |
153 | // new entry |
154 | m_urlEdit->setFocus(); |
155 | } |
156 | |
157 | m_buttonBox = new QDialogButtonBox(this); |
158 | m_buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); |
159 | connect(sender: m_buttonBox, signal: &QDialogButtonBox::accepted, context: this, slot: &QDialog::accept); |
160 | connect(sender: m_buttonBox, signal: &QDialogButtonBox::rejected, context: this, slot: &QDialog::reject); |
161 | box->addWidget(m_buttonBox); |
162 | } |
163 | |
164 | KFilePlaceEditDialog::~KFilePlaceEditDialog() |
165 | { |
166 | } |
167 | |
168 | void KFilePlaceEditDialog::urlChanged(const QString &text) |
169 | { |
170 | m_buttonBox->button(which: QDialogButtonBox::Ok)->setEnabled(!text.isEmpty()); |
171 | } |
172 | |
173 | QUrl KFilePlaceEditDialog::url() const |
174 | { |
175 | return m_urlEdit->url(); |
176 | } |
177 | |
178 | QString KFilePlaceEditDialog::label() const |
179 | { |
180 | if (!m_labelEdit->text().isEmpty()) { |
181 | return m_labelEdit->text(); |
182 | } |
183 | |
184 | // derive descriptive label from the URL |
185 | QUrl url = m_urlEdit->url(); |
186 | if (!url.fileName().isEmpty()) { |
187 | return url.fileName(); |
188 | } |
189 | if (!url.host().isEmpty()) { |
190 | return url.host(); |
191 | } |
192 | return url.scheme(); |
193 | } |
194 | |
195 | QString KFilePlaceEditDialog::icon() const |
196 | { |
197 | return m_iconButton->icon(); |
198 | } |
199 | |
200 | bool KFilePlaceEditDialog::applicationLocal() const |
201 | { |
202 | if (!m_appLocal) { |
203 | return true; |
204 | } |
205 | |
206 | return m_appLocal->isChecked(); |
207 | } |
208 | |
209 | #include "moc_kfileplaceeditdialog.cpp" |
210 | |