File indexing completed on 2024-04-28 15:32:16

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 "ktoolbarpopupaction.h"
0018 
0019 #include <QMenu>
0020 #include <QToolBar>
0021 
0022 class KToolBarPopupActionPrivate
0023 {
0024 public:
0025     KToolBarPopupActionPrivate()
0026         : m_popupMode(QToolButton::MenuButtonPopup)
0027 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 78)
0028         , stickyMenu(true)
0029 #endif
0030     {
0031     }
0032 
0033     QToolButton::ToolButtonPopupMode m_popupMode;
0034 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 78)
0035     bool stickyMenu : 1;
0036 #endif
0037 };
0038 
0039 KToolBarPopupAction::KToolBarPopupAction(const QIcon &icon, const QString &text, QObject *parent)
0040     : QWidgetAction(parent)
0041     , d(new KToolBarPopupActionPrivate)
0042 {
0043     setIcon(icon);
0044     setText(text);
0045     setMenu(new QMenu);
0046 }
0047 
0048 KToolBarPopupAction::~KToolBarPopupAction()
0049 {
0050     delete menu();
0051 }
0052 
0053 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 0)
0054 QMenu *KToolBarPopupAction::popupMenu() const
0055 {
0056     return menu();
0057 }
0058 #endif
0059 
0060 QWidget *KToolBarPopupAction::createWidget(QWidget *_parent)
0061 {
0062     QToolBar *parent = qobject_cast<QToolBar *>(_parent);
0063     if (!parent) {
0064         return QWidgetAction::createWidget(_parent);
0065     }
0066     QToolButton *button = new QToolButton(parent);
0067     button->setAutoRaise(true);
0068     button->setFocusPolicy(Qt::NoFocus);
0069     button->setIconSize(parent->iconSize());
0070     button->setToolButtonStyle(parent->toolButtonStyle());
0071     button->setDefaultAction(this);
0072     button->setPopupMode(d->m_popupMode);
0073 
0074     connect(parent, &QToolBar::iconSizeChanged, button, &QAbstractButton::setIconSize);
0075     connect(parent, &QToolBar::toolButtonStyleChanged, button, &QToolButton::setToolButtonStyle);
0076     connect(button, &QToolButton::triggered, parent, &QToolBar::actionTriggered);
0077 
0078     return button;
0079 }
0080 
0081 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 78)
0082 bool KToolBarPopupAction::delayed() const
0083 {
0084     return popupMode() != QToolButton::InstantPopup;
0085 }
0086 #endif
0087 
0088 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 78)
0089 void KToolBarPopupAction::setDelayed(bool delayed)
0090 {
0091     if (delayed) {
0092         if (d->stickyMenu) {
0093             setPopupMode(QToolButton::MenuButtonPopup);
0094         } else {
0095             setPopupMode(QToolButton::DelayedPopup);
0096         }
0097     } else {
0098         setPopupMode(QToolButton::InstantPopup);
0099     }
0100 }
0101 #endif
0102 
0103 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 78)
0104 bool KToolBarPopupAction::stickyMenu() const
0105 {
0106     if (popupMode() == QToolButton::InstantPopup) {
0107         return d->stickyMenu;
0108     } else if (popupMode() == QToolButton::MenuButtonPopup) {
0109         return true;
0110     } else { // DelayedPopup
0111         return false;
0112     }
0113 }
0114 #endif
0115 
0116 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 78)
0117 void KToolBarPopupAction::setStickyMenu(bool sticky)
0118 {
0119     if (popupMode() != QToolButton::InstantPopup) {
0120         if (sticky) {
0121             setPopupMode(QToolButton::MenuButtonPopup);
0122         } else {
0123             setPopupMode(QToolButton::DelayedPopup);
0124         }
0125     }
0126 
0127     d->stickyMenu = sticky;
0128 }
0129 #endif
0130 
0131 QToolButton::ToolButtonPopupMode KToolBarPopupAction::popupMode() const
0132 {
0133     return d->m_popupMode;
0134 }
0135 
0136 void KToolBarPopupAction::setPopupMode(QToolButton::ToolButtonPopupMode popupMode)
0137 {
0138     d->m_popupMode = popupMode;
0139 
0140     const auto widgets = createdWidgets();
0141     for (QWidget *widget : widgets) {
0142         if (auto *button = qobject_cast<QToolButton *>(widget)) {
0143             button->setPopupMode(d->m_popupMode);
0144         }
0145     }
0146 }
0147 
0148 #include "moc_ktoolbarpopupaction.cpp"