From 8843ac3d1cf94bad0780455b2c8010b00f35b18e Mon Sep 17 00:00:00 2001 From: Mateus Rodrigues Date: Wed, 27 May 2026 21:26:50 -0300 Subject: [PATCH] feat(ui/progressbar): BG + TrackGrid + Shimmer com RoundedBox nativo do Slate Substitui o SDF de cantos arredondados no material por DrawAs=RoundedBox nativo do Slate (OutlineSettings.CornerRadii em pixel space, qualidade perfeita independente do aspect ratio). Adiciona 3 materiais separados pra layers de efeito: - UI_M_ProgressBar_BG: fundo solido (1 param BackgroundColour) - UI_M_ProgressBar_TrackGrid: linhas verticais a cada N divisoes (GridColour, GridDivisions, GridLineThickness) - UI_M_ProgressBar_Shimmer: faixa de luz animada (Time node) deslizando E->D em loop (ShimmerColour, ShimmerWidth, ShimmerSpeed, ShimmerSoftness) WBP UI_ProgressBar_Master ganha 3 UImage irmaos do FillImage no Overlay (z-order: BG -> TrackGrid -> Fill -> Shimmer), todos com BindWidgetOptional. C++ UUIProgressBar_Base: - Enum EUIProgressBarStyle (Box/Rounded) controla DrawAs dos 4 brushes - CornerRadius em pixels (0..100), aplicado via OutlineSettings.CornerRadii - bShowBorder + BorderColour + BorderWidth pra outline so no BG - bShowTrackGrid / bShowShimmer toggles (visibility do widget) - ShimmerImage com inset = BorderWidth (slot padding + corner reduzido) pra nao sobrepor o outline do BG quando passa pelas extremidades - UPROPERTYs override pra cada cor/param de cada material com InlineEditConditionToggle, setters runtime que persistem o flag Inclui MI exemplo UI_M_ProgressBar_HP atualizada. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../UI/Shared/UI_ProgressBar_Master.uasset | Bin 31625 -> 38084 bytes .../Progressbar/UI_M_ProgressBar.uasset | Bin 29766 -> 29766 bytes .../Progressbar/UI_M_ProgressBar_BG.uasset | Bin 0 -> 7998 bytes .../Progressbar/UI_M_ProgressBar_HP.uasset | Bin 10066 -> 10083 bytes .../UI_M_ProgressBar_Shimmer.uasset | Bin 0 -> 18851 bytes .../UI_M_ProgressBar_TrackGrid.uasset | Bin 0 -> 13856 bytes .../Game/UI/Widgets/UIProgressBar_Base.cpp | 282 ++++++++++++++++-- .../ZMMO/Game/UI/Widgets/UIProgressBar_Base.h | 209 ++++++++++++- 8 files changed, 450 insertions(+), 41 deletions(-) create mode 100644 Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_BG.uasset create mode 100644 Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_Shimmer.uasset create mode 100644 Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_TrackGrid.uasset diff --git a/Content/ZMMO/UI/Shared/UI_ProgressBar_Master.uasset b/Content/ZMMO/UI/Shared/UI_ProgressBar_Master.uasset index 40cc97a0b401de7106cae9bf6930cbeae77146e2..548e52293116f0723054a403188a814ccc3d35de 100644 GIT binary patch literal 38084 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 IRJn5a??6e2zyJUM diff --git a/Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar.uasset b/Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar.uasset index a24dffe736c3f51366dc108a6eedda448b0f387d..85676b17e24266ec1076c4144f23870c736338b1 100644 GIT binary patch delta 2552 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 X(59wp0I4~iK0e@+ZG#h31oHn6S)_(! literal 0 HcmV?d00001 diff --git a/Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_HP.uasset b/Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_HP.uasset index 902fd3b961c987e88130ffb5e93bf75d54b771d7..1b30666b4b8736a5c93dc1fd09eb0c1de6180350 100644 GIT binary patch delta 1590 zcmZ`(3s4hR6x|J`m83!vH((G%0+s-iVu4Z-gs5FCQ4*4fp{W%L)=~W7s6`oL(29cz zDdMUH3l&x%{3MNuGr$y3hk)AZh~Gd}taOwHibH`x10j98R!zroXYTBM@4h|nymQan zo1%Wv(K+nQe7Z5fEvadnW2AW3{W|`~UOjBBfu8`w9auJ;?FX|VC^QiI-{Sy})&qi~ zz-+kDouZma(RyG-G!9lvOQtXb$&^D+rf^@TN9YOgu<;f>n*ujrE8XV9XRs}9DbZ6Z z>%D=X+m{{C9sLbieQ)8Vf;{|~y4*u81{EdZAMKlEA&(5IXY9BR2NYfx?JrdG z8q*6fcc!N_q6Sw(S8;WSbrnU;D|Zfhw*#tAE!W919MGEfr6PT194(B-!;7hiM8FDt zfS5EBD1YCFq4vkR`l;(pLj}D&y!kLz%j z@g(YA)m^V|VpGQtm!!IC9MGOx>l>mwO0cC2Pt_&~ioh6($ZyXf_ID1?{|HuhO`qL= zuxwq&xA9-2NHRox5v=SMRqO5}*5_;GlV-8}MVX|BW0Igd3vL32E|K8Ovx0eeZumx^ z!|SP;1Gw7uoiqO^VnDH~fFM=XI@@_0ZFkN{4<`?ikh;_B(22 zSm=2A=~Pekbc{Xq$*!*T8@f^Ub1ceenVX6Y2d43(pNvfIk$>D_u;qL=1rdY zYh_|;OYHIU1Lgq%z!Nkpf6~Y%Eh(~mUvG8cG)ei>Vj=v)B<-I} z+FuLoe}m&}eIjSM9Xxr;9cgYfjRh!z!s9pHr{Y+|2F-zrtDj3-a*SBl>;TMw#KB7A2+|5O>RaYMJf~cZ;`r`hdy4vmvCYE>yDZGuh8g_A z7{@ZJcjis+S$2Td(eLoD-h!3-Jj9N3R4#g@54m8+k{x;UeWRb(DLeD;u067qTo5_e z#CSNk_E^iMvtmtbQHb{H4`#Ap@is98v2$FQ=}Y4qkLqNrSckfdr9QJ<7-daxOl#R6 zg7#l7G_No-Kf}sBr5N4M!Wj1con6%HP76_|FtUs4)-Y+b^(PRI_5B$avEY^1>_LHkC`SuE2^e@oBn>_#k delta 1628 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 r`YFk3UGB$!x3uEk`ihZb5B>z0!R%sz literal 0 HcmV?d00001 diff --git a/Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_TrackGrid.uasset b/Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_TrackGrid.uasset new file mode 100644 index 0000000000000000000000000000000000000000..62596e7f4f85d488c36d060d2b20a0be36b43f72 GIT binary patch literal 13856 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 zXTj-!X|rPe)U!sP?G_v`yU<}SetVectorParameterValue(P_EmptyColour, Color); } +void UUIProgressBar_Base::SetBackgroundColour(FLinearColor Color) +{ + BackgroundColour = Color; + bOverrideBackgroundColour = true; + if (BackgroundMID) BackgroundMID->SetVectorParameterValue(P_BackgroundColour, Color); +} + +void UUIProgressBar_Base::SetTrackGridVisible(bool bVisible) +{ + bShowTrackGrid = bVisible; + if (TrackGridImage) + { + TrackGridImage->SetVisibility(bVisible ? ESlateVisibility::HitTestInvisible : ESlateVisibility::Collapsed); + } +} + +void UUIProgressBar_Base::SetGridColour(FLinearColor Color) +{ + GridColour = Color; + bOverrideGridColour = true; + if (TrackGridMID) TrackGridMID->SetVectorParameterValue(P_GridColour, Color); +} + +void UUIProgressBar_Base::SetGridDivisions(float Divisions) +{ + GridDivisions = FMath::Clamp(Divisions, 2.f, 50.f); + bOverrideGridDivisions = true; + if (TrackGridMID) TrackGridMID->SetScalarParameterValue(P_GridDivisions, GridDivisions); +} + +void UUIProgressBar_Base::SetGridLineThickness(float Thickness) +{ + GridLineThickness = FMath::Clamp(Thickness, 0.001f, 0.2f); + bOverrideGridLineThickness = true; + if (TrackGridMID) TrackGridMID->SetScalarParameterValue(P_GridLineThickness, GridLineThickness); +} + +void UUIProgressBar_Base::SetShimmerVisible(bool bVisible) +{ + bShowShimmer = bVisible; + if (ShimmerImage) + { + ShimmerImage->SetVisibility(bVisible ? ESlateVisibility::HitTestInvisible : ESlateVisibility::Collapsed); + } +} + +void UUIProgressBar_Base::SetShimmerColour(FLinearColor Color) +{ + ShimmerColour = Color; + bOverrideShimmerColour = true; + if (ShimmerMID) ShimmerMID->SetVectorParameterValue(P_ShimmerColour, Color); +} + +void UUIProgressBar_Base::SetShimmerWidth(float Width01) +{ + ShimmerWidth = FMath::Clamp(Width01, 0.05f, 1.f); + bOverrideShimmerWidth = true; + if (ShimmerMID) ShimmerMID->SetScalarParameterValue(P_ShimmerWidth, ShimmerWidth); +} + +void UUIProgressBar_Base::SetShimmerSpeed(float Speed) +{ + ShimmerSpeed = FMath::Clamp(Speed, 0.01f, 5.f); + bOverrideShimmerSpeed = true; + if (ShimmerMID) ShimmerMID->SetScalarParameterValue(P_ShimmerSpeed, ShimmerSpeed); +} + +void UUIProgressBar_Base::SetShimmerSoftness(float Softness) +{ + ShimmerSoftness = FMath::Clamp(Softness, 0.5f, 8.f); + bOverrideShimmerSoftness = true; + if (ShimmerMID) ShimmerMID->SetScalarParameterValue(P_ShimmerSoftness, ShimmerSoftness); +} + void UUIProgressBar_Base::SetGradientEnabled(bool bEnabled) { bEnableGradient = bEnabled; @@ -206,21 +330,6 @@ void UUIProgressBar_Base::SetGradientSplit(float Split01) if (FillMID) FillMID->SetScalarParameterValue(P_GradientSplit, GradientSplit); } -void UUIProgressBar_Base::ApplyOverridesToMID() -{ - if (!FillMID) - { - return; - } - if (bOverridePrimaryColour) FillMID->SetVectorParameterValue(P_PrimaryColour, PrimaryColour); - if (bOverridePrimaryColourBottom) FillMID->SetVectorParameterValue(P_PrimaryColourBottom, PrimaryColourBottom); - if (bOverrideSecondaryColour) FillMID->SetVectorParameterValue(P_SecondaryColour, SecondaryColour); - if (bOverrideSecondaryColourBottom) FillMID->SetVectorParameterValue(P_SecondaryColourBottom, SecondaryColourBottom); - if (bOverrideEmptyColour) FillMID->SetVectorParameterValue(P_EmptyColour, EmptyColour); - if (bOverrideEnableGradient) FillMID->SetScalarParameterValue(P_EnableGradient, bEnableGradient ? 1.f : 0.f); - if (bOverrideGradientSplit) FillMID->SetScalarParameterValue(P_GradientSplit, GradientSplit); -} - void UUIProgressBar_Base::ShowHealPreview(float TargetPct, FLinearColor PreviewColor) { SetSecondaryColour(PreviewColor); @@ -246,19 +355,138 @@ void UUIProgressBar_Base::ClearSecondary() SetTargetSecondaryLevel(0.f); } -void UUIProgressBar_Base::EnsureMID() +void UUIProgressBar_Base::EnsureMIDs() { - if (FillMID || !FillImage) + if (FillImage && !FillMID) { - return; + if (UMaterialInterface* Mat = Cast(FillImage->GetBrush().GetResourceObject())) + { + FillMID = UMaterialInstanceDynamic::Create(Mat, this); + FillImage->SetBrushFromMaterial(FillMID); + // SetBrushFromMaterial reseta DrawAs e OutlineSettings — re-aplica. + ApplyBrushStyle(); + } } - UMaterialInterface* Mat = Cast(FillImage->GetBrush().GetResourceObject()); - if (!Mat) + if (BackgroundImage && !BackgroundMID) { - return; + if (UMaterialInterface* Mat = Cast(BackgroundImage->GetBrush().GetResourceObject())) + { + BackgroundMID = UMaterialInstanceDynamic::Create(Mat, this); + BackgroundImage->SetBrushFromMaterial(BackgroundMID); + ApplyBrushStyle(); + } + } + if (TrackGridImage && !TrackGridMID) + { + if (UMaterialInterface* Mat = Cast(TrackGridImage->GetBrush().GetResourceObject())) + { + TrackGridMID = UMaterialInstanceDynamic::Create(Mat, this); + TrackGridImage->SetBrushFromMaterial(TrackGridMID); + ApplyBrushStyle(); + } + } + if (ShimmerImage && !ShimmerMID) + { + if (UMaterialInterface* Mat = Cast(ShimmerImage->GetBrush().GetResourceObject())) + { + ShimmerMID = UMaterialInstanceDynamic::Create(Mat, this); + ShimmerImage->SetBrushFromMaterial(ShimmerMID); + ApplyBrushStyle(); + } + } +} + +void UUIProgressBar_Base::ApplyMaterialOverrides() +{ + if (FillMID) + { + if (bOverridePrimaryColour) FillMID->SetVectorParameterValue(P_PrimaryColour, PrimaryColour); + if (bOverridePrimaryColourBottom) FillMID->SetVectorParameterValue(P_PrimaryColourBottom, PrimaryColourBottom); + if (bOverrideSecondaryColour) FillMID->SetVectorParameterValue(P_SecondaryColour, SecondaryColour); + if (bOverrideSecondaryColourBottom) FillMID->SetVectorParameterValue(P_SecondaryColourBottom, SecondaryColourBottom); + if (bOverrideEmptyColour) FillMID->SetVectorParameterValue(P_EmptyColour, EmptyColour); + if (bOverrideEnableGradient) FillMID->SetScalarParameterValue(P_EnableGradient, bEnableGradient ? 1.f : 0.f); + if (bOverrideGradientSplit) FillMID->SetScalarParameterValue(P_GradientSplit, GradientSplit); + } + if (BackgroundMID) + { + if (bOverrideBackgroundColour) BackgroundMID->SetVectorParameterValue(P_BackgroundColour, BackgroundColour); + } + if (TrackGridMID) + { + if (bOverrideGridColour) TrackGridMID->SetVectorParameterValue(P_GridColour, GridColour); + if (bOverrideGridDivisions) TrackGridMID->SetScalarParameterValue(P_GridDivisions, GridDivisions); + if (bOverrideGridLineThickness) TrackGridMID->SetScalarParameterValue(P_GridLineThickness, GridLineThickness); + } + + if (ShimmerMID) + { + if (bOverrideShimmerColour) ShimmerMID->SetVectorParameterValue(P_ShimmerColour, ShimmerColour); + if (bOverrideShimmerWidth) ShimmerMID->SetScalarParameterValue(P_ShimmerWidth, ShimmerWidth); + if (bOverrideShimmerSpeed) ShimmerMID->SetScalarParameterValue(P_ShimmerSpeed, ShimmerSpeed); + if (bOverrideShimmerSoftness) ShimmerMID->SetScalarParameterValue(P_ShimmerSoftness, ShimmerSoftness); + } + + // Visibilidade do TrackGrid + Shimmer acompanham os toggles + if (TrackGridImage) + { + TrackGridImage->SetVisibility(bShowTrackGrid ? ESlateVisibility::HitTestInvisible : ESlateVisibility::Collapsed); + } + if (ShimmerImage) + { + ShimmerImage->SetVisibility(bShowShimmer ? ESlateVisibility::HitTestInvisible : ESlateVisibility::Collapsed); + } +} + +void UUIProgressBar_Base::ApplyBrushStyle() +{ + const float InsetForShimmer = bShowBorder ? FMath::Max(BorderWidth, 0.f) : 0.f; + + auto Apply = [this](UImage* Img, bool bAllowBorder, float RadiusInset) + { + if (!Img) + { + return; + } + FSlateBrush B = Img->GetBrush(); + B.DrawAs = (DrawStyle == EUIProgressBarStyle::Rounded) + ? ESlateBrushDrawType::RoundedBox + : ESlateBrushDrawType::Image; + + FSlateBrushOutlineSettings Outline = B.OutlineSettings; + const float R = FMath::Max(CornerRadius - RadiusInset, 0.f); + Outline.CornerRadii = FVector4(R, R, R, R); + Outline.RoundingType = ESlateBrushRoundingType::FixedRadius; + + if (bAllowBorder && bShowBorder) + { + Outline.Color = FSlateColor(BorderColour); + Outline.Width = FMath::Max(BorderWidth, 0.f); + } + else + { + Outline.Color = FSlateColor(FLinearColor::Transparent); + Outline.Width = 0.f; + } + B.OutlineSettings = Outline; + + Img->SetBrush(B); + }; + + // Borda só no BG. Shimmer ganha inset = BorderWidth (padding no slot + corner reduzido) + // pra não passar por cima do outline do BG. Demais widgets sem inset. + Apply(BackgroundImage, /*bAllowBorder=*/true, 0.f); + Apply(TrackGridImage, /*bAllowBorder=*/false, 0.f); + Apply(FillImage, /*bAllowBorder=*/false, 0.f); + Apply(ShimmerImage, /*bAllowBorder=*/false, InsetForShimmer); + + if (ShimmerImage) + { + if (UOverlaySlot* OS = Cast(ShimmerImage->Slot)) + { + OS->SetPadding(FMargin(InsetForShimmer)); + } } - FillMID = UMaterialInstanceDynamic::Create(Mat, this); - FillImage->SetBrushFromMaterial(FillMID); } void UUIProgressBar_Base::ApplyPrimaryToMID(float Value) diff --git a/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.h b/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.h index aebd7b1..6a3495b 100644 --- a/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.h +++ b/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.h @@ -7,18 +7,25 @@ class UImage; class UMaterialInstanceDynamic; +/** Preset que controla Brush.DrawAs (Image=Box, RoundedBox=Rounded) em ambos os widgets. */ +UENUM(BlueprintType) +enum class EUIProgressBarStyle : uint8 +{ + /** DrawAs=Image. Sem mascara nos cantos. */ + Box UMETA(DisplayName = "Box"), + /** DrawAs=RoundedBox. Cantos arredondados via Slate nativo (pixel-perfect). */ + Rounded UMETA(DisplayName = "Rounded"), +}; + /** - * ProgressBar do ZMMO. Wrappa um UImage com material custom - * (UI_M_ProgressBar) e expõe API com dois níveis: - * Primary (preenchimento atual) + Secondary (preview / damage lag / buffer). + * ProgressBar do ZMMO. Wrappa um UImage (FillImage) + UImage de background + * (BackgroundImage) com material custom. O arredondamento dos cantos usa + * o RoundedBox nativo do Slate (Brush.DrawAs + OutlineSettings.CornerRadii) + * pra ficar pixel-perfect e independente do aspect ratio. * - * Modelo assimétrico: SecondaryLevel só aparece visualmente se for MAIOR - * que PrimaryLevel — representa heal preview, damage trail, buffer - * empilhado em cima da barra principal. - * - * Cores: por padrão vêm da Material Instance atribuída ao FillImage. - * Cada cor tem um toggle de override (InlineEditConditionToggle) que, - * quando ligado, sobrescreve o valor da MI via MID em PreConstruct. + * Modelo assimetrico de niveis: SecondaryLevel so aparece visualmente se + * for MAIOR que PrimaryLevel — representa heal preview, damage trail, + * buffer empilhado em cima da barra principal. */ UCLASS(Abstract, Blueprintable) class ZMMO_API UUIProgressBar_Base : public UCommonUserWidget @@ -46,7 +53,36 @@ public: meta = (ClampMin = "0", ClampMax = "5")) float SecondaryAnimationSeconds = 0.8f; - // === Color overrides (sobrescrevem a MI) === + // === Draw Style === + + /** Box=DrawAs Image (sem corner), Rounded=DrawAs RoundedBox (cantos arredondados). */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Style") + EUIProgressBarStyle DrawStyle = EUIProgressBarStyle::Box; + + /** + * Raio dos cantos em PIXELS. Aplicado quando DrawStyle = Rounded. + * Se RoundingType = HalfHeightRadius (default do Slate), o Slate clampeia + * automaticamente em metade da altura — ou seja, valor maior que isso vira pill. + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Style", + meta = (ClampMin = "0", ClampMax = "100")) + float CornerRadius = 8.f; + + /** Cor do outline em volta do Background (Slate OutlineSettings.Color). */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Style", + meta = (InlineEditConditionToggle)) + bool bShowBorder = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Style", + meta = (EditCondition = "bShowBorder")) + FLinearColor BorderColour = FLinearColor(0.f, 0.f, 0.f, 0.8f); + + /** Espessura do outline em pixels. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Style", + meta = (EditCondition = "bShowBorder", ClampMin = "0", ClampMax = "10")) + float BorderWidth = 1.f; + + // === Color overrides (Fill material) === UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Colors", meta = (InlineEditConditionToggle)) @@ -88,6 +124,85 @@ public: meta = (EditCondition = "bOverrideEmptyColour")) FLinearColor EmptyColour = FLinearColor(0.f, 0.f, 0.f, 0.6f); + // === Background override === + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Background", + meta = (InlineEditConditionToggle)) + bool bOverrideBackgroundColour = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Background", + meta = (EditCondition = "bOverrideBackgroundColour")) + FLinearColor BackgroundColour = FLinearColor(0.f, 0.f, 0.f, 0.6f); + + // === Track Grid (efeito de listras verticais sobre o BG) === + + /** Liga/desliga a renderização do TrackGridImage. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|TrackGrid") + bool bShowTrackGrid = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|TrackGrid", + meta = (InlineEditConditionToggle)) + bool bOverrideGridColour = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|TrackGrid", + meta = (EditCondition = "bOverrideGridColour")) + FLinearColor GridColour = FLinearColor(1.f, 1.f, 1.f, 0.05f); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|TrackGrid", + meta = (InlineEditConditionToggle)) + bool bOverrideGridDivisions = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|TrackGrid", + meta = (EditCondition = "bOverrideGridDivisions", ClampMin = "2", ClampMax = "50")) + float GridDivisions = 10.f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|TrackGrid", + meta = (InlineEditConditionToggle)) + bool bOverrideGridLineThickness = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|TrackGrid", + meta = (EditCondition = "bOverrideGridLineThickness", ClampMin = "0.001", ClampMax = "0.2")) + float GridLineThickness = 0.02f; + + // === Shimmer (faixa de luz animada por cima do Fill) === + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Shimmer") + bool bShowShimmer = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Shimmer", + meta = (InlineEditConditionToggle)) + bool bOverrideShimmerColour = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Shimmer", + meta = (EditCondition = "bOverrideShimmerColour")) + FLinearColor ShimmerColour = FLinearColor(1.f, 0.94f, 0.78f, 0.35f); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Shimmer", + meta = (InlineEditConditionToggle)) + bool bOverrideShimmerWidth = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Shimmer", + meta = (EditCondition = "bOverrideShimmerWidth", ClampMin = "0.05", ClampMax = "1.0")) + float ShimmerWidth = 0.2f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Shimmer", + meta = (InlineEditConditionToggle)) + bool bOverrideShimmerSpeed = false; + + /** Ciclos por segundo. 0.4545 = ciclo de 2.2s (default CSS). */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Shimmer", + meta = (EditCondition = "bOverrideShimmerSpeed", ClampMin = "0.01", ClampMax = "5.0")) + float ShimmerSpeed = 0.4545f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Shimmer", + meta = (InlineEditConditionToggle)) + bool bOverrideShimmerSoftness = false; + + /** Expoente da bell curve. Maior = pico mais fino. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Shimmer", + meta = (EditCondition = "bOverrideShimmerSoftness", ClampMin = "0.5", ClampMax = "8.0")) + float ShimmerSoftness = 2.f; + // === Gradient overrides === UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Gradient", @@ -128,7 +243,24 @@ public: UFUNCTION(BlueprintPure, Category = "ProgressBar") float GetCurrentSecondaryLevel() const { return CurrentSecondaryLevel; } - // === Runtime color/gradient setters (também marcam o override pra evitar reset no próximo PreConstruct) === + // === Style API === + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Style") + void SetDrawStyle(EUIProgressBarStyle InStyle); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Style") + void SetCornerRadius(float RadiusPixels); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Style") + void SetBorderVisible(bool bVisible); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Style") + void SetBorderColour(FLinearColor Color); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Style") + void SetBorderWidth(float WidthPixels); + + // === Color setters (Fill MID) === UFUNCTION(BlueprintCallable, Category = "ProgressBar|Colors") void SetPrimaryColour(FLinearColor Color); @@ -145,6 +277,36 @@ public: UFUNCTION(BlueprintCallable, Category = "ProgressBar|Colors") void SetEmptyColour(FLinearColor Color); + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Background") + void SetBackgroundColour(FLinearColor Color); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|TrackGrid") + void SetTrackGridVisible(bool bVisible); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|TrackGrid") + void SetGridColour(FLinearColor Color); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|TrackGrid") + void SetGridDivisions(float Divisions); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|TrackGrid") + void SetGridLineThickness(float Thickness); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Shimmer") + void SetShimmerVisible(bool bVisible); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Shimmer") + void SetShimmerColour(FLinearColor Color); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Shimmer") + void SetShimmerWidth(float Width01); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Shimmer") + void SetShimmerSpeed(float Speed); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Shimmer") + void SetShimmerSoftness(float Softness); + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Gradient") void SetGradientEnabled(bool bEnabled); @@ -173,14 +335,33 @@ protected: UPROPERTY(meta = (BindWidget)) TObjectPtr FillImage; + UPROPERTY(meta = (BindWidgetOptional)) + TObjectPtr BackgroundImage; + + UPROPERTY(meta = (BindWidgetOptional)) + TObjectPtr TrackGridImage; + + UPROPERTY(meta = (BindWidgetOptional)) + TObjectPtr ShimmerImage; + private: UPROPERTY(Transient) TObjectPtr FillMID; - void EnsureMID(); + UPROPERTY(Transient) + TObjectPtr BackgroundMID; + + UPROPERTY(Transient) + TObjectPtr TrackGridMID; + + UPROPERTY(Transient) + TObjectPtr ShimmerMID; + + void EnsureMIDs(); void ApplyPrimaryToMID(float Value); void ApplySecondaryToMID(float Value); - void ApplyOverridesToMID(); + void ApplyMaterialOverrides(); + void ApplyBrushStyle(); float CurrentPrimaryLevel = 1.f; float TargetPrimaryLevel = 1.f;