Nenue@0
|
1 -- User: Krakyn
|
Nenue@0
|
2 -- Created: 11/30/2015 7:46 AM
|
Nenue@0
|
3 if not LibStub then
|
Nenue@0
|
4 print('Something has happened...')
|
Nenue@0
|
5 end
|
Nenue@0
|
6 Devian = LibStub("AceAddon-3.0"):NewAddon("Devian", "AceConsole-3.0", "AceEvent-3.0")
|
Nenue@13
|
7 local MAJOR, MINOR = 'Devian-1.3', 'r@project-revision@'
|
Nenue@0
|
8 local D = _G.Devian
|
Nenue@0
|
9 local STATE_LOW, STATE_HIGH = 1, 2
|
Nenue@0
|
10 local PLAYER_REALM = UnitName("player") .. '-' .. GetRealmName()
|
Nenue@13
|
11 local DEVIAN_FRAME = 'DevianConsole'
|
Nenue@18
|
12 local print = _G.print
|
Nenue@9
|
13 local db
|
Nenue@13
|
14 local defaults = {
|
Nenue@13
|
15 ['global'] = {[STATE_LOW] = {}, [STATE_HIGH] = {}},
|
Nenue@13
|
16 ['tags'] = {},
|
Nenue@13
|
17 ['channels'] = {[1] = {signature = 'Dvn', name = 'Main', header = "%n [%t]", x = 100, y = 800, height = 500, width = 600, enabled = true}},
|
Nenue@14
|
18 primary_channel = 1,
|
Nenue@13
|
19 current_channel = 1,
|
Nenue@14
|
20 toggle = true,
|
Nenue@13
|
21 dnd_status = true,
|
Nenue@13
|
22 dnd_message = "Debugging. Your messages may get eaten.",
|
Nenue@13
|
23 font = [[Interface\Addons\Devian\font\SourceCodePro-Regular.ttf]],
|
Nenue@13
|
24 fontsize = 13,
|
Nenue@13
|
25 fontoutline = 'NONE',
|
Nenue@14
|
26 backdrop = {1,1,1,0.2},
|
Nenue@14
|
27 backgrad = {'VERTICAL', 0.1, 0.1, 0.1, 0.3, 0, 0, 0, 0.5},
|
Nenue@14
|
28 backblend = 'BLEND',
|
Nenue@14
|
29 frontdrop = {1,1,1,1},
|
Nenue@14
|
30 frontgrad = {'VERTICAL', 0.1, 0.1, 0.1, 0.9, 0, 0, 0, 0.9},
|
Nenue@22
|
31 frontblend = 'BLEND',
|
Nenue@22
|
32 frontborder = {1,0,0,1},
|
Nenue@22
|
33 backborder = {0,0,1,0.75},
|
Nenue@13
|
34 }
|
Nenue@9
|
35
|
Nenue@4
|
36
|
Nenue@13
|
37 local function ScanAddOnList(cmd, ...)
|
Nenue@0
|
38 local list_state
|
Nenue@0
|
39
|
Nenue@14
|
40 local args = {}
|
Nenue@14
|
41 local arg, n = D:GetArgs(cmd, 1)
|
Nenue@14
|
42 while arg do
|
Nenue@14
|
43 table.insert(args, arg)
|
Nenue@14
|
44 arg, n = D:GetArgs(cmd,1,n)
|
Nenue@14
|
45 end
|
Nenue@14
|
46 local mode, tag, dest = unpack(args)
|
Nenue@0
|
47
|
Nenue@13
|
48
|
Nenue@14
|
49 -- no args, toggle ui
|
Nenue@0
|
50 if mode == nil then
|
Nenue@0
|
51 list_state = db.enabled and STATE_LOW or STATE_HIGH
|
Nenue@0
|
52 db.enabled = (db.enabled == false) and true or false
|
Nenue@17
|
53 --print(list_state, db.enabled)
|
Nenue@0
|
54
|
Nenue@0
|
55 if list_state == STATE_LOW then
|
Nenue@0
|
56 end
|
Nenue@14
|
57 elseif mode == 'stack' then
|
Nenue@14
|
58 return D:StackFrames()
|
Nenue@14
|
59 elseif mode == 'grid' then
|
Nenue@14
|
60 return D:DistributeFrames()
|
Nenue@14
|
61 elseif mode == 'tag' then -- tagging
|
Nenue@14
|
62 if tag ~= nil and dest ~= nil then
|
Nenue@18
|
63 local channel = D:SetChannel(dest:match('%a'), dest:match('%d'))
|
Nenue@18
|
64 if not D.tags[tag] then
|
Nenue@18
|
65 D.tags[tag] = {}
|
Nenue@14
|
66 end
|
Nenue@18
|
67 if D.tags[tag][channel.index] then
|
Nenue@18
|
68 D.tags[tag][channel.index] = nil
|
Nenue@18
|
69 D:Print('Removed |cFFFFFF00'..tag..'|r from |cFF00FFFF'.. dest .. '|r')
|
Nenue@18
|
70 else
|
Nenue@18
|
71 D.tags[tag][channel.index] = channel.index
|
Nenue@18
|
72 D:Print('Assigning |cFFFFFF00'..tag..'|r to |cFF00FFFF'.. dest .. '|r')
|
Nenue@18
|
73 end
|
Nenue@18
|
74
|
Nenue@14
|
75 else
|
Nenue@14
|
76 D:Print('Usage: /dvn tag <prefix> <console name or number>')
|
Nenue@14
|
77 end
|
Nenue@14
|
78 return
|
Nenue@14
|
79 elseif mode ~= nil then
|
Nenue@14
|
80 mode = tonumber(mode)
|
Nenue@0
|
81 if mode > 2 then
|
Nenue@17
|
82 --print('Something has happened.')
|
Nenue@0
|
83 return
|
Nenue@0
|
84 end
|
Nenue@0
|
85 list_state = mode == STATE_LOW and STATE_LOW or STATE_HIGH
|
Nenue@0
|
86 end
|
Nenue@0
|
87 local char_list, global_list = db[PLAYER_REALM][list_state], db.global[list_state]
|
Nenue@0
|
88
|
Nenue@0
|
89 local playername = UnitName("player")
|
Nenue@0
|
90
|
Nenue@0
|
91 for i = 1, GetNumAddOns() do
|
Nenue@0
|
92 local name = GetAddOnInfo(i)
|
Nenue@0
|
93 local enableState, globalState = GetAddOnEnableState(playername, i), GetAddOnEnableState(nil, i)
|
Nenue@0
|
94
|
Nenue@0
|
95 if mode == STATE_LOW or mode == STATE_HIGH then
|
Nenue@0
|
96 char_list[name] = enableState
|
Nenue@0
|
97 global_list[name] = globalState
|
Nenue@0
|
98 else
|
Nenue@13
|
99 if char_list[name] or global_list[name] then
|
Nenue@0
|
100
|
Nenue@0
|
101 if char_list[name] ~= 0 and global_list[name] ~= 0 then
|
Nenue@0
|
102 local value = false
|
Nenue@0
|
103 if char_list[name] == 2 and global_list[name] == 1 then
|
Nenue@0
|
104 value = UnitName("player")
|
Nenue@0
|
105 elseif global_list[name] == 2 then
|
Nenue@0
|
106 value = true
|
Nenue@0
|
107 end
|
Nenue@17
|
108 --print('EnableAddOn(', i, ',', value,')')
|
Nenue@0
|
109 EnableAddOn(i, value)
|
Nenue@0
|
110 else
|
Nenue@0
|
111 local value = true
|
Nenue@0
|
112 if char_list[name] == 2 and global_list[name] == 1 then
|
Nenue@0
|
113 value = UnitName("player")
|
Nenue@0
|
114 end
|
Nenue@17
|
115 --print('DisableAddOn(', i, ',', value,')')
|
Nenue@0
|
116 DisableAddOn(i,value)
|
Nenue@0
|
117 end
|
Nenue@13
|
118 end
|
Nenue@0
|
119
|
Nenue@0
|
120 end
|
Nenue@0
|
121 end
|
Nenue@0
|
122
|
Nenue@0
|
123 if mode == nil then
|
Nenue@0
|
124 ReloadUI()
|
Nenue@0
|
125 end
|
Nenue@0
|
126 if mode == STATE_LOW then
|
Nenue@0
|
127 D:Print('Developement AddOn list saved.')
|
Nenue@0
|
128 else
|
Nenue@0
|
129 D:Print('Standard AddOn list saved.')
|
Nenue@0
|
130 end
|
Nenue@0
|
131 end
|
Nenue@0
|
132
|
Nenue@0
|
133
|
Nenue@13
|
134 local function Console_MinMax(self)
|
Nenue@13
|
135 if self.minimized then
|
Nenue@7
|
136 self:Maximize()
|
Nenue@7
|
137 else
|
Nenue@7
|
138 self:Minimize()
|
Nenue@7
|
139 end
|
Nenue@7
|
140 end
|
Nenue@13
|
141
|
Nenue@13
|
142 local function Console_Minimize(self)
|
Nenue@13
|
143 self:SetHeight(20)
|
Nenue@13
|
144 self:SetMaxResize(GetScreenWidth(),20)
|
Nenue@13
|
145 self.minimized = true
|
Nenue@14
|
146 self.out:Hide()
|
Nenue@14
|
147 self:Save()
|
Nenue@7
|
148 end
|
Nenue@0
|
149
|
Nenue@13
|
150 local function Console_Maximize(self)
|
Nenue@13
|
151 local db = db.channels[self.index]
|
Nenue@13
|
152 self:SetHeight(db.height)
|
Nenue@13
|
153 self:SetMaxResize(GetScreenWidth(),GetScreenHeight())
|
Nenue@13
|
154 self.minimized = nil
|
Nenue@14
|
155 self.out:Show()
|
Nenue@14
|
156 self:Save()
|
Nenue@13
|
157 end
|
Nenue@13
|
158
|
Nenue@13
|
159
|
Nenue@13
|
160 local function Console_Save(self)
|
Nenue@13
|
161 local db = db.channels[self.index]
|
Nenue@14
|
162 if self.x then
|
Nenue@14
|
163 db.x = self.x
|
Nenue@14
|
164 else
|
Nenue@14
|
165 db.x = self:GetLeft()
|
Nenue@14
|
166 end
|
Nenue@14
|
167
|
Nenue@14
|
168 if self.y then
|
Nenue@14
|
169 db.y = self.y
|
Nenue@14
|
170 else
|
Nenue@14
|
171 db.y = (self:GetTop() - GetScreenHeight())
|
Nenue@14
|
172 end
|
Nenue@14
|
173
|
Nenue@14
|
174 if self.width then
|
Nenue@14
|
175 db.width = self.width
|
Nenue@14
|
176 else
|
Nenue@14
|
177 db.width = self:GetWidth()
|
Nenue@14
|
178 end
|
Nenue@14
|
179
|
Nenue@13
|
180 if not self.minimized then
|
Nenue@14
|
181 if self.height then
|
Nenue@14
|
182 db.height = self.height
|
Nenue@14
|
183 else
|
Nenue@14
|
184 db.height = self:GetHeight()
|
Nenue@14
|
185 end
|
Nenue@14
|
186 self:SetHeight(db.height)
|
Nenue@13
|
187 end
|
Nenue@14
|
188
|
Nenue@14
|
189 db.minimized = self.minimized and true or nil
|
Nenue@14
|
190 db.enabled = self:IsVisible() and true or nil
|
Nenue@14
|
191 db.active = self.active and true or nil
|
Nenue@17
|
192 --print('save:', db.signature, 'min=', db.minimized, ' enabled=', db.enabled, ' active = ', db.active, 'x=', db.x, 'y=', db.y, 'h=', db.height, 'w=', db.width)
|
Nenue@13
|
193 self:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', db.x, db.y)
|
Nenue@14
|
194 self:SetWidth(db.width)
|
Nenue@13
|
195 end
|
Nenue@13
|
196
|
Nenue@14
|
197 -- Console frame toggler
|
Nenue@14
|
198 -- @paramsig [...]
|
Nenue@14
|
199 -- @param ... one or more space-seperated channel keys
|
Nenue@13
|
200 local function Console_Toggle(input)
|
Nenue@14
|
201 local search = {}
|
Nenue@14
|
202 local key, n = D:GetArgs(input, 1)
|
Nenue@14
|
203 if key then
|
Nenue@14
|
204 repeat
|
Nenue@14
|
205 if D.sig[key] then
|
Nenue@14
|
206 table.insert(search, D.sig[key])
|
Nenue@14
|
207 elseif D.console[key] then
|
Nenue@14
|
208 table.insert(search, D.console[key])
|
Nenue@14
|
209 end
|
Nenue@14
|
210 key, n = D:GetArgs(input,1,n)
|
Nenue@14
|
211 until n == 1e9
|
Nenue@13
|
212 else
|
Nenue@13
|
213 search = D.console
|
Nenue@13
|
214 end
|
Nenue@13
|
215
|
Nenue@14
|
216 db.toggle = not db.toggle and true or nil
|
Nenue@13
|
217 for _, c in ipairs(search) do
|
Nenue@14
|
218 if db.toggle then
|
Nenue@14
|
219 c:Show()
|
Nenue@14
|
220 else
|
Nenue@14
|
221 c.enabled = nil
|
Nenue@14
|
222 c.minimized = nil
|
Nenue@14
|
223 c:Maximize()
|
Nenue@13
|
224 c:Hide()
|
Nenue@13
|
225 end
|
Nenue@13
|
226 end
|
Nenue@14
|
227
|
Nenue@14
|
228 if db.toggle then
|
Nenue@14
|
229 D:Print('toggled on?')
|
Nenue@14
|
230 else
|
Nenue@14
|
231 D:Print('toggled off?')
|
Nenue@14
|
232 end
|
Nenue@13
|
233 end
|
Nenue@13
|
234
|
Nenue@18
|
235 --- Brings the console to the front.
|
Nenue@18
|
236 -- Frame method used to bring a console frame to the front of the display stack.
|
Nenue@14
|
237 local function Console_ToFront(c)
|
Nenue@14
|
238 --print(D.raise_ct, 'Raising', c.signature)
|
Nenue@14
|
239 --print(unpack(db.frontdrop))
|
Nenue@14
|
240 --print(unpack(db.frontgrad))
|
Nenue@14
|
241 --print(db.frontblend)
|
Nenue@22
|
242 -- D.raise_ct = D.raise_ct + 1
|
Nenue@14
|
243 c:Raise()
|
Nenue@14
|
244 c.out.backdrop:SetTexture(unpack(db.frontdrop))
|
Nenue@14
|
245 c.out.backdrop:SetGradientAlpha(unpack(db.frontgrad))
|
Nenue@14
|
246 c.out.backdrop:SetBlendMode(db.frontblend)
|
Nenue@20
|
247 db.current_channel = c.index
|
Nenue@18
|
248
|
Nenue@18
|
249 for _, part in pairs(c.border) do
|
Nenue@24
|
250 part:SetTexture(unpack(db.frontborder))
|
Nenue@18
|
251 end
|
Nenue@14
|
252
|
Nenue@14
|
253 for id, bc in pairs(D.console) do
|
Nenue@14
|
254 if id ~= c.index then
|
Nenue@14
|
255 --print(D.raise_ct, 'Lowering', bc.signature)
|
Nenue@14
|
256 --print(unpack(db.backdrop))
|
Nenue@14
|
257 --print(unpack(db.backgrad))
|
Nenue@14
|
258 --print(db.backblend)
|
Nenue@14
|
259 bc.out.backdrop:SetTexture(unpack(db.backdrop))
|
Nenue@14
|
260 bc.out.backdrop:SetGradientAlpha(unpack(db.backgrad))
|
Nenue@14
|
261 bc.out.backdrop:SetBlendMode(db.backblend)
|
Nenue@18
|
262
|
Nenue@18
|
263 for _, part in pairs(bc.border) do
|
Nenue@24
|
264 part:SetTexture(unpack(db.backborder))
|
Nenue@14
|
265 end
|
Nenue@18
|
266 end
|
Nenue@18
|
267
|
Nenue@14
|
268 end
|
Nenue@14
|
269
|
Nenue@14
|
270 end
|
Nenue@14
|
271
|
Nenue@18
|
272 --- Constructs the frame object for a console channel
|
Nenue@18
|
273 -- Initializes the console channel at a specified index.
|
Nenue@18
|
274 -- Configuration data can be overridden by passing a desired settings table.
|
Nenue@18
|
275 -- @param i Numeric index of the channel as it manifests in db.channels
|
Nenue@18
|
276 -- @param vars Optional settings table to be used.
|
Nenue@13
|
277 local function CreateConsole(i, vars)
|
Nenue@14
|
278
|
Nenue@14
|
279 if not vars then
|
Nenue@14
|
280 vars = db.channels[i]
|
Nenue@14
|
281 end
|
Nenue@14
|
282
|
Nenue@17
|
283 --print('make:', vars.signature, '(', vars.x, vars.y, ')', vars.width, 'x', vars.height)
|
Nenue@13
|
284 local f = CreateFrame('Frame', 'DevianChannelFrame' .. tostring(i), UIParent, DEVIAN_FRAME)
|
Nenue@14
|
285 f:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', vars.x, vars.y)
|
Nenue@13
|
286 f:SetSize(vars.width, vars.height)
|
Nenue@13
|
287 f:Lower()
|
Nenue@13
|
288 f.out:SetFont(db.font, db.fontsize, db.fontoutline)
|
Nenue@22
|
289 if (db.current_channel == i) then
|
Nenue@24
|
290 f.out.backdrop:SetTexture(unpack(db.frontdrop))
|
Nenue@22
|
291 else
|
Nenue@24
|
292 f.out.backdrop:SetTexture(unpack(db.backdrop))
|
Nenue@22
|
293 end
|
Nenue@22
|
294
|
Nenue@13
|
295 f.Save = Console_Save
|
Nenue@13
|
296 f.Minimize = Console_Minimize
|
Nenue@13
|
297 f.Maximize = Console_Maximize
|
Nenue@13
|
298 f.MinMax = Console_MinMax
|
Nenue@14
|
299 f.ToFront = Console_ToFront
|
Nenue@13
|
300 f.Toggle = D.Console_Toggle
|
Nenue@13
|
301 f.name = vars.name
|
Nenue@13
|
302 f.index = i
|
Nenue@14
|
303 f.signature = vars.signature
|
Nenue@14
|
304 f.format = vars.header
|
Nenue@14
|
305 f.x = vars.x
|
Nenue@14
|
306 f.y = vars.y
|
Nenue@14
|
307 f.width = vars.width
|
Nenue@14
|
308 f.height = vars.height
|
Nenue@13
|
309
|
Nenue@14
|
310 if vars.enabled then
|
Nenue@14
|
311 f.enabled = true
|
Nenue@14
|
312 if db.toggle then
|
Nenue@14
|
313 f:Show()
|
Nenue@14
|
314 end
|
Nenue@13
|
315 end
|
Nenue@14
|
316 if vars.minimized then
|
Nenue@13
|
317 f:Minimize()
|
Nenue@22
|
318 else
|
Nenue@22
|
319 f:Maximize()
|
Nenue@13
|
320 end
|
Nenue@13
|
321
|
Nenue@13
|
322 return f
|
Nenue@13
|
323 end
|
Nenue@13
|
324
|
Nenue@18
|
325 --- Creates a Devian-style output.
|
Nenue@18
|
326 -- The first argument describes the channel to output on, and the remaining arguments are concatenated in a manner similar to default print()
|
Nenue@18
|
327 -- This becomes the print handler when development mode is active. The original print() function is assigned to oldprint().
|
Nenue@18
|
328 -- @param Tag, signature, or numeric index of the channel to output on. Defaults to primary channel.
|
Nenue@18
|
329 -- @param ... Output contents.
|
Nenue@0
|
330 local function Message(prefix, ...)
|
Nenue@24
|
331 if db.enabled == true then
|
Nenue@23
|
332 return D.oldprint(prefix, ...)
|
Nenue@23
|
333 end
|
Nenue@23
|
334
|
Nenue@1
|
335 if prefix == nil then
|
Nenue@13
|
336 prefix = 1
|
Nenue@1
|
337 end
|
Nenue@9
|
338
|
Nenue@18
|
339 local sendq = {}
|
Nenue@18
|
340 local tag, id
|
Nenue@13
|
341 local byName = true
|
Nenue@18
|
342 if D.tags[prefix] then
|
Nenue@18
|
343 for _, id in pairs(D.tags[prefix]) do
|
Nenue@18
|
344 if D.console[id] then
|
Nenue@18
|
345 sendq[id] = D.console[id]
|
Nenue@18
|
346 end
|
Nenue@18
|
347 end
|
Nenue@18
|
348 end
|
Nenue@18
|
349
|
Nenue@13
|
350 if D.sig[prefix] then
|
Nenue@18
|
351 sendq[D.sig[prefix].index] = D.sig[prefix]
|
Nenue@13
|
352 elseif D.console[prefix] then
|
Nenue@18
|
353 sendq[D.console[prefix]] = D.console[prefix]
|
Nenue@13
|
354 else
|
Nenue@18
|
355 sendq[D.primary_channel] = D.console[D.primary_channel]
|
Nenue@13
|
356 end
|
Nenue@18
|
357
|
Nenue@9
|
358 -- color me timbers
|
Nenue@9
|
359 local pcolor
|
Nenue@18
|
360 if (not db.tagcolor[prefix]) and byName then
|
Nenue@0
|
361 local c = {0, 0, 0 }
|
Nenue@0
|
362 local max = string.len(prefix)
|
Nenue@0
|
363 for i = 1, max, 3 do
|
Nenue@0
|
364 for k, v in ipairs(c) do
|
Nenue@0
|
365 local j = i + (k - 1)
|
Nenue@0
|
366 c[k] = c[k] + (j <= max and string.byte(prefix,j) or 0)
|
Nenue@0
|
367 end
|
Nenue@0
|
368 end
|
Nenue@0
|
369 for k,v in ipairs(c) do
|
Nenue@0
|
370 c[k] = c[k] % 255
|
Nenue@0
|
371 if c[k] < 64 then
|
Nenue@0
|
372 c[k] = 0
|
Nenue@0
|
373 elseif c[k] > 127 then
|
Nenue@0
|
374 c[k] = 255
|
Nenue@0
|
375 end
|
Nenue@0
|
376 end
|
Nenue@18
|
377 db.tagcolor[prefix] = string.format('%02X%02X%02X', unpack(c))
|
Nenue@0
|
378 end
|
Nenue@18
|
379 pcolor = db.tagcolor[prefix]
|
Nenue@0
|
380
|
Nenue@18
|
381 local buffer = {'|cFF'.. pcolor..prefix ..'|r'}
|
Nenue@0
|
382 for i = 1, select('#',...) do
|
Nenue@0
|
383 local var = select(i, ...)
|
Nenue@0
|
384
|
Nenue@0
|
385 if type(var) == 'table' then
|
Nenue@20
|
386 if type(var.GetName) == 'function' then
|
Nenue@20
|
387 var = '<table:'..(var:GetName() or '?')..'>'
|
Nenue@20
|
388 else
|
Nenue@20
|
389 var = '<table>'
|
Nenue@20
|
390 end
|
Nenue@20
|
391
|
Nenue@0
|
392 elseif type(var) == 'boolean' then
|
Nenue@0
|
393 var = var and 'true' or 'false'
|
Nenue@0
|
394 elseif type(var) == 'function' then
|
Nenue@0
|
395 var = '<funcref>'
|
Nenue@0
|
396 elseif type(var) == 'nil' then
|
Nenue@0
|
397 var = 'nil'
|
Nenue@0
|
398 end
|
Nenue@0
|
399
|
Nenue@0
|
400 table.insert(buffer, var)
|
Nenue@0
|
401 end
|
Nenue@18
|
402 local message = table.concat(buffer, ' ')
|
Nenue@18
|
403 for id, channel in pairs(sendq) do
|
Nenue@18
|
404 channel.out:AddMessage(message)
|
Nenue@18
|
405 end
|
Nenue@0
|
406 table.wipe(buffer)
|
Nenue@0
|
407 end
|
Nenue@0
|
408
|
Nenue@18
|
409 --- Spaces each frame evenly across the screen.
|
Nenue@14
|
410 function D:DistributeFrames() --
|
Nenue@17
|
411 --print('frame grid:', max, num_side)
|
Nenue@14
|
412 local max = self.num_channels
|
Nenue@14
|
413 local num_side = math.ceil(math.sqrt(max))
|
Nenue@14
|
414 local w = GetScreenWidth() / num_side
|
Nenue@14
|
415 local h = GetScreenHeight() / num_side
|
Nenue@14
|
416 for i, frame in pairs(D.console) do
|
Nenue@14
|
417 local dx = (i-1) % num_side
|
Nenue@14
|
418 local dy = math.floor((i-1) / num_side)
|
Nenue@14
|
419
|
Nenue@17
|
420 --print('move:', frame.signature, 'dx=', dx, 'dy=', dy)
|
Nenue@17
|
421 --print('move:', frame.signature, ' x=', dx * w, 'y=', -(dy * h), 'h=', h, 'w=', w)
|
Nenue@14
|
422 frame.width = w
|
Nenue@14
|
423 frame.height = h
|
Nenue@14
|
424 frame.x = dx * w
|
Nenue@14
|
425 frame.y = -(dy * h)
|
Nenue@14
|
426 frame:Save()
|
Nenue@14
|
427 end
|
Nenue@14
|
428
|
Nenue@14
|
429 end
|
Nenue@14
|
430
|
Nenue@18
|
431 --- Place all frames stacked beneath the primary frame.
|
Nenue@14
|
432 function D:StackFrames()
|
Nenue@14
|
433 local last
|
Nenue@14
|
434 for i, frame in pairs(self.console) do
|
Nenue@14
|
435 if last then
|
Nenue@14
|
436 frame.x = last.x
|
Nenue@14
|
437 frame.y = last.y - 20
|
Nenue@14
|
438 else
|
Nenue@14
|
439 frame.x = (GetScreenWidth()-frame:GetWidth())/2
|
Nenue@14
|
440 frame.y = 0
|
Nenue@14
|
441 end
|
Nenue@14
|
442 frame:Save()
|
Nenue@14
|
443 last = frame
|
Nenue@14
|
444 end
|
Nenue@14
|
445 end
|
Nenue@14
|
446
|
Nenue@18
|
447 --- Updates a console "channel" entry, generating a new one if necessary.
|
Nenue@18
|
448 -- Config data will be take from cinfo. If cinfo is a string, then only channel signature is set. The remaining variables are filled in from the primary channel.
|
Nenue@18
|
449 -- i can be given to select a specific channel table entry to work on. Otherwise, it will just create a new channel and the frame associated with it.
|
Nenue@18
|
450 -- @usage cinfo [, i]
|
Nenue@18
|
451 -- @param cinfo Config variables table, or a string to be used as channel signature
|
Nenue@18
|
452 -- @param i Console index. If valid, settings will be inherited from that channel.
|
Nenue@14
|
453 function D:SetChannel(cinfo, i)
|
Nenue@17
|
454 --print('join:', i , cinfo)
|
Nenue@14
|
455 local t_info = {}
|
Nenue@18
|
456 local dbvars = db.channels[self.primary_channel]
|
Nenue@18
|
457 if type(cinfo) == 'string' then
|
Nenue@18
|
458 local signame = tostring(cinfo)
|
Nenue@18
|
459 t_info.signature = signame
|
Nenue@18
|
460 end
|
Nenue@18
|
461
|
Nenue@14
|
462 if type(cinfo) ~= 'table' then
|
Nenue@14
|
463 cinfo = {}
|
Nenue@14
|
464 end
|
Nenue@18
|
465
|
Nenue@18
|
466 if i then
|
Nenue@14
|
467 i = tonumber(i)
|
Nenue@14
|
468 if db.channels[i] then
|
Nenue@18
|
469 dbvars = db.channels[i]
|
Nenue@18
|
470 else
|
Nenue@18
|
471 -- if there is no channels[i], then we need to check for sig collision
|
Nenue@18
|
472 local sigvar = signame
|
Nenue@18
|
473 local j = 2
|
Nenue@18
|
474 while D.sig[sigvar] do
|
Nenue@18
|
475 sigvar = signame .. j
|
Nenue@18
|
476 j = j + 1
|
Nenue@18
|
477 end
|
Nenue@18
|
478 t_info.signature = sigvar
|
Nenue@14
|
479 end
|
Nenue@14
|
480 end
|
Nenue@14
|
481
|
Nenue@18
|
482 if not (cinfo.signature or t_info.signature) then
|
Nenue@18
|
483 t_info.signature = 'Console'..i
|
Nenue@18
|
484 end
|
Nenue@18
|
485
|
Nenue@18
|
486 for k,v in pairs(dbvars) do
|
Nenue@14
|
487 if not t_info[k] then
|
Nenue@14
|
488 if cinfo[k] then
|
Nenue@14
|
489 t_info[k] = cinfo[k]
|
Nenue@18
|
490 elseif db.channels[self.primary_channel][k] then
|
Nenue@18
|
491 t_info[k] = db.channels[self.primary_channel][k]
|
Nenue@14
|
492 end
|
Nenue@14
|
493 end
|
Nenue@14
|
494 end
|
Nenue@14
|
495
|
Nenue@14
|
496 if not db.channels[i] then
|
Nenue@14
|
497 t_info.x = t_info.x + 20
|
Nenue@14
|
498 t_info.y = t_info.y - 20
|
Nenue@14
|
499 db.channels[i] = t_info
|
Nenue@14
|
500 end
|
Nenue@18
|
501
|
Nenue@14
|
502 if not self.console[i] then
|
Nenue@14
|
503 self.console[i] = CreateConsole(i, t_info)
|
Nenue@14
|
504 end
|
Nenue@18
|
505 local channel = self.console[i]
|
Nenue@18
|
506 self.sig[t_info.signature] = channel
|
Nenue@18
|
507 self.sigID[t_info.signature] = i
|
Nenue@18
|
508 self.IDsig[i] = t_info.signature
|
Nenue@20
|
509 if i == db.current_channel then
|
Nenue@20
|
510 channel:ToFront()
|
Nenue@20
|
511 end
|
Nenue@20
|
512
|
Nenue@18
|
513 return channel
|
Nenue@14
|
514 end
|
Nenue@14
|
515
|
Nenue@0
|
516 function D:OnEnable()
|
Nenue@13
|
517 -- commands
|
Nenue@13
|
518 local cmdlist = {
|
Nenue@13
|
519 ['dvn'] = ScanAddOnList,
|
Nenue@13
|
520 ['devian'] = ScanAddOnList,
|
Nenue@13
|
521 ['dvc'] = Console_Toggle,
|
Nenue@13
|
522 }
|
Nenue@13
|
523 for cmd, func in pairs(cmdlist) do
|
Nenue@13
|
524 self:RegisterChatCommand(cmd, func, true)
|
Nenue@13
|
525 end
|
Nenue@13
|
526
|
Nenue@11
|
527 if db.enabled == true then
|
Nenue@0
|
528 D:Print('Standard AddOn list active. Type /dvn to switch to development mode.')
|
Nenue@0
|
529 else
|
Nenue@0
|
530 D:Print('Development AddOn list active. Type /dvn to revert to regular operation.')
|
Nenue@0
|
531 end
|
Nenue@13
|
532
|
Nenue@0
|
533 end
|
Nenue@0
|
534
|
Nenue@0
|
535 function D:OnInitialize()
|
Nenue@13
|
536 -- emergency button
|
Nenue@13
|
537 self:RegisterChatCommand("cleandvn", function(args)
|
Nenue@13
|
538 DevianDB = nil
|
Nenue@13
|
539 ReloadUI()
|
Nenue@13
|
540 end)
|
Nenue@13
|
541
|
Nenue@13
|
542 -- savedvars
|
Nenue@13
|
543 local cherry = false
|
Nenue@9
|
544 if not _G.DevianDB then
|
Nenue@13
|
545 _G.DevianDB = defaults
|
Nenue@13
|
546 cherry = "Type /dvnsave to snapshot your current UI"
|
Nenue@9
|
547 end
|
Nenue@9
|
548 db = _G.DevianDB
|
Nenue@0
|
549
|
Nenue@0
|
550 if not db[PLAYER_REALM] then
|
Nenue@9
|
551 db[PLAYER_REALM] = {[STATE_LOW] = {}, [STATE_HIGH] = {}}
|
Nenue@0
|
552 if not cherry then
|
Nenue@0
|
553 cherry = "This character didn't have an AddOn table."
|
Nenue@0
|
554 end
|
Nenue@0
|
555 end
|
Nenue@0
|
556
|
Nenue@18
|
557
|
Nenue@18
|
558 if not db.tags then
|
Nenue@18
|
559 db.tags = {}
|
Nenue@13
|
560 end
|
Nenue@18
|
561 self.tags = db.tags
|
Nenue@0
|
562 if cherry then
|
Nenue@0
|
563 D:Print(cherry)
|
Nenue@0
|
564 end
|
Nenue@0
|
565 D.oldprint = getprinthandler()
|
Nenue@0
|
566 if not _G.oldprint then
|
Nenue@0
|
567 _G.oldprint = D.oldprint
|
Nenue@0
|
568 end
|
Nenue@13
|
569
|
Nenue@22
|
570 --self.raise_ct = 0
|
Nenue@14
|
571 self.last_channel = 0
|
Nenue@14
|
572 self.num_channels = 0
|
Nenue@13
|
573 self.console = {}
|
Nenue@13
|
574 self.sig = {}
|
Nenue@14
|
575 self.sigID = {}
|
Nenue@14
|
576 self.IDsig = {}
|
Nenue@14
|
577 for i, cinfo in pairs(db.channels) do
|
Nenue@14
|
578 i = tonumber(i)
|
Nenue@14
|
579 if not self.primary_channel then
|
Nenue@14
|
580 self.primary_channel = i
|
Nenue@14
|
581 end
|
Nenue@14
|
582 self:SetChannel(cinfo, i)
|
Nenue@14
|
583 if i > self.last_channel then
|
Nenue@14
|
584 self.last_channel = i
|
Nenue@14
|
585 end
|
Nenue@14
|
586 self.num_channels = self.num_channels + 1
|
Nenue@13
|
587 end
|
Nenue@18
|
588
|
Nenue@18
|
589 if self.console[db.current_channel] then
|
Nenue@18
|
590 self.console[db.current_channel]:ToFront()
|
Nenue@18
|
591 end
|
Nenue@18
|
592
|
Nenue@23
|
593 if db.enabled then
|
Nenue@24
|
594 for i, c in pairs(self.console) do
|
Nenue@23
|
595 self.console[i]:Hide()
|
Nenue@23
|
596 end
|
Nenue@23
|
597 end
|
Nenue@23
|
598
|
Nenue@23
|
599
|
Nenue@18
|
600 -- only do this in dev mode
|
Nenue@18
|
601 if db.enabled == false then
|
Nenue@18
|
602 setprinthandler(Message)
|
Nenue@18
|
603 print = function(...)
|
Nenue@18
|
604 _G.print('Dvn', ...)
|
Nenue@18
|
605 end
|
Nenue@18
|
606 end
|
Nenue@13
|
607 print(MAJOR, MINOR)
|
Nenue@0
|
608 end |