From 1f95899781db53950e16581a22e683a2115b1c2b Mon Sep 17 00:00:00 2001 From: omicron Date: Mon, 10 Apr 2023 15:06:41 +0200 Subject: [PATCH] Make Trigger responsible for default data Trigger now has a new method Trigger:SetData and two new fields Trigger.defaultData and Trigger.data Whenever SetData is used it ensures that all the keys and values from defaultData are present in the new data. The data argument from Trigger:SetState has been removed and it will now always use the Trigger.Data field for notifying indicators --- src/types/triggers/auratrigger.lua | 19 +++++++++++------- src/types/triggers/multitrigger.lua | 14 ++++++++++--- src/types/triggers/statustrigger.lua | 8 ++++---- src/types/triggers/trigger.lua | 30 +++++++++++++++++++++------- 4 files changed, 50 insertions(+), 21 deletions(-) diff --git a/src/types/triggers/auratrigger.lua b/src/types/triggers/auratrigger.lua index 3c33eb3..79ba382 100644 --- a/src/types/triggers/auratrigger.lua +++ b/src/types/triggers/auratrigger.lua @@ -38,7 +38,8 @@ function AuraTrigger.CreateFromConfig(unit, config) config.spellId, config.own, config.requiredCount, - config.invert + config.invert, + config.defaultData ) unit.auras:AddTrigger(trigger) return trigger @@ -57,8 +58,9 @@ end ---@param own boolean ---@param requiredCount number | nil ---@param invert boolean | nil -function AuraTrigger:Init(spellId, own, requiredCount, invert) - Trigger.Init(self, invert) +---@param defaultData table | nil +function AuraTrigger:Init(spellId, own, requiredCount, invert, defaultData) + Trigger.Init(self, invert, defaultData) self.spellId = spellId self.requiredCount = requiredCount or 1 self.own = own @@ -68,7 +70,7 @@ end --- Reset the AuraTrigger to the default state function AuraTrigger:Reset() self.count = 0 - self:SetState(self.count >= self.requiredCount, nil, false) + self:SetState(self.count >= self.requiredCount, false) end ---Check if a given aura matches this AuraTrigger @@ -90,15 +92,17 @@ function AuraTrigger:AddAura(aura) return end self.count = self.count + 1 - self:SetState(self.count >= self.requiredCount, {stacks=aura.applications}, false) + self:SetData({stacks=aura.applications}) + self:SetState(self.count >= self.requiredCount, false) end ---Inform the trigger about an updated aura ---@param before UnitAuraInfo ---@param after UnitAuraInfo function AuraTrigger:UpdateAura(before, after) + self:SetData({stacks=after.applications}) if self.active then - self.indicator:Update({stacks=after.applications}) + self.indicator:Update(self.data) end end @@ -109,5 +113,6 @@ function AuraTrigger:RemoveAura(aura) return end self.count = self.count - 1 - self:SetState(self.count >= self.requiredCount, nil, false) + self:SetData({}) + self:SetState(self.count >= self.requiredCount, false) end diff --git a/src/types/triggers/multitrigger.lua b/src/types/triggers/multitrigger.lua index 025ee92..71909e5 100644 --- a/src/types/triggers/multitrigger.lua +++ b/src/types/triggers/multitrigger.lua @@ -92,7 +92,8 @@ function MultiTrigger:OnChildActivate(idx, trigger, data) table.sort(activeChildren) -- The highest priority active trigger has changed if activeChild ~= activeChildren[1] then - self:SetState(true, data) + self:SetData(data) + self:SetState(true, true) end end @@ -113,8 +114,15 @@ function MultiTrigger:OnChildDeactivate(idx, trigger, data) end end table.remove(activeChildren, found) - if activeChild ~= activeChildren[1] then - self:SetState(activeChildren[1] ~= nil, childrenData[1], true) + local newActiveChild = activeChildren[1] + if activeChild ~= newActiveChild then + if activeChildren[1] ~= nil then + self:SetData(childrenData[newActiveChild]) + self:SetState(true, true) + else + self:SetData({}) + self:SetState(false, false) + end end end diff --git a/src/types/triggers/statustrigger.lua b/src/types/triggers/statustrigger.lua index c04249a..520d13a 100644 --- a/src/types/triggers/statustrigger.lua +++ b/src/types/triggers/statustrigger.lua @@ -30,7 +30,7 @@ types.StatusTrigger = StatusTrigger ---@param config table function StatusTrigger.CreateFromConfig(unit, config) local trigger = StatusTrigger:new(config.status, config.requiredCount, - config.invert) + config.invert, config.defaultData) unit.auras:AddTrigger(trigger) return trigger end @@ -47,8 +47,8 @@ end ---@param status string The kind of status to trigger on ---@param requiredCount number | nil ---@param invert boolean | nil -function StatusTrigger:Init(status, requiredCount, invert) - Trigger.Init(self, invert) +function StatusTrigger:Init(status, requiredCount, invert, defaultData) + Trigger.Init(self, invert, defaultData) self.status = status self.requiredCount = requiredCount or 1 self.invert = invert or false @@ -59,5 +59,5 @@ end -- status: -- Must be a valid UnitAuraInfo function StatusTrigger:UpdateStatus(count) - self:SetState(count >= self.requiredCount, nil, false) + self:SetState(count >= self.requiredCount, false) end diff --git a/src/types/triggers/trigger.lua b/src/types/triggers/trigger.lua index 700684b..6a80bc8 100644 --- a/src/types/triggers/trigger.lua +++ b/src/types/triggers/trigger.lua @@ -23,6 +23,8 @@ local types = omi.GetModule("types") ---@class Trigger: Object ---@field active boolean ---@field invert boolean +---@field indicator Indicator +---@field data table The most recent data updated by the data source local Trigger = types.CreateClass("Trigger") types.Trigger = Trigger @@ -36,10 +38,25 @@ end --- Initialize a new Trigger object ---@param invert boolean|nil -function Trigger:Init(invert) +---@param defaultData table|nil default data that is always present when this trigger updates an indicator +function Trigger:Init(invert, defaultData) invert = invert or false self.invert = invert self.active = invert + self.defaultData = defaultData + self:SetData({}) +end + +---Save new data from the datasource into the trigger. This method will make +---sure the default data is always present +---@param data table +function Trigger:SetData(data) + if self.defaultData then + for k, v in pairs(self.defaultData) do + data[k] = v + end + end + self.data = data end --- Set the target of the Trigger. @@ -49,30 +66,29 @@ end function Trigger:SetTarget(target) self.indicator = target if self.active then - target:Show() + target:Show(self.data) end end ---Set the state of the trigger. Will activate the indicator if needed. ----@param data table | nil ---@param state boolean -function Trigger:SetState(state, data, doUpdate) +function Trigger:SetState(state, doUpdate) state = state ~= self.invert -- state xor inverted if self.active ~= state then if state then - self.indicator:Show(data) + self.indicator:Show(self.data) else self.indicator:Hide() end self.active = state elseif doUpdate and self.active then - self.indicator:Update(data) + self.indicator:Update(self.data) end end -- Reset the trigger to the default state. If this changes the activation of the -- trigger then the target will be notified. function Trigger:Reset() - self:SetState(false, nil, false) + self:SetState(false, false) end