--[[ File
NAME: TitanPanelTemplate.lua
DESC: Contains the routines to handle a frame created as a Titan plugin.
--]]
--[[ API
NAME: TitanPanelTemplate overview
DESC: See TitanPanelButtonTemplate.xml also.
A Titan plugin is a frame created using one of the button types in TitanPanelButtonTemplate.xml which inherits TitanPanelButtonTemplate.
The available plugin types are:
TitanPanelTextTemplate - A frame that only displays text ("$parentText")
TitanPanelIconTemplate - A frame that only displays an icon ("$parentIcon")
TitanPanelComboTemplate - A frame that displays an icon then text ("$parentIcon" "$parentText")
Most plugins use the combo template.
TitanPanelButtonTemplate.xml contains other templates available to be used.
TitanOptionsSliderTemplate - A frame that contains the basics of a slider control. See TitanVolume for an example.
TitanPanelChildButtonTemplate - A frame that allows a plugin within a plugin. The older version of TitanGold was an example. This may not be used anymore.
Each template contains:
- a frame to handle a menu invoked by a right mouse click ("$parentRightClickMenu")
- default event handlers for
TitanPanelButton_OnLoad(self);
TitanPanelButton_OnShow(self);
TitanPanelButton_OnClick(self, button);
TitanPanelButton_OnEnter(self);
TitanPanelButton_OnLeave(self);
If these events are overridden then the default routine needs to be included!
:DESC
--]]
-- Globals
-- Constants
local TITAN_PANEL_LABEL_SEPARATOR = " "
local TITAN_PANEL_BUTTON_WIDTH_CHANGE_TOLERANCE = 10;
local TITAN_PANEL_BUTTON_TYPE_TEXT = 1;
local TITAN_PANEL_BUTTON_TYPE_ICON = 2;
local TITAN_PANEL_BUTTON_TYPE_COMBO = 3;
local TITAN_PANEL_BUTTON_TYPE_CUSTOM = 4;
local pluginOnEnter = nil;
local TITAN_PANEL_MOVE_ADDON = nil;
local TITAN_PANEL_DROPOFF_ADDON = nil;
-- Library instances
local LibQTip = nil
local _G = getfenv(0);
local InCombatLockdown = _G.InCombatLockdown;
local media = LibStub("LibSharedMedia-3.0")
--[[ local
NAME: TitanTooltip_AddTooltipText
DESC: Helper to add a line of tooltip text to the tooltip.
VAR: text - string
OUT: None
NOTE:
- Append a "\n" to the end if there is not one already there
:NOTE
--]]
local function TitanTooltip_AddTooltipText(text)
if ( text ) then
-- Append a "\n" to the end
if ( string.sub(text, -1, -1) ~= "\n" ) then
text = text.."\n";
end
-- See if the string is intended for a double column
for text1, text2 in string.gmatch(text, "([^\t\n]*)\t?([^\t\n]*)\n") do
if ( text2 ~= "" ) then
-- Add as double wide
GameTooltip:AddDoubleLine(text1, text2);
elseif ( text1 ~= "" ) then
-- Add single column line
GameTooltip:AddLine(text1);
else
-- Assume a blank line
GameTooltip:AddLine("\n");
end
end
end
end
--[[ local
NAME: TitanTooltip_SetOwnerPosition
DESC: Set both the parent and the position of GameTooltip for the plugin tooltip.
VAR: parent - reference to the frame to attach the tooltip to
VAR: anchorPoint - tooltip anchor location (side or corner) to use
VAR: relativeToFrame - string name name of the frame, usually the plugin), to attach the tooltip to
VAR: relativePoint - parent anchor location (side or corner) to use
VAR: xOffset - X offset from the anchor point
VAR: yOffset - Y offset from the anchor point
VAR: frame - reference to the tooltip
OUT: None
--]]
local function TitanTooltip_SetOwnerPosition(parent, anchorPoint, relativeToFrame, relativePoint, xOffset, yOffset, frame)
if not frame then
frame = _G["GameTooltip"]
end
frame:SetOwner(parent, "ANCHOR_NONE");
frame:SetPoint(anchorPoint, relativeToFrame, relativePoint,
xOffset, yOffset);
-- set alpha (transparency) for the Game Tooltip
local red, green, blue = frame:GetBackdropColor();
local red2, green2, blue2 = frame:GetBackdropBorderColor();
local tool_trans = TitanPanelGetVar("TooltipTrans")
frame:SetBackdropColor(red,green,blue,tool_trans);
frame:SetBackdropBorderColor(red2,green2,blue2,tool_trans);
-- set font size for the Game Tooltip
if not TitanPanelGetVar("DisableTooltipFont") then
if TitanTooltipScaleSet < 1 then
TitanTooltipOrigScale = frame:GetScale();
TitanTooltipScaleSet = TitanTooltipScaleSet + 1;
end
frame:SetScale(TitanPanelGetVar("TooltipFont"));
end
end
--[[ local
NAME: TitanTooltip_SetGameTooltip
DESC: Helper to set the tooltip of the given Titan plugin.
First check for a custom function. If no function then use the plugin tooltip title and text.
VAR: self - frame reference of the plugin
OUT: None
NOTE:
- If a custom function is given pcall (protected call) is used in case the function errors out. Currently the error is allowed to occur silently because it could generate a lot of text to chat.
:NOTE
--]]
local function TitanTooltip_SetGameTooltip(self)
if ( self.tooltipCustomFunction ) then
--[
local tmp_txt = ""
local call_success
call_success, -- for pcall
tmp_txt = pcall (self.tooltipCustomFunction)
--]]
-- self.tooltipCustomFunction();
elseif ( self.tooltipTitle ) then
GameTooltip:SetText(self.tooltipTitle,
HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
if ( self.tooltipText ) then
TitanTooltip_AddTooltipText(self.tooltipText);
end
end
GameTooltip:Show();
end
--[[ local
NAME: TitanTooltip_SetPanelTooltip
DESC: Helper to set the screen position of the tooltip of the given Titan plugin.
VAR: self - frame reference of the plugin
VAR: id - string name of the plugin
VAR: frame - reference to the tooltip
OUT: None
--]]
local function TitanTooltip_SetPanelTooltip(self, id, frame)
-- sanity checks
if not TitanPanelGetVar("ToolTipsShown")
or (TitanPanelGetVar("HideTipsInCombat") and InCombatLockdown()) then return end
if not self.tooltipCustomFunction and not self.tooltipTitle then return end
-- Set GameTooltip
local button = TitanUtils_GetButton(id);
local scale = TitanPanelGetVar("Scale");
local offscreenX, offscreenY;
local i = TitanPanel_GetButtonNumber(id);
local bar = TITAN_PANEL_DISPLAY_PREFIX..TitanUtils_GetWhichBar(id)
local vert = TitanBarData[bar].vert
-- Get TOP or BOTTOM for the anchor and relative anchor
local rel_pt, pt
if vert == TITAN_TOP then
pt = "TOP"
rel_pt = "BOTTOM"
else
pt = "BOTTOM"
rel_pt = "TOP"
end
TitanTooltip_SetOwnerPosition(button, pt.."LEFT",
button:GetName(), rel_pt.."LEFT", -10, 0, frame) --4 * scale);
TitanTooltip_SetGameTooltip(self);
-- Adjust GameTooltip position if it's off the screen
offscreenX, offscreenY = TitanUtils_GetOffscreen(GameTooltip);
if ( offscreenX == -1 ) then
TitanTooltip_SetOwnerPosition(button, pt.."LEFT", bar,
rel_pt.."LEFT", 0, 0, frame)
TitanTooltip_SetGameTooltip(self);
elseif ( offscreenX == 1 ) then
TitanTooltip_SetOwnerPosition(button, pt.."RIGHT", bar,
rel_pt.."RIGHT", 0, 0, frame)
TitanTooltip_SetGameTooltip(self);
end
end
--[[ local
NAME: TitanPanelButton_SetTooltip
DESC: Set the tooltip of the given Titan plugin.
VAR: self - frame reference of the plugin
VAR: id - string name of the plugin
--]]
local function TitanPanelButton_SetTooltip(self, id)
-- ensure that the 'self' passed is a valid frame reference
if not self:GetName() then return end
self.tooltipCustomFunction = nil;
if (id and TitanUtils_IsPluginRegistered(id)) then
local plugin = TitanUtils_GetPlugin(id);
if ( plugin.tooltipCustomFunction ) then
self.tooltipCustomFunction = plugin.tooltipCustomFunction;
TitanTooltip_SetPanelTooltip(self, id);
elseif ( plugin.tooltipTitle ) then
self.tooltipTitle = plugin.tooltipTitle;
local tooltipTextFunc = _G[plugin.tooltipTextFunction];
if ( tooltipTextFunc ) then
local tmp_txt = ""
local call_success, -- for pcall
tmp_txt = pcall (tooltipTextFunc);
self.tooltipText = tmp_txt
-- self.tooltipText = tooltipTextFunc();
end
TitanTooltip_SetPanelTooltip(self, id);
end
end
end
--[[ local
NAME: TitanPanelButton_IsText
DESC: Is the given Titan plugin of type text?
VAR: id - string name of the plugin
OUT: boolean
--]]
local function TitanPanelButton_IsText(id)
if (TitanPanelButton_GetType(id) == TITAN_PANEL_BUTTON_TYPE_TEXT) then
return 1;
end
end
--[[ Titan
NAME: TitanPanelButton_IsIcon
DESC: Is the given Titan plugin of type icon?
VAR: id - string name of the plugin
OUT: boolean
--]]
function TitanPanelButton_IsIcon(id)
if (TitanPanelButton_GetType(id) == TITAN_PANEL_BUTTON_TYPE_ICON) then
return 1;
end
end
--[[ local
NAME: TitanPanelButton_IsCombo
DESC: Is the given Titan plugin of type combo?
VAR: id - string name of the plugin
OUT: boolean
--]]
local function TitanPanelButton_IsCombo(id)
if (TitanPanelButton_GetType(id) == TITAN_PANEL_BUTTON_TYPE_COMBO) then
return 1;
end
end
--[[ local
NAME: TitanPanelButton_IsCustom
DESC: Is the given Titan plugin of type custom?
VAR: id - string name of the plugin
OUT: boolean
--]]
local function TitanPanelButton_IsCustom(id)
if (TitanPanelButton_GetType(id) == TITAN_PANEL_BUTTON_TYPE_CUSTOM) then
return 1;
end
end
--[[ local
NAME: TitanPanelButton_OnDragStart
DESC: Handle the OnDragStart event of the given Titan plugin.
VAR: self - frame reference of the plugin
VAR: ChildButton - boolean
OUT: None
NOTE:
- Do nothing if the user has locked plugins or if in combat.
- Set the .isMoving of the plugin (frame) so other routine can check it.
- Set TITAN_PANEL_MOVING so any Titan routine will know a 'drag & drop' is in progress.
- Set TITAN_PANEL_MOVE_ADDON so sanity checks can be done on the 'drop'.
:NOTE
--]]
local function TitanPanelButton_OnDragStart(self, ChildButton)
if TitanPanelGetVar("LockButtons") or InCombatLockdown() then return end
local frname = self;
if ChildButton then
frname = self:GetParent();
end
-- Clear button positions or we'll grab the button and all buttons 'after'
local i,j;
for i, j in pairs(TitanPanelSettings.Buttons) do
local pluginid = _G["TitanPanel"..TitanPanelSettings.Buttons[i].."Button"];
if pluginid then
pluginid:ClearAllPoints()
end
end
-- Start the drag; close any tooltips and open control frames
frname:StartMoving();
frname.isMoving = true;
TitanUtils_CloseAllControlFrames();
TitanPanelRightClickMenu_Close();
if AceLibrary then
if AceLibrary:HasInstance("Dewdrop-2.0") then
AceLibrary("Dewdrop-2.0"):Close()
end
if AceLibrary:HasInstance("Tablet-2.0") then
AceLibrary("Tablet-2.0"):Close()
end
end
GameTooltip:Hide();
-- LibQTip-1.0 support code
LibQTip = LibStub("LibQTip-1.0", true)
if LibQTip then
local key, tip
for key, tip in LibQTip:IterateTooltips() do
if tip then
local _, relativeTo = tip:GetPoint()
if relativeTo and relativeTo:GetName() == self:GetName() then
tip:Hide()
break
end
end
end
end
-- /LibQTip-1.0 support code
-- Hold the plugin id so we can do checks on the drop
TITAN_PANEL_MOVE_ADDON = TitanUtils_GetButtonID(self:GetName());
if ChildButton then
TITAN_PANEL_MOVE_ADDON =
TitanUtils_GetButtonID(self:GetParent():GetName());
end
-- Tell Titan that a drag & drop is in process
TITAN_PANEL_MOVING = 1;
-- Store the OnEnter handler so the tooltip does not show - or other oddities
pluginOnEnter = self:GetScript("OnEnter")
self:SetScript("OnEnter", nil)
end
--[[ local
NAME: TitanPanelButton_OnDragStop
DESC: Handle the OnDragStop event of the given Titan plugin.
VAR: self - frame reference of the plugin
VAR: ChildButton - boolean
OUT: None
NOTE:
- Clear the .isMoving of the plugin (frame).
- Clear TITAN_PANEL_MOVING.
- Clear TITAN_PANEL_MOVE_ADDON.
:NOTE
--]]
local function TitanPanelButton_OnDragStop(self, ChildButton)
if TitanPanelGetVar("LockButtons") then
return
end
local ok_to_move = true
local nonmovableFrom = false;
local nonmovableTo = false;
local frname = self;
if ChildButton then
frname = self:GetParent();
end
if TITAN_PANEL_MOVING == 1 then
frname:StopMovingOrSizing();
frname.isMoving = false;
TITAN_PANEL_MOVING = 0;
-- See if the plugin is supposed to stay on the bar it is on
if TitanGetVar(TITAN_PANEL_MOVE_ADDON, "ForceBar") then
ok_to_move = false
end
-- eventually there could be several reasons to not allow
-- the plugin to move
if ok_to_move then
local i,j;
for i, j in pairs(TitanPanelSettings.Buttons) do
local pluginid =
_G["TitanPanel"..TitanPanelSettings.Buttons[i].."Button"];
if (pluginid and MouseIsOver(pluginid)) and frname ~= pluginid then
TITAN_PANEL_DROPOFF_ADDON = TitanPanelSettings.Buttons[i];
end
end
-- switching sides is not allowed
nonmovableFrom = TitanUtils_ToRight(TITAN_PANEL_MOVE_ADDON)
nonmovableTo = TitanUtils_ToRight(TITAN_PANEL_DROPOFF_ADDON)
if nonmovableTo ~= nonmovableFrom then
TITAN_PANEL_DROPOFF_ADDON = nil;
end
if TITAN_PANEL_DROPOFF_ADDON == nil then
-- See if the plugin was dropped on a bar rather than
-- another plugin.
local bar
local tbar = nil
-- Find which bar it was dropped on
for idx,v in pairs(TitanBarData) do
bar = idx
if (bar and MouseIsOver(_G[bar])) then
tbar = bar
end
end
if tbar then
TitanPanel_RemoveButton(TITAN_PANEL_MOVE_ADDON)
TitanUtils_AddButtonOnBar(TitanBarData[tbar].name, TITAN_PANEL_MOVE_ADDON)
else
-- not sure what the user did...
end
else
-- plugin was dropped on another plugin - swap (for now)
local dropoff = TitanUtils_GetCurrentIndex(TitanPanelSettings.Buttons
,TITAN_PANEL_DROPOFF_ADDON);
local pickup = TitanUtils_GetCurrentIndex(TitanPanelSettings.Buttons
,TITAN_PANEL_MOVE_ADDON);
local dropoffbar = TitanUtils_GetWhichBar(TITAN_PANEL_DROPOFF_ADDON);
local pickupbar = TitanUtils_GetWhichBar(TITAN_PANEL_MOVE_ADDON);
if dropoff ~= nil and dropoff ~= "" then
-- TODO: Change to 'insert' rather than swap
TitanPanelSettings.Buttons[dropoff] = TITAN_PANEL_MOVE_ADDON;
TitanPanelSettings.Location[dropoff] = dropoffbar;
TitanPanelSettings.Buttons[pickup] = TITAN_PANEL_DROPOFF_ADDON;
TitanPanelSettings.Location[pickup] = pickupbar;
end
end
end
-- This is important! The start drag cleared the button positions so
-- the buttons need to be put back properly.
TitanPanel_InitPanelButtons();
TITAN_PANEL_MOVE_ADDON = nil;
TITAN_PANEL_DROPOFF_ADDON = nil;
-- Restore the OnEnter script handler
if pluginOnEnter then self:SetScript("OnEnter", pluginOnEnter) end
pluginOnEnter = nil;
end
end
--[[ local
NAME: TitanTooltip_SetOwnerPosition
DESC: Set both the parent and the position of GameTooltip for the plugin tooltip.
VAR: parent - reference to the frame to attach the tooltip to
VAR: anchorPoint - tooltip anchor location (side or corner) to use
VAR: relativeToFrame - string name name of the frame, usually the plugin), to attach the tooltip to
VAR: relativePoint - parent anchor location (side or corner) to use
VAR: xOffset - X offset from the anchor point
VAR: yOffset - Y offset from the anchor point
VAR: frame - reference to the tooltip
OUT: None
--]]
local function TitanTooltip_SetOwnerPosition(parent, anchorPoint, relativeToFrame, relativePoint, xOffset, yOffset, frame)
if not frame then
frame = _G["GameTooltip"]
end
frame:SetOwner(parent, "ANCHOR_NONE");
frame:SetPoint(anchorPoint, relativeToFrame, relativePoint,
xOffset, yOffset);
-- set alpha (transparency) for the Game Tooltip
local red, green, blue = frame:GetBackdropColor();
local red2, green2, blue2 = frame:GetBackdropBorderColor();
local tool_trans = TitanPanelGetVar("TooltipTrans")
frame:SetBackdropColor(red,green,blue,tool_trans);
frame:SetBackdropBorderColor(red2,green2,blue2,tool_trans);
-- set font size for the Game Tooltip
if not TitanPanelGetVar("DisableTooltipFont") then
if TitanTooltipScaleSet < 1 then
TitanTooltipOrigScale = frame:GetScale();
TitanTooltipScaleSet = TitanTooltipScaleSet + 1;
end
frame:SetScale(TitanPanelGetVar("TooltipFont"));
end
end
--[[ API
NAME: TitanOptionSlider_TooltipText
DESC: Set the color of the tooltip text to normal (white) with the value in green.
VAR: text - the label for value
VAR: value - the value
OUT: string - encoded color string of text and value
--]]
function TitanOptionSlider_TooltipText(text, value)
return text .. GREEN_FONT_COLOR_CODE .. value .. FONT_COLOR_CODE_CLOSE;
end
--[[ API
NAME: TitanPanelButton_OnLoad
DESC: Handle the OnLoad event of the requested Titan plugin. Ensure the plugin is set to be registered.
VAR: isChildButton - boolean
NOTE:
- This is called from the Titan plugin frame in the OnLoad event - usually as the frame is created.
- This starts the plugin registration process. See TitanUtils for more details on plugin registration.
- The plugin registration is a two step process because not all addons create Titan plugins in the frame create. The Titan feature of converting LDB addons to Titan plugins is an example.
:NOTE
--]]
function TitanPanelButton_OnLoad(self, isChildButton) -- Used by plugins
TitanUtils_PluginToRegister(self, isChildButton)
end
--[[ API
NAME: TitanPanelPluginHandle_OnUpdate
DESC: A method to refresh the display of a Titan plugin.
VAR: table - the frame of the plugin
VAR: oldarg - nil or command
NOTE:
- This is used by some plugins. It is not used within Titan.
- The expected usage is either:
1) Table contains {, }
2) table = and oldarg =
- oldarg - nil or command
1 = refresh button
2 = refresh tooltip
3 = refresh button and tooltip
:NOTE
--]]
function TitanPanelPluginHandle_OnUpdate(table, oldarg) -- Used by plugins
local id, updateType = nil, nil
-- set the id and updateType
-- old method
if table and type(table) == "string" and oldarg then
id = table
updateType = oldarg
end
-- new method
if table and type(table) == "table" then
if table[1] then id = table[1] end
if table[2] then updateType = table[2] end
end
-- id is required
if id then
if updateType == TITAN_PANEL_UPDATE_BUTTON
or updateType == TITAN_PANEL_UPDATE_ALL then
TitanPanelButton_UpdateButton(id)
end
if (updateType == TITAN_PANEL_UPDATE_TOOLTIP
or updateType == TITAN_PANEL_UPDATE_ALL)
and MouseIsOver(_G["TitanPanel"..id.."Button"]) then
if TitanPanelRightClickMenu_IsVisible() or TITAN_PANEL_MOVING == 1 then
return
end
TitanPanelButton_SetTooltip(_G["TitanPanel"..id.."Button"], id)
end
end
end
--[[ API
NAME: TitanPanelDetectPluginMethod
DESC: Poorly named routine that sets the OnDragStart & OnDragStop scripts of a Titan plugin.
VAR: id - the string name of the plugin
VAR: isChildButton - boolean
--]]
function TitanPanelDetectPluginMethod(id, isChildButton)
-- Ensure the id is not nil
if not id then return end
local TitanPluginframe = _G["TitanPanel"..id.."Button"];
if isChildButton then
TitanPluginframe = _G[id];
end
-- Ensure the frame is valid
if not TitanPluginframe and TitanPluginframe:GetName() then return end -- sanity check...
-- Set the OnDragStart script
TitanPluginframe:SetScript("OnDragStart", function(self)
if not IsShiftKeyDown()
and not IsControlKeyDown()
and not IsAltKeyDown() then
if isChildButton then
TitanPanelButton_OnDragStart(self, true);
else
TitanPanelButton_OnDragStart(self);
end
end
end)
-- Set the OnDragStop script
TitanPluginframe:SetScript("OnDragStop", function(self)
if isChildButton then
TitanPanelButton_OnDragStop(self, true)
else
TitanPanelButton_OnDragStop(self);
end
end)
end
--[[ API
NAME: TitanPanelButton_OnShow
DESC: Handle the OnShow event of the requested Titan plugin.
VAR:self - frame reference of the plugin
--]]
function TitanPanelButton_OnShow(self) -- Used by plugins
local id = nil;
-- ensure that the 'self' passed is a valid frame reference
if self and self:GetName() then
id = TitanUtils_GetButtonID(self:GetName());
end
-- ensure that id is a valid Titan plugin
if (id) then
TitanPanelButton_UpdateButton(id, 1);
end
end
--[[ API
NAME: TitanPanelButton_OnClick
DESC: Handle the OnClick mouse event of the requested Titan plugin.
VAR: self - frame reference of the plugin
VAR: button - mouse button that was clicked
VAR: isChildButton - boolean
NOTE:
- Only the left and right mouse buttons are handled by Titan.
:NOTE
--]]
function TitanPanelButton_OnClick(self, button, isChildButton) -- Used by plugins
local id
-- ensure that the 'self' passed is a valid frame reference
if self and self:GetName() then
id = TitanUtils_Ternary(isChildButton,
TitanUtils_GetParentButtonID(self:GetName()),
TitanUtils_GetButtonID(self:GetName()));
end
if id then
local controlFrame = TitanUtils_GetControlFrame(id);
local rightClickMenu = _G["TitanPanelRightClickMenu"];
if (button == "LeftButton") then
local isControlFrameShown;
if (not controlFrame) then
isControlFrameShown = false;
elseif (controlFrame:IsVisible()) then
isControlFrameShown = false;
else
isControlFrameShown = true;
end
TitanUtils_CloseAllControlFrames();
TitanPanelRightClickMenu_Close();
local position = TitanUtils_GetWhichBar(id)
local scale = TitanPanelGetVar("Scale");
if (isControlFrameShown) then
local buttonCenter = (self:GetLeft() + self:GetRight()) / 2 * scale;
local controlFrameRight = buttonCenter + controlFrame:GetWidth() / 2;
local y_off = TITAN_PANEL_BAR_HEIGHT * scale
if ( position == TITAN_PANEL_PLACE_TOP ) then
controlFrame:ClearAllPoints();
controlFrame:SetPoint("TOP", "UIParent", "TOPLEFT", buttonCenter, -y_off);
-- Adjust control frame position if it's off the screen
local offscreenX, offscreenY = TitanUtils_GetOffscreen(controlFrame);
if ( offscreenX == -1 ) then
controlFrame:ClearAllPoints();
controlFrame:SetPoint("TOPLEFT", "UIParent", "TOPLEFT", 0, -y_off);
elseif ( offscreenX == 1 ) then
controlFrame:ClearAllPoints();
controlFrame:SetPoint("TOPRIGHT", "UIParent", "TOPRIGHT", 0, -y_off);
end
else
controlFrame:ClearAllPoints();
controlFrame:SetPoint("BOTTOM", "UIParent", "BOTTOMLEFT", buttonCenter, y_off);
-- Adjust control frame position if it's off the screen
local offscreenX, offscreenY = TitanUtils_GetOffscreen(controlFrame);
if ( offscreenX == -1 ) then
controlFrame:ClearAllPoints();
controlFrame:SetPoint("BOTTOMLEFT", "UIParent", "BOTTOMLEFT", 0, y_off);
elseif ( offscreenX == 1 ) then
controlFrame:ClearAllPoints();
controlFrame:SetPoint("BOTTOMRIGHT", "UIParent", "BOTTOMRIGHT", 0, y_off);
end
end
controlFrame:Show();
end
elseif (button == "RightButton") then
TitanUtils_CloseAllControlFrames();
-- Show RightClickMenu anyway
TitanPanelRightClickMenu_Close();
TitanPanelRightClickMenu_Toggle(self, isChildButton);
end
GameTooltip:Hide();
end
end
--[[ API
NAME: TitanPanelButton_OnEnter
DESC: Handle the OnEnter cursor event of the requested Titan plugin.
VAR: self - frame reference of the plugin
VAR: isChildButton - boolean
NOTE:
- The cursor has moved over the plugin so show the plugin tooltip.
- Save same hassle by doing nothing if the tooltip is already shown or if the cursor is moving.
- If the "is moving" is set the user is dragging this plugin around so do nothing here.
:NOTE
--]]
function TitanPanelButton_OnEnter(self, isChildButton) -- Used by plugins
local id = nil;
-- ensure that the 'self' passed is a valid frame reference
if self and self:GetName() then
id = TitanUtils_Ternary(isChildButton,
TitanUtils_GetParentButtonID(self:GetName()),
TitanUtils_GetButtonID(self:GetName()));
end
if (id) then
local controlFrame = TitanUtils_GetControlFrame(id);
if (controlFrame and controlFrame:IsVisible()) then
return;
elseif (TitanPanelRightClickMenu_IsVisible()) then
return;
else
if TITAN_PANEL_MOVING == 0 then
TitanPanelButton_SetTooltip(self, id);
end
if self.isMoving then
GameTooltip:Hide();
end
end
end
end
--[[ API
NAME: TitanPanelButton_OnLeave
DESC: Handle the OnLeave cursor event of the requested Titan plugin.
VAR: self - frame reference of the plugin
VAR: isChildButton - boolean
NOTE:
- The cursor has moved off the plugin so hide the plugin tooltip.
:NOTE
--]]
function TitanPanelButton_OnLeave(self, isChildButton)
local id = nil;
-- ensure that the 'self' passed is a valid frame reference
if self and self:GetName() then
id = TitanUtils_Ternary(isChildButton,
TitanUtils_GetParentButtonID(self:GetName()),
TitanUtils_GetButtonID(self:GetName()));
end
if (id) then
GameTooltip:Hide();
end
if not TitanPanelGetVar("DisableTooltipFont") then
-- reset original Tooltip Scale
GameTooltip:SetScale(TitanTooltipOrigScale);
TitanTooltipScaleSet = 0;
end
end
-- local routines for Update Button
--[[ local
NAME: TitanPanelButton_SetButtonText
DESC: Set / update the text of the given Titan plugin.
VAR: id - string name of the plugin
NOTE:
- The plugin is expected to tell Titan what routine is to be called in .registry.buttonTextFunction.
- The text routine is called in protected mode (pcall) to ensure the Titan main routines still run.
:NOTE
--]]
local format_with_label = { [0] = "" }
for idx = 1, 4 do format_with_label[idx] = "%s%s" .. (TITAN_PANEL_LABEL_SEPARATOR .. "%s%s"):rep(idx - 1) end
local function TitanPanelButton_SetButtonText(id)
if not (id and TitanUtils_IsPluginRegistered(id)) then return end
local buttonTextFunction = _G[TitanUtils_GetPlugin(id).buttonTextFunction];
if not buttonTextFunction then return end
local button = TitanUtils_GetButton(id);
local buttonText = _G[button:GetName()..TITAN_PANEL_TEXT];
local newfont = media:Fetch("font", TitanPanelGetVar("FontName"))
if newfont then
buttonText:SetFont(newfont, TitanPanelGetVar("FontSize"))
end
-- We'll be paranoid here and call the button text in protected mode.
-- In case the button text fails it will not take Titan with it...
local call_success, -- for pcall
label1, value1, label2, value2, label3, value3, label4, value4 =
pcall(buttonTextFunction, id)
if not call_success then buttonText:SetText(">") return end
if label1 and
not (label2 or label3 or label4
or value1 or value2 or value3 or value4) then
buttonText:SetText(label1)
return
end
local show_label = TitanGetVar(id, "ShowLabelText")
local values = 0
if label1 or value1 then
values = 1
if not show_label then label1 = "" end
if label2 or value2 then
values = 2
if not show_label then label2 = "" end
if label3 or value3 then
values = 3
if not show_label then label3 = "" end
if label4 or value4 then
values = 4
if not show_label then label4 = "" end
end
end
end
end
buttonText:SetFormattedText(format_with_label[values],
label1 or "", value1 or "",
label2 or "", value2 or "",
label3 or "", value3 or "",
label4 or "", value4 or ""
)
end
--[[ local
NAME: TitanPanelButton_SetTextButtonWidth
DESC: Set the text width of the given Titan plugin that is text only.
VAR: id - string name of the plugin
VAR: setButtonWidth - new width
NOTE:
- Titan uses a tolerance setting to prevent endless updating of the text width.
:NOTE
--]]
local function TitanPanelButton_SetTextButtonWidth(id, setButtonWidth)
if (id) then
local button = TitanUtils_GetButton(id);
local text = _G[button:GetName()..TITAN_PANEL_TEXT];
if ( setButtonWidth
or button:GetWidth() == 0
or button:GetWidth() - text:GetWidth() > TITAN_PANEL_BUTTON_WIDTH_CHANGE_TOLERANCE
or button:GetWidth() - text:GetWidth() < -TITAN_PANEL_BUTTON_WIDTH_CHANGE_TOLERANCE ) then
button:SetWidth(text:GetWidth());
TitanPanelButton_Justify();
end
end
end
--[[ local
NAME: TitanPanelButton_SetIconButtonWidth
DESC: Set the icon width of the given Titan plugin that is icon only.
VAR: id - string name of the plugin
NOTE:
- The plugin is expected to tell Titan what the icon width is in .registry.iconButtonWidth.
:NOTE
--]]
local function TitanPanelButton_SetIconButtonWidth(id)
if (id) then
local button = TitanUtils_GetButton(id);
if ( TitanUtils_GetPlugin(id).iconButtonWidth ) then
button:SetWidth(TitanUtils_GetPlugin(id).iconButtonWidth);
end
end
end
--[[ local
NAME: TitanPanelButton_SetComboButtonWidth
DESC: Set the icon width of the given Titan plugin that is a combo - icon & text.
VAR: id - string name of the plugin
VAR: setButtonWidth - new width
NOTE:
- The plugin is expected to tell Titan what the icon width is in .registry.iconButtonWidth.
:NOTE
--]]
local function TitanPanelButton_SetComboButtonWidth(id, setButtonWidth)
if (id) then
local button = TitanUtils_GetButton(id)
if not button then return end -- sanity check
local text = _G[button:GetName()..TITAN_PANEL_TEXT];
local icon = _G[button:GetName().."Icon"];
local iconWidth, iconButtonWidth, newButtonWidth;
-- Get icon button width
iconButtonWidth = 0;
if ( TitanUtils_GetPlugin(id).iconButtonWidth ) then
iconButtonWidth = TitanUtils_GetPlugin(id).iconButtonWidth;
elseif ( icon:GetWidth() ) then
iconButtonWidth = icon:GetWidth();
end
if ( TitanGetVar(id, "ShowIcon") and ( iconButtonWidth ~= 0 ) ) then
icon:Show();
text:ClearAllPoints();
text:SetPoint("LEFT", icon:GetName(), "RIGHT", 2, 1);
newButtonWidth = text:GetWidth() + iconButtonWidth;
else
icon:Hide();
text:ClearAllPoints();
text:SetPoint("LEFT", button:GetName(), "LEFT", 0, 1);
newButtonWidth = text:GetWidth();
end
if ( setButtonWidth
or button:GetWidth() == 0
or button:GetWidth() - newButtonWidth > TITAN_PANEL_BUTTON_WIDTH_CHANGE_TOLERANCE
or button:GetWidth() - newButtonWidth < -TITAN_PANEL_BUTTON_WIDTH_CHANGE_TOLERANCE )
then
button:SetWidth(newButtonWidth);
TitanPanelButton_Justify();
end
end
end
--[[ API
NAME: TitanPanelButton_UpdateButton
DESC: Update the display of the given Titan plugin.
VAR: id - string name of the plugin
VAR: setButtonWidth - new width
--]]
function TitanPanelButton_UpdateButton(id, setButtonWidth) -- Used by plugins
local button, id = TitanUtils_GetButton(id);
local plugin = TitanUtils_GetPlugin(id)
-- safeguard to avoid errors
if not TitanUtils_IsPluginRegistered(id) then return end
if ( TitanPanelButton_IsText(id) ) then
-- Update textButton
TitanPanelButton_SetButtonText(id);
TitanPanelButton_SetTextButtonWidth(id, setButtonWidth);
elseif ( TitanPanelButton_IsIcon(id) ) then
-- Update iconButton
TitanPanelButton_SetButtonIcon(id, (plugin.iconCoords or nil),
(plugin.iconR or nil),(plugin.iconG or nil),(plugin.iconB or nil)
);
TitanPanelButton_SetIconButtonWidth(id);
elseif ( TitanPanelButton_IsCombo(id) ) then
-- Update comboButton
TitanPanelButton_SetButtonText(id);
TitanPanelButton_SetButtonIcon(id, (plugin.iconCoords or nil),
(plugin.iconR or nil),(plugin.iconG or nil),(plugin.iconB or nil)
);
TitanPanelButton_SetComboButtonWidth(id, setButtonWidth);
end
end
--[[ API
NAME: TitanPanelButton_UpdateTooltip
DESC: Update the tooltip of the given Titan plugin.
VAR: self - frame reference of the plugin
--]]
function TitanPanelButton_UpdateTooltip(self) -- Used by plugins
if not self then return end
if (GameTooltip:IsOwned(self)) then
local id = TitanUtils_GetButtonID(self:GetName());
TitanPanelButton_SetTooltip(self, id);
end
end
--[[ API
NAME: TitanPanelButton_SetButtonIcon
DESC: Set the icon of the given Titan plugin.
VAR: id - string name of the plugin
VAR: iconCoords - if given, this is the placing of the icon within the plugin
VAR: iconR - if given, this is the Red (RBG) setting of the icon
VAR: iconG - if given, this is the Green (RBG) setting of the icon
VAR: iconB - if given, this is the Blue (RBG) setting of the icon
--]]
function TitanPanelButton_SetButtonIcon(id, iconCoords, iconR, iconG, iconB)
if (id and TitanUtils_IsPluginRegistered(id)) then
local button = TitanUtils_GetButton(id);
local icon = _G[button:GetName().."Icon"];
local iconTexture = TitanUtils_GetPlugin(id).icon;
local iconWidth = TitanUtils_GetPlugin(id).iconWidth;
if (iconTexture) and icon then
icon:SetTexture(iconTexture);
end
if (iconWidth) and icon then
icon:SetWidth(iconWidth);
end
-- support for iconCoords, iconR, iconG, iconB attributes
if iconCoords and icon then
icon:SetTexCoord(unpack(iconCoords))
end
if iconR and iconG and iconB and icon then
icon:SetVertexColor(iconR, iconG, iconB)
end
end
end
--[[ Titan
NAME: TitanPanelButton_GetType
DESC: Get the type of the given Titan plugin.
VAR: id - string name of the plugin
OUT: type - The type of the plugin (text, icon, combo (default))
NOTE:
- This assumes that the developer is playing nice and is using the Titan templates as is...
:NOTE
--]]
function TitanPanelButton_GetType(id)
-- id is required
if (not id) then
return;
end
local button = TitanUtils_GetButton(id);
local type;
if button then
local text = _G[button:GetName()..TITAN_PANEL_TEXT];
local icon = _G[button:GetName().."Icon"];
if (text and icon) then
type = TITAN_PANEL_BUTTON_TYPE_COMBO;
elseif (text and not icon) then
type = TITAN_PANEL_BUTTON_TYPE_TEXT;
elseif (not text and icon) then
type = TITAN_PANEL_BUTTON_TYPE_ICON;
elseif (not text and not icon) then
type = TITAN_PANEL_BUTTON_TYPE_CUSTOM;
end
else
type = TITAN_PANEL_BUTTON_TYPE_COMBO;
end
return type;
end
--[[ Titan
NAME: TitanOptionsSliderTemplate_OnLoad
DESC: Loads the Backdrop for TitanOptionsSliderTemplate with new 9.0 API
VAR: self - The frame
--]]
function TitanOptionsSliderTemplate_OnLoad(self)
self:SetBackdrop({
bgFile="Interface\\Buttons\\UI-SliderBar-Background",
edgeFile="Interface\\Buttons\\UI-SliderBar-Border",
tile = true,
insets = {
left = 6,
right = 6,
top = 3,
bottom = 3,
},
tileSize = 8,
edgeSize = 8,
})
end