void SGameplayTagWidget::OnTagChecked(TSharedPtr<FGameplayTagNode> NodeChecked) { FScopedTransaction Transaction( LOCTEXT("GameplayTagWidget_AddTags", "Add Gameplay Tags") ); UGameplayTagsManager& TagsManager = IGameplayTagsModule::Get().GetGameplayTagsManager(); for (int32 ContainerIdx = 0; ContainerIdx < TagContainers.Num(); ++ContainerIdx) { TWeakPtr<FGameplayTagNode> CurNode(NodeChecked); UObject* OwnerObj = TagContainers[ContainerIdx].TagContainerOwner.Get(); FGameplayTagContainer* Container = TagContainers[ContainerIdx].TagContainer; if (Container) { FGameplayTagContainer EditableContainer = *Container; bool bRemoveParents = false; while (CurNode.IsValid()) { FGameplayTag Tag = TagsManager.RequestGameplayTag(CurNode.Pin()->GetCompleteTag()); if (bRemoveParents == false) { bRemoveParents = true; if (bMultiSelect == false) { EditableContainer.RemoveAllTags(); } EditableContainer.AddTag(Tag); } else { EditableContainer.RemoveTag(Tag); } CurNode = CurNode.Pin()->GetParentTagNode(); } SetContainer(Container, &EditableContainer, OwnerObj); } } }
void FGameplayTagCustomization::OnPropertyValueChanged() { TagName = TEXT(""); if (StructPropertyHandle.IsValid() && EditableContainers.Num() > 0) { TArray<void*> RawStructData; StructPropertyHandle->AccessRawData(RawStructData); if (RawStructData.Num() > 0) { FGameplayTag* Tag = (FGameplayTag*)(RawStructData[0]); FGameplayTagContainer* Container = EditableContainers[0].TagContainer; if (Tag && Container) { Container->RemoveAllTags(); Container->AddTag(*Tag); TagName = Tag->ToString(); } } } }