Mercurial > wow > devian
diff Dock.lua @ 32:c6a2c2df4790
v2 work
author | Nenue |
---|---|
date | Sat, 26 Dec 2015 21:51:57 -0500 |
parents | |
children | e6650821a2c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Dock.lua Sat Dec 26 21:51:57 2015 -0500 @@ -0,0 +1,178 @@ +--- ${PACKAGE_NAME} +-- @file-author@ +-- @project-revision@ @project-hash@ +-- @file-revision@ @file-hash@ +-- Created: 12/26/2015 12:32 PM +-- Dock management functions + +local D = LibStub("AceAddon-3.0"):GetAddon("Devian") +local _G = _G +local db = DevianDB + + +local function Dock_MouseDown(self, button, up) + local parent = self.dockedTo and D.console[self.dockedTo] or self + local docked = parent.docked + if docked == nil then + docked = {} + end + local worklist = {} + for _, i in pairs(docked) do + table.insert(worklist, D.console[i]) + end + + if not up then + if button ~= 'RightButton' then + if parent.titlebar:IsMouseOver() or not parent.isDocked then + parent:ToFront() + else + parent.out:Hide() + end + + if parent.out.grip:IsMouseOver() then + parent:StartSizing() + else + parent:StartMoving() + end + else + parent:MinMax() + end + + else + if button ~= 'RightButton' then + if parent.titlebar:IsMouseOver() then + parent.out:Show() + end + parent:StopMovingOrSizing() + end + end + + local fixparent = true + for _, frame in pairs(worklist) do + if not up then + if button ~= 'RightButton' then + if frame.titlebar:IsMouseOver() then + frame:ToFront() + fixparent = nil + else + frame.out:Hide() + end + if parent.out.grip:IsMouseOver() then + frame:StartSizing() + else + frame:StartMoving() + end + end + else + if button ~= 'RightButton' then + frame:StopMovingOrSizing() + frame:SetPoint('TOPLEFT', parent, 'TOPLEFT') + frame:SetPoint('BOTTOMRIGHT', parent, 'BOTTOMRIGHT') + frame.x = nil + frame.y = nil + frame.width = nil + frame.height = nil + frame:Save() + + end + end + end + + if fixparent then + parent.out:Show() + end +end +local function Dock_MouseUp (self, button) + Dock_MouseDown(self, button, true) +end + +--- Adjusts frame element alignments +local function PrepareForDock (frame, draw_x) + frame.left:SetPoint('TOPLEFT', frame.out, 'TOPLEFT', -2, 0) + frame.left:SetPoint('BOTTOMRIGHT', frame.out, 'BOTTOMLEFT', 0, 0) + frame.topleft:SetPoint('BOTTOMRIGHT', frame.out, 'TOPLEFT', 0, 0) + frame.top: SetPoint('TOPLEFT', frame.out, 'TOPLEFT', 0, 2) + frame.top:SetPoint('BOTTOMRIGHT', frame.out, 'TOPRIGHT', 0, 0) + frame.topright:SetPoint('BOTTOMLEFT', frame.out, 'TOPRIGHT', 0, 0) + frame.right:SetPoint('TOPLEFT', frame.out, 'TOPRIGHT', 0, 0) + frame.header:SetWidth(frame.header:GetStringWidth() * 1.2) + frame.header:SetPoint('TOPLEFT', frame, 'TOPLEFT', draw_x+4, 0) + frame.titlebar:SetPoint('TOPLEFT', frame.header, 'TOPLEFT', -4, 0) + frame.titlebar:SetPoint('TOPRIGHT', frame.header, 'TOPRIGHT', 0, 0) + + return (draw_x + frame.header:GetStringWidth() * 1.2 + 4) +end + + +--- Docks frames together +-- @param target frame on which to dock +-- @param ... frame objects to be docked +-- +function D:DockFrame(...) + local target = D.console[select(1,...)] + if target.dockedTo then + local t = D.c[target.dockedTo] + print('channel',target.index,target.signature, 'is docked to',t.index, t.signature..'. using that instead') + target = D.console[target.DockedTo] + end + + target.docked = {} + local draw_x = PrepareForDock(target, 4) + for i = 2, select('#', ...) do + local frame = D.console[select(i, ...)] + frame.dockedTo = target.index + width, draw_x = MorphToDock (frame, draw_x) + table.insert(target.docked, frame.index) + frame:ClearAllPoints() + frame:SetPoint('TOPLEFT', target, 'TOPLEFT', 0, 0) + frame:SetSize(target:GetWidth(), target:GetHeight()) + frame.x = nil + frame.y = nil + frame.width = nil + frame.height = nil + frame.oldscript = frame:GetScript('OnMousedown') + frame:SetScript('OnMouseDown', nil) + frame:SetScript('OnMouseUp', nil) + frame:Save() + end +end + +--- Spaces each frame evenly across the screen. +function D:DistributeFrames() -- +--print('frame grid:', max, num_side) +local max = self.num_channels +local num_side = math.ceil(math.sqrt(max)) +local w = GetScreenWidth() / num_side +local h = GetScreenHeight() / num_side +for i, frame in pairs(D.console) do + local dx = (i-1) % num_side + local dy = math.floor((i-1) / num_side) + + --print('move:', frame.signature, 'dx=', dx, 'dy=', dy) + --print('move:', frame.signature, ' x=', dx * w, 'y=', -(dy * h), 'h=', h, 'w=', w) + frame.width = w + frame.height = h + frame.x = dx * w + frame.y = -(dy * h) + frame:Save() +end + +end + +--- Place all frames stacked beneath the primary frame. +function D:StackFrames() + local last + for i, frame in pairs(self.console) do + if last then + frame.x = last.x + frame.y = last.y - 20 + else + frame.x = (GetScreenWidth()-frame:GetWidth())/2 + frame.y = 0 + end + frame:Save() + last = frame + end +end + +