Mercurial > wow > reaction
comparison classes/ReAction_PetActionDisplay.lua @ 7:f920db5fc6b1
version 0.3
| author | Flick <flickerstreak@gmail.com> |
|---|---|
| date | Tue, 20 Mar 2007 21:25:29 +0000 |
| parents | |
| children | c05fd3e18b4f |
comparison
equal
deleted
inserted
replaced
| 6:2da5089ab7ff | 7:f920db5fc6b1 |
|---|---|
| 1 -- The ReAction.PetActionDisplay mixin defines 'regular' action button display functionality | |
| 2 -- and is an implementation of the ReAction.IDisplay and ReAction.ActionType.IDisplay interfaces. | |
| 3 -- | |
| 4 -- This Mixin assumes that it has been mixed in with a ReAction-derived class which implements | |
| 5 -- the ReAction.IActionType and ReAction.IColorScheme interfaces. | |
| 6 -- | |
| 7 -- This mixin uses properties of self.config to define display elements: | |
| 8 -- | |
| 9 -- self.config = { | |
| 10 -- keyBindLoc = "POSITION", -- keybind anchor location | |
| 11 -- showKeyBind = true/false, -- show keybind labels | |
| 12 -- showGrid = true/false, -- always show empty buttons | |
| 13 -- } | |
| 14 -- | |
| 15 | |
| 16 local AceOO = AceLibrary("AceOO-2.0") | |
| 17 | |
| 18 ReAction.PetActionDisplay = AceOO.Mixin { | |
| 19 -- ReAction.IDisplay interface | |
| 20 "SetupDisplay", | |
| 21 "UpdateDisplay", | |
| 22 "TempShow", | |
| 23 "GetActionFrame", | |
| 24 "GetBaseButtonSize", | |
| 25 "DisplayID", | |
| 26 "DisplayHotkey", | |
| 27 | |
| 28 -- ReAction.PetActionType.IDisplay interface | |
| 29 "DisplayAutoCast", | |
| 30 "DisplayAutoCastable", | |
| 31 "DisplayInUse", | |
| 32 "DisplayUsable", | |
| 33 "DisplayIcon", | |
| 34 "DisplayCooldown", | |
| 35 | |
| 36 -- Event handlers | |
| 37 "PreClick", | |
| 38 "PostClick", | |
| 39 "OnDragStart", | |
| 40 "OnReceiveDrag", | |
| 41 "OnEnter", | |
| 42 "OnLeave", | |
| 43 | |
| 44 -- internal functions | |
| 45 "ApplyLayout", | |
| 46 "ApplyStyle", | |
| 47 "DisplayVisibility", | |
| 48 } | |
| 49 | |
| 50 local RAPAD = ReAction.PetActionDisplay | |
| 51 | |
| 52 | |
| 53 -- private constants | |
| 54 local _G = getfenv(0) | |
| 55 | |
| 56 local actionIDColor = { r=1.00, g=0.82, b=0.00, a=1.00 } -- gold | |
| 57 | |
| 58 | |
| 59 -- private functions | |
| 60 -- extract and return color fields from a table, to be fed into SetVertexColor()/SetTextColor() | |
| 61 local function tcolor(c) | |
| 62 return c.r, c.g, c.b, c.a | |
| 63 end | |
| 64 | |
| 65 | |
| 66 ----------------------------------- | |
| 67 -- Interface Implementation Methods | |
| 68 ----------------------------------- | |
| 69 function RAPAD:SetupDisplay( name ) | |
| 70 -- create the button widget | |
| 71 local b = CreateFrame("CheckButton", name, nil, "ActionButtonTemplate, SecureActionButtonTemplate") | |
| 72 b:EnableMouse() | |
| 73 b:RegisterForDrag("LeftButton", "RightButton") | |
| 74 b:RegisterForClicks("AnyUp") | |
| 75 b:SetScript("PreClick", function(arg1) self:PreClick(arg1) end) | |
| 76 b:SetScript("PostClick", function(arg1) self:PostClick(arg1) end) | |
| 77 b:SetScript("OnDragStart", function(arg1) self:OnDragStart(arg1) end) | |
| 78 b:SetScript("OnReceiveDrag", function() self:OnReceiveDrag() end) | |
| 79 b:SetScript("OnEnter", function() self:OnEnter() end) | |
| 80 b:SetScript("OnLeave", function() self:OnLeave() end) | |
| 81 | |
| 82 | |
| 83 b:SetWidth(30) | |
| 84 b:SetHeight(30) | |
| 85 | |
| 86 local tx = b:GetNormalTexture() | |
| 87 tx:ClearAllPoints() | |
| 88 tx:SetWidth(54) | |
| 89 tx:SetHeight(54) | |
| 90 tx:SetPoint("CENTER",0,-1) | |
| 91 | |
| 92 local autoCastable = b:CreateTexture(nil, "OVERLAY") | |
| 93 autoCastable:SetTexture("Interface\\Buttons\\UI-AutoCastableOverlay") | |
| 94 autoCastable:SetWidth(58) | |
| 95 autoCastable:SetHeight(58) | |
| 96 autoCastable:SetPoint("CENTER") | |
| 97 autoCastable:Hide() | |
| 98 | |
| 99 local autoCast = CreateFrame("Model",nil,b) | |
| 100 autoCast:SetModel("Interface\\Buttons\\UI-AutoCastButton.mdx") | |
| 101 autoCast:SetScale(1.2) | |
| 102 autoCast:SetAllPoints() | |
| 103 autoCast:SetSequence(0) | |
| 104 autoCast:SetSequenceTime(0,0) | |
| 105 autoCast:SetFrameStrata("HIGH") -- Otherwise it won't appear on top of the icon for some reason | |
| 106 autoCast:Hide() | |
| 107 | |
| 108 | |
| 109 local cd = _G[name.."Cooldown"] | |
| 110 cd:SetScale(1); | |
| 111 cd:ClearAllPoints(); | |
| 112 cd:SetWidth(33); | |
| 113 cd:SetHeight(33); | |
| 114 cd:SetPoint("CENTER", -2, -1); | |
| 115 | |
| 116 -- store references to the various sub-frames of ActionButtonTemplate so we don't have to look it up all the time | |
| 117 self.frames = { | |
| 118 button = b, | |
| 119 autoCastable = autoCastable, --_G[name.."AutoCastable"], | |
| 120 autoCast = autoCast, --_G[name.."AutoCast"], | |
| 121 hotkey = _G[name.."HotKey"], | |
| 122 cooldown = cd, | |
| 123 icon = _G[name.."Icon"], | |
| 124 normalTexture = tx, --_G[name.."NormalTexture2"], | |
| 125 actionID = nil, -- defer creating actionID font string until it's actually requested | |
| 126 } | |
| 127 | |
| 128 self.tmpShow_ = 0 | |
| 129 end | |
| 130 | |
| 131 function RAPAD:UpdateDisplay() | |
| 132 self:ApplyLayout() | |
| 133 self:ApplyStyle() | |
| 134 self:DisplayVisibility() | |
| 135 -- refresh the action ID display | |
| 136 if ReAction.showIDs_ then | |
| 137 self:DisplayID(self:GetID()) | |
| 138 end | |
| 139 end | |
| 140 | |
| 141 function RAPAD:TempShow( visible ) | |
| 142 visible = visible and true or false -- force data integrity | |
| 143 self.showTmp_ = max(0, (self.showTmp_ or 0) + (visible and 1 or -1)) | |
| 144 self:DisplayVisibility() | |
| 145 end | |
| 146 | |
| 147 function RAPAD:GetActionFrame() | |
| 148 return self.frames.button | |
| 149 end | |
| 150 | |
| 151 function RAPAD:GetBaseButtonSize() | |
| 152 return 30 | |
| 153 end | |
| 154 | |
| 155 function RAPAD:DisplayID( id ) | |
| 156 local f = self.frames.actionID | |
| 157 if id then | |
| 158 if not f then | |
| 159 -- create the actionID label | |
| 160 f = self.frames.button:CreateFontString(nil,"ARTWORK","NumberFontNormalSmall") | |
| 161 f:SetPoint("BOTTOMLEFT") | |
| 162 f:SetTextColor( tcolor(actionIDColor) ) | |
| 163 self.frames.actionID = f | |
| 164 end | |
| 165 f:SetText(tostring(id)) | |
| 166 f:Show() | |
| 167 elseif f then | |
| 168 f:Hide() | |
| 169 end | |
| 170 end | |
| 171 | |
| 172 function RAPAD:DisplayHotkey(txt) | |
| 173 self.frames.hotkey:SetText(string.upper(txt or "")) | |
| 174 end | |
| 175 | |
| 176 function RAPAD:DisplayInUse( inUse ) | |
| 177 self.frames.button:SetChecked( inUse and 1 or 0 ) | |
| 178 end | |
| 179 | |
| 180 function RAPAD:DisplayUsable( usable ) | |
| 181 SetDesaturation(self.frames.icon, (not usable) and 1 or nil) -- argument is backward | |
| 182 self.frames.hotkey:SetTextColor(self:GetHotkeyColor(usable, false, false, self.frames.hotkey:GetText()) ) | |
| 183 end | |
| 184 | |
| 185 function RAPAD:DisplayAutoCast( show ) | |
| 186 if show then | |
| 187 self.frames.autoCast:Show() | |
| 188 else | |
| 189 self.frames.autoCast:Hide() | |
| 190 end | |
| 191 end | |
| 192 | |
| 193 function RAPAD:DisplayAutoCastable( show ) | |
| 194 if show then | |
| 195 self.frames.autoCastable:Show() | |
| 196 else | |
| 197 self.frames.autoCastable:Hide() | |
| 198 end | |
| 199 end | |
| 200 | |
| 201 function RAPAD:DisplayIcon( texture ) | |
| 202 local f = self.frames.button | |
| 203 local icon = self.frames.icon | |
| 204 if texture then | |
| 205 icon:SetTexture(texture) | |
| 206 icon:Show() | |
| 207 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot2") | |
| 208 else | |
| 209 f:SetScript("OnUpdate",nil) | |
| 210 icon:Hide() | |
| 211 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot") | |
| 212 end | |
| 213 self:DisplayVisibility() | |
| 214 end | |
| 215 | |
| 216 function RAPAD:DisplayCooldown( start, duration, enable ) | |
| 217 CooldownFrame_SetTimer(self.frames.cooldown, start, duration, enable) | |
| 218 end | |
| 219 | |
| 220 | |
| 221 | |
| 222 | |
| 223 | |
| 224 | |
| 225 ---------------------- | |
| 226 -- Event Handlers | |
| 227 ---------------------- | |
| 228 function RAPAD:PreClick() | |
| 229 -- not sure why we have to do this | |
| 230 self.frames.button:SetChecked(0) | |
| 231 end | |
| 232 | |
| 233 function RAPAD:PostClick() | |
| 234 self:UpdateAction() | |
| 235 end | |
| 236 | |
| 237 function RAPAD:OnDragStart() | |
| 238 if LOCK_ACTIONBAR ~= "1" or IsShiftKeyDown() then | |
| 239 self:PickupAction() | |
| 240 end | |
| 241 end | |
| 242 | |
| 243 function RAPAD:OnReceiveDrag() | |
| 244 self:PlaceAction() | |
| 245 end | |
| 246 | |
| 247 function RAPAD:OnEnter() | |
| 248 self:SetTooltip() -- from ReAction base class | |
| 249 end | |
| 250 | |
| 251 function RAPAD:OnLeave() | |
| 252 self:ClearTooltip() -- from ReAction base class | |
| 253 end | |
| 254 | |
| 255 | |
| 256 | |
| 257 ---------------------- | |
| 258 -- Internal methods | |
| 259 ---------------------- | |
| 260 | |
| 261 local function placeLabel( label, anchor ) | |
| 262 local top = string.match(anchor,"TOP") | |
| 263 local bottom = string.match(anchor, "BOTTOM") | |
| 264 label:ClearAllPoints() | |
| 265 label:SetWidth(40) | |
| 266 label:SetPoint(top or bottom,0,top and 2 or -2) | |
| 267 local j | |
| 268 if string.match(anchor,"LEFT") then | |
| 269 j = "LEFT" | |
| 270 elseif string.match(anchor,"RIGHT") then | |
| 271 j = "RIGHT" | |
| 272 else | |
| 273 j = "CENTER" | |
| 274 end | |
| 275 label:SetJustifyH(j) | |
| 276 end | |
| 277 | |
| 278 | |
| 279 function RAPAD:ApplyLayout() | |
| 280 local f = self.frames | |
| 281 | |
| 282 if self.config.keyBindLoc then | |
| 283 placeLabel(f.hotkey, self.config.keyBindLoc) | |
| 284 end | |
| 285 | |
| 286 if self.config.showKeyBind then | |
| 287 f.hotkey:Show() | |
| 288 else | |
| 289 f.hotkey:Hide() | |
| 290 end | |
| 291 | |
| 292 if self.config.showBorder then | |
| 293 f.normalTexture:SetAlpha(1) | |
| 294 else | |
| 295 f.normalTexture:SetAlpha(0) | |
| 296 end | |
| 297 end | |
| 298 | |
| 299 function RAPAD:ApplyStyle() | |
| 300 | |
| 301 end | |
| 302 | |
| 303 function RAPAD:DisplayVisibility() | |
| 304 local b = self.frames.button | |
| 305 | |
| 306 -- can't hide/show in combat | |
| 307 if not InCombatLockdown() then | |
| 308 if b:GetAttribute("statehidden") then | |
| 309 b:Hide() | |
| 310 elseif not self:IsActionEmpty() then | |
| 311 b:GetNormalTexture():SetAlpha(1.0) | |
| 312 b:Show() | |
| 313 elseif self.showTmp_ and self.showTmp_ > 0 or self.config.showGrid then | |
| 314 b:GetNormalTexture():SetAlpha(0.5) | |
| 315 self.frames.cooldown:Hide() | |
| 316 b:Show() | |
| 317 else | |
| 318 b:Hide() | |
| 319 end | |
| 320 end | |
| 321 end | |
| 322 |
