| flickerstreak@28 | 1 --[[ | 
| flickerstreak@53 | 2   ReAction Pet Action button module | 
| flickerstreak@53 | 3 | 
| flickerstreak@53 | 4   The button module implements standard action button functionality by wrapping Blizzard's | 
| flickerstreak@77 | 5   PetActionButton frame and associated functions. | 
| flickerstreak@28 | 6 | 
| flickerstreak@28 | 7 --]] | 
| flickerstreak@28 | 8 | 
| flickerstreak@28 | 9 -- local imports | 
| flickerstreak@175 | 10 local addonName, addonTable = ... | 
| flickerstreak@175 | 11 local ReAction = addonTable.ReAction | 
| flickerstreak@28 | 12 local L = ReAction.L | 
| flickerstreak@28 | 13 local _G = _G | 
| flickerstreak@53 | 14 local CreateFrame = CreateFrame | 
| flickerstreak@95 | 15 local format = string.format | 
| flickerstreak@28 | 16 | 
| flickerstreak@28 | 17 -- module declaration | 
| flickerstreak@28 | 18 local moduleID = "PetAction" | 
| flickerstreak@28 | 19 local module = ReAction:NewModule( moduleID ) | 
| flickerstreak@28 | 20 | 
| flickerstreak@130 | 21 -- Button class | 
| flickerstreak@130 | 22 local Button = ReAction.Button.PetAction | 
| flickerstreak@77 | 23 | 
| flickerstreak@102 | 24 -- private | 
| flickerstreak@102 | 25 local function UpdateButtonLock(bar) | 
| flickerstreak@102 | 26   local f = bar:GetFrame() | 
| flickerstreak@102 | 27   f:SetAttribute("lockbuttons",bar.config.lockButtons) | 
| flickerstreak@102 | 28   f:SetAttribute("lockbuttonscombat",bar.config.lockButtonsCombat) | 
| flickerstreak@102 | 29   f:Execute( | 
| flickerstreak@102 | 30     [[ | 
| flickerstreak@102 | 31       lockButtons = self:GetAttribute("lockbuttons") | 
| flickerstreak@102 | 32       lockButtonsCombat = self:GetAttribute("lockbuttonscombat") | 
| flickerstreak@102 | 33     ]]) | 
| flickerstreak@102 | 34 end | 
| flickerstreak@102 | 35 | 
| flickerstreak@28 | 36 -- module methods | 
| flickerstreak@28 | 37 function module:OnInitialize() | 
| flickerstreak@53 | 38   self.db = ReAction.db:RegisterNamespace( moduleID, | 
| flickerstreak@28 | 39     { | 
| flickerstreak@28 | 40       profile = { | 
| flickerstreak@28 | 41         buttons = { } | 
| flickerstreak@28 | 42       } | 
| flickerstreak@28 | 43     } | 
| flickerstreak@28 | 44   ) | 
| flickerstreak@53 | 45   self.buttons = { } | 
| flickerstreak@63 | 46 | 
| flickerstreak@63 | 47   ReAction:RegisterBarOptionGenerator(self, "GetBarOptions") | 
| flickerstreak@63 | 48 | 
| flickerstreak@63 | 49   ReAction.RegisterCallback(self, "OnCreateBar") | 
| flickerstreak@63 | 50   ReAction.RegisterCallback(self, "OnDestroyBar") | 
| flickerstreak@63 | 51   ReAction.RegisterCallback(self, "OnRefreshBar") | 
| flickerstreak@63 | 52   ReAction.RegisterCallback(self, "OnEraseBar") | 
| flickerstreak@63 | 53   ReAction.RegisterCallback(self, "OnRenameBar") | 
| flickerstreak@28 | 54 end | 
| flickerstreak@28 | 55 | 
| flickerstreak@28 | 56 function module:OnEnable() | 
| flickerstreak@53 | 57   ReAction:RegisterBarType(L["Pet Action Bar"], | 
| flickerstreak@53 | 58     { | 
| flickerstreak@53 | 59       type = moduleID , | 
| flickerstreak@53 | 60       defaultButtonSize = 30, | 
| flickerstreak@53 | 61       defaultBarRows = 1, | 
| flickerstreak@53 | 62       defaultBarCols = 10, | 
| flickerstreak@53 | 63       defaultBarSpacing = 8 | 
| flickerstreak@53 | 64     }) | 
| flickerstreak@28 | 65 end | 
| flickerstreak@28 | 66 | 
| flickerstreak@28 | 67 function module:OnDisable() | 
| flickerstreak@53 | 68   ReAction:UnregisterBarType(L["Pet Action Bar"]) | 
| flickerstreak@28 | 69 end | 
| flickerstreak@28 | 70 | 
| flickerstreak@63 | 71 function module:OnCreateBar(event, bar, name) | 
| flickerstreak@53 | 72   if bar.config.type == moduleID then | 
| flickerstreak@53 | 73     -- auto show/hide when pet exists | 
| flickerstreak@148 | 74     bar:RegisterUnitWatch("pet",true) | 
| flickerstreak@63 | 75     self:OnRefreshBar(event, bar, name) | 
| flickerstreak@28 | 76   end | 
| flickerstreak@28 | 77 end | 
| flickerstreak@28 | 78 | 
| flickerstreak@63 | 79 function module:OnRefreshBar(event, bar, name) | 
| flickerstreak@53 | 80   if bar.config.type == moduleID then | 
| flickerstreak@53 | 81     if self.buttons[bar] == nil then | 
| flickerstreak@53 | 82       self.buttons[bar] = { } | 
| flickerstreak@53 | 83     end | 
| flickerstreak@53 | 84     local btns = self.buttons[bar] | 
| flickerstreak@53 | 85     local profile = self.db.profile | 
| flickerstreak@63 | 86     if profile.buttons[name] == nil then | 
| flickerstreak@63 | 87       profile.buttons[name] = {} | 
| flickerstreak@53 | 88     end | 
| flickerstreak@63 | 89     local btnCfg = profile.buttons[name] | 
| flickerstreak@53 | 90 | 
| flickerstreak@53 | 91     local r, c = bar:GetButtonGrid() | 
| flickerstreak@53 | 92     local n = r*c | 
| flickerstreak@53 | 93     for i = 1, n do | 
| flickerstreak@53 | 94       if btnCfg[i] == nil then | 
| flickerstreak@53 | 95         btnCfg[i] = {} | 
| flickerstreak@53 | 96       end | 
| flickerstreak@53 | 97       if btns[i] == nil then | 
| flickerstreak@130 | 98         local success, r = pcall(Button.New,Button,i,btnCfg[i],bar,i>1 and btnCfg[i-1].actionID) | 
| flickerstreak@94 | 99         if success and r then | 
| flickerstreak@94 | 100           btns[i] = r | 
| flickerstreak@94 | 101           bar:AddButton(i,r) | 
| flickerstreak@94 | 102         else | 
| flickerstreak@94 | 103           n = i - 1 | 
| flickerstreak@94 | 104           bar:ClipNButtons(n) | 
| flickerstreak@94 | 105           break | 
| flickerstreak@94 | 106         end | 
| flickerstreak@53 | 107       end | 
| flickerstreak@77 | 108       btns[i]:Refresh() | 
| flickerstreak@53 | 109     end | 
| flickerstreak@53 | 110     for i = n+1, #btns do | 
| flickerstreak@53 | 111       if btns[i] then | 
| flickerstreak@77 | 112         bar:RemoveButton(btns[i]) | 
| flickerstreak@53 | 113         btns[i] = btns[i]:Destroy() | 
| flickerstreak@53 | 114         if btnCfg[i] then | 
| flickerstreak@53 | 115           btnCfg[i] = nil | 
| flickerstreak@53 | 116         end | 
| flickerstreak@53 | 117       end | 
| flickerstreak@53 | 118     end | 
| flickerstreak@102 | 119     UpdateButtonLock(bar) | 
| flickerstreak@53 | 120   end | 
| flickerstreak@53 | 121 end | 
| flickerstreak@53 | 122 | 
| flickerstreak@63 | 123 function module:OnDestroyBar(event, bar, name) | 
| flickerstreak@53 | 124   if self.buttons[bar] then | 
| flickerstreak@53 | 125     local btns = self.buttons[bar] | 
| flickerstreak@53 | 126     for _,b in pairs(btns) do | 
| flickerstreak@53 | 127       if b then | 
| flickerstreak@53 | 128         b:Destroy() | 
| flickerstreak@53 | 129       end | 
| flickerstreak@53 | 130     end | 
| flickerstreak@53 | 131     self.buttons[bar] = nil | 
| flickerstreak@53 | 132   end | 
| flickerstreak@53 | 133 end | 
| flickerstreak@53 | 134 | 
| flickerstreak@63 | 135 function module:OnEraseBar(event, bar, name) | 
| flickerstreak@63 | 136   self.db.profile.buttons[name] = nil | 
| flickerstreak@53 | 137 end | 
| flickerstreak@53 | 138 | 
| flickerstreak@63 | 139 function module:OnRenameBar(event, bar, oldname, newname) | 
| flickerstreak@53 | 140   local b = self.db.profile.buttons | 
| flickerstreak@53 | 141   b[newname], b[oldname] = b[oldname], nil | 
| flickerstreak@53 | 142 end | 
| flickerstreak@53 | 143 | 
| flickerstreak@53 | 144 | 
| flickerstreak@60 | 145 ---- Options ---- | 
| flickerstreak@102 | 146 local Handler = { } | 
| flickerstreak@102 | 147 local meta = { __index = Handler } | 
| flickerstreak@102 | 148 | 
| flickerstreak@102 | 149 function Handler:New(bar) | 
| flickerstreak@102 | 150   return setmetatable( | 
| flickerstreak@102 | 151     { | 
| flickerstreak@102 | 152       bar = bar, | 
| flickerstreak@102 | 153       config = bar.config | 
| flickerstreak@102 | 154     }, meta) | 
| flickerstreak@102 | 155 end | 
| flickerstreak@102 | 156 | 
| flickerstreak@102 | 157 function Handler:GetLockButtons() | 
| flickerstreak@130 | 158   return self.config.lockButtons | 
| flickerstreak@102 | 159 end | 
| flickerstreak@102 | 160 | 
| flickerstreak@102 | 161 function Handler:SetLockButtons(info, value) | 
| flickerstreak@102 | 162   self.config.lockButtons = value | 
| flickerstreak@102 | 163   UpdateButtonLock(self.bar) | 
| flickerstreak@102 | 164 end | 
| flickerstreak@102 | 165 | 
| flickerstreak@102 | 166 function Handler:GetLockButtonsCombat() | 
| flickerstreak@102 | 167   return self.config.lockButtonsCombat | 
| flickerstreak@102 | 168 end | 
| flickerstreak@102 | 169 | 
| flickerstreak@102 | 170 function Handler:SetLockButtonsCombat(info, value) | 
| flickerstreak@102 | 171   self.config.lockButtonsCombat = value | 
| flickerstreak@102 | 172   UpdateButtonLock(self.bar) | 
| flickerstreak@102 | 173 end | 
| flickerstreak@102 | 174 | 
| flickerstreak@102 | 175 function Handler:LockButtonsCombatDisabled() | 
| flickerstreak@130 | 176   return not self.config.lockButtons | 
| flickerstreak@102 | 177 end | 
| flickerstreak@102 | 178 | 
| flickerstreak@102 | 179 | 
| flickerstreak@60 | 180 function module:GetBarOptions(bar) | 
| flickerstreak@91 | 181   if bar.config.type == moduleID then | 
| flickerstreak@91 | 182     return { | 
| flickerstreak@91 | 183       type = "group", | 
| flickerstreak@91 | 184       name = L["Pet Buttons"], | 
| flickerstreak@102 | 185       handler = Handler:New(bar), | 
| flickerstreak@91 | 186       args = { | 
| flickerstreak@102 | 187         lockButtons = { | 
| flickerstreak@102 | 188           name = L["Lock Buttons"], | 
| flickerstreak@147 | 189           desc = L["Prevents picking up/dragging actions (use SHIFT to override this behavior)"], | 
| flickerstreak@102 | 190           order = 2, | 
| flickerstreak@102 | 191           type = "toggle", | 
| flickerstreak@102 | 192           get = "GetLockButtons", | 
| flickerstreak@102 | 193           set = "SetLockButtons", | 
| flickerstreak@102 | 194         }, | 
| flickerstreak@102 | 195         lockOnlyCombat = { | 
| flickerstreak@102 | 196           name = L["Only in Combat"], | 
| flickerstreak@102 | 197           desc = L["Only lock the buttons when in combat"], | 
| flickerstreak@102 | 198           order = 3, | 
| flickerstreak@102 | 199           type = "toggle", | 
| flickerstreak@102 | 200           disabled = "LockButtonsCombatDisabled", | 
| flickerstreak@102 | 201           get = "GetLockButtonsCombat", | 
| flickerstreak@102 | 202           set = "SetLockButtonsCombat", | 
| flickerstreak@102 | 203         }, | 
| flickerstreak@91 | 204       } | 
| flickerstreak@60 | 205     } | 
| flickerstreak@91 | 206   end | 
| flickerstreak@59 | 207 end | 
| flickerstreak@59 | 208 | 
| flickerstreak@53 | 209 |