File indexing completed on 2024-04-28 15:31:56

0001 /*
0002     This file is part of the KDE libraries
0003     SPDX-FileCopyrightText: 1999 Reginald Stadlbauer <reggie@kde.org>
0004     SPDX-FileCopyrightText: 1999 Simon Hausmann <hausmann@kde.org>
0005     SPDX-FileCopyrightText: 2000 Nicolas Hadacek <haadcek@kde.org>
0006     SPDX-FileCopyrightText: 2000 Kurt Granroth <granroth@kde.org>
0007     SPDX-FileCopyrightText: 2000 Michael Koch <koch@kde.org>
0008     SPDX-FileCopyrightText: 2001 Holger Freyther <freyther@kde.org>
0009     SPDX-FileCopyrightText: 2002 Ellis Whitehead <ellis@kde.org>
0010     SPDX-FileCopyrightText: 2002 Joseph Wenninger <jowenn@kde.org>
0011     SPDX-FileCopyrightText: 2003 Andras Mantia <amantia@kde.org>
0012     SPDX-FileCopyrightText: 2005-2006 Hamish Rodda <rodda@kde.org>
0013 
0014     SPDX-License-Identifier: LGPL-2.0-only
0015 */
0016 
0017 #include "kactionmenu.h"
0018 
0019 #include <QMenu>
0020 #include <QToolBar>
0021 
0022 class KActionMenuPrivate
0023 {
0024 public:
0025     KActionMenuPrivate()
0026     {
0027     }
0028     ~KActionMenuPrivate()
0029     {
0030     }
0031 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 77)
0032     bool m_stickyMenu = true;
0033 #endif
0034     QToolButton::ToolButtonPopupMode m_popupMode = QToolButton::DelayedPopup;
0035 };
0036 
0037 KActionMenu::KActionMenu(QObject *parent)
0038     : QWidgetAction(parent)
0039     , d(new KActionMenuPrivate)
0040 {
0041     setMenu(new QMenu);
0042     setProperty("isShortcutConfigurable", false);
0043 }
0044 
0045 KActionMenu::KActionMenu(const QString &text, QObject *parent)
0046     : QWidgetAction(parent)
0047     , d(new KActionMenuPrivate)
0048 {
0049     setMenu(new QMenu);
0050     setProperty("isShortcutConfigurable", false);
0051     setText(text);
0052 }
0053 
0054 KActionMenu::KActionMenu(const QIcon &icon, const QString &text, QObject *parent)
0055     : QWidgetAction(parent)
0056     , d(new KActionMenuPrivate)
0057 {
0058     setMenu(new QMenu);
0059     setProperty("isShortcutConfigurable", false);
0060     setIcon(icon);
0061     setText(text);
0062 }
0063 
0064 KActionMenu::~KActionMenu()
0065 {
0066     delete menu();
0067 }
0068 
0069 QWidget *KActionMenu::createWidget(QWidget *_parent)
0070 {
0071     QToolBar *parent = qobject_cast<QToolBar *>(_parent);
0072     if (!parent) {
0073         return QWidgetAction::createWidget(_parent);
0074     }
0075     QToolButton *button = new QToolButton(parent);
0076     button->setAutoRaise(true);
0077     button->setFocusPolicy(Qt::NoFocus);
0078     button->setIconSize(parent->iconSize());
0079     button->setToolButtonStyle(parent->toolButtonStyle());
0080     QObject::connect(parent, &QToolBar::iconSizeChanged, button, &QAbstractButton::setIconSize);
0081     QObject::connect(parent, &QToolBar::toolButtonStyleChanged, button, &QToolButton::setToolButtonStyle);
0082     button->setDefaultAction(this);
0083     button->setPopupMode(popupMode());
0084     QObject::connect(button, &QToolButton::triggered, parent, &QToolBar::actionTriggered);
0085 
0086     return button;
0087 }
0088 
0089 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 0)
0090 void KActionMenu::remove(QAction *cmd)
0091 {
0092     if (cmd) {
0093         menu()->removeAction(cmd);
0094     }
0095 }
0096 #endif
0097 
0098 void KActionMenu::addAction(QAction *action)
0099 {
0100     menu()->addAction(action);
0101 }
0102 
0103 QAction *KActionMenu::addSeparator()
0104 {
0105     QAction *separator = new QAction(this);
0106     separator->setSeparator(true);
0107     addAction(separator);
0108     return separator;
0109 }
0110 
0111 QAction *KActionMenu::insertSeparator(QAction *before)
0112 {
0113     QAction *separator = new QAction(this);
0114     separator->setSeparator(true);
0115     insertAction(before, separator);
0116     return separator;
0117 }
0118 
0119 void KActionMenu::insertAction(QAction *before, QAction *action)
0120 {
0121     menu()->insertAction(before, action);
0122 }
0123 
0124 void KActionMenu::removeAction(QAction *action)
0125 {
0126     menu()->removeAction(action);
0127 }
0128 
0129 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 77)
0130 bool KActionMenu::delayed() const
0131 {
0132     return popupMode() == QToolButton::DelayedPopup;
0133 }
0134 #endif
0135 
0136 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 77)
0137 void KActionMenu::setDelayed(bool _delayed)
0138 {
0139     if (_delayed) {
0140         setPopupMode(QToolButton::DelayedPopup);
0141     } else {
0142         if (d->m_stickyMenu) {
0143             setPopupMode(QToolButton::InstantPopup);
0144         } else {
0145             setPopupMode(QToolButton::MenuButtonPopup);
0146         }
0147     }
0148 }
0149 #endif
0150 
0151 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 77)
0152 bool KActionMenu::stickyMenu() const
0153 {
0154     if (popupMode() == QToolButton::DelayedPopup) {
0155         return d->m_stickyMenu;
0156     } else if (popupMode() == QToolButton::InstantPopup) {
0157         return true;
0158     } else { // MenuButtonPopup
0159         return false;
0160     }
0161 }
0162 #endif
0163 
0164 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 77)
0165 void KActionMenu::setStickyMenu(bool sticky)
0166 {
0167     if (popupMode() != QToolButton::DelayedPopup) {
0168         if (sticky) {
0169             setPopupMode(QToolButton::InstantPopup);
0170         } else {
0171             setPopupMode(QToolButton::MenuButtonPopup);
0172         }
0173     }
0174 
0175     d->m_stickyMenu = sticky;
0176 }
0177 #endif
0178 
0179 QToolButton::ToolButtonPopupMode KActionMenu::popupMode() const
0180 {
0181     return d->m_popupMode;
0182 }
0183 
0184 void KActionMenu::setPopupMode(QToolButton::ToolButtonPopupMode popupMode)
0185 {
0186     d->m_popupMode = popupMode;
0187 }
0188 
0189 #include "moc_kactionmenu.cpp"