Mercurial > wow > reaction
diff StanceButton.lua @ 257:920d17851a93 stable
Merge 1.1 beta 4 to stable
author | Flick |
---|---|
date | Tue, 12 Apr 2011 16:06:31 -0700 |
parents | 65f2805957a0 |
children | 9e708a155ab9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/StanceButton.lua Tue Apr 12 16:06:31 2011 -0700 @@ -0,0 +1,198 @@ +local addonName, addonTable = ... +local ReAction = addonTable.ReAction +local L = ReAction.L +local _G = _G +local CreateFrame = CreateFrame +local format = string.format +local GetCVar = GetCVar +local GameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor +local CooldownFrame_SetTimer = CooldownFrame_SetTimer +local InCombatLockdown = InCombatLockdown +local GetNumShapeshiftForms = GetNumShapeshiftForms +local GetShapeshiftFormInfo = GetShapeshiftFormInfo +local IsUsableSpell = IsUsableSpell +local GetSpellInfo = GetSpellInfo + +-- +-- private +-- +local playerClass = select(2,UnitClass("player")) + +local eventList = { + "PLAYER_REGEN_ENABLED", + "PLAYER_ENTERING_WORLD", + "UPDATE_SHAPESHIFT_FORM", + "UPDATE_SHAPESHIFT_FORMS", + "UPDATE_SHAPESHIFT_USABLE", + "UPDATE_SHAPESHIFT_COOLDOWN", + "UPDATE_BINDINGS", +} + +-- +-- Stance Button class +-- +local buttonTypeID = "Stance" +local Super = ReAction.Button +local Stance = setmetatable( + { + defaultConfig = { + type = buttonTypeID, + btnHeight = 36, + btnWidth = 36, + btnRows = 1, + btnColumns = 6, + spacing = 3 + }, + + barType = L["Stance Bar"], + buttonTypeID = buttonTypeID + }, + { __index = Super } ) + +ReAction.Button.Stance = Stance +ReAction:RegisterBarType(Stance) + +function Stance:New( config, bar, idx, idHint ) + local name = format("ReAction_%s_Stance_%d",bar:GetName(),idx) + + self = Super.New(self, name, config, bar, idx, "SecureActionButtonTemplate, ActionButtonTemplate" ) + + local f = self:GetFrame() + local barFrame = bar:GetFrame() + local config = self:GetConfig() + + -- set up the base stance ID + self:SetActionIDPool("stance",8) + config.stanceID = self:AcquireActionID(config.stanceID, idHint, true) + + -- attribute setup + f:SetAttribute("type","spell") + + -- 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("PreClick", function(frame, ...) self:PreClick(...) end) + + -- secure handlers + -- (none) + + -- event registration + f:EnableMouse(true) + f:RegisterForClicks("AnyUp") + for _, evt in pairs(eventList) do + f:RegisterEvent(evt) + end + + -- attach to skinner + bar:SkinButton(self) + + -- initial display + if ReAction:GetConfigMode() then + self:GetFrame():Show() + end + + self:Refresh() + + return self +end + +function Stance:GetActionID() + return self.config.stanceID +end + +function Stance:UpdateAction() + if InCombatLockdown() then + self.updatePending = true + else + self.updatePending = false + local idx = self:GetActionID() + local f = self:GetFrame() + if idx > GetNumShapeshiftForms() then + f:Hide() + else + f:SetAttribute("spell", select(2,GetShapeshiftFormInfo(idx))) + f:Show() + self:Update() + end + end +end + +function Stance:Refresh() + Super.Refresh(self) + self:UpdateHotkey() + self:UpdateAction() +end + +function Stance:Update() + local texture, _, isActive, isCastable = GetShapeshiftFormInfo(self:GetActionID()) + + local icon = self.frames.icon + icon:SetTexture(texture) + self:GetFrame():SetChecked( isActive and 1 or 0 ) + if isCastable then + self.frames.hotkey:Show() + icon:SetVertexColor(1.0, 1.0, 1.0) + else + icon:SetVertexColor(0.4, 0.4, 0.4) + end + + self:UpdateCooldown() +end + +function Stance:UpdateCooldown() + local start, duration, enabled = GetShapeshiftFormCooldown(self:GetActionID()) + if start then + CooldownFrame_SetTimer(self.frames.cooldown, start, duration, enabled) + end +end + +function Stance:SetTooltip() + if GetCVar("UberTooltips") == "1" then + GameTooltip_SetDefaultAnchor(GameTooltip, self:GetFrame()) + else + GameTooltip:SetOwner(self:GetFrame(), "ANCHOR_RIGHT") + end + GameTooltip:SetShapeshift(self:GetActionID()) +end + +function Stance:OnEnter() + self:SetTooltip() +end + +function Stance:OnLeave() + GameTooltip:Hide() +end + +function Stance:PreClick() + local f = self:GetFrame() + f:SetChecked( not f:GetChecked() ) +end + +function Stance:OnEvent(event, arg) + if event == "PLAYER_REGEN_ENABLED" then + if self.updatePending then + self:UpdateAction() + end + elseif event == "UPDATE_SHAPESHIFT_COOLDOWN" then + self:UpdateCooldown() + elseif event == "UPDATE_SHAPESHIFT_FORMS" then + self:UpdateAction() + elseif event == "UNIT_AURA" then + if arg == "player" then + self:Update() + end + elseif event == "UPDATE_BINDINGS" then + self:UpdateHotkey() + else + self:Update() + end +end + +function Stance:ShowGridTemp(show) + if show then + self:GetFrame():Show() + else + self:UpdateAction() + end +end