annotate Devian.lua @ 2:77adceb8ebe4 v1.1

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