Nenue@50
|
1 --- Devian - Dock.lua
|
Nenue@32
|
2 -- @file-author@
|
Nenue@32
|
3 -- @project-revision@ @project-hash@
|
Nenue@32
|
4 -- @file-revision@ @file-hash@
|
Nenue@32
|
5 -- Created: 12/26/2015 12:32 PM
|
Nenue@50
|
6 -- Docking and arrangement calls
|
Nenue@66
|
7 local _, D = ...
|
Nenue@50
|
8 local ceil, floor, sqrt, pairs, GetScreenWidth, GetScreenHeight = math.ceil, math.floor, math.sqrt, pairs, GetScreenWidth, GetScreenHeight
|
Nenue@99
|
9
|
Nenue@99
|
10 local CreateFrame, tinsert, random = CreateFrame, tinsert, math.random
|
Nenue@99
|
11 local ipairs, pairs = ipairs, pairs
|
Nenue@47
|
12 local db
|
Nenue@98
|
13 local print = DEVIAN_WORKSPACE and function(...) print('DvnDock', ...) end or nop
|
Nenue@93
|
14 local DOCK_BUTTON_PADDING = 6
|
Nenue@93
|
15
|
Nenue@98
|
16 DevianDockHandler = {
|
Nenue@98
|
17 usedButtons = {},
|
Nenue@98
|
18 buttons = {},
|
Nenue@98
|
19 }
|
Nenue@99
|
20 DevianDockTabMixin = {}
|
Nenue@93
|
21
|
Nenue@99
|
22 function DevianDockTabMixin:OnMouseDown(button)
|
Nenue@93
|
23 --print("click", self:GetName(), button, self.console.index)
|
Nenue@100
|
24 local console = self.console
|
Nenue@93
|
25 if button == "LeftButton" then
|
Nenue@93
|
26 if IsShiftKeyDown() then
|
Nenue@100
|
27 DevianDock:ToggleAll(console)
|
Nenue@93
|
28 else
|
Nenue@98
|
29
|
Nenue@100
|
30 console.newMessage = nil
|
Nenue@100
|
31 if console.isFront or (not console.enabled) then
|
Nenue@100
|
32
|
Nenue@100
|
33 console:Toggle()
|
Nenue@100
|
34 if console.enabled then
|
Nenue@100
|
35 if console.minimized then
|
Nenue@100
|
36 console:MinMax()
|
Nenue@93
|
37 end
|
Nenue@100
|
38 console:ToFront()
|
Nenue@93
|
39 end
|
Nenue@93
|
40 else
|
Nenue@100
|
41 console:ToFront()
|
Nenue@93
|
42 end
|
Nenue@93
|
43 end
|
Nenue@93
|
44 elseif button == "RightButton" then
|
Nenue@100
|
45 console:MinMax()
|
Nenue@93
|
46 end
|
Nenue@100
|
47 DevianDock:Update()
|
Nenue@93
|
48 end
|
Nenue@99
|
49 function DevianDockTabMixin:OnShow()
|
Nenue@93
|
50 self:Update()
|
Nenue@93
|
51 end
|
Nenue@99
|
52 function DevianDockTabMixin:OnEnter()
|
Nenue@93
|
53 end
|
Nenue@99
|
54 function DevianDockTabMixin:Update()
|
Nenue@100
|
55 local console = self.console
|
Nenue@100
|
56 local isActive = (console.isFront or console.newMessage)
|
Nenue@93
|
57
|
Nenue@100
|
58 if console.newMessage and (not self.pulse:IsPlaying()) then
|
Nenue@100
|
59 self.pulse:Play()
|
Nenue@100
|
60 elseif not console.newMessage then
|
Nenue@100
|
61 self.pulse:Stop()
|
Nenue@93
|
62 end
|
Nenue@93
|
63
|
Nenue@93
|
64 if self.selected then
|
Nenue@93
|
65 self.Background:SetColorTexture(0.4,0.4,0.4,1)
|
Nenue@93
|
66 else
|
Nenue@93
|
67 self.Background:SetColorTexture(0,0,0,.5)
|
Nenue@93
|
68 end
|
Nenue@93
|
69
|
Nenue@100
|
70 if isActive then
|
Nenue@100
|
71 self:SetAlpha(1)
|
Nenue@100
|
72 else
|
Nenue@93
|
73 self:SetAlpha(0.5)
|
Nenue@93
|
74 end
|
Nenue@93
|
75
|
Nenue@100
|
76
|
Nenue@100
|
77
|
Nenue@93
|
78 self:SetWidth(self.caption.name:GetStringWidth() + DOCK_BUTTON_PADDING)
|
Nenue@93
|
79 end
|
Nenue@93
|
80
|
Nenue@99
|
81 function DevianDockTabMixin:Select()
|
Nenue@93
|
82 self:Update()
|
Nenue@93
|
83 end
|
Nenue@32
|
84
|
Nenue@32
|
85 --- Spaces each frame evenly across the screen.
|
Nenue@32
|
86 function D:DistributeFrames() --
|
Nenue@50
|
87 local max = self.num_channels
|
Nenue@50
|
88 local num_side = ceil(sqrt(max))
|
Nenue@50
|
89 local w = GetScreenWidth() / num_side
|
Nenue@50
|
90 local h = GetScreenHeight() / num_side
|
Nenue@50
|
91 for i, frame in pairs(D.console) do
|
Nenue@50
|
92 local dx = (i-1) % num_side
|
Nenue@50
|
93 local dy = floor((i-1) / num_side)
|
Nenue@50
|
94 frame.width = w
|
Nenue@50
|
95 frame.height = h
|
Nenue@50
|
96 frame.x = dx * w
|
Nenue@50
|
97 frame.y = -(dy * h)
|
Nenue@50
|
98 frame:Save()
|
Nenue@50
|
99 end
|
Nenue@32
|
100 end
|
Nenue@32
|
101
|
Nenue@32
|
102 --- Place all frames stacked beneath the primary frame.
|
Nenue@32
|
103 function D:StackFrames()
|
Nenue@32
|
104 local last
|
Nenue@50
|
105 for _, frame in pairs(self.console) do
|
Nenue@32
|
106 if last then
|
Nenue@32
|
107 frame.x = last.x
|
Nenue@32
|
108 frame.y = last.y - 20
|
Nenue@32
|
109 else
|
Nenue@32
|
110 frame.x = (GetScreenWidth()-frame:GetWidth())/2
|
Nenue@32
|
111 frame.y = 0
|
Nenue@32
|
112 end
|
Nenue@32
|
113 frame:Save()
|
Nenue@32
|
114 last = frame
|
Nenue@32
|
115 end
|
Nenue@32
|
116 end
|
Nenue@32
|
117
|
Nenue@99
|
118
|
Nenue@99
|
119 do
|
Nenue@99
|
120 local numBeacons = 0
|
Nenue@99
|
121 function DevianDockHandler:GetDockButton(console)
|
Nenue@99
|
122 self.usedButtons = self.usedButtons or {}
|
Nenue@99
|
123 local index = console:GetID()
|
Nenue@99
|
124 local button = self.usedButtons[index]
|
Nenue@99
|
125 if not button then
|
Nenue@99
|
126 numBeacons = numBeacons + 1
|
Nenue@99
|
127 button = CreateFrame('Button', 'DevianDockBeacon'.. numBeacons, UIParent, 'DevianDockTabTemplate')
|
Nenue@99
|
128 button.color = {r = random(), g = random(), b = random()}
|
Nenue@99
|
129 button.Stripe:SetColorTexture(button.color.r, button.color.g, button.color.b,1)
|
Nenue@99
|
130 button.console = console
|
Nenue@99
|
131 self.usedButtons[index] = button
|
Nenue@99
|
132 tinsert(self.buttons, button)
|
Nenue@99
|
133 --oldprint('create dock', index, console.signature)
|
Nenue@99
|
134 end
|
Nenue@99
|
135 button.index = console.index
|
Nenue@99
|
136 button.caption.name:SetText(console.signature)
|
Nenue@99
|
137 button:SetShown(true)
|
Nenue@99
|
138 return button
|
Nenue@99
|
139 end
|
Nenue@99
|
140 end
|
Nenue@99
|
141
|
Nenue@98
|
142 function DevianDockHandler:OnMouseWheel(delta)
|
Nenue@93
|
143 if delta >= 1 then
|
Nenue@98
|
144 self.dockScale = (self.dockScale or 1) - 0.1
|
Nenue@93
|
145 else
|
Nenue@98
|
146 self.dockScale = (self.dockScale or 1) + 0.1
|
Nenue@93
|
147 end
|
Nenue@98
|
148 self:Update()
|
Nenue@93
|
149 end
|
Nenue@32
|
150
|
Nenue@50
|
151 --- Space everything and set the dock size
|
Nenue@98
|
152 function DevianDockHandler:Update()
|
Nenue@47
|
153 local pad_offset = 12
|
Nenue@93
|
154 local drawWidth = 0
|
Nenue@93
|
155 local lastButton
|
Nenue@93
|
156 local numButtons = 0
|
Nenue@100
|
157 local numOpen = 0
|
Nenue@100
|
158 local numBackground = 0
|
Nenue@100
|
159 local numClosed = 0
|
Nenue@100
|
160 local numMinimized = 0
|
Nenue@98
|
161 for i, d in ipairs(self.buttons) do
|
Nenue@93
|
162 if d and d:IsShown() then
|
Nenue@93
|
163 d:SetScale(D.dockScale or 1)
|
Nenue@93
|
164 if lastButton then
|
Nenue@93
|
165 d:SetPoint('TOPLEFT', lastButton, 'TOPRIGHT', pad_offset, 0)
|
Nenue@93
|
166 else
|
Nenue@93
|
167 d:SetPoint('TOPLEFT', DevianDock, 'TOPLEFT', pad_offset, 0)
|
Nenue@93
|
168 end
|
Nenue@73
|
169
|
Nenue@100
|
170 local console = d.console
|
Nenue@100
|
171 if console.enabled then
|
Nenue@100
|
172 numOpen = numOpen + 1
|
Nenue@100
|
173 if not console.isFront then
|
Nenue@100
|
174 numBackground = numBackground + 1
|
Nenue@100
|
175 end
|
Nenue@100
|
176
|
Nenue@100
|
177 else
|
Nenue@100
|
178 numClosed = numClosed + 1
|
Nenue@100
|
179 end
|
Nenue@100
|
180 if console.minimized then
|
Nenue@100
|
181 numMinimized = numMinimized + 1
|
Nenue@100
|
182 end
|
Nenue@100
|
183
|
Nenue@100
|
184 d:Update()
|
Nenue@100
|
185
|
Nenue@93
|
186 drawWidth = drawWidth + d:GetWidth() + pad_offset
|
Nenue@93
|
187 lastButton = d
|
Nenue@93
|
188 numButtons = numButtons + 1
|
Nenue@93
|
189 print(numButtons)
|
Nenue@73
|
190 end
|
Nenue@47
|
191 end
|
Nenue@100
|
192
|
Nenue@100
|
193 self.numOpen, self.numMinimized, self.numClosed, self.numButtons, self.numBackground = numOpen, numMinimized, numClosed, numButtons, numBackground
|
Nenue@98
|
194 self:SetWidth(drawWidth)
|
Nenue@98
|
195
|
Nenue@98
|
196 D.db.dockPoint = D.db.dockPoint or 'TOPLEFT'
|
Nenue@98
|
197 self:SetPoint(D.db.dockPoint , UIParent, D.db.dockPoint , 0, 0)
|
Nenue@50
|
198 end
|
Nenue@100
|
199
|
Nenue@100
|
200
|
Nenue@100
|
201 function DevianDockHandler:ToggleAll(sender)
|
Nenue@100
|
202 local keepSender = IsShiftKeyDown() and sender
|
Nenue@100
|
203 local senderID = sender and sender:GetID()
|
Nenue@100
|
204 local op, arg = 'Toggle', false
|
Nenue@100
|
205 if (keepSender and (self.numBackground == 0)) or (self.numOpen == 0) then
|
Nenue@100
|
206 arg = true
|
Nenue@100
|
207 elseif self.numClosed == 0 then
|
Nenue@100
|
208 arg = false
|
Nenue@100
|
209 end
|
Nenue@100
|
210
|
Nenue@100
|
211 for index, button in ipairs(self.buttons) do
|
Nenue@100
|
212 local frame = button.console
|
Nenue@100
|
213 if frame then
|
Nenue@100
|
214 if not((frame.index == senderID) and keepSender) then
|
Nenue@100
|
215 frame[op](frame, arg)
|
Nenue@100
|
216 end
|
Nenue@100
|
217
|
Nenue@100
|
218 end
|
Nenue@100
|
219 end
|
Nenue@100
|
220 self:Update()
|
Nenue@100
|
221 end |