from retail

This commit is contained in:
NoM0Re
2025-01-11 17:15:56 +01:00
parent 96c5618c6b
commit 1b50569bcc
10 changed files with 147 additions and 122 deletions
+5 -4
View File
@@ -1246,6 +1246,7 @@ local function modify(parent, region, data)
return region.currentMin or 0, region.currentMax or 0
end
region.TimerTick = nil
function region:Update()
local state = region.state
region:UpdateMinMax()
@@ -1257,7 +1258,7 @@ local function modify(parent, region, data)
end
if region.TimerTick then
region.TimerTick = nil
region:UpdateRegionHasTimerTick()
region.subRegionEvents:RemoveSubscriber("TimerTick", self)
end
expirationTime = GetTime() + (state.remaining or 0)
else
@@ -1266,7 +1267,7 @@ local function modify(parent, region, data)
end
if not region.TimerTick then
region.TimerTick = TimerTick
region:UpdateRegionHasTimerTick()
region.subRegionEvents:AddSubscriber("TimerTick", self, true)
end
expirationTime = state.expirationTime and state.expirationTime > 0 and state.expirationTime or math.huge;
end
@@ -1283,7 +1284,7 @@ local function modify(parent, region, data)
region:SetValue(value - region.currentMin, region.currentMax - region.currentMin);
if region.TimerTick then
region.TimerTick = nil
region:UpdateRegionHasTimerTick()
region.subRegionEvents:RemoveSubscriber("TimerTick", region)
end
else
if region.paused then
@@ -1292,7 +1293,7 @@ local function modify(parent, region, data)
region:SetTime(0, math.huge)
if region.TimerTick then
region.TimerTick = nil
region:UpdateRegionHasTimerTick()
region.subRegionEvents:RemoveSubscriber("TimerTick", region)
end
end
+5 -4
View File
@@ -878,6 +878,7 @@ local function modify(parent, region, data)
end
end
region.TimerTick = nil
function region:Update()
local state = region.state
@@ -890,7 +891,7 @@ local function modify(parent, region, data)
end
if region.TimerTick then
region.TimerTick = nil
region:UpdateRegionHasTimerTick()
region.subRegionEvents:RemoveSubscriber("TimerTick", region)
end
expirationTime = GetTime() + (state.remaining or 0)
else
@@ -899,7 +900,7 @@ local function modify(parent, region, data)
end
if not region.TimerTick then
region.TimerTick = TimerTick
region:UpdateRegionHasTimerTick()
region.subRegionEvents:AddSubscriber("TimerTick", region, true)
end
expirationTime = state.expirationTime and state.expirationTime > 0 and state.expirationTime or math.huge;
end
@@ -945,7 +946,7 @@ local function modify(parent, region, data)
region:SetValue(value - adjustMin, max - adjustMin);
if region.TimerTick then
region.TimerTick = nil
region:UpdateRegionHasTimerTick()
region.subRegionEvents:RemoveSubscriber("TimerTick", region)
end
else
if region.paused then
@@ -954,7 +955,7 @@ local function modify(parent, region, data)
region:SetTime(0, math.huge)
if region.TimerTick then
region.TimerTick = nil
region:UpdateRegionHasTimerTick()
region.subRegionEvents:RemoveSubscriber("TimerTick", region)
end
end
+43 -110
View File
@@ -6,47 +6,6 @@ local L = WeakAuras.L;
WeakAuras.regionPrototype = {};
local SubRegionEventSystem =
{
ClearSubscribers = function(self)
self.events = {}
end,
AddSubscriber = function(self, event, subRegion)
if not subRegion[event] then
print("Can't register subregion for ", event, " ", subRegion.type)
return
end
self.events[event] = self.events[event] or {}
tinsert(self.events[event], subRegion)
end,
RemoveSubscriber = function(self, event, subRegion)
if self.events[event] then
tremove(self.events[event], tIndexOf(self.events[event], subRegion))
end
end,
Notify = function(self, event, ...)
if self.events[event] then
for _, subRegion in ipairs(self.events[event]) do
subRegion[event](subRegion, ...)
end
end
end
}
local function CreateSubRegionEventSystem()
local system = {}
for f, func in pairs(SubRegionEventSystem) do
system[f] = func
system.events = {}
end
return system
end
-- Alpha
function WeakAuras.regionPrototype.AddAlphaToDefault(default)
default.alpha = 1.0;
@@ -391,29 +350,9 @@ local function SetTriggerProvidesTimer(self, timerTick)
self:UpdateTimerTick()
end
local function UpdateRegionHasTimerTick(self)
local hasTimerTick = false
if self.TimerTick then
hasTimerTick = true
elseif (self.subRegions) then
for index, subRegion in pairs(self.subRegions) do
if subRegion.TimerTick then
hasTimerTick = true
break;
end
end
end
self.regionHasTimer = hasTimerTick
self:UpdateTimerTick()
end
local function TimerTickForRegion(region)
Private.StartProfileSystem("timer tick")
Private.StartProfileAura(region.id);
if region.TimerTick then
region:TimerTick();
end
region.subRegionEvents:Notify("TimerTick")
Private.StopProfileAura(region.id);
@@ -421,7 +360,7 @@ local function TimerTickForRegion(region)
end
local function UpdateTimerTick(self)
if self.triggerProvidesTimer and self.regionHasTimer and self.toShow then
if self.triggerProvidesTimer and self.subRegionEvents:HasSubscribers("TimerTick") and self.toShow then
if not self:GetScript("OnUpdate") then
self:SetScript("OnUpdate", function()
TimerTickForRegion(self)
@@ -434,6 +373,20 @@ local function UpdateTimerTick(self)
end
end
local function UpdateFrameTick(self)
if self.subRegionEvents:HasSubscribers("FrameTick") and self.toShow then
Private.FrameTick:AddSubscriber("FrameTick", self)
else
Private.FrameTick:RemoveSubscriber("FrameTick", self)
end
end
local function FrameTick(self)
Private.StartProfileAura(self.id)
self.subRegionEvents:Notify("FrameTick")
Private.StopProfileAura(self.id)
end
local function AnchorSubRegion(self, subRegion, anchorType, selfPoint, anchorPoint, anchorXOffset, anchorYOffset)
subRegion:ClearAllPoints()
@@ -486,10 +439,11 @@ function WeakAuras.regionPrototype.create(region)
region.SetAnimAlpha = SetAnimAlpha;
region.SetTriggerProvidesTimer = SetTriggerProvidesTimer
region.UpdateRegionHasTimerTick = UpdateRegionHasTimerTick
region.UpdateTimerTick = UpdateTimerTick
region.UpdateFrameTick = UpdateFrameTick
region.FrameTick = FrameTick
region.subRegionEvents = CreateSubRegionEventSystem()
region.subRegionEvents = Private.CreateSubscribableObject()
region.AnchorSubRegion = AnchorSubRegion
region.values = {} -- For SubText
@@ -502,6 +456,8 @@ function WeakAuras.regionPrototype.modify(parent, region, data)
region.state = nil
region.states = nil
region.subRegionEvents:ClearSubscribers()
region.subRegionEvents:ClearCallbacks()
Private.FrameTick:RemoveSubscriber("FrameTick", region)
local defaultsForRegion = Private.regionTypes[data.regionType] and Private.regionTypes[data.regionType].default;
@@ -581,7 +537,6 @@ function WeakAuras.regionPrototype.modify(parent, region, data)
end
return data.actions.finish[fullKey]
end, true)
end
function WeakAuras.regionPrototype.modifyFinish(parent, region, data)
@@ -612,7 +567,15 @@ function WeakAuras.regionPrototype.modifyFinish(parent, region, data)
end
end
region:UpdateRegionHasTimerTick()
region.subRegionEvents:SetOnSubscriptionStatusChanged("TimerTick", function()
region:UpdateTimerTick()
end)
region:UpdateTimerTick()
region.subRegionEvents:SetOnSubscriptionStatusChanged("FrameTick", function()
region:UpdateFrameTick()
end)
region:UpdateFrameTick()
Private.ApplyFrameLevel(region)
end
@@ -627,55 +590,25 @@ end
local regionsForFrameTick = {}
local frameForFrameTick = CreateFrame("Frame");
Private.frames["Frame Tick Frame"] = frameForFrameTick
local function FrameTick()
Private.FrameTick = Private.CreateSubscribableObject()
Private.FrameTick.OnUpdateHandler = function()
if WeakAuras.IsOptionsOpen() then
return
end
Private.StartProfileSystem("frame tick")
for region in pairs(regionsForFrameTick) do
Private.StartProfileAura(region.id);
if region.FrameTick then
region.FrameTick()
end
region.subRegionEvents:Notify("FrameTick")
Private.StopProfileAura(region.id);
end
Private.FrameTick:Notify("FrameTick")
Private.StopProfileSystem("frame tick")
end
local function RegisterForFrameTick(region)
-- Check for a Frame Tick function
local hasFrameTick = region.FrameTick
if not hasFrameTick then
if (region.subRegions) then
for index, subRegion in pairs(region.subRegions) do
if subRegion.FrameTick then
hasFrameTick = true
break
end
end
end
end
if not hasFrameTick then
return
end
regionsForFrameTick[region] = true
if not frameForFrameTick:GetScript("OnUpdate") then
frameForFrameTick:SetScript("OnUpdate", FrameTick);
end
end
local function UnRegisterForFrameTick(region)
regionsForFrameTick[region] = nil
if not next(regionsForFrameTick) then
Private.FrameTick:SetOnSubscriptionStatusChanged("FrameTick", function()
if Private.FrameTick:HasSubscribers("FrameTick") then
frameForFrameTick:SetScript("OnUpdate", Private.FrameTick.OnUpdateHandler);
else
frameForFrameTick:SetScript("OnUpdate", nil)
end
end
end)
local function TimerTickForSetDuration(self)
local duration = self.duration
@@ -707,13 +640,13 @@ function WeakAuras.regionPrototype.AddSetDurationInfo(region)
if customValue then
SetProgressValue(region, duration, expirationTime);
region.TimerTick = nil
region:UpdateRegionHasTimerTick()
region.subRegionEvents:RemoveSubscriber("TimerTick", self)
else
local adjustMin = region.adjustedMin or 0;
region:SetTime((duration ~= 0 and region.adjustedMax or duration) - adjustMin, expirationTime - adjustMin, inverse);
region.TimerTick = TimerTickForSetDuration
region:UpdateRegionHasTimerTick()
region.subRegionEvents:AddSubscriber("TimerTick", self, true)
end
end
elseif (region.generatedSetDurationInfo) then
@@ -827,7 +760,7 @@ function WeakAuras.regionPrototype.AddExpandFunction(data, region, cloneId, pare
region:SoundRepeatStop();
end
UnRegisterForFrameTick(region)
region:UpdateFrameTick()
region:UpdateTimerTick()
end
function region:Expand()
@@ -863,7 +796,7 @@ function WeakAuras.regionPrototype.AddExpandFunction(data, region, cloneId, pare
end
parent:ActivateChild(data.id, cloneId);
RegisterForFrameTick(region)
region:UpdateFrameTick()
region:UpdateTimerTick()
end
elseif not(data.controlledChildren) then
@@ -886,7 +819,7 @@ function WeakAuras.regionPrototype.AddExpandFunction(data, region, cloneId, pare
region:SoundRepeatStop();
end
UnRegisterForFrameTick(region)
region:UpdateFrameTick()
region:UpdateTimerTick()
end
function region:Expand()
@@ -934,7 +867,7 @@ function WeakAuras.regionPrototype.AddExpandFunction(data, region, cloneId, pare
parent:UpdateBorder(region);
end
RegisterForFrameTick(region)
region:UpdateFrameTick()
region:UpdateTimerTick()
end
end
+3
View File
@@ -444,6 +444,9 @@ local function modify(parent, region, data)
end;
region.FrameTick = onUpdate;
if region.FrameTick then
region.subRegionEvents:AddSubscriber("FrameTick", region, true)
end
function region:Update()
if region.state.paused then
+5
View File
@@ -226,6 +226,11 @@ local function modify(parent, region, data)
region.Update = Update
region.FrameTick = FrameTick
region.TimerTick = TimerTick
if TimerTick then
region.subRegionEvents:AddSubscriber("TimerTick", region, true)
else
region.subRegionEvents:RemoveSubscriber("TimerTick", region)
end
if not UpdateText then
local textStr = data.displayText
-2
View File
@@ -199,13 +199,11 @@ local funcs = {
if self.tick_placement_mode == "ValueOffset" and self.state and self.state.progressType == "timed" and not self.paused then
if not self.TimerTick then
self.TimerTick = self.UpdateTickPlacement
self.parent:UpdateRegionHasTimerTick()
self.parent.subRegionEvents:AddSubscriber("TimerTick", self)
end
else
if self.TimerTick then
self.TimerTick = nil
self.parent:UpdateRegionHasTimerTick()
self.parent.subRegionEvents:RemoveSubscriber("TimerTick", self)
end
end
+74
View File
@@ -0,0 +1,74 @@
if not WeakAuras.IsLibsOK() then return end
local AddonName, Private = ...
local WeakAuras = WeakAuras
local L = WeakAuras.L
local SubscribableObject =
{
ClearSubscribers = function(self)
self.events = {}
end,
ClearCallbacks = function(self)
self.callbacks = {}
end,
AddSubscriber = function(self, event, subscriber, highPriority)
if not subscriber[event] then
print("Can't register for ", event, " ", subscriber, subscriber.type)
return
end
self.events[event] = self.events[event] or {}
local pos = highPriority and 1 or (#self.events[event] + 1)
if TableHasAnyEntries(self.events[event]) then
tinsert(self.events[event], pos, subscriber)
else
tinsert(self.events[event], pos, subscriber)
if self.callbacks[event] then
self.callbacks[event]()
end
end
end,
RemoveSubscriber = function(self, event, subscriber)
if self.events[event] then
local index = tIndexOf(self.events[event], subscriber)
if index then
tremove(self.events[event], index)
if not TableHasAnyEntries(self.events[event]) then
if self.callbacks[event] then
self.callbacks[event]()
end
end
end
end
end,
SetOnSubscriptionStatusChanged = function(self, event, cb)
self.callbacks[event] = cb
end,
Notify = function(self, event, ...)
if self.events[event] then
for _, subscriber in ipairs(self.events[event]) do
subscriber[event](subscriber, ...)
end
end
end,
HasSubscribers = function(self, event)
return self.events[event] and TableHasAnyEntries(self.events[event])
end
}
function Private.CreateSubscribableObject()
local system = {}
for f, func in pairs(SubscribableObject) do
system[f] = func
system.events = {}
system.callbacks = {}
end
return system
end
+1
View File
@@ -49,6 +49,7 @@ GenericTrigger.lua
AuraWarnings.lua
AuraEnvironment.lua
DebugLog.lua
SubscribableObject.lua
# Region support
RegionTypes\RegionPrototype.lua
+9
View File
@@ -44,6 +44,15 @@ function tIndexOf(tbl, item)
end
end
function TableHasAnyEntries(tbl)
if tbl and type(tbl) == "table" then
for _ in pairs(tbl) do
return true
end
end
return false
end
function IsInGroup()
return GetNumPartyMembers() > 0 or GetNumRaidMembers() > 0
end
+2 -2
View File
@@ -1021,7 +1021,7 @@ typeControlAdders = {
set = function(_, value)
if option.mediaType == "sound" then
-- do this outside the deref loop, so we don't play the sound a million times
PlaySoundFile(value)
PlaySoundFile(value, "Master")
end
for _, optionData in pairs(option.references) do
local childOption = optionData.options[optionData.index]
@@ -2353,7 +2353,7 @@ local function addUserModeOption(options, args, data, order, prefix, i)
end
userOption.set = function(_, value)
if option.mediaType == "sound" then
PlaySoundFile(value)
PlaySoundFile(value, "Master")
end
for _, optionData in pairs(option.references) do
local childData = optionData.data