comparison ObjectiveFrame.lua @ 2:a2396b03ce63

- identify action buttons by the associated QuestID instead of QuestLogIndex - deferred button placement in general to a self-destructing OnUpdate -- and defer self-destruct to a end of combat event if InCombatLockdown - tracker wrapper has an experience/reputation bar; the two elements "feel" related and it's a very simple info display
author Nenue
date Thu, 31 Mar 2016 01:38:47 -0400
parents b0447b382f36
children 3397aae1f44d
comparison
equal deleted inserted replaced
1:b0447b382f36 2:a2396b03ce63
2 -- @file-author@ 2 -- @file-author@
3 -- @project-revision@ @project-hash@ 3 -- @project-revision@ @project-hash@
4 -- @file-revision@ @file-hash@ 4 -- @file-revision@ @file-hash@
5 -- Created: 3/30/2016 12:49 AM 5 -- Created: 3/30/2016 12:49 AM
6 local B = select(2,...).frame 6 local B = select(2,...).frame
7 local ipairs, max, unpack = ipairs, max, unpack 7 local ipairs, max, min, unpack, floor, pairs, tostring, type = ipairs, max, min, unpack, floor, pairs, tostring, type
8 local IsResting, UnitXP, UnitXPMax, GetXPExhaustion = IsResting, UnitXP, UnitXPMax, GetXPExhaustion
9 local UnitLevel, IsQuestWatched, UIParent = UnitLevel, IsQuestWatched, UIParent
8 local CreateFrame = CreateFrame 10 local CreateFrame = CreateFrame
9 local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame') 11 local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
10 local print = B.print('Objectives') 12 local print = B.print('Objectives')
11 -------------------------------------------------------------------- 13 --------------------------------------------------------------------
12 --- Global frame layout 14 --- Global frame layout
13 -------------------------------------------------------------------- 15 --------------------------------------------------------------------
14 16
15 --- Upvalues 17 --- Upvalues
16 local Wrapper = _G.VeneerObjectiveWrapper 18 local Wrapper = VeneerObjectiveWrapper
17 local Scroller = Wrapper.scrollArea 19 local Scroller = Wrapper.scrollArea
18 local Scroll = _G.VeneerObjectiveScroll 20 local Scroll = VeneerObjectiveScroll
19 local orderedHandlers = mod.orderedHandlers 21 local orderedHandlers = mod.orderedHandlers
20 local orderedNames = mod.orderedNames 22 local orderedNames = mod.orderedNames
21 23
22 --- Temp values set during updates 24 --- Temp values set during updates
23 local wrapperWidth, wrapperHeight 25 local wrapperWidth, wrapperHeight
29 local titleSize, textSize = 15, 15 31 local titleSize, textSize = 15, 15
30 local titleOutline, textOutline = "OUTLINE", "OUTLINE" 32 local titleOutline, textOutline = "OUTLINE", "OUTLINE"
31 local titleSpacing, textSpacing = 4, 3 33 local titleSpacing, textSpacing = 4, 3
32 local textIndent = 5 34 local textIndent = 5
33 local wrapperMaxWidth, wrapperMaxHeight = 280, 490 -- these are the hard bounds, actual *Height variables are changed 35 local wrapperMaxWidth, wrapperMaxHeight = 280, 490 -- these are the hard bounds, actual *Height variables are changed
36 local wrapperHeadFont, wrapperHeadSize, wrapperHeadOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 16, 'NONE'
34 local headerFont, headerSize, headerHeight = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 18, 24 37 local headerFont, headerSize, headerHeight = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 18, 24
35 local headerOutline, headerColor = 'OUTLINE', {1,1,1,1} 38 local headerOutline, headerColor, headerSpacing = 'OUTLINE', {1,1,1,1}, 2
36 local wrapperPosition = {'RIGHT', UIParent, 'RIGHT', -84, 0} 39 local wrapperPosition = {'RIGHT', UIParent, 'RIGHT', -84, 0}
37 40
38 local Scroller_OnShow = function() 41 --- These are mostly aesthetic choices so it lives here
39 Wrapper.watchMoneyReasons = 0;
40 mod.UpdateWrapper()
41 end
42
43 local Scroller_OnHide = function()
44 local self = Wrapper
45 Wrapper:UnregisterAllEvents()
46 Wrapper:SetScript('OnEvent', nil)
47 Wrapper.Background:Hide()
48 Wrapper.BackgroundR:Hide()
49 end
50
51 local Scroller_OnMouseWheel = function(self, delta)
52 local r = Scroll:GetHeight() - Scroller:GetHeight()
53 local s = self:GetVerticalScroll() - delta * floor(r/5+.5)
54 if r == 0 then return end
55 if s >= r then
56 s = r
57 elseif s < 1 then
58 s = 0
59 end
60 self:SetVerticalScroll(s)
61 print(s, r, self:GetVerticalScroll())
62
63 mod.UpdateActionButtons()
64 end
65
66 local WrapperCloseButton_OnClick = function(self)
67 if Scroller:IsVisible() then
68 Scroller:Hide()
69 else
70 Scroller:Show()
71 end
72 end
73
74
75 mod.InitializeTrackers = function()
76 for i, name in ipairs(orderedNames) do
77 if not mod.orderedHandlers[i] then
78 if mod.Tracker(name, i) then
79 local handler = mod[name]
80
81 local tracker = CreateFrame('Frame', 'Veneer'..name..'Tracker', Scroll, 'VeneerTrackerTemplate')
82 tracker.header:SetText(handler.name)
83 tracker.header:SetHeight(headerHeight)
84 tracker.header:SetFont(headerFont, headerSize, headerOutline)
85 tracker.header:SetTextColor(unpack(headerColor))
86
87 handler.Tracker = tracker
88 mod.orderedTrackers[i] = tracker
89 mod.namedTrackers[name] = tracker
90 mod.indexedTrackers[handler] = tracker
91 print('created new tracker frames for new handler')
92 end
93 end
94 end
95
96 Scroller:SetScrollChild(Scroll)
97 Scroller:SetScript('OnMouseWheel', Scroller_OnMouseWheel)
98 Scroller:SetScript('OnShow', Scroller_OnShow)
99 Scroller:SetScript('OnHide', Scroller_OnHide)
100 Wrapper.close:SetScript('OnClick', WrapperCloseButton_OnClick)
101 Wrapper:SetPoint(unpack(wrapperPosition))
102 Scroller_OnShow(Scroller)
103 end
104
105 mod.defaults = { 42 mod.defaults = {
106 ObjectiveTrackerAnchor = {'BOTTOM', 'RIGHT'}, 43 ObjectiveTrackerAnchor = {'BOTTOM', 'RIGHT'},
107 ObjectiveTrackerParent = 'DebuffButton', 44 ObjectiveTrackerParent = 'DebuffButton',
108 ObjectiveTrackerSize = {250, 600}, 45 ObjectiveTrackerSize = {250, 600},
109 ObjectiveWrapperParent = '', 46 ObjectiveWrapperParent = '',
47 WrapperStyle = {
48 Header = {
49 Background = {Left = [[Objective-Header]], Right = [[Objective-Header]], Tile = [[Objective-Header]]},
50 BackgroundCrop = {Left = {0, 0.4, 0,1}, Right={0.6,1,0,1}, Tile = {0.4,.6,0,1,}},
51 BackgroundScale = {Left = 100, Right = 100},
52 Font = {wrapperHeadFont, wrapperHeadSize, wrapperHeadOutline}
53 }
54 },
55 ObjectiveHeaderStyle = {
56 Normal = {
57 Gradient = {MinColor = {0,0,0,0.5}, MaxColor = {0,0,0,1}},
58 Font = {headerFont, headerSize, headerOutline}, Spacing = headerSpacing,
59 }
60 },
110 ObjectiveTrackerStyle = { 61 ObjectiveTrackerStyle = {
111 Normal = { 62 Normal = {
112 Title = { 63 Title = {
113 Gradient = { MinColor = {0.2, .4, 1, 0.45}, MaxColor = {.7, 0, 0.9, 0}}, 64 Gradient = { MinColor = {0.2, .4, 1, 0.45}, MaxColor = {.7, 0, 0.9, 0}},
114 Font = {titleFont, titleSize, titleOutline}, Spacing = titleSpacing, 65 Font = {titleFont, titleSize, titleOutline}, Spacing = titleSpacing,
156 } 107 }
157 }, 108 },
158 } 109 }
159 } 110 }
160 111
112 local Scroller_OnShow = function()
113 Wrapper.watchMoneyReasons = 0;
114 mod.UpdateWrapper()
115 mod.SetEvents()
116 for i, region in ipairs(Wrapper.header) do
117 region:Show()
118 end
119 end
120
121 local Scroller_OnHide = function()
122 local self = Wrapper
123 Wrapper:UnregisterAllEvents()
124 Wrapper:SetScript('OnEvent', nil)
125 for i, region in ipairs(Wrapper.header) do
126 region:Hide()
127 end
128 end
129
130 local Scroller_OnMouseWheel = function(self, delta)
131 local r = Scroll:GetHeight() - Scroller:GetHeight()
132 local s = self:GetVerticalScroll() - delta * floor(r/5+.5)
133 if r == 0 then return end
134 if s >= r then
135 s = r
136 elseif s < 1 then
137 s = 0
138 end
139 self:SetVerticalScroll(s)
140 print(s, r, self:GetVerticalScroll())
141
142 mod.UpdateActionButtons()
143 end
144
145 local WrapperCloseButton_OnClick = function(self)
146 if Scroller:IsVisible() then
147 Scroller:Hide()
148 else
149 Scroller:Show()
150 end
151 end
152
153 mod.InitializeTrackers = function()
154
155 local c = mod.defaults.ObjectiveHeaderStyle.Normal
156 local g1, g2, g3, g4 = unpack(c.Gradient.MinColor)
157 local h1, h2, h3, h4 = unpack(c.Gradient.MaxColor)
158
159 for i, name in ipairs(orderedNames) do
160 if not mod.orderedHandlers[i] then
161 if mod.Tracker(name, i) then
162 local handler = mod[name]
163
164 local tracker = CreateFrame('Frame', 'Veneer'..name..'Tracker', Scroll, 'VeneerTrackerTemplate')
165 tracker.header:SetText(handler.name)
166 tracker.header:SetHeight(headerHeight)
167 tracker.header:SetFont(unpack(c.Font))
168 tracker.header:SetTextColor(unpack(headerColor))
169
170 tracker.headerbg:SetGradientAlpha('HORIZONTAL', g1, g2 ,g3, g4, h1, h2, h3, h4)
171 tracker.headerbg:SetHeight(headerHeight)
172
173 handler.Tracker = tracker
174 mod.orderedTrackers[i] = tracker
175 mod.namedTrackers[name] = tracker
176 mod.indexedTrackers[handler] = tracker
177 print('created new tracker frames for new handler')
178 end
179 end
180 end
181
182 Scroller:SetScrollChild(Scroll)
183 Scroller:SetScript('OnMouseWheel', Scroller_OnMouseWheel)
184 Scroller:SetScript('OnShow', Scroller_OnShow)
185 Scroller:SetScript('OnHide', Scroller_OnHide)
186 Wrapper.close:SetScript('OnClick', WrapperCloseButton_OnClick)
187 Wrapper:SetPoint(unpack(wrapperPosition))
188 Scroller_OnShow(Scroller)
189
190 mod.UpdateWrapperStyle()
191 end
192
193 mod.InitializeXPTracker = function()
194 local XPBar = Wrapper.XPBar
195 if UnitLevel('player') == 100 then
196 XPBar:Hide()
197 return
198 end
199
200 --- xp bar
201 XPBar:Show()
202 XPBar.rested:SetTexture(2,.6,1,1)
203 XPBar.fg:SetTexture(.3,.1,.95,1)
204 XPBar.bg:SetTexture(0,0,0,.25)
205 XPBar:RegisterEvent('PLAYER_XP_UPDATE')
206 XPBar:RegisterEvent('PLAYER_LEVEL_UP')
207 XPBar:RegisterEvent('PLAYER_UPDATE_RESTING')
208 XPBar:SetScript('OnEvent', mod.UpdateXP)
209 mod.UpdateXP(Wrapper.xpBar)
210 end
211
212 mod.UpdateXP = function()
213 local XPBar = Wrapper.XPBar
214 local xp = UnitXP('player')
215 local xpmax = UnitXPMax('player')
216 local rest = GetXPExhaustion()
217
218 XPBar.bg:SetAllPoints(XPBar)
219 XPBar.fg:SetWidth((xp/xpmax) * XPBar:GetWidth())
220
221 if IsResting() then
222 XPBar.bg:SetTexture(.2,.8,.2,.5)
223 else
224 XPBar.bg:SetTexture(0,0,0,.25)
225 end
226
227 if rest then
228 XPBar.rested:ClearAllPoints()
229 if xp == 0 then
230 XPBar.rested:SetPoint('LEFT', XPBar, 'LEFT', 0, 0)
231 else
232 XPBar.rested:SetPoint('LEFT', XPBar.fg, 'RIGHT', 0, 0)
233 end
234
235 if (xp + rest) > xpmax then
236 XPBar.rested:SetPoint('RIGHT', XPBar, 'RIGHT', 0, 0)
237 else
238 XPBar.rested:SetWidth((xp/xpmax) * XPBar:GetWidth())
239 end
240 XPBar.rested:Show()
241 else
242 XPBar.rested:Hide()
243 end
244
245 XPBar.xpText:SetText(xp .. '/'.. xpmax .. (rest and (' ('..tostring(rest)..')') or ''))
246 end
247
248 mod.UpdateReputation = function(self)
249 end
161 250
162 --- Argument containers 251 --- Argument containers
163 local a1, a2, a3, a4, b1, b2, b3, b4, f1, f2, f3, w1, w2 252 local a1, a2, a3, a4, b1, b2, b3, b4, f1, f2, f3, w1, w2
164 mod.SetBlockStyle = function(block, name) 253 mod.SetBlockStyle = function(block, name)
165 -- var names intended to reflect argument order 254 -- var names intended to reflect argument order
255 --@debug@
166 local c = mod.defaults.ObjectiveTrackerStyle[name] 256 local c = mod.defaults.ObjectiveTrackerStyle[name]
257 --@end-debug@
258 --[===[@non-debug
259 local c = mod.Conf
260 --@end-non-debug]===]
167 a1, a2, a3, a4 = unpack(c.Title.Gradient.MinColor) 261 a1, a2, a3, a4 = unpack(c.Title.Gradient.MinColor)
168 b1, b2, b3, b4 = unpack(c.Title.Gradient.MaxColor) 262 b1, b2, b3, b4 = unpack(c.Title.Gradient.MaxColor)
169 block.titlebg:SetGradientAlpha('HORIZONTAL', a1, a2, a3, a4, b1, b2, b3, b4) 263 block.titlebg:SetGradientAlpha('HORIZONTAL', a1, a2, a3, a4, b1, b2, b3, b4)
170 264
171 a1, a2, a3, a4 = unpack(c.Text.Gradient.MinColor) 265 a1, a2, a3, a4 = unpack(c.Text.Gradient.MinColor)
210 block.titleHeight = titleHeight 304 block.titleHeight = titleHeight
211 block.textHeight = textHeight 305 block.textHeight = textHeight
212 block.width = blockWidth 306 block.width = blockWidth
213 block.height = blockHeight 307 block.height = blockHeight
214 308
215 print('|cFF88DDFFApplyStyle(', block:GetName(), ')|r', blockWidth, 'x', blockHeight, '(textH', textHeight,', titleH', titleHeight, ')') 309 print(' |cFF00FFFF'..block:GetName()..'|r:|cFF0088FFSetStyle|r(', blockWidth, 'x', blockHeight, '(textH', textHeight,', titleH', titleHeight, ')')
310 end
311
312 local segments = {'Left', 'Right', 'Tile'}
313 mod.UpdateWrapperStyle = function()
314 local c = mod.defaults.WrapperStyle
315 for _, segment in ipairs(segments) do
316 Wrapper['Background'..segment]:SetAtlas(c.Header.Background[segment])
317 Wrapper['Background'..segment]:SetTexCoord(unpack(c.Header.BackgroundCrop[segment]))
318 if c.Header.BackgroundScale[segment] then
319 Wrapper['Background'..segment]:SetWidth(c.Header.BackgroundScale[segment])
320 end
321 end
216 end 322 end
217 323
218 --- Updates the selected block frame to display the given info batch 324 --- Updates the selected block frame to display the given info batch
219 -- If `previousBlock` is set, it will attempt to anchor to that 325 -- If `previousBlock` is set, it will attempt to anchor to that
220 -- @param blockNum the ordered block to be updated, not a watchIndex value 326 -- @param blockNum the ordered block to be updated, not a watchIndex value
221 -- @param info the reference returned by the GetXInfo functions 327 -- @param info the reference returned by the GetXInfo functions
222 -- REMEMBER: t.info and questData[questID] are the same table 328 -- REMEMBER: t.info and questData[questID] are the same table
223 mod.UpdateTrackerBlock = function (handler, blockIndex, info) 329 mod.UpdateTrackerBlock = function (handler, blockIndex, info)
224 print('|cFF00FFFFUpdateTrackerBlock('..blockIndex..'|r') 330 print(' |cFF00FFFFUpdateTrackerBlock('..blockIndex..'|r')
225 if not blockIndex or not info then 331 if not blockIndex or not info then
226 return 332 return
227 end 333 end
228 334
229 local tracker = handler.Tracker 335 local tracker = handler.Tracker
235 else 341 else
236 t:SetPoint('TOPLEFT', previousBlock, 'BOTTOMLEFT', 0, 0) 342 t:SetPoint('TOPLEFT', previousBlock, 'BOTTOMLEFT', 0, 0)
237 end 343 end
238 t:SetPoint('RIGHT', tracker,'RIGHT', 0, 0) 344 t:SetPoint('RIGHT', tracker,'RIGHT', 0, 0)
239 end 345 end
240 print(t:GetName(), t:GetSize()) 346 --print(t:GetName(), t:GetSize())
241 print(t:GetPoint(1)) 347 --print(t:GetPoint(1))
242 348
243 t.info = info 349 t.info = info
244 350
245 if info.questLogIndex then handler.LogBlock[info.questLogIndex] = t end 351 if info.questLogIndex then handler.LogBlock[info.questLogIndex] = t end
246 if info.watchIndex then handler.WatchBlock[info.watchIndex] = t end 352 if info.watchIndex then handler.WatchBlock[info.watchIndex] = t end
258 if info.isComplete then 364 if info.isComplete then
259 t.objectives:Show() 365 t.objectives:Show()
260 t.objectives:SetText(info.completionText) 366 t.objectives:SetText(info.completionText)
261 elseif info.numObjectives >= 1 then 367 elseif info.numObjectives >= 1 then
262 t.objectives:Show() 368 t.objectives:Show()
263 print('objective lines:', info.numObjectives, 'can wrap:', t.objectives:CanWordWrap()) 369 print(' - objective lines:', info.numObjectives, 'can wrap:', t.objectives:CanWordWrap())
264 local text = '' 370 local text = ''
265 for o, obj in ipairs(t.info.objectives) do 371 for o, obj in ipairs(t.info.objectives) do
266 local line = obj.text 372 local line = obj.text
267 if obj.type == 'monster' then 373 if obj.type == 'monster' then
268 line = '|cFFFFFF00' .. line .. '|r' 374 line = '|cFFFFFF00' .. line .. '|r'
275 end 381 end
276 t.objectives:SetText(text) 382 t.objectives:SetText(text)
277 383
278 384
279 -- todo: set up a SecureActionButton template 385 -- todo: set up a SecureActionButton template
280 if info.specialItem then 386 if info.specialItem and not info.itemButton then
281 print('|cFF00FFFFretrieve item button') 387 print(' - |cFF00FFFFupdate item button')
282 mod.SetItemButton(t, info) 388 mod.SetItemButton(t, info)
283 elseif t.itemButton then
284 print('|cFF00FF88drop item button')
285 mod.FreeItemButton(t, info)
286 end 389 end
287 390
288 391
289 elseif info.description then 392 elseif info.description then
290 t.objectives:SetText(info.description) 393 t.objectives:SetText(info.description)
302 t:SetStyle(style) 405 t:SetStyle(style)
303 406
304 407
305 local fullheight = t:GetHeight() 408 local fullheight = t:GetHeight()
306 t:Show() 409 t:Show()
307 print('|cFF00FFFF)|r -> ', t, t:GetHeight(), fullheight) 410 print(' |cFF00FFFF)|r -> ', t, t:GetHeight(), fullheight)
308 return t 411 return t
309 end 412 end
310 413
311 mod.UpdateTracker = function(handler) 414 mod.UpdateTracker = function(handler)
312 print('|cFF00FF88UpdateTracker(|r|cFFFF4400' .. type(handler) .. '|r :: |cFF88FFFF' .. tostring(handler) .. '|r') 415 print('|cFF00FF88UpdateTracker(|r|cFFFF4400' .. type(handler) .. '|r :: |cFF88FFFF' .. tostring(handler) .. '|r')
324 if watchIndex <= numWatched then 427 if watchIndex <= numWatched then
325 local info = handler:GetInfo(watchIndex) 428 local info = handler:GetInfo(watchIndex)
326 if info then 429 if info then
327 local currentBlock = mod.UpdateTrackerBlock(handler, blockIndex, info) 430 local currentBlock = mod.UpdateTrackerBlock(handler, blockIndex, info)
328 previousBlock = currentBlock 431 previousBlock = currentBlock
329 print('adding ', currentBlock.height)
330 trackerHeight = trackerHeight + currentBlock.height 432 trackerHeight = trackerHeight + currentBlock.height
331 numBlocks = max(numBlocks, watchIndex) 433 numBlocks = max(numBlocks, watchIndex)
332 actualBlocks = actualBlocks + 1 434 actualBlocks = actualBlocks + 1
333 else 435 else
334 print('|cFFFF0000Failed to draw info for index #'..watchIndex) 436 print('|cFFFF0000Failed to draw info for index #'..watchIndex)
410 wrapperWidth = floor(wrapperWidth+.5) 512 wrapperWidth = floor(wrapperWidth+.5)
411 wrapperHeight = floor(wrapperHeight+.5) 513 wrapperHeight = floor(wrapperHeight+.5)
412 headerHeight = floor(headerHeight+.5) 514 headerHeight = floor(headerHeight+.5)
413 515
414 if wrapperBlocks >= 1 then 516 if wrapperBlocks >= 1 then
415 Wrapper.Background:Show() 517 for i, region in ipairs(Wrapper.header) do
416 Wrapper.BackgroundR:Show() 518 region:Show()
417 else 519 end
418 Wrapper.Background:Hide() 520 else
419 Wrapper.BackgroundR:Hide() 521 for i, region in ipairs(Wrapper.header) do
522 region:Hide()
523 end
420 return 524 return
421 end 525 end
422 --wrapperHeight = scrollHeight 526 --wrapperHeight = scrollHeight
423 527
424 print('|cFFFFFF00params:|r scroller:', scrollWidth, 'x', scrollHeight) 528 print('|cFFFFFF00params:|r scroller:', scrollWidth, 'x', scrollHeight)
450 end 554 end
451 555
452 --- Queue any active item buttons for update for that frame 556 --- Queue any active item buttons for update for that frame
453 mod.UpdateActionButtons = function() 557 mod.UpdateActionButtons = function()
454 local previousItem 558 local previousItem
455 for questIndex, itemButton in pairs(usedButtons) do 559 for questID, itemButton in pairs(usedButtons) do
560 local questIndex = mod.Quest.Info[questID].questLogIndex
456 print('|cFF00FFFF', questIndex, itemButton:GetName()) 561 print('|cFF00FFFF', questIndex, itemButton:GetName())
457 local block = mod.Quest.LogBlock[questIndex] 562 local block = mod.Quest.LogBlock[questIndex]
458 print(block:GetTop()) 563 print(block:GetTop())
459 if block then 564 if block then
460 if IsQuestWatched(questIndex) then 565 if IsQuestWatched(questIndex) then
467 block:SetScript('OnUpdate', nil) 572 block:SetScript('OnUpdate', nil)
468 end 573 end
469 end) 574 end)
470 return 575 return
471 else 576 else
472 mod.FreeItemButton(block, itemButton) 577 mod.FreeItemButtons(block)
473 end 578 end
474 end 579 end
475 end 580 end
476 end 581 end
477 582
478 mod.UpdateBlockAction = function (block, itemButton, previousItem) 583 mod.UpdateBlockAction = function (block, itemButton, previousItem)
584 if block.itemButton ~= itemButton then
585 block.itemButton = itemButton
586 end
587 if itemButton.block ~= block then
588 itemButton.block = block
589 end
590
479 if block:GetBottom() < Scroller:GetBottom() then 591 if block:GetBottom() < Scroller:GetBottom() then
480 print('|cFFFFFF00bottom not fully visible') 592 print('|cFFFFFF00bottom not fully visible')
481 if previousItem then 593 if previousItem then
482 previousItem:ClearAllPoints() 594 previousItem:ClearAllPoints()
483 previousItem:SetPoint('BOTTOM', itemButton, 'TOP', 0, 4) 595 previousItem:SetPoint('BOTTOM', itemButton, 'TOP', 0, 4)