Did a shitload more work. To what end? Not much.

This commit is contained in:
Jamie Greunbaum 2023-09-29 15:11:48 -04:00
parent de9865758a
commit cfe285b94d
22 changed files with 1049 additions and 410 deletions

View File

@ -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);
} }

View File

@ -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());
}
} }
} }

View File

@ -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

View File

@ -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;

View File

@ -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;
} }

View File

@ -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

View File

@ -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;
};

View File

@ -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

View File

@ -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;
};

View File

@ -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:

View File

@ -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

View File

@ -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)
] ]
]; ];
} }

View 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;
};

View File

@ -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;
}

View File

@ -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;
};

View File

@ -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;
}
}

View File

@ -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;
};

View File

@ -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;
}
}

View File

@ -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);
};

View File

@ -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)
);
}
}

View File

@ -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;
};
};

View File

@ -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;
}; };