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"