annotate Devian.lua @ 4:247118593c66

Console interface properly resides in XML, and has been fitted with a sizing widget. Console frame can be moved by clicking and dragging anywhere, and can be minimized by right click. Font paths point to the actual addon tree.
author Nenue
date Fri, 18 Dec 2015 19:48:10 -0500
parents 77adceb8ebe4
children ac644fc860cc
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@0 7 local D = _G.Devian
Nenue@0 8 local STATE_LOW, STATE_HIGH = 1, 2
Nenue@0 9 local PLAYER_REALM = UnitName("player") .. '-' .. GetRealmName()
Nenue@4 10 local DEVIAN_FRAME = DevianConsole
Nenue@4 11 local cherry = false
Nenue@4 12 if not DevianDB then
Nenue@4 13 DevianDB = {
Nenue@4 14 ['global'] = {[STATE_LOW] = {}, [STATE_HIGH] = {}},
Nenue@4 15 console = true,
Nenue@4 16 dnd_status = true,
Nenue@4 17 dnd_message = "Debugging. Your messages may get eaten.",
Nenue@4 18 x = 100,
Nenue@4 19 y = -150,
Nenue@4 20 height = 500,
Nenue@4 21 width = 600,
Nenue@4 22 }
Nenue@4 23 cherry = "This is probably the first time, so:\n /dvn 2 to save your regular addon list\n /dvn 1 to save your development addon list\n /dvn to switch between the two\n /dvc to toggle print() frame"
Nenue@4 24 end
Nenue@4 25 local db = DevianDB
Nenue@4 26
Nenue@4 27 function D:SavePos(x,y)
Nenue@4 28 db.y = DEVIAN_FRAME:GetTop()
Nenue@4 29 db.x = DEVIAN_FRAME:GetLeft()
Nenue@4 30 db.width = DEVIAN_FRAME:GetWidth()
Nenue@4 31 db.height = DEVIAN_FRAME:GetHeight()
Nenue@4 32 end
Nenue@0 33
Nenue@0 34 local ScanAddOnList = function(args)
Nenue@0 35 local list_state
Nenue@0 36
Nenue@0 37 local mode = tonumber(args:match('^%d$'))
Nenue@0 38
Nenue@0 39 print('ScanAddOnList(', mode, ')')
Nenue@0 40 if mode == nil then
Nenue@0 41 list_state = db.enabled and STATE_LOW or STATE_HIGH
Nenue@0 42 db.enabled = (db.enabled == false) and true or false
Nenue@0 43 print(list_state, db.enabled)
Nenue@0 44
Nenue@0 45 if list_state == STATE_LOW then
Nenue@0 46 BNSetDND(true)
Nenue@0 47 end
Nenue@0 48
Nenue@0 49 else
Nenue@0 50 if mode > 2 then
Nenue@0 51 print('ScanAddOnList(',mode,'): Something has happened.')
Nenue@0 52 return
Nenue@0 53 end
Nenue@0 54 list_state = mode == STATE_LOW and STATE_LOW or STATE_HIGH
Nenue@0 55
Nenue@0 56 if not db.chat_size then
Nenue@0 57 db.chat_size = {}
Nenue@0 58 end
Nenue@0 59 if mode == STATE_LOW or mode == STATE_HIGH then
Nenue@0 60 db.chat_size[list_state] = ChatFrame1:GetHeight()
Nenue@0 61 end
Nenue@0 62
Nenue@0 63 end
Nenue@0 64 local char_list, global_list = db[PLAYER_REALM][list_state], db.global[list_state]
Nenue@0 65
Nenue@0 66 local playername = UnitName("player")
Nenue@0 67
Nenue@0 68 for i = 1, GetNumAddOns() do
Nenue@0 69 local name = GetAddOnInfo(i)
Nenue@0 70 local enableState, globalState = GetAddOnEnableState(playername, i), GetAddOnEnableState(nil, i)
Nenue@0 71
Nenue@0 72 if mode == STATE_LOW or mode == STATE_HIGH then
Nenue@0 73 char_list[name] = enableState
Nenue@0 74 global_list[name] = globalState
Nenue@0 75 else
Nenue@0 76
Nenue@0 77 if char_list[name] ~= 0 and global_list[name] ~= 0 then
Nenue@0 78 local value = false
Nenue@0 79 if char_list[name] == 2 and global_list[name] == 1 then
Nenue@0 80 value = UnitName("player")
Nenue@0 81 elseif global_list[name] == 2 then
Nenue@0 82 value = true
Nenue@0 83 end
Nenue@0 84 print('EnableAddOn(', i, ',', value,')')
Nenue@0 85 EnableAddOn(i, value)
Nenue@0 86 else
Nenue@0 87 local value = true
Nenue@0 88 if char_list[name] == 2 and global_list[name] == 1 then
Nenue@0 89 value = UnitName("player")
Nenue@0 90 end
Nenue@0 91 print('DisableAddOn(', i, ',', value,')')
Nenue@0 92 DisableAddOn(i,value)
Nenue@0 93 end
Nenue@0 94
Nenue@0 95 end
Nenue@0 96 end
Nenue@0 97
Nenue@0 98 if mode == nil then
Nenue@0 99 ReloadUI()
Nenue@0 100 end
Nenue@0 101 if mode == STATE_LOW then
Nenue@0 102 D:Print('Developement AddOn list saved.')
Nenue@0 103 else
Nenue@0 104 D:Print('Standard AddOn list saved.')
Nenue@0 105 end
Nenue@0 106 end
Nenue@0 107
Nenue@0 108 -- Debug info
Nenue@0 109 local function CreateMessenger()
Nenue@4 110 if db.console == true then
Nenue@4 111 DEVIAN_FRAME:Show()
Nenue@0 112 end
Nenue@0 113
Nenue@4 114
Nenue@0 115 local f = DEVIAN_FRAME
Nenue@4 116 --[[
Nenue@0 117 f.backdrop = f:CreateTexture('backdrop', 'BACKGROUND')
Nenue@0 118 f.backdrop:SetTexture(1,1,1,1)
Nenue@0 119 f.backdrop:SetGradient('HORIZONTAL', 0.2, 0.2, 0.2, 1, 1, 1)
Nenue@0 120 f.backdrop:SetBlendMode('MOD')
Nenue@0 121 f.backdrop:SetAllPoints(f)
Nenue@0 122 f:AddMessage('init a thing')
Nenue@0 123
Nenue@0 124 f:EnableMouseWheel(true)
Nenue@0 125 f:EnableKeyboard(true)
Nenue@0 126 f:SetScript('OnMouseWheel', function (self, delta)
Nenue@0 127 end)
Nenue@0 128
Nenue@0 129 f:ScrollToBottom()
Nenue@2 130 f:SetMaxLines(500)
Nenue@4 131 --]]
Nenue@4 132 f.console:SetInsertMode('BOTTOM')
Nenue@4 133 f:SetPoint('CENTER', UIParent, 'CENTER', db.x, db.y)
Nenue@4 134 f:SetSize(db.width, db.height)
Nenue@4 135 f:Lower()
Nenue@4 136 f.console:SetFont([[Interface\Addons\Turok\Media\font\SourceCodePro-Regular.ttf]], 13, 'NONE')
Nenue@0 137
Nenue@4 138 f.console:SetFading(false)
Nenue@4 139 f.console:SetTimeVisible(2147483647)
Nenue@4 140 --f:SetJustifyH('LEFT')
Nenue@0 141
Nenue@0 142
Nenue@0 143 D.debug_init = true
Nenue@0 144 end
Nenue@0 145
Nenue@0 146 local prefix_cache = {}
Nenue@0 147 local function Message(prefix, ...)
Nenue@1 148 if prefix == nil then
Nenue@1 149 oldprint('Tried to print nothing.')
Nenue@1 150 return
Nenue@1 151 end
Nenue@0 152 -- colorize
Nenue@0 153 if not prefix_cache[prefix] then
Nenue@0 154 local c = {0, 0, 0 }
Nenue@0 155 local max = string.len(prefix)
Nenue@0 156 for i = 1, max, 3 do
Nenue@0 157 for k, v in ipairs(c) do
Nenue@0 158 local j = i + (k - 1)
Nenue@0 159 c[k] = c[k] + (j <= max and string.byte(prefix,j) or 0)
Nenue@0 160 end
Nenue@0 161 end
Nenue@0 162 for k,v in ipairs(c) do
Nenue@0 163 c[k] = c[k] % 255
Nenue@0 164 if c[k] < 64 then
Nenue@0 165 c[k] = 0
Nenue@0 166 elseif c[k] > 127 then
Nenue@0 167 c[k] = 255
Nenue@0 168 end
Nenue@0 169 end
Nenue@0 170 prefix_cache[prefix] = string.format('%02X%02X%02X', unpack(c))
Nenue@0 171 end
Nenue@0 172
Nenue@0 173 local buffer = {'|cFF'.. prefix_cache[prefix]..prefix ..'|r'}
Nenue@0 174 for i = 1, select('#',...) do
Nenue@0 175 local var = select(i, ...)
Nenue@0 176
Nenue@0 177 if type(var) == 'table' then
Nenue@0 178 var = '<table>'
Nenue@0 179 elseif type(var) == 'boolean' then
Nenue@0 180 var = var and 'true' or 'false'
Nenue@0 181 elseif type(var) == 'function' then
Nenue@0 182 var = '<funcref>'
Nenue@0 183 elseif type(var) == 'nil' then
Nenue@0 184 var = 'nil'
Nenue@0 185 end
Nenue@0 186
Nenue@0 187 table.insert(buffer, var)
Nenue@0 188 end
Nenue@4 189 DEVIAN_FRAME.console:AddMessage(table.concat(buffer, ' '))
Nenue@0 190 table.wipe(buffer)
Nenue@0 191 end
Nenue@0 192
Nenue@0 193 function D:OnEnable()
Nenue@0 194 if db.enabled then
Nenue@0 195 DEVIAN_FRAME:Hide()
Nenue@0 196 D:Print('Standard AddOn list active. Type /dvn to switch to development mode.')
Nenue@0 197 else
Nenue@0 198 D:Print('Development AddOn list active. Type /dvn to revert to regular operation.')
Nenue@0 199 end
Nenue@0 200 end
Nenue@0 201
Nenue@0 202 function D:OnInitialize()
Nenue@0 203
Nenue@0 204 if not db[PLAYER_REALM] then
Nenue@0 205 db[PLAYER_REALM] = {[STATE_LOW] = {}, [STATE_HIGH] = {} }
Nenue@0 206 if not cherry then
Nenue@0 207 cherry = "This character didn't have an AddOn table."
Nenue@0 208 end
Nenue@0 209 end
Nenue@0 210
Nenue@0 211 -- inform the user if we have a virgin data table
Nenue@0 212 if cherry then
Nenue@0 213 D:Print(cherry)
Nenue@0 214 end
Nenue@0 215
Nenue@0 216 -- replace print handler and make the original available in global if possible
Nenue@0 217
Nenue@0 218 CreateMessenger()
Nenue@0 219 D.oldprint = getprinthandler()
Nenue@0 220 if not _G.oldprint then
Nenue@0 221 _G.oldprint = D.oldprint
Nenue@0 222 end
Nenue@0 223 setprinthandler(Message)
Nenue@0 224 self:RegisterChatCommand("dvn", ScanAddOnList)
Nenue@0 225 self:RegisterChatCommand("dvc", function(args)
Nenue@0 226 db.console = (db.console == false) and true or false
Nenue@0 227 if db.console then
Nenue@0 228 DEVIAN_FRAME:Show()
Nenue@0 229 else
Nenue@0 230 DEVIAN_FRAME:Hide()
Nenue@0 231 end
Nenue@0 232 end)
Nenue@0 233
Nenue@0 234 print('Master! I am here.')
Nenue@0 235 end