File indexing completed on 2024-09-15 12:00:38
0001 /* 0002 This file is part of the KDE project 0003 SPDX-FileCopyrightText: 1998, 1999 Torben Weis <weis@kde.org> 0004 SPDX-FileCopyrightText: 1999, 2000 Preston Brown <pbrown@kde.org> 0005 SPDX-FileCopyrightText: 2000 Simon Hausmann <hausmann@kde.org> 0006 SPDX-FileCopyrightText: 2000 David Faure <faure@kde.org> 0007 0008 SPDX-License-Identifier: LGPL-2.0-or-later 0009 */ 0010 0011 #ifndef KPROPERTIESDIALOG_H 0012 #define KPROPERTIESDIALOG_H 0013 0014 #include <QString> 0015 #include <QUrl> 0016 0017 #include "kiowidgets_export.h" 0018 #include <kfileitem.h> 0019 0020 #include <KPageDialog> 0021 0022 #include <memory> 0023 0024 class KPropertiesDialogPrivate; 0025 class KPropertiesDialogPlugin; 0026 0027 class KJob; 0028 namespace KIO 0029 { 0030 class Job; 0031 } 0032 0033 /** 0034 * @class KPropertiesDialog kpropertiesdialog.h <KPropertiesDialog> 0035 * 0036 * The main properties dialog class. 0037 * A Properties Dialog is a dialog which displays various information 0038 * about a particular file or URL, or several files or URLs. 0039 * This main class holds various related classes, which are instantiated in 0040 * the form of tab entries in the tabbed dialog that this class provides. 0041 * The various tabs themselves will let the user view, and sometimes change, 0042 * information about the file or URL. 0043 * 0044 * \image html kpropertiesdialog.png "Example of KPropertiesDialog" 0045 * 0046 * The best way to display the properties dialog is to use showDialog(). 0047 * Otherwise, you should use (void)new KPropertiesDialog(...) 0048 * It will take care of deleting itself when closed. 0049 * 0050 * If you are looking for more flexibility, see KFileMetaInfo and 0051 * KFileMetaInfoWidget. 0052 * 0053 * This respects the "editfiletype", "run_desktop_files" and "shell_access" 0054 * Kiosk action restrictions (see KAuthorized::authorize()). 0055 */ 0056 class KIOWIDGETS_EXPORT KPropertiesDialog : public KPageDialog 0057 { 0058 Q_OBJECT 0059 0060 public: 0061 /** 0062 * Determine whether there are any property pages available for the 0063 * given file items. 0064 * @param _items the list of items to check. 0065 * @return true if there are any property pages, otherwise false. 0066 */ 0067 static bool canDisplay(const KFileItemList &_items); 0068 0069 /** 0070 * Brings up a Properties dialog, as shown above. 0071 * This is the normal constructor for 0072 * file-manager type applications, where you have a KFileItem instance 0073 * to work with. Normally you will use this 0074 * method rather than the one below. 0075 * 0076 * @param item file item whose properties should be displayed. 0077 * @param parent is the parent of the dialog widget. 0078 */ 0079 explicit KPropertiesDialog(const KFileItem &item, QWidget *parent = nullptr); 0080 0081 /** 0082 * \overload 0083 * 0084 * You use this constructor for cases where you have a number of items, 0085 * rather than a single item. Be careful which methods you use 0086 * when passing a list of files or URLs, since some of them will only 0087 * work on the first item in a list. 0088 * 0089 * @param _items list of file items whose properties should be displayed. 0090 * @param parent is the parent of the dialog widget. 0091 */ 0092 explicit KPropertiesDialog(const KFileItemList &_items, QWidget *parent = nullptr); 0093 0094 /** 0095 * Brings up a Properties dialog. Convenience constructor for 0096 * non-file-manager applications, where you have a QUrl rather than a 0097 * KFileItem or KFileItemList. 0098 * 0099 * @param url the URL whose properties should be displayed 0100 * @param parent is the parent of the dialog widget. 0101 * 0102 * For local files with a known MIME type, simply create a KFileItem 0103 * and pass it to the other constructor. 0104 */ 0105 explicit KPropertiesDialog(const QUrl &url, QWidget *parent = nullptr); 0106 0107 /** 0108 * Brings up a Properties dialog. Convenience constructor for 0109 * non-file-manager applications, where you have a list of QUrls rather 0110 * than a KFileItemList. 0111 * 0112 * @param urls list of URLs whose properties should be displayed (must 0113 * contain at least one non-empty URL) 0114 * @param parent is the parent of the dialog widget. 0115 * 0116 * For local files with a known MIME type, simply create a KFileItemList 0117 * and pass it to the other constructor. 0118 * 0119 * @since 5.10 0120 */ 0121 explicit KPropertiesDialog(const QList<QUrl> &urls, QWidget *parent = nullptr); 0122 0123 /** 0124 * Creates a properties dialog for a new .desktop file (whose name 0125 * is not known yet), based on a template. Special constructor for 0126 * "File / New" in file-manager type applications. 0127 * 0128 * @param _tempUrl template used for reading only 0129 * @param _currentDir directory where the file will be written to 0130 * @param _defaultName something to put in the name field, 0131 * like mimetype.desktop 0132 * @param parent is the parent of the dialog widget. 0133 */ 0134 KPropertiesDialog(const QUrl &_tempUrl, const QUrl &_currentDir, const QString &_defaultName, QWidget *parent = nullptr); 0135 0136 /** 0137 * Creates an empty properties dialog (for applications that want use 0138 * a standard dialog, but for things not doable via the plugin-mechanism). 0139 * 0140 * @param title is the string display as the "filename" in the title of the dialog. 0141 * @param parent is the parent of the dialog widget. 0142 */ 0143 explicit KPropertiesDialog(const QString &title, QWidget *parent = nullptr); 0144 0145 /** 0146 * Cleans up the properties dialog and frees any associated resources, 0147 * including the dialog itself. Note that when a properties dialog is 0148 * closed it cleans up and deletes itself. 0149 */ 0150 ~KPropertiesDialog() override; 0151 0152 /** 0153 * Immediately displays a Properties dialog using constructor with 0154 * the same parameters. 0155 * On MS Windows, if @p item points to a local file, native (non modal) property 0156 * dialog is displayed (@p parent and @p modal are ignored in this case). 0157 * 0158 * @return true on successful dialog displaying (can be false on win32). 0159 */ 0160 static bool showDialog(const KFileItem &item, QWidget *parent = nullptr, bool modal = true); 0161 0162 /** 0163 * Immediately displays a Properties dialog using constructor with 0164 * the same parameters. 0165 * On MS Windows, if @p _url points to a local file, native (non modal) property 0166 * dialog is displayed (@p parent and @p modal are ignored in this case). 0167 * 0168 * @return true on successful dialog displaying (can be false on win32). 0169 */ 0170 static bool showDialog(const QUrl &_url, QWidget *parent = nullptr, bool modal = true); 0171 0172 /** 0173 * Immediately displays a Properties dialog using constructor with 0174 * the same parameters. 0175 * On MS Windows, if @p _items has one element and this element points 0176 * to a local file, native (non modal) property dialog is displayed 0177 * (@p parent and @p modal are ignored in this case). 0178 * 0179 * @return true on successful dialog displaying (can be false on win32). 0180 */ 0181 static bool showDialog(const KFileItemList &_items, QWidget *parent = nullptr, bool modal = true); 0182 0183 /** 0184 * Immediately displays a Properties dialog using constructor with 0185 * the same parameters. 0186 * 0187 * On MS Windows, if @p _urls has one element and this element points 0188 * to a local file, native (non modal) property dialog is displayed 0189 * (@p parent and @p modal are ignored in this case). 0190 * 0191 * @param urls list of URLs whose properties should be displayed (must 0192 * contain at least one non-empty URL) 0193 * @param parent is the parent of the dialog widget. 0194 * @param modal tells the dialog whether it should be modal. 0195 * 0196 * @return true on successful dialog displaying (can be false on win32). 0197 * 0198 * @since 5.10 0199 */ 0200 static bool showDialog(const QList<QUrl> &urls, QWidget *parent = nullptr, bool modal = true); 0201 0202 /** 0203 * Adds a "3rd party" properties plugin to the dialog. Useful 0204 * for extending the properties mechanism. 0205 * 0206 * To create a new plugin type, inherit from the base class KPropertiesDialogPlugin 0207 * and implement all the methods. If you define a service .desktop file 0208 * for your plugin, you do not need to call insertPlugin(). 0209 * 0210 * @param plugin is a pointer to the KPropertiesDialogPlugin. The Properties 0211 * dialog will do destruction for you. The KPropertiesDialogPlugin \b must 0212 * have been created with the KPropertiesDialog as its parent. 0213 * @see KPropertiesDialogPlugin 0214 */ 0215 void insertPlugin(KPropertiesDialogPlugin *plugin); 0216 0217 #if KIOWIDGETS_ENABLE_DEPRECATED_SINCE(5, 0) 0218 /** 0219 * @deprecated since 5.0, use url() 0220 */ 0221 KIOWIDGETS_DEPRECATED_VERSION(5, 0, "Use KPropertiesDialog::url()") 0222 QUrl kurl() const 0223 { 0224 return url(); 0225 } 0226 #endif 0227 0228 /** 0229 * The URL of the file that has its properties being displayed. 0230 * This is only valid if the KPropertiesDialog was created/shown 0231 * for one file or URL. 0232 * 0233 * @return the single URL. 0234 */ 0235 QUrl url() const; 0236 0237 /** 0238 * @return the file item for which the dialog is shown 0239 * 0240 * Warning: this method returns the first item of the list. 0241 * This means that you should use this only if you are sure the dialog is used 0242 * for a single item. Otherwise, you probably want items() instead. 0243 */ 0244 KFileItem &item(); 0245 0246 /** 0247 * @return the items for which the dialog is shown 0248 */ 0249 KFileItemList items() const; 0250 0251 /** 0252 * If the dialog is being built from a template, this method 0253 * returns the current directory. If no template, it returns QString(). 0254 * See the template form of the constructor. 0255 * 0256 * @return the current directory or QString() 0257 */ 0258 QUrl currentDir() const; 0259 0260 /** 0261 * If the dialog is being built from a template, this method 0262 * returns the default name. If no template, it returns QString(). 0263 * See the template form of the constructor. 0264 * @return the default name or QString() 0265 */ 0266 QString defaultName() const; 0267 0268 /** 0269 * Updates the item URL (either called by rename or because 0270 * a global apps/mimelnk desktop file is being saved) 0271 * Can only be called if the dialog applies to a single file or URL. 0272 * @param newUrl the new URL 0273 */ 0274 void updateUrl(const QUrl &newUrl); 0275 0276 /** 0277 * Renames the item to the specified name. This can only be called if 0278 * the dialog applies to a single file or URL. 0279 * @param _name new filename, encoded. 0280 * \see FilePropsDialogPlugin::applyChanges 0281 */ 0282 void rename(const QString &_name); 0283 0284 /** 0285 * To abort applying changes. 0286 */ 0287 void abortApplying(); 0288 0289 /** 0290 * Shows the page that was previously set by 0291 * setFileSharingPage(), or does nothing if no page 0292 * was set yet. 0293 * \see setFileSharingPage 0294 */ 0295 void showFileSharingPage(); 0296 0297 /** 0298 * Sets the file sharing page. 0299 * This page is shown when calling showFileSharingPage(). 0300 * 0301 * @param page the page to set 0302 * 0303 * \note This should only be called by KPropertiesDialog plugins. 0304 * \see showFileSharingPage 0305 */ 0306 void setFileSharingPage(QWidget *page); 0307 0308 /** 0309 * Call this to make the filename lineedit readonly, to prevent the user 0310 * from renaming the file. 0311 * \param ro true if the lineedit should be read only 0312 */ 0313 void setFileNameReadOnly(bool ro); 0314 0315 using KPageDialog::buttonBox; 0316 0317 public Q_SLOTS: 0318 /** 0319 * Called when the user presses 'Ok'. 0320 * @deprecated since 5.25, use accept() 0321 */ 0322 KIOWIDGETS_DEPRECATED_VERSION(5, 25, "Use KPropertiesDialog::accept()") 0323 virtual void slotOk(); 0324 /** 0325 * Called when the user presses 'Cancel'. 0326 * @deprecated since 5.25, use reject() 0327 */ 0328 KIOWIDGETS_DEPRECATED_VERSION(5, 25, "Use KPropertiesDialog::reject()") 0329 virtual void slotCancel(); 0330 0331 /** 0332 * Called when the user presses 'Ok'. 0333 * @since 5.25 0334 */ 0335 void accept() override; 0336 /** 0337 * Called when the user presses 'Cancel' or Esc. 0338 * @since 5.25 0339 */ 0340 void reject() override; 0341 0342 Q_SIGNALS: 0343 /** 0344 * This signal is emitted when the Properties Dialog is closed (for 0345 * example, with OK or Cancel buttons) 0346 */ 0347 void propertiesClosed(); 0348 0349 /** 0350 * This signal is emitted when the properties changes are applied (for 0351 * example, with the OK button) 0352 */ 0353 void applied(); 0354 0355 /** 0356 * This signal is emitted when the properties changes are aborted (for 0357 * example, with the Cancel button) 0358 */ 0359 0360 void canceled(); 0361 /** 0362 * Emitted before changes to @p oldUrl are saved as @p newUrl. 0363 * The receiver may change @p newUrl to point to an alternative 0364 * save location. 0365 */ 0366 void saveAs(const QUrl &oldUrl, QUrl &newUrl); 0367 0368 Q_SIGNALS: 0369 #if KIOWIDGETS_ENABLE_DEPRECATED_SINCE(5, 103) 0370 /** 0371 * @deprecated Since 5.82, not used anymore. 0372 */ 0373 KIOWIDGETS_DEPRECATED_VERSION_BELATED(5, 103, 5, 82, "Not used anymore") 0374 void leaveModality(); 0375 #endif 0376 0377 private: 0378 std::unique_ptr<KPropertiesDialogPrivate> d; 0379 0380 Q_DISABLE_COPY(KPropertiesDialog) 0381 }; 0382 0383 class KPropertiesDialogPluginPrivate; 0384 /** 0385 * A Plugin in the Properties dialog 0386 * This is an abstract class. You must inherit from this class 0387 * to build a new kind of tabbed page for the KPropertiesDialog. 0388 * A plugin in itself is just a library containing code, not a dialog's page. 0389 * It's up to the plugin to insert pages into the parent dialog. 0390 * 0391 * To make a plugin available, ensure it has embedded json metadata (look for 0392 * K_PLUGIN_CLASS_WITH_JSON) and install the plugin in "\<plugins_dir>/kf5/propertiesdialog/". 0393 * (By default KDE uses the same plugins dir as Qt, you can find the @c plugins_dir path on 0394 * your system by running <tt>qtpaths --plugin-dir</tt> or <tt>qmake QT_INSTALL_PLUGINS</tt> 0395 * in terminal). 0396 * 0397 * The metadata can contain the MIME types for which the plugin should be created. 0398 * For instance: 0399 * @verbatim 0400 { 0401 "KPlugin": { 0402 "MimeTypes": ["text/html", "application/x-mymimetype"] 0403 } 0404 } 0405 @endverbatim 0406 * If the MIME types are empty or not specified, the plugin will be created for all MIME types. 0407 * 0408 * You can also include X-KDE-Protocol=file if you want that plugin 0409 * to be loaded only for local files, for instance. 0410 */ 0411 class KIOWIDGETS_EXPORT KPropertiesDialogPlugin : public QObject 0412 { 0413 Q_OBJECT 0414 public: 0415 /** 0416 * Constructor 0417 * To insert tabs into the properties dialog, use the add methods provided by 0418 * KPageDialog (the properties dialog is a KPageDialog). 0419 */ 0420 KPropertiesDialogPlugin(KPropertiesDialog *_props); 0421 ~KPropertiesDialogPlugin() override; 0422 0423 /** 0424 * Applies all changes to the file. 0425 * This function is called when the user presses 'Ok'. The last plugin inserted 0426 * is called first. 0427 */ 0428 virtual void applyChanges(); 0429 0430 #if KIOWIDGETS_ENABLE_DEPRECATED_SINCE(4, 1) 0431 /** 0432 * Convenience method for most ::supports methods 0433 * @return true if the file is a local, regular, readable, desktop file 0434 * @deprecated Since 4.1, use KFileItem::isDesktopFile 0435 */ 0436 KIOWIDGETS_DEPRECATED_VERSION(4, 1, "Use KFileItem::isDesktopFile()") 0437 static bool isDesktopFile(const KFileItem &_item); 0438 #endif 0439 0440 void setDirty(bool b); 0441 bool isDirty() const; 0442 0443 public Q_SLOTS: 0444 void setDirty(); // same as setDirty( true ). TODO KDE5: void setDirty(bool dirty=true); 0445 0446 Q_SIGNALS: 0447 /** 0448 * Emit this signal when the user changed anything in the plugin's tabs. 0449 * The hosting PropertiesDialog will call applyChanges only if the 0450 * PropsPlugin has emitted this signal or if you have called setDirty() before. 0451 */ 0452 void changed(); 0453 0454 protected: 0455 /** 0456 * Pointer to the dialog 0457 */ 0458 KPropertiesDialog *properties; 0459 0460 /** 0461 * Returns the font height. 0462 */ 0463 int fontHeight() const; 0464 0465 private: 0466 std::unique_ptr<KPropertiesDialogPluginPrivate> d; 0467 }; 0468 0469 #endif