Files
UnrealEngine/Engine/Source/Editor/AnimationEditorWidgets/Private/SchematicGraphPanel/SchematicGraphModel.cpp
2025-05-18 13:04:45 +08:00

912 lines
23 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#if WITH_EDITOR
#include "SchematicGraphPanel/SchematicGraphModel.h"
#include "SchematicGraphPanel/SSchematicGraphPanel.h"
#define LOCTEXT_NAMESPACE "SchematicGraphModel"
void FSchematicGraphModel::Reset()
{
Nodes.Reset();
Links.Reset();
if (OnGraphResetDelegate.IsBound())
{
OnGraphReset().Broadcast();
}
}
bool FSchematicGraphModel::RemoveNode(const FGuid& InNodeGuid)
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
if(TTuple<TArray<FGuid>,TArray<FGuid>>* ExistingTuple = NodeGuidToLinkGuids.Find(InNodeGuid))
{
TTuple<TArray<FGuid>,TArray<FGuid>> LinksToNode;
Swap(LinksToNode, *ExistingTuple);
NodeGuidToLinkGuids.Remove(InNodeGuid);
for(const FGuid& LinkGuid : LinksToNode.Get<0>())
{
(void)RemoveLink(LinkGuid);
}
for(const FGuid& LinkGuid : LinksToNode.Get<1>())
{
(void)RemoveLink(LinkGuid);
}
}
if(LastExpandedNode == InNodeGuid)
{
LastExpandedNode = FGuid();
}
if (OnNodeRemovedDelegate.IsBound())
{
OnNodeRemovedDelegate.Broadcast(Node);
}
const TArray<FGuid> ChildNodeGuids = Node->GetChildNodeGuids();
for(const FGuid& ChildNodeGuid : ChildNodeGuids)
{
(void)RemoveFromParentNode(ChildNodeGuid);
}
const FGuid NodeGuid = Node->GetGuid();
(void)RemoveFromParentNode(NodeGuid);
NodeByGuid.Remove(Node->GetGuid());
Nodes.RemoveAll([NodeGuid](const TSharedPtr<FSchematicGraphNode>& ExistingNode) -> bool
{
return ExistingNode->GetGuid() == NodeGuid;
});
return true;
}
return false;
}
bool FSchematicGraphModel::SetParentNode(const FGuid& InChildNodeGuid, const FGuid& InParentNodeGuid, bool bUpdateGroupNode)
{
if(const FSchematicGraphNode* Node = FindNode(InChildNodeGuid))
{
return SetParentNode(Node, FindNode(InParentNodeGuid), bUpdateGroupNode);
}
return false;
}
bool FSchematicGraphModel::SetParentNode(const FSchematicGraphNode* InChildNode, const FSchematicGraphNode* InParentNode, bool bUpdateGroupNode)
{
check(InChildNode);
if(InParentNode)
{
if(InParentNode == InChildNode->GetParentNode())
{
return false;
}
(void)RemoveFromParentNode(InChildNode, bUpdateGroupNode);
const_cast<FSchematicGraphNode*>(InParentNode)->ChildNodeGuids.AddUnique(InChildNode->GetGuid());
const_cast<FSchematicGraphNode*>(InChildNode)->ParentNodeGuid = InParentNode->GetGuid();
return true;
}
if(const FSchematicGraphNode* CurrentParentNode = InChildNode->GetParentNode())
{
FSchematicGraphNode* MutableParentNode = const_cast<FSchematicGraphNode*>(CurrentParentNode);
if(bUpdateGroupNode && (MutableParentNode->ChildNodeGuids.Num() == 1))
{
if(FSchematicGraphGroupNode* GroupParentNode = Cast<FSchematicGraphGroupNode>(MutableParentNode))
{
GroupParentNode->SetExpanded(false);
if(LastExpandedNode == GroupParentNode->GetGuid())
{
ClearLastExpandedNode();
}
}
}
(void)MutableParentNode->ChildNodeGuids.Remove(InChildNode->GetGuid());
const_cast<FSchematicGraphNode*>(InChildNode)->ParentNodeGuid = FGuid();
return true;
}
return false;
}
bool FSchematicGraphModel::RemoveFromParentNode(const FGuid& InChildNodeGuid, bool bUpdateGroupNode)
{
if(const FSchematicGraphNode* Node = FindNode(InChildNodeGuid))
{
return RemoveFromParentNode(Node, bUpdateGroupNode);
}
return false;
}
bool FSchematicGraphModel::RemoveFromParentNode(const FSchematicGraphNode* InChildNode, bool bUpdateGroupNode)
{
check(InChildNode);
return SetParentNode(InChildNode, nullptr, bUpdateGroupNode);
}
FVector2d FSchematicGraphModel::GetPositionForNode(const FGuid& InNodeGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
return GetPositionForNode(Node);
}
return FVector2d::ZeroVector;
}
FVector2d FSchematicGraphModel::GetPositionForNode(const FSchematicGraphNode* InNode) const
{
check(InNode);
return InNode->GetPosition();
}
FVector2d FSchematicGraphModel::GetPositionOffsetForNode(const FGuid& InNodeGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
return GetPositionOffsetForNode(Node);
}
return FVector2d::ZeroVector;
}
FVector2d FSchematicGraphModel::GetPositionOffsetForNode(const FSchematicGraphNode* InNode) const
{
check(InNode);
return InNode->GetPositionOffset();
}
bool FSchematicGraphModel::GetPositionAnimationEnabledForNode(const FGuid& InNodeGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
return GetPositionAnimationEnabledForNode(Node);
}
return false;
}
bool FSchematicGraphModel::GetPositionAnimationEnabledForNode(const FSchematicGraphNode* InNode) const
{
return true;
}
FVector2d FSchematicGraphModel::GetSizeForNode(const FGuid& InNodeGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
return GetSizeForNode(Node);
}
return SSchematicGraphNode::DefaultNodeSize;
}
FVector2d FSchematicGraphModel::GetSizeForNode(const FSchematicGraphNode* InNode) const
{
return SSchematicGraphNode::DefaultNodeSize;
}
float FSchematicGraphModel::GetScaleForNode(const FGuid& InNodeGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
return GetScaleForNode(Node);
}
return 1.f;
}
float FSchematicGraphModel::GetScaleForNode(const FSchematicGraphNode* InNode) const
{
float Scale = 1.f;
if(const FSchematicGraphNode* ParentNode = InNode->GetParentNode())
{
const TOptional<float> ParentScale = GetScaleForChildNode(ParentNode, InNode);
if(ParentScale.IsSet())
{
Scale *= ParentScale.GetValue();
}
}
return Scale * GetScaleOffsetForNode(InNode);
}
float FSchematicGraphModel::GetScaleOffsetForNode(const FGuid& InNodeGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
return GetScaleOffsetForNode(Node);
}
return 1.f;
}
float FSchematicGraphModel::GetScaleOffsetForNode(const FSchematicGraphNode* InNode) const
{
check(InNode);
return InNode->GetScaleOffset();
}
float FSchematicGraphModel::GetMinimumLinkDistanceForNode(const FGuid& InNodeGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
return GetMinimumLinkDistanceForNode(Node);
}
return 0;
}
float FSchematicGraphModel::GetMinimumLinkDistanceForNode(const FSchematicGraphNode* InNode) const
{
check(InNode);
// return the radius of the node - 1 pixel
const FVector2d Size = GetSizeForNode(InNode);
return Size.GetMax() * 0.5f - 1.f;
}
bool FSchematicGraphModel::IsAutoScaleEnabledForNode(const FGuid& InNodeGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
return IsAutoScaleEnabledForNode(Node);
}
return false;
}
bool FSchematicGraphModel::IsAutoScaleEnabledForNode(const FSchematicGraphNode* InNode) const
{
check(InNode);
if(InNode->HasParentNode())
{
return false;
}
return InNode->IsAutoScaleEnabled();
}
int32 FSchematicGraphModel::GetNumLayersForNode(const FGuid& InNodeGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
return GetNumLayersForNode(Node);
}
return 0;
}
int32 FSchematicGraphModel::GetNumLayersForNode(const FSchematicGraphNode* InNode) const
{
check(InNode);
return InNode->GetNumLayers();
}
FLinearColor FSchematicGraphModel::GetColorForNode(const FGuid& InNodeGuid, int32 InLayerIndex) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
const FLinearColor Color = GetColorForNode(Node, InLayerIndex);
if(GetVisibilityForNode(Node) == ESchematicGraphVisibility::FadedOut)
{
return Color * 0.5f;
}
return Color;
}
return FLinearColor::White;
}
FLinearColor FSchematicGraphModel::GetColorForNode(const FSchematicGraphNode* InNode, int32 InLayerIndex) const
{
check(InNode);
return InNode->GetColor(InLayerIndex);
}
const FSlateBrush* FSchematicGraphModel::GetBrushForNode(const FGuid& InNodeGuid, int32 InLayerIndex) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
if(const FSlateBrush* Brush = GetBrushForNode(Node, InLayerIndex))
{
return Brush;
}
}
static const FSlateBrush* DefaultBrush = SSchematicGraphNode::FArguments()._BrushGetter(FGuid(), INDEX_NONE);
return DefaultBrush;
}
const FSlateBrush* FSchematicGraphModel::GetBrushForNode(const FSchematicGraphNode* InNode, int32 InLayerIndex) const
{
check(InNode);
return InNode->GetBrush(InLayerIndex);
}
FText FSchematicGraphModel::GetToolTipForNode(const FGuid& InNodeGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
return GetToolTipForNode(Node);
}
return FText();
}
FText FSchematicGraphModel::GetToolTipForNode(const FSchematicGraphNode* InNode) const
{
check(InNode);
return InNode->GetToolTip();
}
ESchematicGraphVisibility::Type FSchematicGraphModel::GetVisibilityForNode(const FGuid& InNodeGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
return GetVisibilityForNode(Node);
}
return ESchematicGraphVisibility::Visible;
}
ESchematicGraphVisibility::Type FSchematicGraphModel::GetVisibilityForNode(const FSchematicGraphNode* InNode) const
{
check(InNode);
return InNode->GetVisibility();
}
TOptional<ESchematicGraphVisibility::Type> FSchematicGraphModel::GetVisibilityForChildNode(const FGuid& InParentNodeGuid, const FGuid& InChildNodeGuid) const
{
if(const FSchematicGraphNode* ParentNode = FindNode(InParentNodeGuid))
{
if(const FSchematicGraphNode* ChildNode = FindNode(InChildNodeGuid))
{
return GetVisibilityForChildNode(ParentNode, ChildNode);
}
}
return TOptional<ESchematicGraphVisibility::Type>();
}
TOptional<ESchematicGraphVisibility::Type> FSchematicGraphModel::GetVisibilityForChildNode(const FSchematicGraphNode* InParentNode, const FSchematicGraphNode* InChildNode) const
{
check(InParentNode);
check(InChildNode);
return InParentNode->GetVisibilityForChildNode(InChildNode);
}
TOptional<FVector2d> FSchematicGraphModel::GetPositionForChildNode(const FGuid& InParentNodeGuid, const FGuid& InChildNodeGuid) const
{
if(const FSchematicGraphNode* ParentNode = FindNode(InParentNodeGuid))
{
if(const FSchematicGraphNode* ChildNode = FindNode(InChildNodeGuid))
{
return GetPositionForChildNode(ParentNode, ChildNode);
}
}
return TOptional<FVector2d>();
}
TOptional<FVector2d> FSchematicGraphModel::GetPositionForChildNode(const FSchematicGraphNode* InParentNode, const FSchematicGraphNode* InChildNode) const
{
check(InParentNode);
check(InChildNode);
return InParentNode->GetPositionForChildNode(InChildNode);
}
TOptional<float> FSchematicGraphModel::GetScaleForChildNode(const FGuid& InParentNodeGuid, const FGuid& InChildNodeGuid) const
{
if(const FSchematicGraphNode* ParentNode = FindNode(InParentNodeGuid))
{
if(const FSchematicGraphNode* ChildNode = FindNode(InChildNodeGuid))
{
return GetScaleForChildNode(ParentNode, ChildNode);
}
}
return TOptional<float>();
}
TOptional<float> FSchematicGraphModel::GetScaleForChildNode(const FSchematicGraphNode* InParentNode, const FSchematicGraphNode* InChildNode) const
{
check(InParentNode);
check(InChildNode);
return InParentNode->GetScaleForChildNode(InChildNode);
}
TOptional<bool> FSchematicGraphModel::GetInteractivityForChildNode(const FGuid& InParentNodeGuid, const FGuid& InChildNodeGuid) const
{
if(const FSchematicGraphNode* ParentNode = FindNode(InParentNodeGuid))
{
if(const FSchematicGraphNode* ChildNode = FindNode(InChildNodeGuid))
{
return GetInteractivityForChildNode(ParentNode, ChildNode);
}
}
return TOptional<bool>();
}
TOptional<bool> FSchematicGraphModel::GetInteractivityForChildNode(const FSchematicGraphNode* InParentNode, const FSchematicGraphNode* InChildNode) const
{
check(InParentNode);
check(InChildNode);
return InParentNode->GetInteractivityForChildNode(InChildNode);
}
bool FSchematicGraphModel::IsDragSupportedForNode(const FGuid& InNodeGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
return IsDragSupportedForNode(Node);
}
return false;
}
bool FSchematicGraphModel::IsDragSupportedForNode(const FSchematicGraphNode* InNode) const
{
check(InNode);
return InNode->IsDragSupported();
}
bool FSchematicGraphModel::GetContextMenuForNode(const FSchematicGraphNode* InNode, FMenuBuilder& OutMenu) const
{
return false;
}
const TArray<TSharedPtr<FSchematicGraphNode>> FSchematicGraphModel::GetSelectedNodes() const
{
return Nodes.FilterByPredicate([](const TSharedPtr<FSchematicGraphNode>& Node)
{
if (Node.IsValid())
{
return Node->IsSelected();
}
return false;
});
}
void FSchematicGraphModel::ClearSelection()
{
for (TSharedPtr<FSchematicGraphNode> Node : Nodes)
{
if (Node.IsValid())
{
Node->SetSelected(false);
}
}
}
FLinearColor FSchematicGraphModel::GetBackgroundColorForTag(const FGuid& InNodeGuid, const FGuid& InTagGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
if(const FSchematicGraphTag* Tag = Node->FindTag(InTagGuid))
{
return GetBackgroundColorForTag(Tag);
}
}
return FLinearColor::White;
}
FLinearColor FSchematicGraphModel::GetBackgroundColorForTag(const FSchematicGraphTag* InTag) const
{
check(InTag);
return InTag->GetBackgroundColor();
}
FLinearColor FSchematicGraphModel::GetForegroundColorForTag(const FGuid& InNodeGuid, const FGuid& InTagGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
if(const FSchematicGraphTag* Tag = Node->FindTag(InTagGuid))
{
return GetForegroundColorForTag(Tag);
}
}
return FLinearColor::White;
}
FLinearColor FSchematicGraphModel::GetForegroundColorForTag(const FSchematicGraphTag* InTag) const
{
check(InTag);
return InTag->GetForegroundColor();
}
FLinearColor FSchematicGraphModel::GetLabelColorForTag(const FGuid& InNodeGuid, const FGuid& InTagGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
if(const FSchematicGraphTag* Tag = Node->FindTag(InTagGuid))
{
return GetLabelColorForTag(Tag);
}
}
return FLinearColor::White;
}
FLinearColor FSchematicGraphModel::GetLabelColorForTag(const FSchematicGraphTag* InTag) const
{
check(InTag);
return InTag->GetLabelColor();
}
const FSlateBrush* FSchematicGraphModel::GetBackgroundBrushForTag(const FGuid& InNodeGuid, const FGuid& InTagGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
if(const FSchematicGraphTag* Tag = Node->FindTag(InTagGuid))
{
return GetBackgroundBrushForTag(Tag);
}
}
return nullptr;
}
const FSlateBrush* FSchematicGraphModel::GetBackgroundBrushForTag(const FSchematicGraphTag* InTag) const
{
check(InTag);
return InTag->GetBackgroundBrush();
}
const FSlateBrush* FSchematicGraphModel::GetForegroundBrushForTag(const FGuid& InNodeGuid, const FGuid& InTagGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
if(const FSchematicGraphTag* Tag = Node->FindTag(InTagGuid))
{
return GetForegroundBrushForTag(Tag);
}
}
return nullptr;
}
const FSlateBrush* FSchematicGraphModel::GetForegroundBrushForTag(const FSchematicGraphTag* InTag) const
{
check(InTag);
return InTag->GetForegroundBrush();
}
const FText FSchematicGraphModel::GetLabelForTag(const FGuid& InNodeGuid, const FGuid& InTagGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
if(const FSchematicGraphTag* Tag = Node->FindTag(InTagGuid))
{
return GetLabelForTag(Tag);
}
}
return FText();
}
const FText FSchematicGraphModel::GetLabelForTag(const FSchematicGraphTag* InTag) const
{
check(InTag);
return InTag->GetLabel();
}
const FText FSchematicGraphModel::GetToolTipForTag(const FGuid& InNodeGuid, const FGuid& InTagGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
if(const FSchematicGraphTag* Tag = Node->FindTag(InTagGuid))
{
return GetToolTipForTag(Tag);
}
}
return FText();
}
const FText FSchematicGraphModel::GetToolTipForTag(const FSchematicGraphTag* InTag) const
{
check(InTag);
return InTag->GetToolTip();
}
ESchematicGraphVisibility::Type FSchematicGraphModel::GetVisibilityForTag(const FGuid& InNodeGuid, const FGuid& InTagGuid) const
{
if(const FSchematicGraphNode* Node = FindNode(InNodeGuid))
{
if(const FSchematicGraphTag* Tag = Node->FindTag(InTagGuid))
{
return GetVisibilityForTag(Tag);
}
}
return ESchematicGraphVisibility::Visible;
}
ESchematicGraphVisibility::Type FSchematicGraphModel::GetVisibilityForTag(const FSchematicGraphTag* InTag) const
{
check(InTag);
if(InTag->IsA<FSchematicGraphGroupTag>())
{
if(const FSchematicGraphAutoGroupNode* AutoGroupNode = Cast<FSchematicGraphAutoGroupNode>(InTag->GetNode()))
{
if(AutoGroupNode->GetNumChildNodes() < 3 || AutoGroupNode->IsExpanded())
{
return ESchematicGraphVisibility::Hidden;
}
}
}
return InTag->GetVisibility();
}
bool FSchematicGraphModel::IsLinkedTo(const FGuid& InSourceNodeGuid, const FGuid& InTargetNodeGuid) const
{
return FindLink<>(InSourceNodeGuid, InTargetNodeGuid) != nullptr;
}
TArray<const FSchematicGraphLink*> FSchematicGraphModel::FindLinksOnNode(const FGuid& InNodeGuid) const
{
TArray<const FSchematicGraphLink*> Result;
for(const TSharedPtr<FSchematicGraphLink>& Link : Links)
{
if(Link->GetSourceNodeGuid() == InNodeGuid ||
Link->GetTargetNodeGuid() == InNodeGuid)
{
Result.Add(Link.Get());
}
}
return Result;
}
TArray<const FSchematicGraphLink*> FSchematicGraphModel::FindLinksOnSource(const FGuid& InSourceNodeGuid) const
{
TArray<const FSchematicGraphLink*> Result;
for(const TSharedPtr<FSchematicGraphLink>& Link : Links)
{
if(Link->GetSourceNodeGuid() == InSourceNodeGuid)
{
Result.Add(Link.Get());
}
}
return Result;
}
TArray<const FSchematicGraphLink*> FSchematicGraphModel::FindLinksOnTarget(const FGuid& InTargetNodeGuid) const
{
TArray<const FSchematicGraphLink*> Result;
for(const TSharedPtr<FSchematicGraphLink>& Link : Links)
{
if(Link->GetTargetNodeGuid() == InTargetNodeGuid)
{
Result.Add(Link.Get());
}
}
return Result;
}
bool FSchematicGraphModel::RemoveLink(const FGuid& InLinkGuid)
{
if(const FSchematicGraphLink* Link = FindLink(InLinkGuid))
{
if (OnLinkRemovedDelegate.IsBound())
{
OnLinkRemovedDelegate.Broadcast(Link);
}
const FGuid LinkGuid = Link->GetGuid();
const uint32 LinkHash = Link->GetLinkHash();
const FGuid SourceNodeGuid = Link->GetSourceNodeGuid();
const FGuid TargetNodeGuid = Link->GetTargetNodeGuid();
LinkByGuid.Remove(Link->GetGuid());
LinkByHash.Remove(LinkHash);
if(TTuple<TArray<FGuid>,TArray<FGuid>>* Tuple = NodeGuidToLinkGuids.Find(SourceNodeGuid))
{
Tuple->Get<0>().Remove(LinkGuid);
if(Tuple->Get<0>().IsEmpty() && Tuple->Get<1>().IsEmpty())
{
NodeGuidToLinkGuids.Remove(SourceNodeGuid);
}
}
if(TTuple<TArray<FGuid>,TArray<FGuid>>* Tuple = NodeGuidToLinkGuids.Find(TargetNodeGuid))
{
Tuple->Get<1>().Remove(LinkGuid);
if(Tuple->Get<0>().IsEmpty() && Tuple->Get<1>().IsEmpty())
{
NodeGuidToLinkGuids.Remove(TargetNodeGuid);
}
}
Links.RemoveAll([LinkGuid](const TSharedPtr<FSchematicGraphLink>& ExistingLink) -> bool
{
return ExistingLink->GetGuid() == LinkGuid;
});
return true;
}
return false;
}
float FSchematicGraphModel::GetMinimumForLink(const FGuid& InLinkGuid) const
{
if(const FSchematicGraphLink* Link = FindLink(InLinkGuid))
{
return GetMinimumForLink(Link);
}
return 0.f;
}
float FSchematicGraphModel::GetMinimumForLink(const FSchematicGraphLink* InLink) const
{
check(InLink);
return InLink->GetMinimum();
}
float FSchematicGraphModel::GetMaximumForLink(const FGuid& InLinkGuid) const
{
if(const FSchematicGraphLink* Link = FindLink(InLinkGuid))
{
return GetMaximumForLink(Link);
}
return 1.f;
}
float FSchematicGraphModel::GetMaximumForLink(const FSchematicGraphLink* InLink) const
{
check(InLink);
return InLink->GetMaximum();
}
FVector2d FSchematicGraphModel::GetSourceNodeOffsetForLink(const FGuid& InLinkGuid) const
{
if(const FSchematicGraphLink* Link = FindLink(InLinkGuid))
{
return GetSourceNodeOffsetForLink(Link);
}
return FVector2d::ZeroVector;
}
FVector2d FSchematicGraphModel::GetSourceNodeOffsetForLink(const FSchematicGraphLink* InLink) const
{
check(InLink);
return InLink->GetSourceNodeOffset();
}
FVector2d FSchematicGraphModel::GetTargetNodeOffsetForLink(const FGuid& InLinkGuid) const
{
if(const FSchematicGraphLink* Link = FindLink(InLinkGuid))
{
return GetTargetNodeOffsetForLink(Link);
}
return FVector2d::ZeroVector;
}
FVector2d FSchematicGraphModel::GetTargetNodeOffsetForLink(const FSchematicGraphLink* InLink) const
{
check(InLink);
return InLink->GetTargetNodeOffset();
}
FLinearColor FSchematicGraphModel::GetColorForLink(const FGuid& InLinkGuid) const
{
if(const FSchematicGraphLink* Link = FindLink(InLinkGuid))
{
const FLinearColor Color = GetColorForLink(Link);
if(GetVisibilityForLink(Link) == ESchematicGraphVisibility::FadedOut)
{
return Color * 0.5f;
}
return Color;
}
return FLinearColor::White;
}
FLinearColor FSchematicGraphModel::GetColorForLink(const FSchematicGraphLink* InLink) const
{
check(InLink);
return InLink->GetColor();
}
float FSchematicGraphModel::GetThicknessForLink(const FGuid& InLinkGuid) const
{
if(const FSchematicGraphLink* Link = FindLink(InLinkGuid))
{
return GetThicknessForLink(Link);
}
return 1.f;
}
float FSchematicGraphModel::GetThicknessForLink(const FSchematicGraphLink* InLink) const
{
check(InLink);
return InLink->GetThickness();
}
const FSlateBrush* FSchematicGraphModel::GetBrushForLink(const FGuid& InLinkGuid) const
{
if(const FSchematicGraphLink* Link = FindLink(InLinkGuid))
{
return GetBrushForLink(Link);
}
return nullptr;
}
const FSlateBrush* FSchematicGraphModel::GetBrushForLink(const FSchematicGraphLink* InLink) const
{
check(InLink);
return InLink->GetBrush();
}
const FText FSchematicGraphModel::GetToolTipForLink(const FGuid& InLinkGuid) const
{
if(const FSchematicGraphLink* Link = FindLink(InLinkGuid))
{
return GetToolTipForLink(Link);
}
return FText();
}
const FText FSchematicGraphModel::GetToolTipForLink(const FSchematicGraphLink* InLink) const
{
check(InLink);
return InLink->GetToolTip();
}
ESchematicGraphVisibility::Type FSchematicGraphModel::GetVisibilityForLink(const FGuid& InLinkGuid) const
{
if(const FSchematicGraphLink* Link = FindLink(InLinkGuid))
{
return GetVisibilityForLink(Link);
}
return ESchematicGraphVisibility::Visible;
}
ESchematicGraphVisibility::Type FSchematicGraphModel::GetVisibilityForLink(const FSchematicGraphLink* InLink) const
{
check(InLink);
return InLink->GetVisibility();
}
FSchematicGraphGroupNode* FSchematicGraphModel::AddAutoGroupNode()
{
return AddNode<FSchematicGraphAutoGroupNode>();
}
const FSchematicGraphGroupNode* FSchematicGraphModel::GetLastExpandedNode() const
{
if(LastExpandedNode.IsValid())
{
return FindNode<FSchematicGraphGroupNode>(LastExpandedNode);
}
return nullptr;
}
void FSchematicGraphModel::SetLastExpandedNode(const FSchematicGraphGroupNode* InGroupNode)
{
LastExpandedNode = InGroupNode ? InGroupNode->GetGuid() : FGuid();
}
void FSchematicGraphModel::Tick(float InDeltaTime)
{
if(LastExpandedNode.IsValid())
{
if(const FSchematicGraphGroupNode* GroupNode = GetLastExpandedNode())
{
if(!GroupNode->IsExpanded())
{
LastExpandedNode = FGuid();
}
}
else
{
LastExpandedNode = FGuid();
}
}
// remove invalid parent / child relationships
for(const TSharedPtr<FSchematicGraphNode>& Node : Nodes)
{
if(Node->ParentNodeGuid.IsValid())
{
if(!NodeByGuid.Contains(Node->ParentNodeGuid))
{
Node->ParentNodeGuid = FGuid();
}
}
const FGuid Guid = Node->GetGuid();
Node->ChildNodeGuids.RemoveAll([this, Guid](const FGuid& InChildGuid) -> bool
{
if(const FSchematicGraphNode* ChildNode = FindNode(InChildGuid))
{
return ChildNode->ParentNodeGuid != Guid;
}
return true;
});
}
}
#undef LOCTEXT_NAMESPACE
#endif