Mercurial > wow > buffalo2
comparison Veneer.lua @ 84:16b300d96724
rewritten using mixin attributes
| author | Nenue |
|---|---|
| date | Tue, 18 Oct 2016 13:07:21 -0400 |
| parents | bb6b532c5d2f |
| children | 27db212af783 |
comparison
equal
deleted
inserted
replaced
| 83:4ec4fd89fced | 84:16b300d96724 |
|---|---|
| 1 -- Veneer | 1 -- Veneer |
| 2 -- Base framework for making things draggable. | 2 -- Base framework for making things draggable. |
| 3 | 3 |
| 4 local vn, print = LibStub("LibKraken").register(Veneer) | 4 |
| 5 | |
| 6 | |
| 7 SLASH_VENEER1 = "/veneer" | |
| 8 SLASH_VENEER2 = "/vn" | |
| 9 | |
| 10 SlashCmdList.VENEER = function(cmd) | |
| 11 end | |
| 12 VeneerCore = { | |
| 13 Frames = {}, | |
| 14 ConfigLayers = {}, | |
| 15 FrameClusters = {}, | |
| 16 parserDepth = 0, | |
| 17 pendingCalls = {}, | |
| 18 } | |
| 19 VeneerHandlerMixin = { | |
| 20 Reanchor = nop | |
| 21 } | |
| 22 local print = DEVIAN_WORKSPACE and function(...) print('Veneer', ...) end or nop | |
| 5 local wipe = table.wipe | 23 local wipe = table.wipe |
| 6 | 24 |
| 7 local defaults = { | 25 local defaults = { |
| 8 enableAll = true, | 26 enableAll = true, |
| 9 enableModule = { | 27 enableModule = { |
| 12 BuffFrame = { | 30 BuffFrame = { |
| 13 width = 48, | 31 width = 48, |
| 14 height = 48, | 32 height = 48, |
| 15 } | 33 } |
| 16 } | 34 } |
| 35 | |
| 17 local configMode | 36 local configMode |
| 18 local veneers = {} | |
| 19 | |
| 20 local anonID = 0 | 37 local anonID = 0 |
| 21 | |
| 22 local tostring = tostring | 38 local tostring = tostring |
| 23 local IsFrameHandle = IsFrameHandle | 39 local IsFrameHandle = IsFrameHandle |
| 24 local GetAnonymousName = function(key) | 40 local GetAnonymousName = function(key) |
| 25 if not key then | 41 if not key then |
| 26 anonID = anonID + 1 | 42 anonID = anonID + 1 |
| 30 end | 46 end |
| 31 local GetTableName = function(table) | 47 local GetTableName = function(table) |
| 32 return (IsFrameHandle(table) and table:GetName()) or tostring(table) | 48 return (IsFrameHandle(table) and table:GetName()) or tostring(table) |
| 33 end | 49 end |
| 34 | 50 |
| 35 | |
| 36 | |
| 37 local anchor_coefficients = { | 51 local anchor_coefficients = { |
| 38 ['TOP'] = function(x, y) return x, y end, | 52 ['TOP'] = function(x, y) return x, y end, |
| 39 ['BOTTOM'] = function(x, y) return x,y end, | 53 ['BOTTOM'] = function(x, y) return x,y end, |
| 40 ['LEFT'] = function(x, y) return x,y end, | 54 ['LEFT'] = function(x, y) return x,y end, |
| 41 ['RIGHT'] = function(x,y) return x,y end, | 55 ['RIGHT'] = function(x,y) return x,y end, |
| 42 } | 56 } |
| 57 | |
| 58 function VeneerCore:print(...) | |
| 59 local txt = '|cFFFFFF00Veneer|r:' | |
| 60 for i = 1, select('#', ...) do | |
| 61 txt = txt .. ' '.. tostring(select(i, ...)) | |
| 62 end | |
| 63 | |
| 64 DEFAULT_CHAT_FRAME:AddMessage(txt) | |
| 65 end | |
| 66 | |
| 67 function VeneerCore:OnLoad() | |
| 68 print('|cFFFFFF00Veneer!|r') | |
| 69 self:RegisterEvent('ADDON_LOADED') | |
| 70 self:RegisterEvent('PLAYER_LOGIN') | |
| 71 | |
| 72 self.DEVIAN_PNAME = 'Veneer' | |
| 73 self:RegisterForDrag('LeftButton') | |
| 74 end | |
| 75 | |
| 76 function VeneerCore:OnEvent(event, ...) | |
| 77 if event == 'ADDON_LOADED' or event == 'PLAYER_LOGIN' then | |
| 78 if IsLoggedIn() and not self.intialized then | |
| 79 self.intialized = true | |
| 80 self:Setup() | |
| 81 end | |
| 82 end | |
| 83 end | |
| 84 | |
| 85 function VeneerCore:OnDragStart() | |
| 86 self:StartMoving() | |
| 87 end | |
| 88 | |
| 89 | |
| 90 function VeneerCore:OnDragStop() | |
| 91 self:StopMovingOrSizing() | |
| 92 end | |
| 93 | |
| 94 function VeneerCore:Setup () | |
| 95 if (not VeneerData) or (not VeneerData.version) then | |
| 96 VeneerData = defaults | |
| 97 end | |
| 98 self.data = VeneerData | |
| 99 | |
| 100 | |
| 101 self:ExecuteOnClusters(nil, 'Setup') | |
| 102 end | |
| 103 | |
| 104 function VeneerCore:AddHandler(handler, ...) | |
| 105 print('*** Adding handler:', handler.moduleName or handler:GetName()) | |
| 106 local clusterTable = self.FrameClusters | |
| 107 for i = 1, select('#', ...) do | |
| 108 local anchor = select(i, ...) | |
| 109 clusterTable[anchor] = clusterTable[anchor] or {} | |
| 110 clusterTable = clusterTable[anchor] | |
| 111 print(' cluster layer', i, anchor) | |
| 112 end | |
| 113 for k,v in pairs(VeneerHandlerMixin) do | |
| 114 if not handler[k] then | |
| 115 handler[k] = v | |
| 116 end | |
| 117 end | |
| 118 tinsert(clusterTable, handler) | |
| 119 handler:Reanchor() | |
| 120 end | |
| 121 | |
| 122 function VeneerCore:ExecuteOnClusters(layer, method) | |
| 123 self.parserDepth = self.parserDepth + 1 | |
| 124 layer = layer or self.FrameClusters | |
| 125 if not layer then | |
| 126 if self.parserDepth >= 1 then | |
| 127 tinsert(self.pendingCalls, method) | |
| 128 print('delaying walk for', method) | |
| 129 return | |
| 130 end | |
| 131 print('|cFF00FFFFVeneer|r:'..method..'('..tostring(layer)..')') | |
| 132 else | |
| 133 print(' L'..self.parserDepth) | |
| 134 end | |
| 135 for anchor, cluster in pairs(layer) do | |
| 136 for index, frame in ipairs(cluster) do | |
| 137 print(' '..anchor..'.'..index..' = '..frame:GetName()) | |
| 138 if frame[method] then | |
| 139 print(' '..frame:GetName()..':'..method..'(...)') | |
| 140 frame[method](frame) | |
| 141 end | |
| 142 end | |
| 143 if cluster.FrameClusters then | |
| 144 self:ExecuteOnClusters(cluster.FrameClusters, method) | |
| 145 end | |
| 146 end | |
| 147 self.parserDepth = self.parserDepth - 1 | |
| 148 | |
| 149 if (self.parserDepth == 0) and (#self.pendingCalls >= 1) then | |
| 150 local delayedMethod = tremove(self.pendingCalls, 1) | |
| 151 print('starting delayed walk for', delayedMethod) | |
| 152 self:ExecuteOnClusters(nil, delayedMethod) | |
| 153 end | |
| 154 end | |
| 155 | |
| 156 function VeneerCore:Update() | |
| 157 self:ExecuteOnClusters(nil, 'Update') | |
| 158 end | |
| 43 | 159 |
| 44 local VeneerButton_OnDragStart = function(self) | 160 local VeneerButton_OnDragStart = function(self) |
| 45 self.startingLeft = self:GetLeft() | 161 self.startingLeft = self:GetLeft() |
| 46 self.startingBottom = self:GetBottom() | 162 self.startingBottom = self:GetBottom() |
| 47 self.anchors = self.anchors or {} | 163 self.anchors = self.anchors or {} |
| 121 end | 237 end |
| 122 | 238 |
| 123 local ToggleVeneerConfig = function() | 239 local ToggleVeneerConfig = function() |
| 124 if configMode then | 240 if configMode then |
| 125 configMode = false | 241 configMode = false |
| 126 vn:print('Config mode off.') | 242 Veneer:print('Config mode off.') |
| 127 else | 243 else |
| 128 configMode = true | 244 configMode = true |
| 129 vn:print('Config mode on.') | 245 Veneer:print('Config mode on.') |
| 130 end | 246 end |
| 131 | 247 |
| 132 for frame, veneer in pairs(veneers) do | 248 for frame, veneer in pairs(veneers) do |
| 133 VeneerButton_Update(veneer) | 249 VeneerButton_Update(veneer) |
| 134 end | 250 end |
| 136 | 252 |
| 137 local VeneerButton_OnShow = function(self) | 253 local VeneerButton_OnShow = function(self) |
| 138 VeneerButton_Update(self) | 254 VeneerButton_Update(self) |
| 139 end | 255 end |
| 140 | 256 |
| 141 vn.GetVeneer = function(frame, template) | 257 function VeneerCore:Acquire (frame, template) |
| 142 if not frame then | 258 if not frame then |
| 143 print('|cFFFF4400Unable to acquire frame...|r') | 259 print('|cFFFF4400Unable to acquire frame...|r') |
| 144 return | 260 return |
| 145 end | 261 end |
| 146 | 262 local veneer = self.Frames[frame] |
| 147 if veneers[frame] then | 263 if not veneer then |
| 148 return veneers[frame] | 264 local name = type(frame) == 'table' and GetTableName(frame) or GetAnonymousName() |
| 149 end | 265 veneer = CreateFrame('Frame', name, frame, template or 'VeneerTemplate') |
| 150 | 266 print('+veneer', name) |
| 151 local name = type(frame) == 'table' and GetTableName(frame) or GetAnonymousName() | 267 |
| 152 local veneer = CreateFrame('Frame', name, frame, template or 'VeneerTemplate') | 268 veneer:SetAllPoints(frame) |
| 153 print('+veneer', name) | 269 veneer:SetParent(frame) |
| 154 | 270 veneer.label:SetText(name) |
| 155 veneer:SetAllPoints(frame) | 271 veneer.bg:SetColorTexture(0,0,0,0) |
| 156 veneer:SetParent(frame) | 272 veneer:Hide() |
| 157 veneer.label:SetText(name) | 273 veneer:EnableMouse(false) |
| 158 veneer.bg:SetColorTexture(0,0,0,0) | 274 |
| 159 veneer:Hide() | 275 veneer:SetScript('OnShow', VeneerButton_OnShow) |
| 160 veneer:EnableMouse(false) | 276 |
| 161 | 277 -- find current X/Y |
| 162 veneer:SetScript('OnShow', VeneerButton_OnShow) | 278 veneer.currentLeft = frame:GetLeft() |
| 163 | 279 veneer.currentTop = frame:GetTop() |
| 164 -- find current X/Y | 280 self.Frames[frame] = veneer |
| 165 veneer.currentLeft = frame:GetLeft() | 281 end |
| 166 veneer.currentTop = frame:GetTop() | 282 |
| 167 | 283 return veneer |
| 168 | |
| 169 veneers[frame] = veneer | |
| 170 return veneers[frame] | |
| 171 end | 284 end |
| 172 | 285 |
| 173 local mixin_probe = { | 286 local mixin_probe = { |
| 174 'ArtifactFrame', | 287 'ArtifactFrame', |
| 175 'ArtifactFrameUnderlay', | 288 'ArtifactFrameUnderlay', |
| 176 } | 289 } |
| 177 | 290 |
| 178 vn.event = function(event, arg) | 291 |
| 179 | |
| 180 end | |
| 181 | |
| 182 vn.init = function() | |
| 183 if (not VeneerData) or (not VeneerData.version) then | |
| 184 VeneerData = defaults | |
| 185 end | |
| 186 vn.db = VeneerData | |
| 187 | |
| 188 end | |
| 189 | |
| 190 | |
| 191 SLASH_VENEER1 = "/veneer" | |
| 192 SLASH_VENEER2 = "/vn" | |
| 193 | |
| 194 SlashCmdList.VENEER = function(cmd) | |
| 195 for i, module in pairs(vn.modules) do | |
| 196 if module.cmd then | |
| 197 local result = module.cmd(cmd) | |
| 198 if result then | |
| 199 return | |
| 200 end | |
| 201 end | |
| 202 end | |
| 203 ToggleVeneerConfig() | |
| 204 end |
