Did a shitload more work. To what end? Not much.
This commit is contained in:
parent
de9865758a
commit
cfe285b94d
@ -212,7 +212,7 @@ void UComboActionGraphSchema::GetGraphContextActions(FGraphContextMenuBuilder &C
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UComboActionGraphSchema::GetContextMenuActions(UToolMenu* Menu, UGraphNodeContextMenuContext* Context) const
|
void UComboActionGraphSchema::GetContextMenuActions(UToolMenu *Menu, UGraphNodeContextMenuContext *Context) const
|
||||||
{
|
{
|
||||||
if (Context->Pin)
|
if (Context->Pin)
|
||||||
{
|
{
|
||||||
@ -258,7 +258,7 @@ void UComboActionGraphSchema::GetContextMenuActions(UToolMenu* Menu, UGraphNodeC
|
|||||||
Super::GetContextMenuActions(Menu, Context);
|
Super::GetContextMenuActions(Menu, Context);
|
||||||
}
|
}
|
||||||
|
|
||||||
const FPinConnectionResponse UComboActionGraphSchema::CanCreateConnection(const UEdGraphPin* A, const UEdGraphPin* B) const
|
const FPinConnectionResponse UComboActionGraphSchema::CanCreateConnection(const UEdGraphPin *A, const UEdGraphPin *B) const
|
||||||
{
|
{
|
||||||
// Make sure the pins are not on the same node
|
// Make sure the pins are not on the same node
|
||||||
if (A->GetOwningNode() == B->GetOwningNode())
|
if (A->GetOwningNode() == B->GetOwningNode())
|
||||||
@ -321,7 +321,7 @@ const FPinConnectionResponse UComboActionGraphSchema::CanCreateConnection(const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UComboActionGraphSchema::CreateAutomaticConversionNodeAndConnections(UEdGraphPin* A, UEdGraphPin* B) const
|
bool UComboActionGraphSchema::CreateAutomaticConversionNodeAndConnections(UEdGraphPin *A, UEdGraphPin *B) const
|
||||||
{
|
{
|
||||||
UEdComboActionGraphNode *NodeA = Cast<UEdComboActionGraphNode>(A->GetOwningNode());
|
UEdComboActionGraphNode *NodeA = Cast<UEdComboActionGraphNode>(A->GetOwningNode());
|
||||||
UEdComboActionGraphNode *NodeB = Cast<UEdComboActionGraphNode>(B->GetOwningNode());
|
UEdComboActionGraphNode *NodeB = Cast<UEdComboActionGraphNode>(B->GetOwningNode());
|
||||||
@ -369,35 +369,35 @@ FConnectionDrawingPolicy *UComboActionGraphSchema::CreateConnectionDrawingPolicy
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
FLinearColor UComboActionGraphSchema::GetPinTypeColor(const FEdGraphPinType& PinType) const
|
FLinearColor UComboActionGraphSchema::GetPinTypeColor(const FEdGraphPinType &PinType) const
|
||||||
{
|
{
|
||||||
return FColor::White;
|
return FColor::White;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UComboActionGraphSchema::BreakNodeLinks(UEdGraphNode& TargetNode) const
|
void UComboActionGraphSchema::BreakNodeLinks(UEdGraphNode &TargetNode) const
|
||||||
{
|
{
|
||||||
const FScopedTransaction Transaction(NSLOCTEXT("UnrealEd", "GraphEd_BreakNodeLinks", "Break Node Links"));
|
const FScopedTransaction Transaction(NSLOCTEXT("UnrealEd", "GraphEd_BreakNodeLinks", "Break Node Links"));
|
||||||
|
|
||||||
Super::BreakNodeLinks(TargetNode);
|
Super::BreakNodeLinks(TargetNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UComboActionGraphSchema::BreakPinLinks(UEdGraphPin& TargetPin, bool bSendsNodeNotifcation) const
|
void UComboActionGraphSchema::BreakPinLinks(UEdGraphPin &TargetPin, bool bSendsNodeNotifcation) const
|
||||||
{
|
{
|
||||||
const FScopedTransaction Transaction(NSLOCTEXT("UnrealEd", "GraphEd_BreakPinLinks", "Break Pin Links"));
|
const FScopedTransaction Transaction(NSLOCTEXT("UnrealEd", "GraphEd_BreakPinLinks", "Break Pin Links"));
|
||||||
|
|
||||||
Super::BreakPinLinks(TargetPin, bSendsNodeNotifcation);
|
Super::BreakPinLinks(TargetPin, bSendsNodeNotifcation);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UComboActionGraphSchema::BreakSinglePinLink(UEdGraphPin* SourcePin, UEdGraphPin* TargetPin) const
|
void UComboActionGraphSchema::BreakSinglePinLink(UEdGraphPin *SourcePin, UEdGraphPin *TargetPin) const
|
||||||
{
|
{
|
||||||
const FScopedTransaction Transaction(NSLOCTEXT("UnrealEd", "GraphEd_BreakSinglePinLink", "Break Pin Link"));
|
const FScopedTransaction Transaction(NSLOCTEXT("UnrealEd", "GraphEd_BreakSinglePinLink", "Break Pin Link"));
|
||||||
|
|
||||||
Super::BreakSinglePinLink(SourcePin, TargetPin);
|
Super::BreakSinglePinLink(SourcePin, TargetPin);
|
||||||
}
|
}
|
||||||
|
|
||||||
UEdGraphPin *UComboActionGraphSchema::DropPinOnNode(UEdGraphNode* InTargetNode, const FName& InSourcePinName, const FEdGraphPinType& InSourcePinType, EEdGraphPinDirection InSourcePinDirection) const
|
UEdGraphPin *UComboActionGraphSchema::DropPinOnNode(UEdGraphNode *InTargetNode, const FName &InSourcePinName, const FEdGraphPinType &InSourcePinType, EEdGraphPinDirection InSourcePinDirection) const
|
||||||
{
|
{
|
||||||
UEdComboActionGraphNode* EdNode = Cast<UEdComboActionGraphNode>(InTargetNode);
|
UEdComboActionGraphNode *EdNode = Cast<UEdComboActionGraphNode>(InTargetNode);
|
||||||
switch (InSourcePinDirection)
|
switch (InSourcePinDirection)
|
||||||
{
|
{
|
||||||
case EEdGraphPinDirection::EGPD_Input:
|
case EEdGraphPinDirection::EGPD_Input:
|
||||||
@ -409,7 +409,7 @@ UEdGraphPin *UComboActionGraphSchema::DropPinOnNode(UEdGraphNode* InTargetNode,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UComboActionGraphSchema::SupportsDropPinOnNode(UEdGraphNode* InTargetNode, const FEdGraphPinType& InSourcePinType, EEdGraphPinDirection InSourcePinDirection, FText& OutErrorMessage) const
|
bool UComboActionGraphSchema::SupportsDropPinOnNode(UEdGraphNode *InTargetNode, const FEdGraphPinType &InSourcePinType, EEdGraphPinDirection InSourcePinDirection, FText &OutErrorMessage) const
|
||||||
{
|
{
|
||||||
return Cast<UEdComboActionGraphNode>(InTargetNode) != nullptr;
|
return Cast<UEdComboActionGraphNode>(InTargetNode) != nullptr;
|
||||||
}
|
}
|
||||||
@ -429,7 +429,7 @@ void UComboActionGraphSchema::ForceVisualizationCacheClear() const
|
|||||||
CurrentCacheRefreshID++;
|
CurrentCacheRefreshID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UComboActionGraphSchema::CreateDefaultNodesForGraph(UEdGraph& Graph) const
|
void UComboActionGraphSchema::CreateDefaultNodesForGraph(UEdGraph &Graph) const
|
||||||
{
|
{
|
||||||
Super::CreateDefaultNodesForGraph(Graph);
|
Super::CreateDefaultNodesForGraph(Graph);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,12 +7,12 @@
|
|||||||
#include "ToolMenuSection.h"
|
#include "ToolMenuSection.h"
|
||||||
|
|
||||||
#include "AssetTypeActions/AssetTypeActions_DataAsset.h"
|
#include "AssetTypeActions/AssetTypeActions_DataAsset.h"
|
||||||
|
#include "Ed/AssetEditor_ComboActionGraph.h"
|
||||||
#include "Ed/EdComboActionGraphEdge.h"
|
#include "Ed/EdComboActionGraphEdge.h"
|
||||||
#include "Ed/EdComboActionGraphNode.h"
|
#include "Ed/EdComboActionGraphNode.h"
|
||||||
#include "Ed/SEdComboActionGraphEdge.h"
|
#include "Ed/SEdComboActionGraphEdge.h"
|
||||||
#include "Ed/SEdComboActionGraphNode.h"
|
#include "Ed/SEdComboActionGraphNode.h"
|
||||||
#include "Interfaces/IPluginManager.h"
|
#include "Interfaces/IPluginManager.h"
|
||||||
#include "Settings/FComboActionGraphEditorStyle.h"
|
|
||||||
#include "Styling/SlateStyle.h"
|
#include "Styling/SlateStyle.h"
|
||||||
#include "Styling/SlateStyleMacros.h"
|
#include "Styling/SlateStyleMacros.h"
|
||||||
#include "Styling/SlateStyleRegistry.h"
|
#include "Styling/SlateStyleRegistry.h"
|
||||||
@ -66,15 +66,15 @@ public:
|
|||||||
|
|
||||||
virtual void OpenAssetEditor(const TArray<UObject*> &InObjects, TSharedPtr<class IToolkitHost> EditWithinLevelEditor = TSharedPtr<IToolkitHost>()) override
|
virtual void OpenAssetEditor(const TArray<UObject*> &InObjects, TSharedPtr<class IToolkitHost> EditWithinLevelEditor = TSharedPtr<IToolkitHost>()) override
|
||||||
{
|
{
|
||||||
//const EToolkitMode::Type Mode = EditWithinLevelEditor.IsValid() ? EToolkitMode::WorldCentric : EToolkitMode::Standalone;
|
const EToolkitMode::Type Mode = EditWithinLevelEditor.IsValid() ? EToolkitMode::WorldCentric : EToolkitMode::Standalone;
|
||||||
//for (auto ObjIt = InObjects.CreateConstIterator(); ObjIt; ObjIt++)
|
for (auto ObjIt = InObjects.CreateConstIterator(); ObjIt; ObjIt++)
|
||||||
//{
|
{
|
||||||
// if (UComboActionGraph *Graph = Cast<UComboActionGraph>(*ObjIt))
|
if (UComboActionGraph *Graph = Cast<UComboActionGraph>(*ObjIt))
|
||||||
// {
|
{
|
||||||
// TSharedRef<FAssetEditor_ComboActionGraph> NewGraphEditor(new FAssetEditor_ComboActionGraph());
|
TSharedRef<FAssetEditor_ComboActionGraph> NewGraphEditor(new FAssetEditor_ComboActionGraph());
|
||||||
// NewGraphEditor->InitMounteaDialogueGraphAssetEditor(Mode, EditWithinLevelEditor, Graph);
|
NewGraphEditor->InitComboActionGraphAssetEditor(Mode, EditWithinLevelEditor, Graph);
|
||||||
// }
|
}
|
||||||
//}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -185,35 +185,127 @@ UObject *UComboActionGraph_Factory::FactoryCreateNew(UClass *Class, UObject *InP
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class FComboInputSlateStyle final : public FSlateStyleSet
|
FComboInputSlateStyle::FComboInputSlateStyle() : FSlateStyleSet("ComboInputEditor")
|
||||||
{
|
{
|
||||||
public:
|
this->SetParentStyleName(FAppStyle::GetAppStyleSetName());
|
||||||
FComboInputSlateStyle() : FSlateStyleSet("ComboInputEditor")
|
|
||||||
|
const FString &PluginSlateDir = IPluginManager::Get().FindPlugin("ComboInput")->GetBaseDir();
|
||||||
|
|
||||||
|
this->SetContentRoot(PluginSlateDir / TEXT("Resources/Slate"));
|
||||||
|
this->SetCoreContentRoot(FPaths::EngineContentDir() / TEXT("Slate"));
|
||||||
|
|
||||||
|
// Combo Input Editor icons
|
||||||
|
static const FVector2D Icon12(12.0f, 12.0f);
|
||||||
|
static const FVector2D Icon16(16.0f, 16.0f);
|
||||||
|
static const FVector2D Icon40(40.0f, 40.0f);
|
||||||
|
static const FVector2D Icon64(64.0f, 64.0f);
|
||||||
|
|
||||||
|
this->Set("ComboInputIcon_Small", new IMAGE_BRUSH_SVG("Icons/ComboInput_16", Icon16));
|
||||||
|
this->Set("ComboInputIcon_Large", new IMAGE_BRUSH_SVG("Icons/ComboInput_64", Icon64));
|
||||||
|
|
||||||
|
this->Set("ClassIcon.ComboAction", new IMAGE_BRUSH_SVG("Icons/ComboAction_16", Icon16));
|
||||||
|
this->Set("ClassThumbnail.ComboAction", new IMAGE_BRUSH_SVG("Icons/ComboAction_64", Icon64));
|
||||||
|
|
||||||
|
this->Set("ClassIcon.ComboSequenceNode", new IMAGE_BRUSH_SVG("Icons/ComboSequenceNode_16", Icon16));
|
||||||
|
this->Set("ClassThumbnail.ComboSequenceNode", new IMAGE_BRUSH_SVG("Icons/ComboSequenceNode_64", Icon64));
|
||||||
|
|
||||||
|
this->Set("ClassIcon.ComboInputAsset", new IMAGE_BRUSH_SVG("Icons/ComboInputAsset_16", Icon16));
|
||||||
|
this->Set("ClassThumbnail.ComboInputAsset", new IMAGE_BRUSH_SVG("Icons/ComboInputAsset_64", Icon64));
|
||||||
|
|
||||||
|
this->Set("ClassIcon.ComboActionGraph", new IMAGE_BRUSH_SVG("Icons/ComboSequenceNode_16", Icon16));
|
||||||
|
this->Set("ClassThumbnail.ComboActionGraph", new IMAGE_BRUSH_SVG("Icons/ComboSequenceNode_64", Icon64));
|
||||||
|
|
||||||
|
// Combo Action Graph editor brushes
|
||||||
{
|
{
|
||||||
this->SetParentStyleName(FAppStyle::GetAppStyleSetName());
|
this->SetContentRoot(IPluginManager::Get().FindPlugin("ComboInput")->GetBaseDir() / TEXT("Resources"));
|
||||||
|
this->SetCoreContentRoot(IPluginManager::Get().FindPlugin("ComboInput")->GetBaseDir() / TEXT("Content"));
|
||||||
|
|
||||||
const FString &PluginSlateDir = IPluginManager::Get().FindPlugin("ComboInput")->GetBaseDir();
|
this->Set("MDSStyleSet.AutoArrange.small", new IMAGE_BRUSH(TEXT("AutoArrangeIcon"), Icon16));
|
||||||
|
this->Set("MDSStyleSet.AutoArrange", new IMAGE_BRUSH(TEXT("AutoArrangeIcon"), Icon40));
|
||||||
|
this->Set("MDSStyleSet.AutoArrange.large", new IMAGE_BRUSH(TEXT("AutoArrangeIcon"), Icon64));
|
||||||
|
|
||||||
this->SetContentRoot(PluginSlateDir / TEXT("Resources/Slate"));
|
this->Set("MDSStyleSet.GraphSettings.small", new IMAGE_BRUSH(TEXT("GraphSettings"), Icon16));
|
||||||
this->SetCoreContentRoot(FPaths::EngineContentDir() / TEXT("Slate"));
|
this->Set("MDSStyleSet.GraphSettings", new IMAGE_BRUSH(TEXT("GraphSettings"), Icon40));
|
||||||
|
this->Set("MDSStyleSet.GraphSettings.large", new IMAGE_BRUSH(TEXT("GraphSettings"), Icon64));
|
||||||
|
|
||||||
// Combo Input Editor icons
|
this->Set("MDSStyleSet.ValidateGraph.small", new IMAGE_BRUSH(TEXT("ValidateGraph"), Icon16));
|
||||||
static const FVector2D Icon16 = FVector2D(16.0f, 16.0f);
|
this->Set("MDSStyleSet.ValidateGraph", new IMAGE_BRUSH(TEXT("ValidateGraph"), Icon40));
|
||||||
static const FVector2D Icon64 = FVector2D(64.0f, 64.0f);
|
this->Set("MDSStyleSet.ValidateGraph.large", new IMAGE_BRUSH(TEXT("ValidateGraph"), Icon64));
|
||||||
|
|
||||||
this->Set("ComboInputIcon_Small", new IMAGE_BRUSH_SVG("Icons/ComboInput_16", Icon16));
|
this->Set("MDSStyleSet.Graph.NodeOverlay", new BOX_BRUSH(TEXT("NodeOverlay"), FMargin(8.0f / 64.0f, 3.0f / 32.0f, 0, 0)));
|
||||||
this->Set("ComboInputIcon_Large", new IMAGE_BRUSH_SVG("Icons/ComboInput_64", Icon64));
|
this->Set("MDSStyleSet.Graph.PinDocksOverlay", new BOX_BRUSH(TEXT("PinDocksOverlay"), FMargin(8.0f / 64.0f, 3.0f / 32.0f, 0, 0)));
|
||||||
|
|
||||||
this->Set("ClassIcon.ComboAction", new IMAGE_BRUSH_SVG("Icons/ComboAction_16", Icon16));
|
this->Set("MDSStyleSet.Graph.SimpleArrow", new IMAGE_BRUSH(TEXT("SimpleArrow"), Icon16));
|
||||||
this->Set("ClassThumbnail.ComboAction", new IMAGE_BRUSH_SVG("Icons/ComboAction_64", Icon64));
|
this->Set("MDSStyleSet.Graph.HollowArrow", new IMAGE_BRUSH(TEXT("HollowArrow"), Icon16));
|
||||||
|
this->Set("MDSStyleSet.Graph.FancyArrow", new IMAGE_BRUSH(TEXT("FancyArrow"), Icon16));
|
||||||
|
this->Set("MDSStyleSet.Graph.Bubble", new IMAGE_BRUSH(TEXT("Bubble"), Icon16));
|
||||||
|
|
||||||
this->Set("ClassIcon.ComboSequenceNode", new IMAGE_BRUSH_SVG("Icons/ComboSequenceNode_16", Icon16));
|
this->Set("MDSStyleSet.Node.SoftEdges", new BOX_BRUSH(TEXT("NodeSoftCorners"), FMargin(16.f / 64.f, 25.f / 64.f, 16.f / 64.f, 16.f / 64.f)));
|
||||||
this->Set("ClassThumbnail.ComboSequenceNode", new IMAGE_BRUSH_SVG("Icons/ComboSequenceNode_64", Icon64));
|
this->Set("MDSStyleSet.Node.HardEdges", new BOX_BRUSH(TEXT("NodeHardCorners"), FMargin(16.f / 64.f, 25.f / 64.f, 16.f / 64.f, 16.f / 64.f)));
|
||||||
|
|
||||||
this->Set("ClassIcon.ComboInputAsset", new IMAGE_BRUSH_SVG("Icons/ComboInputAsset_16", Icon16));
|
this->Set("MDSStyleSet.Node.TextSoftEdges", new BOX_BRUSH(TEXT("TextSoftCorners"), FMargin(16.f / 64.f, 25.f / 64.f, 16.f / 64.f, 16.f / 64.f)));
|
||||||
this->Set("ClassThumbnail.ComboInputAsset", new IMAGE_BRUSH_SVG("Icons/ComboInputAsset_64", Icon64));
|
this->Set("MDSStyleSet.Node.TextHardEdges", new BOX_BRUSH(TEXT("TextHardCorners"), FMargin(16.f / 64.f, 25.f / 64.f, 16.f / 64.f, 16.f / 64.f)));
|
||||||
|
|
||||||
|
this->Set("MDSStyleSet.Node.IndexCircle", new IMAGE_BRUSH(TEXT("IndexIcon"), Icon16));
|
||||||
|
|
||||||
|
this->Set("MDSStyleSet.Icon.OK", new IMAGE_BRUSH(TEXT("OKIcon"), Icon16));
|
||||||
|
this->Set("MDSStyleSet.Icon.Error", new IMAGE_BRUSH(TEXT("ErroIcon"), Icon16));
|
||||||
|
this->Set("MDSStyleSet.Icon.BulletPoint", new IMAGE_BRUSH(TEXT("CircleBox"), Icon16));
|
||||||
|
|
||||||
|
this->Set("MDSStyleSet.Graph.CornerImage", new IMAGE_BRUSH(TEXT("Icon128"), FVector2D(128.0f, 128.0f)));
|
||||||
|
|
||||||
|
this->Set("MDSStyleSet.Icon.Browse", new IMAGE_BRUSH(TEXT("BrowseIcon"), Icon12));
|
||||||
|
this->Set("MDSStyleSet.Icon.Edit", new IMAGE_BRUSH(TEXT("EditIcon"), Icon12));
|
||||||
|
|
||||||
|
this->Set("MDSStyleSet.Buttons.Documentation", new IMAGE_BRUSH(TEXT("Documentation"), FVector2D(200.0f, 70.0f)));
|
||||||
|
this->Set("MDSStyleSet.Buttons.Documentation.small", new IMAGE_BRUSH(TEXT("DocumentationIcon"), Icon12));
|
||||||
|
|
||||||
|
this->Set("MDSStyleSet.Node.Icon.large", new IMAGE_BRUSH(TEXT("DialogueNodeIcon"), Icon64));
|
||||||
|
this->Set("MDSStyleSet.Node.Icon", new IMAGE_BRUSH(TEXT("DialogueNodeIcon"), Icon16));
|
||||||
|
this->Set("MDSStyleSet.Node.Icon.small", new IMAGE_BRUSH(TEXT("DialogueNodeIcon"), Icon12));
|
||||||
|
|
||||||
|
this->Set("MDSStyleSet.Icon.Close", new IMAGE_BRUSH(TEXT("CloseIcon"), Icon12));
|
||||||
|
this->Set("MDSStyleSet.Icon.SupportDiscord", new IMAGE_BRUSH(TEXT("DiscordIcon"), Icon12));
|
||||||
|
this->Set("MDSStyleSet.Icon.HeartIcon", new IMAGE_BRUSH(TEXT("HeartIcon"), Icon12));
|
||||||
|
this->Set("MDSStyleSet.Icon.UBIcon", new IMAGE_BRUSH(TEXT("UnrealBucketIcon"), Icon12));
|
||||||
|
this->Set("MDSStyleSet.Icon.MoneyIcon", new IMAGE_BRUSH(TEXT("MoneyIcon"), Icon12));
|
||||||
|
|
||||||
|
this->Set("MDSStyleSet.Buttons.Style", FButtonStyle()
|
||||||
|
.SetNormal(BOX_BRUSH("RoundedSelection_16x", 4.0f / 16.0f, FLinearColor(1, 1, 1, 0.1f)))
|
||||||
|
.SetHovered(BOX_BRUSH("RoundedSelection_16x", 4.0f / 16.0f, FLinearColor(1, .55f, 0, 0.2f)))
|
||||||
|
.SetPressed(BOX_BRUSH("RoundedSelection_16x", 4.0f / 16.0f, FLinearColor(1, .55f, 0, 0.4f))));
|
||||||
|
const FScrollBarStyle ScrollBar = GetWidgetStyle<FScrollBarStyle>("ScrollBar");
|
||||||
|
|
||||||
|
FTextBlockStyle NormalText = FTextBlockStyle()
|
||||||
|
.SetFont(DEFAULT_FONT("Regular", FCoreStyle::RegularTextSize))
|
||||||
|
.SetColorAndOpacity(FSlateColor::UseForeground())
|
||||||
|
.SetShadowOffset(FVector2D::ZeroVector)
|
||||||
|
.SetShadowColorAndOpacity(FLinearColor::Black)
|
||||||
|
.SetHighlightColor(FLinearColor(0.02f, 0.3f, 0.0f))
|
||||||
|
.SetHighlightShape(BOX_BRUSH("TextBlockHighlightShape", FMargin(3.f / 8.f)));
|
||||||
|
|
||||||
|
FTextBlockStyle NodeTitle = FTextBlockStyle(NormalText)
|
||||||
|
.SetFont(DEFAULT_FONT("Bold", 14))
|
||||||
|
.SetColorAndOpacity(FLinearColor(230.0f / 255.0f, 230.0f / 255.0f, 230.0f / 255.0f))
|
||||||
|
.SetShadowOffset(FVector2D(2, 2))
|
||||||
|
.SetShadowColorAndOpacity(FLinearColor(0.f, 0.f, 0.f, 0.7f));
|
||||||
|
this->Set("MDSStyleSet.NodeTitle", NodeTitle);
|
||||||
|
|
||||||
|
FEditableTextBoxStyle NodeTitleEditableText = FEditableTextBoxStyle()
|
||||||
|
.SetFont(NormalText.Font)
|
||||||
|
.SetBackgroundImageNormal(BOX_BRUSH("TextBox", FMargin(4.0f / 16.0f)))
|
||||||
|
.SetBackgroundImageHovered(BOX_BRUSH("TextBox_Hovered", FMargin(4.0f / 16.0f)))
|
||||||
|
.SetBackgroundImageFocused(BOX_BRUSH("TextBox_Hovered", FMargin(4.0f / 16.0f)))
|
||||||
|
.SetBackgroundImageReadOnly(BOX_BRUSH("TextBox_ReadOnly", FMargin(4.0f / 16.0f)))
|
||||||
|
.SetScrollBarStyle(ScrollBar);
|
||||||
|
this->Set("MDSStyleSet.NodeTitleEditableText", NodeTitleEditableText);
|
||||||
|
|
||||||
|
this->Set("MDSStyleSet.NodeTitleInlineEditableText", FInlineEditableTextBlockStyle()
|
||||||
|
.SetTextStyle(NodeTitle)
|
||||||
|
.SetEditableTextBoxStyle(NodeTitleEditableText)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
||||||
void FComboInputEditorModule::StartupModule()
|
void FComboInputEditorModule::StartupModule()
|
||||||
@ -231,33 +323,12 @@ void FComboInputEditorModule::StartupModule()
|
|||||||
|
|
||||||
// Combo Action Graph
|
// Combo Action Graph
|
||||||
{
|
{
|
||||||
// Make a new style set for Combo Action Graph
|
|
||||||
this->ComboActionGraphEditorStyleSet = MakeShared<FComboActionGraphEditorStyle>();
|
|
||||||
FSlateStyleRegistry::RegisterSlateStyle(*this->ComboActionGraphEditorStyleSet.Get());
|
|
||||||
|
|
||||||
this->ComboActionGraphPanelNodeFactory = MakeShareable(new FComboActionGraphPanelNodeFactory());
|
this->ComboActionGraphPanelNodeFactory = MakeShareable(new FComboActionGraphPanelNodeFactory());
|
||||||
FEdGraphUtilities::RegisterVisualNodeFactory(this->ComboActionGraphPanelNodeFactory);
|
FEdGraphUtilities::RegisterVisualNodeFactory(this->ComboActionGraphPanelNodeFactory);
|
||||||
|
|
||||||
// Register asset actions
|
// Register asset actions
|
||||||
this->ComboActionGraphAssetActions = MakeShared<FAssetTypeActions_ComboActionGraph>();
|
this->ComboActionGraphAssetActions = MakeShared<FAssetTypeActions_ComboActionGraph>();
|
||||||
this->RegisterAssetTypeActions(AssetTools, this->ComboActionGraphAssetActions.ToSharedRef());
|
this->RegisterAssetTypeActions(AssetTools, this->ComboActionGraphAssetActions.ToSharedRef());
|
||||||
|
|
||||||
// Register thumbnails and icons
|
|
||||||
this->ComboActionGraphStyleSet = MakeShareable(new FSlateStyleSet("ComboActionGraphStyleSet"));
|
|
||||||
const TSharedPtr<IPlugin> PluginPtr = IPluginManager::Get().FindPlugin("ComboInput");
|
|
||||||
if (PluginPtr.IsValid())
|
|
||||||
{
|
|
||||||
const FString ContentDir = PluginPtr->GetBaseDir();
|
|
||||||
this->ComboActionGraphStyleSet->SetContentRoot(ContentDir);
|
|
||||||
FSlateImageBrush *ComboActionGraphStyleSetClassThumb = new FSlateImageBrush(this->ComboActionGraphStyleSet->RootToContentDir(TEXT("Resources/ComboActionGraphIcon_128"), TEXT(".png")), FVector2D(128.0f, 128.0f));
|
|
||||||
FSlateImageBrush *ComboActionGraphStyleSetClassIcon = new FSlateImageBrush(this->ComboActionGraphStyleSet->RootToContentDir(TEXT("Resources/ComboActionGraphIcon_16"), TEXT(".png")), FVector2D(16.0f, 16.0f));
|
|
||||||
if (ComboActionGraphStyleSetClassThumb && ComboActionGraphStyleSetClassIcon)
|
|
||||||
{
|
|
||||||
this->ComboActionGraphStyleSet->Set("ClassThumbnail.ComboActionGraph", ComboActionGraphStyleSetClassThumb);
|
|
||||||
this->ComboActionGraphStyleSet->Set("ClassIcon.ComboActionGraph", ComboActionGraphStyleSetClassIcon);
|
|
||||||
}
|
|
||||||
FSlateStyleRegistry::RegisterSlateStyle(*this->ComboActionGraphStyleSet.Get());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
// Copyright Dominik Pavlicek 2023. All Rights Reserved.
|
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
|
||||||
|
|
||||||
#include "AssetEditor_ComboActionGraph.h"
|
#include "AssetEditor_ComboActionGraph.h"
|
||||||
|
|
||||||
@ -11,19 +11,18 @@
|
|||||||
#include "ComboInputEditor.h"
|
#include "ComboInputEditor.h"
|
||||||
#include "ComboActionGraph.h"
|
#include "ComboActionGraph.h"
|
||||||
#include "Nodes/ComboActionGraphNode.h"
|
#include "Nodes/ComboActionGraphNode.h"
|
||||||
//#include "EditorCommands/FComboActionGraphEditorCommands.h"
|
|
||||||
//#include "AssetEditor/FAssetEditorToolbarComboActionGraph.h"
|
|
||||||
#include "Ed/EdComboActionGraph.h"
|
#include "Ed/EdComboActionGraph.h"
|
||||||
#include "Ed/EdComboActionGraphEdge.h"
|
#include "Ed/EdComboActionGraphEdge.h"
|
||||||
#include "Ed/EdComboActionGraphNode.h"
|
#include "Ed/EdComboActionGraphNode.h"
|
||||||
#include "Settings/FComboActionGraphEditorStyle.h"
|
#include "Ed/FAssetEditorToolbarComboActionGraph.h"
|
||||||
|
#include "Ed/FComboActionGraphEditorCommands.h"
|
||||||
#include "ComboActionGraphSchema.h"
|
#include "ComboActionGraphSchema.h"
|
||||||
//#include "Layout/AssetEditorTabs.h"
|
|
||||||
//#include "Helpers/ComboActionGraphHelpers.h"
|
//#include "Helpers/ComboActionGraphHelpers.h"
|
||||||
//#include "Helpers/ComboActionSystemEditorBFC.h"
|
//#include "Helpers/ComboActionSystemEditorBFC.h"
|
||||||
//#include "Layout/ForceDirectedSolveLayoutStrategy.h"
|
#include "Layout/AssetEditorTabs.h"
|
||||||
//#include "Layout/ComboActionGraphLayoutStrategy.h"
|
#include "Layout/ComboActionGraphLayoutStrategy.h"
|
||||||
//#include "Layout/TreeSolveLayoutStrategy.h"
|
#include "Layout/ComboActionForceDirectedSolveLayoutStrategy.h"
|
||||||
|
#include "Layout/ComboActionTreeSolveLayoutStrategy.h"
|
||||||
//#include "Popups/MDSPopup_GraphValidation.h"
|
//#include "Popups/MDSPopup_GraphValidation.h"
|
||||||
//#include "Search/ComboActionSearchUtils.h"
|
//#include "Search/ComboActionSearchUtils.h"
|
||||||
#include "Settings/ComboActionGraphEditorSettings.h"
|
#include "Settings/ComboActionGraphEditorSettings.h"
|
||||||
@ -36,9 +35,9 @@ DEFINE_LOG_CATEGORY(LogAssetEditorComboActionGraph);
|
|||||||
#pragma region ConstantNames
|
#pragma region ConstantNames
|
||||||
|
|
||||||
const FName ComboActionGraphEditorAppName = FName(TEXT("ComboActionGraphEditorApp"));
|
const FName ComboActionGraphEditorAppName = FName(TEXT("ComboActionGraphEditorApp"));
|
||||||
//const FName FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID(TEXT("ComboActionGraphProperty"));
|
const FName FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID(TEXT("ComboActionGraphProperty"));
|
||||||
//const FName FAssetEditorTabs_ComboActionGraph::ViewportID(TEXT("Viewport"));
|
const FName FAssetEditorTabs_ComboActionGraph::ViewportID(TEXT("Viewport"));
|
||||||
//const FName FAssetEditorTabs_ComboActionGraph::SearchToolbarID(TEXT("Search"));
|
const FName FAssetEditorTabs_ComboActionGraph::SearchToolbarID(TEXT("Search"));
|
||||||
|
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|
||||||
@ -55,11 +54,11 @@ FAssetEditor_ComboActionGraph::~FAssetEditor_ComboActionGraph()
|
|||||||
this->EditingGraph = nullptr;
|
this->EditingGraph = nullptr;
|
||||||
UPackage::PackageSavedWithContextEvent.Remove(this->OnPackageSavedDelegateHandle);
|
UPackage::PackageSavedWithContextEvent.Remove(this->OnPackageSavedDelegateHandle);
|
||||||
|
|
||||||
//FGenericCommands::Unregister();
|
FGenericCommands::Unregister();
|
||||||
//FGraphEditorCommands::Unregister();
|
FGraphEditorCommands::Unregister();
|
||||||
//FComboActionGraphEditorCommands::Unregister();
|
FComboActionGraphEditorCommands::Unregister();
|
||||||
|
|
||||||
//this->ToolbarBuilder.Reset();
|
this->ToolbarBuilder.Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FAssetEditor_ComboActionGraph::OnPackageSaved(const FString& String, UPackage* Package, FObjectPostSaveContext ObjectPostSaveContext)
|
void FAssetEditor_ComboActionGraph::OnPackageSaved(const FString& String, UPackage* Package, FObjectPostSaveContext ObjectPostSaveContext)
|
||||||
@ -72,73 +71,73 @@ void FAssetEditor_ComboActionGraph::InitComboActionGraphAssetEditor(const EToolk
|
|||||||
this->EditingGraph = Graph;
|
this->EditingGraph = Graph;
|
||||||
this->CreateEdGraph();
|
this->CreateEdGraph();
|
||||||
|
|
||||||
//FGenericCommands::Register();
|
FGenericCommands::Register();
|
||||||
//FGraphEditorCommands::Register();
|
FGraphEditorCommands::Register();
|
||||||
//FComboActionGraphEditorCommands::Register();
|
FComboActionGraphEditorCommands::Register();
|
||||||
|
|
||||||
//if (!this->ToolbarBuilder.IsValid())
|
if (!this->ToolbarBuilder.IsValid())
|
||||||
//{
|
{
|
||||||
// this->ToolbarBuilder = MakeShareable(new FAssetEditorToolbarComboActionGraph(SharedThis(this)));
|
this->ToolbarBuilder = MakeShareable(new FAssetEditorToolbarComboActionGraph(SharedThis(this)));
|
||||||
//}
|
}
|
||||||
|
|
||||||
this->BindCommands();
|
this->BindCommands();
|
||||||
|
|
||||||
this->CreateInternalWidgets();
|
this->CreateInternalWidgets();
|
||||||
|
|
||||||
//TSharedPtr<FExtender> ToolbarExtender = MakeShareable(new FExtender);
|
TSharedPtr<FExtender> ToolbarExtender = MakeShareable(new FExtender);
|
||||||
//this->ToolbarBuilder->AddMounteaDialogueGraphToolbar(ToolbarExtender);
|
this->ToolbarBuilder->AddComboActionGraphToolbar(ToolbarExtender);
|
||||||
|
|
||||||
// Layout
|
// Layout
|
||||||
//const TSharedRef<FTabManager::FLayout> StandaloneDefaultLayout = FTabManager::NewLayout("Standalone_MounteaDialogueGraphEditor_LayoutV0.3")
|
const TSharedRef<FTabManager::FLayout> StandaloneDefaultLayout = FTabManager::NewLayout("Standalone_ComboActionGraphEditor_LayoutV0.3")
|
||||||
// ->AddArea
|
->AddArea
|
||||||
// (
|
(
|
||||||
// FTabManager::NewPrimaryArea()->SetOrientation(Orient_Vertical)
|
FTabManager::NewPrimaryArea()->SetOrientation(EOrientation::Orient_Vertical)
|
||||||
// ->Split
|
->Split
|
||||||
// (
|
(
|
||||||
// FTabManager::NewSplitter()->SetOrientation(Orient_Horizontal)->SetSizeCoefficient(0.9f)
|
FTabManager::NewSplitter()->SetOrientation(EOrientation::Orient_Horizontal)->SetSizeCoefficient(0.9f)
|
||||||
// ->Split
|
->Split
|
||||||
// (
|
(
|
||||||
// FTabManager::NewStack()
|
FTabManager::NewStack()
|
||||||
// ->SetSizeCoefficient(3.f)
|
->SetSizeCoefficient(3.f)
|
||||||
// ->AddTab(FAssetEditorTabs_MounteaDialogueGraph::ViewportID, ETabState::OpenedTab)->SetHideTabWell(true)
|
->AddTab(FAssetEditorTabs_ComboActionGraph::ViewportID, ETabState::OpenedTab)->SetHideTabWell(true)
|
||||||
// )
|
)
|
||||||
// ->Split
|
->Split
|
||||||
// (
|
(
|
||||||
// FTabManager::NewSplitter()->SetOrientation(Orient_Vertical)
|
FTabManager::NewSplitter()->SetOrientation(EOrientation::Orient_Vertical)
|
||||||
// ->Split
|
->Split
|
||||||
// (
|
(
|
||||||
// FTabManager::NewSplitter()->SetOrientation(Orient_Vertical)
|
FTabManager::NewSplitter()->SetOrientation(EOrientation::Orient_Vertical)
|
||||||
// ->Split
|
->Split
|
||||||
// (
|
(
|
||||||
// FTabManager::NewStack()
|
FTabManager::NewStack()
|
||||||
// ->SetSizeCoefficient(0.9f)
|
->SetSizeCoefficient(0.9f)
|
||||||
// ->AddTab(FAssetEditorTabs_MounteaDialogueGraph::MounteaDialogueGraphPropertyID, ETabState::OpenedTab)->SetHideTabWell(true)
|
->AddTab(FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID, ETabState::OpenedTab)->SetHideTabWell(true)
|
||||||
// )
|
)
|
||||||
|
|
||||||
// ->Split
|
->Split
|
||||||
// (
|
(
|
||||||
// FTabManager::NewStack()
|
FTabManager::NewStack()
|
||||||
// ->SetSizeCoefficient(0.3f)
|
->SetSizeCoefficient(0.3f)
|
||||||
// ->AddTab(FAssetEditorTabs_MounteaDialogueGraph::SearchToolbarID, ETabState::OpenedTab)
|
->AddTab(FAssetEditorTabs_ComboActionGraph::SearchToolbarID, ETabState::OpenedTab)
|
||||||
// )
|
)
|
||||||
// )
|
)
|
||||||
// )
|
)
|
||||||
// )
|
)
|
||||||
// );
|
);
|
||||||
|
|
||||||
//const bool bCreateDefaultStandaloneMenu = true;
|
const bool bCreateDefaultStandaloneMenu = true;
|
||||||
//const bool bCreateDefaultToolbar = true;
|
const bool bCreateDefaultToolbar = true;
|
||||||
//FAssetEditorToolkit::InitAssetEditor
|
FAssetEditorToolkit::InitAssetEditor
|
||||||
//(
|
(
|
||||||
// Mode,
|
Mode,
|
||||||
// InitToolkitHost,
|
InitToolkitHost,
|
||||||
// ComboActionGraphEditorAppName,
|
ComboActionGraphEditorAppName,
|
||||||
// StandaloneDefaultLayout,
|
StandaloneDefaultLayout,
|
||||||
// bCreateDefaultStandaloneMenu,
|
bCreateDefaultStandaloneMenu,
|
||||||
// bCreateDefaultToolbar,
|
bCreateDefaultToolbar,
|
||||||
// EditingGraph,
|
EditingGraph,
|
||||||
// false
|
false
|
||||||
// );
|
);
|
||||||
|
|
||||||
this->RegenerateMenusAndToolbars();
|
this->RegenerateMenusAndToolbars();
|
||||||
}
|
}
|
||||||
@ -150,20 +149,20 @@ UComboActionGraphEditorSettings *FAssetEditor_ComboActionGraph::GetSettings() co
|
|||||||
|
|
||||||
void FAssetEditor_ComboActionGraph::RegisterTabSpawners(const TSharedRef<FTabManager> &InTabManager)
|
void FAssetEditor_ComboActionGraph::RegisterTabSpawners(const TSharedRef<FTabManager> &InTabManager)
|
||||||
{
|
{
|
||||||
//WorkspaceMenuCategory = InTabManager->AddLocalWorkspaceMenuCategory(LOCTEXT("WorkspaceMenu_MounteaDialogueTreeEditor", "Mountea Dialogue Tree Editor"));
|
this->WorkspaceMenuCategory = InTabManager->AddLocalWorkspaceMenuCategory(LOCTEXT("WorkspaceMenu_ComboActionTreeEditor", "Combo Action Tree Editor"));
|
||||||
//auto WorkspaceMenuCategoryRef = WorkspaceMenuCategory.ToSharedRef();
|
auto WorkspaceMenuCategoryRef = this->WorkspaceMenuCategory.ToSharedRef();
|
||||||
|
|
||||||
//FAssetEditorToolkit::RegisterTabSpawners(InTabManager);
|
FAssetEditorToolkit::RegisterTabSpawners(InTabManager);
|
||||||
|
|
||||||
//InTabManager->RegisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ViewportID, FOnSpawnTab::CreateSP(this, &FAssetEditor_ComboActionGraph::SpawnTab_Viewport))
|
InTabManager->RegisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ViewportID, FOnSpawnTab::CreateSP(this, &FAssetEditor_ComboActionGraph::SpawnTab_Viewport))
|
||||||
// .SetDisplayName(LOCTEXT("GraphCanvasTab", "Viewport"))
|
.SetDisplayName(LOCTEXT("GraphCanvasTab", "Viewport"))
|
||||||
// .SetGroup(WorkspaceMenuCategoryRef)
|
.SetGroup(WorkspaceMenuCategoryRef)
|
||||||
// .SetIcon(FSlateIcon(FAppStyle::GetAppStyleSetName(), "GraphEditor.EventGraph_16x"));
|
.SetIcon(FSlateIcon(FAppStyle::GetAppStyleSetName(), "GraphEditor.EventGraph_16x"));
|
||||||
|
|
||||||
//InTabManager->RegisterTabSpawner(FAssetEditorTabs_ComboActionGraph::MounteaDialogueGraphPropertyID, FOnSpawnTab::CreateSP(this, &FAssetEditor_ComboActionGraph::SpawnTab_Details))
|
InTabManager->RegisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID, FOnSpawnTab::CreateSP(this, &FAssetEditor_ComboActionGraph::SpawnTab_Details))
|
||||||
// .SetDisplayName(LOCTEXT("DetailsTab", "Property"))
|
.SetDisplayName(LOCTEXT("DetailsTab", "Property"))
|
||||||
// .SetGroup(WorkspaceMenuCategoryRef)
|
.SetGroup(WorkspaceMenuCategoryRef)
|
||||||
// .SetIcon(FSlateIcon(FAppStyle::GetAppStyleSetName(), "LevelEditor.Tabs.Details"));
|
.SetIcon(FSlateIcon(FAppStyle::GetAppStyleSetName(), "LevelEditor.Tabs.Details"));
|
||||||
|
|
||||||
//InTabManager->RegisterTabSpawner(FAssetEditorTabs_ComboActionGraph::SearchToolbarID, FOnSpawnTab::CreateSP(this, &FAssetEditor_ComboActionGraph::SpawnTab_Search))
|
//InTabManager->RegisterTabSpawner(FAssetEditorTabs_ComboActionGraph::SearchToolbarID, FOnSpawnTab::CreateSP(this, &FAssetEditor_ComboActionGraph::SpawnTab_Search))
|
||||||
// .SetDisplayName(LOCTEXT("SearchTab", "Search"))
|
// .SetDisplayName(LOCTEXT("SearchTab", "Search"))
|
||||||
@ -173,16 +172,16 @@ void FAssetEditor_ComboActionGraph::RegisterTabSpawners(const TSharedRef<FTabMan
|
|||||||
|
|
||||||
void FAssetEditor_ComboActionGraph::UnregisterTabSpawners(const TSharedRef<FTabManager>& InTabManager)
|
void FAssetEditor_ComboActionGraph::UnregisterTabSpawners(const TSharedRef<FTabManager>& InTabManager)
|
||||||
{
|
{
|
||||||
//FAssetEditorToolkit::UnregisterTabSpawners(InTabManager);
|
FAssetEditorToolkit::UnregisterTabSpawners(InTabManager);
|
||||||
|
|
||||||
//InTabManager->UnregisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ViewportID);
|
InTabManager->UnregisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ViewportID);
|
||||||
//InTabManager->UnregisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID);
|
InTabManager->UnregisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID);
|
||||||
//InTabManager->UnregisterTabSpawner(FAssetEditorTabs_ComboActionGraph::SearchToolbarID);
|
InTabManager->UnregisterTabSpawner(FAssetEditorTabs_ComboActionGraph::SearchToolbarID);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FAssetEditor_ComboActionGraph::CloseWindow()
|
bool FAssetEditor_ComboActionGraph::CloseWindow(EAssetEditorCloseReason InCloseReason)
|
||||||
{
|
{
|
||||||
const bool bSatisfied = FAssetEditorToolkit::CloseWindow();
|
const bool bSatisfied = FAssetEditorToolkit::CloseWindow(InCloseReason);
|
||||||
|
|
||||||
if (this->EditingGraph)
|
if (this->EditingGraph)
|
||||||
{
|
{
|
||||||
@ -305,7 +304,7 @@ TSharedRef<SGraphEditor> FAssetEditor_ComboActionGraph::CreateViewportWidget()
|
|||||||
const FComboInputEditorModule &Module = FModuleManager::GetModuleChecked<FComboInputEditorModule>("ComboInputEditor");
|
const FComboInputEditorModule &Module = FModuleManager::GetModuleChecked<FComboInputEditorModule>("ComboInputEditor");
|
||||||
FGraphAppearanceInfo AppearanceInfo;
|
FGraphAppearanceInfo AppearanceInfo;
|
||||||
AppearanceInfo.CornerText = LOCTEXT("AppearanceCornerText_ComboActionGraph", "Combo Action Tree");
|
AppearanceInfo.CornerText = LOCTEXT("AppearanceCornerText_ComboActionGraph", "Combo Action Tree");
|
||||||
AppearanceInfo.CornerImage = Module.Get().ComboActionGraphEditorStyleSet->GetBrush(TEXT("MDSStyleSet.Graph.CornerImage"));
|
AppearanceInfo.CornerImage = Module.Get().GetComboInputEditorStyleSet()->GetBrush(TEXT("MDSStyleSet.Graph.CornerImage"));
|
||||||
AppearanceInfo.InstructionText = LOCTEXT("InstructionText_ComboActionGraph", "Place action nodes by right clicking.");
|
AppearanceInfo.InstructionText = LOCTEXT("InstructionText_ComboActionGraph", "Place action nodes by right clicking.");
|
||||||
|
|
||||||
this->CreateCommandList();
|
this->CreateCommandList();
|
||||||
@ -326,25 +325,19 @@ TSharedRef<SGraphEditor> FAssetEditor_ComboActionGraph::CreateViewportWidget()
|
|||||||
|
|
||||||
void FAssetEditor_ComboActionGraph::BindCommands()
|
void FAssetEditor_ComboActionGraph::BindCommands()
|
||||||
{
|
{
|
||||||
//this->ToolkitCommands->MapAction
|
this->ToolkitCommands->MapAction
|
||||||
//(
|
(
|
||||||
// FComboActionGraphEditorCommands::Get().AutoArrange,
|
FComboActionGraphEditorCommands::Get().AutoArrange,
|
||||||
// FExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::AutoArrange),
|
FExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::AutoArrange),
|
||||||
// FCanExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::CanAutoArrange)
|
FCanExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::CanAutoArrange)
|
||||||
//);
|
);
|
||||||
|
|
||||||
//this->ToolkitCommands->MapAction
|
this->ToolkitCommands->MapAction
|
||||||
//(
|
(
|
||||||
// FComboActionGraphEditorCommands::Get().ValidateGraph,
|
FComboActionGraphEditorCommands::Get().ValidateGraph,
|
||||||
// FExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::ValidateGraph),
|
FExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::ValidateGraph),
|
||||||
// FCanExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::CanValidateGraph)
|
FCanExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::CanValidateGraph)
|
||||||
//);
|
);
|
||||||
//
|
|
||||||
//this->ToolkitCommands->MapAction
|
|
||||||
//(
|
|
||||||
// FComboActionGraphEditorCommands::Get().FindInDialogue,
|
|
||||||
// FExecuteAction::CreateLambda([this] { this->SummonSearchUI(); })
|
|
||||||
//);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FAssetEditor_ComboActionGraph::CreateEdGraph()
|
void FAssetEditor_ComboActionGraph::CreateEdGraph()
|
||||||
@ -392,13 +385,13 @@ void FAssetEditor_ComboActionGraph::CreateCommandList()
|
|||||||
|
|
||||||
this->GraphEditorCommands = MakeShareable(new FUICommandList);
|
this->GraphEditorCommands = MakeShareable(new FUICommandList);
|
||||||
|
|
||||||
//this->GraphEditorCommands->MapAction(FComboActionGraphEditorCommands::Get().AutoArrange,
|
this->GraphEditorCommands->MapAction(FComboActionGraphEditorCommands::Get().AutoArrange,
|
||||||
// FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::AutoArrange),
|
FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::AutoArrange),
|
||||||
// FCanExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CanAutoArrange));
|
FCanExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CanAutoArrange));
|
||||||
|
|
||||||
//this->GraphEditorCommands->MapAction(FComboActionGraphEditorCommands::Get().ValidateGraph,
|
this->GraphEditorCommands->MapAction(FComboActionGraphEditorCommands::Get().ValidateGraph,
|
||||||
// FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::ValidateGraph),
|
FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::ValidateGraph),
|
||||||
// FCanExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CanValidateGraph));
|
FCanExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CanValidateGraph));
|
||||||
|
|
||||||
this->GraphEditorCommands->MapAction(FGenericCommands::Get().SelectAll,
|
this->GraphEditorCommands->MapAction(FGenericCommands::Get().SelectAll,
|
||||||
FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::SelectAllNodes),
|
FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::SelectAllNodes),
|
||||||
@ -434,12 +427,6 @@ void FAssetEditor_ComboActionGraph::CreateCommandList()
|
|||||||
FExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::OnRenameNode),
|
FExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::OnRenameNode),
|
||||||
FCanExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::CanRenameNodes)
|
FCanExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::CanRenameNodes)
|
||||||
);
|
);
|
||||||
|
|
||||||
//this->ToolkitCommands->MapAction
|
|
||||||
//(
|
|
||||||
// FComboActionGraphEditorCommands::Get().FindInDialogue,
|
|
||||||
// FExecuteAction::CreateLambda([this] { SummonSearchUI(); })
|
|
||||||
//);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TSharedPtr<SGraphEditor> FAssetEditor_ComboActionGraph::GetCurrentGraphEditor() const
|
TSharedPtr<SGraphEditor> FAssetEditor_ComboActionGraph::GetCurrentGraphEditor() const
|
||||||
@ -473,20 +460,6 @@ void FAssetEditor_ComboActionGraph::RebuildComboActionGraph()
|
|||||||
EdGraph->RebuildComboActionGraph();
|
EdGraph->RebuildComboActionGraph();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FAssetEditor_ComboActionGraph::SummonSearchUI(FString NewSearch, bool bSelectFirstResult)
|
|
||||||
{
|
|
||||||
//TSharedPtr<SMounteaDialogueSearch> FindResultsToUse;
|
|
||||||
//FindResultsToUse = FindResultsView;
|
|
||||||
//FMounteaDialogueSearchHelpers::InvokeTab(TabManager, FAssetEditorTabs_MounteaDialogueGraph::SearchToolbarID);
|
|
||||||
|
|
||||||
//if (FindResultsToUse.IsValid())
|
|
||||||
//{
|
|
||||||
// FMounteaDialogueSearchFilter Filter;
|
|
||||||
// Filter.SearchString = NewSearch;
|
|
||||||
// FindResultsToUse->FocusForUse(Filter, bSelectFirstResult);
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FAssetEditor_ComboActionGraph::SelectAllNodes()
|
void FAssetEditor_ComboActionGraph::SelectAllNodes()
|
||||||
{
|
{
|
||||||
TSharedPtr<SGraphEditor> CurrentGraphEditor = this->GetCurrentGraphEditor();
|
TSharedPtr<SGraphEditor> CurrentGraphEditor = this->GetCurrentGraphEditor();
|
||||||
@ -625,7 +598,7 @@ void FAssetEditor_ComboActionGraph::CopySelectedNodes()
|
|||||||
|
|
||||||
for (FGraphPanelSelectionSet::TIterator SelectedIter(SelectedNodes); SelectedIter; ++SelectedIter)
|
for (FGraphPanelSelectionSet::TIterator SelectedIter(SelectedNodes); SelectedIter; ++SelectedIter)
|
||||||
{
|
{
|
||||||
UEdGraphNode* Node = Cast<UEdGraphNode>(*SelectedIter);
|
UEdGraphNode *Node = Cast<UEdGraphNode>(*SelectedIter);
|
||||||
if (Node == nullptr)
|
if (Node == nullptr)
|
||||||
{
|
{
|
||||||
SelectedIter.RemoveCurrent();
|
SelectedIter.RemoveCurrent();
|
||||||
@ -685,7 +658,7 @@ void FAssetEditor_ComboActionGraph::PasteNodesHere(const FVector2D& Location)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Select the newly pasted stuff
|
// Select the newly pasted stuff
|
||||||
UEdGraph* EdGraph = CurrentGraphEditor->GetCurrentGraph();
|
UEdGraph *EdGraph = CurrentGraphEditor->GetCurrentGraph();
|
||||||
|
|
||||||
{
|
{
|
||||||
const FScopedTransaction Transaction(FGenericCommands::Get().Paste->GetDescription());
|
const FScopedTransaction Transaction(FGenericCommands::Get().Paste->GetDescription());
|
||||||
@ -748,7 +721,7 @@ void FAssetEditor_ComboActionGraph::PasteNodesHere(const FVector2D& Location)
|
|||||||
// Update UI
|
// Update UI
|
||||||
CurrentGraphEditor->NotifyGraphChanged();
|
CurrentGraphEditor->NotifyGraphChanged();
|
||||||
|
|
||||||
UObject* GraphOwner = EdGraph->GetOuter();
|
UObject *GraphOwner = EdGraph->GetOuter();
|
||||||
if (GraphOwner)
|
if (GraphOwner)
|
||||||
{
|
{
|
||||||
GraphOwner->PostEditChange();
|
GraphOwner->PostEditChange();
|
||||||
@ -802,28 +775,28 @@ void FAssetEditor_ComboActionGraph::AutoArrange()
|
|||||||
|
|
||||||
EdGraph->Modify(true);
|
EdGraph->Modify(true);
|
||||||
|
|
||||||
//UComboActionGraphLayoutStrategy *LayoutStrategy = nullptr;
|
UComboActionGraphLayoutStrategy *LayoutStrategy = nullptr;
|
||||||
//switch (this->ComboActionGraphEditorSettings->GetAutoLayoutStrategy())
|
switch (this->ComboActionGraphEditorSettings->GetAutoLayoutStrategy())
|
||||||
//{
|
{
|
||||||
// case EComboActionAutoLayoutStrategyType::Tree:
|
case EComboActionAutoLayoutStrategyType::Tree:
|
||||||
// LayoutStrategy = NewObject<UComboActionGraphLayoutStrategy>(EdGraph, UTreeSolveLayoutStrategy::StaticClass());
|
LayoutStrategy = NewObject<UComboActionGraphLayoutStrategy>(EdGraph, UComboActionTreeSolveLayoutStrategy::StaticClass());
|
||||||
// break;
|
break;
|
||||||
// case EComboActionAutoLayoutStrategyType::ForceDirected:
|
case EComboActionAutoLayoutStrategyType::ForceDirected:
|
||||||
// LayoutStrategy = NewObject<UComboActionGraphLayoutStrategy>(EdGraph, UForceDirectedSolveLayoutStrategy::StaticClass());
|
LayoutStrategy = NewObject<UComboActionGraphLayoutStrategy>(EdGraph, UComboActionForceDirectedSolveLayoutStrategy::StaticClass());
|
||||||
// break;
|
break;
|
||||||
// default:
|
default:
|
||||||
// break;
|
break;
|
||||||
//}
|
}
|
||||||
|
|
||||||
//if (LayoutStrategy != nullptr)
|
if (LayoutStrategy != nullptr)
|
||||||
//{
|
{
|
||||||
// LayoutStrategy->Layout(EdGraph);
|
LayoutStrategy->Layout(EdGraph);
|
||||||
// LayoutStrategy->ConditionalBeginDestroy();
|
LayoutStrategy->ConditionalBeginDestroy();
|
||||||
//}
|
}
|
||||||
//else
|
else
|
||||||
//{
|
{
|
||||||
// LOG_ERROR(TEXT("[AutoArrange] LayoutStrategy is null."));
|
UE_LOG(LogAssetEditorComboActionGraph, Error, TEXT("[AutoArrange] LayoutStrategy is null."));
|
||||||
//}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FAssetEditor_ComboActionGraph::CanAutoArrange() const
|
bool FAssetEditor_ComboActionGraph::CanAutoArrange() const
|
||||||
@ -931,7 +904,7 @@ void FAssetEditor_ComboActionGraph::OnFinishedChangingProperties(const FProperty
|
|||||||
|
|
||||||
TSharedRef<SDockTab> FAssetEditor_ComboActionGraph::SpawnTab_Viewport(const FSpawnTabArgs &Args)
|
TSharedRef<SDockTab> FAssetEditor_ComboActionGraph::SpawnTab_Viewport(const FSpawnTabArgs &Args)
|
||||||
{
|
{
|
||||||
//check(Args.GetTabId() == FAssetEditorTabs_ComboActionGraph::ViewportID);
|
check(Args.GetTabId() == FAssetEditorTabs_ComboActionGraph::ViewportID);
|
||||||
|
|
||||||
TSharedRef<SDockTab> SpawnedTab = SNew(SDockTab)
|
TSharedRef<SDockTab> SpawnedTab = SNew(SDockTab)
|
||||||
.Label(LOCTEXT("ViewportTab_Title", "Viewport"));
|
.Label(LOCTEXT("ViewportTab_Title", "Viewport"));
|
||||||
@ -946,7 +919,7 @@ TSharedRef<SDockTab> FAssetEditor_ComboActionGraph::SpawnTab_Viewport(const FSpa
|
|||||||
|
|
||||||
TSharedRef<SDockTab> FAssetEditor_ComboActionGraph::SpawnTab_Details(const FSpawnTabArgs& Args)
|
TSharedRef<SDockTab> FAssetEditor_ComboActionGraph::SpawnTab_Details(const FSpawnTabArgs& Args)
|
||||||
{
|
{
|
||||||
//check(Args.GetTabId() == FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID);
|
check(Args.GetTabId() == FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID);
|
||||||
|
|
||||||
auto DockTab = SNew(SDockTab)
|
auto DockTab = SNew(SDockTab)
|
||||||
.Label(LOCTEXT("Details_Title", "Property"))
|
.Label(LOCTEXT("Details_Title", "Property"))
|
||||||
@ -958,21 +931,5 @@ TSharedRef<SDockTab> FAssetEditor_ComboActionGraph::SpawnTab_Details(const FSpaw
|
|||||||
return DockTab;
|
return DockTab;
|
||||||
}
|
}
|
||||||
|
|
||||||
TSharedRef<SDockTab> FAssetEditor_ComboActionGraph::SpawnTab_Search(const FSpawnTabArgs& Args)
|
|
||||||
{
|
|
||||||
//check(Args.GetTabId() == FAssetEditorTabs_MounteaDialogueGraph::SearchToolbarID);
|
|
||||||
|
|
||||||
//auto DockTab = SNew(SDockTab)
|
|
||||||
// .Label(LOCTEXT("Search_Title", "Search"))
|
|
||||||
// [
|
|
||||||
// this->FindResultsView.ToSharedRef()
|
|
||||||
// ];
|
|
||||||
|
|
||||||
//DockTab->SetTabIcon(FAppStyle::GetBrush("Kismet.Tabs.FindResults"));
|
|
||||||
//return DockTab;
|
|
||||||
|
|
||||||
return SNew(SDockTab);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef LOCTEXT_NAMESPACE
|
#undef LOCTEXT_NAMESPACE
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,10 @@
|
|||||||
// Copyright Dominik Pavlicek 2023. All Rights Reserved.
|
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
//#include "Search/SComboActionSearch.h"
|
#include "CoreMinimal.h"
|
||||||
|
|
||||||
|
#include "Toolkits/AssetEditorToolkit.h"
|
||||||
|
|
||||||
DECLARE_LOG_CATEGORY_EXTERN(LogAssetEditorComboActionGraph, Log, All);
|
DECLARE_LOG_CATEGORY_EXTERN(LogAssetEditorComboActionGraph, Log, All);
|
||||||
|
|
||||||
@ -26,7 +28,7 @@ public:
|
|||||||
virtual void RegisterTabSpawners(const TSharedRef<FTabManager> &InTabManager) override;
|
virtual void RegisterTabSpawners(const TSharedRef<FTabManager> &InTabManager) override;
|
||||||
virtual void UnregisterTabSpawners(const TSharedRef<FTabManager> &InTabManager) override;
|
virtual void UnregisterTabSpawners(const TSharedRef<FTabManager> &InTabManager) override;
|
||||||
|
|
||||||
virtual bool CloseWindow() override;
|
virtual bool CloseWindow(EAssetEditorCloseReason InCloseReason) override;
|
||||||
// End of IToolkit interface
|
// End of IToolkit interface
|
||||||
|
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
@ -47,7 +49,7 @@ public:
|
|||||||
#pragma region Toolbar
|
#pragma region Toolbar
|
||||||
|
|
||||||
void UpdateToolbar();
|
void UpdateToolbar();
|
||||||
//TSharedPtr<FAssetEditorToolbarComboActionGraph> GetToolbarBuilder() { return ToolbarBuilder; }
|
TSharedPtr<class FAssetEditorToolbarComboActionGraph> GetToolbarBuilder() { return this->ToolbarBuilder; }
|
||||||
void RegisterToolbarTab(const TSharedRef<class FTabManager> &InTabManager);
|
void RegisterToolbarTab(const TSharedRef<class FTabManager> &InTabManager);
|
||||||
|
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
@ -94,8 +96,6 @@ private:
|
|||||||
|
|
||||||
void RebuildComboActionGraph();
|
void RebuildComboActionGraph();
|
||||||
|
|
||||||
void SummonSearchUI(FString NewSearch = FString(), bool bSelectFirstResult = false);
|
|
||||||
|
|
||||||
#pragma region GraphEditorCommands
|
#pragma region GraphEditorCommands
|
||||||
|
|
||||||
void SelectAllNodes();
|
void SelectAllNodes();
|
||||||
@ -132,7 +132,7 @@ private:
|
|||||||
|
|
||||||
void OnFinishedChangingProperties(const FPropertyChangedEvent &PropertyChangedEvent);
|
void OnFinishedChangingProperties(const FPropertyChangedEvent &PropertyChangedEvent);
|
||||||
|
|
||||||
//void OnPackageSaved(const FString &PackageFileName, UObject *Outer);
|
void OnPackageSaved(const FString &PackageFileName, UObject *Outer);
|
||||||
|
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|
||||||
@ -142,21 +142,20 @@ private:
|
|||||||
|
|
||||||
TSharedRef<SDockTab> SpawnTab_Viewport(const FSpawnTabArgs &Args);
|
TSharedRef<SDockTab> SpawnTab_Viewport(const FSpawnTabArgs &Args);
|
||||||
TSharedRef<SDockTab> SpawnTab_Details(const FSpawnTabArgs &Args);
|
TSharedRef<SDockTab> SpawnTab_Details(const FSpawnTabArgs &Args);
|
||||||
TSharedRef<SDockTab> SpawnTab_Search(const FSpawnTabArgs &Args);
|
|
||||||
|
|
||||||
class UComboActionGraphEditorSettings *ComboActionGraphEditorSettings;
|
class UComboActionGraphEditorSettings *ComboActionGraphEditorSettings;
|
||||||
|
|
||||||
class UComboActionGraph *EditingGraph;
|
class UComboActionGraph *EditingGraph;
|
||||||
|
|
||||||
//Toolbar
|
//Toolbar
|
||||||
//TSharedPtr<FAssetEditorToolbarComboActionGraph> ToolbarBuilder;
|
TSharedPtr<FAssetEditorToolbarComboActionGraph> ToolbarBuilder;
|
||||||
|
|
||||||
/** Handle to the registered OnPackageSave delegate */
|
/** Handle to the registered OnPackageSave delegate */
|
||||||
FDelegateHandle OnPackageSavedDelegateHandle;
|
FDelegateHandle OnPackageSavedDelegateHandle;
|
||||||
|
|
||||||
TSharedPtr<SGraphEditor> ViewportWidget;
|
TSharedPtr<SGraphEditor> ViewportWidget;
|
||||||
TSharedPtr<class IDetailsView> PropertyWidget;
|
TSharedPtr<class IDetailsView> PropertyWidget;
|
||||||
//TSharedPtr<SComboActionSearch> FindResultsView;
|
//TSharedPtr<class SComboActionSearch> FindResultsView;
|
||||||
|
|
||||||
/** The command list for this editor */
|
/** The command list for this editor */
|
||||||
TSharedPtr<FUICommandList> GraphEditorCommands;
|
TSharedPtr<FUICommandList> GraphEditorCommands;
|
||||||
|
|||||||
@ -6,7 +6,6 @@
|
|||||||
#include "Helpers/ComboActionEditorBFC.h"
|
#include "Helpers/ComboActionEditorBFC.h"
|
||||||
#include "Nodes/ComboActionGraphNode.h"
|
#include "Nodes/ComboActionGraphNode.h"
|
||||||
#include "Settings/ComboActionGraphEditorSettings.h"
|
#include "Settings/ComboActionGraphEditorSettings.h"
|
||||||
#include "Settings/FComboActionGraphEditorStyle.h"
|
|
||||||
|
|
||||||
#define LOCTEXT_NAMESPACE "UEdComboActionGraphNode"
|
#define LOCTEXT_NAMESPACE "UEdComboActionGraphNode"
|
||||||
|
|
||||||
@ -164,7 +163,7 @@ FText UEdComboActionGraphNode::GetTooltipText() const
|
|||||||
|
|
||||||
FSlateIcon UEdComboActionGraphNode::GetIconAndTint(FLinearColor& OutColor) const
|
FSlateIcon UEdComboActionGraphNode::GetIconAndTint(FLinearColor& OutColor) const
|
||||||
{
|
{
|
||||||
static const FSlateIcon Icon = FSlateIcon(FComboActionGraphEditorStyle::GetAppStyleSetName(), "MDSStyleSet.Node.Icon.small");
|
static const FSlateIcon Icon = FSlateIcon(FComboInputSlateStyle::GetAppStyleSetName(), "MDSStyleSet.Node.Icon.small");
|
||||||
OutColor = this->ComboActionGraphNode->GetBackgroundColor();
|
OutColor = this->ComboActionGraphNode->GetBackgroundColor();
|
||||||
return Icon;
|
return Icon;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,44 @@
|
|||||||
|
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "FAssetEditorToolbarComboActionGraph.h"
|
||||||
|
|
||||||
|
#include "ComboInputEditor.h"
|
||||||
|
#include "Ed/AssetEditor_ComboActionGraph.h"
|
||||||
|
#include "Ed/FComboActionGraphEditorCommands.h"
|
||||||
|
|
||||||
|
#define LOCTEXT_NAMESPACE "AssetEditorToolbarComboActionGraph"
|
||||||
|
|
||||||
|
|
||||||
|
void FAssetEditorToolbarComboActionGraph::AddComboActionGraphToolbar(TSharedPtr<FExtender> Extender)
|
||||||
|
{
|
||||||
|
check(this->ComboActionGraphEditor.IsValid());
|
||||||
|
TSharedPtr<FAssetEditor_ComboActionGraph> ComboActionGraphEditorPtr = this->ComboActionGraphEditor.Pin();
|
||||||
|
|
||||||
|
TSharedPtr<FExtender> ToolbarExtender = MakeShareable(new FExtender);
|
||||||
|
ToolbarExtender->AddToolBarExtension("Asset", EExtensionHook::After, ComboActionGraphEditorPtr->GetToolkitCommands(), FToolBarExtensionDelegate::CreateSP( this, &FAssetEditorToolbarComboActionGraph::FillComboActionGraphToolbar ));
|
||||||
|
ComboActionGraphEditorPtr->AddToolbarExtender(ToolbarExtender);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FAssetEditorToolbarComboActionGraph::FillComboActionGraphToolbar(FToolBarBuilder &ToolbarBuilder)
|
||||||
|
{
|
||||||
|
check(this->ComboActionGraphEditor.IsValid());
|
||||||
|
TSharedPtr<FAssetEditor_ComboActionGraph> MounteaDialogueGraphEditorPtr = this->ComboActionGraphEditor.Pin();
|
||||||
|
|
||||||
|
ToolbarBuilder.BeginSection("Util");
|
||||||
|
{
|
||||||
|
ToolbarBuilder.AddToolBarButton(FComboActionGraphEditorCommands::Get().AutoArrange,
|
||||||
|
NAME_None,
|
||||||
|
LOCTEXT("AutoArrange_Label", "Auto Arrange"),
|
||||||
|
LOCTEXT("AutoArrange_ToolTip", "ALPHA version!\n\nTries its best to arrange Graph Nodes. Don't judge too harshly please."),
|
||||||
|
FSlateIcon(FComboInputSlateStyle::GetAppStyleSetName(), "MDSStyleSet.AutoArrange"));
|
||||||
|
|
||||||
|
ToolbarBuilder.AddToolBarButton(FComboActionGraphEditorCommands::Get().ValidateGraph,
|
||||||
|
NAME_None,
|
||||||
|
LOCTEXT("ValidateGraph_Label", "Validate Graph"),
|
||||||
|
LOCTEXT("ValidateGraph_ToolTip", "Validates Graph if there are any invalid connections or broken data."),
|
||||||
|
FSlateIcon(FComboInputSlateStyle::GetAppStyleSetName(), "MDSStyleSet.ValidateGraph"));
|
||||||
|
}
|
||||||
|
ToolbarBuilder.EndSection();
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef LOCTEXT_NAMESPACE
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
|
||||||
|
|
||||||
|
class FAssetEditorToolbarComboActionGraph : public TSharedFromThis<FAssetEditorToolbarComboActionGraph>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FAssetEditorToolbarComboActionGraph(TSharedPtr<FAssetEditor_ComboActionGraph> InComboActionGraphEditor)
|
||||||
|
: ComboActionGraphEditor(InComboActionGraphEditor) {}
|
||||||
|
|
||||||
|
void AddComboActionGraphToolbar(TSharedPtr<FExtender> Extender);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void FillComboActionGraphToolbar(FToolBarBuilder &ToolbarBuilder);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
TWeakPtr<FAssetEditor_ComboActionGraph> ComboActionGraphEditor;
|
||||||
|
|
||||||
|
};
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "FComboActionGraphEditorCommands.h"
|
||||||
|
|
||||||
|
#define LOCTEXT_NAMESPACE "ComboActionGraphEditorCommands"
|
||||||
|
|
||||||
|
|
||||||
|
void FComboActionGraphEditorCommands::RegisterCommands()
|
||||||
|
{
|
||||||
|
UI_COMMAND
|
||||||
|
(
|
||||||
|
AutoArrange,
|
||||||
|
"Auto Arrange",
|
||||||
|
"Auto Arrange",
|
||||||
|
EUserInterfaceActionType::Button,
|
||||||
|
FInputChord()
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
UI_COMMAND
|
||||||
|
(
|
||||||
|
ValidateGraph,
|
||||||
|
"Validate Graph",
|
||||||
|
"Validate Graph",
|
||||||
|
EUserInterfaceActionType::Button,
|
||||||
|
FInputChord()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef LOCTEXT_NAMESPACE
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
|
||||||
|
class FComboActionGraphEditorCommands : public TCommands<FComboActionGraphEditorCommands>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FComboActionGraphEditorCommands()
|
||||||
|
: TCommands<FComboActionGraphEditorCommands>("ComboActionGraphEditor", NSLOCTEXT("Contexts", "ComboActionGraphEditor", "Combo Action Graph Editor"), NAME_None, FAppStyle::GetAppStyleSetName())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
TSharedPtr<FUICommandInfo> AutoArrange;
|
||||||
|
TSharedPtr<FUICommandInfo> ValidateGraph;
|
||||||
|
|
||||||
|
virtual void RegisterCommands() override;
|
||||||
|
};
|
||||||
@ -6,7 +6,6 @@
|
|||||||
#include "Ed/EdComboActionGraphEdge.h"
|
#include "Ed/EdComboActionGraphEdge.h"
|
||||||
#include "Ed/EdComboActionGraphNode.h"
|
#include "Ed/EdComboActionGraphNode.h"
|
||||||
#include "Settings/ComboActionGraphEditorSettings.h"
|
#include "Settings/ComboActionGraphEditorSettings.h"
|
||||||
#include "Settings/FComboActionGraphEditorStyle.h"
|
|
||||||
|
|
||||||
DEFINE_LOG_CATEGORY(LogConnectionDrawingPolicy_ComboActionGraph);
|
DEFINE_LOG_CATEGORY(LogConnectionDrawingPolicy_ComboActionGraph);
|
||||||
|
|
||||||
@ -21,16 +20,16 @@ FConnectionDrawingPolicy_ComboActionGraph::FConnectionDrawingPolicy_ComboActionG
|
|||||||
switch (GraphEditorSettings->GetArrowType())
|
switch (GraphEditorSettings->GetArrowType())
|
||||||
{
|
{
|
||||||
case EComboActionArrowType::SimpleArrow:
|
case EComboActionArrowType::SimpleArrow:
|
||||||
ArrowImage = ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush(TEXT("MDSStyleSet.Graph.SimpleArrow"));
|
ArrowImage = ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush(TEXT("MDSStyleSet.Graph.SimpleArrow"));
|
||||||
break;
|
break;
|
||||||
case EComboActionArrowType::HollowArrow:
|
case EComboActionArrowType::HollowArrow:
|
||||||
ArrowImage = ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush(TEXT("MDSStyleSet.Graph.HollowArrow"));
|
ArrowImage = ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush(TEXT("MDSStyleSet.Graph.HollowArrow"));
|
||||||
break;
|
break;
|
||||||
case EComboActionArrowType::FancyArrow:
|
case EComboActionArrowType::FancyArrow:
|
||||||
ArrowImage = ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush(TEXT("MDSStyleSet.Graph.FancyArrow"));
|
ArrowImage = ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush(TEXT("MDSStyleSet.Graph.FancyArrow"));
|
||||||
break;
|
break;
|
||||||
case EComboActionArrowType::Bubble:
|
case EComboActionArrowType::Bubble:
|
||||||
ArrowImage = ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush(TEXT("MDSStyleSet.Graph.Bubble"));
|
ArrowImage = ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush(TEXT("MDSStyleSet.Graph.Bubble"));
|
||||||
break;
|
break;
|
||||||
case EComboActionArrowType::None:
|
case EComboActionArrowType::None:
|
||||||
default:
|
default:
|
||||||
|
|||||||
@ -16,7 +16,6 @@
|
|||||||
#include "Blueprint/UserWidget.h"
|
#include "Blueprint/UserWidget.h"
|
||||||
#include "ComboActionGraph.h"
|
#include "ComboActionGraph.h"
|
||||||
#include "Settings/ComboActionGraphEditorSettings.h"
|
#include "Settings/ComboActionGraphEditorSettings.h"
|
||||||
#include "Settings/FComboActionGraphEditorStyle.h"
|
|
||||||
#include "Widgets/Layout/SGridPanel.h"
|
#include "Widgets/Layout/SGridPanel.h"
|
||||||
#include "Widgets/Layout/SScaleBox.h"
|
#include "Widgets/Layout/SScaleBox.h"
|
||||||
|
|
||||||
@ -86,13 +85,13 @@ protected:
|
|||||||
switch (GraphEditorSettings->GetNodeType())
|
switch (GraphEditorSettings->GetNodeType())
|
||||||
{
|
{
|
||||||
case EComboActionNodeType::SoftCorners:
|
case EComboActionNodeType::SoftCorners:
|
||||||
return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush("MDSStyleSet.Node.TextSoftEdges");
|
return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush("MDSStyleSet.Node.TextSoftEdges");
|
||||||
case EComboActionNodeType::HardCorners:
|
case EComboActionNodeType::HardCorners:
|
||||||
return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush("MDSStyleSet.Node.TextHardEdges");
|
return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush("MDSStyleSet.Node.TextHardEdges");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush(TEXT("MDSStyleSet.Graph.PinDocksOverlay"));
|
return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush(TEXT("MDSStyleSet.Graph.PinDocksOverlay"));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -131,7 +130,7 @@ void SEdComboActionGraphNode::OnMouseLeave(const FPointerEvent& MouseEvent)
|
|||||||
const FSlateBrush *SEdComboActionGraphNode::GetIndexBrush() const
|
const FSlateBrush *SEdComboActionGraphNode::GetIndexBrush() const
|
||||||
{
|
{
|
||||||
FComboInputEditorModule &ComboInputEditorModule = FComboInputEditorModule::Get();
|
FComboInputEditorModule &ComboInputEditorModule = FComboInputEditorModule::Get();
|
||||||
return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush("MDSStyleSet.Node.TextSoftEdges");
|
return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush("MDSStyleSet.Node.TextSoftEdges");
|
||||||
}
|
}
|
||||||
|
|
||||||
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
|
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
|
||||||
@ -160,7 +159,7 @@ void SEdComboActionGraphNode::UpdateGraphNode()
|
|||||||
this->ContentScale.Bind(this, &SGraphNode::GetContentScale);
|
this->ContentScale.Bind(this, &SGraphNode::GetContentScale);
|
||||||
|
|
||||||
FComboInputEditorModule &ComboInputEditorModule = FComboInputEditorModule::Get();
|
FComboInputEditorModule &ComboInputEditorModule = FComboInputEditorModule::Get();
|
||||||
const FSlateBrush *CircleBrush = ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush(TEXT("MDSStyleSet.Node.IndexCircle"));
|
const FSlateBrush *CircleBrush = ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush(TEXT("MDSStyleSet.Node.IndexCircle"));
|
||||||
this->GetOrAddSlot(ENodeZone::Left)
|
this->GetOrAddSlot(ENodeZone::Left)
|
||||||
.SlotOffset(TAttribute<FVector2D>(this, &SEdComboActionGraphNode::GetIndexSlotOffset))
|
.SlotOffset(TAttribute<FVector2D>(this, &SEdComboActionGraphNode::GetIndexSlotOffset))
|
||||||
.SlotSize(TAttribute<FVector2D>(this, &SEdComboActionGraphNode::GetIndexSlotSize))
|
.SlotSize(TAttribute<FVector2D>(this, &SEdComboActionGraphNode::GetIndexSlotSize))
|
||||||
@ -382,7 +381,7 @@ void SEdComboActionGraphNode::UpdateGraphNode()
|
|||||||
.AutoHeight()
|
.AutoHeight()
|
||||||
[
|
[
|
||||||
SAssignNew(InlineEditableText, SInlineEditableTextBlock)
|
SAssignNew(InlineEditableText, SInlineEditableTextBlock)
|
||||||
.Style(ComboInputEditorModule.ComboActionGraphEditorStyleSet.Get(), "MDSStyleSet.NodeTitleInlineEditableText")
|
.Style(ComboInputEditorModule.GetComboInputEditorStyleSet().Get(), "MDSStyleSet.NodeTitleInlineEditableText")
|
||||||
.Text(NodeTitle.Get(), &SNodeTitle::GetHeadTitle)
|
.Text(NodeTitle.Get(), &SNodeTitle::GetHeadTitle)
|
||||||
.OnVerifyTextChanged(
|
.OnVerifyTextChanged(
|
||||||
this, &SEdComboActionGraphNode::OnVerifyNameTextChanged)
|
this, &SEdComboActionGraphNode::OnVerifyNameTextChanged)
|
||||||
@ -1004,13 +1003,13 @@ const FSlateBrush *SEdComboActionGraphNode::GetNodeTypeBrush() const
|
|||||||
switch (GraphEditorSettings->GetNodeType())
|
switch (GraphEditorSettings->GetNodeType())
|
||||||
{
|
{
|
||||||
case EComboActionNodeType::SoftCorners:
|
case EComboActionNodeType::SoftCorners:
|
||||||
return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush("MDSStyleSet.Node.SoftEdges");
|
return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush("MDSStyleSet.Node.SoftEdges");
|
||||||
case EComboActionNodeType::HardCorners:
|
case EComboActionNodeType::HardCorners:
|
||||||
return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush("MDSStyleSet.Node.HardEdges");
|
return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush("MDSStyleSet.Node.HardEdges");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush("MDSStyleSet.Node.SoftEdges");
|
return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush("MDSStyleSet.Node.SoftEdges");
|
||||||
}
|
}
|
||||||
|
|
||||||
const FSlateBrush *SEdComboActionGraphNode::GetTextNodeTypeBrush() const
|
const FSlateBrush *SEdComboActionGraphNode::GetTextNodeTypeBrush() const
|
||||||
@ -1021,13 +1020,13 @@ const FSlateBrush *SEdComboActionGraphNode::GetTextNodeTypeBrush() const
|
|||||||
switch (GraphEditorSettings->GetNodeType())
|
switch (GraphEditorSettings->GetNodeType())
|
||||||
{
|
{
|
||||||
case EComboActionNodeType::SoftCorners:
|
case EComboActionNodeType::SoftCorners:
|
||||||
return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush("MDSStyleSet.Node.TextSoftEdges");
|
return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush("MDSStyleSet.Node.TextSoftEdges");
|
||||||
case EComboActionNodeType::HardCorners:
|
case EComboActionNodeType::HardCorners:
|
||||||
return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush("MDSStyleSet.Node.TextHardEdges");
|
return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush("MDSStyleSet.Node.TextHardEdges");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush("MDSStyleSet.Node.TextSoftEdges");
|
return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush("MDSStyleSet.Node.TextSoftEdges");
|
||||||
}
|
}
|
||||||
|
|
||||||
FSlateColor SEdComboActionGraphNode::GetBorderBackgroundColor() const
|
FSlateColor SEdComboActionGraphNode::GetBorderBackgroundColor() const
|
||||||
@ -1101,7 +1100,7 @@ const FSlateBrush*SEdComboActionGraphNode::GetInheritsImageBrush() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush( bHasDecorators ? "MDSStyleSet.Icon.OK" : "MDSStyleSet.Icon.Error" );
|
return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush( bHasDecorators ? "MDSStyleSet.Icon.OK" : "MDSStyleSet.Icon.Error" );
|
||||||
}
|
}
|
||||||
|
|
||||||
FSlateColor SEdComboActionGraphNode::GetInheritsImageTint() const
|
FSlateColor SEdComboActionGraphNode::GetInheritsImageTint() const
|
||||||
@ -1121,7 +1120,7 @@ FSlateColor SEdComboActionGraphNode::GetInheritsImageTint() const
|
|||||||
const FSlateBrush*SEdComboActionGraphNode::GetBulletPointImageBrush() const
|
const FSlateBrush*SEdComboActionGraphNode::GetBulletPointImageBrush() const
|
||||||
{
|
{
|
||||||
FComboInputEditorModule &ComboInputEditorModule = FComboInputEditorModule::Get();
|
FComboInputEditorModule &ComboInputEditorModule = FComboInputEditorModule::Get();
|
||||||
return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush( "MDSStyleSet.Icon.BulletPoint" );
|
return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush( "MDSStyleSet.Icon.BulletPoint" );
|
||||||
}
|
}
|
||||||
|
|
||||||
FText SEdComboActionGraphNode::GetIndexOverlayTooltipText() const
|
FText SEdComboActionGraphNode::GetIndexOverlayTooltipText() const
|
||||||
|
|||||||
@ -3,19 +3,18 @@
|
|||||||
#include "SEdComboActionGraphNodeIndex.h"
|
#include "SEdComboActionGraphNodeIndex.h"
|
||||||
|
|
||||||
#include "ComboInputEditor.h"
|
#include "ComboInputEditor.h"
|
||||||
#include "Settings/FComboActionGraphEditorStyle.h"
|
|
||||||
|
|
||||||
|
|
||||||
void SEdComboActionGraphNodeIndex::Construct(const FArguments &InArgs)
|
void SEdComboActionGraphNodeIndex::Construct(const FArguments &InArgs)
|
||||||
{
|
{
|
||||||
FComboInputEditorModule &ComboInputEditorModule = FComboInputEditorModule::Get();
|
FComboInputEditorModule &ComboInputEditorModule = FComboInputEditorModule::Get();
|
||||||
const FSlateBrush* CircleBrush = ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush(TEXT("MDSStyleSet.Node.IndexCircle"));
|
const FSlateBrush* CircleBrush = ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush(TEXT("MDSStyleSet.Node.IndexCircle"));
|
||||||
ChildSlot
|
ChildSlot
|
||||||
[
|
[
|
||||||
SNew(SOverlay)
|
SNew(SOverlay)
|
||||||
+SOverlay::Slot()
|
+SOverlay::Slot()
|
||||||
.HAlign(HAlign_Fill)
|
.HAlign(EHorizontalAlignment::HAlign_Fill)
|
||||||
.VAlign(VAlign_Fill)
|
.VAlign(EVerticalAlignment::VAlign_Fill)
|
||||||
[
|
[
|
||||||
// Add a dummy box here to make sure the widget doesnt get smaller than the brush
|
// Add a dummy box here to make sure the widget doesnt get smaller than the brush
|
||||||
SNew(SBox)
|
SNew(SBox)
|
||||||
@ -24,15 +23,15 @@ void SEdComboActionGraphNodeIndex::Construct(const FArguments &InArgs)
|
|||||||
]
|
]
|
||||||
|
|
||||||
+SOverlay::Slot()
|
+SOverlay::Slot()
|
||||||
.HAlign(HAlign_Fill)
|
.HAlign(EHorizontalAlignment::HAlign_Fill)
|
||||||
.VAlign(VAlign_Fill)
|
.VAlign(EVerticalAlignment::VAlign_Fill)
|
||||||
[
|
[
|
||||||
SNew(SBorder)
|
SNew(SBorder)
|
||||||
.BorderImage(CircleBrush)
|
.BorderImage(CircleBrush)
|
||||||
.BorderBackgroundColor(this, &SEdComboActionGraphNodeIndex::GetBackgroundColor)
|
.BorderBackgroundColor(this, &SEdComboActionGraphNodeIndex::GetBackgroundColor)
|
||||||
.Padding(FMargin(4.0f))
|
.Padding(FMargin(4.0f))
|
||||||
.VAlign(VAlign_Center)
|
.VAlign(EVerticalAlignment::VAlign_Center)
|
||||||
.HAlign(HAlign_Center)
|
.HAlign(EHorizontalAlignment::HAlign_Center)
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
11
Source/ComboInputEditor/Private/Layout/AssetEditorTabs.h
Normal file
11
Source/ComboInputEditor/Private/Layout/AssetEditorTabs.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
struct FAssetEditorTabs_ComboActionGraph
|
||||||
|
{
|
||||||
|
// Tab identifiers
|
||||||
|
static const FName ComboActionGraphPropertyID;
|
||||||
|
static const FName ViewportID;
|
||||||
|
static const FName SearchToolbarID;
|
||||||
|
};
|
||||||
@ -0,0 +1,166 @@
|
|||||||
|
// All rights reserved Dominik Pavlicek 2023
|
||||||
|
|
||||||
|
|
||||||
|
#include "Layout/ComboActionForceDirectedSolveLayoutStrategy.h"
|
||||||
|
|
||||||
|
#include "ComboActionGraph.h"
|
||||||
|
#include "Ed/EdComboActionGraph.h"
|
||||||
|
#include "Ed/EdComboActionGraphNode.h"
|
||||||
|
#include "Nodes/ComboActionGraphNode.h"
|
||||||
|
#include "Settings/ComboActionGraphEditorSettings.h"
|
||||||
|
|
||||||
|
UComboActionForceDirectedSolveLayoutStrategy::UComboActionForceDirectedSolveLayoutStrategy()
|
||||||
|
{
|
||||||
|
this->bRandomInit = false;
|
||||||
|
this->CoolDownRate = 10;
|
||||||
|
this->InitTemperature = 10.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline float CoolDown(float Temp, float CoolDownRate)
|
||||||
|
{
|
||||||
|
if (Temp < .01) return .01;
|
||||||
|
return Temp - (Temp / CoolDownRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline float GetAttractForce(float X, float K)
|
||||||
|
{
|
||||||
|
return (X * X) / K;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline float GetRepulseForce(float X, float k)
|
||||||
|
{
|
||||||
|
return X != 0 ? k * k / X : TNumericLimits<float>::Max();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UComboActionForceDirectedSolveLayoutStrategy::Layout(UEdGraph *InEdGraph)
|
||||||
|
{
|
||||||
|
this->EdGraph = Cast<UEdComboActionGraph>(InEdGraph);
|
||||||
|
check(this->EdGraph != nullptr);
|
||||||
|
|
||||||
|
this->EdGraph->RebuildComboActionGraph();
|
||||||
|
this->Graph = this->EdGraph->GetComboActionGraph();
|
||||||
|
check(this->Graph != nullptr);
|
||||||
|
|
||||||
|
if (this->Settings != nullptr)
|
||||||
|
{
|
||||||
|
this->OptimalDistance = Settings->GetOptimalDistance();
|
||||||
|
this->MaxIteration = Settings->GetMaxIteration();
|
||||||
|
this->bRandomInit = Settings->IsRandomInit();
|
||||||
|
}
|
||||||
|
|
||||||
|
FBox2D PreTreeBound(ForceInitToZero);
|
||||||
|
for (int32 i = 0; i < Graph->RootNodes.Num(); ++i)
|
||||||
|
{
|
||||||
|
PreTreeBound = this->LayoutOneTree(Graph->RootNodes[i], PreTreeBound);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FBox2D UComboActionForceDirectedSolveLayoutStrategy::LayoutOneTree(UComboActionGraphNode *RootNode, const FBox2D &PreTreeBound)
|
||||||
|
{
|
||||||
|
float Temp = this->InitTemperature;
|
||||||
|
FBox2D TreeBound = GetActualBounds(RootNode);
|
||||||
|
TreeBound.Min.X += PreTreeBound.Max.X + this->OptimalDistance;
|
||||||
|
TreeBound.Max.X += PreTreeBound.Max.X + this->OptimalDistance;
|
||||||
|
|
||||||
|
if (this->bRandomInit)
|
||||||
|
{
|
||||||
|
this->RandomLayoutOneTree(RootNode, TreeBound);
|
||||||
|
}
|
||||||
|
|
||||||
|
float RepulseForce, AttractForce, Distance;
|
||||||
|
FVector2D Diff;
|
||||||
|
|
||||||
|
TMap<UEdGraphNode*, FVector2D> NodeToDisplacement;
|
||||||
|
|
||||||
|
for (const TObjectPtr<UEdGraphNode> &EdNode : this->EdGraph->Nodes)
|
||||||
|
{
|
||||||
|
NodeToDisplacement.Add(EdNode, FVector2D(0.0f, 0.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32 IterationNum = 0; IterationNum < this->MaxIteration; IterationNum++)
|
||||||
|
{
|
||||||
|
// Calculate the repulsive forces.
|
||||||
|
for (int32 i = 0; i < this->EdGraph->Nodes.Num(); i++)
|
||||||
|
{
|
||||||
|
for (int32 j = 0; j < this->EdGraph->Nodes.Num(); j++)
|
||||||
|
{
|
||||||
|
if (i == j)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Diff.X = this->EdGraph->Nodes[i]->NodePosX - this->EdGraph->Nodes[j]->NodePosX;
|
||||||
|
Diff.Y = this->EdGraph->Nodes[i]->NodePosY - this->EdGraph->Nodes[j]->NodePosY;
|
||||||
|
Distance = Diff.Size();
|
||||||
|
Diff.Normalize();
|
||||||
|
|
||||||
|
RepulseForce = Distance > 2 * this->OptimalDistance ? 0 : GetRepulseForce(Distance, this->OptimalDistance);
|
||||||
|
|
||||||
|
NodeToDisplacement[this->EdGraph->Nodes[i]] += Diff * RepulseForce;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate the attractive forces.
|
||||||
|
int Level = 0;
|
||||||
|
TArray<UComboActionGraphNode*> CurrLevelNodes = { RootNode };
|
||||||
|
TArray<UComboActionGraphNode*> NextLevelNodes;
|
||||||
|
|
||||||
|
while (CurrLevelNodes.Num() != 0)
|
||||||
|
{
|
||||||
|
for (int32 i = 0; i < CurrLevelNodes.Num(); i++)
|
||||||
|
{
|
||||||
|
UComboActionGraphNode *Node = CurrLevelNodes[i];
|
||||||
|
check(Node != nullptr);
|
||||||
|
|
||||||
|
UEdComboActionGraphNode *EdNode_ParentNode = this->EdGraph->NodeMap[Node];
|
||||||
|
|
||||||
|
for (int32 j = 0; j < Node->ChildrenNodes.Num(); j++)
|
||||||
|
{
|
||||||
|
NextLevelNodes.Add(Node->ChildrenNodes[j]);
|
||||||
|
|
||||||
|
UEdComboActionGraphNode *EdNode_ChildNode = this->EdGraph->NodeMap[Node->ChildrenNodes[j]];
|
||||||
|
|
||||||
|
Diff.X = EdNode_ChildNode->NodePosX - EdNode_ParentNode->NodePosY;
|
||||||
|
Diff.Y = EdNode_ChildNode->NodePosY - EdNode_ParentNode->NodePosY;
|
||||||
|
Distance = Diff.Size();
|
||||||
|
Diff.Normalize();
|
||||||
|
|
||||||
|
AttractForce = GetAttractForce(Distance, this->OptimalDistance);
|
||||||
|
|
||||||
|
NodeToDisplacement[EdNode_ParentNode] += Distance * Diff;
|
||||||
|
NodeToDisplacement[EdNode_ChildNode] -= Distance * Diff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CurrLevelNodes = NextLevelNodes;
|
||||||
|
NextLevelNodes.Reset();
|
||||||
|
Level++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (UEdGraphNode *EdNode : this->EdGraph->Nodes)
|
||||||
|
{
|
||||||
|
Distance = NodeToDisplacement[EdNode].Size();
|
||||||
|
NodeToDisplacement[EdNode].Normalize();
|
||||||
|
|
||||||
|
float Minimum = Distance < Temp ? Distance : Temp;
|
||||||
|
EdNode->NodePosX += NodeToDisplacement[EdNode].X * Minimum;
|
||||||
|
EdNode->NodePosY += NodeToDisplacement[EdNode].Y * Minimum;
|
||||||
|
}
|
||||||
|
|
||||||
|
Temp = CoolDown(Temp, this->CoolDownRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
FBox2D ActualBound = GetActualBounds(RootNode);
|
||||||
|
|
||||||
|
FVector2D Center = ActualBound.GetCenter();
|
||||||
|
FVector2D TreeCenter = TreeBound.GetCenter();
|
||||||
|
|
||||||
|
FVector2D Scale = (TreeBound.Max - TreeBound.Min) / (ActualBound.Max - ActualBound.Min);
|
||||||
|
|
||||||
|
for (UEdGraphNode *EdNode : EdGraph->Nodes)
|
||||||
|
{
|
||||||
|
EdNode->NodePosX = TreeCenter.X + Scale.X * (EdNode->NodePosX - Center.X);
|
||||||
|
EdNode->NodePosY = TreeCenter.Y + Scale.Y * (EdNode->NodePosY - Center.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TreeBound;
|
||||||
|
}
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
// All rights reserved Dominik Pavlicek 2023
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Layout/ComboActionGraphLayoutStrategy.h"
|
||||||
|
#include "UObject/Object.h"
|
||||||
|
|
||||||
|
#include "ComboActionForceDirectedSolveLayoutStrategy.generated.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
UCLASS()
|
||||||
|
class COMBOINPUTEDITOR_API UComboActionForceDirectedSolveLayoutStrategy : public UComboActionGraphLayoutStrategy
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UComboActionForceDirectedSolveLayoutStrategy();
|
||||||
|
|
||||||
|
virtual void Layout(UEdGraph *EdGraph) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual FBox2D LayoutOneTree(UComboActionGraphNode* RootNode, const FBox2D &PreTreeBound);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool bRandomInit;
|
||||||
|
float InitTemperature;
|
||||||
|
float CoolDownRate;
|
||||||
|
};
|
||||||
@ -0,0 +1,95 @@
|
|||||||
|
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "ComboActionGraphLayoutStrategy.h"
|
||||||
|
|
||||||
|
#include "Ed/EdComboActionGraph.h"
|
||||||
|
#include "Ed/EdComboActionGraphNode.h"
|
||||||
|
#include "Ed/SEdComboActionGraphNode.h"
|
||||||
|
#include "Nodes/ComboActionGraphNode.h"
|
||||||
|
|
||||||
|
#include "Kismet/KismetMathLibrary.h"
|
||||||
|
|
||||||
|
|
||||||
|
UComboActionGraphLayoutStrategy::UComboActionGraphLayoutStrategy()
|
||||||
|
{
|
||||||
|
Settings = nullptr;
|
||||||
|
MaxIteration = 50;
|
||||||
|
OptimalDistance = 150;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32 UComboActionGraphLayoutStrategy::GetNodeWidth(UEdComboActionGraphNode *EdNode)
|
||||||
|
{
|
||||||
|
return EdNode->SEdNode->GetCachedGeometry().GetLocalSize().X;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32 UComboActionGraphLayoutStrategy::GetNodeHeight(UEdComboActionGraphNode *EdNode)
|
||||||
|
{
|
||||||
|
return EdNode->SEdNode->GetCachedGeometry().GetLocalSize().Y;
|
||||||
|
}
|
||||||
|
|
||||||
|
FBox2D UComboActionGraphLayoutStrategy::GetNodeBound(UEdGraphNode* EdNode)
|
||||||
|
{
|
||||||
|
int32 NodeWidth = GetNodeWidth(Cast<UEdComboActionGraphNode>(EdNode));
|
||||||
|
int32 NodeHeight = GetNodeHeight(Cast<UEdComboActionGraphNode>(EdNode));
|
||||||
|
FVector2D Min(EdNode->NodePosX, EdNode->NodePosY);
|
||||||
|
FVector2D Max(EdNode->NodePosX + NodeWidth, EdNode->NodePosY + NodeHeight);
|
||||||
|
return FBox2D(Min, Max);
|
||||||
|
}
|
||||||
|
|
||||||
|
FBox2D UComboActionGraphLayoutStrategy::GetActualBounds(UComboActionGraphNode *RootNode)
|
||||||
|
{
|
||||||
|
int Level = 0;
|
||||||
|
TArray<UComboActionGraphNode*> CurrLevelNodes = { RootNode };
|
||||||
|
TArray<UComboActionGraphNode*> NextLevelNodes;
|
||||||
|
|
||||||
|
FBox2D Rtn = GetNodeBound(this->EdGraph->NodeMap[RootNode]);
|
||||||
|
|
||||||
|
while (CurrLevelNodes.Num() != 0)
|
||||||
|
{
|
||||||
|
for (const UComboActionGraphNode *Node : CurrLevelNodes)
|
||||||
|
{
|
||||||
|
check(Node != nullptr);
|
||||||
|
|
||||||
|
Rtn += GetNodeBound(this->EdGraph->NodeMap[Node]);
|
||||||
|
|
||||||
|
for (UComboActionGraphNode *ChildNode : Node->ChildrenNodes)
|
||||||
|
{
|
||||||
|
NextLevelNodes.Add(ChildNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CurrLevelNodes = NextLevelNodes;
|
||||||
|
NextLevelNodes.Reset();
|
||||||
|
++Level;
|
||||||
|
}
|
||||||
|
return Rtn;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UComboActionGraphLayoutStrategy::RandomLayoutOneTree(UComboActionGraphNode *RootNode, const FBox2D &Bound)
|
||||||
|
{
|
||||||
|
int Level = 0;
|
||||||
|
TArray<UComboActionGraphNode*> CurrLevelNodes = { RootNode };
|
||||||
|
TArray<UComboActionGraphNode*> NextLevelNodes;
|
||||||
|
|
||||||
|
while (CurrLevelNodes.Num() != 0)
|
||||||
|
{
|
||||||
|
for (const UComboActionGraphNode *Node : CurrLevelNodes)
|
||||||
|
{
|
||||||
|
check(Node != nullptr);
|
||||||
|
|
||||||
|
UEdComboActionGraphNode *EdNode_Node = this->EdGraph->NodeMap[Node];
|
||||||
|
|
||||||
|
EdNode_Node->NodePosX = UKismetMathLibrary::RandomFloatInRange(Bound.Min.X, Bound.Max.X);
|
||||||
|
EdNode_Node->NodePosY = UKismetMathLibrary::RandomFloatInRange(Bound.Min.Y, Bound.Max.Y);
|
||||||
|
|
||||||
|
for (UComboActionGraphNode *ChildNode : Node->ChildrenNodes)
|
||||||
|
{
|
||||||
|
NextLevelNodes.Add(ChildNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CurrLevelNodes = NextLevelNodes;
|
||||||
|
NextLevelNodes.Reset();
|
||||||
|
++Level;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,42 @@
|
|||||||
|
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "UObject/Object.h"
|
||||||
|
|
||||||
|
#include "ComboActionGraphLayoutStrategy.generated.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
UCLASS(Abstract)
|
||||||
|
class COMBOINPUTEDITOR_API UComboActionGraphLayoutStrategy : public UObject
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
UComboActionGraphLayoutStrategy();
|
||||||
|
|
||||||
|
virtual void Layout(UEdGraph *G) {};
|
||||||
|
|
||||||
|
UComboActionGraphEditorSettings *Settings;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int32 GetNodeWidth(UEdComboActionGraphNode *EdNode);
|
||||||
|
|
||||||
|
int32 GetNodeHeight(UEdComboActionGraphNode *EdNode);
|
||||||
|
|
||||||
|
FBox2D GetNodeBound(UEdGraphNode *EdNode);
|
||||||
|
|
||||||
|
FBox2D GetActualBounds(UComboActionGraphNode *RootNode);
|
||||||
|
|
||||||
|
virtual void RandomLayoutOneTree(UComboActionGraphNode *RootNode, const FBox2D &Bound);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
UComboActionGraph *Graph;
|
||||||
|
UEdComboActionGraph *EdGraph;
|
||||||
|
int32 MaxIteration;
|
||||||
|
int32 OptimalDistance;
|
||||||
|
};
|
||||||
@ -0,0 +1,241 @@
|
|||||||
|
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
|
||||||
|
#include "ComboActionTreeSolveLayoutStrategy.h"
|
||||||
|
|
||||||
|
#include "ComboActionGraph.h"
|
||||||
|
|
||||||
|
#include "Ed/EdComboActionGraph.h"
|
||||||
|
#include "Ed/EdComboActionGraphNode.h"
|
||||||
|
#include "Nodes/ComboActionGraphNode.h"
|
||||||
|
#include "Settings/ComboActionGraphEditorSettings.h"
|
||||||
|
|
||||||
|
|
||||||
|
void UComboActionTreeSolveLayoutStrategy::Layout(UEdGraph *InEdGraph)
|
||||||
|
{
|
||||||
|
this->EdGraph = Cast<UEdComboActionGraph>(InEdGraph);
|
||||||
|
check(this->EdGraph != nullptr);
|
||||||
|
|
||||||
|
this->EdGraph->RebuildComboActionGraph();
|
||||||
|
this->Graph = this->EdGraph->GetComboActionGraph();
|
||||||
|
check(this->Graph != nullptr);
|
||||||
|
|
||||||
|
bool bFirstPassOnly = false;
|
||||||
|
|
||||||
|
if (this->Settings == nullptr)
|
||||||
|
{
|
||||||
|
this->Settings = GetMutableDefault<UComboActionGraphEditorSettings>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this->Settings != nullptr)
|
||||||
|
{
|
||||||
|
this->OptimalDistance = this->Settings->GetOptimalDistance();
|
||||||
|
this->MaxIteration = this->Settings->GetMaxIteration();
|
||||||
|
bFirstPassOnly = this->Settings->IsFirstPassOnly();
|
||||||
|
}
|
||||||
|
|
||||||
|
FVector2D Anchor(0.f, 0.f);
|
||||||
|
for (UComboActionGraphNode *RootNode : this->Graph->RootNodes)
|
||||||
|
{
|
||||||
|
this->InitPass(RootNode, Anchor);
|
||||||
|
|
||||||
|
if (!bFirstPassOnly)
|
||||||
|
{
|
||||||
|
for (int32 j = 0; j < this->MaxIteration; ++j)
|
||||||
|
{
|
||||||
|
bool HasConflict = this->ResolveConflictPass(RootNode);
|
||||||
|
if (!HasConflict)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32 i = 0; i < Graph->RootNodes.Num(); i++)
|
||||||
|
{
|
||||||
|
for (int32 j = 0; j < i; j++)
|
||||||
|
{
|
||||||
|
this->ResolveConflict(Graph->RootNodes[j], Graph->RootNodes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UComboActionTreeSolveLayoutStrategy::InitPass(UComboActionGraphNode *RootNode, const FVector2D &Anchor)
|
||||||
|
{
|
||||||
|
UEdComboActionGraphNode *EdNode_RootNode = this->EdGraph->NodeMap[RootNode];
|
||||||
|
|
||||||
|
FVector2D ChildAnchor(FVector2D(0.0f, this->GetNodeHeight(EdNode_RootNode) + this->OptimalDistance + Anchor.Y));
|
||||||
|
for (int32 i = 0; i < RootNode->ChildrenNodes.Num(); i++)
|
||||||
|
{
|
||||||
|
UComboActionGraphNode *Child = RootNode->ChildrenNodes[i];
|
||||||
|
UEdComboActionGraphNode *EdNode_ChildNode = this->EdGraph->NodeMap[Child];
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
UComboActionGraphNode *PreChild = RootNode->ChildrenNodes[i - 1];
|
||||||
|
UEdComboActionGraphNode *EdNode_PreChildNode = this->EdGraph->NodeMap[PreChild];
|
||||||
|
ChildAnchor.X += this->OptimalDistance + this->GetNodeWidth(EdNode_PreChildNode) / 2;
|
||||||
|
}
|
||||||
|
ChildAnchor.X += this->GetNodeWidth(EdNode_ChildNode) / 2;
|
||||||
|
this->InitPass(Child, ChildAnchor);
|
||||||
|
}
|
||||||
|
|
||||||
|
float NodeWidth = this->GetNodeWidth(EdNode_RootNode);
|
||||||
|
|
||||||
|
EdNode_RootNode->NodePosY = Anchor.Y;
|
||||||
|
if (RootNode->ChildrenNodes.Num() == 0)
|
||||||
|
{
|
||||||
|
EdNode_RootNode->NodePosX = Anchor.X - NodeWidth / 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->UpdateParentNodePosition(RootNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UComboActionTreeSolveLayoutStrategy::ResolveConflictPass(UComboActionGraphNode *Node)
|
||||||
|
{
|
||||||
|
bool HasConflict = false;
|
||||||
|
for (int32 i = 0; i < Node->ChildrenNodes.Num(); ++i)
|
||||||
|
{
|
||||||
|
UComboActionGraphNode *Child = Node->ChildrenNodes[i];
|
||||||
|
if (this->ResolveConflictPass(Child))
|
||||||
|
{
|
||||||
|
HasConflict = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const UComboActionGraphNode *ParentNode : Node->ParentNodes)
|
||||||
|
{
|
||||||
|
for (UComboActionGraphNode *LeftSibling : ParentNode->ChildrenNodes)
|
||||||
|
{
|
||||||
|
if (LeftSibling == Node)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (this->ResolveConflict(LeftSibling, Node))
|
||||||
|
{
|
||||||
|
HasConflict = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return HasConflict;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UComboActionTreeSolveLayoutStrategy::ResolveConflict(UComboActionGraphNode *LRoot, UComboActionGraphNode *RRoot)
|
||||||
|
{
|
||||||
|
TArray<UEdComboActionGraphNode*> RightContour, LeftContour;
|
||||||
|
|
||||||
|
this->GetRightContour(LRoot, 0, RightContour);
|
||||||
|
this->GetLeftContour(RRoot, 0, LeftContour);
|
||||||
|
|
||||||
|
int32 MaxOverlapDistance = 0;
|
||||||
|
int32 Num = FMath::Min(LeftContour.Num(), RightContour.Num());
|
||||||
|
for (int32 i = 0; i < Num; ++i)
|
||||||
|
{
|
||||||
|
if (RightContour.Contains(LeftContour[i]) || LeftContour.Contains(RightContour[i]))
|
||||||
|
break;
|
||||||
|
|
||||||
|
int32 RightBound = RightContour[i]->NodePosX + this->GetNodeWidth(RightContour[i]);
|
||||||
|
int32 LeftBound = LeftContour[i]->NodePosX;
|
||||||
|
int32 Distance = RightBound + OptimalDistance - LeftBound;
|
||||||
|
if (Distance > MaxOverlapDistance)
|
||||||
|
{
|
||||||
|
MaxOverlapDistance = Distance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MaxOverlapDistance > 0)
|
||||||
|
{
|
||||||
|
this->ShiftSubTree(RRoot, FVector2D(MaxOverlapDistance, 0.f));
|
||||||
|
|
||||||
|
TArray<UComboActionGraphNode*> ParentNodes = RRoot->ParentNodes;
|
||||||
|
TArray<UComboActionGraphNode*> NextParentNodes;
|
||||||
|
while (ParentNodes.Num() != 0)
|
||||||
|
{
|
||||||
|
for (int32 i = 0; i < ParentNodes.Num(); ++i)
|
||||||
|
{
|
||||||
|
UpdateParentNodePosition(ParentNodes[i]);
|
||||||
|
|
||||||
|
NextParentNodes.Append(ParentNodes[i]->ParentNodes);
|
||||||
|
}
|
||||||
|
|
||||||
|
ParentNodes = NextParentNodes;
|
||||||
|
NextParentNodes.Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UComboActionTreeSolveLayoutStrategy::GetLeftContour(UComboActionGraphNode *RootNode, int32 Level, TArray<UEdComboActionGraphNode*> &Contour)
|
||||||
|
{
|
||||||
|
UEdComboActionGraphNode *EdNode_Node = this->EdGraph->NodeMap[RootNode];
|
||||||
|
if (Level >= Contour.Num())
|
||||||
|
{
|
||||||
|
Contour.Add(EdNode_Node);
|
||||||
|
}
|
||||||
|
else if (EdNode_Node->NodePosX < Contour[Level]->NodePosX)
|
||||||
|
{
|
||||||
|
Contour[Level] = EdNode_Node;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (UComboActionGraphNode *Child : RootNode->ChildrenNodes)
|
||||||
|
{
|
||||||
|
this->GetLeftContour(Child, Level + 1, Contour);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UComboActionTreeSolveLayoutStrategy::GetRightContour(UComboActionGraphNode *RootNode, int32 Level, TArray<UEdComboActionGraphNode*> &Contour)
|
||||||
|
{
|
||||||
|
UEdComboActionGraphNode *EdNode_Node = this->EdGraph->NodeMap[RootNode];
|
||||||
|
if (Level >= Contour.Num())
|
||||||
|
{
|
||||||
|
Contour.Add(EdNode_Node);
|
||||||
|
}
|
||||||
|
else if (EdNode_Node->NodePosX + this->GetNodeWidth(EdNode_Node) > Contour[Level]->NodePosX + this->GetNodeWidth(Contour[Level]))
|
||||||
|
{
|
||||||
|
Contour[Level] = EdNode_Node;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (UComboActionGraphNode *Child : RootNode->ChildrenNodes)
|
||||||
|
{
|
||||||
|
this->GetRightContour(Child, Level + 1, Contour);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UComboActionTreeSolveLayoutStrategy::ShiftSubTree(UComboActionGraphNode *RootNode, const FVector2D &Offset)
|
||||||
|
{
|
||||||
|
UEdComboActionGraphNode *EdNode_Node = this->EdGraph->NodeMap[RootNode];
|
||||||
|
EdNode_Node->NodePosX += Offset.X;
|
||||||
|
EdNode_Node->NodePosY += Offset.Y;
|
||||||
|
|
||||||
|
for (UComboActionGraphNode *Child : RootNode->ChildrenNodes)
|
||||||
|
{
|
||||||
|
if (Child->ParentNodes[0] == RootNode)
|
||||||
|
{
|
||||||
|
this->ShiftSubTree(Child, Offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UComboActionTreeSolveLayoutStrategy::UpdateParentNodePosition(UComboActionGraphNode *RootNode)
|
||||||
|
{
|
||||||
|
UEdComboActionGraphNode *EdNode_ParentNode = this->EdGraph->NodeMap[RootNode];
|
||||||
|
if (RootNode->ChildrenNodes.Num() % 2 == 0)
|
||||||
|
{
|
||||||
|
UEdComboActionGraphNode *FirstChild = this->EdGraph->NodeMap[RootNode->ChildrenNodes[0]];
|
||||||
|
UEdComboActionGraphNode *LastChild = this->EdGraph->NodeMap[RootNode->ChildrenNodes.Last()];
|
||||||
|
float LeftBound = FirstChild->NodePosX;
|
||||||
|
float RightBound = LastChild->NodePosX + this->GetNodeWidth(LastChild);
|
||||||
|
EdNode_ParentNode->NodePosX = (LeftBound + RightBound) / 2 - this->GetNodeWidth(EdNode_ParentNode) / 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UEdComboActionGraphNode *MidChild = this->EdGraph->NodeMap[RootNode->ChildrenNodes[RootNode->ChildrenNodes.Num() / 2]];
|
||||||
|
EdNode_ParentNode->NodePosX = MidChild->NodePosX + this->GetNodeWidth(MidChild) / 2 - this->GetNodeWidth(EdNode_ParentNode) / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,33 @@
|
|||||||
|
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Layout/ComboActionGraphLayoutStrategy.h"
|
||||||
|
|
||||||
|
#include "ComboActionTreeSolveLayoutStrategy.generated.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
UCLASS()
|
||||||
|
class COMBOINPUTEDITOR_API UComboActionTreeSolveLayoutStrategy : public UComboActionGraphLayoutStrategy
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
virtual void Layout(UEdGraph *InEdGraph) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void InitPass(UComboActionGraphNode *RootNode, const FVector2D &Anchor);
|
||||||
|
bool ResolveConflictPass(UComboActionGraphNode *Node);
|
||||||
|
|
||||||
|
bool ResolveConflict(UComboActionGraphNode *LRoot, UComboActionGraphNode *RRoot);
|
||||||
|
|
||||||
|
void GetLeftContour(UComboActionGraphNode *RootNode, int32 Level, TArray<UEdComboActionGraphNode*>& Contour);
|
||||||
|
void GetRightContour(UComboActionGraphNode *RootNode, int32 Level, TArray<UEdComboActionGraphNode*>& Contour);
|
||||||
|
|
||||||
|
void ShiftSubTree(UComboActionGraphNode* RootNode, const FVector2D& Offset);
|
||||||
|
|
||||||
|
void UpdateParentNodePosition(UComboActionGraphNode* RootNode);
|
||||||
|
};
|
||||||
@ -1,112 +0,0 @@
|
|||||||
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
|
|
||||||
|
|
||||||
#include "FComboActionGraphEditorStyle.h"
|
|
||||||
|
|
||||||
#include "Interfaces/IPluginManager.h"
|
|
||||||
#include "Misc/Paths.h"
|
|
||||||
#include "Styling/SlateStyleMacros.h"
|
|
||||||
#include "Styling/SlateStyleRegistry.h"
|
|
||||||
|
|
||||||
|
|
||||||
FComboActionGraphEditorStyle::FComboActionGraphEditorStyle() : FSlateStyleSet("ComboActionGraphEditorStyle")
|
|
||||||
{
|
|
||||||
const FVector2D Icon12x12(12.0f, 12.0f);
|
|
||||||
const FVector2D Icon16x16(16.0f, 16.0f);
|
|
||||||
const FVector2D Icon40x40(40.0f, 40.0f);
|
|
||||||
const FVector2D Icon64x64(64.0f, 64.0f);
|
|
||||||
const FVector2D Icon128x128(128.f, 128.f);
|
|
||||||
const FVector2D Icon200x70(200.f, 70.f);
|
|
||||||
|
|
||||||
this->SetContentRoot(IPluginManager::Get().FindPlugin("ComboInput")->GetBaseDir() / TEXT("Resources"));
|
|
||||||
this->SetCoreContentRoot(IPluginManager::Get().FindPlugin("ComboInput")->GetBaseDir() / TEXT("Content"));
|
|
||||||
|
|
||||||
this->Set("MDSStyleSet.AutoArrange.small", new IMAGE_BRUSH(TEXT("AutoArrangeIcon"), Icon16x16));
|
|
||||||
this->Set("MDSStyleSet.AutoArrange", new IMAGE_BRUSH(TEXT("AutoArrangeIcon"), Icon40x40));
|
|
||||||
this->Set("MDSStyleSet.AutoArrange.large", new IMAGE_BRUSH(TEXT("AutoArrangeIcon"), Icon64x64));
|
|
||||||
|
|
||||||
this->Set("MDSStyleSet.GraphSettings.small", new IMAGE_BRUSH(TEXT("GraphSettings"), Icon16x16));
|
|
||||||
this->Set("MDSStyleSet.GraphSettings", new IMAGE_BRUSH(TEXT("GraphSettings"), Icon40x40));
|
|
||||||
this->Set("MDSStyleSet.GraphSettings.large", new IMAGE_BRUSH(TEXT("GraphSettings"), Icon64x64));
|
|
||||||
|
|
||||||
this->Set("MDSStyleSet.ValidateGraph.small", new IMAGE_BRUSH(TEXT("ValidateGraph"), Icon16x16));
|
|
||||||
this->Set("MDSStyleSet.ValidateGraph", new IMAGE_BRUSH(TEXT("ValidateGraph"), Icon40x40));
|
|
||||||
this->Set("MDSStyleSet.ValidateGraph.large", new IMAGE_BRUSH(TEXT("ValidateGraph"), Icon64x64));
|
|
||||||
|
|
||||||
this->Set("MDSStyleSet.Graph.NodeOverlay", new BOX_BRUSH( TEXT("NodeOverlay"), FMargin(8.0f/64.0f, 3.0f/32.0f, 0, 0) ));
|
|
||||||
this->Set("MDSStyleSet.Graph.PinDocksOverlay", new BOX_BRUSH( TEXT("PinDocksOverlay"), FMargin(8.0f/64.0f, 3.0f/32.0f, 0, 0) ));
|
|
||||||
|
|
||||||
this->Set("MDSStyleSet.Graph.SimpleArrow", new IMAGE_BRUSH(TEXT("SimpleArrow"), Icon16x16));
|
|
||||||
this->Set("MDSStyleSet.Graph.HollowArrow", new IMAGE_BRUSH(TEXT("HollowArrow"), Icon16x16));
|
|
||||||
this->Set("MDSStyleSet.Graph.FancyArrow", new IMAGE_BRUSH(TEXT("FancyArrow"), Icon16x16));
|
|
||||||
this->Set("MDSStyleSet.Graph.Bubble", new IMAGE_BRUSH(TEXT("Bubble"), Icon16x16));
|
|
||||||
|
|
||||||
this->Set("MDSStyleSet.Node.SoftEdges", new BOX_BRUSH( TEXT("NodeSoftCorners") , FMargin(16.f/64.f, 25.f/64.f, 16.f/64.f, 16.f/64.f) ));
|
|
||||||
this->Set("MDSStyleSet.Node.HardEdges", new BOX_BRUSH( TEXT("NodeHardCorners") , FMargin(16.f/64.f, 25.f/64.f, 16.f/64.f, 16.f/64.f) ));
|
|
||||||
|
|
||||||
this->Set("MDSStyleSet.Node.TextSoftEdges", new BOX_BRUSH( TEXT("TextSoftCorners") , FMargin(16.f/64.f, 25.f/64.f, 16.f/64.f, 16.f/64.f) ));
|
|
||||||
this->Set("MDSStyleSet.Node.TextHardEdges", new BOX_BRUSH( TEXT("TextHardCorners") , FMargin(16.f/64.f, 25.f/64.f, 16.f/64.f, 16.f/64.f) ));
|
|
||||||
|
|
||||||
this->Set("MDSStyleSet.Node.IndexCircle", new IMAGE_BRUSH(TEXT("IndexIcon"), Icon16x16));
|
|
||||||
|
|
||||||
this->Set("MDSStyleSet.Icon.OK", new IMAGE_BRUSH(TEXT("OKIcon"), Icon16x16));
|
|
||||||
this->Set("MDSStyleSet.Icon.Error", new IMAGE_BRUSH(TEXT("ErroIcon"), Icon16x16));
|
|
||||||
this->Set("MDSStyleSet.Icon.BulletPoint", new IMAGE_BRUSH(TEXT("CircleBox"), Icon16x16));
|
|
||||||
|
|
||||||
this->Set("MDSStyleSet.Graph.CornerImage", new IMAGE_BRUSH(TEXT("Icon128"), Icon128x128));
|
|
||||||
|
|
||||||
this->Set("MDSStyleSet.Icon.Browse", new IMAGE_BRUSH(TEXT("BrowseIcon"), Icon12x12));
|
|
||||||
this->Set("MDSStyleSet.Icon.Edit", new IMAGE_BRUSH(TEXT("EditIcon"), Icon12x12));
|
|
||||||
|
|
||||||
this->Set("MDSStyleSet.Buttons.Documentation", new IMAGE_BRUSH(TEXT("Documentation"), Icon200x70));
|
|
||||||
this->Set("MDSStyleSet.Buttons.Documentation.small", new IMAGE_BRUSH(TEXT("DocumentationIcon"), Icon12x12));
|
|
||||||
|
|
||||||
this->Set("MDSStyleSet.Node.Icon.large", new IMAGE_BRUSH(TEXT("DialogueNodeIcon"), Icon64x64));
|
|
||||||
this->Set("MDSStyleSet.Node.Icon", new IMAGE_BRUSH(TEXT("DialogueNodeIcon"), Icon16x16));
|
|
||||||
this->Set("MDSStyleSet.Node.Icon.small", new IMAGE_BRUSH(TEXT("DialogueNodeIcon"), Icon12x12));
|
|
||||||
|
|
||||||
this->Set("MDSStyleSet.Icon.Close", new IMAGE_BRUSH(TEXT("CloseIcon"), Icon12x12));
|
|
||||||
this->Set("MDSStyleSet.Icon.SupportDiscord", new IMAGE_BRUSH(TEXT("DiscordIcon"), Icon12x12));
|
|
||||||
this->Set("MDSStyleSet.Icon.HeartIcon", new IMAGE_BRUSH(TEXT("HeartIcon"), Icon12x12));
|
|
||||||
this->Set("MDSStyleSet.Icon.UBIcon", new IMAGE_BRUSH(TEXT("UnrealBucketIcon"), Icon12x12));
|
|
||||||
this->Set("MDSStyleSet.Icon.MoneyIcon", new IMAGE_BRUSH(TEXT("MoneyIcon"), Icon12x12));
|
|
||||||
|
|
||||||
const FButtonStyle MounteaButtonStyle = FButtonStyle()
|
|
||||||
.SetNormal(BOX_BRUSH("RoundedSelection_16x", 4.0f / 16.0f, FLinearColor(1, 1, 1, 0.1f)))
|
|
||||||
.SetHovered(BOX_BRUSH("RoundedSelection_16x", 4.0f / 16.0f, FLinearColor(1, .55f, 0, 0.2f)))
|
|
||||||
.SetPressed(BOX_BRUSH("RoundedSelection_16x", 4.0f / 16.0f, FLinearColor(1, .55f, 0, 0.4f)));
|
|
||||||
|
|
||||||
this->Set("MDSStyleSet.Buttons.Style", MounteaButtonStyle);
|
|
||||||
|
|
||||||
{
|
|
||||||
const FScrollBarStyle ScrollBar = GetWidgetStyle<FScrollBarStyle>( "ScrollBar" );
|
|
||||||
|
|
||||||
FTextBlockStyle NormalText = FTextBlockStyle()
|
|
||||||
.SetFont(DEFAULT_FONT("Regular", FCoreStyle::RegularTextSize))
|
|
||||||
.SetColorAndOpacity(FSlateColor::UseForeground())
|
|
||||||
.SetShadowOffset(FVector2D::ZeroVector)
|
|
||||||
.SetShadowColorAndOpacity(FLinearColor::Black)
|
|
||||||
.SetHighlightColor( FLinearColor( 0.02f, 0.3f, 0.0f ) )
|
|
||||||
.SetHighlightShape( BOX_BRUSH( "TextBlockHighlightShape", FMargin(3.f/8.f) ) );
|
|
||||||
|
|
||||||
FTextBlockStyle NodeTitle = FTextBlockStyle(NormalText)
|
|
||||||
.SetFont( DEFAULT_FONT( "Bold", 14 ) )
|
|
||||||
.SetColorAndOpacity( FLinearColor(230.0f/255.0f,230.0f/255.0f,230.0f/255.0f) )
|
|
||||||
.SetShadowOffset( FVector2D( 2,2 ) )
|
|
||||||
.SetShadowColorAndOpacity( FLinearColor(0.f,0.f,0.f, 0.7f) );
|
|
||||||
this->Set( "MDSStyleSet.NodeTitle", NodeTitle );
|
|
||||||
|
|
||||||
FEditableTextBoxStyle NodeTitleEditableText = FEditableTextBoxStyle()
|
|
||||||
.SetFont(NormalText.Font)
|
|
||||||
.SetBackgroundImageNormal( BOX_BRUSH( "TextBox", FMargin(4.0f/16.0f) ) )
|
|
||||||
.SetBackgroundImageHovered( BOX_BRUSH( "TextBox_Hovered", FMargin(4.0f/16.0f) ) )
|
|
||||||
.SetBackgroundImageFocused( BOX_BRUSH( "TextBox_Hovered", FMargin(4.0f/16.0f) ) )
|
|
||||||
.SetBackgroundImageReadOnly( BOX_BRUSH( "TextBox_ReadOnly", FMargin(4.0f/16.0f) ) )
|
|
||||||
.SetScrollBarStyle( ScrollBar );
|
|
||||||
this->Set( "MDSStyleSet.NodeTitleEditableText", NodeTitleEditableText );
|
|
||||||
|
|
||||||
this->Set( "MDSStyleSet.NodeTitleInlineEditableText", FInlineEditableTextBlockStyle()
|
|
||||||
.SetTextStyle(NodeTitle)
|
|
||||||
.SetEditableTextBoxStyle(NodeTitleEditableText)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "CoreMinimal.h"
|
|
||||||
|
|
||||||
|
|
||||||
class FComboActionGraphEditorStyle final : public FSlateStyleSet
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FComboActionGraphEditorStyle();
|
|
||||||
|
|
||||||
static const FName &GetAppStyleSetName()
|
|
||||||
{
|
|
||||||
static FName StyleSetName(TEXT("ComboActionGraphEditorStyle"));
|
|
||||||
return StyleSetName;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@ -70,6 +70,19 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class FComboInputSlateStyle final : public FSlateStyleSet
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FComboInputSlateStyle();
|
||||||
|
|
||||||
|
static const FName &GetAppStyleSetName()
|
||||||
|
{
|
||||||
|
static FName StyleSetName(TEXT("ComboInputSlateStyle"));
|
||||||
|
return StyleSetName;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class FComboInputEditorModule : public IModuleInterface
|
class FComboInputEditorModule : public IModuleInterface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -79,9 +92,9 @@ public:
|
|||||||
virtual void StartupModule() override;
|
virtual void StartupModule() override;
|
||||||
virtual void ShutdownModule() override{}
|
virtual void ShutdownModule() override{}
|
||||||
|
|
||||||
static EAssetTypeCategories::Type GetInputAssetsCategory() { return FComboInputEditorModule::ComboAssetsCategory; }
|
TSharedPtr<class FSlateStyleSet> GetComboInputEditorStyleSet() const { return this->ComboInputEditorStyleSet; }
|
||||||
|
|
||||||
TSharedPtr<class FSlateStyleSet> ComboActionGraphEditorStyleSet;
|
static EAssetTypeCategories::Type GetInputAssetsCategory() { return FComboInputEditorModule::ComboAssetsCategory; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void RegisterAssetTypeActions(IAssetTools &AssetTools, TSharedRef<IAssetTypeActions> Action)
|
void RegisterAssetTypeActions(IAssetTools &AssetTools, TSharedRef<IAssetTypeActions> Action)
|
||||||
@ -96,7 +109,7 @@ private:
|
|||||||
TArray<TSharedPtr<IAssetTypeActions>> CreatedAssetTypeActions;
|
TArray<TSharedPtr<IAssetTypeActions>> CreatedAssetTypeActions;
|
||||||
|
|
||||||
TSharedPtr<class FSlateStyleSet> ComboInputEditorStyleSet;
|
TSharedPtr<class FSlateStyleSet> ComboInputEditorStyleSet;
|
||||||
|
TSharedPtr<class FSlateStyleSet> ComboActionGraphEditorStyleSet;
|
||||||
TSharedPtr<struct FGraphPanelNodeFactory> ComboActionGraphPanelNodeFactory;
|
TSharedPtr<struct FGraphPanelNodeFactory> ComboActionGraphPanelNodeFactory;
|
||||||
TSharedPtr<class FAssetTypeActions_ComboActionGraph> ComboActionGraphAssetActions;
|
TSharedPtr<class FAssetTypeActions_ComboActionGraph> ComboActionGraphAssetActions;
|
||||||
TSharedPtr<FSlateStyleSet> ComboActionGraphStyleSet;
|
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user