Nenue@98
|
1 -- Mixin for console
|
Nenue@98
|
2 local _, D = ...
|
Nenue@98
|
3 DevianConsoleMixin = {}
|
Nenue@98
|
4
|
Nenue@99
|
5 local print = function(...) print('Dvn', ...) end
|
Nenue@99
|
6 function D.IterateChannels(callback, sender)
|
Nenue@99
|
7 for index, channel in ipairs(D.console) do
|
Nenue@99
|
8 if channel ~= sender then
|
Nenue@99
|
9 callback(channel)
|
Nenue@99
|
10 end
|
Nenue@99
|
11 end
|
Nenue@99
|
12 end
|
Nenue@99
|
13
|
Nenue@98
|
14 function DevianConsoleMixin:OnLoad()
|
Nenue@98
|
15 self:SetMaxResize(GetScreenWidth(), GetScreenHeight())
|
Nenue@98
|
16 self:SetMinResize(100, 24)
|
Nenue@98
|
17 self:EnableMouse(true)
|
Nenue@98
|
18 self:RegisterForDrag('LeftButton')
|
Nenue@98
|
19 self:SetMovable(true)
|
Nenue@98
|
20 self:SetResizable(true)
|
Nenue@99
|
21 self:SetClampedToScreen(true)
|
Nenue@98
|
22 self.out:SetFont("Interface\\Addons\\Devian\\font\\SourceCodePro-Regular.ttf", 13, 'NORMAL')
|
Nenue@98
|
23 self.out:SetJustifyH('LEFT')
|
Nenue@98
|
24 self.out:SetFading(false)
|
Nenue@99
|
25 self.out:SetMaxLines(2048)
|
Nenue@99
|
26
|
Nenue@99
|
27 self:RegisterEvent('PLAYER_STARTED_MOVING')
|
Nenue@99
|
28 self:RegisterEvent('PLAYER_STOPPED_MOVING')
|
Nenue@99
|
29
|
Nenue@99
|
30 UIDropDownMenu_Initialize(self.DropdownFrame, function()
|
Nenue@99
|
31 local info = UIDropDownMenu_CreateInfo()
|
Nenue@99
|
32 info.text = 'Pin'
|
Nenue@99
|
33 info.func = function() self:Pin() end
|
Nenue@100
|
34 info.isNotRadio = true
|
Nenue@100
|
35 info.checked = (self.pinned)
|
Nenue@99
|
36 UIDropDownMenu_AddButton(info)
|
Nenue@100
|
37
|
Nenue@100
|
38 info.notCheckable = 1
|
Nenue@99
|
39 if self.minimized then
|
Nenue@99
|
40 info.text = 'Maximize'
|
Nenue@99
|
41 info.func = function() self:Maximize() end
|
Nenue@99
|
42 else
|
Nenue@99
|
43 info.text = 'Minimize'
|
Nenue@99
|
44 info.func = function() self:Minimize() end
|
Nenue@99
|
45 end
|
Nenue@99
|
46 UIDropDownMenu_AddButton(info)
|
Nenue@99
|
47 info.text = 'Close'
|
Nenue@99
|
48 info.func = function() self:Toggle() end
|
Nenue@99
|
49 UIDropDownMenu_AddButton(info)
|
Nenue@99
|
50
|
Nenue@99
|
51 end, 'MENU')
|
Nenue@99
|
52 self.DropdownButton:SetScript('OnClick', function(button)
|
Nenue@99
|
53 ToggleDropDownMenu(1, nil, self.DropdownFrame, button, 0, 0)
|
Nenue@99
|
54 end)
|
Nenue@98
|
55
|
Nenue@98
|
56 self.width = self:GetWidth()
|
Nenue@98
|
57 self.height = self:GetWidth()
|
Nenue@100
|
58 self.isHover = false
|
Nenue@98
|
59 end
|
Nenue@98
|
60
|
Nenue@98
|
61 function DevianConsoleMixin:Setup(info)
|
Nenue@98
|
62 for k,v in pairs(info) do
|
Nenue@98
|
63 self[k] = v
|
Nenue@98
|
64 --oldprint(k,v)
|
Nenue@98
|
65 end
|
Nenue@98
|
66 self.Dock = DevianDock:GetDockButton(self)
|
Nenue@98
|
67 self:Update()
|
Nenue@98
|
68 end
|
Nenue@98
|
69
|
Nenue@99
|
70 local blockedType = {['table'] = true, ['function'] = true }
|
Nenue@99
|
71 local blockedKey = {[0] = true }
|
Nenue@99
|
72
|
Nenue@99
|
73 -- Synchronize vars
|
Nenue@99
|
74 function DevianConsoleMixin:Finalize()
|
Nenue@99
|
75 local id = self:GetID()
|
Nenue@99
|
76 for k,v in pairs(D.channels[id]) do
|
Nenue@99
|
77 if not self[k] then
|
Nenue@99
|
78 D.channels[id][k] = nil
|
Nenue@99
|
79 end
|
Nenue@99
|
80 end
|
Nenue@99
|
81 for k,v in pairs(self) do
|
Nenue@99
|
82 if not (blockedType[type(v)] or blockedKey[k]) then
|
Nenue@99
|
83 if D.channels[id][k] ~= v then
|
Nenue@99
|
84 D.channels[id][k] = v
|
Nenue@99
|
85 end
|
Nenue@99
|
86 end
|
Nenue@99
|
87 end
|
Nenue@100
|
88 D.channels[id].isPressed = nil
|
Nenue@100
|
89 D.channels[id].isHover = nil
|
Nenue@99
|
90 end
|
Nenue@99
|
91
|
Nenue@99
|
92 function DevianConsoleMixin:Pin(pinned)
|
Nenue@99
|
93 self.pinned = pinned or (not self.pinned)
|
Nenue@99
|
94 self:Update(true)
|
Nenue@99
|
95 end
|
Nenue@99
|
96
|
Nenue@99
|
97 function DevianConsoleMixin:Update(setFinal)
|
Nenue@98
|
98 self:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', self.x, self.y)
|
Nenue@99
|
99
|
Nenue@99
|
100 if self.minimized then
|
Nenue@99
|
101 self:SetHeight(20)
|
Nenue@99
|
102 self:SetMaxResize(GetScreenWidth(),20)
|
Nenue@99
|
103 self.GripBottom:Hide()
|
Nenue@99
|
104 self.GripSide:Hide()
|
Nenue@99
|
105 else
|
Nenue@99
|
106 self:SetSize(self.width, self.height)
|
Nenue@99
|
107 self.GripBottom:Show()
|
Nenue@99
|
108 self.GripSide:Show()
|
Nenue@99
|
109 end
|
Nenue@99
|
110
|
Nenue@99
|
111
|
Nenue@98
|
112 -- oldprint(self:GetName(), self.x, self.y)
|
Nenue@98
|
113
|
Nenue@100
|
114 local isFront = (D.currentProfile.current_channel == self.index)
|
Nenue@98
|
115 local r,g,b,a = unpack(D.db.backborder)
|
Nenue@98
|
116 if isFront then
|
Nenue@98
|
117 r,g,b,a = unpack(D.db.frontborder)
|
Nenue@98
|
118 self.backdrop:SetColorTexture(0,0,0,1)
|
Nenue@100
|
119 elseif self.pinned then
|
Nenue@100
|
120 self.backdrop:SetColorTexture(0,0,0,1)
|
Nenue@100
|
121 r,g,b,a = unpack(D.db.backborder)
|
Nenue@100
|
122 self.DropdownButton.Background:SetGradient('VERTICAL', .65,.35,.25, .15, .11, .05)
|
Nenue@98
|
123 else
|
Nenue@100
|
124 self.DropdownButton.Background:SetGradient('VERTICAL', .25,.35,.65, .05, .11, .15)
|
Nenue@100
|
125 self.backdrop:SetColorTexture(0,0,0,1)
|
Nenue@100
|
126 if self.raised then
|
Nenue@100
|
127 self.raised = nil
|
Nenue@100
|
128 self:Lower()
|
Nenue@100
|
129 end
|
Nenue@100
|
130 end
|
Nenue@100
|
131 if self.isPressed then
|
Nenue@100
|
132 r,g,b,a = 1,1,1,1
|
Nenue@100
|
133 elseif self.isHover then
|
Nenue@100
|
134 r,g,b,a = .5,.5,.5,1
|
Nenue@100
|
135 end
|
Nenue@98
|
136
|
Nenue@100
|
137
|
Nenue@98
|
138 for name, region in pairs(self.border) do
|
Nenue@98
|
139 region:SetColorTexture(r,g,b,a)
|
Nenue@98
|
140 end
|
Nenue@100
|
141 self.title:SetText(self.index..' '.. (self.signature or '?') .. (' '..self:GetFrameLevel()))
|
Nenue@98
|
142
|
Nenue@98
|
143 --oldprint(self:GetID(), self.enabled, self.minimized, self.x, self.y)
|
Nenue@98
|
144 self.isFront = isFront
|
Nenue@98
|
145 self:SetShown(self.enabled)
|
Nenue@99
|
146 self.backdrop:SetShown(self.enabled)
|
Nenue@99
|
147 self.out:SetShown((not self.minimized))
|
Nenue@99
|
148
|
Nenue@99
|
149
|
Nenue@99
|
150 if setFinal then
|
Nenue@99
|
151 self:Finalize()
|
Nenue@99
|
152 end
|
Nenue@99
|
153
|
Nenue@98
|
154 end
|
Nenue@98
|
155
|
Nenue@98
|
156
|
Nenue@99
|
157
|
Nenue@98
|
158 function DevianConsoleMixin:OnShow()
|
Nenue@98
|
159 self:Update()
|
Nenue@98
|
160 end
|
Nenue@98
|
161
|
Nenue@98
|
162
|
Nenue@98
|
163
|
Nenue@98
|
164 function DevianConsoleMixin:OnHide() end
|
Nenue@98
|
165
|
Nenue@98
|
166 function DevianConsoleMixin:OnMouseWheel(delta)
|
Nenue@98
|
167
|
Nenue@98
|
168 local up = delta > 0
|
Nenue@98
|
169 if IsControlKeyDown() then
|
Nenue@98
|
170 if up then self.out:ScrollToTop()
|
Nenue@98
|
171 else self.out:ScrollToBottom() end
|
Nenue@98
|
172 elseif IsShiftKeyDown() then
|
Nenue@98
|
173 if up then self.out:PageUp()
|
Nenue@98
|
174 else self.out:PageDown() end
|
Nenue@98
|
175 else
|
Nenue@98
|
176 if up then self.out:ScrollUp()
|
Nenue@98
|
177 else self.out:ScrollDown() end
|
Nenue@98
|
178 end
|
Nenue@98
|
179 end
|
Nenue@98
|
180 function DevianConsoleMixin:MinMax(minimized)
|
Nenue@98
|
181 minimized = minimized or self.minimized
|
Nenue@98
|
182 if minimized then
|
Nenue@98
|
183 self:Maximize()
|
Nenue@98
|
184 else
|
Nenue@98
|
185 self:Minimize()
|
Nenue@98
|
186 end
|
Nenue@98
|
187 end
|
Nenue@98
|
188
|
Nenue@98
|
189 function DevianConsoleMixin:Minimize()
|
Nenue@98
|
190 self.minimized = true
|
Nenue@99
|
191 self:Update(true)
|
Nenue@98
|
192 end
|
Nenue@98
|
193
|
Nenue@98
|
194 function DevianConsoleMixin:Maximize()
|
Nenue@99
|
195 self.minimized = nilnil
|
Nenue@99
|
196 self:Update(true)
|
Nenue@98
|
197 end
|
Nenue@98
|
198
|
Nenue@99
|
199 function DevianConsoleMixin:OnMouseDown(button)
|
Nenue@100
|
200 self.isPressed = true
|
Nenue@100
|
201 self:Update()
|
Nenue@99
|
202 end
|
Nenue@99
|
203
|
Nenue@99
|
204
|
Nenue@98
|
205 function DevianConsoleMixin:OnMouseUp(button)
|
Nenue@100
|
206 self.isPressed = nil
|
Nenue@98
|
207 if button == 'LeftButton' then
|
Nenue@100
|
208 --print('go to front')
|
Nenue@98
|
209 self:ToFront()
|
Nenue@98
|
210 else
|
Nenue@98
|
211 self:MinMax()
|
Nenue@98
|
212 end
|
Nenue@98
|
213 end
|
Nenue@98
|
214
|
Nenue@98
|
215 function DevianConsoleMixin:OnLeave()
|
Nenue@100
|
216 self.isHover = nil
|
Nenue@100
|
217 self:Update()
|
Nenue@98
|
218 end
|
Nenue@98
|
219
|
Nenue@98
|
220 function DevianConsoleMixin:OnEnter()
|
Nenue@100
|
221 self.isHover = true
|
Nenue@100
|
222 self:Update()
|
Nenue@98
|
223 end
|
Nenue@98
|
224
|
Nenue@98
|
225 function DevianConsoleMixin:OnDragStart()
|
Nenue@99
|
226 self:ToFront()
|
Nenue@99
|
227 self:StartMoving()
|
Nenue@99
|
228 D.IterateChannels(function(frame)
|
Nenue@99
|
229 frame.out:SetShown(false)
|
Nenue@99
|
230 frame.backdrop:Hide()
|
Nenue@99
|
231 end, self)
|
Nenue@98
|
232 end
|
Nenue@98
|
233
|
Nenue@98
|
234 function DevianConsoleMixin:OnDragStop()
|
Nenue@99
|
235
|
Nenue@99
|
236 local channelEntry = D.channels[self:GetID()]
|
Nenue@98
|
237 self.x = self:GetLeft()
|
Nenue@98
|
238 self.y = self:GetTop() - GetScreenHeight()
|
Nenue@99
|
239 if not self.minimized then
|
Nenue@99
|
240 self.width = self:GetWidth()
|
Nenue@99
|
241 self.height = self:GetHeight()
|
Nenue@99
|
242 end
|
Nenue@99
|
243
|
Nenue@99
|
244 --print(channelEntry.x, channelEntry.y, channelEntry.width, channelEntry.height)
|
Nenue@98
|
245 self:StopMovingOrSizing()
|
Nenue@99
|
246 self:SetClampRectInsets(0,0,0,0)
|
Nenue@98
|
247
|
Nenue@99
|
248 self:Update(true)
|
Nenue@99
|
249
|
Nenue@99
|
250 D.IterateChannels(function(frame)
|
Nenue@100
|
251 frame:Update(true)
|
Nenue@99
|
252 end, self)
|
Nenue@98
|
253 end
|
Nenue@98
|
254
|
Nenue@98
|
255 function DevianConsoleMixin:ToFront()
|
Nenue@100
|
256 D.currentProfile.current_channel = self.index
|
Nenue@100
|
257
|
Nenue@98
|
258 self:Raise()
|
Nenue@98
|
259 for index, channel in ipairs(D.console) do
|
Nenue@100
|
260 channel:Update(true)
|
Nenue@98
|
261 end
|
Nenue@98
|
262 end
|
Nenue@98
|
263
|
Nenue@100
|
264 function DevianConsoleMixin:Toggle(value)
|
Nenue@100
|
265 if value == nil then
|
Nenue@100
|
266 value = (not self.enabled)
|
Nenue@100
|
267 end
|
Nenue@100
|
268
|
Nenue@100
|
269 self.enabled = value
|
Nenue@100
|
270 D:Print('Console #'..self:GetID(), self.enabled and 'open' or 'closed')
|
Nenue@100
|
271
|
Nenue@100
|
272 self:Update(true)
|
Nenue@99
|
273 end
|
Nenue@99
|
274
|
Nenue@99
|
275 function DevianConsoleMixin:OnEvent(event, arg)
|
Nenue@100
|
276 --oldprint(event, arg)
|
Nenue@99
|
277 local db = D.db
|
Nenue@99
|
278 if self.enabled then
|
Nenue@100
|
279
|
Nenue@100
|
280 local progress = self.moveFade:GetProgress() or 1
|
Nenue@100
|
281 self.moveFade:Stop()
|
Nenue@100
|
282
|
Nenue@99
|
283 if event == 'PLAYER_STARTED_MOVING' then
|
Nenue@100
|
284 local F1 = self.moveFade.alphaOut
|
Nenue@100
|
285 F1:SetFromAlpha(db.movement_fade_from + (1-progress))
|
Nenue@100
|
286 F1:SetToAlpha(db.movement_fade_to)
|
Nenue@100
|
287 F1:SetDuration(db.movement_fade_time * (1-progress))
|
Nenue@100
|
288 self.moveFade:Play()
|
Nenue@100
|
289 self:EnableMouse(false)
|
Nenue@100
|
290 elseif event == 'PLAYER_STOPPED_MOVING' then
|
Nenue@99
|
291 self.moveFade:Stop()
|
Nenue@99
|
292 local F1 = self.moveFade.alphaOut
|
Nenue@100
|
293 F1:SetFromAlpha(db.movement_fade_to + (1-progress))
|
Nenue@99
|
294 F1:SetToAlpha(db.movement_fade_from)
|
Nenue@100
|
295 F1:SetDuration(db.movement_fade_time * (progress))
|
Nenue@99
|
296 self.moveFade:Play()
|
Nenue@99
|
297 self:EnableMouse(true)
|
Nenue@99
|
298 end
|
Nenue@99
|
299 end
|
Nenue@99
|
300 end
|
Nenue@99
|
301
|
Nenue@99
|
302 DevianConsoleSizeButtonMixin = {}
|
Nenue@99
|
303 function DevianConsoleSizeButtonMixin:OnLoad()
|
Nenue@99
|
304 self:RegisterForDrag('LeftButton')
|
Nenue@99
|
305 end
|
Nenue@99
|
306 function DevianConsoleSizeButtonMixin:OnDragStart()
|
Nenue@99
|
307 local anchor = self:GetPoint(2)
|
Nenue@99
|
308 local frame = self:GetParent()
|
Nenue@99
|
309 if anchor == 'BOTTOMLEFT' then
|
Nenue@99
|
310 frame:SetClampRectInsets(frame:GetLeft(), GetScreenWidth()- frame:GetRight(), GetScreenHeight() - frame:GetTop(), 0)
|
Nenue@99
|
311 frame:SetMinResize(frame.width, 24)
|
Nenue@99
|
312 frame:SetMaxResize(frame.width, GetScreenHeight())
|
Nenue@99
|
313 elseif anchor == 'BOTTOM' then
|
Nenue@99
|
314 frame:SetClampRectInsets(frame:GetLeft(), 0, GetScreenHeight() - frame:GetTop(), GetScreenHeight() - frame:GetBottom())
|
Nenue@99
|
315 frame:SetMinResize(200, frame.height)
|
Nenue@99
|
316 frame:SetMaxResize(GetScreenWidth(), frame.height)
|
Nenue@99
|
317 end
|
Nenue@99
|
318 frame:StartSizing()
|
Nenue@99
|
319 end
|
Nenue@100
|
320
|
Nenue@99
|
321 function DevianConsoleSizeButtonMixin:OnDragStop()
|
Nenue@99
|
322 local frame = self:GetParent()
|
Nenue@99
|
323 frame:OnDragStop()
|
Nenue@99
|
324 end
|