File indexing completed on 2025-03-09 04:06:23

0001 /*
0002  *  SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_asl_callback_object_catcher.h"
0008 
0009 #include <QHash>
0010 
0011 #include <QColor>
0012 #include <QPointF>
0013 #include <QString>
0014 
0015 #include <KoColor.h>
0016 
0017 #include "kis_debug.h"
0018 
0019 typedef QHash<QString, ASLCallbackDouble> MapHashDouble;
0020 typedef QHash<QString, ASLCallbackInteger> MapHashInt;
0021 
0022 struct EnumMapping {
0023     EnumMapping(const QString &_typeId, ASLCallbackString _map)
0024         : typeId(_typeId)
0025         , map(_map)
0026     {
0027     }
0028 
0029     QString typeId;
0030     ASLCallbackString map;
0031 };
0032 
0033 typedef QHash<QString, EnumMapping> MapHashEnum;
0034 
0035 struct UnitFloatMapping {
0036     UnitFloatMapping(const QString &_unit, ASLCallbackDouble _map)
0037         : unit(_unit)
0038         , map(_map)
0039     {
0040     }
0041 
0042     QString unit;
0043     ASLCallbackDouble map;
0044 };
0045 
0046 typedef QHash<QString, UnitFloatMapping> MapHashUnitFloat;
0047 
0048 typedef QHash<QString, ASLCallbackString> MapHashText;
0049 typedef QHash<QString, ASLCallbackBoolean> MapHashBoolean;
0050 typedef QHash<QString, ASLCallbackColor> MapHashColor;
0051 typedef QHash<QString, ASLCallbackPoint> MapHashPoint;
0052 typedef QHash<QString, ASLCallbackCurve> MapHashCurve;
0053 typedef QHash<QString, ASLCallbackPattern> MapHashPattern;
0054 typedef QHash<QString, ASLCallbackPatternRef> MapHashPatternRef;
0055 typedef QHash<QString, ASLCallbackGradient> MapHashGradient;
0056 
0057 struct KisAslCallbackObjectCatcher::Private {
0058     MapHashDouble mapDouble;
0059     MapHashInt mapInteger;
0060     MapHashEnum mapEnum;
0061     MapHashUnitFloat mapUnitFloat;
0062     MapHashText mapText;
0063     MapHashBoolean mapBoolean;
0064     MapHashColor mapColor;
0065     MapHashPoint mapPoint;
0066     MapHashCurve mapCurve;
0067     MapHashPattern mapPattern;
0068     MapHashPatternRef mapPatternRef;
0069     MapHashGradient mapGradient;
0070 
0071     ASLCallbackNewStyle newStyleCallback;
0072 };
0073 
0074 KisAslCallbackObjectCatcher::KisAslCallbackObjectCatcher()
0075     : m_d(new Private)
0076 {
0077 }
0078 
0079 KisAslCallbackObjectCatcher::~KisAslCallbackObjectCatcher()
0080 {
0081 }
0082 
0083 template<class HashType, typename T>
0084 inline void passToCallback(const QString &path, const HashType &hash, const T &value)
0085 {
0086     typename HashType::const_iterator it = hash.constFind(path);
0087     if (it != hash.constEnd()) {
0088         (*it)(value);
0089     } else {
0090         warnKrita << "Unhandled:" << path << typeid(hash).name() << value;
0091     }
0092 }
0093 
0094 template<class HashType, typename T1, typename T2>
0095 inline void passToCallback(const QString &path, const HashType &hash, const T1 &value1, const T2 &value2)
0096 {
0097     typename HashType::const_iterator it = hash.constFind(path);
0098     if (it != hash.constEnd()) {
0099         (*it)(value1, value2);
0100     } else {
0101         warnKrita << "Unhandled:" << path << typeid(hash).name() << value1 << value2;
0102     }
0103 }
0104 
0105 void KisAslCallbackObjectCatcher::addDouble(const QString &path, double value)
0106 {
0107     passToCallback(path, m_d->mapDouble, value);
0108 }
0109 
0110 void KisAslCallbackObjectCatcher::addInteger(const QString &path, int value)
0111 {
0112     passToCallback(path, m_d->mapInteger, value);
0113 }
0114 
0115 void KisAslCallbackObjectCatcher::addEnum(const QString &path, const QString &typeId, const QString &value)
0116 {
0117     MapHashEnum::const_iterator it = m_d->mapEnum.constFind(path);
0118     if (it != m_d->mapEnum.constEnd()) {
0119         if (it->typeId == typeId) {
0120             it->map(value);
0121         } else {
0122             warnKrita << "KisAslCallbackObjectCatcher::addEnum: inconsistent typeId" << ppVar(typeId) << ppVar(it->typeId);
0123         }
0124     }
0125 }
0126 
0127 void KisAslCallbackObjectCatcher::addUnitFloat(const QString &path, const QString &unit, double value)
0128 {
0129     MapHashUnitFloat::const_iterator it = m_d->mapUnitFloat.constFind(path);
0130     if (it != m_d->mapUnitFloat.constEnd()) {
0131         if (it->unit == unit) {
0132             it->map(value);
0133         } else {
0134             warnKrita << "KisAslCallbackObjectCatcher::addUnitFloat: inconsistent unit" << ppVar(unit) << ppVar(it->unit);
0135         }
0136     }
0137 }
0138 
0139 void KisAslCallbackObjectCatcher::addText(const QString &path, const QString &value)
0140 {
0141     passToCallback(path, m_d->mapText, value);
0142 }
0143 
0144 void KisAslCallbackObjectCatcher::addBoolean(const QString &path, bool value)
0145 {
0146     passToCallback(path, m_d->mapBoolean, value);
0147 }
0148 
0149 void KisAslCallbackObjectCatcher::addColor(const QString &path, const KoColor &value)
0150 {
0151     passToCallback(path, m_d->mapColor, value);
0152 }
0153 
0154 void KisAslCallbackObjectCatcher::addPoint(const QString &path, const QPointF &value)
0155 {
0156     passToCallback(path, m_d->mapPoint, value);
0157 }
0158 
0159 void KisAslCallbackObjectCatcher::addCurve(const QString &path, const QString &name, const QVector<QPointF> &points)
0160 {
0161     MapHashCurve::const_iterator it = m_d->mapCurve.constFind(path);
0162     if (it != m_d->mapCurve.constEnd()) {
0163         (*it)(name, points);
0164     }
0165 }
0166 
0167 void KisAslCallbackObjectCatcher::addPattern(const QString &path, const KoPatternSP value, const QString &patternUuid)
0168 {
0169     passToCallback(path, m_d->mapPattern, value, patternUuid);
0170 }
0171 
0172 void KisAslCallbackObjectCatcher::addPatternRef(const QString &path, const QString &patternUuid, const QString &patternName)
0173 {
0174     MapHashPatternRef::const_iterator it = m_d->mapPatternRef.constFind(path);
0175     if (it != m_d->mapPatternRef.constEnd()) {
0176         (*it)(patternUuid, patternName);
0177     }
0178 }
0179 
0180 void KisAslCallbackObjectCatcher::addGradient(const QString &path, KoAbstractGradientSP value)
0181 {
0182     passToCallback(path, m_d->mapGradient, value);
0183 }
0184 
0185 void KisAslCallbackObjectCatcher::newStyleStarted()
0186 {
0187     if (m_d->newStyleCallback) {
0188         m_d->newStyleCallback();
0189     }
0190 }
0191 
0192 /*****************************************************************/
0193 /*      Subscription methods                                      */
0194 /*****************************************************************/
0195 
0196 void KisAslCallbackObjectCatcher::subscribeDouble(const QString &path, ASLCallbackDouble callback)
0197 {
0198     m_d->mapDouble.insert(path, callback);
0199 }
0200 
0201 void KisAslCallbackObjectCatcher::subscribeInteger(const QString &path, ASLCallbackInteger callback)
0202 {
0203     m_d->mapInteger.insert(path, callback);
0204 }
0205 
0206 void KisAslCallbackObjectCatcher::subscribeEnum(const QString &path, const QString &typeId, ASLCallbackString callback)
0207 {
0208     m_d->mapEnum.insert(path, EnumMapping(typeId, callback));
0209 }
0210 
0211 void KisAslCallbackObjectCatcher::subscribeUnitFloat(const QString &path, const QString &unit, ASLCallbackDouble callback)
0212 {
0213     m_d->mapUnitFloat.insert(path, UnitFloatMapping(unit, callback));
0214 }
0215 
0216 void KisAslCallbackObjectCatcher::subscribeText(const QString &path, ASLCallbackString callback)
0217 {
0218     m_d->mapText.insert(path, callback);
0219 }
0220 
0221 void KisAslCallbackObjectCatcher::subscribeBoolean(const QString &path, ASLCallbackBoolean callback)
0222 {
0223     m_d->mapBoolean.insert(path, callback);
0224 }
0225 
0226 void KisAslCallbackObjectCatcher::subscribeColor(const QString &path, ASLCallbackColor callback)
0227 {
0228     m_d->mapColor.insert(path, callback);
0229 }
0230 
0231 void KisAslCallbackObjectCatcher::subscribePoint(const QString &path, ASLCallbackPoint callback)
0232 {
0233     m_d->mapPoint.insert(path, callback);
0234 }
0235 
0236 void KisAslCallbackObjectCatcher::subscribeCurve(const QString &path, ASLCallbackCurve callback)
0237 {
0238     m_d->mapCurve.insert(path, callback);
0239 }
0240 
0241 void KisAslCallbackObjectCatcher::subscribePattern(const QString &path, ASLCallbackPattern callback)
0242 {
0243     m_d->mapPattern.insert(path, callback);
0244 }
0245 
0246 void KisAslCallbackObjectCatcher::subscribePatternRef(const QString &path, ASLCallbackPatternRef callback)
0247 {
0248     m_d->mapPatternRef.insert(path, callback);
0249 }
0250 
0251 void KisAslCallbackObjectCatcher::subscribeGradient(const QString &path, ASLCallbackGradient callback)
0252 {
0253     m_d->mapGradient.insert(path, callback);
0254 }
0255 
0256 void KisAslCallbackObjectCatcher::subscribeNewStyleStarted(ASLCallbackNewStyle callback)
0257 {
0258     m_d->newStyleCallback = callback;
0259 }