File indexing completed on 2024-04-28 03:59:04

0001 /*
0002     This file is part of the KDE libraries
0003     SPDX-FileCopyrightText: 2010 Aurélien Gâteau <agateau@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-or-later
0006 */
0007 #include "kdualaction.h"
0008 #include "kdualaction_p.h"
0009 
0010 #include <QIcon>
0011 
0012 //---------------------------------------------------------------------
0013 // KDualActionPrivate
0014 //---------------------------------------------------------------------
0015 void KDualActionPrivate::init(KDualAction *q_ptr)
0016 {
0017     q = q_ptr;
0018     autoToggle = true;
0019     isActive = false;
0020 
0021     QObject::connect(q, &KDualAction::triggered, q, [this]() {
0022         slotTriggered();
0023     });
0024 }
0025 
0026 void KDualActionPrivate::updateFromCurrentState()
0027 {
0028     KGuiItem &currentItem = item(isActive);
0029     QAction *qq = static_cast<QAction *>(q);
0030     qq->setIcon(currentItem.icon());
0031     qq->setText(currentItem.text());
0032     qq->setToolTip(currentItem.toolTip());
0033 }
0034 
0035 void KDualActionPrivate::slotTriggered()
0036 {
0037     if (!autoToggle) {
0038         return;
0039     }
0040     q->setActive(!isActive);
0041     Q_EMIT q->activeChangedByUser(isActive);
0042 }
0043 
0044 //---------------------------------------------------------------------
0045 // KDualAction
0046 //---------------------------------------------------------------------
0047 KDualAction::KDualAction(const QString &inactiveText, const QString &activeText, QObject *parent)
0048     : QAction(parent)
0049     , d(new KDualActionPrivate)
0050 {
0051     d->init(this);
0052     d->item(false).setText(inactiveText);
0053     d->item(true).setText(activeText);
0054     d->updateFromCurrentState();
0055 }
0056 
0057 KDualAction::KDualAction(QObject *parent)
0058     : QAction(parent)
0059     , d(new KDualActionPrivate)
0060 {
0061     d->init(this);
0062 }
0063 
0064 KDualAction::~KDualAction() = default;
0065 
0066 void KDualAction::setActiveGuiItem(const KGuiItem &item)
0067 {
0068     d->setGuiItem(true, item);
0069 }
0070 KGuiItem KDualAction::activeGuiItem() const
0071 {
0072     return d->item(true);
0073 }
0074 void KDualAction::setInactiveGuiItem(const KGuiItem &item)
0075 {
0076     d->setGuiItem(false, item);
0077 }
0078 KGuiItem KDualAction::inactiveGuiItem() const
0079 {
0080     return d->item(false);
0081 }
0082 
0083 void KDualAction::setActiveIcon(const QIcon &icon)
0084 {
0085     d->setIcon(true, icon);
0086 }
0087 QIcon KDualAction::activeIcon() const
0088 {
0089     return d->item(true).icon();
0090 }
0091 void KDualAction::setInactiveIcon(const QIcon &icon)
0092 {
0093     d->setIcon(false, icon);
0094 }
0095 QIcon KDualAction::inactiveIcon() const
0096 {
0097     return d->item(false).icon();
0098 }
0099 
0100 void KDualAction::setActiveText(const QString &text)
0101 {
0102     d->setText(true, text);
0103 }
0104 QString KDualAction::activeText() const
0105 {
0106     return d->item(true).text();
0107 }
0108 void KDualAction::setInactiveText(const QString &text)
0109 {
0110     d->setText(false, text);
0111 }
0112 QString KDualAction::inactiveText() const
0113 {
0114     return d->item(false).text();
0115 }
0116 
0117 void KDualAction::setActiveToolTip(const QString &toolTip)
0118 {
0119     d->setToolTip(true, toolTip);
0120 }
0121 QString KDualAction::activeToolTip() const
0122 {
0123     return d->item(true).toolTip();
0124 }
0125 void KDualAction::setInactiveToolTip(const QString &toolTip)
0126 {
0127     d->setToolTip(false, toolTip);
0128 }
0129 QString KDualAction::inactiveToolTip() const
0130 {
0131     return d->item(false).toolTip();
0132 }
0133 
0134 void KDualAction::setIconForStates(const QIcon &icon)
0135 {
0136     setInactiveIcon(icon);
0137     setActiveIcon(icon);
0138 }
0139 
0140 void KDualAction::setAutoToggle(bool value)
0141 {
0142     d->autoToggle = value;
0143 }
0144 
0145 bool KDualAction::autoToggle() const
0146 {
0147     return d->autoToggle;
0148 }
0149 
0150 void KDualAction::setActive(bool active)
0151 {
0152     if (active == d->isActive) {
0153         return;
0154     }
0155     d->isActive = active;
0156     d->updateFromCurrentState();
0157     Q_EMIT activeChanged(active);
0158 }
0159 
0160 bool KDualAction::isActive() const
0161 {
0162     return d->isActive;
0163 }
0164 
0165 #include "moc_kdualaction.cpp"