Mercurial > wow > reaction
comparison modules/ReAction_Action/ReAction_Action.lua @ 24:9e1984088124
added *more* missing files from 1.0 dev tree...
| author | Flick <flickerstreak@gmail.com> |
|---|---|
| date | Fri, 07 Mar 2008 22:18:23 +0000 |
| parents | |
| children | 21bcaf8215ff |
comparison
equal
deleted
inserted
replaced
| 23:dba04d85c799 | 24:9e1984088124 |
|---|---|
| 1 --[[ | |
| 2 ReAction Action-button module. | |
| 3 | |
| 4 The button module implements standard action button functionality by wrapping Blizzard's | |
| 5 ActionButton frame and associated functions. It also provides some button layout | |
| 6 modification tools. | |
| 7 | |
| 8 --]] | |
| 9 | |
| 10 -- local imports | |
| 11 local ReAction = ReAction | |
| 12 local L = ReAction.L | |
| 13 local _G = _G | |
| 14 local AceOO = AceLibrary("AceOO-2.0") | |
| 15 local CreateFrame = CreateFrame | |
| 16 local print = ReAction.print | |
| 17 | |
| 18 -- module declaration | |
| 19 local moduleID = "Action" | |
| 20 local module = ReAction:NewModule( moduleID, | |
| 21 "AceEvent-2.0" | |
| 22 ) | |
| 23 | |
| 24 -- | |
| 25 -- action button class declaration | |
| 26 -- | |
| 27 local BtnClass = AceOO.Class() | |
| 28 local Button = BtnClass.prototype | |
| 29 module.BtnClass = BtnClass | |
| 30 | |
| 31 | |
| 32 | |
| 33 -- module methods | |
| 34 function module:OnInitialize() | |
| 35 self.db = ReAction:AcquireDBNamespace(moduleID) | |
| 36 ReAction:RegisterDefaults(moduleID,"profile", | |
| 37 { | |
| 38 buttons = { } | |
| 39 } | |
| 40 ) | |
| 41 | |
| 42 self.buttons = { } | |
| 43 end | |
| 44 | |
| 45 function module:OnEnable() | |
| 46 end | |
| 47 | |
| 48 function module:OnDisable() | |
| 49 end | |
| 50 | |
| 51 function module:OnProfileEnable() | |
| 52 end | |
| 53 | |
| 54 function module:ApplyToBar(bar) | |
| 55 self:RefreshBar(bar) | |
| 56 end | |
| 57 | |
| 58 function module:RefreshBar(bar) | |
| 59 if self.buttons[bar] == nil then | |
| 60 self.buttons[bar] = { } | |
| 61 end | |
| 62 local btns = self.buttons[bar] | |
| 63 local profile = self.db.profile | |
| 64 local barName = bar:GetName() | |
| 65 if profile.buttons[barName] == nil then | |
| 66 profile.buttons[barName] = {} | |
| 67 end | |
| 68 local btnCfg = profile.buttons[barName] | |
| 69 | |
| 70 local r, c = bar:GetButtonGrid() | |
| 71 local n = r*c | |
| 72 for i = 1, n do | |
| 73 if btnCfg[i] == nil then | |
| 74 btnCfg[i] = {} | |
| 75 end | |
| 76 if btns[i] == nil then | |
| 77 btns[i] = self.BtnClass:new(bar,i,btnCfg[i]) | |
| 78 else | |
| 79 btns[i]:Refresh(bar,i) | |
| 80 end | |
| 81 end | |
| 82 for i = n+1, #btns do | |
| 83 btns[i] = btns[i]:Destroy() | |
| 84 if btnCfg[i] then | |
| 85 btnCfg[i] = nil | |
| 86 end | |
| 87 end | |
| 88 end | |
| 89 | |
| 90 function module:RemoveFromBar(bar) | |
| 91 if self.buttons[bar] then | |
| 92 local btns = self.buttons[bar] | |
| 93 for _,b in pairs(btns) do | |
| 94 if b then | |
| 95 b:Destroy() | |
| 96 end | |
| 97 end | |
| 98 self.buttons[bar] = nil | |
| 99 end | |
| 100 end | |
| 101 | |
| 102 function module:EraseBarConfig(barName) | |
| 103 self.db.profile.buttons[barName] = nil | |
| 104 end | |
| 105 | |
| 106 function module:ApplyConfigMode(mode,bars) | |
| 107 for _, btns in pairs(self.buttons) do | |
| 108 if btn then | |
| 109 for _, b in pairs(btns) do | |
| 110 if b then | |
| 111 if mode then | |
| 112 if not b.actionIDLabel then | |
| 113 local label = b:GetFrame():CreateFontString(nil,"OVERLAY","GameFontNormalLarge") | |
| 114 label:SetAllPoints() | |
| 115 label:SetJustifyH("CENTER") | |
| 116 label:SetShadowColor(0,0,0,1) | |
| 117 label:SetShadowOffset(2,-2) | |
| 118 label:SetText(tostring(b:GetActionID())) | |
| 119 b.actionIDLabel = label | |
| 120 end | |
| 121 b.actionIDLabel:Show() | |
| 122 elseif b.actionIDLabel then | |
| 123 b.actionIDLabel:Hide() | |
| 124 end | |
| 125 end | |
| 126 end | |
| 127 end | |
| 128 end | |
| 129 end | |
| 130 | |
| 131 function module:GetGlobalBarOptions(opts) | |
| 132 if self.globalBarOpts == nil then | |
| 133 self.globalBarOpts = { | |
| 134 newActionBar = { | |
| 135 type = "execute", | |
| 136 name = L["New Action Bar"], | |
| 137 desc = L["Create a new bar of standard action buttons"], | |
| 138 func = function() | |
| 139 ReAction:GetModule("Bar"):CreateBar() | |
| 140 end, | |
| 141 disabled = InCombatLockdown, | |
| 142 } | |
| 143 } | |
| 144 end | |
| 145 return self.globalBarOpts | |
| 146 end | |
| 147 | |
| 148 function module:GetBarMenuOptions(bar) | |
| 149 if not bar.modMenuOpts[moduleID] then | |
| 150 bar.modMenuOpts[moduleID] = { | |
| 151 } | |
| 152 end | |
| 153 return bar.modMenuOpts[moduleID] | |
| 154 end | |
| 155 | |
| 156 function module:GetBarConfigOptions(bar) | |
| 157 if not bar.modConfigOpts[moduleID] then | |
| 158 bar.modConfigOpts[moduleID] = { | |
| 159 } | |
| 160 end | |
| 161 return bar.modConfigOpts[moduleID] | |
| 162 end | |
| 163 | |
| 164 | |
| 165 | |
| 166 -- use-count of action IDs | |
| 167 local ActionIDList = setmetatable( {}, { | |
| 168 __index = function(self, idx) | |
| 169 if idx == nil then | |
| 170 for i = 1, 120 do | |
| 171 if rawget(self,i) == nil then | |
| 172 rawset(self,i,1) | |
| 173 return i | |
| 174 end | |
| 175 end | |
| 176 else | |
| 177 local c = rawget(self,idx) or 0 | |
| 178 rawset(self,idx,c+1) | |
| 179 return idx | |
| 180 end | |
| 181 end, | |
| 182 __newindex = function(self,idx,value) | |
| 183 if value == nil then | |
| 184 value = rawget(self,idx) | |
| 185 if value == 1 then | |
| 186 value = nil | |
| 187 elseif value then | |
| 188 value = value - 1 | |
| 189 end | |
| 190 end | |
| 191 rawset(self,idx,value) | |
| 192 end | |
| 193 }) | |
| 194 | |
| 195 | |
| 196 | |
| 197 -- button class methods | |
| 198 function Button:init( bar, idx, config ) | |
| 199 BtnClass.super.prototype.init(self) | |
| 200 self.bar, self.idx, self.config = bar, idx, config | |
| 201 | |
| 202 local barFrame = bar:GetFrame() | |
| 203 | |
| 204 self.name = config.name or "ReAction_"..bar:GetName().."_"..idx | |
| 205 config.actionID = ActionIDList[config.actionID] -- gets a free one if none configured | |
| 206 | |
| 207 local f = CreateFrame("CheckButton", self.name, barFrame, "ActionBarButtonTemplate") | |
| 208 -- TODO: re-implement ActionButton event handlers that don't do secure stuff | |
| 209 | |
| 210 -- this will probably cause taint, using right now for display/debugging purposes | |
| 211 f:SetScript("OnAttributeChanged", | |
| 212 function() | |
| 213 ActionButton_UpdateAction() | |
| 214 end | |
| 215 ) | |
| 216 f:SetAttribute("action", config.actionID) | |
| 217 barFrame:SetAttribute("addchild",f) | |
| 218 self.frame = f | |
| 219 self:Refresh(bar,idx) | |
| 220 end | |
| 221 | |
| 222 function Button:Destroy() | |
| 223 local f = self.frame | |
| 224 f:UnregisterAllEvents() | |
| 225 f:Hide() | |
| 226 f:SetParent(UIParent) | |
| 227 f:ClearAllPoints() | |
| 228 if self.config.name then | |
| 229 _G[self.config.name] = nil | |
| 230 end | |
| 231 ActionIDList[self.config.actionID] = nil | |
| 232 self.frame = nil | |
| 233 self.config = nil | |
| 234 self.bar = nil | |
| 235 end | |
| 236 | |
| 237 function Button:Refresh(bar,idx) | |
| 238 bar:PlaceButton(self.frame, idx, 36, 36) | |
| 239 end | |
| 240 | |
| 241 function Button:GetFrame() | |
| 242 return self.frame | |
| 243 end | |
| 244 | |
| 245 function Button:GetName() | |
| 246 return self.name | |
| 247 end | |
| 248 | |
| 249 function Button:GetActionID() | |
| 250 return self.config.actionID | |
| 251 end |
