File indexing completed on 2024-06-09 04:21:49
0001 /* 0002 * SPDX-FileCopyrightText: 2014 Dmitry Kazakov <dimula73@gmail.com> 0003 * SPDX-FileCopyrightText: 2014 Mohit Goyal <mohit.bits2011@gmail.com> 0004 * 0005 * SPDX-License-Identifier: LGPL-2.1-or-later 0006 */ 0007 #include <brushengine/kis_locked_properties_proxy.h> 0008 0009 #include <KoResource.h> 0010 #include <KisDirtyStateSaver.h> 0011 0012 #include <brushengine/kis_locked_properties.h> 0013 #include <brushengine/kis_locked_properties_server.h> 0014 #include <brushengine/kis_paintop_settings.h> 0015 #include <brushengine/kis_paintop_preset.h> 0016 0017 0018 KisLockedPropertiesProxy::KisLockedPropertiesProxy(KisPropertiesConfiguration *p, KisLockedPropertiesSP l) 0019 { 0020 m_parent = p; 0021 m_lockedProperties = l; 0022 } 0023 0024 KisLockedPropertiesProxy::~KisLockedPropertiesProxy() 0025 { 0026 } 0027 0028 QVariant KisLockedPropertiesProxy::getProperty(const QString &name) const 0029 { 0030 KisPaintOpSettings *t = dynamic_cast<KisPaintOpSettings*>(m_parent); 0031 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(t, m_parent->getProperty(name)); 0032 if (!t->updateListener()) return m_parent->getProperty(name); 0033 0034 // restores the dirty state on returns automagically 0035 KisPaintOpSettings::UpdateListenerSP updateProxy = t->updateListener().toStrongRef(); 0036 KisDirtyStateSaver<KisPaintOpSettings::UpdateListenerSP> dirtyStateSaver(updateProxy); 0037 0038 if (m_lockedProperties->lockedProperties()) { 0039 if (m_lockedProperties->lockedProperties()->hasProperty(name)) { 0040 KisLockedPropertiesServer::instance()->setPropertiesFromLocked(true); 0041 0042 if (!m_parent->hasProperty(name + "_previous")) { 0043 m_parent->setProperty(name + "_previous", m_parent->getProperty(name)); 0044 m_parent->setPropertyNotSaved(name + "_previous"); 0045 } 0046 0047 const QVariant lockedProp = m_lockedProperties->lockedProperties()->getProperty(name); 0048 0049 if (m_parent->getProperty(name) != lockedProp) { 0050 m_parent->setProperty(name, lockedProp); 0051 } 0052 0053 return lockedProp; 0054 } else { 0055 if (m_parent->hasProperty(name + "_previous")) { 0056 m_parent->setProperty(name, m_parent->getProperty(name + "_previous")); 0057 m_parent->removeProperty(name + "_previous"); 0058 } 0059 } 0060 } 0061 0062 return m_parent->getProperty(name); 0063 } 0064 0065 void KisLockedPropertiesProxy::setProperty(const QString & name, const QVariant & value) 0066 { 0067 KisPaintOpSettings *t = dynamic_cast<KisPaintOpSettings*>(m_parent); 0068 KIS_SAFE_ASSERT_RECOVER_RETURN(t); 0069 if (!t->updateListener()) return; 0070 0071 if (m_lockedProperties->lockedProperties()) { 0072 if (m_lockedProperties->lockedProperties()->hasProperty(name)) { 0073 m_lockedProperties->lockedProperties()->setProperty(name, value); 0074 m_parent->setProperty(name, value); 0075 0076 if (!m_parent->hasProperty(name + "_previous")) { 0077 // restores the dirty state on returns automagically 0078 KisPaintOpSettings::UpdateListenerSP updateProxy = t->updateListener().toStrongRef(); 0079 KisDirtyStateSaver<KisPaintOpSettings::UpdateListenerSP> dirtyStateSaver(updateProxy); 0080 m_parent->setProperty(name + "_previous", m_parent->getProperty(name)); 0081 m_parent->setPropertyNotSaved(name + "_previous"); 0082 } 0083 return; 0084 } 0085 } 0086 0087 m_parent->setProperty(name, value); 0088 } 0089 0090 bool KisLockedPropertiesProxy::hasProperty(const QString &name) const 0091 { 0092 KisPaintOpSettings *t = dynamic_cast<KisPaintOpSettings*>(m_parent); 0093 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(t, m_parent->hasProperty(name)); 0094 if (!t->updateListener()) return m_parent->hasProperty(name); 0095 0096 return (m_lockedProperties->lockedProperties() && 0097 m_lockedProperties->lockedProperties()->hasProperty(name)) || 0098 m_parent->hasProperty(name); 0099 0100 } 0101 0102 QList<QString> KisLockedPropertiesProxy::getPropertiesKeys() const 0103 { 0104 KisPaintOpSettings *t = dynamic_cast<KisPaintOpSettings*>(m_parent); 0105 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(t, m_parent->getPropertiesKeys()); 0106 if (!t->updateListener()) return m_parent->getPropertiesKeys(); 0107 0108 QList<QString> result = m_parent->getPropertiesKeys(); 0109 0110 if (m_lockedProperties->lockedProperties() && !m_lockedProperties->lockedProperties()->getPropertiesKeys().isEmpty()) { 0111 #if QT_VERSION >= QT_VERSION_CHECK(5,14,0) 0112 QSet<QString> properties(result.begin(), result.end()); 0113 auto lockedPropertiesKeys = m_lockedProperties->lockedProperties()->getPropertiesKeys(); 0114 QSet<QString> lockedProperties(lockedPropertiesKeys.begin(), lockedPropertiesKeys.end()); 0115 #else 0116 QSet<QString> properties = QSet<QString>::fromList(result); 0117 QSet<QString> lockedProperties = QSet<QString>::fromList(m_lockedProperties->lockedProperties()->getPropertiesKeys()); 0118 #endif 0119 properties += lockedProperties; 0120 #if QT_VERSION >= QT_VERSION_CHECK(5,14,0) 0121 result = QList<QString>(properties.begin(), properties.end()) ; 0122 #else 0123 result = QList<QString>::fromSet(properties); 0124 #endif 0125 } 0126 0127 return result; 0128 } 0129 0130 void KisLockedPropertiesProxy::dump() const 0131 { 0132 qDebug() << "=== KisLockedPropertiesProxy::dump() ==="; 0133 qDebug() << "parent properties:"; 0134 m_parent->dump(); 0135 0136 if (m_lockedProperties->lockedProperties()) { 0137 qDebug() << "locked properties:"; 0138 m_lockedProperties->lockedProperties()->dump(); 0139 } 0140 } 0141 0142 0143