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