Mercurial > wow > devian
comparison Devian.lua @ 35:3304455a3f45
code organizing; UI stuff is in the UI script, Devian prime just deals with config and print
corner menu elements placed and hooked, still needs follow-up code
author | Nenue |
---|---|
date | Sun, 27 Dec 2015 03:51:17 -0500 |
parents | 7441f3bce940 |
children | bec37163b7fe |
comparison
equal
deleted
inserted
replaced
34:7441f3bce940 | 35:3304455a3f45 |
---|---|
8 Devian = LibStub("AceAddon-3.0"):NewAddon("Devian", "AceConsole-3.0", "AceEvent-3.0") | 8 Devian = LibStub("AceAddon-3.0"):NewAddon("Devian", "AceConsole-3.0", "AceEvent-3.0") |
9 local MAJOR, MINOR = 'Devian-1.3', 'r@project-revision@' | 9 local MAJOR, MINOR = 'Devian-1.3', 'r@project-revision@' |
10 local D = _G.Devian | 10 local D = _G.Devian |
11 local WORKSPACE_ON, WORKSPACE_OFF = 1, 2 | 11 local WORKSPACE_ON, WORKSPACE_OFF = 1, 2 |
12 local PLAYER_REALM = UnitName("player") .. '-' .. GetRealmName() | 12 local PLAYER_REALM = UnitName("player") .. '-' .. GetRealmName() |
13 local DEVIAN_FRAME = 'DevianConsole' | |
14 local DEVIAN_DOCK_FRAME = 'DevianDockFrame' | |
15 local MSG_NEED_DEV_MODE = 'Must be in development mode to use this function.' | |
16 local print = _G.print | 13 local print = _G.print |
17 local db | 14 local db |
18 local defaults = { | 15 local defaults = { |
19 ['global'] = {{}, {}}, | 16 ['global'] = {{}, {}}, |
20 ['tags'] = {}, | 17 ['tags'] = {}, |
43 tagcolor = {}, -- tag color repository | 40 tagcolor = {}, -- tag color repository |
44 workspace = 1, -- current profile | 41 workspace = 1, -- current profile |
45 last_workspace = 2 -- default workspace to alternate with when just "/dvn" is issued | 42 last_workspace = 2 -- default workspace to alternate with when just "/dvn" is issued |
46 } | 43 } |
47 | 44 |
48 | |
49 local function ScanAddOnList(cmd, ...) | 45 local function ScanAddOnList(cmd, ...) |
50 local list_state | 46 local list_state |
51 | 47 |
52 local args = {} | 48 local args = {} |
53 local arg, n = D:GetArgs(cmd, 1) | 49 local arg, n = D:GetArgs(cmd, 1) |
86 -- last resort | 82 -- last resort |
87 else | 83 else |
88 D:Print('No entry for argument #'..i..': '..tostring(args[i])) | 84 D:Print('No entry for argument #'..i..': '..tostring(args[i])) |
89 return | 85 return |
90 end | 86 end |
91 oldprint(i, '->', ch.index, '-', ch.signature) | 87 --@debug@ |
88 --print(i, '->', ch.index, '-', ch.signature)--@end-debug@ | |
92 if i > 2 then | 89 if i > 2 then |
93 table.insert(worklist, ch.index) | 90 table.insert(worklist, ch.index) |
94 else | 91 else |
95 target = ch | 92 target = ch |
96 | 93 |
97 oldprint('arg1', args[2], target) | 94 --@debug@ |
95 --print('arg1', args[2], target)--@end-debug@ | |
98 end | 96 end |
99 end | 97 end |
100 D:Print("Docking |cFF88FFFF"..table.concat(worklist, "|r, |cFF88FFFF").."|r with |cFFFFFF00"..target.index..', '..target.signature.."|r.") | 98 D:Print("Docking |cFF88FFFF"..table.concat(worklist, "|r, |cFF88FFFF").."|r with |cFFFFFF00"..target.index..', '..target.signature.."|r.") |
101 return D:DockFrame(target.index, unpack(worklist)) | 99 return D:DockFrame(target.index, unpack(worklist)) |
102 | 100 |
219 end | 217 end |
220 end | 218 end |
221 end | 219 end |
222 | 220 |
223 | 221 |
224 local function Console_MinMax(self) | |
225 if self.minimized then | |
226 self:Maximize() | |
227 else | |
228 self:Minimize() | |
229 end | |
230 end | |
231 | |
232 local function Console_Minimize(self) | |
233 self:SetHeight(20) | |
234 self:SetMaxResize(GetScreenWidth(),20) | |
235 self.minimized = true | |
236 self.out:Hide() | |
237 self:Save() | |
238 end | |
239 | |
240 local function Console_Maximize(self) | |
241 local db = db.channels[self.index] | |
242 self:SetHeight(db.height) | |
243 self:SetMaxResize(GetScreenWidth(),GetScreenHeight()) | |
244 self.minimized = nil | |
245 self.out:Show() | |
246 self:Save() | |
247 end | |
248 | |
249 | |
250 local function Console_Save(self) | |
251 local db = db.channels[self.index] | |
252 if self.x then | |
253 db.x = self.x | |
254 else | |
255 db.x = self:GetLeft() | |
256 end | |
257 | |
258 if self.y then | |
259 db.y = self.y | |
260 else | |
261 db.y = (self:GetTop() - GetScreenHeight()) | |
262 end | |
263 | |
264 if self.width then | |
265 db.width = self.width | |
266 else | |
267 db.width = self:GetWidth() | |
268 end | |
269 | |
270 if not self.minimized then | |
271 if self.height then | |
272 db.height = self.height | |
273 else | |
274 db.height = self:GetHeight() | |
275 end | |
276 self:SetHeight(db.height) | |
277 end | |
278 | |
279 db.dockedTo = self.dockedTo | |
280 db.docked = self.docked | |
281 | |
282 db.minimized = self.minimized and true or nil | |
283 db.enabled = self:IsVisible() and true or nil | |
284 db.active = self.active and true or nil | |
285 --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) | |
286 self:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', db.x, db.y) | |
287 self:SetWidth(db.width) | |
288 end | |
289 | |
290 -- Console frame toggler | |
291 -- @paramsig [...] | |
292 -- @param ... one or more space-seperated channel keys | |
293 local function Console_Toggle(input) | |
294 if db.workspace == 1 then | |
295 return D:Print(MSG_NEED_DEV_MODE) | |
296 end | |
297 local search = {} | |
298 local n = 0 | |
299 if D:GetArgs(input,1) then | |
300 repeat | |
301 key, n = D:GetArgs(input,1,n) | |
302 if D.sig[key] then | |
303 table.insert(search, D.sig[key]) | |
304 elseif D.console[key] then | |
305 table.insert(search, D.console[key]) | |
306 end | |
307 until n == 1e9 | |
308 else | |
309 search = D.console | |
310 end | |
311 | |
312 db.enabled = (not db.enabled) and true or nil | |
313 for i, c in ipairs(search) do | |
314 --print(i,c.index) | |
315 if db.enabled then | |
316 c.enabled = true | |
317 c:Show() | |
318 if db.current_channel == c.index then | |
319 c:ToFront() | |
320 end | |
321 c:Save() | |
322 else | |
323 c:Hide() | |
324 end | |
325 end | |
326 | |
327 if db.enabled then | |
328 D:Print('toggled on?') | |
329 else | |
330 D:Print('toggled off?') | |
331 end | |
332 end | |
333 | |
334 --- Brings the console to the front. | |
335 -- Frame method used to bring a console frame to the front of the display stack. | |
336 local function Console_ToFront(c) | |
337 --print(D.raise_ct, 'Raising', c.signature) | |
338 --print(unpack(db.frontdrop)) | |
339 --print(unpack(db.frontgrad)) | |
340 --print(db.frontblend) | |
341 -- D.raise_ct = D.raise_ct + 1 | |
342 c:Raise() | |
343 c:SetAlpha(db.frontalpha) | |
344 c.out.backdrop:SetTexture(unpack(db.frontdrop)) | |
345 c.out.backdrop:SetGradientAlpha(unpack(db.frontgrad)) | |
346 c.out.backdrop:SetBlendMode(db.frontblend) | |
347 db.current_channel = c.index | |
348 | |
349 for _, part in pairs(c.border) do | |
350 part:SetTexture(unpack(db.frontborder)) | |
351 end | |
352 | |
353 for id, bc in pairs(D.console) do | |
354 if id ~= c.index then | |
355 --print(D.raise_ct, 'Lowering', bc.signature) | |
356 --print(unpack(db.backdrop)) | |
357 --print(unpack(db.backgrad)) | |
358 --print(db.backblend) | |
359 bc:SetAlpha(db.backalpha) | |
360 bc.out.backdrop:SetTexture(unpack(db.backdrop)) | |
361 bc.out.backdrop:SetGradientAlpha(unpack(db.backgrad)) | |
362 bc.out.backdrop:SetBlendMode(db.backblend) | |
363 | |
364 for _, part in pairs(bc.border) do | |
365 part:SetTexture(unpack(db.backborder)) | |
366 end | |
367 end | |
368 | |
369 end | |
370 | |
371 end | |
372 | |
373 local function Console_MouseDown(self, button, up) | |
374 if button == 'LeftButton' then | |
375 if up then | |
376 self:StopMovingOrSizing() | |
377 self:ToFront() | |
378 self.x = nil | |
379 self.y = nil | |
380 self.width = nil | |
381 self.height = nil | |
382 self:Save() | |
383 elseif self.out.grip:IsMouseOver() then | |
384 self:StartSizing() | |
385 else | |
386 self:StartMoving() | |
387 end | |
388 else | |
389 if up then | |
390 self:MinMax() | |
391 end | |
392 end | |
393 end | |
394 local function Console_MouseUp(self, button) | |
395 return Console_MouseDown(self, button, true) | |
396 end | |
397 | 222 |
398 --- Creates a Devian-style output. | 223 --- Creates a Devian-style output. |
399 -- The first argument describes the channel to output on, and the remaining arguments are concatenated in a manner similar to default print() | 224 -- The first argument describes the channel to output on, and the remaining arguments are concatenated in a manner similar to default print() |
400 -- This becomes the print handler when development mode is active. The original print() function is assigned to oldprint(). | 225 -- This becomes the print handler when development mode is active. The original print() function is assigned to oldprint(). |
401 -- @param Tag, signature, or numeric index of the channel to output on. Defaults to primary channel. | 226 -- @param Tag, signature, or numeric index of the channel to output on. Defaults to primary channel. |
470 end | 295 end |
471 table.wipe(buffer) | 296 table.wipe(buffer) |
472 end | 297 end |
473 | 298 |
474 | 299 |
475 --- Constructs the frame object for a console channel | 300 |
476 -- Initializes the console channel at a specified index. | |
477 -- Configuration data can be overridden by passing a desired settings table. | |
478 -- @param i Numeric index of the channel as it manifests in db.channels | |
479 -- @param vars Optional settings table to be used. | |
480 local function CreateConsole(i, vars) | |
481 if tonumber(i) == nil or math.floor(i) ~= i then | |
482 error('Non-integer index value.') | |
483 end | |
484 if not vars then | |
485 vars = db.channels[i] and db.channels[i] or db.channels[db.primary_channel] | |
486 end | |
487 local f | |
488 if vars.docked then | |
489 f = CreateFrame('Frame','DevianDockFrame' .. i, DEVIAN_DOCK_FRAME) | |
490 else | |
491 f= CreateFrame('Frame', 'DevianChannelFrame' .. i, UIParent, DEVIAN_FRAME) | |
492 end | |
493 --@debug@ | |
494 --print(f:GetName()) | |
495 | |
496 --print('create(2)') | |
497 for k,v in pairs(vars) do | |
498 f[k] = v | |
499 --@debug@ | |
500 --print(' f['..type(k)..' '..tostring(k)..'] = '..type(v)..' '..tostring(v)) | |
501 end | |
502 | |
503 f:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', vars.x, vars.y) | |
504 f:SetSize(vars.width, vars.height) | |
505 f:Lower() | |
506 f.out:SetFont(db.font, db.fontsize, db.fontoutline) | |
507 if (db.current_channel == i) then | |
508 f.out.backdrop:SetTexture(unpack(db.frontdrop)) | |
509 else | |
510 f.out.backdrop:SetTexture(unpack(db.backdrop)) | |
511 end | |
512 | |
513 | |
514 | |
515 f.Save = Console_Save | |
516 f.Minimize = Console_Minimize | |
517 f.Maximize = Console_Maximize | |
518 f.MinMax = Console_MinMax | |
519 f.ToFront = Console_ToFront | |
520 f.Toggle = D.Console_Toggle | |
521 f:SetScript('OnMouseDown', Console_MouseDown) | |
522 f:SetScript('OnMouseUp', Console_MouseUp) | |
523 | |
524 if vars.minimized then | |
525 f:Minimize() | |
526 else | |
527 f:Maximize() | |
528 end | |
529 if db.enabled and f.enabled then | |
530 f:Show() | |
531 end | |
532 | |
533 return f | |
534 end | |
535 | |
536 --- Updates console information and returns the handle of the channel object that was worked on. | |
537 -- When key is nil or not a valid handle, a new channel is created using whatever signature can be found in cinfo. | |
538 -- The signature can be passed as a string, or as a table entry under the key 'signature' | |
539 -- If the signature of a new channel is also a tag, the channel will be added to that tag | |
540 -- @param cinfo string signature of a new channel, or a table of config variables to be imposed on the channel | |
541 -- @param key string signature or index number of channel to operate on | |
542 -- @usage channel = D:SetChannel('new', nil) -- creates a new channel | |
543 -- @usage channel = D:SetChannel({x = 200, y = 100}, 4) -- updates channel #4 | |
544 function D:SetChannel(cinfo, key) | |
545 local t_info = {} | |
546 local channel, isNew, id, sig, t_id | |
547 -- obtain source data | |
548 if tonumber(key) ~= nil and db.channels[key] then | |
549 id = tonumber(key) | |
550 elseif D.sigID[tostring(key)] then | |
551 id = D.sigID[tostring(key)] | |
552 else | |
553 id = db.primary_channel | |
554 isNew = true | |
555 end | |
556 local dbvars = db.channels[id] | |
557 t_id = id -- overridden later if new | |
558 t_info.index = t_id -- | |
559 --@debug@ | |
560 --print('setchan(1) cinfo, key, id=', cinfo, key, id)--@end-debug@ | |
561 | |
562 | |
563 -- obtain config info | |
564 if type(cinfo) == 'string' then | |
565 sig = cinfo | |
566 cinfo = {signature = sig} | |
567 elseif type(cinfo) ~= 'table' then -- stop here if a table wans't passed | |
568 error('Expecting table of string as arg1') | |
569 elseif cinfo.signature then -- new sig | |
570 sig = cinfo.signature | |
571 elseif isNew then -- new channel sig | |
572 sig = 'Ch' | |
573 else -- old sig | |
574 sig = db.channels[id].signature | |
575 end | |
576 t_info.signature = sig | |
577 --@debug@ | |
578 --print('setchan(2) sig,id,isNew=', sig, id, isNew)--@end-debug@ | |
579 | |
580 for k,v in pairs(cinfo) do -- allow all cinfo to pass | |
581 t_info[k] = v | |
582 end | |
583 | |
584 local blocked = { -- ignore these vars: | |
585 ['docked'] = true, -- table | |
586 ['dockedTo'] = true, -- table-related | |
587 ['signature'] = true} -- already determined | |
588 for k,v in pairs(dbvars) do | |
589 if not t_info[k] and not blocked[k] then -- already set or blocked? | |
590 t_info[k] = v | |
591 end | |
592 end | |
593 -- new channel overrides | |
594 if isNew then | |
595 if D.sigID[sig]then -- find a non-clashing signature | |
596 local result, i = sig, 1 | |
597 while D.sigID[result] do | |
598 result = sig .. i | |
599 i = i + 1 | |
600 end | |
601 t_info.signature = result | |
602 end | |
603 t_id = db.max_channel + 1 | |
604 t_info.index = t_id | |
605 --@debug@ | |
606 --print('setchan(3a) isNew, sig, t_info.signature=', isNew, sig, t_info.signature)--@end-debug@ | |
607 else | |
608 --@debug@ | |
609 --print('setchan(3b) isNew, sig, t_info.signature=', isNew, sig, t_info.signature)--@end-debug@ | |
610 end | |
611 | |
612 local channel | |
613 if not self.console[t_id] then -- create a frame | |
614 if isNew then -- position the channel frame | |
615 t_info.x = t_info.x + 20 | |
616 t_info.y = t_info.y - 20 | |
617 db.channels[t_id] = t_info | |
618 --@debug@ | |
619 print('setchan(4a)', 't_id, x, y=', t_id, t_info.x, t_info.y)--@end-debug@ | |
620 end | |
621 channel = CreateConsole(t_id, t_info) | |
622 self.console[t_id] = channel | |
623 self.sig[t_info.signature] = channel | |
624 self.sigID[t_info.signature] = t_id | |
625 self.IDsig[t_id] = t_info.signature | |
626 | |
627 end | |
628 channel = self.console[t_id] | |
629 if channel.minimized then | |
630 channel:Minimize() | |
631 else | |
632 channel:Maximize() | |
633 end | |
634 | |
635 if channel.enabled and db.enabled then -- hide or show last since Min/Max mess with visibility | |
636 print('setchan(5a) enable') | |
637 channel:Show() | |
638 else | |
639 print('setchan(5a) disable') | |
640 channel:Hide() | |
641 end | |
642 --@debug@ | |
643 --print('setchan(end); c:IsVisible(), c.enabled, db.enabled=', channel:IsVisible(), channel.enabled, db.enabled)--@end-debug@ | |
644 return channel | |
645 end | |
646 | 301 |
647 function D:PrintHelp() | 302 function D:PrintHelp() |
648 D:Print("|cFFFFFF00/dvn|r", | 303 D:Print("|cFFFFFF00/dvn|r", |
649 "\n |cFFFFFF00<number>|r - Loads a saved addon list. List 1 is treated as a gameplay profile and consoles will be disabled by default.") | 304 "\n |cFFFFFF00<number>|r - Loads a saved addon list. List 1 is treated as a gameplay profile and consoles will be disabled by default.") |
650 | 305 |
722 | 377 |
723 -- Stop here in game mode | 378 -- Stop here in game mode |
724 if db.workspace == 1 then | 379 if db.workspace == 1 then |
725 return | 380 return |
726 end | 381 end |
727 | 382 ----------------------------------------------------------------------- |
383 self.db = db | |
384 self.channels = db.channels | |
728 self.max_channel = 0 | 385 self.max_channel = 0 |
729 self.num_channels = 0 | 386 self.num_channels = 0 |
730 self.console = {} | 387 self.console = {} |
731 self.sig = {} | 388 self.sig = {} |
732 self.sigID = {} | 389 self.sigID = {} |