File indexing completed on 2024-05-12 15:56:39
0001 /* 0002 * SPDX-FileCopyrightText: 2016 Dmitry Kazakov <dimula73@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "KoDerivedResourceConverter.h" 0008 0009 #include "QVariant" 0010 #include "kis_assert.h" 0011 0012 struct KoDerivedResourceConverter::Private 0013 { 0014 Private(int _key, int _sourceKey) 0015 : key(_key), sourceKey(_sourceKey) {} 0016 0017 int key; 0018 int sourceKey; 0019 0020 QVariant lastKnownValue; 0021 bool invisibleChangeHappened = false; 0022 }; 0023 0024 0025 KoDerivedResourceConverter::KoDerivedResourceConverter(int key, int sourceKey) 0026 : m_d(new Private(key, sourceKey)) 0027 { 0028 } 0029 0030 KoDerivedResourceConverter::~KoDerivedResourceConverter() 0031 { 0032 } 0033 0034 int KoDerivedResourceConverter::key() const 0035 { 0036 return m_d->key; 0037 } 0038 0039 int KoDerivedResourceConverter::sourceKey() const 0040 { 0041 return m_d->sourceKey; 0042 } 0043 0044 bool KoDerivedResourceConverter::notifySourceChanged(const QVariant &sourceValue) 0045 { 0046 const QVariant newValue = fromSource(sourceValue); 0047 0048 const bool valueChanged = m_d->lastKnownValue != newValue || m_d->invisibleChangeHappened; 0049 m_d->lastKnownValue = newValue; 0050 m_d->invisibleChangeHappened = false; 0051 0052 return valueChanged; 0053 } 0054 0055 QVariant KoDerivedResourceConverter::readFromSource(const QVariant &sourceValue) 0056 { 0057 const QVariant result = fromSource(sourceValue); 0058 m_d->invisibleChangeHappened |= result != m_d->lastKnownValue; 0059 m_d->lastKnownValue = result; 0060 return m_d->lastKnownValue; 0061 } 0062 0063 QVariant KoDerivedResourceConverter::writeToSource(const QVariant &value, 0064 const QVariant &sourceValue, 0065 bool *changed) 0066 { 0067 QVariant newSourceValue = sourceValue; 0068 const bool hasChanged = m_d->lastKnownValue != value || m_d->invisibleChangeHappened; 0069 m_d->invisibleChangeHappened = false; 0070 0071 if (hasChanged || value != fromSource(sourceValue)) { 0072 newSourceValue = toSource(value, sourceValue); 0073 /** 0074 * Some resources may be immutable, that is, writing to them will 0075 * **not** alter the value. Example: size property of the Shape Brush 0076 * (always 1.0) 0077 */ 0078 m_d->lastKnownValue = fromSource(newSourceValue); 0079 } 0080 if (changed) { 0081 *changed = hasChanged; 0082 } 0083 return newSourceValue; 0084 }