Mercurial > wow > devian
comparison Dock.lua @ 32:c6a2c2df4790
v2 work
author | Nenue |
---|---|
date | Sat, 26 Dec 2015 21:51:57 -0500 |
parents | |
children | e6650821a2c0 |
comparison
equal
deleted
inserted
replaced
31:6fcfe60bbd0f | 32:c6a2c2df4790 |
---|---|
1 --- ${PACKAGE_NAME} | |
2 -- @file-author@ | |
3 -- @project-revision@ @project-hash@ | |
4 -- @file-revision@ @file-hash@ | |
5 -- Created: 12/26/2015 12:32 PM | |
6 -- Dock management functions | |
7 | |
8 local D = LibStub("AceAddon-3.0"):GetAddon("Devian") | |
9 local _G = _G | |
10 local db = DevianDB | |
11 | |
12 | |
13 local function Dock_MouseDown(self, button, up) | |
14 local parent = self.dockedTo and D.console[self.dockedTo] or self | |
15 local docked = parent.docked | |
16 if docked == nil then | |
17 docked = {} | |
18 end | |
19 local worklist = {} | |
20 for _, i in pairs(docked) do | |
21 table.insert(worklist, D.console[i]) | |
22 end | |
23 | |
24 if not up then | |
25 if button ~= 'RightButton' then | |
26 if parent.titlebar:IsMouseOver() or not parent.isDocked then | |
27 parent:ToFront() | |
28 else | |
29 parent.out:Hide() | |
30 end | |
31 | |
32 if parent.out.grip:IsMouseOver() then | |
33 parent:StartSizing() | |
34 else | |
35 parent:StartMoving() | |
36 end | |
37 else | |
38 parent:MinMax() | |
39 end | |
40 | |
41 else | |
42 if button ~= 'RightButton' then | |
43 if parent.titlebar:IsMouseOver() then | |
44 parent.out:Show() | |
45 end | |
46 parent:StopMovingOrSizing() | |
47 end | |
48 end | |
49 | |
50 local fixparent = true | |
51 for _, frame in pairs(worklist) do | |
52 if not up then | |
53 if button ~= 'RightButton' then | |
54 if frame.titlebar:IsMouseOver() then | |
55 frame:ToFront() | |
56 fixparent = nil | |
57 else | |
58 frame.out:Hide() | |
59 end | |
60 if parent.out.grip:IsMouseOver() then | |
61 frame:StartSizing() | |
62 else | |
63 frame:StartMoving() | |
64 end | |
65 end | |
66 else | |
67 if button ~= 'RightButton' then | |
68 frame:StopMovingOrSizing() | |
69 frame:SetPoint('TOPLEFT', parent, 'TOPLEFT') | |
70 frame:SetPoint('BOTTOMRIGHT', parent, 'BOTTOMRIGHT') | |
71 frame.x = nil | |
72 frame.y = nil | |
73 frame.width = nil | |
74 frame.height = nil | |
75 frame:Save() | |
76 | |
77 end | |
78 end | |
79 end | |
80 | |
81 if fixparent then | |
82 parent.out:Show() | |
83 end | |
84 end | |
85 local function Dock_MouseUp (self, button) | |
86 Dock_MouseDown(self, button, true) | |
87 end | |
88 | |
89 --- Adjusts frame element alignments | |
90 local function PrepareForDock (frame, draw_x) | |
91 frame.left:SetPoint('TOPLEFT', frame.out, 'TOPLEFT', -2, 0) | |
92 frame.left:SetPoint('BOTTOMRIGHT', frame.out, 'BOTTOMLEFT', 0, 0) | |
93 frame.topleft:SetPoint('BOTTOMRIGHT', frame.out, 'TOPLEFT', 0, 0) | |
94 frame.top: SetPoint('TOPLEFT', frame.out, 'TOPLEFT', 0, 2) | |
95 frame.top:SetPoint('BOTTOMRIGHT', frame.out, 'TOPRIGHT', 0, 0) | |
96 frame.topright:SetPoint('BOTTOMLEFT', frame.out, 'TOPRIGHT', 0, 0) | |
97 frame.right:SetPoint('TOPLEFT', frame.out, 'TOPRIGHT', 0, 0) | |
98 frame.header:SetWidth(frame.header:GetStringWidth() * 1.2) | |
99 frame.header:SetPoint('TOPLEFT', frame, 'TOPLEFT', draw_x+4, 0) | |
100 frame.titlebar:SetPoint('TOPLEFT', frame.header, 'TOPLEFT', -4, 0) | |
101 frame.titlebar:SetPoint('TOPRIGHT', frame.header, 'TOPRIGHT', 0, 0) | |
102 | |
103 return (draw_x + frame.header:GetStringWidth() * 1.2 + 4) | |
104 end | |
105 | |
106 | |
107 --- Docks frames together | |
108 -- @param target frame on which to dock | |
109 -- @param ... frame objects to be docked | |
110 -- | |
111 function D:DockFrame(...) | |
112 local target = D.console[select(1,...)] | |
113 if target.dockedTo then | |
114 local t = D.c[target.dockedTo] | |
115 print('channel',target.index,target.signature, 'is docked to',t.index, t.signature..'. using that instead') | |
116 target = D.console[target.DockedTo] | |
117 end | |
118 | |
119 target.docked = {} | |
120 local draw_x = PrepareForDock(target, 4) | |
121 for i = 2, select('#', ...) do | |
122 local frame = D.console[select(i, ...)] | |
123 frame.dockedTo = target.index | |
124 width, draw_x = MorphToDock (frame, draw_x) | |
125 table.insert(target.docked, frame.index) | |
126 frame:ClearAllPoints() | |
127 frame:SetPoint('TOPLEFT', target, 'TOPLEFT', 0, 0) | |
128 frame:SetSize(target:GetWidth(), target:GetHeight()) | |
129 frame.x = nil | |
130 frame.y = nil | |
131 frame.width = nil | |
132 frame.height = nil | |
133 frame.oldscript = frame:GetScript('OnMousedown') | |
134 frame:SetScript('OnMouseDown', nil) | |
135 frame:SetScript('OnMouseUp', nil) | |
136 frame:Save() | |
137 end | |
138 end | |
139 | |
140 --- Spaces each frame evenly across the screen. | |
141 function D:DistributeFrames() -- | |
142 --print('frame grid:', max, num_side) | |
143 local max = self.num_channels | |
144 local num_side = math.ceil(math.sqrt(max)) | |
145 local w = GetScreenWidth() / num_side | |
146 local h = GetScreenHeight() / num_side | |
147 for i, frame in pairs(D.console) do | |
148 local dx = (i-1) % num_side | |
149 local dy = math.floor((i-1) / num_side) | |
150 | |
151 --print('move:', frame.signature, 'dx=', dx, 'dy=', dy) | |
152 --print('move:', frame.signature, ' x=', dx * w, 'y=', -(dy * h), 'h=', h, 'w=', w) | |
153 frame.width = w | |
154 frame.height = h | |
155 frame.x = dx * w | |
156 frame.y = -(dy * h) | |
157 frame:Save() | |
158 end | |
159 | |
160 end | |
161 | |
162 --- Place all frames stacked beneath the primary frame. | |
163 function D:StackFrames() | |
164 local last | |
165 for i, frame in pairs(self.console) do | |
166 if last then | |
167 frame.x = last.x | |
168 frame.y = last.y - 20 | |
169 else | |
170 frame.x = (GetScreenWidth()-frame:GetWidth())/2 | |
171 frame.y = 0 | |
172 end | |
173 frame:Save() | |
174 last = frame | |
175 end | |
176 end | |
177 | |
178 |