From 3fa9d16be2fc53a9915e6573275da6c0a90d6a04 Mon Sep 17 00:00:00 2001 From: Guthrie Adams Date: Mon, 27 Sep 2021 20:35:54 -0500 Subject: [PATCH 1/3] Material editor: replacing modified property highlight color with indicator icons Testing to see how easy it is to set up the indicated icons. Problematic because icons are to the left of property labels instead of the left of property widget. This completely destroys alignment. Signed-off-by: Guthrie Adams --- .../Inspector/InspectorPropertyGroupWidget.h | 3 +- .../InspectorPropertyGroupWidget.cpp | 4 ++- .../MaterialInspector/MaterialInspector.cpp | 29 ++++++++++++------- .../MaterialInspector/MaterialInspector.h | 4 +-- 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorPropertyGroupWidget.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorPropertyGroupWidget.h index cef3eada75..d373e2010c 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorPropertyGroupWidget.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorPropertyGroupWidget.h @@ -41,7 +41,8 @@ namespace AtomToolsFramework AzToolsFramework::IPropertyEditorNotify* instanceNotificationHandler = {}, QWidget* parent = {}, const AZ::u32 saveStateKey = {}, - const AzToolsFramework::InstanceDataHierarchy::ValueComparisonFunction& valueComparisonFunction = {}); + const AzToolsFramework::InstanceDataHierarchy::ValueComparisonFunction& valueComparisonFunction = {}, + const AzToolsFramework::IndicatorQueryFunction& indicatorQueryFunction = {}); void Refresh() override; void Rebuild() override; diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorPropertyGroupWidget.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorPropertyGroupWidget.cpp index e1f8573bb3..6ab76dedef 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorPropertyGroupWidget.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorPropertyGroupWidget.cpp @@ -19,7 +19,8 @@ namespace AtomToolsFramework AzToolsFramework::IPropertyEditorNotify* instanceNotificationHandler, QWidget* parent, const AZ::u32 saveStateKey, - const AzToolsFramework::InstanceDataHierarchy::ValueComparisonFunction& valueComparisonFunction) + const AzToolsFramework::InstanceDataHierarchy::ValueComparisonFunction& valueComparisonFunction, + const AzToolsFramework::IndicatorQueryFunction& indicatorQueryFunction) : InspectorGroupWidget(parent) { AZ::SerializeContext* context = nullptr; @@ -34,6 +35,7 @@ namespace AtomToolsFramework m_propertyEditor->SetHideRootProperties(true); m_propertyEditor->SetAutoResizeLabels(true); m_propertyEditor->SetValueComparisonFunction(valueComparisonFunction); + m_propertyEditor->SetIndicatorQueryFunction(indicatorQueryFunction); m_propertyEditor->SetSavedStateKey(saveStateKey); m_propertyEditor->Setup(context, instanceNotificationHandler, false); m_propertyEditor->AddInstance(instance, instanceClassId, nullptr, instanceToCompare); diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp index 28d7d3d3f5..78e3edecf5 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp @@ -91,12 +91,19 @@ namespace MaterialEditor return AZ::Crc32(AZStd::string::format("MaterialInspector::PropertyGroup::%s::%s", m_documentPath.c_str(), groupNameId.c_str())); } - bool MaterialInspector::CompareInstanceNodeProperties( - const AzToolsFramework::InstanceDataNode* source, const AzToolsFramework::InstanceDataNode* target) const + bool MaterialInspector::IsInstanceNodePropertyModifed(const AzToolsFramework::InstanceDataNode* node) const { - AZ_UNUSED(source); - const AtomToolsFramework::DynamicProperty* property = AtomToolsFramework::FindDynamicPropertyForInstanceDataNode(target); - return property && AtomToolsFramework::ArePropertyValuesEqual(property->GetValue(), property->GetConfig().m_parentValue); + const AtomToolsFramework::DynamicProperty* property = AtomToolsFramework::FindDynamicPropertyForInstanceDataNode(node); + return property && !AtomToolsFramework::ArePropertyValuesEqual(property->GetValue(), property->GetConfig().m_parentValue); + } + + const char* MaterialInspector::GetInstanceNodePropertyIndicator(const AzToolsFramework::InstanceDataNode* node) const + { + if (IsInstanceNodePropertyModifed(node)) + { + return ":/PropertyEditor/Resources/changed_data_item.png"; + } + return nullptr; } void MaterialInspector::AddOverviewGroup() @@ -122,8 +129,8 @@ namespace MaterialEditor // Passing in same group as main and comparison instance to enable custom value comparison for highlighting modified properties auto propertyGroupWidget = new AtomToolsFramework::InspectorPropertyGroupWidget( - &group, &group, group.TYPEINFO_Uuid(), this, this, GetGroupSaveStateKey(groupNameId), - [this](const auto source, const auto target) { return CompareInstanceNodeProperties(source, target); }); + &group, &group, group.TYPEINFO_Uuid(), this, this, GetGroupSaveStateKey(groupNameId), {}, + [this](const auto node) { return GetInstanceNodePropertyIndicator(node); }); AddGroup(groupNameId, groupDisplayName, groupDescription, propertyGroupWidget); } @@ -153,8 +160,8 @@ namespace MaterialEditor // Passing in same group as main and comparison instance to enable custom value comparison for highlighting modified properties auto propertyGroupWidget = new AtomToolsFramework::InspectorPropertyGroupWidget( - &group, &group, group.TYPEINFO_Uuid(), this, this, GetGroupSaveStateKey(groupNameId), - [this](const auto source, const auto target) { return CompareInstanceNodeProperties(source, target); }); + &group, &group, group.TYPEINFO_Uuid(), this, this, GetGroupSaveStateKey(groupNameId), {}, + [this](const auto node) { return GetInstanceNodePropertyIndicator(node); }); AddGroup(groupNameId, groupDisplayName, groupDescription, propertyGroupWidget); } @@ -189,8 +196,8 @@ namespace MaterialEditor // Passing in same group as main and comparison instance to enable custom value comparison for highlighting modified properties auto propertyGroupWidget = new AtomToolsFramework::InspectorPropertyGroupWidget( - &group, &group, group.TYPEINFO_Uuid(), this, this, GetGroupSaveStateKey(groupNameId), - [this](const auto source, const auto target) { return CompareInstanceNodeProperties(source, target); }); + &group, &group, group.TYPEINFO_Uuid(), this, this, GetGroupSaveStateKey(groupNameId), {}, + [this](const auto node) { return GetInstanceNodePropertyIndicator(node); }); AddGroup(groupNameId, groupDisplayName, groupDescription, propertyGroupWidget); bool isGroupVisible = false; diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.h index 845a8cb0f7..4ac127d94b 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.h +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.h @@ -43,8 +43,8 @@ namespace MaterialEditor private: AZ::Crc32 GetGroupSaveStateKey(const AZStd::string& groupNameId) const; - bool CompareInstanceNodeProperties( - const AzToolsFramework::InstanceDataNode* source, const AzToolsFramework::InstanceDataNode* target) const; + bool IsInstanceNodePropertyModifed(const AzToolsFramework::InstanceDataNode* node) const; + const char* GetInstanceNodePropertyIndicator(const AzToolsFramework::InstanceDataNode* node) const; void AddOverviewGroup(); void AddUvNamesGroup(); From 7c2464ad157d50bbfebd32f0cad7739eef182ca0 Mon Sep 17 00:00:00 2001 From: Guthrie Adams Date: Tue, 28 Sep 2021 17:32:02 -0500 Subject: [PATCH 2/3] Changing material inspector to use indicator icons instead of highlighting modified properties Added a blank placeholder image to account for changes to indention when indicator icons are active Added parameter to inspector constructor for specifying leaf property indention size Signed-off-by: Guthrie Adams --- .../UI/PropertyEditor/PropertyRowWidget.cpp | 13 +++---------- .../UI/PropertyEditor/Resources/Icons.qrc | 1 + .../UI/PropertyEditor/Resources/blank.png | 3 +++ .../Inspector/InspectorPropertyGroupWidget.h | 3 ++- .../Inspector/InspectorPropertyGroupWidget.cpp | 6 ++++-- .../Code/Source/Util/MaterialPropertyUtil.cpp | 1 + .../Window/MaterialInspector/MaterialInspector.cpp | 8 ++++---- 7 files changed, 18 insertions(+), 17 deletions(-) create mode 100644 Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/blank.png diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp index 9ba998b99a..bb2d2851ca 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.cpp @@ -1102,10 +1102,7 @@ namespace AzToolsFramework { m_dropDownArrow->hide(); } - m_indent->changeSize((m_treeDepth * m_treeIndentation) + m_leafIndentation, 1, QSizePolicy::Fixed, QSizePolicy::Fixed); - m_leftHandSideLayout->invalidate(); - m_leftHandSideLayout->update(); - m_leftHandSideLayout->activate(); + SetIndentSize(m_treeDepth * m_treeIndentation + m_leafIndentation); } else { @@ -1117,10 +1114,7 @@ namespace AzToolsFramework connect(m_dropDownArrow, &QCheckBox::clicked, this, &PropertyRowWidget::OnClickedExpansionButton); } m_dropDownArrow->show(); - m_indent->changeSize((m_treeDepth * m_treeIndentation), 1, QSizePolicy::Fixed, QSizePolicy::Fixed); - m_leftHandSideLayout->invalidate(); - m_leftHandSideLayout->update(); - m_leftHandSideLayout->activate(); + SetIndentSize(m_treeDepth * m_treeIndentation); m_dropDownArrow->setChecked(m_expanded); } } @@ -1720,10 +1714,9 @@ namespace AzToolsFramework } else { - m_indicatorButton->setVisible(true); - QPixmap pixmap(imagePath); m_indicatorButton->setIcon(pixmap); + m_indicatorButton->setVisible(true); }; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/Icons.qrc b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/Icons.qrc index 7dcc593d5a..621f9be4ad 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/Icons.qrc +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/Icons.qrc @@ -1,5 +1,6 @@ + blank.png point_hand.png cross-circle-small.png cross-small.png diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/blank.png b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/blank.png new file mode 100644 index 0000000000..d040fa2e14 --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/blank.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81b5fa1f978888c3be8a40fce20455668df2723a77587aeb7039f8bf74bdd0e3 +size 119 diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorPropertyGroupWidget.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorPropertyGroupWidget.h index d373e2010c..d641af697f 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorPropertyGroupWidget.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorPropertyGroupWidget.h @@ -42,7 +42,8 @@ namespace AtomToolsFramework QWidget* parent = {}, const AZ::u32 saveStateKey = {}, const AzToolsFramework::InstanceDataHierarchy::ValueComparisonFunction& valueComparisonFunction = {}, - const AzToolsFramework::IndicatorQueryFunction& indicatorQueryFunction = {}); + const AzToolsFramework::IndicatorQueryFunction& indicatorQueryFunction = {}, + int leafIndentSize = 16); void Refresh() override; void Rebuild() override; diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorPropertyGroupWidget.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorPropertyGroupWidget.cpp index 6ab76dedef..903c74b076 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorPropertyGroupWidget.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorPropertyGroupWidget.cpp @@ -20,7 +20,8 @@ namespace AtomToolsFramework QWidget* parent, const AZ::u32 saveStateKey, const AzToolsFramework::InstanceDataHierarchy::ValueComparisonFunction& valueComparisonFunction, - const AzToolsFramework::IndicatorQueryFunction& indicatorQueryFunction) + const AzToolsFramework::IndicatorQueryFunction& indicatorQueryFunction, + int leafIndentSize) : InspectorGroupWidget(parent) { AZ::SerializeContext* context = nullptr; @@ -33,7 +34,8 @@ namespace AtomToolsFramework m_propertyEditor = new AzToolsFramework::ReflectedPropertyEditor(this); m_propertyEditor->SetHideRootProperties(true); - m_propertyEditor->SetAutoResizeLabels(true); + m_propertyEditor->SetAutoResizeLabels(false); + m_propertyEditor->SetLeafIndentation(leafIndentSize); m_propertyEditor->SetValueComparisonFunction(valueComparisonFunction); m_propertyEditor->SetIndicatorQueryFunction(indicatorQueryFunction); m_propertyEditor->SetSavedStateKey(saveStateKey); diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Util/MaterialPropertyUtil.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Util/MaterialPropertyUtil.cpp index 641cf63d04..1ce973b4d7 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Util/MaterialPropertyUtil.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Util/MaterialPropertyUtil.cpp @@ -150,6 +150,7 @@ namespace AtomToolsFramework ComparePropertyValues(valueA, valueB) || ComparePropertyValues(valueA, valueB) || ComparePropertyValues(valueA, valueB) || + ComparePropertyValues>(valueA, valueB) || ComparePropertyValues>(valueA, valueB) || ComparePropertyValues>(valueA, valueB) || ComparePropertyValues>(valueA, valueB) || diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp index 78e3edecf5..525930548a 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialInspector/MaterialInspector.cpp @@ -103,7 +103,7 @@ namespace MaterialEditor { return ":/PropertyEditor/Resources/changed_data_item.png"; } - return nullptr; + return ":/PropertyEditor/Resources/blank.png"; } void MaterialInspector::AddOverviewGroup() @@ -130,7 +130,7 @@ namespace MaterialEditor // Passing in same group as main and comparison instance to enable custom value comparison for highlighting modified properties auto propertyGroupWidget = new AtomToolsFramework::InspectorPropertyGroupWidget( &group, &group, group.TYPEINFO_Uuid(), this, this, GetGroupSaveStateKey(groupNameId), {}, - [this](const auto node) { return GetInstanceNodePropertyIndicator(node); }); + [this](const auto node) { return GetInstanceNodePropertyIndicator(node); }, 0); AddGroup(groupNameId, groupDisplayName, groupDescription, propertyGroupWidget); } @@ -161,7 +161,7 @@ namespace MaterialEditor // Passing in same group as main and comparison instance to enable custom value comparison for highlighting modified properties auto propertyGroupWidget = new AtomToolsFramework::InspectorPropertyGroupWidget( &group, &group, group.TYPEINFO_Uuid(), this, this, GetGroupSaveStateKey(groupNameId), {}, - [this](const auto node) { return GetInstanceNodePropertyIndicator(node); }); + [this](const auto node) { return GetInstanceNodePropertyIndicator(node); }, 0); AddGroup(groupNameId, groupDisplayName, groupDescription, propertyGroupWidget); } @@ -197,7 +197,7 @@ namespace MaterialEditor // Passing in same group as main and comparison instance to enable custom value comparison for highlighting modified properties auto propertyGroupWidget = new AtomToolsFramework::InspectorPropertyGroupWidget( &group, &group, group.TYPEINFO_Uuid(), this, this, GetGroupSaveStateKey(groupNameId), {}, - [this](const auto node) { return GetInstanceNodePropertyIndicator(node); }); + [this](const auto node) { return GetInstanceNodePropertyIndicator(node); }, 0); AddGroup(groupNameId, groupDisplayName, groupDescription, propertyGroupWidget); bool isGroupVisible = false; From f8374b76b7afdd4fd82db679ddd6e9e35085a3b5 Mon Sep 17 00:00:00 2001 From: Guthrie Adams Date: Tue, 28 Sep 2021 18:16:23 -0500 Subject: [PATCH 3/3] Added modified property indicator icon to material property inspector in material component Signed-off-by: Guthrie Adams --- .../EditorMaterialComponentInspector.cpp | 25 +++++++++++++------ .../EditorMaterialComponentInspector.h | 6 ++--- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp index a3152faf87..59d5723911 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp @@ -271,7 +271,8 @@ namespace AZ // Passing in same group as main and comparison instance to enable custom value comparison for highlighting modified properties auto propertyGroupWidget = new AtomToolsFramework::InspectorPropertyGroupWidget( - &group, nullptr, group.TYPEINFO_Uuid(), this, this, GetSaveStateKeyForGroup(groupNameId)); + &group, &group, group.TYPEINFO_Uuid(), this, this, GetGroupSaveStateKey(groupNameId), {}, + [this](const auto node) { return GetInstanceNodePropertyIndicator(node); }, 0); AddGroup(groupNameId, groupDisplayName, groupDescription, propertyGroupWidget); } @@ -316,7 +317,8 @@ namespace AZ // Passing in same group as main and comparison instance to enable custom value comparison for highlighting modified properties auto propertyGroupWidget = new AtomToolsFramework::InspectorPropertyGroupWidget( - &group, nullptr, group.TYPEINFO_Uuid(), this, this, GetSaveStateKeyForGroup(groupNameId)); + &group, &group, group.TYPEINFO_Uuid(), this, this, GetGroupSaveStateKey(groupNameId), {}, + [this](const auto node) { return GetInstanceNodePropertyIndicator(node); }, 0); AddGroup(groupNameId, groupDisplayName, groupDescription, propertyGroupWidget); } @@ -496,19 +498,26 @@ namespace AZ } } - AZ::Crc32 MaterialPropertyInspector::GetSaveStateKeyForGroup(const AZStd::string& groupNameId) const + AZ::Crc32 MaterialPropertyInspector::GetGroupSaveStateKey(const AZStd::string& groupNameId) const { return AZ::Crc32(AZStd::string::format( "MaterialPropertyInspector::PropertyGroup::%s::%s", m_editData.m_materialAssetId.ToString().c_str(), groupNameId.c_str())); } - bool MaterialPropertyInspector::AreNodePropertyValuesEqual( - const AzToolsFramework::InstanceDataNode* source, const AzToolsFramework::InstanceDataNode* target) + bool MaterialPropertyInspector::IsInstanceNodePropertyModifed(const AzToolsFramework::InstanceDataNode* node) const { - AZ_UNUSED(source); - const AtomToolsFramework::DynamicProperty* property = AtomToolsFramework::FindDynamicPropertyForInstanceDataNode(target); - return property && AtomToolsFramework::ArePropertyValuesEqual(property->GetValue(), property->GetConfig().m_parentValue); + const AtomToolsFramework::DynamicProperty* property = AtomToolsFramework::FindDynamicPropertyForInstanceDataNode(node); + return property && !AtomToolsFramework::ArePropertyValuesEqual(property->GetValue(), property->GetConfig().m_parentValue); + } + + const char* MaterialPropertyInspector::GetInstanceNodePropertyIndicator(const AzToolsFramework::InstanceDataNode* node) const + { + if (IsInstanceNodePropertyModifed(node)) + { + return ":/PropertyEditor/Resources/changed_data_item.png"; + } + return ":/PropertyEditor/Resources/blank.png"; } bool MaterialPropertyInspector::SaveMaterial() const diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.h index 11eb2cec51..ff5a843392 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.h @@ -100,9 +100,9 @@ namespace AZ void RunEditorMaterialFunctors(); void UpdateMaterialInstanceProperty(const AtomToolsFramework::DynamicProperty& property); - AZ::Crc32 GetSaveStateKeyForGroup(const AZStd::string& groupNameId) const; - static bool AreNodePropertyValuesEqual( - const AzToolsFramework::InstanceDataNode* source, const AzToolsFramework::InstanceDataNode* target); + AZ::Crc32 GetGroupSaveStateKey(const AZStd::string& groupNameId) const; + bool IsInstanceNodePropertyModifed(const AzToolsFramework::InstanceDataNode* node) const; + const char* GetInstanceNodePropertyIndicator(const AzToolsFramework::InstanceDataNode* node) const; // Tracking the property that is actively being edited in the inspector const AtomToolsFramework::DynamicProperty* m_activeProperty = {};