annotate Devian.lua @ 30:42e74b72726d

Prefix auto-color checks for and deals with color levels that are close to white.
author Nenue
date Fri, 25 Dec 2015 13:56:20 -0500
parents 31ca76e04766
children 6fcfe60bbd0f
rev   line source
Nenue@0 1 -- User: Krakyn
Nenue@0 2 -- Created: 11/30/2015 7:46 AM
Nenue@0 3 if not LibStub then
Nenue@0 4 print('Something has happened...')
Nenue@0 5 end
Nenue@0 6 Devian = LibStub("AceAddon-3.0"):NewAddon("Devian", "AceConsole-3.0", "AceEvent-3.0")
Nenue@13 7 local MAJOR, MINOR = 'Devian-1.3', 'r@project-revision@'
Nenue@0 8 local D = _G.Devian
Nenue@0 9 local STATE_LOW, STATE_HIGH = 1, 2
Nenue@0 10 local PLAYER_REALM = UnitName("player") .. '-' .. GetRealmName()
Nenue@13 11 local DEVIAN_FRAME = 'DevianConsole'
Nenue@18 12 local print = _G.print
Nenue@9 13 local db
Nenue@13 14 local defaults = {
Nenue@13 15 ['global'] = {[STATE_LOW] = {}, [STATE_HIGH] = {}},
Nenue@13 16 ['tags'] = {},
Nenue@13 17 ['channels'] = {[1] = {signature = 'Dvn', name = 'Main', header = "%n [%t]", x = 100, y = 800, height = 500, width = 600, enabled = true}},
Nenue@14 18 primary_channel = 1,
Nenue@13 19 current_channel = 1,
Nenue@14 20 toggle = true,
Nenue@13 21 dnd_status = true,
Nenue@13 22 dnd_message = "Debugging. Your messages may get eaten.",
Nenue@13 23 font = [[Interface\Addons\Devian\font\SourceCodePro-Regular.ttf]],
Nenue@13 24 fontsize = 13,
Nenue@13 25 fontoutline = 'NONE',
Nenue@28 26 backalpha = 0.5,
Nenue@28 27 backdrop = {0,0,0,0.4},
Nenue@14 28 backgrad = {'VERTICAL', 0.1, 0.1, 0.1, 0.3, 0, 0, 0, 0.5},
Nenue@14 29 backblend = 'BLEND',
Nenue@28 30 frontdrop = {0,0,0,1},
Nenue@14 31 frontgrad = {'VERTICAL', 0.1, 0.1, 0.1, 0.9, 0, 0, 0, 0.9},
Nenue@22 32 frontblend = 'BLEND',
Nenue@28 33 frontalpha = 1,
Nenue@22 34 frontborder = {1,0,0,1},
Nenue@22 35 backborder = {0,0,1,0.75},
Nenue@13 36 }
Nenue@9 37
Nenue@4 38
Nenue@13 39 local function ScanAddOnList(cmd, ...)
Nenue@0 40 local list_state
Nenue@0 41
Nenue@14 42 local args = {}
Nenue@14 43 local arg, n = D:GetArgs(cmd, 1)
Nenue@14 44 while arg do
Nenue@14 45 table.insert(args, arg)
Nenue@14 46 arg, n = D:GetArgs(cmd,1,n)
Nenue@14 47 end
Nenue@14 48 local mode, tag, dest = unpack(args)
Nenue@0 49
Nenue@13 50
Nenue@14 51 -- no args, toggle ui
Nenue@0 52 if mode == nil then
Nenue@0 53 list_state = db.enabled and STATE_LOW or STATE_HIGH
Nenue@0 54 db.enabled = (db.enabled == false) and true or false
Nenue@17 55 --print(list_state, db.enabled)
Nenue@0 56
Nenue@0 57 if list_state == STATE_LOW then
Nenue@0 58 end
Nenue@14 59 elseif mode == 'stack' then
Nenue@14 60 return D:StackFrames()
Nenue@14 61 elseif mode == 'grid' then
Nenue@14 62 return D:DistributeFrames()
Nenue@14 63 elseif mode == 'tag' then -- tagging
Nenue@14 64 if tag ~= nil and dest ~= nil then
Nenue@28 65 local channel = D:SetChannel(dest:match('%a+'), dest:match('%d+'))
Nenue@18 66 if not D.tags[tag] then
Nenue@18 67 D.tags[tag] = {}
Nenue@14 68 end
Nenue@18 69 if D.tags[tag][channel.index] then
Nenue@18 70 D.tags[tag][channel.index] = nil
Nenue@18 71 D:Print('Removed |cFFFFFF00'..tag..'|r from |cFF00FFFF'.. dest .. '|r')
Nenue@18 72 else
Nenue@18 73 D.tags[tag][channel.index] = channel.index
Nenue@18 74 D:Print('Assigning |cFFFFFF00'..tag..'|r to |cFF00FFFF'.. dest .. '|r')
Nenue@18 75 end
Nenue@18 76
Nenue@14 77 else
Nenue@14 78 D:Print('Usage: /dvn tag <prefix> <console name or number>')
Nenue@14 79 end
Nenue@14 80 return
Nenue@14 81 elseif mode ~= nil then
Nenue@14 82 mode = tonumber(mode)
Nenue@0 83 if mode > 2 then
Nenue@17 84 --print('Something has happened.')
Nenue@0 85 return
Nenue@0 86 end
Nenue@0 87 list_state = mode == STATE_LOW and STATE_LOW or STATE_HIGH
Nenue@0 88 end
Nenue@0 89 local char_list, global_list = db[PLAYER_REALM][list_state], db.global[list_state]
Nenue@0 90
Nenue@0 91 local playername = UnitName("player")
Nenue@0 92
Nenue@0 93 for i = 1, GetNumAddOns() do
Nenue@0 94 local name = GetAddOnInfo(i)
Nenue@0 95 local enableState, globalState = GetAddOnEnableState(playername, i), GetAddOnEnableState(nil, i)
Nenue@0 96
Nenue@0 97 if mode == STATE_LOW or mode == STATE_HIGH then
Nenue@0 98 char_list[name] = enableState
Nenue@0 99 global_list[name] = globalState
Nenue@0 100 else
Nenue@13 101 if char_list[name] or global_list[name] then
Nenue@0 102
Nenue@0 103 if char_list[name] ~= 0 and global_list[name] ~= 0 then
Nenue@0 104 local value = false
Nenue@0 105 if char_list[name] == 2 and global_list[name] == 1 then
Nenue@0 106 value = UnitName("player")
Nenue@0 107 elseif global_list[name] == 2 then
Nenue@0 108 value = true
Nenue@0 109 end
Nenue@17 110 --print('EnableAddOn(', i, ',', value,')')
Nenue@0 111 EnableAddOn(i, value)
Nenue@0 112 else
Nenue@0 113 local value = true
Nenue@0 114 if char_list[name] == 2 and global_list[name] == 1 then
Nenue@0 115 value = UnitName("player")
Nenue@0 116 end
Nenue@17 117 --print('DisableAddOn(', i, ',', value,')')
Nenue@0 118 DisableAddOn(i,value)
Nenue@0 119 end
Nenue@13 120 end
Nenue@0 121
Nenue@0 122 end
Nenue@0 123 end
Nenue@0 124
Nenue@0 125 if mode == nil then
Nenue@0 126 ReloadUI()
Nenue@0 127 end
Nenue@0 128 if mode == STATE_LOW then
Nenue@0 129 D:Print('Developement AddOn list saved.')
Nenue@0 130 else
Nenue@0 131 D:Print('Standard AddOn list saved.')
Nenue@0 132 end
Nenue@0 133 end
Nenue@0 134
Nenue@0 135
Nenue@13 136 local function Console_MinMax(self)
Nenue@13 137 if self.minimized then
Nenue@7 138 self:Maximize()
Nenue@7 139 else
Nenue@7 140 self:Minimize()
Nenue@7 141 end
Nenue@7 142 end
Nenue@13 143
Nenue@13 144 local function Console_Minimize(self)
Nenue@13 145 self:SetHeight(20)
Nenue@13 146 self:SetMaxResize(GetScreenWidth(),20)
Nenue@13 147 self.minimized = true
Nenue@14 148 self.out:Hide()
Nenue@14 149 self:Save()
Nenue@7 150 end
Nenue@0 151
Nenue@13 152 local function Console_Maximize(self)
Nenue@13 153 local db = db.channels[self.index]
Nenue@13 154 self:SetHeight(db.height)
Nenue@13 155 self:SetMaxResize(GetScreenWidth(),GetScreenHeight())
Nenue@13 156 self.minimized = nil
Nenue@14 157 self.out:Show()
Nenue@14 158 self:Save()
Nenue@13 159 end
Nenue@13 160
Nenue@13 161
Nenue@13 162 local function Console_Save(self)
Nenue@13 163 local db = db.channels[self.index]
Nenue@14 164 if self.x then
Nenue@14 165 db.x = self.x
Nenue@14 166 else
Nenue@14 167 db.x = self:GetLeft()
Nenue@14 168 end
Nenue@14 169
Nenue@14 170 if self.y then
Nenue@14 171 db.y = self.y
Nenue@14 172 else
Nenue@14 173 db.y = (self:GetTop() - GetScreenHeight())
Nenue@14 174 end
Nenue@14 175
Nenue@14 176 if self.width then
Nenue@14 177 db.width = self.width
Nenue@14 178 else
Nenue@14 179 db.width = self:GetWidth()
Nenue@14 180 end
Nenue@14 181
Nenue@13 182 if not self.minimized then
Nenue@14 183 if self.height then
Nenue@14 184 db.height = self.height
Nenue@14 185 else
Nenue@14 186 db.height = self:GetHeight()
Nenue@14 187 end
Nenue@14 188 self:SetHeight(db.height)
Nenue@13 189 end
Nenue@14 190
Nenue@14 191 db.minimized = self.minimized and true or nil
Nenue@14 192 db.enabled = self:IsVisible() and true or nil
Nenue@14 193 db.active = self.active and true or nil
Nenue@17 194 --print('save:', db.signature, 'min=', db.minimized, ' enabled=', db.enabled, ' active = ', db.active, 'x=', db.x, 'y=', db.y, 'h=', db.height, 'w=', db.width)
Nenue@13 195 self:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', db.x, db.y)
Nenue@14 196 self:SetWidth(db.width)
Nenue@13 197 end
Nenue@13 198
Nenue@14 199 -- Console frame toggler
Nenue@14 200 -- @paramsig [...]
Nenue@14 201 -- @param ... one or more space-seperated channel keys
Nenue@13 202 local function Console_Toggle(input)
Nenue@14 203 local search = {}
Nenue@28 204 local n = 0
Nenue@28 205 if D:GetArgs(input,1) then
Nenue@14 206 repeat
Nenue@28 207 key, n = D:GetArgs(input,1,n)
Nenue@14 208 if D.sig[key] then
Nenue@14 209 table.insert(search, D.sig[key])
Nenue@14 210 elseif D.console[key] then
Nenue@14 211 table.insert(search, D.console[key])
Nenue@14 212 end
Nenue@14 213 until n == 1e9
Nenue@13 214 else
Nenue@13 215 search = D.console
Nenue@13 216 end
Nenue@13 217
Nenue@14 218 db.toggle = not db.toggle and true or nil
Nenue@28 219 for i, c in ipairs(search) do
Nenue@28 220 print(i,c.index)
Nenue@14 221 if db.toggle then
Nenue@28 222 c.enabled = true
Nenue@14 223 c:Show()
Nenue@26 224 if db.current_channel == c.index then
Nenue@26 225 c:ToFront()
Nenue@26 226 end
Nenue@14 227 else
Nenue@14 228 c.enabled = nil
Nenue@14 229 c.minimized = nil
Nenue@14 230 c:Maximize()
Nenue@13 231 c:Hide()
Nenue@13 232 end
Nenue@13 233 end
Nenue@14 234
Nenue@14 235 if db.toggle then
Nenue@14 236 D:Print('toggled on?')
Nenue@14 237 else
Nenue@14 238 D:Print('toggled off?')
Nenue@14 239 end
Nenue@13 240 end
Nenue@13 241
Nenue@18 242 --- Brings the console to the front.
Nenue@18 243 -- Frame method used to bring a console frame to the front of the display stack.
Nenue@14 244 local function Console_ToFront(c)
Nenue@14 245 --print(D.raise_ct, 'Raising', c.signature)
Nenue@14 246 --print(unpack(db.frontdrop))
Nenue@14 247 --print(unpack(db.frontgrad))
Nenue@14 248 --print(db.frontblend)
Nenue@22 249 -- D.raise_ct = D.raise_ct + 1
Nenue@14 250 c:Raise()
Nenue@28 251 c:SetAlpha(db.frontalpha)
Nenue@14 252 c.out.backdrop:SetTexture(unpack(db.frontdrop))
Nenue@14 253 c.out.backdrop:SetGradientAlpha(unpack(db.frontgrad))
Nenue@14 254 c.out.backdrop:SetBlendMode(db.frontblend)
Nenue@20 255 db.current_channel = c.index
Nenue@18 256
Nenue@18 257 for _, part in pairs(c.border) do
Nenue@24 258 part:SetTexture(unpack(db.frontborder))
Nenue@18 259 end
Nenue@14 260
Nenue@14 261 for id, bc in pairs(D.console) do
Nenue@14 262 if id ~= c.index then
Nenue@14 263 --print(D.raise_ct, 'Lowering', bc.signature)
Nenue@14 264 --print(unpack(db.backdrop))
Nenue@14 265 --print(unpack(db.backgrad))
Nenue@14 266 --print(db.backblend)
Nenue@28 267 bc:SetAlpha(db.backalpha)
Nenue@14 268 bc.out.backdrop:SetTexture(unpack(db.backdrop))
Nenue@14 269 bc.out.backdrop:SetGradientAlpha(unpack(db.backgrad))
Nenue@14 270 bc.out.backdrop:SetBlendMode(db.backblend)
Nenue@18 271
Nenue@18 272 for _, part in pairs(bc.border) do
Nenue@24 273 part:SetTexture(unpack(db.backborder))
Nenue@14 274 end
Nenue@18 275 end
Nenue@18 276
Nenue@14 277 end
Nenue@14 278
Nenue@14 279 end
Nenue@14 280
Nenue@18 281 --- Constructs the frame object for a console channel
Nenue@18 282 -- Initializes the console channel at a specified index.
Nenue@18 283 -- Configuration data can be overridden by passing a desired settings table.
Nenue@18 284 -- @param i Numeric index of the channel as it manifests in db.channels
Nenue@18 285 -- @param vars Optional settings table to be used.
Nenue@13 286 local function CreateConsole(i, vars)
Nenue@14 287
Nenue@14 288 if not vars then
Nenue@14 289 vars = db.channels[i]
Nenue@14 290 end
Nenue@14 291
Nenue@17 292 --print('make:', vars.signature, '(', vars.x, vars.y, ')', vars.width, 'x', vars.height)
Nenue@13 293 local f = CreateFrame('Frame', 'DevianChannelFrame' .. tostring(i), UIParent, DEVIAN_FRAME)
Nenue@14 294 f:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', vars.x, vars.y)
Nenue@13 295 f:SetSize(vars.width, vars.height)
Nenue@13 296 f:Lower()
Nenue@13 297 f.out:SetFont(db.font, db.fontsize, db.fontoutline)
Nenue@22 298 if (db.current_channel == i) then
Nenue@24 299 f.out.backdrop:SetTexture(unpack(db.frontdrop))
Nenue@22 300 else
Nenue@24 301 f.out.backdrop:SetTexture(unpack(db.backdrop))
Nenue@22 302 end
Nenue@22 303
Nenue@13 304 f.Save = Console_Save
Nenue@13 305 f.Minimize = Console_Minimize
Nenue@13 306 f.Maximize = Console_Maximize
Nenue@13 307 f.MinMax = Console_MinMax
Nenue@14 308 f.ToFront = Console_ToFront
Nenue@13 309 f.Toggle = D.Console_Toggle
Nenue@13 310 f.name = vars.name
Nenue@13 311 f.index = i
Nenue@14 312 f.signature = vars.signature
Nenue@14 313 f.format = vars.header
Nenue@14 314 f.x = vars.x
Nenue@14 315 f.y = vars.y
Nenue@14 316 f.width = vars.width
Nenue@14 317 f.height = vars.height
Nenue@13 318
Nenue@14 319 if vars.enabled then
Nenue@14 320 f.enabled = true
Nenue@14 321 if db.toggle then
Nenue@14 322 f:Show()
Nenue@14 323 end
Nenue@13 324 end
Nenue@14 325 if vars.minimized then
Nenue@13 326 f:Minimize()
Nenue@22 327 else
Nenue@22 328 f:Maximize()
Nenue@13 329 end
Nenue@13 330
Nenue@13 331 return f
Nenue@13 332 end
Nenue@13 333
Nenue@18 334 --- Creates a Devian-style output.
Nenue@18 335 -- The first argument describes the channel to output on, and the remaining arguments are concatenated in a manner similar to default print()
Nenue@18 336 -- This becomes the print handler when development mode is active. The original print() function is assigned to oldprint().
Nenue@18 337 -- @param Tag, signature, or numeric index of the channel to output on. Defaults to primary channel.
Nenue@18 338 -- @param ... Output contents.
Nenue@0 339 local function Message(prefix, ...)
Nenue@24 340 if db.enabled == true then
Nenue@23 341 return D.oldprint(prefix, ...)
Nenue@23 342 end
Nenue@23 343
Nenue@1 344 if prefix == nil then
Nenue@13 345 prefix = 1
Nenue@1 346 end
Nenue@9 347
Nenue@18 348 local sendq = {}
Nenue@30 349 local tag, id, tagged
Nenue@13 350 local byName = true
Nenue@18 351 if D.tags[prefix] then
Nenue@18 352 for _, id in pairs(D.tags[prefix]) do
Nenue@18 353 if D.console[id] then
Nenue@18 354 sendq[id] = D.console[id]
Nenue@30 355 tagged = true
Nenue@18 356 end
Nenue@18 357 end
Nenue@18 358 end
Nenue@18 359
Nenue@13 360 if D.sig[prefix] then
Nenue@18 361 sendq[D.sig[prefix].index] = D.sig[prefix]
Nenue@13 362 elseif D.console[prefix] then
Nenue@18 363 sendq[D.console[prefix]] = D.console[prefix]
Nenue@30 364 elseif not tagged then
Nenue@18 365 sendq[D.primary_channel] = D.console[D.primary_channel]
Nenue@13 366 end
Nenue@18 367
Nenue@9 368 -- color me timbers
Nenue@9 369 local pcolor
Nenue@18 370 if (not db.tagcolor[prefix]) and byName then
Nenue@30 371 local c = {
Nenue@30 372 math.random(64,255), math.random(64,255), math.random(64,255)
Nenue@30 373 }
Nenue@30 374 if c[1] > 223 and c[2] > 223 and c[3] > 223 then
Nenue@30 375 c[math.random(1,3)] = math.random(64,223)
Nenue@0 376 end
Nenue@30 377
Nenue@18 378 db.tagcolor[prefix] = string.format('%02X%02X%02X', unpack(c))
Nenue@0 379 end
Nenue@18 380 pcolor = db.tagcolor[prefix]
Nenue@0 381
Nenue@18 382 local buffer = {'|cFF'.. pcolor..prefix ..'|r'}
Nenue@0 383 for i = 1, select('#',...) do
Nenue@0 384 local var = select(i, ...)
Nenue@0 385
Nenue@0 386 if type(var) == 'table' then
Nenue@20 387 if type(var.GetName) == 'function' then
Nenue@20 388 var = '<table:'..(var:GetName() or '?')..'>'
Nenue@20 389 else
Nenue@20 390 var = '<table>'
Nenue@20 391 end
Nenue@20 392
Nenue@0 393 elseif type(var) == 'boolean' then
Nenue@0 394 var = var and 'true' or 'false'
Nenue@0 395 elseif type(var) == 'function' then
Nenue@0 396 var = '<funcref>'
Nenue@0 397 elseif type(var) == 'nil' then
Nenue@0 398 var = 'nil'
Nenue@0 399 end
Nenue@0 400
Nenue@0 401 table.insert(buffer, var)
Nenue@0 402 end
Nenue@18 403 local message = table.concat(buffer, ' ')
Nenue@18 404 for id, channel in pairs(sendq) do
Nenue@18 405 channel.out:AddMessage(message)
Nenue@18 406 end
Nenue@0 407 table.wipe(buffer)
Nenue@0 408 end
Nenue@0 409
Nenue@18 410 --- Spaces each frame evenly across the screen.
Nenue@14 411 function D:DistributeFrames() --
Nenue@17 412 --print('frame grid:', max, num_side)
Nenue@14 413 local max = self.num_channels
Nenue@14 414 local num_side = math.ceil(math.sqrt(max))
Nenue@14 415 local w = GetScreenWidth() / num_side
Nenue@14 416 local h = GetScreenHeight() / num_side
Nenue@14 417 for i, frame in pairs(D.console) do
Nenue@14 418 local dx = (i-1) % num_side
Nenue@14 419 local dy = math.floor((i-1) / num_side)
Nenue@14 420
Nenue@17 421 --print('move:', frame.signature, 'dx=', dx, 'dy=', dy)
Nenue@17 422 --print('move:', frame.signature, ' x=', dx * w, 'y=', -(dy * h), 'h=', h, 'w=', w)
Nenue@14 423 frame.width = w
Nenue@14 424 frame.height = h
Nenue@14 425 frame.x = dx * w
Nenue@14 426 frame.y = -(dy * h)
Nenue@14 427 frame:Save()
Nenue@14 428 end
Nenue@14 429
Nenue@14 430 end
Nenue@14 431
Nenue@18 432 --- Place all frames stacked beneath the primary frame.
Nenue@14 433 function D:StackFrames()
Nenue@14 434 local last
Nenue@14 435 for i, frame in pairs(self.console) do
Nenue@14 436 if last then
Nenue@14 437 frame.x = last.x
Nenue@14 438 frame.y = last.y - 20
Nenue@14 439 else
Nenue@14 440 frame.x = (GetScreenWidth()-frame:GetWidth())/2
Nenue@14 441 frame.y = 0
Nenue@14 442 end
Nenue@14 443 frame:Save()
Nenue@14 444 last = frame
Nenue@14 445 end
Nenue@14 446 end
Nenue@14 447
Nenue@18 448 --- Updates a console "channel" entry, generating a new one if necessary.
Nenue@18 449 -- Config data will be take from cinfo. If cinfo is a string, then only channel signature is set. The remaining variables are filled in from the primary channel.
Nenue@18 450 -- i can be given to select a specific channel table entry to work on. Otherwise, it will just create a new channel and the frame associated with it.
Nenue@18 451 -- @usage cinfo [, i]
Nenue@18 452 -- @param cinfo Config variables table, or a string to be used as channel signature
Nenue@18 453 -- @param i Console index. If valid, settings will be inherited from that channel.
Nenue@14 454 function D:SetChannel(cinfo, i)
Nenue@17 455 --print('join:', i , cinfo)
Nenue@14 456 local t_info = {}
Nenue@18 457 local dbvars = db.channels[self.primary_channel]
Nenue@28 458 local signame
Nenue@28 459
Nenue@28 460 -- is cinfo a table or signature?
Nenue@18 461 if type(cinfo) == 'string' then
Nenue@28 462 signame = tostring(cinfo)
Nenue@18 463 t_info.signature = signame
Nenue@28 464 elseif type(cinfo) ~= 'table' then
Nenue@14 465 cinfo = {}
Nenue@14 466 end
Nenue@18 467
Nenue@28 468 -- did we get a signature string?
Nenue@28 469 if not (cinfo.signature or t_info.signature) then
Nenue@28 470 t_info.signature = 'Console'
Nenue@28 471 end
Nenue@28 472
Nenue@28 473 -- was an index given?
Nenue@28 474 if not i then
Nenue@28 475 i = D.num_channels + 1
Nenue@28 476 t_info.index = i
Nenue@28 477 -- make a new one
Nenue@28 478 else
Nenue@14 479 i = tonumber(i)
Nenue@28 480 -- is it valid?
Nenue@14 481 if db.channels[i] then
Nenue@18 482 dbvars = db.channels[i]
Nenue@28 483 -- use that as our base vars
Nenue@18 484 else
Nenue@30 485 if D.sig[t_info.signature] then
Nenue@28 486 local sigvar = t_info.signature
Nenue@28 487 local j = 2
Nenue@28 488 while D.sig[sigvar] do
Nenue@30 489 sigvar = sigvar .. j
Nenue@28 490 j = j + 1
Nenue@28 491 end
Nenue@28 492 t_info.signature = sigvar
Nenue@18 493 end
Nenue@28 494
Nenue@28 495 i = D.num_channels + 1
Nenue@28 496 t_info.index = i
Nenue@28 497 -- make a new index number and fix the signature
Nenue@14 498 end
Nenue@14 499 end
Nenue@14 500
Nenue@28 501 -- can proceed to fill in from base vars here
Nenue@18 502 for k,v in pairs(dbvars) do
Nenue@14 503 if not t_info[k] then
Nenue@14 504 if cinfo[k] then
Nenue@14 505 t_info[k] = cinfo[k]
Nenue@18 506 elseif db.channels[self.primary_channel][k] then
Nenue@18 507 t_info[k] = db.channels[self.primary_channel][k]
Nenue@14 508 end
Nenue@14 509 end
Nenue@14 510 end
Nenue@14 511
Nenue@28 512 -- we're working with a fresh channel right?
Nenue@14 513 if not db.channels[i] then
Nenue@14 514 t_info.x = t_info.x + 20
Nenue@14 515 t_info.y = t_info.y - 20
Nenue@14 516 db.channels[i] = t_info
Nenue@28 517 -- set its position just off of the base vars and store it
Nenue@14 518 end
Nenue@18 519
Nenue@28 520 -- can proceed to display something from here
Nenue@14 521 if not self.console[i] then
Nenue@14 522 self.console[i] = CreateConsole(i, t_info)
Nenue@28 523 -- if it isn't already spawned, create the frame
Nenue@14 524 end
Nenue@18 525 local channel = self.console[i]
Nenue@18 526 self.sig[t_info.signature] = channel
Nenue@18 527 self.sigID[t_info.signature] = i
Nenue@18 528 self.IDsig[i] = t_info.signature
Nenue@20 529
Nenue@18 530 return channel
Nenue@14 531 end
Nenue@14 532
Nenue@0 533 function D:OnEnable()
Nenue@13 534 -- commands
Nenue@13 535 local cmdlist = {
Nenue@13 536 ['dvn'] = ScanAddOnList,
Nenue@13 537 ['devian'] = ScanAddOnList,
Nenue@13 538 ['dvc'] = Console_Toggle,
Nenue@13 539 }
Nenue@13 540 for cmd, func in pairs(cmdlist) do
Nenue@13 541 self:RegisterChatCommand(cmd, func, true)
Nenue@13 542 end
Nenue@13 543
Nenue@11 544 if db.enabled == true then
Nenue@0 545 D:Print('Standard AddOn list active. Type /dvn to switch to development mode.')
Nenue@0 546 else
Nenue@0 547 D:Print('Development AddOn list active. Type /dvn to revert to regular operation.')
Nenue@0 548 end
Nenue@13 549
Nenue@0 550 end
Nenue@0 551
Nenue@0 552 function D:OnInitialize()
Nenue@13 553 -- emergency button
Nenue@13 554 self:RegisterChatCommand("cleandvn", function(args)
Nenue@13 555 DevianDB = nil
Nenue@13 556 ReloadUI()
Nenue@13 557 end)
Nenue@13 558
Nenue@13 559 -- savedvars
Nenue@13 560 local cherry = false
Nenue@9 561 if not _G.DevianDB then
Nenue@13 562 _G.DevianDB = defaults
Nenue@13 563 cherry = "Type /dvnsave to snapshot your current UI"
Nenue@9 564 end
Nenue@9 565 db = _G.DevianDB
Nenue@0 566
Nenue@0 567 if not db[PLAYER_REALM] then
Nenue@9 568 db[PLAYER_REALM] = {[STATE_LOW] = {}, [STATE_HIGH] = {}}
Nenue@0 569 if not cherry then
Nenue@0 570 cherry = "This character didn't have an AddOn table."
Nenue@0 571 end
Nenue@0 572 end
Nenue@0 573
Nenue@18 574
Nenue@18 575 if not db.tags then
Nenue@18 576 db.tags = {}
Nenue@13 577 end
Nenue@18 578 self.tags = db.tags
Nenue@0 579 if cherry then
Nenue@0 580 D:Print(cherry)
Nenue@0 581 end
Nenue@0 582 D.oldprint = getprinthandler()
Nenue@0 583 if not _G.oldprint then
Nenue@0 584 _G.oldprint = D.oldprint
Nenue@0 585 end
Nenue@13 586
Nenue@22 587 --self.raise_ct = 0
Nenue@14 588 self.last_channel = 0
Nenue@14 589 self.num_channels = 0
Nenue@13 590 self.console = {}
Nenue@13 591 self.sig = {}
Nenue@14 592 self.sigID = {}
Nenue@14 593 self.IDsig = {}
Nenue@14 594 for i, cinfo in pairs(db.channels) do
Nenue@14 595 i = tonumber(i)
Nenue@14 596 if not self.primary_channel then
Nenue@14 597 self.primary_channel = i
Nenue@14 598 end
Nenue@14 599 self:SetChannel(cinfo, i)
Nenue@14 600 if i > self.last_channel then
Nenue@14 601 self.last_channel = i
Nenue@14 602 end
Nenue@14 603 self.num_channels = self.num_channels + 1
Nenue@13 604 end
Nenue@18 605
Nenue@18 606 if self.console[db.current_channel] then
Nenue@18 607 self.console[db.current_channel]:ToFront()
Nenue@28 608 -- bring the current channel to the front
Nenue@18 609 end
Nenue@18 610
Nenue@23 611 if db.enabled then
Nenue@24 612 for i, c in pairs(self.console) do
Nenue@23 613 self.console[i]:Hide()
Nenue@23 614 end
Nenue@23 615 end
Nenue@23 616
Nenue@23 617
Nenue@18 618 -- only do this in dev mode
Nenue@18 619 if db.enabled == false then
Nenue@18 620 setprinthandler(Message)
Nenue@18 621 print = function(...)
Nenue@18 622 _G.print('Dvn', ...)
Nenue@18 623 end
Nenue@18 624 end
Nenue@13 625 print(MAJOR, MINOR)
Nenue@0 626 end