comparison Devian.lua @ 18:01c32c98e72a v1.4

LuaDoc info added Removal of release tagged debug output /dvn tag <prefix> <channel> can be applied to multiple channels, and re-using the command will toggle that output off SetChannel data clobbering fixed Message prefix coloring fixed
author Nenue
date Sun, 20 Dec 2015 18:27:26 -0500
parents 48a1d9c14af5
children df098747b31d
comparison
equal deleted inserted replaced
17:48a1d9c14af5 18:01c32c98e72a
7 local MAJOR, MINOR = 'Devian-1.3', 'r@project-revision@' 7 local MAJOR, MINOR = 'Devian-1.3', 'r@project-revision@'
8 local D = _G.Devian 8 local D = _G.Devian
9 local STATE_LOW, STATE_HIGH = 1, 2 9 local STATE_LOW, STATE_HIGH = 1, 2
10 local PLAYER_REALM = UnitName("player") .. '-' .. GetRealmName() 10 local PLAYER_REALM = UnitName("player") .. '-' .. GetRealmName()
11 local DEVIAN_FRAME = 'DevianConsole' 11 local DEVIAN_FRAME = 'DevianConsole'
12 local print = function(...) 12 local print = _G.print
13 _G.print('Dvn', ...)
14 end
15 local db 13 local db
16 local defaults = { 14 local defaults = {
17 ['global'] = {[STATE_LOW] = {}, [STATE_HIGH] = {}}, 15 ['global'] = {[STATE_LOW] = {}, [STATE_HIGH] = {}},
18 ['tags'] = {}, 16 ['tags'] = {},
19 ['channels'] = {[1] = {signature = 'Dvn', name = 'Main', header = "%n [%t]", x = 100, y = 800, height = 500, width = 600, enabled = true}}, 17 ['channels'] = {[1] = {signature = 'Dvn', name = 'Main', header = "%n [%t]", x = 100, y = 800, height = 500, width = 600, enabled = true}},
58 return D:StackFrames() 56 return D:StackFrames()
59 elseif mode == 'grid' then 57 elseif mode == 'grid' then
60 return D:DistributeFrames() 58 return D:DistributeFrames()
61 elseif mode == 'tag' then -- tagging 59 elseif mode == 'tag' then -- tagging
62 if tag ~= nil and dest ~= nil then 60 if tag ~= nil and dest ~= nil then
63 if not D.console[dest] and not D.sig[dest] then 61 local channel = D:SetChannel(dest:match('%a'), dest:match('%d'))
64 local sig = dest:match('%a') 62 if not D.tags[tag] then
65 local id = dest:match('%d') 63 D.tags[tag] = {}
66 if not id then 64 end
67 id = self.last_channel + 1 65 if D.tags[tag][channel.index] then
68 end 66 D.tags[tag][channel.index] = nil
69 if not sig then 67 D:Print('Removed |cFFFFFF00'..tag..'|r from |cFF00FFFF'.. dest .. '|r')
70 sig = tag 68 else
71 end 69 D.tags[tag][channel.index] = channel.index
72 D:SetChannel(sig, id) 70 D:Print('Assigning |cFFFFFF00'..tag..'|r to |cFF00FFFF'.. dest .. '|r')
73 end 71 end
74 D:Print('Assigning |cFFFFFF00'..tag..'|r to |cFF00FFFF'.. dest .. '|r') 72
75 else 73 else
76 D:Print('Usage: /dvn tag <prefix> <console name or number>') 74 D:Print('Usage: /dvn tag <prefix> <console name or number>')
77 end 75 end
78 return 76 return
79 elseif mode ~= nil then 77 elseif mode ~= nil then
230 else 228 else
231 D:Print('toggled off?') 229 D:Print('toggled off?')
232 end 230 end
233 end 231 end
234 232
235 -- Bring console to the front 233 --- Brings the console to the front.
234 -- Frame method used to bring a console frame to the front of the display stack.
236 local function Console_ToFront(c) 235 local function Console_ToFront(c)
237 --print(D.raise_ct, 'Raising', c.signature) 236 --print(D.raise_ct, 'Raising', c.signature)
238 --print(unpack(db.frontdrop)) 237 --print(unpack(db.frontdrop))
239 --print(unpack(db.frontgrad)) 238 --print(unpack(db.frontgrad))
240 --print(db.frontblend) 239 --print(db.frontblend)
241 D.raise_ct = D.raise_ct + 1 240 D.raise_ct = D.raise_ct + 1
242 c:Raise() 241 c:Raise()
243 c.out.backdrop:SetTexture(unpack(db.frontdrop)) 242 c.out.backdrop:SetTexture(unpack(db.frontdrop))
244 c.out.backdrop:SetGradientAlpha(unpack(db.frontgrad)) 243 c.out.backdrop:SetGradientAlpha(unpack(db.frontgrad))
245 c.out.backdrop:SetBlendMode(db.frontblend) 244 c.out.backdrop:SetBlendMode(db.frontblend)
245 D.current_channel = c.index
246
247 for _, part in pairs(c.border) do
248 part:SetTexture(1,0,0,1)
249 end
246 250
247 for id, bc in pairs(D.console) do 251 for id, bc in pairs(D.console) do
248 if id ~= c.index then 252 if id ~= c.index then
249 --print(D.raise_ct, 'Lowering', bc.signature) 253 --print(D.raise_ct, 'Lowering', bc.signature)
250 --print(unpack(db.backdrop)) 254 --print(unpack(db.backdrop))
251 --print(unpack(db.backgrad)) 255 --print(unpack(db.backgrad))
252 --print(db.backblend) 256 --print(db.backblend)
253 bc.out.backdrop:SetTexture(unpack(db.backdrop)) 257 bc.out.backdrop:SetTexture(unpack(db.backdrop))
254 bc.out.backdrop:SetGradientAlpha(unpack(db.backgrad)) 258 bc.out.backdrop:SetGradientAlpha(unpack(db.backgrad))
255 bc.out.backdrop:SetBlendMode(db.backblend) 259 bc.out.backdrop:SetBlendMode(db.backblend)
256 end 260
257 end 261 for _, part in pairs(bc.border) do
258 262 part:SetTexture(0,0,0.5,0.6)
259 end 263 end
260 264 end
261 -- Generate a console frame 265
262 -- @paramsig id, vars 266 end
263 -- @param id channel number 267
264 -- @param vars alternative config, else uses db.channels[id] 268 end
269
270 --- Constructs the frame object for a console channel
271 -- Initializes the console channel at a specified index.
272 -- Configuration data can be overridden by passing a desired settings table.
273 -- @param i Numeric index of the channel as it manifests in db.channels
274 -- @param vars Optional settings table to be used.
265 local function CreateConsole(i, vars) 275 local function CreateConsole(i, vars)
266 276
267 if not vars then 277 if not vars then
268 vars = db.channels[i] 278 vars = db.channels[i]
269 end 279 end
300 end 310 end
301 311
302 return f 312 return f
303 end 313 end
304 314
305 -- Print to Devian output 315 --- Creates a Devian-style output.
306 -- @paramsig tag, ... 316 -- The first argument describes the channel to output on, and the remaining arguments are concatenated in a manner similar to default print()
307 -- @param tag channel signature or number used to select console 317 -- This becomes the print handler when development mode is active. The original print() function is assigned to oldprint().
308 -- @param ... print arguments 318 -- @param Tag, signature, or numeric index of the channel to output on. Defaults to primary channel.
319 -- @param ... Output contents.
309 local function Message(prefix, ...) 320 local function Message(prefix, ...)
310 if prefix == nil then 321 if prefix == nil then
311 prefix = 1 322 prefix = 1
312 end 323 end
313 324
314 local channel 325 local sendq = {}
326 local tag, id
315 local byName = true 327 local byName = true
328 if D.tags[prefix] then
329 for _, id in pairs(D.tags[prefix]) do
330 if D.console[id] then
331 sendq[id] = D.console[id]
332 end
333 end
334 end
335
316 if D.sig[prefix] then 336 if D.sig[prefix] then
317 channel = D.sig[prefix] 337 sendq[D.sig[prefix].index] = D.sig[prefix]
318 elseif D.console[prefix] then 338 elseif D.console[prefix] then
319 channel = D.console[prefix] 339 sendq[D.console[prefix]] = D.console[prefix]
320 byName = nil 340 else
321 else 341 sendq[D.primary_channel] = D.console[D.primary_channel]
322 channel = D.console[1] 342 end
323 end 343
324 -- color me timbers 344 -- color me timbers
325 local pcolor 345 local pcolor
326 if D.tags[prefix] then 346 if (not db.tagcolor[prefix]) and byName then
327 pcolor = db.tags[prefix]
328 elseif byName then
329 local c = {0, 0, 0 } 347 local c = {0, 0, 0 }
330 local max = string.len(prefix) 348 local max = string.len(prefix)
331 for i = 1, max, 3 do 349 for i = 1, max, 3 do
332 for k, v in ipairs(c) do 350 for k, v in ipairs(c) do
333 local j = i + (k - 1) 351 local j = i + (k - 1)
340 c[k] = 0 358 c[k] = 0
341 elseif c[k] > 127 then 359 elseif c[k] > 127 then
342 c[k] = 255 360 c[k] = 255
343 end 361 end
344 end 362 end
345 D.tags[prefix] = string.format('%02X%02X%02X', unpack(c)) 363 db.tagcolor[prefix] = string.format('%02X%02X%02X', unpack(c))
346 end 364 end
347 365 pcolor = db.tagcolor[prefix]
348 local buffer = {'|cFF'.. D.tags[prefix]..prefix ..'|r'} 366
367 local buffer = {'|cFF'.. pcolor..prefix ..'|r'}
349 for i = 1, select('#',...) do 368 for i = 1, select('#',...) do
350 local var = select(i, ...) 369 local var = select(i, ...)
351 370
352 if type(var) == 'table' then 371 if type(var) == 'table' then
353 var = '<table>' 372 var = '<table>'
359 var = 'nil' 378 var = 'nil'
360 end 379 end
361 380
362 table.insert(buffer, var) 381 table.insert(buffer, var)
363 end 382 end
364 channel.out:AddMessage(table.concat(buffer, ' ')) 383 local message = table.concat(buffer, ' ')
384 for id, channel in pairs(sendq) do
385 channel.out:AddMessage(message)
386 end
365 table.wipe(buffer) 387 table.wipe(buffer)
366 end 388 end
367 389
368 -- Spaces each frame evenly across the screen 390 --- Spaces each frame evenly across the screen.
369 function D:DistributeFrames() -- 391 function D:DistributeFrames() --
370 --print('frame grid:', max, num_side) 392 --print('frame grid:', max, num_side)
371 local max = self.num_channels 393 local max = self.num_channels
372 local num_side = math.ceil(math.sqrt(max)) 394 local num_side = math.ceil(math.sqrt(max))
373 local w = GetScreenWidth() / num_side 395 local w = GetScreenWidth() / num_side
385 frame:Save() 407 frame:Save()
386 end 408 end
387 409
388 end 410 end
389 411
390 -- Place all frames stacked beneath the primary frame 412 --- Place all frames stacked beneath the primary frame.
391 -- @paramsig
392 function D:StackFrames() 413 function D:StackFrames()
393 local last 414 local last
394 for i, frame in pairs(self.console) do 415 for i, frame in pairs(self.console) do
395 if last then 416 if last then
396 frame.x = last.x 417 frame.x = last.x
402 frame:Save() 423 frame:Save()
403 last = frame 424 last = frame
404 end 425 end
405 end 426 end
406 427
407 -- Creates or updates a console frame 428 --- Updates a console "channel" entry, generating a new one if necessary.
408 -- @paramsig cinfo [, i] 429 -- 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.
409 -- @param cinfo an array from db.channels[x] or the desired string signature 430 -- 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.
410 -- @param id when set, the console at that index will be assigned all parameters in cinfo 431 -- @usage cinfo [, i]
432 -- @param cinfo Config variables table, or a string to be used as channel signature
433 -- @param i Console index. If valid, settings will be inherited from that channel.
411 function D:SetChannel(cinfo, i) 434 function D:SetChannel(cinfo, i)
412 --print('join:', i , cinfo) 435 --print('join:', i , cinfo)
413 local t_info = {} 436 local t_info = {}
437 local dbvars = db.channels[self.primary_channel]
438 if type(cinfo) == 'string' then
439 local signame = tostring(cinfo)
440 t_info.signature = signame
441 end
442
414 if type(cinfo) ~= 'table' then 443 if type(cinfo) ~= 'table' then
415 t_info.signature = tostring(cinfo)
416 cinfo = {} 444 cinfo = {}
417 end 445 end
418 local srcdb = db.channels[self.primary_channel] 446
419 if i ~= nil then 447 if i then
420 i = tonumber(i) 448 i = tonumber(i)
421 if db.channels[i] then 449 if db.channels[i] then
422 --print('pull vars from '..db.channels[i].signature) 450 dbvars = db.channels[i]
423 cinfo = db.channels[i] 451 else
424 srcdb = cinfo 452 -- if there is no channels[i], then we need to check for sig collision
425 end 453 local sigvar = signame
426 end 454 local j = 2
427 455 while D.sig[sigvar] do
428 for k,v in pairs(srcdb) do 456 sigvar = signame .. j
457 j = j + 1
458 end
459 t_info.signature = sigvar
460 end
461 end
462
463 if not (cinfo.signature or t_info.signature) then
464 t_info.signature = 'Console'..i
465 end
466
467 for k,v in pairs(dbvars) do
429 if not t_info[k] then 468 if not t_info[k] then
430 if cinfo[k] then 469 if cinfo[k] then
431 --print('- pulling', k..':',v)
432 t_info[k] = cinfo[k] 470 t_info[k] = cinfo[k]
471 elseif db.channels[self.primary_channel][k] then
472 t_info[k] = db.channels[self.primary_channel][k]
433 end 473 end
434 end 474 end
435 end 475 end
436 476
437 if not db.channels[i] then 477 if not db.channels[i] then
438 t_info.x = t_info.x + 20 478 t_info.x = t_info.x + 20
439 t_info.y = t_info.y - 20 479 t_info.y = t_info.y - 20
440 db.channels[i] = t_info 480 db.channels[i] = t_info
441 end 481 end
482
442 if not self.console[i] then 483 if not self.console[i] then
443 self.console[i] = CreateConsole(i, t_info) 484 self.console[i] = CreateConsole(i, t_info)
444 end 485 end
445 486 local channel = self.console[i]
446 self.sig[cinfo.signature] = self.console[i] 487
447 self.sigID[cinfo.signature] = i 488 self.sig[t_info.signature] = channel
448 self.IDsig[i] = cinfo.signature 489 self.sigID[t_info.signature] = i
490 self.IDsig[i] = t_info.signature
491 return channel
449 end 492 end
450 493
451 function D:OnEnable() 494 function D:OnEnable()
452 -- commands 495 -- commands
453 local cmdlist = { 496 local cmdlist = {
487 if not cherry then 530 if not cherry then
488 cherry = "This character didn't have an AddOn table." 531 cherry = "This character didn't have an AddOn table."
489 end 532 end
490 end 533 end
491 534
492 -- copy tags 535
493 self.tags = {} 536 if not db.tags then
494 for n, c in pairs(db.tags) do 537 db.tags = {}
495 self.tags[n] = c 538 end
496 end 539 self.tags = db.tags
497 if cherry then 540 if cherry then
498 D:Print(cherry) 541 D:Print(cherry)
499 end 542 end
500 D.oldprint = getprinthandler() 543 D.oldprint = getprinthandler()
501 if not _G.oldprint then 544 if not _G.oldprint then
518 if i > self.last_channel then 561 if i > self.last_channel then
519 self.last_channel = i 562 self.last_channel = i
520 end 563 end
521 self.num_channels = self.num_channels + 1 564 self.num_channels = self.num_channels + 1
522 end 565 end
523 setprinthandler(Message) 566
567 if self.console[db.current_channel] then
568 self.console[db.current_channel]:ToFront()
569 end
570
571 -- only do this in dev mode
572 if db.enabled == false then
573 setprinthandler(Message)
574 print = function(...)
575 _G.print('Dvn', ...)
576 end
577 end
524 print(MAJOR, MINOR) 578 print(MAJOR, MINOR)
525 end 579 end