| 
Nenue@6
 | 
     1 --- ${PACKAGE_NAME}
 | 
| 
Nenue@6
 | 
     2 -- @file-author@
 | 
| 
Nenue@6
 | 
     3 -- @project-revision@ @project-hash@
 | 
| 
Nenue@6
 | 
     4 -- @file-revision@ @file-hash@
 | 
| 
Nenue@6
 | 
     5 -- Created: 1/16/2016 12:20 AM
 | 
| 
Nenue@6
 | 
     6 local _G, CreateFrame = _G, CreateFrame
 | 
| 
Nenue@6
 | 
     7 local T, tinsert, UIParent = _G.Turok, table.insert, _G.UIParent
 | 
| 
Nenue@6
 | 
     8 local mod = T.modules.TimerControl
 | 
| 
Nenue@6
 | 
     9 local db, CollectorTray
 | 
| 
Nenue@6
 | 
    10 
 | 
| 
Nenue@6
 | 
    11 local pairs, ipairs, gsub, sub, setmetatable = pairs, ipairs, string.gsub, string.sub, setmetatable
 | 
| 
Nenue@6
 | 
    12 local INVTYPE_FINGER, INVSLOT_FINGER1, INVSLOT_FINGER2, INVTYPE_TRINKET, INVSLOT_TRINKET1, INVSLOT_TRINKET2 =
 | 
| 
Nenue@6
 | 
    13 INVTYPE_FINGER, INVSLOT_FINGER1, INVSLOT_FINGER2, INVTYPE_TRINKET, INVSLOT_TRINKET1, INVSLOT_TRINKET2
 | 
| 
Nenue@6
 | 
    14 --@debug@
 | 
| 
Nenue@6
 | 
    15 local DEBUG = true
 | 
| 
Nenue@6
 | 
    16 --@end-debug@
 | 
| 
Nenue@6
 | 
    17 local cType, cText, cNum, cWord, cKey, cPink, cBool = cType, cText, cNum, cWord, cKey, cPink, cBool
 | 
| 
Nenue@6
 | 
    18 local print = function(...)
 | 
| 
Nenue@6
 | 
    19   if not DEBUG then return end
 | 
| 
Nenue@6
 | 
    20   if _G.Devian and _G.DevianDB.workspace ~= 1 then
 | 
| 
Nenue@6
 | 
    21     _G.print('TimerContainer', ...)
 | 
| 
Nenue@6
 | 
    22   end
 | 
| 
Nenue@6
 | 
    23 end
 | 
| 
Nenue@6
 | 
    24 
 | 
| 
Nenue@6
 | 
    25 --- defaults
 | 
| 
Nenue@6
 | 
    26 local Containers = {}
 | 
| 
Nenue@6
 | 
    27 
 | 
| 
Nenue@6
 | 
    28 --- manages collections of timer displays
 | 
| 
Nenue@6
 | 
    29 local TimerContainer_Init = function(frame, cvars)
 | 
| 
Nenue@6
 | 
    30 
 | 
| 
Nenue@6
 | 
    31   frame.num_timers = 0
 | 
| 
Nenue@6
 | 
    32   frame.anchor = cvars.anchor
 | 
| 
Nenue@6
 | 
    33   frame.parent = cvars.parent
 | 
| 
Nenue@6
 | 
    34   frame.anchorTo = cvars.anchorTo
 | 
| 
Nenue@6
 | 
    35   frame.x = cvars.x
 | 
| 
Nenue@6
 | 
    36   frame.y = cvars.y
 | 
| 
Nenue@6
 | 
    37   frame.name = cvars.name
 | 
| 
Nenue@6
 | 
    38   frame.padding = cvars.padding
 | 
| 
Nenue@6
 | 
    39   frame.spacing = cvars.spacing
 | 
| 
Nenue@6
 | 
    40   frame.width = cvars.width
 | 
| 
Nenue@6
 | 
    41   frame.height = cvars.height
 | 
| 
Nenue@6
 | 
    42   frame.timers = {}
 | 
| 
Nenue@6
 | 
    43   frame.childAnchor = cvars.childAnchor
 | 
| 
Nenue@6
 | 
    44   frame.childAnchorTo = cvars.childAnchorTo
 | 
| 
Nenue@6
 | 
    45 
 | 
| 
Nenue@6
 | 
    46   frame:ClearAllPoints()
 | 
| 
Nenue@6
 | 
    47   frame:SetPoint(cvars.anchor, cvars.parent, cvars.anchorTo, cvars.x, cvars.y)
 | 
| 
Nenue@6
 | 
    48   frame:SetSize(cvars.width, cvars.height) -- initial values
 | 
| 
Nenue@6
 | 
    49   frame.NameText:SetText(frame.name)
 | 
| 
Nenue@6
 | 
    50 end
 | 
| 
Nenue@6
 | 
    51 
 | 
| 
Nenue@6
 | 
    52 local TimerContainer_Add = function(frame, timer)
 | 
| 
Nenue@6
 | 
    53   if timer.containerHandle then
 | 
| 
Nenue@6
 | 
    54     print('stop now')
 | 
| 
Nenue@6
 | 
    55     return
 | 
| 
Nenue@6
 | 
    56   end
 | 
| 
Nenue@6
 | 
    57   timer.containerHandle = 1
 | 
| 
Nenue@6
 | 
    58 
 | 
| 
Nenue@6
 | 
    59   print('adding', timer.timerName, 'to', frame.name)
 | 
| 
Nenue@6
 | 
    60   local handle = frame.num_timers + 1
 | 
| 
Nenue@6
 | 
    61   -- if the timer is ordered, start from the top and shift each item upward until they are no longer
 | 
| 
Nenue@6
 | 
    62   -- above the
 | 
| 
Nenue@6
 | 
    63   print('resulting handle:', handle)
 | 
| 
Nenue@6
 | 
    64   print(#frame.timers)
 | 
| 
Nenue@6
 | 
    65 
 | 
| 
Nenue@6
 | 
    66   frame.num_timers = frame.num_timers + 1
 | 
| 
Nenue@6
 | 
    67 
 | 
| 
Nenue@6
 | 
    68   tinsert(frame.timers, timer)
 | 
| 
Nenue@6
 | 
    69   timer.containerHandle = #frame.timers
 | 
| 
Nenue@6
 | 
    70   --frame.timers[handle] = timer
 | 
| 
Nenue@6
 | 
    71 end
 | 
| 
Nenue@6
 | 
    72 
 | 
| 
Nenue@6
 | 
    73 local TimerContainer_Unlock = function(frame)
 | 
| 
Nenue@6
 | 
    74 
 | 
| 
Nenue@6
 | 
    75 end
 | 
| 
Nenue@6
 | 
    76 
 | 
| 
Nenue@6
 | 
    77 local TimerContainer_Update = function(frame)
 | 
| 
Nenue@6
 | 
    78   local frameCount, hiddenCount = 0, 0
 | 
| 
Nenue@6
 | 
    79   local w = frame.padding
 | 
| 
Nenue@6
 | 
    80   local translation_points = {}
 | 
| 
Nenue@6
 | 
    81   local dx, dy = 0, 0 -- net change in container dimensions
 | 
| 
Nenue@6
 | 
    82   for k, spirit in pairs(frame.timers) do
 | 
| 
Nenue@6
 | 
    83     hiddenCount = hiddenCount + 1
 | 
| 
Nenue@6
 | 
    84     if spirit:IsVisible() and not(spirit.trash or spirit.cvars.absolute) then
 | 
| 
Nenue@6
 | 
    85       frameCount = frameCount + 1
 | 
| 
Nenue@6
 | 
    86       spirit.index = frameCount
 | 
| 
Nenue@6
 | 
    87       print('  -', cNum(hiddenCount), cNum(frameCount), cKey(spirit:GetName()))
 | 
| 
Nenue@6
 | 
    88       --tinsert(frame.timers, spirit)
 | 
| 
Nenue@6
 | 
    89       spirit:ClearAllPoints()
 | 
| 
Nenue@6
 | 
    90       local tx = w
 | 
| 
Nenue@6
 | 
    91       local ty = 0
 | 
| 
Nenue@6
 | 
    92       if spirit.cvars.relative then
 | 
| 
Nenue@6
 | 
    93         tx = tx + spirit.cvars.x
 | 
| 
Nenue@6
 | 
    94         ty = ty + spirit.cvars.y
 | 
| 
Nenue@6
 | 
    95       else
 | 
| 
Nenue@6
 | 
    96         w = w + spirit:GetWidth() + frame.spacing
 | 
| 
Nenue@6
 | 
    97       end
 | 
| 
Nenue@6
 | 
    98       translation_points[k] = {
 | 
| 
Nenue@6
 | 
    99         x = spirit.cvars.x, y = spirit.cvars.y,
 | 
| 
Nenue@6
 | 
   100         dx = tx - spirit.cvars.x, dy = ty - spirit.cvars.y
 | 
| 
Nenue@6
 | 
   101       }
 | 
| 
Nenue@6
 | 
   102     end
 | 
| 
Nenue@6
 | 
   103 
 | 
| 
Nenue@6
 | 
   104     --- track the size of in/outbound frames
 | 
| 
Nenue@6
 | 
   105     if not spirit.collected then
 | 
| 
Nenue@6
 | 
   106       if spirit.trash then
 | 
| 
Nenue@6
 | 
   107         dx = dx - spirit.width
 | 
| 
Nenue@6
 | 
   108       elseif spirit.add then
 | 
| 
Nenue@6
 | 
   109         dx = dx + spirit.width
 | 
| 
Nenue@6
 | 
   110       end
 | 
| 
Nenue@6
 | 
   111       spirit.collected = true
 | 
| 
Nenue@6
 | 
   112     end
 | 
| 
Nenue@6
 | 
   113   end
 | 
| 
Nenue@6
 | 
   114   print(cText('  dx:'), cNum(dx))
 | 
| 
Nenue@6
 | 
   115 
 | 
| 
Nenue@6
 | 
   116 
 | 
| 
Nenue@6
 | 
   117   frame.width = frame.width + dx
 | 
| 
Nenue@6
 | 
   118   frame:SetWidth(frame.width)
 | 
| 
Nenue@6
 | 
   119   local ddX = dx / frameCount
 | 
| 
Nenue@6
 | 
   120 
 | 
| 
Nenue@6
 | 
   121   for id, a in pairs(translation_points) do
 | 
| 
Nenue@6
 | 
   122     local spirit = frame.timers[id]
 | 
| 
Nenue@6
 | 
   123 
 | 
| 
Nenue@6
 | 
   124 
 | 
| 
Nenue@6
 | 
   125     spirit.slide.t1:SetOffset(a.dx, a.dy)
 | 
| 
Nenue@6
 | 
   126     spirit.slide:SetScript('OnFinished', function()
 | 
| 
Nenue@6
 | 
   127       spirit.cvars.x = a.x + a.dx
 | 
| 
Nenue@6
 | 
   128       spirit.cvars.y = a.y + a.dy
 | 
| 
Nenue@6
 | 
   129       spirit:SetPoint(frame.childAnchor, frame, frame.childAnchorTo, spirit.cvars.x, spirit.cvars.y)
 | 
| 
Nenue@6
 | 
   130     end)
 | 
| 
Nenue@6
 | 
   131     spirit.slide:Play()
 | 
| 
Nenue@6
 | 
   132   end
 | 
| 
Nenue@6
 | 
   133 end
 | 
| 
Nenue@6
 | 
   134 
 | 
| 
Nenue@6
 | 
   135 --- Updates the appropriate containers' object positions
 | 
| 
Nenue@6
 | 
   136 function mod.Report(self)
 | 
| 
Nenue@6
 | 
   137     if not self.container then
 | 
| 
Nenue@6
 | 
   138       self.container = 'default'
 | 
| 
Nenue@6
 | 
   139       print('reporting to default container')
 | 
| 
Nenue@6
 | 
   140     else
 | 
| 
Nenue@6
 | 
   141       print('reporting to container', self.container)
 | 
| 
Nenue@6
 | 
   142     end
 | 
| 
Nenue@6
 | 
   143 
 | 
| 
Nenue@6
 | 
   144     if not Containers[self.container] then
 | 
| 
Nenue@6
 | 
   145       print('need to create')
 | 
| 
Nenue@6
 | 
   146       Containers[self.container] = CreateFrame('Frame', 'TkCollectorFrame'..self.container, UIParent, 'TkContainerTemplate')
 | 
| 
Nenue@6
 | 
   147       TimerContainer_Init(Containers[self.container], mod.db.containers[self.container] or mod.db.containers)
 | 
| 
Nenue@6
 | 
   148     end
 | 
| 
Nenue@6
 | 
   149 
 | 
| 
Nenue@6
 | 
   150     if not self.containerHandle then
 | 
| 
Nenue@6
 | 
   151       TimerContainer_Add(Containers[self.container], self)
 | 
| 
Nenue@6
 | 
   152     else
 | 
| 
Nenue@6
 | 
   153       print(self.timerName, 'has a container assigned')
 | 
| 
Nenue@6
 | 
   154     end
 | 
| 
Nenue@6
 | 
   155     TimerContainer_Update(Containers[self.container])
 | 
| 
Nenue@6
 | 
   156 end |