File indexing completed on 2024-09-29 06:32:29
0001 /* 0002 This file is part of the KDE project 0003 SPDX-FileCopyrightText: 1998-2009 David Faure <faure@kde.org> 0004 SPDX-FileCopyrightText: 2003 Sven Leiber <s.leiber@web.de> 0005 0006 SPDX-License-Identifier: LGPL-2.0-only OR LGPL-3.0-only 0007 */ 0008 0009 #ifndef KNEWFILEMENU_H 0010 #define KNEWFILEMENU_H 0011 0012 #include "kiofilewidgets_export.h" 0013 0014 #include <KActionMenu> 0015 #include <QUrl> 0016 0017 #include <memory> 0018 0019 class KJob; 0020 0021 class KActionCollection; 0022 class KNewFileMenuPrivate; 0023 0024 /** 0025 * @class KNewFileMenu knewfilemenu.h <KNewFileMenu> 0026 * 0027 * The 'Create New' submenu, for creating files using templates 0028 * (e.g.\ "new HTML file") and directories. 0029 * 0030 * The same instance can be used by both for the File menu and the RMB popup menu, 0031 * in a file manager. This is also used in the file dialog's RMB menu. 0032 * 0033 * To use this class, you need to connect aboutToShow() of the File menu 0034 * with slotCheckUpToDate() and to call slotCheckUpToDate() before showing 0035 * the RMB popupmenu. 0036 * 0037 * KNewFileMenu automatically updates the list of templates shown if installed templates 0038 * are added/updated/deleted. 0039 * 0040 * @author Björn Ruberg <bjoern@ruberg-wegener.de> 0041 * Made dialogs working asynchronously 0042 * @author David Faure <faure@kde.org> 0043 * Ideas and code for the new template handling mechanism ('link' desktop files) 0044 * from Christoph Pickart <pickart@iam.uni-bonn.de> 0045 */ 0046 class KIOFILEWIDGETS_EXPORT KNewFileMenu : public KActionMenu 0047 { 0048 Q_OBJECT 0049 public: 0050 /** 0051 * Constructor. 0052 * 0053 * @param parent the parent object, for ownership. 0054 * If the parent object is a widget, it will also be used as the parent widget 0055 * for any dialogs that this class might show. Otherwise, call setParentWidget. 0056 * 0057 * @since 5.100 0058 */ 0059 KNewFileMenu(QObject *parent); 0060 0061 /** 0062 * Destructor. 0063 * KNewMenu uses internally a globally shared cache, so that multiple instances 0064 * of it don't need to parse the installed templates multiple times. Therefore 0065 * you can safely create and delete KNewMenu instances without a performance issue. 0066 */ 0067 ~KNewFileMenu() override; 0068 0069 /** 0070 * Returns the modality of dialogs 0071 */ 0072 bool isModal() const; 0073 0074 /** 0075 * Sets the modality of dialogs created by KNewFile. Set to false if you do not want to block 0076 * your application window when entering a new directory name i.e. 0077 */ 0078 void setModal(bool modality); 0079 0080 /** 0081 * Sets a parent widget for the dialogs shown by KNewFileMenu. 0082 * This is strongly recommended, for apps with a main window. 0083 */ 0084 void setParentWidget(QWidget *parentWidget); 0085 0086 /** 0087 * Set the working directory. 0088 * Files will be created relative to this directory. 0089 * @since 5.97. 0090 */ 0091 void setWorkingDirectory(const QUrl &directory); 0092 0093 /** 0094 * Returns the working directory. 0095 * Files will be created relative to this directory. 0096 * @since 5.97. 0097 */ 0098 QUrl workingDirectory() const; 0099 0100 /** 0101 * Only show the files in a given set of MIME types. 0102 * This is useful in specialized applications (while file managers, on 0103 * the other hand, want to show all MIME types). 0104 */ 0105 void setSupportedMimeTypes(const QStringList &mime); 0106 0107 /** 0108 * Returns the MIME types set in supportedMimeTypes() 0109 */ 0110 QStringList supportedMimeTypes() const; 0111 0112 /** 0113 * Whether on not the dialog should emit `selectExistingDir` when trying to create an exist directory 0114 * 0115 * default: false 0116 * 0117 * @since 5.76 0118 */ 0119 void setSelectDirWhenAlreadyExist(bool b); 0120 0121 /** 0122 * Use this to set a shortcut for the "New Folder" action. 0123 * 0124 * The shortcut is copied from @param action. 0125 * 0126 * @since 5.100 0127 */ 0128 void setNewFolderShortcutAction(QAction *action); 0129 0130 /** 0131 * Use this to set a shortcut for the new file action. 0132 * 0133 * The shortcut is copied from @param action. 0134 * 0135 * @since 5.100 0136 */ 0137 void setNewFileShortcutAction(QAction *action); 0138 0139 public Q_SLOTS: 0140 /** 0141 * Checks if updating the list is necessary 0142 * IMPORTANT : Call this in the slot for aboutToShow. 0143 */ 0144 void checkUpToDate(); 0145 0146 /** 0147 * Call this to create a new directory as if the user had done it using 0148 * a popupmenu. This is useful to make sure that creating a directory with 0149 * a key shortcut (e.g. F10) triggers the exact same code as when using 0150 * the New menu. 0151 * Requirements: since 5.97 call setWorkingDirectory first (for older releases call setPopupFiles first), and keep this KNewFileMenu instance 0152 * alive (the mkdir is async). 0153 */ 0154 void createDirectory(); 0155 0156 /** 0157 * Call this to create a new file as if the user had done it using 0158 * a popupmenu. This is useful to make sure that creating a directory with 0159 * a key shortcut (e.g. Shift-F10) triggers the exact same code as when using 0160 * the New menu. 0161 * Requirements: since 5.97 call setWorkingDirectory first (for older releases call setPopupFiles first), and keep this KNewFileMenu instance 0162 * alive (the copy is async). 0163 * @since 5.53 0164 */ 0165 void createFile(); 0166 0167 Q_SIGNALS: 0168 /** 0169 * Emitted once the file (or symlink) @p url has been successfully created 0170 */ 0171 void fileCreated(const QUrl &url); 0172 0173 /** 0174 * Emitted once the directory @p url has been successfully created 0175 */ 0176 void directoryCreated(const QUrl &url); 0177 0178 /** 0179 * Emitted when trying to create a new directory that has the same name as 0180 * an existing one, so that KDirOperator can select the existing item in 0181 * the view (in case the user wants to use that directory instead of creating 0182 * a new one). 0183 * 0184 * @since 5.76 0185 */ 0186 void selectExistingDir(const QUrl &url); 0187 0188 protected Q_SLOTS: 0189 0190 /** 0191 * Called when the job that copied the template has finished. 0192 * This method is virtual so that error handling can be reimplemented. 0193 * Make sure to call the base class slotResult when !job->error() though. 0194 */ 0195 virtual void slotResult(KJob *job); 0196 0197 private: 0198 friend class KNewFileMenuPrivate; 0199 std::unique_ptr<KNewFileMenuPrivate> const d; 0200 }; 0201 0202 #endif