diff Init.lua @ 0:3dbcad2b387d

initial push
author Nenue
date Wed, 30 Mar 2016 02:24:56 -0400
parents
children 3397aae1f44d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Init.lua	Wed Mar 30 02:24:56 2016 -0400
@@ -0,0 +1,371 @@
+--- Modulizer framework
+-- OnInitialize
+-- OnUpdate
+-- OnEnable     -- run when GetSpecialization() returns true
+
+local ADDON, A = ...
+Veneer = Veneer or CreateFrame('Frame', 'Veneer', UIParent)
+local B = Veneer
+local wipe, min, max, random, tinsert = table.wipe, math.min, math.max, math.random, table.insert
+local pairs, ipairs, select, unpack, _G = pairs, ipairs, select, unpack, _G
+local type, tostring, format = type, tostring, string.format
+A.frame = B
+
+--- Cache tables
+local initOnced
+local modules = {}
+local queuedModules = {}
+local moduleStack = {
+}
+
+--- Various region categories
+B.displays = {}
+B.configLayers = {}
+B.configLayersRef = {}
+
+--@debug@
+--- Generates a print handler pointing to a static channel signature
+-- @usage func = B.print(sig)
+-- @param sig channel name or number
+local printfuncs = {}
+B.print = function(pref, ...)
+  if Devian and Devian.InWorkspace() then
+      printfuncs[pref] = printfuncs[pref] or function(...) print(pref,  ...) end
+
+    return printfuncs[pref]
+  else
+   return function () end
+  end
+end
+
+local rgb = {}
+local getcolor = function()
+  local n, p = 0, 4
+  for i = 1, 3 do
+    rgb[i] = min(random(n,p) * 64, 255)
+    if rgb[i] == 255 then
+      p = 4
+    elseif rgb[i] > 0 then
+      n = 2
+    end
+  end
+  return unpack(rgb)
+end
+
+local color = {}
+local fprints = {}
+B.fprint = function()
+  if not (Devian and Devian.InWorkspace()) then
+    return function() end
+  end
+
+
+  local sig = debugstack(2,1)
+  if fprints[sig] then
+    return fprints[sig]
+  end
+
+  local func = sig:match("%`(%a+)%'")
+  if not func then
+    func = sig:match("<(.-)>")
+  end
+  func = func:gsub('(%l+)(%u)', function(a, b) return a:sub(0,2) .. b  end, 1)
+  func = func:gsub('^.+%\\', '')
+  if not func then
+    func = 'noname'
+  end
+
+  local r, g, b = getcolor()
+  color[sig] = color[sig] or format('|cFF%02X%02X%02X%s|r', r, g, b, func)
+
+  --print(color[func] .. ' ( ' .. table.concat(args, ', ')..' )' )
+  func = B.print(func)
+  fprints[sig] = func
+  return func
+end
+
+--@end-debug@
+--[=[@non-debug@
+B.print = function() end
+--@end-non-debug@]=]
+
+-- for the Mikk script
+-- GLOBALS: NUM_LE_RAID_BUFF_TYPES
+-- GLOBALS: BUFF_FLASH_TIME_ON, BUFF_FLASH_TIME_OFF, BUFF_MIN_ALPHA, BUFF_WARNING_TIME, BUFF_DURATION_WARNING_TIME
+-- GLOBALS: BUFFS_PER_ROW, BUFF_MAX_DISPLAY, BUFF_ACTUAL_DISPLAY, DEBUFF_MAX_DISPLAY, DEBUFF_ACTUAL_DISPLAY, BUFF_ROW_SPACING
+-- GLOBALS: CONSOLIDATED_BUFFS_PER_ROW, CONSOLIDATED_BUFF_ROW_HEIGHT, NUM_TEMP_ENCHANT_FRAMES
+-- GLOBALS: BUFF_BUTTON_HEIGHT, BUFF_FRAME_BASE_EXTENT, BUFF_HORIZ_SPACING
+
+local print = B.print('Bfl')
+
+--- Template for making perpendicular traversals of the displays structure; also makes sure the table is there
+B.Abstract = function(dest, key, table)
+  if table then
+    for _, v in pairs(dest) do
+      v[key] = {}
+    end
+  end
+  B[key] = setmetatable({}, {
+    __index = function(t, k)
+      return dest[k][key]
+    end,
+    __newindex = function(_, k, v)
+      print('abstract write ('..key..'):', k)
+      dest[k][key] = v
+    end,
+    __tostring = function() return 'Abstract:'..key..'' end
+  })
+
+
+  return B[key]
+end
+
+
+--- localize for speed
+local layers, refs, displays = B.configLayers, B.configLayersRef, B.displays
+
+local ModulesCall = function(func)
+
+  local n = 0
+  for i = 1, #moduleStack do
+    print('calling level '..i)
+    local stackset = moduleStack[i]
+
+    for name, module in pairs(stackset) do
+      n = n + 1
+      print(n..'  '..name..'.'..func..'()')
+
+
+      if module[func] then
+        module[func](module)
+      end
+    end
+  end
+end
+
+
+local Enable = function()
+end
+
+--- The things that happen repeatedly
+local Init = function ()
+end
+
+
+--- Things that happen immediately upon entering world
+local InitOnce = function()
+  print('entering world first time')
+  local defaults = B.ConfDefaults
+  print('|cFFFFFF00Veneer|r')
+  if not VeneerData then
+    VeneerData = {}
+    for k,v in pairs(defaults) do
+      VeneerData[k] = v
+    end
+    print('Veneer defaults being used.')
+  end
+
+  B.Conf = setmetatable(VeneerData, {__index = function(_, k) return defaults[k] end})
+
+  -- suffix tables
+  for name, display in pairs(displays) do
+    display.conf = setmetatable({}, {
+      __index = function(_, k)
+        --print('config check '.. name .. k)
+        return B.Conf[name .. k] or B.Conf['BuffButton' .. k]
+      end,
+      __newindex = function(_, k , v)
+        B.Conf[name..k] = v
+      end,
+    })
+  end
+
+  -- To ensure that modules are run in controlled order, walk the dependency list; if the dep shows up
+  -- in the loaded manifest, remove the value. If the dep list isn't empty, move that module to the next
+  -- layer.
+  local loaded = {}
+  local stackLevels = #moduleStack
+  local i = 1
+  moduleStack[1] = modules
+  repeat
+    print('setting init level '.. i)
+    local queue = moduleStack[i]
+    for name, module in pairs(queue) do
+
+      if queuedModules[name] and #queuedModules[name] > 0 then
+        local p = #queuedModules[name]
+        for j = 1, p do
+          local dep = queuedModules[name][j]
+
+          if loaded[dep] then
+            print( '    ' .. dep .. ' OK')
+            queuedModules[name][j] = nil
+            for k = j, p do
+              print('   shift ' .. (k+1)  .. ' ('..tostring(queuedModules[name][k+1])..') to ' .. k ..'')
+              queuedModules[name][k] = queuedModules[name][k+1]
+            end
+          end
+        end
+
+        if #queuedModules[name] == 0 then
+          queuedModules[name] = nil
+          print('  |cFF00FFFF'.. name ..'|r deps OK')
+          loaded[name] = true
+        else
+
+          print('  |cFFFF8800' .. name ..'|r pending')
+          local next = i+1
+          if not  moduleStack[next] then
+            moduleStack[next] = {}
+          end
+          stackLevels = next
+          moduleStack[next][name] = module
+          queue[name] = nil
+        end
+
+      else
+        print('  |cFF00FF00'.. name ..'|r no deps')
+        loaded[name] = true
+      end
+   end
+    i = i + 1
+  until i > stackLevels
+
+
+  for level, batch in ipairs(moduleStack) do
+    print('config level', level)
+    for name, module in pairs(batch) do
+      print('integrity check', name)
+
+      --[===[@non-debug@
+      if module.defaults and not VeneerData[name] then
+      --@end-non-debug@]===]
+        print('Adding defaults from module ', name)
+        VeneerData[name] = module.default
+      --[===[@non-debug@
+      end
+      --@end-non-debug@]===]
+    end
+  end
+  -- remove from existing
+end
+
+--- Fires an update to all modules
+local lastUpdate
+function B.UpdateAll(...)
+  lastUpdate = GetTime()
+  ModulesCall('OnUpdate', lastUpdate)
+end
+
+B:RegisterEvent('PLAYER_ENTERING_WORLD')
+B:SetScript('OnEvent', function(self, event)
+  if event == 'PLAYER_ENTERING_WORLD' then
+    if not initOnced then
+      InitOnce()
+      ModulesCall('OnInitialize')
+      initOnced = true
+      C_Timer.After(1, function()
+        if GetSpecialization() then
+          print(GetSpecialization(), 'enabling')
+          ModulesCall('OnEnable')
+          B:SetScript('OnUpdate', nil)
+        end
+
+      end)
+    end
+
+  end
+
+  B.UpdateAll()
+end)
+
+--- Modulizer method
+--
+function B:RegisterModule (name, module, ...)
+  if modules[name] then
+    print('pulling modules[|cFFFF8800'.. tostring(name) ..'|r]')
+    return modules[name]
+  end
+
+  print('new module |cFF00BBFF'.. tostring(name) ..'|r')
+  if module then
+    if modules[name] then
+      error("Module table for '"..tostring(name).."' already exists.")
+    end
+  else
+    module = CreateFrame('Frame', 'Veneer' .. tostring(name) .. 'Handler', B, 'VeneerHandlerTemplate')
+  end
+  modules[name] = module
+  if select('#', ...) >= 1 then
+    local numDeps = select('#', ...)
+    print('  '..numDeps..' deps detected')
+    for i = 1, numDeps do
+      local dep = select(i, ...)
+        -- means that init/enable funcs are ordered to run after deps do their things
+      queuedModules[name] = queuedModules[name]  or {}
+      tinsert(queuedModules[name], dep)
+      print('  needs '..dep)
+    end
+  end
+  return module
+end
+
+
+B.SetConfigLayers =  function(frame)
+  local print = B.fprint()
+  if not frame.config then
+    print(frame:GetName(), 'has no config layers')
+    return
+  end
+  print('Registering config layers from', frame:GetName())
+
+  for i, subframe in ipairs(frame.config) do
+    -- make sure there are no duplicates
+    if not refs[subframe] then
+      local key = #layers+1
+      layers[key] = subframe
+      refs[subframe] = key
+    end
+    print(' ', i, subframe:GetName())
+  end
+end
+
+B.RemoveConfigLayers = function(frame)
+  local print = B.fprint()
+  print('|cFFFF0000RemoveConfigLayers', frame:GetName())
+  for i, subframe in pairs(layers) do
+    if subframe:GetParent() == frame then
+      print('|cFFFF8800  ', subframe:GetParent():GetName(), '|cFFFFFF00', subframe:GetName())
+      layers[i]:Hide()
+      layers[i] = nil
+      refs[subframe] = nil
+    end
+  end
+end
+
+B.UpdateConfigLayers = function()
+  local print = B.fprint()
+  local func = B.Conf.GuidesMode and 'Show' or 'Hide'
+  local numAnchors = 0
+  for name, display in pairs(displays) do
+    numAnchors = numAnchors + 1
+    display.anchor:EnableMouse(B.Conf.GuidesMode)
+    if B.Conf.GuidesMode then
+      display.anchor:SetScript('OnUpdate', display.anchor.OnUpdate)
+    else
+      display.anchor:SetScript('OnUpdate', nil)
+
+      for i, anchorButton in ipairs(display.anchor.anchorButton) do
+        anchorButton:Hide()
+      end
+
+    end
+
+  end
+  for id, region in pairs(layers) do
+    print(id, region:GetName(), func)
+    region[func](region)
+  end
+
+  print('['..func..'] updated', #layers, 'regions,', numAnchors, 'frames')
+end
\ No newline at end of file