Mercurial > wow > buffalo2
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