ee0b350aba
- Dungeon followers now correctly show into the damage done section. - Fixed an error while statusbar plugin options. - Framework update. - Mythic Dungeon Plus code has been separated into six files (was just 2), this will help with the organization and maintenance of the code.
388 lines
12 KiB
Lua
388 lines
12 KiB
Lua
|
|
local detailsFramework = _G["DetailsFramework"]
|
|
if (not detailsFramework or not DetailsFrameworkCanLoad) then
|
|
return
|
|
end
|
|
|
|
local _
|
|
local APIImageFunctions = false
|
|
|
|
do
|
|
local metaPrototype = {
|
|
WidgetType = "image",
|
|
dversion = detailsFramework.dversion,
|
|
}
|
|
|
|
--check if there's a metaPrototype already existing
|
|
if (_G[detailsFramework.GlobalWidgetControlNames["image"]]) then
|
|
--get the already existing metaPrototype
|
|
local oldMetaPrototype = _G[detailsFramework.GlobalWidgetControlNames["image"]]
|
|
--check if is older
|
|
if ( (not oldMetaPrototype.dversion) or (oldMetaPrototype.dversion < detailsFramework.dversion) ) then
|
|
--the version is older them the currently loading one
|
|
--copy the new values into the old metatable
|
|
for funcName, _ in pairs(metaPrototype) do
|
|
oldMetaPrototype[funcName] = metaPrototype[funcName]
|
|
end
|
|
end
|
|
else
|
|
--first time loading the framework
|
|
_G[detailsFramework.GlobalWidgetControlNames["image"]] = metaPrototype
|
|
end
|
|
end
|
|
|
|
local ImageMetaFunctions = _G[detailsFramework.GlobalWidgetControlNames["image"]]
|
|
|
|
detailsFramework:Mixin(ImageMetaFunctions, detailsFramework.SetPointMixin)
|
|
detailsFramework:Mixin(ImageMetaFunctions, detailsFramework.ScriptHookMixin)
|
|
|
|
------------------------------------------------------------------------------------------------------------
|
|
--metatables
|
|
|
|
ImageMetaFunctions.__call = function(object, value)
|
|
return object.image:SetTexture(value)
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------------
|
|
--members
|
|
|
|
--frame width
|
|
local gmember_width = function(object)
|
|
return object.image:GetWidth()
|
|
end
|
|
|
|
--frame height
|
|
local gmember_height = function(object)
|
|
return object.image:GetHeight()
|
|
end
|
|
|
|
--texture
|
|
local gmember_texture = function(object)
|
|
return object.image:GetTexture()
|
|
end
|
|
|
|
--alpha
|
|
local gmember_alpha = function(object)
|
|
return object.image:GetAlpha()
|
|
end
|
|
|
|
--saturation
|
|
local gmember_saturation = function(object)
|
|
return object.image:GetDesaturated()
|
|
end
|
|
|
|
--atlas
|
|
local gmember_atlas = function(object)
|
|
return object.image:GetAtlas()
|
|
end
|
|
|
|
--texcoords
|
|
local gmember_texcoord = function(object)
|
|
return object.image:GetTexCoord()
|
|
end
|
|
|
|
ImageMetaFunctions.GetMembers = ImageMetaFunctions.GetMembers or {}
|
|
detailsFramework:Mixin(ImageMetaFunctions.GetMembers, detailsFramework.DefaultMetaFunctionsGet)
|
|
detailsFramework:Mixin(ImageMetaFunctions.GetMembers, detailsFramework.LayeredRegionMetaFunctionsGet)
|
|
|
|
ImageMetaFunctions.GetMembers["alpha"] = gmember_alpha
|
|
ImageMetaFunctions.GetMembers["width"] = gmember_width
|
|
ImageMetaFunctions.GetMembers["height"] = gmember_height
|
|
ImageMetaFunctions.GetMembers["texture"] = gmember_texture
|
|
ImageMetaFunctions.GetMembers["blackwhite"] = gmember_saturation
|
|
ImageMetaFunctions.GetMembers["desaturated"] = gmember_saturation
|
|
ImageMetaFunctions.GetMembers["atlas"] = gmember_atlas
|
|
ImageMetaFunctions.GetMembers["texcoord"] = gmember_texcoord
|
|
|
|
ImageMetaFunctions.__index = function(object, key)
|
|
local func = ImageMetaFunctions.GetMembers[key]
|
|
if (func) then
|
|
return func(object, key)
|
|
end
|
|
|
|
local fromMe = rawget(object, key)
|
|
if (fromMe) then
|
|
return fromMe
|
|
end
|
|
|
|
return ImageMetaFunctions[key]
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
--texture
|
|
local smember_texture = function(object, value)
|
|
if (type(value) == "table") then
|
|
local red, green, blue, alpha = detailsFramework:ParseColors(value)
|
|
object.image:SetTexture(red, green, blue, alpha)
|
|
else
|
|
if (detailsFramework:IsHtmlColor(value)) then
|
|
local red, green, blue, alpha = detailsFramework:ParseColors(value)
|
|
object.image:SetTexture(red, green, blue, alpha)
|
|
else
|
|
object.image:SetTexture(value)
|
|
end
|
|
end
|
|
end
|
|
|
|
--width
|
|
local smember_width = function(object, value)
|
|
return object.image:SetWidth(value)
|
|
end
|
|
|
|
--height
|
|
local smember_height = function(object, value)
|
|
return object.image:SetHeight(value)
|
|
end
|
|
|
|
--alpha
|
|
local smember_alpha = function(object, value)
|
|
return object.image:SetAlpha(value)
|
|
end
|
|
|
|
--color
|
|
local smember_color = function(object, value)
|
|
local red, green, blue, alpha = detailsFramework:ParseColors(value)
|
|
object.image:SetColorTexture(red, green, blue, alpha)
|
|
end
|
|
|
|
--vertex color
|
|
local smember_vertexcolor = function(object, value)
|
|
local red, green, blue, alpha = detailsFramework:ParseColors(value)
|
|
object.image:SetVertexColor(red, green, blue, alpha)
|
|
end
|
|
|
|
--desaturated
|
|
local smember_desaturated = function(object, value)
|
|
if (value) then
|
|
object:SetDesaturated(true)
|
|
else
|
|
object:SetDesaturated(false)
|
|
end
|
|
end
|
|
|
|
--texcoords
|
|
local smember_texcoord = function(object, value)
|
|
if (value) then
|
|
object:SetTexCoord(unpack(value))
|
|
else
|
|
object:SetTexCoord(0, 1, 0, 1)
|
|
end
|
|
end
|
|
|
|
--atlas
|
|
local smember_atlas = function(object, value)
|
|
if (value) then
|
|
object:SetAtlas(value)
|
|
end
|
|
end
|
|
|
|
--gradient
|
|
local smember_gradient = function(object, value)
|
|
if (type(value) == "table" and value.gradient and value.fromColor and value.toColor) then
|
|
object.image:SetColorTexture(1, 1, 1, 1)
|
|
local fromColor = detailsFramework:FormatColor("tablemembers", value.fromColor)
|
|
local toColor = detailsFramework:FormatColor("tablemembers", value.toColor)
|
|
object.image:SetGradient(value.gradient, fromColor, toColor)
|
|
else
|
|
error("texture.gradient expect a table{gradient = 'gradient type', fromColor = 'color', toColor = 'color'}")
|
|
end
|
|
end
|
|
|
|
ImageMetaFunctions.SetMembers = ImageMetaFunctions.SetMembers or {}
|
|
detailsFramework:Mixin(ImageMetaFunctions.SetMembers, detailsFramework.DefaultMetaFunctionsSet)
|
|
detailsFramework:Mixin(ImageMetaFunctions.SetMembers, detailsFramework.LayeredRegionMetaFunctionsSet)
|
|
|
|
ImageMetaFunctions.SetMembers["alpha"] = smember_alpha
|
|
ImageMetaFunctions.SetMembers["width"] = smember_width
|
|
ImageMetaFunctions.SetMembers["height"] = smember_height
|
|
ImageMetaFunctions.SetMembers["texture"] = smember_texture
|
|
ImageMetaFunctions.SetMembers["texcoord"] = smember_texcoord
|
|
ImageMetaFunctions.SetMembers["color"] = smember_color
|
|
ImageMetaFunctions.SetMembers["vertexcolor"] = smember_vertexcolor
|
|
ImageMetaFunctions.SetMembers["blackwhite"] = smember_desaturated
|
|
ImageMetaFunctions.SetMembers["desaturated"] = smember_desaturated
|
|
ImageMetaFunctions.SetMembers["atlas"] = smember_atlas
|
|
ImageMetaFunctions.SetMembers["gradient"] = smember_gradient
|
|
|
|
ImageMetaFunctions.__newindex = function(object, key, value)
|
|
local func = ImageMetaFunctions.SetMembers[key]
|
|
if (func) then
|
|
return func(object, value)
|
|
else
|
|
return rawset(object, key, value)
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------------
|
|
--methods
|
|
--size
|
|
function ImageMetaFunctions:SetSize(width, height)
|
|
if (width) then
|
|
self.image:SetWidth(width)
|
|
end
|
|
if (height) then
|
|
return self.image:SetHeight(height)
|
|
end
|
|
end
|
|
|
|
function ImageMetaFunctions:SetGradient(gradientType, fromColor, toColor)
|
|
fromColor = detailsFramework:FormatColor("tablemembers", fromColor)
|
|
toColor = detailsFramework:FormatColor("tablemembers", toColor)
|
|
self.image:SetGradient(gradientType, fromColor, toColor)
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------------
|
|
--object constructor
|
|
|
|
---@class df_image : texture
|
|
---@field SetGradient fun(gradientType: "vertical"|"horizontal", fromColor: table, toColor: table)
|
|
|
|
---create an object that encapsulates a texture and add additional methods to it
|
|
---@param parent frame
|
|
---@param texture texturepath|textureid
|
|
---@param width number
|
|
---@param height number
|
|
---@param layer drawlayer
|
|
---@param coords {key1: number, key2: number, key3: number, key4: number}
|
|
---@param member string
|
|
---@param name string
|
|
---@return table|nil
|
|
function detailsFramework:CreateTexture(parent, texture, width, height, layer, coords, member, name)
|
|
return detailsFramework:NewImage(parent, texture, width, height, layer, coords, member, name)
|
|
end
|
|
|
|
---create an object that encapsulates a texture and add additional methods to it
|
|
---@param parent frame
|
|
---@param texture texturepath|textureid
|
|
---@param width number
|
|
---@param height number
|
|
---@param layer drawlayer
|
|
---@param coords {key1: number, key2: number, key3: number, key4: number}
|
|
---@param member string
|
|
---@param name string
|
|
---@return table|nil
|
|
function detailsFramework:CreateImage(parent, texture, width, height, layer, coords, member, name)
|
|
return detailsFramework:NewImage(parent, texture, width, height, layer, coords, member, name)
|
|
end
|
|
|
|
function detailsFramework:NewImage(parent, texture, width, height, layer, texCoord, member, name)
|
|
if (not parent) then
|
|
return error("DetailsFrameWork: NewImage() parent not found.", 2)
|
|
end
|
|
|
|
if (not name) then
|
|
name = "DetailsFrameworkPictureNumber" .. detailsFramework.PictureNameCounter
|
|
detailsFramework.PictureNameCounter = detailsFramework.PictureNameCounter + 1
|
|
end
|
|
|
|
if (name:find("$parent")) then
|
|
local parentName = detailsFramework.GetParentName(parent)
|
|
name = name:gsub("$parent", parentName)
|
|
end
|
|
|
|
local ImageObject = {type = "image", dframework = true}
|
|
|
|
if (member) then
|
|
parent[member] = ImageObject
|
|
end
|
|
|
|
if (parent.dframework) then
|
|
parent = parent.widget
|
|
end
|
|
|
|
texture = texture or ""
|
|
|
|
ImageObject.image = parent:CreateTexture(name, layer or "overlay")
|
|
ImageObject.widget = ImageObject.image
|
|
|
|
detailsFramework:Mixin(ImageObject.image, detailsFramework.WidgetFunctions)
|
|
|
|
if (not APIImageFunctions) then
|
|
APIImageFunctions = true
|
|
local idx = getmetatable(ImageObject.image).__index
|
|
for funcName, funcAddress in pairs(idx) do
|
|
if (not ImageMetaFunctions[funcName]) then
|
|
ImageMetaFunctions[funcName] = function(object, ...)
|
|
local x = loadstring( "return _G['" .. object.image:GetName() .. "']:" .. funcName .. "(...)")
|
|
return x(...)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
ImageObject.image.MyObject = ImageObject
|
|
|
|
if (width) then
|
|
ImageObject.image:SetWidth(width)
|
|
end
|
|
if (height) then
|
|
ImageObject.image:SetHeight(height)
|
|
end
|
|
|
|
if (texture) then
|
|
if (type(texture) == "table") then
|
|
if (texture.gradient) then
|
|
if (detailsFramework.IsDragonflight() or detailsFramework.IsNonRetailWowWithRetailAPI()) then
|
|
ImageObject.image:SetColorTexture(1, 1, 1, 1)
|
|
local fromColor = detailsFramework:FormatColor("tablemembers", texture.fromColor)
|
|
local toColor = detailsFramework:FormatColor("tablemembers", texture.toColor)
|
|
ImageObject.image:SetGradient(texture.gradient, fromColor, toColor)
|
|
else
|
|
local fromR, fromG, fromB, fromA = detailsFramework:ParseColors(texture.fromColor)
|
|
local toR, toG, toB, toA = detailsFramework:ParseColors(texture.toColor)
|
|
ImageObject.image:SetColorTexture(1, 1, 1, 1)
|
|
ImageObject.image:SetGradientAlpha(texture.gradient, fromR, fromG, fromB, fromA, toR, toG, toB, toA)
|
|
end
|
|
else
|
|
local r, g, b, a = detailsFramework:ParseColors(texture)
|
|
ImageObject.image:SetColorTexture(r, g, b, a)
|
|
end
|
|
|
|
elseif (type(texture) == "string") then
|
|
local isAtlas = C_Texture.GetAtlasInfo(texture)
|
|
if (isAtlas) then
|
|
ImageObject.image:SetAtlas(texture)
|
|
else
|
|
if (detailsFramework:IsHtmlColor(texture)) then
|
|
local r, g, b = detailsFramework:ParseColors(texture)
|
|
ImageObject.image:SetColorTexture(r, g, b)
|
|
else
|
|
ImageObject.image:SetTexture(texture)
|
|
end
|
|
end
|
|
else
|
|
ImageObject.image:SetTexture(texture)
|
|
end
|
|
end
|
|
|
|
if (texCoord and type(texCoord) == "table" and texCoord[4]) then
|
|
ImageObject.image:SetTexCoord(unpack(texCoord))
|
|
end
|
|
|
|
ImageObject.HookList = {
|
|
}
|
|
|
|
setmetatable(ImageObject, ImageMetaFunctions)
|
|
|
|
return ImageObject
|
|
end
|
|
|
|
function detailsFramework:CreateHighlightTexture(parent, parentKey, alpha, name)
|
|
if (not name) then
|
|
name = "DetailsFrameworkPictureNumber" .. detailsFramework.PictureNameCounter
|
|
detailsFramework.PictureNameCounter = detailsFramework.PictureNameCounter + 1
|
|
end
|
|
|
|
local highlightTexture = parent:CreateTexture(name, "highlight")
|
|
highlightTexture:SetTexture([[Interface\Buttons\WHITE8X8]])
|
|
highlightTexture:SetAlpha(alpha or 0.1)
|
|
highlightTexture:SetBlendMode("ADD")
|
|
highlightTexture:SetAllPoints()
|
|
|
|
if (parentKey) then
|
|
parent[parentKey] = highlightTexture
|
|
end
|
|
|
|
return highlightTexture
|
|
end |