diff --git a/Content/ZMMO/UI/Shared/UI_ProgressBar_Master.uasset b/Content/ZMMO/UI/Shared/UI_ProgressBar_Master.uasset index 548e522..ad5ed14 100644 Binary files a/Content/ZMMO/UI/Shared/UI_ProgressBar_Master.uasset and b/Content/ZMMO/UI/Shared/UI_ProgressBar_Master.uasset differ diff --git a/Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_Edge.uasset b/Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_Edge.uasset new file mode 100644 index 0000000..3feb2ec Binary files /dev/null and b/Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_Edge.uasset differ diff --git a/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.cpp b/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.cpp index ac53323..11bee67 100644 --- a/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.cpp +++ b/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.cpp @@ -36,6 +36,12 @@ namespace static const FName P_ShimmerSpeed("ShimmerSpeed"); static const FName P_ShimmerSoftness("ShimmerSoftness"); + // Edge material params + static const FName P_EdgeColour("EdgeColour"); + static const FName P_EdgeWidth("EdgeWidth"); + static const FName P_EdgeGlowWidth("EdgeGlowWidth"); + static const FName P_EdgeGlowIntensity("EdgeGlowIntensity"); + FORCEINLINE float EaseOutCubic(float Alpha) { return 1.f - FMath::Pow(1.f - Alpha, 3.f); @@ -279,6 +285,40 @@ void UUIProgressBar_Base::SetGridLineThickness(float Thickness) if (TrackGridMID) TrackGridMID->SetScalarParameterValue(P_GridLineThickness, GridLineThickness); } +void UUIProgressBar_Base::SetEdgeVisible(bool bVisible) +{ + bShowEdge = bVisible; + UpdateEdgeVisibility(); +} + +void UUIProgressBar_Base::SetEdgeColour(FLinearColor Color) +{ + EdgeColour = Color; + bOverrideEdgeColour = true; + if (EdgeMID) EdgeMID->SetVectorParameterValue(P_EdgeColour, Color); +} + +void UUIProgressBar_Base::SetEdgeWidth(float Width01) +{ + EdgeWidth = FMath::Clamp(Width01, 0.001f, 0.1f); + bOverrideEdgeWidth = true; + if (EdgeMID) EdgeMID->SetScalarParameterValue(P_EdgeWidth, EdgeWidth); +} + +void UUIProgressBar_Base::SetEdgeGlowWidth(float GlowWidth01) +{ + EdgeGlowWidth = FMath::Clamp(GlowWidth01, 0.f, 0.2f); + bOverrideEdgeGlowWidth = true; + if (EdgeMID) EdgeMID->SetScalarParameterValue(P_EdgeGlowWidth, EdgeGlowWidth); +} + +void UUIProgressBar_Base::SetEdgeGlowIntensity(float Intensity01) +{ + EdgeGlowIntensity = FMath::Clamp(Intensity01, 0.f, 1.f); + bOverrideEdgeGlowIntensity = true; + if (EdgeMID) EdgeMID->SetScalarParameterValue(P_EdgeGlowIntensity, EdgeGlowIntensity); +} + void UUIProgressBar_Base::SetShimmerVisible(bool bVisible) { bShowShimmer = bVisible; @@ -394,6 +434,15 @@ void UUIProgressBar_Base::EnsureMIDs() ApplyBrushStyle(); } } + if (EdgeImage && !EdgeMID) + { + if (UMaterialInterface* Mat = Cast(EdgeImage->GetBrush().GetResourceObject())) + { + EdgeMID = UMaterialInstanceDynamic::Create(Mat, this); + EdgeImage->SetBrushFromMaterial(EdgeMID); + ApplyBrushStyle(); + } + } } void UUIProgressBar_Base::ApplyMaterialOverrides() @@ -426,12 +475,20 @@ void UUIProgressBar_Base::ApplyMaterialOverrides() if (bOverrideShimmerSpeed) ShimmerMID->SetScalarParameterValue(P_ShimmerSpeed, ShimmerSpeed); if (bOverrideShimmerSoftness) ShimmerMID->SetScalarParameterValue(P_ShimmerSoftness, ShimmerSoftness); } + if (EdgeMID) + { + if (bOverrideEdgeColour) EdgeMID->SetVectorParameterValue(P_EdgeColour, EdgeColour); + if (bOverrideEdgeWidth) EdgeMID->SetScalarParameterValue(P_EdgeWidth, EdgeWidth); + if (bOverrideEdgeGlowWidth) EdgeMID->SetScalarParameterValue(P_EdgeGlowWidth, EdgeGlowWidth); + if (bOverrideEdgeGlowIntensity) EdgeMID->SetScalarParameterValue(P_EdgeGlowIntensity, EdgeGlowIntensity); + } - // Visibilidade do TrackGrid + Shimmer acompanham os toggles + // Visibilidade dos widgets opcionais if (TrackGridImage) { TrackGridImage->SetVisibility(bShowTrackGrid ? ESlateVisibility::HitTestInvisible : ESlateVisibility::Collapsed); } + UpdateEdgeVisibility(); if (ShimmerImage) { ShimmerImage->SetVisibility(bShowShimmer ? ESlateVisibility::HitTestInvisible : ESlateVisibility::Collapsed); @@ -478,6 +535,7 @@ void UUIProgressBar_Base::ApplyBrushStyle() Apply(BackgroundImage, /*bAllowBorder=*/true, 0.f); Apply(TrackGridImage, /*bAllowBorder=*/false, 0.f); Apply(FillImage, /*bAllowBorder=*/false, 0.f); + Apply(EdgeImage, /*bAllowBorder=*/false, 0.f); Apply(ShimmerImage, /*bAllowBorder=*/false, InsetForShimmer); if (ShimmerImage) @@ -495,6 +553,28 @@ void UUIProgressBar_Base::ApplyPrimaryToMID(float Value) { FillMID->SetScalarParameterValue(P_PrimaryLevel, Value); } + // Edge acompanha o nível Primary (posição da linha = PrimaryLevel) + if (EdgeMID) + { + EdgeMID->SetScalarParameterValue(P_PrimaryLevel, Value); + } + UpdateEdgeVisibility(); +} + +void UUIProgressBar_Base::UpdateEdgeVisibility() +{ + if (!EdgeImage) + { + return; + } + if (!bShowEdge) + { + EdgeImage->SetVisibility(ESlateVisibility::Collapsed); + return; + } + // Auto-hide quando Primary está nos extremos (0 ou 1) — Edge encostaria na borda. + const bool bAtExtreme = (CurrentPrimaryLevel <= 0.f) || (CurrentPrimaryLevel >= 1.f); + EdgeImage->SetVisibility(bAtExtreme ? ESlateVisibility::Collapsed : ESlateVisibility::HitTestInvisible); } void UUIProgressBar_Base::ApplySecondaryToMID(float Value) diff --git a/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.h b/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.h index 6a3495b..643dd29 100644 --- a/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.h +++ b/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.h @@ -164,6 +164,45 @@ public: meta = (EditCondition = "bOverrideGridLineThickness", ClampMin = "0.001", ClampMax = "0.2")) float GridLineThickness = 0.02f; + // === Edge (linha vertical no fim do Primary) === + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge") + bool bShowEdge = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge", + meta = (InlineEditConditionToggle)) + bool bOverrideEdgeColour = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge", + meta = (EditCondition = "bOverrideEdgeColour")) + FLinearColor EdgeColour = FLinearColor(1.f, 0.94f, 0.78f, 0.85f); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge", + meta = (InlineEditConditionToggle)) + bool bOverrideEdgeWidth = false; + + /** Largura da linha em UV (fração da barra). 0.005 ≈ 2px em barra de 400px. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge", + meta = (EditCondition = "bOverrideEdgeWidth", ClampMin = "0.001", ClampMax = "0.1")) + float EdgeWidth = 0.005f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge", + meta = (InlineEditConditionToggle)) + bool bOverrideEdgeGlowWidth = false; + + /** Largura do halo lateral em UV. 0 = sem glow. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge", + meta = (EditCondition = "bOverrideEdgeGlowWidth", ClampMin = "0", ClampMax = "0.2")) + float EdgeGlowWidth = 0.02f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge", + meta = (InlineEditConditionToggle)) + bool bOverrideEdgeGlowIntensity = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge", + meta = (EditCondition = "bOverrideEdgeGlowIntensity", ClampMin = "0", ClampMax = "1")) + float EdgeGlowIntensity = 0.5f; + // === Shimmer (faixa de luz animada por cima do Fill) === UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Shimmer") @@ -292,6 +331,21 @@ public: UFUNCTION(BlueprintCallable, Category = "ProgressBar|TrackGrid") void SetGridLineThickness(float Thickness); + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Edge") + void SetEdgeVisible(bool bVisible); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Edge") + void SetEdgeColour(FLinearColor Color); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Edge") + void SetEdgeWidth(float Width01); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Edge") + void SetEdgeGlowWidth(float GlowWidth01); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Edge") + void SetEdgeGlowIntensity(float Intensity01); + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Shimmer") void SetShimmerVisible(bool bVisible); @@ -341,6 +395,9 @@ protected: UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr TrackGridImage; + UPROPERTY(meta = (BindWidgetOptional)) + TObjectPtr EdgeImage; + UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr ShimmerImage; @@ -354,6 +411,9 @@ private: UPROPERTY(Transient) TObjectPtr TrackGridMID; + UPROPERTY(Transient) + TObjectPtr EdgeMID; + UPROPERTY(Transient) TObjectPtr ShimmerMID; @@ -362,6 +422,7 @@ private: void ApplySecondaryToMID(float Value); void ApplyMaterialOverrides(); void ApplyBrushStyle(); + void UpdateEdgeVisibility(); float CurrentPrimaryLevel = 1.f; float TargetPrimaryLevel = 1.f;