8#include "ktoolbarhandler_p.h"
11#include <QDomDocument>
17#include <KLocalizedString>
19#include "kactioncollection.h"
20#include "ktoggletoolbaraction.h"
22#include "kxmlguifactory.h"
23#include "kxmlguiwindow.h"
27const char actionListName[] =
"show_menu_and_toolbar_actionlist";
29const char guiDescription[] =
31 "<!DOCTYPE gui><gui name=\"StandardToolBarMenuHandler\">"
33 " <Menu name=\"settings\">"
34 " <ActionList name=\"%1\" />"
42 BarActionBuilder(KActionCollection *actionCollection, KXmlGuiWindow *mainWindow, QList<KToolBar *> &oldToolBarList)
43 : m_actionCollection(actionCollection)
44 , m_mainWindow(mainWindow)
45 , m_needsRebuild(false)
47 const QList<KToolBar *> toolBars = m_mainWindow->findChildren<KToolBar *>();
49 for (KToolBar *toolBar : toolBars) {
50 if (toolBar->mainWindow() != m_mainWindow) {
54 if (!oldToolBarList.
contains(toolBar)) {
55 m_needsRebuild =
true;
58 m_toolBars.append(toolBar);
61 if (!m_needsRebuild) {
62 m_needsRebuild = (oldToolBarList.
count() != m_toolBars.count());
66 bool needsRebuild()
const
68 return m_needsRebuild;
73 QList<QAction *> actions;
75 if (!m_needsRebuild) {
79 for (KToolBar *bar : std::as_const(m_toolBars)) {
83 if (m_toolBarActions.count() == 0) {
87 if (m_toolBarActions.count() == 1) {
88 KToggleToolBarAction *action =
static_cast<KToggleToolBarAction *
>(m_toolBarActions.first());
90 return m_toolBarActions;
93 KActionMenu *menuAction =
new KActionMenu(
i18n(
"Toolbars Shown"), m_actionCollection);
94 m_actionCollection->addAction(QStringLiteral(
"toolbars_submenu_action"), menuAction);
96 for (QAction *action : std::as_const(m_toolBarActions)) {
100 actions.
append(menuAction);
105 const QList<KToolBar *> &toolBars()
const
111 void handleToolBar(KToolBar *toolBar)
113 KToggleToolBarAction *action =
new KToggleToolBarAction(toolBar, toolBar->
windowTitle(), m_actionCollection);
114 m_actionCollection->addAction(toolBar->
objectName(), action);
117 m_toolBarActions.append(action);
120 KActionCollection *m_actionCollection;
121 KXmlGuiWindow *m_mainWindow;
123 QList<KToolBar *> m_toolBars;
124 QList<QAction *> m_toolBarActions;
126 bool m_needsRebuild : 1;
130using namespace KDEPrivate;
132class Q_DECL_HIDDEN ToolBarHandler::Private
135 Private(ToolBarHandler *_parent)
140 void clientAdded(KXMLGUIClient *client)
143 parent->setupActions();
146 void init(KXmlGuiWindow *mainWindow);
147 void connectToActionContainers();
148 void connectToActionContainer(QAction *action);
149 void connectToActionContainer(QWidget *container);
151 ToolBarHandler *parent;
152 QPointer<KXmlGuiWindow> mainWindow;
153 QList<QAction *> actions;
154 QList<KToolBar *> toolBars;
161 QObject::connect(mainWindow->guiFactory(), &KXMLGUIFactory::clientAdded, parent, &ToolBarHandler::clientAdded);
163 if (parent->domDocument().documentElement().isNull()) {
166 parent->setXML(completeDescription,
false );
170void ToolBarHandler::Private::connectToActionContainers()
172 for (QAction *action : std::as_const(actions)) {
173 connectToActionContainer(action);
177void ToolBarHandler::Private::connectToActionContainer(QAction *action)
181 for (
auto object : associatedObjects) {
182 if (
auto widget = qobject_cast<QWidget *>(
object)) {
183 connectToActionContainer(widget);
188void ToolBarHandler::Private::connectToActionContainer(QWidget *container)
190 QMenu *popupMenu = qobject_cast<QMenu *>(container);
198ToolBarHandler::ToolBarHandler(KXmlGuiWindow *mainWindow)
199 : QObject(mainWindow)
200 , KXMLGUIClient(mainWindow)
201 , d(new Private(this))
209 , d(new Private(this))
214ToolBarHandler::~ToolBarHandler()
216 qDeleteAll(d->actions);
222QAction *ToolBarHandler::toolBarMenuAction()
224 Q_ASSERT(d->actions.count() == 1);
225 return d->actions.first();
228void ToolBarHandler::setupActions()
230 if (!factory() || !d->mainWindow) {
234 BarActionBuilder builder(actionCollection(), d->mainWindow, d->toolBars);
236 if (!builder.needsRebuild()) {
242 qDeleteAll(d->actions);
245 d->actions = builder.create();
247 d->toolBars = builder.toolBars();
256 d->connectToActionContainers();
261 d->clientAdded(client);
264#include "moc_ktoolbarhandler_p.cpp"
void readSettings(KConfigGroup *config=nullptr)
Read all key associations from config.
static Q_INVOKABLE bool authorizeAction(const QString &action)
A KXMLGUIClient can be used with KXMLGUIFactory to create a GUI from actions and an XML document,...
KMainWindow with convenience functions and integration with XmlGui files.
QString i18n(const char *text, const TYPE &arg...)
void init(KXmlGuiWindow *window, KGameDifficulty *difficulty=nullptr)
QAction * create(GameStandardAction id, const QObject *recvr, const char *slot, QObject *parent)
QString label(StandardShortcut id)
QList< QObject * > associatedObjects() const const
void setText(const QString &text)
void append(QList< T > &&value)
bool contains(const AT &value) const const
qsizetype count() const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QString arg(Args &&... args) const const
QString fromLatin1(QByteArrayView str)
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)