File indexing completed on 2024-05-12 16:01:24

0001 /*
0002  *  SPDX-FileCopyrightText: 2013 Sven Langkamp <sven.langkamp@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 
0008 #include "kis_action.h"
0009 #include "kis_action_manager.h"
0010 #include <QEvent>
0011 
0012 class Q_DECL_HIDDEN KisAction::Private {
0013 
0014 public:
0015     Private() : flags(NONE), conditions(NO_CONDITION), actionManager(0) {}
0016 
0017     ActivationFlags flags;
0018     ActivationConditions conditions;
0019     QStringList excludedNodeTypes;
0020     QString operationID;
0021     KisActionManager* actionManager;
0022 };
0023 
0024 KisAction::KisAction(QObject* parent)
0025     : QWidgetAction(parent)
0026     , d(new Private)
0027 {
0028     connect(this, SIGNAL(changed()), SLOT(slotChanged()));
0029 }
0030 
0031 KisAction::KisAction(const QString& text, QObject* parent)
0032     : QWidgetAction(parent)
0033     , d(new KisAction::Private)
0034 {
0035     QAction::setText(text);
0036     connect(this, SIGNAL(changed()), SLOT(slotChanged()));
0037 }
0038 
0039 KisAction::KisAction(const QIcon &icon, const QString& text, QObject* parent)
0040     : QWidgetAction(parent)
0041     , d(new Private)
0042 {
0043     QAction::setIcon(icon);
0044     QAction::setText(text);
0045     connect(this, SIGNAL(changed()), SLOT(slotChanged()));
0046 }
0047 
0048 KisAction::~KisAction()
0049 {
0050     delete d;
0051 }
0052 
0053 // Using a dynamic QObject property is done for compatibility with KAction and
0054 // XmlGui. We may merge KisAction into the XmlGui code to make this unnecessary,
0055 // but that is probably a lot of work for little benefit. We currently store a
0056 // single default shortcut, but the old system used a list (to store default
0057 // primary/alternate shortcuts for local and global settings) so we marshal it
0058 // for compatibility.
0059 void KisAction::setDefaultShortcut(const QKeySequence &shortcut)
0060 {
0061     QList<QKeySequence> listifiedShortcut;
0062     // Use the empty list to represent no shortcut
0063     if (shortcut != QKeySequence("")) {
0064         listifiedShortcut.append(shortcut);
0065     }
0066     setProperty("defaultShortcuts", QVariant::fromValue(listifiedShortcut));
0067 }
0068 
0069 QKeySequence KisAction::defaultShortcut() const
0070 {
0071     auto listifiedShortcut = property("defaultShortcuts").value<QList<QKeySequence> >();
0072     if (listifiedShortcut.isEmpty()) {
0073         return QKeySequence();
0074     } else {
0075         return listifiedShortcut.first();
0076     }
0077 }
0078 
0079 void KisAction::setActivationFlags(KisAction::ActivationFlags flags)
0080 {
0081     d->flags = flags;
0082 }
0083 
0084 KisAction::ActivationFlags KisAction::activationFlags()
0085 {
0086     return d->flags;
0087 }
0088 
0089 void KisAction::setActivationConditions(KisAction::ActivationConditions conditions)
0090 {
0091     d->conditions = conditions;
0092 }
0093 
0094 KisAction::ActivationConditions KisAction::activationConditions()
0095 {
0096     return d->conditions;
0097 }
0098 
0099 void KisAction::setExcludedNodeTypes(const QStringList &nodeTypes)
0100 {
0101     d->excludedNodeTypes = nodeTypes;
0102 }
0103 
0104 const QStringList& KisAction::excludedNodeTypes() const
0105 {
0106     return d->excludedNodeTypes;
0107 }
0108 
0109 void KisAction::setActionEnabled(bool enabled)
0110 {
0111     setEnabled(enabled);
0112 }
0113 
0114 void KisAction::setActionManager(KisActionManager* actionManager)
0115 {
0116     d->actionManager = actionManager;
0117 }
0118 
0119 void KisAction::setOperationID(const QString& id)
0120 {
0121     d->operationID = id;
0122     connect(this, SIGNAL(triggered()), this, SLOT(slotTriggered()));
0123 }
0124 
0125 void KisAction::slotTriggered()
0126 {
0127     if (d->actionManager && !d->operationID.isEmpty()) {
0128         d->actionManager->runOperation(d->operationID);
0129     }
0130 }
0131 
0132 void KisAction::slotChanged()
0133 {
0134     emit sigEnableSlaves(isEnabled());
0135 }