File indexing completed on 2024-12-08 03:40:50
0001 /* 0002 This file is part of the KDE libraries 0003 SPDX-FileCopyrightText: 1999, 2000, 2001 Carsten Pfeiffer <pfeiffer@kde.org> 0004 SPDX-FileCopyrightText: 2013 Teo Mrnjavac <teo@kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.0-only 0007 */ 0008 0009 #ifndef KURLREQUESTER_H 0010 #define KURLREQUESTER_H 0011 0012 #include "kiowidgets_export.h" 0013 0014 #include <KEditListWidget> 0015 #include <kfile.h> 0016 0017 #include <QFileDialog> 0018 #include <QPushButton> 0019 #include <QUrl> 0020 0021 #include <memory> 0022 0023 class KComboBox; 0024 class KLineEdit; 0025 class KUrlCompletion; 0026 0027 class QEvent; 0028 class QString; 0029 0030 /** 0031 * @class KUrlRequester kurlrequester.h <KUrlRequester> 0032 * 0033 * This class is a widget showing a lineedit and a button, which invokes a 0034 * filedialog. File name completion is available in the lineedit. 0035 * 0036 * The default for the filedialog is to ask for one existing local file, i.e. 0037 * the default mode is 'KFile::File | KFile::ExistingOnly | KFile::LocalOnly', 0038 * which you can change by using setMode(). 0039 * 0040 * The default filter is "*", i.e. show all files, which you can change by 0041 * using setNameFilters() or setMimeTypeFilters(). 0042 * 0043 * By default the start directory is the current working directory, or the 0044 * last directory where a file has been selected previously, you can change 0045 * this behavior by calling setStartDir(). 0046 * 0047 * The default window modality for the file dialog is Qt::ApplicationModal 0048 * 0049 * \image html kurlrequester.png "KUrlRequester" 0050 * 0051 * @short A widget to request a filename/url from the user 0052 * @author Carsten Pfeiffer <pfeiffer@kde.org> 0053 */ 0054 class KIOWIDGETS_EXPORT KUrlRequester : public QWidget 0055 { 0056 Q_OBJECT 0057 Q_PROPERTY(QUrl url READ url WRITE setUrl NOTIFY textChanged USER true) 0058 /// @since 5.108 0059 Q_PROPERTY(QStringList nameFilters READ nameFilters WRITE setNameFilters) 0060 Q_PROPERTY(KFile::Modes mode READ mode WRITE setMode) 0061 Q_PROPERTY(QFileDialog::AcceptMode acceptMode READ acceptMode WRITE setAcceptMode) 0062 Q_PROPERTY(QString placeholderText READ placeholderText WRITE setPlaceholderText) 0063 Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) 0064 Q_PROPERTY(Qt::WindowModality fileDialogModality READ fileDialogModality WRITE setFileDialogModality) 0065 0066 public: 0067 /** 0068 * Constructs a KUrlRequester widget. 0069 */ 0070 explicit KUrlRequester(QWidget *parent = nullptr); 0071 0072 /** 0073 * Constructs a KUrlRequester widget with the initial URL @p url. 0074 */ 0075 explicit KUrlRequester(const QUrl &url, QWidget *parent = nullptr); 0076 0077 /** 0078 * Special constructor, which creates a KUrlRequester widget with a custom 0079 * edit-widget. The edit-widget can be either a KComboBox or a KLineEdit 0080 * (or inherited thereof). Note: for geometry management reasons, the 0081 * edit-widget is reparented to have the KUrlRequester as parent. 0082 */ 0083 KUrlRequester(QWidget *editWidget, QWidget *parent); 0084 /** 0085 * Destructs the KUrlRequester. 0086 */ 0087 ~KUrlRequester() override; 0088 0089 /** 0090 * @returns the current url in the lineedit. May be malformed, if the user 0091 * entered something weird. For local files, ~user or environment variables 0092 * are substituted, relative paths will be resolved against startDir() 0093 */ 0094 QUrl url() const; 0095 0096 /** 0097 * @returns the current start dir 0098 */ 0099 QUrl startDir() const; 0100 0101 /** 0102 * @returns the current text in the lineedit or combobox. 0103 * This does not do the URL expansion that url() does, it's only provided 0104 * for cases where KUrlRequester is used to enter URL-or-something-else, 0105 * like KOpenWithDialog where you can type a full command with arguments. 0106 * 0107 */ 0108 QString text() const; 0109 0110 /** 0111 * Sets the mode of the file dialog. 0112 * 0113 * The default mode of the file dialog is 'KFile::File | KFile::ExistingOnly | KFile::LocalOnly', 0114 * which you can change using this method. 0115 * 0116 * @note You can only select one file from the file dialog invoked 0117 * by KUrlRequester, hence setting KFile::Files doesn't make 0118 * much sense here. 0119 * 0120 * @param mode an OR'ed combination of KFile::Modes flags 0121 * 0122 * @see QFileDialog::setFileMode() 0123 */ 0124 void setMode(KFile::Modes mode); 0125 0126 /** 0127 * Returns the current mode 0128 * @see QFileDialog::fileMode() 0129 */ 0130 KFile::Modes mode() const; 0131 0132 /** 0133 * Sets the open / save mode of the file dialog. 0134 * 0135 * The default is QFileDialog::AcceptOpen. 0136 * 0137 * @see QFileDialog::setAcceptMode() 0138 * @since 5.33 0139 */ 0140 void setAcceptMode(QFileDialog::AcceptMode m); 0141 0142 /** 0143 * Returns the current open / save mode 0144 * @see QFileDialog::acceptMode() 0145 * @since 5.33 0146 */ 0147 QFileDialog::AcceptMode acceptMode() const; 0148 0149 /** 0150 * Sets the filters for the file dialog. 0151 * @see QFileDialog::setNameFilters() 0152 * @since 5.108 0153 */ 0154 void setNameFilters(const QStringList &filters); 0155 0156 /** 0157 * Sets the filters for the file dialog. 0158 * @see QFileDialog::setNameFilter() 0159 * @since 5.108 0160 */ 0161 void setNameFilter(const QString &filter); 0162 0163 /** 0164 * Returns the filters for the file dialog. 0165 * @see QFileDialog::nameFilters() 0166 * @since 5.108 0167 */ 0168 QStringList nameFilters() const; 0169 0170 /** 0171 * Sets the MIME type filters for the file dialog. 0172 * @see QFileDialog::setMimeTypeFilters() 0173 * @since 5.31 0174 */ 0175 void setMimeTypeFilters(const QStringList &mimeTypes); 0176 /** 0177 * Returns the MIME type filters for the file dialog. 0178 * @see QFileDialog::mimeTypeFilters() 0179 * @since 5.31 0180 */ 0181 QStringList mimeTypeFilters() const; 0182 0183 /** 0184 * @returns a pointer to the filedialog. 0185 * You can use this to customize the dialog, e.g. to call setLocationLabel 0186 * or other things which are not accessible in the KUrlRequester API. 0187 * 0188 * Never returns 0. This method creates the file dialog on demand. 0189 * 0190 * @deprecated since 5.0. The dialog will be created anyway when the user 0191 * requests it, and will behave according to the properties of KUrlRequester. 0192 */ 0193 KIOWIDGETS_DEPRECATED_VERSION(5, 0, "See API docs") 0194 virtual QFileDialog *fileDialog() const; 0195 0196 /** 0197 * @returns a pointer to the lineedit, either the default one, or the 0198 * special one, if you used the special constructor. 0199 * 0200 * It is provided so that you can e.g. set an own completion object 0201 * (e.g. KShellCompletion) into it. 0202 */ 0203 KLineEdit *lineEdit() const; 0204 0205 /** 0206 * @returns a pointer to the combobox, in case you have set one using the 0207 * special constructor. Returns 0L otherwise. 0208 */ 0209 KComboBox *comboBox() const; 0210 0211 /** 0212 * @returns a pointer to the pushbutton. It is provided so that you can 0213 * specify an own pixmap or a text, if you really need to. 0214 */ 0215 QPushButton *button() const; 0216 0217 /** 0218 * @returns the KUrlCompletion object used in the lineedit/combobox. 0219 */ 0220 KUrlCompletion *completionObject() const; 0221 0222 /** 0223 * @returns an object, suitable for use with KEditListWidget. It allows you 0224 * to put this KUrlRequester into a KEditListWidget. 0225 * Basically, do it like this: 0226 * \code 0227 * KUrlRequester *req = new KUrlRequester( someWidget ); 0228 * [...] 0229 * KEditListWidget *editListWidget = new KEditListWidget( req->customEditor(), someWidget ); 0230 * \endcode 0231 */ 0232 const KEditListWidget::CustomEditor &customEditor(); 0233 0234 /** 0235 * @return the message set with setPlaceholderText 0236 * @since 5.0 0237 */ 0238 QString placeholderText() const; 0239 0240 /** 0241 * This makes the KUrlRequester line edit display a grayed-out hinting text as long as 0242 * the user didn't enter any text. It is often used as indication about 0243 * the purpose of the line edit. 0244 * @since 5.0 0245 */ 0246 void setPlaceholderText(const QString &msg); 0247 0248 /** 0249 * @returns the window modality of the file dialog set with setFileDialogModality 0250 */ 0251 Qt::WindowModality fileDialogModality() const; 0252 0253 /** 0254 * Set the window modality for the file dialog to @p modality 0255 * Directory selection dialogs are always modal 0256 * 0257 * The default is Qt::ApplicationModal. 0258 * 0259 */ 0260 void setFileDialogModality(Qt::WindowModality modality); 0261 0262 public Q_SLOTS: 0263 /** 0264 * Sets the url in the lineedit to @p url. 0265 */ 0266 void setUrl(const QUrl &url); 0267 0268 /** 0269 * Sets the start dir @p startDir. 0270 * The start dir is only used when the URL isn't set. 0271 */ 0272 void setStartDir(const QUrl &startDir); 0273 0274 /** 0275 * Sets the current text in the lineedit or combobox. 0276 * This is used for cases where KUrlRequester is used to 0277 * enter URL-or-something-else, like KOpenWithDialog where you 0278 * can type a full command with arguments. 0279 * 0280 * @see text 0281 */ 0282 void setText(const QString &text); 0283 0284 /** 0285 * Clears the lineedit/combobox. 0286 */ 0287 void clear(); 0288 0289 Q_SIGNALS: 0290 // forwards from LineEdit 0291 /** 0292 * Emitted when the text in the lineedit changes. 0293 * The parameter contains the contents of the lineedit. 0294 */ 0295 void textChanged(const QString &); 0296 0297 /** 0298 * Emitted when the text in the lineedit was modified by the user. 0299 * Unlike textChanged(), this signal is not emitted when the text is changed programmatically, for example, by calling setText(). 0300 * @since 5.21 0301 */ 0302 void textEdited(const QString &); 0303 0304 /** 0305 * Emitted when return or enter was pressed in the lineedit. 0306 * The parameter contains the contents of the lineedit. 0307 */ 0308 void returnPressed(const QString &text); 0309 0310 /** 0311 * Emitted before the filedialog is going to open. Connect 0312 * to this signal to "configure" the filedialog, e.g. set the 0313 * filefilter, the mode, a preview-widget, etc. It's usually 0314 * not necessary to set a URL for the filedialog, as it will 0315 * get set properly from the editfield contents. 0316 * 0317 * If you use multiple KUrlRequesters, you can connect all of them 0318 * to the same slot and use the given KUrlRequester pointer to know 0319 * which one is going to open. 0320 */ 0321 void openFileDialog(KUrlRequester *); 0322 0323 /** 0324 * Emitted when the user changed the URL via the file dialog. 0325 * The parameter contains the contents of the lineedit. 0326 */ 0327 void urlSelected(const QUrl &); 0328 0329 protected: 0330 void changeEvent(QEvent *e) override; 0331 bool eventFilter(QObject *obj, QEvent *ev) override; 0332 0333 private: 0334 class KUrlRequesterPrivate; 0335 std::unique_ptr<KUrlRequesterPrivate> const d; 0336 0337 Q_DISABLE_COPY(KUrlRequester) 0338 }; 0339 0340 class KIOWIDGETS_EXPORT KUrlComboRequester : public KUrlRequester // krazy:exclude=dpointer (For use in Qt Designer) 0341 { 0342 Q_OBJECT 0343 public: 0344 /** 0345 * Constructs a KUrlRequester widget with a combobox. 0346 */ 0347 explicit KUrlComboRequester(QWidget *parent = nullptr); 0348 0349 private: 0350 class Private; 0351 Private *const d; 0352 }; 0353 0354 #endif // KURLREQUESTER_H