comparison modules/FuBar_ReActionFu/lib/LibFuBarPlugin-3.0/LibFuBarPlugin-3.0.lua @ 30:0d95ce7a9ec2

- added Ace3 externs - converted ReAction_ConfigUI to use blizzard interface addons panel via AceConfigDialog-3.0 - partially converted FuBar module to LibRock, deprecated it (going to remove it entirely later) - cleaned up a couple other tidbits
author Flick <flickerstreak@gmail.com>
date Wed, 02 Apr 2008 23:31:13 +0000
parents
children
comparison
equal deleted inserted replaced
29:9c89042bc328 30:0d95ce7a9ec2
1 --[[
2 Name: LibFuBarPlugin-3.0
3 Revision: $Rev: 63707 $
4 Developed by: ckknight (ckknight@gmail.com)
5 Website: http://www.wowace.com/
6 Description: Plugin for FuBar.
7 Dependencies: LibRock-1.0
8 License: LGPL v2.1
9 ]]
10
11 local MAJOR_VERSION = "LibFuBarPlugin-3.0"
12 local MINOR_VERSION = tonumber(("$Revision: 63707 $"):match("(%d+)")) - 60000
13
14 if not Rock then error(MAJOR_VERSION .. " requires LibRock-1.0") end
15
16 local FuBarPlugin, oldLib = Rock:NewLibrary(MAJOR_VERSION, MINOR_VERSION)
17 if not FuBarPlugin then
18 return
19 end
20
21 local SHOW_FUBAR_ICON = "Show FuBar icon"
22 local SHOW_FUBAR_ICON_DESC = "Show the FuBar plugin's icon on the panel."
23 local SHOW_FUBAR_TEXT = "Show FuBar text"
24 local SHOW_FUBAR_TEXT_DESC = "Show the FuBar plugin's text on the panel."
25 local SHOW_COLORED_FUBAR_TEXT = "Show colored FuBar text"
26 local SHOW_COLORED_FUBAR_TEXT_DESC = "Allow the FuBar plugin to color its text on the panel."
27 local DETACH_FUBAR_TOOLTIP = "Detach FuBar tooltip"
28 local DETACH_FUBAR_TOOLTIP_DESC = "Detach the FuBar tooltip from the panel."
29 local LOCK_FUBAR_TOOLTIP = "Lock tooltip"
30 local LOCK_FUBAR_TOOLTIP_DESC = "Lock the tooltips position. When the tooltip is locked, you must use Alt to access it with your mouse."
31 local POSITION_ON_FUBAR = "Position on FuBar"
32 local POSITION_ON_FUBAR_DESC = "Position the FuBar plugin on the panel."
33 local POSITION_LEFT = "Left"
34 local POSITION_RIGHT = "Right"
35 local POSITION_CENTER = "Center"
36 local ATTACH_PLUGIN_TO_MINIMAP = "Attach FuBar plugin to minimap"
37 local ATTACH_PLUGIN_TO_MINIMAP_DESC = "Attach the FuBar plugin to the minimap instead of the panel."
38 local HIDE_FUBAR_PLUGIN = "Hide FuBar plugin"
39 local HIDE_MINIMAP_BUTTON = "Hide minimap button"
40 local HIDE_FUBAR_PLUGIN_DESC = "Hide the FuBar plugin from the panel or minimap, leaving the addon running."
41 local OTHER = "Other"
42 local CLOSE = "Close"
43 local CLOSE_DESC = "Close the menu."
44
45 if GetLocale() == "zhCN" then
46 SHOW_FUBAR_ICON = "显示FuBar图标"
47 SHOW_FUBAR_ICON_DESC = "在面板上显示FuBar插件的图标."
48 SHOW_FUBAR_TEXT = "显示FuBar文字"
49 SHOW_FUBAR_TEXT_DESC = "在面板上显示Fubar插件文字标题"
50 SHOW_COLORED_FUBAR_TEXT = "显示彩色文字"
51 SHOW_COLORED_FUBAR_TEXT_DESC = "允许插件显示彩色文字."
52 DETACH_FUBAR_TOOLTIP = "独立提示信息"
53 DETACH_FUBAR_TOOLTIP_DESC = "从面板上独立显示信息"
54 LOCK_FUBAR_TOOLTIP = "锁定提示信息"
55 LOCK_FUBAR_TOOLTIP_DESC = "锁定提示信息位置.当提示信息被锁定时,你必须要按Alt-鼠标方可查看."
56 POSITION_ON_FUBAR = "位置"
57 POSITION_ON_FUBAR_DESC = "FuBar插件在面板上的位置."
58 POSITION_LEFT = "居左"
59 POSITION_RIGHT = "居右"
60 POSITION_CENTER = "居中"
61 ATTACH_PLUGIN_TO_MINIMAP = "依附在小地图"
62 ATTACH_PLUGIN_TO_MINIMAP_DESC = "插件图标依附在小地图而不显示在面板上."
63 HIDE_FUBAR_PLUGIN = "隐藏FuBar插件"
64 HIDE_MINIMAP_BUTTON = "隐藏小地图按钮"
65 HIDE_FUBAR_PLUGIN_DESC = "隐藏在面板或小地图上的FuBar插件,暂定插件工作."
66 OTHER = "其他"
67 CLOSE = "关闭"
68 LOSE_DESC = "关闭目录."
69 elseif GetLocale() == "zhTW" then
70 SHOW_FUBAR_ICON = "顯示圖示"
71 SHOW_FUBAR_ICON_DESC = "在面板上顯示插件圖示。"
72 SHOW_FUBAR_TEXT = "顯示文字"
73 SHOW_FUBAR_TEXT_DESC = "在面板上顯示插件文字。"
74 SHOW_COLORED_FUBAR_TEXT = "允許彩色文字"
75 SHOW_COLORED_FUBAR_TEXT_DESC = "允許插件在面板上使用彩色文字。"
76 DETACH_FUBAR_TOOLTIP = "獨立提示訊息"
77 DETACH_FUBAR_TOOLTIP_DESC = "從面板上獨立提示訊息。"
78 LOCK_FUBAR_TOOLTIP = "鎖定提示訊息"
79 LOCK_FUBAR_TOOLTIP_DESC = "鎖定提示訊息位置。當提示訊息鎖定時,需要用Alt鍵使用提示訊息的功能。"
80 POSITION_ON_FUBAR = "位置"
81 POSITION_ON_FUBAR_DESC = "插件在面板上的位置。"
82 POSITION_LEFT = "靠左"
83 POSITION_RIGHT = "靠右"
84 POSITION_CENTER = "置中"
85 ATTACH_PLUGIN_TO_MINIMAP = "依附在小地圖"
86 ATTACH_PLUGIN_TO_MINIMAP_DESC = "插件圖標依附在小地圖而不顯示在面板上。"
87 HIDE_FUBAR_PLUGIN = "隱藏插件"
88 HIDE_MINIMAP_BUTTON = "隱藏小地圖按鈕"
89 HIDE_FUBAR_PLUGIN_DESC = "在面板或小地圖上隱藏該插件,但保持執行狀態。"
90 OTHER = "其他"
91 CLOSE = "關閉"
92 CLOSE_DESC = "關閉選單。"
93 elseif GetLocale() == "koKR" then
94 SHOW_FUBAR_ICON = "FuBar 아이콘 표시"
95 SHOW_FUBAR_ICON_DESC = "FuBar 패널에 플러그인 아이콘을 표시합니다."
96 SHOW_FUBAR_TEXT = "FuBar 텍스트 표시"
97 SHOW_FUBAR_TEXT_DESC = "FuBar 페널에 플러그인 텍스트를 표시합니다."
98 SHOW_COLORED_FUBAR_TEXT = "색상화된 FuBar 텍스트 표시"
99 SHOW_COLORED_FUBAR_TEXT_DESC = "패널의 FuBar 플러그인의 텍스트 색상을 허용합니다."
100 DETACH_FUBAR_TOOLTIP = "FuBar 툴팁 분리"
101 DETACH_FUBAR_TOOLTIP_DESC = "패널에서 FuBar 툴팁을 분리합니다."
102 LOCK_FUBAR_TOOLTIP = "툴팁 고정"
103 LOCK_FUBAR_TOOLTIP_DESC = "툴팁 위치를 고정시킵니다. 툴팁이 고정되어 있을때, 마우스로 접근하기 위해 Alt키를 사용하여야 합니다."
104 POSITION_ON_FUBAR = "FuBar 위치"
105 POSITION_ON_FUBAR_DESC = "패널 위의 FuBar 플러그인의 위치를 설정합니다."
106 POSITION_LEFT = "좌측"
107 POSITION_RIGHT = "우측"
108 POSITION_CENTER = "중앙"
109 ATTACH_PLUGIN_TO_MINIMAP = "FuBar 플러그인 미니맵 표시"
110 ATTACH_PLUGIN_TO_MINIMAP_DESC = "FuBar 플러그인을 패널 대신 미니맵에 표시합니다."
111 HIDE_FUBAR_PLUGIN = "FuBar 플러그인 숨김"
112 HIDE_MINIMAP_BUTTON = "미니맵 버튼 숨김"
113 HIDE_FUBAR_PLUGIN_DESC = "FuBar 플러그인을 패널이나 미니맵으로 부터 숨김니다."
114 OTHER = "기타"
115 CLOSE = "닫기"
116 CLOSE_DESC = "메뉴를 닫습니다."
117 elseif GetLocale() == "frFR" then
118 SHOW_FUBAR_ICON = "Afficher l'icône FuBar"
119 SHOW_FUBAR_ICON_DESC = "Affiche l'icône du plugin FuBar sur le panneau."
120 SHOW_FUBAR_TEXT = "Afficher le texte FuBar"
121 SHOW_FUBAR_TEXT_DESC = "Affiche le texte du plugin FuBar sur le panneau."
122 SHOW_COLORED_FUBAR_TEXT = "Afficher le texte FuBar coloré"
123 SHOW_COLORED_FUBAR_TEXT_DESC = "Autorise le plugin FuBar à colorer son texte sur le panneau."
124 DETACH_FUBAR_TOOLTIP = "Détacher l'infobulle FuBar"
125 DETACH_FUBAR_TOOLTIP_DESC = "Détache l'infobulle FuBar du panneau."
126 LOCK_FUBAR_TOOLTIP = "Verrouiller l'infobulle"
127 LOCK_FUBAR_TOOLTIP_DESC = "Verrouille l'infobulle dans sa position actuelle. Quand l'infobulle est verrouillée, vous devez utiliser la touche Alt pour y interagir avec la souris."
128 POSITION_ON_FUBAR = "Position sur FuBar"
129 POSITION_ON_FUBAR_DESC = "Position du plugin FuBar sur le panneau."
130 POSITION_LEFT = "Gauche"
131 POSITION_RIGHT = "Droite"
132 POSITION_CENTER = "Centre"
133 ATTACH_PLUGIN_TO_MINIMAP = "Attacher le plugin FuBar sur la minicarte"
134 ATTACH_PLUGIN_TO_MINIMAP_DESC = "Attache le plugin FuBar sur la minicarte au lieu du panneau."
135 HIDE_FUBAR_PLUGIN = "Masquer le plugin FuBar"
136 HIDE_MINIMAP_BUTTON = "Masquer le bouton de la minicarte"
137 HIDE_FUBAR_PLUGIN_DESC = "Masque le plugin FuBar du panneau ou de la minicarte, laissant l'addon fonctionner."
138 OTHER = "Autre"
139 CLOSE = "Fermer"
140 CLOSE_DESC = "Ferme le menu."
141 end
142
143 -- #AUTODOC_NAMESPACE FuBarPlugin
144
145 local precondition, argCheck = Rock:GetContractFunctions(MAJOR_VERSION, "precondition", "argCheck")
146 local newList, del = Rock:GetRecyclingFunctions(MAJOR_VERSION, "newList", "del")
147
148 FuBarPlugin.pluginToFrame = oldLib and oldLib.pluginToFrame or {}
149 local pluginToFrame = FuBarPlugin.pluginToFrame
150 FuBarPlugin.pluginToMinimapFrame = oldLib and oldLib.pluginToMinimapFrame or {}
151 local pluginToMinimapFrame = FuBarPlugin.pluginToMinimapFrame
152 FuBarPlugin.pluginToPanel = oldLib and oldLib.pluginToPanel or {}
153 local pluginToPanel = FuBarPlugin.pluginToPanel
154 FuBarPlugin.pluginToOptions = oldLib and oldLib.pluginToOptions or {}
155 local pluginToOptions = FuBarPlugin.pluginToOptions
156 FuBarPlugin.folderNames = oldLib and oldLib.folderNames or {}
157 local folderNames = FuBarPlugin.folderNames
158
159 local Tablet20
160 local Dewdrop20
161
162 FuBarPlugin.MinimapContainer = oldLib and oldLib.MinimapContainer or {}
163 local MinimapContainer = FuBarPlugin.MinimapContainer
164
165 local epsilon = 1e-5
166
167 -- #AUTODOC_NAMESPACE FuBarPlugin
168
169 --[[---------------------------------------------------------------------------
170 Notes:
171 *Set metadata about a certain plugin.
172 ; tooltipType : string -
173 : "GameTooltip"
174 :: Use Blizzard's GameTooltip. (default if not given)
175 : "Tablet-2.0"
176 :: Use Tablet-2.0.
177 : "Custom"
178 :: LibFuBarPlugin-3.0 will not provide any extra mechanisms, all done manually.
179 ; configType : string -
180 : "LibRockConfig-1.0"
181 :: Use LibRockConfig-1.0 to show configuration. (default if not given)
182 : "Dewdrop-2.0"
183 :: Use Dewdrop-2.0.
184 ; hasNoText : boolean - If set to true, then it will be a text-less frame.
185 ; iconPath : string - the path of the icon to show.
186 ; hasNoColor : boolean - If set to true, then it is assumed that no color will be in the text (and thus not show the menu item)
187 ; cannotHideText : boolean - If set to true, then the menu item to hide text will not be shown.
188 ; overrideMenu : boolean - If set to true, then the menu will not show any of the standard menu items
189 ; hideMenuTitle : boolean - If set to true, the plugins name will not be added to the top of the menu as a header.
190 ; defaultPosition : string -
191 : "LEFT"
192 ::show on the left. (default if not given)
193 : "CENTER"
194 ::show in the center.
195 : "RIGHT"
196 ::show on the right.
197 : "MINIMAP"
198 ::show on the minimap.
199 ; defaultMinimapPosition : number - Angle on the minimap, in degrees. [0, 360)
200 ; clickableTooltip : boolean - Whether you can drag your mouse onto the tooltip and click a line
201 ; tooltipHiddenWhenEmpty : boolean - Whether the detached tooltip is hidden when it is empty.
202 ; cannotDetachTooltip : boolean - Whether the tooltip cannot be detached from the plugin text.
203 ::Normally, a tooltip can detach (if using Tablet-2.0). This should be set if there is no relevant data in the tooltip.
204 ; independentProfile : boolean - If set to true, then the profile setting will not be stripped from .OnMenuRequest, and FuBar will not set the plugin's profile when it changes.
205 ::non-FuBar-centric plugins should set this to true.
206 Arguments:
207 string - the key to set
208 value - the value to set said key to.
209 Example:
210 self:SetFuBarOption('tooltipType', "Tablet-2.0")
211 -----------------------------------------------------------------------------]]
212 function FuBarPlugin:SetFuBarOption(key, value)
213 local pluginToOptions_self = pluginToOptions[self]
214 if not pluginToOptions_self then
215 pluginToOptions_self = {}
216 pluginToOptions[self] = pluginToOptions_self
217 end
218
219 pluginToOptions_self[key] = value
220
221 if key == 'tooltipType' then
222 if value == "Tablet-2.0" then
223 Tablet20 = Rock("Tablet-2.0", false, true)
224 if not Tablet20 then
225 error(("Cannot specify %q = %q if %q is not loaded."):format(key, value, value), 2)
226 end
227 end
228 end
229 if key == 'configType' then
230 if value == "Dewdrop-2.0" then
231 Dewdrop20 = Rock("Dewdrop-2.0", false, true)
232 if not Dewdrop20 then
233 error(("Cannot specify %q = %q if %q is not loaded."):format(key, value, value), 2)
234 end
235 end
236 end
237 end
238 precondition(FuBarPlugin, 'SetFuBarOption', function(self, key, value)
239 argCheck(self, 1, "table")
240 argCheck(key, 2, "string")
241 argCheck(value, 3, "string", "number", "boolean")
242
243 if pluginToOptions[self] and pluginToOptions[self][key] ~= nil then
244 error(("Bad argument #2 to `SetFuBarOption'. Cannot specify %q more than once."):format(key), 3)
245 end
246 end)
247
248 local function getPluginOption(object, key, default)
249 local pluginToOptions_object = pluginToOptions[object]
250 if pluginToOptions_object == nil then
251 return default
252 end
253 local value = pluginToOptions_object[key]
254 if value == nil then
255 return default
256 end
257 return value
258 end
259
260 local good = nil
261 local function CheckFuBar()
262 if not good then
263 if FuBar then
264 local version = FuBar.version
265 if type(version) == "string" then
266 local num = version:match("^(%d+%.?%d*)")
267 if num then
268 num = tonumber(num)
269 good = num >= 3
270 end
271 end
272 end
273 end
274 return good
275 end
276
277 --[[---------------------------------------------------------------------------
278 Returns:
279 string - the localized name of the plugin, not including the "FuBar - " part.
280 Example
281 local title = self:GetTitle()
282 -----------------------------------------------------------------------------]]
283 function FuBarPlugin:GetTitle()
284 local name = self.title or self.name
285 if type(name) ~= "string" then
286 error("You must provide self.title or self.name", 2)
287 end
288 local title = name:match("[Ff][Uu][Bb][Aa][Rr]%s*%-%s*(.-)%s*$") or name
289 return title:gsub("|c%x%x%x%x%x%x%x%x", ""):gsub("|r", "")
290 end
291
292 --[[---------------------------------------------------------------------------
293 Returns:
294 string - name of the plugin.
295 Notes:
296 This is here for FuBar core to communicate properly.
297 Example:
298 local name = self:GetName()
299 -----------------------------------------------------------------------------]]
300 function FuBarPlugin:GetName()
301 return self.name
302 end
303
304 --[[---------------------------------------------------------------------------
305 Returns:
306 string - category of the plugin.
307 Notes:
308 This is here for FuBar core to communicate properly.
309 Example:
310 local category = self:GetCategory()
311 -----------------------------------------------------------------------------]]
312 function FuBarPlugin:GetCategory()
313 return self.category or OTHER
314 end
315
316 --[[---------------------------------------------------------------------------
317 Returns:
318 frame - frame for the plugin.
319 Notes:
320 This is here for FuBar core to communicate properly.
321 Example:
322 local frame = self:GetFrame()
323 -----------------------------------------------------------------------------]]
324 function FuBarPlugin:GetFrame()
325 return pluginToFrame[self]
326 end
327
328 --[[---------------------------------------------------------------------------
329 Returns:
330 object - panel for the plugin.
331 Notes:
332 This is here for FuBar core to communicate properly.
333 Example:
334 local panel = self:GetPanel()
335 -----------------------------------------------------------------------------]]
336 function FuBarPlugin:GetPanel()
337 return pluginToPanel[self]
338 end
339
340 local function getLazyDatabaseValueDefault(object, value, ...)
341 local object_db = object.db
342 if type(object_db) ~= "table" then
343 return value
344 end
345 local current = object_db.profile
346 for i = 1, select('#', ...) do
347 -- traverse through, make sure tables exist.
348 if type(current) ~= "table" then
349 return value
350 end
351 current = current[(select(i, ...))]
352 end
353 if current == nil then
354 return value
355 else
356 return current
357 end
358 end
359
360 local function getLazyDatabaseValue(object, ...)
361 return getLazyDatabaseValueDefault(object, nil, ...)
362 end
363
364 local function setLazyDatabaseValue(object, value, ...)
365 local object_db = object.db
366 if type(object_db) ~= "table" then
367 return nil
368 end
369 local current = object_db.profile
370 if type(current) ~= "table" then
371 return nil
372 end
373 local n = select('#', ...)
374 for i = 1, n-1 do
375 -- traverse through, create tables if necessary.
376 local nextOne = current[(select(i, ...))]
377 if type(nextOne) ~= "table" then
378 if nextOne ~= nil then
379 return nil
380 end
381 nextOne = {}
382 current[(select(i, ...))] = nextOne
383 end
384 current = nextOne
385 end
386 current[select(n, ...)] = value
387 return true
388 end
389
390 --[[---------------------------------------------------------------------------
391 Returns:
392 boolean - whether the text has color applied.
393 Example:
394 local colored = self:IsFuBarTextColored()
395 -----------------------------------------------------------------------------]]
396 function FuBarPlugin:IsFuBarTextColored()
397 return not getLazyDatabaseValue(self, 'uncolored')
398 end
399
400 --[[---------------------------------------------------------------------------
401 Notes:
402 Toggles whether the text has color applied
403 Example:
404 self:ToggleTextColored()
405 -----------------------------------------------------------------------------]]
406 function FuBarPlugin:ToggleFuBarTextColored()
407 if not setLazyDatabaseValue(self, not getLazyDatabaseValue(self, 'uncolored') or nil, 'uncolored') then
408 error(("%s: Cannot change text color if self.db is not available."):format(self:GetTitle()), 2)
409 end
410 self:UpdateFuBarText()
411 end
412
413 --[[---------------------------------------------------------------------------
414 Returns:
415 boolean - whether the plugin is attached to the minimap.
416 Example:
417 local attached = self:IsMinimapAttached()
418 -----------------------------------------------------------------------------]]
419 function FuBarPlugin:IsFuBarMinimapAttached()
420 if not CheckFuBar() then
421 return true
422 end
423 return pluginToPanel[self] == MinimapContainer
424 end
425
426 --[[---------------------------------------------------------------------------
427 Notes:
428 Toggles whether the plugin is attached to the minimap.
429 Example:
430 self:ToggleMinimapAttached()
431 -----------------------------------------------------------------------------]]
432 function FuBarPlugin:ToggleFuBarMinimapAttached()
433 if CheckFuBar() and not getPluginOption(self, 'cannotAttachToMinimap', false) then
434 local panel = pluginToPanel[self]
435 local value = panel == MinimapContainer
436 if value then
437 panel:RemovePlugin(self)
438 local defaultPosition = getPluginOption(self, 'defaultPosition', "LEFT")
439 FuBar:GetPanel(1):AddPlugin(self, nil, defaultPosition == "MINIMAP" and "LEFT" or defaultPosition)
440 else
441 if panel then
442 panel:RemovePlugin(self)
443 end
444 MinimapContainer:AddPlugin(self)
445 end
446 end
447 end
448
449 --[[---------------------------------------------------------------------------
450 Notes:
451 Calls :UpdateFuBarText() and :UpdateFuBarTooltip(), in that order.
452 Example:
453 self:UpdateFuBarPlugin()
454 -----------------------------------------------------------------------------]]
455 function FuBarPlugin:UpdateFuBarPlugin()
456 self:UpdateFuBarText()
457 self:UpdateFuBarTooltip()
458 end
459
460 --[[---------------------------------------------------------------------------
461 Notes:
462 * Calls :OnUpdateFuBarText() if it is available and the plugin is not disabled.
463 * It is expected to update the icon in :OnUpdateFuBarText as well as text.
464 Example:
465 self:UpdateFuBarText()
466 -----------------------------------------------------------------------------]]
467 function FuBarPlugin:UpdateFuBarText()
468 if type(self.OnUpdateFuBarText) == "function" then
469 if not self:IsDisabled() then
470 self:OnUpdateFuBarText()
471 end
472 elseif self:IsFuBarTextShown() then
473 self:SetFuBarText(self:GetTitle())
474 end
475 end
476
477 local function Tablet20_point(frame)
478 if frame:GetTop() > GetScreenHeight() / 2 then
479 local x = frame:GetCenter()
480 if x < GetScreenWidth() / 3 then
481 return "TOPLEFT", "BOTTOMLEFT"
482 elseif x < GetScreenWidth() * 2 / 3 then
483 return "TOP", "BOTTOM"
484 else
485 return "TOPRIGHT", "BOTTOMRIGHT"
486 end
487 else
488 local x = frame:GetCenter()
489 if x < GetScreenWidth() / 3 then
490 return "BOTTOMLEFT", "TOPLEFT"
491 elseif x < GetScreenWidth() * 2 / 3 then
492 return "BOTTOM", "TOP"
493 else
494 return "BOTTOMRIGHT", "TOPRIGHT"
495 end
496 end
497 end
498
499 local function RegisterTablet20(self)
500 local frame = pluginToFrame[self]
501 if not Tablet20:IsRegistered(frame) then
502 local db = getLazyDatabaseValue(self)
503 if db and not db.detachedTooltip then
504 db.detachedTooltip = {}
505 end
506 Tablet20:Register(frame,
507 'children', function()
508 Tablet20:SetTitle(self:GetTitle())
509 if type(self.OnUpdateFuBarTooltip) == "function" then
510 if not self:IsDisabled() then
511 self:OnUpdateFuBarTooltip()
512 end
513 end
514 end,
515 'clickable', getPluginOption(self, 'clickableTooltip', false),
516 'data', CheckFuBar() and FuBar.db.profile.tooltip or db and db.detachedTooltip or {},
517 'detachedData', db and db.detachedTooltip or {},
518 'point', Tablet20_point,
519 'menu', self.OnMenuRequest and function(level, value, valueN_1, valueN_2, valueN_3, valueN_4)
520 if level == 1 then
521 local name = tostring(self)
522 if not name:find('^table:') then
523 name = name:gsub("|c%x%x%x%x%x%x%x%x(.-)|r", "%1")
524 Rock("Dewdrop-2.0"):AddLine(
525 'text', name,
526 'isTitle', true
527 )
528 end
529 end
530 if type(self.OnMenuRequest) == "function" then
531 self:OnMenuRequest(level, value, true, valueN_1, valueN_2, valueN_3, valueN_4)
532 elseif type(self.OnMenuRequest) == "table" then
533 Rock("Dewdrop-2.0"):FeedAceOptionsTable(self.OnMenuRequest)
534 end
535 end,
536 'hideWhenEmpty', getPluginOption(self, 'tooltipHiddenWhenEmpty', false)
537 )
538 local func = pluginToFrame[self]:GetScript("OnEnter")
539 frame:SetScript("OnEnter", function(this, ...)
540 -- HACK
541 func(this, ...)
542
543 if FuBar and FuBar.IsHidingTooltipsInCombat and FuBar:IsHidingTooltipsInCombat() and InCombatLockdown() then
544 if Tablet20:IsAttached(this) then
545 Tablet20:Close(this)
546 end
547 end
548 end)
549 end
550 end
551
552 --[[---------------------------------------------------------------------------
553 Notes:
554 Calls :OnUpdateFuBarTooltip() if it is available, the plugin is not disabled, and the tooltip is shown.
555 Example:
556 self:UpdateFuBarTooltip()
557 -----------------------------------------------------------------------------]]
558 function FuBarPlugin:UpdateFuBarTooltip()
559 local tooltipType = getPluginOption(self, 'tooltipType', "GameTooltip")
560
561 if tooltipType == "GameTooltip" then
562 local frame = self:IsFuBarMinimapAttached() and pluginToMinimapFrame[self] or pluginToFrame[self]
563 if not GameTooltip:IsOwned(frame) then
564 return
565 end
566 GameTooltip:Hide()
567
568 local anchor
569 if frame:GetTop() > GetScreenHeight() / 2 then
570 local x = frame:GetCenter()
571 if x < GetScreenWidth() / 2 then
572 anchor = "ANCHOR_BOTTOMRIGHT"
573 else
574 anchor = "ANCHOR_BOTTOMLEFT"
575 end
576 else
577 local x = frame:GetCenter()
578 if x < GetScreenWidth() / 2 then
579 anchor = "ANCHOR_TOPLEFT"
580 else
581 anchor = "ANCHOR_TOPRIGHT"
582 end
583 end
584 GameTooltip:SetOwner(frame, anchor)
585 if type(self.OnUpdateFuBarTooltip) == "function" and not self:IsDisabled() then
586 self:OnUpdateFuBarTooltip()
587 end
588 GameTooltip:Show()
589 return
590 elseif tooltipType == "Custom" then
591 if type(self.OnUpdateFuBarTooltip) == "function" and not self:IsDisabled() then
592 self:OnUpdateFuBarTooltip()
593 end
594 return
595 elseif tooltipType == "Tablet-2.0" then
596 RegisterTablet20(self)
597 if self:IsFuBarMinimapAttached() and not self:IsFuBarTooltipDetached() and pluginToMinimapFrame[self] then
598 Tablet20:Refresh(pluginToMinimapFrame[self])
599 else
600 Tablet20:Refresh(pluginToFrame[self])
601 end
602 elseif tooltipType == "None" then
603 return
604 else
605 error(("Unknown %s option for %q: %q"):format(MAJOR_VERSION, 'tooltipType', tostring(tooltipType)), 2)
606 end
607 end
608
609 --[[---------------------------------------------------------------------------
610 Notes:
611 Shows the plugin, enables the plugin if previously disabled, and calls :UpdateFuBarPlugin().
612 Example:
613 self:Show()
614 -----------------------------------------------------------------------------]]
615 function FuBarPlugin:Show(panelId)
616 if pluginToFrame[self]:IsShown() or (pluginToMinimapFrame[self] and pluginToMinimapFrame[self]:IsShown()) then
617 return
618 end
619 if panelId ~= false then
620 setLazyDatabaseValue(self, nil, 'hidden')
621 end
622 if self.IsActive and not self:IsActive() then
623 self.panelIdTmp = panelId
624 self:ToggleActive()
625 self.panelIdTmp = nil
626 setLazyDatabaseValue(self, nil, 'disabled')
627 elseif not getLazyDatabaseValue(self, 'hidden') then
628 if panelId == 0 or not CheckFuBar() then
629 MinimapContainer:AddPlugin(self)
630 else
631 FuBar:ShowPlugin(self, panelId or self.panelIdTmp)
632 end
633 if not getPluginOption(self, 'userDefinedFrame', false) then
634 if not self:IsFuBarTextShown() then
635 local text = pluginToFrame[self].text
636 text:SetText("")
637 text:SetWidth(epsilon)
638 text:Hide()
639 end
640 if not self:IsFuBarIconShown() then
641 local icon = pluginToFrame[self].icon
642 icon:SetWidth(epsilon)
643 icon:Hide()
644 end
645 end
646 self:UpdateFuBarPlugin()
647 end
648 end
649
650 --[[---------------------------------------------------------------------------
651 Notes:
652 Hides the plugin, disables the plugin if cannot hide without standby.
653 Arguments:
654 [optional] boolean - internal variable. Do not set this.
655 Example:
656 self:Hide()
657 -----------------------------------------------------------------------------]]
658 function FuBarPlugin:Hide(check)
659 if not pluginToFrame[self]:IsShown() and (not pluginToMinimapFrame[self] or not pluginToMinimapFrame[self]:IsShown()) then
660 return
661 end
662 local hideWithoutStandby = getPluginOption(self, 'hideWithoutStandby', false)
663 if hideWithoutStandby and check ~= false then
664 setLazyDatabaseValue(self, true, 'hidden')
665 end
666 if not hideWithoutStandby then
667 if getPluginOption(self, 'tooltipType', "GameTooltip") == "Tablet-2.0" and not getPluginOption(self, 'cannotDetachTooltip', false) and self:IsFuBarTooltipDetached() and getLazyDatabaseValue(self, 'detachedTooltip', 'detached') then
668 self:ReattachTooltip()
669 setLazyDatabaseValue(self, true, 'detachedTooltip', 'detached')
670 end
671 if self.IsActive and self:IsActive() and self.ToggleActive and (not CheckFuBar() or not FuBar:IsChangingProfile()) then
672 self:ToggleActive()
673 end
674 end
675 if pluginToPanel[self] then
676 pluginToPanel[self]:RemovePlugin(self)
677 end
678 pluginToFrame[self]:Hide()
679 if pluginToMinimapFrame[self] then
680 pluginToMinimapFrame[self]:Hide()
681 end
682 end
683
684 --[[---------------------------------------------------------------------------
685 Notes:
686 Sets the path to the icon for the plugin.
687 Arguments:
688 string or nil - The path to the icon. If nil, then no icon.
689 Example:
690 self:SetFuBarIcon("Interface\\AddOns\\MyAddon\\otherIcon")
691 -----------------------------------------------------------------------------]]
692 function FuBarPlugin:SetFuBarIcon(path)
693 if not path then
694 return
695 end
696 if not pluginToFrame[self] or not pluginToFrame[self].icon then
697 return
698 end
699 if path:match([[^Interface\Icons\]]) then
700 pluginToFrame[self].icon:SetTexCoord(0.05, 0.95, 0.05, 0.95)
701 else
702 pluginToFrame[self].icon:SetTexCoord(0, 1, 0, 1)
703 end
704 pluginToFrame[self].icon:SetTexture(path)
705 if pluginToMinimapFrame[self] and pluginToMinimapFrame[self].icon then
706 if path:match([[^Interface\Icons\]]) then
707 pluginToMinimapFrame[self].icon:SetTexCoord(0.05, 0.95, 0.05, 0.95)
708 else
709 pluginToMinimapFrame[self].icon:SetTexCoord(0, 1, 0, 1)
710 end
711 pluginToMinimapFrame[self].icon:SetTexture(path)
712 end
713 end
714 precondition(FuBarPlugin, 'SetFuBarIcon', function(self, path)
715 if not path then
716 return
717 end
718 argCheck(path, 2, "string", "nil")
719 if not getPluginOption(self, 'iconPath', false) then
720 error(("%s: Cannot set icon unless 'iconPath' is set."):format(self:GetTitle()), 3)
721 end
722 end)
723
724 --[[---------------------------------------------------------------------------
725 Returns:
726 string or nil - The path to the icon for the plugin. If nil, then no icon.
727 Example:
728 local path = self:GetFuBarIcon()
729 -----------------------------------------------------------------------------]]
730 function FuBarPlugin:GetFuBarIcon()
731 if getPluginOption(self, 'iconPath', false) then
732 return pluginToFrame[self] and pluginToFrame[self].icon and pluginToFrame[self].icon:GetTexture()
733 end
734 end
735
736 --[[---------------------------------------------------------------------------
737 Notes:
738 Checks the current width of the icon and text, then updates frame to expand/shrink to it if necessary.
739 Arguments:
740 [optional] boolean - if true, Shrink/expand no matter what, otherwise if the width is less than 8 pixels smaller, don't shrink.
741 Example:
742 self:CheckWidth(true)
743 -----------------------------------------------------------------------------]]
744 function FuBarPlugin:CheckWidth(force)
745 local frame = pluginToFrame[self]
746 if not frame then
747 return
748 end
749 local icon = frame.icon
750 local text = frame.text
751 if (not icon or not icon:IsShown()) and (not text or not text:IsShown()) then
752 return
753 end
754
755 local db = getLazyDatabaseValue(self)
756
757 if (db and not self:IsFuBarIconShown()) or not getPluginOption(self, 'iconPath', false) then
758 icon:SetWidth(epsilon)
759 end
760 local width
761 if not getPluginOption(self, 'hasNoText', false) then
762 text:SetHeight(0)
763 text:SetWidth(500)
764 width = text:GetStringWidth() + 1
765 text:SetWidth(width)
766 text:SetHeight(text:GetHeight())
767 end
768 local panel = pluginToPanel[self]
769 if getPluginOption(self, 'hasNoText', false) or not text:IsShown() then
770 frame:SetWidth(icon:GetWidth())
771 if panel and panel:GetPluginSide(self) == "CENTER" then
772 panel:UpdateCenteredPosition()
773 end
774 elseif force or not frame.textWidth or frame.textWidth < width or frame.textWidth - 8 > width then
775 frame.textWidth = width
776 text:SetWidth(width)
777 if icon and icon:IsShown() then
778 frame:SetWidth(width + icon:GetWidth())
779 else
780 frame:SetWidth(width)
781 end
782 if panel and panel:GetPluginSide(self) == "CENTER" then
783 panel:UpdateCenteredPosition()
784 end
785 end
786 end
787 precondition(FuBarPlugin, 'CheckWidth', function(self, force)
788 argCheck(force, 2, "boolean", "nil")
789 end)
790
791 --[[---------------------------------------------------------------------------
792 Notes:
793 Sets the text of the plugin. Should only be called from within :OnFuBarUpdateText()
794 Arguments:
795 string - text to set the plugin to. If not given, set to title.
796 Example:
797 myAddon.OnFuBarUpdateText = function(self)
798 self:SetFuBarText("Hello")
799 fend
800 -----------------------------------------------------------------------------]]
801 function FuBarPlugin:SetFuBarText(text)
802 local frame = pluginToFrame[self]
803 if not frame or not frame.text then
804 return
805 end
806 if text == "" then
807 if getPluginOption(self, 'iconPath', false) then
808 self:ShowFuBarIcon()
809 else
810 text = self:GetTitle()
811 end
812 end
813 if not self:IsFuBarTextColored() then
814 text = text:gsub("|c%x%x%x%x%x%x%x%x", ""):gsub("|r", "")
815 end
816 frame.text:SetText(text)
817 self:CheckWidth()
818 end
819 precondition(FuBarPlugin, 'SetFuBarText', function(self, text)
820 local frame = pluginToFrame[self]
821 if not frame or not frame.text then
822 return
823 end
824 if getPluginOption(self, 'hasNoText', false) then
825 error(("%s: Cannot set text if 'hasNoText' has been set."):format(self:GetTitle()), 3)
826 end
827 argCheck(text, 2, "string", "number")
828 end)
829
830 --[[---------------------------------------------------------------------------
831 Returns:
832 string - The current text of the plugin.
833 Example:
834 local text = self:GetFuBarText()
835 -----------------------------------------------------------------------------]]
836 function FuBarPlugin:GetFuBarText()
837 local frame = pluginToFrame[self]
838 if not frame or not frame.text then
839 error(("%s: Cannot get text without a text frame."):format(self:GetTitle()), 2)
840 end
841 if not getPluginOption(self, 'hasNoText', false) then
842 return frame.text:GetText() or ""
843 end
844 end
845
846 --[[---------------------------------------------------------------------------
847 Returns:
848 boolean - whether the icon for the plugin is showing.
849 Example:
850 local isIconShowing = self:IsFuBarIconShown()
851 -----------------------------------------------------------------------------]]
852 function FuBarPlugin:IsFuBarIconShown()
853 if not getPluginOption(self, 'iconPath', false) then
854 return false
855 elseif getPluginOption(self, 'hasNoText', false) then
856 return true
857 end
858 return not not getLazyDatabaseValueDefault(self, true, 'showIcon')
859 end
860
861 --[[---------------------------------------------------------------------------
862 Notes:
863 Toggles whether the icon for the plugin is showing.
864 Example:
865 self:ToggleFuBarIconShown()
866 -----------------------------------------------------------------------------]]
867 function FuBarPlugin:ToggleFuBarIconShown()
868 local frame = pluginToFrame[self]
869 local icon = frame and frame.icon
870 local text = frame and frame.text
871 if not icon then
872 error(("%s: Cannot toggle icon without an icon frame."):format(self:GetTitle()), 2)
873 elseif not text then
874 error(("%s: Cannot toggle icon without a text frame."):format(self:GetTitle()), 2)
875 elseif not getPluginOption(self, 'iconPath', false) then
876 error(("%s: Cannot show icon unless 'iconPath' is set."):format(self:GetTitle()), 2)
877 elseif getPluginOption(self, 'hasNoText', false) then
878 error(("%s: Cannot show icon if 'hasNoText' is set."):format(self:GetTitle()), 2)
879 elseif not getLazyDatabaseValue(self) then
880 error(("%s: Cannot hide icon if self.db is not available."):format(self:GetTitle()), 2)
881 end
882 local value = not self:IsFuBarIconShown()
883 setLazyDatabaseValue(self, value, 'showIcon')
884 if value then
885 if not self:IsFuBarTextShown() and text:IsShown() and text:GetText() == self:GetTitle() then
886 text:Hide()
887 text:SetText("")
888 end
889 icon:Show()
890 icon:SetWidth(pluginToFrame[self].icon:GetHeight())
891 self:UpdateFuBarText()
892 else
893 if not text:IsShown() or not text:GetText() or text:GetText() == "" then
894 text:Show()
895 text:SetText(self:GetTitle())
896 end
897 icon:Hide()
898 icon:SetWidth(epsilon)
899 end
900 self:CheckWidth(true)
901 return value
902 end
903
904 --[[---------------------------------------------------------------------------
905 Notes:
906 Shows the icon of the plugin if hidden.
907 Example:
908 self:ShowFuBarIcon()
909 -----------------------------------------------------------------------------]]
910 function FuBarPlugin:ShowFuBarIcon()
911 if not self:IsFuBarIconShown() then
912 self:ToggleFuBarIconShown()
913 end
914 end
915
916 --[[---------------------------------------------------------------------------
917 Notes:
918 Hides the icon of the plugin if shown.
919 Example:
920 self:HideFuBarIcon()
921 -----------------------------------------------------------------------------]]
922 function FuBarPlugin:HideFuBarIcon()
923 if self:IsFuBarIconShown() then
924 self:ToggleFuBarIconShown()
925 end
926 end
927
928 --[[---------------------------------------------------------------------------
929 Returns:
930 boolean - whether the text for the plugin is showing.
931 Example:
932 local isTextShowing = self:IsFuBarTextShown()
933 -----------------------------------------------------------------------------]]
934 function FuBarPlugin:IsFuBarTextShown()
935 if getPluginOption(self, 'hasNoText', false) then
936 return false
937 elseif not getPluginOption(self, 'iconPath', false) then
938 return true
939 end
940 return not not getLazyDatabaseValueDefault(self, true, 'showText')
941 end
942
943 --[[---------------------------------------------------------------------------
944 Notes:
945 Toggles whether the text for the plugin is showing.
946 Example:
947 self:ToggleFuBarTextShown()
948 -----------------------------------------------------------------------------]]
949 function FuBarPlugin:ToggleFuBarTextShown()
950 local frame = pluginToFrame[self]
951 local icon = frame and frame.icon
952 local text = frame and frame.text
953 if not icon then
954 error(("%s: Cannot toggle text without an icon frame."):format(self:GetTitle()), 2)
955 elseif not text then
956 error(("%s: Cannot toggle text without a text frame."):format(self:GetTitle()), 2)
957 elseif getPluginOption(self, 'cannotHideText', false) then
958 error(("%s: Cannot toggle text if 'cannotHideText' is set."):format(self:GetTitle()), 2)
959 elseif not getPluginOption(self, 'iconPath', false) then
960 error(("%s: Cannot toggle text unless 'iconPath' is set."):format(self:GetTitle()), 2)
961 elseif getPluginOption(self, 'hasNoText', false) then
962 error(("%s: Cannot toggle text if 'hasNoText' is set."):format(self:GetTitle()), 2)
963 elseif not getLazyDatabaseValue(self) then
964 error(("%s: Cannot toggle text if self.db is not available."):format(self:GetTitle()), 2)
965 end
966 local value = not self:IsFuBarTextShown()
967 setLazyDatabaseValue(self, value, 'showText')
968 if value then
969 text:Show()
970 self:UpdateFuBarText()
971 else
972 text:SetText("")
973 text:SetWidth(epsilon)
974 text:Hide()
975 self:ShowFuBarIcon()
976 end
977 self:CheckWidth(true)
978 return value
979 end
980
981 --[[---------------------------------------------------------------------------
982 Notes:
983 Shows the text of the plugin if hidden.
984 Example:
985 self:ShowFuBarText()
986 -----------------------------------------------------------------------------]]
987 function FuBarPlugin:ShowFuBarText()
988 if not self:IsFuBarTextShown() then
989 self:ToggleFuBarTextShown()
990 end
991 end
992
993 --[[---------------------------------------------------------------------------
994 Notes:
995 Hides the text of the plugin if shown.
996 Example:
997 self:HideFuBarText()
998 -----------------------------------------------------------------------------]]
999 function FuBarPlugin:HideFuBarText()
1000 if self:IsFuBarTextShown() then
1001 self:ToggleFuBarTextShown()
1002 end
1003 end
1004
1005 --[[---------------------------------------------------------------------------
1006 Returns:
1007 string - default position of the plugin.
1008 Notes:
1009 This is here for FuBar core to communicate properly.
1010 Example:
1011 local pos = self:GetDefaultPosition()
1012 -----------------------------------------------------------------------------]]
1013 function FuBarPlugin:GetDefaultPosition()
1014 return getPluginOption(self, 'defaultPosition', "LEFT")
1015 end
1016
1017 --[[---------------------------------------------------------------------------
1018 Returns:
1019 boolean - Whether the tooltip is detached.
1020 Example:
1021 local detached = self:IsFuBarTooltipDetached()
1022 -----------------------------------------------------------------------------]]
1023 function FuBarPlugin:IsFuBarTooltipDetached()
1024 local tooltipType = getPluginOption(self, 'tooltipType', "GameTooltip")
1025 if tooltipType ~= "Tablet-2.0" then
1026 return
1027 end
1028
1029 RegisterTablet20(self)
1030 return not Tablet20:IsAttached(pluginToFrame[self])
1031 end
1032
1033 --[[---------------------------------------------------------------------------
1034 Notes:
1035 Toggles whether the tooltip is detached.
1036 Example:
1037 self:ToggleFuBarTooltipDetached()
1038 -----------------------------------------------------------------------------]]
1039 function FuBarPlugin:ToggleFuBarTooltipDetached()
1040 local tooltipType = getPluginOption(self, 'tooltipType', "GameTooltip")
1041 if tooltipType ~= "Tablet-2.0" then
1042 return
1043 end
1044
1045 RegisterTablet20(self)
1046 if Tablet20:IsAttached(pluginToFrame[self]) then
1047 Tablet20:Detach(pluginToFrame[self])
1048 else
1049 Tablet20:Attach(pluginToFrame[self])
1050 end
1051 end
1052
1053 --[[---------------------------------------------------------------------------
1054 Notes:
1055 * Detaches the tooltip from the plugin.
1056 * This does nothing if already detached.
1057 Example:
1058 self:DetachFuBarTooltip()
1059 -----------------------------------------------------------------------------]]
1060 function FuBarPlugin:DetachFuBarTooltip()
1061 if not self:IsFuBarTooltipDetached() then
1062 self:ToggleFuBarTooltipDetached()
1063 end
1064 end
1065
1066 --[[---------------------------------------------------------------------------
1067 Notes:
1068 Reattaches the tooltip to the plugin.
1069 This does nothing if already attached.
1070 Example:
1071 self:ReattachFuBarTooltip()
1072 -----------------------------------------------------------------------------]]
1073 function FuBarPlugin:ReattachFuBarTooltip()
1074 if self:IsFuBarTooltipDetached() then
1075 self:ToggleFuBarTooltipDetached()
1076 end
1077 end
1078
1079 local function IsCorrectPanel(panel)
1080 if type(panel) ~= "table" then
1081 return false
1082 elseif type(panel.AddPlugin) ~= "function" then
1083 return false
1084 elseif type(panel.RemovePlugin) ~= "function" then
1085 return false
1086 elseif type(panel.GetNumPlugins) ~= "function" then
1087 return false
1088 elseif type(panel:GetNumPlugins()) ~= "number" then
1089 return false
1090 elseif type(panel.GetPlugin) ~= "function" then
1091 return false
1092 elseif type(panel.HasPlugin) ~= "function" then
1093 return false
1094 elseif type(panel.GetPluginSide) ~= "function" then
1095 return false
1096 end
1097 return true
1098 end
1099
1100 -- #NODOC
1101 -- this is used internally by FuBar
1102 function FuBarPlugin:SetPanel(panel)
1103 pluginToPanel[self] = panel
1104 end
1105 precondition(FuBarPlugin, 'SetPanel', function(self, panel)
1106 argCheck(panel, 2, "table", "nil")
1107 if panel and not IsCorrectPanel(panel) then
1108 error("Bad argument #2 to `SetPanel'. Panel does not have the correct API.", 3)
1109 end
1110 end)
1111
1112 -- #NODOC
1113 -- this is used internally by FuBar
1114 function FuBarPlugin:SetFontSize(size)
1115 if getPluginOption(self, 'userDefinedFrame', false) then
1116 error(("%sYou must provide a :SetFontSize(size) method if you have 'userDefinedFrame' set."):format(self.name and self.name .. ": " or ""), 2)
1117 end
1118 if getPluginOption(self, 'iconPath', false) then
1119 local frame = pluginToFrame[self]
1120 local icon = frame and frame.icon
1121 if not icon then
1122 error(("%sno icon frame found."):format(self.name and self.name .. ": " or ""), 2)
1123 end
1124 icon:SetWidth(size + 3)
1125 icon:SetHeight(size + 3)
1126 end
1127 if not getPluginOption(self, 'hasNoText', false) then
1128 local frame = pluginToFrame[self]
1129 local text = frame and frame.text
1130 if not text then
1131 error(("%sno text frame found."):format(self.name and self.name .. ": " or ""), 2)
1132 end
1133 local font, _, flags = text:GetFont()
1134 text:SetFont(font, size, flags)
1135 end
1136 self:CheckWidth()
1137 end
1138
1139 local function IsLoadOnDemand(plugin)
1140 return IsAddOnLoadOnDemand(folderNames[plugin] or "")
1141 end
1142
1143 -- #NODOC
1144 -- this is used internally by FuBar.
1145 function FuBarPlugin:IsDisabled()
1146 return type(self.IsActive) == "function" and not self:IsActive() or false
1147 end
1148
1149 function FuBarPlugin:OnEmbed(target)
1150 local folder = Rock.addonToFolder[target]
1151 if not folder then
1152 for i = 6, 3, -1 do
1153 folder = debugstack(i, 1, 0):match([[\AddOns\(.*)\]])
1154 if folder then
1155 break
1156 end
1157 end
1158 end
1159 folderNames[target] = folder
1160 end
1161
1162 local frame_OnClick, frame_OnDoubleClick, frame_OnMouseDown, frame_OnMouseUp, frame_OnReceiveDrag, frame_OnEnter, frame_OnLeave
1163 --[[---------------------------------------------------------------------------
1164 Arguments:
1165 [optional] string - name of the frame
1166 Returns:
1167 frame - a frame with the basic scripts to be considered a plugin frame.
1168 Example:
1169 MyPlugin.frame = MyPlugin:CreateBasicPluginFrame("FuBar_MyPluginFrame")
1170 -----------------------------------------------------------------------------]]
1171 function FuBarPlugin:CreateBasicPluginFrame(name)
1172 local frame = CreateFrame("Button", name, UIParent)
1173 frame:SetFrameStrata("HIGH")
1174 frame:SetFrameLevel(7)
1175 frame:EnableMouse(true)
1176 frame:EnableMouseWheel(true)
1177 frame:SetMovable(true)
1178 frame:SetWidth(150)
1179 frame:SetHeight(24)
1180 frame:SetPoint("CENTER", UIParent, "CENTER")
1181 frame.self = self
1182 if not frame_OnEnter then
1183 function frame_OnEnter(this)
1184 local self = this.self
1185 local tooltipType = getPluginOption(self, 'tooltipType', "GameTooltip")
1186 if tooltipType == "GameTooltip" then
1187 GameTooltip:SetOwner(self:IsFuBarMinimapAttached() and pluginToMinimapFrame[self] or pluginToFrame[self], "ANCHOR_CURSOR")
1188 self:UpdateFuBarTooltip()
1189 end
1190 if type(self.OnFuBarEnter) == "function" then
1191 self:OnFuBarEnter()
1192 end
1193 end
1194 end
1195 frame:SetScript("OnEnter", frame_OnEnter)
1196 if not frame_OnLeave then
1197 function frame_OnLeave(this)
1198 local self = this.self
1199 if type(self.OnFuBarLeave) == "function" then
1200 self:OnFuBarLeave()
1201 end
1202 local tooltipType = getPluginOption(self, 'tooltipType', "GameTooltip")
1203 if tooltipType == "GameTooltip" and GameTooltip:IsOwned(self:IsFuBarMinimapAttached() and pluginToMinimapFrame[self] or pluginToFrame[self]) then
1204 GameTooltip:Hide()
1205 end
1206 end
1207 end
1208 frame:SetScript("OnLeave", frame_OnLeave)
1209 if not frame_OnClick then
1210 function frame_OnClick(this, button)
1211 local self = this.self
1212 if self:IsFuBarMinimapAttached() and this.dragged then return end
1213 if type(self.OnFuBarClick) == "function" then
1214 self:OnFuBarClick(button)
1215 end
1216 end
1217 end
1218 frame:SetScript("OnClick", frame_OnClick)
1219 if not frame_OnDoubleClick then
1220 function frame_OnDoubleClick(this, button)
1221 local self = this.self
1222 if type(self.OnFuBarDoubleClick) == "function" then
1223 self:OnFuBarDoubleClick(button)
1224 end
1225 end
1226 end
1227 frame:SetScript("OnDoubleClick", frame_OnDoubleClick)
1228 if not frame_OnMouseDown then
1229 function frame_OnMouseDown(this, button)
1230 local self = this.self
1231 if button == "RightButton" and not IsShiftKeyDown() and not IsControlKeyDown() and not IsAltKeyDown() then
1232 self:OpenMenu()
1233 return
1234 else
1235 if type(self.OnFuBarMouseDown) == "function" then
1236 self:OnFuBarMouseDown(button)
1237 end
1238 end
1239 end
1240 end
1241 frame:SetScript("OnMouseDown", frame_OnMouseDown)
1242 if not frame_OnMouseUp then
1243 function frame_OnMouseUp(this, button)
1244 local self = this.self
1245 if type(self.OnFuBarMouseUp) == "function" then
1246 self:OnFuBarMouseUp(button)
1247 end
1248 end
1249 end
1250 frame:SetScript("OnMouseUp", frame_OnMouseUp)
1251 if not frame_OnReceiveDrag then
1252 function frame_OnReceiveDrag(this)
1253 local self = this.self
1254 if (self:IsFuBarMinimapAttached() and not this.dragged) and type(self.OnReceiveDrag) == "function" then
1255 self:OnFuBarReceiveDrag()
1256 end
1257 end
1258 end
1259 frame:SetScript("OnReceiveDrag", frame_OnReceiveDrag)
1260 return frame
1261 end
1262
1263 local child_OnEnter, child_OnLeave, child_OnClick, child_OnDoubleClick, child_OnMouseDown, child_OnMouseUp, child_OnReceiveDrag
1264 --[[---------------------------------------------------------------------------
1265 Arguments:
1266 string - type of the frame, e.g. "Frame", "Button", etc.
1267 [optional] string - name of the frame
1268 [optional] frame - parent frame
1269 Returns:
1270 frame - a child frame that can be manipulated and used
1271 Example:
1272 local child = self:CreatePluginChildFrame("Frame", nil, self.frame)
1273 -----------------------------------------------------------------------------]]
1274 function FuBarPlugin:CreatePluginChildFrame(frameType, name, parent)
1275 local child = CreateFrame(frameType, name, parent)
1276 if parent then
1277 child:SetFrameLevel(parent:GetFrameLevel() + 2)
1278 end
1279 child.self = self
1280 if not child_OnEnter then
1281 function child_OnEnter(this, ...)
1282 local self = this.self
1283 local frame = pluginToFrame[self]
1284 if frame:GetScript("OnEnter") then
1285 frame:GetScript("OnEnter")(frame, ...)
1286 end
1287 end
1288 end
1289 child:SetScript("OnEnter", child_OnEnter)
1290 if not child_OnLeave then
1291 function child_OnLeave(this, ...)
1292 local self = this.self
1293 local frame = pluginToFrame[self]
1294 if frame:GetScript("OnLeave") then
1295 frame:GetScript("OnLeave")(frame, ...)
1296 end
1297 end
1298 end
1299 child:SetScript("OnLeave", child_OnLeave)
1300 if child:HasScript("OnClick") then
1301 if not child_OnClick then
1302 function child_OnClick(this, ...)
1303 local self = this.self
1304 local frame = pluginToFrame[self]
1305 if frame:HasScript("OnClick") and frame:GetScript("OnClick") then
1306 frame:GetScript("OnClick")(frame, ...)
1307 end
1308 end
1309 end
1310 child:SetScript("OnClick", child_OnClick)
1311 end
1312 if child:HasScript("OnDoubleClick") then
1313 if not child_OnDoubleClick then
1314 function child_OnDoubleClick(this, ...)
1315 local self = this.self
1316 local frame = pluginToFrame[self]
1317 if frame:HasScript("OnDoubleClick") and frame:GetScript("OnDoubleClick") then
1318 frame:GetScript("OnDoubleClick")(frame, ...)
1319 end
1320 end
1321 end
1322 child:SetScript("OnDoubleClick", child_OnDoubleClick)
1323 end
1324 if not child_OnMouseDown then
1325 function child_OnMouseDown(this, ...)
1326 local self = this.self
1327 local frame = pluginToFrame[self]
1328 if frame:HasScript("OnMouseDown") and frame:GetScript("OnMouseDown") then
1329 frame:GetScript("OnMouseDown")(frame, ...)
1330 end
1331 end
1332 end
1333 child:SetScript("OnMouseDown", child_OnMouseDown)
1334 if not child_OnMouseUp then
1335 function child_OnMouseUp(this, ...)
1336 local self = this.self
1337 local frame = pluginToFrame[self]
1338 if frame:HasScript("OnMouseUp") and frame:GetScript("OnMouseUp") then
1339 frame:GetScript("OnMouseUp")(frame, ...)
1340 end
1341 end
1342 end
1343 child:SetScript("OnMouseUp", child_OnMouseUp)
1344 if not child_OnReceiveDrag then
1345 function child_OnReceiveDrag(this, ...)
1346 local self = this.self
1347 local frame = pluginToFrame[self]
1348 if frame:HasScript("OnReceiveDrag") and frame:GetScript("OnReceiveDrag") then
1349 frame:GetScript("OnReceiveDrag")(frame, ...)
1350 end
1351 end
1352 end
1353 child:SetScript("OnReceiveDrag", child_OnReceiveDrag)
1354 return child
1355 end
1356 precondition(FuBarPlugin, 'CreatePluginChildFrame', function(self, frameType, name, parent)
1357 if not pluginToFrame[self] then
1358 error(("%sYou must have self.frame declared in order to add child frames."):format(self.name and self.name .. ": " or ""), 3)
1359 end
1360 argCheck(frameType, 2, "string")
1361 end)
1362
1363 --[[---------------------------------------------------------------------------
1364 Notes:
1365 Opens the configuration menu associated with this plugin.
1366 Example:
1367 self:OpenMenu()
1368 -----------------------------------------------------------------------------]]
1369 function FuBarPlugin:OpenMenu(frame)
1370 if not frame then
1371 frame = self:IsFuBarMinimapAttached() and pluginToMinimapFrame[self] or pluginToFrame[self]
1372 end
1373 if not frame:IsVisible() then
1374 frame = UIParent
1375 end
1376 local configType = getPluginOption(self, 'configType', "LibRockConfig-1.0")
1377 if configType == "Dewdrop-2.0" then
1378 if not frame or not self:GetFrame() or Dewdrop20:IsOpen(frame) then
1379 Dewdrop20:Close()
1380 return
1381 end
1382 local tooltipType = getPluginOption(self, 'tooltipType', "GameTooltip")
1383 if tooltipType == "GameTooltip" then
1384 if GameTooltip:IsOwned(frame) then
1385 GameTooltip:Hide()
1386 end
1387 elseif tooltipType == "Custom" and type(self.CloseTooltip) == "function" then
1388 self:CloseTooltip()
1389 elseif tooltipType == "Tablet-2.0" and Tablet20 then
1390 Tablet20:Close()
1391 end
1392
1393 if not Dewdrop20:IsRegistered(self:GetFrame()) then
1394 if type(self.OnMenuRequest) == "table" and (not self.OnMenuRequest.handler or self.OnMenuRequest.handler == self) and self.OnMenuRequest.type == "group" then
1395 Dewdrop20:InjectAceOptionsTable(self, self.OnMenuRequest)
1396 if self.OnMenuRequest.args and CheckFuBar() and not getPluginOption(self, 'independentProfile', false) then
1397 self.OnMenuRequest.args.profile = nil
1398 if self.OnMenuRequest.extraArgs then
1399 self.OnMenuRequest.extraArgs.profile = nil
1400 end
1401 end
1402 end
1403 Dewdrop20:Register(self:GetFrame(),
1404 'children', type(self.OnMenuRequest) == "table" and self.OnMenuRequest or function(level, value, valueN_1, valueN_2, valueN_3, valueN_4)
1405 if level == 1 then
1406 if not getPluginOption(self, 'hideMenuTitle', false) then
1407 Dewdrop20:AddLine(
1408 'text', self:GetTitle(),
1409 'isTitle', true
1410 )
1411 end
1412
1413 if self.OnMenuRequest then
1414 self:OnMenuRequest(level, value, false, valueN_1, valueN_2, valueN_3, valueN_4)
1415 end
1416
1417 if not getPluginOption(self, 'overrideMenu', false) then
1418 if self.MenuSettings and not getPluginOption(self, 'hideMenuTitle', false) then
1419 Dewdrop20:AddLine()
1420 end
1421 self:AddImpliedMenuOptions()
1422 end
1423 else
1424 if not getPluginOption(self, 'overrideMenu', false) and self:AddImpliedMenuOptions() then
1425 else
1426 if self.OnMenuRequest then
1427 self:OnMenuRequest(level, value, false, valueN_1, valueN_2, valueN_3, valueN_4)
1428 end
1429 end
1430 end
1431 if level == 1 then
1432 Dewdrop20:AddLine(
1433 'text', CLOSE,
1434 'tooltipTitle', CLOSE,
1435 'tooltipText', CLOSE_DESC,
1436 'func', Dewdrop.Close,
1437 'arg1', Dewdrop
1438 )
1439 end
1440 end,
1441 'point', function(frame)
1442 local x, y = frame:GetCenter()
1443 local leftRight
1444 if x < GetScreenWidth() / 2 then
1445 leftRight = "LEFT"
1446 else
1447 leftRight = "RIGHT"
1448 end
1449 if y < GetScreenHeight() / 2 then
1450 return "BOTTOM" .. leftRight, "TOP" .. leftRight
1451 else
1452 return "TOP" .. leftRight, "BOTTOM" .. leftRight
1453 end
1454 end,
1455 'dontHook', true
1456 )
1457 end
1458 if frame == self:GetFrame() then
1459 Dewdrop20:Open(self:GetFrame())
1460 elseif frame ~= UIParent then
1461 Dewdrop20:Open(frame, self:GetFrame())
1462 else
1463 Dewdrop20:Open(frame, self:GetFrame(), 'cursorX', true, 'cursorY', true)
1464 end
1465 elseif configType == "LibRockConfig-1.0" then
1466 local RockConfig = Rock("LibRockConfig-1.0", false, true)
1467 if RockConfig then
1468 RockConfig.OpenConfigMenu(self)
1469 end
1470 else
1471 -- TODO: add more possibilities
1472 end
1473 end
1474
1475 function FuBarPlugin.OnEmbedInitialize(FuBarPlugin, self)
1476 if not self.frame then
1477 local name = MAJOR_VERSION .. "_" .. self:GetTitle() .. "_" .. "Frame"
1478 local frame = _G[name]
1479 if not frame or not _G[name .. "Text"] or not _G[name .. "Icon"] then
1480 frame = FuBarPlugin.CreateBasicPluginFrame(self, name)
1481
1482 local icon = frame:CreateTexture(name .. "Icon", "ARTWORK")
1483 frame.icon = icon
1484 icon:SetWidth(16)
1485 icon:SetHeight(16)
1486 icon:SetPoint("LEFT", frame, "LEFT")
1487
1488 local text = frame:CreateFontString(name .. "Text", "ARTWORK")
1489 frame.text = text
1490 text:SetWidth(134)
1491 text:SetHeight(24)
1492 text:SetPoint("LEFT", icon, "RIGHT", 0, 1)
1493 text:SetFontObject(GameFontNormal)
1494 end
1495 pluginToFrame[self] = frame
1496 else
1497 pluginToFrame[self] = self.frame
1498 if not pluginToOptions[self] then
1499 pluginToOptions[self] = {}
1500 end
1501 pluginToOptions[self].userDefinedFrame = true
1502 end
1503
1504 local frame = pluginToFrame[self]
1505 frame.plugin = self
1506 frame:SetParent(UIParent)
1507 frame:SetPoint("RIGHT", UIParent, "LEFT", -5, 0)
1508 frame:Hide()
1509
1510 local iconPath = getPluginOption(self, 'iconPath', false)
1511 if iconPath then
1512 self:SetFuBarIcon(iconPath)
1513 end
1514
1515 if CheckFuBar() then
1516 FuBar:RegisterPlugin(self)
1517 end
1518 end
1519
1520
1521 local CheckShow = function(self, panelId)
1522 if not pluginToFrame[self]:IsShown() and (not pluginToMinimapFrame[self] or not pluginToMinimapFrame[self]:IsShown()) then
1523 self:Show(panelId)
1524 end
1525 end
1526
1527 local schedules = {}
1528 local f = CreateFrame("Frame")
1529 f:SetScript("OnUpdate", function(this)
1530 for i,v in ipairs(schedules) do
1531 local success, ret = pcall(unpack(v))
1532 if not success then
1533 geterrorhandler()(ret)
1534 end
1535 schedules[i] = del(v)
1536 end
1537 f:Hide()
1538 end)
1539
1540 local recheckPlugins
1541 local AceConsole
1542 function FuBarPlugin.OnEmbedEnable(FuBarPlugin, self, first)
1543 if not getPluginOption(self, 'userDefinedFrame', false) then
1544 local icon = pluginToFrame[self].icon
1545 if self:IsFuBarIconShown() then
1546 icon:Show()
1547 else
1548 icon:Hide()
1549 end
1550 end
1551 self:CheckWidth(true)
1552
1553 if not getPluginOption(self, 'hideWithoutStandby', false) or (getLazyDatabaseValue(self) and not getLazyDatabaseValue(self, 'hidden')) then
1554 if not first then
1555 CheckShow(self, self.panelIdTmp)
1556 else
1557 schedules[#schedules+1] = newList(CheckShow, self, self.panelIdTmp)
1558 f:Show()
1559 end
1560 end
1561
1562 local tooltipType = getPluginOption(self, 'tooltipType', "GameTooltip")
1563 if tooltipType == "Tablet-2.0" and not getPluginOption(self, 'cannotDetachTooltip', false) and getLazyDatabaseValue(self, 'detachedTooltip', 'detached') then
1564 schedules[#schedules+1] = newList(self.DetachFuBarTooltip, self)
1565 f:Show()
1566 end
1567
1568 if IsLoadOnDemand(self) and CheckFuBar() then
1569 if not FuBar.db.profile.loadOnDemand then
1570 FuBar.db.profile.loadOnDemand = {}
1571 end
1572 if not FuBar.db.profile.loadOnDemand[folderNames[self]] then
1573 FuBar.db.profile.loadOnDemand[folderNames[self]] = {}
1574 end
1575 FuBar.db.profile.loadOnDemand[folderNames[self]].disabled = nil
1576 end
1577 --[[
1578 if CheckFuBar() and AceLibrary:HasInstance("AceConsole-2.0") then
1579 if not recheckPlugins then
1580 if not AceConsole then
1581 AceConsole = AceLibrary("AceConsole-2.0")
1582 end
1583 recheckPlugins = function()
1584 for k,v in pairs(AceConsole.registry) do
1585 if type(v) == "table" and v.args and AceOO.inherits(v.handler, FuBarPlugin) and not v.handler.independentProfile then
1586 v.args.profile = nil
1587 end
1588 end
1589 end
1590 end
1591 FuBarPlugin:ScheduleEvent("FuBarPlugin-recheckPlugins", recheckPlugins, 0)
1592 end
1593 ]]
1594 end
1595
1596 function FuBarPlugin.OnEmbedDisable(FuBarPlugin, self)
1597 self:Hide(false)
1598
1599 if IsLoadOnDemand(self) and CheckFuBar() then
1600 if not FuBar.db.profile.loadOnDemand then
1601 FuBar.db.profile.loadOnDemand = {}
1602 end
1603 if not FuBar.db.profile.loadOnDemand[folderNames[self]] then
1604 FuBar.db.profile.loadOnDemand[folderNames[self]] = {}
1605 end
1606 FuBar.db.profile.loadOnDemand[folderNames[self]].disabled = true
1607 end
1608 end
1609
1610 function FuBarPlugin.OnEmbedProfileEnable(FuBarPlugin, self)
1611 self:UpdateFuBarPlugin()
1612 if getLazyDatabaseValue(self) then
1613 if not getLazyDatabaseValue(self, 'detachedTooltip') then
1614 setLazyDatabaseValue(self, {}, 'detachedTooltip')
1615 end
1616 local tooltipType = getPluginOption(self, 'tooltipType', "GameTooltip")
1617 if tooltipType == "Tablet-2.0" and Tablet20 then
1618 if Tablet20.registry[pluginToFrame[self]] then
1619 Tablet20:UpdateDetachedData(pluginToFrame[self], getLazyDatabaseValue(self, 'detachedTooltip'))
1620 else
1621 RegisterTablet20(self)
1622 end
1623 end
1624 if MinimapContainer:HasPlugin(self) then
1625 MinimapContainer:ReadjustLocation(self)
1626 end
1627 end
1628 end
1629
1630 -- #NODOC
1631 function FuBarPlugin.GetEmbedRockConfigOptions(FuBarPlugin, self)
1632 return 'icon', {
1633 type = 'boolean',
1634 name = SHOW_FUBAR_ICON,
1635 desc = SHOW_FUBAR_ICON_DESC,
1636 set = "ToggleFuBarIconShown",
1637 get = "IsFuBarIconShown",
1638 hidden = function()
1639 return not getPluginOption(self, 'iconPath', false) or getPluginOption(self, 'hasNoText', false) or self:IsDisabled() or self:IsFuBarMinimapAttached() or not getLazyDatabaseValue(self)
1640 end,
1641 order = -13.7,
1642 handler = self,
1643 }, 'text', {
1644 type = 'boolean',
1645 name = SHOW_FUBAR_TEXT,
1646 desc = SHOW_FUBAR_TEXT_DESC,
1647 set = "ToggleFuBarTextShown",
1648 get = "IsFuBarTextShown",
1649 hidden = function()
1650 return getPluginOption(self, 'cannotHideText', false) or not getPluginOption(self, 'iconPath', false) or getPluginOption(self, 'hasNoText') or self:IsDisabled() or self:IsFuBarMinimapAttached() or not getLazyDatabaseValue(self)
1651 end,
1652 order = -13.6,
1653 handler = self,
1654 }, 'colorText', {
1655 type = 'boolean',
1656 name = SHOW_COLORED_FUBAR_TEXT,
1657 desc = SHOW_COLORED_FUBAR_TEXT_DESC,
1658 set = "ToggleFuBarTextColored",
1659 get = "IsFuBarTextColored",
1660 hidden = function()
1661 return getPluginOption(self, 'userDefinedFrame', false) or getPluginOption(self, 'hasNoText', false) or getPluginOption(self, 'hasNoColor', false) or self:IsDisabled() or self:IsFuBarMinimapAttached() or not getLazyDatabaseValue(self)
1662 end,
1663 order = -13.5,
1664 handler = self,
1665 }, 'detachTooltip', {
1666 type = 'boolean',
1667 name = DETACH_FUBAR_TOOLTIP,
1668 desc = DETACH_FUBAR_TOOLTIP_DESC,
1669 get = "IsFuBarTooltipDetached",
1670 set = "ToggleFuBarTooltipDetached",
1671 hidden = function()
1672 return not Tablet20 or getPluginOption(self, 'tooltipType', "GameTooltip") ~= "Tablet-2.0" or self:IsDisabled()
1673 end,
1674 order = -13.4,
1675 handler = self,
1676 }, 'lockTooltip', {
1677 type = 'boolean',
1678 name = LOCK_FUBAR_TOOLTIP,
1679 desc = LOCK_FUBAR_TOOLTIP_DESC,
1680 get = function()
1681 return Tablet20:IsLocked(pluginToFrame[self])
1682 end,
1683 set = function()
1684 return Tablet20:ToggleLocked(pluginToFrame[self])
1685 end,
1686 disabled = function()
1687 return not self:IsFuBarTooltipDetached()
1688 end,
1689 hidden = function()
1690 return not Tablet20 or getPluginOption(self, 'tooltipType', "GameTooltip") ~= "Tablet-2.0" or getPluginOption(self, 'cannotDetachTooltip', false) or self:IsDisabled()
1691 end,
1692 order = -13.3,
1693 handler = self,
1694 }, 'position', {
1695 type = 'choice',
1696 name = POSITION_ON_FUBAR,
1697 desc = POSITION_ON_FUBAR_DESC,
1698 choices = {
1699 LEFT = POSITION_LEFT,
1700 CENTER = POSITION_CENTER,
1701 RIGHT = POSITION_RIGHT
1702 },
1703 choiceSort = {
1704 "LEFT",
1705 "CENTER",
1706 "RIGHT",
1707 },
1708 get = function()
1709 return self:GetPanel() and self:GetPanel():GetPluginSide(self)
1710 end,
1711 set = function(value)
1712 if self:GetPanel() then
1713 self:GetPanel():SetPluginSide(self, value)
1714 end
1715 end,
1716 hidden = function()
1717 return self:IsFuBarMinimapAttached() or self:IsDisabled() or not pluginToPanel[self]
1718 end,
1719 order = -13.2,
1720 handler = self,
1721 }, 'minimapAttach', {
1722 type = 'boolean',
1723 name = ATTACH_PLUGIN_TO_MINIMAP,
1724 desc = ATTACH_PLUGIN_TO_MINIMAP_DESC,
1725 get = "IsFuBarMinimapAttached",
1726 set = "ToggleFuBarMinimapAttached",
1727 hidden = function()
1728 return (getPluginOption(self, 'cannotAttachToMinimap', false) and not self:IsFuBarMinimapAttached()) or not CheckFuBar() or self:IsDisabled()
1729 end,
1730 order = -13.1,
1731 handler = self,
1732 }, 'hide', {
1733 type = 'boolean',
1734 name = function()
1735 if self:IsFuBarMinimapAttached() then
1736 return HIDE_MINIMAP_BUTTON
1737 else
1738 return HIDE_FUBAR_PLUGIN
1739 end
1740 end,
1741 desc = HIDE_FUBAR_PLUGIN_DESC,
1742 get = function()
1743 return not pluginToFrame[self]:IsShown() and (not pluginToMinimapFrame[self] or not pluginToMinimapFrame[self]:IsShown())
1744 end,
1745 set = function(value)
1746 if not value then
1747 self:Show()
1748 else
1749 self:Hide()
1750 end
1751 end,
1752 hidden = function()
1753 return not getPluginOption(self, 'hideWithoutStandby', false) or self:IsDisabled()
1754 end,
1755 order = -13,
1756 handler = self,
1757 }
1758 end
1759
1760 local plugins = MinimapContainer.plugins or {}
1761 for k in pairs(MinimapContainer) do
1762 MinimapContainer[k] = nil
1763 end
1764 MinimapContainer.plugins = plugins
1765
1766 local minimap_OnMouseDown, minimap_OnMouseUp
1767 function MinimapContainer:AddPlugin(plugin)
1768 if CheckFuBar() and FuBar:IsChangingProfile() then
1769 return
1770 end
1771 if pluginToPanel[plugin] then
1772 pluginToPanel[plugin]:RemovePlugin(plugin)
1773 end
1774 pluginToPanel[plugin] = self
1775 if not pluginToMinimapFrame[plugin] then
1776 local frame = CreateFrame("Button", pluginToFrame[plugin]:GetName() .. "MinimapButton", Minimap)
1777 pluginToMinimapFrame[plugin] = frame
1778 plugin.minimapFrame = frame
1779 frame.plugin = plugin
1780 frame:SetWidth(31)
1781 frame:SetHeight(31)
1782 frame:SetFrameStrata("BACKGROUND")
1783 frame:SetFrameLevel(4)
1784 frame:SetHighlightTexture("Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight")
1785 local icon = frame:CreateTexture(frame:GetName() .. "Icon", "BACKGROUND")
1786 plugin.minimapIcon = icon
1787 local path = plugin:GetFuBarIcon() or (pluginToFrame[plugin].icon and pluginToFrame[plugin].icon:GetTexture()) or "Interface\\Icons\\INV_Misc_QuestionMark"
1788 icon:SetTexture(path)
1789 if path:sub(1, 16) == "Interface\\Icons\\" then
1790 icon:SetTexCoord(0.07, 0.93, 0.07, 0.93)
1791 else
1792 icon:SetTexCoord(0, 1, 0, 1)
1793 end
1794 icon:SetWidth(20)
1795 icon:SetHeight(20)
1796 icon:SetPoint("TOPLEFT", frame, "TOPLEFT", 7, -5)
1797 local overlay = frame:CreateTexture(frame:GetName() .. "Overlay","OVERLAY")
1798 overlay:SetTexture("Interface\\Minimap\\MiniMap-TrackingBorder")
1799 overlay:SetWidth(53)
1800 overlay:SetHeight(53)
1801 overlay:SetPoint("TOPLEFT",frame,"TOPLEFT")
1802 frame:EnableMouse(true)
1803 frame:RegisterForClicks("LeftButtonUp")
1804
1805 frame.self = plugin
1806 if not frame_OnEnter then
1807 function frame_OnEnter(this)
1808 if type(this.self.OnFuBarEnter) == "function" then
1809 this.self:OnFuBarEnter()
1810 end
1811 end
1812 end
1813 frame:SetScript("OnEnter", frame_OnEnter)
1814 if not frame_OnLeave then
1815 function frame_OnLeave(this)
1816 if type(this.self.OnFuBarLeave) == "function" then
1817 this.self:OnFuBarLeave()
1818 end
1819 end
1820 end
1821 frame:SetScript("OnLeave", frame_OnLeave)
1822 if not frame_OnClick then
1823 function frame_OnClick(this, arg1)
1824 if this.self:IsMinimapAttached() and this.dragged then return end
1825 if type(this.self.OnFuBarClick) == "function" then
1826 this.self:OnFuBarClick(arg1)
1827 end
1828 end
1829 end
1830 frame:SetScript("OnClick", frame_OnClick)
1831 if not frame_OnDoubleClick then
1832 function frame_OnDoubleClick(this, arg1)
1833 if type(this.self.OnFuBarDoubleClick) == "function" then
1834 this.self:OnFuBarDoubleClick(arg1)
1835 end
1836 end
1837 end
1838 frame:SetScript("OnDoubleClick", frame_OnDoubleClick)
1839 if not frame_OnReceiveDrag then
1840 function frame_OnReceiveDrag(this)
1841 if this.self:IsMinimapAttached() and this.dragged then return end
1842 if type(this.self.OnFuBarReceiveDrag) == "function" then
1843 this.self:OnFuBarReceiveDrag()
1844 end
1845 end
1846 end
1847 frame:SetScript("OnReceiveDrag", frame_OnReceiveDrag)
1848 if not minimap_OnMouseDown then
1849 function minimap_OnMouseDown(this, arg1)
1850 this.dragged = false
1851 if arg1 == "LeftButton" and not IsShiftKeyDown() and not IsControlKeyDown() and not IsAltKeyDown() then
1852 HideDropDownMenu(1)
1853 if type(this.self.OnFuBarMouseDown) == "function" then
1854 this.self:OnFuBarMouseDown(arg1)
1855 end
1856 elseif arg1 == "RightButton" and not IsShiftKeyDown() and not IsControlKeyDown() and not IsAltKeyDown() then
1857 this.self:OpenMenu(this)
1858 else
1859 HideDropDownMenu(1)
1860 if type(this.self.OnFuBarMouseDown) == "function" then
1861 this.self:OnFuBarMouseDown(arg1)
1862 end
1863 end
1864 if this.self.OnFuBarClick or this.self.OnFuBarMouseDown or this.self.OnFuBarMouseUp or this.self.OnFuBarDoubleClick then
1865 if this.self.minimapIcon:GetTexture():sub(1, 16) == "Interface\\Icons\\" then
1866 this.self.minimapIcon:SetTexCoord(0.14, 0.86, 0.14, 0.86)
1867 else
1868 this.self.minimapIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
1869 end
1870 end
1871 end
1872 end
1873 frame:SetScript("OnMouseDown", minimap_OnMouseDown)
1874 if not minimap_OnMouseUp then
1875 function minimap_OnMouseUp(this, arg1)
1876 if not this.dragged and type(this.self.OnFuBarMouseUp) == "function" then
1877 this.self:OnFuBarMouseUp(arg1)
1878 end
1879 if this.self.minimapIcon:GetTexture():sub(1, 16) == "Interface\\Icons\\" then
1880 this.self.minimapIcon:SetTexCoord(0.05, 0.95, 0.05, 0.95)
1881 else
1882 this.self.minimapIcon:SetTexCoord(0, 1, 0, 1)
1883 end
1884 end
1885 end
1886 frame:SetScript("OnMouseUp", minimap_OnMouseUp)
1887 frame:RegisterForDrag("LeftButton")
1888 frame:SetScript("OnDragStart", self.OnDragStart)
1889 frame:SetScript("OnDragStop", self.OnDragStop)
1890
1891 if getPluginOption(plugin, 'tooltipType', "GameTooltip") == "Tablet-2.0" then
1892 -- Note that we have to do this after :SetScript("OnEnter"), etc,
1893 -- so that Tablet-2.0 can override it properly.
1894 RegisterTablet20(plugin)
1895 Tablet20:Register(frame, pluginToFrame[plugin])
1896 end
1897 end
1898 pluginToFrame[plugin]:Hide()
1899 pluginToMinimapFrame[plugin]:Show()
1900 self:ReadjustLocation(plugin)
1901 table.insert(self.plugins, plugin)
1902 local exists = false
1903 return true
1904 end
1905
1906 function MinimapContainer:RemovePlugin(index)
1907 if CheckFuBar() and FuBar:IsChangingProfile() then
1908 return
1909 end
1910 if type(index) == "table" then
1911 index = self:IndexOfPlugin(index)
1912 if not index then
1913 return
1914 end
1915 end
1916 local t = self.plugins
1917 local plugin = t[index]
1918 assert(pluginToPanel[plugin] == self, "Plugin has improper panel field")
1919 plugin:SetPanel(nil)
1920 table.remove(t, index)
1921 return true
1922 end
1923
1924 function MinimapContainer:ReadjustLocation(plugin)
1925 local frame = pluginToMinimapFrame[plugin]
1926 if plugin.db and plugin.db.profile.minimapPositionWild then
1927 frame:SetPoint("CENTER", UIParent, "BOTTOMLEFT", plugin.db.profile.minimapPositionX, plugin.db.profile.minimapPositionY)
1928 elseif not plugin.db and plugin.minimapPositionWild then
1929 frame:SetPoint("CENTER", UIParent, "BOTTOMLEFT", plugin.minimapPositionX, plugin.minimapPositionY)
1930 else
1931 local position
1932 if plugin.db then
1933 position = plugin.db.profile.minimapPosition or getPluginOption(plugin, 'defaultMinimapPosition', nil) or math.random(1, 360)
1934 else
1935 position = plugin.minimapPosition or getPluginOption(plugin, 'defaultMinimapPosition', nil) or math.random(1, 360)
1936 end
1937 local angle = math.rad(position or 0)
1938 local x,y
1939 local minimapShape = GetMinimapShape and GetMinimapShape() or "ROUND"
1940 local cos = math.cos(angle)
1941 local sin = math.sin(angle)
1942
1943 local round = true
1944 if minimapShape == "ROUND" then
1945 -- do nothing
1946 elseif minimapShape == "SQUARE" then
1947 round = false
1948 elseif minimapShape == "CORNER-TOPRIGHT" then
1949 if cos < 0 or sin < 0 then
1950 round = false
1951 end
1952 elseif minimapShape == "CORNER-TOPLEFT" then
1953 if cos > 0 or sin < 0 then
1954 round = false
1955 end
1956 elseif minimapShape == "CORNER-BOTTOMRIGHT" then
1957 if cos < 0 or sin > 0 then
1958 round = false
1959 end
1960 elseif minimapShape == "CORNER-BOTTOMLEFT" then
1961 if cos > 0 or sin > 0 then
1962 round = false
1963 end
1964 elseif minimapShape == "SIDE-LEFT" then
1965 if cos > 0 then
1966 round = false
1967 end
1968 elseif minimapShape == "SIDE-RIGHT" then
1969 if cos < 0 then
1970 round = false
1971 end
1972 elseif minimapShape == "SIDE-TOP" then
1973 if sin < 0 then
1974 round = false
1975 end
1976 elseif minimapShape == "SIDE-BOTTOM" then
1977 if sin > 0 then
1978 round = false
1979 end
1980 elseif minimapShape == "TRICORNER-TOPRIGHT" then
1981 if cos < 0 and sin < 0 then
1982 round = false
1983 end
1984 elseif minimapShape == "TRICORNER-TOPLEFT" then
1985 if cos > 0 and sin < 0 then
1986 round = false
1987 end
1988 elseif minimapShape == "TRICORNER-BOTTOMRIGHT" then
1989 if cos < 0 and sin > 0 then
1990 round = false
1991 end
1992 elseif minimapShape == "TRICORNER-BOTTOMLEFT" then
1993 if cos > 0 and sin > 0 then
1994 round = false
1995 end
1996 end
1997
1998 if round then
1999 x = cos * 80
2000 y = sin * 80
2001 else
2002 x = 80 * 2^0.5 * cos
2003 y = 80 * 2^0.5 * sin
2004 if x < -80 then
2005 x = -80
2006 elseif x > 80 then
2007 x = 80
2008 end
2009 if y < -80 then
2010 y = -80
2011 elseif y > 80 then
2012 y = 80
2013 end
2014 end
2015 frame:SetPoint("CENTER", Minimap, "CENTER", x, y)
2016 end
2017 end
2018
2019 function MinimapContainer:GetPlugin(index)
2020 return self.plugins[index]
2021 end
2022
2023 function MinimapContainer:GetNumPlugins()
2024 return #self.plugins
2025 end
2026
2027 function MinimapContainer:IndexOfPlugin(plugin)
2028 for i,p in ipairs(self.plugins) do
2029 if p == plugin then
2030 return i, "MINIMAP"
2031 end
2032 end
2033 end
2034
2035 function MinimapContainer:HasPlugin(plugin)
2036 return self:IndexOfPlugin(plugin) ~= nil
2037 end
2038
2039 function MinimapContainer:GetPluginSide(plugin)
2040 local index = self:IndexOfPlugin(plugin)
2041 assert(index, "Plugin not in panel")
2042 return "MINIMAP"
2043 end
2044
2045 function MinimapContainer.OnDragStart(this)
2046 this.dragged = true
2047 this:LockHighlight()
2048 this:SetScript("OnUpdate", MinimapContainer.OnUpdate)
2049 if this.self.minimapIcon:GetTexture():sub(1, 16) == "Interface\\Icons\\" then
2050 this.self.minimapIcon:SetTexCoord(0.05, 0.95, 0.05, 0.95)
2051 else
2052 this.self.minimapIcon:SetTexCoord(0, 1, 0, 1)
2053 end
2054 end
2055
2056 function MinimapContainer.OnDragStop(this)
2057 this:SetScript("OnUpdate", nil)
2058 this:UnlockHighlight()
2059 end
2060
2061 function MinimapContainer.OnUpdate(this, elapsed)
2062 if not IsAltKeyDown() then
2063 local mx, my = Minimap:GetCenter()
2064 local px, py = GetCursorPosition()
2065 local scale = UIParent:GetEffectiveScale()
2066 px, py = px / scale, py / scale
2067 local position = math.deg(math.atan2(py - my, px - mx))
2068 if position <= 0 then
2069 position = position + 360
2070 elseif position > 360 then
2071 position = position - 360
2072 end
2073 if this.self.db then
2074 this.self.db.profile.minimapPosition = position
2075 this.self.db.profile.minimapPositionX = nil
2076 this.self.db.profile.minimapPositionY = nil
2077 this.self.db.profile.minimapPositionWild = nil
2078 else
2079 this.self.minimapPosition = position
2080 this.self.minimapPositionX = nil
2081 this.self.minimapPositionY = nil
2082 this.self.minimapPositionWild = nil
2083 end
2084 else
2085 local px, py = GetCursorPosition()
2086 local scale = UIParent:GetEffectiveScale()
2087 px, py = px / scale, py / scale
2088 if this.self.db then
2089 this.self.db.profile.minimapPositionX = px
2090 this.self.db.profile.minimapPositionY = py
2091 this.self.db.profile.minimapPosition = nil
2092 this.self.db.profile.minimapPositionWild = true
2093 else
2094 this.self.minimapPositionX = px
2095 this.self.minimapPositionY = py
2096 this.self.minimapPosition = nil
2097 this.self.minimapPositionWild = true
2098 end
2099 end
2100 MinimapContainer:ReadjustLocation(this.self)
2101 end
2102
2103 FuBarPlugin:SetExportedMethods(
2104 "SetFuBarOption",
2105 "GetTitle",
2106 "GetName",
2107 "GetCategory",
2108 "SetFontSize",
2109 "GetFrame",
2110 "Show",
2111 "Hide",
2112 "GetPanel",
2113 "IsFuBarTextColored",
2114 "ToggleFuBarTextColored",
2115 "IsFuBarMinimapAttached",
2116 "ToggleFuBarMinimapAttached",
2117 "UpdateFuBarPlugin",
2118 "UpdateFuBarText",
2119 "UpdateFuBarTooltip",
2120 "SetFuBarIcon",
2121 "GetFuBarIcon",
2122 "CheckWidth",
2123 "SetFuBarText",
2124 "GetFuBarText",
2125 "IsFuBarIconShown",
2126 "ToggleFuBarIconShown",
2127 "ShowFuBarIcon",
2128 "HideFuBarIcon",
2129 "IsFuBarTextShown",
2130 "ToggleFuBarTextShown",
2131 "ShowFuBarText",
2132 "HideFuBarText",
2133 "IsFuBarTooltipDetached",
2134 "ToggleFuBarTooltipDetached",
2135 "DetachFuBarTooltip",
2136 "ReattachFuBarTooltip",
2137 "GetDefaultPosition",
2138 "SetPanel",
2139 "IsDisabled",
2140 "CreateBasicPluginFrame",
2141 "CreatePluginChildFrame",
2142 "OpenMenu"
2143 )
2144
2145 Rock:FinalizeLibrary(MAJOR_VERSION)