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 }