comparison Devian.lua @ 66:516ceb31703d

New profile system that stores channel and tag settings for each saved AddOn list. A boatload of structural revisions, making better use of the built-in table, and hopefully making console command issues easier to pick up.
author Nenue
date Sat, 05 Mar 2016 13:35:51 -0500
parents 59e047d6c5de
children 137b8c55a593
comparison
equal deleted inserted replaced
65:4148c90986e7 66:516ceb31703d
1 --- Devian - Devian.lua 1 --- Devian - Devian.lua
2 -- @file-author@ 2 -- @file-author@
3 -- @project-revision@ @project-hash@ 3 -- @project-revision@ @project-hash@
4 -- @file-revision@ @file-hash@ 4 -- @file-revision@ @file-hash@
5 if not LibStub then 5
6 print('Something has happened...') 6 --GLOBALS: Devian, DevCon, DevianLoadMessage
7 end 7 local ADDON, D = ...
8
9 local currentProfile
10 local playerName = UnitName("player")
11 local playerRealm = playerName .. '-' .. GetRealmName()
12 local num_dock_tabs = 0
13 local in_workspace = false
14 --@debug@
15 D.debugmode = true
16 --@end-debug@
17 D.print = function(...)
18 if currentProfile and not currentProfile.workspace then
19 return
20 end
21
22 if D.debugmode then
23 return print('Dvn', ...)
24 else
25 return function() end
26 end
27 end
28 local print = D.print
29
30 setmetatable(D, {
31 __call = function(t,k)
32 if not k then
33 return t.in_workspace
34 end
35
36 return function(value)
37 if value then
38 D[k] = value
39 end
40 return D[k]
41 end
42 end
43 })
44 D.L = setmetatable({}, {
45 __index= function(t,k)
46 return k
47 end,
48 __call = function(t,k,...)
49 return string.format((t[k] or k) , ...)
50 end
51 })
52
8 local MAJOR, MINOR = 'Devian-2.0', 'r@project-revision@' 53 local MAJOR, MINOR = 'Devian-2.0', 'r@project-revision@'
9 Devian = LibStub("AceAddon-3.0"):NewAddon("Devian", "AceConsole-3.0", "AceEvent-3.0") 54 local D = LibStub("AceAddon-3.0"):NewAddon(D, "Devian", "AceConsole-3.0", "AceEvent-3.0")
10 local D = _G.Devian 55 local L = D.L
56 _G.Devian = D
11 D:SetDefaultModuleState(false) 57 D:SetDefaultModuleState(false)
12 D.L = {} 58 D.oldprint = getprinthandler()
13 setmetatable(D.L, {__index= function(t,k) return k end, __call = function(t,k,...) return string.format((t[k] or k) , ...) end}) 59 if not _G.oldprint then _G.oldprint = D.oldprint end
14 local L = D.L 60
15 local pairs, tostring, tonumber, ipairs, type = pairs, tostring, tonumber, ipairs, type 61 local pairs, tostring, tonumber, ipairs, type = pairs, tostring, tonumber, ipairs, type
16 local max, rand, format = math.max, math.random, string.format 62 local max, rand, format, print = max, math.random, string.format, print
17 local insert, wipe, concat = table.insert, table.wipe, table.concat 63 local insert, wipe, concat = table.insert, table.wipe, table.concat
18 local select, unpack = select, unpack 64 local select, unpack = select, unpack
19 local GetNumAddOns, GetAddOnInfo, GetAddOnEnableState, EnableAddOn = GetNumAddOns, GetAddOnInfo, GetAddOnEnableState, EnableAddOn 65 local GetNumAddOns, GetAddOnInfo, GetAddOnEnableState, EnableAddOn = GetNumAddOns, GetAddOnInfo, GetAddOnEnableState, EnableAddOn
20 local UnitName, DisableAddOn = UnitName, DisableAddOn 66 local UnitName, DisableAddOn = UnitName, DisableAddOn
21 local WORKSPACE_ON, WORKSPACE_OFF = 1, 2 67
22 local PLAYER_REALM = UnitName("player") .. '-' .. GetRealmName()
23 local print = _G.print
24 local db 68 local db
25 local defaults = { 69 local defaults = {
26 ['global'] = {{}, {}}, 70 global = {{}, {}},
27 ['tags'] = {}, 71 default_channel = {
28 ['channels'] = {[1] = {
29 signature = 'Main', 72 signature = 'Main',
30 index = 1,
31 x = 100, y = 800, 73 x = 100, y = 800,
32 height = 500, width = 600, 74 height = 500, width = 600,
33 enabled = true}}, 75 enabled = true},
34 ['profiles'] = { 76 current_profile = 1,
35 {'Main', false}, 77 main_profile = 1,
36 {'Devian', true}, 78 last_profile = 1,
37 {'Turok', true}, 79 profilesName = {},
38 {'Bam', true} 80 profiles = {
39 }, 81 },
40 primary_channel = 1, -- the channel to which default output is sent
41 current_channel = 1, -- the front channel
42 max_channel = 1, -- the highest created channel id
43 enabled = true, -- allow enabled consoles to appear
44 load_message = "Defaults loaded.", -- messages to be displayed after reload
45 font = [[Interface\Addons\Devian\font\SourceCodePro-Regular.ttf]], -- font info 82 font = [[Interface\Addons\Devian\font\SourceCodePro-Regular.ttf]], -- font info
46 fontsize = 13, 83 fontsize = 13,
47 fontoutline = 'NONE', 84 fontoutline = 'NONE',
48 85
49 headergrad = {'VERTICAL', 0, 0, 0, 1, 86 headergrad = {'VERTICAL', 0, 0, 0, 1,
89 movement_fade_to = 0, 126 movement_fade_to = 0,
90 movement_translation_x = 25, 127 movement_translation_x = 25,
91 movement_translation_y = 25, 128 movement_translation_y = 25,
92 } 129 }
93 130
94 local function ScanAddOnList(cmd, ...) 131 D.console = {}
95 local list_state 132 D.max_channel = 0
96 133
134 D.Profile = function (id, name)
135
136 if name and not id and db.profilesName[name] then
137 id = db.profilesName[name]
138 print('ID located by name, |cFF00FF00'..name..'|r is |cFFFFFF00'.. id..'|r')
139 end
140
141 if not id or not db.profiles[id] then
142 if not id then
143 id = #db.profiles+1
144 print('Generated profile ID: |cFFFFFF00'.. id .. '|r')
145 end
146
147 if not name or db.profilesName[name] then
148 local newName = name or (id == 1 and 'Main' or 'Profile')
149 local prefix = newName
150 local i = 2
151 while db.profilesName[newName] do
152 i = i + 1
153 newName = prefix .. i
154 end
155 name = newName
156 print('Generated profile name: |cFF00FF00'..newName..'|r')
157 end
158 print('Creating profile')
159 db.profilesName[name] = id
160 db.profiles[id] = {
161 name = name,
162 workspace = (id ~= 1),
163 current_channel = 1,
164 default_channel = 1,
165 num_channels = 1,
166 max_channel = 1, -- the highest created channel id
167 enabled = true, -- allow enabled consoles to appear
168 channels = {
169 {
170 index = 1,
171 signature = 'Main',
172 x = 100, y = 800,
173 height = 500, width = 600,
174 enabled = true
175 }
176 },
177 loadouts = {},
178 global = {},
179 tags = {},
180 char = {
181 [playerRealm] = {}
182 },
183 unlisted = {}
184 }
185 end
186
187 D.currentProfile = db.profiles[id]
188 currentProfile = D.currentProfile
189 currentProfile.char[playerRealm] = currentProfile.char[playerRealm] or {}
190 if currentProfile.workspace then
191 setprinthandler(D.Message)
192 else
193 print = function() end
194 end
195
196 D.unlisted = currentProfile.unlisted
197 D.channels = currentProfile.channels
198 D.tags = currentProfile.tags
199 D.channelinfo = currentProfile.channels
200 D.char = currentProfile.char[playerRealm]
201 D.global = currentProfile.global
202 D.num_channels = currentProfile.num_channels
203 D.enabled = currentProfile.enabled
204 D.sig = {}
205 D.sigID = {}
206 D.IDsig = {}
207 D.dock = DevianDock
208 D.dock.buttons = D.dock.buttons or {}
209
210 return id, name
211 end
212
213 local targetGlobal, targetChar
214 D.Command = function (self, cmd, ...)
215 local list_id, scan_func, reload
97 local args = {} 216 local args = {}
98 local arg, n = D:GetArgs(cmd, 1) 217 local arg, n = D:GetArgs(cmd, 1)
99 while arg do 218 while arg do
100 insert(args, arg) 219 insert(args, arg)
101 arg, n = D:GetArgs(cmd,1,n) 220 arg, n = D:GetArgs(cmd,1,n)
102 end 221 end
103 local mode, tag, dest = unpack(args) 222 local mode, tag, dest = unpack(args)
104 223
105
106 -- no args, toggle ui 224 -- no args, toggle ui
107 if mode == 'stack' then 225 if mode == 'stack' then
108 if db.workspace == 1 then
109 return D:Print(L['Need devmode'])
110 end
111 return D:StackFrames() 226 return D:StackFrames()
112 elseif mode == 'grid' then 227 elseif mode == 'grid' then
113 if db.workspace == 1 then
114 return D:Print(L['Need devmode'])
115 end
116 return D:DistributeFrames() 228 return D:DistributeFrames()
117 elseif mode == 'tag' then -- tagging 229 elseif mode == 'tag' then -- tagging
118 if db.workspace == 1 then 230 return D.Tag(self, tag, dest)
119 return D:Print(L['Need devmode']) 231 elseif tonumber(mode) ~= nil or mode == 'save' then
120 end 232 -- either a number of the save command
121 233 if mode == 'save' then
122 local sig 234 list_id = tonumber(tag)
123 if tag ~= nil and dest ~= nil then 235 if list_id == nil then
124 --@debug@ 236 D:Print(L('Invalid ID from arg', tag))
125 --print(tag, dest) 237 end
126 --@end-debug@ 238 D.Profile(list_id, dest)
127 239 scan_func = D.Save
128 -- convert to ID 240 D:Print("Profile |cFFFFFF00".. list_id .."|r saved.")
129 if tonumber(dest) == nil then
130 if D.sigID[dest] then
131 dest = db.channels[D.sigID[dest]].index
132 else
133 sig = dest
134 end
135 else
136 dest = tonumber(dest)
137 end
138 --@debug@
139 --print('2 tag,dest,sig', tag, dest, sig)--@end-debug@
140
141 -- make a new channel?
142 local channel
143 if not D.db.channels[dest] then
144 dest = D.max_channel + 1
145 D:Print(L('New channel created', sig and (dest..':'..sig) or dest ))
146 channel = D:SetChannel(sig or tag,dest)
147 else
148
149 channel = D.db.channels[dest]
150 end
151 --@debug@
152 --print('3 tag,dest,channel.sig=',tag, dest, channel.signature)--@end-debug@
153
154 if not db.tags[tag] then -- no tag table?
155 db.tags[tag] = {}
156 end
157
158 if db.tags[tag][dest] then -- is tag set?
159 db.tags[tag][dest] = nil
160 D:Print(L('Tag removed from channel', tag, db.channels[dest].index, db.channels[dest].signature))
161 else
162 db.tags[tag][dest] = dest
163 D:Print(L('Tag added to channel', tag, db.channels[dest].index, db.channels[dest].signature))
164 end
165 D:UpdateDock()
166 else 241 else
167 D:Print(L['Command tag help']) 242
168 end 243 DevianLoadMessage = "Switched profiles."
169 return 244
170 elseif tonumber(mode) ~= nil or mode == 'save' then 245 list_id = tonumber(mode)
171 -- iterating for something 246 if list_id ~= db.main_profile then
172 if mode == 'save' then 247 db.last_profile = list_id
173 if tonumber(tag) == nil then 248 end
174 T:Print(L('Invalid ID from arg', tag)) 249 db.current_profile = list_id
175 end 250 scan_func = D.Load
176 list_state = tonumber(tag)
177 else
178 list_state = tonumber(mode)
179 db.workspace = list_state
180 if list_state ~= 1 then
181 db.last_workspace = list_state
182 end
183
184 end 251 end
185 elseif mode == nil then 252 elseif mode == nil then
186 list_state = (db.workspace == 1) and db.last_workspace or 1 253 list_id = (db.current_profile ~= db.main_profile) and db.main_profile or db.last_profile
187 db.workspace = list_state 254 DevianLoadMessage = "Switched between main and recent profile ("..db.current_profile..' and '..list_id..')'
255 db.current_profile = list_id
256 scan_func = D.Load
188 else 257 else
189 return D:PrintHelp() 258 return D:PrintHelp()
190 end 259 end
191 260 targetGlobal = db.profiles[list_id].global
192 -- start the iterating 261 targetChar = db.profiles[list_id].char[playerRealm]
193 if not db[PLAYER_REALM][list_state] then 262
194 db[PLAYER_REALM][list_state] = {} 263 if scan_func then
195 end 264 for id, name, enableState, globalState in D.Addons() do
196 if not db.global[list_state] then 265 scan_func(id, name, enableState, globalState)
197 db.global[list_state] = {} 266 end
198 end 267 end
199 268
200 local char_list, global_list = db[PLAYER_REALM][list_state], db.global[list_state] 269 if scan_func == D.Load then
270 ReloadUI()
271 end
272 D.Profile(db.current_profile)
273 end
274
275 D.Addons = function()
201 local playername = UnitName("player") 276 local playername = UnitName("player")
202 277 return function(n, i)
203 for i = 1, GetNumAddOns() do 278 if i >= n then
279 return nil
280 end
281
282 i = i + 1
204 local name = GetAddOnInfo(i) 283 local name = GetAddOnInfo(i)
205 local enableState, globalState = GetAddOnEnableState(playername, i), GetAddOnEnableState(nil, i) 284 local enableState, globalState = GetAddOnEnableState(playername, i), GetAddOnEnableState(nil, i)
206 285 return i, name, enableState, globalState
207 if mode == 'save' then 286 end, GetNumAddOns(), 0
208 char_list[name] = enableState 287 end
209 global_list[name] = globalState 288
289 D.Load = function(id, name, charState, globalState)
290 if targetChar[name] or targetGlobal[name] then
291 if targetGlobal[name] == 2 then
292 EnableAddOn(id, true)
293 elseif targetChar[name] == 2 then
294 EnableAddOn(id, playerName)
210 else 295 else
211 if char_list[name] or global_list[name] then 296 DisableAddOn(id, playerName)
212 if char_list[name] ~= 0 and global_list[name] ~= 0 then 297 end
213 local value = false 298 print('load', name, 'global =', targetGlobal[name], 'char =', targetChar[name])
214 if char_list[name] == 2 and global_list[name] == 1 then
215 value = UnitName("player")
216 elseif global_list[name] == 2 then
217 value = true
218 end
219 --print('EnableAddOn(', i, ',', value,')')
220 EnableAddOn(i, value)
221 else
222 local value = true
223 if char_list[name] == 2 and global_list[name] == 1 then
224 value = UnitName("player")
225 end
226 --print('DisableAddOn(', i, ',', value,')')
227 DisableAddOn(i,value)
228 end
229 elseif mode ~= 'save' then
230 if type(db.unlisted) ~= 'table' then
231 db.unlisted = {}
232 end
233 insert(db.unlisted, name)
234 end
235
236 end
237 end
238
239 if mode ~= 'save' then
240 db.load_message = (mode == nil) and L("Toggled to profile", list_state) or L('Switched to profile number', list_state)
241 ReloadUI()
242 else 299 else
243 300 tinsert(D.unlisted, name)
244 if list_state == 1 then 301 end
245 D:Print(L['Profile main saved']) 302 end
303 D.Save = function(id, name, charState, globalState)
304 print('save', id, name, charState, globalState)
305 targetGlobal[name] = globalState
306 targetChar[name] = charState
307 end
308
309 D.Tag = function(self, tag, dest)
310 local sig
311 if tag ~= nil and dest ~= nil then
312 --@debug@
313 --print(tag, dest)
314 --@end-debug@
315
316 -- convert to ID
317 if tonumber(dest) == nil then
318 if D.sigID[dest] then
319 dest = currentProfile.channels[D.sigID[dest]].index
320 else
321 sig = dest
322 end
246 else 323 else
247 db.last_workspace = list_state 324 dest = tonumber(dest)
248 D:Print(L('Profile number saved', list_state, list_state)) 325 end
249 end 326 --@debug@
327 --print('2 tag,dest,sig', tag, dest, sig)--@end-debug@
328
329 -- make a new channel?
330 local channel
331 if not currentProfile.channels[dest] then
332 dest = D.max_channel + 1
333 D:Print(L('New channel created', sig and (dest..':'..sig) or dest ))
334 channel = D:SetChannel(sig or tag,dest)
335 else
336 channel = D.channels[dest]
337 end
338 --@debug@
339 --print('3 tag,dest,channel.sig=',tag, dest, channel.signature)--@end-debug@
340
341 if not currentProfile.tags[tag] then -- no tag table?
342 currentProfile.tags[tag] = {}
343 end
344
345 if currentProfile.tags[tag][dest] then -- is tag set?
346 currentProfile.tags[tag][dest] = nil
347 D:Print(L('Tag removed from channel', tag, currentProfile.channels[dest].index, currentProfile.channels[dest].signature))
348 else
349 currentProfile.tags[tag][dest] = dest
350 D:Print(L('Tag added to channel', tag, currentProfile.channels[dest].index, currentProfile.channels[dest].signature))
351 end
352 D:UpdateDock()
353 else
354 D:Print(L['Command tag help'])
250 end 355 end
251 end 356 end
252 357
253 358
254 359
255 --- Creates a Devian-style output. 360 --- Creates a Devian-style output.
256 -- The first argument describes the channel to output on, and the remaining arguments are concatenated in a manner similar to default print() 361 -- The first argument describes the channel to output on, and the remaining arguments are concatenated in a manner similar to default print()
257 -- This becomes the print handler when development mode is active. The original print() function is assigned to oldprint(). 362 -- This becomes the print handler when development mode is active. The original print() function is assigned to oldprint().
258 -- @param Tag, signature, or numeric index of the channel to output on. Defaults to primary channel. 363 -- @param Tag, signature, or numeric index of the channel to output on. Defaults to primary channel.
259 -- @param ... Output contents. 364 -- @param ... Output contents.
260 local function Message(prefix, ...) 365 function D.Message(prefix, ...)
261 if db.workspace == 1 then 366 if currentProfile.workspace then
262 return D.oldprint(prefix, ...) 367 return D.oldprint(prefix, ...)
263 end 368 end
264 prefix = tostring(prefix) 369 prefix = tostring(prefix)
265 if prefix == nil then 370 if prefix == nil then
266 prefix = 'nil*' 371 prefix = 'nil*'
347 452
348 D:Print("|cFFFFFF00/resetdvn|r", "- Resets all but profile data SavedVariables.") 453 D:Print("|cFFFFFF00/resetdvn|r", "- Resets all but profile data SavedVariables.")
349 D:Print("|cFFFFFF00/cleandvn|r", "- Fully resets SavedVariables, profiles and all.") 454 D:Print("|cFFFFFF00/cleandvn|r", "- Fully resets SavedVariables, profiles and all.")
350 end 455 end
351 456
352 local dot1, dot2 = CreateFrame('Frame', nil, UIParent), CreateFrame('Frame', nil, UIParent) 457 local blocked = {profiles = true, debugmode = true}
353 dot1:SetSize(5,5) 458 D.SetDefaults = function()
354 dot1:SetFrameStrata('TOOLTIP') 459 for k,v in pairs(DevianDB) do
355 local a = dot1:CreateTexture('fill', nil) 460 if not blocked[k] then
356 a:SetAllPoints(dot1) 461 DevianDB[k] = nil
357 a:SetTexture(1,0,0,1) 462 end
358 dot2:SetSize(5,5) 463 end
359 dot2:SetFrameStrata('TOOLTIP') 464 for k,v in pairs(defaults) do
360 a = dot2:CreateTexture('fill', nil) 465 if not blocked[k] then
361 a:SetAllPoints(dot2) 466 DevianDB[k] = v
362 a:SetTexture(0,1,0,1) 467 end
363 468 end
364 local OnStartedMoving = function() 469 DevianLoadMessage = "Non-user SavedVars have been reset."
365 for k, v in pairs(D.console) do 470 ReloadUI()
366 if v.enabled then 471 end
367 v.moveFade:Stop() 472 D.SetDefaultsAll = function ()
368 local F1 = v.moveFade.alphaOut 473 DevianDB = nil
369 F1:SetFromAlpha(db.movement_fade_from) 474 DevianLoadMessage = "All SavedVars wiped."
370 F1:SetToAlpha(db.movement_fade_to) 475 ReloadUI()
371 F1:SetDuration(db.movement_fade_time) 476 end
372 v.moveFade:Play() 477 D.ConfigCommand = function(input)
373 v:EnableMouse(false) 478 if not self.config then
374 end 479 self.config = DevCon
375 end 480 self:EnableModule("Config")
376 end 481 end
377 482 self.modules.Config:ChatCommand(input)
378 local OnStoppedMoving = function() 483 end
379 for k, v in pairs(D.console) do
380 if v.enabled then
381 v.moveFade:Stop()
382 local F1 = v.moveFade.alphaOut
383 F1:SetToAlpha(db.movement_fade_from)
384 F1:SetFromAlpha(db.movement_fade_to)
385 F1:SetDuration(db.movement_fade_time)
386 v.moveFade:Play()
387 v:EnableMouse(true)
388 end
389 end
390 end
391
392 484
393 function D:OnEnable() 485 function D:OnEnable()
394 486
395 if db.unlisted and #db.unlisted > 0 then
396 D:Print('New AddOns have been found since the last profile update: '.. concat(db.unlisted, ', '))
397 wipe(db.unlisted)
398 end
399
400 if db.workspace == 1 then
401 D:Print(L('Devian loaded on standby',MAJOR, MINOR))
402 else
403 D:Print(L('Devian loaded in workspace', MAJOR, MINOR, db.workspace))
404 -- movement fading
405 if db.movement_fade then
406
407 self:RegisterEvent('PLAYER_STARTED_MOVING', OnStartedMoving)
408 self:RegisterEvent('PLAYER_STOPPED_MOVING', OnStoppedMoving)
409 end
410 end
411
412 --@debug@
413 self:RegisterChatCommand("dvg", function(input)
414 if not self.config then
415 self.config = DevCon
416 self:EnableModule("Config")
417 end
418 self.modules.Config:ChatCommand(input)
419 end)
420 --@end-debug@
421
422 end
423
424 function D:OnInitialize()
425 -- commands 487 -- commands
426 self:RegisterChatCommand("cleandvn", function(args)
427 DevianDB = nil
428 DevianDB = {
429 load_message = "All SavedVars wiped."
430 }
431 ReloadUI()
432 end)
433 local blocked = {global = true, channels = true, tags = true, [PLAYER_REALM] = true}
434 self:RegisterChatCommand("resetdvn", function(args)
435 for k,v in pairs(DevianDB) do
436 if not blocked[k] then
437 DevianDB[k] = nil
438 end
439 end
440 for k,v in pairs(defaults) do
441 if not blocked[k] then
442 DevianDB[k] = v
443 end
444 end
445 DevianDB.load_message = "Non-user SavedVars have been reset."
446 ReloadUI()
447 end)
448 local cmdlist = { 488 local cmdlist = {
449 ['dvn'] = ScanAddOnList, 489 ['dvn'] = "Command",
450 ['devian'] = ScanAddOnList, 490 ['devian'] = "Command",
451 ['dvc'] = "Console_Toggle", 491 ['dvc'] = "Console_Toggle",
492 ['cleandvn'] = "SetDefaultsAll",
493 ['resetdvn'] = "SetDefaults",
494 ['dvg'] = "ConfigCommand"
452 } 495 }
453 for cmd, func in pairs(cmdlist) do 496 for cmd, func in pairs(cmdlist) do
454 self:RegisterChatCommand(cmd, func, true) 497 self:RegisterChatCommand(cmd, func, true)
455 end 498 end
499 end
500
501 function D:OnInitialize()
456 502
457 -- pull defaults 503 -- pull defaults
458 if not _G.DevianDB then 504 if not _G.DevianDB then
459 _G.DevianDB = defaults 505 _G.DevianDB = defaults
460 end 506 end
461 db = _G.DevianDB 507 db = _G.DevianDB
462 self.db = db 508 self.db = db
463 self.tags = db.tags 509
464 self.channelinfo = db.channels 510 ---
465 511 if DevianLoadMessage then
466 if not db[PLAYER_REALM] then 512 D:Print(DevianLoadMessage)
467 db[PLAYER_REALM] = {[WORKSPACE_ON] = {}, [WORKSPACE_OFF] = {}} 513 DevianLoadMessage = nil
468 end 514 end
469 515
470 if db.load_message then 516
471 D:Print(db.load_message) 517 --- initialize the current profile
472 db.load_message = nil 518 local id, name = D.Profile(db.current_profile or 1)
473 end 519 D:Print('Using profile |cFFFFFF00'.. id ..'|r: |cFF00FF00'..currentProfile.name..'|r')
474 D.oldprint = getprinthandler() 520 if currentProfile.workspace then
475 if not _G.oldprint then 521 D:Print('Workspace: '.. (#currentProfile.channels) .. ' channels, ' .. #currentProfile.tags .. ' tags.')
476 _G.oldprint = D.oldprint 522 D:Print('Default channel: |cFFFFFF00'..currentProfile.default_channel..'|r: |cFF00FFFF'.. D.channels[currentProfile.default_channel].signature..'|r')
477 end 523 end
478 524
479 -- Stop here in game mode 525 for i, cinfo in pairs(D.channels) do
480 if db.workspace == 1 then
481 return
482 end
483 -----------------------------------------------------------------------
484 self.db = db
485 self.channels = db.channels
486 self.max_channel = 0
487 self.num_channels = 0
488 self.console = {}
489 self.sig = {}
490 self.sigID = {}
491 self.IDsig = {}
492 self.dock = DevianDock
493 self.dock.buttons = {}
494 for i, cinfo in pairs(db.channels) do
495 i = tonumber(i) 526 i = tonumber(i)
496 if not self.primary_channel then 527 if not D.primary_channel then
497 self.primary_channel = i 528 D.primary_channel = i
498 end 529 end
499 self:SetChannel(cinfo, i) 530 D:SetChannel(cinfo, i)
500 self.max_channel = max(i, self.max_channel) 531 D.num_channels = D.num_channels + 1
501 self.num_channels = self.num_channels + 1 532 end
502 end 533
503 534 D.max_channel = max(D.max_channel, currentProfile.max_channel)
504 if self.console[db.current_channel] then 535 if currentProfile.max_channel < D.max_channel then
505 print('bringing', self.console[db.current_channel].signature, 'to the front') 536 for i = currentProfile.max_channel, D.max_channel do
506 self.console[db.current_channel]:ToFront() 537 D.console[i]:Hide()
507 -- bring the current channel to the front 538 end
508 end 539 end
509 DevianDock:Show() 540
510 self:UpdateDock() 541 if currentProfile.workspace then
511 setprinthandler(Message) 542 if D.console[currentProfile.current_channel] then
512 print = function(...) 543 print('bringing', D.console[currentProfile.current_channel].signature, 'to the front')
513 _G.print('Dvn', ...) 544 D.console[currentProfile.current_channel]:ToFront()
514 end 545 -- bring the current channel to the front
515 end 546 end
516 547 DevianDock:Show()
517 --- Console frame toggler 548 D:UpdateDock()
518 -- @paramsig [...] 549 end
519 -- @param ... one or more space-seperated channel keys 550 end
520 function D:Console_Toggle(input, force)
521 --oldprint(input)
522 local setAll
523 if db.workspace == 1 then
524 return self:Print(MSG_NEED_DEV_MODE)
525 end
526 local search = {}
527 local key
528 local n = 0
529 while self:GetArgs(input,1,n) and n < 255 do --should end itself when it gets nil, but
530 key, n = self:GetArgs(input,1,n)
531
532 if self.sig[key] then
533 --print(key, self.sigID[key])
534 insert(search, self.sigID[key])
535 elseif self.console[tonumber(key)] then
536 --print(key, tonumber(key))
537 insert(search, tonumber(key))
538 end
539
540 --oldprint(#search, key, n)
541 end
542 if #search < 1 then
543 search = self.sigID
544 setAll = true
545 end
546 if setAll then
547 --oldprint('setall', setAll)
548 db.enabled = (not db.enabled) and true or nil
549 if force == 0 then
550 db.enabled = nil
551 end
552 end
553
554 for i, id in pairs(search) do
555 --oldprint(i, id)
556 local c = self.console[id]
557 if setAll then
558 c.enabled = db.enabled and db.enabled or nil
559 else
560
561 db.enabled = true
562 c.enabled = (not c.enabled) and true or nil
563 if force == 0 then
564 c.enabled = nil
565 end
566 --oldprint(id, ' ', force, c.enabled, db.enabled)
567 end
568
569 if c.enabled or (setAll and db.enabled) then
570 c:Show()
571 elseif not (c.enabled and db.enabled) then
572 c:Hide()
573 end
574 c:Save()
575 end
576
577 if setAll then
578 if db.enabled then
579 self:Print('toggled all consoles ON')
580 if D.console[db.current_channel] then
581 oldprint('push', D.console[db.current_channel].signature, 'to the front')
582 D.console[db.current_channel]:ToFront()
583 end
584 else
585 self:Print('toggled all consoles OFF')
586 end
587 else
588 local result = {}
589 for i, id in pairs(search) do
590 result[i] = tostring(id) .. ' = ' .. (self.console[id].enabled and 'ON' or 'OFF')
591 end
592 self:Print('toggled: '..concat(result, ', '))
593 end
594 end