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 }