1/*
2 This file is part of the KDE libraries
3 SPDX-FileCopyrightText: 1999 Reginald Stadlbauer <reggie@kde.org>
4 SPDX-FileCopyrightText: 1999 Simon Hausmann <hausmann@kde.org>
5 SPDX-FileCopyrightText: 2000 Nicolas Hadacek <haadcek@kde.org>
6 SPDX-FileCopyrightText: 2000 Kurt Granroth <granroth@kde.org>
7 SPDX-FileCopyrightText: 2000 Michael Koch <koch@kde.org>
8 SPDX-FileCopyrightText: 2001 Holger Freyther <freyther@kde.org>
9 SPDX-FileCopyrightText: 2002 Ellis Whitehead <ellis@kde.org>
10 SPDX-FileCopyrightText: 2002 Joseph Wenninger <jowenn@kde.org>
11 SPDX-FileCopyrightText: 2003 Andras Mantia <amantia@kde.org>
12 SPDX-FileCopyrightText: 2005-2006 Hamish Rodda <rodda@kde.org>
13 SPDX-FileCopyrightText: 2023 Kai Uwe Broulik <kde@broulik.de>
14
15 SPDX-License-Identifier: LGPL-2.0-only
16*/
17
18#include "ktoolbarpopupaction.h"
19
20#include <QMenu>
21#include <QToolBar>
22
23class KToolBarPopupActionPrivate
24{
25public:
26 KToolBarPopupActionPrivate(KToolBarPopupAction *q)
27 : q(q)
28 , m_popupMode(KToolBarPopupAction::MenuButtonPopup)
29 , m_popupMenu(new QMenu())
30 {
31 }
32
33 void applyPopupMode(QToolButton *button, KToolBarPopupAction::PopupMode mode)
34 {
35 if (mode == KToolBarPopupAction::NoPopup) {
36 button->setMenu(nullptr);
37 button->setPopupMode(QToolButton::InstantPopup);
38 } else {
39 // In case the menu is explicitly overridden, use it.
40 // QAction::menu() is automatically applied thanks to QToolButton::setDefaultAction().
41 if (!q->menu()) {
42 button->setMenu(m_popupMenu.get());
43 }
44 button->setPopupMode(static_cast<QToolButton::ToolButtonPopupMode>(mode));
45 }
46 }
47
48 KToolBarPopupAction *q;
49 KToolBarPopupAction::PopupMode m_popupMode;
50 std::unique_ptr<QMenu> m_popupMenu;
51};
52
53KToolBarPopupAction::KToolBarPopupAction(const QIcon &icon, const QString &text, QObject *parent)
54 : QWidgetAction(parent)
55 , d(new KToolBarPopupActionPrivate(this))
56{
57 setIcon(icon);
58 setText(text);
59}
60
61KToolBarPopupAction::~KToolBarPopupAction() = default;
62
63QWidget *KToolBarPopupAction::createWidget(QWidget *_parent)
64{
65 QToolBar *parent = qobject_cast<QToolBar *>(object: _parent);
66 if (!parent) {
67 return QWidgetAction::createWidget(parent: _parent);
68 }
69 QToolButton *button = new QToolButton(parent);
70 button->setAutoRaise(true);
71 button->setFocusPolicy(Qt::NoFocus);
72 button->setIconSize(parent->iconSize());
73 button->setToolButtonStyle(parent->toolButtonStyle());
74 button->setDefaultAction(this);
75 d->applyPopupMode(button, mode: d->m_popupMode);
76
77 connect(sender: parent, signal: &QToolBar::iconSizeChanged, context: button, slot: &QAbstractButton::setIconSize);
78 connect(sender: parent, signal: &QToolBar::toolButtonStyleChanged, context: button, slot: &QToolButton::setToolButtonStyle);
79 connect(sender: button, signal: &QToolButton::triggered, context: parent, slot: &QToolBar::actionTriggered);
80
81 return button;
82}
83
84KToolBarPopupAction::PopupMode KToolBarPopupAction::popupMode() const
85{
86 return d->m_popupMode;
87}
88
89void KToolBarPopupAction::setPopupMode(KToolBarPopupAction::PopupMode popupMode)
90{
91 d->m_popupMode = popupMode;
92
93 const auto widgets = createdWidgets();
94 for (QWidget *widget : widgets) {
95 if (auto *button = qobject_cast<QToolButton *>(object: widget)) {
96 d->applyPopupMode(button, mode: popupMode);
97 }
98 }
99}
100
101QMenu *KToolBarPopupAction::popupMenu() const
102{
103 return d->m_popupMenu.get();
104}
105
106#include "moc_ktoolbarpopupaction.cpp"
107

source code of kwidgetsaddons/src/ktoolbarpopupaction.cpp