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