diff Veneer.lua @ 84:16b300d96724

rewritten using mixin attributes
author Nenue
date Tue, 18 Oct 2016 13:07:21 -0400
parents bb6b532c5d2f
children 27db212af783
line wrap: on
line diff
--- a/Veneer.lua	Tue Oct 18 01:57:02 2016 -0400
+++ b/Veneer.lua	Tue Oct 18 13:07:21 2016 -0400
@@ -1,7 +1,25 @@
 -- Veneer
 -- Base framework for making things draggable.
 
-local vn, print = LibStub("LibKraken").register(Veneer)
+
+
+
+SLASH_VENEER1 = "/veneer"
+SLASH_VENEER2 = "/vn"
+
+SlashCmdList.VENEER = function(cmd)
+end
+VeneerCore = {
+  Frames = {},
+  ConfigLayers = {},
+  FrameClusters = {},
+  parserDepth = 0,
+  pendingCalls = {},
+}
+VeneerHandlerMixin = {
+  Reanchor = nop
+}
+local print = DEVIAN_WORKSPACE and function(...) print('Veneer', ...) end or nop
 local wipe = table.wipe
 
 local defaults = {
@@ -14,11 +32,9 @@
     height = 48,
   }
 }
+
 local configMode
-local veneers = {}
-
 local anonID = 0
-
 local tostring = tostring
 local IsFrameHandle = IsFrameHandle
 local GetAnonymousName = function(key)
@@ -32,8 +48,6 @@
   return (IsFrameHandle(table) and table:GetName()) or tostring(table)
 end
 
-
-
 local anchor_coefficients = {
   ['TOP'] = function(x, y) return x, y end,
   ['BOTTOM'] = function(x, y) return x,y end,
@@ -41,6 +55,108 @@
   ['RIGHT'] = function(x,y) return x,y end,
 }
 
+function VeneerCore:print(...)
+  local txt = '|cFFFFFF00Veneer|r:'
+  for i = 1, select('#', ...) do
+    txt = txt .. ' '.. tostring(select(i, ...))
+  end
+
+  DEFAULT_CHAT_FRAME:AddMessage(txt)
+end
+
+function VeneerCore:OnLoad()
+  print('|cFFFFFF00Veneer!|r')
+  self:RegisterEvent('ADDON_LOADED')
+  self:RegisterEvent('PLAYER_LOGIN')
+
+  self.DEVIAN_PNAME = 'Veneer'
+  self:RegisterForDrag('LeftButton')
+end
+
+function VeneerCore:OnEvent(event, ...)
+  if event == 'ADDON_LOADED' or event == 'PLAYER_LOGIN' then
+    if IsLoggedIn() and not self.intialized then
+      self.intialized = true
+      self:Setup()
+    end
+  end
+end
+
+function VeneerCore:OnDragStart()
+  self:StartMoving()
+end
+
+
+function VeneerCore:OnDragStop()
+  self:StopMovingOrSizing()
+end
+
+function VeneerCore:Setup ()
+  if (not VeneerData) or (not VeneerData.version) then
+    VeneerData = defaults
+  end
+  self.data = VeneerData
+
+
+  self:ExecuteOnClusters(nil, 'Setup')
+end
+
+function VeneerCore:AddHandler(handler, ...)
+  print('*** Adding handler:', handler.moduleName or handler:GetName())
+  local clusterTable = self.FrameClusters
+  for i = 1, select('#', ...) do
+    local anchor = select(i, ...)
+    clusterTable[anchor] = clusterTable[anchor] or {}
+    clusterTable = clusterTable[anchor]
+    print('    cluster layer', i, anchor)
+  end
+  for k,v in pairs(VeneerHandlerMixin) do
+    if not handler[k] then
+      handler[k] = v
+    end
+  end
+  tinsert(clusterTable, handler)
+  handler:Reanchor()
+end
+
+function VeneerCore:ExecuteOnClusters(layer, method)
+  self.parserDepth = self.parserDepth + 1
+  layer = layer or self.FrameClusters
+  if not layer then
+    if self.parserDepth >= 1 then
+      tinsert(self.pendingCalls, method)
+      print('delaying walk for', method)
+      return
+    end
+    print('|cFF00FFFFVeneer|r:'..method..'('..tostring(layer)..')')
+  else
+    print(' L'..self.parserDepth)
+  end
+  for anchor, cluster in pairs(layer) do
+    for index, frame in ipairs(cluster) do
+      print('  '..anchor..'.'..index..' = '..frame:GetName())
+      if frame[method] then
+        print('  '..frame:GetName()..':'..method..'(...)')
+        frame[method](frame)
+      end
+    end
+    if cluster.FrameClusters then
+      self:ExecuteOnClusters(cluster.FrameClusters, method)
+    end
+  end
+  self.parserDepth = self.parserDepth - 1
+
+  if (self.parserDepth == 0) and (#self.pendingCalls >= 1) then
+    local delayedMethod = tremove(self.pendingCalls, 1)
+    print('starting delayed walk for', delayedMethod)
+    self:ExecuteOnClusters(nil, delayedMethod)
+  end
+end
+
+function VeneerCore:Update()
+  self:ExecuteOnClusters(nil, 'Update')
+end
+
 local VeneerButton_OnDragStart = function(self)
   self.startingLeft = self:GetLeft()
   self.startingBottom = self:GetBottom()
@@ -123,10 +239,10 @@
 local ToggleVeneerConfig = function()
   if configMode then
     configMode = false
-    vn:print('Config mode off.')
+    Veneer:print('Config mode off.')
   else
     configMode = true
-    vn:print('Config mode on.')
+    Veneer:print('Config mode on.')
   end
 
   for frame, veneer in pairs(veneers) do
@@ -138,36 +254,33 @@
   VeneerButton_Update(self)
 end
 
-vn.GetVeneer = function(frame, template)
+function VeneerCore:Acquire (frame, template)
   if not frame then
     print('|cFFFF4400Unable to acquire frame...|r')
     return
   end
+  local veneer = self.Frames[frame]
+  if not veneer then
+    local name = type(frame) == 'table' and GetTableName(frame) or GetAnonymousName()
+    veneer = CreateFrame('Frame', name, frame, template or 'VeneerTemplate')
+    print('+veneer', name)
 
-  if veneers[frame] then
-    return veneers[frame]
+    veneer:SetAllPoints(frame)
+    veneer:SetParent(frame)
+    veneer.label:SetText(name)
+    veneer.bg:SetColorTexture(0,0,0,0)
+    veneer:Hide()
+    veneer:EnableMouse(false)
+
+    veneer:SetScript('OnShow', VeneerButton_OnShow)
+
+    -- find current X/Y
+    veneer.currentLeft = frame:GetLeft()
+    veneer.currentTop = frame:GetTop()
+    self.Frames[frame] = veneer
   end
 
-  local name = type(frame) == 'table' and GetTableName(frame) or GetAnonymousName()
-  local veneer = CreateFrame('Frame', name, frame, template or 'VeneerTemplate')
-  print('+veneer', name)
-
-  veneer:SetAllPoints(frame)
-  veneer:SetParent(frame)
-  veneer.label:SetText(name)
-  veneer.bg:SetColorTexture(0,0,0,0)
-  veneer:Hide()
-  veneer:EnableMouse(false)
-
-  veneer:SetScript('OnShow', VeneerButton_OnShow)
-
-  -- find current X/Y
-  veneer.currentLeft = frame:GetLeft()
-  veneer.currentTop = frame:GetTop()
-
-
-  veneers[frame] = veneer
-  return veneers[frame]
+  return veneer
 end
 
 local mixin_probe = {
@@ -175,30 +288,4 @@
   'ArtifactFrameUnderlay',
 }
 
-vn.event = function(event, arg)
 
-end
-
-vn.init = function()
-  if (not VeneerData) or (not VeneerData.version) then
-    VeneerData = defaults
-  end
-  vn.db = VeneerData
-
-end
-
-
-SLASH_VENEER1 = "/veneer"
-SLASH_VENEER2 = "/vn"
-
-SlashCmdList.VENEER = function(cmd)
-  for i, module in pairs(vn.modules) do
-    if module.cmd then
-      local result = module.cmd(cmd)
-      if result then
-        return
-      end
-    end
-  end
-  ToggleVeneerConfig()
-end
\ No newline at end of file