From cfe285b94deb439c4af5f37ca43b261118745500 Mon Sep 17 00:00:00 2001 From: Jamie Greunbaum Date: Fri, 29 Sep 2023 15:11:48 -0400 Subject: [PATCH] Did a shitload more work. To what end? Not much. --- .../Private/ComboActionGraphSchema.cpp | 22 +- .../Private/ComboInputEditor.cpp | 171 +++++++--- .../Ed/AssetEditor_ComboActionGraph.cpp | 309 ++++++++---------- .../Private/Ed/AssetEditor_ComboActionGraph.h | 19 +- .../Private/Ed/EdComboActionGraphNode.cpp | 3 +- .../FAssetEditorToolbarComboActionGraph.cpp | 44 +++ .../Ed/FAssetEditorToolbarComboActionGraph.h | 22 ++ .../Ed/FComboActionGraphEditorCommands.cpp | 30 ++ .../Ed/FComboActionGraphEditorCommands.h | 19 ++ ...nnectionDrawingPolicy_ComboActionGraph.cpp | 9 +- .../Private/Ed/SEdComboActionGraphNode.cpp | 29 +- .../Ed/SEdComboActionGraphNodeIndex.cpp | 15 +- .../Private/Layout/AssetEditorTabs.h | 11 + ...ActionForceDirectedSolveLayoutStrategy.cpp | 166 ++++++++++ ...boActionForceDirectedSolveLayoutStrategy.h | 30 ++ .../Layout/ComboActionGraphLayoutStrategy.cpp | 95 ++++++ .../Layout/ComboActionGraphLayoutStrategy.h | 42 +++ .../ComboActionTreeSolveLayoutStrategy.cpp | 241 ++++++++++++++ .../ComboActionTreeSolveLayoutStrategy.h | 33 ++ .../Settings/FComboActionGraphEditorStyle.cpp | 112 ------- .../Settings/FComboActionGraphEditorStyle.h | 18 - .../Public/ComboInputEditor.h | 19 +- 22 files changed, 1049 insertions(+), 410 deletions(-) create mode 100644 Source/ComboInputEditor/Private/Ed/FAssetEditorToolbarComboActionGraph.cpp create mode 100644 Source/ComboInputEditor/Private/Ed/FAssetEditorToolbarComboActionGraph.h create mode 100644 Source/ComboInputEditor/Private/Ed/FComboActionGraphEditorCommands.cpp create mode 100644 Source/ComboInputEditor/Private/Ed/FComboActionGraphEditorCommands.h create mode 100644 Source/ComboInputEditor/Private/Layout/AssetEditorTabs.h create mode 100644 Source/ComboInputEditor/Private/Layout/ComboActionForceDirectedSolveLayoutStrategy.cpp create mode 100644 Source/ComboInputEditor/Private/Layout/ComboActionForceDirectedSolveLayoutStrategy.h create mode 100644 Source/ComboInputEditor/Private/Layout/ComboActionGraphLayoutStrategy.cpp create mode 100644 Source/ComboInputEditor/Private/Layout/ComboActionGraphLayoutStrategy.h create mode 100644 Source/ComboInputEditor/Private/Layout/ComboActionTreeSolveLayoutStrategy.cpp create mode 100644 Source/ComboInputEditor/Private/Layout/ComboActionTreeSolveLayoutStrategy.h delete mode 100644 Source/ComboInputEditor/Private/Settings/FComboActionGraphEditorStyle.cpp delete mode 100644 Source/ComboInputEditor/Private/Settings/FComboActionGraphEditorStyle.h diff --git a/Source/ComboInputEditor/Private/ComboActionGraphSchema.cpp b/Source/ComboInputEditor/Private/ComboActionGraphSchema.cpp index b7e5578..140bbf3 100644 --- a/Source/ComboInputEditor/Private/ComboActionGraphSchema.cpp +++ b/Source/ComboInputEditor/Private/ComboActionGraphSchema.cpp @@ -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) { @@ -258,7 +258,7 @@ void UComboActionGraphSchema::GetContextMenuActions(UToolMenu* Menu, UGraphNodeC 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 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(A->GetOwningNode()); UEdComboActionGraphNode *NodeB = Cast(B->GetOwningNode()); @@ -369,35 +369,35 @@ FConnectionDrawingPolicy *UComboActionGraphSchema::CreateConnectionDrawingPolicy return nullptr; } -FLinearColor UComboActionGraphSchema::GetPinTypeColor(const FEdGraphPinType& PinType) const +FLinearColor UComboActionGraphSchema::GetPinTypeColor(const FEdGraphPinType &PinType) const { 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")); 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")); 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")); 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(InTargetNode); + UEdComboActionGraphNode *EdNode = Cast(InTargetNode); switch (InSourcePinDirection) { 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(InTargetNode) != nullptr; } @@ -429,7 +429,7 @@ void UComboActionGraphSchema::ForceVisualizationCacheClear() const CurrentCacheRefreshID++; } -void UComboActionGraphSchema::CreateDefaultNodesForGraph(UEdGraph& Graph) const +void UComboActionGraphSchema::CreateDefaultNodesForGraph(UEdGraph &Graph) const { Super::CreateDefaultNodesForGraph(Graph); } diff --git a/Source/ComboInputEditor/Private/ComboInputEditor.cpp b/Source/ComboInputEditor/Private/ComboInputEditor.cpp index 66214d7..0a62362 100644 --- a/Source/ComboInputEditor/Private/ComboInputEditor.cpp +++ b/Source/ComboInputEditor/Private/ComboInputEditor.cpp @@ -7,12 +7,12 @@ #include "ToolMenuSection.h" #include "AssetTypeActions/AssetTypeActions_DataAsset.h" +#include "Ed/AssetEditor_ComboActionGraph.h" #include "Ed/EdComboActionGraphEdge.h" #include "Ed/EdComboActionGraphNode.h" #include "Ed/SEdComboActionGraphEdge.h" #include "Ed/SEdComboActionGraphNode.h" #include "Interfaces/IPluginManager.h" -#include "Settings/FComboActionGraphEditorStyle.h" #include "Styling/SlateStyle.h" #include "Styling/SlateStyleMacros.h" #include "Styling/SlateStyleRegistry.h" @@ -66,15 +66,15 @@ public: virtual void OpenAssetEditor(const TArray &InObjects, TSharedPtr EditWithinLevelEditor = TSharedPtr()) override { - //const EToolkitMode::Type Mode = EditWithinLevelEditor.IsValid() ? EToolkitMode::WorldCentric : EToolkitMode::Standalone; - //for (auto ObjIt = InObjects.CreateConstIterator(); ObjIt; ObjIt++) - //{ - // if (UComboActionGraph *Graph = Cast(*ObjIt)) - // { - // TSharedRef NewGraphEditor(new FAssetEditor_ComboActionGraph()); - // NewGraphEditor->InitMounteaDialogueGraphAssetEditor(Mode, EditWithinLevelEditor, Graph); - // } - //} + const EToolkitMode::Type Mode = EditWithinLevelEditor.IsValid() ? EToolkitMode::WorldCentric : EToolkitMode::Standalone; + for (auto ObjIt = InObjects.CreateConstIterator(); ObjIt; ObjIt++) + { + if (UComboActionGraph *Graph = Cast(*ObjIt)) + { + TSharedRef NewGraphEditor(new FAssetEditor_ComboActionGraph()); + 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: - FComboInputSlateStyle() : FSlateStyleSet("ComboInputEditor") + this->SetParentStyleName(FAppStyle::GetAppStyleSetName()); + + 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->SetCoreContentRoot(FPaths::EngineContentDir() / TEXT("Slate")); + this->Set("MDSStyleSet.GraphSettings.small", new IMAGE_BRUSH(TEXT("GraphSettings"), Icon16)); + 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 - static const FVector2D Icon16 = FVector2D(16.0f, 16.0f); - static const FVector2D Icon64 = FVector2D(64.0f, 64.0f); + this->Set("MDSStyleSet.ValidateGraph.small", new IMAGE_BRUSH(TEXT("ValidateGraph"), Icon16)); + this->Set("MDSStyleSet.ValidateGraph", new IMAGE_BRUSH(TEXT("ValidateGraph"), Icon40)); + 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("ComboInputIcon_Large", new IMAGE_BRUSH_SVG("Icons/ComboInput_64", Icon64)); + 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("ClassIcon.ComboAction", new IMAGE_BRUSH_SVG("Icons/ComboAction_16", Icon16)); - this->Set("ClassThumbnail.ComboAction", new IMAGE_BRUSH_SVG("Icons/ComboAction_64", Icon64)); + this->Set("MDSStyleSet.Graph.SimpleArrow", new IMAGE_BRUSH(TEXT("SimpleArrow"), Icon16)); + 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("ClassThumbnail.ComboSequenceNode", new IMAGE_BRUSH_SVG("Icons/ComboSequenceNode_64", Icon64)); + 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("ClassIcon.ComboInputAsset", new IMAGE_BRUSH_SVG("Icons/ComboInputAsset_16", Icon16)); - this->Set("ClassThumbnail.ComboInputAsset", new IMAGE_BRUSH_SVG("Icons/ComboInputAsset_64", Icon64)); + 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"), 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("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() @@ -231,33 +323,12 @@ void FComboInputEditorModule::StartupModule() // Combo Action Graph { - // Make a new style set for Combo Action Graph - this->ComboActionGraphEditorStyleSet = MakeShared(); - FSlateStyleRegistry::RegisterSlateStyle(*this->ComboActionGraphEditorStyleSet.Get()); - this->ComboActionGraphPanelNodeFactory = MakeShareable(new FComboActionGraphPanelNodeFactory()); FEdGraphUtilities::RegisterVisualNodeFactory(this->ComboActionGraphPanelNodeFactory); // Register asset actions this->ComboActionGraphAssetActions = MakeShared(); this->RegisterAssetTypeActions(AssetTools, this->ComboActionGraphAssetActions.ToSharedRef()); - - // Register thumbnails and icons - this->ComboActionGraphStyleSet = MakeShareable(new FSlateStyleSet("ComboActionGraphStyleSet")); - const TSharedPtr 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()); - } } } diff --git a/Source/ComboInputEditor/Private/Ed/AssetEditor_ComboActionGraph.cpp b/Source/ComboInputEditor/Private/Ed/AssetEditor_ComboActionGraph.cpp index d80fb93..96f31bc 100644 --- a/Source/ComboInputEditor/Private/Ed/AssetEditor_ComboActionGraph.cpp +++ b/Source/ComboInputEditor/Private/Ed/AssetEditor_ComboActionGraph.cpp @@ -1,4 +1,4 @@ -// Copyright Dominik Pavlicek 2023. All Rights Reserved. +// ©2023 Batty Bovine Productions, LLC. All Rights Reserved. #include "AssetEditor_ComboActionGraph.h" @@ -11,19 +11,18 @@ #include "ComboInputEditor.h" #include "ComboActionGraph.h" #include "Nodes/ComboActionGraphNode.h" -//#include "EditorCommands/FComboActionGraphEditorCommands.h" -//#include "AssetEditor/FAssetEditorToolbarComboActionGraph.h" #include "Ed/EdComboActionGraph.h" #include "Ed/EdComboActionGraphEdge.h" #include "Ed/EdComboActionGraphNode.h" -#include "Settings/FComboActionGraphEditorStyle.h" +#include "Ed/FAssetEditorToolbarComboActionGraph.h" +#include "Ed/FComboActionGraphEditorCommands.h" #include "ComboActionGraphSchema.h" -//#include "Layout/AssetEditorTabs.h" //#include "Helpers/ComboActionGraphHelpers.h" //#include "Helpers/ComboActionSystemEditorBFC.h" -//#include "Layout/ForceDirectedSolveLayoutStrategy.h" -//#include "Layout/ComboActionGraphLayoutStrategy.h" -//#include "Layout/TreeSolveLayoutStrategy.h" +#include "Layout/AssetEditorTabs.h" +#include "Layout/ComboActionGraphLayoutStrategy.h" +#include "Layout/ComboActionForceDirectedSolveLayoutStrategy.h" +#include "Layout/ComboActionTreeSolveLayoutStrategy.h" //#include "Popups/MDSPopup_GraphValidation.h" //#include "Search/ComboActionSearchUtils.h" #include "Settings/ComboActionGraphEditorSettings.h" @@ -36,9 +35,9 @@ DEFINE_LOG_CATEGORY(LogAssetEditorComboActionGraph); #pragma region ConstantNames const FName ComboActionGraphEditorAppName = FName(TEXT("ComboActionGraphEditorApp")); -//const FName FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID(TEXT("ComboActionGraphProperty")); -//const FName FAssetEditorTabs_ComboActionGraph::ViewportID(TEXT("Viewport")); -//const FName FAssetEditorTabs_ComboActionGraph::SearchToolbarID(TEXT("Search")); +const FName FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID(TEXT("ComboActionGraphProperty")); +const FName FAssetEditorTabs_ComboActionGraph::ViewportID(TEXT("Viewport")); +const FName FAssetEditorTabs_ComboActionGraph::SearchToolbarID(TEXT("Search")); #pragma endregion @@ -55,11 +54,11 @@ FAssetEditor_ComboActionGraph::~FAssetEditor_ComboActionGraph() this->EditingGraph = nullptr; UPackage::PackageSavedWithContextEvent.Remove(this->OnPackageSavedDelegateHandle); - //FGenericCommands::Unregister(); - //FGraphEditorCommands::Unregister(); - //FComboActionGraphEditorCommands::Unregister(); + FGenericCommands::Unregister(); + FGraphEditorCommands::Unregister(); + FComboActionGraphEditorCommands::Unregister(); - //this->ToolbarBuilder.Reset(); + this->ToolbarBuilder.Reset(); } 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->CreateEdGraph(); - //FGenericCommands::Register(); - //FGraphEditorCommands::Register(); - //FComboActionGraphEditorCommands::Register(); + FGenericCommands::Register(); + FGraphEditorCommands::Register(); + FComboActionGraphEditorCommands::Register(); - //if (!this->ToolbarBuilder.IsValid()) - //{ - // this->ToolbarBuilder = MakeShareable(new FAssetEditorToolbarComboActionGraph(SharedThis(this))); - //} + if (!this->ToolbarBuilder.IsValid()) + { + this->ToolbarBuilder = MakeShareable(new FAssetEditorToolbarComboActionGraph(SharedThis(this))); + } this->BindCommands(); this->CreateInternalWidgets(); - //TSharedPtr ToolbarExtender = MakeShareable(new FExtender); - //this->ToolbarBuilder->AddMounteaDialogueGraphToolbar(ToolbarExtender); + TSharedPtr ToolbarExtender = MakeShareable(new FExtender); + this->ToolbarBuilder->AddComboActionGraphToolbar(ToolbarExtender); // Layout - //const TSharedRef StandaloneDefaultLayout = FTabManager::NewLayout("Standalone_MounteaDialogueGraphEditor_LayoutV0.3") - // ->AddArea - // ( - // FTabManager::NewPrimaryArea()->SetOrientation(Orient_Vertical) - // ->Split - // ( - // FTabManager::NewSplitter()->SetOrientation(Orient_Horizontal)->SetSizeCoefficient(0.9f) - // ->Split - // ( - // FTabManager::NewStack() - // ->SetSizeCoefficient(3.f) - // ->AddTab(FAssetEditorTabs_MounteaDialogueGraph::ViewportID, ETabState::OpenedTab)->SetHideTabWell(true) - // ) - // ->Split - // ( - // FTabManager::NewSplitter()->SetOrientation(Orient_Vertical) - // ->Split - // ( - // FTabManager::NewSplitter()->SetOrientation(Orient_Vertical) - // ->Split - // ( - // FTabManager::NewStack() - // ->SetSizeCoefficient(0.9f) - // ->AddTab(FAssetEditorTabs_MounteaDialogueGraph::MounteaDialogueGraphPropertyID, ETabState::OpenedTab)->SetHideTabWell(true) - // ) + const TSharedRef StandaloneDefaultLayout = FTabManager::NewLayout("Standalone_ComboActionGraphEditor_LayoutV0.3") + ->AddArea + ( + FTabManager::NewPrimaryArea()->SetOrientation(EOrientation::Orient_Vertical) + ->Split + ( + FTabManager::NewSplitter()->SetOrientation(EOrientation::Orient_Horizontal)->SetSizeCoefficient(0.9f) + ->Split + ( + FTabManager::NewStack() + ->SetSizeCoefficient(3.f) + ->AddTab(FAssetEditorTabs_ComboActionGraph::ViewportID, ETabState::OpenedTab)->SetHideTabWell(true) + ) + ->Split + ( + FTabManager::NewSplitter()->SetOrientation(EOrientation::Orient_Vertical) + ->Split + ( + FTabManager::NewSplitter()->SetOrientation(EOrientation::Orient_Vertical) + ->Split + ( + FTabManager::NewStack() + ->SetSizeCoefficient(0.9f) + ->AddTab(FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID, ETabState::OpenedTab)->SetHideTabWell(true) + ) - // ->Split - // ( - // FTabManager::NewStack() - // ->SetSizeCoefficient(0.3f) - // ->AddTab(FAssetEditorTabs_MounteaDialogueGraph::SearchToolbarID, ETabState::OpenedTab) - // ) - // ) - // ) - // ) - // ); + ->Split + ( + FTabManager::NewStack() + ->SetSizeCoefficient(0.3f) + ->AddTab(FAssetEditorTabs_ComboActionGraph::SearchToolbarID, ETabState::OpenedTab) + ) + ) + ) + ) + ); - //const bool bCreateDefaultStandaloneMenu = true; - //const bool bCreateDefaultToolbar = true; - //FAssetEditorToolkit::InitAssetEditor - //( - // Mode, - // InitToolkitHost, - // ComboActionGraphEditorAppName, - // StandaloneDefaultLayout, - // bCreateDefaultStandaloneMenu, - // bCreateDefaultToolbar, - // EditingGraph, - // false - // ); + const bool bCreateDefaultStandaloneMenu = true; + const bool bCreateDefaultToolbar = true; + FAssetEditorToolkit::InitAssetEditor + ( + Mode, + InitToolkitHost, + ComboActionGraphEditorAppName, + StandaloneDefaultLayout, + bCreateDefaultStandaloneMenu, + bCreateDefaultToolbar, + EditingGraph, + false + ); this->RegenerateMenusAndToolbars(); } @@ -150,20 +149,20 @@ UComboActionGraphEditorSettings *FAssetEditor_ComboActionGraph::GetSettings() co void FAssetEditor_ComboActionGraph::RegisterTabSpawners(const TSharedRef &InTabManager) { - //WorkspaceMenuCategory = InTabManager->AddLocalWorkspaceMenuCategory(LOCTEXT("WorkspaceMenu_MounteaDialogueTreeEditor", "Mountea Dialogue Tree Editor")); - //auto WorkspaceMenuCategoryRef = WorkspaceMenuCategory.ToSharedRef(); + this->WorkspaceMenuCategory = InTabManager->AddLocalWorkspaceMenuCategory(LOCTEXT("WorkspaceMenu_ComboActionTreeEditor", "Combo Action Tree Editor")); + auto WorkspaceMenuCategoryRef = this->WorkspaceMenuCategory.ToSharedRef(); - //FAssetEditorToolkit::RegisterTabSpawners(InTabManager); + FAssetEditorToolkit::RegisterTabSpawners(InTabManager); - //InTabManager->RegisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ViewportID, FOnSpawnTab::CreateSP(this, &FAssetEditor_ComboActionGraph::SpawnTab_Viewport)) - // .SetDisplayName(LOCTEXT("GraphCanvasTab", "Viewport")) - // .SetGroup(WorkspaceMenuCategoryRef) - // .SetIcon(FSlateIcon(FAppStyle::GetAppStyleSetName(), "GraphEditor.EventGraph_16x")); + InTabManager->RegisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ViewportID, FOnSpawnTab::CreateSP(this, &FAssetEditor_ComboActionGraph::SpawnTab_Viewport)) + .SetDisplayName(LOCTEXT("GraphCanvasTab", "Viewport")) + .SetGroup(WorkspaceMenuCategoryRef) + .SetIcon(FSlateIcon(FAppStyle::GetAppStyleSetName(), "GraphEditor.EventGraph_16x")); - //InTabManager->RegisterTabSpawner(FAssetEditorTabs_ComboActionGraph::MounteaDialogueGraphPropertyID, FOnSpawnTab::CreateSP(this, &FAssetEditor_ComboActionGraph::SpawnTab_Details)) - // .SetDisplayName(LOCTEXT("DetailsTab", "Property")) - // .SetGroup(WorkspaceMenuCategoryRef) - // .SetIcon(FSlateIcon(FAppStyle::GetAppStyleSetName(), "LevelEditor.Tabs.Details")); + InTabManager->RegisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID, FOnSpawnTab::CreateSP(this, &FAssetEditor_ComboActionGraph::SpawnTab_Details)) + .SetDisplayName(LOCTEXT("DetailsTab", "Property")) + .SetGroup(WorkspaceMenuCategoryRef) + .SetIcon(FSlateIcon(FAppStyle::GetAppStyleSetName(), "LevelEditor.Tabs.Details")); //InTabManager->RegisterTabSpawner(FAssetEditorTabs_ComboActionGraph::SearchToolbarID, FOnSpawnTab::CreateSP(this, &FAssetEditor_ComboActionGraph::SpawnTab_Search)) // .SetDisplayName(LOCTEXT("SearchTab", "Search")) @@ -173,16 +172,16 @@ void FAssetEditor_ComboActionGraph::RegisterTabSpawners(const TSharedRef& InTabManager) { - //FAssetEditorToolkit::UnregisterTabSpawners(InTabManager); + FAssetEditorToolkit::UnregisterTabSpawners(InTabManager); - //InTabManager->UnregisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ViewportID); - //InTabManager->UnregisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID); - //InTabManager->UnregisterTabSpawner(FAssetEditorTabs_ComboActionGraph::SearchToolbarID); + InTabManager->UnregisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ViewportID); + InTabManager->UnregisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID); + 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) { @@ -305,7 +304,7 @@ TSharedRef FAssetEditor_ComboActionGraph::CreateViewportWidget() const FComboInputEditorModule &Module = FModuleManager::GetModuleChecked("ComboInputEditor"); FGraphAppearanceInfo AppearanceInfo; 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."); this->CreateCommandList(); @@ -326,25 +325,19 @@ TSharedRef FAssetEditor_ComboActionGraph::CreateViewportWidget() void FAssetEditor_ComboActionGraph::BindCommands() { - //this->ToolkitCommands->MapAction - //( - // FComboActionGraphEditorCommands::Get().AutoArrange, - // FExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::AutoArrange), - // FCanExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::CanAutoArrange) - //); + this->ToolkitCommands->MapAction + ( + FComboActionGraphEditorCommands::Get().AutoArrange, + FExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::AutoArrange), + FCanExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::CanAutoArrange) + ); - //this->ToolkitCommands->MapAction - //( - // FComboActionGraphEditorCommands::Get().ValidateGraph, - // FExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::ValidateGraph), - // FCanExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::CanValidateGraph) - //); - // - //this->ToolkitCommands->MapAction - //( - // FComboActionGraphEditorCommands::Get().FindInDialogue, - // FExecuteAction::CreateLambda([this] { this->SummonSearchUI(); }) - //); + this->ToolkitCommands->MapAction + ( + FComboActionGraphEditorCommands::Get().ValidateGraph, + FExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::ValidateGraph), + FCanExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::CanValidateGraph) + ); } void FAssetEditor_ComboActionGraph::CreateEdGraph() @@ -392,13 +385,13 @@ void FAssetEditor_ComboActionGraph::CreateCommandList() this->GraphEditorCommands = MakeShareable(new FUICommandList); - //this->GraphEditorCommands->MapAction(FComboActionGraphEditorCommands::Get().AutoArrange, - // FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::AutoArrange), - // FCanExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CanAutoArrange)); + this->GraphEditorCommands->MapAction(FComboActionGraphEditorCommands::Get().AutoArrange, + FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::AutoArrange), + FCanExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CanAutoArrange)); - //this->GraphEditorCommands->MapAction(FComboActionGraphEditorCommands::Get().ValidateGraph, - // FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::ValidateGraph), - // FCanExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CanValidateGraph)); + this->GraphEditorCommands->MapAction(FComboActionGraphEditorCommands::Get().ValidateGraph, + FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::ValidateGraph), + FCanExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CanValidateGraph)); this->GraphEditorCommands->MapAction(FGenericCommands::Get().SelectAll, FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::SelectAllNodes), @@ -434,12 +427,6 @@ void FAssetEditor_ComboActionGraph::CreateCommandList() FExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::OnRenameNode), FCanExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::CanRenameNodes) ); - - //this->ToolkitCommands->MapAction - //( - // FComboActionGraphEditorCommands::Get().FindInDialogue, - // FExecuteAction::CreateLambda([this] { SummonSearchUI(); }) - //); } TSharedPtr FAssetEditor_ComboActionGraph::GetCurrentGraphEditor() const @@ -473,20 +460,6 @@ void FAssetEditor_ComboActionGraph::RebuildComboActionGraph() EdGraph->RebuildComboActionGraph(); } -void FAssetEditor_ComboActionGraph::SummonSearchUI(FString NewSearch, bool bSelectFirstResult) -{ - //TSharedPtr 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() { TSharedPtr CurrentGraphEditor = this->GetCurrentGraphEditor(); @@ -625,7 +598,7 @@ void FAssetEditor_ComboActionGraph::CopySelectedNodes() for (FGraphPanelSelectionSet::TIterator SelectedIter(SelectedNodes); SelectedIter; ++SelectedIter) { - UEdGraphNode* Node = Cast(*SelectedIter); + UEdGraphNode *Node = Cast(*SelectedIter); if (Node == nullptr) { SelectedIter.RemoveCurrent(); @@ -685,7 +658,7 @@ void FAssetEditor_ComboActionGraph::PasteNodesHere(const FVector2D& Location) return; } // Select the newly pasted stuff - UEdGraph* EdGraph = CurrentGraphEditor->GetCurrentGraph(); + UEdGraph *EdGraph = CurrentGraphEditor->GetCurrentGraph(); { const FScopedTransaction Transaction(FGenericCommands::Get().Paste->GetDescription()); @@ -748,7 +721,7 @@ void FAssetEditor_ComboActionGraph::PasteNodesHere(const FVector2D& Location) // Update UI CurrentGraphEditor->NotifyGraphChanged(); - UObject* GraphOwner = EdGraph->GetOuter(); + UObject *GraphOwner = EdGraph->GetOuter(); if (GraphOwner) { GraphOwner->PostEditChange(); @@ -802,28 +775,28 @@ void FAssetEditor_ComboActionGraph::AutoArrange() EdGraph->Modify(true); - //UComboActionGraphLayoutStrategy *LayoutStrategy = nullptr; - //switch (this->ComboActionGraphEditorSettings->GetAutoLayoutStrategy()) - //{ - // case EComboActionAutoLayoutStrategyType::Tree: - // LayoutStrategy = NewObject(EdGraph, UTreeSolveLayoutStrategy::StaticClass()); - // break; - // case EComboActionAutoLayoutStrategyType::ForceDirected: - // LayoutStrategy = NewObject(EdGraph, UForceDirectedSolveLayoutStrategy::StaticClass()); - // break; - // default: - // break; - //} + UComboActionGraphLayoutStrategy *LayoutStrategy = nullptr; + switch (this->ComboActionGraphEditorSettings->GetAutoLayoutStrategy()) + { + case EComboActionAutoLayoutStrategyType::Tree: + LayoutStrategy = NewObject(EdGraph, UComboActionTreeSolveLayoutStrategy::StaticClass()); + break; + case EComboActionAutoLayoutStrategyType::ForceDirected: + LayoutStrategy = NewObject(EdGraph, UComboActionForceDirectedSolveLayoutStrategy::StaticClass()); + break; + default: + break; + } - //if (LayoutStrategy != nullptr) - //{ - // LayoutStrategy->Layout(EdGraph); - // LayoutStrategy->ConditionalBeginDestroy(); - //} - //else - //{ - // LOG_ERROR(TEXT("[AutoArrange] LayoutStrategy is null.")); - //} + if (LayoutStrategy != nullptr) + { + LayoutStrategy->Layout(EdGraph); + LayoutStrategy->ConditionalBeginDestroy(); + } + else + { + UE_LOG(LogAssetEditorComboActionGraph, Error, TEXT("[AutoArrange] LayoutStrategy is null.")); + } } bool FAssetEditor_ComboActionGraph::CanAutoArrange() const @@ -931,7 +904,7 @@ void FAssetEditor_ComboActionGraph::OnFinishedChangingProperties(const FProperty TSharedRef FAssetEditor_ComboActionGraph::SpawnTab_Viewport(const FSpawnTabArgs &Args) { - //check(Args.GetTabId() == FAssetEditorTabs_ComboActionGraph::ViewportID); + check(Args.GetTabId() == FAssetEditorTabs_ComboActionGraph::ViewportID); TSharedRef SpawnedTab = SNew(SDockTab) .Label(LOCTEXT("ViewportTab_Title", "Viewport")); @@ -946,7 +919,7 @@ TSharedRef FAssetEditor_ComboActionGraph::SpawnTab_Viewport(const FSpa TSharedRef FAssetEditor_ComboActionGraph::SpawnTab_Details(const FSpawnTabArgs& Args) { - //check(Args.GetTabId() == FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID); + check(Args.GetTabId() == FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID); auto DockTab = SNew(SDockTab) .Label(LOCTEXT("Details_Title", "Property")) @@ -958,21 +931,5 @@ TSharedRef FAssetEditor_ComboActionGraph::SpawnTab_Details(const FSpaw return DockTab; } -TSharedRef 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 diff --git a/Source/ComboInputEditor/Private/Ed/AssetEditor_ComboActionGraph.h b/Source/ComboInputEditor/Private/Ed/AssetEditor_ComboActionGraph.h index 233a203..2813f7b 100644 --- a/Source/ComboInputEditor/Private/Ed/AssetEditor_ComboActionGraph.h +++ b/Source/ComboInputEditor/Private/Ed/AssetEditor_ComboActionGraph.h @@ -1,8 +1,10 @@ -// Copyright Dominik Pavlicek 2023. All Rights Reserved. +// ©2023 Batty Bovine Productions, LLC. All Rights Reserved. #pragma once -//#include "Search/SComboActionSearch.h" +#include "CoreMinimal.h" + +#include "Toolkits/AssetEditorToolkit.h" DECLARE_LOG_CATEGORY_EXTERN(LogAssetEditorComboActionGraph, Log, All); @@ -26,7 +28,7 @@ public: virtual void RegisterTabSpawners(const TSharedRef &InTabManager) override; virtual void UnregisterTabSpawners(const TSharedRef &InTabManager) override; - virtual bool CloseWindow() override; + virtual bool CloseWindow(EAssetEditorCloseReason InCloseReason) override; // End of IToolkit interface #pragma endregion @@ -47,7 +49,7 @@ public: #pragma region Toolbar void UpdateToolbar(); - //TSharedPtr GetToolbarBuilder() { return ToolbarBuilder; } + TSharedPtr GetToolbarBuilder() { return this->ToolbarBuilder; } void RegisterToolbarTab(const TSharedRef &InTabManager); #pragma endregion @@ -94,8 +96,6 @@ private: void RebuildComboActionGraph(); - void SummonSearchUI(FString NewSearch = FString(), bool bSelectFirstResult = false); - #pragma region GraphEditorCommands void SelectAllNodes(); @@ -132,7 +132,7 @@ private: void OnFinishedChangingProperties(const FPropertyChangedEvent &PropertyChangedEvent); - //void OnPackageSaved(const FString &PackageFileName, UObject *Outer); + void OnPackageSaved(const FString &PackageFileName, UObject *Outer); #pragma endregion @@ -142,21 +142,20 @@ private: TSharedRef SpawnTab_Viewport(const FSpawnTabArgs &Args); TSharedRef SpawnTab_Details(const FSpawnTabArgs &Args); - TSharedRef SpawnTab_Search(const FSpawnTabArgs &Args); class UComboActionGraphEditorSettings *ComboActionGraphEditorSettings; class UComboActionGraph *EditingGraph; //Toolbar - //TSharedPtr ToolbarBuilder; + TSharedPtr ToolbarBuilder; /** Handle to the registered OnPackageSave delegate */ FDelegateHandle OnPackageSavedDelegateHandle; TSharedPtr ViewportWidget; TSharedPtr PropertyWidget; - //TSharedPtr FindResultsView; + //TSharedPtr FindResultsView; /** The command list for this editor */ TSharedPtr GraphEditorCommands; diff --git a/Source/ComboInputEditor/Private/Ed/EdComboActionGraphNode.cpp b/Source/ComboInputEditor/Private/Ed/EdComboActionGraphNode.cpp index 97d5d3e..fe64a2b 100644 --- a/Source/ComboInputEditor/Private/Ed/EdComboActionGraphNode.cpp +++ b/Source/ComboInputEditor/Private/Ed/EdComboActionGraphNode.cpp @@ -6,7 +6,6 @@ #include "Helpers/ComboActionEditorBFC.h" #include "Nodes/ComboActionGraphNode.h" #include "Settings/ComboActionGraphEditorSettings.h" -#include "Settings/FComboActionGraphEditorStyle.h" #define LOCTEXT_NAMESPACE "UEdComboActionGraphNode" @@ -164,7 +163,7 @@ FText UEdComboActionGraphNode::GetTooltipText() 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(); return Icon; } diff --git a/Source/ComboInputEditor/Private/Ed/FAssetEditorToolbarComboActionGraph.cpp b/Source/ComboInputEditor/Private/Ed/FAssetEditorToolbarComboActionGraph.cpp new file mode 100644 index 0000000..d5848b8 --- /dev/null +++ b/Source/ComboInputEditor/Private/Ed/FAssetEditorToolbarComboActionGraph.cpp @@ -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 Extender) +{ + check(this->ComboActionGraphEditor.IsValid()); + TSharedPtr ComboActionGraphEditorPtr = this->ComboActionGraphEditor.Pin(); + + TSharedPtr 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 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 diff --git a/Source/ComboInputEditor/Private/Ed/FAssetEditorToolbarComboActionGraph.h b/Source/ComboInputEditor/Private/Ed/FAssetEditorToolbarComboActionGraph.h new file mode 100644 index 0000000..8748775 --- /dev/null +++ b/Source/ComboInputEditor/Private/Ed/FAssetEditorToolbarComboActionGraph.h @@ -0,0 +1,22 @@ +// ©2023 Batty Bovine Productions, LLC. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" + + +class FAssetEditorToolbarComboActionGraph : public TSharedFromThis +{ +public: + FAssetEditorToolbarComboActionGraph(TSharedPtr InComboActionGraphEditor) + : ComboActionGraphEditor(InComboActionGraphEditor) {} + + void AddComboActionGraphToolbar(TSharedPtr Extender); + +private: + void FillComboActionGraphToolbar(FToolBarBuilder &ToolbarBuilder); + +protected: + TWeakPtr ComboActionGraphEditor; + +}; diff --git a/Source/ComboInputEditor/Private/Ed/FComboActionGraphEditorCommands.cpp b/Source/ComboInputEditor/Private/Ed/FComboActionGraphEditorCommands.cpp new file mode 100644 index 0000000..167fcfb --- /dev/null +++ b/Source/ComboInputEditor/Private/Ed/FComboActionGraphEditorCommands.cpp @@ -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 diff --git a/Source/ComboInputEditor/Private/Ed/FComboActionGraphEditorCommands.h b/Source/ComboInputEditor/Private/Ed/FComboActionGraphEditorCommands.h new file mode 100644 index 0000000..8555871 --- /dev/null +++ b/Source/ComboInputEditor/Private/Ed/FComboActionGraphEditorCommands.h @@ -0,0 +1,19 @@ +// ©2023 Batty Bovine Productions, LLC. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" + +class FComboActionGraphEditorCommands : public TCommands +{ +public: + FComboActionGraphEditorCommands() + : TCommands("ComboActionGraphEditor", NSLOCTEXT("Contexts", "ComboActionGraphEditor", "Combo Action Graph Editor"), NAME_None, FAppStyle::GetAppStyleSetName()) + { + } + + TSharedPtr AutoArrange; + TSharedPtr ValidateGraph; + + virtual void RegisterCommands() override; +}; \ No newline at end of file diff --git a/Source/ComboInputEditor/Private/Ed/FConnectionDrawingPolicy_ComboActionGraph.cpp b/Source/ComboInputEditor/Private/Ed/FConnectionDrawingPolicy_ComboActionGraph.cpp index eacaf84..8f3239d 100644 --- a/Source/ComboInputEditor/Private/Ed/FConnectionDrawingPolicy_ComboActionGraph.cpp +++ b/Source/ComboInputEditor/Private/Ed/FConnectionDrawingPolicy_ComboActionGraph.cpp @@ -6,7 +6,6 @@ #include "Ed/EdComboActionGraphEdge.h" #include "Ed/EdComboActionGraphNode.h" #include "Settings/ComboActionGraphEditorSettings.h" -#include "Settings/FComboActionGraphEditorStyle.h" DEFINE_LOG_CATEGORY(LogConnectionDrawingPolicy_ComboActionGraph); @@ -21,16 +20,16 @@ FConnectionDrawingPolicy_ComboActionGraph::FConnectionDrawingPolicy_ComboActionG switch (GraphEditorSettings->GetArrowType()) { case EComboActionArrowType::SimpleArrow: - ArrowImage = ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush(TEXT("MDSStyleSet.Graph.SimpleArrow")); + ArrowImage = ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush(TEXT("MDSStyleSet.Graph.SimpleArrow")); break; case EComboActionArrowType::HollowArrow: - ArrowImage = ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush(TEXT("MDSStyleSet.Graph.HollowArrow")); + ArrowImage = ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush(TEXT("MDSStyleSet.Graph.HollowArrow")); break; case EComboActionArrowType::FancyArrow: - ArrowImage = ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush(TEXT("MDSStyleSet.Graph.FancyArrow")); + ArrowImage = ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush(TEXT("MDSStyleSet.Graph.FancyArrow")); break; case EComboActionArrowType::Bubble: - ArrowImage = ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush(TEXT("MDSStyleSet.Graph.Bubble")); + ArrowImage = ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush(TEXT("MDSStyleSet.Graph.Bubble")); break; case EComboActionArrowType::None: default: diff --git a/Source/ComboInputEditor/Private/Ed/SEdComboActionGraphNode.cpp b/Source/ComboInputEditor/Private/Ed/SEdComboActionGraphNode.cpp index 2f31e9a..30a1f91 100644 --- a/Source/ComboInputEditor/Private/Ed/SEdComboActionGraphNode.cpp +++ b/Source/ComboInputEditor/Private/Ed/SEdComboActionGraphNode.cpp @@ -16,7 +16,6 @@ #include "Blueprint/UserWidget.h" #include "ComboActionGraph.h" #include "Settings/ComboActionGraphEditorSettings.h" -#include "Settings/FComboActionGraphEditorStyle.h" #include "Widgets/Layout/SGridPanel.h" #include "Widgets/Layout/SScaleBox.h" @@ -86,13 +85,13 @@ protected: switch (GraphEditorSettings->GetNodeType()) { case EComboActionNodeType::SoftCorners: - return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush("MDSStyleSet.Node.TextSoftEdges"); + return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush("MDSStyleSet.Node.TextSoftEdges"); 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 { FComboInputEditorModule &ComboInputEditorModule = FComboInputEditorModule::Get(); - return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush("MDSStyleSet.Node.TextSoftEdges"); + return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush("MDSStyleSet.Node.TextSoftEdges"); } BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION @@ -160,7 +159,7 @@ void SEdComboActionGraphNode::UpdateGraphNode() this->ContentScale.Bind(this, &SGraphNode::GetContentScale); 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) .SlotOffset(TAttribute(this, &SEdComboActionGraphNode::GetIndexSlotOffset)) .SlotSize(TAttribute(this, &SEdComboActionGraphNode::GetIndexSlotSize)) @@ -382,7 +381,7 @@ void SEdComboActionGraphNode::UpdateGraphNode() .AutoHeight() [ SAssignNew(InlineEditableText, SInlineEditableTextBlock) - .Style(ComboInputEditorModule.ComboActionGraphEditorStyleSet.Get(), "MDSStyleSet.NodeTitleInlineEditableText") + .Style(ComboInputEditorModule.GetComboInputEditorStyleSet().Get(), "MDSStyleSet.NodeTitleInlineEditableText") .Text(NodeTitle.Get(), &SNodeTitle::GetHeadTitle) .OnVerifyTextChanged( this, &SEdComboActionGraphNode::OnVerifyNameTextChanged) @@ -1004,13 +1003,13 @@ const FSlateBrush *SEdComboActionGraphNode::GetNodeTypeBrush() const switch (GraphEditorSettings->GetNodeType()) { case EComboActionNodeType::SoftCorners: - return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush("MDSStyleSet.Node.SoftEdges"); + return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush("MDSStyleSet.Node.SoftEdges"); 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 @@ -1021,13 +1020,13 @@ const FSlateBrush *SEdComboActionGraphNode::GetTextNodeTypeBrush() const switch (GraphEditorSettings->GetNodeType()) { case EComboActionNodeType::SoftCorners: - return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush("MDSStyleSet.Node.TextSoftEdges"); + return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush("MDSStyleSet.Node.TextSoftEdges"); 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 @@ -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 @@ -1121,7 +1120,7 @@ FSlateColor SEdComboActionGraphNode::GetInheritsImageTint() const const FSlateBrush*SEdComboActionGraphNode::GetBulletPointImageBrush() const { FComboInputEditorModule &ComboInputEditorModule = FComboInputEditorModule::Get(); - return ComboInputEditorModule.ComboActionGraphEditorStyleSet->GetBrush( "MDSStyleSet.Icon.BulletPoint" ); + return ComboInputEditorModule.GetComboInputEditorStyleSet()->GetBrush( "MDSStyleSet.Icon.BulletPoint" ); } FText SEdComboActionGraphNode::GetIndexOverlayTooltipText() const diff --git a/Source/ComboInputEditor/Private/Ed/SEdComboActionGraphNodeIndex.cpp b/Source/ComboInputEditor/Private/Ed/SEdComboActionGraphNodeIndex.cpp index 3444880..007f34d 100644 --- a/Source/ComboInputEditor/Private/Ed/SEdComboActionGraphNodeIndex.cpp +++ b/Source/ComboInputEditor/Private/Ed/SEdComboActionGraphNodeIndex.cpp @@ -3,19 +3,18 @@ #include "SEdComboActionGraphNodeIndex.h" #include "ComboInputEditor.h" -#include "Settings/FComboActionGraphEditorStyle.h" void SEdComboActionGraphNodeIndex::Construct(const FArguments &InArgs) { 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 [ SNew(SOverlay) +SOverlay::Slot() - .HAlign(HAlign_Fill) - .VAlign(VAlign_Fill) + .HAlign(EHorizontalAlignment::HAlign_Fill) + .VAlign(EVerticalAlignment::VAlign_Fill) [ // Add a dummy box here to make sure the widget doesnt get smaller than the brush SNew(SBox) @@ -24,15 +23,15 @@ void SEdComboActionGraphNodeIndex::Construct(const FArguments &InArgs) ] +SOverlay::Slot() - .HAlign(HAlign_Fill) - .VAlign(VAlign_Fill) + .HAlign(EHorizontalAlignment::HAlign_Fill) + .VAlign(EVerticalAlignment::VAlign_Fill) [ SNew(SBorder) .BorderImage(CircleBrush) .BorderBackgroundColor(this, &SEdComboActionGraphNodeIndex::GetBackgroundColor) .Padding(FMargin(4.0f)) - .VAlign(VAlign_Center) - .HAlign(HAlign_Center) + .VAlign(EVerticalAlignment::VAlign_Center) + .HAlign(EHorizontalAlignment::HAlign_Center) ] ]; } diff --git a/Source/ComboInputEditor/Private/Layout/AssetEditorTabs.h b/Source/ComboInputEditor/Private/Layout/AssetEditorTabs.h new file mode 100644 index 0000000..e860c97 --- /dev/null +++ b/Source/ComboInputEditor/Private/Layout/AssetEditorTabs.h @@ -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; +}; diff --git a/Source/ComboInputEditor/Private/Layout/ComboActionForceDirectedSolveLayoutStrategy.cpp b/Source/ComboInputEditor/Private/Layout/ComboActionForceDirectedSolveLayoutStrategy.cpp new file mode 100644 index 0000000..7597b61 --- /dev/null +++ b/Source/ComboInputEditor/Private/Layout/ComboActionForceDirectedSolveLayoutStrategy.cpp @@ -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::Max(); +} + +void UComboActionForceDirectedSolveLayoutStrategy::Layout(UEdGraph *InEdGraph) +{ + this->EdGraph = Cast(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 NodeToDisplacement; + + for (const TObjectPtr &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 CurrLevelNodes = { RootNode }; + TArray 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; +} diff --git a/Source/ComboInputEditor/Private/Layout/ComboActionForceDirectedSolveLayoutStrategy.h b/Source/ComboInputEditor/Private/Layout/ComboActionForceDirectedSolveLayoutStrategy.h new file mode 100644 index 0000000..86faef0 --- /dev/null +++ b/Source/ComboInputEditor/Private/Layout/ComboActionForceDirectedSolveLayoutStrategy.h @@ -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; +}; diff --git a/Source/ComboInputEditor/Private/Layout/ComboActionGraphLayoutStrategy.cpp b/Source/ComboInputEditor/Private/Layout/ComboActionGraphLayoutStrategy.cpp new file mode 100644 index 0000000..26f882f --- /dev/null +++ b/Source/ComboInputEditor/Private/Layout/ComboActionGraphLayoutStrategy.cpp @@ -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(EdNode)); + int32 NodeHeight = GetNodeHeight(Cast(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 CurrLevelNodes = { RootNode }; + TArray 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 CurrLevelNodes = { RootNode }; + TArray 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; + } +} diff --git a/Source/ComboInputEditor/Private/Layout/ComboActionGraphLayoutStrategy.h b/Source/ComboInputEditor/Private/Layout/ComboActionGraphLayoutStrategy.h new file mode 100644 index 0000000..92211b4 --- /dev/null +++ b/Source/ComboInputEditor/Private/Layout/ComboActionGraphLayoutStrategy.h @@ -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; +}; diff --git a/Source/ComboInputEditor/Private/Layout/ComboActionTreeSolveLayoutStrategy.cpp b/Source/ComboInputEditor/Private/Layout/ComboActionTreeSolveLayoutStrategy.cpp new file mode 100644 index 0000000..aded740 --- /dev/null +++ b/Source/ComboInputEditor/Private/Layout/ComboActionTreeSolveLayoutStrategy.cpp @@ -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(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(); + } + + 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 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 ParentNodes = RRoot->ParentNodes; + TArray 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 &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 &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; + } +} diff --git a/Source/ComboInputEditor/Private/Layout/ComboActionTreeSolveLayoutStrategy.h b/Source/ComboInputEditor/Private/Layout/ComboActionTreeSolveLayoutStrategy.h new file mode 100644 index 0000000..cfe39d6 --- /dev/null +++ b/Source/ComboInputEditor/Private/Layout/ComboActionTreeSolveLayoutStrategy.h @@ -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& Contour); + void GetRightContour(UComboActionGraphNode *RootNode, int32 Level, TArray& Contour); + + void ShiftSubTree(UComboActionGraphNode* RootNode, const FVector2D& Offset); + + void UpdateParentNodePosition(UComboActionGraphNode* RootNode); +}; diff --git a/Source/ComboInputEditor/Private/Settings/FComboActionGraphEditorStyle.cpp b/Source/ComboInputEditor/Private/Settings/FComboActionGraphEditorStyle.cpp deleted file mode 100644 index 3efcfe8..0000000 --- a/Source/ComboInputEditor/Private/Settings/FComboActionGraphEditorStyle.cpp +++ /dev/null @@ -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( "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) - ); - } -} diff --git a/Source/ComboInputEditor/Private/Settings/FComboActionGraphEditorStyle.h b/Source/ComboInputEditor/Private/Settings/FComboActionGraphEditorStyle.h deleted file mode 100644 index f29a92c..0000000 --- a/Source/ComboInputEditor/Private/Settings/FComboActionGraphEditorStyle.h +++ /dev/null @@ -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; - }; -}; diff --git a/Source/ComboInputEditor/Public/ComboInputEditor.h b/Source/ComboInputEditor/Public/ComboInputEditor.h index 6453fe8..795debe 100644 --- a/Source/ComboInputEditor/Public/ComboInputEditor.h +++ b/Source/ComboInputEditor/Public/ComboInputEditor.h @@ -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 { public: @@ -79,9 +92,9 @@ public: virtual void StartupModule() override; virtual void ShutdownModule() override{} - static EAssetTypeCategories::Type GetInputAssetsCategory() { return FComboInputEditorModule::ComboAssetsCategory; } + TSharedPtr GetComboInputEditorStyleSet() const { return this->ComboInputEditorStyleSet; } - TSharedPtr ComboActionGraphEditorStyleSet; + static EAssetTypeCategories::Type GetInputAssetsCategory() { return FComboInputEditorModule::ComboAssetsCategory; } private: void RegisterAssetTypeActions(IAssetTools &AssetTools, TSharedRef Action) @@ -96,7 +109,7 @@ private: TArray> CreatedAssetTypeActions; TSharedPtr ComboInputEditorStyleSet; + TSharedPtr ComboActionGraphEditorStyleSet; TSharedPtr ComboActionGraphPanelNodeFactory; TSharedPtr ComboActionGraphAssetActions; - TSharedPtr ComboActionGraphStyleSet; };