annotate Devian.lua @ 77:d11b67d25aee v2.1.78

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