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 |