Mercurial > wow > reaction
comparison classes/ReAction_ActionDisplay.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.ActionDisplay 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 -- stackCountLoc = "POSITION", -- stack count anchor location | |
| 12 -- showKeyBind = true/false, -- show keybind labels | |
| 13 -- showStackCount = true/false, -- show stack count labels | |
| 14 -- showMacroText = true/false, -- show macro name labels | |
| 15 -- showGrid = true/false, -- always show empty buttons | |
| 16 -- } | |
| 17 -- | |
| 18 | |
| 19 local AceOO = AceLibrary("AceOO-2.0") | |
| 20 | |
| 21 ReAction.ActionDisplay = AceOO.Mixin { | |
| 22 -- ReAction.IDisplay interface | |
| 23 "SetupDisplay", | |
| 24 "UpdateDisplay", | |
| 25 "TempShow", | |
| 26 "GetActionFrame", | |
| 27 "GetBaseButtonSize", | |
| 28 "DisplayID", | |
| 29 "DisplayHotkey", | |
| 30 | |
| 31 -- ReAction.ActionType.IDisplay interface | |
| 32 "DisplayUsable", | |
| 33 "DisplayEquipped", | |
| 34 "DisplayAutoRepeat", | |
| 35 "DisplayInUse", | |
| 36 "DisplayIcon", | |
| 37 "DisplayName", | |
| 38 "DisplayCount", | |
| 39 "DisplayCooldown", | |
| 40 | |
| 41 -- Event handlers | |
| 42 "PostClick", | |
| 43 "OnDragStart", | |
| 44 "OnReceiveDrag", | |
| 45 "OnEnter", | |
| 46 "OnLeave", | |
| 47 "OnUpdate", | |
| 48 | |
| 49 -- internal functions | |
| 50 "ApplyLayout", | |
| 51 "ApplyStyle", | |
| 52 "StartFlash", | |
| 53 "StopFlash", | |
| 54 "IsFlashing", | |
| 55 "DisplayVisibility", | |
| 56 } | |
| 57 | |
| 58 local RAAD = ReAction.ActionDisplay | |
| 59 | |
| 60 | |
| 61 -- private constants | |
| 62 local _G = getfenv(0) | |
| 63 | |
| 64 local equippedActionBorderColor = { r=0.00, g=1.00, b=0.00, a=0.35 } -- transparent green | |
| 65 local actionIDColor = { r=1.00, g=0.82, b=0.00, a=1.00 } -- gold | |
| 66 | |
| 67 -- private functions | |
| 68 -- extract and return color fields from a table, to be fed into SetVertexColor()/SetTextColor() | |
| 69 local function tcolor(c) | |
| 70 return c.r, c.g, c.b, c.a | |
| 71 end | |
| 72 | |
| 73 | |
| 74 ----------------------------------- | |
| 75 -- Interface Implementation Methods | |
| 76 ----------------------------------- | |
| 77 function RAAD:SetupDisplay( name ) | |
| 78 -- create the button widget | |
| 79 local b = CreateFrame("CheckButton", name, nil, "SecureActionButtonTemplate, ActionButtonTemplate") | |
| 80 | |
| 81 -- store references to the various sub-frames of ActionButtonTemplate so we don't have to look it up all the time | |
| 82 self.frames = { | |
| 83 button = b, | |
| 84 hotkey = _G[name.."HotKey"], | |
| 85 count = _G[name.."Count"], | |
| 86 cooldown = _G[name.."Cooldown"], | |
| 87 macro = _G[name.."Name"], | |
| 88 icon = _G[name.."Icon"], | |
| 89 border = _G[name.."Border"], | |
| 90 flash = _G[name.."Flash"], | |
| 91 normalTexture = _G[name.."NormalTexture"], | |
| 92 actionID = nil, -- defer creating actionID font string until it's actually requested | |
| 93 } | |
| 94 | |
| 95 -- ??? odd: why do we have to increment the cooldown frame level to get it to show? | |
| 96 -- (otherwise it's behind the icon). The default UI doesn't have to (or at least I can't | |
| 97 -- find where it does) but for some reason we have to here. | |
| 98 self.frames.cooldown:SetFrameLevel(self.frames.cooldown:GetFrameLevel() + 1) | |
| 99 | |
| 100 b:EnableMouse() | |
| 101 b:RegisterForDrag("LeftButton", "RightButton") | |
| 102 b:RegisterForClicks("AnyUp") | |
| 103 b:SetScript("PostClick", function(arg1) self:PostClick(arg1) end) | |
| 104 b:SetScript("OnDragStart", function(arg1) self:OnDragStart(arg1) end) | |
| 105 b:SetScript("OnReceiveDrag", function() self:OnReceiveDrag() end) | |
| 106 b:SetScript("OnEnter", function() self:OnEnter() end) | |
| 107 b:SetScript("OnLeave", function() self:OnLeave() end) | |
| 108 -- defer setting OnUpdate until actions are actually attached | |
| 109 | |
| 110 self.tmpShow_ = 0 | |
| 111 end | |
| 112 | |
| 113 function RAAD:UpdateDisplay() | |
| 114 self:ApplyLayout() | |
| 115 self:ApplyStyle() | |
| 116 self:DisplayVisibility() | |
| 117 -- refresh the action ID display | |
| 118 if ReAction.showIDs_ then | |
| 119 self:DisplayID(self:GetID()) | |
| 120 end | |
| 121 end | |
| 122 | |
| 123 function RAAD:TempShow( visible ) | |
| 124 visible = visible and true or false -- force data integrity | |
| 125 self.showTmp_ = max(0, (self.showTmp_ or 0) + (visible and 1 or -1)) | |
| 126 self:DisplayVisibility() | |
| 127 end | |
| 128 | |
| 129 function RAAD:GetActionFrame() | |
| 130 return self.frames.button | |
| 131 end | |
| 132 | |
| 133 function RAAD:GetBaseButtonSize() | |
| 134 return 36 | |
| 135 end | |
| 136 | |
| 137 function RAAD:DisplayID( id ) | |
| 138 local f = self.frames.actionID | |
| 139 if id then | |
| 140 if not f then | |
| 141 -- create the actionID label | |
| 142 f = self.frames.button:CreateFontString(nil,"ARTWORK","NumberFontNormalSmall") | |
| 143 f:SetPoint("BOTTOMLEFT") | |
| 144 f:SetTextColor( tcolor(actionIDColor) ) | |
| 145 self.frames.actionID = f | |
| 146 end | |
| 147 f:SetText(tostring(id)) | |
| 148 f:Show() | |
| 149 elseif f then | |
| 150 f:Hide() | |
| 151 end | |
| 152 end | |
| 153 | |
| 154 function RAAD:DisplayHotkey(txt) | |
| 155 self.frames.hotkey:SetText(string.upper(txt or "")) | |
| 156 self:UpdateUsable() | |
| 157 end | |
| 158 | |
| 159 function RAAD:DisplayUsable( isUsable, notEnoughMana, outOfRange ) | |
| 160 local f = self.frames | |
| 161 f.icon:SetVertexColor( self:GetIconColor(isUsable, notEnoughMana, outOfRange) ) | |
| 162 f.button:GetNormalTexture():SetVertexColor( self:GetBorderColor(isUsable, notEnoughMana, outOfRange) ) | |
| 163 f.hotkey:SetTextColor( self:GetHotkeyColor(isUsable, notEnoughMana, outOfRange, f.hotkey:GetText()) ) | |
| 164 end | |
| 165 | |
| 166 function RAAD:DisplayEquipped( equipped ) | |
| 167 local b = self.frames.border | |
| 168 if equipped then | |
| 169 b:Show() | |
| 170 else | |
| 171 b:Hide() | |
| 172 end | |
| 173 end | |
| 174 | |
| 175 function RAAD:DisplayAutoRepeat( r ) | |
| 176 if r then | |
| 177 self:StartFlash() | |
| 178 else | |
| 179 self:StopFlash() | |
| 180 end | |
| 181 end | |
| 182 | |
| 183 function RAAD:DisplayInUse( inUse ) | |
| 184 self.frames.button:SetChecked( inUse and 1 or 0 ) | |
| 185 end | |
| 186 | |
| 187 function RAAD:DisplayIcon( texture ) | |
| 188 local f = self.frames.button | |
| 189 local icon = self.frames.icon | |
| 190 if texture then | |
| 191 icon:SetTexture(texture) | |
| 192 icon:Show() | |
| 193 self.rangeTimer = -1 | |
| 194 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot2") | |
| 195 if f:GetScript("OnUpdate") == nil then | |
| 196 f:SetScript("OnUpdate", function(frame, elapsed) self:OnUpdate(elapsed) end) | |
| 197 end | |
| 198 else | |
| 199 icon:Hide() | |
| 200 self.rangeTimer = nil | |
| 201 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot") | |
| 202 f:SetScript("OnUpdate",nil) | |
| 203 end | |
| 204 self:DisplayVisibility() | |
| 205 end | |
| 206 | |
| 207 function RAAD:DisplayCooldown( start, duration, enable ) | |
| 208 CooldownFrame_SetTimer(self.frames.cooldown, start, duration, enable) | |
| 209 end | |
| 210 | |
| 211 function RAAD:DisplayName( name ) | |
| 212 self.frames.macro:SetText(name and tostring(name) or "") | |
| 213 end | |
| 214 | |
| 215 function RAAD:DisplayCount( count ) | |
| 216 self.frames.count:SetText(count and tostring(count) or "") | |
| 217 end | |
| 218 | |
| 219 | |
| 220 | |
| 221 | |
| 222 | |
| 223 ---------------------- | |
| 224 -- Event Handlers | |
| 225 ---------------------- | |
| 226 function RAAD:PostClick() | |
| 227 self:UpdateInUse() | |
| 228 end | |
| 229 | |
| 230 function RAAD:OnDragStart() | |
| 231 if LOCK_ACTIONBAR ~= "1" or IsShiftKeyDown() then | |
| 232 self:PickupAction() | |
| 233 end | |
| 234 end | |
| 235 | |
| 236 function RAAD:OnReceiveDrag() | |
| 237 self:PlaceAction() | |
| 238 end | |
| 239 | |
| 240 function RAAD:OnEnter() | |
| 241 self:SetTooltip() -- from ReAction base class | |
| 242 self.tooltipTime = TOOLTIP_UPDATE_TIME | |
| 243 end | |
| 244 | |
| 245 function RAAD:OnLeave() | |
| 246 self:ClearTooltip() -- from ReAction base class | |
| 247 self.tooltipTime = nil | |
| 248 end | |
| 249 | |
| 250 function RAAD:OnUpdate(elapsed) | |
| 251 -- handle flashing | |
| 252 if self:IsFlashing() then | |
| 253 self.flashtime = self.flashtime - elapsed | |
| 254 if self.flashtime <= 0 then | |
| 255 local overtime = -self.flashtime | |
| 256 if overtime >= ATTACK_BUTTON_FLASH_TIME then | |
| 257 overtime = 0 | |
| 258 end | |
| 259 self.flashtime = ATTACK_BUTTON_FLASH_TIME - overtime | |
| 260 | |
| 261 local f = self.frames.flash | |
| 262 if f then | |
| 263 if f:IsVisible() then | |
| 264 f:Hide() | |
| 265 else | |
| 266 f:Show() | |
| 267 end | |
| 268 end | |
| 269 end | |
| 270 end | |
| 271 | |
| 272 -- Handle range indicator | |
| 273 if self.rangeTimer then | |
| 274 self.rangeTimer = self.rangeTimer - elapsed | |
| 275 if self.rangeTimer <= 0 then | |
| 276 self:UpdateUsable() | |
| 277 self.rangeTimer = TOOLTIP_UPDATE_TIME | |
| 278 end | |
| 279 end | |
| 280 | |
| 281 -- handle tooltip update | |
| 282 if self.tooltipTime then | |
| 283 self.tooltipTime = self.tooltipTime - elapsed | |
| 284 if self.tooltipTime <= 0 then | |
| 285 if GameTooltip:IsOwned(self.frames.button) then | |
| 286 self:UpdateTooltip() | |
| 287 self.tooltipTime = TOOLTIP_UPDATE_TIME | |
| 288 else | |
| 289 self.tooltipTime = nil | |
| 290 end | |
| 291 end | |
| 292 end | |
| 293 end | |
| 294 | |
| 295 | |
| 296 | |
| 297 ---------------------- | |
| 298 -- Internal methods | |
| 299 ---------------------- | |
| 300 | |
| 301 local function placeLabel( label, anchor ) | |
| 302 local top = string.match(anchor,"TOP") | |
| 303 local bottom = string.match(anchor, "BOTTOM") | |
| 304 label:ClearAllPoints() | |
| 305 label:SetWidth(40) | |
| 306 label:SetPoint(top or bottom or "CENTER",0,top and 2 or bottom and -2 or 0) | |
| 307 local j | |
| 308 if string.match(anchor,"LEFT") then | |
| 309 j = "LEFT" | |
| 310 elseif string.match(anchor,"RIGHT") then | |
| 311 j = "RIGHT" | |
| 312 else | |
| 313 j = "CENTER" | |
| 314 end | |
| 315 label:SetJustifyH(j) | |
| 316 end | |
| 317 | |
| 318 | |
| 319 function RAAD:ApplyLayout() | |
| 320 local f = self.frames | |
| 321 | |
| 322 if self.config.keyBindLoc then | |
| 323 placeLabel(f.hotkey, self.config.keyBindLoc) | |
| 324 end | |
| 325 | |
| 326 if self.config.stackCountLoc then | |
| 327 placeLabel(f.count, self.config.stackCountLoc) | |
| 328 end | |
| 329 | |
| 330 if self.config.showKeyBind then | |
| 331 f.hotkey:Show() | |
| 332 else | |
| 333 f.hotkey:Hide() | |
| 334 end | |
| 335 | |
| 336 if self.config.showStackCount then | |
| 337 f.count:Show() | |
| 338 else | |
| 339 f.count:Hide() | |
| 340 end | |
| 341 | |
| 342 if self.config.showMacroName then | |
| 343 f.macro:Show() | |
| 344 else | |
| 345 f.macro:Hide() | |
| 346 end | |
| 347 | |
| 348 end | |
| 349 | |
| 350 function RAAD:ApplyStyle() | |
| 351 local f = self.frames | |
| 352 -- for now, just a static style | |
| 353 f.hotkey:SetFontObject(NumberFontNormal) | |
| 354 f.count:SetFontObject(NumberFontNormalYellow) | |
| 355 f.border:SetVertexColor( tcolor(equippedActionBorderColor) ) | |
| 356 end | |
| 357 | |
| 358 function RAAD:StartFlash() | |
| 359 self.flashing = true | |
| 360 self.flashtime = 0 | |
| 361 end | |
| 362 | |
| 363 function RAAD:StopFlash() | |
| 364 self.flashing = false | |
| 365 self.frames.flash:Hide() | |
| 366 end | |
| 367 | |
| 368 function RAAD:IsFlashing() | |
| 369 return self.flashing | |
| 370 end | |
| 371 | |
| 372 function RAAD:DisplayVisibility() | |
| 373 local b = self.frames.button | |
| 374 | |
| 375 if b:GetAttribute("statehidden") then | |
| 376 -- can't hide/show in combat | |
| 377 if not InCombatLockdown() then | |
| 378 b:Hide() | |
| 379 end | |
| 380 elseif not self:IsActionEmpty() then | |
| 381 b:GetNormalTexture():SetAlpha(1.0) | |
| 382 b:SetAlpha(1) | |
| 383 elseif self.showTmp_ and self.showTmp_ > 0 or self.config.showGrid then | |
| 384 b:GetNormalTexture():SetAlpha(0.5) | |
| 385 self.frames.cooldown:Hide() | |
| 386 b:SetAlpha(1) | |
| 387 else | |
| 388 b:SetAlpha(0) | |
| 389 end | |
| 390 end | |
| 391 |
