Mercurial > wow > reaction
comparison modules/Action.lua @ 234:0e20f65375d5
Reworked button creation to not use goofy event driven semantics.
| author | Flick |
|---|---|
| date | Tue, 22 Mar 2011 17:05:51 -0700 |
| parents | c4b134512c50 |
| children | 704f4a05a1d7 |
comparison
equal
deleted
inserted
replaced
| 233:9b9f5fc84d34 | 234:0e20f65375d5 |
|---|---|
| 1 local addonName, addonTable = ... | 1 local addonName, addonTable = ... |
| 2 local ReAction = addonTable.ReAction | 2 local ReAction = addonTable.ReAction |
| 3 local L = ReAction.L | 3 local L = ReAction.L |
| 4 local _G = _G | 4 local _G = _G |
| 5 local CreateFrame = CreateFrame | |
| 6 local format = string.format | 5 local format = string.format |
| 7 local wipe = wipe | 6 local wipe = wipe |
| 8 | 7 |
| 9 local weak = { __mode="k" } | 8 local weak = { __mode="k" } |
| 10 | 9 |
| 20 -- Event handlers | 19 -- Event handlers |
| 21 function module:OnInitialize() | 20 function module:OnInitialize() |
| 22 self.handles = setmetatable({ }, weak) | 21 self.handles = setmetatable({ }, weak) |
| 23 | 22 |
| 24 ReAction:RegisterBarOptionGenerator(self, "GetBarOptions") | 23 ReAction:RegisterBarOptionGenerator(self, "GetBarOptions") |
| 25 | |
| 26 ReAction.RegisterCallback(self, "OnCreateBar") | |
| 27 ReAction.RegisterCallback(self, "OnRefreshBar") | |
| 28 ReAction.RegisterCallback(self, "OnDestroyBar") | |
| 29 end | 24 end |
| 30 | 25 |
| 31 function module:OnEnable() | 26 function module:OnEnable() |
| 32 ReAction:GetModule("State"):RegisterStateProperty("page", nil, PropHandler.GetOptions(), PropHandler) | 27 ReAction:GetModule("State"):RegisterStateProperty("page", nil, PropHandler.GetOptions(), PropHandler) |
| 33 end | 28 end |
| 34 | 29 |
| 35 function module:OnDisable() | 30 function module:OnDisable() |
| 36 ReAction:GetModule("State"):UnregisterStateProperty("page") | 31 ReAction:GetModule("State"):UnregisterStateProperty("page") |
| 37 end | 32 end |
| 38 | 33 |
| 39 function module:OnCreateBar(event, bar, name) | |
| 40 if bar.config.type == moduleID then | |
| 41 if self.handles[bar] == nil then | |
| 42 self.handles[bar] = Handle:New(bar) | |
| 43 end | |
| 44 end | |
| 45 end | |
| 46 | |
| 47 function module:OnRefreshBar(event, bar, name) | |
| 48 if self.handles[bar] then | |
| 49 self.handles[bar]:Refresh() | |
| 50 end | |
| 51 end | |
| 52 | |
| 53 function module:OnDestroyBar(event, bar, name) | |
| 54 if self.handles[bar] then | |
| 55 self.handles[bar]:Destroy() | |
| 56 self.handles[bar] = nil | |
| 57 end | |
| 58 end | |
| 59 | 34 |
| 60 | 35 |
| 61 ---- Interface ---- | 36 ---- Interface ---- |
| 62 function module:GetBarOptions(bar) | 37 function module:GetBarOptions(bar) |
| 63 local h = self.handles[bar] | 38 self.handles[bar] = self.handles[bar] or Handle:New(bar) |
| 64 if h then | 39 return self.handles[bar]:GetOptions() |
| 65 return h:GetOptions() | |
| 66 end | |
| 67 end | 40 end |
| 68 | 41 |
| 69 | 42 |
| 70 ---- Bar Handle ---- | 43 ---- Bar Handle ---- |
| 71 | 44 |
| 202 } | 175 } |
| 203 | 176 |
| 204 local meta = { __index = Handle } | 177 local meta = { __index = Handle } |
| 205 | 178 |
| 206 function Handle:New( bar ) | 179 function Handle:New( bar ) |
| 207 local config = bar:GetConfig() | 180 return setmetatable( |
| 208 local self = setmetatable( | |
| 209 { | 181 { |
| 210 bar = bar, | 182 bar = bar, |
| 211 config = config, | 183 config = bar:GetConfig(), |
| 212 btns = { } | |
| 213 }, | 184 }, |
| 214 meta) | 185 meta) |
| 215 | |
| 216 if self.config.buttons == nil then | |
| 217 self.config.buttons = { } | |
| 218 end | |
| 219 self:Refresh() | |
| 220 return self | |
| 221 end | 186 end |
| 222 | 187 |
| 223 function Handle:Refresh() | 188 function Handle:Refresh() |
| 224 local r, c = self.bar:GetButtonGrid() | 189 Button:SetupBar(bar) |
| 225 local n = r*c | |
| 226 local btnCfg = self.config.buttons | |
| 227 if n ~= #self.btns then | |
| 228 for i = 1, n do | |
| 229 if btnCfg[i] == nil then | |
| 230 btnCfg[i] = {} | |
| 231 end | |
| 232 if self.btns[i] == nil then | |
| 233 local lastButton = self:GetLastButton() | |
| 234 local hint = lastButton and lastButton.config.actionID | |
| 235 local b = Button:New(i, self.config, self.bar, hint) | |
| 236 self.btns[i] = b | |
| 237 self.bar:AddButton(i,b) | |
| 238 end | |
| 239 end | |
| 240 for i = n+1, #self.btns do | |
| 241 if self.btns[i] then | |
| 242 self.bar:RemoveButton(self.btns[i]) | |
| 243 self.btns[i]:Destroy() | |
| 244 self.btns[i] = nil | |
| 245 btnCfg[i] = nil | |
| 246 end | |
| 247 end | |
| 248 end | |
| 249 for _, b in ipairs(self.btns) do | |
| 250 b:Refresh() | |
| 251 end | |
| 252 Button.SetupBarHeader(self.bar,self.config) | |
| 253 self:UpdateButtonLock() | |
| 254 end | |
| 255 | |
| 256 function Handle:Destroy() | |
| 257 for _,b in pairs(self.btns) do | |
| 258 if b then | |
| 259 b:Destroy() | |
| 260 end | |
| 261 end | |
| 262 end | 190 end |
| 263 | 191 |
| 264 function Handle:UpdateButtonLock() | 192 function Handle:UpdateButtonLock() |
| 265 Button.SetButtonLock(self.bar, self.config.lockButtons, self.config.lockButtonsCombat) | 193 Button.SetButtonLock(self.bar, self.config.lockButtons, self.config.lockButtonsCombat) |
| 266 end | 194 end |
| 267 | 195 |
| 268 function Handle:GetLastButton() | 196 function Handle:GetLastButton() |
| 269 return self.btns[#self.btns] | 197 return self.bar:GetButton(self.bar:GetNumButtons()) |
| 270 end | 198 end |
| 271 | 199 |
| 272 -- options handlers | 200 -- options handlers |
| 273 function Handle:GetOptions() | 201 function Handle:GetOptions() |
| 274 return { | 202 return { |
| 280 end | 208 end |
| 281 | 209 |
| 282 function Handle:SetHideEmpty(info, value) | 210 function Handle:SetHideEmpty(info, value) |
| 283 if value ~= self.config.hideEmpty then | 211 if value ~= self.config.hideEmpty then |
| 284 self.config.hideEmpty = value | 212 self.config.hideEmpty = value |
| 285 for _, b in pairs(self.btns) do | 213 for _, b in self.bar:IterateButtons() do |
| 286 b:ShowGrid(not value) | 214 b:ShowGrid(not value) |
| 287 end | 215 end |
| 288 end | 216 end |
| 289 end | 217 end |
| 290 | 218 |
| 437 function Handle:GetActionID() | 365 function Handle:GetActionID() |
| 438 local row = self.selectedRow or 1 | 366 local row = self.selectedRow or 1 |
| 439 local col = self.selectedColumn or 1 | 367 local col = self.selectedColumn or 1 |
| 440 local r, c = self.bar:GetButtonGrid() | 368 local r, c = self.bar:GetButtonGrid() |
| 441 local n = (row-1) * c + col | 369 local n = (row-1) * c + col |
| 442 local btn = self.btns[n] | 370 local btn = self.bar:GetButton(n) |
| 443 if btn then | 371 if btn then |
| 444 return tostring(btn:GetActionID(self.selectedPage or 1)) | 372 return tostring(btn:GetActionID(self.selectedPage or 1)) |
| 445 end | 373 end |
| 446 end | 374 end |
| 447 | 375 |
| 448 function Handle:SetActionID(info, value) | 376 function Handle:SetActionID(info, value) |
| 449 local row = self.selectedRow or 1 | 377 local row = self.selectedRow or 1 |
| 450 local col = self.selectedColumn or 1 | 378 local col = self.selectedColumn or 1 |
| 451 local r, c = self.bar:GetButtonGrid() | 379 local r, c = self.bar:GetButtonGrid() |
| 452 local n = (row-1) * c + col | 380 local n = (row-1) * c + col |
| 453 local btn = self.btns[n] | 381 local btn = self.bar:GetButton(n) |
| 454 if btn then | 382 if btn then |
| 455 btn:SetActionID(tonumber(value), self.selectedPage or 1) | 383 btn:SetActionID(tonumber(value), self.selectedPage or 1) |
| 456 end | 384 end |
| 457 end | 385 end |
| 458 | 386 |
| 470 | 398 |
| 471 function Handle:GetMultiID() | 399 function Handle:GetMultiID() |
| 472 local p = { } | 400 local p = { } |
| 473 for i = 1, self.config.nPages or 1 do | 401 for i = 1, self.config.nPages or 1 do |
| 474 local b = { } | 402 local b = { } |
| 475 for _, btn in ipairs(self.btns) do | 403 for _, btn in self.bar:IterateButtons() do |
| 476 table.insert(b, btn:GetActionID(i)) | 404 table.insert(b, btn:GetActionID(i)) |
| 477 end | 405 end |
| 478 table.insert(p, table.concat(b,",")) | 406 table.insert(p, table.concat(b,",")) |
| 479 end | 407 end |
| 480 return table.concat(p,";\n") | 408 return table.concat(p,";\n") |
| 499 end | 427 end |
| 500 return p | 428 return p |
| 501 end | 429 end |
| 502 | 430 |
| 503 function Handle:SetMultiID(info, value) | 431 function Handle:SetMultiID(info, value) |
| 504 local p = ParseMultiID(#self.btns, self.config.nPages or 1, value) | 432 local p = ParseMultiID(self.bar:GetNumButtons(), self.config.nPages or 1, value) |
| 505 for page, b in ipairs(p) do | 433 for page, b in ipairs(p) do |
| 506 for button, id in ipairs(b) do | 434 for button, id in ipairs(b) do |
| 507 self.btns[button]:SetActionID(id, page) | 435 self.bar:GetButton(button):SetActionID(id, page) |
| 508 end | 436 end |
| 509 end | 437 end |
| 510 end | 438 end |
| 511 | 439 |
| 512 function Handle:ValidateMultiID(info, value) | 440 function Handle:ValidateMultiID(info, value) |
| 513 local bad = L["Invalid action ID list string"] | 441 local bad = L["Invalid action ID list string"] |
| 514 if value == nil or ParseMultiID(#self.btns, self.config.nPages or 1, value) == nil then | 442 if value == nil or ParseMultiID(self.bar:GetNumButtons(), self.config.nPages or 1, value) == nil then |
| 515 return bad | 443 return bad |
| 516 end | 444 end |
| 517 return true | 445 return true |
| 518 end | 446 end |
| 519 end | 447 end |
