Nenue@75
|
1
|
Nenue@75
|
2 local plugin = CreateFrame('Frame', 'VeneerOptions', UIParent, 'TooltipBorderedFrameTemplate')
|
Nenue@75
|
3
|
Nenue@76
|
4 local vn, print = LibStub("LibKraken").register(Veneer, plugin)
|
Nenue@75
|
5
|
Nenue@75
|
6 local fields = {}
|
Nenue@75
|
7 local templateTypes = {
|
Nenue@75
|
8 slider = 'Slider',
|
Nenue@75
|
9 radio = 'Frame',
|
Nenue@75
|
10 number = 'EditBox',
|
Nenue@75
|
11 check = 'CheckButton'
|
Nenue@75
|
12 }
|
Nenue@75
|
13 local templateNames = {
|
Nenue@75
|
14 slider = 'OptionsSliderTemplate',
|
Nenue@75
|
15 radio = '',
|
Nenue@75
|
16 number = 'NumericInputSpinnerTemplate',
|
Nenue@75
|
17 check = 'UICheckButtonTemplate'
|
Nenue@75
|
18 }
|
Nenue@75
|
19 local OnLoad, OnUpdate, OnValueChanged = {}, {}, {}
|
Nenue@75
|
20 local frameHeadings = {}
|
Nenue@75
|
21
|
Nenue@75
|
22 local framePadding = 14
|
Nenue@75
|
23 local frameMaxWidth = 400
|
Nenue@75
|
24
|
Nenue@75
|
25
|
Nenue@75
|
26 local ToggleVeneerOptions = function()
|
Nenue@75
|
27
|
Nenue@75
|
28 plugin:Show()
|
Nenue@75
|
29 if plugin.initialized then
|
Nenue@75
|
30 return
|
Nenue@75
|
31 end
|
Nenue@75
|
32
|
Nenue@75
|
33 local sizeChanged = false
|
Nenue@75
|
34 local frameDepth = framePadding
|
Nenue@75
|
35 local frameWidth = framePadding
|
Nenue@75
|
36 local lineWidth = framePadding
|
Nenue@75
|
37 local lineNum = 1
|
Nenue@75
|
38 local lineColumn = 1
|
Nenue@75
|
39
|
Nenue@75
|
40 for i, module in ipairs(vn.modules) do
|
Nenue@75
|
41 if module.options then
|
Nenue@75
|
42 if not frameHeadings[module] then
|
Nenue@75
|
43 frameHeadings[module] = plugin:CreateFontString(nil, 'OVERLAY', 'VeneerNumberFontLarge')
|
Nenue@75
|
44 frameHeadings[module]:SetText(module.options.nameString or module:GetName())
|
Nenue@75
|
45 frameHeadings[module].height = frameHeadings[module]:GetHeight()
|
Nenue@75
|
46
|
Nenue@75
|
47 frameHeadings[module]:SetPoint('TOPLEFT', plugin, 'TOPLEFT', lineColumn, -frameDepth)
|
Nenue@75
|
48 frameDepth = frameDepth + frameHeadings[module].height
|
Nenue@75
|
49 end
|
Nenue@75
|
50
|
Nenue@75
|
51 for index, args in ipairs(module.options) do
|
Nenue@75
|
52 local fullIndex = (i*1000)+index
|
Nenue@75
|
53 print('config field', fullIndex)
|
Nenue@75
|
54 if not fields[fullIndex] then
|
Nenue@75
|
55 fields[fullIndex] = {}
|
Nenue@75
|
56 end
|
Nenue@75
|
57 local opt = fields[fullIndex]
|
Nenue@75
|
58
|
Nenue@75
|
59 if not opt.frame then
|
Nenue@75
|
60 sizeChanged = true
|
Nenue@75
|
61
|
Nenue@75
|
62 local configType = args.type
|
Nenue@75
|
63 print('Creating', templateTypes[configType] or 'Frame', 'from', templateNames[configType])
|
Nenue@75
|
64 opt.frame = CreateFrame(templateTypes[configType] or 'Frame', 'VeneerOptions' .. args.name, plugin, templateNames[configType])
|
Nenue@75
|
65
|
Nenue@75
|
66 if OnLoad[configType] then
|
Nenue@75
|
67 OnLoad[configType](opt.frame, args)
|
Nenue@75
|
68 end
|
Nenue@75
|
69 if opt.OnLoad then
|
Nenue@75
|
70 opt.OnLoad(opt.frame)
|
Nenue@75
|
71 end
|
Nenue@75
|
72
|
Nenue@75
|
73 if args.OnUpdate then
|
Nenue@75
|
74 opt.frame.Update = function(self)
|
Nenue@75
|
75 OnUpdate[configType](self, args)
|
Nenue@75
|
76 args.OnUpdate(self, args)
|
Nenue@75
|
77 end
|
Nenue@75
|
78 else
|
Nenue@75
|
79 opt.frame.Update = function(self)
|
Nenue@75
|
80 OnUpdate[configType](self, args)
|
Nenue@75
|
81 end
|
Nenue@75
|
82 end
|
Nenue@75
|
83
|
Nenue@75
|
84 opt.frame:Update()
|
Nenue@75
|
85
|
Nenue@75
|
86 opt.frame:SetPoint('TOPLEFT', plugin, 'TOPLEFT', lineColumn, -frameDepth)
|
Nenue@75
|
87
|
Nenue@75
|
88
|
Nenue@75
|
89 opt.name = args.name
|
Nenue@75
|
90 opt.line = lineNum
|
Nenue@75
|
91 opt.column = lineColumn
|
Nenue@75
|
92
|
Nenue@75
|
93 -- measure after initializer
|
Nenue@75
|
94 frameDepth = frameDepth + opt.frame:GetHeight()
|
Nenue@75
|
95 lineWidth = lineWidth + opt.frame:GetWidth()
|
Nenue@75
|
96 opt.depth = frameDepth
|
Nenue@75
|
97 opt.width = lineWidth
|
Nenue@75
|
98 local isOverlapped = (lineWidth > frameMaxWidth)
|
Nenue@75
|
99 if args.fullwidth or isOverlapped then
|
Nenue@75
|
100 lineNum = lineNum + 1
|
Nenue@75
|
101 if isOverlapped then
|
Nenue@75
|
102 lineWidth = framePadding + opt.frame:GetWidth()
|
Nenue@75
|
103 lineColumn = 1
|
Nenue@75
|
104 else
|
Nenue@75
|
105 lineWidth = framePadding
|
Nenue@75
|
106 lineColumn = lineColumn + 1
|
Nenue@75
|
107 end
|
Nenue@75
|
108 end
|
Nenue@75
|
109
|
Nenue@75
|
110 if lineWidth > frameWidth then
|
Nenue@75
|
111 sizeChanged = true
|
Nenue@75
|
112 frameWidth = lineWidth
|
Nenue@75
|
113 end
|
Nenue@75
|
114
|
Nenue@75
|
115
|
Nenue@75
|
116 end
|
Nenue@75
|
117
|
Nenue@75
|
118
|
Nenue@75
|
119
|
Nenue@75
|
120
|
Nenue@75
|
121
|
Nenue@75
|
122
|
Nenue@75
|
123 end
|
Nenue@75
|
124 end
|
Nenue@75
|
125 end
|
Nenue@75
|
126
|
Nenue@75
|
127 if sizeChanged then
|
Nenue@75
|
128 plugin:SetSize(frameWidth + framePadding, frameDepth + framePadding)
|
Nenue@75
|
129
|
Nenue@75
|
130 plugin:SetPoint('CENTER')
|
Nenue@75
|
131 end
|
Nenue@75
|
132
|
Nenue@75
|
133 end
|
Nenue@75
|
134
|
Nenue@75
|
135 OnLoad.slider = function(self, args)
|
Nenue@75
|
136 print('min:', args.min, 'max:', args.max, 'steps:', args.step)
|
Nenue@75
|
137 self:SetMinMaxValues(args.min or 0, args.max or 420)
|
Nenue@75
|
138 self:SetValueStep(1)
|
Nenue@75
|
139 self:SetStepsPerPage(5)
|
Nenue@75
|
140 self:SetObeyStepOnDrag(true)
|
Nenue@75
|
141 end
|
Nenue@75
|
142
|
Nenue@75
|
143 OnUpdate.slider = function(self, args)
|
Nenue@75
|
144 local base = args.handler or vn.db
|
Nenue@75
|
145 self:SetValue(vn.db[self.name] or 1)
|
Nenue@75
|
146 end
|
Nenue@75
|
147
|
Nenue@75
|
148 OnValueChanged.slider = function()
|
Nenue@75
|
149 end
|
Nenue@75
|
150
|
Nenue@75
|
151 plugin.cmd = function(cmd)
|
Nenue@75
|
152 cmd = string.lower(cmd)
|
Nenue@75
|
153 if cmd:match('config') then
|
Nenue@75
|
154 ToggleVeneerOptions()
|
Nenue@75
|
155 return true
|
Nenue@75
|
156 end
|
Nenue@75
|
157 end
|
Nenue@75
|
158
|
Nenue@75
|
159 plugin.init = function()
|
Nenue@75
|
160 --ToggleVeneerOptions()
|
Nenue@75
|
161 end
|