diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9a86f24 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# Compiled Lua sources +luac.out + +# luarocks build files +*.src.rock +*.zip +*.tar.gz + +# Object files +*.o +*.os +*.ko +*.obj +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo +*.def +*.exp + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# custom +*.vscode + diff --git a/Core/Config/GUI.lua b/Core/Config/GUI.lua index b0f448d..c807591 100755 --- a/Core/Config/GUI.lua +++ b/Core/Config/GUI.lua @@ -371,6 +371,43 @@ local function CreateRangeSettings(containerParent) GUIWidgets.DeepDisable(Container, not RangeDB.Enabled, Toggle) end +local function CreateGlobalOutOfCombatFadeSettings(containerParent) + local FadeDB = UUF.db.profile.General.OutOfCombatFade + local Container = GUIWidgets.CreateInlineGroup(containerParent, "Out of Combat Fade") + + GUIWidgets.CreateInformationTag(Container, "Fade unit frames when out of combat. Per-frame settings can override this global setting.") + + local UseGlobalToggle = AG:Create("CheckBox") + UseGlobalToggle:SetLabel("Use Global Out of Combat Fade") + UseGlobalToggle:SetValue(FadeDB.UseGlobal) + UseGlobalToggle:SetFullWidth(true) + UseGlobalToggle:SetCallback("OnValueChanged", function(_, _, value) FadeDB.UseGlobal = value UUF:UpdateOutOfCombatFade() GUIWidgets.DeepDisable(Container, not value, UseGlobalToggle) end) + UseGlobalToggle:SetRelativeWidth(0.5) + Container:AddChild(UseGlobalToggle) + + local GlobalOpacitySlider = AG:Create("Slider") + GlobalOpacitySlider:SetLabel("Global Out of Combat Opacity") + GlobalOpacitySlider:SetValue(FadeDB.GlobalOpacity) + GlobalOpacitySlider:SetSliderValues(0.0, 1.0, 0.01) + GlobalOpacitySlider:SetFullWidth(true) + GlobalOpacitySlider:SetCallback("OnValueChanged", function(_, _, value) FadeDB.GlobalOpacity = value UUF:UpdateOutOfCombatFade() end) + GlobalOpacitySlider:SetRelativeWidth(0.5) + GlobalOpacitySlider:SetIsPercent(true) + Container:AddChild(GlobalOpacitySlider) + + local FadeInWithTargetToggle = AG:Create("CheckBox") + FadeInWithTargetToggle:SetLabel("Fade In When Target Is Set") + FadeInWithTargetToggle:SetValue(FadeDB.FadeInWithTarget) + FadeInWithTargetToggle:SetFullWidth(true) + FadeInWithTargetToggle:SetCallback("OnValueChanged", function(_, _, value) FadeDB.FadeInWithTarget = value UUF:UpdateOutOfCombatFade() end) + FadeInWithTargetToggle:SetRelativeWidth(0.5) + Container:AddChild(FadeInWithTargetToggle) + + GUIWidgets.CreateInformationTag(Container, "When enabled, frames will fade to full opacity if you have a target, even while out of combat.") + + GUIWidgets.DeepDisable(Container, not FadeDB.UseGlobal, UseGlobalToggle) +end + local function CreateColourSettings(containerParent) local Container = GUIWidgets.CreateInlineGroup(containerParent, "Colours") @@ -2252,6 +2289,7 @@ local function CreateGlobalSettings(containerParent) CreateFontSettings(GlobalContainer) CreateTextureSettings(GlobalContainer) + CreateGlobalOutOfCombatFadeSettings(GlobalContainer) -- CreateRangeSettings(GlobalContainer) CreateAuraDurationSettings(GlobalContainer) diff --git a/Core/Core.lua b/Core/Core.lua index f374e21..60cd21e 100755 --- a/Core/Core.lua +++ b/Core/Core.lua @@ -20,6 +20,15 @@ function UnhaltedUnitFrames:OnInitialize() local playerSpecalizationChangedEventFrame = CreateFrame("Frame") playerSpecalizationChangedEventFrame:RegisterEvent("PLAYER_SPECIALIZATION_CHANGED") playerSpecalizationChangedEventFrame:SetScript("OnEvent", function(_, event, ...) if event == "PLAYER_SPECIALIZATION_CHANGED" then local unit = ... if unit == "player" then UUF:UpdateAllUnitFrames() end end end) + + -- Combat fade event handler + UUF.CombatFadeEventFrame = CreateFrame("Frame") + UUF.CombatFadeEventFrame:RegisterEvent("PLAYER_REGEN_ENABLED") + UUF.CombatFadeEventFrame:RegisterEvent("PLAYER_REGEN_DISABLED") + UUF.CombatFadeEventFrame:RegisterEvent("PLAYER_TARGET_CHANGED") + UUF.CombatFadeEventFrame:SetScript("OnEvent", function(_, event, ...) + UUF:UpdateOutOfCombatFade() + end) end function UnhaltedUnitFrames:OnEnable() @@ -32,4 +41,6 @@ function UnhaltedUnitFrames:OnEnable() UUF:SpawnUnitFrame("focustarget") UUF:SpawnUnitFrame("pet") UUF:SpawnUnitFrame("boss") + -- Initial fade setup + UUF:UpdateOutOfCombatFade() end \ No newline at end of file diff --git a/Core/Defaults.lua b/Core/Defaults.lua index b634632..b4e38e9 100755 --- a/Core/Defaults.lua +++ b/Core/Defaults.lua @@ -11,6 +11,11 @@ local Defaults = { Separator = "||", ToTSeparator = "ยป", UseCustomAbbreviations = false, + OutOfCombatFade = { + UseGlobal = true, + GlobalOpacity = 0.5, + FadeInWithTarget = false, + }, UIScale = { Enabled = false, Scale = 1.0, @@ -68,6 +73,11 @@ local Defaults = { Height = 42, Layout = {"CENTER", "CENTER", -425.1, -275.1}, FrameStrata = "LOW", + OutOfCombatFade = { + Enabled = false, + Opacity = 0.5, + FadeInWithTarget = false, + }, }, HealthBar = { ColourByClass = true, @@ -267,6 +277,11 @@ local Defaults = { Height = 42, Layout = {"CENTER", "CENTER", 425.1, -275.1}, FrameStrata = "LOW", + OutOfCombatFade = { + Enabled = false, + Opacity = 0.5, + FadeInWithTarget = false, + }, }, HealthBar = { ColourByClass = true, @@ -460,6 +475,11 @@ local Defaults = { AnchorParent = "UUF_Target", Layout = {"TOPRIGHT", "BOTTOMRIGHT", 0, -26.1}, FrameStrata = "LOW", + OutOfCombatFade = { + Enabled = false, + Opacity = 0.5, + FadeInWithTarget = false, + }, }, HealthBar = { ColourByClass = true, @@ -636,6 +656,11 @@ local Defaults = { AnchorParent = "UUF_Player", Layout = {"BOTTOMLEFT", "TOPLEFT", 0, 36.1}, FrameStrata = "LOW", + OutOfCombatFade = { + Enabled = false, + Opacity = 0.5, + FadeInWithTarget = false, + }, }, HealthBar = { ColourByClass = true, @@ -813,6 +838,11 @@ local Defaults = { AnchorParent = "UUF_Focus", Layout = {"LEFT", "RIGHT", 1, 0}, FrameStrata = "LOW", + OutOfCombatFade = { + Enabled = false, + Opacity = 0.5, + FadeInWithTarget = false, + }, }, HealthBar = { ColourByClass = true, @@ -989,6 +1019,11 @@ local Defaults = { AnchorParent = "UUF_Player", Layout = {"TOPLEFT", "BOTTOMLEFT", 0, -26.1}, FrameStrata = "LOW", + OutOfCombatFade = { + Enabled = false, + Opacity = 0.5, + FadeInWithTarget = false, + }, }, HealthBar = { ColourByClass = true, @@ -1166,6 +1201,11 @@ local Defaults = { Layout = {"CENTER", "CENTER", 550.1, -0.1, 26}, GrowthDirection = "DOWN", FrameStrata = "LOW", + OutOfCombatFade = { + Enabled = false, + Opacity = 0.5, + FadeInWithTarget = false, + }, }, HealthBar = { ColourByClass = true, diff --git a/Core/Globals.lua b/Core/Globals.lua index b8de816..2ce7ef8 100755 --- a/Core/Globals.lua +++ b/Core/Globals.lua @@ -322,6 +322,92 @@ function UUFG:UpdateAllTags() end end +function UUF:UpdateOutOfCombatFade() + local inCombat = UnitAffectingCombat("player") + local hasTarget = UnitExists("target") + local fadeSettings = UUF.db.profile.General.OutOfCombatFade + + -- List of units to update + local units = { "PLAYER", "TARGET", "TARGETTARGET", "FOCUS", "FOCUSTARGET", "PET" } + + for _, unitKey in ipairs(units) do + local unitFrame = UUF[unitKey] + if unitFrame then + local unitName = unitKey:lower() + local unitDB = UUF.db.profile.Units[unitName] + + if unitDB and unitDB.Frame then + local useGlobal = fadeSettings.UseGlobal + local fadeEnabled = false + local targetOpacity = 1.0 + local fadeInWithTarget = false + + if useGlobal then + fadeEnabled = true + targetOpacity = fadeSettings.GlobalOpacity or 0.5 + fadeInWithTarget = fadeSettings.FadeInWithTarget or false + else + fadeEnabled = unitDB.Frame.OutOfCombatFade.Enabled + targetOpacity = unitDB.Frame.OutOfCombatFade.Opacity or 0.5 + fadeInWithTarget = unitDB.Frame.OutOfCombatFade.FadeInWithTarget or false + end + + -- Determine the target alpha: + -- - If in combat, always full opacity + -- - If out of combat and fade is enabled: + -- - If fadeInWithTarget is enabled and we have a target, full opacity + -- - Otherwise, use targetOpacity + local shouldFade = fadeEnabled and not inCombat + local shouldFadeInWithTarget = fadeInWithTarget and hasTarget + + if shouldFade and not shouldFadeInWithTarget then + unitFrame:SetAlpha(targetOpacity) + else + unitFrame:SetAlpha(1.0) + end + end + end + end + + -- Update boss frames + for i = 1, UUF.MAX_BOSS_FRAMES do + local bossFrame = UUF["BOSS" .. i] + if bossFrame then + local bossDB = UUF.db.profile.Units.boss + if bossDB and bossDB.Frame then + local useGlobal = fadeSettings.UseGlobal + local fadeEnabled = false + local targetOpacity = 1.0 + local fadeInWithTarget = false + + if useGlobal then + fadeEnabled = true + targetOpacity = fadeSettings.GlobalOpacity or 0.5 + fadeInWithTarget = fadeSettings.FadeInWithTarget or false + else + fadeEnabled = bossDB.Frame.OutOfCombatFade.Enabled + targetOpacity = bossDB.Frame.OutOfCombatFade.Opacity or 0.5 + fadeInWithTarget = bossDB.Frame.OutOfCombatFade.FadeInWithTarget or false + end + + -- Determine the target alpha: + -- - If in combat, always full opacity + -- - If out of combat and fade is enabled: + -- - If fadeInWithTarget is enabled and we have a target, full opacity + -- - Otherwise, use targetOpacity + local shouldFade = fadeEnabled and not inCombat + local shouldFadeInWithTarget = fadeInWithTarget and hasTarget + + if shouldFade and not shouldFadeInWithTarget then + bossFrame:SetAlpha(targetOpacity) + else + bossFrame:SetAlpha(1.0) + end + end + end + end +end + -- Thanks Details / Plater for this. function UUF:CleanTruncateUTF8String(text) local DetailsFramework = _G.DF