Krita Source Code Documentation
Loading...
Searching...
No Matches
ktoolbarhandler.cpp
Go to the documentation of this file.
1/* This file is part of the KDE libraries
2 SPDX-FileCopyrightText: 2002 Simon Hausmann <hausmann@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.0-only
5*/
6
7#include "ktoolbarhandler_p.h"
8#include "config-xmlgui.h"
9#include <QDomDocument>
10#include <QAction>
11#include <QMenu>
12#include <QPointer>
13
14#include <kactionmenu.h>
15#include <klocalizedstring.h>
16
17#include "kxmlguiwindow.h"
19#include "ktoolbar.h"
20#include "kxmlguifactory.h"
21#include "kactioncollection.h"
22
23#if defined(KCONFIG_BEFORE_5_24)
24# define authorizeAction authorizeKAction
25#endif
26
27namespace
28{
29const char actionListName[] = "show_menu_and_toolbar_actionlist";
30
31const char guiDescription[] = ""
32 "<!DOCTYPE kpartgui><kpartgui name=\"StandardToolBarMenuHandler\">"
33 "<MenuBar>"
34 " <Menu name=\"settings\">"
35 " <ActionList name=\"%1\" />"
36 " </Menu>"
37 "</MenuBar>"
38 "</kpartgui>";
39
40class BarActionBuilder
41{
42public:
43 BarActionBuilder(KisKActionCollection *actionCollection, KXmlGuiWindow *mainWindow,
44 QLinkedList<KisToolBar *> &oldToolBarList)
45 : m_actionCollection(actionCollection), m_mainWindow(mainWindow), m_needsRebuild(false)
46 {
47 QList<KisToolBar *> toolBars = m_mainWindow->findChildren<KisToolBar *>();
48
49 Q_FOREACH (KisToolBar *toolBar, toolBars) {
50 if (toolBar->mainWindow() != m_mainWindow) {
51 continue;
52 }
53
54 if (!oldToolBarList.contains(toolBar)) {
55 m_needsRebuild = true;
56 }
57
58 m_toolBars.append(toolBar);
59 }
60
61 if (!m_needsRebuild) {
62 m_needsRebuild = (oldToolBarList.count() != m_toolBars.count());
63 }
64 }
65
66 bool needsRebuild() const
67 {
68 return m_needsRebuild;
69 }
70
72 {
73 QList<QAction *> actions;
74
75 if (!m_needsRebuild) {
76 return actions;
77 }
78
79 Q_FOREACH (KisToolBar *bar, m_toolBars) {
80 handleToolBar(bar);
81 }
82
83 if (m_toolBarActions.count() == 0) {
84 return actions;
85 }
86
87 if (m_toolBarActions.count() == 1) {
88 KToggleToolBarAction *action = static_cast<KToggleToolBarAction *>(m_toolBarActions.first());
89 action->setText(KStandardShortcut::label(KStandardShortcut::ShowToolbar));
90 return m_toolBarActions;
91 }
92
93 KActionMenu *menuAction = new KActionMenu(i18n("Toolbars Shown"), m_actionCollection);
94 m_actionCollection->addAction(QStringLiteral("toolbars_submenu_action"), menuAction);
95
96 Q_FOREACH (QAction *action, m_toolBarActions) {
97 menuAction->menu()->addAction(action);
98 }
99
100 actions.append(menuAction);
101
102 return actions;
103 }
104
105 const QLinkedList<KisToolBar *> &toolBars() const
106 {
107 return m_toolBars;
108 }
109
110private:
111 void handleToolBar(KisToolBar *toolBar)
112 {
114 toolBar,
115 toolBar->windowTitle(),
116 m_actionCollection);
117 m_actionCollection->addAction(toolBar->objectName(), action);
118
119 // ## tooltips, whatsthis?
120 m_toolBarActions.append(action);
121 }
122
123 KisKActionCollection *m_actionCollection;
124 KXmlGuiWindow *m_mainWindow;
125
126 QLinkedList<KisToolBar *> m_toolBars;
127 QList<QAction *> m_toolBarActions;
128
129 bool m_needsRebuild : 1;
130};
131}
132
133using namespace KDEPrivate;
134
136{
137public:
139 : parent(_parent)
140 {
141 }
142
144 {
145 Q_UNUSED(client);
147 }
148
151 void connectToActionContainer(QAction *action);
152 void connectToActionContainer(QWidget *container);
153
157 QLinkedList<KisToolBar *> toolBars;
158};
159
161{
162 mainWindow = mw;
163
164 QObject::connect(mainWindow->guiFactory(), SIGNAL(clientAdded(KisKXMLGUIClient*)),
166
167 if (parent->domDocument().documentElement().isNull()) {
168
169 QString completeDescription = QString::fromLatin1(guiDescription)
170 .arg(QLatin1String(actionListName));
171
172 parent->setXML(completeDescription, false /*merge*/);
173 }
174}
175
177{
178 Q_FOREACH (QAction *action, actions) {
179 connectToActionContainer(action);
180 }
181}
182
184{
185 uint containerCount = action->associatedWidgets().count();
186
187 for (uint i = 0; i < containerCount; ++i) {
188 connectToActionContainer(action->associatedWidgets().value(i));
189 }
190}
191
193{
194 QMenu *popupMenu = qobject_cast<QMenu *>(container);
195 if (!popupMenu) {
196 return;
197 }
198
199 connect(popupMenu, SIGNAL(aboutToShow()),
200 parent, SLOT(setupActions()));
201}
202
204 : QObject(mainWindow), KisKXMLGUIClient(mainWindow),
205 d(new Private(this))
206{
207 d->init(mainWindow);
208}
209
211 : QObject(parent), KisKXMLGUIClient(mainWindow),
212 d(new Private(this))
213{
214 d->init(mainWindow);
215}
216
218{
219 qDeleteAll(d->actions);
220 d->actions.clear();
221
222 delete d;
223}
224
226{
227 Q_ASSERT(d->actions.count() == 1);
228 return d->actions.first();
229}
230
232{
233 if (!factory() || !d->mainWindow) {
234 return;
235 }
236
237 BarActionBuilder builder(actionCollection(), d->mainWindow, d->toolBars);
238
239 if (!builder.needsRebuild()) {
240 return;
241 }
242
243 unplugActionList(QLatin1String(actionListName));
244
245 qDeleteAll(d->actions);
246 d->actions.clear();
247
248 d->actions = builder.create();
249
250 d->toolBars = builder.toolBars();
251
252 // We have no XML file associated with our action collection, so load settings from KConfig
253 actionCollection()->readSettings(); // #233712
254
255 plugActionList(QLatin1String(actionListName), d->actions);
256
258}
259
260#include "moc_ktoolbarhandler_p.cpp"
unsigned int uint
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
ToolBarHandler(KXmlGuiWindow *mainWindow)
KDE top level main window with predefined action layout
A container for a set of QAction objects.
virtual QDomDocument domDocument() const
QAction * action(const char *name) const
void unplugActionList(const QString &name)
KisKXMLGUIFactory * factory() const
void setXML(const QString &document, bool merge=false)
void plugActionList(const QString &name, const QList< QAction * > &actionList)
virtual KisKActionCollection * actionCollection() const
Floatable toolbar with auto resize.
Definition ktoolbar.h:47
KisKMainWindow * mainWindow() const
void init(KXmlGuiWindow *mainWindow)
void clientAdded(KisKXMLGUIClient *client)
void connectToActionContainer(QAction *action)
QPointer< KXmlGuiWindow > mainWindow
QLinkedList< KisToolBar * > toolBars
QPainterPath create(const char32_t codepoint, double height)
Creates a tofu missing glyph indicator representing the provided Unicode codepoint.