Mercurial > wow > reaction
changeset 299:e337b39dc491
Add ExtraActionButton support
author | Flick |
---|---|
date | Wed, 14 Nov 2012 16:38:53 -0800 |
parents | d1a56601267b |
children | a682fac2aa98 |
files | ActionButton.lua Button.lua ExtraActionButton.lua ReAction.xml VehicleExitButton.lua locale/enUS.lua |
diffstat | 6 files changed, 131 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/ActionButton.lua Wed Nov 14 16:35:18 2012 -0800 +++ b/ActionButton.lua Wed Nov 14 16:38:53 2012 -0800 @@ -187,7 +187,8 @@ }, barType = L["Action Bar"], - buttonTypeID = buttonTypeID + buttonTypeID = buttonTypeID, + eventList = eventList }, { __index = Super } )
--- a/Button.lua Wed Nov 14 16:35:18 2012 -0800 +++ b/Button.lua Wed Nov 14 16:38:53 2012 -0800 @@ -204,6 +204,10 @@ if not poolID or not maxID then error("AcquireActionID: must setup pool first with SetActionIDPool") end + hint = tonumber(hint) + if hint and (hint < 1 or hint > maxID) then + hint = nil + end local pool = idPools[poolID] if not pool then pool = { nWraps = 0, useCount = { } } @@ -216,19 +220,19 @@ if id == nil then repeat local nWraps = pool.nWraps or 0 - if hint and (useCount[hint] == nil or useCount[hint] == nWraps) then + if hint and (useCount[hint] == 0 or useCount[hint] == nWraps) then id = hint else local start = hint or 1 for i = start, maxID do - if useCount[i] == nil or useCount[i] == nWraps then + if useCount[i] == 0 or useCount[i] == nWraps then id = i break end end if not id then for i = 1, start do - if useCount[i] == nil or useCount[i] == nWraps then + if useCount[i] == 0 or useCount[i] == nWraps then id = i break end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtraActionButton.lua Wed Nov 14 16:38:53 2012 -0800 @@ -0,0 +1,114 @@ +local _, ns = ... +local ReAction = ns.ReAction +local L = ReAction.L +local format = string.format + +-- +-- ExtraAction Button class +-- +local buttonTypeID = "ExtraAction" +local Super = ReAction.Button.Action +local ExtraAction = setmetatable( + { + defaultBarConfig = { + type = buttonTypeID , + btnWidth = 52, + btnHeight = 52, + btnRows = 1, + btnColumns = 1, + spacing = 3, + buttons = { } + }, + + barType = L["Special Action Button"], + buttonTypeID = buttonTypeID + }, + { __index = Super } ) + +ReAction.Button.ExtraAction = ExtraAction +ReAction:RegisterBarType(ExtraAction) + +function ExtraAction:New( config, bar, idx, idHint ) + -- don't invoke the base ActionButton constructor, since it does a bunch of stuff that + -- we don't need. Instead, call the Button base constructor directly instead and + -- re-implement the bits of the ActionButton constructor that we actually need. + self = ReAction.Button.New(self, config, bar, idx, "SecureActionButtonTemplate, ActionButtonTemplate" ) + + self.barConfig = bar:GetConfig() + + local f = self:GetFrame() + local barFrame = bar:GetFrame() + + self.rangeTimer = TOOLTIP_UPDATE_TIME + + self:SetActionIDPool("special-action",1) + config.actionID = self:AcquireActionID(config.actionID, idHint, true) + self.nPages = 1 + + -- compute the actual game action-ID from the extra bar offset page + local actionID = config.actionID + (GetExtraBarIndex() - 1)*NUM_ACTIONBAR_BUTTONS + self.actionID = actionID + f.action = actionID + + -- attribute setup + f:SetAttribute("type","action") + f:SetAttribute("checkselfcast", true) + f:SetAttribute("checkfocuscast", true) + f:SetAttribute("action", actionID) + f:SetAttribute("default-action", actionID) + f:SetAttribute("bar-idx",idx) + + -- non secure scripts + f:SetScript("OnEvent", function(frame, ...) self:OnEvent(...) end) + f:SetScript("OnEnter", function(frame) self:OnEnter() end) + f:SetScript("OnLeave", function(frame) self:OnLeave() end) + f:SetScript("OnAttributeChanged", function(frame, attr, value) self:OnAttributeChanged(attr, value) end) + f:SetScript("PostClick", function(frame, ...) self:PostClick(...) end) + f:SetScript("OnUpdate", function(frame, elapsed) self:OnUpdate(elapsed) end) + + -- event registration + for _, evt in pairs(self.eventList) do + f:RegisterEvent(evt) + end + + -- register to use the C cooldown implementation + SetActionUIButton(f, actionID, f.cooldown) + + -- attach to skinner + bar:SkinButton(self) + + self:Refresh() + + return self +end + +function ExtraAction:Destroy() + -- similarly, don't call the ActionButton destructor function, call the Button destructor function + ReAction.Button.Destroy(self) +end + +function ExtraAction:SetupBar(bar) + -- again don't call the ActionButton:SetupBar method, because it does a lot of things we don't need/want. + -- however the Button base class SetupBar method does need to be called. + ReAction.Button.SetupBar(self,bar) + + -- show/hide the bar based on whether we have an extrabar. Hook into the unitexists mechanism that the pet bar uses. + RegisterStateDriver(bar:GetFrame(), "unitexists", "[extrabar] show ; hide") +end + +function ExtraAction:ShowGrid() + -- override: do nothing +end + +function ExtraAction:ShowGridTemp( show ) + -- override: do nothing +end + +function ExtraAction:SetActionID() + -- override: action ID never changes +end + +function ExtraAction:RefreshPages() + -- override: action ID never changes +end +
--- a/ReAction.xml Wed Nov 14 16:35:18 2012 -0800 +++ b/ReAction.xml Wed Nov 14 16:38:53 2012 -0800 @@ -15,6 +15,7 @@ <Script file="StanceButton.lua"/> <Script file="BagButton.lua"/> <Script file="VehicleExitButton.lua"/> + <Script file="ExtraActionButton.lua"/> <Script file="Options.lua"/> <Script file="Editor.lua"/> </Ui>
--- a/VehicleExitButton.lua Wed Nov 14 16:35:18 2012 -0800 +++ b/VehicleExitButton.lua Wed Nov 14 16:38:53 2012 -0800 @@ -28,7 +28,7 @@ ReAction.Button.VehicleExit = VExitButton ReAction:RegisterBarType(VExitButton) -function VExitButton:New( config, bar, idx ) +function VExitButton:New( config, bar, idx, idHint ) self = Super.New(self, config, bar, idx, "SecureFrameTemplate, ActionButtonTemplate", "Button") -- frame setup @@ -36,6 +36,9 @@ self.frames.icon:SetTexture("Interface\\Vehicles\\UI-Vehicles-Button-Exit-Up") self.frames.icon:SetTexCoord(0.140625, 0.859375, 0.140625, 0.859375) + self:SetActionIDPool("vehicle-exit",1) + self:AcquireActionID(nil, idHint, true) + -- attribute setup -- (none) @@ -66,14 +69,6 @@ return 1 end -function VExitButton:AcquireActionID() - -- don't use pool -end - -function VExitButton:ReleaseActionID() - -- don't use pool -end - function VExitButton:Refresh() Super.Refresh(self) -- it seems that setscale kills the texcoord, have to refresh it