annotate 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
rev   line source
Nenue@50 1 --- Devian - Devian.lua
Nenue@32 2 -- @file-author@
Nenue@32 3 -- @project-revision@ @project-hash@
Nenue@32 4 -- @file-revision@ @file-hash@
Nenue@66 5
Nenue@66 6 --GLOBALS: Devian, DevCon, DevianLoadMessage
Nenue@66 7 local ADDON, D = ...
Nenue@66 8
Nenue@66 9 local currentProfile
Nenue@66 10 local playerName = UnitName("player")
Nenue@66 11 local playerRealm = playerName .. '-' .. GetRealmName()
Nenue@66 12 local num_dock_tabs = 0
Nenue@66 13 local in_workspace = false
Nenue@66 14 --@debug@
Nenue@66 15 D.debugmode = true
Nenue@66 16 --@end-debug@
Nenue@66 17 D.print = function(...)
Nenue@66 18 if currentProfile and not currentProfile.workspace then
Nenue@66 19 return
Nenue@66 20 end
Nenue@66 21
Nenue@66 22 if D.debugmode then
Nenue@66 23 return print('Dvn', ...)
Nenue@66 24 else
Nenue@66 25 return function() end
Nenue@66 26 end
Nenue@0 27 end
Nenue@66 28 local print = D.print
Nenue@66 29
Nenue@66 30 setmetatable(D, {
Nenue@66 31 __call = function(t,k)
Nenue@66 32 if not k then
Nenue@66 33 return t.in_workspace
Nenue@66 34 end
Nenue@66 35
Nenue@66 36 return function(value)
Nenue@66 37 if value then
Nenue@66 38 D[k] = value
Nenue@66 39 end
Nenue@66 40 return D[k]
Nenue@66 41 end
Nenue@66 42 end
Nenue@66 43 })
Nenue@66 44 D.L = setmetatable({}, {
Nenue@66 45 __index= function(t,k)
Nenue@66 46 return k
Nenue@66 47 end,
Nenue@66 48 __call = function(t,k,...)
Nenue@66 49 return string.format((t[k] or k) , ...)
Nenue@66 50 end
Nenue@66 51 })
Nenue@66 52
Nenue@57 53 local MAJOR, MINOR = 'Devian-2.0', 'r@project-revision@'
Nenue@66 54 local D = LibStub("AceAddon-3.0"):NewAddon(D, "Devian", "AceConsole-3.0", "AceEvent-3.0")
Nenue@66 55 local L = D.L
Nenue@66 56 _G.Devian = D
Nenue@46 57 D:SetDefaultModuleState(false)
Nenue@66 58 D.oldprint = getprinthandler()
Nenue@66 59 if not _G.oldprint then _G.oldprint = D.oldprint end
Nenue@66 60
Nenue@47 61 local pairs, tostring, tonumber, ipairs, type = pairs, tostring, tonumber, ipairs, type
Nenue@66 62 local max, rand, format, print = max, math.random, string.format, print
Nenue@47 63 local insert, wipe, concat = table.insert, table.wipe, table.concat
Nenue@47 64 local select, unpack = select, unpack
Nenue@47 65 local GetNumAddOns, GetAddOnInfo, GetAddOnEnableState, EnableAddOn = GetNumAddOns, GetAddOnInfo, GetAddOnEnableState, EnableAddOn
Nenue@47 66 local UnitName, DisableAddOn = UnitName, DisableAddOn
Nenue@66 67
Nenue@9 68 local db
Nenue@13 69 local defaults = {
Nenue@66 70 global = {{}, {}},
Nenue@66 71 default_channel = {
Nenue@55 72 signature = 'Main',
Nenue@55 73 x = 100, y = 800,
Nenue@55 74 height = 500, width = 600,
Nenue@66 75 enabled = true},
Nenue@66 76 current_profile = 1,
Nenue@66 77 main_profile = 1,
Nenue@66 78 last_profile = 1,
Nenue@66 79 profilesName = {},
Nenue@66 80 profiles = {
Nenue@45 81 },
Nenue@33 82 font = [[Interface\Addons\Devian\font\SourceCodePro-Regular.ttf]], -- font info
Nenue@13 83 fontsize = 13,
Nenue@13 84 fontoutline = 'NONE',
Nenue@45 85
Nenue@45 86 headergrad = {'VERTICAL', 0, 0, 0, 1,
Nenue@45 87 1, 0.1, 0.1, 1}, -- header info
Nenue@33 88 headerdrop = {1,1,1,1},
Nenue@45 89 headerblend = 'BLEND',
Nenue@33 90 headeralpha = 1,
Nenue@45 91 headerfontcolor = {1,1,1,1},
Nenue@45 92
Nenue@45 93 backdrop = {1,1,1,1}, -- background frame info
Nenue@56 94 backgrad = {'VERTICAL', 0, 0, 0, .75, 0,0,0, .65},
Nenue@55 95 backblend = 'BLEND',
Nenue@45 96 backalpha = 1,
Nenue@45 97 backborder = {.5,.5,.5,1},
Nenue@45 98 backheader = {.25,.25,.25,1},
Nenue@45 99
Nenue@45 100 frontdrop = {1,1,1,1}, -- foreground frame info
Nenue@56 101 frontgrad = {'VERTICAL', 0, 0, 0, 1, 0,0,0, 0.95},
Nenue@55 102 frontblend = 'BLEND',
Nenue@28 103 frontalpha = 1,
Nenue@45 104 frontborder = {.07,.47,1,1},
Nenue@45 105 frontheader = {1,1,1,1},
Nenue@33 106 tagcolor = {}, -- tag color repository
Nenue@36 107 workspace = 2, -- current profile
Nenue@47 108 last_workspace = 2, -- default workspace to alternate with when just "/dvn" is issued
Nenue@47 109
Nenue@47 110 dock_onshow_fade_time = 2.5,
Nenue@47 111 dock_onshow_fade_from = 1,
Nenue@47 112 dock_onshow_fade_to = 0.2,
Nenue@47 113
Nenue@47 114 dock_alpha_on = 1,
Nenue@47 115 dock_alpha_off = 0.2,
Nenue@47 116 dock_fade_in = 0.15,
Nenue@47 117 dock_fade_out = 0.45,
Nenue@47 118 dock_button_alpha_on = 1,
Nenue@47 119 dock_button_alpha_off = 0.2,
Nenue@50 120 dock_button_fade_in = 0.075,
Nenue@55 121 dock_button_fade_out = 0.075,
Nenue@47 122
Nenue@55 123 movement_fade = true,
Nenue@55 124 movement_fade_time = 0.15,
Nenue@60 125 movement_fade_from = 1,
Nenue@60 126 movement_fade_to = 0,
Nenue@60 127 movement_translation_x = 25,
Nenue@60 128 movement_translation_y = 25,
Nenue@13 129 }
Nenue@9 130
Nenue@66 131 D.console = {}
Nenue@66 132 D.max_channel = 0
Nenue@0 133
Nenue@66 134 D.Profile = function (id, name)
Nenue@66 135
Nenue@66 136 if name and not id and db.profilesName[name] then
Nenue@66 137 id = db.profilesName[name]
Nenue@66 138 print('ID located by name, |cFF00FF00'..name..'|r is |cFFFFFF00'.. id..'|r')
Nenue@66 139 end
Nenue@66 140
Nenue@66 141 if not id or not db.profiles[id] then
Nenue@66 142 if not id then
Nenue@66 143 id = #db.profiles+1
Nenue@66 144 print('Generated profile ID: |cFFFFFF00'.. id .. '|r')
Nenue@66 145 end
Nenue@66 146
Nenue@66 147 if not name or db.profilesName[name] then
Nenue@66 148 local newName = name or (id == 1 and 'Main' or 'Profile')
Nenue@66 149 local prefix = newName
Nenue@66 150 local i = 2
Nenue@66 151 while db.profilesName[newName] do
Nenue@66 152 i = i + 1
Nenue@66 153 newName = prefix .. i
Nenue@66 154 end
Nenue@66 155 name = newName
Nenue@66 156 print('Generated profile name: |cFF00FF00'..newName..'|r')
Nenue@66 157 end
Nenue@66 158 print('Creating profile')
Nenue@66 159 db.profilesName[name] = id
Nenue@66 160 db.profiles[id] = {
Nenue@66 161 name = name,
Nenue@66 162 workspace = (id ~= 1),
Nenue@66 163 current_channel = 1,
Nenue@66 164 default_channel = 1,
Nenue@66 165 num_channels = 1,
Nenue@66 166 max_channel = 1, -- the highest created channel id
Nenue@66 167 enabled = true, -- allow enabled consoles to appear
Nenue@66 168 channels = {
Nenue@66 169 {
Nenue@66 170 index = 1,
Nenue@66 171 signature = 'Main',
Nenue@66 172 x = 100, y = 800,
Nenue@66 173 height = 500, width = 600,
Nenue@66 174 enabled = true
Nenue@66 175 }
Nenue@66 176 },
Nenue@66 177 loadouts = {},
Nenue@66 178 global = {},
Nenue@66 179 tags = {},
Nenue@66 180 char = {
Nenue@66 181 [playerRealm] = {}
Nenue@66 182 },
Nenue@66 183 unlisted = {}
Nenue@66 184 }
Nenue@66 185 end
Nenue@66 186
Nenue@66 187 D.currentProfile = db.profiles[id]
Nenue@66 188 currentProfile = D.currentProfile
Nenue@66 189 currentProfile.char[playerRealm] = currentProfile.char[playerRealm] or {}
Nenue@66 190 if currentProfile.workspace then
Nenue@66 191 setprinthandler(D.Message)
Nenue@66 192 else
Nenue@66 193 print = function() end
Nenue@66 194 end
Nenue@66 195
Nenue@66 196 D.unlisted = currentProfile.unlisted
Nenue@66 197 D.channels = currentProfile.channels
Nenue@66 198 D.tags = currentProfile.tags
Nenue@66 199 D.channelinfo = currentProfile.channels
Nenue@66 200 D.char = currentProfile.char[playerRealm]
Nenue@66 201 D.global = currentProfile.global
Nenue@66 202 D.num_channels = currentProfile.num_channels
Nenue@66 203 D.enabled = currentProfile.enabled
Nenue@66 204 D.sig = {}
Nenue@66 205 D.sigID = {}
Nenue@66 206 D.IDsig = {}
Nenue@66 207 D.dock = DevianDock
Nenue@66 208 D.dock.buttons = D.dock.buttons or {}
Nenue@66 209
Nenue@66 210 return id, name
Nenue@66 211 end
Nenue@66 212
Nenue@66 213 local targetGlobal, targetChar
Nenue@66 214 D.Command = function (self, cmd, ...)
Nenue@66 215 local list_id, scan_func, reload
Nenue@14 216 local args = {}
Nenue@14 217 local arg, n = D:GetArgs(cmd, 1)
Nenue@14 218 while arg do
Nenue@47 219 insert(args, arg)
Nenue@14 220 arg, n = D:GetArgs(cmd,1,n)
Nenue@14 221 end
Nenue@14 222 local mode, tag, dest = unpack(args)
Nenue@0 223
Nenue@14 224 -- no args, toggle ui
Nenue@57 225 if mode == 'stack' then
Nenue@14 226 return D:StackFrames()
Nenue@14 227 elseif mode == 'grid' then
Nenue@14 228 return D:DistributeFrames()
Nenue@14 229 elseif mode == 'tag' then -- tagging
Nenue@66 230 return D.Tag(self, tag, dest)
Nenue@66 231 elseif tonumber(mode) ~= nil or mode == 'save' then
Nenue@66 232 -- either a number of the save command
Nenue@66 233 if mode == 'save' then
Nenue@66 234 list_id = tonumber(tag)
Nenue@66 235 if list_id == nil then
Nenue@66 236 D:Print(L('Invalid ID from arg', tag))
Nenue@66 237 end
Nenue@66 238 D.Profile(list_id, dest)
Nenue@66 239 scan_func = D.Save
Nenue@66 240 D:Print("Profile |cFFFFFF00".. list_id .."|r saved.")
Nenue@66 241 else
Nenue@32 242
Nenue@66 243 DevianLoadMessage = "Switched profiles."
Nenue@36 244
Nenue@66 245 list_id = tonumber(mode)
Nenue@66 246 if list_id ~= db.main_profile then
Nenue@66 247 db.last_profile = list_id
Nenue@18 248 end
Nenue@66 249 db.current_profile = list_id
Nenue@66 250 scan_func = D.Load
Nenue@0 251 end
Nenue@32 252 elseif mode == nil then
Nenue@66 253 list_id = (db.current_profile ~= db.main_profile) and db.main_profile or db.last_profile
Nenue@66 254 DevianLoadMessage = "Switched between main and recent profile ("..db.current_profile..' and '..list_id..')'
Nenue@66 255 db.current_profile = list_id
Nenue@66 256 scan_func = D.Load
Nenue@32 257 else
Nenue@32 258 return D:PrintHelp()
Nenue@0 259 end
Nenue@66 260 targetGlobal = db.profiles[list_id].global
Nenue@66 261 targetChar = db.profiles[list_id].char[playerRealm]
Nenue@32 262
Nenue@66 263 if scan_func then
Nenue@66 264 for id, name, enableState, globalState in D.Addons() do
Nenue@66 265 scan_func(id, name, enableState, globalState)
Nenue@0 266 end
Nenue@0 267 end
Nenue@0 268
Nenue@66 269 if scan_func == D.Load then
Nenue@0 270 ReloadUI()
Nenue@66 271 end
Nenue@66 272 D.Profile(db.current_profile)
Nenue@66 273 end
Nenue@66 274
Nenue@66 275 D.Addons = function()
Nenue@66 276 local playername = UnitName("player")
Nenue@66 277 return function(n, i)
Nenue@66 278 if i >= n then
Nenue@66 279 return nil
Nenue@66 280 end
Nenue@66 281
Nenue@66 282 i = i + 1
Nenue@66 283 local name = GetAddOnInfo(i)
Nenue@66 284 local enableState, globalState = GetAddOnEnableState(playername, i), GetAddOnEnableState(nil, i)
Nenue@66 285 return i, name, enableState, globalState
Nenue@66 286 end, GetNumAddOns(), 0
Nenue@66 287 end
Nenue@66 288
Nenue@66 289 D.Load = function(id, name, charState, globalState)
Nenue@66 290 if targetChar[name] or targetGlobal[name] then
Nenue@66 291 if targetGlobal[name] == 2 then
Nenue@66 292 EnableAddOn(id, true)
Nenue@66 293 elseif targetChar[name] == 2 then
Nenue@66 294 EnableAddOn(id, playerName)
Nenue@66 295 else
Nenue@66 296 DisableAddOn(id, playerName)
Nenue@66 297 end
Nenue@66 298 print('load', name, 'global =', targetGlobal[name], 'char =', targetChar[name])
Nenue@0 299 else
Nenue@66 300 tinsert(D.unlisted, name)
Nenue@66 301 end
Nenue@66 302 end
Nenue@66 303 D.Save = function(id, name, charState, globalState)
Nenue@66 304 print('save', id, name, charState, globalState)
Nenue@66 305 targetGlobal[name] = globalState
Nenue@66 306 targetChar[name] = charState
Nenue@66 307 end
Nenue@57 308
Nenue@66 309 D.Tag = function(self, tag, dest)
Nenue@66 310 local sig
Nenue@66 311 if tag ~= nil and dest ~= nil then
Nenue@66 312 --@debug@
Nenue@66 313 --print(tag, dest)
Nenue@66 314 --@end-debug@
Nenue@66 315
Nenue@66 316 -- convert to ID
Nenue@66 317 if tonumber(dest) == nil then
Nenue@66 318 if D.sigID[dest] then
Nenue@66 319 dest = currentProfile.channels[D.sigID[dest]].index
Nenue@66 320 else
Nenue@66 321 sig = dest
Nenue@66 322 end
Nenue@57 323 else
Nenue@66 324 dest = tonumber(dest)
Nenue@32 325 end
Nenue@66 326 --@debug@
Nenue@66 327 --print('2 tag,dest,sig', tag, dest, sig)--@end-debug@
Nenue@66 328
Nenue@66 329 -- make a new channel?
Nenue@66 330 local channel
Nenue@66 331 if not currentProfile.channels[dest] then
Nenue@66 332 dest = D.max_channel + 1
Nenue@66 333 D:Print(L('New channel created', sig and (dest..':'..sig) or dest ))
Nenue@66 334 channel = D:SetChannel(sig or tag,dest)
Nenue@66 335 else
Nenue@66 336 channel = D.channels[dest]
Nenue@66 337 end
Nenue@66 338 --@debug@
Nenue@66 339 --print('3 tag,dest,channel.sig=',tag, dest, channel.signature)--@end-debug@
Nenue@66 340
Nenue@66 341 if not currentProfile.tags[tag] then -- no tag table?
Nenue@66 342 currentProfile.tags[tag] = {}
Nenue@66 343 end
Nenue@66 344
Nenue@66 345 if currentProfile.tags[tag][dest] then -- is tag set?
Nenue@66 346 currentProfile.tags[tag][dest] = nil
Nenue@66 347 D:Print(L('Tag removed from channel', tag, currentProfile.channels[dest].index, currentProfile.channels[dest].signature))
Nenue@66 348 else
Nenue@66 349 currentProfile.tags[tag][dest] = dest
Nenue@66 350 D:Print(L('Tag added to channel', tag, currentProfile.channels[dest].index, currentProfile.channels[dest].signature))
Nenue@66 351 end
Nenue@66 352 D:UpdateDock()
Nenue@66 353 else
Nenue@66 354 D:Print(L['Command tag help'])
Nenue@0 355 end
Nenue@0 356 end
Nenue@0 357
Nenue@0 358
Nenue@13 359
Nenue@18 360 --- Creates a Devian-style output.
Nenue@18 361 -- The first argument describes the channel to output on, and the remaining arguments are concatenated in a manner similar to default print()
Nenue@18 362 -- This becomes the print handler when development mode is active. The original print() function is assigned to oldprint().
Nenue@18 363 -- @param Tag, signature, or numeric index of the channel to output on. Defaults to primary channel.
Nenue@18 364 -- @param ... Output contents.
Nenue@66 365 function D.Message(prefix, ...)
Nenue@66 366 if currentProfile.workspace then
Nenue@23 367 return D.oldprint(prefix, ...)
Nenue@23 368 end
Nenue@57 369 prefix = tostring(prefix)
Nenue@57 370 if prefix == nil then
Nenue@55 371 prefix = 'nil*'
Nenue@1 372 end
Nenue@9 373
Nenue@18 374 local sendq = {}
Nenue@30 375 local tag, id, tagged
Nenue@13 376 local byName = true
Nenue@18 377 if D.tags[prefix] then
Nenue@18 378 for _, id in pairs(D.tags[prefix]) do
Nenue@18 379 if D.console[id] then
Nenue@18 380 sendq[id] = D.console[id]
Nenue@30 381 tagged = true
Nenue@18 382 end
Nenue@18 383 end
Nenue@18 384 end
Nenue@18 385
Nenue@13 386 if D.sig[prefix] then
Nenue@18 387 sendq[D.sig[prefix].index] = D.sig[prefix]
Nenue@13 388 elseif D.console[prefix] then
Nenue@18 389 sendq[D.console[prefix]] = D.console[prefix]
Nenue@30 390 elseif not tagged then
Nenue@18 391 sendq[D.primary_channel] = D.console[D.primary_channel]
Nenue@13 392 end
Nenue@18 393
Nenue@9 394 -- color me timbers
Nenue@9 395 local pcolor
Nenue@18 396 if (not db.tagcolor[prefix]) and byName then
Nenue@30 397 local c = {
Nenue@47 398 rand(64,255), rand(64,255), rand(64,255)
Nenue@30 399 }
Nenue@30 400 if c[1] > 223 and c[2] > 223 and c[3] > 223 then
Nenue@47 401 c[rand(1,3)] = rand(64,223)
Nenue@0 402 end
Nenue@30 403
Nenue@47 404 db.tagcolor[prefix] = format('%02X%02X%02X', unpack(c))
Nenue@0 405 end
Nenue@18 406 pcolor = db.tagcolor[prefix]
Nenue@0 407
Nenue@55 408 local buffer = {}
Nenue@0 409 for i = 1, select('#',...) do
Nenue@0 410 local var = select(i, ...)
Nenue@0 411
Nenue@0 412 if type(var) == 'table' then
Nenue@20 413 if type(var.GetName) == 'function' then
Nenue@46 414 var = '<table:'..tostring(var:GetName())..'>'
Nenue@20 415 else
Nenue@32 416 var = '<'..tostring(var)..'>'
Nenue@20 417 end
Nenue@20 418
Nenue@0 419 elseif type(var) == 'boolean' then
Nenue@0 420 var = var and 'true' or 'false'
Nenue@0 421 elseif type(var) == 'function' then
Nenue@0 422 var = '<funcref>'
Nenue@0 423 elseif type(var) == 'nil' then
Nenue@0 424 var = 'nil'
Nenue@60 425 else
Nenue@60 426 var = tostring(var)
Nenue@0 427 end
Nenue@0 428
Nenue@47 429 insert(buffer, var)
Nenue@0 430 end
Nenue@47 431 local message = concat(buffer, ' ')
Nenue@18 432 for id, channel in pairs(sendq) do
Nenue@55 433 if channel.width < 250 then
Nenue@55 434 prefix = string.sub(prefix, 0,2)
Nenue@55 435 end
Nenue@58 436 channel.out:AddMessage('|cFF'.. pcolor..prefix ..'|r ' .. message, 0.8, 0.8, 0.8, nil, nil, prefix, GetTime())
Nenue@58 437 if not D.dock.buttons[id].newMessage then
Nenue@58 438 D.dock.buttons[id].newMessage = true
Nenue@58 439 D.UpdateBeacon(D.dock.buttons[id])
Nenue@58 440 end
Nenue@18 441 end
Nenue@47 442 wipe(buffer)
Nenue@0 443 end
Nenue@0 444
Nenue@14 445
Nenue@32 446
Nenue@14 447
Nenue@32 448 function D:PrintHelp()
Nenue@32 449 D:Print("|cFFFFFF00/dvn|r",
Nenue@32 450 "\n |cFFFFFF00<number>|r - Loads a saved addon list. List 1 is treated as a gameplay profile and consoles will be disabled by default.")
Nenue@47 451 D:Print("|cFFFFFF00/dvc|r [<key>, ...]", "- Hides and show consoles. A list of channel keys can be passed to specify which ones get toggled.")
Nenue@32 452
Nenue@32 453 D:Print("|cFFFFFF00/resetdvn|r", "- Resets all but profile data SavedVariables.")
Nenue@32 454 D:Print("|cFFFFFF00/cleandvn|r", "- Fully resets SavedVariables, profiles and all.")
Nenue@32 455 end
Nenue@32 456
Nenue@66 457 local blocked = {profiles = true, debugmode = true}
Nenue@66 458 D.SetDefaults = function()
Nenue@66 459 for k,v in pairs(DevianDB) do
Nenue@66 460 if not blocked[k] then
Nenue@66 461 DevianDB[k] = nil
Nenue@60 462 end
Nenue@60 463 end
Nenue@66 464 for k,v in pairs(defaults) do
Nenue@66 465 if not blocked[k] then
Nenue@66 466 DevianDB[k] = v
Nenue@60 467 end
Nenue@60 468 end
Nenue@66 469 DevianLoadMessage = "Non-user SavedVars have been reset."
Nenue@66 470 ReloadUI()
Nenue@60 471 end
Nenue@66 472 D.SetDefaultsAll = function ()
Nenue@66 473 DevianDB = nil
Nenue@66 474 DevianLoadMessage = "All SavedVars wiped."
Nenue@66 475 ReloadUI()
Nenue@66 476 end
Nenue@66 477 D.ConfigCommand = function(input)
Nenue@66 478 if not self.config then
Nenue@66 479 self.config = DevCon
Nenue@66 480 self:EnableModule("Config")
Nenue@66 481 end
Nenue@66 482 self.modules.Config:ChatCommand(input)
Nenue@66 483 end
Nenue@45 484
Nenue@0 485 function D:OnEnable()
Nenue@33 486
Nenue@13 487 -- commands
Nenue@13 488 local cmdlist = {
Nenue@66 489 ['dvn'] = "Command",
Nenue@66 490 ['devian'] = "Command",
Nenue@36 491 ['dvc'] = "Console_Toggle",
Nenue@66 492 ['cleandvn'] = "SetDefaultsAll",
Nenue@66 493 ['resetdvn'] = "SetDefaults",
Nenue@66 494 ['dvg'] = "ConfigCommand"
Nenue@13 495 }
Nenue@13 496 for cmd, func in pairs(cmdlist) do
Nenue@13 497 self:RegisterChatCommand(cmd, func, true)
Nenue@13 498 end
Nenue@66 499 end
Nenue@66 500
Nenue@66 501 function D:OnInitialize()
Nenue@13 502
Nenue@33 503 -- pull defaults
Nenue@9 504 if not _G.DevianDB then
Nenue@13 505 _G.DevianDB = defaults
Nenue@9 506 end
Nenue@9 507 db = _G.DevianDB
Nenue@47 508 self.db = db
Nenue@0 509
Nenue@66 510 ---
Nenue@66 511 if DevianLoadMessage then
Nenue@66 512 D:Print(DevianLoadMessage)
Nenue@66 513 DevianLoadMessage = nil
Nenue@0 514 end
Nenue@0 515
Nenue@66 516
Nenue@66 517 --- initialize the current profile
Nenue@66 518 local id, name = D.Profile(db.current_profile or 1)
Nenue@66 519 D:Print('Using profile |cFFFFFF00'.. id ..'|r: |cFF00FF00'..currentProfile.name..'|r')
Nenue@66 520 if currentProfile.workspace then
Nenue@66 521 D:Print('Workspace: '.. (#currentProfile.channels) .. ' channels, ' .. #currentProfile.tags .. ' tags.')
Nenue@66 522 D:Print('Default channel: |cFFFFFF00'..currentProfile.default_channel..'|r: |cFF00FFFF'.. D.channels[currentProfile.default_channel].signature..'|r')
Nenue@0 523 end
Nenue@13 524
Nenue@66 525 for i, cinfo in pairs(D.channels) do
Nenue@14 526 i = tonumber(i)
Nenue@66 527 if not D.primary_channel then
Nenue@66 528 D.primary_channel = i
Nenue@14 529 end
Nenue@66 530 D:SetChannel(cinfo, i)
Nenue@66 531 D.num_channels = D.num_channels + 1
Nenue@32 532 end
Nenue@32 533
Nenue@66 534 D.max_channel = max(D.max_channel, currentProfile.max_channel)
Nenue@66 535 if currentProfile.max_channel < D.max_channel then
Nenue@66 536 for i = currentProfile.max_channel, D.max_channel do
Nenue@66 537 D.console[i]:Hide()
Nenue@47 538 end
Nenue@36 539 end
Nenue@36 540
Nenue@66 541 if currentProfile.workspace then
Nenue@66 542 if D.console[currentProfile.current_channel] then
Nenue@66 543 print('bringing', D.console[currentProfile.current_channel].signature, 'to the front')
Nenue@66 544 D.console[currentProfile.current_channel]:ToFront()
Nenue@66 545 -- bring the current channel to the front
Nenue@47 546 end
Nenue@66 547 DevianDock:Show()
Nenue@66 548 D:UpdateDock()
Nenue@36 549 end
Nenue@66 550 end