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
14 SPDX-License-Identifier: LGPL-2.0-only
15 */
16
17 #include "ktoolbarpopupaction.h"
18
19 #include <QMenu>
20 #include <QToolBar>
21
22 class KToolBarPopupActionPrivate
23 {
24 public:
KToolBarPopupActionPrivate()25 KToolBarPopupActionPrivate()
26 : m_popupMode(QToolButton::MenuButtonPopup)
27 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 78)
28 , stickyMenu(true)
29 #endif
30 {
31 }
32
33 QToolButton::ToolButtonPopupMode m_popupMode;
34 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 78)
35 bool stickyMenu : 1;
36 #endif
37 };
38
KToolBarPopupAction(const QIcon & icon,const QString & text,QObject * parent)39 KToolBarPopupAction::KToolBarPopupAction(const QIcon &icon, const QString &text, QObject *parent)
40 : QWidgetAction(parent)
41 , d(new KToolBarPopupActionPrivate)
42 {
43 setIcon(icon);
44 setText(text);
45 setMenu(new QMenu);
46 }
47
~KToolBarPopupAction()48 KToolBarPopupAction::~KToolBarPopupAction()
49 {
50 delete menu();
51 }
52
53 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 0)
popupMenu() const54 QMenu *KToolBarPopupAction::popupMenu() const
55 {
56 return menu();
57 }
58 #endif
59
createWidget(QWidget * _parent)60 QWidget *KToolBarPopupAction::createWidget(QWidget *_parent)
61 {
62 QToolBar *parent = qobject_cast<QToolBar *>(_parent);
63 if (!parent) {
64 return QWidgetAction::createWidget(_parent);
65 }
66 QToolButton *button = new QToolButton(parent);
67 button->setAutoRaise(true);
68 button->setFocusPolicy(Qt::NoFocus);
69 button->setIconSize(parent->iconSize());
70 button->setToolButtonStyle(parent->toolButtonStyle());
71 button->setDefaultAction(this);
72 button->setPopupMode(d->m_popupMode);
73
74 connect(parent, &QToolBar::iconSizeChanged, button, &QAbstractButton::setIconSize);
75 connect(parent, &QToolBar::toolButtonStyleChanged, button, &QToolButton::setToolButtonStyle);
76 connect(button, &QToolButton::triggered, parent, &QToolBar::actionTriggered);
77
78 return button;
79 }
80
81 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 78)
delayed() const82 bool KToolBarPopupAction::delayed() const
83 {
84 return popupMode() != QToolButton::InstantPopup;
85 }
86 #endif
87
88 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 78)
setDelayed(bool delayed)89 void KToolBarPopupAction::setDelayed(bool delayed)
90 {
91 if (delayed) {
92 if (d->stickyMenu) {
93 setPopupMode(QToolButton::MenuButtonPopup);
94 } else {
95 setPopupMode(QToolButton::DelayedPopup);
96 }
97 } else {
98 setPopupMode(QToolButton::InstantPopup);
99 }
100 }
101 #endif
102
103 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 78)
stickyMenu() const104 bool KToolBarPopupAction::stickyMenu() const
105 {
106 if (popupMode() == QToolButton::InstantPopup) {
107 return d->stickyMenu;
108 } else if (popupMode() == QToolButton::MenuButtonPopup) {
109 return true;
110 } else { // DelayedPopup
111 return false;
112 }
113 }
114 #endif
115
116 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 78)
setStickyMenu(bool sticky)117 void KToolBarPopupAction::setStickyMenu(bool sticky)
118 {
119 if (popupMode() != QToolButton::InstantPopup) {
120 if (sticky) {
121 setPopupMode(QToolButton::MenuButtonPopup);
122 } else {
123 setPopupMode(QToolButton::DelayedPopup);
124 }
125 }
126
127 d->stickyMenu = sticky;
128 }
129 #endif
130
popupMode() const131 QToolButton::ToolButtonPopupMode KToolBarPopupAction::popupMode() const
132 {
133 return d->m_popupMode;
134 }
135
setPopupMode(QToolButton::ToolButtonPopupMode popupMode)136 void KToolBarPopupAction::setPopupMode(QToolButton::ToolButtonPopupMode popupMode)
137 {
138 d->m_popupMode = popupMode;
139 }
140