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