#pragma once #include "CoreMinimal.h" #include "Blueprint/UserWidget.h" #include "SkillTreeTypes.h" #include "SkillTreeConnectionsWidget.generated.h" class USkillTreeComponent; class UUserWidget; class UWidget; /** * Widget that automatically draws connection lines between skill tree nodes * Place this widget in your skill tree UI and it will handle all line rendering */ UCLASS() class UTAD_UI_API USkillTreeConnectionsWidget : public UUserWidget { GENERATED_BODY() public: USkillTreeConnectionsWidget(const FObjectInitializer& ObjectInitializer); // Parent widget to search for skill nodes (can be the skill tree widget // itself) If not set, will search from the outer widget UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Skill Tree Connections") UUserWidget* SkillTreeWidget; // Reference to the skill tree component (set this in Blueprint) UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Skill Tree Connections") USkillTreeComponent* SkillTreeComponent; // Widget class for skill nodes UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Skill Tree Connections") TSubclassOf SkillNodeWidgetClass; // Line thickness in pixels UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Line Appearance", meta = (ClampMin = "0.5", ClampMax = "10.0")) float LineThickness = 2.0f; // Colors for different states UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Line Colors") FLinearColor LockedColor = FLinearColor(0.3f, 0.3f, 0.3f, 1.0f); UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Line Colors") FLinearColor AvailableColor = FLinearColor(1.0f, 1.0f, 1.0f, 1.0f); UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Line Colors") FLinearColor SelectedColor = FLinearColor(1.0f, 0.84f, 0.0f, 1.0f); UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Line Colors") FLinearColor PurchasedColor = FLinearColor(0.0f, 1.0f, 0.0f, 1.0f); // Call this to refresh the lines (useful when skill states change) UFUNCTION(BlueprintCallable, Category = "Skill Tree Connections") void RefreshConnections(); protected: virtual int32 NativePaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled) const override; virtual void NativeConstruct() override; virtual void NativeDestruct() override; private: // Event handlers for skill tree component events UFUNCTION() void OnSkillStateChangedHandler(FName SkillID); UFUNCTION() void OnSkillSelectionChangedHandler(int32 TotalCost); UFUNCTION() void OnSkillPurchasedHandler(FName SkillID); // Helper struct to store node information for drawing struct FSkillNodeInfo { FName SkillID; FVector2D Position; ESkillNodeState State; TArray Prerequisites; }; // Build the list of nodes and their info void BuildNodeInfoList(TArray& OutNodeInfo) const; // Recursively find all widgets of a specific class in the widget hierarchy void FindWidgetsOfClass(UWidget* Root, TSubclassOf WidgetClass, TArray& OutWidgets) const; // Get the color for a line based on the dependent node's state FLinearColor GetLineColorForState(ESkillNodeState State) const; // Get SkillID from a skill node widget (looks for "SkillID" property) bool GetSkillIDFromWidget(UUserWidget* Widget, FName& OutSkillID) const; // Cache for forcing redraws mutable bool bNeedsRedraw = true; };