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