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 |