| 
Nenue@6
 | 
     1 local _G, T = _G, Turok
 | 
| 
Nenue@6
 | 
     2 local mod = T.modules.TimerControl
 | 
| 
Nenue@6
 | 
     3 local P = mod.prototype
 | 
| 
Nenue@6
 | 
     4 local GetInventoryItemID, GetItemInfo, GetInventoryItemTexture = GetInventoryItemID, GetItemInfo, GetInventoryItemTexture
 | 
| 
Nenue@6
 | 
     5 local GetSpellDescription, GetSpellInfo, GetSpellCharges = GetSpellDescription, GetSpellInfo, GetSpellCharges
 | 
| 
Nenue@6
 | 
     6 local GetTalentRowSelectionInfo = GetTalentRowSelectionInfo
 | 
| 
Nenue@6
 | 
     7 local tinsert, type, tonumber, pairs, ipairs, unpack = tinsert, type, tonumber, pairs, ipairs, unpack
 | 
| 
Nenue@6
 | 
     8 local UnitGUID = UnitGUID
 | 
| 
Nenue@6
 | 
     9 local GetTalentInfo, GetTalentInfoByID, GetItemSpell, PaperDoll_IsEquippedSlot = GetTalentInfo, GetTalentInfoByID, GetItemSpell, PaperDoll_IsEquippedSlot
 | 
| 
Nenue@6
 | 
    10 local print = function(...) print('Timer', ...) end
 | 
| 
Nenue@6
 | 
    11 print('Peep!', ...)
 | 
| 
Nenue@6
 | 
    12 
 | 
| 
Nenue@6
 | 
    13 --@debug@
 | 
| 
Nenue@6
 | 
    14 local DEBUG = true
 | 
| 
Nenue@6
 | 
    15 --@end-debug@
 | 
| 
Nenue@6
 | 
    16 local cType, cText, cNum, cWord, cKey, cPink, cBool = cType, cText, cNum, cWord, cKey, cPink, cBool
 | 
| 
Nenue@6
 | 
    17 local print = function(...)
 | 
| 
Nenue@6
 | 
    18   if not DEBUG then return end
 | 
| 
Nenue@6
 | 
    19   if _G.Devian and _G.DevianDB.workspace ~= 1 then
 | 
| 
Nenue@6
 | 
    20     _G.print('Timer', ...)
 | 
| 
Nenue@6
 | 
    21   end
 | 
| 
Nenue@6
 | 
    22 end
 | 
| 
Nenue@6
 | 
    23 ------------------------------------------
 | 
| 
Nenue@6
 | 
    24 --- Parameter Prototypes
 | 
| 
Nenue@6
 | 
    25 
 | 
| 
Nenue@6
 | 
    26 local Timer_GetPrintHandler = function(self)
 | 
| 
Nenue@6
 | 
    27   return self.trace and function(...)
 | 
| 
Nenue@6
 | 
    28     print(...)
 | 
| 
Nenue@6
 | 
    29     _G.print('TimerFocus', ...)
 | 
| 
Nenue@6
 | 
    30   end or print
 | 
| 
Nenue@6
 | 
    31 end
 | 
| 
Nenue@6
 | 
    32 
 | 
| 
Nenue@6
 | 
    33 local Timer_UpdateIndex = function(self, key, value)
 | 
| 
Nenue@6
 | 
    34   local print = Timer_GetPrintHandler(self)
 | 
| 
Nenue@6
 | 
    35   --       sfk[value] = frame index key-value handle
 | 
| 
Nenue@6
 | 
    36   --             mfkv = key-value frame index
 | 
| 
Nenue@6
 | 
    37   -- mfkv[sfk[value]] = *frame
 | 
| 
Nenue@6
 | 
    38   if self.frames[key] then
 | 
| 
Nenue@6
 | 
    39     local sfk = self.frames[key]
 | 
| 
Nenue@6
 | 
    40     -- for each unique value
 | 
| 
Nenue@6
 | 
    41     for oldValue, index in pairs(sfk) do
 | 
| 
Nenue@6
 | 
    42       local mfkv = mod.frames[key][oldValue]
 | 
| 
Nenue@6
 | 
    43       -- for each offset after index
 | 
| 
Nenue@6
 | 
    44       for i = index+1, #mfkv do
 | 
| 
Nenue@6
 | 
    45         mfkv[i-1] = mfkv[i] -- slide it down
 | 
| 
Nenue@6
 | 
    46       end
 | 
| 
Nenue@6
 | 
    47       sfk[oldValue] = nil
 | 
| 
Nenue@6
 | 
    48       print(cText('    *= self.frames')..'['..cKey(key)..']['..cNum(value)..'] =', cNum(self.frames[key][value]))
 | 
| 
Nenue@6
 | 
    49       print(cText('    *= mod.frames')..'['..cKey(key)..']['..cNum(value)..']['..cNum(index)..'] =', cNum(self:GetName()))
 | 
| 
Nenue@6
 | 
    50     end
 | 
| 
Nenue@6
 | 
    51   else
 | 
| 
Nenue@6
 | 
    52     self.frames[key] = {}
 | 
| 
Nenue@6
 | 
    53   end
 | 
| 
Nenue@6
 | 
    54 
 | 
| 
Nenue@6
 | 
    55   if value then
 | 
| 
Nenue@6
 | 
    56     local mfkv = mod.frames[key][value]
 | 
| 
Nenue@6
 | 
    57     local sfk = self.frames[key]
 | 
| 
Nenue@6
 | 
    58     mfkv[#mfkv+1] = self
 | 
| 
Nenue@6
 | 
    59     sfk[value] = #mfkv
 | 
| 
Nenue@6
 | 
    60     print('    *= self.frames['..cKey(key)..']['..cNum(value)..'] = ', sfk[value])
 | 
| 
Nenue@6
 | 
    61   end
 | 
| 
Nenue@6
 | 
    62 end
 | 
| 
Nenue@6
 | 
    63 
 | 
| 
Nenue@6
 | 
    64 --- spellID
 | 
| 
Nenue@6
 | 
    65 do
 | 
| 
Nenue@6
 | 
    66   local spellID = P.status.spellID
 | 
| 
Nenue@6
 | 
    67   spellID.Init = function(self, spellID)
 | 
| 
Nenue@6
 | 
    68     local print = Timer_GetPrintHandler(self)
 | 
| 
Nenue@6
 | 
    69 
 | 
| 
Nenue@6
 | 
    70     if type(spellID) == 'table' then
 | 
| 
Nenue@6
 | 
    71       spellID = spellID[T.specPage]
 | 
| 
Nenue@6
 | 
    72     end
 | 
| 
Nenue@6
 | 
    73 
 | 
| 
Nenue@6
 | 
    74     -- May have changed if invoked through a slot assignment
 | 
| 
Nenue@6
 | 
    75     if spellID ~= self.spellID then
 | 
| 
Nenue@6
 | 
    76       self.spellID = spellID
 | 
| 
Nenue@6
 | 
    77       self.charges, self.maxCharges, self.chargeStart, self.chargeDuration = GetSpellCharges(spellID)
 | 
| 
Nenue@6
 | 
    78       self.spellDescription = GetSpellDescription(spellID)
 | 
| 
Nenue@6
 | 
    79       self.spellName, self.spellRank, self.spellIcon, self.castingTime, self.minRange, self.maxRange = GetSpellInfo(spellID)
 | 
| 
Nenue@6
 | 
    80       --@debug@
 | 
| 
Nenue@6
 | 
    81       print('   ', cWord('spellID ='), cKey(self.spellID), cNum(self.spellName), cText(self.spellDescription and '<desc>' or '<empty>'))--@end-debug@
 | 
| 
Nenue@6
 | 
    82 
 | 
| 
Nenue@6
 | 
    83       Timer_UpdateIndex(self, 'spellID', spellID)
 | 
| 
Nenue@6
 | 
    84     end
 | 
| 
Nenue@6
 | 
    85   end
 | 
| 
Nenue@6
 | 
    86 end
 | 
| 
Nenue@6
 | 
    87 
 | 
| 
Nenue@6
 | 
    88 --- spellName
 | 
| 
Nenue@6
 | 
    89 do
 | 
| 
Nenue@6
 | 
    90   local spellName = P.status.spellName
 | 
| 
Nenue@6
 | 
    91   spellName.Init = function(self, spellName)
 | 
| 
Nenue@6
 | 
    92     local print = Timer_GetPrintHandler(self)
 | 
| 
Nenue@6
 | 
    93     -- attempt to get spell info
 | 
| 
Nenue@6
 | 
    94     local exists, _, _, _, _, _, spellID =  GetSpellInfo(spellName)
 | 
| 
Nenue@6
 | 
    95     if exists then
 | 
| 
Nenue@6
 | 
    96       local charges, maxCharges, start, duration = GetSpellCharges(spellID or spellName)
 | 
| 
Nenue@6
 | 
    97       Timer_UpdateIndex(self, 'spellName', nil)
 | 
| 
Nenue@6
 | 
    98       print('   ', cKey("spellID"), '=', spellID)
 | 
| 
Nenue@6
 | 
    99       P.status.spellID.Init(self, spellID)
 | 
| 
Nenue@6
 | 
   100     else
 | 
| 
Nenue@6
 | 
   101       print('   ', cPink("spellID"), '=', 'not sure')
 | 
| 
Nenue@6
 | 
   102       Timer_UpdateIndex(self, 'spellID', nil)
 | 
| 
Nenue@6
 | 
   103       Timer_UpdateIndex(self, 'spellName', spellName)
 | 
| 
Nenue@6
 | 
   104     end
 | 
| 
Nenue@6
 | 
   105   end
 | 
| 
Nenue@6
 | 
   106 end
 | 
| 
Nenue@6
 | 
   107 
 | 
| 
Nenue@6
 | 
   108 
 | 
| 
Nenue@6
 | 
   109 --- talentID
 | 
| 
Nenue@6
 | 
   110 do
 | 
| 
Nenue@6
 | 
   111   local talentID = P.status.talentID
 | 
| 
Nenue@6
 | 
   112   local GetTalentInfoByID = GetTalentInfoByID
 | 
| 
Nenue@6
 | 
   113   talentID.type = 'status'
 | 
| 
Nenue@6
 | 
   114   talentID.Init = function(self, talentID)
 | 
| 
Nenue@6
 | 
   115     local print = Timer_GetPrintHandler(self)
 | 
| 
Nenue@6
 | 
   116 
 | 
| 
Nenue@6
 | 
   117     self.talentID, self.spellName, self.spellIcon, self.talentSelected = GetTalentInfoByID(talentID, T.specGroup)
 | 
| 
Nenue@6
 | 
   118 
 | 
| 
Nenue@6
 | 
   119     if self.talentSelected then
 | 
| 
Nenue@6
 | 
   120       print('   ', cKey("spellName"), '=', cWord(self.spellName))
 | 
| 
Nenue@6
 | 
   121       P.status.spellName.Init(self, self.spellName)
 | 
| 
Nenue@6
 | 
   122     else
 | 
| 
Nenue@6
 | 
   123       self.disable =  true
 | 
| 
Nenue@6
 | 
   124       self.debug_info ('Talent not selected.')
 | 
| 
Nenue@6
 | 
   125     end
 | 
| 
Nenue@6
 | 
   126 
 | 
| 
Nenue@6
 | 
   127     print('   ', cKey('talentID ('..cNum(self.talentID)..', '..cNum(T.specGroup)..'):'), self.spellName, self.talentSelected )
 | 
| 
Nenue@6
 | 
   128     Timer_UpdateIndex(self, 'talentID', talentID)
 | 
| 
Nenue@6
 | 
   129 
 | 
| 
Nenue@6
 | 
   130   end
 | 
| 
Nenue@6
 | 
   131 end
 | 
| 
Nenue@6
 | 
   132 
 | 
| 
Nenue@6
 | 
   133 --- talentRow - use whatever is in that row as data
 | 
| 
Nenue@6
 | 
   134 do
 | 
| 
Nenue@6
 | 
   135   local talentRow = P.status.talentRow
 | 
| 
Nenue@6
 | 
   136   talentRow.Init = function(self, row)
 | 
| 
Nenue@6
 | 
   137     local print = Timer_GetPrintHandler(self)
 | 
| 
Nenue@6
 | 
   138     self.talentRow = row
 | 
| 
Nenue@6
 | 
   139     local noSelect, talentID = GetTalentRowSelectionInfo(row)
 | 
| 
Nenue@6
 | 
   140     if noSelect then
 | 
| 
Nenue@6
 | 
   141       self.disable = true
 | 
| 
Nenue@6
 | 
   142       self.debug_info("No talent selected in target row.")
 | 
| 
Nenue@6
 | 
   143     else
 | 
| 
Nenue@6
 | 
   144       P.status.talentID.Init(self, talentID)
 | 
| 
Nenue@6
 | 
   145     end
 | 
| 
Nenue@6
 | 
   146     print('   ', cKey('talentRow ('.. cNum(row).. ') ='), talentID or 'none')
 | 
| 
Nenue@6
 | 
   147     Timer_UpdateIndex(self, 'talentRow', row)
 | 
| 
Nenue@6
 | 
   148   end
 | 
| 
Nenue@6
 | 
   149 end
 | 
| 
Nenue@6
 | 
   150 
 | 
| 
Nenue@6
 | 
   151 
 | 
| 
Nenue@6
 | 
   152 --- talentOffset
 | 
| 
Nenue@6
 | 
   153 do
 | 
| 
Nenue@6
 | 
   154   local talentOffset = P.status.talentOffset
 | 
| 
Nenue@6
 | 
   155   talentOffset.Init = function(self, coords)
 | 
| 
Nenue@6
 | 
   156     local print = Timer_GetPrintHandler(self)
 | 
| 
Nenue@6
 | 
   157 
 | 
| 
Nenue@6
 | 
   158     local tier, column = unpack(coords)
 | 
| 
Nenue@6
 | 
   159 
 | 
| 
Nenue@6
 | 
   160 
 | 
| 
Nenue@6
 | 
   161     local selected, usable, _
 | 
| 
Nenue@6
 | 
   162     self.talentID, self.spellName, self.spellIcon, selected, usable = GetTalentInfo(tier, column, T.specGroup)
 | 
| 
Nenue@6
 | 
   163     print('   ', cKey('talentOffset'), '=', cNum(tier), cNum(column), self.spellName, selected, usable)
 | 
| 
Nenue@6
 | 
   164     if not (selected and usable) then
 | 
| 
Nenue@6
 | 
   165       self.disable =  true
 | 
| 
Nenue@6
 | 
   166       self.debug_info ((not usable) and 'Unavailable at current level.' or 'Talent not selected.')
 | 
| 
Nenue@6
 | 
   167     end
 | 
| 
Nenue@6
 | 
   168     Timer_UpdateIndex(self, 'talentID', self.talentID)
 | 
| 
Nenue@6
 | 
   169   end
 | 
| 
Nenue@6
 | 
   170 end
 | 
| 
Nenue@6
 | 
   171 
 | 
| 
Nenue@6
 | 
   172 --- specPage
 | 
| 
Nenue@6
 | 
   173 do
 | 
| 
Nenue@6
 | 
   174   local specPage = P.status.specPage
 | 
| 
Nenue@6
 | 
   175   specPage.type = 'status'
 | 
| 
Nenue@6
 | 
   176   specPage.Init = function(self, specPage)
 | 
| 
Nenue@6
 | 
   177     local print = Timer_GetPrintHandler(self)
 | 
| 
Nenue@6
 | 
   178     local match
 | 
| 
Nenue@6
 | 
   179     if tonumber(specPage) then
 | 
| 
Nenue@6
 | 
   180       match = specPage == T.specPage
 | 
| 
Nenue@6
 | 
   181     elseif type(specPage) == 'table' then
 | 
| 
Nenue@6
 | 
   182       for _, pageID in ipairs(specPage) do
 | 
| 
Nenue@6
 | 
   183         if T.specPage == pageID then
 | 
| 
Nenue@6
 | 
   184           specPage = pageID
 | 
| 
Nenue@6
 | 
   185           match = true
 | 
| 
Nenue@6
 | 
   186           break
 | 
| 
Nenue@6
 | 
   187         end
 | 
| 
Nenue@6
 | 
   188       end
 | 
| 
Nenue@6
 | 
   189     else
 | 
| 
Nenue@6
 | 
   190       self.disable =  true
 | 
| 
Nenue@6
 | 
   191       self.debug_info ('Bad value for', '('..cWord(self.timerName)..').'..cKey('specPage'))
 | 
| 
Nenue@6
 | 
   192       Timer_UpdateIndex(self,'specPage', nil)
 | 
| 
Nenue@6
 | 
   193     end
 | 
| 
Nenue@6
 | 
   194 
 | 
| 
Nenue@6
 | 
   195     if match then
 | 
| 
Nenue@6
 | 
   196       print('   ', cKey('specPage'), '=', '['..cNum(specPage)..']')
 | 
| 
Nenue@6
 | 
   197       Timer_UpdateIndex(self,'specPage', specPage)
 | 
| 
Nenue@6
 | 
   198     else
 | 
| 
Nenue@6
 | 
   199       print('   ', cKey('specPage'), '~=', '['..cNum(specPage)..']')
 | 
| 
Nenue@6
 | 
   200       self.disable = true
 | 
| 
Nenue@6
 | 
   201       self.debug_info('Not active spec.')
 | 
| 
Nenue@6
 | 
   202     end
 | 
| 
Nenue@6
 | 
   203   end
 | 
| 
Nenue@6
 | 
   204 end
 | 
| 
Nenue@6
 | 
   205 
 | 
| 
Nenue@6
 | 
   206 --- itemID
 | 
| 
Nenue@6
 | 
   207 do
 | 
| 
Nenue@6
 | 
   208   local itemID = P.status.itemID
 | 
| 
Nenue@6
 | 
   209   itemID.type  = 'status'
 | 
| 
Nenue@6
 | 
   210   itemID.Init = function(self, item)
 | 
| 
Nenue@6
 | 
   211     local print = Timer_GetPrintHandler(self)
 | 
| 
Nenue@6
 | 
   212 
 | 
| 
Nenue@6
 | 
   213     if not self.dvars.inventoryID then
 | 
| 
Nenue@6
 | 
   214       self.itemID = item or self.dvars.itemID
 | 
| 
Nenue@6
 | 
   215       self.itemType = self.dvars.itemType
 | 
| 
Nenue@6
 | 
   216     else
 | 
| 
Nenue@6
 | 
   217       self.itemID = item
 | 
| 
Nenue@6
 | 
   218     end
 | 
| 
Nenue@6
 | 
   219 
 | 
| 
Nenue@6
 | 
   220     --@debug@
 | 
| 
Nenue@6
 | 
   221     --name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(itemID) or GetItemInfo("itemName") or GetItemInfo("itemLink")
 | 
| 
Nenue@6
 | 
   222     if not self.itemID then
 | 
| 
Nenue@6
 | 
   223       self.disable =  true
 | 
| 
Nenue@6
 | 
   224        self.debug_info ('bad itemID value')
 | 
| 
Nenue@6
 | 
   225     end
 | 
| 
Nenue@6
 | 
   226 
 | 
| 
Nenue@6
 | 
   227     self.spellName = GetItemSpell(self.itemID)
 | 
| 
Nenue@6
 | 
   228 
 | 
| 
Nenue@6
 | 
   229     if not self.spellName then
 | 
| 
Nenue@6
 | 
   230       self.disable =  true
 | 
| 
Nenue@6
 | 
   231        self.debug_info('no spell detected')
 | 
| 
Nenue@6
 | 
   232     else
 | 
| 
Nenue@6
 | 
   233       if not (self.frames.spellName and self.frames.spellName[self.spellName]) then
 | 
| 
Nenue@6
 | 
   234         if not self.frames.spellName then
 | 
| 
Nenue@6
 | 
   235           self.frames.spellName = {}
 | 
| 
Nenue@6
 | 
   236         end
 | 
| 
Nenue@6
 | 
   237 
 | 
| 
Nenue@6
 | 
   238         Timer_UpdateIndex(self, 'spellName', self.spellName)
 | 
| 
Nenue@6
 | 
   239       end
 | 
| 
Nenue@6
 | 
   240     end
 | 
| 
Nenue@6
 | 
   241     print('   ', cKey('itemID'), cNum(self.itemID), self.isEquipped)--@end-debug@
 | 
| 
Nenue@6
 | 
   242   end
 | 
| 
Nenue@6
 | 
   243 end
 | 
| 
Nenue@6
 | 
   244 
 | 
| 
Nenue@6
 | 
   245 do
 | 
| 
Nenue@6
 | 
   246   local inventoryID = P.status.inventoryID
 | 
| 
Nenue@6
 | 
   247   inventoryID.type = 'status'
 | 
| 
Nenue@6
 | 
   248   inventoryID.Init = function(self, slot)
 | 
| 
Nenue@6
 | 
   249     local print = Timer_GetPrintHandler(self)
 | 
| 
Nenue@6
 | 
   250 
 | 
| 
Nenue@6
 | 
   251     self.inventoryID = slot
 | 
| 
Nenue@6
 | 
   252     self.itemID = GetInventoryItemID(self.dvars.unit, slot)
 | 
| 
Nenue@6
 | 
   253     local name = GetItemInfo(self.itemID)
 | 
| 
Nenue@6
 | 
   254     if not PaperDoll_IsEquippedSlot(slot) then
 | 
| 
Nenue@6
 | 
   255       self.disable = true
 | 
| 
Nenue@6
 | 
   256       self.debug_info('slot un-equipped')
 | 
| 
Nenue@6
 | 
   257       return
 | 
| 
Nenue@6
 | 
   258     end
 | 
| 
Nenue@6
 | 
   259 
 | 
| 
Nenue@6
 | 
   260     P.status.itemID.Init(self, self.itemID)
 | 
| 
Nenue@6
 | 
   261     self.spellIcon = GetInventoryItemTexture(self.dvars.unit, slot)
 | 
| 
Nenue@6
 | 
   262     print('   ', cKey('inventoryID'), '=', '{'..cNum(self.inventoryID).. ' -> '.. cNum(self.itemID or 'no-equip').. '}')
 | 
| 
Nenue@6
 | 
   263   end
 | 
| 
Nenue@6
 | 
   264 end
 | 
| 
Nenue@6
 | 
   265 
 | 
| 
Nenue@6
 | 
   266 
 | 
| 
Nenue@6
 | 
   267 --- unit
 | 
| 
Nenue@6
 | 
   268 local unit = P.status.unit
 | 
| 
Nenue@6
 | 
   269 unit.type = 'status'
 | 
| 
Nenue@6
 | 
   270 unit.Init = function(self, unit)
 | 
| 
Nenue@6
 | 
   271   local print = Timer_GetPrintHandler(self)
 | 
| 
Nenue@6
 | 
   272 
 | 
| 
Nenue@6
 | 
   273   self.unitGUID = UnitGUID(unit)
 | 
| 
Nenue@6
 | 
   274   self.unit = unit
 | 
| 
Nenue@6
 | 
   275   print('   ', cWord('unitGUID'), '=', cText(self.unitGUID))
 | 
| 
Nenue@6
 | 
   276   tinsert(mod.frames.unit[unit], self)
 | 
| 
Nenue@6
 | 
   277   self.frames.unit = #mod.frames.unit[unit]
 | 
| 
Nenue@6
 | 
   278 end |