comparison Config.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 --- All the control GUI stuff, including chat command functions
2 -- @file-author@
3 -- @project-revision@ @project-hash@
4 -- @file-revision@ @file-hash@
5 -- Created: 3/12/2016 12:49 AM
6 local B, _G = select(2,...).frame, _G
7 local M = B:RegisterModule("Options")
8 local tostring, tonumber, floor, format = tostring, tonumber, floor, string.format
9 local unpack, select, pairs, ipairs, type, wipe = unpack, select, pairs, ipairs, type, table.wipe
10 local CreateFrame, IsControlKeyDown = _G.CreateFrame, _G.IsControlKeyDown
11 local max = math.max
12 local OpacitySliderFrame, ColorPickerFrame = _G.OpacitySliderFrame, _G.ColorPickerFrame
13 local print = B.print('Cfgl')
14 local function round(number, decimals)
15 if floor(number) == number then
16 return ('%d'):format(number)
17 end
18
19 return (("%%.%df"):format(decimals)):format(number)
20 end
21
22 --- STATE VARIABLES
23 local configInit
24 --- Dummies for addon table upvalues
25 local configFrames = {} -- actual frame objects
26 local displays = B.displays -- anchor objects dummy
27
28
29 --- Returns a value retreival function and the current value stored in config
30 -- @paramsig value, previousValue = configInteger(key)
31 -- @param key Name of the config field being represented.
32 local defaultGroup = 'BuffButton'
33 local configInteger = function(group, key)
34 return function(self ,display)
35 return floor(tonumber(self:GetValue()) + 0.5)
36 end, (B.Conf[group ..key] or B.Conf[defaultGroup..key])
37 end
38 local configPercent = function(group, key)
39 return function(self, display)
40 local value = self:GetValue()
41 if display then
42 return tostring(floor(value*100+0.5))..' %'
43 else
44 return floor((value*100+0.5))/100
45 end
46 end, (B.Conf[group ..key] or B.Conf[defaultGroup..key])
47 end
48 local configColor = function(group, key)
49 -- table for config, color value list for text
50 return function(self, display)
51 if display then
52 return "|cFFFF4444" .. round(self.rgba[1], 1) .. "|r, |cFF44FF44" .. round(self.rgba[2], 1) .. "|r, |cFF4488FF" ..
53 round(self.rgba[3], 1) .. "|r, " .. round(self.rgba[4], 1)
54 else
55 return self.rgba
56 end
57 end, (B.Conf[group ..key] or B.Conf[defaultGroup..key])
58 end
59 local configCheck = function(group, key)
60 return function(self) return self:GetChecked() end, B.Conf[group ..key] or B.Conf[defaultGroup..key]
61 end
62 -- initializes the corresponding type of config field
63 local frameTypeConv = {
64 Color = 'Button',
65 Font = 'Frame',
66 }
67 local configTypeParams = {
68 Slider = function(frame, optionInfo)
69 frame:SetMinMaxValues(optionInfo[5], optionInfo[6])
70 frame:SetValueStep(optionInfo[7])
71 frame:SetStepsPerPage(optionInfo[8])
72 print(frame.OptName, '\n {', optionInfo[5], optionInfo[6], optionInfo[7], optionInfo[8], '}')
73 end,
74 CheckButton = function(frame, optionInfo)
75 frame.SetValue = function(self, ...)
76 self:SetChecked(...)
77 B.Conf[self.OptName] = self:GetChecked()
78 print(self.OptTab)
79 B.UpdateAll()
80 end
81 frame:SetScript("OnClick",function(self)
82 B.Conf[self.OptName] = self:GetChecked()
83 print(B.Conf[self.OptName], self:GetChecked())
84 B.UpdateAll()
85 end)
86 end,
87 Color = function(frame, optionInfo)
88 frame.rgba = { frame.current:GetVertexColor() }
89 local colorPickerCallback = function(restore)
90 local newR, newG, newB, newA
91 if restore then
92 newR, newG, newB, newA = unpack(restore)
93 else
94 newA, newR, newG, newB = OpacitySliderFrame:GetValue(), ColorPickerFrame:GetColorRGB()
95 print('not cancel', newA, newR, newB, newG)
96 end
97 frame:SetValue({newR, newG, newB, newA})
98 B.UpdateBuffs(frame.OptTab)
99 end
100 frame:SetScript("OnClick", function(self)
101 print('got a click')
102 local r, g, b, a = frame.current:GetVertexColor()
103 ColorPickerFrame:SetColorRGB(r, g, b)
104 ColorPickerFrame.hasOpacity = (a ~= nil)
105 ColorPickerFrame.opacity = a
106 ColorPickerFrame.previousValues = {r,g,b,a}
107 ColorPickerFrame.func, ColorPickerFrame.opacityFunc, ColorPickerFrame.cancelFunc =
108 colorPickerCallback, colorPickerCallback,colorPickerCallback
109 ColorPickerFrame:Hide()
110 ColorPickerFrame:Show()
111 end)
112 frame.SetValue = function(self, rgba)
113 print(rgba)
114 frame.rgba = rgba
115 B.Conf[self.OptName] = rgba
116 frame.current:SetVertexColor(unpack(rgba))
117 frame.fieldvalue:SetText(frame.OptValue(frame, true))
118 end
119 end
120 }
121 --- configDialog
122 -- @usage tinsert(configDialog, {prefix, row, [...] })
123 -- Each top level member defines a group of config value handlers, structured as an iterative table where the
124 -- first member is a key prefix, the second member is an integer row value, and all following members are treated
125 -- as a widget resource, defined initially as a complete sub-table, which can be re-used further down by passing
126 -- the string literal widget suffix.
127 -- widget table: ... {'suffix', 'description', valueCallback, 'template', [widget parameters]}
128 -- widget copy: ... 'suffix', ...
129 local configDialog = {
130 {'BuffButton', 1,
131
132 {'Max', 'Max', configInteger, 'Slider',
133 1, _G.BUFF_MAX_DISPLAY, 1, 1}, -- valueMin, valueMax, valueStep, stepsPerPage
134 {'PerRow', 'Per Row', configInteger, 'Slider',
135 1, _G.BUFF_MAX_DISPLAY, 1, 1}, -- valueMin, valueMax, valueStep, stepsPerPage,
136 {'Size', 'Icon Size', configInteger, 'Slider',
137 1, 256, 1, 1},
138 {'Spacing', 'Icon Spacing', configInteger, 'Slider',
139 1, 50, 1, 1},
140 {'DurationSize', 'Duration Text Height', configInteger, 'Slider',
141 1, 72, 1, 1},
142 {'Zoom', 'Icon Zoom', configInteger, 'Slider',
143 0, 100, 1, 1},
144 {'Border', 'Border', configInteger, 'Slider',
145 1, 16, 1, 1},
146 {'Color', 'Default Border', configColor, 'Color'},
147 {'RaidColor', 'RaidBuff Border', configColor, 'Color'},
148 {'PlayerColor', 'Player Buffs', configColor, 'Color'},
149 {'BossColor', 'Encounter Buffs', configColor, 'Color'},
150 {'ShowSelfCast', 'Show name for self-casts', configCheck, 'CheckButton'}
151 },
152 { 'DebuffButton', 1,
153 {'Max', 'Max', configInteger, 'Slider',
154 1, _G.DEBUFF_MAX_DISPLAY, 1, 1 }
155 ,
156 {'PerRow', 'Per Row', configInteger, 'Slider',
157 1, _G.DEBUFF_MAX_DISPLAY, 1, 1 },
158 'Size', 'Spacing', 'DurationSize', 'Zoom', 'Border',
159 'Color', 'RaidColor', 'PlayerColor', 'BossColor',
160 },
161 { 'TempEnchant', 1,
162 {'Max', 'Max', configInteger, 'Slider',
163 1, _G.NUM_TEMP_ENCHANT_FRAMES, 1, 1 },
164 {'PerRow', 'Per Row', configInteger, 'Slider',
165 1, _G.NUM_TEMP_ENCHANT_FRAMES, 1, 1},
166 'Size', 'Spacing', 'DurationSize', 'Zoom', 'Border',
167 'Color', 'RaidColor', 'PlayerColor', 'BossColor',
168 },
169 { 'ConsolidatedBuff', 2,
170 {'Position', 'Slot Position', configInteger, 'Slider',
171 1, _G.BUFF_MAX_DISPLAY, 1, 1 }
172
173 },
174 { 'ConsolidatedBuff', 2,
175 'Size'
176 },
177 { 'Raid', 3,
178 {'ShowMissing', 'Verbose missing raid buffs', configCheck, 'CheckButton'}
179 }
180 }
181
182
183
184
185 local configFrame
186 local optionTemplates = {}
187 local configPadding, configSpacing = 3, 3
188
189 --- Walks the structure table to generate a pretty config panel
190 local InitConfig = function()
191 configInit = true
192 local configWidth = B:GetWidth()
193 local optionWidth = (configWidth - configPadding) / 3 - configSpacing
194 local configHeight = 0
195 local bottom_extent = 0
196 local clusterHeight = 0
197 local clusterOffset = 0
198 local lastCluster
199 local cluster = 1
200 local col = 0
201 for t, taboptions in ipairs(configDialog) do
202 local group = taboptions[1]
203 cluster = taboptions[2]
204 col = col + 1
205
206
207 if not configFrames[t] then
208 configFrames[t] = {}
209 end
210
211
212 if cluster ~= lastCluster then
213 configHeight = configHeight + clusterHeight
214 print('|cFFFF8800## new cluster|r, advancing offset from', clusterOffset, 'to', clusterOffset + clusterHeight)
215 clusterOffset = clusterOffset + clusterHeight
216 col = 1
217 clusterHeight = 0
218 lastCluster = cluster
219 end
220
221 print('processing tab', group)
222 local row = 0
223 for i = 3, #taboptions do
224 row = row + 1
225 local optionInfo = taboptions[i]
226 if type(optionInfo) == 'string' then
227 optionInfo = optionTemplates[optionInfo]
228 end
229 local key, fieldname, valueFuncGenerator, configType = unpack(optionInfo)
230
231 if not optionTemplates[key] then
232 optionTemplates[key] = optionInfo
233 end
234
235 local fullkey = group .. key
236 print(fullkey, fieldname)
237
238 if not configFrames[t][row] then
239 print('building frame', t, group, row)
240 local frameTemplate = 'VeneerConfig'..configType
241 local frameType = frameTypeConv[configType] or configType
242 configFrames[t][row] = CreateFrame(frameType, fullkey, B, frameTemplate)
243 local f = configFrames[t][row]
244 f.OptKey = key
245 f.OptTab = group
246 f.OptName = fullkey
247 local valueFunc, initialValue = valueFuncGenerator(group, key)
248 print(' value getter', fullkey,'->', valueFunc,initialValue)
249 configTypeParams[configType](f, optionInfo)
250 f.OptValue = valueFunc
251
252 --- Enclosing these to
253 -- a) make the panel easy to bring up externally
254 -- b) limit gameplay risk from config frame errors
255 -- c) milk the iterator scope for all its worth
256 f.OnChange = function(self)
257
258 -- holding control; mirror this setting in other categories
259 if IsControlKeyDown() and not (configInit) then
260 configInit = true
261 for optTab, opts in pairs(configFrames) do
262 for _, opt in ipairs(opts) do
263 if opt.OptKey == key then
264 if optTab ~= group then
265 print('mapping to', optTab, opt.OptKey)
266 opt:SetValue(self:GetValue())
267 end
268
269 end
270 end
271 end
272 configInit = nil
273 end
274 local newValue = valueFunc(self)
275 if newValue ~= B.Conf[fullkey] then
276 print(newValue, fullkey)
277 f.fieldvalue:SetText(valueFunc(self, true))
278 B.Conf[fullkey] = valueFunc(self)
279 -- prepare to update
280 wipe(B.drawn[f.OptTab])
281 B.UpdateBuffs(self.OptTab)
282 B.UpdateConfigLayers()
283 end
284
285 end
286
287 f:SetValue(initialValue)
288 local yBuffer = configPadding
289 if f.fieldname then
290 f.fieldname:SetText(fieldname)
291 yBuffer = yBuffer + f.fieldname:GetHeight()
292 end
293 if f.fieldvalue then
294 f.fieldvalue:SetText(f:OptValue(true))
295 end
296
297 local point, relative, x, y = 'TOPLEFT', 'BOTTOMLEFT', 0, -3
298
299 local base
300 if (row == 1) then
301 bottom_extent = 0
302 base = B.header
303 x = (col-1) * (optionWidth+configSpacing)
304 y = -configPadding
305 else
306 base = configFrames[t][row-1]
307 end
308
309 print('|cFFFF0088'..cluster..'|r |cFF00FF00'.. row..'|r', col, base:GetName(), x, y - clusterOffset)
310
311 if frameType ~= 'CheckButton' then
312 f:SetWidth(optionWidth)
313 end
314
315 f:SetPoint(point, base, relative, x, y-yBuffer-clusterOffset)
316 --print('creating', frameType, fieldname)
317 f:Show()
318
319 bottom_extent = bottom_extent + f:GetHeight() + yBuffer + configSpacing
320
321
322
323 clusterHeight = max(clusterHeight, bottom_extent)
324 --print('y', floor(yBuffer+0.5), 'f:H', floor(f:GetHeight()+0.5), 'hTally', floor(bottom_extent+0.5), 'hMax', floor(configHeight+0.5))
325 end
326 end
327 end
328
329 -- grab the last cluster
330 if lastCluster == cluster then
331 print('|cFF00FF00##scooping up last cluster info')
332 configHeight = configHeight + clusterHeight
333 end
334
335 if not B.configFramesCreated then
336 B.configFramesCreated = true
337 B:SetHeight(B.header:GetStringHeight() + configSpacing*3 + configHeight)
338 end
339 if configInit then configInit = nil end
340 end
341
342 M.Command = function(enable, editbox)
343 displays = B.displays
344 if type(enable) == 'boolean' then
345 B.Conf.ConfigMode = enable
346 else
347 B.Conf.ConfigMode = (B.Conf.ConfigMode == false) and true or false
348 end
349
350 print('/BUFF', B.Conf.ConfigMode, type(B.Conf.ConfigMode))
351 if B.Conf.ConfigMode then
352 if not B.configFramesCreated then
353 InitConfig()
354 end
355 print('Veneer config')
356 B:Show()
357 else
358 B:Hide()
359 end
360 B.UpdateAll()
361 B.UpdateConfigLayers()
362 end
363
364 B.Close = function ()
365 M.Command()
366 end
367
368 B.ToggleGuides = function(_, self)
369 B.Conf.GuidesMode = (not B.Conf.GuidesMode)
370 if B.Conf.GuidesMode then
371 self:GetNormalTexture():SetTexture(0.94, 0.21, 0.21, 1)
372 else
373 self:GetNormalTexture():SetTexture(0, 0, 0, 1)
374 end
375
376 B.UpdateConfigLayers()
377 end
378
379 M.OnEnable = function()
380 M.Command(B.Conf.ConfigMode)
381 end
382
383 M.OnInitialize = function()
384 DEFAULT_CHAT_FRAME:AddMessage("|cFF22D822Veneer|r")
385 SLASH_BUFFALO1, SLASH_BUFFALO2 = "/buffalo", "/buff"
386 SlashCmdList.BUFFALO = M.Command
387
388 end