Mercurial > wow > reaction
comparison libs/FuBarPlugin-2.0/FuBarPlugin-2.0.lua @ 1:c11ca1d8ed91
Version 0.1
author | Flick <flickerstreak@gmail.com> |
---|---|
date | Tue, 20 Mar 2007 21:03:57 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:4e2ce2894c21 | 1:c11ca1d8ed91 |
---|---|
1 --[[ | |
2 Name: FuBarPlugin-2.0 | |
3 Revision: $Rev: 19941 $ | |
4 Author: Cameron Kenneth Knight (ckknight@gmail.com) | |
5 Website: http://wiki.wowace.com/index.php/FuBarPlugin-2.0 | |
6 Documentation: http://wiki.wowace.com/index.php/FuBarPlugin-2.0 | |
7 SVN: svn://svn.wowace.com/root/branches/FuBar/FuBarPlugin-2.0/FuBarPlugin-2.0/ | |
8 Description: Plugin for FuBar. | |
9 Dependencies: AceLibrary, AceOO-2.0, AceEvent-2.0, Tablet-2.0, Dewdrop-2.0 | |
10 ]] | |
11 | |
12 local MAJOR_VERSION = "FuBarPlugin-2.0" | |
13 local MINIMAPCONTAINER_MAJOR_VERSION = "FuBarPlugin-MinimapContainer-2.0" | |
14 local MINOR_VERSION = "$Revision: 19941 $" | |
15 | |
16 -- This ensures the code is only executed if the libary doesn't already exist, or is a newer version | |
17 if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary.") end | |
18 if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end | |
19 | |
20 if not AceLibrary:HasInstance("AceOO-2.0") then error(MAJOR_VERSION .. " requires AceOO-2.0.") end | |
21 | |
22 local AceEvent = AceLibrary:HasInstance("AceEvent-2.0") and AceLibrary("AceEvent-2.0") | |
23 local Tablet = AceLibrary:HasInstance("Tablet-2.0") and AceLibrary("Tablet-2.0") | |
24 local Dewdrop = AceLibrary:HasInstance("Dewdrop-2.0") and AceLibrary("Dewdrop-2.0") | |
25 | |
26 local epsilon = 1e-5 | |
27 local _G = getfenv(0) | |
28 | |
29 local SHOW_ICON = "Show icon" | |
30 local SHOW_ICON_DESC = "Show the plugins icon on the panel." | |
31 local SHOW_TEXT = "Show text" | |
32 local SHOW_TEXT_DESC = "Show the plugins text on the panel." | |
33 local SHOW_COLORED_TEXT = "Show colored text" | |
34 local SHOW_COLORED_TEXT_DESC = "Allow the plugin to color its text." | |
35 local DETACH_TOOLTIP = "Detach tooltip" | |
36 local DETACH_TOOLTIP_DESC = "Detach the tooltip from the panel." | |
37 local LOCK_TOOLTIP = "Lock tooltip" | |
38 local LOCK_TOOLTIP_DESC = "Lock the tooltips position. When the tooltip is locked, you must use Alt to access it with your mouse." | |
39 local POSITION = "Position" | |
40 local POSITION_DESC = "Position the plugin on the panel." | |
41 local POSITION_LEFT = "Left" | |
42 local POSITION_RIGHT = "Right" | |
43 local POSITION_CENTER = "Center" | |
44 local ATTACH_TO_MINIMAP = "Attach to minimap" | |
45 local ATTACH_TO_MINIMAP_DESC = "Attach the plugin to the minimap instead of the panel." | |
46 local HIDE_FUBAR_PLUGIN = "Hide plugin" | |
47 local HIDE_FUBAR_PLUGIN_CMD = "Hidden" | |
48 local HIDE_FUBAR_PLUGIN_DESC = "Hide the plugin from the panel or minimap, leaving the addon running." | |
49 local OTHER = "Other" | |
50 local CLOSE = "Close" | |
51 local CLOSE_DESC = "Close the menu." | |
52 | |
53 if GetLocale() == "koKR" then | |
54 SHOW_ICON = "아이콘 표시" | |
55 SHOW_ICON_DESC = "패널에 플러그인 아이콘을 표시합니다." | |
56 SHOW_TEXT = "텍스트 표시" | |
57 SHOW_TEXT_DESC = "페널에 플러그인 텍스트를 표시합니다." | |
58 SHOW_COLORED_TEXT = "색상화된 텍스트 표시" | |
59 SHOW_COLORED_TEXT_DESC = "플러그인의 텍스트 색상을 허용합니다." | |
60 DETACH_TOOLTIP = "툴팁 분리" | |
61 DETACH_TOOLTIP_DESC = "패널에서 툴팁을 분리 합니다." | |
62 LOCK_TOOLTIP = "툴팁 고정" | |
63 LOCK_TOOLTIP_DESC = "툴팁 위치를 고정합니다." | |
64 POSITION = "위치" | |
65 POSITION_DESC = "패널에서 플러그인의 위치를 설정합니다." | |
66 POSITION_LEFT = "왼쪽" | |
67 POSITION_RIGHT = "오른쪽" | |
68 POSITION_CENTER = "가운데" | |
69 ATTACH_TO_MINIMAP = "미니맵에 표시" | |
70 ATTACH_TO_MINIMAP_DESC = "플러그인을 패널 대신 미니맵에 표시합니다." | |
71 HIDE_FUBAR_PLUGIN = "FuBar 플러그인 숨기기" | |
72 HIDE_FUBAR_PLUGIN_CMD = "숨겨짐" | |
73 HIDE_FUBAR_PLUGIN_DESC = "패널에서 플러그인을 숨깁니다." | |
74 OTHER = "기타" | |
75 CLOSE = "닫기" | |
76 CLOSE_DESC = "메뉴 닫기." | |
77 elseif GetLocale() == "deDE" then | |
78 SHOW_ICON = "Zeige Icon" | |
79 SHOW_ICON_DESC = "Zeige das Plugin-Icon auf der Leiste." | |
80 SHOW_TEXT = "Zeige Text" | |
81 SHOW_TEXT_DESC = "Zeige den Plugin-Text auf der Leiste." | |
82 SHOW_COLORED_TEXT = "Zeige gef\195\164rbten Text" | |
83 SHOW_COLORED_TEXT_DESC = "Dem Plugin erlauben sein Text zu f\195\164rben." | |
84 DETACH_TOOLTIP = "Tooltip l\195\182sen" | |
85 DETACH_TOOLTIP_DESC = "Tooltip von der Leiste l\195\182sen." | |
86 LOCK_TOOLTIP = "Tooltip sperren" | |
87 LOCK_TOOLTIP_DESC = "Tooltip an der Position sperren." | |
88 POSITION = "Position" | |
89 POSITION_DESC = "Positioniert das Plugin auf der Leiste." | |
90 POSITION_LEFT = "Links" | |
91 POSITION_RIGHT = "Rechts" | |
92 POSITION_CENTER = "Mitte" | |
93 ATTACH_TO_MINIMAP = "An der Minimap anbringen" | |
94 ATTACH_TO_MINIMAP_DESC = "Bringt das Plugin an der Minimap anstelle der Leiste an." | |
95 HIDE_FUBAR_PLUGIN = "Versteckt das FuBar Plugin" | |
96 HIDE_FUBAR_PLUGIN_CMD = "Verstecken" | |
97 HIDE_FUBAR_PLUGIN_DESC = "Versteckt das Plugin von der Leiste." | |
98 elseif GetLocale() == "frFR" then | |
99 SHOW_ICON = "Afficher l'ic\195\180ne" | |
100 SHOW_ICON_DESC = "Afficher l'ic\195\180ne du plugin sur le panneau." | |
101 SHOW_TEXT = "Afficher le texte" | |
102 SHOW_TEXT_DESC = "Afficher le texte du plugin sur le panneau." | |
103 SHOW_COLORED_TEXT = "Afficher la couleur du texte" | |
104 SHOW_COLORED_TEXT_DESC = "Permet au plugin de colorer le texte." | |
105 DETACH_TOOLTIP = "D\195\169tacher le tooltip" | |
106 DETACH_TOOLTIP_DESC = "Permet de d\195\169tacher le tooltip du panneau." | |
107 LOCK_TOOLTIP = "Bloquer le tooltip" | |
108 LOCK_TOOLTIP_DESC = "Permet de bloquer le tooltip \195\160 sa position actuelle. Une fois le tooltip bloqu\195\169, vous devez utiliser la touche Alt pour le d\195\169placer avec votre souris." | |
109 POSITION = "Position" | |
110 POSITION_DESC = "Permet de changer la position du plugin dans le panneau." | |
111 POSITION_LEFT = "Gauche" | |
112 POSITION_RIGHT = "Droite" | |
113 POSITION_CENTER = "Centre" | |
114 ATTACH_TO_MINIMAP = "Attacher \195\160 la minicarte" | |
115 ATTACH_TO_MINIMAP_DESC = "Attache l'ic\195\180ne du plugin \195\160 la minicarte." | |
116 HIDE_FUBAR_PLUGIN = "Masquer le plugin" | |
117 HIDE_FUBAR_PLUGIN_CMD = "Masqu\195\169" | |
118 HIDE_FUBAR_PLUGIN_DESC = "Permet de masquer compl\195\168tement le plugin du panneau, mais laisse l'addon fonctionner." | |
119 OTHER = "Autre" | |
120 CLOSE = "Fermer" | |
121 CLOSE_DESC = "Ferme le menu." | |
122 elseif GetLocale() == "zhCN" then | |
123 SHOW_ICON = "显示图标" | |
124 SHOW_ICON_DESC = "在面板上显示插件图标." | |
125 SHOW_TEXT = "显示文字" | |
126 SHOW_TEXT_DESC = "在面板上显示文字标题." | |
127 SHOW_COLORED_TEXT = "显示彩色文字" | |
128 SHOW_COLORED_TEXT_DESC = "允许插件显示彩色文字." | |
129 DETACH_TOOLTIP = "独立提示信息" | |
130 DETACH_TOOLTIP_DESC = "从面板上独立提示信息." | |
131 LOCK_TOOLTIP = "锁定提示信息" | |
132 LOCK_TOOLTIP_DESC = "锁定提示信息位置." | |
133 POSITION = "位置" | |
134 POSITION_DESC = "插件在面板上的位置." | |
135 POSITION_LEFT = "居左" | |
136 POSITION_RIGHT = "居右" | |
137 POSITION_CENTER = "居中" | |
138 ATTACH_TO_MINIMAP = "依附在小地图" | |
139 ATTACH_TO_MINIMAP_DESC = "插件图标依附在小地图而不显示在面板上." | |
140 HIDE_FUBAR_PLUGIN = "隐藏FuBar插件" | |
141 HIDE_FUBAR_PLUGIN_CMD = "Hidden" | |
142 HIDE_FUBAR_PLUGIN_DESC = "在面板上隐藏该插件." | |
143 elseif GetLocale() == "zhTW" then | |
144 SHOW_ICON = "顯示圖示" | |
145 SHOW_ICON_DESC = "在面板上顯示插件圖示。" | |
146 SHOW_TEXT = "顯示文字" | |
147 SHOW_TEXT_DESC = "在面板上顯示文字標題。" | |
148 SHOW_COLORED_TEXT = "顯示彩色文字" | |
149 SHOW_COLORED_TEXT_DESC = "允許插件顯示彩色文字。" | |
150 DETACH_TOOLTIP = "獨立提示訊息" | |
151 DETACH_TOOLTIP_DESC = "從面板上獨立提示訊息。" | |
152 LOCK_TOOLTIP = "鎖定提示訊息" | |
153 LOCK_TOOLTIP_DESC = "鎖定提示訊息位置。" | |
154 POSITION = "位置" | |
155 POSITION_DESC = "插件在面板上的位置。" | |
156 POSITION_LEFT = "靠左" | |
157 POSITION_RIGHT = "靠右" | |
158 POSITION_CENTER = "置中" | |
159 ATTACH_TO_MINIMAP = "依附在小地圖" | |
160 ATTACH_TO_MINIMAP_DESC = "插件圖標依附在小地圖而不顯示在面板上。" | |
161 HIDE_FUBAR_PLUGIN = "隱藏FuBar插件" | |
162 HIDE_FUBAR_PLUGIN_CMD = "Hidden" | |
163 HIDE_FUBAR_PLUGIN_DESC = "在面板上隱藏該插件." | |
164 end | |
165 | |
166 local FuBarPlugin = AceLibrary("AceOO-2.0").Mixin { | |
167 "GetTitle", | |
168 "GetName", | |
169 "GetCategory", | |
170 "SetFontSize", | |
171 "GetFrame", | |
172 "Show", | |
173 "Hide", | |
174 "GetPanel", | |
175 "IsTextColored", | |
176 "ToggleTextColored", | |
177 "IsMinimapAttached", | |
178 "ToggleMinimapAttached", | |
179 "Update", | |
180 "UpdateDisplay", | |
181 "UpdateData", | |
182 "UpdateText", | |
183 "UpdateTooltip", | |
184 "SetIcon", | |
185 "GetIcon", | |
186 "CheckWidth", | |
187 "SetText", | |
188 "GetText", | |
189 "IsIconShown", | |
190 "ToggleIconShown", | |
191 "ShowIcon", | |
192 "HideIcon", | |
193 "IsTextShown", | |
194 "ToggleTextShown", | |
195 "ShowText", | |
196 "HideText", | |
197 "IsTooltipDetached", | |
198 "ToggleTooltipDetached", | |
199 "DetachTooltip", | |
200 "ReattachTooltip", | |
201 "GetDefaultPosition", | |
202 "SetPanel", | |
203 "IsLoadOnDemand", | |
204 "IsDisabled", | |
205 "CreateBasicPluginFrame", | |
206 "CreatePluginChildFrame", | |
207 "OpenMenu", | |
208 "AddImpliedMenuOptions", | |
209 } | |
210 | |
211 local good = nil | |
212 local function CheckFuBar() | |
213 if not good then | |
214 good = FuBar and tonumber(string.sub(FuBar.version, 1, 3)) and tonumber(string.sub(FuBar.version, 1, 3)) >= 2 and true | |
215 end | |
216 return good | |
217 end | |
218 | |
219 function FuBarPlugin:GetTitle() | |
220 local name = self.title or self.name | |
221 FuBarPlugin:assert(name, "You must provide self.title or self.name") | |
222 local _,_,title = string.find(name, "FuBar %- (.-)%s*$") | |
223 if not title then | |
224 title = name | |
225 end | |
226 return (string.gsub(string.gsub(title, "|c%x%x%x%x%x%x%x%x", ""), "|r", "")) | |
227 end | |
228 | |
229 function FuBarPlugin:GetName() | |
230 return self.name | |
231 end | |
232 | |
233 function FuBarPlugin:GetCategory() | |
234 return self.category or OTHER | |
235 end | |
236 | |
237 function FuBarPlugin:GetFrame() | |
238 return self.frame | |
239 end | |
240 | |
241 function FuBarPlugin:GetPanel() | |
242 return self.panel | |
243 end | |
244 | |
245 function FuBarPlugin:IsTextColored() | |
246 return not self.db or not self.db.profile or not self.db.profile.uncolored | |
247 end | |
248 | |
249 function FuBarPlugin:ToggleTextColored() | |
250 FuBarPlugin:assert(self.db, "Cannot change text color if self.db is not available. (" .. self:GetTitle() .. ")") | |
251 self.db.profile.uncolored = not self.db.profile.uncolored or nil | |
252 self:UpdateText() | |
253 end | |
254 | |
255 function FuBarPlugin:ToggleMinimapAttached() | |
256 if CheckFuBar() and not self.cannotAttachToMinimap then | |
257 local value = self:IsMinimapAttached() | |
258 if value then | |
259 if self.panel then | |
260 self.panel:RemovePlugin(self) | |
261 end | |
262 FuBar:GetPanel(1):AddPlugin(self, nil, self.defaultPosition) | |
263 else | |
264 if self.panel then | |
265 self.panel:RemovePlugin(self) | |
266 end | |
267 AceLibrary(MINIMAPCONTAINER_MAJOR_VERSION):AddPlugin(self) | |
268 end | |
269 end | |
270 Dewdrop:Close() | |
271 end | |
272 | |
273 function FuBarPlugin:IsMinimapAttached() | |
274 if not CheckFuBar() then | |
275 return true | |
276 end | |
277 return self.panel == AceLibrary(MINIMAPCONTAINER_MAJOR_VERSION) | |
278 end | |
279 | |
280 function FuBarPlugin:Update() | |
281 self:UpdateData() | |
282 self:UpdateText() | |
283 self:UpdateTooltip() | |
284 end | |
285 | |
286 function FuBarPlugin:UpdateDisplay() | |
287 self:UpdateText() | |
288 self:UpdateTooltip() | |
289 end | |
290 | |
291 function FuBarPlugin:UpdateData() | |
292 if type(self.OnDataUpdate) == "function" then | |
293 if not self:IsDisabled() then | |
294 self:OnDataUpdate() | |
295 end | |
296 end | |
297 end | |
298 | |
299 function FuBarPlugin:UpdateText() | |
300 if type(self.OnTextUpdate) == "function" then | |
301 if not self:IsDisabled() then | |
302 self:OnTextUpdate() | |
303 end | |
304 elseif self:IsTextShown() then | |
305 self:SetText(self:GetTitle()) | |
306 end | |
307 end | |
308 | |
309 function FuBarPlugin:RegisterTablet() | |
310 if not Tablet:IsRegistered(self.frame) then | |
311 if self.db and self.db.profile and not self.db.profile.detachedTooltip then | |
312 self.db.profile.detachedTooltip = {} | |
313 end | |
314 Tablet:Register(self.frame, | |
315 'children', function() | |
316 Tablet:SetTitle(self:GetTitle()) | |
317 if type(self.OnTooltipUpdate) == "function" then | |
318 if not self:IsDisabled() then | |
319 self:OnTooltipUpdate() | |
320 end | |
321 end | |
322 end, | |
323 'clickable', self.clickableTooltip, | |
324 'data', CheckFuBar() and FuBar.db.profile.tooltip or self.db and self.db.profile.detachedTooltip or {}, | |
325 'detachedData', self.db and self.db.profile.detachedTooltip or {}, | |
326 'point', function(frame) | |
327 if frame:GetTop() > GetScreenHeight() / 2 then | |
328 local x = frame:GetCenter() | |
329 if x < GetScreenWidth() / 3 then | |
330 return "TOPLEFT", "BOTTOMLEFT" | |
331 elseif x < GetScreenWidth() * 2 / 3 then | |
332 return "TOP", "BOTTOM" | |
333 else | |
334 return "TOPRIGHT", "BOTTOMRIGHT" | |
335 end | |
336 else | |
337 local x = frame:GetCenter() | |
338 if x < GetScreenWidth() / 3 then | |
339 return "BOTTOMLEFT", "TOPLEFT" | |
340 elseif x < GetScreenWidth() * 2 / 3 then | |
341 return "BOTTOM", "TOP" | |
342 else | |
343 return "BOTTOMRIGHT", "TOPRIGHT" | |
344 end | |
345 end | |
346 end, | |
347 'menu', self.OnMenuRequest and function(level, value, valueN_1, valueN_2, valueN_3, valueN_4) | |
348 if level == 1 then | |
349 local name = tostring(self) | |
350 if not string.find(name, '^table:') then | |
351 name = string.gsub(name, "|c%x%x%x%x%x%x%x%x(.-)|r", "%1") | |
352 Dewdrop:AddLine( | |
353 'text', name, | |
354 'isTitle', true | |
355 ) | |
356 end | |
357 end | |
358 if type(self.OnMenuRequest) == "function" then | |
359 self:OnMenuRequest(level, value, true, valueN_1, valueN_2, valueN_3, valueN_4) | |
360 elseif type(self.OnMenuRequest) == "table" then | |
361 Dewdrop:FeedAceOptionsTable(self.OnMenuRequest) | |
362 end | |
363 end, | |
364 'hideWhenEmpty', self.tooltipHiddenWhenEmpty | |
365 ) | |
366 end | |
367 end | |
368 | |
369 function FuBarPlugin:UpdateTooltip() | |
370 FuBarPlugin.RegisterTablet(self) | |
371 if self:IsMinimapAttached() and not self:IsTooltipDetached() and self.minimapFrame then | |
372 Tablet:Refresh(self.minimapFrame) | |
373 else | |
374 Tablet:Refresh(self.frame) | |
375 end | |
376 end | |
377 | |
378 function FuBarPlugin:OnProfileEnable() | |
379 self:Update() | |
380 end | |
381 | |
382 function FuBarPlugin:Show(panelId) | |
383 if self.frame:IsShown() or (self.minimapFrame and self.minimapFrame:IsShown()) then | |
384 return | |
385 end | |
386 if panelId ~= false then | |
387 if self.db then | |
388 self.db.profile.hidden = nil | |
389 end | |
390 end | |
391 if self.IsActive and not self:IsActive() then | |
392 self.panelIdTmp = panelId | |
393 self:ToggleActive() | |
394 self.panelIdTmp = nil | |
395 if self.db then | |
396 self.db.profile.disabled = nil | |
397 end | |
398 elseif not self.db or not self.db.profile.hidden then | |
399 if panelId == 0 or not CheckFuBar() then | |
400 AceLibrary(MINIMAPCONTAINER_MAJOR_VERSION):AddPlugin(self) | |
401 else | |
402 FuBar:ShowPlugin(self, panelId or self.panelIdTmp) | |
403 end | |
404 if not self.userDefinedFrame then | |
405 if not self:IsTextShown() then | |
406 self.textFrame:SetText("") | |
407 self.textFrame:SetWidth(epsilon) | |
408 self.textFrame:Hide() | |
409 end | |
410 if not self:IsIconShown() then | |
411 self.iconFrame:SetWidth(epsilon) | |
412 self.iconFrame:Hide() | |
413 end | |
414 end | |
415 self:Update() | |
416 end | |
417 end | |
418 | |
419 function FuBarPlugin:Hide(check) | |
420 if not self.frame:IsShown() and (not self.minimapFrame or not self.minimapFrame:IsShown()) then | |
421 return | |
422 end | |
423 if self.hideWithoutStandby and self.db and check ~= false then | |
424 self.db.profile.hidden = true | |
425 end | |
426 if not self.hideWithoutStandby then | |
427 if self.db and not self.overrideTooltip and not self.cannotDetachTooltip and self:IsTooltipDetached() and self.db.profile.detachedTooltip and self.db.profile.detachedTooltip.detached then | |
428 self:ReattachTooltip() | |
429 self.db.profile.detachedTooltip.detached = true | |
430 end | |
431 if self.IsActive and self:IsActive() and self.ToggleActive and (not CheckFuBar() or not FuBar:IsChangingProfile()) then | |
432 self:ToggleActive() | |
433 end | |
434 end | |
435 if self.panel then | |
436 self.panel:RemovePlugin(self) | |
437 end | |
438 self.frame:Hide() | |
439 if self.minimapFrame then | |
440 self.minimapFrame:Hide() | |
441 end | |
442 | |
443 if Dewdrop:IsOpen(self.frame) or (self.minimapFrame and Dewdrop:IsOpen(self.minimapFrame)) then | |
444 Dewdrop:Close() | |
445 end | |
446 end | |
447 | |
448 function FuBarPlugin:SetIcon(path) | |
449 if not path then | |
450 return | |
451 end | |
452 FuBarPlugin:argCheck(path, 2, "string", "boolean") | |
453 FuBarPlugin:assert(self.hasIcon, "Cannot set icon unless self.hasIcon is set. (" .. self:GetTitle() .. ")") | |
454 if not self.iconFrame then | |
455 return | |
456 end | |
457 if type(path) ~= "string" then | |
458 path = format("Interface\\AddOns\\%s\\icon", self.folderName) | |
459 elseif not string.find(path, '^Interface[\\/]') then | |
460 path = format("Interface\\AddOns\\%s\\%s", self.folderName, path) | |
461 end | |
462 if string.sub(path, 1, 16) == "Interface\\Icons\\" then | |
463 self.iconFrame:SetTexCoord(0.05, 0.95, 0.05, 0.95) | |
464 else | |
465 self.iconFrame:SetTexCoord(0, 1, 0, 1) | |
466 end | |
467 self.iconFrame:SetTexture(path) | |
468 if self.minimapIcon then | |
469 if string.sub(path, 1, 16) == "Interface\\Icons\\" then | |
470 self.minimapIcon:SetTexCoord(0.05, 0.95, 0.05, 0.95) | |
471 else | |
472 self.minimapIcon:SetTexCoord(0, 1, 0, 1) | |
473 end | |
474 self.minimapIcon:SetTexture(path) | |
475 end | |
476 end | |
477 | |
478 function FuBarPlugin:GetIcon() | |
479 if self.hasIcon then | |
480 return self.iconFrame:GetTexture() | |
481 end | |
482 end | |
483 | |
484 function FuBarPlugin:CheckWidth(force) | |
485 FuBarPlugin:argCheck(force, 2, "boolean", "nil") | |
486 if (self.iconFrame and self.iconFrame:IsShown()) or (self.textFrame and self.textFrame:IsShown()) then | |
487 if (self.db and self.db.profile and not self:IsIconShown()) or not self.hasIcon then | |
488 self.iconFrame:SetWidth(epsilon) | |
489 end | |
490 local width | |
491 if not self.hasNoText then | |
492 self.textFrame:SetHeight(0) | |
493 self.textFrame:SetWidth(500) | |
494 width = self.textFrame:GetStringWidth() + 1 | |
495 self.textFrame:SetWidth(width) | |
496 self.textFrame:SetHeight(self.textFrame:GetHeight()) | |
497 end | |
498 if self.hasNoText or not self.textFrame:IsShown() then | |
499 self.frame:SetWidth(self.iconFrame:GetWidth()) | |
500 if self.panel and self.panel:GetPluginSide(self) == "CENTER" then | |
501 self.panel:UpdateCenteredPosition() | |
502 end | |
503 elseif force or not self.textWidth or self.textWidth < width or self.textWidth - 8 > width then | |
504 self.textWidth = width | |
505 self.textFrame:SetWidth(width) | |
506 if self.iconFrame and self.iconFrame:IsShown() then | |
507 self.frame:SetWidth(width + self.iconFrame:GetWidth()) | |
508 else | |
509 self.frame:SetWidth(width) | |
510 end | |
511 if self.panel and self.panel:GetPluginSide(self) == "CENTER" then | |
512 self.panel:UpdateCenteredPosition() | |
513 end | |
514 end | |
515 end | |
516 end | |
517 | |
518 function FuBarPlugin:SetText(text) | |
519 if not self.textFrame then | |
520 return | |
521 end | |
522 FuBarPlugin:assert(not self.hasNoText, "Cannot set text if self.hasNoText has been set. (" .. self:GetTitle() .. ")") | |
523 FuBarPlugin:argCheck(text, 2, "string", "number") | |
524 if text == "" then | |
525 if self.hasIcon then | |
526 self:ShowIcon() | |
527 else | |
528 text = self:GetTitle() | |
529 end | |
530 end | |
531 if not self:IsTextColored() then | |
532 text = string.gsub(string.gsub(text, "|c%x%x%x%x%x%x%x%x", ""), "|r", "") | |
533 end | |
534 self.textFrame:SetText(text) | |
535 self:CheckWidth() | |
536 end | |
537 | |
538 function FuBarPlugin:GetText() | |
539 FuBarPlugin:assert(self.textFrame, "Cannot get text without a self.textFrame (" .. self:GetTitle() .. ")") | |
540 if not self.hasNoText then | |
541 return self.textFrame:GetText() or "" | |
542 end | |
543 end | |
544 | |
545 function FuBarPlugin:IsIconShown() | |
546 if not self.hasIcon then | |
547 return false | |
548 elseif self.hasNoText then | |
549 return true | |
550 elseif not self.db then | |
551 return true | |
552 elseif self.db and self.db.profile.showIcon == nil then | |
553 return true | |
554 else | |
555 return (self.db and (self.db.profile.showIcon == 1 or self.db.profile.showIcon == true)) and true or false | |
556 end | |
557 end | |
558 | |
559 function FuBarPlugin:ToggleIconShown() | |
560 FuBarPlugin:assert(self.iconFrame, "Cannot toggle icon without a self.iconFrame (" .. self:GetTitle() .. ")") | |
561 FuBarPlugin:assert(self.hasIcon, "Cannot show icon unless self.hasIcon is set. (" .. self:GetTitle() .. ")") | |
562 FuBarPlugin:assert(not self.hasNoText, "Cannot hide icon if self.hasNoText is set. (" .. self:GetTitle() .. ")") | |
563 FuBarPlugin:assert(self.textFrame, "Cannot hide icon if self.textFrame is not set. (" .. self:GetTitle() .. ")") | |
564 FuBarPlugin:assert(self.iconFrame, "Cannot hide icon if self.iconFrame is not set. (" .. self:GetTitle() .. ")") | |
565 FuBarPlugin:assert(self.db, "Cannot hide icon if self.db is not available. (" .. self:GetTitle() .. ")") | |
566 local value = not self:IsIconShown() | |
567 self.db.profile.showIcon = value | |
568 if value then | |
569 if not self:IsTextShown() and self.textFrame:IsShown() and self.textFrame:GetText() == self:GetTitle() then | |
570 self.textFrame:Hide() | |
571 self.textFrame:SetText("") | |
572 end | |
573 self.iconFrame:Show() | |
574 self.iconFrame:SetWidth(self.iconFrame:GetHeight()) | |
575 else | |
576 if not self.textFrame:IsShown() or not self.textFrame:GetText() then | |
577 self.textFrame:Show() | |
578 self.textFrame:SetText(self:GetTitle()) | |
579 end | |
580 self.iconFrame:Hide() | |
581 self.iconFrame:SetWidth(epsilon) | |
582 end | |
583 self:CheckWidth(true) | |
584 return value | |
585 end | |
586 | |
587 function FuBarPlugin:ShowIcon() | |
588 if not self:IsIconShown() then | |
589 self:ToggleIconShown() | |
590 end | |
591 end | |
592 | |
593 function FuBarPlugin:HideIcon() | |
594 if self:IsIconShown() then | |
595 self:ToggleIconShown() | |
596 end | |
597 end | |
598 | |
599 function FuBarPlugin:IsTextShown() | |
600 if self.hasNoText then | |
601 return false | |
602 elseif not self.hasIcon then | |
603 return true | |
604 elseif not self.db then | |
605 return true | |
606 elseif self.db and self.db.profile.showText == nil then | |
607 return true | |
608 else | |
609 return (self.db and (self.db.profile.showText == 1 or self.db.profile.showText == true)) and true or false | |
610 end | |
611 end | |
612 | |
613 function FuBarPlugin:ToggleTextShown() | |
614 FuBarPlugin:assert(not self.cannotHideText, "Cannot hide text unless self.cannotHideText is unset. (" .. self:GetTitle() .. ")") | |
615 FuBarPlugin:assert(self.hasIcon, "Cannot show text unless self.hasIcon is set. (" .. self:GetTitle() .. ")") | |
616 FuBarPlugin:assert(not self.hasNoText, "Cannot hide text if self.hasNoText is set. (" .. self:GetTitle() .. ")") | |
617 FuBarPlugin:assert(self.textFrame, "Cannot hide text if self.textFrame is not set. (" .. self:GetTitle() .. ")") | |
618 FuBarPlugin:assert(self.iconFrame, "Cannot hide text if self.iconFrame is not set. (" .. self:GetTitle() .. ")") | |
619 FuBarPlugin:assert(self.db, "Cannot hide text if self.db is not available. (" .. self:GetTitle() .. ")") | |
620 local value = not self:IsTextShown() | |
621 self.db.profile.showText = value | |
622 if value then | |
623 self.textFrame:Show() | |
624 self:UpdateText() | |
625 else | |
626 self.textFrame:SetText("") | |
627 self.textFrame:SetWidth(epsilon) | |
628 self.textFrame:Hide() | |
629 if not self:IsIconShown() then | |
630 DropDownList1:Hide() | |
631 end | |
632 self:ShowIcon() | |
633 end | |
634 self:CheckWidth(true) | |
635 return value | |
636 end | |
637 | |
638 function FuBarPlugin:ShowText() | |
639 if not self:IsTextShown() then | |
640 self:ToggleTextShown() | |
641 end | |
642 end | |
643 | |
644 function FuBarPlugin:HideText() | |
645 if self:IsTextShown() then | |
646 self:ToggleTextShown() | |
647 end | |
648 end | |
649 | |
650 function FuBarPlugin:IsTooltipDetached() | |
651 FuBarPlugin.RegisterTablet(self) | |
652 return not Tablet:IsAttached(self.frame) | |
653 end | |
654 | |
655 function FuBarPlugin:ToggleTooltipDetached() | |
656 FuBarPlugin.RegisterTablet(self) | |
657 if self:IsTooltipDetached() then | |
658 Tablet:Attach(self.frame) | |
659 else | |
660 Tablet:Detach(self.frame) | |
661 end | |
662 if Dewdrop then Dewdrop:Close() end | |
663 end | |
664 | |
665 function FuBarPlugin:DetachTooltip() | |
666 FuBarPlugin.RegisterTablet(self) | |
667 Tablet:Detach(self.frame) | |
668 end | |
669 | |
670 function FuBarPlugin:ReattachTooltip() | |
671 FuBarPlugin.RegisterTablet(self) | |
672 Tablet:Attach(self.frame) | |
673 end | |
674 | |
675 function FuBarPlugin:GetDefaultPosition() | |
676 return self.defaultPosition or "LEFT" | |
677 end | |
678 | |
679 local function IsCorrectPanel(panel) | |
680 if type(panel) ~= "table" then | |
681 return false | |
682 elseif type(panel.AddPlugin) ~= "function" then | |
683 return false | |
684 elseif type(panel.RemovePlugin) ~= "function" then | |
685 return false | |
686 elseif type(panel.GetNumPlugins) ~= "function" then | |
687 return false | |
688 elseif type(panel:GetNumPlugins()) ~= "number" then | |
689 return false | |
690 elseif type(panel.GetPlugin) ~= "function" then | |
691 return false | |
692 elseif type(panel.HasPlugin) ~= "function" then | |
693 return false | |
694 elseif type(panel.GetPluginSide) ~= "function" then | |
695 return false | |
696 end | |
697 return true | |
698 end | |
699 | |
700 function FuBarPlugin:SetPanel(panel) | |
701 if panel then | |
702 FuBarPlugin:assert(IsCorrectPanel(panel), "Bad argument #2 to `SetPanel'. Panel does not have the correct API.") | |
703 end | |
704 self.panel = panel | |
705 end | |
706 | |
707 function FuBarPlugin:SetFontSize(size) | |
708 FuBarPlugin:assert(not self.userDefinedFrame, (self.name and self.name .. ": " or "") .. "You must provide a SetFontSize(size) method if you provide your own frame.") | |
709 if self.hasIcon then | |
710 FuBarPlugin:assert(self.iconFrame, (self.name and self.name .. ": " or "") .. "No iconFrame found") | |
711 self.iconFrame:SetWidth(size + 3) | |
712 self.iconFrame:SetHeight(size + 3) | |
713 end | |
714 if not self.hasNoText then | |
715 FuBarPlugin:assert(self.textFrame, (self.name and self.name .. ": " or "") .. "No textFrame found") | |
716 local font, _, flags = self.textFrame:GetFont() | |
717 self.textFrame:SetFont(font, size, flags) | |
718 end | |
719 self:CheckWidth() | |
720 end | |
721 | |
722 function FuBarPlugin:IsLoadOnDemand() | |
723 return IsAddOnLoadOnDemand(self.folderName) | |
724 end | |
725 | |
726 function FuBarPlugin:IsDisabled() | |
727 return self.IsActive and not self:IsActive() or false | |
728 end | |
729 | |
730 function FuBarPlugin:OnInstanceInit(target) | |
731 if not AceEvent then | |
732 self:error(MAJOR_VERSION .. " requires AceEvent-2.0.") | |
733 elseif not Tablet then | |
734 self:error(MAJOR_VERSION .. " requires Tablet-2.0.") | |
735 elseif not Dewdrop then | |
736 self:error(MAJOR_VERSION .. " requires Dewdrop-2.0.") | |
737 end | |
738 self.registry[target] = true | |
739 | |
740 local _,_,folderName = string.find(debugstack(6, 1, 0), "\\AddOns\\(.*)\\") | |
741 target.folderName = folderName | |
742 self.folderNames[target] = folderName | |
743 end | |
744 | |
745 local frame_OnClick, frame_OnDoubleClick, frame_OnMouseDown, frame_OnMouseUp, frame_OnReceiveDrag | |
746 | |
747 function FuBarPlugin:CreateBasicPluginFrame(name) | |
748 local frame = CreateFrame("Button", name, UIParent) | |
749 frame:SetFrameStrata("HIGH") | |
750 frame:SetFrameLevel(7) | |
751 frame:EnableMouse(true) | |
752 frame:EnableMouseWheel(true) | |
753 frame:SetMovable(true) | |
754 frame:SetWidth(150) | |
755 frame:SetHeight(24) | |
756 frame:SetPoint("CENTER", UIParent, "CENTER") | |
757 frame.self = self | |
758 if not frame_OnClick then | |
759 function frame_OnClick() | |
760 if type(this.self.OnClick) == "function" then | |
761 this.self:OnClick(arg1) | |
762 end | |
763 end | |
764 end | |
765 frame:SetScript("OnClick", frame_OnClick) | |
766 if not frame_OnDoubleClick then | |
767 function frame_OnDoubleClick() | |
768 if type(this.self.OnDoubleClick) == "function" then | |
769 this.self:OnDoubleClick(arg1) | |
770 end | |
771 end | |
772 end | |
773 frame:SetScript("OnDoubleClick", frame_OnDoubleClick) | |
774 if not frame_OnMouseDown then | |
775 function frame_OnMouseDown() | |
776 if arg1 == "RightButton" and not IsShiftKeyDown() and not IsControlKeyDown() and not IsAltKeyDown() then | |
777 this.self:OpenMenu() | |
778 return | |
779 else | |
780 HideDropDownMenu(1) | |
781 if type(this.self.OnMouseDown) == "function" then | |
782 this.self:OnMouseDown(arg1) | |
783 end | |
784 end | |
785 end | |
786 end | |
787 frame:SetScript("OnMouseDown", frame_OnMouseDown) | |
788 if not frame_OnMouseUp then | |
789 function frame_OnMouseUp() | |
790 if type(this.self.OnMouseUp) == "function" then | |
791 this.self:OnMouseUp(arg1) | |
792 end | |
793 end | |
794 end | |
795 frame:SetScript("OnMouseUp", frame_OnMouseUp) | |
796 if not frame_OnReceiveDrag then | |
797 function frame_OnReceiveDrag() | |
798 if type(this.self.OnReceiveDrag) == "function" then | |
799 this.self:OnReceiveDrag() | |
800 end | |
801 end | |
802 end | |
803 frame:SetScript("OnReceiveDrag", frame_OnReceiveDrag) | |
804 return frame | |
805 end | |
806 | |
807 local child_OnEnter, child_OnLeave, child_OnClick, child_OnDoubleClick, child_OnMouseDown, child_OnMouseUp, child_OnReceiveDrag | |
808 function FuBarPlugin:CreatePluginChildFrame(frameType, name, parent) | |
809 FuBarPlugin:assert(self.frame, (self.name and self.name .. ": " or "") .. "You must have self.frame declared in order to add child frames") | |
810 FuBarPlugin:argCheck(frameType, 1, "string") | |
811 local child = CreateFrame(frameType, name, parent) | |
812 if parent then | |
813 child:SetFrameLevel(parent:GetFrameLevel() + 2) | |
814 end | |
815 child.self = self | |
816 if not child_OnEnter then | |
817 function child_OnEnter(...) | |
818 if this.self.frame:GetScript("OnEnter") then | |
819 this.self.frame:GetScript("OnEnter")(...) | |
820 end | |
821 end | |
822 end | |
823 child:SetScript("OnEnter", child_OnEnter) | |
824 if not child_OnLeave then | |
825 function child_OnLeave(...) | |
826 if this.self.frame:GetScript("OnLeave") then | |
827 this.self.frame:GetScript("OnLeave")(...) | |
828 end | |
829 end | |
830 end | |
831 child:SetScript("OnLeave", child_OnLeave) | |
832 if child:HasScript("OnClick") then | |
833 if not child_OnClick then | |
834 function child_OnClick(...) | |
835 if this.self.frame:HasScript("OnClick") and this.self.frame:GetScript("OnClick") then | |
836 this.self.frame:GetScript("OnClick")(...) | |
837 end | |
838 end | |
839 end | |
840 child:SetScript("OnClick", child_OnClick) | |
841 end | |
842 if child:HasScript("OnDoubleClick") then | |
843 if not child_OnDoubleClick then | |
844 function child_OnDoubleClick(...) | |
845 if this.self.frame:HasScript("OnDoubleClick") and this.self.frame:GetScript("OnDoubleClick") then | |
846 this.self.frame:GetScript("OnDoubleClick")(...) | |
847 end | |
848 end | |
849 end | |
850 child:SetScript("OnDoubleClick", child_OnDoubleClick) | |
851 end | |
852 if not child_OnMouseDown then | |
853 function child_OnMouseDown(...) | |
854 if this.self.frame:HasScript("OnMouseDown") and this.self.frame:GetScript("OnMouseDown") then | |
855 this.self.frame:GetScript("OnMouseDown")(...) | |
856 end | |
857 end | |
858 end | |
859 child:SetScript("OnMouseDown", child_OnMouseDown) | |
860 if not child_OnMouseUp then | |
861 function child_OnMouseUp(...) | |
862 if this.self.frame:HasScript("OnMouseUp") and this.self.frame:GetScript("OnMouseUp") then | |
863 this.self.frame:GetScript("OnMouseUp")(...) | |
864 end | |
865 end | |
866 end | |
867 child:SetScript("OnMouseUp", child_OnMouseUp) | |
868 if not child_OnReceiveDrag then | |
869 function child_OnReceiveDrag(this) | |
870 if this.self.frame:HasScript("OnReceiveDrag") and this.self.frame:GetScript("OnReceiveDrag") then | |
871 this.self.frame:GetScript("OnReceiveDrag")() | |
872 end | |
873 end | |
874 end | |
875 child:SetScript("OnReceiveDrag", child_OnReceiveDrag) | |
876 return child | |
877 end | |
878 | |
879 function FuBarPlugin:OpenMenu(frame) | |
880 if not frame then | |
881 frame = self:GetFrame() | |
882 end | |
883 if not frame or not self:GetFrame() or Dewdrop:IsOpen(frame) then | |
884 Dewdrop:Close() | |
885 return | |
886 end | |
887 Tablet:Close() | |
888 | |
889 if not Dewdrop:IsRegistered(self:GetFrame()) then | |
890 if type(self.OnMenuRequest) == "table" and (not self.OnMenuRequest.handler or self.OnMenuRequest.handler == self) and self.OnMenuRequest.type == "group" then | |
891 Dewdrop:InjectAceOptionsTable(self, self.OnMenuRequest) | |
892 if self.OnMenuRequest.args and CheckFuBar() and not self.independentProfile then | |
893 self.OnMenuRequest.args.profile = nil | |
894 end | |
895 end | |
896 Dewdrop:Register(self:GetFrame(), | |
897 'children', type(self.OnMenuRequest) == "table" and self.OnMenuRequest or function(level, value, valueN_1, valueN_2, valueN_3, valueN_4) | |
898 if level == 1 then | |
899 Dewdrop:AddLine( | |
900 'text', self:GetTitle(), | |
901 'isTitle', true | |
902 ) | |
903 end | |
904 | |
905 if level == 1 then | |
906 if self.OnMenuRequest then | |
907 self:OnMenuRequest(level, value, false, valueN_1, valueN_2, valueN_3, valueN_4) | |
908 end | |
909 | |
910 if not self.overrideMenu then | |
911 if self.MenuSettings then | |
912 Dewdrop:AddLine() | |
913 end | |
914 self:AddImpliedMenuOptions() | |
915 end | |
916 else | |
917 if not self.overrideMenu and self:AddImpliedMenuOptions() then | |
918 else | |
919 if self.OnMenuRequest then | |
920 self:OnMenuRequest(level, value, false, valueN_1, valueN_2, valueN_3, valueN_4) | |
921 end | |
922 end | |
923 end | |
924 if level == 1 then | |
925 Dewdrop:AddLine( | |
926 'text', CLOSE, | |
927 'tooltipTitle', CLOSE, | |
928 'tooltipText', CLOSE_DESC, | |
929 'func', Dewdrop.Close, | |
930 'arg1', Dewdrop | |
931 ) | |
932 end | |
933 end, | |
934 'point', function(frame) | |
935 local x, y = frame:GetCenter() | |
936 local leftRight | |
937 if x < GetScreenWidth() / 2 then | |
938 leftRight = "LEFT" | |
939 else | |
940 leftRight = "RIGHT" | |
941 end | |
942 if y < GetScreenHeight() / 2 then | |
943 return "BOTTOM" .. leftRight, "TOP" .. leftRight | |
944 else | |
945 return "TOP" .. leftRight, "BOTTOM" .. leftRight | |
946 end | |
947 end, | |
948 'dontHook', true | |
949 ) | |
950 end | |
951 if frame == self:GetFrame() then | |
952 Dewdrop:Open(self:GetFrame()) | |
953 else | |
954 Dewdrop:Open(frame, self:GetFrame()) | |
955 end | |
956 end | |
957 | |
958 local impliedMenuOptions | |
959 function FuBarPlugin:AddImpliedMenuOptions(level) | |
960 FuBarPlugin:argCheck(level, 2, "number", "nil") | |
961 if not impliedMenuOptions then | |
962 impliedMenuOptions = {} | |
963 end | |
964 if not impliedMenuOptions[self] then | |
965 impliedMenuOptions[self] = { type = 'group', args = {} } | |
966 Dewdrop:InjectAceOptionsTable(self, impliedMenuOptions[self]) | |
967 if impliedMenuOptions[self].args and CheckFuBar() and not self.independentProfile then | |
968 impliedMenuOptions[self].args.profile = nil | |
969 end | |
970 end | |
971 return Dewdrop:FeedAceOptionsTable(impliedMenuOptions[self], level and level - 1) | |
972 end | |
973 | |
974 function FuBarPlugin.OnEmbedInitialize(FuBarPlugin, self) | |
975 if not self.frame then | |
976 local name = "FuBarPlugin" .. self:GetTitle() .. "Frame" | |
977 local frame = _G[name] | |
978 if not frame or not _G[name .. "Text"] or not _G[name .. "Icon"] then | |
979 frame = self:CreateBasicPluginFrame(name) | |
980 | |
981 local icon = frame:CreateTexture(name .. "Icon", "ARTWORK") | |
982 icon:SetWidth(16) | |
983 icon:SetHeight(16) | |
984 icon:SetPoint("LEFT", frame, "LEFT") | |
985 | |
986 local text = frame:CreateFontString(name .. "Text", "ARTWORK") | |
987 text:SetWidth(134) | |
988 text:SetHeight(24) | |
989 text:SetPoint("LEFT", icon, "RIGHT", 0, 1) | |
990 text:SetFontObject(GameFontNormal) | |
991 end | |
992 self.frame = frame | |
993 self.textFrame = _G[name .. "Text"] | |
994 self.iconFrame = _G[name .. "Icon"] | |
995 else | |
996 self.userDefinedFrame = true | |
997 end | |
998 | |
999 self.frame.plugin = self | |
1000 self.frame:SetParent(UIParent) | |
1001 self.frame:SetPoint("RIGHT", UIParent, "LEFT", -5, 0) | |
1002 self.frame:Hide() | |
1003 | |
1004 if self.hasIcon then | |
1005 self:SetIcon(self.hasIcon) | |
1006 end | |
1007 | |
1008 if CheckFuBar() then | |
1009 FuBar:RegisterPlugin(self) | |
1010 end | |
1011 end | |
1012 | |
1013 local CheckShow = function(self, panelId) | |
1014 if not self.frame:IsShown() and (not self.minimapFrame or not self.minimapFrame:IsShown()) then | |
1015 self:Show(panelId) | |
1016 Dewdrop:Refresh(2) | |
1017 end | |
1018 end | |
1019 | |
1020 local recheckPlugins | |
1021 function FuBarPlugin.OnEmbedEnable(FuBarPlugin, self) | |
1022 if not self.userDefinedFrame then | |
1023 if self:IsIconShown() then | |
1024 self.iconFrame:Show() | |
1025 else | |
1026 self.iconFrame:Hide() | |
1027 end | |
1028 end | |
1029 self:CheckWidth(true) | |
1030 | |
1031 if not self.hideWithoutStandby or (self.db and not self.db.profile.hidden) then | |
1032 if FuBarPlugin.enabledPlugins[self] then | |
1033 CheckShow(self, self.panelIdTmp) | |
1034 else | |
1035 FuBarPlugin:ScheduleEvent(CheckShow, 0, self, self.panelIdTmp) | |
1036 end | |
1037 end | |
1038 FuBarPlugin.enabledPlugins[self] = true | |
1039 | |
1040 if not self.overrideTooltip and not self.cannotDetachTooltip and self.db and self.db.profile.detachedTooltip and self.db.profile.detachedTooltip.detached then | |
1041 FuBarPlugin:ScheduleEvent(self.DetachTooltip, 0, self) | |
1042 end | |
1043 | |
1044 if self:IsLoadOnDemand() and CheckFuBar() then | |
1045 if not FuBar.db.profile.loadOnDemand then | |
1046 FuBar.db.profile.loadOnDemand = {} | |
1047 end | |
1048 if not FuBar.db.profile.loadOnDemand[self.folderName] then | |
1049 FuBar.db.profile.loadOnDemand[self.folderName] = {} | |
1050 end | |
1051 FuBar.db.profile.loadOnDemand[self.folderName].disabled = nil | |
1052 end | |
1053 | |
1054 if CheckFuBar() and AceLibrary:HasInstance("AceConsole-2.0") then | |
1055 if not recheckPlugins then | |
1056 local AceConsole = AceLibrary("AceConsole-2.0") | |
1057 local AceOO = AceLibrary("AceOO-2.0") | |
1058 function recheckPlugins() | |
1059 for k,v in pairs(AceConsole.registry) do | |
1060 if type(v) == "table" and v.args and AceOO.inherits(v.handler, FuBarPlugin) and not v.independentProfile then | |
1061 v.args.profile = nil | |
1062 end | |
1063 end | |
1064 end | |
1065 end | |
1066 FuBarPlugin:ScheduleEvent(recheckPlugins, 0) | |
1067 end | |
1068 end | |
1069 | |
1070 function FuBarPlugin.OnEmbedDisable(FuBarPlugin, self) | |
1071 self:Hide(false) | |
1072 | |
1073 if self:IsLoadOnDemand() and CheckFuBar() then | |
1074 if not FuBar.db.profile.loadOnDemand then | |
1075 FuBar.db.profile.loadOnDemand = {} | |
1076 end | |
1077 if not FuBar.db.profile.loadOnDemand[self.folderName] then | |
1078 FuBar.db.profile.loadOnDemand[self.folderName] = {} | |
1079 end | |
1080 FuBar.db.profile.loadOnDemand[self.folderName].disabled = true | |
1081 end | |
1082 end | |
1083 | |
1084 function FuBarPlugin.OnEmbedProfileEnable(FuBarPlugin, self) | |
1085 self:Update() | |
1086 if self.db and self.db.profile then | |
1087 if not self.db.profile.detachedTooltip then | |
1088 self.db.profile.detachedTooltip = {} | |
1089 end | |
1090 if Tablet.registry[self.frame] then | |
1091 Tablet:UpdateDetachedData(self.frame, self.db.profile.detachedTooltip) | |
1092 else | |
1093 FuBarPlugin.RegisterTablet(self) | |
1094 end | |
1095 end | |
1096 end | |
1097 | |
1098 function FuBarPlugin.GetAceOptionsDataTable(FuBarPlugin, self) | |
1099 return { | |
1100 icon = { | |
1101 type = "toggle", | |
1102 name = SHOW_ICON, | |
1103 desc = SHOW_ICON_DESC, | |
1104 set = "ToggleIconShown", | |
1105 get = "IsIconShown", | |
1106 hidden = function() | |
1107 return not self.hasIcon or self.hasNoText or self:IsDisabled() or self:IsMinimapAttached() or not self.db | |
1108 end, | |
1109 order = -13.7, | |
1110 handler = self, | |
1111 }, | |
1112 text = { | |
1113 type = "toggle", | |
1114 name = SHOW_TEXT, | |
1115 desc = SHOW_TEXT_DESC, | |
1116 set = "ToggleTextShown", | |
1117 get = "IsTextShown", | |
1118 hidden = function() | |
1119 return self.cannotHideText or not self.hasIcon or self.hasNoText or self:IsDisabled() or self:IsMinimapAttached() or not self.db | |
1120 end, | |
1121 order = -13.6, | |
1122 handler = self, | |
1123 }, | |
1124 colorText = { | |
1125 type = "toggle", | |
1126 name = SHOW_COLORED_TEXT, | |
1127 desc = SHOW_COLORED_TEXT_DESC, | |
1128 set = "ToggleTextColored", | |
1129 get = "IsTextColored", | |
1130 hidden = function() | |
1131 return self.userDefinedFrame or self.hasNoText or self.hasNoColor or self:IsDisabled() or self:IsMinimapAttached() or not self.db | |
1132 end, | |
1133 order = -13.5, | |
1134 handler = self, | |
1135 }, | |
1136 detachTooltip = { | |
1137 type = "toggle", | |
1138 name = DETACH_TOOLTIP, | |
1139 desc = DETACH_TOOLTIP_DESC, | |
1140 get = "IsTooltipDetached", | |
1141 set = "ToggleTooltipDetached", | |
1142 hidden = function() | |
1143 return self.overrideTooltip or self.cannotDetachTooltip or self:IsDisabled() | |
1144 end, | |
1145 order = -13.4, | |
1146 handler = self, | |
1147 }, | |
1148 lockTooltip = { | |
1149 type = "toggle", | |
1150 name = LOCK_TOOLTIP, | |
1151 desc = LOCK_TOOLTIP_DESC, | |
1152 get = function() | |
1153 return Tablet:IsLocked(self.frame) | |
1154 end, | |
1155 set = function() | |
1156 return Tablet:ToggleLocked(self.frame) | |
1157 end, | |
1158 disabled = function() | |
1159 return not self:IsTooltipDetached() | |
1160 end, | |
1161 hidden = function() | |
1162 return self.overrideTooltip or self.cannotDetachTooltip or self:IsDisabled() | |
1163 end, | |
1164 order = -13.3, | |
1165 handler = self, | |
1166 }, | |
1167 position = { | |
1168 type = "text", | |
1169 name = POSITION, | |
1170 desc = POSITION_DESC, | |
1171 validate = { | |
1172 LEFT = POSITION_LEFT, | |
1173 CENTER = POSITION_CENTER, | |
1174 RIGHT = POSITION_RIGHT | |
1175 }, | |
1176 get = function() | |
1177 return self.panel and self.panel:GetPluginSide(self) | |
1178 end, | |
1179 set = function(value) | |
1180 if self.panel then | |
1181 self.panel:SetPluginSide(self, value) | |
1182 end | |
1183 end, | |
1184 hidden = function() | |
1185 return self:IsMinimapAttached() or self:IsDisabled() or not self.panel | |
1186 end, | |
1187 order = -13.2, | |
1188 handler = self, | |
1189 }, | |
1190 minimapAttach = { | |
1191 type = "toggle", | |
1192 name = ATTACH_TO_MINIMAP, | |
1193 desc = ATTACH_TO_MINIMAP_DESC, | |
1194 get = "IsMinimapAttached", | |
1195 set = "ToggleMinimapAttached", | |
1196 hidden = function() | |
1197 return (self.cannotAttachToMinimap and not self:IsMinimapAttached()) or not CheckFuBar() or self:IsDisabled() | |
1198 end, | |
1199 order = -13.1, | |
1200 handler = self, | |
1201 }, | |
1202 hide = { | |
1203 type = "toggle", | |
1204 cmdName = HIDE_FUBAR_PLUGIN_CMD, | |
1205 guiName = HIDE_FUBAR_PLUGIN, | |
1206 desc = HIDE_FUBAR_PLUGIN_DESC, | |
1207 get = function() | |
1208 return not self.frame:IsShown() and (not self.minimapFrame or not self.minimapFrame:IsShown()) | |
1209 end, | |
1210 set = function() | |
1211 if not self.frame:IsShown() and (not self.minimapFrame or not self.minimapFrame:IsShown()) then | |
1212 self:Show() | |
1213 else | |
1214 self:Hide() | |
1215 end | |
1216 end, | |
1217 hidden = function() | |
1218 return not self.hideWithoutStandby or self:IsDisabled() | |
1219 end, | |
1220 order = -13, | |
1221 handler = self, | |
1222 }, | |
1223 } | |
1224 end | |
1225 | |
1226 local function activate(self, oldLib, oldDeactivate) | |
1227 FuBarPlugin = self | |
1228 | |
1229 if oldLib then | |
1230 self.registry = oldLib.registry | |
1231 self.folderNames = oldLib.folderNames | |
1232 self.enabledPlugins = oldLib.enabledPlugins | |
1233 end | |
1234 | |
1235 if not self.registry then | |
1236 self.registry = {} | |
1237 end | |
1238 if not self.folderNames then | |
1239 self.folderNames = {} | |
1240 end | |
1241 if not self.enabledPlugins then | |
1242 self.enabledPlugins = {} | |
1243 end | |
1244 | |
1245 FuBarPlugin.activate(self, oldLib, oldDeactivate) | |
1246 | |
1247 if oldDeactivate then | |
1248 oldDeactivate(oldLib) | |
1249 end | |
1250 end | |
1251 | |
1252 local function external(self, major, instance) | |
1253 if major == "AceEvent-2.0" then | |
1254 AceEvent = instance | |
1255 | |
1256 AceEvent:embed(self) | |
1257 elseif major == "Tablet-2.0" then | |
1258 Tablet = instance | |
1259 elseif major == "Dewdrop-2.0" then | |
1260 Dewdrop = instance | |
1261 end | |
1262 end | |
1263 | |
1264 AceLibrary:Register(FuBarPlugin, MAJOR_VERSION, MINOR_VERSION, activate, nil, external) | |
1265 | |
1266 local MinimapContainer = {} | |
1267 | |
1268 local function IsMinimapSquare() | |
1269 return IsAddOnLoaded("CornerMinimap") or IsAddOnLoaded("SquareMinimap") or IsAddOnLoaded("Squeenix") or (IsAddOnLoaded("simpleMinimap") and simpleMinimap_Skins and simpleMinimap_Skins:GetShape() == "square") | |
1270 end | |
1271 | |
1272 function MinimapContainer:AddPlugin(plugin) | |
1273 if CheckFuBar() and FuBar:IsChangingProfile() then | |
1274 return | |
1275 end | |
1276 if plugin.panel ~= nil then | |
1277 plugin.panel:RemovePlugin(plugin) | |
1278 end | |
1279 plugin.panel = self | |
1280 if not plugin.minimapFrame then | |
1281 local frame = CreateFrame("Button", plugin.frame:GetName() .. "MinimapButton", Minimap) | |
1282 plugin.minimapFrame = frame | |
1283 AceLibrary(MAJOR_VERSION).RegisterTablet(plugin) | |
1284 Tablet:Register(frame, plugin.frame) | |
1285 frame.plugin = plugin | |
1286 frame:SetWidth(31) | |
1287 frame:SetHeight(31) | |
1288 frame:SetFrameStrata("BACKGROUND") | |
1289 frame:SetFrameLevel(4) | |
1290 frame:SetHighlightTexture("Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight") | |
1291 local icon = frame:CreateTexture(frame:GetName() .. "Icon", "BACKGROUND") | |
1292 plugin.minimapIcon = icon | |
1293 local path = plugin:GetIcon() or (plugin.iconFrame and plugin.iconFrame:GetTexture()) or "Interface\\Icons\\INV_Misc_QuestionMark" | |
1294 icon:SetTexture(path) | |
1295 if string.sub(path, 1, 16) == "Interface\\Icons\\" then | |
1296 icon:SetTexCoord(0.05, 0.95, 0.05, 0.95) | |
1297 else | |
1298 icon:SetTexCoord(0, 1, 0, 1) | |
1299 end | |
1300 icon:SetWidth(20) | |
1301 icon:SetHeight(20) | |
1302 icon:SetPoint("TOPLEFT", frame, "TOPLEFT", 7, -5) | |
1303 local overlay = frame:CreateTexture(frame:GetName() .. "Overlay","OVERLAY") | |
1304 overlay:SetTexture("Interface\\Minimap\\MiniMap-TrackingBorder") | |
1305 overlay:SetWidth(53) | |
1306 overlay:SetHeight(53) | |
1307 overlay:SetPoint("TOPLEFT",frame,"TOPLEFT") | |
1308 frame:EnableMouse(true) | |
1309 frame:RegisterForClicks("LeftButtonUp") | |
1310 frame.plugin = plugin | |
1311 frame:SetScript("OnClick", function() | |
1312 if type(plugin.OnClick) == "function" then | |
1313 if not this.dragged then | |
1314 plugin:OnClick(arg1) | |
1315 end | |
1316 end | |
1317 end) | |
1318 frame:SetScript("OnDoubleClick", function() | |
1319 if type(plugin.OnDoubleClick) == "function" then | |
1320 plugin:OnDoubleClick(arg1) | |
1321 end | |
1322 end) | |
1323 frame:SetScript("OnReceiveDrag", function() | |
1324 if type(plugin.OnReceiveDrag) == "function" then | |
1325 if not this.dragged then | |
1326 plugin:OnReceiveDrag() | |
1327 end | |
1328 end | |
1329 end) | |
1330 frame:SetScript("OnMouseDown", function() | |
1331 this.dragged = false | |
1332 if arg1 == "LeftButton" and not IsShiftKeyDown() and not IsControlKeyDown() and not IsAltKeyDown() then | |
1333 HideDropDownMenu(1) | |
1334 if type(plugin.OnMouseDown) == "function" then | |
1335 plugin:OnMouseDown(arg1) | |
1336 end | |
1337 elseif arg1 == "RightButton" and not IsShiftKeyDown() and not IsControlKeyDown() and not IsAltKeyDown() then | |
1338 plugin:OpenMenu(frame) | |
1339 else | |
1340 HideDropDownMenu(1) | |
1341 if type(plugin.OnMouseDown) == "function" then | |
1342 plugin:OnMouseDown(arg1) | |
1343 end | |
1344 end | |
1345 if plugin.OnClick or plugin.OnMouseDown or plugin.OnMouseUp or plugin.OnDoubleClick then | |
1346 if string.sub(this.plugin.minimapIcon:GetTexture(), 1, 16) == "Interface\\Icons\\" then | |
1347 plugin.minimapIcon:SetTexCoord(0.14, 0.86, 0.14, 0.86) | |
1348 else | |
1349 plugin.minimapIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9) | |
1350 end | |
1351 end | |
1352 end) | |
1353 frame:SetScript("OnMouseUp", function() | |
1354 if not this.dragged and type(plugin.OnMouseUp) == "function" then | |
1355 plugin:OnMouseUp(arg1) | |
1356 end | |
1357 if string.sub(this.plugin.minimapIcon:GetTexture(), 1, 16) == "Interface\\Icons\\" then | |
1358 plugin.minimapIcon:SetTexCoord(0.05, 0.95, 0.05, 0.95) | |
1359 else | |
1360 plugin.minimapIcon:SetTexCoord(0, 1, 0, 1) | |
1361 end | |
1362 end) | |
1363 frame:RegisterForDrag("LeftButton") | |
1364 frame:SetScript("OnDragStart", self.OnDragStart) | |
1365 frame:SetScript("OnDragStop", self.OnDragStop) | |
1366 end | |
1367 plugin.frame:Hide() | |
1368 plugin.minimapFrame:Show() | |
1369 self:ReadjustLocation(plugin) | |
1370 table.insert(self.plugins, plugin) | |
1371 local exists = false | |
1372 return true | |
1373 end | |
1374 | |
1375 function MinimapContainer:RemovePlugin(index) | |
1376 if CheckFuBar() and FuBar:IsChangingProfile() then | |
1377 return | |
1378 end | |
1379 if type(index) == "table" then | |
1380 index = self:IndexOfPlugin(index) | |
1381 if not index then | |
1382 return | |
1383 end | |
1384 end | |
1385 local t = self.plugins | |
1386 local plugin = t[index] | |
1387 assert(plugin.panel == self, "Plugin has improper panel field") | |
1388 plugin:SetPanel(nil) | |
1389 table.remove(t, index) | |
1390 return true | |
1391 end | |
1392 | |
1393 function MinimapContainer:ReadjustLocation(plugin) | |
1394 local frame = plugin.minimapFrame | |
1395 if plugin.db and plugin.db.profile.minimapPositionWild then | |
1396 frame:SetPoint("CENTER", UIParent, "BOTTOMLEFT", plugin.db.profile.minimapPositionX, plugin.db.profile.minimapPositionY) | |
1397 elseif not plugin.db and plugin.minimapPositionWild then | |
1398 frame:SetPoint("CENTER", UIParent, "BOTTOMLEFT", plugin.minimapPositionX, plugin.minimapPositionY) | |
1399 else | |
1400 local position | |
1401 if plugin.db then | |
1402 position = plugin.db.profile.minimapPosition or plugin.defaultMinimapPosition or math.random(1, 360) | |
1403 else | |
1404 position = plugin.minimapPosition or plugin.defaultMinimapPosition or math.random(1, 360) | |
1405 end | |
1406 local angle = math.rad(position or 0) | |
1407 local x,y | |
1408 if not IsMinimapSquare() then | |
1409 x = math.cos(angle) * 80 | |
1410 y = math.sin(angle) * 80 | |
1411 else | |
1412 x = 110 * math.cos(angle) | |
1413 y = 110 * math.sin(angle) | |
1414 x = math.max(-82, math.min(x, 84)) | |
1415 y = math.max(-86, math.min(y, 82)) | |
1416 end | |
1417 frame:SetPoint("CENTER", Minimap, "CENTER", x, y) | |
1418 end | |
1419 end | |
1420 | |
1421 function MinimapContainer:GetPlugin(index) | |
1422 return self.plugins[index] | |
1423 end | |
1424 | |
1425 function MinimapContainer:GetNumPlugins() | |
1426 return table.getn(self.plugins) | |
1427 end | |
1428 | |
1429 function MinimapContainer:IndexOfPlugin(plugin) | |
1430 for i,p in ipairs(self.plugins) do | |
1431 if p == plugin then | |
1432 return i, "MINIMAP" | |
1433 end | |
1434 end | |
1435 end | |
1436 | |
1437 function MinimapContainer:HasPlugin(plugin) | |
1438 return self:IndexOfPlugin(plugin) ~= nil | |
1439 end | |
1440 | |
1441 function MinimapContainer:GetPluginSide(plugin) | |
1442 local index = self:IndexOfPlugin(plugin) | |
1443 assert(index, "Plugin not in panel") | |
1444 return "MINIMAP" | |
1445 end | |
1446 | |
1447 function MinimapContainer.OnDragStart() | |
1448 this.dragged = true | |
1449 this:LockHighlight() | |
1450 this:SetScript("OnUpdate", MinimapContainer.OnUpdate) | |
1451 if string.sub(this.plugin.minimapIcon:GetTexture(), 1, 16) == "Interface\\Icons\\" then | |
1452 this.plugin.minimapIcon:SetTexCoord(0.05, 0.95, 0.05, 0.95) | |
1453 else | |
1454 this.plugin.minimapIcon:SetTexCoord(0, 1, 0, 1) | |
1455 end | |
1456 end | |
1457 | |
1458 function MinimapContainer.OnDragStop() | |
1459 this:SetScript("OnUpdate", nil) | |
1460 this:UnlockHighlight() | |
1461 end | |
1462 | |
1463 function MinimapContainer.OnUpdate() | |
1464 if not IsAltKeyDown() then | |
1465 local mx, my = Minimap:GetCenter() | |
1466 local px, py = GetCursorPosition() | |
1467 local scale = UIParent:GetEffectiveScale() | |
1468 px, py = px / scale, py / scale | |
1469 local position = math.deg(math.atan2(py - my, px - mx)) | |
1470 if position <= 0 then | |
1471 position = position + 360 | |
1472 elseif position > 360 then | |
1473 position = position - 360 | |
1474 end | |
1475 if this.plugin.db then | |
1476 this.plugin.db.profile.minimapPosition = position | |
1477 this.plugin.db.profile.minimapPositionX = nil | |
1478 this.plugin.db.profile.minimapPositionY = nil | |
1479 this.plugin.db.profile.minimapPositionWild = nil | |
1480 else | |
1481 this.plugin.minimapPosition = position | |
1482 this.plugin.minimapPositionX = nil | |
1483 this.plugin.minimapPositionY = nil | |
1484 this.plugin.minimapPositionWild = nil | |
1485 end | |
1486 else | |
1487 local px, py = GetCursorPosition() | |
1488 local scale = UIParent:GetEffectiveScale() | |
1489 px, py = px / scale, py / scale | |
1490 if this.plugin.db then | |
1491 this.plugin.db.profile.minimapPositionX = px | |
1492 this.plugin.db.profile.minimapPositionY = py | |
1493 this.plugin.db.profile.minimapPosition = nil | |
1494 this.plugin.db.profile.minimapPositionWild = true | |
1495 else | |
1496 this.plugin.minimapPositionX = px | |
1497 this.plugin.minimapPositionY = py | |
1498 this.plugin.minimapPosition = nil | |
1499 this.plugin.minimapPositionWild = true | |
1500 end | |
1501 end | |
1502 MinimapContainer:ReadjustLocation(this.plugin) | |
1503 end | |
1504 | |
1505 local function activate(self, oldLib, oldDeactivate) | |
1506 MinimapContainer = self | |
1507 | |
1508 if oldLib then | |
1509 self.plugins = oldLib.plugins | |
1510 end | |
1511 | |
1512 if not self.plugins then | |
1513 self.plugins = {} | |
1514 end | |
1515 | |
1516 if oldDeactivate then | |
1517 oldDeactivate(oldLib) | |
1518 end | |
1519 end | |
1520 | |
1521 AceLibrary:Register(MinimapContainer, MINIMAPCONTAINER_MAJOR_VERSION, MINOR_VERSION, activate) |