Mercurial > wow > devian
comparison Devian.lua @ 32:c6a2c2df4790
v2 work
| author | Nenue |
|---|---|
| date | Sat, 26 Dec 2015 21:51:57 -0500 |
| parents | 6fcfe60bbd0f |
| children | e6650821a2c0 |
comparison
equal
deleted
inserted
replaced
| 31:6fcfe60bbd0f | 32:c6a2c2df4790 |
|---|---|
| 1 -- User: Krakyn | 1 --- ${PACKAGE_NAME} |
| 2 -- Created: 11/30/2015 7:46 AM | 2 -- @file-author@ |
| 3 -- @project-revision@ @project-hash@ | |
| 4 -- @file-revision@ @file-hash@ | |
| 3 if not LibStub then | 5 if not LibStub then |
| 4 print('Something has happened...') | 6 print('Something has happened...') |
| 5 end | 7 end |
| 6 Devian = LibStub("AceAddon-3.0"):NewAddon("Devian", "AceConsole-3.0", "AceEvent-3.0") | 8 Devian = LibStub("AceAddon-3.0"):NewAddon("Devian", "AceConsole-3.0", "AceEvent-3.0") |
| 7 local MAJOR, MINOR = 'Devian-1.3', 'r@project-revision@' | 9 local MAJOR, MINOR = 'Devian-1.3', 'r@project-revision@' |
| 8 local D = _G.Devian | 10 local D = _G.Devian |
| 9 local STATE_LOW, STATE_HIGH = 1, 2 | 11 local WORKSPACE_ON, WORKSPACE_OFF = 1, 2 |
| 10 local PLAYER_REALM = UnitName("player") .. '-' .. GetRealmName() | 12 local PLAYER_REALM = UnitName("player") .. '-' .. GetRealmName() |
| 11 local DEVIAN_FRAME = 'DevianConsole' | 13 local DEVIAN_FRAME = 'DevianConsole' |
| 12 local print = _G.print | 14 local print = _G.print |
| 13 local db | 15 local db |
| 14 local defaults = { | 16 local defaults = { |
| 15 ['global'] = {[STATE_LOW] = {}, [STATE_HIGH] = {}}, | 17 ['global'] = {{}, {}}, |
| 16 ['tags'] = {}, | 18 ['tags'] = {}, |
| 17 ['channels'] = {[1] = {signature = 'Dvn', name = 'Main', header = "%n [%t]", x = 100, y = 800, height = 500, width = 600, enabled = true}}, | 19 ['channels'] = {[1] = {signature = 'Main', index = 1, x = 100, y = 800, height = 500, width = 600, enabled = true}}, |
| 18 primary_channel = 1, | 20 primary_channel = 1, |
| 19 current_channel = 1, | 21 current_channel = 1, |
| 22 max_channel = 1, | |
| 20 toggle = true, | 23 toggle = true, |
| 21 dnd_status = true, | 24 load_message = "Defaults loaded.", |
| 22 dnd_message = "Debugging. Your messages may get eaten.", | |
| 23 font = [[Interface\Addons\Devian\font\SourceCodePro-Regular.ttf]], | 25 font = [[Interface\Addons\Devian\font\SourceCodePro-Regular.ttf]], |
| 24 fontsize = 13, | 26 fontsize = 13, |
| 25 fontoutline = 'NONE', | 27 fontoutline = 'NONE', |
| 28 headergrab = {'VERTICAL', 0, 0, 0, 0.5, 0.1, 0.1, 0.1, 0.3}, | |
| 26 backalpha = 0.5, | 29 backalpha = 0.5, |
| 27 backdrop = {0,0,0,0.4}, | 30 backdrop = {0,0,0,0.4}, |
| 28 backgrad = {'VERTICAL', 0.1, 0.1, 0.1, 0.3, 0, 0, 0, 0.5}, | 31 backgrad = {'VERTICAL', 0.1, 0.1, 0.1, 0.3, 0, 0, 0, 0.5}, |
| 29 backblend = 'BLEND', | 32 backblend = 'BLEND', |
| 30 frontdrop = {0,0,0,1}, | 33 frontdrop = {0,0,0,1}, |
| 31 frontgrad = {'VERTICAL', 0.1, 0.1, 0.1, 0.9, 0, 0, 0, 0.9}, | 34 frontgrad = {'VERTICAL', 0.1, 0.1, 0.1, 0.9, 0, 0, 0, 0.9}, |
| 32 frontblend = 'BLEND', | 35 frontblend = 'BLEND', |
| 33 frontalpha = 1, | 36 frontalpha = 1, |
| 34 frontborder = {1,0,0,1}, | 37 frontborder = {1,0,0,1}, |
| 35 backborder = {0,0,1,0.75}, | 38 backborder = {0,0,1,0.75}, |
| 39 tagcolor = {}, | |
| 40 workspace = 1, | |
| 36 } | 41 } |
| 37 | 42 |
| 38 | 43 |
| 39 local function ScanAddOnList(cmd, ...) | 44 local function ScanAddOnList(cmd, ...) |
| 40 local list_state | 45 local list_state |
| 47 end | 52 end |
| 48 local mode, tag, dest = unpack(args) | 53 local mode, tag, dest = unpack(args) |
| 49 | 54 |
| 50 | 55 |
| 51 -- no args, toggle ui | 56 -- no args, toggle ui |
| 52 if mode == nil then | 57 if mode == 'dock' then |
| 53 list_state = db.enabled and STATE_LOW or STATE_HIGH | 58 if #args <= 2 then |
| 54 db.enabled = (db.enabled == false) and true or false | 59 D:Print("Not enough arguments for dock command.") |
| 55 --print(list_state, db.enabled) | 60 return |
| 56 | 61 end |
| 57 if list_state == STATE_LOW then | 62 |
| 58 end | 63 local target |
| 64 local worklist = {} | |
| 65 for i = 2, #args do | |
| 66 local ch | |
| 67 local k = tostring(args[i]) | |
| 68 local j = tonumber(args[i]) | |
| 69 if db.channels[j] then | |
| 70 ch = db.channels[j] | |
| 71 elseif D.sig[k] then | |
| 72 ch = D.sig[k] | |
| 73 elseif D.sigID[k] then | |
| 74 ch = db.channels[D.sigID[k]] | |
| 75 elseif db.tags[k] and db.tags[k][1] then | |
| 76 ch = db.channels[db.tags[j][1]] | |
| 77 -- last resort | |
| 78 else | |
| 79 D:Print('No entry for argument #'..i..': '..tostring(args[i])) | |
| 80 return | |
| 81 end | |
| 82 oldprint(i, '->', ch.index, '-', ch.signature) | |
| 83 if i > 2 then | |
| 84 table.insert(worklist, ch.index) | |
| 85 else | |
| 86 target = ch | |
| 87 | |
| 88 oldprint('arg1', args[2], target) | |
| 89 end | |
| 90 end | |
| 91 D:Print("Docking |cFF88FFFF"..table.concat(worklist, "|r, |cFF88FFFF").."|r with |cFFFFFF00"..target.index..', '..target.signature.."|r.") | |
| 92 return D:DockFrame(target.index, unpack(worklist)) | |
| 93 | |
| 94 | |
| 59 elseif mode == 'stack' then | 95 elseif mode == 'stack' then |
| 60 return D:StackFrames() | 96 return D:StackFrames() |
| 61 elseif mode == 'grid' then | 97 elseif mode == 'grid' then |
| 62 return D:DistributeFrames() | 98 return D:DistributeFrames() |
| 63 elseif mode == 'tag' then -- tagging | 99 elseif mode == 'tag' then -- tagging |
| 100 | |
| 64 if tag ~= nil and dest ~= nil then | 101 if tag ~= nil and dest ~= nil then |
| 65 local channel = D:SetChannel(dest:match('%a+'), dest:match('%d+')) | 102 -- convert to ID |
| 66 if not D.tags[tag] then | 103 if tonumber(dest) == nil and D.sigID[dest] then |
| 67 D.tags[tag] = {} | 104 dest = db.channels[D.sigID[dest]].index |
| 68 end | 105 end |
| 69 if D.tags[tag][channel.index] then | 106 |
| 70 D.tags[tag][channel.index] = nil | 107 -- make a new channel? |
| 71 D:Print('Removed |cFFFFFF00'..tag..'|r to |cFF00FFFF['..channel.index..', '..channel.signature..']|r') | 108 if not db.channels[dest] then |
| 109 dest = db.max_channel + 1 | |
| 110 D:Print('Creating a new channel for '.. tag) | |
| 111 D:SetChannel(tag, dest) | |
| 112 end | |
| 113 | |
| 114 if db.tags[tag] and db.tags[tag][dest] then | |
| 115 db.tags[tag][dest] = nil | |
| 116 D:Print('Hiding |cFF88FFFF'..tag..'|r messages in |cFFFFFF00'..db.channels[dest].index ..':'.. db.channels[dest].index) | |
| 72 else | 117 else |
| 73 D.tags[tag][channel.index] = channel.index | 118 if not db.tags[tag] then |
| 74 D:Print('Assigning |cFFFFFF00'..tag..'|r to |cFF00FFFF['..channel.index..', '..channel.signature..']|r') | 119 db.tags[tag] = {} |
| 75 end | 120 end |
| 76 | 121 db.tags[tag][dest] = dest |
| 122 D:Print('Showing |cFF88FFFF'..tag..'|r messages in |cFFFFFF00'..db.channels[dest].index ..':'.. db.channels[dest].index) | |
| 123 end | |
| 77 else | 124 else |
| 78 D:Print('Usage: /dvn tag <prefix> <console name or number>') | 125 D:Print('Usage: /dvn tag <prefix> <console name or number>') |
| 79 end | 126 end |
| 80 return | 127 return |
| 81 elseif mode ~= nil then | 128 elseif tonumber(mode) ~= nil or mode == 'save' then |
| 82 mode = tonumber(mode) | 129 -- iterating for something |
| 83 if mode > 2 then | 130 if mode == 'save' then |
| 84 --print('Something has happened.') | 131 if tonumber(tag) == nil then |
| 85 return | 132 T:Print('Save ID is invalid:', tag) |
| 86 end | 133 end |
| 87 list_state = mode == STATE_LOW and STATE_LOW or STATE_HIGH | 134 list_state = tonumber(tag) |
| 88 end | 135 else |
| 136 list_state = tonumber(mode) | |
| 137 db.workspace = list_state | |
| 138 end | |
| 139 elseif mode == nil then | |
| 140 list_state = db.last_workspace and db.last_workspace or 1 | |
| 141 else | |
| 142 return D:PrintHelp() | |
| 143 end | |
| 144 | |
| 145 -- start the iterating | |
| 89 local char_list, global_list = db[PLAYER_REALM][list_state], db.global[list_state] | 146 local char_list, global_list = db[PLAYER_REALM][list_state], db.global[list_state] |
| 90 | |
| 91 local playername = UnitName("player") | 147 local playername = UnitName("player") |
| 92 | 148 |
| 93 for i = 1, GetNumAddOns() do | 149 for i = 1, GetNumAddOns() do |
| 94 local name = GetAddOnInfo(i) | 150 local name = GetAddOnInfo(i) |
| 95 local enableState, globalState = GetAddOnEnableState(playername, i), GetAddOnEnableState(nil, i) | 151 local enableState, globalState = GetAddOnEnableState(playername, i), GetAddOnEnableState(nil, i) |
| 96 | 152 |
| 97 if mode == STATE_LOW or mode == STATE_HIGH then | 153 if mode == 'save' then |
| 98 char_list[name] = enableState | 154 char_list[name] = enableState |
| 99 global_list[name] = globalState | 155 global_list[name] = globalState |
| 100 else | 156 else |
| 101 if char_list[name] or global_list[name] then | 157 if char_list[name] or global_list[name] then |
| 102 | 158 if char_list[name] ~= 0 and global_list[name] ~= 0 then |
| 103 if char_list[name] ~= 0 and global_list[name] ~= 0 then | 159 local value = false |
| 104 local value = false | 160 if char_list[name] == 2 and global_list[name] == 1 then |
| 105 if char_list[name] == 2 and global_list[name] == 1 then | 161 value = UnitName("player") |
| 106 value = UnitName("player") | 162 elseif global_list[name] == 2 then |
| 107 elseif global_list[name] == 2 then | 163 value = true |
| 108 value = true | 164 end |
| 165 --print('EnableAddOn(', i, ',', value,')') | |
| 166 EnableAddOn(i, value) | |
| 167 else | |
| 168 local value = true | |
| 169 if char_list[name] == 2 and global_list[name] == 1 then | |
| 170 value = UnitName("player") | |
| 171 end | |
| 172 --print('DisableAddOn(', i, ',', value,')') | |
| 173 DisableAddOn(i,value) | |
| 109 end | 174 end |
| 110 --print('EnableAddOn(', i, ',', value,')') | |
| 111 EnableAddOn(i, value) | |
| 112 else | 175 else |
| 113 local value = true | 176 if type(db.unlisted) ~= 'table' then |
| 114 if char_list[name] == 2 and global_list[name] == 1 then | 177 db.unlisted = {} |
| 115 value = UnitName("player") | |
| 116 end | 178 end |
| 117 --print('DisableAddOn(', i, ',', value,')') | 179 table.insert(db.unlisted, name) |
| 118 DisableAddOn(i,value) | 180 end |
| 119 end | 181 |
| 120 end | 182 end |
| 121 | 183 end |
| 122 end | 184 |
| 123 end | 185 if mode ~= 'save' then |
| 124 | 186 db.load_message = "AddOn profile ".. list_state .." was loaded." |
| 125 if mode == nil then | |
| 126 ReloadUI() | 187 ReloadUI() |
| 127 end | 188 else |
| 128 if mode == STATE_LOW then | 189 D:Print('Profile #'.. (list_state)..' saved.') |
| 129 D:Print('Developement AddOn list saved.') | 190 if list_state == 1 then |
| 130 else | 191 D:Print('This will be your main AddOn list.') |
| 131 D:Print('Standard AddOn list saved.') | 192 elseif list_state == db.default_list then |
| 193 db.last_workspace = list_state | |
| 194 D:Print('This will be your default workspace') | |
| 195 end | |
| 132 end | 196 end |
| 133 end | 197 end |
| 134 | 198 |
| 135 | 199 |
| 136 local function Console_MinMax(self) | 200 local function Console_MinMax(self) |
| 185 else | 249 else |
| 186 db.height = self:GetHeight() | 250 db.height = self:GetHeight() |
| 187 end | 251 end |
| 188 self:SetHeight(db.height) | 252 self:SetHeight(db.height) |
| 189 end | 253 end |
| 254 | |
| 255 db.dockedTo = self.dockedTo | |
| 256 db.docked = self.docked | |
| 190 | 257 |
| 191 db.minimized = self.minimized and true or nil | 258 db.minimized = self.minimized and true or nil |
| 192 db.enabled = self:IsVisible() and true or nil | 259 db.enabled = self:IsVisible() and true or nil |
| 193 db.active = self.active and true or nil | 260 db.active = self.active and true or nil |
| 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) | 261 --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) |
| 276 | 343 |
| 277 end | 344 end |
| 278 | 345 |
| 279 end | 346 end |
| 280 | 347 |
| 348 local function Console_MouseDown(self, button, up) | |
| 349 if button == 'LeftButton' then | |
| 350 if up then | |
| 351 self:StopMovingOrSizing() | |
| 352 self:ToFront() | |
| 353 self.x = nil | |
| 354 self.y = nil | |
| 355 self.width = nil | |
| 356 self.height = nil | |
| 357 self:Save() | |
| 358 elseif self.out.grip:IsMouseOver() then | |
| 359 self:StartSizing() | |
| 360 else | |
| 361 self:StartMoving() | |
| 362 end | |
| 363 else | |
| 364 if up then | |
| 365 self:MinMax() | |
| 366 end | |
| 367 end | |
| 368 end | |
| 369 local function Console_MouseUp(self, button) | |
| 370 return Console_MouseDown(self, button, true) | |
| 371 end | |
| 372 | |
| 373 --- Creates a Devian-style output. | |
| 374 -- The first argument describes the channel to output on, and the remaining arguments are concatenated in a manner similar to default print() | |
| 375 -- This becomes the print handler when development mode is active. The original print() function is assigned to oldprint(). | |
| 376 -- @param Tag, signature, or numeric index of the channel to output on. Defaults to primary channel. | |
| 377 -- @param ... Output contents. | |
| 378 local function Message(prefix, ...) | |
| 379 if db.enabled == true then | |
| 380 return D.oldprint(prefix, ...) | |
| 381 end | |
| 382 | |
| 383 if prefix == nil then | |
| 384 prefix = 1 | |
| 385 end | |
| 386 | |
| 387 local sendq = {} | |
| 388 local tag, id, tagged | |
| 389 local byName = true | |
| 390 if D.tags[prefix] then | |
| 391 for _, id in pairs(D.tags[prefix]) do | |
| 392 if D.console[id] then | |
| 393 sendq[id] = D.console[id] | |
| 394 tagged = true | |
| 395 end | |
| 396 end | |
| 397 end | |
| 398 | |
| 399 if D.sig[prefix] then | |
| 400 sendq[D.sig[prefix].index] = D.sig[prefix] | |
| 401 elseif D.console[prefix] then | |
| 402 sendq[D.console[prefix]] = D.console[prefix] | |
| 403 elseif not tagged then | |
| 404 sendq[D.primary_channel] = D.console[D.primary_channel] | |
| 405 end | |
| 406 | |
| 407 -- color me timbers | |
| 408 local pcolor | |
| 409 if (not db.tagcolor[prefix]) and byName then | |
| 410 local c = { | |
| 411 math.random(64,255), math.random(64,255), math.random(64,255) | |
| 412 } | |
| 413 if c[1] > 223 and c[2] > 223 and c[3] > 223 then | |
| 414 c[math.random(1,3)] = math.random(64,223) | |
| 415 end | |
| 416 | |
| 417 db.tagcolor[prefix] = string.format('%02X%02X%02X', unpack(c)) | |
| 418 end | |
| 419 pcolor = db.tagcolor[prefix] | |
| 420 | |
| 421 local buffer = {'|cFF'.. pcolor..prefix ..'|r'} | |
| 422 for i = 1, select('#',...) do | |
| 423 local var = select(i, ...) | |
| 424 | |
| 425 if type(var) == 'table' then | |
| 426 if type(var.GetName) == 'function' then | |
| 427 var = '<table:'..var:GetName()..'>' | |
| 428 else | |
| 429 var = '<'..tostring(var)..'>' | |
| 430 end | |
| 431 | |
| 432 elseif type(var) == 'boolean' then | |
| 433 var = var and 'true' or 'false' | |
| 434 elseif type(var) == 'function' then | |
| 435 var = '<funcref>' | |
| 436 elseif type(var) == 'nil' then | |
| 437 var = 'nil' | |
| 438 end | |
| 439 | |
| 440 table.insert(buffer, var) | |
| 441 end | |
| 442 local message = table.concat(buffer, ' ') | |
| 443 for id, channel in pairs(sendq) do | |
| 444 channel.out:AddMessage(message) | |
| 445 end | |
| 446 table.wipe(buffer) | |
| 447 end | |
| 448 | |
| 449 | |
| 281 --- Constructs the frame object for a console channel | 450 --- Constructs the frame object for a console channel |
| 282 -- Initializes the console channel at a specified index. | 451 -- Initializes the console channel at a specified index. |
| 283 -- Configuration data can be overridden by passing a desired settings table. | 452 -- Configuration data can be overridden by passing a desired settings table. |
| 284 -- @param i Numeric index of the channel as it manifests in db.channels | 453 -- @param i Numeric index of the channel as it manifests in db.channels |
| 285 -- @param vars Optional settings table to be used. | 454 -- @param vars Optional settings table to be used. |
| 313 f.format = vars.header | 482 f.format = vars.header |
| 314 f.x = vars.x | 483 f.x = vars.x |
| 315 f.y = vars.y | 484 f.y = vars.y |
| 316 f.width = vars.width | 485 f.width = vars.width |
| 317 f.height = vars.height | 486 f.height = vars.height |
| 318 | 487 f.docked = vars.docked |
| 488 f.dockedTo = vars.dockedTo | |
| 489 | |
| 490 f:SetScript('OnMouseDown', Console_MouseDown) | |
| 491 f:SetScript('OnMouseUp', Console_MouseUp) | |
| 319 if vars.enabled then | 492 if vars.enabled then |
| 320 f.enabled = true | 493 f.enabled = true |
| 321 if db.toggle then | 494 if db.toggle then |
| 322 f:Show() | 495 f:Show() |
| 323 end | 496 end |
| 327 else | 500 else |
| 328 f:Maximize() | 501 f:Maximize() |
| 329 end | 502 end |
| 330 | 503 |
| 331 return f | 504 return f |
| 332 end | |
| 333 | |
| 334 --- Creates a Devian-style output. | |
| 335 -- The first argument describes the channel to output on, and the remaining arguments are concatenated in a manner similar to default print() | |
| 336 -- This becomes the print handler when development mode is active. The original print() function is assigned to oldprint(). | |
| 337 -- @param Tag, signature, or numeric index of the channel to output on. Defaults to primary channel. | |
| 338 -- @param ... Output contents. | |
| 339 local function Message(prefix, ...) | |
| 340 if db.enabled == true then | |
| 341 return D.oldprint(prefix, ...) | |
| 342 end | |
| 343 | |
| 344 if prefix == nil then | |
| 345 prefix = 1 | |
| 346 end | |
| 347 | |
| 348 local sendq = {} | |
| 349 local tag, id, tagged | |
| 350 local byName = true | |
| 351 if D.tags[prefix] then | |
| 352 for _, id in pairs(D.tags[prefix]) do | |
| 353 if D.console[id] then | |
| 354 sendq[id] = D.console[id] | |
| 355 tagged = true | |
| 356 end | |
| 357 end | |
| 358 end | |
| 359 | |
| 360 if D.sig[prefix] then | |
| 361 sendq[D.sig[prefix].index] = D.sig[prefix] | |
| 362 elseif D.console[prefix] then | |
| 363 sendq[D.console[prefix]] = D.console[prefix] | |
| 364 elseif not tagged then | |
| 365 sendq[D.primary_channel] = D.console[D.primary_channel] | |
| 366 end | |
| 367 | |
| 368 -- color me timbers | |
| 369 local pcolor | |
| 370 if (not db.tagcolor[prefix]) and byName then | |
| 371 local c = { | |
| 372 math.random(64,255), math.random(64,255), math.random(64,255) | |
| 373 } | |
| 374 if c[1] > 223 and c[2] > 223 and c[3] > 223 then | |
| 375 c[math.random(1,3)] = math.random(64,223) | |
| 376 end | |
| 377 | |
| 378 db.tagcolor[prefix] = string.format('%02X%02X%02X', unpack(c)) | |
| 379 end | |
| 380 pcolor = db.tagcolor[prefix] | |
| 381 | |
| 382 local buffer = {'|cFF'.. pcolor..prefix ..'|r'} | |
| 383 for i = 1, select('#',...) do | |
| 384 local var = select(i, ...) | |
| 385 | |
| 386 if type(var) == 'table' then | |
| 387 if type(var.GetName) == 'function' then | |
| 388 var = '<table:'..(var:GetName() or '?')..'>' | |
| 389 else | |
| 390 var = '<table>' | |
| 391 end | |
| 392 | |
| 393 elseif type(var) == 'boolean' then | |
| 394 var = var and 'true' or 'false' | |
| 395 elseif type(var) == 'function' then | |
| 396 var = '<funcref>' | |
| 397 elseif type(var) == 'nil' then | |
| 398 var = 'nil' | |
| 399 end | |
| 400 | |
| 401 table.insert(buffer, var) | |
| 402 end | |
| 403 local message = table.concat(buffer, ' ') | |
| 404 for id, channel in pairs(sendq) do | |
| 405 channel.out:AddMessage(message) | |
| 406 end | |
| 407 table.wipe(buffer) | |
| 408 end | |
| 409 | |
| 410 --- Spaces each frame evenly across the screen. | |
| 411 function D:DistributeFrames() -- | |
| 412 --print('frame grid:', max, num_side) | |
| 413 local max = self.num_channels | |
| 414 local num_side = math.ceil(math.sqrt(max)) | |
| 415 local w = GetScreenWidth() / num_side | |
| 416 local h = GetScreenHeight() / num_side | |
| 417 for i, frame in pairs(D.console) do | |
| 418 local dx = (i-1) % num_side | |
| 419 local dy = math.floor((i-1) / num_side) | |
| 420 | |
| 421 --print('move:', frame.signature, 'dx=', dx, 'dy=', dy) | |
| 422 --print('move:', frame.signature, ' x=', dx * w, 'y=', -(dy * h), 'h=', h, 'w=', w) | |
| 423 frame.width = w | |
| 424 frame.height = h | |
| 425 frame.x = dx * w | |
| 426 frame.y = -(dy * h) | |
| 427 frame:Save() | |
| 428 end | |
| 429 | |
| 430 end | |
| 431 | |
| 432 --- Place all frames stacked beneath the primary frame. | |
| 433 function D:StackFrames() | |
| 434 local last | |
| 435 for i, frame in pairs(self.console) do | |
| 436 if last then | |
| 437 frame.x = last.x | |
| 438 frame.y = last.y - 20 | |
| 439 else | |
| 440 frame.x = (GetScreenWidth()-frame:GetWidth())/2 | |
| 441 frame.y = 0 | |
| 442 end | |
| 443 frame:Save() | |
| 444 last = frame | |
| 445 end | |
| 446 end | 505 end |
| 447 | 506 |
| 448 --- Updates a console "channel" entry, generating a new one if necessary. | 507 --- Updates a console "channel" entry, generating a new one if necessary. |
| 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. | 508 -- 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. |
| 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. | 509 -- 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. |
| 451 -- @usage cinfo [, i] | 510 -- @usage cinfo [, i] |
| 452 -- @param cinfo Config variables table, or a string to be used as channel signature | 511 -- @param cinfo Config variables table, or a string to be used as channel signature |
| 453 -- @param i Console index. If valid, settings will be inherited from that channel. | 512 -- @param i Console index. If valid, settings will be inherited from that channel. |
| 454 function D:SetChannel(cinfo, i) | 513 function D:SetChannel(cinfo, i) |
| 455 --print('join:', i , cinfo) | 514 -- try to resolve from arguments |
| 515 local dbvars | |
| 456 local t_info = {} | 516 local t_info = {} |
| 457 local dbvars = db.channels[self.primary_channel] | 517 local channel |
| 458 local signame | 518 local isNew |
| 459 | 519 if type(i) =='number' and db.channels[i] then |
| 520 dbvars = db.channels[i] | |
| 521 elseif type(i) == 'string' and D.sig[i] then | |
| 522 dbvars = db.channels[D.sig[i].index] | |
| 523 else | |
| 524 dbvars = db.channels[db.primary_channel] | |
| 525 isNew = true | |
| 526 end | |
| 527 | |
| 528 --@debug@ | |
| 529 print('setchan(1)', cinfo, i, isNew)--@end-debug@ | |
| 530 | |
| 531 if type(cinfo) == 'string' and not db.sig[cinfo] then | |
| 532 t_info.signature = cinfo | |
| 533 cinfo = {} | |
| 534 elseif type(cinfo) ~= 'table' then | |
| 535 error('Expecting table of string as arg1') | |
| 536 end | |
| 537 | |
| 538 --@debug@ | |
| 539 print('setchan(2)', cinfo, i, isNew)--@end-debug@ | |
| 540 | |
| 541 --TODO: figure out why tag assignments are getting eaten | |
| 460 -- is cinfo a table or signature? | 542 -- is cinfo a table or signature? |
| 461 if type(cinfo) == 'string' then | 543 |
| 462 signame = tostring(cinfo) | 544 |
| 463 t_info.signature = signame | |
| 464 elseif type(cinfo) ~= 'table' then | |
| 465 cinfo = {} | |
| 466 end | |
| 467 | 545 |
| 468 -- did we get a signature string? | 546 -- did we get a signature string? |
| 469 if not (cinfo.signature or t_info.signature) then | 547 if not (cinfo.signature or t_info.signature) then |
| 470 t_info.signature = 'Console' | 548 t_info.signature = 'noname' |
| 471 end | 549 end |
| 472 | 550 |
| 473 -- was an index given? | 551 --@debug@ |
| 474 if D.sigID[t_info.signature] then | 552 print('setchan(3)', cinfo, i, isNew, t_info.signature)--@end-debug@ |
| 475 i = D.sigID[t_info.signature] | 553 -- look for existing sigs |
| 476 -- the signature has one | 554 if D.sig[t_info.signature] then |
| 477 elseif not i then | 555 local sigvar = t_info.signature |
| 478 i = D.num_channels + 1 | 556 local j = 2 |
| 479 t_info.index = i | 557 while D.sig[sigvar] do |
| 480 -- or we need to make a new one | 558 sigvar = sigvar .. j |
| 481 else | 559 j = j + 1 |
| 482 i = tonumber(i) | 560 end |
| 483 -- is it valid? | 561 t_info.signature = sigvar |
| 484 if db.channels[i] then | 562 end |
| 485 dbvars = db.channels[i] | 563 |
| 486 -- that is our base vars | 564 --@debug@ |
| 487 else | 565 print('setchan(4)', cinfo, i, isNew, t_info.signature)--@end-debug@ |
| 488 if D.sig[t_info.signature] then | |
| 489 local sigvar = t_info.signature | |
| 490 local j = 2 | |
| 491 while D.sig[sigvar] do | |
| 492 sigvar = sigvar .. j | |
| 493 j = j + 1 | |
| 494 end | |
| 495 t_info.signature = sigvar | |
| 496 end | |
| 497 | |
| 498 i = D.num_channels + 1 | |
| 499 t_info.index = i | |
| 500 -- make a new index number and fix the signature | |
| 501 end | |
| 502 end | |
| 503 | |
| 504 -- can proceed to fill in from base vars here | 566 -- can proceed to fill in from base vars here |
| 505 for k,v in pairs(dbvars) do | 567 for k,v in pairs(dbvars) do |
| 506 if not t_info[k] then | 568 if not t_info[k] then |
| 507 if cinfo[k] then | 569 if cinfo[k] then |
| 508 t_info[k] = cinfo[k] | 570 t_info[k] = cinfo[k] |
| 571 --@debug@ | |
| 572 print('setchan(5a)', 'cinfo', k)--@end-debug@ | |
| 509 elseif db.channels[self.primary_channel][k] then | 573 elseif db.channels[self.primary_channel][k] then |
| 510 t_info[k] = db.channels[self.primary_channel][k] | 574 t_info[k] = db.channels[self.primary_channel][k] |
| 575 --@debug@ | |
| 576 print('setchan(5b)', 'db', self.primary_channel, k)--@end-debug@ | |
| 511 end | 577 end |
| 512 end | 578 end |
| 513 end | 579 end |
| 514 | 580 |
| 515 -- we're working with a fresh channel right? | 581 -- we're working with a fresh channel right? |
| 516 if not db.channels[i] then | 582 if isNew then |
| 583 i = D.num_channels + 1 | |
| 584 t_info.index = i | |
| 517 t_info.x = t_info.x + 20 | 585 t_info.x = t_info.x + 20 |
| 518 t_info.y = t_info.y - 20 | 586 t_info.y = t_info.y - 20 |
| 519 db.channels[i] = t_info | 587 db.channels[i] = t_info |
| 520 -- set its position just off of the base vars and store it | 588 --@debug@ |
| 589 print('setchan(6)', 'new index', i)--@end-debug@ | |
| 521 end | 590 end |
| 522 | 591 |
| 523 -- can proceed to display something from here | 592 -- can proceed to display something from here |
| 524 if not self.console[i] then | 593 if not self.console[i] then |
| 525 self.console[i] = CreateConsole(i, t_info) | 594 self.console[i] = CreateConsole(i, t_info) |
| 526 -- if it isn't already spawned, create the frame | 595 -- if it isn't already spawned, create the frame |
| 596 --@debug@ | |
| 597 print('setchan(7)', 'new console', i)--@end-debug@ | |
| 527 end | 598 end |
| 528 local channel = self.console[i] | 599 local channel = self.console[i] |
| 529 self.sig[t_info.signature] = channel | 600 self.sig[t_info.signature] = channel |
| 530 self.sigID[t_info.signature] = i | 601 self.sigID[t_info.signature] = i |
| 531 self.IDsig[i] = t_info.signature | 602 self.IDsig[i] = t_info.signature |
| 532 | 603 |
| 604 --@debug@ | |
| 605 print('setchan(8)', 'end', self.sig[t_info.signature], self.sigID[t_info.signature], self.IDsig[i], self.docked)--@end-debug@ | |
| 533 return channel | 606 return channel |
| 607 end | |
| 608 | |
| 609 function D:PrintHelp() | |
| 610 D:Print("|cFFFFFF00/dvn|r", | |
| 611 "\n |cFFFFFF00<number>|r - Loads a saved addon list. List 1 is treated as a gameplay profile and consoles will be disabled by default.") | |
| 612 | |
| 613 D:Print("|cFFFFFF00/resetdvn|r", "- Resets all but profile data SavedVariables.") | |
| 614 D:Print("|cFFFFFF00/cleandvn|r", "- Fully resets SavedVariables, profiles and all.") | |
| 534 end | 615 end |
| 535 | 616 |
| 536 function D:OnEnable() | 617 function D:OnEnable() |
| 537 -- commands | 618 -- commands |
| 538 local cmdlist = { | 619 local cmdlist = { |
| 542 } | 623 } |
| 543 for cmd, func in pairs(cmdlist) do | 624 for cmd, func in pairs(cmdlist) do |
| 544 self:RegisterChatCommand(cmd, func, true) | 625 self:RegisterChatCommand(cmd, func, true) |
| 545 end | 626 end |
| 546 | 627 |
| 547 if db.enabled == true then | 628 if db.workspace == 1 then |
| 548 D:Print('Standard AddOn list active. Type /dvn to switch to development mode.') | 629 D:Print('Gameplay mode active. Print handling turned |cFFFFFF00OFF|r..') |
| 549 else | 630 else |
| 550 D:Print('Development AddOn list active. Type /dvn to revert to regular operation.') | 631 D:Print('Development mode active (list #'..db.workspace..'). Print handling |cFF00FF00ON|r.') |
| 551 end | 632 end |
| 552 | 633 |
| 553 end | 634 end |
| 554 | 635 |
| 555 function D:OnInitialize() | 636 function D:OnInitialize() |
| 556 -- emergency button | 637 -- emergency button |
| 557 self:RegisterChatCommand("cleandvn", function(args) | 638 self:RegisterChatCommand("cleandvn", function(args) |
| 558 DevianDB = nil | 639 DevianDB = nil |
| 559 ReloadUI() | 640 ReloadUI() |
| 560 end) | 641 end) |
| 642 self:RegisterChatCommand("resetdvn", function(args) | |
| 643 for k,v in pairs(DevianDB) do | |
| 644 if k ~= 'global' then | |
| 645 DevianDB[k] = nil | |
| 646 end | |
| 647 end | |
| 648 | |
| 649 for k,v in pairs(defaults) do | |
| 650 DevianDB[k] = v | |
| 651 end | |
| 652 ReloadUI() | |
| 653 end) | |
| 561 | 654 |
| 562 -- savedvars | 655 -- savedvars |
| 563 local cherry = false | 656 local cherry = false |
| 564 if not _G.DevianDB then | 657 if not _G.DevianDB then |
| 565 _G.DevianDB = defaults | 658 _G.DevianDB = defaults |
| 566 cherry = "Type /dvnsave to snapshot your current UI" | |
| 567 end | 659 end |
| 568 db = _G.DevianDB | 660 db = _G.DevianDB |
| 661 self.tags = db.tags | |
| 662 self.channelinfo = db.channels | |
| 569 | 663 |
| 570 if not db[PLAYER_REALM] then | 664 if not db[PLAYER_REALM] then |
| 571 db[PLAYER_REALM] = {[STATE_LOW] = {}, [STATE_HIGH] = {}} | 665 db[PLAYER_REALM] = {[WORKSPACE_ON] = {}, [WORKSPACE_OFF] = {}} |
| 572 if not cherry then | 666 end |
| 573 cherry = "This character didn't have an AddOn table." | 667 |
| 574 end | 668 if db.load_message then |
| 575 end | 669 D:Print(db.load_message) |
| 576 | 670 db.load_message = nil |
| 577 | |
| 578 if not db.tags then | |
| 579 db.tags = {} | |
| 580 end | |
| 581 self.tags = db.tags | |
| 582 if cherry then | |
| 583 D:Print(cherry) | |
| 584 end | 671 end |
| 585 D.oldprint = getprinthandler() | 672 D.oldprint = getprinthandler() |
| 586 if not _G.oldprint then | 673 if not _G.oldprint then |
| 587 _G.oldprint = D.oldprint | 674 _G.oldprint = D.oldprint |
| 588 end | 675 end |
| 589 | 676 |
| 590 --self.raise_ct = 0 | 677 --self.raise_ct = 0 |
| 591 self.last_channel = 0 | 678 self.max_channel = 0 |
| 592 self.num_channels = 0 | 679 self.num_channels = 0 |
| 593 self.console = {} | 680 self.console = {} |
| 594 self.sig = {} | 681 self.sig = {} |
| 595 self.sigID = {} | 682 self.sigID = {} |
| 596 self.IDsig = {} | 683 self.IDsig = {} |
| 598 i = tonumber(i) | 685 i = tonumber(i) |
| 599 if not self.primary_channel then | 686 if not self.primary_channel then |
| 600 self.primary_channel = i | 687 self.primary_channel = i |
| 601 end | 688 end |
| 602 self:SetChannel(cinfo, i) | 689 self:SetChannel(cinfo, i) |
| 603 if i > self.last_channel then | 690 self.max_channel = math.max(i, self.max_channel) |
| 604 self.last_channel = i | |
| 605 end | |
| 606 self.num_channels = self.num_channels + 1 | 691 self.num_channels = self.num_channels + 1 |
| 692 end | |
| 693 | |
| 694 for i, channel in pairs(db.channels) do | |
| 695 if type(channel.docked) == 'table' then | |
| 696 oldprint('docking',i, unpack(channel.docked)) | |
| 697 self.DockFrame(i, unpack(channel.docked)) | |
| 698 end | |
| 607 end | 699 end |
| 608 | 700 |
| 609 if self.console[db.current_channel] then | 701 if self.console[db.current_channel] then |
| 610 self.console[db.current_channel]:ToFront() | 702 self.console[db.current_channel]:ToFront() |
| 611 -- bring the current channel to the front | 703 -- bring the current channel to the front |
| 617 end | 709 end |
| 618 end | 710 end |
| 619 | 711 |
| 620 | 712 |
| 621 -- only do this in dev mode | 713 -- only do this in dev mode |
| 622 if db.enabled == false then | 714 if db.workspace > 1 then |
| 715 | |
| 623 setprinthandler(Message) | 716 setprinthandler(Message) |
| 624 print = function(...) | 717 print = function(...) |
| 625 _G.print('Dvn', ...) | 718 _G.print('Dvn', ...) |
| 626 end | 719 end |
| 627 end | 720 end |
