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