annotate Devian.lua @ 55:1b8c597dba44

added movement fading todo: sort out dock mouseover hitches
author Nenue
date Wed, 06 Jan 2016 07:37:17 -0500
parents 4c05e55b0433
children 4b1b301cf8d4
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@0 5 if not LibStub then
Nenue@0 6 print('Something has happened...')
Nenue@0 7 end
Nenue@0 8 Devian = LibStub("AceAddon-3.0"):NewAddon("Devian", "AceConsole-3.0", "AceEvent-3.0")
Nenue@46 9 local D = _G.Devian
Nenue@46 10 D:SetDefaultModuleState(false)
Nenue@46 11
Nenue@47 12 local pairs, tostring, tonumber, ipairs, type = pairs, tostring, tonumber, ipairs, type
Nenue@47 13 local max, rand, format = math.max, math.random, string.format
Nenue@47 14 local insert, wipe, concat = table.insert, table.wipe, table.concat
Nenue@47 15 local select, unpack = select, unpack
Nenue@47 16 local GetNumAddOns, GetAddOnInfo, GetAddOnEnableState, EnableAddOn = GetNumAddOns, GetAddOnInfo, GetAddOnEnableState, EnableAddOn
Nenue@47 17 local UnitName, DisableAddOn = UnitName, DisableAddOn
Nenue@52 18 local MAJOR, MINOR = 'Devian-2.0', 'r@project-revision@'
Nenue@36 19 local MSG_NEED_DEV_MODE = 'Must be in development mode to use this function.'
Nenue@32 20 local WORKSPACE_ON, WORKSPACE_OFF = 1, 2
Nenue@0 21 local PLAYER_REALM = UnitName("player") .. '-' .. GetRealmName()
Nenue@18 22 local print = _G.print
Nenue@9 23 local db
Nenue@13 24 local defaults = {
Nenue@32 25 ['global'] = {{}, {}},
Nenue@13 26 ['tags'] = {},
Nenue@55 27 ['channels'] = {[1] = {
Nenue@55 28 signature = 'Main',
Nenue@55 29 index = 1,
Nenue@55 30 x = 100, y = 800,
Nenue@55 31 height = 500, width = 600,
Nenue@55 32 enabled = true}},
Nenue@45 33 ['profiles'] = {
Nenue@45 34 {'Main', false},
Nenue@45 35 {'Devian', true},
Nenue@45 36 {'Turok', true},
Nenue@45 37 {'Bam', true}
Nenue@45 38 },
Nenue@33 39 primary_channel = 1, -- the channel to which default output is sent
Nenue@33 40 current_channel = 1, -- the front channel
Nenue@33 41 max_channel = 1, -- the highest created channel id
Nenue@55 42 enabled = true, -- allow enabled consoles to appear
Nenue@33 43 load_message = "Defaults loaded.", -- messages to be displayed after reload
Nenue@33 44 font = [[Interface\Addons\Devian\font\SourceCodePro-Regular.ttf]], -- font info
Nenue@13 45 fontsize = 13,
Nenue@13 46 fontoutline = 'NONE',
Nenue@45 47
Nenue@45 48 headergrad = {'VERTICAL', 0, 0, 0, 1,
Nenue@45 49 1, 0.1, 0.1, 1}, -- header info
Nenue@33 50 headerdrop = {1,1,1,1},
Nenue@45 51 headerblend = 'BLEND',
Nenue@33 52 headeralpha = 1,
Nenue@45 53 headerfontcolor = {1,1,1,1},
Nenue@45 54
Nenue@45 55 backdrop = {1,1,1,1}, -- background frame info
Nenue@45 56 backgrad = {'VERTICAL', 0.1, 0.1, 0.1, 1, 0, 0, 0, 1},
Nenue@55 57 backblend = 'BLEND',
Nenue@45 58 backalpha = 1,
Nenue@45 59 backborder = {.5,.5,.5,1},
Nenue@45 60 backheader = {.25,.25,.25,1},
Nenue@45 61
Nenue@45 62 frontdrop = {1,1,1,1}, -- foreground frame info
Nenue@45 63 frontgrad = {'VERTICAL', 0.1, 0.1, 0.1, 1, 0, 0, 0, 1},
Nenue@55 64 frontblend = 'BLEND',
Nenue@28 65 frontalpha = 1,
Nenue@45 66 frontborder = {.07,.47,1,1},
Nenue@45 67 frontheader = {1,1,1,1},
Nenue@33 68 tagcolor = {}, -- tag color repository
Nenue@36 69 workspace = 2, -- current profile
Nenue@47 70 last_workspace = 2, -- default workspace to alternate with when just "/dvn" is issued
Nenue@47 71
Nenue@47 72 dock_onshow_fade_time = 2.5,
Nenue@47 73 dock_onshow_fade_from = 1,
Nenue@47 74 dock_onshow_fade_to = 0.2,
Nenue@47 75
Nenue@47 76 dock_alpha_on = 1,
Nenue@47 77 dock_alpha_off = 0.2,
Nenue@47 78 dock_fade_in = 0.15,
Nenue@47 79 dock_fade_out = 0.45,
Nenue@47 80 dock_button_alpha_on = 1,
Nenue@47 81 dock_button_alpha_off = 0.2,
Nenue@50 82 dock_button_fade_in = 0.075,
Nenue@55 83 dock_button_fade_out = 0.075,
Nenue@47 84
Nenue@55 85 movement_fade = true,
Nenue@55 86 movement_fade_time = 0.15,
Nenue@13 87 }
Nenue@9 88
Nenue@13 89 local function ScanAddOnList(cmd, ...)
Nenue@0 90 local list_state
Nenue@0 91
Nenue@14 92 local args = {}
Nenue@14 93 local arg, n = D:GetArgs(cmd, 1)
Nenue@14 94 while arg do
Nenue@47 95 insert(args, arg)
Nenue@14 96 arg, n = D:GetArgs(cmd,1,n)
Nenue@14 97 end
Nenue@14 98 local mode, tag, dest = unpack(args)
Nenue@0 99
Nenue@13 100
Nenue@14 101 -- no args, toggle ui
Nenue@32 102 if mode == 'dock' then
Nenue@33 103 if db.workspace == 1 then
Nenue@33 104 D:Print('Must be in dev mode to use this.')
Nenue@33 105 return
Nenue@33 106 end
Nenue@32 107 if #args <= 2 then
Nenue@32 108 D:Print("Not enough arguments for dock command.")
Nenue@32 109 return
Nenue@32 110 end
Nenue@0 111
Nenue@32 112 local target
Nenue@32 113 local worklist = {}
Nenue@32 114 for i = 2, #args do
Nenue@32 115 local ch
Nenue@32 116 local k = tostring(args[i])
Nenue@32 117 local j = tonumber(args[i])
Nenue@32 118 if db.channels[j] then
Nenue@32 119 ch = db.channels[j]
Nenue@32 120 elseif D.sig[k] then
Nenue@32 121 ch = D.sig[k]
Nenue@32 122 elseif D.sigID[k] then
Nenue@32 123 ch = db.channels[D.sigID[k]]
Nenue@32 124 elseif db.tags[k] and db.tags[k][1] then
Nenue@32 125 ch = db.channels[db.tags[j][1]]
Nenue@32 126 -- last resort
Nenue@32 127 else
Nenue@32 128 D:Print('No entry for argument #'..i..': '..tostring(args[i]))
Nenue@32 129 return
Nenue@32 130 end
Nenue@35 131 --@debug@
Nenue@35 132 --print(i, '->', ch.index, '-', ch.signature)--@end-debug@
Nenue@32 133 if i > 2 then
Nenue@47 134 insert(worklist, ch.index)
Nenue@32 135 else
Nenue@32 136 target = ch
Nenue@32 137
Nenue@35 138 --@debug@
Nenue@35 139 --print('arg1', args[2], target)--@end-debug@
Nenue@32 140 end
Nenue@0 141 end
Nenue@47 142 D:Print("Docking |cFF88FFFF"..concat(worklist, "|r, |cFF88FFFF").."|r with |cFFFFFF00"..target.index..', '..target.signature.."|r.")
Nenue@32 143 return D:DockFrame(target.index, unpack(worklist))
Nenue@32 144
Nenue@32 145
Nenue@14 146 elseif mode == 'stack' then
Nenue@33 147 if db.workspace == 1 then
Nenue@33 148 return D:Print(MSG_NEED_DEV_MODE)
Nenue@33 149 end
Nenue@14 150 return D:StackFrames()
Nenue@14 151 elseif mode == 'grid' then
Nenue@33 152 if db.workspace == 1 then
Nenue@33 153 return D:Print(MSG_NEED_DEV_MODE)
Nenue@33 154 end
Nenue@14 155 return D:DistributeFrames()
Nenue@14 156 elseif mode == 'tag' then -- tagging
Nenue@33 157 if db.workspace == 1 then
Nenue@33 158 return D:Print(MSG_NEED_DEV_MODE)
Nenue@33 159 end
Nenue@32 160
Nenue@36 161 local sig
Nenue@14 162 if tag ~= nil and dest ~= nil then
Nenue@36 163 --@debug@
Nenue@38 164 --print(tag, dest)
Nenue@36 165 --@end-debug@
Nenue@36 166
Nenue@32 167 -- convert to ID
Nenue@36 168 if tonumber(dest) == nil then
Nenue@36 169 if D.sigID[dest] then
Nenue@36 170 dest = db.channels[D.sigID[dest]].index
Nenue@36 171 else
Nenue@36 172 sig = dest
Nenue@36 173 end
Nenue@42 174 else
Nenue@42 175 dest = tonumber(dest)
Nenue@18 176 end
Nenue@38 177 --@debug@
Nenue@38 178 --print('2 tag,dest,sig', tag, dest, sig)--@end-debug@
Nenue@18 179
Nenue@32 180 -- make a new channel?
Nenue@36 181 local channel
Nenue@42 182 if not D.db.channels[dest] then
Nenue@36 183 dest = D.max_channel + 1
Nenue@36 184 D:Print('Created channel |cFF88FFFF'.. (sig and (dest..':'..sig) or dest ) .. '|r')
Nenue@36 185 channel = D:SetChannel(sig or tag,dest)
Nenue@42 186 else
Nenue@42 187
Nenue@42 188 channel = D.db.channels[dest]
Nenue@32 189 end
Nenue@38 190 --@debug@
Nenue@42 191 --print('3 tag,dest,channel.sig=',tag, dest, channel.signature)--@end-debug@
Nenue@32 192
Nenue@42 193 if not db.tags[tag] then -- no tag table?
Nenue@42 194 db.tags[tag] = {}
Nenue@42 195 end
Nenue@42 196
Nenue@42 197 if db.tags[tag][dest] then -- is tag set?
Nenue@32 198 db.tags[tag][dest] = nil
Nenue@34 199 D:Print('Hiding |cFF88FFFF'..tag..'|r messages in |cFFFFFF00'..db.channels[dest].index ..':'.. db.channels[dest].signature)
Nenue@32 200 else
Nenue@32 201 db.tags[tag][dest] = dest
Nenue@34 202 D:Print('Showing |cFF88FFFF'..tag..'|r messages in |cFFFFFF00'..db.channels[dest].index ..':'.. db.channels[dest].signature)
Nenue@32 203 end
Nenue@47 204 D:UpdateDock()
Nenue@14 205 else
Nenue@14 206 D:Print('Usage: /dvn tag <prefix> <console name or number>')
Nenue@14 207 end
Nenue@14 208 return
Nenue@32 209 elseif tonumber(mode) ~= nil or mode == 'save' then
Nenue@32 210 -- iterating for something
Nenue@32 211 if mode == 'save' then
Nenue@32 212 if tonumber(tag) == nil then
Nenue@32 213 T:Print('Save ID is invalid:', tag)
Nenue@32 214 end
Nenue@32 215 list_state = tonumber(tag)
Nenue@32 216 else
Nenue@32 217 list_state = tonumber(mode)
Nenue@32 218 db.workspace = list_state
Nenue@33 219 if list_state ~= 1 then
Nenue@33 220 db.last_workspace = list_state
Nenue@33 221 end
Nenue@33 222
Nenue@0 223 end
Nenue@32 224 elseif mode == nil then
Nenue@33 225 list_state = (db.workspace == 1) and db.last_workspace or 1
Nenue@33 226 db.workspace = list_state
Nenue@33 227 db.load_message = "quick swapped workspace #"..list_state
Nenue@32 228 else
Nenue@32 229 return D:PrintHelp()
Nenue@0 230 end
Nenue@32 231
Nenue@32 232 -- start the iterating
Nenue@36 233 if not db[PLAYER_REALM][list_state] then
Nenue@36 234 db[PLAYER_REALM][list_state] = {}
Nenue@36 235 end
Nenue@36 236 if not db.global[list_state] then
Nenue@36 237 db.global[list_state] = {}
Nenue@36 238 end
Nenue@36 239
Nenue@0 240 local char_list, global_list = db[PLAYER_REALM][list_state], db.global[list_state]
Nenue@0 241 local playername = UnitName("player")
Nenue@0 242
Nenue@0 243 for i = 1, GetNumAddOns() do
Nenue@0 244 local name = GetAddOnInfo(i)
Nenue@0 245 local enableState, globalState = GetAddOnEnableState(playername, i), GetAddOnEnableState(nil, i)
Nenue@0 246
Nenue@32 247 if mode == 'save' then
Nenue@0 248 char_list[name] = enableState
Nenue@0 249 global_list[name] = globalState
Nenue@0 250 else
Nenue@13 251 if char_list[name] or global_list[name] then
Nenue@32 252 if char_list[name] ~= 0 and global_list[name] ~= 0 then
Nenue@32 253 local value = false
Nenue@32 254 if char_list[name] == 2 and global_list[name] == 1 then
Nenue@32 255 value = UnitName("player")
Nenue@32 256 elseif global_list[name] == 2 then
Nenue@32 257 value = true
Nenue@32 258 end
Nenue@32 259 --print('EnableAddOn(', i, ',', value,')')
Nenue@32 260 EnableAddOn(i, value)
Nenue@32 261 else
Nenue@32 262 local value = true
Nenue@32 263 if char_list[name] == 2 and global_list[name] == 1 then
Nenue@32 264 value = UnitName("player")
Nenue@32 265 end
Nenue@32 266 --print('DisableAddOn(', i, ',', value,')')
Nenue@32 267 DisableAddOn(i,value)
Nenue@0 268 end
Nenue@33 269 elseif mode ~= 'save' then
Nenue@32 270 if type(db.unlisted) ~= 'table' then
Nenue@32 271 db.unlisted = {}
Nenue@0 272 end
Nenue@47 273 insert(db.unlisted, name)
Nenue@13 274 end
Nenue@0 275
Nenue@0 276 end
Nenue@0 277 end
Nenue@0 278
Nenue@32 279 if mode ~= 'save' then
Nenue@33 280 --db.load_message = "AddOn profile ".. list_state .." was loaded."
Nenue@0 281 ReloadUI()
Nenue@0 282 else
Nenue@32 283 D:Print('Profile #'.. (list_state)..' saved.')
Nenue@32 284 if list_state == 1 then
Nenue@32 285 D:Print('This will be your main AddOn list.')
Nenue@32 286 elseif list_state == db.default_list then
Nenue@32 287 db.last_workspace = list_state
Nenue@32 288 D:Print('This will be your default workspace')
Nenue@32 289 end
Nenue@0 290 end
Nenue@0 291 end
Nenue@0 292
Nenue@0 293
Nenue@13 294
Nenue@18 295 --- Creates a Devian-style output.
Nenue@18 296 -- The first argument describes the channel to output on, and the remaining arguments are concatenated in a manner similar to default print()
Nenue@18 297 -- This becomes the print handler when development mode is active. The original print() function is assigned to oldprint().
Nenue@18 298 -- @param Tag, signature, or numeric index of the channel to output on. Defaults to primary channel.
Nenue@18 299 -- @param ... Output contents.
Nenue@0 300 local function Message(prefix, ...)
Nenue@45 301 if db.workspace == 1 then
Nenue@23 302 return D.oldprint(prefix, ...)
Nenue@23 303 end
Nenue@23 304
Nenue@55 305 if tostring(prefix) == nil then
Nenue@55 306 prefix = 'nil*'
Nenue@1 307 end
Nenue@9 308
Nenue@18 309 local sendq = {}
Nenue@30 310 local tag, id, tagged
Nenue@13 311 local byName = true
Nenue@18 312 if D.tags[prefix] then
Nenue@18 313 for _, id in pairs(D.tags[prefix]) do
Nenue@18 314 if D.console[id] then
Nenue@18 315 sendq[id] = D.console[id]
Nenue@30 316 tagged = true
Nenue@18 317 end
Nenue@18 318 end
Nenue@18 319 end
Nenue@18 320
Nenue@13 321 if D.sig[prefix] then
Nenue@18 322 sendq[D.sig[prefix].index] = D.sig[prefix]
Nenue@13 323 elseif D.console[prefix] then
Nenue@18 324 sendq[D.console[prefix]] = D.console[prefix]
Nenue@30 325 elseif not tagged then
Nenue@18 326 sendq[D.primary_channel] = D.console[D.primary_channel]
Nenue@13 327 end
Nenue@18 328
Nenue@9 329 -- color me timbers
Nenue@9 330 local pcolor
Nenue@18 331 if (not db.tagcolor[prefix]) and byName then
Nenue@30 332 local c = {
Nenue@47 333 rand(64,255), rand(64,255), rand(64,255)
Nenue@30 334 }
Nenue@30 335 if c[1] > 223 and c[2] > 223 and c[3] > 223 then
Nenue@47 336 c[rand(1,3)] = rand(64,223)
Nenue@0 337 end
Nenue@30 338
Nenue@47 339 db.tagcolor[prefix] = format('%02X%02X%02X', unpack(c))
Nenue@0 340 end
Nenue@18 341 pcolor = db.tagcolor[prefix]
Nenue@0 342
Nenue@55 343 local buffer = {}
Nenue@0 344 for i = 1, select('#',...) do
Nenue@0 345 local var = select(i, ...)
Nenue@0 346
Nenue@0 347 if type(var) == 'table' then
Nenue@20 348 if type(var.GetName) == 'function' then
Nenue@46 349 var = '<table:'..tostring(var:GetName())..'>'
Nenue@20 350 else
Nenue@32 351 var = '<'..tostring(var)..'>'
Nenue@20 352 end
Nenue@20 353
Nenue@0 354 elseif type(var) == 'boolean' then
Nenue@0 355 var = var and 'true' or 'false'
Nenue@0 356 elseif type(var) == 'function' then
Nenue@0 357 var = '<funcref>'
Nenue@0 358 elseif type(var) == 'nil' then
Nenue@0 359 var = 'nil'
Nenue@0 360 end
Nenue@0 361
Nenue@47 362 insert(buffer, var)
Nenue@0 363 end
Nenue@47 364 local message = concat(buffer, ' ')
Nenue@18 365 for id, channel in pairs(sendq) do
Nenue@55 366 if channel.width < 250 then
Nenue@55 367 prefix = string.sub(prefix, 0,2)
Nenue@55 368 end
Nenue@55 369 channel.out:AddMessage('|cFF'.. pcolor..prefix ..'|r ' .. message)
Nenue@47 370 UIFrameFadeIn(D.dock.buttons[id], db.dock_onshow_fade_time, db.dock_onshow_fade_from, db.dock_onshow_fade_to)
Nenue@47 371 UIFrameFadeIn(D.dock.buttons[id].caption, db.dock_onshow_fade_time, db.dock_onshow_fade_from, db.dock_onshow_fade_to)
Nenue@18 372 end
Nenue@47 373 wipe(buffer)
Nenue@0 374 end
Nenue@0 375
Nenue@14 376
Nenue@32 377
Nenue@14 378
Nenue@32 379 function D:PrintHelp()
Nenue@32 380 D:Print("|cFFFFFF00/dvn|r",
Nenue@32 381 "\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 382 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 383
Nenue@32 384 D:Print("|cFFFFFF00/resetdvn|r", "- Resets all but profile data SavedVariables.")
Nenue@32 385 D:Print("|cFFFFFF00/cleandvn|r", "- Fully resets SavedVariables, profiles and all.")
Nenue@32 386 end
Nenue@32 387
Nenue@45 388
Nenue@45 389
Nenue@0 390 function D:OnEnable()
Nenue@33 391 print(MAJOR, MINOR)
Nenue@33 392
Nenue@33 393 if db.unlisted and #db.unlisted > 0 then
Nenue@47 394 D:Print('New AddOns have been found since the last profile update: '.. concat(db.unlisted, ', '))
Nenue@47 395 wipe(db.unlisted)
Nenue@33 396 end
Nenue@33 397
Nenue@33 398 if db.workspace == 1 then
Nenue@33 399 D:Print('Gameplay mode active (list #'..db.workspace..'). Print handling turned |cFFFFFF00OFF|r.')
Nenue@33 400 else
Nenue@33 401 D:Print('Development mode active (list #'..db.workspace..'). Print handling |cFF00FF00ON|r.')
Nenue@33 402 end
Nenue@33 403
Nenue@47 404 --@debug@
Nenue@45 405 self:RegisterChatCommand("dvg", function(input)
Nenue@45 406 if not self.config then
Nenue@45 407 self.config = DevCon
Nenue@45 408 self:EnableModule("Config")
Nenue@45 409 end
Nenue@45 410 self.modules.Config:ChatCommand(input)
Nenue@45 411 end)
Nenue@47 412 --@end-debug@
Nenue@45 413
Nenue@55 414 -- movement fading
Nenue@55 415 if db.movement_fade then
Nenue@55 416 self:RegisterEvent('PLAYER_STARTED_MOVING', function()
Nenue@55 417 for k, v in pairs(self.console) do
Nenue@55 418 if v.enabled then
Nenue@55 419 v.preAlpha = v:GetAlpha()
Nenue@55 420 UIFrameFadeOut(v, db.movement_fade_time, v.preAlpha, 0)
Nenue@55 421 UIFrameFadeOut(v.out, db.movement_fade_time, v.preAlpha, 0)
Nenue@55 422 end
Nenue@55 423 end
Nenue@55 424 end)
Nenue@55 425 self:RegisterEvent('PLAYER_STOPPED_MOVING', function()
Nenue@55 426 for k, v in pairs(self.console) do
Nenue@55 427 if v.enabled then
Nenue@55 428 UIFrameFadeIn(v, db.movement_fade_time, v:GetAlpha(), v.alpha)
Nenue@55 429 UIFrameFadeIn(v.out, db.movement_fade_time, v:GetAlpha(), v.alpha)
Nenue@55 430 end
Nenue@55 431 end
Nenue@55 432 end)
Nenue@55 433 end
Nenue@33 434 end
Nenue@33 435
Nenue@33 436 function D:OnInitialize()
Nenue@13 437 -- commands
Nenue@33 438 self:RegisterChatCommand("cleandvn", function(args)
Nenue@33 439 DevianDB = nil
Nenue@33 440 DevianDB = {
Nenue@33 441 load_message = "All SavedVars wiped."
Nenue@33 442 }
Nenue@33 443 ReloadUI()
Nenue@33 444 end)
Nenue@36 445 local blocked = {global = true, [PLAYER_REALM] = true}
Nenue@33 446 self:RegisterChatCommand("resetdvn", function(args)
Nenue@33 447 for k,v in pairs(DevianDB) do
Nenue@36 448 if not blocked[k] then
Nenue@33 449 DevianDB[k] = nil
Nenue@33 450 end
Nenue@33 451 end
Nenue@36 452 for k,v in pairs(defaults) do
Nenue@36 453 if not blocked[k] then
Nenue@36 454 DevianDB[k] = v
Nenue@36 455 end
Nenue@36 456 end
Nenue@33 457 DevianDB.load_message = "Non-user SavedVars have been reset."
Nenue@33 458 ReloadUI()
Nenue@33 459 end)
Nenue@13 460 local cmdlist = {
Nenue@13 461 ['dvn'] = ScanAddOnList,
Nenue@13 462 ['devian'] = ScanAddOnList,
Nenue@36 463 ['dvc'] = "Console_Toggle",
Nenue@13 464 }
Nenue@13 465 for cmd, func in pairs(cmdlist) do
Nenue@13 466 self:RegisterChatCommand(cmd, func, true)
Nenue@13 467 end
Nenue@13 468
Nenue@33 469 -- pull defaults
Nenue@9 470 if not _G.DevianDB then
Nenue@13 471 _G.DevianDB = defaults
Nenue@9 472 end
Nenue@9 473 db = _G.DevianDB
Nenue@47 474 self.db = db
Nenue@32 475 self.tags = db.tags
Nenue@32 476 self.channelinfo = db.channels
Nenue@0 477
Nenue@0 478 if not db[PLAYER_REALM] then
Nenue@32 479 db[PLAYER_REALM] = {[WORKSPACE_ON] = {}, [WORKSPACE_OFF] = {}}
Nenue@0 480 end
Nenue@0 481
Nenue@32 482 if db.load_message then
Nenue@32 483 D:Print(db.load_message)
Nenue@32 484 db.load_message = nil
Nenue@0 485 end
Nenue@0 486 D.oldprint = getprinthandler()
Nenue@0 487 if not _G.oldprint then
Nenue@0 488 _G.oldprint = D.oldprint
Nenue@0 489 end
Nenue@13 490
Nenue@33 491 -- Stop here in game mode
Nenue@33 492 if db.workspace == 1 then
Nenue@33 493 return
Nenue@33 494 end
Nenue@35 495 -----------------------------------------------------------------------
Nenue@35 496 self.db = db
Nenue@35 497 self.channels = db.channels
Nenue@32 498 self.max_channel = 0
Nenue@14 499 self.num_channels = 0
Nenue@13 500 self.console = {}
Nenue@13 501 self.sig = {}
Nenue@14 502 self.sigID = {}
Nenue@14 503 self.IDsig = {}
Nenue@47 504 self.dock = DevianDock
Nenue@47 505 self.dock.buttons = {}
Nenue@14 506 for i, cinfo in pairs(db.channels) do
Nenue@14 507 i = tonumber(i)
Nenue@14 508 if not self.primary_channel then
Nenue@14 509 self.primary_channel = i
Nenue@14 510 end
Nenue@14 511 self:SetChannel(cinfo, i)
Nenue@47 512 self.max_channel = max(i, self.max_channel)
Nenue@32 513 self.num_channels = self.num_channels + 1
Nenue@32 514 end
Nenue@32 515
Nenue@18 516 if self.console[db.current_channel] then
Nenue@18 517 self.console[db.current_channel]:ToFront()
Nenue@28 518 -- bring the current channel to the front
Nenue@18 519 end
Nenue@47 520 DevianDock:Show()
Nenue@47 521 self:UpdateDock()
Nenue@33 522 setprinthandler(Message)
Nenue@33 523 print = function(...)
Nenue@33 524 _G.print('Dvn', ...)
Nenue@23 525 end
Nenue@36 526 end
Nenue@36 527
Nenue@36 528 --- Console frame toggler
Nenue@36 529 -- @paramsig [...]
Nenue@36 530 -- @param ... one or more space-seperated channel keys
Nenue@47 531 function D:Console_Toggle(input, force)
Nenue@38 532 --oldprint(input)
Nenue@47 533 local setAll
Nenue@36 534 if db.workspace == 1 then
Nenue@36 535 return self:Print(MSG_NEED_DEV_MODE)
Nenue@36 536 end
Nenue@36 537 local search = {}
Nenue@47 538 local key
Nenue@36 539 local n = 0
Nenue@47 540 while self:GetArgs(input,1,n) and n < 255 do --should end itself when it gets nil, but
Nenue@47 541 key, n = self:GetArgs(input,1,n)
Nenue@47 542
Nenue@36 543 if self.sig[key] then
Nenue@47 544 --print(key, self.sigID[key])
Nenue@47 545 insert(search, self.sigID[key])
Nenue@47 546 elseif self.console[tonumber(key)] then
Nenue@47 547 --print(key, tonumber(key))
Nenue@47 548 insert(search, tonumber(key))
Nenue@36 549 end
Nenue@47 550
Nenue@47 551 --oldprint(#search, key, n)
Nenue@47 552 end
Nenue@47 553 if #search < 1 then
Nenue@36 554 search = self.sigID
Nenue@47 555 setAll = true
Nenue@47 556 end
Nenue@47 557 if setAll then
Nenue@47 558 --oldprint('setall', setAll)
Nenue@47 559 db.enabled = (not db.enabled) and true or nil
Nenue@47 560 if force == 0 then
Nenue@47 561 db.enabled = nil
Nenue@47 562 end
Nenue@36 563 end
Nenue@36 564
Nenue@36 565 for i, id in pairs(search) do
Nenue@38 566 --oldprint(i, id)
Nenue@36 567 local c = self.console[id]
Nenue@47 568 if setAll then
Nenue@47 569 c.enabled = db.enabled and db.enabled or nil
Nenue@47 570 else
Nenue@47 571
Nenue@47 572 db.enabled = true
Nenue@47 573 c.enabled = (not c.enabled) and true or nil
Nenue@47 574 if force == 0 then
Nenue@47 575 c.enabled = nil
Nenue@47 576 end
Nenue@47 577 --oldprint(id, ' ', force, c.enabled, db.enabled)
Nenue@47 578 end
Nenue@47 579
Nenue@47 580 if c.enabled or (setAll and db.enabled) then
Nenue@36 581 c:Show()
Nenue@36 582 if db.current_channel == c.index then
Nenue@36 583 c:ToFront()
Nenue@36 584 end
Nenue@47 585 elseif not (c.enabled and db.enabled) then
Nenue@36 586 c:Hide()
Nenue@36 587 end
Nenue@47 588 c:Save()
Nenue@36 589 end
Nenue@36 590
Nenue@47 591 if setAll then
Nenue@47 592 if db.enabled then
Nenue@47 593 self:Print('toggled all consoles ON')
Nenue@47 594 else
Nenue@47 595 self:Print('toggled all consoles OFF')
Nenue@47 596 end
Nenue@36 597 else
Nenue@47 598 local result = {}
Nenue@47 599 for i, id in pairs(search) do
Nenue@47 600 result[i] = tostring(id) .. ' = ' .. (self.console[id].enabled and 'ON' or 'OFF')
Nenue@47 601 end
Nenue@47 602 self:Print('toggled: '..concat(result, ', '))
Nenue@36 603 end
Nenue@0 604 end