annotate Options.lua @ 84:16b300d96724

rewritten using mixin attributes
author Nenue
date Tue, 18 Oct 2016 13:07:21 -0400
parents 83b3cdaae6a5
children 26938ae258b7
rev   line source
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