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