| Nenue@6 | 1 --- Modules | 
| Nenue@6 | 2 -- @file-author@ | 
| Nenue@6 | 3 -- @project-revision@ @project-hash@ | 
| Nenue@6 | 4 -- @file-revision@ @file-hash@ | 
| Nenue@6 | 5 -- Created: 1/18/2016 3:33 PM | 
| Nenue@6 | 6 local _G = _G | 
| Nenue@6 | 7 local T, type, pairs = _G.Turok, type, pairs | 
| Nenue@6 | 8 local mod = T.modules.TimerControl | 
| Nenue@6 | 9 local cType, cText, cNum, cWord, cKey, cPink, cBool = cType, cText, cNum, cWord, cKey, cPink, cBool | 
| Nenue@6 | 10 local print = function(...) | 
| Nenue@6 | 11   if Devian and DevianDB.workspace ~= 1 then | 
| Nenue@6 | 12     print('Dialog', ...) | 
| Nenue@6 | 13   end | 
| Nenue@6 | 14 end | 
| Nenue@6 | 15 print('Peep!', ...) | 
| Nenue@6 | 16 | 
| Nenue@6 | 17 | 
| Nenue@6 | 18 local TimerConfig = { | 
| Nenue@6 | 19   conf = { | 
| Nenue@6 | 20     padding = 4, | 
| Nenue@6 | 21     spacing = 1, | 
| Nenue@6 | 22     width = 450, | 
| Nenue@6 | 23   }, | 
| Nenue@6 | 24   info = { | 
| Nenue@6 | 25     { key = 'timerName', | 
| Nenue@6 | 26       desc = 'Unique Name:', | 
| Nenue@6 | 27       type='EditBox', name = 'timerName', fill=true, | 
| Nenue@6 | 28       line = true, | 
| Nenue@6 | 29     }, | 
| Nenue@6 | 30     { key = 'spellEnable', | 
| Nenue@6 | 31       inherits = 'TurokCheckButtonOverlay', | 
| Nenue@6 | 32       type='CheckButton', name = 'spellEnable', fixed=25, point='LEFT', | 
| Nenue@6 | 33       get = Dialog_Boolean, getarg = 'spellID', | 
| Nenue@6 | 34       collapse = true, | 
| Nenue@6 | 35       desc = 'Spell Name', | 
| Nenue@6 | 36     }, | 
| Nenue@6 | 37     { key = 'spellID', | 
| Nenue@6 | 38       type='EditBox', name = 'spellName', | 
| Nenue@6 | 39       line = true, float = true | 
| Nenue@6 | 40     }, | 
| Nenue@6 | 41     { key = 'fill_inverse', | 
| Nenue@6 | 42       desc = 'Reverse Fill', | 
| Nenue@6 | 43       type='CheckButton', name='fillInverse', fixed=25, point='LEFT', | 
| Nenue@6 | 44       get = Dialog_Boolean, getarg = 'fill_inverse', text='Inverted Fill', | 
| Nenue@6 | 45       line = true, | 
| Nenue@6 | 46     }, | 
| Nenue@6 | 47     { key = 'display', | 
| Nenue@6 | 48       desc = 'Display Type', | 
| Nenue@6 | 49       type='EditBox', name='displayType', | 
| Nenue@6 | 50       line = true, | 
| Nenue@6 | 51     }, | 
| Nenue@6 | 52   }, | 
| Nenue@6 | 53 } | 
| Nenue@6 | 54 | 
| Nenue@6 | 55 local Dialog_SetField = {} | 
| Nenue@6 | 56 local dget = function(name, key) | 
| Nenue@6 | 57   if mod.db.timers[name] then | 
| Nenue@6 | 58     return mod.db.timers[name][key] | 
| Nenue@6 | 59   end | 
| Nenue@6 | 60   return nil | 
| Nenue@6 | 61 end | 
| Nenue@6 | 62 local inherits = { | 
| Nenue@6 | 63   EditBox = 'TkEditBox', | 
| Nenue@6 | 64   CheckButton = 'TurokCheckButtonInline', | 
| Nenue@6 | 65   Slider = 'TkSlider', | 
| Nenue@6 | 66 } | 
| Nenue@6 | 67 | 
| Nenue@6 | 68 Dialog_SetField['CheckButton'] = function(self, checked) self:SetChecked(checked) end | 
| Nenue@6 | 69 Dialog_SetField['EditBox'] = function(self, text) | 
| Nenue@6 | 70   print('     ', cKey(self:GetName()), text) | 
| Nenue@6 | 71   self:SetText(text or '') end | 
| Nenue@6 | 72 Dialog_SetField['Button'] = function(self, text) self:SetText(text) end | 
| Nenue@6 | 73 | 
| Nenue@6 | 74 | 
| Nenue@6 | 75 local function Dialog_Boolean(name, key) | 
| Nenue@6 | 76   print('  Dialog_Boolean', name, key) | 
| Nenue@6 | 77   return (mod.db.timers[name][key] and true or false) | 
| Nenue@6 | 78 end | 
| Nenue@6 | 79 | 
| Nenue@6 | 80 function mod.Dialog_Select(self, key) | 
| Nenue@6 | 81   local timer | 
| Nenue@6 | 82   if self.parent_values[key] then | 
| Nenue@6 | 83     print('matched timer name', key) | 
| Nenue@6 | 84     timer = self.parent_values[key] | 
| Nenue@6 | 85   elseif rawget(mod.frames.spellID, key) then | 
| Nenue@6 | 86     print('matched spellID', key) | 
| Nenue@6 | 87     timer = mod.frames.spellID[key][1] | 
| Nenue@6 | 88     for k,v in pairs(timer) do | 
| Nenue@6 | 89       print(' -', k, '=', v) | 
| Nenue@6 | 90     end | 
| Nenue@6 | 91   end | 
| Nenue@6 | 92 | 
| Nenue@6 | 93   if timer then | 
| Nenue@6 | 94     self.values = timer | 
| Nenue@6 | 95     self.timerName = timer.timerName | 
| Nenue@6 | 96   else | 
| Nenue@6 | 97     self.values = { | 
| Nenue@6 | 98       timerName = 'New Timer' | 
| Nenue@6 | 99     } | 
| Nenue@6 | 100     self.timerName = 'New Timer' | 
| Nenue@6 | 101   end | 
| Nenue@6 | 102   mod.Dialog_Init(self, TimerConfig.conf, TimerConfig.info) | 
| Nenue@6 | 103 end | 
| Nenue@6 | 104 | 
| Nenue@6 | 105 function mod.Dialog_Init(self, dconf, dinfo) | 
| Nenue@6 | 106   print('init,', self.values.timerName) | 
| Nenue@6 | 107 | 
| Nenue@6 | 108   if not self.fields then | 
| Nenue@6 | 109     self.fields = {} | 
| Nenue@6 | 110     self.rows = {} | 
| Nenue@6 | 111     self.Click = mod.Dialog_Click | 
| Nenue@6 | 112     self.Check = mod.Dialog_Check | 
| Nenue@6 | 113     self.EditBox = mod.Dialog_EditBox | 
| Nenue@6 | 114   end | 
| Nenue@6 | 115   print(self.name, self.timerName) | 
| Nenue@6 | 116   self.name:SetText(self.timerName) | 
| Nenue@6 | 117 | 
| Nenue@6 | 118   local inset = dconf.padding + dconf.spacing | 
| Nenue@6 | 119   -- frame X max | 
| Nenue@6 | 120   local fX = 0 | 
| Nenue@6 | 121   -- row number, row Y offset | 
| Nenue@6 | 122   local rn, ry = 1, -34 | 
| Nenue@6 | 123   -- row x offset left-align, row x offset right-aligned, largest collapsed element | 
| Nenue@6 | 124   local rxL, rxR, rC, rh = dconf.spacing, dconf.spacing, 0, 0 | 
| Nenue@6 | 125   for i, opt in ipairs(dinfo) do | 
| Nenue@6 | 126     if not self.rows[rn] then | 
| Nenue@6 | 127       self.rows[rn] = CreateFrame('Frame', self:GetName()..'Row'..rn, self, 'TurokDialogRow') | 
| Nenue@6 | 128     end | 
| Nenue@6 | 129 | 
| Nenue@6 | 130     local k = opt.key | 
| Nenue@6 | 131     if self.fields[i] == nil then | 
| Nenue@6 | 132       self.fields[i] = CreateFrame(opt.type, self:GetName()..opt.name, self.rows[rn], opt.inherits or inherits[opt.type]) | 
| Nenue@6 | 133       self.fields[i].index = i | 
| Nenue@6 | 134       self.fields[i].key = k | 
| Nenue@6 | 135       -- row point (from), row point (to), row x offset | 
| Nenue@6 | 136       local rp, rpt, rx | 
| Nenue@6 | 137       -- row delta | 
| Nenue@6 | 138       local rd | 
| Nenue@6 | 139       if opt.fill then | 
| Nenue@6 | 140         rpt = opt.float and 'BOTTOMLEFT' or 'BOTTOMRIGHT' | 
| Nenue@6 | 141         -- row point X offset | 
| Nenue@6 | 142         local rpx = opt.float and dconf.spacing or -dconf.spacing | 
| Nenue@6 | 143         self.fields[i]:SetPoint(rpt, self.rows[rn], rpt, rpx, 0) | 
| Nenue@6 | 144         print('    fill:', rpt, '-', rpt,' :: ', rpx, 0) | 
| Nenue@6 | 145         rd = 0 | 
| Nenue@6 | 146       else | 
| Nenue@6 | 147         rd = self.fields[i]:GetWidth() + dconf.spacing | 
| Nenue@6 | 148       end | 
| Nenue@6 | 149       if opt.float then | 
| Nenue@6 | 150         rp = 'BOTTOMRIGHT' | 
| Nenue@6 | 151         rx = -rxR | 
| Nenue@6 | 152         rxR = rxR + rd | 
| Nenue@6 | 153       elseif opt.collapse then | 
| Nenue@6 | 154         rp = 'BOTTOMLEFT' | 
| Nenue@6 | 155         rx = dconf.spacing | 
| Nenue@6 | 156         rC = math.max(rC, rd + dconf.spacing) -- spacing L + rd{width + spacing R} | 
| Nenue@6 | 157       else | 
| Nenue@6 | 158         rp = 'BOTTOMLEFT' | 
| Nenue@6 | 159         rx = rxL | 
| Nenue@6 | 160         rxL = rxL + rd | 
| Nenue@6 | 161       end | 
| Nenue@6 | 162 | 
| Nenue@6 | 163       rh = math.max(rh, self.fields[i]:GetHeight()) | 
| Nenue@6 | 164       self.fields[i]:SetPoint(rp, self.rows[rn], rp, rx, dconf.spacing) | 
| Nenue@6 | 165       print('   align:', rp, '-', rp, ' :: ', rx, 0) | 
| Nenue@6 | 166       print('    dR:', cNum(rd), 'nR:',cWord(rn), 'rX:', cNum(rx), 'i:', cText(i)) | 
| Nenue@6 | 167 | 
| Nenue@6 | 168       if opt.line or (not dinfo[i+1]) then | 
| Nenue@6 | 169         print(cText'nR:', cNum(rn), 'rY:', cNum(ry)) | 
| Nenue@6 | 170         self.rows[rn]:ClearAllPoints() | 
| Nenue@6 | 171         self.rows[rn]:SetPoint('TOPLEFT', self, 'TOPLEFT', dconf.padding, ry) | 
| Nenue@6 | 172         self.rows[rn]:SetPoint('TOPRIGHT', self, 'TOPRIGHT', -dconf.padding, ry) | 
| Nenue@6 | 173         self.rows[rn]:SetHeight(rh + dconf.spacing*2) | 
| Nenue@6 | 174         self.rows[rn]:Show() | 
| Nenue@6 | 175         rn = rn + 1 | 
| Nenue@6 | 176         ry = ry - (rh + dconf.spacing*3) -->| {spacing T + rh + spacing B} + spacing dR |<-- | 
| Nenue@6 | 177 | 
| Nenue@6 | 178         print('fX:',cNum(fX), 'rX:', cNum(rxL+rxR+dconf.spacing), 'rC:', cNum(rC)) | 
| Nenue@6 | 179         fX = math.max(fX, rxL+rxR+dconf.spacing) | 
| Nenue@6 | 180         fX = math.max(fX, rC) | 
| Nenue@6 | 181         rxL, rxR = dconf.spacing, dconf.spacing | 
| Nenue@6 | 182         rh = 0 | 
| Nenue@6 | 183       end | 
| Nenue@6 | 184     end | 
| Nenue@6 | 185 | 
| Nenue@6 | 186     self.fields[i]:Show() | 
| Nenue@6 | 187     if opt.desc and self.fields[i].description then | 
| Nenue@6 | 188       self.fields[i].description:SetText(opt.desc) | 
| Nenue@6 | 189     end | 
| Nenue@6 | 190     Dialog_SetField[opt.type](self.fields[i], opt.get and opt.get(self.values.timerName, opt.getarg) or self.values[k]) | 
| Nenue@6 | 191 | 
| Nenue@6 | 192   end | 
| Nenue@6 | 193   if not self.initialized then | 
| Nenue@6 | 194     self.initialized = true | 
| Nenue@6 | 195     self:SetSize(fX + dconf.padding + dconf.spacing*2, dconf.padding + math.abs(ry)) | 
| Nenue@6 | 196   end | 
| Nenue@6 | 197 end | 
| Nenue@6 | 198 | 
| Nenue@6 | 199 function mod.Dialog_Click(self,...) | 
| Nenue@6 | 200   local command = self:GetName():match("_(a%+)$") | 
| Nenue@6 | 201 | 
| Nenue@6 | 202   print(command) | 
| Nenue@6 | 203 end | 
| Nenue@6 | 204 | 
| Nenue@6 | 205 function mod.Dialog_Check(self, ...) | 
| Nenue@6 | 206     print('field #', self.index, self.key, 'checked') | 
| Nenue@6 | 207   --self:SetChecked(self:GetChecked() and false or true) | 
| Nenue@6 | 208 end | 
| Nenue@6 | 209 | 
| Nenue@6 | 210 function mod.Dialog_EditBox(self, ...) | 
| Nenue@6 | 211   print('field #', self.index, self.key, 'changed', self:GetText()) | 
| Nenue@6 | 212 | 
| Nenue@6 | 213   if self.key == 'timerName' then | 
| Nenue@6 | 214     self.values.timerName = self:GetText() | 
| Nenue@6 | 215     self.name:SetText(self.values.timerName) | 
| Nenue@6 | 216     self.timerName = self.values.timerName | 
| Nenue@6 | 217   elseif self.key == 'spellID' then | 
| Nenue@6 | 218     print('handling spellID') | 
| Nenue@6 | 219   end | 
| Nenue@6 | 220 | 
| Nenue@6 | 221 end | 
| Nenue@6 | 222 | 
| Nenue@6 | 223 function mod.Dialog_Command(str, editbox) | 
| Nenue@6 | 224   --local spellID = T:GetArgs(str, 1,0) | 
| Nenue@6 | 225   local f = mod.EditDialog | 
| Nenue@6 | 226   f.values = {} | 
| Nenue@6 | 227   local db = mod.db | 
| Nenue@6 | 228 | 
| Nenue@6 | 229 | 
| Nenue@6 | 230   local func, t, z = pairs(db.timers) -- iterator, table | 
| Nenue@6 | 231   local name, values, y = func(t)  -- index, values | 
| Nenue@6 | 232   f.parent_values = {[name] = values} | 
| Nenue@6 | 233   f.timerName = name | 
| Nenue@6 | 234   f.values = values | 
| Nenue@6 | 235   f.values.timerName = name | 
| Nenue@6 | 236   for k,v in pairs(f.values) do | 
| Nenue@6 | 237     print(cText(k), cType(v)) | 
| Nenue@6 | 238   end | 
| Nenue@6 | 239   print('pairs1', func, t) | 
| Nenue@6 | 240   print('pairs2', z, y) | 
| Nenue@6 | 241   name, values = func(t, name) | 
| Nenue@6 | 242   while name do | 
| Nenue@6 | 243     print(' entry:', name, values) | 
| Nenue@6 | 244     f.parent_values[name] = values | 
| Nenue@6 | 245     name, values = func(t, name) | 
| Nenue@6 | 246   end | 
| Nenue@6 | 247 | 
| Nenue@6 | 248 | 
| Nenue@6 | 249 | 
| Nenue@6 | 250   if f:IsVisible() then | 
| Nenue@6 | 251     f:Hide() | 
| Nenue@6 | 252   else | 
| Nenue@6 | 253     mod.Dialog_Init(f, TimerConfig.conf, TimerConfig.info) | 
| Nenue@6 | 254 | 
| Nenue@6 | 255     f:Show() | 
| Nenue@6 | 256   end | 
| Nenue@6 | 257 end |