Mercurial > wow > kbf
comparison KBF.lua @ 67:673fd9893f1e
set consolidation so that infinite (duration = 0) buffs will be consoliated
author | Chris Mellon <arkanes@gmail.com> |
---|---|
date | Sat, 30 Jun 2012 15:44:10 -0500 |
parents | 6f1457157688 |
children | f5bd73181349 |
comparison
equal
deleted
inserted
replaced
66:6f1457157688 | 67:673fd9893f1e |
---|---|
4 | 4 |
5 local kbf = LibStub("AceAddon-3.0"):NewAddon(kbf, "KBF", "AceEvent-3.0", "AceConsole-3.0") | 5 local kbf = LibStub("AceAddon-3.0"):NewAddon(kbf, "KBF", "AceEvent-3.0", "AceConsole-3.0") |
6 | 6 |
7 | 7 |
8 function kbf:OnInitialize() | 8 function kbf:OnInitialize() |
9 self.oocQueue = {} | 9 self.oocQueue = {} |
10 -- config settings - account wide shared profile by default | 10 -- config settings - account wide shared profile by default |
11 self.db = LibStub("AceDB-3.0"):New("KBFSavedVars", self.defaultConfig, true) | 11 self.db = LibStub("AceDB-3.0"):New("KBFSavedVars", self.defaultConfig, true) |
12 -- create frames here so that they will be correctly stored in location cache by | 12 -- create frames here so that they will be correctly stored in location cache by |
13 -- the UI. | 13 -- the UI. |
14 self.anchor, self.secureHeader, self.consolidateHeader, self.consolidateProxy = self:CreateCoreFrames() | 14 self.anchor, self.secureHeader, self.consolidateHeader, self.consolidateProxy = self:CreateCoreFrames() |
15 self.debuffFrames = {} | 15 self.debuffFrames = {} |
16 self:RegisterEvent("UNIT_AURA") | 16 self:RegisterEvent("UNIT_AURA") |
17 self:RegisterEvent("UNIT_ENTERING_VEHICLE", "PollForVehicleChange") | 17 self:RegisterEvent("UNIT_ENTERING_VEHICLE", "PollForVehicleChange") |
18 self:RegisterEvent("UNIT_EXITING_VEHICLE", "PollForVehicleChange") | 18 self:RegisterEvent("UNIT_EXITING_VEHICLE", "PollForVehicleChange") |
19 LibStub("AceConfig-3.0"):RegisterOptionsTable("KBF", self.options); | 19 LibStub("AceConfig-3.0"):RegisterOptionsTable("KBF", self.options); |
22 | 22 |
23 | 23 |
24 end | 24 end |
25 | 25 |
26 function kbf:OnEnable() | 26 function kbf:OnEnable() |
27 -- set up the countdown timer | 27 -- set up the countdown timer |
28 -- TODO: Fancy enable/disable based on whether you have any timed buffs. | 28 -- TODO: Fancy enable/disable based on whether you have any timed buffs. |
29 -- Not a big deal, how often do you care about that | 29 -- Not a big deal, how often do you care about that |
30 -- also TODO: Maybe should bucket OnUpdates somehow | 30 -- also TODO: Maybe should bucket OnUpdates somehow |
31 -- AceTimer repeating events can only happen at 0.1 seconds, which is probably | 31 -- AceTimer repeating events can only happen at 0.1 seconds, which is probably |
32 -- fast enough for updating, but makes the animation look jerky | 32 -- fast enough for updating, but makes the animation look jerky |
45 -- so this only works out of combat. But thats better than nothing... | 45 -- so this only works out of combat. But thats better than nothing... |
46 function kbf:PollForVehicleChange(event, unit) | 46 function kbf:PollForVehicleChange(event, unit) |
47 if unit ~= "player" then return end | 47 if unit ~= "player" then return end |
48 self.dirty = true | 48 self.dirty = true |
49 local function performSwap() | 49 local function performSwap() |
50 if UnitHasVehicleUI("player") then | 50 if UnitHasVehicleUI("player") then |
51 -- only swap if we're in a "real" vehicle with its own actions | 51 -- only swap if we're in a "real" vehicle with its own actions |
52 -- There is possibly a timing issue here where | 52 -- There is possibly a timing issue here where |
53 -- we have set the poll flag but the unit is not | 53 -- we have set the poll flag but the unit is not |
54 -- actually "in" the vehicle yet. I'm hoping thats | 54 -- actually "in" the vehicle yet. I'm hoping thats |
55 -- handled by using exited/entered events instead of exiting/entering | 55 -- handled by using exited/entered events instead of exiting/entering |
56 self.secureHeader:SetAttribute("unit", "vehicle") | 56 self.secureHeader:SetAttribute("unit", "vehicle") |
57 else | 57 else |
58 self.secureHeader:SetAttribute("unit", "player") | 58 self.secureHeader:SetAttribute("unit", "player") |
59 end | 59 end |
60 end | 60 end |
78 -- enqueues a callable that will be run once in-combat lockdown is past | 78 -- enqueues a callable that will be run once in-combat lockdown is past |
79 -- all callables will be executed in a single run, in the order they were enqueued | 79 -- all callables will be executed in a single run, in the order they were enqueued |
80 -- if called when OOC, the function will be called immediately, unless the alwaysQueue parameter is true, | 80 -- if called when OOC, the function will be called immediately, unless the alwaysQueue parameter is true, |
81 -- in which case it will be appended normally | 81 -- in which case it will be appended normally |
82 function kbf:QueueForOOC(func, alwaysQueue) | 82 function kbf:QueueForOOC(func, alwaysQueue) |
83 if InCombatLockdown() or alwaysQueue then | 83 if InCombatLockdown() or alwaysQueue then |
84 tinsert(self.oocQueue, func) | 84 tinsert(self.oocQueue, func) |
85 else | 85 else |
86 func() | 86 func() |
87 end | 87 end |
88 end | 88 end |
89 | 89 |
90 function kbf:OnUpdate() | 90 function kbf:OnUpdate() |
91 -- TODO: only start this polling when we leave combat? | 91 -- TODO: only start this polling when we leave combat? |
92 while #self.oocQueue > 0 and not InCombatLockdown() do | 92 while #self.oocQueue > 0 and not InCombatLockdown() do |
93 local func = table.remove(self.oocQueue) | 93 local func = table.remove(self.oocQueue) |
94 func() | 94 func() |
95 end | 95 end |
96 | 96 |
97 local unit = self.secureHeader:GetAttribute("unit") | 97 local unit = self.secureHeader:GetAttribute("unit") |
98 local buffCount = 0 | 98 local buffCount = 0 |
99 for idx=1,99 do | 99 for idx=1,99 do |
100 local frame = self.secureHeader:GetAttribute("child"..idx) | 100 local frame = self.secureHeader:GetAttribute("child"..idx) |
101 if not (frame and frame:IsShown()) then break end | 101 if not (frame and frame:IsShown()) then break end |
102 local boundIndex = frame:GetAttribute("index") | 102 local boundIndex = frame:GetAttribute("index") |
103 if not boundIndex then | 103 if not boundIndex then |
104 break | 104 break |
105 end | 105 end |
106 if self.dirty then | 106 if self.dirty then |
107 local hasbuff = UnitAura(unit, boundIndex) | 107 local hasbuff = UnitAura(unit, boundIndex) |
108 --self:Print(hasbuff, idx, boundIndex) | 108 --self:Print(hasbuff, idx, boundIndex) |
109 if not hasbuff then | 109 if not hasbuff then |
110 if frame.icon then frame.icon:Hide() end | 110 if frame.icon then frame.icon:Hide() end |
111 if frame.statusbar then frame.statusbar:Hide() end | 111 if frame.statusbar then frame.statusbar:Hide() end |
112 if frame.statusbarbg then frame.statusbarbg:Hide() end | 112 if frame.statusbarbg then frame.statusbarbg:Hide() end |
113 if frame.text then frame.text:Hide() end | 113 if frame.text then frame.text:Hide() end |
114 if frame.timertext then frame.timertext:Hide() end | 114 if frame.timertext then frame.timertext:Hide() end |
115 break | 115 break |
116 end | 116 end |
117 buffCount = buffCount + 1 | 117 buffCount = buffCount + 1 |
118 | 118 |
119 if self.dirty then | 119 if self.dirty then |
120 if self:BindBarToBuff(frame, unit) then break end | 120 if self:BindBarToBuff(frame, unit) then break end |
121 end | 121 end |
122 frame.icon:Show() | 122 frame.icon:Show() |
123 frame.statusbar:Show() | 123 frame.statusbar:Show() |
124 frame.statusbarbg:Show() | 124 frame.statusbarbg:Show() |
125 frame.text:Show() | 125 frame.text:Show() |
126 frame.timertext:Show() | 126 frame.timertext:Show() |
127 end | 127 end |
128 self:UpdateBarExpirationTime(frame) | 128 self:UpdateBarExpirationTime(frame) |
129 -- Don't forget to refresh shown tooltips | 129 -- Don't forget to refresh shown tooltips |
130 if (GameTooltip:IsOwned(frame)) then | 130 if (GameTooltip:IsOwned(frame)) then |
131 self:OnEnter(frame) | 131 self:OnEnter(frame) |
132 end | 132 end |
133 end | 133 end |
134 -- consolidated buffs | 134 -- consolidated buffs |
135 if self.consolidateProxy:IsShown() then | 135 if self.consolidateProxy:IsShown() then |
136 for idx=1,99 do | 136 for idx=1,99 do |
137 local frame = self.consolidateHeader:GetAttribute("child"..idx) | 137 local frame = self.consolidateHeader:GetAttribute("child"..idx) |
138 if not (frame and frame:IsShown()) then break end | 138 if not (frame and frame:IsShown()) then break end |
139 if self.dirty then | 139 if self.dirty then |
140 if self:BindBarToBuff(frame, unit) then break end | 140 if self:BindBarToBuff(frame, unit) then break end |
141 end | 141 end |
142 self:UpdateBarExpirationTime(frame) | 142 self:UpdateBarExpirationTime(frame) |
143 -- Don't forget to refresh shown tooltips | 143 -- Don't forget to refresh shown tooltips |
144 if ( GameTooltip:IsOwned(frame) ) then | 144 if ( GameTooltip:IsOwned(frame) ) then |
145 self:OnEnter(frame) | 145 self:OnEnter(frame) |
146 end | 146 end |
147 end | 147 end |
148 buffCount = buffCount+1 | 148 buffCount = buffCount+1 |
149 end | 149 end |
150 -- SAH correctly binds the weapon enchant templates now, but when temp enchants | 150 -- SAH correctly binds the weapon enchant templates now, but when temp enchants |
151 -- are present and used, it seems that it doesn't correctly hide un-bound | 151 -- are present and used, it seems that it doesn't correctly hide un-bound |
152 -- buff frames, which breaks all the layout and so forth. | 152 -- buff frames, which breaks all the layout and so forth. |
153 for weapon=3,1,-1 do | 153 for weapon=3,1,-1 do |
154 local tempEnchant = self.secureHeader:GetAttribute("tempEnchant"..weapon) | 154 local tempEnchant = self.secureHeader:GetAttribute("tempEnchant"..weapon) |
155 if tempEnchant and tempEnchant:IsShown() then | 155 if tempEnchant and tempEnchant:IsShown() then |
156 self:BindBarToWeaponEnchant(tempEnchant) | 156 self:BindBarToWeaponEnchant(tempEnchant) |
157 self:UpdateBarExpirationTime(tempEnchant) | 157 self:UpdateBarExpirationTime(tempEnchant) |
158 buffCount = buffCount + 1 | 158 buffCount = buffCount + 1 |
159 end | 159 end |
160 end | 160 end |
161 | 161 |
162 -- debuffs | 162 -- debuffs |
163 -- Since debuffs aren't cancellable, don't need to use the secure header | 163 -- Since debuffs aren't cancellable, don't need to use the secure header |
164 -- for them. This could be rewritten to support useful features like | 164 -- for them. This could be rewritten to support useful features like |
165 -- sorting & scaling and stuff. Honestly, should at least be alphabetical. | 165 -- sorting & scaling and stuff. Honestly, should at least be alphabetical. |
166 for idx=1,99 do | 166 for idx=1,99 do |
167 local frame = self.debuffFrames[idx] | 167 local frame = self.debuffFrames[idx] |
168 if self.dirty then | 168 if self.dirty then |
169 local name, rank, icon, stacks, debuffType, duration, expirationTime = UnitAura(unit, idx, "HARMFUL") | 169 local name, rank, icon, stacks, debuffType, duration, expirationTime = UnitAura(unit, idx, "HARMFUL") |
170 if not name then | 170 if not name then |
231 local remaining = remaining / 1000 | 231 local remaining = remaining / 1000 |
232 | 232 |
233 local icon = GetInventoryItemTexture("player", slot) | 233 local icon = GetInventoryItemTexture("player", slot) |
234 local maxDuration | 234 local maxDuration |
235 if select(2, UnitClass("player")) == "ROGUE" then | 235 if select(2, UnitClass("player")) == "ROGUE" then |
236 -- Rogues are probably using poisons, which are an hour | 236 -- Rogues are probably using poisons, which are an hour |
237 maxDuration = 60 * 60 | 237 maxDuration = 60 * 60 |
238 else | 238 else |
239 -- everyone else is probably using something thats a half hour | 239 -- everyone else is probably using something thats a half hour |
240 maxDuration = 30 * 60 | 240 maxDuration = 30 * 60 |
241 end | 241 end |
242 local duration = max(maxDuration, remaining) | 242 local duration = max(maxDuration, remaining) |
243 local expirationTime = GetTime() + remaining | 243 local expirationTime = GetTime() + remaining |
244 local name = GetItemInfo(GetInventoryItemID("player", slot)) | 244 local name = GetItemInfo(GetInventoryItemID("player", slot)) |
245 -- try to figure out what the weapon enchant is | 245 -- try to figure out what the weapon enchant is |
246 -- tooltip string -> {spellid, duration} | 246 -- tooltip string -> {spellid, duration} |
247 local knownEnchants = { | 247 local knownEnchants = { |
248 ["Flametongue"] = {8024, 30*60}, | 248 ["Flametongue"] = {8024, 30*60}, |
249 ["Frostbrand"] = {8033, 30*60}, | 249 ["Frostbrand"] = {8033, 30*60}, |
250 ["Earthliving"] = {51730, 30*60}, | 250 ["Earthliving"] = {51730, 30*60}, |
251 ["Windfury"] = {8232, 30*60}, | 251 ["Windfury"] = {8232, 30*60}, |
252 ["Instant Poison"] = {8680, 60*60}, | 252 ["Instant Poison"] = {8680, 60*60}, |
253 ["Wound Poison"] = {13218, 60*60}, | 253 ["Wound Poison"] = {13218, 60*60}, |
254 ["Deadly Poison"] = {2823, 60*60}, | 254 ["Deadly Poison"] = {2823, 60*60}, |
255 ["Crippling Poison"] = {3408, 60*60} | 255 ["Crippling Poison"] = {3408, 60*60} |
256 | 256 |
257 } | 257 } |
258 local spellId = nil | 258 local spellId = nil |
259 if gratt then | 259 if gratt then |
260 gratt:SetInventoryItem("player", slot) | 260 gratt:SetInventoryItem("player", slot) |
261 for tag, info in pairs(knownEnchants) do | 261 for tag, info in pairs(knownEnchants) do |
262 if gratt:Find(tag) then | 262 if gratt:Find(tag) then |
263 spellId, duration = unpack(info) | 263 spellId, duration = unpack(info) |
264 name, _, _ = GetSpellInfo(spellId) | 264 name, _, _ = GetSpellInfo(spellId) |
265 local slots = {[16] = "Main Hand", [17] = "Off Hand", [18] = "Thrown"} | 265 local slots = {[16] = "Main Hand", [17] = "Off Hand", [18] = "Thrown"} |
266 name = tag .. " (" .. slots[slot] .. ")" | 266 name = tag .. " (" .. slots[slot] .. ")" |
267 break | 267 break |
268 end | 268 end |
269 end | 269 end |
270 end | 270 end |
271 parentFrame.spellId = spellId | 271 parentFrame.spellId = spellId |
272 if not parentFrame.icon then | 272 if not parentFrame.icon then |
273 self:ConstructBar(parentFrame, 1, 0, 1) | 273 self:ConstructBar(parentFrame, 1, 0, 1) |
274 end | 274 end |
275 self:SetBarAppearance(parentFrame, name, icon, enchantCharges, duration, expirationTime) | 275 self:SetBarAppearance(parentFrame, name, icon, enchantCharges, duration, expirationTime) |
340 GameTooltip:SetUnitAura(unit, index, filter); | 340 GameTooltip:SetUnitAura(unit, index, filter); |
341 return | 341 return |
342 end | 342 end |
343 local slot = button:GetAttribute("target-slot") -- temp enchant | 343 local slot = button:GetAttribute("target-slot") -- temp enchant |
344 if slot then | 344 if slot then |
345 GameTooltip:SetOwner(button, "ANCHOR_BOTTOMLEFT"); | 345 GameTooltip:SetOwner(button, "ANCHOR_BOTTOMLEFT"); |
346 GameTooltip:SetFrameLevel(button:GetFrameLevel() + 2); | 346 GameTooltip:SetFrameLevel(button:GetFrameLevel() + 2); |
347 if button.spellId then | 347 if button.spellId then |
348 -- TODO: This might be too big of a tooltip to care about that much. | 348 -- TODO: This might be too big of a tooltip to care about that much. |
349 -- Maybe I should just have a single line with the weapon name | 349 -- Maybe I should just have a single line with the weapon name |
350 --GameTooltip:SetInventoryItem(unit, slot) | 350 --GameTooltip:SetInventoryItem(unit, slot) |
351 local name = GetItemInfo(GetInventoryItemID("player", slot)) | 351 local name = GetItemInfo(GetInventoryItemID("player", slot)) |
352 local r, g, b = GetItemQualityColor(GetInventoryItemQuality("player", slot)) | 352 local r, g, b = GetItemQualityColor(GetInventoryItemQuality("player", slot)) |
353 GameTooltip:SetText(name, r, g, b) | 353 GameTooltip:SetText(name, r, g, b) |
354 local slots = {[16] = "Main Hand", [17] = "Off Hand", [18] = "Thrown"} | 354 local slots = {[16] = "Main Hand", [17] = "Off Hand", [18] = "Thrown"} |
355 GameTooltip:AddLine(slots[slot]) | 355 GameTooltip:AddLine(slots[slot]) |
356 GameTooltip:AddLine(" ") | 356 GameTooltip:AddLine(" ") |
357 GameTooltip:AddSpellByID(button.spellId) | 357 GameTooltip:AddSpellByID(button.spellId) |
358 else | 358 else |
359 GameTooltip:SetInventoryItem(unit, slot) | 359 GameTooltip:SetInventoryItem(unit, slot) |
360 end | 360 end |
361 end | 361 end |
362 end | 362 end |
363 | 363 |
364 -- creates a icon + statusbar bar | 364 -- creates a icon + statusbar bar |
365 function kbf:ConstructBar(frame, r, g, b) | 365 function kbf:ConstructBar(frame, r, g, b) |
366 local texture = "Interface\\TargetingFrame\\UI-StatusBar" | 366 local texture = "Interface\\TargetingFrame\\UI-StatusBar" |
387 bar.icon = CreateFrame("Button", "ABC-Icon", bar) -- the icon | 387 bar.icon = CreateFrame("Button", "ABC-Icon", bar) -- the icon |
388 bar.statusbarbg = CreateFrame("StatusBar", "ABC-BG", bar) -- the bars background | 388 bar.statusbarbg = CreateFrame("StatusBar", "ABC-BG", bar) -- the bars background |
389 bar.statusbar = CreateFrame("StatusBar", "ABC-status", bar) -- and the bars foreground | 389 bar.statusbar = CreateFrame("StatusBar", "ABC-status", bar) -- and the bars foreground |
390 bar.text = bar.statusbar:CreateFontString(nil, "OVERLAY") -- the label text | 390 bar.text = bar.statusbar:CreateFontString(nil, "OVERLAY") -- the label text |
391 bar.timertext = bar.statusbar:CreateFontString(nil, "OVERLAY") -- and the timer text | 391 bar.timertext = bar.statusbar:CreateFontString(nil, "OVERLAY") -- and the timer text |
392 | 392 |
393 | 393 |
394 -- the icon | 394 -- the icon |
395 bar.icon:ClearAllPoints() | 395 bar.icon:ClearAllPoints() |
396 bar.icon:SetPoint("LEFT", bar, "LEFT", 0, 0) | 396 bar.icon:SetPoint("LEFT", bar, "LEFT", 0, 0) |
397 -- icons are square | 397 -- icons are square |
436 bar.text:SetTextColor(textcolor[1], textcolor[2], textcolor[3], textcolor[4]) | 436 bar.text:SetTextColor(textcolor[1], textcolor[2], textcolor[3], textcolor[4]) |
437 return bar | 437 return bar |
438 end | 438 end |
439 | 439 |
440 function kbf:CreateCoreFrames() | 440 function kbf:CreateCoreFrames() |
441 -- this is the visible anchor frame that the user interacts with | 441 -- this is the visible anchor frame that the user interacts with |
442 -- to move the buffs around | 442 -- to move the buffs around |
443 local height = self.staticConfig.BAR_HEIGHT | 443 local height = self.staticConfig.BAR_HEIGHT |
444 local width = self.staticConfig.BAR_WIDTH -- this is the width *without* the icon | 444 local width = self.staticConfig.BAR_WIDTH -- this is the width *without* the icon |
445 local anchor = CreateFrame("FRAME", "KBFAnchorFrame", UIParent) | 445 local anchor = CreateFrame("FRAME", "KBFAnchorFrame", UIParent) |
446 anchor:SetClampedToScreen(true) | 446 anchor:SetClampedToScreen(true) |
447 anchor:SetBackdrop({bgFile = "Interface/Tooltips/UI-Tooltip-Background", | 447 anchor:SetBackdrop({bgFile = "Interface/Tooltips/UI-Tooltip-Background", |
448 edgeFile = "Interface/Tooltips/UI-Tooltip-Border", | 448 edgeFile = "Interface/Tooltips/UI-Tooltip-Border", |
466 anchor:ClearAllPoints() | 466 anchor:ClearAllPoints() |
467 anchor:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", 0, 0) | 467 anchor:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", 0, 0) |
468 anchor:Hide() | 468 anchor:Hide() |
469 -- this is the parent & host for the secure aura buttons. | 469 -- this is the parent & host for the secure aura buttons. |
470 | 470 |
471 local secureHeader = CreateFrame("FRAME", "KBFBuffFrame", UIParent, "SecureAuraHeaderTemplate") | 471 local secureHeader = CreateFrame("FRAME", "KBFBuffFrame", UIParent, "SecureAuraHeaderTemplate") |
472 self:SetCommonSecureHeaderAttributes(secureHeader) | 472 self:SetCommonSecureHeaderAttributes(secureHeader) |
473 if self.db.profile.consolidateBuffs then | 473 if self.db.profile.consolidateBuffs then |
474 secureHeader:SetAttribute("consolidateTo", 99) | 474 secureHeader:SetAttribute("consolidateTo", 99) |
475 end | 475 secureHeader:SetAttribute("consolidateDuration", -1) -- put 0 duration buffs into consolidation |
476 end | |
476 secureHeader:SetPoint("TOP", anchor, "TOP", 0, 0) | 477 secureHeader:SetPoint("TOP", anchor, "TOP", 0, 0) |
477 | 478 |
478 -- this is the "button" in the aura flow that represents the consolidated buffs. | 479 -- this is the "button" in the aura flow that represents the consolidated buffs. |
479 -- pre-creating it here in order to perform customization | 480 -- pre-creating it here in order to perform customization |
480 local consolidateProxy = CreateFrame("BUTTON", "KBFConsolidateProxy", UIParent, "SecureHandlerClickTemplate") | 481 local consolidateProxy = CreateFrame("BUTTON", "KBFConsolidateProxy", UIParent, "SecureHandlerClickTemplate") |
481 consolidateProxy:SetFrameStrata("HIGH") | 482 consolidateProxy:SetFrameStrata("HIGH") |
482 consolidateProxy:SetNormalTexture("Interface\\TargetingFrame\\UI-StatusBar") | 483 consolidateProxy:SetNormalTexture("Interface\\TargetingFrame\\UI-StatusBar") |
483 consolidateProxy:SetWidth(200 +16) | 484 consolidateProxy:SetWidth(200 +16) |
484 consolidateProxy:SetHeight(16) | 485 consolidateProxy:SetHeight(16) |
485 secureHeader:SetAttribute("consolidateProxy", consolidateProxy) | 486 secureHeader:SetAttribute("consolidateProxy", consolidateProxy) |
486 --secureHeader:SetFrameRef("proxy", consolidateProxy) | 487 --secureHeader:SetFrameRef("proxy", consolidateProxy) |
487 | 488 |
488 | 489 |
489 -- this is the equivilent of the secureHeader for the consolidated buffs | 490 -- this is the equivilent of the secureHeader for the consolidated buffs |
490 -- pre-creating again, so we can customize/size/position it | 491 -- pre-creating again, so we can customize/size/position it |
491 local consolidateHeader = CreateFrame("FRAME", "KBFConsolidatedAnchorFrame", consolidateProxy) | 492 local consolidateHeader = CreateFrame("FRAME", "KBFConsolidatedAnchorFrame", consolidateProxy) |
492 self:SetCommonSecureHeaderAttributes(consolidateHeader) | 493 self:SetCommonSecureHeaderAttributes(consolidateHeader) |
493 secureHeader:SetAttribute("consolidateHeader", consolidateHeader) | 494 secureHeader:SetAttribute("consolidateHeader", consolidateHeader) |
494 consolidateProxy:SetAttribute("header", consolidateHeader); | 495 consolidateProxy:SetAttribute("header", consolidateHeader); |
495 consolidateProxy:SetFrameRef("header", consolidateHeader) | 496 consolidateProxy:SetFrameRef("header", consolidateHeader) |
496 | 497 |
497 consolidateProxy:SetAttribute("_onclick", [[ | 498 consolidateProxy:SetAttribute("_onclick", [[ |
498 local frame = self:GetFrameRef("header") | 499 local frame = self:GetFrameRef("header") |
499 if frame:IsShown() then frame:Hide() else frame:Show() end | 500 if frame:IsShown() then frame:Hide() else frame:Show() end |
500 ]]) | 501 ]]) |
501 consolidateProxy:EnableMouse(true) | 502 consolidateProxy:EnableMouse(true) |
502 consolidateProxy:RegisterForClicks("AnyUp") | 503 consolidateProxy:RegisterForClicks("AnyUp") |
503 | 504 |
504 -- position it relative to the proxy, so it can appear where we want it | 505 -- position it relative to the proxy, so it can appear where we want it |
505 consolidateHeader:SetPoint("TOPRIGHT", anchor, "TOPLEFT", 0, 0) | 506 consolidateHeader:SetPoint("TOPRIGHT", anchor, "TOPLEFT", 0, 0) |
506 consolidateHeader:SetWidth(height + width) | 507 consolidateHeader:SetWidth(height + width) |
507 consolidateHeader:SetHeight(height) | 508 consolidateHeader:SetHeight(height) |
508 consolidateHeader:Show() | 509 consolidateHeader:Show() |
509 | 510 |
510 return anchor, secureHeader, consolidateHeader, consolidateProxy | 511 return anchor, secureHeader, consolidateHeader, consolidateProxy |
511 end | 512 end |
512 | 513 |
513 --- sets the attributes needed by all the headers | 514 --- sets the attributes needed by all the headers |
514 function kbf:SetCommonSecureHeaderAttributes(frame) | 515 function kbf:SetCommonSecureHeaderAttributes(frame) |
522 frame:SetAttribute("minHeight", 16) | 523 frame:SetAttribute("minHeight", 16) |
523 frame:SetAttribute("unit", "player") | 524 frame:SetAttribute("unit", "player") |
524 frame:SetAttribute("sortMethod", "NAME") | 525 frame:SetAttribute("sortMethod", "NAME") |
525 frame:SetAttribute("sortOrder", "-") | 526 frame:SetAttribute("sortOrder", "-") |
526 frame:SetAttribute("weaponTemplate", "KBFSecureWeaponEnchantTemplate") | 527 frame:SetAttribute("weaponTemplate", "KBFSecureWeaponEnchantTemplate") |
527 -- TODO: 4.3 SAH has a bug that messes up buff binding when a consolidate proxy | 528 -- TODO: 4.3 SAH has a bug that messes up buff binding when a consolidate proxy |
528 -- and/or weapon enchants are present, don't use them. Set up a standalone enchant window to be managed | 529 -- and/or weapon enchants are present, don't use them. Set up a standalone enchant window to be managed |
529 -- independently | 530 -- independently |
530 frame:SetAttribute("includeWeapons", 100) | 531 frame:SetAttribute("includeWeapons", 100) |
531 frame:Show() -- has to be shown, otherwise the child frames don't show | 532 frame:Show() -- has to be shown, otherwise the child frames don't show |
532 return frame | 533 return frame |
533 end | 534 end |
534 | 535 |
549 self:HideAnchor() | 550 self:HideAnchor() |
550 else | 551 else |
551 self:ShowAnchor() | 552 self:ShowAnchor() |
552 end | 553 end |
553 end | 554 end |
554 |