Files
coa-details/Libs/DF/button.lua
T
Tercio e28dbc990d - this is part of ToS June 20th update.
- New Death Recap implemented! replaces the default from Blizzard and can be configured at Options > Raid Tools.
- New Guild Damage and Heal rank on '/details ranking' panel.
- Added a Guild Sync button on the Details! Ranking Panel.
- Added Custom display 'Damage on Shields', useful for encounter like Maiden of Vigilance where there's big shields to be removed and you want to know who is doing more damage to it.
- Added Heal Absorbed display under Heal bracket.\n\nHeal Absorb are the heal denied by abilities such like DK's Necrotic Strike or raid boss Sisters of the Moon 'Embrace of the Eclipse' ability.\nThe tooltip of this display shows which players got heal denied, which abilities absorbed the heal, which abilities tried to heal but got the heal denied.
- Added Alternate Power display under Energy bracket, it shows the total of alternate power gain from each player, useful for encounters such as Demonic Inquisition.
- Fixed Paladin 'Light of the Martyr' damage to self.
2017-06-14 19:32:17 -03:00

1136 lines
38 KiB
Lua

local DF = _G ["DetailsFramework"]
if (not DF or not DetailsFrameworkCanLoad) then
return
end
local _
local _rawset = rawset --> lua local
local _rawget = rawget --> lua local
local _setmetatable = setmetatable --> lua local
local _unpack = unpack --> lua local
local _type = type --> lua local
local _math_floor = math.floor --> lua local
local loadstring = loadstring --> lua local
local cleanfunction = function() end
local APIButtonFunctions = false
do
local metaPrototype = {
WidgetType = "button",
SetHook = DF.SetHook,
RunHooksForWidget = DF.RunHooksForWidget,
}
_G [DF.GlobalWidgetControlNames ["button"]] = _G [DF.GlobalWidgetControlNames ["button"]] or metaPrototype
end
local ButtonMetaFunctions = _G [DF.GlobalWidgetControlNames ["button"]]
------------------------------------------------------------------------------------------------------------
--> metatables
ButtonMetaFunctions.__call = function (_table, value, ...)
return self.func (_table.param1, _table.param2, value, ...)
end
------------------------------------------------------------------------------------------------------------
--> members
--> tooltip
local gmember_tooltip = function (_object)
return _object:GetTooltip()
end
--> shown
local gmember_shown = function (_object)
return _object:IsShown()
end
--> frame width
local gmember_width = function (_object)
return _object.button:GetWidth()
end
--> frame height
local gmember_height = function (_object)
return _object.button:GetHeight()
end
--> text
local gmember_text = function (_object)
return _object.button.text:GetText()
end
--> function
local gmember_function = function (_object)
return _rawget (_object, "func")
end
--> text color
local gmember_textcolor = function (_object)
return _object.button.text:GetTextColor()
end
--> text font
local gmember_textfont = function (_object)
local fontface = _object.button.text:GetFont()
return fontface
end
--> text size
local gmember_textsize = function (_object)
local _, fontsize = _object.button.text:GetFont()
return fontsize
end
--> texture
local gmember_texture = function (_object)
return {_object.button:GetNormalTexture(), _object.button:GetHighlightTexture(), _object.button:GetPushedTexture(), _object.button:GetDisabledTexture()}
end
--> locked
local gmember_locked = function (_object)
return _rawget (_object, "is_locked")
end
ButtonMetaFunctions.GetMembers = ButtonMetaFunctions.GetMembers or {}
ButtonMetaFunctions.GetMembers ["tooltip"] = gmember_tooltip
ButtonMetaFunctions.GetMembers ["shown"] = gmember_shown
ButtonMetaFunctions.GetMembers ["width"] = gmember_width
ButtonMetaFunctions.GetMembers ["height"] = gmember_height
ButtonMetaFunctions.GetMembers ["text"] = gmember_text
ButtonMetaFunctions.GetMembers ["clickfunction"] = gmember_function
ButtonMetaFunctions.GetMembers ["texture"] = gmember_texture
ButtonMetaFunctions.GetMembers ["locked"] = gmember_locked
ButtonMetaFunctions.GetMembers ["fontcolor"] = gmember_textcolor
ButtonMetaFunctions.GetMembers ["fontface"] = gmember_textfont
ButtonMetaFunctions.GetMembers ["fontsize"] = gmember_textsize
ButtonMetaFunctions.GetMembers ["textcolor"] = gmember_textcolor --alias
ButtonMetaFunctions.GetMembers ["textfont"] = gmember_textfont --alias
ButtonMetaFunctions.GetMembers ["textsize"] = gmember_textsize --alias
ButtonMetaFunctions.__index = function (_table, _member_requested)
local func = ButtonMetaFunctions.GetMembers [_member_requested]
if (func) then
return func (_table, _member_requested)
end
local fromMe = _rawget (_table, _member_requested)
if (fromMe) then
return fromMe
end
return ButtonMetaFunctions [_member_requested]
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> tooltip
local smember_tooltip = function (_object, _value)
return _object:SetTooltip (_value)
end
--> show
local smember_show = function (_object, _value)
if (_value) then
return _object:Show()
else
return _object:Hide()
end
end
--> hide
local smember_hide = function (_object, _value)
if (not _value) then
return _object:Show()
else
return _object:Hide()
end
end
--> frame width
local smember_width = function (_object, _value)
return _object.button:SetWidth (_value)
end
--> frame height
local smember_height = function (_object, _value)
return _object.button:SetHeight (_value)
end
--> text
local smember_text = function (_object, _value)
return _object.button.text:SetText (_value)
end
--> function
local smember_function = function (_object, _value)
return _rawset (_object, "func", _value)
end
--> text color
local smember_textcolor = function (_object, _value)
local _value1, _value2, _value3, _value4 = DF:ParseColors (_value)
return _object.button.text:SetTextColor (_value1, _value2, _value3, _value4)
end
--> text font
local smember_textfont = function (_object, _value)
return DF:SetFontFace (_object.button.text, _value)
end
--> text size
local smember_textsize = function (_object, _value)
return DF:SetFontSize (_object.button.text, _value)
end
--> texture
local smember_texture = function (_object, _value)
if (_type (_value) == "table") then
local _value1, _value2, _value3, _value4 = unpack (_value)
if (_value1) then
_object.button:SetNormalTexture (_value1)
end
if (_value2) then
_object.button:SetHighlightTexture (_value2, "ADD")
end
if (_value3) then
_object.button:SetPushedTexture (_value3)
end
if (_value4) then
_object.button:SetDisabledTexture (_value4)
end
else
_object.button:SetNormalTexture (_value)
_object.button:SetHighlightTexture (_value, "ADD")
_object.button:SetPushedTexture (_value)
_object.button:SetDisabledTexture (_value)
end
return
end
--> locked
local smember_locked = function (_object, _value)
if (_value) then
_object.button:SetMovable (false)
return _rawset (_object, "is_locked", true)
else
_object.button:SetMovable (true)
_rawset (_object, "is_locked", false)
return
end
end
--> text align
local smember_textalign = function (_object, _value)
if (_value == "left" or _value == "<") then
_object.button.text:SetPoint ("left", _object.button, "left", 2, 0)
_object.capsule_textalign = "left"
elseif (_value == "center" or _value == "|") then
_object.button.text:SetPoint ("center", _object.button, "center", 0, 0)
_object.capsule_textalign = "center"
elseif (_value == "right" or _value == ">") then
_object.button.text:SetPoint ("right", _object.button, "right", -2, 0)
_object.capsule_textalign = "right"
end
end
ButtonMetaFunctions.SetMembers = ButtonMetaFunctions.SetMembers or {}
ButtonMetaFunctions.SetMembers ["tooltip"] = smember_tooltip
ButtonMetaFunctions.SetMembers ["show"] = smember_show
ButtonMetaFunctions.SetMembers ["hide"] = smember_hide
ButtonMetaFunctions.SetMembers ["width"] = smember_width
ButtonMetaFunctions.SetMembers ["height"] = smember_height
ButtonMetaFunctions.SetMembers ["text"] = smember_text
ButtonMetaFunctions.SetMembers ["clickfunction"] = smember_function
ButtonMetaFunctions.SetMembers ["textcolor"] = smember_textcolor
ButtonMetaFunctions.SetMembers ["textfont"] = smember_textfont
ButtonMetaFunctions.SetMembers ["textsize"] = smember_textsize
ButtonMetaFunctions.SetMembers ["texture"] = smember_texture
ButtonMetaFunctions.SetMembers ["locked"] = smember_locked
ButtonMetaFunctions.SetMembers ["textalign"] = smember_textalign
ButtonMetaFunctions.__newindex = function (_table, _key, _value)
local func = ButtonMetaFunctions.SetMembers [_key]
if (func) then
return func (_table, _value)
else
return _rawset (_table, _key, _value)
end
end
------------------------------------------------------------------------------------------------------------
--> methods
--> show & hide
function ButtonMetaFunctions:IsShown()
return self.button:IsShown()
end
function ButtonMetaFunctions:Show()
return self.button:Show()
end
function ButtonMetaFunctions:Hide()
return self.button:Hide()
end
-- setpoint
function ButtonMetaFunctions:SetPoint (v1, v2, v3, v4, v5)
v1, v2, v3, v4, v5 = DF:CheckPoints (v1, v2, v3, v4, v5, self)
if (not v1) then
error ("SetPoint: Invalid parameter.")
return
end
return self.widget:SetPoint (v1, v2, v3, v4, v5)
end
-- sizes
function ButtonMetaFunctions:SetSize (w, h)
if (w) then
self.button:SetWidth (w)
end
if (h) then
return self.button:SetHeight (h)
end
end
-- tooltip
function ButtonMetaFunctions:SetTooltip (tooltip)
if (tooltip) then
return _rawset (self, "have_tooltip", tooltip)
else
return _rawset (self, "have_tooltip", nil)
end
end
function ButtonMetaFunctions:GetTooltip()
return _rawget (self, "have_tooltip")
end
-- functions
function ButtonMetaFunctions:SetClickFunction (func, param1, param2, clicktype)
if (not clicktype or string.find (string.lower (clicktype), "left")) then
if (func) then
_rawset (self, "func", func)
else
_rawset (self, "func", cleanfunction)
end
if (param1 ~= nil) then
_rawset (self, "param1", param1)
end
if (param2 ~= nil) then
_rawset (self, "param2", param2)
end
elseif (clicktype or string.find (string.lower (clicktype), "right")) then
if (func) then
_rawset (self, "funcright", func)
else
_rawset (self, "funcright", cleanfunction)
end
end
end
-- text
function ButtonMetaFunctions:SetText (text)
if (text) then
self.button.text:SetText (text)
else
self.button.text:SetText (nil)
end
end
-- textcolor
function ButtonMetaFunctions:SetTextColor (color, arg2, arg3, arg4)
if (arg2) then
return self.button.text:SetTextColor (color, arg2, arg3, arg4 or 1)
end
local _value1, _value2, _value3, _value4 = DF:ParseColors (color)
return self.button.text:SetTextColor (_value1, _value2, _value3, _value4)
end
-- textsize
function ButtonMetaFunctions:SetTextSize (size)
return DF:SetFontSize (self.button.text, _value)
end
-- textfont
function ButtonMetaFunctions:SetTextFont (font)
return DF:SetFontFace (_object.button.text, _value)
end
-- textures
function ButtonMetaFunctions:SetTexture (normal, highlight, pressed, disabled)
if (normal) then
self.button:SetNormalTexture (normal)
elseif (_type (normal) ~= "boolean") then
self.button:SetNormalTexture (nil)
end
if (_type (highlight) == "boolean") then
if (highlight and normal and _type (normal) ~= "boolean") then
self.button:SetHighlightTexture (normal, "ADD")
end
elseif (highlight == nil) then
self.button:SetHighlightTexture (nil)
else
self.button:SetHighlightTexture (highlight, "ADD")
end
if (_type (pressed) == "boolean") then
if (pressed and normal and _type (normal) ~= "boolean") then
self.button:SetPushedTexture (normal)
end
elseif (pressed == nil) then
self.button:SetPushedTexture (nil)
else
self.button:SetPushedTexture (pressed, "ADD")
end
if (_type (disabled) == "boolean") then
if (disabled and normal and _type (normal) ~= "boolean") then
self.button:SetDisabledTexture (normal)
end
elseif (disabled == nil) then
self.button:SetDisabledTexture (nil)
else
self.button:SetDisabledTexture (disabled, "ADD")
end
end
-- frame levels
function ButtonMetaFunctions:GetFrameLevel()
return self.button:GetFrameLevel()
end
function ButtonMetaFunctions:SetFrameLevel (level, frame)
if (not frame) then
return self.button:SetFrameLevel (level)
else
local framelevel = frame:GetFrameLevel (frame) + level
return self.button:SetFrameLevel (framelevel)
end
end
-- icon
function ButtonMetaFunctions:SetIcon (texture, width, height, layout, texcoord, overlay, textdistance, leftpadding, textheight, short_method)
if (not self.icon) then
self.icon = self:CreateTexture (nil, "artwork")
self.icon:SetSize (self.height*0.8, self.height*0.8)
self.icon:SetPoint ("left", self.widget, "left", 4 + (leftpadding or 0), 0)
self.icon.leftpadding = leftpadding or 0
self.widget.text:ClearAllPoints()
self.widget.text:SetPoint ("left", self.icon, "right", textdistance or 2, 0 + (textheight or 0))
end
self.icon:SetTexture (texture)
self.icon:SetSize (width or self.height*0.8, height or self.height*0.8)
self.icon:SetDrawLayer (layout or "artwork")
if (texcoord) then
self.icon:SetTexCoord (unpack (texcoord))
else
self.icon:SetTexCoord (0, 1, 0, 1)
end
if (overlay) then
if (type (overlay) == "string") then
local r, g, b, a = DF:ParseColors (overlay)
self.icon:SetVertexColor (r, g, b, a)
else
self.icon:SetVertexColor (unpack (overlay))
end
else
self.icon:SetVertexColor (1, 1, 1, 1)
end
local w = self.button:GetWidth()
local iconw = self.icon:GetWidth()
local text_width = self.button.text:GetStringWidth()
if (text_width > w-15-iconw) then
if (short_method == false) then
elseif (not short_method) then
local new_width = text_width+15+iconw
self.button:SetWidth (new_width)
elseif (short_method == 1) then
local loop = true
local textsize = 11
while (loop) do
if (text_width+15+iconw < w or textsize < 8) then
loop = false
break
else
DF:SetFontSize (self.button.text, textsize)
text_width = self.button.text:GetStringWidth()
textsize = textsize - 1
end
end
end
end
end
-- frame stratas
function ButtonMetaFunctions:SetFrameStrata()
return self.button:GetFrameStrata()
end
function ButtonMetaFunctions:SetFrameStrata (strata)
if (_type (strata) == "table") then
self.button:SetFrameStrata (strata:GetFrameStrata())
else
self.button:SetFrameStrata (strata)
end
end
-- enabled
function ButtonMetaFunctions:IsEnabled()
return self.button:IsEnabled()
end
function ButtonMetaFunctions:Enable()
return self.button:Enable()
end
function ButtonMetaFunctions:Disable()
return self.button:Disable()
end
-- exec
function ButtonMetaFunctions:Exec()
return self.func (self.param1, self.param2)
end
function ButtonMetaFunctions:Click()
return self.func (self.param1, self.param2)
end
function ButtonMetaFunctions:RightClick()
return self.funcright()
end
--> custom textures
function ButtonMetaFunctions:InstallCustomTexture (texture, rect, coords, use_split, side_textures, side_textures2)
self.button:SetNormalTexture (nil)
self.button:SetPushedTexture (nil)
self.button:SetDisabledTexture (nil)
self.button:SetHighlightTexture (nil)
local button = self.button
if (use_split) then
--> 4 corners
button.textureTopLeft = button:CreateTexture (nil, "artwork"); button.textureTopLeft:SetSize (8, 8); button.textureTopLeft:SetPoint ("topleft", button)
button.textureTopRight = button:CreateTexture (nil, "artwork"); button.textureTopRight:SetSize (8, 8); button.textureTopRight:SetPoint ("topright", button)
button.textureBottomLeft = button:CreateTexture (nil, "artwork"); button.textureBottomLeft:SetSize (8, 8); button.textureBottomLeft:SetPoint ("bottomleft", button)
button.textureBottomRight = button:CreateTexture (nil, "artwork"); button.textureBottomRight:SetSize (8, 8); button.textureBottomRight:SetPoint ("bottomright", button)
button.textureLeft = button:CreateTexture (nil, "artwork"); button.textureLeft:SetWidth (4); button.textureLeft:SetPoint ("topleft", button.textureTopLeft, "bottomleft"); button.textureLeft:SetPoint ("bottomleft", button.textureBottomLeft, "topleft")
button.textureRight = button:CreateTexture (nil, "artwork"); button.textureRight:SetWidth (4); button.textureRight:SetPoint ("topright", button.textureTopRight, "bottomright"); button.textureRight:SetPoint ("bottomright", button.textureBottomRight, "topright")
button.textureTop = button:CreateTexture (nil, "artwork"); button.textureTop:SetHeight (4); button.textureTop:SetPoint ("topleft", button.textureTopLeft, "topright"); button.textureTop:SetPoint ("topright", button.textureTopRight, "topleft");
button.textureBottom = button:CreateTexture (nil, "artwork"); button.textureBottom:SetHeight (4); button.textureBottom:SetPoint ("bottomleft", button.textureBottomLeft, "bottomright"); button.textureBottom:SetPoint ("bottomright", button.textureBottomRight, "bottomleft");
button.textureLeft:SetTexCoord (0, 4/128, 9/128, 24/128)
button.textureRight:SetTexCoord (124/128, 1, 9/128, 24/128)
button.textureTop:SetTexCoord (9/128, 120/128, 0, 4/128)
button.textureBottom:SetTexCoord (9/128, 119/128, 28/128, 32/128)
button.textureTopLeft:SetTexCoord (0, 8/128, 0, 8/128)
button.textureTopRight:SetTexCoord (121/128, 1, 0, 8/128)
button.textureBottomLeft:SetTexCoord (0, 8/128, 24/128, 32/128)
button.textureBottomRight:SetTexCoord (120/128, 1, 24/128, 32/128)
button.textureTopLeft:SetTexture ([[Interface\AddOns\Details\images\default_button]])
button.textureTopRight:SetTexture ([[Interface\AddOns\Details\images\default_button]])
button.textureBottomLeft:SetTexture ([[Interface\AddOns\Details\images\default_button]])
button.textureBottomRight:SetTexture ([[Interface\AddOns\Details\images\default_button]])
button.textureLeft:SetTexture ([[Interface\AddOns\Details\images\default_button]])
button.textureRight:SetTexture ([[Interface\AddOns\Details\images\default_button]])
button.textureTop:SetTexture ([[Interface\AddOns\Details\images\default_button]])
button.textureBottom:SetTexture ([[Interface\AddOns\Details\images\default_button]])
else
texture = texture or "Interface\\AddOns\\Details\\images\\default_button"
self.button.texture = self.button:CreateTexture (nil, "artwork")
if (not rect) then
self.button.texture:SetAllPoints (self.button)
else
self.button.texture:SetPoint ("topleft", self.button, "topleft", rect.x1, rect.y1)
self.button.texture:SetPoint ("bottomright", self.button, "bottomright", rect.x2, rect.y2)
end
if (coords) then
self.button.texture.coords = coords
self.button.texture:SetTexCoord (_unpack (coords.Normal))
else
self.button.texture:SetTexCoord (0, 1, 0, 0.24609375)
end
self.button.texture:SetTexture (texture)
end
if (side_textures) then
local left = self.button:CreateTexture (nil, "overlay")
left:SetTexture ([[Interface\TALENTFRAME\talent-main]])
left:SetTexCoord (0.13671875, 0.25, 0.486328125, 0.576171875)
left:SetPoint ("left", self.button, 0, 0)
left:SetWidth (10)
left:SetHeight (self.button:GetHeight()+2)
self.button.left_border = left
local right = self.button:CreateTexture (nil, "overlay")
right:SetTexture ([[Interface\TALENTFRAME\talent-main]])
right:SetTexCoord (0.01953125, 0.13671875, 0.486328125, 0.576171875)
right:SetPoint ("right", self.button, 0, 0)
right:SetWidth (10)
right:SetHeight (self.button:GetHeight()+2)
self.button.right_border = right
elseif (side_textures2) then
local left = self.button:CreateTexture (nil, "overlay")
left:SetTexture ([[Interface\AddOns\Details\images\icons]])
left:SetTexCoord (94/512, 123/512, 42/512, 87/512)
left:SetPoint ("left", self.button, 0, 0)
left:SetWidth (10)
left:SetHeight (self.button:GetHeight()+2)
self.button.left_border = left
local right = self.button:CreateTexture (nil, "overlay")
right:SetTexture ([[Interface\AddOns\Details\images\icons]])
right:SetTexCoord (65/512, 94/512, 42/512, 87/512)
right:SetPoint ("right", self.button, 0, 0)
right:SetWidth (10)
right:SetHeight (self.button:GetHeight()+2)
self.button.right_border = right
end
end
------------------------------------------------------------------------------------------------------------
--> scripts
local OnEnter = function (button)
local capsule = button.MyObject
if (button.textureTopLeft) then
button.textureLeft:SetTexCoord (0, 4/128, 40/128, 56/128)
button.textureRight:SetTexCoord (124/128, 1, 40/128, 56/128)
button.textureTop:SetTexCoord (9/128, 120/128, 33/128, 37/128)
button.textureBottom:SetTexCoord (9/128, 119/128, 60/128, 64/128)
button.textureTopLeft:SetTexCoord (0, 8/128, 33/128, 40/128)
button.textureTopRight:SetTexCoord (121/128, 1, 33/128, 40/128)
button.textureBottomLeft:SetTexCoord (0, 8/128, 56/128, 64/128)
button.textureBottomRight:SetTexCoord (120/128, 1, 56/128, 64/128)
end
local kill = capsule:RunHooksForWidget ("OnEnter", button, capsule)
if (kill) then
return
end
button.MyObject.is_mouse_over = true
if (button.texture) then
if (button.texture.coords) then
button.texture:SetTexCoord (_unpack (button.texture.coords.Highlight))
else
button.texture:SetTexCoord (0, 1, 0.24609375, 0.49609375)
end
end
if (button.MyObject.onenter_backdrop_border_color) then
button:SetBackdropBorderColor (unpack (button.MyObject.onenter_backdrop_border_color))
end
if (button.MyObject.onenter_backdrop) then
button:SetBackdropColor (unpack (button.MyObject.onenter_backdrop))
end
if (button.MyObject.have_tooltip) then
GameCooltip2:Preset (2)
if (type (button.MyObject.have_tooltip) == "function") then
GameCooltip2:AddLine (button.MyObject.have_tooltip() or "")
else
GameCooltip2:AddLine (button.MyObject.have_tooltip)
end
GameCooltip2:ShowCooltip (button, "tooltip")
end
end
local OnLeave = function (button)
local capsule = button.MyObject
if (button.textureLeft and not button.MyObject.is_mouse_down) then
button.textureLeft:SetTexCoord (0, 4/128, 9/128, 24/128)
button.textureRight:SetTexCoord (124/128, 1, 9/128, 24/128)
button.textureTop:SetTexCoord (9/128, 120/128, 0, 4/128)
button.textureBottom:SetTexCoord (9/128, 119/128, 28/128, 32/128)
button.textureTopLeft:SetTexCoord (0, 8/128, 0, 8/128)
button.textureTopRight:SetTexCoord (121/128, 1, 0, 8/128)
button.textureBottomLeft:SetTexCoord (0, 8/128, 24/128, 32/128)
button.textureBottomRight:SetTexCoord (120/128, 1, 24/128, 32/128)
end
local kill = capsule:RunHooksForWidget ("OnLeave", button, capsule)
if (kill) then
return
end
button.MyObject.is_mouse_over = false
if (button.texture and not button.MyObject.is_mouse_down) then
if (button.texture.coords) then
button.texture:SetTexCoord (_unpack (button.texture.coords.Normal))
else
button.texture:SetTexCoord (0, 1, 0, 0.24609375)
end
end
if (button.MyObject.onleave_backdrop_border_color) then
button:SetBackdropBorderColor (unpack (button.MyObject.onleave_backdrop_border_color))
end
if (button.MyObject.onleave_backdrop) then
button:SetBackdropColor (unpack (button.MyObject.onleave_backdrop))
end
if (button.MyObject.have_tooltip) then
if (GameCooltip2:GetText (1) == button.MyObject.have_tooltip or type (button.MyObject.have_tooltip) == "function") then
GameCooltip2:Hide()
end
end
end
local OnHide = function (button)
local capsule = button.MyObject
local kill = capsule:RunHooksForWidget ("OnHide", button, capsule)
if (kill) then
return
end
end
local OnShow = function (button)
local capsule = button.MyObject
local kill = capsule:RunHooksForWidget ("OnShow", button, capsule)
if (kill) then
return
end
end
local OnMouseDown = function (button, buttontype)
local capsule = button.MyObject
if (not button:IsEnabled()) then
return
end
if (button.textureTopLeft) then
button.textureLeft:SetTexCoord (0, 4/128, 72/128, 88/128)
button.textureRight:SetTexCoord (124/128, 1, 72/128, 88/128)
button.textureTop:SetTexCoord (9/128, 120/128, 65/128, 68/128)
button.textureBottom:SetTexCoord (9/128, 119/128, 92/128, 96/128)
button.textureTopLeft:SetTexCoord (0, 8/128, 65/128, 71/128)
button.textureTopRight:SetTexCoord (121/128, 1, 65/128, 71/128)
button.textureBottomLeft:SetTexCoord (0, 8/128, 88/128, 96/128)
button.textureBottomRight:SetTexCoord (120/128, 1, 88/128, 96/128)
end
local kill = capsule:RunHooksForWidget ("OnMouseDown", button, capsule)
if (kill) then
return
end
button.MyObject.is_mouse_down = true
if (button.texture) then
if (button.texture.coords) then
button.texture:SetTexCoord (_unpack (button.texture.coords.Pushed))
else
button.texture:SetTexCoord (0, 1, 0.5078125, 0.75)
end
end
if (button.MyObject.capsule_textalign) then
if (button.MyObject.icon) then
button.MyObject.icon:SetPoint ("left", button, "left", 5 + (button.MyObject.icon.leftpadding or 0), -1)
elseif (button.MyObject.capsule_textalign == "left") then
button.text:SetPoint ("left", button, "left", 3, -1)
elseif (button.MyObject.capsule_textalign == "center") then
button.text:SetPoint ("center", button, "center", 1, -1)
elseif (button.MyObject.capsule_textalign == "right") then
button.text:SetPoint ("right", button, "right", -1, -1)
end
else
if (button.MyObject.icon) then
button.MyObject.icon:SetPoint ("left", button, "left", 7 + (button.MyObject.icon.leftpadding or 0), -2)
else
button.text:SetPoint ("center", button,"center", 1, -1)
end
end
button.mouse_down = GetTime()
local x, y = GetCursorPosition()
button.x = _math_floor (x)
button.y = _math_floor (y)
if (not button.MyObject.container.isLocked and button.MyObject.container:IsMovable()) then
if (not button.isLocked and button:IsMovable()) then
button.MyObject.container.isMoving = true
button.MyObject.container:StartMoving()
end
end
if (button.MyObject.options.OnGrab) then
if (_type (button.MyObject.options.OnGrab) == "string" and button.MyObject.options.OnGrab == "PassClick") then
if (buttontype == "LeftButton") then
button.MyObject.func (button.MyObject.param1, button.MyObject.param2)
else
button.MyObject.funcright (button.MyObject.param1, button.MyObject.param2)
end
end
end
end
local OnMouseUp = function (button, buttontype)
if (not button:IsEnabled()) then
return
end
if (button.textureLeft) then
if (button.MyObject.is_mouse_over) then
button.textureLeft:SetTexCoord (0, 4/128, 40/128, 56/128)
button.textureRight:SetTexCoord (124/128, 1, 40/128, 56/128)
button.textureTop:SetTexCoord (9/128, 120/128, 33/128, 37/128)
button.textureBottom:SetTexCoord (9/128, 119/128, 60/128, 64/128)
button.textureTopLeft:SetTexCoord (0, 8/128, 33/128, 40/128)
button.textureTopRight:SetTexCoord (121/128, 1, 33/128, 40/128)
button.textureBottomLeft:SetTexCoord (0, 8/128, 56/128, 64/128)
button.textureBottomRight:SetTexCoord (120/128, 1, 56/128, 64/128)
else
button.textureLeft:SetTexCoord (0, 4/128, 9/128, 24/128)
button.textureRight:SetTexCoord (124/128, 1, 9/128, 24/128)
button.textureTop:SetTexCoord (9/128, 120/128, 0, 4/128)
button.textureBottom:SetTexCoord (9/128, 119/128, 28/128, 32/128)
button.textureTopLeft:SetTexCoord (0, 8/128, 0, 8/128)
button.textureTopRight:SetTexCoord (121/128, 1, 0, 8/128)
button.textureBottomLeft:SetTexCoord (0, 8/128, 24/128, 32/128)
button.textureBottomRight:SetTexCoord (120/128, 1, 24/128, 32/128)
end
end
local capsule = button.MyObject
local kill = capsule:RunHooksForWidget ("OnMouseUp", button, capsule)
if (kill) then
return
end
button.MyObject.is_mouse_down = false
if (button.texture) then
if (button.texture.coords) then
if (button.MyObject.is_mouse_over) then
button.texture:SetTexCoord (_unpack (button.texture.coords.Highlight))
else
button.texture:SetTexCoord (_unpack (coords.Normal))
end
else
if (button.MyObject.is_mouse_over) then
button.texture:SetTexCoord (0, 1, 0.24609375, 0.49609375)
else
button.texture:SetTexCoord (0, 1, 0, 0.24609375)
end
end
end
if (button.MyObject.capsule_textalign) then
if (button.MyObject.icon) then
button.MyObject.icon:SetPoint ("left", button, "left", 4 + (button.MyObject.icon.leftpadding or 0), 0)
elseif (button.MyObject.capsule_textalign == "left") then
button.text:SetPoint ("left", button, "left", 2, 0)
elseif (button.MyObject.capsule_textalign == "center") then
button.text:SetPoint ("center", button, "center", 0, 0)
elseif (button.MyObject.capsule_textalign == "right") then
button.text:SetPoint ("right", button, "right", -2, 0)
end
else
if (button.MyObject.icon) then
button.MyObject.icon:SetPoint ("left", button, "left", 4 + (button.MyObject.icon.leftpadding or 0), 0)
else
button.text:SetPoint ("center", button,"center", 0, 0)
end
end
if (button.MyObject.container.isMoving) then
button.MyObject.container:StopMovingOrSizing()
button.MyObject.container.isMoving = false
end
local x, y = GetCursorPosition()
x = _math_floor (x)
y = _math_floor (y)
if (
(x == button.x and y == button.y) or
(button.mouse_down+0.5 > GetTime() and button:IsMouseOver())
) then
if (buttontype == "LeftButton") then
button.MyObject.func (button, buttontype, button.MyObject.param1, button.MyObject.param2)
else
button.MyObject.funcright (button, buttontype, button.MyObject.param1, button.MyObject.param2)
end
end
end
------------------------------------------------------------------------------------------------------------
function ButtonMetaFunctions:SetTemplate (template)
if (template.width) then
self:SetWidth (template.width)
end
if (template.height) then
self:SetHeight (template.height)
end
if (template.backdrop) then
self:SetBackdrop (template.backdrop)
end
if (template.backdropcolor) then
local r, g, b, a = DF:ParseColors (template.backdropcolor)
self:SetBackdropColor (r, g, b, a)
self.onleave_backdrop = {r, g, b, a}
end
if (template.backdropbordercolor) then
local r, g, b, a = DF:ParseColors (template.backdropbordercolor)
self:SetBackdropBorderColor (r, g, b, a)
self.onleave_backdrop_border_color = {r, g, b, a}
end
if (template.onentercolor) then
local r, g, b, a = DF:ParseColors (template.onentercolor)
self.onenter_backdrop = {r, g, b, a}
end
if (template.onleavecolor) then
local r, g, b, a = DF:ParseColors (template.onleavecolor)
self.onleave_backdrop = {r, g, b, a}
end
if (template.onenterbordercolor) then
local r, g, b, a = DF:ParseColors (template.onenterbordercolor)
self.onenter_backdrop_border_color = {r, g, b, a}
end
if (template.onleavebordercolor) then
local r, g, b, a = DF:ParseColors (template.onleavebordercolor)
self.onleave_backdrop_border_color = {r, g, b, a}
end
if (template.icon) then
local i = template.icon
self:SetIcon (i.texture, i.width, i.height, i.layout, i.texcoord, i.color, i.textdistance, i.leftpadding)
end
end
------------------------------------------------------------------------------------------------------------
--> object constructor
function DF:CreateButton (parent, func, w, h, text, param1, param2, texture, member, name, short_method, button_template, text_template)
return DF:NewButton (parent, parent, name, member, w, h, func, param1, param2, texture, text, short_method, button_template, text_template)
end
function DF:NewButton (parent, container, name, member, w, h, func, param1, param2, texture, text, short_method, button_template, text_template)
if (not name) then
name = "DetailsFrameworkButtonNumber" .. DF.ButtonCounter
DF.ButtonCounter = DF.ButtonCounter + 1
elseif (not parent) then
return error ("Details! FrameWork: parent not found.", 2)
end
if (not container) then
container = parent
end
if (name:find ("$parent")) then
local parentName = DF.GetParentName (parent)
name = name:gsub ("$parent", parentName)
end
local ButtonObject = {type = "button", dframework = true}
if (member) then
parent [member] = ButtonObject
end
if (parent.dframework) then
parent = parent.widget
end
if (container.dframework) then
container = container.widget
end
--> default members:
ButtonObject.is_locked = true
ButtonObject.container = container
ButtonObject.options = {OnGrab = false}
ButtonObject.button = CreateFrame ("button", name, parent, "DetailsFrameworkButtonTemplate")
ButtonObject.widget = ButtonObject.button
--ButtonObject.button:SetBackdrop ({bgFile = DF.folder .. "background", tileSize = 64, edgeFile = DF.folder .. "border_2", edgeSize = 10, insets = {left = 1, right = 1, top = 1, bottom = 1}})
ButtonObject.button:SetBackdropColor (0, 0, 0, 0.4)
ButtonObject.button:SetBackdropBorderColor (1, 1, 1, 1)
if (not APIButtonFunctions) then
APIButtonFunctions = true
local idx = getmetatable (ButtonObject.button).__index
for funcName, funcAddress in pairs (idx) do
if (not ButtonMetaFunctions [funcName]) then
ButtonMetaFunctions [funcName] = function (object, ...)
local x = loadstring ( "return _G['"..object.button:GetName().."']:"..funcName.."(...)")
return x (...)
end
end
end
end
ButtonObject.button:SetWidth (w or 100)
ButtonObject.button:SetHeight (h or 20)
ButtonObject.button.MyObject = ButtonObject
ButtonObject.text_overlay = _G [name .. "_Text"]
ButtonObject.disabled_overlay = _G [name .. "_TextureDisabled"]
ButtonObject.button:SetNormalTexture (texture)
ButtonObject.button:SetPushedTexture (texture)
ButtonObject.button:SetDisabledTexture (texture)
ButtonObject.button:SetHighlightTexture (texture, "ADD")
ButtonObject.button.text:SetText (text)
ButtonObject.button.text:SetPoint ("center", ButtonObject.button, "center")
local text_width = ButtonObject.button.text:GetStringWidth()
if (text_width > w-15 and ButtonObject.button.text:GetText() ~= "") then
if (short_method == false) then --> if is false, do not use auto resize
--do nothing
elseif (not short_method) then --> if the value is omitted, use the default resize
local new_width = text_width+15
ButtonObject.button:SetWidth (new_width)
elseif (short_method == 1) then
local loop = true
local textsize = 11
while (loop) do
if (text_width+15 < w or textsize < 8) then
loop = false
break
else
DF:SetFontSize (ButtonObject.button.text, textsize)
text_width = ButtonObject.button.text:GetStringWidth()
textsize = textsize - 1
end
end
elseif (short_method == 2) then
end
end
ButtonObject.func = func or cleanfunction
ButtonObject.funcright = cleanfunction
ButtonObject.param1 = param1
ButtonObject.param2 = param2
ButtonObject.short_method = short_method
if (text_template) then
if (text_template.size) then
DF:SetFontSize (ButtonObject.button.text, text_template.size)
end
if (text_template.color) then
local r, g, b, a = DF:ParseColors (text_template.color)
ButtonObject.button.text:SetTextColor (r, g, b, a)
end
if (text_template.font) then
local SharedMedia = LibStub:GetLibrary ("LibSharedMedia-3.0")
local font = SharedMedia:Fetch ("font", text_template.font)
DF:SetFontFace (ButtonObject.button.text, font)
end
end
--> hooks
ButtonObject.HookList = {
OnEnter = {},
OnLeave = {},
OnHide = {},
OnShow = {},
OnMouseDown = {},
OnMouseUp = {},
}
ButtonObject.button:SetScript ("OnEnter", OnEnter)
ButtonObject.button:SetScript ("OnLeave", OnLeave)
ButtonObject.button:SetScript ("OnHide", OnHide)
ButtonObject.button:SetScript ("OnShow", OnShow)
ButtonObject.button:SetScript ("OnMouseDown", OnMouseDown)
ButtonObject.button:SetScript ("OnMouseUp", OnMouseUp)
_setmetatable (ButtonObject, ButtonMetaFunctions)
if (button_template) then
ButtonObject:SetTemplate (button_template)
end
return ButtonObject
end
local pickcolor_callback = function (self, r, g, b, a, button)
a = abs (a-1)
button.MyObject.color_texture:SetVertexColor (r, g, b, a)
button.MyObject:color_callback (r, g, b, a)
end
local pickcolor = function (self, alpha, param2)
local r, g, b, a = self.MyObject.color_texture:GetVertexColor()
a = abs (a-1)
DF:ColorPick (self, r, g, b, a, pickcolor_callback)
end
local color_button_height = 16
local color_button_width = 16
local set_colorpick_color = function (button, r, g, b, a)
a = a or 1
button.color_texture:SetVertexColor (r, g, b, a)
end
local colorpick_cancel = function (self)
ColorPickerFrame:Hide()
end
function DF:CreateColorPickButton (parent, name, member, callback, alpha, button_template)
return DF:NewColorPickButton (parent, name, member, callback, alpha, button_template)
end
function DF:NewColorPickButton (parent, name, member, callback, alpha, button_template)
--button
local button = DF:NewButton (parent, _, name, member, color_button_width, color_button_height, pickcolor, alpha, "param2", nil, nil, nil, button_template)
button.color_callback = callback
button.Cancel = colorpick_cancel
button.SetColor = set_colorpick_color
if (not button_template) then
button:InstallCustomTexture()
button:SetBackdrop ({edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]], edgeSize = 6,
bgFile = [[Interface\DialogFrame\UI-DialogBox-Background]], insets = {left = 0, right = 0, top = 0, bottom = 0}})
end
--textura do fundo
local background = DF:NewImage (button, nil, color_button_width, color_button_height, nil, nil, nil, "$parentBck")
--background:SetTexture ([[Interface\AddOns\Details\images\icons]])
background:SetPoint ("topleft", button.widget, "topleft", 1, -2)
background:SetPoint ("bottomright", button.widget, "bottomright", -1, 1)
background:SetTexCoord (0.337890625, 0.390625, 0.625, 0.658203125)
background:SetDrawLayer ("background", 1)
--textura da cor
local img = DF:NewImage (button, nil, color_button_width, color_button_height, nil, nil, "color_texture", "$parentTex")
img:SetColorTexture (1, 1, 1)
img:SetPoint ("topleft", button.widget, "topleft", 1, -2)
img:SetPoint ("bottomright", button.widget, "bottomright", -1, 1)
img:SetDrawLayer ("background", 2)
return button
end