Mercurial > wow > buffalo2
comparison BuffAnchors.lua @ 0:3dbcad2b387d
initial push
| author | Nenue |
|---|---|
| date | Wed, 30 Mar 2016 02:24:56 -0400 |
| parents | |
| children | 66b927b46776 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:3dbcad2b387d |
|---|---|
| 1 --- ${PACKAGE_NAME} | |
| 2 -- @file-author@ | |
| 3 -- @project-revision@ @project-hash@ | |
| 4 -- @file-revision@ @file-hash@ | |
| 5 -- Created: 3/22/2016 3:10 AM | |
| 6 | |
| 7 local MODULE = 'BuffFrame' | |
| 8 local _, A = ... | |
| 9 local B, _G = A.frame, _G | |
| 10 local M = B:RegisterModule(MODULE) | |
| 11 local type, unpack, select, pairs, ipairs, wipe = type, unpack, select, pairs, ipairs, table.wipe | |
| 12 local min, ceil, mod, tonumber, tostring = min, ceil, mod, tonumber, tostring | |
| 13 local CreateFrame = CreateFrame | |
| 14 local print = B.print('Anchor') | |
| 15 local fprint = B.fprint | |
| 16 local bprint = B.print('AnchorFrame') | |
| 17 | |
| 18 local GetAnchorFrame = function(name) | |
| 19 local c = B.displays[name].conf | |
| 20 local anchorFrom, anchorParent, anchorTo, offsetX, offsetY = unpack(c.Anchor) | |
| 21 local print = bprint | |
| 22 if B.anchor[name] then | |
| 23 print('get', B.anchor[name]:GetName()) | |
| 24 return B.anchor[name], anchorFrom, anchorParent, anchorTo, offsetX, offsetY | |
| 25 end | |
| 26 print('new frame', name) | |
| 27 local frame = CreateFrame('Frame', name..'Anchor', UIParent, B.displays[name].anchorTemplate) | |
| 28 frame.conf = c | |
| 29 | |
| 30 local x, dx, y, dy | |
| 31 local Anchor_OnMouseDown = function() | |
| 32 if c['Parent'] then | |
| 33 return | |
| 34 end | |
| 35 | |
| 36 x = frame:GetLeft() | |
| 37 y = frame:GetTop() | |
| 38 frame:StartMoving() | |
| 39 frame.isMoving = true | |
| 40 end | |
| 41 | |
| 42 local Anchor_OnMouseUp = function() | |
| 43 if c['Parent'] then | |
| 44 return | |
| 45 end | |
| 46 | |
| 47 frame:StopMovingOrSizing() | |
| 48 dx = frame:GetLeft() - x | |
| 49 dy = frame:GetTop() - y | |
| 50 -- update config | |
| 51 print('|cFFFFFF00**changing', name, 'anchor by', dx, dy) | |
| 52 offsetX = offsetX + dx | |
| 53 offsetY = offsetY + dy | |
| 54 B.Conf[name .. 'Anchor'] = {anchorFrom, anchorParent, anchorTo, offsetX, offsetY } | |
| 55 frame:SetPoint(anchorFrom, _G[anchorParent], anchorTo, offsetX, offsetY) | |
| 56 frame.isMoving = nil | |
| 57 end | |
| 58 | |
| 59 local AnchorButton_OnClick = function(self, anchor) | |
| 60 local point, parent, relative = anchor:GetPoint(1) | |
| 61 print('resetting anchors', point, parent:GetName(), relative) | |
| 62 B.Conf[name..'Point'] = {point, relative} | |
| 63 B.Conf[name..'RelativeX'] = (point:match('RIGHT')) and -1 or 1 | |
| 64 B.Conf[name..'RelativeY'] = (point:match('TOP')) and -1 or 1 | |
| 65 wipe(B.drawn[name]) | |
| 66 B.UpdateBuffs(name) | |
| 67 end | |
| 68 | |
| 69 frame.OnUpdate = function(self, elapsed) | |
| 70 print(self:GetName(), elapsed) | |
| 71 if self:IsMouseOver() then | |
| 72 for i, anchorButton in ipairs(frame.anchorButton) do | |
| 73 anchorButton:Show() | |
| 74 end | |
| 75 else | |
| 76 for i, anchorButton in ipairs(frame.anchorButton) do | |
| 77 anchorButton:Hide() | |
| 78 end | |
| 79 end | |
| 80 end | |
| 81 | |
| 82 frame:SetScript('OnMouseDown', Anchor_OnMouseDown) | |
| 83 frame:SetScript("OnMouseUp", Anchor_OnMouseUp) | |
| 84 -- table addition | |
| 85 for i, anchorButton in ipairs(frame.anchorButton) do | |
| 86 anchorButton:SetScript('OnClick', AnchorButton_OnClick) | |
| 87 end | |
| 88 | |
| 89 B.displays[name].anchor = frame | |
| 90 print(B.displays[name].anchor:GetName()) | |
| 91 print(B.anchor[name]:GetName()) | |
| 92 return frame, anchorFrom, anchorParent, anchorTo, offsetX, offsetY | |
| 93 end | |
| 94 | |
| 95 --- Handles the preliminary positioning calculation for buff guide anchors | |
| 96 M.UpdateAnchorFrames = function(name) | |
| 97 local print = fprint(name) | |
| 98 local c = B.displays[name].conf | |
| 99 local frame, anchorFrom, anchorParent, anchorTo, offsetX, offsetY = GetAnchorFrame(name) | |
| 100 print('got', frame:GetName()) | |
| 101 frame.buffs = B.guides[name] | |
| 102 frame.heading:SetText(name) | |
| 103 B.SetConfigLayers(frame) | |
| 104 | |
| 105 local buffMax = c['Max'] or 3 | |
| 106 local perRow = c['PerRow'] or 2 | |
| 107 local buffSpacing = c['Spacing'] | |
| 108 local buffSize = c['Size'] | |
| 109 local buffDurationSize = c['DurationSize'] | |
| 110 | |
| 111 if not frame.isMoving then | |
| 112 if not B.Conf[name .. 'Parent'] then | |
| 113 frame:SetPoint(anchorFrom, _G[anchorParent], anchorTo, offsetX, offsetY) | |
| 114 end | |
| 115 end | |
| 116 | |
| 117 if frame.contains then buffMax = buffMax + 1 end | |
| 118 local cols, rows = min(perRow, buffMax), ceil(buffMax/perRow) | |
| 119 local spaces, breaks = (cols - 1), (rows - 1) | |
| 120 frame.columns = cols | |
| 121 frame.rows = rows | |
| 122 frame.spaces = cols - 1 | |
| 123 frame.breaks = rows - 1 | |
| 124 | |
| 125 local width = cols*buffSize + spaces*buffSpacing | |
| 126 local height = rows * (buffSize + buffDurationSize) + (breaks * (buffSpacing)) | |
| 127 | |
| 128 frame:SetSize(width, height) | |
| 129 frame:Show() | |
| 130 print(frame:GetName(), frame:GetSize()) | |
| 131 print(frame:GetPoint(1)) | |
| 132 end | |
| 133 | |
| 134 --- Handles placement of anchors embedded within anchors (consolidated buffs, maybe temp enchant) | |
| 135 M.UpdateAnchorAnchors = function() | |
| 136 local print = fprint() | |
| 137 for buttonName, d in pairs(B.displays) do | |
| 138 local c = B.displays[buttonName].conf | |
| 139 local frame = B.anchor[buttonName] | |
| 140 local parent, child = c.Parent, c.Position | |
| 141 | |
| 142 frame.parent = nil | |
| 143 if B.Conf[buttonName .. 'Parent'] and _G[B.Conf[buttonName .. 'Parent']..'Anchor'] then | |
| 144 | |
| 145 local anchorAnchor = _G[B.Conf[buttonName .. 'Parent']..'Anchor'] | |
| 146 local anchorTarget = B.guides[parent][child] | |
| 147 if anchorTarget then | |
| 148 print('link', buttonName, 'to', parent, child) | |
| 149 print(parent, child, B.displays[parent].guides[child]) | |
| 150 local ac = B.displays[parent].conf | |
| 151 local anchorFrom, anchorTo = unpack(ac.Point) | |
| 152 frame:ClearAllPoints() | |
| 153 frame:SetPoint(anchorFrom, anchorTarget, anchorTo) | |
| 154 frame.parent = anchorTarget | |
| 155 anchorTarget.contains = frame | |
| 156 anchorAnchor.contains = frame | |
| 157 anchorAnchor.containPosition = child | |
| 158 else | |
| 159 frame.parent = anchorAnchor | |
| 160 anchorAnchor.contains = frame | |
| 161 anchorAnchor.containPosition = nil | |
| 162 end | |
| 163 else | |
| 164 frame.parent = nil | |
| 165 end | |
| 166 | |
| 167 end | |
| 168 end | |
| 169 | |
| 170 -- if facing key direction, anchor point [1] to parent's point [2] | |
| 171 local childFacing = { | |
| 172 ['TOP'] = {'TOP', 'BOTTOM'}, | |
| 173 ['BOTTOM'] = {'BOTTOM', 'TOP'}, | |
| 174 ['RIGHT'] = {'LEFT', 'RIGHT'}, | |
| 175 ['LEFT'] = {'RIGHT', 'LEFT'}, | |
| 176 } | |
| 177 -- if align in key position, concatenate value with facing point | |
| 178 local childAlign = { | |
| 179 ['TOP'] = 'TOP%s', | |
| 180 ['BOTTOM'] = 'BOTTOM%s', | |
| 181 ['MIDDLE'] = '%s', | |
| 182 ['LEFT'] = '%sLEFT', | |
| 183 ['RIGHT'] = '%sRIGHT', | |
| 184 ['CENTER'] = '%s', | |
| 185 } | |
| 186 | |
| 187 --- dep handlers | |
| 188 B.UpdateAnchorChild = function (frame, child, c) | |
| 189 if frame.attached ~= child then | |
| 190 B.SetAnchorChild(frame, child, c) | |
| 191 end | |
| 192 | |
| 193 print('positioning|cFFFF0088', child, '|r of |cFF00FF00', frame, '|r') | |
| 194 | |
| 195 local frameAnchor = unpack(B.Conf[c.Parent.. 'Anchor']) | |
| 196 local childAnchor, childPoint = 'BOTTOMRIGHT', 'TOPRIGHT' | |
| 197 local direction, position = unpack(c.Anchor) | |
| 198 if direction and position then | |
| 199 childAnchor = childAlign[position]:format(childFacing[direction][2]) | |
| 200 childPoint = childAlign[position]:format(childFacing[direction][1]) | |
| 201 print('align toward', position,'on', direction, 'edge') | |
| 202 end | |
| 203 | |
| 204 print(frameAnchor, direction, position) | |
| 205 local lX, lY, cX, cY = frame.outer_X, frame.outer_Y, frame.cutout_X, frame.cutout_Y | |
| 206 local mX, mY = 0, 0 -- alignment modifiers | |
| 207 local pX, pY = 0, 0 -- position value | |
| 208 print('|cFFFF0088PUSHOUTS|r:', lX, lY, '|cFFFF8800PULL-IN|r:', cX, cY) | |
| 209 | |
| 210 -- if attachment is on a moving edge | |
| 211 if not frameAnchor:match(direction) then | |
| 212 print(' child anchors to a growing edge |cFFFF8800', direction,'|r') | |
| 213 if direction == 'BOTTOM' then | |
| 214 -- horizontal edge | |
| 215 | |
| 216 else | |
| 217 -- vertical edge | |
| 218 pX = lX | |
| 219 end | |
| 220 | |
| 221 if frameAnchor:match(position) then | |
| 222 | |
| 223 print('close alignment', lX, cX) | |
| 224 if position == 'RIGHT' then | |
| 225 -- and far X val | |
| 226 pX = 0 | |
| 227 lX = -lX | |
| 228 cX = -cX | |
| 229 pY = lY | |
| 230 else | |
| 231 end | |
| 232 else | |
| 233 print('far alignment', position) | |
| 234 end | |
| 235 else | |
| 236 print(' child anchors to a static edge |cFF0088FF', direction,'|r') | |
| 237 -- use no Y offset, position doesn't interfere | |
| 238 if direction == 'BOTTOM' or direction == 'TOP' then | |
| 239 pY = 0 | |
| 240 else | |
| 241 pX = 0 | |
| 242 end | |
| 243 end | |
| 244 | |
| 245 local frameWidth = frame:GetWidth() | |
| 246 local frameHeight = frame:GetHeight() | |
| 247 | |
| 248 local overlapY, overlapX | |
| 249 | |
| 250 -- right and bottom anchors offsets need to be inverted | |
| 251 if direction == 'BOTTOM' then | |
| 252 print('inverting Y values for anchor on BOTTOM edge, options:', cY, lY, 'actual:', pY) | |
| 253 pY = frameHeight - pY | |
| 254 cY = frameHeight - cY | |
| 255 lY = frameHeight - lY | |
| 256 print(' new values:', cY, lY, pY) | |
| 257 elseif direction == 'RIGHT' then | |
| 258 pX = frameWidth -pX | |
| 259 cX = frameWidth-cX | |
| 260 lX = frameWidth-lX | |
| 261 end | |
| 262 | |
| 263 | |
| 264 print(child, '|cFFFFFF00', childAnchor, '|r', frame, '|cFFFF0088', childPoint, '|r', pX, pY) | |
| 265 child:ClearAllPoints() | |
| 266 child:SetPoint(childAnchor, frame, childPoint, pX, pY) | |
| 267 frame.attachPoint = {childAnchor, childPoint } | |
| 268 | |
| 269 if Devian and Devian.InWorkspace() then | |
| 270 frame.alignedJoint:ClearAllPoints() | |
| 271 frame.poppingJointX:ClearAllPoints() | |
| 272 frame.poppingJointY:ClearAllPoints() | |
| 273 frame.cuttingJointX:ClearAllPoints() | |
| 274 frame.cuttingJointY:ClearAllPoints() | |
| 275 frame.childSpace:ClearAllPoints() | |
| 276 | |
| 277 frame.alignedJoint:SetPoint(childAnchor, frame, childPoint, pX, pY) | |
| 278 frame.poppingJointY:SetPoint(childAnchor, frame, childPoint, lX, lY) -- should really only differ when rows exceed 1 | |
| 279 frame.poppingJointX:SetPoint(childAnchor, frame, childPoint, lX, lY) | |
| 280 frame.cuttingJointY:SetPoint(childAnchor, frame, childPoint, cX, cY) -- should really only differ when rows exceed 1 | |
| 281 frame.cuttingJointX:SetPoint(childAnchor, frame, childPoint, cX, cY) | |
| 282 frame.childSpace:SetAllPoints(child) | |
| 283 | |
| 284 frame.alignedJoint:Show() | |
| 285 frame.poppingJointX:Show() | |
| 286 frame.poppingJointY:Show() | |
| 287 frame.cuttingJointX:Show() | |
| 288 frame.cuttingJointY:Show() | |
| 289 frame.childSpace:Show() | |
| 290 | |
| 291 print('|cFFFF0000MIN |r', childAnchor, childPoint, pX, pY) | |
| 292 print('|cFF00FFFFFAR |r', childAnchor, childPoint, cX, cY) | |
| 293 print('|cFFFFFF00CLOSE|r', childAnchor, childPoint, lX, lY) | |
| 294 | |
| 295 end | |
| 296 end | |
| 297 | |
| 298 B.SetAnchorChild = function(frame, child, c) | |
| 299 print('linking', child) | |
| 300 frame.attached = child | |
| 301 frame.attachmentConf = c | |
| 302 end |
