Mercurial > wow > hotcorners
comparison HotCorners.lua @ 0:fc346da3afd9
First commit Hot Corners standalone.
author | tercio |
---|---|
date | Fri, 08 Aug 2014 12:35:17 -0300 |
parents | |
children | 018fc9f0c471 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:fc346da3afd9 |
---|---|
1 | |
2 LibHotCorners = LibStub ("AceAddon-3.0"):NewAddon ("HotCorners", "AceConsole-3.0", "AceEvent-3.0", "AceTimer-3.0") | |
3 local LibHotCorners = LibHotCorners | |
4 | |
5 local LBD = LibStub ("LibDataBroker-1.1") | |
6 | |
7 local debug = false | |
8 local tinsert = tinsert | |
9 | |
10 local default_db = { | |
11 profile = { | |
12 is_enabled = true, | |
13 topleft_enabled = true, | |
14 quickfunc = false, | |
15 clicks = {}, | |
16 disabled = {} | |
17 }, | |
18 } | |
19 | |
20 function LibHotCorners:OnEnable() | |
21 | |
22 end | |
23 | |
24 function LibHotCorners:OnDisable() | |
25 | |
26 end | |
27 | |
28 local refresh_topleft = function() | |
29 LibHotCorners ["topleft"].is_enabled = LibHotCorners.db.profile.topleft_enabled | |
30 end | |
31 | |
32 local OptionsTable = { | |
33 name = "HotCorners", | |
34 type = "group", | |
35 args = { | |
36 Enabled = { | |
37 type = "toggle", | |
38 name = "Enabled", | |
39 desc = "Enable or Disable this addon.", | |
40 order = 1, | |
41 get = function() return LibHotCorners.db.profile.is_enabled end, | |
42 set = function (self, val) LibHotCorners.db.profile.is_enabled = not LibHotCorners.db.profile.is_enabled; --[[ do something]] end, | |
43 }, | |
44 TopLeftEnabled = { | |
45 type = "toggle", | |
46 name = "Top Left", | |
47 desc = "Enable or Disable the Top Left bar.", | |
48 order = 2, | |
49 get = function() return LibHotCorners.db.profile.topleft_enabled end, | |
50 set = function (self, val) LibHotCorners.db.profile.topleft_enabled = not LibHotCorners.db.profile.topleft_enabled; refresh_topleft() end, | |
51 }, | |
52 } | |
53 } | |
54 | |
55 function LibHotCorners:OnInitialize() | |
56 | |
57 --declarar primeiro o db usando a global que é declarada no toc. | |
58 self.db = LibStub ("AceDB-3.0"):New ("HotCornersDB", default_db, true) | |
59 | |
60 --declara agora as opções da tab raiz | |
61 LibStub("AceConfig-3.0"):RegisterOptionsTable ("HotCorners", OptionsTable) | |
62 LibHotCorners.OptionsFrame1 = LibStub ("AceConfigDialog-3.0"):AddToBlizOptions ("HotCorners", "HotCorners") | |
63 --sub tab | |
64 LibStub ("AceConfig-3.0"):RegisterOptionsTable ("HotCorners-Profiles", LibStub ("AceDBOptions-3.0"):GetOptionsTable (self.db)) | |
65 LibHotCorners.OptionsFrame2 = LibStub ("AceConfigDialog-3.0"):AddToBlizOptions ("HotCorners-Profiles", "Profiles", "HotCorners") | |
66 | |
67 LibHotCorners ["topleft"].is_enabled = self.db.topleft_enabled | |
68 refresh_topleft() | |
69 | |
70 SLASH_HOTCORNER1, SLASH_HOTCORNER2 = "/hotcorners", "/hotcorner" | |
71 function SlashCmdList.HOTCORNER (msg, editbox) | |
72 HotCornersOpenOptions (self); | |
73 end | |
74 | |
75 for name, dataobj in LBD:DataObjectIterator() do | |
76 if (dataobj.type and dataobj.icon and dataobj.OnClick) then | |
77 LibHotCorners:RegisterHotCornerButton (name, "TopLeft", nil, name .. "HotCornerLauncher", dataobj.icon, dataobj.OnTooltipShow, dataobj.OnClick, nil, nil, dataobj.OnEnter, dataobj.OnLeave) | |
78 end | |
79 end | |
80 for k, v in pairs (LBD.attributestorage) do | |
81 --print (k, v) | |
82 --print ("----------------") | |
83 --vardump (v) | |
84 end | |
85 | |
86 end | |
87 | |
88 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | |
89 --> main function | |
90 | |
91 LibHotCorners.embeds = LibHotCorners.embeds or {} | |
92 local embed_functions = { | |
93 "RegisterHotCornerButton", | |
94 "HideHotCornerButton", | |
95 "QuickHotCornerEnable" | |
96 } | |
97 | |
98 function LibHotCorners:Embed (target) | |
99 for k, v in pairs (embed_functions) do | |
100 target[v] = self[v] | |
101 end | |
102 self.embeds [target] = true | |
103 return target | |
104 end | |
105 | |
106 local CallbackHandler = LibStub:GetLibrary ("CallbackHandler-1.0") | |
107 LibHotCorners.callbacks = LibHotCorners.callbacks or CallbackHandler:New (LibHotCorners) | |
108 | |
109 LibHotCorners.topleft = LibHotCorners.topleft or {widgets = {}, quickclick = false, is_enabled = false, map = {}} | |
110 LibHotCorners.bottomleft = {} | |
111 LibHotCorners.topright = {} | |
112 LibHotCorners.bottomright = {} | |
113 | |
114 local function test (corner) | |
115 assert (corner == "topleft" or corner == "bottomleft" or corner == "topright" or corner == "bottomright", "LibHotCorners:RegisterAddon expects a corner on #1 argument.") | |
116 end | |
117 | |
118 function LibHotCorners:RegisterHotCornerButton (name, corner, savedtable, fname, icon, tooltip, clickfunc, menus, quickfunc, onenter, onleave, is_install) | |
119 corner = string.lower (corner) | |
120 test (corner) | |
121 | |
122 if (is_install) then | |
123 --> overwrite if already exists a widget | |
124 for i, widget in ipairs (LibHotCorners [corner]) do | |
125 if (widget.name == name) then | |
126 table.remove (LibHotCorners [corner], i) | |
127 table.insert (LibHotCorners [corner], i, {name = name, fname = fname, savedtable = savedtable, icon = icon, tooltip = tooltip, click = clickfunc, menus = menus, quickfunc = quickfunc, onenter = onenter, onleave = onleave, is_install = true}) | |
128 return LibHotCorners [corner].map [name] | |
129 end | |
130 end | |
131 | |
132 table.insert (LibHotCorners [corner], {name = name, fname = fname, savedtable = savedtable, icon = icon, tooltip = tooltip, click = clickfunc, menus = menus, quickfunc = quickfunc, onenter = onenter, onleave = onleave, is_install = true}) | |
133 LibHotCorners [corner].map [name] = #LibHotCorners [corner] | |
134 return LibHotCorners [corner].map [name] | |
135 else | |
136 tinsert (LibHotCorners [corner], {name = name, fname = fname, savedtable = savedtable, icon = icon, tooltip = tooltip, click = clickfunc, menus = menus, quickfunc = quickfunc, onenter = onenter, onleave = onleave}) | |
137 LibHotCorners [corner].map [name] = #LibHotCorners [corner] | |
138 return LibHotCorners [corner].map [name] | |
139 end | |
140 end | |
141 | |
142 function LibHotCorners:QuickHotCornerEnable (name, corner, value) | |
143 | |
144 corner = string.lower (corner) | |
145 test (corner) | |
146 | |
147 local corner_table = LibHotCorners [corner] | |
148 local addon_table = corner_table [corner_table.map [name]] | |
149 | |
150 addon_table.savedtable [corner .. "_quickclick"] = value | |
151 | |
152 if (value and addon_table.quickfunc) then | |
153 corner_table.quickfunc = addon_table.quickfunc | |
154 else | |
155 local got = false | |
156 for index, button_table in ipairs (corner_table) do | |
157 if (button_table.savedtable.quickclick) then | |
158 corner_table.quickfunc = button_table.quickfunc | |
159 got = true | |
160 break | |
161 end | |
162 end | |
163 | |
164 if (not got) then | |
165 corner_table.quickfunc = nil | |
166 end | |
167 end | |
168 end | |
169 | |
170 function LibHotCorners:HideHotCornerButton (name, corner, value) | |
171 | |
172 corner = string.lower (corner) | |
173 test (corner) | |
174 | |
175 local corner_table = LibHotCorners [corner] | |
176 local addon_table = corner_table [corner_table.map [name]] | |
177 | |
178 addon_table.savedtable.hide = value | |
179 | |
180 --print (LibHotCorners, corner) | |
181 LibHotCorners [corner].is_enabled = false | |
182 | |
183 for index, button_table in ipairs (corner_table) do | |
184 if (not button_table.savedtable.hide) then | |
185 LibHotCorners [corner].is_enabled = true | |
186 break | |
187 end | |
188 end | |
189 | |
190 return true | |
191 end | |
192 | |
193 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | |
194 --> data broker stuff | |
195 function LibHotCorners:DataBrokerCallback (event, name, dataobj) | |
196 if (not name or not dataobj or not dataobj.type) then | |
197 return | |
198 end | |
199 if (dataobj.icon and dataobj.OnClick) then | |
200 LibHotCorners:RegisterHotCornerButton (name, "TopLeft", nil, name .. "HotCornerLauncher", dataobj.icon, dataobj.OnTooltipShow, dataobj.OnClick, nil, nil, dataobj.OnEnter, dataobj.OnLeave) | |
201 end | |
202 end | |
203 LBD.RegisterCallback (LibHotCorners, "DataBrokerCallback") | |
204 | |
205 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | |
206 --> scripts | |
207 | |
208 --> background (window mode fix) | |
209 function HotCornersBackgroundOnEnter (self) | |
210 if (LibHotCornersTopLeft and LibHotCornersTopLeft:IsShown()) then | |
211 if (LibHotCornersTopLeft:GetWidth() > 2) then | |
212 HotCornersOnLeave (LibHotCornersTopLeft) | |
213 end | |
214 end | |
215 self:EnableMouse (false) | |
216 end | |
217 | |
218 --> set size | |
219 local function set_size (self) | |
220 if (self.position == "topleft" or self.position == "topright") then | |
221 self:SetSize (40, GetScreenHeight()) | |
222 else | |
223 self:SetSize (GetScreenWidth(), 40) | |
224 end | |
225 end | |
226 | |
227 --> show tooltip | |
228 local show_tooltip = function (self) | |
229 if (self.table.tooltip) then | |
230 if (type (self.table.tooltip) == "function") then | |
231 GameTooltip:SetOwner (self, "ANCHOR_RIGHT") | |
232 self.table.tooltip (GameTooltip) | |
233 GameTooltip:Show() | |
234 elseif (type (self.table.tooltip) == "string") then | |
235 GameTooltip:SetOwner (self, "ANCHOR_RIGHT") | |
236 GameTooltip:AddLine (self.table.tooltip) | |
237 GameTooltip:Show() | |
238 end | |
239 elseif (self.table.onenter) then | |
240 self.table.onenter (self) | |
241 end | |
242 end | |
243 | |
244 --> corner frame on enter | |
245 local more_clicked = function (t1, t2) | |
246 return t1[1] > t2[1] | |
247 end | |
248 | |
249 function HotCornersOnEnter (self) | |
250 | |
251 if (not LibHotCorners.db.profile.is_enabled) then | |
252 return | |
253 end | |
254 | |
255 if (not LibHotCorners.db.profile [self.position .. "_enabled"]) then | |
256 return | |
257 end | |
258 | |
259 set_size (self) | |
260 | |
261 HotCornersBackgroundFrame:EnableMouse (true) | |
262 | |
263 local i = 1 | |
264 | |
265 local sort = {} | |
266 local clicks = LibHotCorners.db.profile.clicks | |
267 for index, button_table in ipairs (LibHotCorners [self.position]) do | |
268 tinsert (sort, {clicks [button_table.name] or 0, button_table}) | |
269 end | |
270 table.sort (sort, more_clicked) | |
271 | |
272 local last_button | |
273 | |
274 local disabled = LibHotCorners.db.profile.disabled | |
275 | |
276 for index, button_table in ipairs (sort) do | |
277 button_table = button_table [2] | |
278 if (not button_table.widget) then | |
279 LibHotCorners:CreateAddonWidget (self, button_table, index, self.position) | |
280 end | |
281 | |
282 button_table.widget:ClearAllPoints() | |
283 | |
284 if (not disabled [button_table.name]) then | |
285 if (self.position == "topleft" or self.position == "topright") then | |
286 local y = i * 35 * -1 | |
287 button_table.widget:SetPoint ("topleft", self, "topleft", 4, y) | |
288 button_table.widget.y = y | |
289 else | |
290 local x = i * 35 | |
291 button_table.widget:SetPoint ("topleft", self, "topleft", x, -4) | |
292 button_table.widget.x = x | |
293 end | |
294 | |
295 button_table.widget:Show() | |
296 last_button = button_table.widget | |
297 | |
298 i = i + 1 | |
299 else | |
300 button_table.widget:Hide() | |
301 end | |
302 end | |
303 | |
304 local OptionsButton = LibHotCorners [self.position].optionsbutton | |
305 local y = i * 35 * -1 | |
306 OptionsButton:SetPoint ("top", self, "top", 0, y) | |
307 OptionsButton:Show() | |
308 | |
309 end | |
310 | |
311 --> corner frame on leave | |
312 function HotCornersOnLeave (self) | |
313 self:SetSize (1, 1) | |
314 for index, button_table in ipairs (LibHotCorners [self.position]) do | |
315 button_table.widget:Hide() | |
316 end | |
317 local OptionsButton = LibHotCorners [self.position].optionsbutton | |
318 OptionsButton:Hide() | |
319 end | |
320 | |
321 --> quick corner on click | |
322 function HotCornersOnQuickClick (self, button) | |
323 local parent_position = self:GetParent().position | |
324 if (LibHotCorners [parent_position].quickfunc) then | |
325 LibHotCorners [parent_position].quickfunc (self, button) | |
326 end | |
327 end | |
328 | |
329 --> options button onenter | |
330 function HotCornersOptionsButtonOnEnter (self) | |
331 set_size (self:GetParent()) | |
332 for index, button_table in ipairs (LibHotCorners [self:GetParent().position]) do | |
333 if (not LibHotCorners.db.profile.disabled [button_table.name]) then | |
334 button_table.widget:Show() | |
335 end | |
336 end | |
337 self:Show() | |
338 end | |
339 | |
340 function HotCornersOpenOptions (self) | |
341 InterfaceOptionsFrame_OpenToCategory ("HotCorners") | |
342 InterfaceOptionsFrame_OpenToCategory ("HotCorners") | |
343 end | |
344 | |
345 function HotCornersSetEnabled (state) | |
346 LibHotCorners.db.profile.is_enabled = state | |
347 end | |
348 | |
349 --> options button onleave | |
350 function HotCornersOptionsButtonOnLeave (self) | |
351 self:GetParent():GetScript("OnLeave")(self:GetParent()) | |
352 end | |
353 | |
354 --> button onenter | |
355 function HotCornersButtonOnEnter (self) | |
356 set_size (self:GetParent()) | |
357 for index, button_table in ipairs (LibHotCorners [self:GetParent().position]) do | |
358 if (not LibHotCorners.db.profile.disabled [button_table.name]) then | |
359 button_table.widget:Show() | |
360 end | |
361 end | |
362 show_tooltip (self) | |
363 local OptionsButton = LibHotCorners [self:GetParent().position].optionsbutton | |
364 OptionsButton:Show() | |
365 end | |
366 | |
367 --> button onleave | |
368 function HotCornersButtonOnLeave (self) | |
369 GameTooltip:Hide() | |
370 if (self.table.onleave) then | |
371 self.table.onleave (self) | |
372 end | |
373 self:GetParent():GetScript("OnLeave")(self:GetParent()) | |
374 local OptionsButton = LibHotCorners [self:GetParent().position].optionsbutton | |
375 OptionsButton:Hide() | |
376 end | |
377 | |
378 --> button onmousedown | |
379 function HotCornersButtonOnMouseDown (self, button) | |
380 if (self:GetParent().position == "topleft" or self:GetParent().position == "topright") then | |
381 self:SetPoint ("topleft", self:GetParent(), "topleft", 5, self.y - 1) | |
382 else | |
383 self:SetPoint ("topleft", self:GetParent(), "topleft", self.x+1, -6) | |
384 end | |
385 end | |
386 | |
387 --> button onmouseup | |
388 function HotCornersButtonOnMouseUp (self, button) | |
389 if (self:GetParent().position == "topleft" or self:GetParent().position == "topright") then | |
390 self:SetPoint ("topleft", self:GetParent(), "topleft", 4, self.y) | |
391 else | |
392 self:SetPoint ("topleft", self:GetParent(), "topleft", self.x, -4) | |
393 end | |
394 if (self.table.click) then | |
395 local clicks = LibHotCorners.db.profile.clicks | |
396 clicks [self.table.name] = clicks [self.table.name] or 0 | |
397 clicks [self.table.name] = clicks [self.table.name] + 1 | |
398 self.table.click (self, button) | |
399 end | |
400 end | |
401 | |
402 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | |
403 --> create top left corner | |
404 | |
405 local TopLeftCorner = CreateFrame ("Frame", "LibHotCornersTopLeft", nil, "HotCornersFrameCornerTemplate") | |
406 TopLeftCorner:SetPoint ("topleft", UIParent, "topleft", 0, 0) | |
407 TopLeftCorner.position = "topleft" | |
408 | |
409 --fast corner button | |
410 local QuickClickButton = CreateFrame ("button", "LibHotCornersTopLeftFastButton", TopLeftCorner, "HotCornersQuickCornerButtonTemplate") | |
411 | |
412 --options button | |
413 local OptionsButton = CreateFrame ("button", "LibHotCornersTopLeftOptionsButton", TopLeftCorner, "HotCornersOptionsButtonTemplate") | |
414 | |
415 if (debug) then | |
416 QuickClickButton:SetSize (20, 20) | |
417 QuickClickButton:SetBackdrop ({bgFile = [[Interface\DialogFrame\UI-DialogBox-Gold-Background]], tile = true, tileSize = 40}) | |
418 QuickClickButton:SetBackdropColor (1, 0, 0, 1) | |
419 end | |
420 | |
421 LibHotCorners.topleft.quickbutton = QuickClickButton | |
422 LibHotCorners.topleft.optionsbutton = OptionsButton | |
423 | |
424 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | |
425 --> buttons | |
426 | |
427 function LibHotCorners:CreateAddonWidget (frame, button_table, index, side) | |
428 | |
429 --> create the button | |
430 local button = CreateFrame ("button", "LibHotCorners" .. side .. button_table.fname, frame, "HotCornersButtonTemplate") | |
431 | |
432 --> write some attributes | |
433 button.index = index | |
434 button.table = button_table | |
435 button.parent = frame | |
436 button_table.widget = button | |
437 | |
438 --> set the icon | |
439 button:SetNormalTexture (button_table.icon) | |
440 button:SetHighlightTexture (button_table.icon) | |
441 | |
442 if (string.lower (button_table.icon):find ([[\icons\]])) then | |
443 button:GetNormalTexture():SetTexCoord (0.078125, 0.9375, 0.078125, 0.9375) | |
444 button:GetHighlightTexture():SetTexCoord (0.078125, 0.9375, 0.078125, 0.9375) | |
445 end | |
446 | |
447 return button | |
448 end |