You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
5.9 KiB
219 lines
5.9 KiB
-- ------------------------------------------------------------------------------ --
|
|
-- TradeSkillMaster --
|
|
-- https://tradeskillmaster.com --
|
|
-- All Rights Reserved - Detailed license information included with addon. --
|
|
-- ------------------------------------------------------------------------------ --
|
|
|
|
local TSM = select(2, ...) ---@type TSM
|
|
local WidgetExtensions = TSM.Init("UI.WidgetExtensions")
|
|
local Theme = TSM.Include("Util.Theme")
|
|
local TextureAtlas = TSM.Include("Util.TextureAtlas")
|
|
local ScriptWrapper = TSM.Include("Util.ScriptWrapper")
|
|
local private = {
|
|
extensions = nil,
|
|
cancellables = {},
|
|
}
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Default Extensions
|
|
-- ============================================================================
|
|
|
|
private.extensions = {
|
|
_base = {
|
|
TSMSetShown = function(obj, shown)
|
|
if shown then
|
|
obj:Show()
|
|
else
|
|
obj:Hide()
|
|
end
|
|
end,
|
|
TSMSetSize = function(obj, width, height)
|
|
obj:SetWidth(width)
|
|
obj:SetHeight(height)
|
|
end,
|
|
TSMSetPoints = function(obj, points)
|
|
obj:ClearAllPoints()
|
|
for _, point in ipairs(points) do
|
|
obj:SetPoint(unpack(point))
|
|
end
|
|
end,
|
|
TSMSetScript = function(obj, script, handler, ...)
|
|
if type(handler) == "function" then
|
|
ScriptWrapper.Set(obj, script, handler, ...)
|
|
elseif handler == nil then
|
|
ScriptWrapper.Clear(obj, script)
|
|
end
|
|
end,
|
|
TSMSetOnUpdate = function(obj, handler, ...)
|
|
obj:TSMSetScript("OnUpdate", handler, ...)
|
|
end,
|
|
TSMCancelAll = function(obj)
|
|
if not private.cancellables[obj] then
|
|
return
|
|
end
|
|
for _, cancellable in pairs(private.cancellables[obj]) do
|
|
cancellable:Cancel()
|
|
end
|
|
wipe(private.cancellables[obj])
|
|
end,
|
|
_TSMSetOrUpdateCancellable = function(obj, key, publisher)
|
|
private.cancellables[obj] = private.cancellables[obj] or {}
|
|
if private.cancellables[obj][key] then
|
|
private.cancellables[obj][key]:Cancel()
|
|
end
|
|
private.cancellables[obj][key] = publisher
|
|
publisher:Stored()
|
|
end
|
|
},
|
|
Frame = {
|
|
_TSMSetBackdropColor = function(frame, color)
|
|
frame:SetBackdropColor(color:GetFractionalRGBA())
|
|
end,
|
|
TSMSubscribeBackdropColor = function(texture, color)
|
|
texture:_TSMSetOrUpdateCancellable("backdropColor", Theme.GetPublisher(color)
|
|
:CallMethod(texture, "_TSMSetBackdropColor")
|
|
)
|
|
end,
|
|
},
|
|
Button = {
|
|
TSMSetEnabled = function(button, enabled)
|
|
if enabled then
|
|
button:Enable()
|
|
else
|
|
button:Disable()
|
|
end
|
|
end,
|
|
TSMSetHighlightLocked = function(button, locked)
|
|
if locked then
|
|
button:LockHighlight()
|
|
else
|
|
button:UnlockHighlight()
|
|
end
|
|
end,
|
|
},
|
|
Texture = {
|
|
_TSMSetColorTexture = function(texture, color)
|
|
texture:SetColorTexture(color:GetFractionalRGBA())
|
|
end,
|
|
TSMSubscribeColorTexture = function(texture, color)
|
|
texture:_TSMSetOrUpdateCancellable("colorTexture", Theme.GetPublisher(color)
|
|
:CallMethod(texture, "_TSMSetColorTexture")
|
|
)
|
|
end,
|
|
_TSMSetVertexColor = function(texture, color)
|
|
texture:SetVertexColor(color:GetFractionalRGBA())
|
|
end,
|
|
TSMSubscribeVertexColor = function(texture, color)
|
|
texture:_TSMSetOrUpdateCancellable("vertexColor", Theme.GetPublisher(color)
|
|
:CallMethod(texture, "_TSMSetVertexColor")
|
|
)
|
|
end,
|
|
TSMSetTextureAndSize = function(texture, atlasKey)
|
|
TextureAtlas.SetTextureAndSize(texture, atlasKey)
|
|
end,
|
|
TSMSetTextureAndCoord = function(texture, value)
|
|
if type(value) == "string" and TextureAtlas.IsValid(value) then
|
|
TextureAtlas.SetTexture(texture, value)
|
|
else
|
|
texture:SetTexture(value)
|
|
texture:SetTexCoord(0, 0, 0, 1, 1, 0, 1, 1)
|
|
end
|
|
end,
|
|
TSMSetSize = function(texture, widthOrAtlasKey, height)
|
|
if type(widthOrAtlasKey) == "string" then
|
|
assert(height == nil)
|
|
TextureAtlas.SetSize(texture, widthOrAtlasKey)
|
|
else
|
|
texture:SetWidth(widthOrAtlasKey)
|
|
texture:SetHeight(height)
|
|
end
|
|
end,
|
|
},
|
|
FontString = {
|
|
_TSMSetTextColor = function(text, color)
|
|
text:SetTextColor(color:GetFractionalRGBA())
|
|
end,
|
|
TSMSubscribeTextColor = function(text, color)
|
|
text:_TSMSetOrUpdateCancellable("textColor", Theme.GetPublisher(color)
|
|
:CallMethod(text, "_TSMSetTextColor")
|
|
)
|
|
end,
|
|
TSMSetFont = function(text, font)
|
|
if type(font) == "string" then
|
|
font = Theme.GetFont(font)
|
|
end
|
|
text:SetFont(font:GetWowFont())
|
|
end,
|
|
},
|
|
AnimationGroup = {
|
|
TSMSetPlaying = function(ag, playing)
|
|
if playing then
|
|
ag:Play()
|
|
else
|
|
ag:Stop()
|
|
end
|
|
end,
|
|
},
|
|
EditBox = {
|
|
TSMSetEnabled = function(editbox, enabled)
|
|
if enabled then
|
|
editbox:Enable()
|
|
else
|
|
editbox:Disable()
|
|
end
|
|
end,
|
|
_TSMSetTextColor = function(editbox, color)
|
|
editbox:SetTextColor(color:GetFractionalRGBA())
|
|
end,
|
|
TSMSubscribeTextColor = function(texture, color)
|
|
texture:_TSMSetOrUpdateCancellable("textColor", Theme.GetPublisher(color)
|
|
:CallMethod(texture, "_TSMSetTextColor")
|
|
)
|
|
end,
|
|
TSMSetFont = function(editbox, font)
|
|
if type(font) == "string" then
|
|
font = Theme.GetFont(font)
|
|
end
|
|
editbox:SetFont(font:GetWowFont())
|
|
end,
|
|
TSMSetFocused = function(editbox, focused)
|
|
if focused then
|
|
editbox:SetFocus()
|
|
else
|
|
editbox:ClearFocus()
|
|
end
|
|
end,
|
|
TSMSetAllHighlighted = function(editbox, highlighted)
|
|
if highlighted then
|
|
editbox:HighlightText(0, -1)
|
|
else
|
|
editbox:HighlightText(0, 0)
|
|
end
|
|
end,
|
|
},
|
|
}
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Module Functions
|
|
-- ============================================================================
|
|
|
|
---Adds all registered extensions to an object.
|
|
---@param obj table The widget object
|
|
function WidgetExtensions.AddToObject(obj)
|
|
local extensions = private.extensions[obj:GetObjectType()]
|
|
if extensions then
|
|
for name, func in pairs(extensions) do
|
|
assert(not obj[name])
|
|
obj[name] = func
|
|
end
|
|
end
|
|
for name, func in pairs(private.extensions._base) do
|
|
if not obj[name] then
|
|
obj[name] = func
|
|
end
|
|
end
|
|
end
|
|
|