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