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