218 lines
6.2 KiB
Lua
218 lines
6.2 KiB
Lua
-- ------------------------------------------------------------------------------ --
|
|
-- TradeSkillMaster --
|
|
-- https://tradeskillmaster.com --
|
|
-- All Rights Reserved - Detailed license information included with addon. --
|
|
-- ------------------------------------------------------------------------------ --
|
|
|
|
--- Text UI Element Class.
|
|
-- A text element simply holds a text string. It is a subclass of the @{Element} class.
|
|
-- @classmod Text
|
|
|
|
local _, TSM = ...
|
|
local Text = TSM.Include("LibTSMClass").DefineClass("Text", TSM.UI.Element)
|
|
local Color = TSM.Include("Util.Color")
|
|
local Theme = TSM.Include("Util.Theme")
|
|
local UIElements = TSM.Include("UI.UIElements")
|
|
UIElements.Register(Text)
|
|
TSM.UI.Text = Text
|
|
local STRING_RIGHT_PADDING = 4
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Public Class Methods
|
|
-- ============================================================================
|
|
|
|
function Text.__init(self, frame)
|
|
frame = frame or UIElements.CreateFrame(self, "Frame")
|
|
self.__super:__init(frame)
|
|
frame.text = UIElements.CreateFontString(self, frame)
|
|
|
|
self._textStr = ""
|
|
self._autoWidth = false
|
|
self._textColor = "TEXT"
|
|
self._font = nil
|
|
self._justifyH = "LEFT"
|
|
self._justifyV = "MIDDLE"
|
|
end
|
|
|
|
function Text.Release(self)
|
|
self._textStr = ""
|
|
self._autoWidth = false
|
|
self._textColor = "TEXT"
|
|
self._font = nil
|
|
self._justifyH = "LEFT"
|
|
self._justifyV = "MIDDLE"
|
|
self:_GetBaseFrame().text:SetSpacing(0)
|
|
self.__super:Release()
|
|
end
|
|
|
|
--- Sets the width of the text.
|
|
-- @tparam Text self The text object
|
|
-- @tparam ?number|string width The width of the text, "AUTO" to set the width based on the length
|
|
-- of the text, or nil to have an undefined width
|
|
-- @treturn Text The text object
|
|
function Text.SetWidth(self, width)
|
|
if width == "AUTO" then
|
|
self._autoWidth = true
|
|
else
|
|
self._autoWidth = false
|
|
self.__super:SetWidth(width)
|
|
end
|
|
return self
|
|
end
|
|
|
|
--- Sets the font.
|
|
-- @tparam Text self The text object
|
|
-- @tparam string font The font key
|
|
-- @treturn Text The text object
|
|
function Text.SetFont(self, font)
|
|
assert(Theme.GetFont(font))
|
|
self._font = font
|
|
return self
|
|
end
|
|
|
|
--- Sets the color of the text.
|
|
-- @tparam Text self The text object
|
|
-- @tparam Color|string color The text color as a Color object or a theme color key
|
|
-- @treturn Text The text object
|
|
function Text.SetTextColor(self, color)
|
|
assert((type(color) == "string" and Theme.GetColor(color)) or Color.IsInstance(color))
|
|
self._textColor = color
|
|
return self
|
|
end
|
|
|
|
--- Sets the horizontal justification of the text.
|
|
-- @tparam Text self The text object
|
|
-- @tparam string justifyH The horizontal justification (either "LEFT", "CENTER" or "RIGHT")
|
|
-- @treturn Text The text object
|
|
function Text.SetJustifyH(self, justifyH)
|
|
assert(justifyH == "LEFT" or justifyH == "CENTER" or justifyH == "RIGHT")
|
|
self._justifyH = justifyH
|
|
return self
|
|
end
|
|
|
|
--- Sets the vertical justification of the text.
|
|
-- @tparam Text self The text object
|
|
-- @tparam string justifyV The vertical justification (either "TOP", "MIDDLE" or "BOTTOM")
|
|
-- @treturn Text The text object
|
|
function Text.SetJustifyV(self, justifyV)
|
|
assert(justifyV == "TOP" or justifyV == "MIDDLE" or justifyV == "BOTTOM")
|
|
self._justifyV = justifyV
|
|
return self
|
|
end
|
|
|
|
--- Set the text.
|
|
-- @tparam Text self The text object
|
|
-- @tparam ?string|number text The text
|
|
-- @treturn Text The text object
|
|
function Text.SetText(self, text)
|
|
if type(text) == "number" then
|
|
text = tostring(text)
|
|
end
|
|
assert(type(text) == "string")
|
|
self._textStr = text
|
|
return self
|
|
end
|
|
|
|
--- Set formatted text.
|
|
-- @tparam Text self The text object
|
|
-- @tparam vararg ... The format string and parameters
|
|
-- @treturn Text The text object
|
|
function Text.SetFormattedText(self, ...)
|
|
self:SetText(format(...))
|
|
return self
|
|
end
|
|
|
|
--- Gets the text string.
|
|
-- @tparam Text self The text object
|
|
-- @treturn string The text string
|
|
function Text.GetText(self)
|
|
return self._textStr
|
|
end
|
|
|
|
--- Get the rendered text string width.
|
|
-- @tparam Text self The text object
|
|
-- @treturn number The rendered text string width
|
|
function Text.GetStringWidth(self)
|
|
local text = self:_GetBaseFrame().text
|
|
self:_ApplyFont()
|
|
text:SetText(self._textStr)
|
|
return text:GetStringWidth()
|
|
end
|
|
|
|
--- Get the rendered text string height.
|
|
-- @tparam Text self The text object
|
|
-- @treturn number The rendered text string height
|
|
function Text.GetStringHeight(self)
|
|
local text = self:_GetBaseFrame().text
|
|
self:_ApplyFont()
|
|
text:SetText(self._textStr)
|
|
return text:GetStringHeight()
|
|
end
|
|
|
|
function Text.Draw(self)
|
|
self.__super:Draw()
|
|
|
|
local text = self:_GetBaseFrame().text
|
|
text:ClearAllPoints()
|
|
text:SetAllPoints()
|
|
|
|
-- set the font
|
|
self:_ApplyFont()
|
|
|
|
-- set the justification
|
|
text:SetJustifyH(self._justifyH)
|
|
text:SetJustifyV(self._justifyV)
|
|
|
|
-- set the text color
|
|
text:SetTextColor(self:_GetTextColor():GetFractionalRGBA())
|
|
|
|
-- set the text
|
|
text:SetText(self._textStr)
|
|
end
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Private Class Methods
|
|
-- ============================================================================
|
|
|
|
function Text._GetTextColor(self)
|
|
if type(self._textColor) == "string" then
|
|
return Theme.GetColor(self._textColor)
|
|
else
|
|
assert(Color.IsInstance(self._textColor))
|
|
return self._textColor
|
|
end
|
|
end
|
|
|
|
function Text._GetMinimumDimension(self, dimension)
|
|
if dimension == "WIDTH" and self._autoWidth then
|
|
return 0, self._width == nil
|
|
else
|
|
return self.__super:_GetMinimumDimension(dimension)
|
|
end
|
|
end
|
|
|
|
function Text._GetPreferredDimension(self, dimension)
|
|
if dimension == "WIDTH" and self._autoWidth then
|
|
return self:GetStringWidth() + STRING_RIGHT_PADDING
|
|
else
|
|
return self.__super:_GetPreferredDimension(dimension)
|
|
end
|
|
end
|
|
|
|
function Text._ApplyFont(self)
|
|
local text = self:_GetBaseFrame().text
|
|
local font = Theme.GetFont(self._font)
|
|
text:SetFont(font:GetWowFont())
|
|
-- There's a Blizzard bug where spacing incorrectly gets applied to embedded textures, so just set it to 0 in that case
|
|
-- TODO: come up with a better fix if we need multi-line text with embedded textures
|
|
if strfind(self._textStr, "\124T") then
|
|
text:SetSpacing(0)
|
|
else
|
|
text:SetSpacing(font:GetSpacing())
|
|
end
|
|
end
|