Mercurial > wow > devian
comparison UI.lua @ 35:3304455a3f45
code organizing; UI stuff is in the UI script, Devian prime just deals with config and print
corner menu elements placed and hooked, still needs follow-up code
author | Nenue |
---|---|
date | Sun, 27 Dec 2015 03:51:17 -0500 |
parents | |
children | bec37163b7fe |
comparison
equal
deleted
inserted
replaced
34:7441f3bce940 | 35:3304455a3f45 |
---|---|
1 --- ${PACKAGE_NAME} | |
2 -- @file-author@ | |
3 -- @project-revision@ @project-hash@ | |
4 -- @file-revision@ @file-hash@ | |
5 -- Created: 12/27/2015 3:01 AM | |
6 | |
7 | |
8 if not LibStub then | |
9 print('Something has happened...') | |
10 end | |
11 local D = LibStub("AceAddon-3.0"):GetAddon("Devian") | |
12 | |
13 | |
14 | |
15 local DEVIAN_FRAME = 'DevianConsole' | |
16 local DEVIAN_DOCK_FRAME = 'DevianDockFrame' | |
17 local MSG_NEED_DEV_MODE = 'Must be in development mode to use this function.' | |
18 | |
19 | |
20 local function Console_MinMax(self) | |
21 if self.minimized then | |
22 self:Maximize() | |
23 else | |
24 self:Minimize() | |
25 end | |
26 end | |
27 | |
28 local function Console_Minimize(self) | |
29 self:SetHeight(20) | |
30 self:SetMaxResize(GetScreenWidth(),20) | |
31 self.minimized = true | |
32 self.out:Hide() | |
33 self:Save() | |
34 end | |
35 | |
36 local function Console_Maximize(self) | |
37 local db = D.channels[self.index] | |
38 self:SetHeight(db.height) | |
39 self:SetMaxResize(GetScreenWidth(),GetScreenHeight()) | |
40 self.minimized = nil | |
41 self.out:Show() | |
42 self:Save() | |
43 end | |
44 | |
45 | |
46 local function Console_Save(self) | |
47 local db = D.channels[self.index] | |
48 if self.x then | |
49 db.x = self.x | |
50 else | |
51 db.x = self:GetLeft() | |
52 end | |
53 | |
54 if self.y then | |
55 db.y = self.y | |
56 else | |
57 db.y = (self:GetTop() - GetScreenHeight()) | |
58 end | |
59 | |
60 if self.width then | |
61 db.width = self.width | |
62 else | |
63 db.width = self:GetWidth() | |
64 end | |
65 | |
66 if not self.minimized then | |
67 if self.height then | |
68 db.height = self.height | |
69 else | |
70 db.height = self:GetHeight() | |
71 end | |
72 self:SetHeight(db.height) | |
73 end | |
74 | |
75 db.dockedTo = self.dockedTo | |
76 db.docked = self.docked | |
77 | |
78 db.minimized = self.minimized and true or nil | |
79 db.enabled = self:IsVisible() and true or nil | |
80 db.active = self.active and true or nil | |
81 --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) | |
82 self:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', db.x, db.y) | |
83 self:SetWidth(db.width) | |
84 end | |
85 | |
86 -- Console frame toggler | |
87 -- @paramsig [...] | |
88 -- @param ... one or more space-seperated channel keys | |
89 local function Console_Toggle(input) | |
90 local db = D.db | |
91 if db.workspace == 1 then | |
92 return D:Print(MSG_NEED_DEV_MODE) | |
93 end | |
94 local search = {} | |
95 local n = 0 | |
96 if D:GetArgs(input,1) then | |
97 repeat | |
98 key, n = D:GetArgs(input,1,n) | |
99 if D.sig[key] then | |
100 table.insert(search, D.sig[key]) | |
101 elseif D.console[key] then | |
102 table.insert(search, D.console[key]) | |
103 end | |
104 until n == 1e9 | |
105 else | |
106 search = D.console | |
107 end | |
108 | |
109 db.enabled = (not db.enabled) and true or nil | |
110 for i, c in ipairs(search) do | |
111 --print(i,c.index) | |
112 if db.enabled then | |
113 c.enabled = true | |
114 c:Show() | |
115 if db.current_channel == c.index then | |
116 c:ToFront() | |
117 end | |
118 c:Save() | |
119 else | |
120 c:Hide() | |
121 end | |
122 end | |
123 | |
124 if db.enabled then | |
125 D:Print('toggled on?') | |
126 else | |
127 D:Print('toggled off?') | |
128 end | |
129 end | |
130 | |
131 --- Brings the console to the front. | |
132 -- Frame method used to bring a console frame to the front of the display stack. | |
133 local function Console_ToFront(c) | |
134 local db = D.db | |
135 --print(D.raise_ct, 'Raising', c.signature) | |
136 --print(unpack(db.frontdrop)) | |
137 --print(unpack(db.frontgrad)) | |
138 --print(db.frontblend) | |
139 -- D.raise_ct = D.raise_ct + 1 | |
140 c:Raise() | |
141 c:SetAlpha(db.frontalpha) | |
142 c.out.backdrop:SetTexture(unpack(db.frontdrop)) | |
143 c.out.backdrop:SetGradientAlpha(unpack(db.frontgrad)) | |
144 c.out.backdrop:SetBlendMode(db.frontblend) | |
145 db.current_channel = c.index | |
146 | |
147 for _, part in pairs(c.border) do | |
148 part:SetTexture(unpack(db.frontborder)) | |
149 end | |
150 | |
151 for id, bc in pairs(D.console) do | |
152 if id ~= c.index then | |
153 --print(D.raise_ct, 'Lowering', bc.signature) | |
154 --print(unpack(db.backdrop)) | |
155 --print(unpack(db.backgrad)) | |
156 --print(db.backblend) | |
157 bc:SetAlpha(db.backalpha) | |
158 bc.out.backdrop:SetTexture(unpack(db.backdrop)) | |
159 bc.out.backdrop:SetGradientAlpha(unpack(db.backgrad)) | |
160 bc.out.backdrop:SetBlendMode(db.backblend) | |
161 | |
162 for _, part in pairs(bc.border) do | |
163 part:SetTexture(unpack(db.backborder)) | |
164 end | |
165 end | |
166 end | |
167 end | |
168 | |
169 local function Console_MouseDown(self, button, up) | |
170 if button == 'LeftButton' then | |
171 if up then | |
172 self:StopMovingOrSizing() | |
173 self:ToFront() | |
174 self.x = nil | |
175 self.y = nil | |
176 self.width = nil | |
177 self.height = nil | |
178 self:Save() | |
179 elseif self.out.grip:IsMouseOver() then | |
180 self:StartSizing() | |
181 else | |
182 self:StartMoving() | |
183 end | |
184 else | |
185 if up then | |
186 self:MinMax() | |
187 end | |
188 end | |
189 end | |
190 local function Console_MouseUp(self, button) | |
191 return Console_MouseDown(self, button, true) | |
192 end | |
193 print('load check') | |
194 | |
195 | |
196 --- Constructs the frame object for a console channel | |
197 -- Initializes the console channel at a specified index. | |
198 -- Configuration data can be overridden by passing a desired settings table. | |
199 -- @param i Numeric index of the channel as it manifests in db.channels | |
200 -- @param vars Optional settings table to be used. | |
201 local function CreateConsole(i, vars) | |
202 local db = D.db | |
203 if tonumber(i) == nil or math.floor(i) ~= i then | |
204 error('Non-integer index value.') | |
205 end | |
206 if not vars then | |
207 vars = D.channels[i] and D.channels[i] or D.channels[db.primary_channel] | |
208 end | |
209 local f | |
210 if vars.docked then | |
211 f = CreateFrame('Frame','DevianDockFrame' .. i, DEVIAN_DOCK_FRAME) | |
212 else | |
213 f= CreateFrame('Frame', 'DevianChannelFrame' .. i, UIParent, DEVIAN_FRAME) | |
214 end | |
215 --@debug@ | |
216 --print(f:GetName()) | |
217 | |
218 --print('create(2)') | |
219 for k,v in pairs(vars) do | |
220 f[k] = v | |
221 --@debug@ | |
222 print(' f['..type(k)..' '..tostring(k)..'] = '..type(v)..' '..tostring(v)) | |
223 end | |
224 | |
225 f:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', vars.x, vars.y) | |
226 f:SetSize(vars.width, vars.height) | |
227 f:Lower() | |
228 f.out:SetFont(db.font, db.fontsize, db.fontoutline) | |
229 if (db.current_channel == i) then | |
230 f.out.backdrop:SetTexture(unpack(db.frontdrop)) | |
231 else | |
232 f.out.backdrop:SetTexture(unpack(db.backdrop)) | |
233 end | |
234 | |
235 | |
236 | |
237 f.Save = Console_Save | |
238 f.Minimize = Console_Minimize | |
239 f.Maximize = Console_Maximize | |
240 f.MinMax = Console_MinMax | |
241 f.ToFront = Console_ToFront | |
242 f.Toggle = D.Console_Toggle | |
243 f:SetScript('OnMouseDown', Console_MouseDown) | |
244 f:SetScript('OnMouseUp', Console_MouseUp) | |
245 | |
246 if vars.minimized then | |
247 f:Minimize() | |
248 else | |
249 f:Maximize() | |
250 end | |
251 if db.enabled and f.enabled then | |
252 f:Show() | |
253 end | |
254 | |
255 return f | |
256 end | |
257 | |
258 | |
259 --- Updates console information and returns the handle of the channel object that was worked on. | |
260 -- When key is nil or not a valid handle, a new channel is created using whatever signature can be found in cinfo. | |
261 -- The signature can be passed as a string, or as a table entry under the key 'signature' | |
262 -- If the signature of a new channel is also a tag, the channel will be added to that tag | |
263 -- @param cinfo string signature of a new channel, or a table of config variables to be imposed on the channel | |
264 -- @param key string signature or index number of channel to operate on | |
265 -- @usage channel = D:SetChannel('new', nil) -- creates a new channel | |
266 -- @usage channel = D:SetChannel({x = 200, y = 100}, 4) -- updates channel #4 | |
267 function D:SetChannel(cinfo, key) | |
268 local db = self.db | |
269 local t_info = {} | |
270 local channel, isNew, id, sig, t_id | |
271 -- obtain source data | |
272 if tonumber(key) ~= nil and db.channels[key] then | |
273 id = tonumber(key) | |
274 elseif D.sigID[tostring(key)] then | |
275 id = D.sigID[tostring(key)] | |
276 else | |
277 id = db.primary_channel | |
278 isNew = true | |
279 end | |
280 local dbvars = db.channels[id] | |
281 t_id = id -- overridden later if new | |
282 t_info.index = t_id -- | |
283 --@debug@ | |
284 --print('setchan(1) cinfo, key, id=', cinfo, key, id)--@end-debug@ | |
285 | |
286 | |
287 -- obtain config info | |
288 if type(cinfo) == 'string' then | |
289 sig = cinfo | |
290 cinfo = {signature = sig} | |
291 elseif type(cinfo) ~= 'table' then -- stop here if a table wans't passed | |
292 error('Expecting table of string as arg1') | |
293 elseif cinfo.signature then -- new sig | |
294 sig = cinfo.signature | |
295 elseif isNew then -- new channel sig | |
296 sig = 'Ch' | |
297 else -- old sig | |
298 sig = db.channels[id].signature | |
299 end | |
300 t_info.signature = sig | |
301 --@debug@ | |
302 --print('setchan(2) sig,id,isNew=', sig, id, isNew)--@end-debug@ | |
303 | |
304 for k,v in pairs(cinfo) do -- allow all cinfo to pass | |
305 t_info[k] = v | |
306 end | |
307 | |
308 local blocked = { -- ignore these vars: | |
309 ['docked'] = true, -- table | |
310 ['dockedTo'] = true, -- table-related | |
311 ['signature'] = true} -- already determined | |
312 for k,v in pairs(dbvars) do | |
313 if not t_info[k] and not blocked[k] then -- already set or blocked? | |
314 t_info[k] = v | |
315 end | |
316 end | |
317 -- new channel overrides | |
318 if isNew then | |
319 if D.sigID[sig]then -- find a non-clashing signature | |
320 local result, i = sig, 1 | |
321 while D.sigID[result] do | |
322 result = sig .. i | |
323 i = i + 1 | |
324 end | |
325 t_info.signature = result | |
326 end | |
327 t_id = db.max_channel + 1 | |
328 t_info.index = t_id | |
329 --@debug@ | |
330 --print('setchan(3a) isNew, sig, t_info.signature=', isNew, sig, t_info.signature)--@end-debug@ | |
331 else | |
332 --@debug@ | |
333 --print('setchan(3b) isNew, sig, t_info.signature=', isNew, sig, t_info.signature)--@end-debug@ | |
334 end | |
335 | |
336 local channel | |
337 if not self.console[t_id] then -- create a frame | |
338 if isNew then -- position the channel frame | |
339 t_info.x = t_info.x + 20 | |
340 t_info.y = t_info.y - 20 | |
341 db.channels[t_id] = t_info | |
342 --@debug@ | |
343 print('setchan(4a)', 't_id, x, y=', t_id, t_info.x, t_info.y)--@end-debug@ | |
344 end | |
345 channel = CreateConsole(t_id, t_info) | |
346 self.console[t_id] = channel | |
347 self.sig[t_info.signature] = channel | |
348 self.sigID[t_info.signature] = t_id | |
349 self.IDsig[t_id] = t_info.signature | |
350 | |
351 end | |
352 channel = self.console[t_id] | |
353 if channel.minimized then | |
354 channel:Minimize() | |
355 else | |
356 channel:Maximize() | |
357 end | |
358 | |
359 if channel.enabled and db.enabled then -- hide or show last since Min/Max mess with visibility | |
360 print('setchan(5a) enable') | |
361 channel:Show() | |
362 else | |
363 print('setchan(5a) disable') | |
364 channel:Hide() | |
365 end | |
366 --@debug@ | |
367 --print('setchan(end); c:IsVisible(), c.enabled, db.enabled=', channel:IsVisible(), channel.enabled, db.enabled)--@end-debug@ | |
368 return channel | |
369 end |