File indexing completed on 2025-02-16 13:11:52
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"