From c9492a39102c726d26ea5b3677b7a737a550a771 Mon Sep 17 00:00:00 2001 From: Mateus Rodrigues Date: Thu, 28 May 2026 00:33:43 -0300 Subject: [PATCH] feat(ui/progressbar): integracao com DT_UI_Styles (FUIStyleProgressBar multi-map + Variant) FUIStyleProgressBar vira multi-map Hyper-style: TMap indexado por variante (HP/MP/XP/Cast/...). Cada variante carrega materiais por layer (Fill/BG/TrackGrid/Edge/Shimmer) + style (DrawStyle/CornerRadius/Border) + toggles de efeito. UUIProgressBar_Base ganha bUseTheme + Variant (dropdown via meta=GetOptions resolvendo o DT) + RefreshUIStyle() que aplica a variante via ThemeSubsystem (runtime) ou DT direto (design-time), espelhando o padrao do UUIPanel_Base. HandleThemeChanged reaplica em troca de tema. EUIProgressBarStyle movido de UIProgressBar_Base.h para UIStyleTypes.h (usado pela struct do DT). Co-Authored-By: Claude Opus 4.7 (1M context) --- Content/ZMMO/Data/UI/DT_UI_Styles.uasset | Bin 48916 -> 52995 bytes .../UI/Shared/UI_ProgressBar_Master.uasset | Bin 39304 -> 35341 bytes Source/ZMMO/Data/UI/UIStyleTokens.h | 83 ++++++-- Source/ZMMO/Data/UI/UIStyleTypes.h | 10 + .../Game/UI/Widgets/UIProgressBar_Base.cpp | 187 +++++++++++++++++- .../ZMMO/Game/UI/Widgets/UIProgressBar_Base.h | 48 ++++- 6 files changed, 295 insertions(+), 33 deletions(-) diff --git a/Content/ZMMO/Data/UI/DT_UI_Styles.uasset b/Content/ZMMO/Data/UI/DT_UI_Styles.uasset index 4db4ab40c16f7f3afb00b2220d5e7468920502ee..edf9ca2b81517421aebe78156845837e9757d713 100644 GIT binary patch literal 52995 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 diff --git a/Content/ZMMO/UI/Shared/UI_ProgressBar_Master.uasset b/Content/ZMMO/UI/Shared/UI_ProgressBar_Master.uasset index ad5ed14f9dc701f25804196358934ca4b3f74dfd..708bc694d34ee11ad3d59dbbd532dc7c5bd51d8b 100644 GIT binary patch delta 1589 zcmZvce{54#6vyv<>+26_fwp^H?FP_ zhd=Y3^0)cdMVFn0Pcy?|WOjxtLTokAx7`im!#P(h+9QZfS)+|09R z$eJ0D!F!R88Ia(Xd$Jsv0U1<~+Qk7OSj*{QCdcc!Eb|0}fhI0bdz5+-({f}~UAluK zT}yl}EcYxk?9}vKxvC(d_bwv*4}mDpG9AfMk*%1Hjc0dqWPDl{>=G`dA^k7khlnbo zb;udx$ekjkq9hCBz${;LMaYnX3@`P$<}ud=W?Dt7Rir1*vy>GV(rma|Tp-+191Hyc zA-oH!V+-Ife>OjXOfS6wd1I^iJ@s#|aRZyVrL-3X-jSRq{>rgOm9&`K?kYG{S$ z5;|~pSispBre@jL{J0?Dq{4Y?c8tdxR~{`1H+KvSCk^o8_Ff+O-Cz$qn&_-J?rxr& zD>@*FV%Rgv5 zDMd`s9aAF1mw(Bhf6-U==Gv)=FDo}4HpyG!#gtFVjZ|NZ9dU-veKq+0Bnj$G@`ta! zL9O@o4aQpXs1^Qhxk6{b^NBp@-mim+U1{Y>KGs@6RcY9*%8ymjowR~C)x~G8glp{& zbf&!WwvH*Ch`+ZOOeUOia(`4W;+eI>SSkmy57kkJ+;V7?Qafyn>goS?!*5npm-25QM7^L7?x} zEF7@K7O#IRP5wDU)A(jVn8Y5v9XePBv%@HRE#JFc5cZ7v1C((UTeTYl(6CSO4gUD7 zv{NiLz>F~wMvb{}%xHn9OgZqtcwL&$_=BlcNLRzP42M*e2BLJ?)TU+{_}6BUez(o3 ztu}N|VW$>@{VGR-Q0;~Tjd`HSE3#&zDNZ&MrAx-&GZ84}`n4={=#k_O2U8-+H8%uhi6nP8m=Z~@xiKh9B)P+WN^yRp-SGrVLuT-ri$ot&=tb597AUDMN*J$D@$@ibPlU z%k&~^DrUHjUAeDvIpeIKqH)?CD*+kP{)e73z%wG9WkG?{F4p@E9%s3@a01S?WWcQR zRk3CW?m7tOKyy(te;~%>1!D!3a74zQ5%{ENuQdy&iko(;xaUXsV#OQtyjnEJW7lD) z3%ZY5^)g;UoGjyI#0DAviP$LPdx(={OtJWQ@;nrqB4diR$e3cSGR9c%su?GAb|i$p zB!<2uNQ0fk&;qnLiJ^tlv6GJ$qj*YAi&5eX?6eX3kLasl;wzYH$d79Ufoe{1P~{M& zVv7#I8v<}_0H#A#`1Guia1uw2>{J{Hcw+{*-=K<}#l3TjRJ!SsR-D=lORksW|Jf!8 zWp0YV7+`(r(*Bpu+oK-dTLo6LFFx>sHo%Q0Gj!I>Fg=vidRa0|<7j}AIxjQAbe&g4 zCk5AP-eo3ENZ|wvCs>KV%u>n07epgv%}K0ko$shGJ?lEsG;rmPPYVNYPH@lTXv2~i}()uUTo6<6lUzF71vRL3ujYo(;a)+iPaTN?~~oWOCJV;m(* zBqdsnYX2BM*y}T%H{qs;F>ek`sPvKOG{HEP-+yaIqtWrE*DM z)#>>xjb FillMaterial; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar|Materials") + TObjectPtr BackgroundMaterial; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar|Materials") + TObjectPtr TrackGridMaterial; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar|Materials") + TObjectPtr EdgeMaterial; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar|Materials") + TObjectPtr ShimmerMaterial; + + // ---- Style (forma + bordas) ---- + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar|Style") + EUIProgressBarStyle DrawStyle = EUIProgressBarStyle::Rounded; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar|Style", + meta = (ClampMin = "0", ClampMax = "100")) + float CornerRadius = 8.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar|Style") + bool bShowBorder = false; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar|Style") + FLinearColor BorderColour = FLinearColor(0.f, 0.f, 0.f, 0.8f); + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar|Style", + meta = (ClampMin = "0", ClampMax = "10")) + float BorderWidth = 1.f; + + // ---- Toggles de efeito ---- + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar|Effects") + bool bShowTrackGrid = false; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar|Effects") + bool bShowEdge = false; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar|Effects") + bool bShowShimmer = false; +}; + +/** + * ProgressBar — padrao multi-map Hyper-style. Variantes (HP/MP/XP/Cast/...) sao + * editadas direto no DT_UI_Styles; cada UUIProgressBar_Base referencia uma key + * FName (dropdown via meta=GetOptions resolve esse mapa em runtime+editor). + */ USTRUCT(BlueprintType) struct ZMMO_API FUIStyleProgressBar { GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar") - FLinearColor TrackColor = FLinearColor(FColor(14, 20, 36)); // Panel3 - - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar") - FLinearColor BorderColor = FLinearColor(FColor(58, 75, 120, 140)); - - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar") - float Height = 10.f; - - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar") - float CornerRadius = 6.f; - - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar") - float BorderWidth = 1.f; - - /** Cor de preenchimento por tipo (Health/Mana/XP...). */ - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI Style|ProgressBar") - TMap FillByType; + TMap Variants; }; USTRUCT(BlueprintType) diff --git a/Source/ZMMO/Data/UI/UIStyleTypes.h b/Source/ZMMO/Data/UI/UIStyleTypes.h index ffcef81..029850e 100644 --- a/Source/ZMMO/Data/UI/UIStyleTypes.h +++ b/Source/ZMMO/Data/UI/UIStyleTypes.h @@ -81,6 +81,16 @@ enum class EUIProgressBarType : uint8 Generic UMETA(DisplayName = "Generic") }; +/** Preset que controla Brush.DrawAs em todos os UImages da ProgressBar. */ +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"), +}; + UENUM(BlueprintType) enum class EUIHeaderType : uint8 { diff --git a/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.cpp b/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.cpp index 11bee67..b4e5045 100644 --- a/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.cpp +++ b/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.cpp @@ -2,10 +2,15 @@ #include "Components/Image.h" #include "Components/OverlaySlot.h" +#include "Engine/DataTable.h" +#include "Engine/GameInstance.h" #include "Materials/MaterialInstanceDynamic.h" #include "Materials/MaterialInterface.h" #include "Styling/SlateBrush.h" #include "Styling/SlateTypes.h" +#include "UI/UIStyleRow.h" +#include "UI/UIStyleTokens.h" +#include "ZMMOThemeSubsystem.h" namespace { @@ -46,6 +51,50 @@ namespace { return 1.f - FMath::Pow(1.f - Alpha, 3.f); } + + /** Resolve a FUIStyle ativa — runtime via ThemeSubsystem, design-time via DT direto. */ + FUIStyle ResolveProgressBarStyle(const UUserWidget* Widget) + { + if (Widget) + { + if (const UGameInstance* GI = Widget->GetGameInstance()) + { + if (const UZMMOThemeSubsystem* Theme = GI->GetSubsystem()) + { + return Theme->GetActiveUIStyle(); + } + } + } + // Design-time fallback: lê DT_UI_Styles row "Default" direto do disk. + if (const UDataTable* DT = LoadObject(nullptr, + TEXT("/Game/ZMMO/Data/UI/DT_UI_Styles.DT_UI_Styles"))) + { + if (const FUIStyleRow* Row = DT->FindRow( + FName(TEXT("Default")), TEXT("UIProgressBarDesign"), false)) + { + return Row->Style; + } + } + return FUIStyle(); + } + + TArray CollectVariantOptions() + { + TArray Options; + Options.Add(FString()); // entrada vazia = sem theme + const UDataTable* DT = LoadObject(nullptr, + TEXT("/Game/ZMMO/Data/UI/DT_UI_Styles.DT_UI_Styles")); + if (!DT) return Options; + const FUIStyleRow* Row = DT->FindRow( + FName(TEXT("Default")), TEXT("UIProgressBarGetOptions"), false); + if (!Row) return Options; + for (const TPair& Pair : Row->Style.ProgressBar.Variants) + { + Options.Add(Pair.Key.ToString()); + } + Options.Sort(); + return Options; + } } void UUIProgressBar_Base::NativePreConstruct() @@ -64,9 +113,16 @@ void UUIProgressBar_Base::NativePreConstruct() SecondaryElapsed = 0.f; bAnimatingSecondary = false; - ApplyBrushStyle(); - EnsureMIDs(); - ApplyMaterialOverrides(); + if (bUseTheme) + { + RefreshUIStyle(); + } + else + { + ApplyBrushStyle(); + EnsureMIDs(); + ApplyMaterialOverrides(); + } ApplyPrimaryToMID(CurrentPrimaryLevel); ApplySecondaryToMID(CurrentSecondaryLevel); } @@ -75,13 +131,56 @@ void UUIProgressBar_Base::NativeConstruct() { Super::NativeConstruct(); - ApplyBrushStyle(); - EnsureMIDs(); - ApplyMaterialOverrides(); + if (!bThemeBound) + { + if (const UGameInstance* GI = GetGameInstance()) + { + if (UZMMOThemeSubsystem* Theme = GI->GetSubsystem()) + { + Theme->OnThemeChanged.AddDynamic(this, &UUIProgressBar_Base::HandleThemeChanged); + bThemeBound = true; + } + } + } + + if (bUseTheme) + { + RefreshUIStyle(); + } + else + { + ApplyBrushStyle(); + EnsureMIDs(); + ApplyMaterialOverrides(); + } ApplyPrimaryToMID(CurrentPrimaryLevel); ApplySecondaryToMID(CurrentSecondaryLevel); } +void UUIProgressBar_Base::NativeDestruct() +{ + if (bThemeBound) + { + if (const UGameInstance* GI = GetGameInstance()) + { + if (UZMMOThemeSubsystem* Theme = GI->GetSubsystem()) + { + Theme->OnThemeChanged.RemoveDynamic(this, &UUIProgressBar_Base::HandleThemeChanged); + } + } + bThemeBound = false; + } + Super::NativeDestruct(); +} + +void UUIProgressBar_Base::HandleThemeChanged(FName /*NewThemeId*/) +{ + if (bUseTheme) + { + RefreshUIStyle(); + } +} + void UUIProgressBar_Base::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) { Super::NativeTick(MyGeometry, InDeltaTime); @@ -584,3 +683,79 @@ void UUIProgressBar_Base::ApplySecondaryToMID(float Value) FillMID->SetScalarParameterValue(P_SecondaryLevel, Value); } } + +// ===================================================================== +// Theme integration (bUseTheme + Variant) +// ===================================================================== + +void UUIProgressBar_Base::RefreshUIStyle() +{ + if (!bUseTheme || Variant.IsNone()) + { + // Fallback: comportamento manual. + ApplyBrushStyle(); + EnsureMIDs(); + ApplyMaterialOverrides(); + return; + } + const FUIStyle ActiveStyle = ResolveProgressBarStyle(this); + const FUIStyleProgressBarVariant* V = ActiveStyle.ProgressBar.Variants.Find(Variant); + if (!V) + { + // Variante não existe no DT — fallback manual. + ApplyBrushStyle(); + EnsureMIDs(); + ApplyMaterialOverrides(); + return; + } + ApplyThemeVariant(*V); +} + +void UUIProgressBar_Base::ApplyThemeVariant(const FUIStyleProgressBarVariant& V) +{ + // Style — copia pros campos do widget e re-aplica brush. + DrawStyle = V.DrawStyle; + CornerRadius = V.CornerRadius; + bShowBorder = V.bShowBorder; + BorderColour = V.BorderColour; + BorderWidth = V.BorderWidth; + + // Toggles de efeito + bShowTrackGrid = V.bShowTrackGrid; + bShowEdge = V.bShowEdge; + bShowShimmer = V.bShowShimmer; + + // Troca materiais nos brushes quando definidos. Reseta MIDs cacheados pra + // que EnsureMIDs() pegue o material novo na próxima chamada. + auto AssignMaterial = [](UImage* Img, UMaterialInterface* Mat) + { + if (!Img || !Mat) return; + FSlateBrush B = Img->GetBrush(); + if (B.GetResourceObject() != Mat) + { + B.SetResourceObject(Mat); + B.DrawAs = ESlateBrushDrawType::Image; // reset; ApplyBrushStyle re-aplica + Img->SetBrush(B); + } + }; + if (V.FillMaterial) { AssignMaterial(FillImage, V.FillMaterial); FillMID = nullptr; } + if (V.BackgroundMaterial) { AssignMaterial(BackgroundImage, V.BackgroundMaterial); BackgroundMID = nullptr; } + if (V.TrackGridMaterial) { AssignMaterial(TrackGridImage, V.TrackGridMaterial); TrackGridMID = nullptr; } + if (V.EdgeMaterial) { AssignMaterial(EdgeImage, V.EdgeMaterial); EdgeMID = nullptr; } + if (V.ShimmerMaterial) { AssignMaterial(ShimmerImage, V.ShimmerMaterial); ShimmerMID = nullptr; } + + ApplyBrushStyle(); + EnsureMIDs(); + // Quando vem do tema, ignora os bOverride* individuais — variante já é a + // fonte da verdade. Cores são definidas pela MI atribuída ao brush. + + // Aplica visibility dos toggles + if (TrackGridImage) TrackGridImage->SetVisibility(bShowTrackGrid ? ESlateVisibility::HitTestInvisible : ESlateVisibility::Collapsed); + if (ShimmerImage) ShimmerImage->SetVisibility(bShowShimmer ? ESlateVisibility::HitTestInvisible : ESlateVisibility::Collapsed); + UpdateEdgeVisibility(); +} + +TArray UUIProgressBar_Base::GetProgressBarVariantOptions() const +{ + return CollectVariantOptions(); +} diff --git a/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.h b/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.h index 643dd29..e04dde7 100644 --- a/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.h +++ b/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.h @@ -2,20 +2,12 @@ #include "CoreMinimal.h" #include "CommonUserWidget.h" +#include "UI/UIStyleTypes.h" #include "UIProgressBar_Base.generated.h" 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"), -}; +struct FUIStyleProgressBarVariant; /** * ProgressBar do ZMMO. Wrappa um UImage (FillImage) + UImage de background @@ -33,6 +25,35 @@ class ZMMO_API UUIProgressBar_Base : public UCommonUserWidget GENERATED_BODY() public: + // === Theme (DT_UI_Styles integration) === + + /** + * true = le toda a config visual (materiais + style + toggles) do + * DT_UI_Styles (FUIStyleProgressBar.Variants[Variant]). Tema + * centralizado, ignora as UPROPERTYs override individuais abaixo. + * false = ignora a DT, usa apenas as UPROPERTYs/toggles do widget. + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Theme") + bool bUseTheme = false; + + /** + * Chave da variante (HP/MP/XP/Cast/...). Dropdown popula via + * meta=GetOptions lendo DT_UI_Styles.Default.ProgressBar.Variants. Vazio + * = sem theme aplicado (igual bUseTheme=false). + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Theme", + meta = (EditCondition = "bUseTheme", EditConditionHides, + GetOptions = "GetProgressBarVariantOptions")) + FName Variant; + + /** Re-resolve a variante atual e reaplica nos widgets. */ + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Theme") + void RefreshUIStyle(); + + /** Populador do dropdown (meta=GetOptions) das variantes. */ + UFUNCTION() + TArray GetProgressBarVariantOptions() const; + // === Levels === UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar", @@ -384,6 +405,7 @@ public: protected: virtual void NativePreConstruct() override; virtual void NativeConstruct() override; + virtual void NativeDestruct() override; virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; UPROPERTY(meta = (BindWidget)) @@ -423,6 +445,12 @@ private: void ApplyMaterialOverrides(); void ApplyBrushStyle(); void UpdateEdgeVisibility(); + void ApplyThemeVariant(const FUIStyleProgressBarVariant& Variant); + + UFUNCTION() + void HandleThemeChanged(FName NewThemeId); + + bool bThemeBound = false; float CurrentPrimaryLevel = 1.f; float TargetPrimaryLevel = 1.f;