void SGameplayTagWidget::OnTagUnchecked(TSharedPtr<FGameplayTagNode> NodeUnchecked)
{
	FScopedTransaction Transaction( LOCTEXT("GameplayTagWidget_RemoveTags", "Remove Gameplay Tags"));
	if (NodeUnchecked.IsValid())
	{
		UGameplayTagsManager& TagsManager = IGameplayTagsModule::Get().GetGameplayTagsManager();

		for (int32 ContainerIdx = 0; ContainerIdx < TagContainers.Num(); ++ContainerIdx)
		{
			UObject* OwnerObj = TagContainers[ContainerIdx].TagContainerOwner.Get();
			FGameplayTagContainer* Container = TagContainers[ContainerIdx].TagContainer;
			FGameplayTag Tag = TagsManager.RequestGameplayTag(NodeUnchecked->GetCompleteTag());

			if (Container)
			{
				FGameplayTagContainer EditableContainer = *Container;
				EditableContainer.RemoveTag(Tag);

				TWeakPtr<FGameplayTagNode> ParentNode = NodeUnchecked->GetParentTagNode();
				if (ParentNode.IsValid())
				{
					// Check if there are other siblings before adding parent
					bool bOtherSiblings = false;
					for (auto It = ParentNode.Pin()->GetChildTagNodes().CreateConstIterator(); It; ++It)
					{
						Tag = TagsManager.RequestGameplayTag(It->Get()->GetCompleteTag());
						if (EditableContainer.HasTag(Tag, EGameplayTagMatchType::Explicit, EGameplayTagMatchType::Explicit))
						{
							bOtherSiblings = true;
							break;
						}
					}
					// Add Parent
					if (!bOtherSiblings)
					{
						Tag = TagsManager.RequestGameplayTag(ParentNode.Pin()->GetCompleteTag());
						EditableContainer.AddTag(Tag);
					}
				}

				// Uncheck Children
				for (const auto& ChildNode : NodeUnchecked->GetChildTagNodes())
				{
					UncheckChildren(ChildNode, EditableContainer);
				}

				SetContainer(Container, &EditableContainer, OwnerObj);
			}
			
		}
	}
}
void SGameplayTagWidget::UncheckChildren(TSharedPtr<FGameplayTagNode> NodeUnchecked, FGameplayTagContainer& EditableContainer)
{
	UGameplayTagsManager& TagsManager = IGameplayTagsModule::Get().GetGameplayTagsManager();

	FGameplayTag Tag = TagsManager.RequestGameplayTag(NodeUnchecked->GetCompleteTag());
	EditableContainer.RemoveTag(Tag);

	// Uncheck Children
	for (const auto& ChildNode : NodeUnchecked->GetChildTagNodes())
	{
		UncheckChildren(ChildNode, EditableContainer);
	}
}
void wxSRHierarchicalConteiner::ShowChildren(wxSRComponent* choice) {

	if (Find(choice)) {
		wxSizer* sizer = m_sizer_associations[choice];

		bool is_checked = choice->IsChecked();

		if (!is_checked)
			UncheckChildren(choice);

		sizer->Show(is_checked);

		m_sizer->Layout();
	}

}
Beispiel #4
0
void wxSRCheckBox::OnClick(wxCommandEvent& event) {

  if (m_children_sizer)
    m_children_sizer->Show(IsChecked());

  if (IsChecked()) {

    std::vector<wxSRComponent*>::iterator iter;

    for (iter = m_children.begin(); iter != m_children.end(); iter++) {
      wxSRComponent* tmp = *iter;
      tmp->RefreshState(event, true);
    }

  } else {
    UncheckChildren(event);
  }

  RefreshSizers();

}
void wxSRHierarchicalConteiner::UncheckChildren(wxSRComponent* choice) {
	if (Find(choice)) {

		std::vector<wxSRComponent*> children = m_checkbox_tree[choice];

		for (unsigned int i = 0; i < children.size(); i++) {

			wxSRComponent* child = children.at(i);

			child->SetCheckValue(false);

			wxSizer* child_sizer = m_sizer_associations[child];

			if (child_sizer != NULL)
				child_sizer->Show(false);

			UncheckChildren(child);
		}

	}
}