# HG changeset patch
# User Nenue
# Date 1461837261 14400
# Node ID 1a322b92dbfaec2b377364672675716106af872d
# Parent aa693607b81326231109951686a109b36f6f8977
file cleanup
diff -r aa693607b813 -r 1a322b92dbfa BuffAnchors.lua
--- a/BuffAnchors.lua Tue Apr 26 15:05:38 2016 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,303 +0,0 @@
---- ${PACKAGE_NAME}
--- @file-author@
--- @project-revision@ @project-hash@
--- @file-revision@ @file-hash@
--- Created: 3/22/2016 3:10 AM
-
-local MODULE = 'BuffFrame'
-local _, A = ...
-local B, _G = A.frame, _G
-local M = B:RegisterModule(MODULE)
-local type, unpack, select, pairs, ipairs, wipe = type, unpack, select, pairs, ipairs, table.wipe
-local min, ceil, mod, tonumber, tostring = min, ceil, mod, tonumber, tostring
-local CreateFrame = CreateFrame
-local print = B.print('Anchor')
-local fprint = B.fprint
-local bprint = B.print('AnchorFrame')
-
-local GetAnchorFrame = function(name)
- local c = B.displays[name].conf
- local anchorFrom, anchorParent, anchorTo, offsetX, offsetY = unpack(c.Anchor)
- local print = bprint
- if B.anchor[name] then
- print('get', B.anchor[name]:GetName())
- return B.anchor[name], anchorFrom, anchorParent, anchorTo, offsetX, offsetY
- end
- print('new frame', name)
- local frame = CreateFrame('Frame', name..'Anchor', UIParent, B.displays[name].anchorTemplate)
- frame.conf = c
-
- local x, dx, y, dy
- local Anchor_OnMouseDown = function()
- if c['Parent'] then
- return
- end
-
- x = frame:GetLeft()
- y = frame:GetTop()
- frame:StartMoving()
- frame.isMoving = true
- end
-
- local Anchor_OnMouseUp = function()
- if c['Parent'] then
- return
- end
-
- frame:StopMovingOrSizing()
- dx = frame:GetLeft() - x
- dy = frame:GetTop() - y
- -- update config
- print('|cFFFFFF00**changing', name, 'anchor by', dx, dy)
- offsetX = offsetX + dx
- offsetY = offsetY + dy
- B.Conf[name .. 'Anchor'] = {anchorFrom, anchorParent, anchorTo, offsetX, offsetY }
- frame:SetPoint(anchorFrom, _G[anchorParent], anchorTo, offsetX, offsetY)
- frame.isMoving = nil
- end
-
- local AnchorButton_OnClick = function(self, anchor)
- local point, parent, relative = anchor:GetPoint(1)
- print('resetting anchors', point, parent:GetName(), relative)
- B.Conf[name..'Point'] = {point, relative}
- B.Conf[name..'RelativeX'] = (point:match('RIGHT')) and -1 or 1
- B.Conf[name..'RelativeY'] = (point:match('TOP')) and -1 or 1
- wipe(B.drawn[name])
- B.UpdateBuffs(name)
- end
-
- frame.OnUpdate = function(self, elapsed)
- print(self:GetName(), elapsed)
- if self:IsMouseOver() then
- for i, anchorButton in ipairs(frame.anchorButton) do
- anchorButton:Show()
- end
- else
- for i, anchorButton in ipairs(frame.anchorButton) do
- anchorButton:Hide()
- end
- end
- end
-
- frame:EnableMouse(B.Conf.ConfigMode and B.Conf.ConfigMode or false)
- frame:SetScript('OnMouseDown', Anchor_OnMouseDown)
- frame:SetScript("OnMouseUp", Anchor_OnMouseUp)
- -- table addition
- for i, anchorButton in ipairs(frame.anchorButton) do
- anchorButton:SetScript('OnClick', AnchorButton_OnClick)
- end
-
- B.displays[name].anchor = frame
- print(B.displays[name].anchor:GetName())
- print(B.anchor[name]:GetName())
- return frame, anchorFrom, anchorParent, anchorTo, offsetX, offsetY
-end
-
---- Handles the preliminary positioning calculation for buff guide anchors
-M.UpdateAnchorFrames = function(name)
- local print = fprint(name)
- local c = B.displays[name].conf
- local frame, anchorFrom, anchorParent, anchorTo, offsetX, offsetY = GetAnchorFrame(name)
- print('got', frame:GetName())
- frame.buffs = B.guides[name]
- frame.heading:SetText(name)
- B.SetConfigLayers(frame)
-
- local buffMax = c['Max'] or 3
- local perRow = c['PerRow'] or 2
- local buffSpacing = c['Spacing']
- local buffSize = c['Size']
- local buffDurationSize = c['DurationSize']
-
- if not frame.isMoving then
- if not B.Conf[name .. 'Parent'] then
- frame:SetPoint(anchorFrom, _G[anchorParent], anchorTo, offsetX, offsetY)
- end
- end
-
- if frame.contains then buffMax = buffMax + 1 end
- local cols, rows = min(perRow, buffMax), ceil(buffMax/perRow)
- local spaces, breaks = (cols - 1), (rows - 1)
- frame.columns = cols
- frame.rows = rows
- frame.spaces = cols - 1
- frame.breaks = rows - 1
-
- local width = cols*buffSize + spaces*buffSpacing
- local height = rows * (buffSize + buffDurationSize) + (breaks * (buffSpacing))
-
- frame:SetSize(width, height)
- frame:Show()
- print(frame:GetName(), frame:GetSize())
- print(frame:GetPoint(1))
-end
-
---- Handles placement of anchors embedded within anchors (consolidated buffs, maybe temp enchant)
-M.UpdateAnchorAnchors = function()
- local print = fprint()
- for buttonName, d in pairs(B.displays) do
- local c = B.displays[buttonName].conf
- local frame = B.anchor[buttonName]
- local parent, child = c.Parent, c.Position
-
- frame.parent = nil
- if B.Conf[buttonName .. 'Parent'] and _G[B.Conf[buttonName .. 'Parent']..'Anchor'] then
-
- local anchorAnchor = _G[B.Conf[buttonName .. 'Parent']..'Anchor']
- local anchorTarget = B.guides[parent][child]
- if anchorTarget then
- print('link', buttonName, 'to', parent, child)
- print(parent, child, B.displays[parent].guides[child])
- local ac = B.displays[parent].conf
- local anchorFrom, anchorTo = unpack(ac.Point)
- frame:ClearAllPoints()
- frame:SetPoint(anchorFrom, anchorTarget, anchorTo)
- frame.parent = anchorTarget
- anchorTarget.contains = frame
- anchorAnchor.contains = frame
- anchorAnchor.containPosition = child
- else
- frame.parent = anchorAnchor
- anchorAnchor.contains = frame
- anchorAnchor.containPosition = nil
- end
- else
- frame.parent = nil
- end
-
- end
-end
-
--- if facing key direction, anchor point [1] to parent's point [2]
-local childFacing = {
- ['TOP'] = {'TOP', 'BOTTOM'},
- ['BOTTOM'] = {'BOTTOM', 'TOP'},
- ['RIGHT'] = {'LEFT', 'RIGHT'},
- ['LEFT'] = {'RIGHT', 'LEFT'},
-}
--- if align in key position, concatenate value with facing point
-local childAlign = {
- ['TOP'] = 'TOP%s',
- ['BOTTOM'] = 'BOTTOM%s',
- ['MIDDLE'] = '%s',
- ['LEFT'] = '%sLEFT',
- ['RIGHT'] = '%sRIGHT',
- ['CENTER'] = '%s',
-}
-
---- dep handlers
-B.UpdateAnchorChild = function (frame, child, c)
- if frame.attached ~= child then
- B.SetAnchorChild(frame, child, c)
- end
-
- print('positioning|cFFFF0088', child, '|r of |cFF00FF00', frame, '|r')
-
- local frameAnchor = unpack(B.Conf[c.Parent.. 'Anchor'])
- local childAnchor, childPoint = 'BOTTOMRIGHT', 'TOPRIGHT'
- local direction, position = unpack(c.Anchor)
- if direction and position then
- childAnchor = childAlign[position]:format(childFacing[direction][2])
- childPoint = childAlign[position]:format(childFacing[direction][1])
- print('align toward', position,'on', direction, 'edge')
- end
-
- print(frameAnchor, direction, position)
- local lX, lY, cX, cY = frame.outer_X, frame.outer_Y, frame.cutout_X, frame.cutout_Y
- local mX, mY = 0, 0 -- alignment modifiers
- local pX, pY = 0, 0 -- position value
- print('|cFFFF0088PUSHOUTS|r:', lX, lY, '|cFFFF8800PULL-IN|r:', cX, cY)
-
- -- if attachment is on a moving edge
- if not frameAnchor:match(direction) then
- print(' child anchors to a growing edge |cFFFF8800', direction,'|r')
- if direction == 'BOTTOM' then
- -- horizontal edge
-
- else
- -- vertical edge
- pX = lX
- end
-
- if frameAnchor:match(position) then
-
- print('close alignment', lX, cX)
- if position == 'RIGHT' then
- -- and far X val
- pX = 0
- lX = -lX
- cX = -cX
- pY = lY
- else
- end
- else
- print('far alignment', position)
- end
- else
- print(' child anchors to a static edge |cFF0088FF', direction,'|r')
- -- use no Y offset, position doesn't interfere
- if direction == 'BOTTOM' or direction == 'TOP' then
- pY = 0
- else
- pX = 0
- end
- end
-
- local frameWidth = frame:GetWidth()
- local frameHeight = frame:GetHeight()
-
- local overlapY, overlapX
-
- -- right and bottom anchors offsets need to be inverted
- if direction == 'BOTTOM' then
- print('inverting Y values for anchor on BOTTOM edge, options:', cY, lY, 'actual:', pY)
- pY = frameHeight - pY
- cY = frameHeight - cY
- lY = frameHeight - lY
- print(' new values:', cY, lY, pY)
- elseif direction == 'RIGHT' then
- pX = frameWidth -pX
- cX = frameWidth-cX
- lX = frameWidth-lX
- end
-
-
- print(child, '|cFFFFFF00', childAnchor, '|r', frame, '|cFFFF0088', childPoint, '|r', pX, pY)
- child:ClearAllPoints()
- child:SetPoint(childAnchor, frame, childPoint, pX, pY)
- frame.attachPoint = {childAnchor, childPoint }
-
- if Devian and Devian.InWorkspace() then
- frame.alignedJoint:ClearAllPoints()
- frame.poppingJointX:ClearAllPoints()
- frame.poppingJointY:ClearAllPoints()
- frame.cuttingJointX:ClearAllPoints()
- frame.cuttingJointY:ClearAllPoints()
- frame.childSpace:ClearAllPoints()
-
- frame.alignedJoint:SetPoint(childAnchor, frame, childPoint, pX, pY)
- frame.poppingJointY:SetPoint(childAnchor, frame, childPoint, lX, lY) -- should really only differ when rows exceed 1
- frame.poppingJointX:SetPoint(childAnchor, frame, childPoint, lX, lY)
- frame.cuttingJointY:SetPoint(childAnchor, frame, childPoint, cX, cY) -- should really only differ when rows exceed 1
- frame.cuttingJointX:SetPoint(childAnchor, frame, childPoint, cX, cY)
- frame.childSpace:SetAllPoints(child)
-
- frame.alignedJoint:Show()
- frame.poppingJointX:Show()
- frame.poppingJointY:Show()
- frame.cuttingJointX:Show()
- frame.cuttingJointY:Show()
- frame.childSpace:Show()
-
- print('|cFFFF0000MIN |r', childAnchor, childPoint, pX, pY)
- print('|cFF00FFFFFAR |r', childAnchor, childPoint, cX, cY)
- print('|cFFFFFF00CLOSE|r', childAnchor, childPoint, lX, lY)
-
- end
-end
-
-B.SetAnchorChild = function(frame, child, c)
- print('linking', child)
- frame.attached = child
- frame.attachmentConf = c
-end
\ No newline at end of file
diff -r aa693607b813 -r 1a322b92dbfa BuffButton.lua
--- a/BuffButton.lua Tue Apr 26 15:05:38 2016 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,441 +0,0 @@
---- Actual BlizzUI modifications are applied here
--- @file-author@
--- @project-revision@ @project-hash@
--- @file-revision@ @file-hash@
--- Created: 3/12/2016 12:47 AM
-local MODULE = 'BuffFrame'
-local _, A = ...
-local B, _G = A.frame, _G
-local type, unpack, select, pairs, ipairs = _G.type, _G.unpack, _G.select, _G.pairs, _G.ipairs
-local min, ceil, mod, tonumber, tostring = _G.min, _G.ceil, _G.mod, _G.tonumber, _G.tostring
-local floor, wipe, max = _G.math.floor, _G.table.wipe, _G.math.max
-local CreateFrame, IsInGroup, GetCVarBool = _G.CreateFrame, _G.IsInGroup, _G.GetCVarBool
-local BuffFrame, ConsolidatedBuffs = _G.BuffFrame, _G.ConsolidatedBuffs
-local print, gprint, aprint, fprint = B.print('Buff'), B.print('SetGuides'), B.print('SetAnchors'), B.fprint
-local displays, anchors, guides, decors, positioned, drawn, zoom = B.displays, {}, {}, {}, {}, {}, {}
-local UnitAura, UnitName, RegisterStateDriver = _G.UnitAura, _G.UnitName, _G.RegisterStateDriver
-
-local M = B:RegisterModule(MODULE)
-
-M.GetBuffZoom = function(buffName)
- local zoom = tonumber(B.displays[buffName].conf['Zoom']) / 100 / 2
- local zoomL, zoomU, zoomR, zoomD = zoom, zoom, 1-zoom, 1-zoom
- print(buffName, zoom)
- return function(self, ...)
- if select('#',...) == 4 then
- zoomL, zoomR, zoomU, zoomD = ...
- end
- self:SetTexCoord(zoomL, zoomR, zoomU, zoomD)
- return zoomL, zoomR, zoomU, zoomD
- end
-end
-
-
-
-M.UpdateButtonAlpha = function(self)
- if not self.parent.timeLeft or not self:IsVisible() then
- self:SetScript('OnUpdate', nil)
- return
- end
-
- if self.parent.timeLeft < _G.BUFF_WARNING_TIME then
- self:SetAlpha(BuffFrame.BuffAlphaValue)
- else
- self:SetAlpha(1)
- end
-end
-
---- Called infrequently to align stencil frames
-local refreshCount = 0
-M.UpdateGuideFrames = function(buffName)
- refreshCount = refreshCount + 1
- local print = fprint()
-
-
- local anchor = anchors[buffName]
- local c, g, d = displays[buffName].conf, guides[buffName], decors[buffName]
- local perRow = c['PerRow']
- local buffSpacing, buffSize, buffBorder, buffDurationSize, buffCountSize, relativeX, relativeY = c['Spacing'], c['Size'], c['Border'], c['DurationSize'], c['CountSize'], c['RelativeX'], c['RelativeY']
- local consolidated = (anchors[buffName].contains and IsInGroup())
- local consolidatedPosition = (consolidated and anchors[buffName].containPosition or 0)
-
-
- print('|cFF00FF00Setting Guides ('..refreshCount..'):|r', buffName, 'user max:',c['Max'], 'hard max:', displays[buffName].maxIcons)
-
- local buffMax = min(c['Max'], displays[buffName].maxIcons)
- local anchorFrom, anchorTo = c.Point[1], c.Point[2]
- anchor.Zoom = M.GetBuffZoom(buffName)
-
-
-
- if consolidated then
- buffMax = buffMax + 1
- end
-
- local legend = {}
- legend.r, legend.g, legend.b, legend.a = unpack(displays[buffName].legendColor)
- local horizFrom = (relativeX < 0) and 'RIGHT' or 'LEFT'
- local horizTo = (relativeX < 0) and 'LEFT' or 'RIGHT'
- local vertFrom = (relativeY < 0) and 'TOP' or 'BOTTOM'
- local vertTo = (relativeY < 0) and 'BOTTOM' or 'TOP'
- local previous, up
- local bottom_extent = 0
- for i = 1, buffMax do
- print('update idx', i)
- if not g[i] then
- g[i] = CreateFrame('Frame', buffName..'Guide'..i, anchor, displays[buffName].template or 'VeneerGuideTemplate')
- RegisterStateDriver(g[i], "visibility", "[petbattle] [vehicleui] hide; show")
- end
-
- local guide = g[i]
-
- local row = ceil(i / perRow)
- local col = mod(i, perRow)
- if col == 0 then
- col = perRow
- end
-
- guide.previous = previous
- guide.up = up
- local x, y, parent = 0, 0, anchor
- if i == 1 then
- parent = anchor
- up = guide
- elseif col == 1 then
- parent = g[i-perRow]
- y = (buffSpacing + bottom_extent) * relativeY
- up = guide
- anchorFrom = vertFrom .. horizFrom
- anchorTo = vertFrom .. horizFrom
- bottom_extent = 0
- else
- parent = g[i-1]
- x = buffSpacing * relativeX
- anchorFrom = vertFrom .. horizFrom
- anchorTo = vertFrom .. horizTo
- end
- previous = guide
- guide.parent = parent
-
- ---------------------------------
- -- Positioning layer
- if i ~= consolidatedPosition or not consolidated then
- guide:SetSize(buffSize, buffSize + buffDurationSize)
- -- RaidBuffTray will fix the sizing
- end
- bottom_extent = max(bottom_extent, guide:GetHeight())
-
- guide.info = {} -- UnitAura cache
-
- if i == consolidatedPosition then
- guide.legend:SetTexture(1,1,0,0.5)
- else
- guide.legend:SetTexture(legend.r, legend.g, legend.b, legend.a)
- end
-
- guide.idText:SetText(i) -- needs to reflect the current position
-
- guide:ClearAllPoints()
- guide:SetPoint(anchorFrom, parent, anchorTo, x, y)
- print(anchorFrom, parent, anchorTo, x, y)
-
- guide.icon:SetSize(buffSize - buffBorder * 2, buffSize - buffBorder * 2)
- guide.icon:ClearAllPoints()
- guide.icon:SetPoint('TOPLEFT', guide, 'TOPLEFT', buffBorder, -buffBorder )
-
- local anchorTo, anchorFrom, x, y = unpack(c.DurationPoint)
- guide.duration:ClearAllPoints()
- guide.duration:SetPoint(anchorTo, guide, anchorFrom, x, y)
- --guide.duration:SetSize(buffSize, buffDurationSize)
- print(' duration ->', anchorFrom, anchorTo, x, y)
-
- local anchorTo, anchorFrom, x, y = unpack(c.CountPoint)
- guide.count:ClearAllPoints()
- guide.count:SetPoint(anchorTo, guide.icon, anchorFrom, x, y)
- --guide.count:SetSize(buffSize, c.CountSize)
- print(' count ->', anchorFrom, anchorTo, x, y)
-
- -----------------------------------
- -- Background decorations layer
- if not d[i] then
- d[i] = CreateFrame('Frame', buffName..i..'Decor', _G.UIParent, 'VeneerDecorTemplate')
- -- todo: sort out a way to fix this without creating taint issues
- RegisterStateDriver(d[i], "visibility", "[petbattle] [vehicleui] hide")
- end
-
- d[i]:SetPoint('BOTTOMLEFT', guide.icon, 'BOTTOMLEFT', -buffBorder, -buffBorder)
- d[i]:SetPoint('TOPRIGHT', guide.icon, 'TOPRIGHT', buffBorder, buffBorder)
-
-
- guide:Show()
- B.SetConfigLayers(guide)
- end
-
-
- if #guides[buffName] > buffMax then
- local lim = #guides[buffName]
- for i = buffMax+1, lim do
-
- local g = guides[buffName][i]
- if g:IsVisible() then
- print('cleaning up #', i, buffName)
- g:Hide()
- B.RemoveConfigLayers(g)
- end
-
- end
- end
-
- anchor.last = previous
- anchor.up = up
-
- print(anchor:GetName(), anchor:GetSize())
-end
-
-M.UpdateButtonPositions = function(buffName, auraType)
- local print = fprint()
- local c = auraType.conf
- local numBuffs = 0
- local actualIcons = auraType.actualIcons()
- local maxIcons = auraType.maxIcons
- local anchor = anchors[buffName]
- local buffMax = c['Max']
- local consolidated = (anchor.contains and IsInGroup())
- local consolidatedPosition = (consolidated and anchor.containPosition or 0)
-
- for k,v in pairs(decors[buffName]) do
- print(v)
- end
-
- if consolidated then
- decors[buffName][1]:Hide()
- numBuffs = numBuffs + 1
- buffMax = buffMax + 1
- end
-
- print(' ', 'frame count:', auraType.actualIcons(), 'hardmax:', maxIcons)
- if auraType.actualIcons() > 0 then
- for i = 1, actualIcons do
-
-
- local buff = _G[buffName .. i]
- local buffIcon = _G[buffName .. i .. 'Icon']
- local buffBorder = c['Border']
- local buffDuration = _G[buffName .. i .. 'Duration']
- local buffCount = _G[buffName .. i .. 'Count']
- local buffDurationSize = c['DurationSize']
- local debuffBorder = _G[buffName .. i .. 'Border']
-
-
- if buff and not buff.consolidated then
- numBuffs = numBuffs + 1
- local guide = guides[buffName][numBuffs]
- local deco = decors[buffName][numBuffs]
- if numBuffs > buffMax then
- -- if a limit is reached, start hiding
- if guide then
- guide.info = nil
- end
- if deco then
- deco:Hide()
- end
- buff:Hide()
- else
- local buffData = guide.info
- buffData.name, buffData.rank, buffData.icon, buffData.count, buffData.dispelType, buffData.duration, buffData.expires, buffData.caster, buffData.isStealable, buffData.shouldConsolidate, buffData.spellID, buffData.canApplyAura, buffData.isBossDebuff, buffData.value1, buffData.value2, buffData.value3
- = UnitAura(buff.unit, buff:GetID(), nil, buff.filters)
-
- if guide.caster and buffData.caster then
- if (buffData.caster ~= 'player' or c.ShowSelfCast) then
- guide.caster:SetText(UnitName(buffData.caster))
- else
- guide.caster:SetText(nil)
- end
- end
-
-
- print(numBuffs, i, buff:GetName(), buff:GetID(), decors[buffName][numBuffs]:GetName())
-
- buff:SetAllPoints(guide)
- buffIcon:ClearAllPoints()
- buffIcon:SetPoint('TOPLEFT', guide.icon, 'TOPLEFT', 0, 0)
- buffIcon:SetPoint('BOTTOMRIGHT', guide.icon, 'BOTTOMRIGHT', 0, 0)
-
- deco.parent = buff
- -- make sure so they aren't re-shown in pet battle
- if not C_PetBattles.IsInBattle() then
- deco:Show()
- deco:SetAlpha(1)
- end
-
- if debuffBorder then
- deco.background:SetTexture(debuffBorder:GetVertexColor())
- debuffBorder:Hide()
- else
- if guide.info.caster == 'player' then
- print(guide.info.caster)
- deco.background:SetTexture(unpack(c.PlayerColor))
- elseif buffData.isBossDebuff then
- print(guide.info.isBossDebuff)
- deco.background:SetTexture(unpack(c.BossColor))
- else
- print(guide.info.caster)
- deco.background:SetTexture(unpack(c.Color))
- end
- end
-
-
- buffDuration:ClearAllPoints()
- local from, to = unpack(c.DurationPoint)
- buffDuration:SetPoint(from, guide.duration, to)
- buffDuration:SetText('WHAT')
-
- if buff.timeLeft and c.WarningFade then
- deco:SetScript('OnUpdate', M.UpdateButtonAlpha)
- else
- deco:SetScript('OnUpdate', nil)
- deco:SetAlpha(1.0)
- end
-
- buffCount:ClearAllPoints()
- local from, to = unpack(c.CountPoint)
- buffCount:SetPoint(from, guide.count, to)
-
- if not drawn[buffName][numBuffs] then
- anchors[buffName].Zoom(buffIcon)
-
- if buffDuration then
- local font = buffDuration:GetFont()
- buffDuration:SetFont(font, c.DurationSize, 'OUTLINE')
-
- end
-
- if buffCount then
- local font = buffCount:GetFont()
- buffCount:SetFont(font, c.CountSize, 'OUTLINE')
- end
- drawn[buffName][numBuffs] = true
- end
- end
- end
-
- end
- end
- -- clear any outliers
- for i = numBuffs+1, buffMax do
- if guides[buffName][i].caster then
- guides[buffName][i].caster:SetText(nil)
- end
- --if not decors[buffName][i].parent or
-
- decors[buffName][i].parent = nil
- decors[buffName][i]:SetAlpha(1.0)
- decors[buffName][i]:SetScript('OnUpdate', nil)
- decors[buffName][i]:Hide()
- end
-
- -- parametric occlusion data for compacted anchor points
- if numBuffs == 0 then
- anchor.cutout_X = 0
- anchor.cutout_Y = 0
- anchor.outer_X = 0
- anchor.outer_Y = 0
- elseif numBuffs <= buffMax then
- local sX, sY = guides[buffName][numBuffs]:GetWidth(), guides[buffName][numBuffs]:GetHeight()
- local p = c.PerRow
- local lX = mod(numBuffs, p)
- local lY = floor(numBuffs / p)
- local oX = min(numBuffs, c.PerRow)
- local oY = ceil(numBuffs / p)
- anchor.cutout_X = lX * sX + lX * c.Spacing -- max clearance to fit alongside the row
- anchor.cutout_Y = lY * sY + lY * c.Spacing
- anchor.outer_Y = oY * sY + oY * c.Spacing -- distance of farthest row
- anchor.outer_X = oX * sX + oX * c.Spacing
-
-
- print('|cFF0088FF', 'inner corner', lX, lY, 'outer corners', oX, oY)
- print('cutout delta =', anchor.cutout_X, anchor.cutout_Y, 'out of', floor(anchor:GetWidth()), floor(anchor:GetHeight()))
- print('extent delta =', anchor.outer_X, anchor.outer_Y)
- else
- anchor.cutout_X = 0
- anchor.cutout_Y = 0
- anchor.outer_X = 0
- anchor.outer_Y = 0
- end
-
- if anchor.attached then
- M.UpdateAnchorChild(anchor, anchor.attached, anchor.attachmentConf)
- end
-
-end
-
-M.PostBuffAnchors = function()
- local print = fprint()
- if M.ShowConsolidatedBuffs then
- M.UpdateRaidBuffs()
- end
- for buttonName, auraType in pairs(displays) do
- print('sending', buttonName, auraType)
- -- if waiting for anchors
- if not anchors[buttonName] then
- return
- end
-
- --if positioned[buttonName] == 0 then
- print('possibly reloaded UI, check positions')
- M.UpdateGuideFrames(buttonName)
- --end
-
- M.UpdateButtonPositions(buttonName, auraType)
- end
-end
-
-M.UpdateBuffs = function(buttonName, forced)
- local print = B.fprint(buttonName)
- local c = displays[buttonName].conf
- if drawn[buttonName] then
- wipe(drawn[buttonName])
- else
- drawn[buttonName] = {}
- end
-
- M.UpdateAnchorFrames(buttonName)
- M.UpdateGuideFrames(buttonName)
- M.UpdateButtonPositions(buttonName, displays[buttonName])
-end
-
---- should only be called from user input
-print('init def')
-function M:OnInitialize ()
- drawn = B.Abstract(B.displays, 'drawn')
- -- Lesser extent of guide frames that have been positioned
- positioned = B.Abstract(B.displays, 'positioned', positioned)
- -- Backdrop style frame
- decors = B.Abstract(B.displays, 'decorator', decors)
- -- Static positioning frames
- guides = B.Abstract(B.displays, 'guides', guides)
- -- Anchor points for guides
- anchors = B.Abstract(B.displays, 'anchor')
- -- Stored functions for doing icon texture adjustments
- zoom = B.Abstract(B.displays, 'zoom', zoom)
-
- B:RegisterUnitEvent("UNIT_AURA", "player", "vehicle")
- B:RegisterEvent("GROUP_ROSTER_UPDATE")
- B:RegisterEvent("PLAYER_SPECIALIZATION_CHANGED")
- hooksecurefunc("BuffFrame_UpdateAllBuffAnchors", M.PostBuffAnchors)
- hooksecurefunc("RaidBuffTray_Update", M.UpdateRaidBuffs)
-end
-print('update def')
-function M:OnUpdate ()
- M.ShowConsolidated = (IsInGroup() and GetCVarBool("consolidateBuffs"))
- M.ShowMissingBuffs = (IsInGroup() and B.Conf.RaidShowMissing)
-
- for name, auraType in pairs(displays) do
- print(name, auraType)
- M.UpdateBuffs(auraType.buffName, true)
- end
-
- M.UpdateAnchorAnchors()
- M.UpdateRaidBuffs()
- M.UpdateBuffsTodo()
-end
\ No newline at end of file
diff -r aa693607b813 -r 1a322b92dbfa BuffFrame.xml
--- a/BuffFrame.xml Tue Apr 26 15:05:38 2016 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,270 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- self.mouseover = self:IsMouseOver()
-
-
- if self:IsMouseOver() and not self.contains then
- self.caster:Show()
- else
- self.caster:Hide()
- end
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff -r aa693607b813 -r 1a322b92dbfa BuffFrame/BuffAnchors.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/BuffFrame/BuffAnchors.lua Thu Apr 28 05:54:21 2016 -0400
@@ -0,0 +1,303 @@
+--- ${PACKAGE_NAME}
+-- @file-author@
+-- @project-revision@ @project-hash@
+-- @file-revision@ @file-hash@
+-- Created: 3/22/2016 3:10 AM
+
+local MODULE = 'BuffFrame'
+local _, A = ...
+local B, _G = A.frame, _G
+local buffFrame = B:RegisterModule(MODULE)
+local type, unpack, select, pairs, ipairs, wipe = type, unpack, select, pairs, ipairs, table.wipe
+local min, ceil, mod, tonumber, tostring = min, ceil, mod, tonumber, tostring
+local CreateFrame = CreateFrame
+local print = B.print('Anchor')
+local fprint = B.fprint
+local bprint = B.print('AnchorFrame')
+
+local GetAnchorFrame = function(name)
+ local c = B.displays[name].conf
+ local anchorFrom, anchorParent, anchorTo, offsetX, offsetY = unpack(c.Anchor)
+ local print = bprint
+ if B.anchor[name] then
+ print('get', B.anchor[name]:GetName())
+ return B.anchor[name], anchorFrom, anchorParent, anchorTo, offsetX, offsetY
+ end
+ print('new frame', name)
+ local frame = CreateFrame('Frame', name..'Anchor', UIParent, B.displays[name].anchorTemplate)
+ frame.conf = c
+
+ local x, dx, y, dy
+ local Anchor_OnMouseDown = function()
+ if c['Parent'] then
+ return
+ end
+
+ x = frame:GetLeft()
+ y = frame:GetTop()
+ frame:StartMoving()
+ frame.isMoving = true
+ end
+
+ local Anchor_OnMouseUp = function()
+ if c['Parent'] then
+ return
+ end
+
+ frame:StopMovingOrSizing()
+ dx = frame:GetLeft() - x
+ dy = frame:GetTop() - y
+ -- update config
+ print('|cFFFFFF00**changing', name, 'anchor by', dx, dy)
+ offsetX = offsetX + dx
+ offsetY = offsetY + dy
+ B.Conf[name .. 'Anchor'] = {anchorFrom, anchorParent, anchorTo, offsetX, offsetY }
+ frame:SetPoint(anchorFrom, _G[anchorParent], anchorTo, offsetX, offsetY)
+ frame.isMoving = nil
+ end
+
+ local AnchorButton_OnClick = function(self, anchor)
+ local point, parent, relative = anchor:GetPoint(1)
+ print('resetting anchors', point, parent:GetName(), relative)
+ B.Conf[name..'Point'] = {point, relative}
+ B.Conf[name..'RelativeX'] = (point:match('RIGHT')) and -1 or 1
+ B.Conf[name..'RelativeY'] = (point:match('TOP')) and -1 or 1
+ wipe(B.drawn[name])
+ B.UpdateBuffs(name)
+ end
+
+ frame.OnUpdate = function(self, elapsed)
+ print(self:GetName(), elapsed)
+ if self:IsMouseOver() then
+ for i, anchorButton in ipairs(frame.anchorButton) do
+ anchorButton:Show()
+ end
+ else
+ for i, anchorButton in ipairs(frame.anchorButton) do
+ anchorButton:Hide()
+ end
+ end
+ end
+
+ frame:EnableMouse(B.Conf.ConfigMode and B.Conf.ConfigMode or false)
+ frame:SetScript('OnMouseDown', Anchor_OnMouseDown)
+ frame:SetScript("OnMouseUp", Anchor_OnMouseUp)
+ -- table addition
+ for i, anchorButton in ipairs(frame.anchorButton) do
+ anchorButton:SetScript('OnClick', AnchorButton_OnClick)
+ end
+
+ B.displays[name].anchor = frame
+ print(B.displays[name].anchor:GetName())
+ print(B.anchor[name]:GetName())
+ return frame, anchorFrom, anchorParent, anchorTo, offsetX, offsetY
+end
+
+--- Handles the preliminary positioning calculation for buff guide anchors
+buffFrame.UpdateAnchorFrames = function(name)
+ local print = fprint(name)
+ local c = B.displays[name].conf
+ local frame, anchorFrom, anchorParent, anchorTo, offsetX, offsetY = GetAnchorFrame(name)
+ print('got', frame:GetName())
+ frame.buffs = B.guides[name]
+ frame.heading:SetText(name)
+ B.SetConfigLayers(frame)
+
+ local buffMax = c['Max'] or 3
+ local perRow = c['PerRow'] or 2
+ local buffSpacing = c['Spacing']
+ local buffSize = c['Size']
+ local buffDurationSize = c['DurationSize']
+
+ if not frame.isMoving then
+ if not B.Conf[name .. 'Parent'] then
+ frame:SetPoint(anchorFrom, _G[anchorParent], anchorTo, offsetX, offsetY)
+ end
+ end
+
+ if frame.contains then buffMax = buffMax + 1 end
+ local cols, rows = min(perRow, buffMax), ceil(buffMax/perRow)
+ local spaces, breaks = (cols - 1), (rows - 1)
+ frame.columns = cols
+ frame.rows = rows
+ frame.spaces = cols - 1
+ frame.breaks = rows - 1
+
+ local width = cols*buffSize + spaces*buffSpacing
+ local height = rows * (buffSize + buffDurationSize) + (breaks * (buffSpacing))
+
+ frame:SetSize(width, height)
+ frame:Show()
+ print(frame:GetName(), frame:GetSize())
+ print(frame:GetPoint(1))
+end
+
+--- Handles placement of anchors embedded within anchors (consolidated buffs, maybe temp enchant)
+buffFrame.UpdateAnchorAnchors = function()
+ local print = fprint()
+ for buttonName, d in pairs(B.displays) do
+ local c = B.displays[buttonName].conf
+ local frame = B.anchor[buttonName]
+ local parent, child = c.Parent, c.Position
+
+ frame.parent = nil
+ if B.Conf[buttonName .. 'Parent'] and _G[B.Conf[buttonName .. 'Parent']..'Anchor'] then
+
+ local anchorAnchor = _G[B.Conf[buttonName .. 'Parent']..'Anchor']
+ local anchorTarget = B.guides[parent][child]
+ if anchorTarget then
+ print('link', buttonName, 'to', parent, child)
+ print(parent, child, B.displays[parent].guides[child])
+ local ac = B.displays[parent].conf
+ local anchorFrom, anchorTo = unpack(ac.Point)
+ frame:ClearAllPoints()
+ frame:SetPoint(anchorFrom, anchorTarget, anchorTo)
+ frame.parent = anchorTarget
+ anchorTarget.contains = frame
+ anchorAnchor.contains = frame
+ anchorAnchor.containPosition = child
+ else
+ frame.parent = anchorAnchor
+ anchorAnchor.contains = frame
+ anchorAnchor.containPosition = nil
+ end
+ else
+ frame.parent = nil
+ end
+
+ end
+end
+
+-- if facing key direction, anchor point [1] to parent's point [2]
+local childFacing = {
+ ['TOP'] = {'TOP', 'BOTTOM'},
+ ['BOTTOM'] = {'BOTTOM', 'TOP'},
+ ['RIGHT'] = {'LEFT', 'RIGHT'},
+ ['LEFT'] = {'RIGHT', 'LEFT'},
+}
+-- if align in key position, concatenate value with facing point
+local childAlign = {
+ ['TOP'] = 'TOP%s',
+ ['BOTTOM'] = 'BOTTOM%s',
+ ['MIDDLE'] = '%s',
+ ['LEFT'] = '%sLEFT',
+ ['RIGHT'] = '%sRIGHT',
+ ['CENTER'] = '%s',
+}
+
+--- dep handlers
+B.UpdateAnchorChild = function (frame, child, c)
+ if frame.attached ~= child then
+ B.SetAnchorChild(frame, child, c)
+ end
+
+ print('positioning|cFFFF0088', child, '|r of |cFF00FF00', frame, '|r')
+
+ local frameAnchor = unpack(B.Conf[c.Parent.. 'Anchor'])
+ local childAnchor, childPoint = 'BOTTOMRIGHT', 'TOPRIGHT'
+ local direction, position = unpack(c.Anchor)
+ if direction and position then
+ childAnchor = childAlign[position]:format(childFacing[direction][2])
+ childPoint = childAlign[position]:format(childFacing[direction][1])
+ print('align toward', position,'on', direction, 'edge')
+ end
+
+ print(frameAnchor, direction, position)
+ local lX, lY, cX, cY = frame.outer_X, frame.outer_Y, frame.cutout_X, frame.cutout_Y
+ local mX, mY = 0, 0 -- alignment modifiers
+ local pX, pY = 0, 0 -- position value
+ print('|cFFFF0088PUSHOUTS|r:', lX, lY, '|cFFFF8800PULL-IN|r:', cX, cY)
+
+ -- if attachment is on a moving edge
+ if not frameAnchor:match(direction) then
+ print(' child anchors to a growing edge |cFFFF8800', direction,'|r')
+ if direction == 'BOTTOM' then
+ -- horizontal edge
+
+ else
+ -- vertical edge
+ pX = lX
+ end
+
+ if frameAnchor:match(position) then
+
+ print('close alignment', lX, cX)
+ if position == 'RIGHT' then
+ -- and far X val
+ pX = 0
+ lX = -lX
+ cX = -cX
+ pY = lY
+ else
+ end
+ else
+ print('far alignment', position)
+ end
+ else
+ print(' child anchors to a static edge |cFF0088FF', direction,'|r')
+ -- use no Y offset, position doesn't interfere
+ if direction == 'BOTTOM' or direction == 'TOP' then
+ pY = 0
+ else
+ pX = 0
+ end
+ end
+
+ local frameWidth = frame:GetWidth()
+ local frameHeight = frame:GetHeight()
+
+ local overlapY, overlapX
+
+ -- right and bottom anchors offsets need to be inverted
+ if direction == 'BOTTOM' then
+ print('inverting Y values for anchor on BOTTOM edge, options:', cY, lY, 'actual:', pY)
+ pY = frameHeight - pY
+ cY = frameHeight - cY
+ lY = frameHeight - lY
+ print(' new values:', cY, lY, pY)
+ elseif direction == 'RIGHT' then
+ pX = frameWidth -pX
+ cX = frameWidth-cX
+ lX = frameWidth-lX
+ end
+
+
+ print(child, '|cFFFFFF00', childAnchor, '|r', frame, '|cFFFF0088', childPoint, '|r', pX, pY)
+ child:ClearAllPoints()
+ child:SetPoint(childAnchor, frame, childPoint, pX, pY)
+ frame.attachPoint = {childAnchor, childPoint }
+
+ if Devian and Devian.InWorkspace() then
+ frame.alignedJoint:ClearAllPoints()
+ frame.poppingJointX:ClearAllPoints()
+ frame.poppingJointY:ClearAllPoints()
+ frame.cuttingJointX:ClearAllPoints()
+ frame.cuttingJointY:ClearAllPoints()
+ frame.childSpace:ClearAllPoints()
+
+ frame.alignedJoint:SetPoint(childAnchor, frame, childPoint, pX, pY)
+ frame.poppingJointY:SetPoint(childAnchor, frame, childPoint, lX, lY) -- should really only differ when rows exceed 1
+ frame.poppingJointX:SetPoint(childAnchor, frame, childPoint, lX, lY)
+ frame.cuttingJointY:SetPoint(childAnchor, frame, childPoint, cX, cY) -- should really only differ when rows exceed 1
+ frame.cuttingJointX:SetPoint(childAnchor, frame, childPoint, cX, cY)
+ frame.childSpace:SetAllPoints(child)
+
+ frame.alignedJoint:Show()
+ frame.poppingJointX:Show()
+ frame.poppingJointY:Show()
+ frame.cuttingJointX:Show()
+ frame.cuttingJointY:Show()
+ frame.childSpace:Show()
+
+ print('|cFFFF0000MIN |r', childAnchor, childPoint, pX, pY)
+ print('|cFF00FFFFFAR |r', childAnchor, childPoint, cX, cY)
+ print('|cFFFFFF00CLOSE|r', childAnchor, childPoint, lX, lY)
+
+ end
+end
+
+B.SetAnchorChild = function(frame, child, c)
+ print('linking', child)
+ frame.attached = child
+ frame.attachmentConf = c
+end
\ No newline at end of file
diff -r aa693607b813 -r 1a322b92dbfa BuffFrame/BuffButton.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/BuffFrame/BuffButton.lua Thu Apr 28 05:54:21 2016 -0400
@@ -0,0 +1,441 @@
+--- Actual BlizzUI modifications are applied here
+-- @file-author@
+-- @project-revision@ @project-hash@
+-- @file-revision@ @file-hash@
+-- Created: 3/12/2016 12:47 AM
+local MODULE = 'BuffFrame'
+local _, A = ...
+local B, _G = A.frame, _G
+local type, unpack, select, pairs, ipairs = _G.type, _G.unpack, _G.select, _G.pairs, _G.ipairs
+local min, ceil, mod, tonumber, tostring = _G.min, _G.ceil, _G.mod, _G.tonumber, _G.tostring
+local floor, wipe, max = _G.math.floor, _G.table.wipe, _G.math.max
+local CreateFrame, IsInGroup, GetCVarBool = _G.CreateFrame, _G.IsInGroup, _G.GetCVarBool
+local BuffFrame, ConsolidatedBuffs = _G.BuffFrame, _G.ConsolidatedBuffs
+local print, gprint, aprint, fprint = B.print('Buff'), B.print('SetGuides'), B.print('SetAnchors'), B.fprint
+local displays, anchors, guides, decors, positioned, drawn, zoom = B.displays, {}, {}, {}, {}, {}, {}
+local UnitAura, UnitName, RegisterStateDriver = _G.UnitAura, _G.UnitName, _G.RegisterStateDriver
+
+local M = B:RegisterModule(MODULE)
+
+M.GetBuffZoom = function(buffName)
+ local zoom = tonumber(B.displays[buffName].conf['Zoom']) / 100 / 2
+ local zoomL, zoomU, zoomR, zoomD = zoom, zoom, 1-zoom, 1-zoom
+ print(buffName, zoom)
+ return function(self, ...)
+ if select('#',...) == 4 then
+ zoomL, zoomR, zoomU, zoomD = ...
+ end
+ self:SetTexCoord(zoomL, zoomR, zoomU, zoomD)
+ return zoomL, zoomR, zoomU, zoomD
+ end
+end
+
+
+
+M.UpdateButtonAlpha = function(self)
+ if not self.parent.timeLeft or not self:IsVisible() then
+ self:SetScript('OnUpdate', nil)
+ return
+ end
+
+ if self.parent.timeLeft < _G.BUFF_WARNING_TIME then
+ self:SetAlpha(BuffFrame.BuffAlphaValue)
+ else
+ self:SetAlpha(1)
+ end
+end
+
+--- Called infrequently to align stencil frames
+local refreshCount = 0
+M.UpdateGuideFrames = function(buffName)
+ refreshCount = refreshCount + 1
+ local print = fprint()
+
+
+ local anchor = anchors[buffName]
+ local c, g, d = displays[buffName].conf, guides[buffName], decors[buffName]
+ local perRow = c['PerRow']
+ local buffSpacing, buffSize, buffBorder, buffDurationSize, buffCountSize, relativeX, relativeY = c['Spacing'], c['Size'], c['Border'], c['DurationSize'], c['CountSize'], c['RelativeX'], c['RelativeY']
+ local consolidated = (anchors[buffName].contains and IsInGroup())
+ local consolidatedPosition = (consolidated and anchors[buffName].containPosition or 0)
+
+
+ print('|cFF00FF00Setting Guides ('..refreshCount..'):|r', buffName, 'user max:',c['Max'], 'hard max:', displays[buffName].maxIcons)
+
+ local buffMax = min(c['Max'], displays[buffName].maxIcons)
+ local anchorFrom, anchorTo = c.Point[1], c.Point[2]
+ anchor.Zoom = M.GetBuffZoom(buffName)
+
+
+
+ if consolidated then
+ buffMax = buffMax + 1
+ end
+
+ local legend = {}
+ legend.r, legend.g, legend.b, legend.a = unpack(displays[buffName].legendColor)
+ local horizFrom = (relativeX < 0) and 'RIGHT' or 'LEFT'
+ local horizTo = (relativeX < 0) and 'LEFT' or 'RIGHT'
+ local vertFrom = (relativeY < 0) and 'TOP' or 'BOTTOM'
+ local vertTo = (relativeY < 0) and 'BOTTOM' or 'TOP'
+ local previous, up
+ local bottom_extent = 0
+ for i = 1, buffMax do
+ print('update idx', i)
+ if not g[i] then
+ g[i] = CreateFrame('Frame', buffName..'Guide'..i, anchor, displays[buffName].template or 'VeneerGuideTemplate')
+ RegisterStateDriver(g[i], "visibility", "[petbattle] [vehicleui] hide; show")
+ end
+
+ local guide = g[i]
+
+ local row = ceil(i / perRow)
+ local col = mod(i, perRow)
+ if col == 0 then
+ col = perRow
+ end
+
+ guide.previous = previous
+ guide.up = up
+ local x, y, parent = 0, 0, anchor
+ if i == 1 then
+ parent = anchor
+ up = guide
+ elseif col == 1 then
+ parent = g[i-perRow]
+ y = (buffSpacing + bottom_extent) * relativeY
+ up = guide
+ anchorFrom = vertFrom .. horizFrom
+ anchorTo = vertFrom .. horizFrom
+ bottom_extent = 0
+ else
+ parent = g[i-1]
+ x = buffSpacing * relativeX
+ anchorFrom = vertFrom .. horizFrom
+ anchorTo = vertFrom .. horizTo
+ end
+ previous = guide
+ guide.parent = parent
+
+ ---------------------------------
+ -- Positioning layer
+ if i ~= consolidatedPosition or not consolidated then
+ guide:SetSize(buffSize, buffSize + buffDurationSize)
+ -- RaidBuffTray will fix the sizing
+ end
+ bottom_extent = max(bottom_extent, guide:GetHeight())
+
+ guide.info = {} -- UnitAura cache
+
+ if i == consolidatedPosition then
+ guide.legend:SetTexture(1,1,0,0.5)
+ else
+ guide.legend:SetTexture(legend.r, legend.g, legend.b, legend.a)
+ end
+
+ guide.idText:SetText(i) -- needs to reflect the current position
+
+ guide:ClearAllPoints()
+ guide:SetPoint(anchorFrom, parent, anchorTo, x, y)
+ print(anchorFrom, parent, anchorTo, x, y)
+
+ guide.icon:SetSize(buffSize - buffBorder * 2, buffSize - buffBorder * 2)
+ guide.icon:ClearAllPoints()
+ guide.icon:SetPoint('TOPLEFT', guide, 'TOPLEFT', buffBorder, -buffBorder )
+
+ local anchorTo, anchorFrom, x, y = unpack(c.DurationPoint)
+ guide.duration:ClearAllPoints()
+ guide.duration:SetPoint(anchorTo, guide, anchorFrom, x, y)
+ --guide.duration:SetSize(buffSize, buffDurationSize)
+ print(' duration ->', anchorFrom, anchorTo, x, y)
+
+ local anchorTo, anchorFrom, x, y = unpack(c.CountPoint)
+ guide.count:ClearAllPoints()
+ guide.count:SetPoint(anchorTo, guide.icon, anchorFrom, x, y)
+ --guide.count:SetSize(buffSize, c.CountSize)
+ print(' count ->', anchorFrom, anchorTo, x, y)
+
+ -----------------------------------
+ -- Background decorations layer
+ if not d[i] then
+ d[i] = CreateFrame('Frame', buffName..i..'Decor', _G.UIParent, 'VeneerDecorTemplate')
+ -- todo: sort out a way to fix this without creating taint issues
+ RegisterStateDriver(d[i], "visibility", "[petbattle] [vehicleui] hide")
+ end
+
+ d[i]:SetPoint('BOTTOMLEFT', guide.icon, 'BOTTOMLEFT', -buffBorder, -buffBorder)
+ d[i]:SetPoint('TOPRIGHT', guide.icon, 'TOPRIGHT', buffBorder, buffBorder)
+
+
+ guide:Show()
+ B.SetConfigLayers(guide)
+ end
+
+
+ if #guides[buffName] > buffMax then
+ local lim = #guides[buffName]
+ for i = buffMax+1, lim do
+
+ local g = guides[buffName][i]
+ if g:IsVisible() then
+ print('cleaning up #', i, buffName)
+ g:Hide()
+ B.RemoveConfigLayers(g)
+ end
+
+ end
+ end
+
+ anchor.last = previous
+ anchor.up = up
+
+ print(anchor:GetName(), anchor:GetSize())
+end
+
+M.UpdateButtonPositions = function(buffName, auraType)
+ local print = fprint()
+ local c = auraType.conf
+ local numBuffs = 0
+ local actualIcons = auraType.actualIcons()
+ local maxIcons = auraType.maxIcons
+ local anchor = anchors[buffName]
+ local buffMax = c['Max']
+ local consolidated = (anchor.contains and IsInGroup())
+ local consolidatedPosition = (consolidated and anchor.containPosition or 0)
+
+ for k,v in pairs(decors[buffName]) do
+ print(v)
+ end
+
+ if consolidated then
+ decors[buffName][1]:Hide()
+ numBuffs = numBuffs + 1
+ buffMax = buffMax + 1
+ end
+
+ print(' ', 'frame count:', auraType.actualIcons(), 'hardmax:', maxIcons)
+ if auraType.actualIcons() > 0 then
+ for i = 1, actualIcons do
+
+
+ local buff = _G[buffName .. i]
+ local buffIcon = _G[buffName .. i .. 'Icon']
+ local buffBorder = c['Border']
+ local buffDuration = _G[buffName .. i .. 'Duration']
+ local buffCount = _G[buffName .. i .. 'Count']
+ local buffDurationSize = c['DurationSize']
+ local debuffBorder = _G[buffName .. i .. 'Border']
+
+
+ if buff and not buff.consolidated then
+ numBuffs = numBuffs + 1
+ local guide = guides[buffName][numBuffs]
+ local deco = decors[buffName][numBuffs]
+ if numBuffs > buffMax then
+ -- if a limit is reached, start hiding
+ if guide then
+ guide.info = nil
+ end
+ if deco then
+ deco:Hide()
+ end
+ buff:Hide()
+ else
+ local buffData = guide.info
+ buffData.name, buffData.rank, buffData.icon, buffData.count, buffData.dispelType, buffData.duration, buffData.expires, buffData.caster, buffData.isStealable, buffData.shouldConsolidate, buffData.spellID, buffData.canApplyAura, buffData.isBossDebuff, buffData.value1, buffData.value2, buffData.value3
+ = UnitAura(buff.unit, buff:GetID(), nil, buff.filters)
+
+ if guide.caster and buffData.caster then
+ if (buffData.caster ~= 'player' or c.ShowSelfCast) then
+ guide.caster:SetText(UnitName(buffData.caster))
+ else
+ guide.caster:SetText(nil)
+ end
+ end
+
+
+ print(numBuffs, i, buff:GetName(), buff:GetID(), decors[buffName][numBuffs]:GetName())
+
+ buff:SetAllPoints(guide)
+ buffIcon:ClearAllPoints()
+ buffIcon:SetPoint('TOPLEFT', guide.icon, 'TOPLEFT', 0, 0)
+ buffIcon:SetPoint('BOTTOMRIGHT', guide.icon, 'BOTTOMRIGHT', 0, 0)
+
+ deco.parent = buff
+ -- make sure so they aren't re-shown in pet battle
+ if not C_PetBattles.IsInBattle() then
+ deco:Show()
+ deco:SetAlpha(1)
+ end
+
+ if debuffBorder then
+ deco.background:SetTexture(debuffBorder:GetVertexColor())
+ debuffBorder:Hide()
+ else
+ if guide.info.caster == 'player' then
+ print(guide.info.caster)
+ deco.background:SetTexture(unpack(c.PlayerColor))
+ elseif buffData.isBossDebuff then
+ print(guide.info.isBossDebuff)
+ deco.background:SetTexture(unpack(c.BossColor))
+ else
+ print(guide.info.caster)
+ deco.background:SetTexture(unpack(c.Color))
+ end
+ end
+
+
+ buffDuration:ClearAllPoints()
+ local from, to = unpack(c.DurationPoint)
+ buffDuration:SetPoint(from, guide.duration, to)
+ buffDuration:SetText('WHAT')
+
+ if buff.timeLeft and c.WarningFade then
+ deco:SetScript('OnUpdate', M.UpdateButtonAlpha)
+ else
+ deco:SetScript('OnUpdate', nil)
+ deco:SetAlpha(1.0)
+ end
+
+ buffCount:ClearAllPoints()
+ local from, to = unpack(c.CountPoint)
+ buffCount:SetPoint(from, guide.count, to)
+
+ if not drawn[buffName][numBuffs] then
+ anchors[buffName].Zoom(buffIcon)
+
+ if buffDuration then
+ local font = buffDuration:GetFont()
+ buffDuration:SetFont(font, c.DurationSize, 'OUTLINE')
+
+ end
+
+ if buffCount then
+ local font = buffCount:GetFont()
+ buffCount:SetFont(font, c.CountSize, 'OUTLINE')
+ end
+ drawn[buffName][numBuffs] = true
+ end
+ end
+ end
+
+ end
+ end
+ -- clear any outliers
+ for i = numBuffs+1, buffMax do
+ if guides[buffName][i].caster then
+ guides[buffName][i].caster:SetText(nil)
+ end
+ --if not decors[buffName][i].parent or
+
+ decors[buffName][i].parent = nil
+ decors[buffName][i]:SetAlpha(1.0)
+ decors[buffName][i]:SetScript('OnUpdate', nil)
+ decors[buffName][i]:Hide()
+ end
+
+ -- parametric occlusion data for compacted anchor points
+ if numBuffs == 0 then
+ anchor.cutout_X = 0
+ anchor.cutout_Y = 0
+ anchor.outer_X = 0
+ anchor.outer_Y = 0
+ elseif numBuffs <= buffMax then
+ local sX, sY = guides[buffName][numBuffs]:GetWidth(), guides[buffName][numBuffs]:GetHeight()
+ local p = c.PerRow
+ local lX = mod(numBuffs, p)
+ local lY = floor(numBuffs / p)
+ local oX = min(numBuffs, c.PerRow)
+ local oY = ceil(numBuffs / p)
+ anchor.cutout_X = lX * sX + lX * c.Spacing -- max clearance to fit alongside the row
+ anchor.cutout_Y = lY * sY + lY * c.Spacing
+ anchor.outer_Y = oY * sY + oY * c.Spacing -- distance of farthest row
+ anchor.outer_X = oX * sX + oX * c.Spacing
+
+
+ print('|cFF0088FF', 'inner corner', lX, lY, 'outer corners', oX, oY)
+ print('cutout delta =', anchor.cutout_X, anchor.cutout_Y, 'out of', floor(anchor:GetWidth()), floor(anchor:GetHeight()))
+ print('extent delta =', anchor.outer_X, anchor.outer_Y)
+ else
+ anchor.cutout_X = 0
+ anchor.cutout_Y = 0
+ anchor.outer_X = 0
+ anchor.outer_Y = 0
+ end
+
+ if anchor.attached then
+ M.UpdateAnchorChild(anchor, anchor.attached, anchor.attachmentConf)
+ end
+
+end
+
+M.PostBuffAnchors = function()
+ local print = fprint()
+ if M.ShowConsolidatedBuffs then
+ M.UpdateRaidBuffs()
+ end
+ for buttonName, auraType in pairs(displays) do
+ print('sending', buttonName, auraType)
+ -- if waiting for anchors
+ if not anchors[buttonName] then
+ return
+ end
+
+ --if positioned[buttonName] == 0 then
+ print('possibly reloaded UI, check positions')
+ M.UpdateGuideFrames(buttonName)
+ --end
+
+ M.UpdateButtonPositions(buttonName, auraType)
+ end
+end
+
+M.UpdateBuffs = function(buttonName, forced)
+ local print = B.fprint(buttonName)
+ local c = displays[buttonName].conf
+ if drawn[buttonName] then
+ wipe(drawn[buttonName])
+ else
+ drawn[buttonName] = {}
+ end
+
+ M.UpdateAnchorFrames(buttonName)
+ M.UpdateGuideFrames(buttonName)
+ M.UpdateButtonPositions(buttonName, displays[buttonName])
+end
+
+--- should only be called from user input
+print('init def')
+function M:OnInitialize ()
+ drawn = B.Abstract(B.displays, 'drawn')
+ -- Lesser extent of guide frames that have been positioned
+ positioned = B.Abstract(B.displays, 'positioned', positioned)
+ -- Backdrop style frame
+ decors = B.Abstract(B.displays, 'decorator', decors)
+ -- Static positioning frames
+ guides = B.Abstract(B.displays, 'guides', guides)
+ -- Anchor points for guides
+ anchors = B.Abstract(B.displays, 'anchor')
+ -- Stored functions for doing icon texture adjustments
+ zoom = B.Abstract(B.displays, 'zoom', zoom)
+
+ B:RegisterUnitEvent("UNIT_AURA", "player", "vehicle")
+ B:RegisterEvent("GROUP_ROSTER_UPDATE")
+ B:RegisterEvent("PLAYER_SPECIALIZATION_CHANGED")
+ hooksecurefunc("BuffFrame_UpdateAllBuffAnchors", M.PostBuffAnchors)
+ hooksecurefunc("RaidBuffTray_Update", M.UpdateRaidBuffs)
+end
+print('update def')
+function M:OnUpdate ()
+ M.ShowConsolidated = (IsInGroup() and GetCVarBool("consolidateBuffs"))
+ M.ShowMissingBuffs = (IsInGroup() and B.Conf.RaidShowMissing)
+
+ for name, auraType in pairs(displays) do
+ print(name, auraType)
+ M.UpdateBuffs(auraType.buffName, true)
+ end
+
+ M.UpdateAnchorAnchors()
+ M.UpdateRaidBuffs()
+ M.UpdateBuffsTodo()
+end
\ No newline at end of file
diff -r aa693607b813 -r 1a322b92dbfa BuffFrame/BuffFrame.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/BuffFrame/BuffFrame.xml Thu Apr 28 05:54:21 2016 -0400
@@ -0,0 +1,271 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self.mouseover = self:IsMouseOver()
+
+
+ if self:IsMouseOver() and not self.contains then
+ self.caster:Show()
+ else
+ self.caster:Hide()
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff -r aa693607b813 -r 1a322b92dbfa BuffFrame/RaidBuffTray.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/BuffFrame/RaidBuffTray.lua Thu Apr 28 05:54:21 2016 -0400
@@ -0,0 +1,354 @@
+--- ${PACKAGE_NAME}
+-- @file-author@
+-- @project-revision@ @project-hash@
+-- @file-revision@ @file-hash@
+-- Created: 3/20/2016 10:00 PM
+
+local _, A = ...
+local B = A.frame
+local MODULE = 'BuffFrame'
+local M = B:RegisterModule(MODULE)
+local displays = B.displays
+
+local parentAnchor, parentFrame, raidbuffsFrame
+local band, lshift, CreateFrame = bit.band, bit.lshift, CreateFrame
+local raidBuffs = {}
+local raidBuffSymbols = {'St', 'HP', 'AP', 'Ha', 'SP', 'Cr', 'Ma', 'MS', 'V' }
+local missingBuffs = {}
+local playerBuffing, playerCurrentBuff
+local playerBuffs = {}
+local c, ac, frameSize, frameSpacing, framePosition
+local fprint = B.fprint
+local NUM_LE_MISSING_RAID_BUFFS = 0
+local missingBuffsAnchor
+
+
+--- Takes a given icon texture and calls the pre-defined function set
+M.UpdateBuffStyle = function(buff, style, path)
+ local print = fprint()
+ local icon = buff.icon
+ local symbol = buff.symbol
+ path = path or icon.iconPath
+ --print(style, icon.iconStyle)
+
+ if style ~= buff.iconStyle or path ~= buff.iconPath then
+ print('|cFF0088FFUpdateBuffStyle(|r', icon:GetName(), style, path)
+ icon.iconStyle = style
+ icon.iconPath = path
+ else
+ --print('|cFF00FF88UpdateBuffStyle(|r', icon:GetName(), style, path, ') same values, ignore')
+ return
+ end
+ local styleset = B.BuffStyles[style]
+ if not path or path == '' then
+ print('path is nil/empty')
+ icon:SetTexture(1, 1, 1, 1)
+ icon:SetVertexColor(unpack(styleset.Color))
+ else
+ icon:SetTexture(path or icon:GetTexture())
+ icon:SetVertexColor(unpack(styleset.Color))
+ end
+
+ if symbol and symbol.GetText then
+ symbol:SetTextColor(unpack(styleset.TextColor))
+ symbol:SetText(buff.symbolName or 'NaW')
+ end
+
+ icon:SetBlendMode(styleset.SetBlendMode)
+ icon:SetDesaturated(styleset.SetDesaturated)
+end
+
+--- Populates a list of targets needing a buff, fired by a handler
+local PlayerBuffTodo ={}
+M.UpdateBuffStatus = function(aura, filters)
+ if not PlayerBuffStatus[aura] then
+ PlayerBuffStatus[aura] = {}
+ end
+
+
+ print(UnitClass('player'))
+ if IsInGroup() then
+ local numBuffed = 0
+ local partySize = GetNumGroupMembers()
+ local missing = {}
+ for i = 1, partySize do
+ local unit = 'raid'..i
+ if UnitAura(unit, aura, nil, filters) then
+ numBuffed = numBuffed + 1
+ else
+ tinsert(missing, unit)
+ end
+ end
+
+ PlayerBuffTodo[aura] = missing
+
+ end
+end
+
+--- Evaluates buff availability criteria
+-- Uses hard returns to avoid over-iterating conditionals, particularly pet family
+local function IsBuffAvailable(criteria)
+ local available, active = false, false
+ local result
+ for _, test in ipairs(criteria) do
+ if test == true then
+ -- it's a passive effect that is always on
+ return true, true
+ else
+ if c.spec then
+ if not (result and c.spec == B.PlayerSpec) then
+ return false
+ end
+ end
+
+ if c.talent then
+ local talentID, name, texture, selected, available = GetTalentInfoByID(c.talent, GetActiveSpecGroup())
+ if not (result and selected) then
+ return false
+ end
+ end
+
+ if c.petFamily then
+ local lim = min(5, NUM_PET_STABLE_SLOTS) -- to avoid volatile loop condition
+ for p = 1, lim do
+ local hasPet = false
+ local icon, name, level, family, talent = GetStablePetInfo(p)
+ if family == c.petFamily then
+ hasPet = true
+ end
+ if not (result and hasPet) then
+ return false
+ end
+ end
+ end
+
+ end
+ end
+ return true, false
+end
+
+--- events: PLAYER_SPECIALIZATION_CHANGED
+function M:UpdateBuffsTodo (unit)
+ -- buffs vs. auras
+ if unit ~= 'player' then
+ -- look for changes in the GIST manifest and sort them out
+ return
+ end
+
+ local class = UnitClass('player')
+ local spec = GetSpecialization()
+ if not class or
+ not spec or
+ not IsInGroup() or
+ not B.PlayerBuffStatus[class] then
+ -- if just logging in, info won't be available for several seconds
+ -- if not grouped, don't calc
+ -- hide frame
+ B.PlayerBuffsActive = function() return false end
+ return
+ end
+
+ -- verify change
+ if B.PlayerCurrentSpec == spec or B.PlayerClass == class then
+ return
+ end
+ B.PlayerCurrentSpec = spec
+ B.PlayerClass = class
+
+ local test = B.ClassRaidBuffs
+ local buffTypes = {}
+ local auraTypes = {}
+ for i = 1, NUM_LE_RAID_BUFF_TYPES do
+ local name, filters
+ if test[i] and test[i][class] then
+ playerBuffs[i], name, filters = IsBuffAvailable(test[i][class])
+ else
+ playerBuffs[i] = nil
+ end
+
+ if name then
+ B.UpdateBuffStatus(name, filters)
+ end
+ end
+end
+
+-- Called once to setup the ConsolidatedBuffs stencil
+local consolidatedBuffsLoaded
+M.SetConsolidatedBuffs = function()
+ local print = fprint()
+ c = displays.ConsolidatedBuff.conf
+ parentFrame = B.guides[c.Parent][c.Position]
+ raidbuffsFrame = B.anchor.ConsolidatedBuff
+
+ B.SetConfigLayers(raidbuffsFrame)
+ consolidatedBuffsLoaded = true
+ ConsolidatedBuffs:ClearAllPoints()
+ ConsolidatedBuffs:SetAllPoints(parentFrame.icon)
+ if c.Icon then
+ ConsolidatedBuffsIcon:SetAllPoints(parentFrame.icon)
+ ConsolidatedBuffsIcon:SetTexCoord(0.609,0.89,0.215,0.78)
+ else
+ ConsolidatedBuffsIcon:Hide()
+ end
+
+ ConsolidatedBuffsCount:Hide()
+end
+
+local missingTypes = {}
+local raidBuffsInitialized
+M.UpdateRaidBuffs = function()
+ local print = fprint()
+ if not consolidatedBuffsLoaded then
+ M.SetConsolidatedBuffs()
+ end
+
+ if not M.ShowConsolidated or not parentFrame.contains then
+ print(' hiding raid buffs square')
+ if raidBuffsInitialized then
+ for i = 1, 9 do
+ if raidBuffs[i] then
+ raidBuffs[i]:Hide()
+ end
+ end
+ raidBuffsInitialized = nil
+ end
+ if parentFrame then
+ print(c.Parent, c.Position)
+ print('de-flagging parent')
+ parentFrame.contains = nil
+ end
+ raidbuffsFrame:Hide()
+ return
+ end
+
+ local c = B.displays.ConsolidatedBuff.conf
+ if parentFrame and not parentFrame.contains then
+ raidBuffsInitialized = true
+ print('re-flagging parent', parentFrame:GetName())
+ parentFrame.contains = parentFrame
+ B.decors[c.Parent][c.Position]:Hide()
+ raidbuffsFrame:Show()
+
+ -- make sure parent icon is updated
+ local w = c.Size*c.PerRow+c.Spacing*(c.PerRow-1)+c.Border*2
+ parentFrame:SetSize(w, w)
+ parentFrame.icon:SetSize(w - c.Border*2, w - c.Border*2)
+ parentFrame.contains = raidbuffsFrame
+
+ M.UpdateBuffs(c.Parent)
+ end
+
+ -- have to loop again due to tainting restrictions
+ -- could compare the tooltip font object pointers, but that may change
+ local buffStack = GetRaidBuffInfo()
+ print(GetRaidBuffInfo())
+ local guides = B.guides.ConsolidatedBuff
+ local numBuffs = 0
+ local numAvailable = 0
+ local mask = 1
+ if buffStack == nil then
+ return -- discard
+ end
+
+
+ for i = 1, NUM_LE_RAID_BUFF_TYPES do
+ local available = (band(buffStack, mask) > 0)
+ local name, _, icon, start, duration, spellID, slot = GetRaidBuffTrayAuraInfo(i)
+ print(i, name, icon, available)
+
+ raidBuffs[i] = raidBuffs[i] or CreateFrame('Frame', 'VeneerRaidBuff' .. i, raidbuffsFrame, 'VeneerRaidBuffTemplate')
+ local buff = raidBuffs[i]
+ if not raidBuffs[i].stylized then
+ print(' setting style', i)
+ buff.stylized = true
+ buff.symbol:SetText(raidBuffSymbols[i])
+ buff.symbol:SetFont("Fonts\\FRIZQT__.TTF", 10, 'OUTLINE')
+ buff:SetSize(parentFrame.icon:GetWidth()/c.PerRow,parentFrame.icon:GetWidth()/c.PerRow)
+ buff.symbolName = raidBuffSymbols[i]
+
+ buff.icon:SetAllPoints(guides[i].icon)
+ buff:SetAllPoints(guides[i])
+ raidbuffsFrame.Zoom(buff.icon)
+ end
+
+ buff:Show()
+ local buffStyle = 'missing'
+ if name then
+ buff:Show()
+ buff.symbol:Hide()
+ missingTypes[i] = nil
+ numBuffs = numBuffs + 1
+ numAvailable = numAvailable + 1
+ buffStyle = 'active'
+ else
+ buff.symbol:Show()
+ if band(buffStack, mask) > 0 then
+ buffStyle = 'available'
+ numAvailable = numAvailable + 1
+ else
+ buffStyle = 'missing'
+ icon = ''
+ end
+ end
+ mask = lshift(mask, 1)
+
+ M.UpdateBuffStyle(buff, buffStyle, icon)
+ end
+
+ -- todo: filter by castable and suppress for non-overlapping auras
+
+ raidbuffsFrame.label:SetText(numBuffs..'/'..numAvailable)
+ print(parentFrame:GetName(), parentFrame:GetSize())
+
+ if B.ShowMissingBuffs then
+ B.UpdateMissingBuffs()
+ elseif missingBuffsAnchor and missingBuffsAnchor:IsVisible() then
+ for i = 1, NUM_LE_MISSING_RAID_BUFFS do
+ missingBuffs[i]:Hide()
+ end
+ end
+end
+
+B.UpdateMissingBuffs = function()
+ local print = B.fprint()
+ local numMissing = 0
+
+ local firstMissing, lastMissing
+ for i = 1, NUM_LE_RAID_BUFF_TYPES do
+ local name, _, icon, start, duration, spellID, slot = GetRaidBuffTrayAuraInfo(i)
+
+ if not name then
+ numMissing = numMissing + 1
+
+ print('missing buff', i, numMissing)
+ B.UpdateBuffStyle(raidBuffs[i].icon, 'missing', "")
+
+ missingBuffs[numMissing] = missingBuffs[numMissing] or CreateFrame('Button', 'VeneerMissingBuff' .. numMissing, raidbuffsFrame, 'VeneerMissingBuffTemplate')
+
+ local missing = missingBuffs[numMissing]
+
+ missing:Show()
+ missing:SetSize(c.Size*c.PerRow, c.Size)
+ if numMissing == 1 then
+ firstMissing = missing
+ else
+ missing:SetPoint('TOP', lastMissing, 'BOTTOM', 0, -c.Spacing)
+ end
+
+ missing.label:SetText(_G['RAID_BUFF_'.. i])
+ lastMissing = missing
+
+ end
+ end
+
+ if firstMissing then
+ print(firstMissing:GetName(), raidbuffsFrame)
+ firstMissing:SetPoint('TOPRIGHT', raidbuffsFrame.label, 'BOTTOMRIGHT', 0, c.Spacing)
+ missingBuffsAnchor = firstMissing
+ end
+
+ for i = numMissing +1, NUM_LE_MISSING_RAID_BUFFS do
+ missingBuffs[i]:Hide()
+ end
+ NUM_LE_MISSING_RAID_BUFFS = numMissing
+end
\ No newline at end of file
diff -r aa693607b813 -r 1a322b92dbfa Config.lua
--- a/Config.lua Tue Apr 26 15:05:38 2016 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,393 +0,0 @@
---- All the control GUI stuff, including chat command functions
--- @file-author@
--- @project-revision@ @project-hash@
--- @file-revision@ @file-hash@
--- Created: 3/12/2016 12:49 AM
-local B, _G = select(2,...).frame, _G
-local M = B:RegisterModule("Options")
-local tostring, tonumber, floor, format = tostring, tonumber, floor, string.format
-local unpack, select, pairs, ipairs, type, wipe = unpack, select, pairs, ipairs, type, table.wipe
-local CreateFrame, IsControlKeyDown = _G.CreateFrame, _G.IsControlKeyDown
-local max = math.max
-local OpacitySliderFrame, ColorPickerFrame = _G.OpacitySliderFrame, _G.ColorPickerFrame
-local print = B.print('Cfgl')
-local function round(number, decimals)
- if floor(number) == number then
- return ('%d'):format(number)
- end
-
- return (("%%.%df"):format(decimals)):format(number)
-end
-
-M.defaults = {
- enable = true
-}
-
---- STATE VARIABLES
-local configInit
---- Dummies for addon table upvalues
-local configFrames = {} -- actual frame objects
-local displays = B.displays -- anchor objects dummy
-
-
---- Returns a value retreival function and the current value stored in config
--- @paramsig value, previousValue = configInteger(key)
--- @param key Name of the config field being represented.
-local defaultGroup = 'BuffButton'
-local configInteger = function(group, key)
- return function(self ,display)
- return floor(tonumber(self:GetValue()) + 0.5)
- end, (B.Conf[group ..key] or B.Conf[defaultGroup..key])
-end
-local configPercent = function(group, key)
- return function(self, display)
- local value = self:GetValue()
- if display then
- return tostring(floor(value*100+0.5))..' %'
- else
- return floor((value*100+0.5))/100
- end
- end, (B.Conf[group ..key] or B.Conf[defaultGroup..key])
-end
-local configColor = function(group, key)
- -- table for config, color value list for text
- return function(self, display)
- if display then
- return "|cFFFF4444" .. round(self.rgba[1], 1) .. "|r, |cFF44FF44" .. round(self.rgba[2], 1) .. "|r, |cFF4488FF" ..
- round(self.rgba[3], 1) .. "|r, " .. round(self.rgba[4], 1)
- else
- return self.rgba
- end
- end, (B.Conf[group ..key] or B.Conf[defaultGroup..key])
-end
-local configCheck = function(group, key)
- return function(self) return self:GetChecked() end, B.Conf[group ..key] or B.Conf[defaultGroup..key]
-end
--- initializes the corresponding type of config field
-local frameTypeConv = {
- Color = 'Button',
- Font = 'Frame',
-}
-local configTypeParams = {
- Slider = function(frame, optionInfo)
- frame:SetMinMaxValues(optionInfo[5], optionInfo[6])
- frame:SetValueStep(optionInfo[7])
- frame:SetStepsPerPage(optionInfo[8])
- print(frame.OptName, '\n {', optionInfo[5], optionInfo[6], optionInfo[7], optionInfo[8], '}')
- end,
- CheckButton = function(frame, optionInfo)
- frame.SetValue = function(self, ...)
- self:SetChecked(...)
- B.Conf[self.OptName] = self:GetChecked()
- print(self.OptTab)
- B.UpdateAll()
- end
- frame:SetScript("OnClick",function(self)
- B.Conf[self.OptName] = self:GetChecked()
- print(B.Conf[self.OptName], self:GetChecked())
- B.UpdateAll()
- end)
- end,
- Color = function(frame, optionInfo)
- frame.rgba = { frame.current:GetVertexColor() }
- local colorPickerCallback = function(restore)
- local newR, newG, newB, newA
- if restore then
- newR, newG, newB, newA = unpack(restore)
- else
- newA, newR, newG, newB = OpacitySliderFrame:GetValue(), ColorPickerFrame:GetColorRGB()
- print('not cancel', newA, newR, newB, newG)
- end
- frame:SetValue({newR, newG, newB, newA})
- B.UpdateBuffs(frame.OptTab)
- end
- frame:SetScript("OnClick", function(self)
- print('got a click')
- local r, g, b, a = frame.current:GetVertexColor()
- ColorPickerFrame:SetColorRGB(r, g, b)
- ColorPickerFrame.hasOpacity = (a ~= nil)
- ColorPickerFrame.opacity = a
- ColorPickerFrame.previousValues = {r,g,b,a}
- ColorPickerFrame.func, ColorPickerFrame.opacityFunc, ColorPickerFrame.cancelFunc =
- colorPickerCallback, colorPickerCallback,colorPickerCallback
- ColorPickerFrame:Hide()
- ColorPickerFrame:Show()
- end)
- frame.SetValue = function(self, rgba)
- print(rgba)
- frame.rgba = rgba
- B.Conf[self.OptName] = rgba
- frame.current:SetVertexColor(unpack(rgba))
- frame.fieldvalue:SetText(frame.OptValue(frame, true))
- end
- end
-}
---- configDialog
--- @usage tinsert(configDialog, {prefix, row, [...] })
--- Each top level member defines a group of config value handlers, structured as an iterative table where the
--- first member is a key prefix, the second member is an integer row value, and all following members are treated
--- as a widget resource, defined initially as a complete sub-table, which can be re-used further down by passing
--- the string literal widget suffix.
--- widget table: ... {'suffix', 'description', valueCallback, 'template', [widget parameters]}
--- widget copy: ... 'suffix', ...
-local configDialog = {
- {'BuffButton', 1,
-
- {'Max', 'Max', configInteger, 'Slider',
- 1, _G.BUFF_MAX_DISPLAY, 1, 1}, -- valueMin, valueMax, valueStep, stepsPerPage
- {'PerRow', 'Per Row', configInteger, 'Slider',
- 1, _G.BUFF_MAX_DISPLAY, 1, 1}, -- valueMin, valueMax, valueStep, stepsPerPage,
- {'Size', 'Icon Size', configInteger, 'Slider',
- 1, 256, 1, 1},
- {'Spacing', 'Icon Spacing', configInteger, 'Slider',
- 1, 50, 1, 1},
- {'DurationSize', 'Duration Text Height', configInteger, 'Slider',
- 1, 72, 1, 1},
- {'Zoom', 'Icon Zoom', configInteger, 'Slider',
- 0, 100, 1, 1},
- {'Border', 'Border', configInteger, 'Slider',
- 1, 16, 1, 1},
- {'Color', 'Default Border', configColor, 'Color'},
- {'RaidColor', 'RaidBuff Border', configColor, 'Color'},
- {'PlayerColor', 'Player Buffs', configColor, 'Color'},
- {'BossColor', 'Encounter Buffs', configColor, 'Color'},
- {'ShowSelfCast', 'Show name for self-casts', configCheck, 'CheckButton'}
- },
- { 'DebuffButton', 1,
- {'Max', 'Max', configInteger, 'Slider',
- 1, _G.DEBUFF_MAX_DISPLAY, 1, 1 }
- ,
- {'PerRow', 'Per Row', configInteger, 'Slider',
- 1, _G.DEBUFF_MAX_DISPLAY, 1, 1 },
- 'Size', 'Spacing', 'DurationSize', 'Zoom', 'Border',
- 'Color', 'RaidColor', 'PlayerColor', 'BossColor',
- },
- { 'TempEnchant', 1,
- {'Max', 'Max', configInteger, 'Slider',
- 1, _G.NUM_TEMP_ENCHANT_FRAMES, 1, 1 },
- {'PerRow', 'Per Row', configInteger, 'Slider',
- 1, _G.NUM_TEMP_ENCHANT_FRAMES, 1, 1},
- 'Size', 'Spacing', 'DurationSize', 'Zoom', 'Border',
- 'Color', 'RaidColor', 'PlayerColor', 'BossColor',
- },
- { 'ConsolidatedBuff', 2,
- {'Position', 'Slot Position', configInteger, 'Slider',
- 1, _G.BUFF_MAX_DISPLAY, 1, 1 }
-
- },
- { 'ConsolidatedBuff', 2,
- 'Size'
- },
- { 'Raid', 3,
- {'ShowMissing', 'Verbose missing raid buffs', configCheck, 'CheckButton'}
- }
-}
-
-
-
-
-local configFrame
-local optionTemplates = {}
-local configPadding, configSpacing = 3, 3
-
---- Walks the structure table to generate a pretty config panel
-local InitConfig = function()
- configInit = true
- local configWidth = B:GetWidth()
- local optionWidth = (configWidth - configPadding) / 3 - configSpacing
- local configHeight = 0
- local bottom_extent = 0
- local clusterHeight = 0
- local clusterOffset = 0
- local lastCluster
- local cluster = 1
- local col = 0
- for t, taboptions in ipairs(configDialog) do
- local group = taboptions[1]
- cluster = taboptions[2]
- col = col + 1
-
-
- if not configFrames[t] then
- configFrames[t] = {}
- end
-
-
- if cluster ~= lastCluster then
- configHeight = configHeight + clusterHeight
- print('|cFFFF8800## new cluster|r, advancing offset from', clusterOffset, 'to', clusterOffset + clusterHeight)
- clusterOffset = clusterOffset + clusterHeight
- col = 1
- clusterHeight = 0
- lastCluster = cluster
- end
-
- print('processing tab', group)
- local row = 0
- for i = 3, #taboptions do
- row = row + 1
- local optionInfo = taboptions[i]
- if type(optionInfo) == 'string' then
- optionInfo = optionTemplates[optionInfo]
- end
- local key, fieldname, valueFuncGenerator, configType = unpack(optionInfo)
-
- if not optionTemplates[key] then
- optionTemplates[key] = optionInfo
- end
-
- local fullkey = group .. key
- print(fullkey, fieldname)
-
- if not configFrames[t][row] then
- print('building frame', t, group, row)
- local frameTemplate = 'VeneerConfig'..configType
- local frameType = frameTypeConv[configType] or configType
- configFrames[t][row] = CreateFrame(frameType, fullkey, B, frameTemplate)
- local f = configFrames[t][row]
- f.OptKey = key
- f.OptTab = group
- f.OptName = fullkey
- local valueFunc, initialValue = valueFuncGenerator(group, key)
- print(' value getter', fullkey,'->', valueFunc,initialValue)
- configTypeParams[configType](f, optionInfo)
- f.OptValue = valueFunc
-
- --- Enclosing these to
- -- a) make the panel easy to bring up externally
- -- b) limit gameplay risk from config frame errors
- -- c) milk the iterator scope for all its worth
- f.OnChange = function(self)
-
- -- holding control; mirror this setting in other categories
- if IsControlKeyDown() and not (configInit) then
- configInit = true
- for optTab, opts in pairs(configFrames) do
- for _, opt in ipairs(opts) do
- if opt.OptKey == key then
- if optTab ~= group then
- print('mapping to', optTab, opt.OptKey)
- opt:SetValue(self:GetValue())
- end
-
- end
- end
- end
- configInit = nil
- end
- local newValue = valueFunc(self)
- if newValue ~= B.Conf[fullkey] then
- print(newValue, fullkey)
- f.fieldvalue:SetText(valueFunc(self, true))
- B.Conf[fullkey] = valueFunc(self)
- -- prepare to update
- wipe(B.drawn[f.OptTab])
- B.UpdateBuffs(self.OptTab)
- B.UpdateConfigLayers()
- end
-
- end
-
- f:SetValue(initialValue)
- local yBuffer = configPadding
- if f.fieldname then
- f.fieldname:SetText(fieldname)
- yBuffer = yBuffer + f.fieldname:GetHeight()
- end
- if f.fieldvalue then
- f.fieldvalue:SetText(f:OptValue(true))
- end
-
- local point, relative, x, y = 'TOPLEFT', 'BOTTOMLEFT', 0, -3
-
- local base
- if (row == 1) then
- bottom_extent = 0
- base = B.header
- x = (col-1) * (optionWidth+configSpacing)
- y = -configPadding
- else
- base = configFrames[t][row-1]
- end
-
- print('|cFFFF0088'..cluster..'|r |cFF00FF00'.. row..'|r', col, base:GetName(), x, y - clusterOffset)
-
- if frameType ~= 'CheckButton' then
- f:SetWidth(optionWidth)
- end
-
- f:SetPoint(point, base, relative, x, y-yBuffer-clusterOffset)
- --print('creating', frameType, fieldname)
- f:Show()
-
- bottom_extent = bottom_extent + f:GetHeight() + yBuffer + configSpacing
-
-
-
- clusterHeight = max(clusterHeight, bottom_extent)
- --print('y', floor(yBuffer+0.5), 'f:H', floor(f:GetHeight()+0.5), 'hTally', floor(bottom_extent+0.5), 'hMax', floor(configHeight+0.5))
- end
- end
- end
-
- -- grab the last cluster
- if lastCluster == cluster then
- print('|cFF00FF00##scooping up last cluster info')
- configHeight = configHeight + clusterHeight
- end
-
- if not B.configFramesCreated then
- B.configFramesCreated = true
- B:SetHeight(B.header:GetStringHeight() + configSpacing*3 + configHeight)
- end
- if configInit then configInit = nil end
-end
-
-M.Command = function(enable, editbox)
- displays = B.displays
- if type(enable) == 'boolean' then
- B.Conf.ConfigMode = enable
- else
- B.Conf.ConfigMode = (B.Conf.ConfigMode == false) and true or false
- end
-
- print('/BUFF', B.Conf.ConfigMode, type(B.Conf.ConfigMode))
- if B.Conf.ConfigMode then
- if not B.configFramesCreated then
- InitConfig()
- end
- print('Veneer config')
- B:Show()
- else
- B:Hide()
- end
- B.UpdateAll()
- B.UpdateConfigLayers()
-end
-
-B.Close = function ()
- M.Command()
-end
-
-B.ToggleGuides = function(_, self)
- B.Conf.GuidesMode = (not B.Conf.GuidesMode)
- if B.Conf.GuidesMode then
- self:GetNormalTexture():SetTexture(0.94, 0.21, 0.21, 1)
- else
- self:GetNormalTexture():SetTexture(0, 0, 0, 1)
- end
-
- B.UpdateConfigLayers()
-end
-
-M.OnEnable = function()
- print('|cFFFF0088config module', B.Conf.ConfigMode)
- M.Command(B.Conf.ConfigMode)
-end
-
-M.OnInitialize = function()
- DEFAULT_CHAT_FRAME:AddMessage("|cFF22D822Veneer|r")
- SLASH_BUFFALO1, SLASH_BUFFALO2 = "/buffalo", "/buff"
- SlashCmdList.BUFFALO = M.Command
-
-end
\ No newline at end of file
diff -r aa693607b813 -r 1a322b92dbfa Config/Config.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Config/Config.lua Thu Apr 28 05:54:21 2016 -0400
@@ -0,0 +1,393 @@
+--- All the control GUI stuff, including chat command functions
+-- @file-author@
+-- @project-revision@ @project-hash@
+-- @file-revision@ @file-hash@
+-- Created: 3/12/2016 12:49 AM
+local B, _G = select(2,...).frame, _G
+local M = B:RegisterModule("Options")
+local tostring, tonumber, floor, format = tostring, tonumber, floor, string.format
+local unpack, select, pairs, ipairs, type, wipe = unpack, select, pairs, ipairs, type, table.wipe
+local CreateFrame, IsControlKeyDown = _G.CreateFrame, _G.IsControlKeyDown
+local max = math.max
+local OpacitySliderFrame, ColorPickerFrame = _G.OpacitySliderFrame, _G.ColorPickerFrame
+local print = B.print('Cfgl')
+local function round(number, decimals)
+ if floor(number) == number then
+ return ('%d'):format(number)
+ end
+
+ return (("%%.%df"):format(decimals)):format(number)
+end
+
+M.defaults = {
+ enable = true
+}
+
+--- STATE VARIABLES
+local configInit
+--- Dummies for addon table upvalues
+local configFrames = {} -- actual frame objects
+local displays = B.displays -- anchor objects dummy
+
+
+--- Returns a value retreival function and the current value stored in config
+-- @paramsig value, previousValue = configInteger(key)
+-- @param key Name of the config field being represented.
+local defaultGroup = 'BuffButton'
+local configInteger = function(group, key)
+ return function(self ,display)
+ return floor(tonumber(self:GetValue()) + 0.5)
+ end, (B.Conf[group ..key] or B.Conf[defaultGroup..key])
+end
+local configPercent = function(group, key)
+ return function(self, display)
+ local value = self:GetValue()
+ if display then
+ return tostring(floor(value*100+0.5))..' %'
+ else
+ return floor((value*100+0.5))/100
+ end
+ end, (B.Conf[group ..key] or B.Conf[defaultGroup..key])
+end
+local configColor = function(group, key)
+ -- table for config, color value list for text
+ return function(self, display)
+ if display then
+ return "|cFFFF4444" .. round(self.rgba[1], 1) .. "|r, |cFF44FF44" .. round(self.rgba[2], 1) .. "|r, |cFF4488FF" ..
+ round(self.rgba[3], 1) .. "|r, " .. round(self.rgba[4], 1)
+ else
+ return self.rgba
+ end
+ end, (B.Conf[group ..key] or B.Conf[defaultGroup..key])
+end
+local configCheck = function(group, key)
+ return function(self) return self:GetChecked() end, B.Conf[group ..key] or B.Conf[defaultGroup..key]
+end
+-- initializes the corresponding type of config field
+local frameTypeConv = {
+ Color = 'Button',
+ Font = 'Frame',
+}
+local configTypeParams = {
+ Slider = function(frame, optionInfo)
+ frame:SetMinMaxValues(optionInfo[5], optionInfo[6])
+ frame:SetValueStep(optionInfo[7])
+ frame:SetStepsPerPage(optionInfo[8])
+ print(frame.OptName, '\n {', optionInfo[5], optionInfo[6], optionInfo[7], optionInfo[8], '}')
+ end,
+ CheckButton = function(frame, optionInfo)
+ frame.SetValue = function(self, ...)
+ self:SetChecked(...)
+ B.Conf[self.OptName] = self:GetChecked()
+ print(self.OptTab)
+ B.UpdateAll()
+ end
+ frame:SetScript("OnClick",function(self)
+ B.Conf[self.OptName] = self:GetChecked()
+ print(B.Conf[self.OptName], self:GetChecked())
+ B.UpdateAll()
+ end)
+ end,
+ Color = function(frame, optionInfo)
+ frame.rgba = { frame.current:GetVertexColor() }
+ local colorPickerCallback = function(restore)
+ local newR, newG, newB, newA
+ if restore then
+ newR, newG, newB, newA = unpack(restore)
+ else
+ newA, newR, newG, newB = OpacitySliderFrame:GetValue(), ColorPickerFrame:GetColorRGB()
+ print('not cancel', newA, newR, newB, newG)
+ end
+ frame:SetValue({newR, newG, newB, newA})
+ B.UpdateBuffs(frame.OptTab)
+ end
+ frame:SetScript("OnClick", function(self)
+ print('got a click')
+ local r, g, b, a = frame.current:GetVertexColor()
+ ColorPickerFrame:SetColorRGB(r, g, b)
+ ColorPickerFrame.hasOpacity = (a ~= nil)
+ ColorPickerFrame.opacity = a
+ ColorPickerFrame.previousValues = {r,g,b,a}
+ ColorPickerFrame.func, ColorPickerFrame.opacityFunc, ColorPickerFrame.cancelFunc =
+ colorPickerCallback, colorPickerCallback,colorPickerCallback
+ ColorPickerFrame:Hide()
+ ColorPickerFrame:Show()
+ end)
+ frame.SetValue = function(self, rgba)
+ print(rgba)
+ frame.rgba = rgba
+ B.Conf[self.OptName] = rgba
+ frame.current:SetVertexColor(unpack(rgba))
+ frame.fieldvalue:SetText(frame.OptValue(frame, true))
+ end
+ end
+}
+--- configDialog
+-- @usage tinsert(configDialog, {prefix, row, [...] })
+-- Each top level member defines a group of config value handlers, structured as an iterative table where the
+-- first member is a key prefix, the second member is an integer row value, and all following members are treated
+-- as a widget resource, defined initially as a complete sub-table, which can be re-used further down by passing
+-- the string literal widget suffix.
+-- widget table: ... {'suffix', 'description', valueCallback, 'template', [widget parameters]}
+-- widget copy: ... 'suffix', ...
+local configDialog = {
+ {'BuffButton', 1,
+
+ {'Max', 'Max', configInteger, 'Slider',
+ 1, _G.BUFF_MAX_DISPLAY, 1, 1}, -- valueMin, valueMax, valueStep, stepsPerPage
+ {'PerRow', 'Per Row', configInteger, 'Slider',
+ 1, _G.BUFF_MAX_DISPLAY, 1, 1}, -- valueMin, valueMax, valueStep, stepsPerPage,
+ {'Size', 'Icon Size', configInteger, 'Slider',
+ 1, 256, 1, 1},
+ {'Spacing', 'Icon Spacing', configInteger, 'Slider',
+ 1, 50, 1, 1},
+ {'DurationSize', 'Duration Text Height', configInteger, 'Slider',
+ 1, 72, 1, 1},
+ {'Zoom', 'Icon Zoom', configInteger, 'Slider',
+ 0, 100, 1, 1},
+ {'Border', 'Border', configInteger, 'Slider',
+ 1, 16, 1, 1},
+ {'Color', 'Default Border', configColor, 'Color'},
+ {'RaidColor', 'RaidBuff Border', configColor, 'Color'},
+ {'PlayerColor', 'Player Buffs', configColor, 'Color'},
+ {'BossColor', 'Encounter Buffs', configColor, 'Color'},
+ {'ShowSelfCast', 'Show name for self-casts', configCheck, 'CheckButton'}
+ },
+ { 'DebuffButton', 1,
+ {'Max', 'Max', configInteger, 'Slider',
+ 1, _G.DEBUFF_MAX_DISPLAY, 1, 1 }
+ ,
+ {'PerRow', 'Per Row', configInteger, 'Slider',
+ 1, _G.DEBUFF_MAX_DISPLAY, 1, 1 },
+ 'Size', 'Spacing', 'DurationSize', 'Zoom', 'Border',
+ 'Color', 'RaidColor', 'PlayerColor', 'BossColor',
+ },
+ { 'TempEnchant', 1,
+ {'Max', 'Max', configInteger, 'Slider',
+ 1, _G.NUM_TEMP_ENCHANT_FRAMES, 1, 1 },
+ {'PerRow', 'Per Row', configInteger, 'Slider',
+ 1, _G.NUM_TEMP_ENCHANT_FRAMES, 1, 1},
+ 'Size', 'Spacing', 'DurationSize', 'Zoom', 'Border',
+ 'Color', 'RaidColor', 'PlayerColor', 'BossColor',
+ },
+ { 'ConsolidatedBuff', 2,
+ {'Position', 'Slot Position', configInteger, 'Slider',
+ 1, _G.BUFF_MAX_DISPLAY, 1, 1 }
+
+ },
+ { 'ConsolidatedBuff', 2,
+ 'Size'
+ },
+ { 'Raid', 3,
+ {'ShowMissing', 'Verbose missing raid buffs', configCheck, 'CheckButton'}
+ }
+}
+
+
+
+
+local configFrame
+local optionTemplates = {}
+local configPadding, configSpacing = 3, 3
+
+--- Walks the structure table to generate a pretty config panel
+local InitConfig = function()
+ configInit = true
+ local configWidth = B:GetWidth()
+ local optionWidth = (configWidth - configPadding) / 3 - configSpacing
+ local configHeight = 0
+ local bottom_extent = 0
+ local clusterHeight = 0
+ local clusterOffset = 0
+ local lastCluster
+ local cluster = 1
+ local col = 0
+ for t, taboptions in ipairs(configDialog) do
+ local group = taboptions[1]
+ cluster = taboptions[2]
+ col = col + 1
+
+
+ if not configFrames[t] then
+ configFrames[t] = {}
+ end
+
+
+ if cluster ~= lastCluster then
+ configHeight = configHeight + clusterHeight
+ print('|cFFFF8800## new cluster|r, advancing offset from', clusterOffset, 'to', clusterOffset + clusterHeight)
+ clusterOffset = clusterOffset + clusterHeight
+ col = 1
+ clusterHeight = 0
+ lastCluster = cluster
+ end
+
+ print('processing tab', group)
+ local row = 0
+ for i = 3, #taboptions do
+ row = row + 1
+ local optionInfo = taboptions[i]
+ if type(optionInfo) == 'string' then
+ optionInfo = optionTemplates[optionInfo]
+ end
+ local key, fieldname, valueFuncGenerator, configType = unpack(optionInfo)
+
+ if not optionTemplates[key] then
+ optionTemplates[key] = optionInfo
+ end
+
+ local fullkey = group .. key
+ print(fullkey, fieldname)
+
+ if not configFrames[t][row] then
+ print('building frame', t, group, row)
+ local frameTemplate = 'VeneerConfig'..configType
+ local frameType = frameTypeConv[configType] or configType
+ configFrames[t][row] = CreateFrame(frameType, fullkey, B, frameTemplate)
+ local f = configFrames[t][row]
+ f.OptKey = key
+ f.OptTab = group
+ f.OptName = fullkey
+ local valueFunc, initialValue = valueFuncGenerator(group, key)
+ print(' value getter', fullkey,'->', valueFunc,initialValue)
+ configTypeParams[configType](f, optionInfo)
+ f.OptValue = valueFunc
+
+ --- Enclosing these to
+ -- a) make the panel easy to bring up externally
+ -- b) limit gameplay risk from config frame errors
+ -- c) milk the iterator scope for all its worth
+ f.OnChange = function(self)
+
+ -- holding control; mirror this setting in other categories
+ if IsControlKeyDown() and not (configInit) then
+ configInit = true
+ for optTab, opts in pairs(configFrames) do
+ for _, opt in ipairs(opts) do
+ if opt.OptKey == key then
+ if optTab ~= group then
+ print('mapping to', optTab, opt.OptKey)
+ opt:SetValue(self:GetValue())
+ end
+
+ end
+ end
+ end
+ configInit = nil
+ end
+ local newValue = valueFunc(self)
+ if newValue ~= B.Conf[fullkey] then
+ print(newValue, fullkey)
+ f.fieldvalue:SetText(valueFunc(self, true))
+ B.Conf[fullkey] = valueFunc(self)
+ -- prepare to update
+ wipe(B.drawn[f.OptTab])
+ B.UpdateBuffs(self.OptTab)
+ B.UpdateConfigLayers()
+ end
+
+ end
+
+ f:SetValue(initialValue)
+ local yBuffer = configPadding
+ if f.fieldname then
+ f.fieldname:SetText(fieldname)
+ yBuffer = yBuffer + f.fieldname:GetHeight()
+ end
+ if f.fieldvalue then
+ f.fieldvalue:SetText(f:OptValue(true))
+ end
+
+ local point, relative, x, y = 'TOPLEFT', 'BOTTOMLEFT', 0, -3
+
+ local base
+ if (row == 1) then
+ bottom_extent = 0
+ base = B.header
+ x = (col-1) * (optionWidth+configSpacing)
+ y = -configPadding
+ else
+ base = configFrames[t][row-1]
+ end
+
+ print('|cFFFF0088'..cluster..'|r |cFF00FF00'.. row..'|r', col, base:GetName(), x, y - clusterOffset)
+
+ if frameType ~= 'CheckButton' then
+ f:SetWidth(optionWidth)
+ end
+
+ f:SetPoint(point, base, relative, x, y-yBuffer-clusterOffset)
+ --print('creating', frameType, fieldname)
+ f:Show()
+
+ bottom_extent = bottom_extent + f:GetHeight() + yBuffer + configSpacing
+
+
+
+ clusterHeight = max(clusterHeight, bottom_extent)
+ --print('y', floor(yBuffer+0.5), 'f:H', floor(f:GetHeight()+0.5), 'hTally', floor(bottom_extent+0.5), 'hMax', floor(configHeight+0.5))
+ end
+ end
+ end
+
+ -- grab the last cluster
+ if lastCluster == cluster then
+ print('|cFF00FF00##scooping up last cluster info')
+ configHeight = configHeight + clusterHeight
+ end
+
+ if not B.configFramesCreated then
+ B.configFramesCreated = true
+ B:SetHeight(B.header:GetStringHeight() + configSpacing*3 + configHeight)
+ end
+ if configInit then configInit = nil end
+end
+
+M.Command = function(enable, editbox)
+ displays = B.displays
+ if type(enable) == 'boolean' then
+ B.Conf.ConfigMode = enable
+ else
+ B.Conf.ConfigMode = (B.Conf.ConfigMode == false) and true or false
+ end
+
+ print('/BUFF', B.Conf.ConfigMode, type(B.Conf.ConfigMode))
+ if B.Conf.ConfigMode then
+ if not B.configFramesCreated then
+ InitConfig()
+ end
+ print('Veneer config')
+ B:Show()
+ else
+ B:Hide()
+ end
+ B.UpdateAll()
+ B.UpdateConfigLayers()
+end
+
+B.Close = function ()
+ M.Command()
+end
+
+B.ToggleGuides = function(_, self)
+ B.Conf.GuidesMode = (not B.Conf.GuidesMode)
+ if B.Conf.GuidesMode then
+ self:GetNormalTexture():SetTexture(0.94, 0.21, 0.21, 1)
+ else
+ self:GetNormalTexture():SetTexture(0, 0, 0, 1)
+ end
+
+ B.UpdateConfigLayers()
+end
+
+M.OnEnable = function()
+ print('|cFFFF0088config module', B.Conf.ConfigMode)
+ M.Command(B.Conf.ConfigMode)
+end
+
+M.OnInitialize = function()
+ DEFAULT_CHAT_FRAME:AddMessage("|cFF22D822Veneer|r")
+ SLASH_BUFFALO1, SLASH_BUFFALO2 = "/buffalo", "/buff"
+ SlashCmdList.BUFFALO = M.Command
+
+end
\ No newline at end of file
diff -r aa693607b813 -r 1a322b92dbfa Config/Config.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Config/Config.xml Thu Apr 28 05:54:21 2016 -0400
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self:OnChange()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self:OnChange()
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff -r aa693607b813 -r 1a322b92dbfa Core.xml
--- a/Core.xml Tue Apr 26 15:05:38 2016 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,258 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- self:OnChange()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- self:OnChange()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- self:RegisterForDrag('LeftButton')
-
-
- self:StartMoving()
-
-
- self:StopMovingOrSizing()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff -r aa693607b813 -r 1a322b92dbfa Init.lua
--- a/Init.lua Tue Apr 26 15:05:38 2016 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,549 +0,0 @@
---- Modulizer framework
--- OnInitialize
--- OnUpdate
--- OnEnable -- run when GetSpecialization() returns true
-
-local ADDON, A = ...
-Veneer = Veneer or CreateFrame('Frame', 'Veneer', UIParent)
-local B = Veneer
-local wipe, min, max, random, tinsert, tremove = table.wipe, math.min, math.max, math.random, table.insert, table.remove
-local pairs, ipairs, select, unpack, _G = pairs, ipairs, select, unpack, _G
-local type, tostring, format = type, tostring, string.format
-A.frame = B
-
---- Cache tables
-local initOnced
-local modules = {}
-local queuedModules = {}
-local checkForConfig = {}
-local moduleStack = {
-}
-
---- Utilities
-B.wipeall = function (...)
- for i = 1, select('#', ...) do
- wipe(select(i, ...))
- end
-end
-
---- Various region categories
-B.displays = {}
-B.configLayers = {}
-B.configLayersRef = {}
-
-
---@debug@
---- Generates a print handler pointing to a static channel signature
--- @usage func = B.print(sig)
--- @param sig channel name or number
-local printfuncs = {}
-B.print = function(pref, ...)
- if Devian and Devian.InWorkspace() then
- printfuncs[pref] = printfuncs[pref] or function(...) print(pref, ...) end
-
- return printfuncs[pref]
- else
- return function () end
- end
-end
-
-local rgb = {}
-local getcolor = function()
- local n, p = 0, 4
- for i = 1, 3 do
- rgb[i] = min(random(n,p) * 64, 255)
- if rgb[i] == 255 then
- p = 4
- elseif rgb[i] > 0 then
- n = 2
- end
- end
- return unpack(rgb)
-end
-
-local color = {}
-local fprints = {}
-B.fprint = function()
- if not (Devian and Devian.InWorkspace()) then
- return function() end
- end
-
-
- local sig = debugstack(2,1)
- if fprints[sig] then
- return fprints[sig]
- end
-
- local func = sig:match("%`(%a+)%'")
- if not func then
- func = sig:match("<(.-)>")
- end
- func = func:gsub('(%l+)(%u)', function(a, b) return a:sub(0,2) .. b end, 1)
- func = func:gsub('^.+%\\', '')
- if not func then
- func = 'noname'
- end
-
- local r, g, b = getcolor()
- color[sig] = color[sig] or format('|cFF%02X%02X%02X%s|r', r, g, b, func)
-
- --print(color[func] .. ' ( ' .. table.concat(args, ', ')..' )' )
- func = B.print(func)
- fprints[sig] = func
- return func
-end
-
---@end-debug@
---[=[@non-debug@
-B.print = function() end
---@end-non-debug@]=]
-
--- for the Mikk script
--- GLOBALS: NUM_LE_RAID_BUFF_TYPES
--- GLOBALS: BUFF_FLASH_TIME_ON, BUFF_FLASH_TIME_OFF, BUFF_MIN_ALPHA, BUFF_WARNING_TIME, BUFF_DURATION_WARNING_TIME
--- GLOBALS: BUFFS_PER_ROW, BUFF_MAX_DISPLAY, BUFF_ACTUAL_DISPLAY, DEBUFF_MAX_DISPLAY, DEBUFF_ACTUAL_DISPLAY, BUFF_ROW_SPACING
--- GLOBALS: CONSOLIDATED_BUFFS_PER_ROW, CONSOLIDATED_BUFF_ROW_HEIGHT, NUM_TEMP_ENCHANT_FRAMES
--- GLOBALS: BUFF_BUTTON_HEIGHT, BUFF_FRAME_BASE_EXTENT, BUFF_HORIZ_SPACING
-
-local print = B.print('Bfl')
-
---- Template for making perpendicular traversals of the displays structure; also makes sure the table is there
-B.Abstract = function(dest, key, table)
- if table then
- for _, v in pairs(dest) do
- v[key] = {}
- end
- end
- B[key] = setmetatable({}, {
- __index = function(t, k)
- return dest[k][key]
- end,
- __newindex = function(_, k, v)
- print('abstract write ('..key..'):', k)
- dest[k][key] = v
- end,
- __tostring = function() return 'Abstract:'..key..'' end
- })
-
-
- return B[key]
-end
-
-
---- localize for speed
-local layers, refs, displays = B.configLayers, B.configLayersRef, B.displays
-
-local ModulesCall = function(func, flag)
-
- local n = 0
- for i = 1, #moduleStack do
- print('calling level '..i)
- local stackset = moduleStack[i]
-
- for name, module in pairs(stackset) do
- n = n + 1
-
-
- if module[func] then
- -- nil = pass
- if not flag or module.Conf[flag] then
- if (flag) then
- print(' check', flag, '=', module.Conf[flag])
- end
-
- print(' ',n..' '..name..'.'..func..'()')
- module[func](module, module.Conf)
- end
-
- end
- end
- end
-end
-
-
-local Enable = function()
-end
-
---- The things that happen repeatedly
-local Init = function ()
-end
-
-
---- Things that happen immediately upon entering world
-local InitOnce = function()
- print('entering world first time')
- local defaults = B.ConfDefaults
- print('|cFFFFFF00Veneer|r')
- if not VeneerData then
- VeneerData = {}
- for k,v in pairs(defaults) do
-
-
- VeneerData[k] = v
- end
- print('Veneer defaults being used.')
- end
-
- B.Conf = setmetatable(VeneerData, {__index = function(_, k) return defaults[k] end})
-
-
-
- -- suffix tables
- for name, display in pairs(displays) do
- display.conf = setmetatable({}, {
- __index = function(_, k)
- --print('config check '.. name .. k)
- return B.Conf[name .. k] or B.Conf['BuffButton' .. k]
- end,
- __newindex = function(_, k , v)
- B.Conf[name..k] = v
- end,
- })
- end
-
- -- To ensure that modules are run in controlled order, walk the dependency list; if the dep shows up
- -- in the loaded manifest, remove the value. If the dep list isn't empty, move that module to the next
- -- layer.
- local loaded = {}
- local stackLevels = #moduleStack
- local i = 1
- moduleStack[1] = modules
- repeat
- print('setting init level '.. i)
- local queue = moduleStack[i]
- for name, module in pairs(queue) do
-
- if queuedModules[name] and #queuedModules[name] > 0 then
- local p = #queuedModules[name]
- for j = 1, p do
- local dep = queuedModules[name][j]
-
- if loaded[dep] then
- print( ' ' .. dep .. ' OK')
- queuedModules[name][j] = nil
- for k = j, p do
- print(' shift ' .. (k+1) .. ' ('..tostring(queuedModules[name][k+1])..') to ' .. k ..'')
- queuedModules[name][k] = queuedModules[name][k+1]
- end
- end
- end
-
- if #queuedModules[name] == 0 then
- queuedModules[name] = nil
- print(' |cFF00FFFF'.. name ..'|r deps OK')
- loaded[name] = true
- else
-
- print(' |cFFFF8800' .. name ..'|r pending')
- local next = i+1
- if not moduleStack[next] then
- moduleStack[next] = {}
- end
- stackLevels = next
- moduleStack[next][name] = module
- queue[name] = nil
- end
-
- else
- print(' |cFF00FF00'.. name ..'|r no deps')
- loaded[name] = true
- end
- end
- i = i + 1
- until i > stackLevels
-
-
- for level, batch in ipairs(moduleStack) do
- print('config level', level)
- for name, module in pairs(batch) do
- if not VeneerData[name] then
- VeneerData[name] = {}
- end
-
- if module.defaults then
- print('setting defaults for module', name)
- --[===[@non-debug@
- if not VeneerData[name] then
- --@end-non-debug@]===]
- VeneerData[name] = {}
- --[===[@non-debug@
- end
- --@end-non-debug@]===]
- for k,v in pairs(module.defaults) do
- VeneerData[name][k] = v
- end
- module.Conf = VeneerData[name]
- end
-
- if VeneerData[name].enabled == nil then
- VeneerData[name].enabled = true
- end
-
- end
- end
-
-
- if #checkForConfig >= 1 then
- local queuedFrame = tremove(checkForConfig)
- while queuedFrame do
- B.SetConfigLayers(queuedFrame)
- B.UpdateXMLFrame(queuedFrame)
- queuedFrame = tremove(checkForConfig)
- end
- end
- -- remove from existing
-end
-
---- Fires an update to all modules
-local lastUpdate
-function B.UpdateAll(...)
- lastUpdate = GetTime()
- ModulesCall('OnUpdate')
-end
-
-B:RegisterEvent('PLAYER_ENTERING_WORLD')
-B:SetScript('OnEvent', function(self, event)
- if event == 'PLAYER_ENTERING_WORLD' then
- if not initOnced then
- InitOnce()
- ModulesCall('OnInitialize')
- initOnced = true
- C_Timer.After(1, function()
- if GetSpecialization() then
- print(GetSpecialization(), 'enabling')
-
- ModulesCall('OnEnable', 'enabled')
- B:SetScript('OnUpdate', nil)
- end
- end)
- end
- end
-
- B.UpdateAll()
-
- if event == 'PLAYER_ENTERING_WORLD' then
- B.UpdateConfigLayers()
- end
-
-end)
-
---- Modulizer method
---
-function B:RegisterModule (name, module, ...)
- if modules[name] then
- print('pulling modules[|cFFFF8800'.. tostring(name) ..'|r]')
- return modules[name]
- end
-
- print('new module |cFF00BBFF'.. tostring(name) ..'|r')
- if module then
- if modules[name] then
- error("Module table for '"..tostring(name).."' already exists.")
- end
- else
- module = CreateFrame('Frame', 'Veneer' .. tostring(name) .. 'Handler', B, 'VeneerHandlerTemplate')
- end
- modules[name] = module
- B[name] = module
- if select('#', ...) >= 1 then
- local numDeps = select('#', ...)
- print(' '..numDeps..' deps detected')
- for i = 1, numDeps do
- local dep = select(i, ...)
- -- means that init/enable funcs are ordered to run after deps do their things
- queuedModules[name] = queuedModules[name] or {}
- tinsert(queuedModules[name], dep)
- print(' needs '..dep)
- end
- end
- return module
-end
-
-
-B.SetConfigLayers = function(frame)
- local print = B.fprint()
- if not frame.config then
- --print(frame:GetName(), 'has no config layers')
- return
- end
- --print('Registering config layers from', frame:GetName())
-
- for i, subframe in ipairs(frame.config) do
- -- make sure there are no duplicates
- if not refs[subframe] then
- local key = #layers+1
- layers[key] = subframe
- refs[subframe] = key
- end
- --print(' ', i, subframe:GetName())
- end
-end
-
-B.RemoveConfigLayers = function(frame)
-
- local print = B.fprint()
- print('|cFFFF0000RemoveConfigLayers', frame:GetName())
- for i, subframe in pairs(layers) do
- if subframe:GetParent() == frame then
- print('|cFFFF8800 ', subframe:GetParent():GetName(), '|cFFFFFF00', subframe:GetName())
- layers[i]:Hide()
- layers[i] = nil
- refs[subframe] = nil
- end
- end
-end
-
-B.UpdateConfigLayers = function()
- local print = B.fprint()
- local func = B.Conf.GuidesMode and 'Show' or 'Hide'
- local numAnchors = 0
- for name, display in pairs(displays) do
- numAnchors = numAnchors + 1
- display.anchor:EnableMouse(B.Conf.GuidesMode)
- if B.Conf.GuidesMode then
- display.anchor:SetScript('OnUpdate', display.anchor.OnUpdate)
- else
- display.anchor:SetScript('OnUpdate', nil)
-
- for i, anchorButton in ipairs(display.anchor.anchorButton) do
- anchorButton:Hide()
- end
-
- end
- --print(B.Conf.ConfigMode)
- display.anchor:EnableMouse(B.Conf.ConfigMode)
- end
- for id, region in pairs(layers) do
- --print(id, region:GetName(), func)
- region[func](region)
- end
-
- --print('['..func..'] updated', #layers, 'regions,', numAnchors, 'frames')
-end
-
-local XMLFrame_Enable = function(self, value)
- local name = self:GetName()
- local print = B.print('XML')
-
- if not B.Conf[name] then
- B.Conf[name] = {
- enabled = true
- }
- end
-
- print()
- local enabled
- if value == nil then
- if B.Conf[name].enabled == nil then
- print('toggle based on visibility')
- enabled = (not self:IsVisible()) and true or false
- else
- print('toggle a config value =', B.Conf[name].enabled)
- enabled = B.Conf[name].enabled
- end
-
- enabled = (enabled ~= true) and true or false
- else
- print('use argument value', value)
- enabled = value
- end
-
- print('arg =', value, 'conf =', B.Conf[name].enabled, 'result=', enabled)
-
- B.Conf[name].enabled = enabled
-
- local stateFunc = enabled and 'Show' or 'Hide'
- local eventFunc = enabled and 'OnToggle' or 'OnToggle'
- for i, region in pairs(self.toggled) do
- region[stateFunc](region)
- end
- if self.OnToggle then
- self:OnToggle(B.Conf[name].enabled)
- end
- if B.Conf[name].enabled then
- if self.OnEnable then
- self:OnEnable()
- end
- else
- if self.OnDisable then
- self:OnDisable()
- end
- end
-end
---- Generic handlers for keeping track of XML-defined frames
-local print = B.print('XML')
-local XMLFrame_OnDragStart = function(self)
- local print = B.print('XML')
- self.xA = self:GetLeft()
- self.yA = self:GetBottom()
- self.anchorTo, self.relativeTo, self.relativePoint, self.x, self.y = self:GetPoint(1)
- print('acquire anchor', self:GetPoint(1))
- print(self:GetName(), 'start moving ('..self.x..', '..self.y..')')
- self:StartMoving()
-end
-
-local XMLFrame_OnDragStop = function(self)
- local print = B.print('XML')
- local name = self:GetName()
- print(name, 'stop moving ('..self:GetLeft()..', '..self:GetBottom()..')')
- local xB = self:GetLeft() - self.xA
- local yB = self:GetBottom() - self.yA
- print('storing anchor point', self.anchorTo, self.relativePoint, self.x + xB, self.y + yB)
-
- self:StopMovingOrSizing()
- B.Conf[name].position = {self.anchorTo, self.relativePoint, self.x + xB, self.y + yB}
- B.UpdateXMLFrame(self)
-end
-
-B.RegisterModuleFrame = function(self, moduleName)
- local print = B.print('XML')
- tinsert(checkForConfig, self)
- self.Enable = XMLFrame_Enable
- self.moduleName = moduleName
- print('|cFF00FF00XML stuff related to '.. tostring(moduleName) .. ':', self:GetName())
-end
-
-B.UpdateXMLFrame = function(self)
- local print = B.print('XML')
-
- local name = self:GetName()
-
-
- if self.drag then
- self:RegisterForDrag('LeftButton')
- self:SetScript('OnDragStart', XMLFrame_OnDragStart)
- if self.OnDragStop then
- self:SetScript('OnDragStop', function(self, ...)
- print('|cFFFF0088end of dragging')
- self:OnDragStop(self, ...)
- XMLFrame_OnDragStop(self, ...)
- end)
- else
- self:SetScript('OnDragStop', XMLFrame_OnDragStop)
- end
- else
- self:EnableMouse(false)
- end
-
- if not B.Conf[name] then
- B.Conf[name] = {
- enabled = self.enabled,
- }
- end
- local c = B.Conf[name]
-
- if not c.position then
- local a, _, b, c, d = self:GetPoint(1)
- print('seeding default position', a, b, c, d)
- c.position = {a, b, c, d }
- else
-
- print('restoring frame position', unpack(c.position))
- self:ClearAllPoints()
- local anchorTo, relativePoint, x, y = unpack(c.position)
- self:SetPoint(anchorTo, UIParent, relativePoint, x, y)
- end
- self:Enable(c.enabled)
-
-
-end
diff -r aa693607b813 -r 1a322b92dbfa Minimap/Minimap.lua
--- a/Minimap/Minimap.lua Tue Apr 26 15:05:38 2016 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
---- ${PACKAGE_NAME}
--- @file-author@
--- @project-revision@ @project-hash@
--- @file-revision@ @file-hash@
--- Created: 4/21/2016 9:45 AM
-local B = select(2, ...)
-local T = B:RegisterModule("Cluster", _G.VeneerMiniMapCluster)
-
-function T:OnInitialize ()
-
-end
-
-
diff -r aa693607b813 -r 1a322b92dbfa ObjectiveTracker/ObjectiveTracker.lua
--- a/ObjectiveTracker/ObjectiveTracker.lua Tue Apr 26 15:05:38 2016 -0400
+++ b/ObjectiveTracker/ObjectiveTracker.lua Thu Apr 28 05:54:21 2016 -0400
@@ -515,12 +515,6 @@
end
- local weekDays = {'Su', 'M', 'T', 'W', 'R' ,'F', 'Sa'}
- Wrapper.Clock:SetScript('OnUpdate', function(self)
- local weekday, month, day, year = CalendarGetDate()
- local hour, min = GetGameTime()
- self.time:SetFormattedText("%s.%s.%s %d:%02d", weekDays[weekday], month, day, hour, min)
- end)
ObjectiveTrackerFrame:UnregisterAllEvents()
ObjectiveTrackerFrame:Hide()
diff -r aa693607b813 -r 1a322b92dbfa ObjectiveTracker/ObjectiveTracker.xml
--- a/ObjectiveTracker/ObjectiveTracker.xml Tue Apr 26 15:05:38 2016 -0400
+++ b/ObjectiveTracker/ObjectiveTracker.xml Thu Apr 28 05:54:21 2016 -0400
@@ -158,7 +158,13 @@
-
+
+
+
+ self.toggle = true
+ Veneer.RegisterModuleFrame(self, 'Clock')
+
+
diff -r aa693607b813 -r 1a322b92dbfa RaidBuffTray.lua
--- a/RaidBuffTray.lua Tue Apr 26 15:05:38 2016 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,354 +0,0 @@
---- ${PACKAGE_NAME}
--- @file-author@
--- @project-revision@ @project-hash@
--- @file-revision@ @file-hash@
--- Created: 3/20/2016 10:00 PM
-
-local _, A = ...
-local B = A.frame
-local MODULE = 'BuffFrame'
-local M = B:RegisterModule(MODULE)
-local displays = B.displays
-
-local parentAnchor, parentFrame, raidbuffsFrame
-local band, lshift, CreateFrame = bit.band, bit.lshift, CreateFrame
-local raidBuffs = {}
-local raidBuffSymbols = {'St', 'HP', 'AP', 'Ha', 'SP', 'Cr', 'Ma', 'MS', 'V' }
-local missingBuffs = {}
-local playerBuffing, playerCurrentBuff
-local playerBuffs = {}
-local c, ac, frameSize, frameSpacing, framePosition
-local fprint = B.fprint
-local NUM_LE_MISSING_RAID_BUFFS = 0
-local missingBuffsAnchor
-
-
---- Takes a given icon texture and calls the pre-defined function set
-M.UpdateBuffStyle = function(buff, style, path)
- local print = fprint()
- local icon = buff.icon
- local symbol = buff.symbol
- path = path or icon.iconPath
- --print(style, icon.iconStyle)
-
- if style ~= buff.iconStyle or path ~= buff.iconPath then
- print('|cFF0088FFUpdateBuffStyle(|r', icon:GetName(), style, path)
- icon.iconStyle = style
- icon.iconPath = path
- else
- --print('|cFF00FF88UpdateBuffStyle(|r', icon:GetName(), style, path, ') same values, ignore')
- return
- end
- local styleset = B.BuffStyles[style]
- if not path or path == '' then
- print('path is nil/empty')
- icon:SetTexture(1, 1, 1, 1)
- icon:SetVertexColor(unpack(styleset.Color))
- else
- icon:SetTexture(path or icon:GetTexture())
- icon:SetVertexColor(unpack(styleset.Color))
- end
-
- if symbol and symbol.GetText then
- symbol:SetTextColor(unpack(styleset.TextColor))
- symbol:SetText(buff.symbolName or 'NaW')
- end
-
- icon:SetBlendMode(styleset.SetBlendMode)
- icon:SetDesaturated(styleset.SetDesaturated)
-end
-
---- Populates a list of targets needing a buff, fired by a handler
-local PlayerBuffTodo ={}
-M.UpdateBuffStatus = function(aura, filters)
- if not PlayerBuffStatus[aura] then
- PlayerBuffStatus[aura] = {}
- end
-
-
- print(UnitClass('player'))
- if IsInGroup() then
- local numBuffed = 0
- local partySize = GetNumGroupMembers()
- local missing = {}
- for i = 1, partySize do
- local unit = 'raid'..i
- if UnitAura(unit, aura, nil, filters) then
- numBuffed = numBuffed + 1
- else
- tinsert(missing, unit)
- end
- end
-
- PlayerBuffTodo[aura] = missing
-
- end
-end
-
---- Evaluates buff availability criteria
--- Uses hard returns to avoid over-iterating conditionals, particularly pet family
-local function IsBuffAvailable(criteria)
- local available, active = false, false
- local result
- for _, test in ipairs(criteria) do
- if test == true then
- -- it's a passive effect that is always on
- return true, true
- else
- if c.spec then
- if not (result and c.spec == B.PlayerSpec) then
- return false
- end
- end
-
- if c.talent then
- local talentID, name, texture, selected, available = GetTalentInfoByID(c.talent, GetActiveSpecGroup())
- if not (result and selected) then
- return false
- end
- end
-
- if c.petFamily then
- local lim = min(5, NUM_PET_STABLE_SLOTS) -- to avoid volatile loop condition
- for p = 1, lim do
- local hasPet = false
- local icon, name, level, family, talent = GetStablePetInfo(p)
- if family == c.petFamily then
- hasPet = true
- end
- if not (result and hasPet) then
- return false
- end
- end
- end
-
- end
- end
- return true, false
-end
-
---- events: PLAYER_SPECIALIZATION_CHANGED
-function M:UpdateBuffsTodo (unit)
- -- buffs vs. auras
- if unit ~= 'player' then
- -- look for changes in the GIST manifest and sort them out
- return
- end
-
- local class = UnitClass('player')
- local spec = GetSpecialization()
- if not class or
- not spec or
- not IsInGroup() or
- not B.PlayerBuffStatus[class] then
- -- if just logging in, info won't be available for several seconds
- -- if not grouped, don't calc
- -- hide frame
- B.PlayerBuffsActive = function() return false end
- return
- end
-
- -- verify change
- if B.PlayerCurrentSpec == spec or B.PlayerClass == class then
- return
- end
- B.PlayerCurrentSpec = spec
- B.PlayerClass = class
-
- local test = B.ClassRaidBuffs
- local buffTypes = {}
- local auraTypes = {}
- for i = 1, NUM_LE_RAID_BUFF_TYPES do
- local name, filters
- if test[i] and test[i][class] then
- playerBuffs[i], name, filters = IsBuffAvailable(test[i][class])
- else
- playerBuffs[i] = nil
- end
-
- if name then
- B.UpdateBuffStatus(name, filters)
- end
- end
-end
-
--- Called once to setup the ConsolidatedBuffs stencil
-local consolidatedBuffsLoaded
-M.SetConsolidatedBuffs = function()
- local print = fprint()
- c = displays.ConsolidatedBuff.conf
- parentFrame = B.guides[c.Parent][c.Position]
- raidbuffsFrame = B.anchor.ConsolidatedBuff
-
- B.SetConfigLayers(raidbuffsFrame)
- consolidatedBuffsLoaded = true
- ConsolidatedBuffs:ClearAllPoints()
- ConsolidatedBuffs:SetAllPoints(parentFrame.icon)
- if c.Icon then
- ConsolidatedBuffsIcon:SetAllPoints(parentFrame.icon)
- ConsolidatedBuffsIcon:SetTexCoord(0.609,0.89,0.215,0.78)
- else
- ConsolidatedBuffsIcon:Hide()
- end
-
- ConsolidatedBuffsCount:Hide()
-end
-
-local missingTypes = {}
-local raidBuffsInitialized
-M.UpdateRaidBuffs = function()
- local print = fprint()
- if not consolidatedBuffsLoaded then
- M.SetConsolidatedBuffs()
- end
-
- if not M.ShowConsolidated or not parentFrame.contains then
- print(' hiding raid buffs square')
- if raidBuffsInitialized then
- for i = 1, 9 do
- if raidBuffs[i] then
- raidBuffs[i]:Hide()
- end
- end
- raidBuffsInitialized = nil
- end
- if parentFrame then
- print(c.Parent, c.Position)
- print('de-flagging parent')
- parentFrame.contains = nil
- end
- raidbuffsFrame:Hide()
- return
- end
-
- local c = B.displays.ConsolidatedBuff.conf
- if parentFrame and not parentFrame.contains then
- raidBuffsInitialized = true
- print('re-flagging parent', parentFrame:GetName())
- parentFrame.contains = parentFrame
- B.decors[c.Parent][c.Position]:Hide()
- raidbuffsFrame:Show()
-
- -- make sure parent icon is updated
- local w = c.Size*c.PerRow+c.Spacing*(c.PerRow-1)+c.Border*2
- parentFrame:SetSize(w, w)
- parentFrame.icon:SetSize(w - c.Border*2, w - c.Border*2)
- parentFrame.contains = raidbuffsFrame
-
- M.UpdateBuffs(c.Parent)
- end
-
- -- have to loop again due to tainting restrictions
- -- could compare the tooltip font object pointers, but that may change
- local buffStack = GetRaidBuffInfo()
- print(GetRaidBuffInfo())
- local guides = B.guides.ConsolidatedBuff
- local numBuffs = 0
- local numAvailable = 0
- local mask = 1
- if buffStack == nil then
- return -- discard
- end
-
-
- for i = 1, NUM_LE_RAID_BUFF_TYPES do
- local available = (band(buffStack, mask) > 0)
- local name, _, icon, start, duration, spellID, slot = GetRaidBuffTrayAuraInfo(i)
- print(i, name, icon, available)
-
- raidBuffs[i] = raidBuffs[i] or CreateFrame('Frame', 'VeneerRaidBuff' .. i, raidbuffsFrame, 'VeneerRaidBuffTemplate')
- local buff = raidBuffs[i]
- if not raidBuffs[i].stylized then
- print(' setting style', i)
- buff.stylized = true
- buff.symbol:SetText(raidBuffSymbols[i])
- buff.symbol:SetFont("Fonts\\FRIZQT__.TTF", 10, 'OUTLINE')
- buff:SetSize(parentFrame.icon:GetWidth()/c.PerRow,parentFrame.icon:GetWidth()/c.PerRow)
- buff.symbolName = raidBuffSymbols[i]
-
- buff.icon:SetAllPoints(guides[i].icon)
- buff:SetAllPoints(guides[i])
- raidbuffsFrame.Zoom(buff.icon)
- end
-
- buff:Show()
- local buffStyle = 'missing'
- if name then
- buff:Show()
- buff.symbol:Hide()
- missingTypes[i] = nil
- numBuffs = numBuffs + 1
- numAvailable = numAvailable + 1
- buffStyle = 'active'
- else
- buff.symbol:Show()
- if band(buffStack, mask) > 0 then
- buffStyle = 'available'
- numAvailable = numAvailable + 1
- else
- buffStyle = 'missing'
- icon = ''
- end
- end
- mask = lshift(mask, 1)
-
- M.UpdateBuffStyle(buff, buffStyle, icon)
- end
-
- -- todo: filter by castable and suppress for non-overlapping auras
-
- raidbuffsFrame.label:SetText(numBuffs..'/'..numAvailable)
- print(parentFrame:GetName(), parentFrame:GetSize())
-
- if B.ShowMissingBuffs then
- B.UpdateMissingBuffs()
- elseif missingBuffsAnchor and missingBuffsAnchor:IsVisible() then
- for i = 1, NUM_LE_MISSING_RAID_BUFFS do
- missingBuffs[i]:Hide()
- end
- end
-end
-
-B.UpdateMissingBuffs = function()
- local print = B.fprint()
- local numMissing = 0
-
- local firstMissing, lastMissing
- for i = 1, NUM_LE_RAID_BUFF_TYPES do
- local name, _, icon, start, duration, spellID, slot = GetRaidBuffTrayAuraInfo(i)
-
- if not name then
- numMissing = numMissing + 1
-
- print('missing buff', i, numMissing)
- B.UpdateBuffStyle(raidBuffs[i].icon, 'missing', "")
-
- missingBuffs[numMissing] = missingBuffs[numMissing] or CreateFrame('Button', 'VeneerMissingBuff' .. numMissing, raidbuffsFrame, 'VeneerMissingBuffTemplate')
-
- local missing = missingBuffs[numMissing]
-
- missing:Show()
- missing:SetSize(c.Size*c.PerRow, c.Size)
- if numMissing == 1 then
- firstMissing = missing
- else
- missing:SetPoint('TOP', lastMissing, 'BOTTOM', 0, -c.Spacing)
- end
-
- missing.label:SetText(_G['RAID_BUFF_'.. i])
- lastMissing = missing
-
- end
- end
-
- if firstMissing then
- print(firstMissing:GetName(), raidbuffsFrame)
- firstMissing:SetPoint('TOPRIGHT', raidbuffsFrame.label, 'BOTTOMRIGHT', 0, c.Spacing)
- missingBuffsAnchor = firstMissing
- end
-
- for i = numMissing +1, NUM_LE_MISSING_RAID_BUFFS do
- missingBuffs[i]:Hide()
- end
- NUM_LE_MISSING_RAID_BUFFS = numMissing
-end
\ No newline at end of file
diff -r aa693607b813 -r 1a322b92dbfa TimeManager/TimeManager.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/TimeManager/TimeManager.lua Thu Apr 28 05:54:21 2016 -0400
@@ -0,0 +1,37 @@
+--------------------------------------------
+-- Veneer
+-- Krakyn
+-- @project-revision@ @project-hash@
+-- @file-revision@ @file-hash@
+-- Created: 4/27/2016 1:02 AM
+--------------------------------------------
+
+local B, _G = select(2,...).frame, _G
+local clock = B:RegisterModule("Clock", VeneerClock)
+local weekDays = {'Su', 'M', 'T', 'W', 'R' ,'F', 'Sa' }
+
+local print = B.print('XML')
+
+clock.OnUpdate = function(self)
+ local weekday, month, day, year = CalendarGetDate()
+ local hour, min = GetGameTime()
+ if hour > 12 then
+ hour = hour - 12
+ end
+ self.time:SetFormattedText("|cAAFFFFFF%s|r |cFF44FFFF%s|r|c88FFFFFF/|r|cFF44FFFF%s|r %d:%02d", weekDays[weekday], month, day, hour, min)
+end
+
+clock.OnMouseUp = function(self, button)
+ if button == 'RightButton' then
+ if self:IsVisible() then
+ self:Hide()
+ else
+ self:Show()
+ end
+ end
+end
+
+function clock:OnInitialize()
+ print('clock thing')
+ self:Show()
+end
\ No newline at end of file
diff -r aa693607b813 -r 1a322b92dbfa TimeManager/TimeManager.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/TimeManager/TimeManager.xml Thu Apr 28 05:54:21 2016 -0400
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff -r aa693607b813 -r 1a322b92dbfa Veneer.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Veneer.lua Thu Apr 28 05:54:21 2016 -0400
@@ -0,0 +1,569 @@
+--- Modulizer framework
+-- OnInitialize
+-- OnUpdate
+-- OnEnable -- run when GetSpecialization() returns true
+
+local ADDON, A = ...
+Veneer = Veneer or CreateFrame('Frame', 'Veneer', UIParent)
+local B = Veneer
+local wipe, min, max, random, tinsert, tremove = table.wipe, math.min, math.max, math.random, table.insert, table.remove
+local pairs, ipairs, select, unpack, _G = pairs, ipairs, select, unpack, _G
+local type, tostring, format = type, tostring, string.format
+A.frame = B
+
+--- Cache tables
+local initOnced
+local modules = {}
+local queuedModules = {}
+local checkForConfig = {}
+local moduleStack = {
+}
+
+--- Utilities
+B.wipeall = function (...)
+ for i = 1, select('#', ...) do
+ wipe(select(i, ...))
+ end
+end
+
+--- Various region categories
+B.displays = {}
+B.configLayers = {}
+B.configLayersRef = {}
+
+
+--@debug@
+--- Generates a print handler pointing to a static channel signature
+-- @usage func = B.print(sig)
+-- @param sig channel name or number
+local printfuncs = {}
+B.print = function(pref, ...)
+ if Devian and Devian.InWorkspace() then
+ printfuncs[pref] = printfuncs[pref] or function(...) print(pref, ...) end
+
+ return printfuncs[pref]
+ else
+ return function () end
+ end
+end
+
+local rgb = {}
+local getcolor = function()
+ local n, p = 0, 4
+ for i = 1, 3 do
+ rgb[i] = min(random(n,p) * 64, 255)
+ if rgb[i] == 255 then
+ p = 4
+ elseif rgb[i] > 0 then
+ n = 2
+ end
+ end
+ return unpack(rgb)
+end
+
+local color = {}
+local fprints = {}
+B.fprint = function()
+ if not (Devian and Devian.InWorkspace()) then
+ return function() end
+ end
+
+
+ local sig = debugstack(2,1)
+ if fprints[sig] then
+ return fprints[sig]
+ end
+
+ local func = sig:match("%`(%a+)%'")
+ if not func then
+ func = sig:match("<(.-)>")
+ end
+ func = func:gsub('(%l+)(%u)', function(a, b) return a:sub(0,2) .. b end, 1)
+ func = func:gsub('^.+%\\', '')
+ if not func then
+ func = 'noname'
+ end
+
+ local r, g, b = getcolor()
+ color[sig] = color[sig] or format('|cFF%02X%02X%02X%s|r', r, g, b, func)
+
+ --print(color[func] .. ' ( ' .. table.concat(args, ', ')..' )' )
+ func = B.print(func)
+ fprints[sig] = func
+ return func
+end
+
+--@end-debug@
+--[=[@non-debug@
+B.print = function() end
+--@end-non-debug@]=]
+
+-- for the Mikk script
+-- GLOBALS: NUM_LE_RAID_BUFF_TYPES
+-- GLOBALS: BUFF_FLASH_TIME_ON, BUFF_FLASH_TIME_OFF, BUFF_MIN_ALPHA, BUFF_WARNING_TIME, BUFF_DURATION_WARNING_TIME
+-- GLOBALS: BUFFS_PER_ROW, BUFF_MAX_DISPLAY, BUFF_ACTUAL_DISPLAY, DEBUFF_MAX_DISPLAY, DEBUFF_ACTUAL_DISPLAY, BUFF_ROW_SPACING
+-- GLOBALS: CONSOLIDATED_BUFFS_PER_ROW, CONSOLIDATED_BUFF_ROW_HEIGHT, NUM_TEMP_ENCHANT_FRAMES
+-- GLOBALS: BUFF_BUTTON_HEIGHT, BUFF_FRAME_BASE_EXTENT, BUFF_HORIZ_SPACING
+
+local print = B.print('Bfl')
+
+--- Template for making perpendicular traversals of the displays structure; also makes sure the table is there
+B.Abstract = function(dest, key, table)
+ if table then
+ for _, v in pairs(dest) do
+ v[key] = {}
+ end
+ end
+ B[key] = setmetatable({}, {
+ __index = function(t, k)
+ return dest[k][key]
+ end,
+ __newindex = function(_, k, v)
+ print('abstract write ('..key..'):', k)
+ dest[k][key] = v
+ end,
+ __tostring = function() return 'Abstract:'..key..'' end
+ })
+
+
+ return B[key]
+end
+
+
+--- localize for speed
+local layers, refs, displays = B.configLayers, B.configLayersRef, B.displays
+
+local ModulesCall = function(func, flag)
+
+ local n = 0
+ for i = 1, #moduleStack do
+ print('calling level '..i)
+ local stackset = moduleStack[i]
+
+ for name, module in pairs(stackset) do
+ n = n + 1
+
+
+ if module[func] then
+ -- nil = pass
+ if not flag or module.Conf[flag] then
+ if (flag) then
+ print(' check', flag, '=', module.Conf[flag])
+ end
+
+ print(' ',n..' '..name..'.'..func..'()')
+ module[func](module, module.Conf)
+ end
+
+ end
+ end
+ end
+end
+
+
+local Enable = function()
+end
+
+--- The things that happen repeatedly
+local Init = function ()
+end
+
+
+--- Things that happen immediately upon entering world
+local InitOnce = function()
+ print('entering world first time')
+ local defaults = B.ConfDefaults
+ print('|cFFFFFF00Veneer|r')
+ if not VeneerData then
+ VeneerData = {}
+ for k,v in pairs(defaults) do
+
+
+ VeneerData[k] = v
+ end
+ print('Veneer defaults being used.')
+ end
+
+ B.Conf = setmetatable(VeneerData, {__index = function(_, k) return defaults[k] end})
+
+
+
+ -- suffix tables
+ for name, display in pairs(displays) do
+ display.conf = setmetatable({}, {
+ __index = function(_, k)
+ --print('config check '.. name .. k)
+ return B.Conf[name .. k] or B.Conf['BuffButton' .. k]
+ end,
+ __newindex = function(_, k , v)
+ B.Conf[name..k] = v
+ end,
+ })
+ end
+
+ -- To ensure that modules are run in controlled order, walk the dependency list; if the dep shows up
+ -- in the loaded manifest, remove the value. If the dep list isn't empty, move that module to the next
+ -- layer.
+ local loaded = {}
+ local stackLevels = #moduleStack
+ local i = 1
+ moduleStack[1] = modules
+ repeat
+ print('setting init level '.. i)
+ local queue = moduleStack[i]
+ for name, module in pairs(queue) do
+
+ if queuedModules[name] and #queuedModules[name] > 0 then
+ local p = #queuedModules[name]
+ for j = 1, p do
+ local dep = queuedModules[name][j]
+
+ if loaded[dep] then
+ print( ' ' .. dep .. ' OK')
+ queuedModules[name][j] = nil
+ for k = j, p do
+ print(' shift ' .. (k+1) .. ' ('..tostring(queuedModules[name][k+1])..') to ' .. k ..'')
+ queuedModules[name][k] = queuedModules[name][k+1]
+ end
+ end
+ end
+
+ if #queuedModules[name] == 0 then
+ queuedModules[name] = nil
+ print(' |cFF00FFFF'.. name ..'|r deps OK')
+ loaded[name] = true
+ else
+
+ print(' |cFFFF8800' .. name ..'|r pending')
+ local next = i+1
+ if not moduleStack[next] then
+ moduleStack[next] = {}
+ end
+ stackLevels = next
+ moduleStack[next][name] = module
+ queue[name] = nil
+ end
+
+ else
+ print(' |cFF00FF00'.. name ..'|r no deps')
+ loaded[name] = true
+ end
+ end
+ i = i + 1
+ until i > stackLevels
+
+
+ for level, batch in ipairs(moduleStack) do
+ print('config level', level)
+ for name, module in pairs(batch) do
+ if not VeneerData[name] then
+ VeneerData[name] = {}
+ end
+
+ if module.defaults then
+ print('setting defaults for module', name)
+ --[===[@non-debug@
+ if not VeneerData[name] then
+ --@end-non-debug@]===]
+ VeneerData[name] = {}
+ --[===[@non-debug@
+ end
+ --@end-non-debug@]===]
+ for k,v in pairs(module.defaults) do
+ VeneerData[name][k] = v
+ end
+ module.Conf = VeneerData[name]
+ end
+
+ if VeneerData[name].enabled == nil then
+ VeneerData[name].enabled = true
+ end
+
+ end
+ end
+
+
+ if #checkForConfig >= 1 then
+ local queuedFrame = tremove(checkForConfig)
+ while queuedFrame do
+ B.SetConfigLayers(queuedFrame)
+ B.UpdateXMLFrame(queuedFrame)
+ queuedFrame = tremove(checkForConfig)
+ end
+ end
+ -- remove from existing
+end
+
+--- Fires an update to all modules
+local lastUpdate
+function B.UpdateAll(...)
+ lastUpdate = GetTime()
+ ModulesCall('OnUpdate')
+end
+
+B:RegisterEvent('PLAYER_ENTERING_WORLD')
+B:SetScript('OnEvent', function(self, event)
+ if event == 'PLAYER_ENTERING_WORLD' then
+ if not initOnced then
+ InitOnce()
+ ModulesCall('OnInitialize')
+ initOnced = true
+ C_Timer.After(1, function()
+ if GetSpecialization() then
+ print(GetSpecialization(), 'enabling')
+
+ ModulesCall('OnEnable', 'enabled')
+ B:SetScript('OnUpdate', nil)
+ end
+ end)
+ end
+ end
+
+ B.UpdateAll()
+
+ if event == 'PLAYER_ENTERING_WORLD' then
+ B.UpdateConfigLayers()
+ end
+
+end)
+
+--- Modulizer method
+--
+function B:RegisterModule (name, module, ...)
+ if modules[name] then
+ print('pulling modules[|cFFFF8800'.. tostring(name) ..'|r]')
+ return modules[name]
+ end
+
+ print('new module |cFF00BBFF'.. tostring(name) ..'|r')
+ if module then
+ if modules[name] then
+ error("Module table for '"..tostring(name).."' already exists.")
+ end
+ else
+ module = CreateFrame('Frame', 'Veneer' .. tostring(name) .. 'Handler', B, 'VeneerHandlerTemplate')
+ end
+ modules[name] = module
+ B[name] = module
+ if select('#', ...) >= 1 then
+ local numDeps = select('#', ...)
+ print(' '..numDeps..' deps detected')
+ for i = 1, numDeps do
+ local dep = select(i, ...)
+ -- means that init/enable funcs are ordered to run after deps do their things
+ queuedModules[name] = queuedModules[name] or {}
+ tinsert(queuedModules[name], dep)
+ print(' needs '..dep)
+ end
+ end
+ return module
+end
+
+
+B.SetConfigLayers = function(frame)
+ local print = B.fprint()
+ if not frame.config then
+ --print(frame:GetName(), 'has no config layers')
+ return
+ end
+ --print('Registering config layers from', frame:GetName())
+
+ for i, subframe in ipairs(frame.config) do
+ -- make sure there are no duplicates
+ if not refs[subframe] then
+ local key = #layers+1
+ layers[key] = subframe
+ refs[subframe] = key
+ end
+ --print(' ', i, subframe:GetName())
+ end
+end
+
+B.RemoveConfigLayers = function(frame)
+
+ local print = B.fprint()
+ print('|cFFFF0000RemoveConfigLayers', frame:GetName())
+ for i, subframe in pairs(layers) do
+ if subframe:GetParent() == frame then
+ print('|cFFFF8800 ', subframe:GetParent():GetName(), '|cFFFFFF00', subframe:GetName())
+ layers[i]:Hide()
+ layers[i] = nil
+ refs[subframe] = nil
+ end
+ end
+end
+
+B.UpdateConfigLayers = function()
+ local print = B.fprint()
+ local func = B.Conf.GuidesMode and 'Show' or 'Hide'
+ local numAnchors = 0
+ for name, display in pairs(displays) do
+ numAnchors = numAnchors + 1
+ display.anchor:EnableMouse(B.Conf.GuidesMode)
+ if B.Conf.GuidesMode then
+ display.anchor:SetScript('OnUpdate', display.anchor.OnUpdate)
+ else
+ display.anchor:SetScript('OnUpdate', nil)
+
+ for i, anchorButton in ipairs(display.anchor.anchorButton) do
+ anchorButton:Hide()
+ end
+
+ end
+ --print(B.Conf.ConfigMode)
+ display.anchor:EnableMouse(B.Conf.ConfigMode)
+ end
+ for id, region in pairs(layers) do
+ --print(id, region:GetName(), func)
+ region[func](region)
+ end
+
+ --print('['..func..'] updated', #layers, 'regions,', numAnchors, 'frames')
+end
+
+local XMLFrame_Enable = function(self, value)
+ local name = self:GetName()
+ local print = B.print('XML')
+
+ if not B.Conf[name] then
+ B.Conf[name] = {
+ enabled = true
+ }
+ end
+
+ print()
+ local enabled
+ if value == nil then
+ if B.Conf[name].enabled == nil then
+ print('toggle based on visibility')
+ enabled = (not self:IsVisible()) and true or false
+ else
+ print('toggle a config value =', B.Conf[name].enabled)
+ enabled = B.Conf[name].enabled
+ end
+
+ enabled = (enabled ~= true) and true or false
+ else
+ print('use argument value', value)
+ enabled = value
+ end
+
+ print('arg =', value, 'conf =', B.Conf[name].enabled, 'result=', enabled)
+
+ B.Conf[name].enabled = enabled
+
+ local stateFunc = enabled and 'Show' or 'Hide'
+ local eventFunc = enabled and 'OnToggle' or 'OnToggle'
+ --- taggled layers
+ if self.toggled then
+ for i, region in pairs(self.toggled) do
+ region[stateFunc](region)
+ end
+ end
+ --- toggle action
+ if self.OnToggle then
+ self:OnToggle(B.Conf[name].enabled)
+ end
+ --- do enable
+ if B.Conf[name].enabled then
+ if self.OnEnable then
+ self:OnEnable()
+ end
+ else
+ if self.OnDisable then
+ self:OnDisable()
+ end
+ end
+end
+--- Generic handlers for keeping track of XML-defined frames
+local print = B.print('XML')
+B.prototypes = {}
+B.prototypes.OnDragStart = function(self)
+ local print = B.print('XML')
+ self.xA = self:GetLeft()
+ self.yA = self:GetBottom()
+ self.anchorTo, self.relativeTo, self.relativePoint, self.x, self.y = self:GetPoint(1)
+ print('acquire anchor', self:GetPoint(1))
+ print(self:GetName(), 'start moving ('..self.x..', '..self.y..')')
+ self:StartMoving()
+end
+
+B.prototypes.OnDragStop = function(self)
+ local print = B.print('XML')
+ local name = self:GetName()
+ print(name, 'stop moving ('..self:GetLeft()..', '..self:GetBottom()..')')
+ local xB = self:GetLeft() - self.xA
+ local yB = self:GetBottom() - self.yA
+ print('storing anchor point', self.anchorTo, self.relativePoint, self.x + xB, self.y + yB)
+
+ self:StopMovingOrSizing()
+ B.Conf[name].position = {self.anchorTo, self.relativePoint, self.x + xB, self.y + yB}
+ B.UpdateXMLFrame(self)
+end
+
+
+B.RegisterModuleFrame = function(self, moduleName)
+ local print = B.print('XML')
+ local name = self:GetName()
+ tinsert(checkForConfig, self)
+ self.Enable = XMLFrame_Enable
+ self.moduleName = moduleName
+ print('|cFF00FF00XML stuff related to '.. tostring(moduleName) .. ':', self:GetName())
+ ------------------------------------------------------------------------------------------
+ if not B[name] then
+ return
+ end
+
+ local scriptTypes = {'OnUpdate', 'OnEvent', 'OnDragStart', 'OnDragStop'}
+ for script in next(scriptTypes) do
+ if B[name][script] then
+ self:SetScript(script, B[name][script])
+ end
+ end
+
+end
+
+B.UpdateXMLFrame = function(self)
+ local print = B.print('XML')
+
+ local name = self:GetName()
+
+
+ if self.drag then
+ self:RegisterForDrag('LeftButton')
+ self:SetScript('OnDragStart', XMLFrame_OnDragStart)
+ if self.OnDragStop then
+ self:SetScript('OnDragStop', function(self, ...)
+ print('|cFFFF0088end of dragging')
+ self:OnDragStop(self, ...)
+ XMLFrame_OnDragStop(self, ...)
+ end)
+ else
+ self:SetScript('OnDragStop', XMLFrame_OnDragStop)
+ end
+ else
+ self:EnableMouse(false)
+ end
+
+ if not B.Conf[name] then
+ B.Conf[name] = {
+ enabled = self.enabled,
+ }
+ end
+ local c = B.Conf[name]
+
+ if not c.position then
+ local anchor, _, point, x, y = self:GetPoint(1)
+ print('seeding default position', anchor, point, x, y)
+ c.position = {anchor, point, x, y}
+ else
+
+ print('restoring frame position', unpack(c.position))
+ self:ClearAllPoints()
+ local anchorTo, relativePoint, x, y = unpack(c.position)
+ self:SetPoint(anchorTo, UIParent, relativePoint, x, y)
+ end
+ self:Enable(c.enabled)
+
+
+end
diff -r aa693607b813 -r 1a322b92dbfa Veneer.toc
--- a/Veneer.toc Tue Apr 26 15:05:38 2016 -0400
+++ b/Veneer.toc Thu Apr 28 05:54:21 2016 -0400
@@ -8,6 +8,9 @@
## DefaultState: Enabled
## LoadOnDemand: 0
## OptionalDeps: Devian
-Core.xml
-BuffFrame.xml
-ObjectiveTracker\ObjectiveTracker.xml
\ No newline at end of file
+
+Veneer.xml
+#Config\Config.xml
+BuffFrame\BuffFrame.xml
+#ObjectiveTracker\ObjectiveTracker.xml
+#TimeManager\TimeManager.xml
\ No newline at end of file
diff -r aa693607b813 -r 1a322b92dbfa Veneer.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Veneer.xml Thu Apr 28 05:54:21 2016 -0400
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self:RegisterForDrag('LeftButton')
+
+
+ self:StartMoving()
+
+
+ self:StopMovingOrSizing()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file