File indexing completed on 2024-04-28 03:59: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 SPDX-FileCopyrightText: 2023 Kai Uwe Broulik <kde@broulik.de> 0014 0015 SPDX-License-Identifier: LGPL-2.0-only 0016 */ 0017 0018 #include "ktoolbarpopupaction.h" 0019 0020 #include <QMenu> 0021 #include <QToolBar> 0022 0023 #include <memory> 0024 0025 class KToolBarPopupActionPrivate 0026 { 0027 public: 0028 KToolBarPopupActionPrivate(KToolBarPopupAction *q) 0029 : q(q) 0030 , m_popupMode(KToolBarPopupAction::MenuButtonPopup) 0031 , m_popupMenu(new QMenu()) 0032 { 0033 } 0034 0035 void applyPopupMode(QToolButton *button, KToolBarPopupAction::PopupMode mode) 0036 { 0037 if (mode == KToolBarPopupAction::NoPopup) { 0038 button->setMenu(nullptr); 0039 button->setPopupMode(QToolButton::InstantPopup); 0040 } else { 0041 // In case the menu is explicitly overridden, use it. 0042 // QAction::menu() is automatically applied thanks to QToolButton::setDefaultAction(). 0043 if (!q->menu()) { 0044 button->setMenu(m_popupMenu.get()); 0045 } 0046 button->setPopupMode(static_cast<QToolButton::ToolButtonPopupMode>(mode)); 0047 } 0048 } 0049 0050 KToolBarPopupAction *q; 0051 KToolBarPopupAction::PopupMode m_popupMode; 0052 std::unique_ptr<QMenu> m_popupMenu; 0053 }; 0054 0055 KToolBarPopupAction::KToolBarPopupAction(const QIcon &icon, const QString &text, QObject *parent) 0056 : QWidgetAction(parent) 0057 , d(new KToolBarPopupActionPrivate(this)) 0058 { 0059 setIcon(icon); 0060 setText(text); 0061 } 0062 0063 KToolBarPopupAction::~KToolBarPopupAction() = default; 0064 0065 QWidget *KToolBarPopupAction::createWidget(QWidget *_parent) 0066 { 0067 QToolBar *parent = qobject_cast<QToolBar *>(_parent); 0068 if (!parent) { 0069 return QWidgetAction::createWidget(_parent); 0070 } 0071 QToolButton *button = new QToolButton(parent); 0072 button->setAutoRaise(true); 0073 button->setFocusPolicy(Qt::NoFocus); 0074 button->setIconSize(parent->iconSize()); 0075 button->setToolButtonStyle(parent->toolButtonStyle()); 0076 button->setDefaultAction(this); 0077 d->applyPopupMode(button, d->m_popupMode); 0078 0079 connect(parent, &QToolBar::iconSizeChanged, button, &QAbstractButton::setIconSize); 0080 connect(parent, &QToolBar::toolButtonStyleChanged, button, &QToolButton::setToolButtonStyle); 0081 connect(button, &QToolButton::triggered, parent, &QToolBar::actionTriggered); 0082 0083 return button; 0084 } 0085 0086 KToolBarPopupAction::PopupMode KToolBarPopupAction::popupMode() const 0087 { 0088 return d->m_popupMode; 0089 } 0090 0091 void KToolBarPopupAction::setPopupMode(KToolBarPopupAction::PopupMode popupMode) 0092 { 0093 d->m_popupMode = popupMode; 0094 0095 const auto widgets = createdWidgets(); 0096 for (QWidget *widget : widgets) { 0097 if (auto *button = qobject_cast<QToolButton *>(widget)) { 0098 d->applyPopupMode(button, popupMode); 0099 } 0100 } 0101 } 0102 0103 QMenu *KToolBarPopupAction::popupMenu() const 0104 { 0105 return d->m_popupMenu.get(); 0106 } 0107 0108 #include "moc_ktoolbarpopupaction.cpp"