| 1 | /* |
| 2 | This file is part of the KDE libraries |
| 3 | SPDX-FileCopyrightText: 2000 Kurt Granroth <granroth@kde.org> |
| 4 | SPDX-FileCopyrightText: 2006 Hamish Rodda <rodda@kde.org> |
| 5 | |
| 6 | SPDX-License-Identifier: LGPL-2.0-only |
| 7 | */ |
| 8 | |
| 9 | #ifndef KEDITTOOLBARP_H |
| 10 | #define KEDITTOOLBARP_H |
| 11 | |
| 12 | #include "kxmlguiclient.h" |
| 13 | #include <QDialog> |
| 14 | #include <QListWidget> |
| 15 | |
| 16 | class QDialogButtonBox; |
| 17 | class QLineEdit; |
| 18 | class QCheckBox; |
| 19 | |
| 20 | namespace KDEPrivate |
| 21 | { |
| 22 | class ToolBarItem; |
| 23 | class KEditToolBarWidgetPrivate; |
| 24 | |
| 25 | class ToolBarListWidget : public QListWidget |
| 26 | { |
| 27 | Q_OBJECT |
| 28 | public: |
| 29 | explicit ToolBarListWidget(QWidget *parent = nullptr); |
| 30 | |
| 31 | void makeVisible(QListWidgetItem *item) |
| 32 | { |
| 33 | scrollTo(index: indexFromItem(item)); |
| 34 | } |
| 35 | |
| 36 | ToolBarItem *currentItem() const; |
| 37 | |
| 38 | void setActiveList(bool isActiveList) |
| 39 | { |
| 40 | m_activeList = isActiveList; |
| 41 | } |
| 42 | |
| 43 | Q_SIGNALS: |
| 44 | void dropped(ToolBarListWidget *list, int index, ToolBarItem *item, bool sourceIsActiveList); |
| 45 | |
| 46 | protected: |
| 47 | Qt::DropActions supportedDropActions() const override |
| 48 | { |
| 49 | return Qt::MoveAction; |
| 50 | } |
| 51 | QStringList mimeTypes() const override |
| 52 | { |
| 53 | return QStringList() << QStringLiteral("application/x-kde-action-list" ); |
| 54 | } |
| 55 | |
| 56 | QMimeData *mimeData(const QList<QListWidgetItem *> &items) const override; |
| 57 | |
| 58 | bool dropMimeData(int index, const QMimeData *data, Qt::DropAction action) override; |
| 59 | |
| 60 | // Skip internal dnd handling in QListWidget ---- how is one supposed to figure this out |
| 61 | // without reading the QListWidget code !? |
| 62 | void dropEvent(QDropEvent *ev) override |
| 63 | { |
| 64 | QAbstractItemView::dropEvent(event: ev); |
| 65 | } |
| 66 | |
| 67 | private: |
| 68 | bool m_activeList; |
| 69 | }; |
| 70 | |
| 71 | class IconTextEditDialog : public QDialog |
| 72 | { |
| 73 | Q_OBJECT |
| 74 | public: |
| 75 | explicit IconTextEditDialog(QWidget *parent = nullptr); |
| 76 | |
| 77 | public: |
| 78 | void setIconText(const QString &text); |
| 79 | QString iconText() const; |
| 80 | |
| 81 | void setTextAlongsideIconHidden(bool hidden); |
| 82 | bool textAlongsideIconHidden() const; |
| 83 | |
| 84 | private Q_SLOTS: |
| 85 | void slotTextChanged(const QString &text); |
| 86 | |
| 87 | private: |
| 88 | QLineEdit *m_lineEdit; |
| 89 | QCheckBox *m_cbHidden; |
| 90 | QDialogButtonBox *m_buttonBox; |
| 91 | }; |
| 92 | |
| 93 | /*! |
| 94 | * \brief A widget used to customize or configure toolbars |
| 95 | * |
| 96 | * This is the widget that does all of the work for the |
| 97 | * KEditToolBar dialog. In most cases, you will want to use the |
| 98 | * dialog instead of this widget directly. |
| 99 | * |
| 100 | * Typically, you would use this widget only if you wanted to embed |
| 101 | * the toolbar editing directly into your existing configure or |
| 102 | * preferences dialog. |
| 103 | * |
| 104 | * This widget only works if your application uses the XML UI |
| 105 | * framework for creating menus and toolbars. It depends on the XML |
| 106 | * files to describe the toolbar layouts and it requires the actions |
| 107 | * to determine which buttons are active. |
| 108 | * |
| 109 | * \internal |
| 110 | */ |
| 111 | class KEditToolBarWidget : public QWidget, virtual public KXMLGUIClient |
| 112 | { |
| 113 | Q_OBJECT |
| 114 | public: |
| 115 | /*! |
| 116 | * Old constructor for apps that do not use components. |
| 117 | * This constructor is somewhat deprecated, since it doesn't work |
| 118 | * with any KXMLGuiClient being added to the mainwindow. |
| 119 | * You really want to use the other constructor. |
| 120 | * |
| 121 | * You @em must pass along your collection of actions (some of which appear in your toolbars). |
| 122 | * Then call old-style load. |
| 123 | * |
| 124 | * @param collection The collection of actions to work on |
| 125 | * @param parent This widget's parent |
| 126 | */ |
| 127 | explicit KEditToolBarWidget(KActionCollection *collection, QWidget *parent = nullptr); |
| 128 | |
| 129 | /*! |
| 130 | * Main constructor. |
| 131 | * |
| 132 | * Use this like so: |
| 133 | * \code |
| 134 | * KEditToolBarWidget widget(this); |
| 135 | * widget.load(factory()); |
| 136 | * ... |
| 137 | * \endcode |
| 138 | * |
| 139 | * @param factory Your application's factory object |
| 140 | * @param parent This widget's parent |
| 141 | */ |
| 142 | explicit KEditToolBarWidget(QWidget *parent = nullptr); |
| 143 | |
| 144 | /*! |
| 145 | * Destructor. Note that any changes done in this widget will |
| 146 | * @em NOT be saved in the destructor. You @em must call save() |
| 147 | * to do that. |
| 148 | */ |
| 149 | ~KEditToolBarWidget() override; |
| 150 | |
| 151 | /*! |
| 152 | * Old-style load. |
| 153 | * |
| 154 | * Loads the toolbar configuration into the widget. Should be called before being shown. |
| 155 | * |
| 156 | * @param resourceFile the name (absolute or relative) of your application's UI |
| 157 | * resource file. If it is left blank, then the resource file: share/apps/appname/appnameui.rc |
| 158 | * is used. This is the same resource file that is used by the |
| 159 | * default createGUI function in KMainWindow so you're usually |
| 160 | * pretty safe in leaving it blank. |
| 161 | * |
| 162 | * @param global controls whether or not the |
| 163 | * global resource file is used. If this is true, then you may |
| 164 | * edit all of the actions in your toolbars -- global ones and |
| 165 | * local one. If it is false, then you may edit only your |
| 166 | * application's entries. The only time you should set this to |
| 167 | * false is if your application does not use the global resource |
| 168 | * file at all (very rare) |
| 169 | * |
| 170 | * @param defaultToolBar the default toolbar that will be selected when the dialog is shown. |
| 171 | * If not set, or QString() is passed in, the global default tool bar name |
| 172 | * will be used. |
| 173 | * |
| 174 | * @see KEditToolBar |
| 175 | */ |
| 176 | void load(const QString &resourceFile, bool global = true, const QString &defaultToolBar = QString()); |
| 177 | |
| 178 | /*! |
| 179 | * Loads the toolbar configuration into the widget. Should be called before being shown. |
| 180 | * |
| 181 | * @param factory pointer to the XML GUI factory object for your application. |
| 182 | * It contains a list of all of the GUI clients (along with the action |
| 183 | * collections and xml files) and the toolbar editor uses that. |
| 184 | * |
| 185 | * @param defaultToolBar the default toolbar that will be selected when the dialog is shown. |
| 186 | * If not set, or QString() is passed in, the global default tool bar name |
| 187 | * will be used. |
| 188 | * |
| 189 | * @see KEditToolBar |
| 190 | */ |
| 191 | void load(KXMLGUIFactory *factory, const QString &defaultToolBar = QString()); |
| 192 | |
| 193 | /*! |
| 194 | * @internal Reimplemented for internal purposes. |
| 195 | */ |
| 196 | KActionCollection *actionCollection() const override; |
| 197 | |
| 198 | /*! |
| 199 | * Save any changes the user made. The file will be in the user's |
| 200 | * local directory (usually $HOME/.kde/share/apps/\<appname\>). The |
| 201 | * filename will be the one specified in the constructor.. or the |
| 202 | * made up one if the filename was an empty string. |
| 203 | * |
| 204 | */ |
| 205 | void save(); |
| 206 | |
| 207 | /*! |
| 208 | * Remove and re-add all KMXLGUIClients to update the GUI |
| 209 | */ |
| 210 | void rebuildKXMLGUIClients(); |
| 211 | |
| 212 | Q_SIGNALS: |
| 213 | /*! |
| 214 | * Emitted whenever any modifications are made by the user. |
| 215 | */ |
| 216 | void enableOk(bool); |
| 217 | |
| 218 | private: |
| 219 | friend class KEditToolBarWidgetPrivate; |
| 220 | KEditToolBarWidgetPrivate *const d; |
| 221 | |
| 222 | Q_DISABLE_COPY(KEditToolBarWidget) |
| 223 | }; |
| 224 | |
| 225 | } |
| 226 | |
| 227 | #endif |
| 228 | |