annotate Devian.lua @ 7:d0cd0e68213e v1.2-r7

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