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.

3054 lines
118 KiB

--========================================================--
-- Scorpio UI Widget Properties --
-- --
-- Author : kurapica125@outlook.com --
-- Create Date : 2019/01/09 --
--========================================================--
--========================================================--
Scorpio "Scorpio.UI.Property" "1.0.0"
--========================================================--
------------------------------------------------------------
-- Helper --
------------------------------------------------------------
do
local defaultFadeoutOption = FadeoutOption{ duration = 1 }
function fadeIn(self)
local fade = self[fadeOut]
self:SetAlpha(fade and fade.start or 1)
end
__Async__() function fadeOut(self)
local fade = self[fadeOut] or defaultFadeoutOption
local target = GetTime()
local duration = fade.duration or 1
local stop = fade.stop or 0
local start = fade.start or 1
-- Check the delay
if fade.delay and fade.delay > 0 then
target = target + fade.delay
while GetTime() < target and not self:IsMouseOver() do
Next()
end
end
local current = target
target = target + duration
while current < target and not self:IsMouseOver() do
self:SetAlpha(stop + (start - stop) * (target - current) / duration)
Next()
current = GetTime()
end
if self:IsMouseOver() then
self:SetAlpha(start)
elseif current >= target and fade.autohide then
if pcall(self.Hide, self) then
self:SetAlpha(start)
end
end
end
__Async__() function animateTexCoords(self, settings)
self.__AnimateTexCoords = ((self.__AnimateTexCoords or 0) + 1) % 10000
if settings then
-- initialize everything
local task = self.__AnimateTexCoords
local frame = 1
local throttle = settings.throttle
local total = throttle
local numColumns = floor(settings.textureWidth/settings.frameWidth)
local numRows = floor(settings.textureHeight/settings.frameHeight)
local columnWidth = settings.frameWidth/settings.textureWidth
local rowHeight = settings.frameHeight/settings.textureHeight
local numFrames = settings.numFrames
local prev = GetTime()
while self.__AnimateTexCoords == task do
if total > throttle then
local adv = floor(total / throttle)
while ( frame + adv > numFrames ) do
frame = frame - numFrames
end
frame = frame + adv
total = 0
local left = mod(frame-1, numColumns)*columnWidth
local right = left + columnWidth
local bottom= ceil(frame/numColumns)*rowHeight
local top = bottom - rowHeight
self:SetTexCoord(left, right, top, bottom)
end
Next()
local now = GetTime()
total = total + now - prev
prev = now
end
end
end
end
------------------------------------------------------------
-- LayoutFrame --
------------------------------------------------------------
do
--- the frame's transparency value(0-1)
UI.Property {
name = "Alpha",
type = ColorFloat,
require = { LayoutFrame, Line },
default = 1,
get = function(self) return self:GetAlpha() end,
set = function(self, alpha) self:SetAlpha(alpha) end,
}
--- the frame's fadeout settings
UI.Property {
name = "Fadeout",
type = FadeoutOption + Boolean,
require = { LayoutFrame, Line },
default = false,
set = function(self, fade)
self = UI.GetWrapperUI(self)
if fade then
if fade ~= true then self[fadeOut] = fade else fade = nil end
self:SetAlpha(fade and fade.start or 1)
self.OnLeave = self.OnLeave + fadeOut
self.OnEnter = self.OnEnter + fadeIn
else
fade = self[fadeOut]
self:SetAlpha(fade and fade.start or 1)
self[fadeOut] = nil
self.OnLeave = self.OnLeave - fadeOut
self.OnEnter = self.OnEnter - fadeIn
end
end,
}
--- the height of the LayoutFrame
UI.Property {
name = "Height",
type = Number,
require = { LayoutFrame, Line },
get = function(self) return self:GetHeight() end,
set = function(self, height) self:SetHeight(height) end,
override = { "Size" },
}
--- Whether ignore parent's alpha settings
UI.Property {
name = "IgnoreParentAlpha",
type = Boolean,
require = { LayoutFrame, Line },
default = false,
get = function(self) return self:IsIgnoringParentAlpha() end,
set = function(self, flag) self:SetIgnoreParentAlpha(flag) end,
}
--- Whether ignore parent's scal settings
UI.Property {
name = "IgnoreParentScale",
type = Boolean,
require = { LayoutFrame, Line },
default = false,
get = function(self) return self:IsIgnoringParentScale() end,
set = function(self, flag) self:SetIgnoreParentScale(flag) end,
}
--- Whether set all points to the parent
UI.Property {
name = "SetAllPoints",
type = Boolean,
require = LayoutFrame,
set = function(self, flag) self:ClearAllPoints() if flag then self:SetPoint("TOPLEFT") self:SetPoint("BOTTOMRIGHT") end end,
clear = function(self) self:ClearAllPoints() end,
override = { "Location" }, -- So it can override the Location settings
}
--- the location of the LayoutFrame
UI.Property {
name = "Location",
type = Anchors,
require = LayoutFrame,
get = function(self) return LayoutFrame.GetLocation(GetProxyUI(self)) end,
set = function(self, loc) LayoutFrame.SetLocation(GetProxyUI(self), loc) end,
clear = function(self) self:ClearAllPoints() end,
override = { "SetAllPoints" }, -- So it can override the setAllPoints settings
}
--- the frame's scale factor or the scale animation's setting
UI.Property {
name = "Scale",
type = PositiveNumber,
require = LayoutFrame,
default = 1,
get = function(self) return self:GetScale() end,
set = function(self, scale) self:SetScale(scale) end,
}
--- The size of the LayoutFrame
UI.Property {
name = "Size",
type = Size,
require = { LayoutFrame, Line },
get = function(self) return Size(self:GetSize()) end,
set = function(self, size) self:SetSize(size.width, size.height) end,
override = { "Height", "Width" },
}
--- wheter the LayoutFrame is shown or not.
UI.Property {
name = "Visible",
type = Boolean,
require = { LayoutFrame, Line },
default = true,
get = function(self) return self:IsShown() and true or false end,
set = function(self, visible) self:SetShown(visible) end,
}
--- the width of the LayoutFrame
UI.Property {
name = "Width",
type = Number,
require = { LayoutFrame, Line },
get = function(self) return self:GetWidth() end,
set = function(self, width) self:SetWidth(width) end,
override = { "Size" },
}
end
------------------------------------------------------------
-- LayeredFrame --
------------------------------------------------------------
do
--- the layer at which the LayeredFrame's graphics are drawn relative to others in its frame
UI.Property {
name = "DrawLayer",
type = DrawLayer,
require = { Texture, FontString, ModelScene, Line },
default = "ARTWORK",
get = function(self) return self:GetDrawLayer() end,
set = function(self, layer) return self:SetDrawLayer(layer) end,
}
--- the color shading for the LayeredFrame's graphics
UI.Property {
name = "VertexColor",
type = ColorType,
require = { Texture, FontString, Line },
default = Color.WHITE,
get = function(self) if self.GetVertexColor then return Color(self:GetVertexColor()) end end,
set = function(self, color) self:SetVertexColor(color.r, color.g, color.b, color.a) end,
}
UI.Property {
name = "SubLevel",
type = Integer,
require = { Texture, FontString, Line },
default = 0,
depends = { "DrawLayer" },
get = function(self) return select(2, self:GetDrawLayer()) end,
set = function(self, sublevel) self:SetDrawLayer(self:GetDrawLayer(), sublevel) end,
}
end
------------------------------------------------------------
-- FontFrame --
------------------------------------------------------------
do
FONT_TYPES = { EditBox, FontString, MessageFrame, SimpleHTML }
--- the font settings
UI.Property {
name = "Font",
type = FontType,
require = FONT_TYPES,
get = function(self)
local filename, fontHeight, flags = self:GetFont()
local outline, monochrome = "NONE", false
if flags then
if flags:find("THICKOUTLINE") then
outline = "THICK"
elseif flags:find("OUTLINE") then
outline = "NORMAL"
end
if flags:find("MONOCHROME") then
monochrome = true
end
end
return FontType(filename, fontHeight, outline, monochrome)
end,
set = function(self, font)
local flags
if font.outline then
if font.outline == "NORMAL" then
flags = "OUTLINE"
elseif font.outline == "THICK" then
flags = "THICKOUTLINE"
end
end
if font.monochrome then
if flags then
flags = flags..",MONOCHROME"
else
flags = "MONOCHROME"
end
end
return self:SetFont(font.font, font.height, flags)
end,
override = { "FontObject" },
}
--- the Font object
UI.Property {
name = "FontObject",
type = FontObject,
require = FONT_TYPES,
get = function(self) return self:GetFontObject() end,
set = function(self, fontObject) self:SetFontObject(fontObject) end,
override = { "Font" },
}
--- the fontstring's horizontal text alignment style
UI.Property {
name = "JustifyH",
type = JustifyHType,
require = FONT_TYPES,
default = "CENTER",
get = function(self) return self:GetJustifyH() end,
set = function(self, justifyH) self:SetJustifyH(justifyH) end,
}
--- the fontstring's vertical text alignment style
UI.Property {
name = "JustifyV",
type = JustifyVType,
require = FONT_TYPES,
default = "MIDDLE",
get = function(self) return self:GetJustifyV() end,
set = function(self, justifyV) self:SetJustifyV(justifyV) end,
}
--- the color of the font's text shadow
UI.Property {
name = "ShadowColor",
type = Color,
require = FONT_TYPES,
default = Color(0, 0, 0, 0),
get = function(self) return Color(self:GetShadowColor()) end,
set = function(self, color) self:SetShadowColor(color.r, color.g, color.b, color.a) end,
}
--- the offset of the fontstring's text shadow from its text
UI.Property {
name = "ShadowOffset",
type = Dimension,
require = FONT_TYPES,
default = Dimension(0, 0),
get = function(self) return Dimension(self:GetShadowOffset()) end,
set = function(self, offset) self:SetShadowOffset(offset.x, offset.y) end,
}
--- the fontstring's amount of spacing between lines
UI.Property {
name = "Spacing",
type = Number,
require = FONT_TYPES,
default = 0,
get = function(self) return self:GetSpacing() end,
set = function(self, spacing) self:SetSpacing(spacing) end,
}
--- the fontstring's default text color
UI.Property {
name = "TextColor",
type = Color,
require = FONT_TYPES,
default = Color(1, 1, 1),
get = function(self) return Color(self:GetTextColor()) end,
set = function(self, color) self:SetTextColor(color.r, color.g, color.b, color.a) end,
}
--- whether the text wrap will be indented
UI.Property {
name = "Indented",
type = Boolean,
require = FONT_TYPES,
default = false,
get = function(self) return self:GetIndentedWordWrap() end,
set = function(self, flag) self:SetIndentedWordWrap(flag) end,
}
end
------------------------------------------------------------
-- Texture --
-- --
------------------------------------------------------------
do
local _Texture_Deps = { "Color", "Atlas", "FileID", "File" }
local _HWrapMode = setmetatable({}, META_WEAKKEY)
local _VWrapMode = setmetatable({}, META_WEAKKEY)
local _FilterMode = setmetatable({}, META_WEAKKEY)
--- the atlas setting of the texture
UI.Property {
name = "Atlas",
type = AtlasType,
require = { Texture, Line },
get = function(self) return AtlasType(self:GetAtlas()) end,
set = function(self, val) self:SetAtlas(val.atlas, val.useAtlasSize) end,
clear = function(self) self:SetAtlas(nil) end,
override = { "Color", "FileID", "File" },
}
--- the alpha mode of the texture
UI.Property {
name = "AlphaMode",
type = AlphaMode,
require = { Texture, Line },
default = "ADD",
get = function(self) return self:GetBlendMode() end,
set = function(self, val) self:SetBlendMode(val) end,
depends = _Texture_Deps,
}
--- the texture's color
UI.Property {
name = "Color",
type = ColorType,
require = { Texture, Line },
set = function(self, color) self:SetColorTexture(color.r, color.g, color.b, color.a) end,
clear = function(self) self:SetTexture(nil) end,
override = { "Atlas", "FileID", "File" },
}
--- whether the texture image should be displayed with zero saturation
UI.Property {
name = "Desaturated",
type = Boolean,
require = { Texture, Line },
default = false,
get = function(self) return self:IsDesaturated() end,
set = function(self, val) self:SetDesaturated(val) end,
depends = _Texture_Deps,
}
--- The texture's desaturation
UI.Property {
name = "Desaturation",
type = ColorFloat,
require = { Texture, Line, Model },
default = 0,
get = function(self) return self:GetDesaturation() end,
set = function(self, val) self:SetDesaturation(val) end,
depends = _Texture_Deps,
}
--- The wrap behavior specifying what should appear when sampling pixels with an x coordinate outside the (0, 1) region of the texture coordinate space.
UI.Property {
name = "HWrapMode",
type = WrapMode,
require = { Texture, Line },
default = "CLAMP",
get = function(self) return _HWrapMode[self] or "CLAMP" end,
set = function(self, val) if val == "CLAMP" then val = nil end _HWrapMode[self] = val end,
}
--- Wrap behavior specifying what should appear when sampling pixels with a y coordinate outside the (0, 1) region of the texture coordinate space
UI.Property {
name = "VWrapMode",
require = { Texture, Line },
type = WrapMode,
default = "CLAMP",
get = function(self) return _VWrapMode[self] or "CLAMP" end,
set = function(self, val) if val == "CLAMP" then val = nil end _VWrapMode[self] = val end,
}
--- Texture filtering mode to use
UI.Property {
name = "FilterMode",
require = { Texture, Line },
type = FilterMode,
default = "LINEAR",
get = function(self) return _FilterMode[self] or "LINEAR" end,
set = function(self, val) if val == "LINEAR" then val = nil end _FilterMode[self] = val end,
}
--- Whether the texture is horizontal tile
UI.Property {
name = "HorizTile",
type = Boolean,
require = { Texture, Line },
default = false,
get = function(self) return self:GetHorizTile() end,
set = function(self, val) self:SetHorizTile(val) end,
}
--- Whether the texture is vertical tile
UI.Property {
name = "VertTile",
require = { Texture, Line },
type = WrapMode,
default = false,
get = function(self) return self:GetVertTile() end,
set = function(self, val) self:SetVertTile(val) end,
}
--- The gradient color shading for the texture
UI.Property {
name = "Gradient",
type = GradientType,
require = { Texture, Line },
set = function(self, val) self:SetGradient(val.orientation, val.mincolor.r, val.mincolor.g, val.mincolor.b, val.maxcolor.r, val.maxcolor.g, val.maxcolor.b) end,
clear = function(self) self:SetGradient("HORIZONTAL", 1, 1, 1, 1, 1, 1) end,
depends = _Texture_Deps,
}
--- The gradient color shading (including opacity in the gradient) for the texture
UI.Property {
name = "GradientAlpha",
type = GradientType,
require = { Texture, Line },
set = function(self, val) self:SetGradientAlpha(val.orientation, val.mincolor.r, val.mincolor.g, val.mincolor.b, val.mincolor.a, val.maxcolor.r, val.maxcolor.g, val.maxcolor.b, val.maxcolor.a) end,
clear = function(self) self:SetGradientAlpha("HORIZONTAL", 1, 1, 1, 1, 1, 1, 1, 1) end,
depends = _Texture_Deps,
}
--- whether the texture object loads its image file in the background
UI.Property {
name = "NonBlocking",
type = Boolean,
require = { Texture, Line },
default = false,
get = function(self) return self:GetNonBlocking() end,
set = function(self, val) self:SetNonBlocking(val) end,
}
--- The rotation of the texture
UI.Property {
name = "Rotation",
type = Number,
require = { Texture, Line, Cooldown },
default = 0,
get = function(self) return self:GetRotation() end,
set = function(self, val) self:SetRotation(val) end,
depends = _Texture_Deps,
}
--- whether snap to pixel grid
UI.Property {
name = "SnapToPixelGrid",
type = Boolean,
require = { Texture, Line },
default = false,
get = function(self) return self:IsSnappingToPixelGrid() end,
set = function(self, val) self:SetSnapToPixelGrid(val) end,
depends = _Texture_Deps,
}
--- the texel snapping bias
UI.Property {
name = "TexelSnappingBias",
type = Number,
require = { Texture, Line },
default = 0,
get = function(self) return self:GetTexelSnappingBias() end,
set = function(self, val) self:SetTexelSnappingBias(val) end,
depends = _Texture_Deps,
}
--- The corner coordinates for scaling or cropping the texture image
UI.Property {
name = "TexCoords",
type = RectType,
require = { Texture, Line },
get = function(self) local ULx, ULy, LLx, LLy, URx, URy, LRx, LRy = self:GetTexCoord() if URx then return { ULx = ULx, ULy = ULy, LLx = LLx, LLy = LLy, URx = URx, URy = URy, LRx = LRx, LRy = LRy } elseif ULx then return { left = ULx, right = ULy, top = LLx, bottom = LLy } end end,
set = function(self, val) if not val.ULx then self:SetTexCoord(val.left, val.right, val.top, val.bottom) else self:SetTexCoord(val.ULx, val.ULy, val.LLx, val.LLy, val.URx, val.URy, val.LRx, val.LRy) end end,
clear = function(self) self:SetTexCoord(0, 1, 0, 1) end,
depends = { "Color", "Atlas", "FileID", "File" },
}
--- The texture file id
UI.Property {
name = "FileID",
type = Number,
require = { Texture, Line },
get = function(self) return self:GetTextureFileID() end,
set = function(self, val) self:SetTexture(val, _HWrapMode[self], _VWrapMode[self], _FilterMode[self]) end,
clear = function(self) self:SetTexture(nil) end,
override = { "Atlas", "Color", "File" },
depends = { "HWrapMode", "VWrapMode", "FilterMode" },
}
--- The texture file path
UI.Property {
name = "File",
type = String + Number,
require = { Texture, Line },
get = function(self) return self:GetTextureFilePath() end,
set = function(self, val) self:SetTexture(val, _HWrapMode[self], _VWrapMode[self], _FilterMode[self]) end,
clear = function(self) self:SetTexture(nil) end,
override = { "Atlas", "Color", "FileID" },
depends = { "HWrapMode", "VWrapMode", "FilterMode" },
}
--- The mask file path
UI.Property {
name = "Mask",
type = String,
require = { Texture, Line },
set = function(self, val) self:SetMask(val) end,
nilable = true,
depends = _Texture_Deps,
}
--- The vertex offset of upperleft corner
UI.Property {
name = "VertexOffsetUpperLeft",
type = Dimension,
require = { Texture, Line },
get = function(self) return Dimension(self:GetVertexOffset(VertexIndexType.UpperLeft)) end,
set = function(self, val) self:SetVertexOffset(VertexIndexType.UpperLeft, val.x, val.y) end,
clear = function(self) self:SetVertexOffset(VertexIndexType.UpperLeft, 0, 0) end,
depends = _Texture_Deps,
}
--- The vertex offset of lowerleft corner
UI.Property {
name = "VertexOffsetLowerLeft",
type = Dimension,
require = { Texture, Line },
get = function(self) return Dimension(self:GetVertexOffset(VertexIndexType.LowerLeft)) end,
set = function(self, val) self:SetVertexOffset(VertexIndexType.LowerLeft, val.x, val.y) end,
clear = function(self) self:SetVertexOffset(VertexIndexType.LowerLeft, 0, 0) end,
depends = _Texture_Deps,
}
--- The vertex offset of upperright corner
UI.Property {
name = "VertexOffsetUpperRight",
type = Dimension,
require = { Texture, Line },
get = function(self) return Dimension(self:GetVertexOffset(VertexIndexType.UpperRight)) end,
set = function(self, val) self:SetVertexOffset(VertexIndexType.UpperRight, val.x, val.y) end,
clear = function(self) self:SetVertexOffset(VertexIndexType.UpperRight, 0, 0) end,
depends = _Texture_Deps,
}
--- The vertex offset of lowerright corner
UI.Property {
name = "VertexOffsetLowerRight",
type = Dimension,
require = { Texture, Line },
get = function(self) return Dimension(self:GetVertexOffset(VertexIndexType.LowerRight)) end,
set = function(self, val) self:SetVertexOffset(VertexIndexType.LowerRight, val.x, val.y) end,
clear = function(self) self:SetVertexOffset(VertexIndexType.LowerRight, 0, 0) end,
depends = _Texture_Deps,
}
--- The animation texcoords
UI.Property {
name = "AnimateTexCoords",
type = AnimateTexCoords,
require = Texture,
nilable = true,
set = animateTexCoords,
}
--- The mask texture
for i = 0, 3 do
UI.Property {
name = "MaskTexture" .. (i == 0 and "" or i),
type = MaskTexture,
childtype = MaskTexture,
require = { Frame, Texture },
clear = function(self, mask) return self.RemoveMaskTexture and self:RemoveMaskTexture(mask) end,
set = function(self, mask) return self.AddMaskTexture and self:AddMaskTexture(mask) end,
}
end
--- Rotate degree
UI.Property {
name = "RotateDegree",
type = Number,
require = Texture,
clear = function(self)
if self.__OriginTexCoord then
self:SetTexCoord(unpack( self.__OriginTexCoord))
self:SetSize(self.__OriginWidth, self.__OriginHeight)
self.__OriginTexCoord = nil
self.__OriginWidth = nil
self.__OriginHeight = nil
end
end,
set = function(self, degree)
local radian= math.rad(degree or 0)
if not self.__OriginTexCoord then
self.__OriginTexCoord = { self:GetTexCoord() }
self.__OriginWidth = self:GetWidth()
self.__OriginHeight = self:GetHeight()
end
while radian < 0 do radian = radian + 2 * math.pi end
radian = radian % (2 * math.pi)
local angle = radian % (math.pi /2)
local left = self.__OriginTexCoord[1]
local top = self.__OriginTexCoord[2]
local right = self.__OriginTexCoord[7]
local bottom= self.__OriginTexCoord[8]
local dy = self.__OriginWidth * math.cos(angle) * math.sin(angle) * (bottom-top) / self.__OriginHeight
local dx = self.__OriginHeight * math.cos(angle) * math.sin(angle) * (right - left) / self.__OriginWidth
local ox = math.cos(angle) * math.cos(angle) * (right-left)
local oy = math.cos(angle) * math.cos(angle) * (bottom-top)
local newWidth = self.__OriginWidth*math.cos(angle) + self.__OriginHeight*math.sin(angle)
local newHeight = self.__OriginWidth*math.sin(angle) + self.__OriginHeight*math.cos(angle)
local ULx, ULy, LLx, LLy, URx, URy, LRx, LRy
if radian < math.pi / 2 then
-- 0 ~ 90
ULx = left - dx
ULy = bottom - oy
LLx = right - ox
LLy = bottom + dy
URx = left + ox
URy = top - dy
LRx = right + dx
LRy = top + oy
elseif radian < math.pi then
-- 90 ~ 180
URx = left - dx
URy = bottom - oy
ULx = right - ox
ULy = bottom + dy
LRx = left + ox
LRy = top - dy
LLx = right + dx
LLy = top + oy
newHeight, newWidth = newWidth, newHeight
elseif radian < 3 * math.pi / 2 then
-- 180 ~ 270
LRx = left - dx
LRy = bottom - oy
URx = right - ox
URy = bottom + dy
LLx = left + ox
LLy = top - dy
ULx = right + dx
ULy = top + oy
else
-- 270 ~ 360
LLx = left - dx
LLy = bottom - oy
LRx = right - ox
LRy = bottom + dy
ULx = left + ox
ULy = top - dy
URx = right + dx
URy = top + oy
newHeight, newWidth = newWidth, newHeight
end
self:SetTexCoord(ULx, ULy, LLx, LLy, URx, URy, LRx, LRy)
self:SetSize(newWidth, newHeight)
end,
}
end
------------------------------------------------------------
-- Line --
------------------------------------------------------------
do
local function toAnchor(self, p, f, x, y)
f = UIObject.GetRelativeUIName(self, f)
if f == false then return nil end
return Anchor(p, x, y, f)
end
local function fromAnchor(self, anchor)
return anchor.point, UIObject.GetRelativeUI(self, anchor.relativeTo) or self:GetParent(), anchor.x or 0, anchor.y or 0
end
--- the start point of the line
UI.Property {
name = "StartPoint",
type = Anchor,
require = Line,
set = function(self, anchor) self:SetStartPoint(fromAnchor(self, anchor)) end,
get = function(self) return toAnchor(self, self:GetStartPoint()) end,
}
--- the end point of the line
UI.Property {
name = "EndPoint",
type = Anchor,
require = Line,
set = function(self, anchor) self:SetEndPoint(fromAnchor(self, anchor)) end,
get = function(self) return toAnchor(self, self:GetEndPoint()) end,
}
--- the thickness of the line
UI.Property {
name = "Thickness",
type = Number,
require = Line,
default = 1,
set = function(self, val) self:SetThickness(val) end,
get = function(self) return self:GetThickness() end,
}
end
------------------------------------------------------------
-- FontString --
------------------------------------------------------------
do
--- The alpha gradient
UI.Property {
name = "AlphaGradient",
type = AlphaGradientType,
require = FontString,
set = function(self, val) self:SetAlphaGradient(val.start, val.length) end,
clear = function(self) self:SetAlphaGradient(0, 10^6) end,
}
--- the max lines of the text
UI.Property {
name = "MaxLines",
type = Number,
require = FontString,
default = 0,
set = function(self, val) self:SetMaxLines(val) end,
get = function(self) return self:GetMaxLines() end,
}
--- whether long lines of text will wrap within or between words
UI.Property {
name = "NonSpaceWrap",
type = Boolean,
require = FontString,
default = false,
set = function(self, val) self:SetNonSpaceWrap(val) end,
get = function(self) return self:CanNonSpaceWrap() end,
}
--- the text to be displayed in the font string
UI.Property {
name = "Text",
type = String,
require = { FontString, Button, EditBox, SimpleHTML },
default = "",
set = function(self, val) self:SetText(val) end,
get = function(self) return self:GetText() end,
}
--- the height of the text displayed in the font string
UI.Property {
name = "TextHeight",
type = Number,
require = FontString,
set = function(self, val) self:SetTextHeight(val) end,
get = function(self) return self:GetLineHeight() end,
}
--- whether long lines of text in the font string can wrap onto subsequent lines
UI.Property {
name = "WordWrap",
type = Boolean,
require = FontString,
default = true,
set = function(self, val) self:SetWordWrap(val) end,
get = function(self) return self:CanWordWrap() end,
}
end
------------------------------------------------------------
-- Animation --
------------------------------------------------------------
do
--- the playing state of the animation or animation group
UI.Property {
name = "Playing",
type = Boolean,
require = { Animation, AnimationGroup },
default = false,
set = function(self, val) if val then return self:IsPlaying() or self:Play() else return self:IsPlaying() and self:Stop() end end,
get = function(self) return self:IsPlaying() end,
}
--- looping type for the animation group: BOUNCE , NONE , REPEAT
UI.Property {
name = "Looping",
type = AnimLoopType,
require = AnimationGroup,
default = "NONE",
set = function(self, val) self:SetLooping(val) end,
get = function(self) return self:GetLooping() end,
}
--- Whether to final alpha is set
UI.Property {
name = "ToFinalAlpha",
type = Boolean,
require = AnimationGroup,
default = false,
set = function(self, val) self:SetToFinalAlpha(val) end,
get = function(self) return self:IsSetToFinalAlpha() end,
}
--- Time for the animation to progress from start to finish (in seconds)
UI.Property {
name = "Duration",
type = Number,
require = Animation,
default = 0,
set = function(self, val) self:SetDuration(val) end,
get = function(self) return self:GetDuration() end,
}
--- Time for the animation to delay after finishing (in seconds)
UI.Property {
name = "EndDelay",
type = Number,
require = Animation,
set = function(self, val) self:SetEndDelay(val) end,
get = function(self) return self:GetEndDelay() end,
}
--- Position at which the animation will play relative to others in its group (between 0 and 100)
UI.Property {
name = "Order",
type = Integer,
require = { Animation, ControlPoint },
set = function(self, val) self:SetOrder(val) end,
get = function(self) return self:GetOrder() end,
}
--- The smooth progress of the animation
UI.Property {
name = "SmoothProgress",
type = Number,
require = Animation,
set = function(self, val) self:SetSmoothProgress(val) end,
get = function(self) return self:GetSmoothProgress() end,
}
--- Type of smoothing for the animation, IN, IN_OUT, NONE, OUT
UI.Property {
name = "Smoothing",
type = AnimSmoothType,
require = Animation,
default = "NONE",
set = function(self, val) self:SetSmoothing(val) end,
get = function(self) return self:GetSmoothing() end,
}
--- Amount of time the animation delays before its progress begins (in seconds)
UI.Property {
name = "StartDelay",
type = Number,
require = Animation,
default = 0,
set = function(self, val) self:SetStartDelay(val) end,
get = function(self) return self:GetStartDelay() end,
}
--- the animation's amount of alpha (opacity) start from
UI.Property {
name = "FromAlpha",
type = ColorFloat,
require = Alpha,
default = 0,
set = function(self, val) self:SetFromAlpha(val) end,
get = function(self) return self:GetFromAlpha() end,
}
--- the animation's amount of alpha (opacity) end to
UI.Property {
name = "ToAlpha",
type = ColorFloat,
require = Alpha,
default = 0,
set = function(self, val) self:SetToAlpha(val) end,
get = function(self) return self:GetToAlpha() end,
}
--- The curve type of the path
UI.Property {
name = "Curve",
type = AnimCurveType,
require = Path,
default = "NONE",
set = function(self, val) self:SetCurve(val) end,
get = function(self) return self:GetCurve() end,
}
--- the offsets settings
UI.Property {
name = "Offset",
type = Dimension,
require = { ControlPoint, Translation },
set = function(self, val) self:SetOffset(val.x, val.y) end,
get = function(self) return Dimension(self:GetOffset()) end,
}
--- the animation's rotation amount (in degrees)
UI.Property {
name = "Degrees",
type = Number,
require = Rotation,
get = function(self) return self:GetDegrees() end,
set = function(self, val) self:SetDegrees(val) end,
}
--- the rotation animation's origin point
UI.Property {
name = "Origin",
type = AnimOriginType,
require = { Rotation, Scale },
get = function(self) return AnimOriginType(self:GetOrigin()) end,
set = function(self, val) self:SetOrigin(val.point, val.x, val.y) end,
}
--- the animation's rotation amount (in radians)
UI.Property {
name = "Radians",
type = Number,
require = Rotation,
get = function(self) return self:GetRadians() end,
set = function(self, val) self:SetRadians(val) end,
}
--- the animation's scaling factors
UI.Property {
name = "KeepScale",
type = Dimension,
require = Scale,
default = Dimension(1, 1),
set = function(self, val) self:SetScale(val.x, val.y) end,
get = function(self) return Dimension(self:GetScale()) end,
}
--- the animation's scale amount that start from
UI.Property {
name = "FromScale",
type = Dimension,
require = Scale,
default = Dimension(1, 1),
set = function(self, val) self:SetFromScale(val.x, val.y) end,
get = function(self) return Dimension(self:GetFromScale()) end,
}
--- the animation's scale amount that end to
UI.Property {
name = "ToScale",
type = Dimension,
require = Scale,
default = Dimension(1, 1),
set = function(self, val) self:SetToScale(val.x, val.y) end,
get = function(self) return Dimension(self:GetToScale()) end,
}
--- the animation's scaling factors
UI.Property {
name = "Scale",
type = Dimension,
require = Scale,
default = Dimension(1, 1),
set = function(self, val) self:SetScale(val.x, val.y) end,
get = function(self) return Dimension(self:GetScale()) end,
}
end
------------------------------------------------------------
-- Frame --
------------------------------------------------------------
do
--- whether the frame's boundaries are limited to those of the screen
UI.Property {
name = "ClampedToScreen",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:SetClampedToScreen(val) end,
get = function(self) return self:IsClampedToScreen() end,
}
--- offsets from the frame's edges used when limiting user movement or resizing of the frame
UI.Property {
name = "ClampRectInsets",
type = Inset,
require = Frame,
default = Inset(0, 0, 0, 0),
set = function(self, val) self:SetClampRectInsets(val.left, val.right, val.top, val.bottom) end,
get = function(self) return Inset(self:GetClampRectInsets()) end,
}
--- Whether the children is limited to draw inside the frame's boundaries
UI.Property {
name = "ClipChildren",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:SetClipsChildren(val) end,
get = function(self) return self:DoesClipChildren() end,
}
--- the 3D depth of the frame (for stereoscopic 3D setups)
UI.Property {
name = "Depth",
type = Number,
require = Frame,
default = 0,
set = function(self, val) self:SetDepth(val) end,
get = function(self) return self:GetDepth() end,
}
--- Whether the frame don't save its location in layout-cache
UI.Property {
name = "DontSavePosition",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:SetDontSavePosition(val) end,
get = function(self) return self:GetDontSavePosition() end,
}
--- Whether the frame's child is render in flattens layers
UI.Property {
name = "FlattenRenderLayers",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:SetFlattensRenderLayers(val) end,
get = function(self) return self:GetFlattensRenderLayers() end,
}
--- Whether a frame to be rendered in its own framebuffer
UI.Property {
name = "FrameBuff",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:SetFrameBuffer(val) end,
}
--- the level at which the frame is layered relative to others in its strata
UI.Property {
name = "FrameLevel",
type = Number,
require = Frame,
default = 1,
set = function(self, val) self:SetFrameLevel(val) end,
get = function(self) return self:GetFrameLevel() end,
}
--- the general layering strata of the frame
UI.Property {
name = "FrameStrata",
type = FrameStrata,
require = Frame,
default = "MEDIUM",
set = function(self, val) self:SetFrameStrata(val) end,
get = function(self) return self:GetFrameStrata() end,
}
--- the insets from the frame's edges which determine its mouse-interactable area
UI.Property {
name = "HitRectInsets",
type = Inset,
require = Frame,
default = Inset(0, 0, 0, 0),
set = function(self, val) self:SetHitRectInsets(val.left, val.right, val.top, val.bottom) end,
get = function(self) return Inset(self:GetHitRectInsets()) end,
}
--- Whether the hyper links are enabled
UI.Property {
name = "HyperlinksEnabled",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:SetHyperlinksEnabled(val) end,
get = function(self) return self:GetHyperlinksEnabled() end,
}
--- a numeric identifier for the frame
UI.Property {
name = "ID",
type = Number,
require = Frame,
default = 0,
set = function(self, val) self:SetID(val) end,
get = function(self) return self:GetID() end,
}
--- whether the frame's depth property is ignored (for stereoscopic 3D setups)
UI.Property {
name = "IgnoringDepth",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:IgnoreDepth(val) end,
get = function(self) return self:IsIgnoringDepth() end,
}
--- Whether the joystick is enabled for the frame
UI.Property {
name = "JoystickEnabled",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:EnableJoystick(val) end,
get = function(self) return self:IsJoystickEnabled() end,
}
--- whether keyboard interactivity is enabled for the frame
UI.Property {
name = "EnableKeyboard",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:EnableKeyboard(val) end,
get = function(self) return self:IsKeyboardEnabled() end,
}
--- the maximum size of the frame for user resizing
UI.Property {
name = "MaxResize",
type = Size,
require = Frame,
default = Size(0, 0),
set = function(self, val) self:SetMaxResize(val.width, val.height) end,
get = function(self) return Size(self:GetMaxResize()) end,
}
--- Whether the mouse click is enabled
UI.Property {
name = "EnableMouseClicks",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:SetMouseClickEnabled(val) end,
get = function(self) return self:IsMouseClickEnabled() end,
}
--- whether mouse interactivity is enabled for the frame
UI.Property {
name = "EnableMouse",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:EnableMouse(val) end,
get = function(self) return self:IsMouseEnabled() end,
}
--- Whether the mouse motion in enabled
UI.Property {
name = "EnableMouseMotion",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:SetMouseMotionEnabled(val) end,
get = function(self) return self:IsMouseMotionEnabled() end,
}
--- whether mouse wheel interactivity is enabled for the frame
UI.Property {
name = "EnableMouseWheel",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:EnableMouseWheel(val) end,
get = function(self) return self:IsMouseWheelEnabled() end,
}
--- the minimum size of the frame for user resizing
UI.Property {
name = "MinResize",
type = Size,
require = Frame,
default = Size(0, 0),
set = function(self, val) self:SetMinResize(val.width, val.height) end,
get = function(self) return Size(self:GetMinResize()) end,
}
--- whether the frame can be moved by the user
UI.Property {
name = "Movable",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:SetMovable(val) end,
get = function(self) return self:IsMovable() end,
}
--- Whether the frame get the propagate keyboard input
UI.Property {
name = "PropagateKeyboardInput",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:SetPropagateKeyboardInput(val) end,
get = function(self) return self:GetPropagateKeyboardInput() end,
}
--- whether the frame can be resized by the user
UI.Property {
name = "Resizable",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:SetResizable(val) end,
get = function(self) return self:IsResizable() end,
}
--- whether the frame should automatically come to the front when clicked
UI.Property {
name = "Toplevel",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:SetToplevel(val) end,
get = function(self) return self:IsToplevel() end,
}
--- whether the frame should save/load custom position by the system
UI.Property {
name = "UserPlaced",
type = Boolean,
require = Frame,
default = false,
set = function(self, val) self:SetUserPlaced(val) end,
get = function(self) return self:IsUserPlaced() end,
}
end
------------------------------------------------------------
-- Button --
------------------------------------------------------------
do
--- Whether the button is enabled
UI.Property {
name = "Enabled",
type = Boolean,
require = { Button, EditBox, Slider },
default = true,
set = function(self, val) self:SetEnabled(val) end,
get = function(self) return self:IsEnabled() end,
}
--- the FontString object used for the button's label text
UI.Property {
name = "ButtonText",
type = FontString,
require = Button,
nilable = true,
childtype = FontString,
set = function(self, val) self:SetFontString(val) end,
}
--- The button state
UI.Property {
name = "ButtonState",
type = ButtonStateType,
require = Button,
default = "NORMAL",
set = function(self, val) self:SetButtonState(val) end,
get = function(self) return self:GetButtonState() end,
}
--- Whether enable the motion script while disabled
UI.Property {
name = "MotionScriptsWhileDisabled",
type = Boolean,
require = Button,
default = false,
set = function(self, val) self:SetMotionScriptsWhileDisabled(val) end,
get = function(self) return self:GetMotionScriptsWhileDisabled() end,
}
--- The registered mouse key for click
UI.Property {
name = "RegisterForClicks",
type = struct { String },
require = Button,
nilable = true,
set = function(self, val) if val then self:RegisterForClicks(unpack(val)) else self:RegisterForClicks(nil) end end
}
--- The registered mouse key for drag
UI.Property {
name = "RegisterForDrag",
type = struct { String },
require = Button,
nilable = true,
set = function(self, val) if val then self:RegisterForDrag(unpack(val)) else self:RegisterForDrag(nil) end end
}
--- the offset for moving the button's label text when pushed
UI.Property {
name = "PushedTextOffset",
type = Dimension,
require = Button,
default = Dimension(1.5665, -1.5665),
set = function(self, val) self:SetPushedTextOffset(val.x, val.y) end,
get = function(self) return Dimension(self:GetPushedTextOffset()) end,
}
--- the texture object used when the button is pushed
UI.Property {
name = "PushedTexture",
type = Texture,
require = Button,
nilable = true,
childtype = Texture,
set = function(self, val) self:SetPushedTexture(val) end,
}
--- the texture object used when the button is highlighted
UI.Property {
name = "HighlightTexture",
type = Texture,
require = Button,
nilable = true,
childtype = Texture,
set = function(self, val) self:SetHighlightTexture(val) end,
}
--- the texture object used for the button's normal state
UI.Property {
name = "NormalTexture",
type = Texture,
require = Button,
nilable = true,
childtype = Texture,
set = function(self, val) self:SetNormalTexture(val) end,
}
--- the texture object used when the button is disabled
UI.Property {
name = "DisabledTexture",
type = Texture,
require = Button,
nilable = true,
childtype = Texture,
set = function(self, val) self:SetDisabledTexture(val) end,
}
--- the font object used when the button is highlighted
UI.Property {
name = "HighlightFont",
type = FontObject,
require = Button,
nilable = true,
set = function(self, val) self:SetHighlightFontObject(val) end,
get = function(self) return self:GetHighlightFontObject() end,
}
--- the font object used for the button's normal state
UI.Property {
name = "NormalFont",
type = FontObject,
require = Button,
nilable = true,
set = function(self, val) self:SetNormalFontObject(val) end,
get = function(self) return self:GetNormalFontObject() end,
}
--- the font object used for the button's disabled state
UI.Property {
name = "DisabledFont",
type = FontObject,
require = Button,
nilable = true,
set = function(self, val) self:SetDisabledFontObject(val) end,
get = function(self) return self:GetDisabledFontObject() end,
}
end
------------------------------------------------------------
-- CheckButton --
------------------------------------------------------------
do
--- Whether the checkbutton is checked
UI.Property {
name = "Checked",
type = Boolean,
require = CheckButton,
default = false,
set = function(self, val) self:SetChecked(val) end,
get = function(self) return self:GetChecked() end,
}
--- the texture object used when the button is checked
UI.Property {
name = "CheckedTexture",
type = Texture,
require = CheckButton,
nilable = true,
childtype = Texture,
set = function(self, val) self:SetCheckedTexture(val) end,
}
--- the texture object used when the button is disabled and checked
UI.Property {
name = "DisabledCheckedTexture",
type = Texture,
require = CheckButton,
nilable = true,
childtype = Texture,
set = function(self, val) self:SetDisabledCheckedTexture(val) end,
}
end
------------------------------------------------------------
-- ColorSelect --
------------------------------------------------------------
do
--- the HSV color value
UI.Property {
name = "ColorHSV",
type = HSVType,
require = ColorSelect,
default = HSVType(0, 0, 1),
set = function(self, val) self:SetColorHSV(val.h, val.s, val.v) end,
get = function(self) return HSVType(self:GetColorHSV()) end,
}
--- the RGB color value
UI.Property {
name = "ColorRGB",
type = ColorType,
require = ColorSelect,
default = Color.WHITE,
set = function(self, val) self:SetColorRGB(val.r, val.g, val.b, val.a) end,
get = function(self) return Color(self:GetColorRGB()) end,
}
--- the texture for the color picker's value slider background
UI.Property {
name = "ColorValueTexture",
type = Texture,
require = ColorSelect,
nilable = true,
childtype = Texture,
set = function(self, val) self:SetColorValueTexture(val) end,
}
--- the texture for the selection indicator on the color picker's hue/saturation wheel
UI.Property {
name = "ColorWheelThumbTexture",
type = Texture,
require = ColorSelect,
nilable = true,
childtype = Texture,
set = function(self, val) self:SetColorWheelThumbTexture(val) end,
}
--- the texture for the color picker's hue/saturation wheel
UI.Property {
name = "ColorWheelTexture",
type = Texture,
require = ColorSelect,
nilable = true,
childtype = Texture,
set = function(self, val) self:SetColorWheelTexture(val) end,
}
--- the texture for the color picker's value slider thumb
UI.Property {
name = "ColorValueThumbTexture",
type = Texture,
require = ColorSelect,
nilable = true,
childtype = Texture,
set = function(self, val) self:SetColorValueThumbTexture(val) end,
}
end
------------------------------------------------------------
-- Cooldown --
------------------------------------------------------------
do
--- Sets the bling texture
UI.Property {
name = "BlingTexture",
type = TextureType,
require = Cooldown,
set = function(self, val) if val.color and val.file then self:SetBlingTexture(val.file, val.color.r, val.color.g, val.color.b, val.color.a) elseif val.color then self:SetBlingTexture(val.color.r, val.color.g, val.color.b, val.color.a) else self:SetBlingTexture(val.file) end end,
}
--- the duration currently shown by the cooldown frame in milliseconds
UI.Property {
name = "CooldownDuration",
type = Number,
require = Cooldown,
default = 0,
set = function(self, val) self:SetCooldownDuration(val) end,
get = function(self) self:GetCooldownDuration() end,
}
--- Whether the cooldown 'bling' when finsihed
UI.Property {
name = "DrawBling",
type = Boolean,
require = Cooldown,
default = true,
set = function(self, val) self:SetDrawBling(val) end,
get = function(self) self:GetDrawBling() end,
}
--- Whether a bright line should be drawn on the moving edge of the cooldown animation
UI.Property {
name = "DrawEdge",
type = Boolean,
require = Cooldown,
default = true,
set = function(self, val) self:SetDrawEdge(val) end,
get = function(self) self:GetDrawEdge() end,
}
--- Whether a shadow swipe should be drawn
UI.Property {
name = "DrawSwipe",
type = Boolean,
require = Cooldown,
default = true,
set = function(self, val) self:SetDrawSwipe(val) end,
get = function(self) self:GetDrawSwipe() end,
}
-- The edge scale
UI.Property {
name = "EdgeScale",
type = Number,
require = Cooldown,
default = math.sin(45 / 180 * math.pi),
set = function(self, val) self:SetEdgeScale(val) end,
get = function(self) self:GetEdgeScale() end,
}
--- Sets the edge texture
UI.Property {
name = "EdgeTexture",
type = TextureType,
require = Cooldown,
set = function(self, val) if val.color and val.file then self:SetEdgeTexture(val.file, val.color.r, val.color.g, val.color.b, val.color.a) elseif val.color then self:SetEdgeTexture(val.color.r, val.color.g, val.color.b, val.color.a) else self:SetEdgeTexture(val.file) end end,
}
--- Whether hide count down numbers
UI.Property {
name = "HideCountdownNumbers",
type = Boolean,
require = Cooldown,
default = false,
set = function(self, val) self:SetHideCountdownNumbers(val) end,
}
--- Whether the cooldown animation "sweeps" an area of darkness over the underlying image; false if the animation darkens the underlying image and "sweeps" the darkened area away
UI.Property {
name = "Reverse",
type = Boolean,
require = Cooldown,
default = false,
set = function(self, val) self:SetReverse(val) end,
get = function(self) self:GetReverse() end,
}
--- the swipe color
UI.Property {
name = "SwipeColor",
type = ColorType,
require = Cooldown,
set = function(self, val) self:SetSwipeColor(val.r, val.g, val.b) end,
depends = { "SwipeTexture" },
}
--- the swipe texture
UI.Property {
name = "SwipeTexture",
type = TextureType,
require = Cooldown,
set = function(self, val) if val.color and val.file then self:SetSwipeTexture(val.file, val.color.r, val.color.g, val.color.b, val.color.a) elseif val.color then self:SetSwipeTexture(val.color.r, val.color.g, val.color.b, val.color.a) else self:SetSwipeTexture(val.file) end end,
}
--- Whether use circular edge
UI.Property {
name = "UseCircularEdge",
type = Boolean,
require = Cooldown,
default = false,
set = function(self, val) self:SetUseCircularEdge(val) end,
}
end
------------------------------------------------------------
-- EditBox --
------------------------------------------------------------
do
--- true if the arrow keys are ignored by the edit box unless the Alt key is held
UI.Property {
name = "AltArrowKeyMode",
type = Boolean,
require = EditBox,
default = false,
set = function(self, val) self:SetAltArrowKeyMode(val) end,
get = function(self) return self:GetAltArrowKeyMode() end,
}
--- true if the edit box automatically acquires keyboard input focus
UI.Property {
name = "AutoFocus",
type = Boolean,
require = EditBox,
default = true,
set = function(self, val) self:SetAutoFocus(val) end,
get = function(self) return self:IsAutoFocus() end,
}
--- the rate at which the text insertion blinks when the edit box is focused
UI.Property {
name = "BlinkSpeed",
type = Number,
require = EditBox,
default = 0.5,
set = function(self, val) self:SetBlinkSpeed(val) end,
get = function(self) return self:GetBlinkSpeed() end,
}
--- Whether count the invisible letters for max letters
UI.Property {
name = "CountInvisibleLetters",
type = Boolean,
require = EditBox,
default = false,
set = function(self, val) self:SetCountInvisibleLetters(val) end,
get = function(self) return self:IsCountInvisibleLetters() end,
}
UI.Property {
name = "HighlightColor",
type = ColorType,
require = EditBox,
set = function(self, val) self:SetHighlightColor(val.r, val.g, val.b, val.a) end,
get = function(self) return Color(self:GetHighlightColor()) end,
}
--- the maximum number of history lines stored by the edit box
UI.Property {
name = "HistoryLines",
type = Number,
require = EditBox,
default = 0,
set = function(self, val) self:SetHistoryLines(val) end,
get = function(self) return self:GetHistoryLines() end,
}
--- the maximum number of bytes of text allowed in the edit box, default is 0(Infinite)
UI.Property {
name = "MaxBytes",
type = Integer,
require = EditBox,
default = 0,
set = function(self, val) self:SetMaxBytes(val) end,
get = function(self) return self:GetMaxBytes() end,
}
--- the maximum number of text characters allowed in the edit box
UI.Property {
name = "MaxLetters",
type = Integer,
require = EditBox,
default = 0,
set = function(self, val) self:SetMaxLetters(val) end,
get = function(self) return self:GetMaxLetters() end,
}
--- true if the edit box shows more than one line of text
UI.Property {
name = "MultiLine",
type = Boolean,
require = EditBox,
default = false,
set = function(self, val) self:SetMultiLine(val) end,
get = function(self) return self:IsMultiLine() end,
}
--- true if the edit box only accepts numeric input
UI.Property {
name = "Numeric",
type = Boolean,
require = EditBox,
default = false,
set = function(self, val) self:SetNumeric(val) end,
get = function(self) return self:IsNumeric() end,
}
--- the contents of the edit box as a number
UI.Property {
name = "Number",
type = Number,
require = EditBox,
default = 0,
set = function(self, val) self:SetNumber(val) end,
get = function(self) return self:GetNumber() end,
}
--- true if the text entered in the edit box is masked
UI.Property {
name = "Password",
type = Boolean,
require = EditBox,
default = false,
set = function(self, val) self:SetPassword(val) end,
get = function(self) return self:IsPassword() end,
}
--- the insets from the edit box's edges which determine its interactive text area
UI.Property {
name = "TextInsets",
type = Inset,
require = EditBox,
set = function(self, val) self:SetTextInsets(val.left, val.right, val.top, val.bottom) end,
get = function(self) return Inset(self:GetTextInsets()) end,
}
UI.Property {
name = "VisibleTextByteLimit",
type = Boolean,
require = EditBox,
default = false,
set = function(self, val) self:SetVisibleTextByteLimit(val) end,
get = function(self) return self:GetVisibleTextByteLimit() end,
}
end
------------------------------------------------------------
-- MessageFrame --
------------------------------------------------------------
do
--- the duration of the fade-out animation for disappearing messages
UI.Property {
name = "FadeDuration",
type = Number,
require = MessageFrame,
default = 3,
set = function(self, val) self:SetFadeDuration(val) end,
get = function(self) return self:GetFadeDuration() end,
}
--- whether messages added to the frame automatically fade out after a period of time
UI.Property {
name = "Fading",
type = Boolean,
require = MessageFrame,
default = true,
set = function(self, val) self:SetFading(val) end,
get = function(self) return self:GetFading() end,
}
--- The power of the fade-out animation for disappearing messages
UI.Property {
name = "FadePower",
type = Number,
require = MessageFrame,
default = 1,
set = function(self, val) self:SetFadePower(val) end,
get = function(self) return self:GetFadePower() end,
}
--- the position at which new messages are added to the frame
UI.Property {
name = "InsertMode",
type = InsertMode,
require = MessageFrame,
default = "BOTTOM",
set = function(self, val) self:SetInsertMode(val) end,
get = function(self) return self:GetInsertMode() end,
}
--- the amount of time for which a message remains visible before beginning to fade out
UI.Property {
name = "DisplayDuration",
type = Number,
require = MessageFrame,
default = 10,
set = function(self, val) self:SetTimeVisible(val) end,
get = function(self) return self:GetTimeVisible() end,
}
end
------------------------------------------------------------
-- ScrollFrame --
------------------------------------------------------------
do
--- the scroll frame's current horizontal scroll position
UI.Property {
name = "HorizontalScroll",
type = Number,
require = ScrollFrame,
default = 0,
set = function(self, val) self:SetHorizontalScroll(val) end,
get = function(self) return self:GetHorizontalScroll() end,
}
--- the scroll frame's vertical scroll position
UI.Property {
name = "VerticalScroll",
type = Number,
require = ScrollFrame,
default = 0,
set = function(self, val) self:SetVerticalScroll(val) end,
get = function(self) return self:GetVerticalScroll() end,
}
end
------------------------------------------------------------
-- SimpleHTML --
------------------------------------------------------------
do
UI.Property {
name = "HyperlinkFormat",
type = String,
require = SimpleHTML,
default = "%s",
set = function(self, val) self:SetHyperlinkFormat(val) end,
get = function(self) return self:GetHyperlinkFormat() end,
}
end
------------------------------------------------------------
-- Slider --
------------------------------------------------------------
do
local smoothValueDelay = Toolset.newtable(true)
local smoothRealValue = Toolset.newtable(true)
local smoothValueFinal = Toolset.newtable(true)
__Service__(true)
function ProcessSmoothValueUpdate()
while true do
while next(smoothRealValue) do
local now = GetTime()
for self, real in pairs(smoothRealValue) do
local diff = smoothValueFinal[self] - now
if diff <= 0 then
self:SetValue(real)
smoothRealValue[self] = nil
else
diff = diff / (smoothValueDelay[self] or 1)
if diff > 1 then diff = 1 end
self:SetValue(self:GetValue() * diff + real * (1 - diff))
end
end
Next()
end
NextEvent("SCORPIO_UI_SMOOTH_VALUE_PROCESS")
end
end
--- the texture object for the slider thumb
UI.Property {
name = "ThumbTexture",
type = Texture,
require = Slider,
nilable = true,
childtype = Texture,
set = function(self, val) self:SetThumbTexture(val) end,
}
--- the minimum and maximum values of the slider bar
UI.Property {
name = "MinMaxValues",
type = MinMax,
require = { Slider, StatusBar },
set = function(self, val) self:SetMinMaxValues(val.min, val.max) end,
get = function(self) return MinMax(self:GetMinMaxValues()) end,
}
--- the orientation of the slider
UI.Property {
name = "Orientation",
type = Orientation,
require = { Slider, StatusBar },
set = function(self, val) self:SetOrientation(val) end,
get = function(self) return self:GetOrientation() end,
}
--- the steps per page of the slider bar
UI.Property {
name = "StepsPerPage",
type = Number,
require = Slider,
default = 0,
set = function(self, val) self:SetStepsPerPage(val) end,
get = function(self) return self:GetStepsPerPage() end,
}
--- Whether obey the step setting when drag the slider bar
UI.Property {
name = "ObeyStepOnDrag",
type = Boolean,
require = Slider,
default = false,
set = function(self, val) self:SetObeyStepOnDrag(val) end,
get = function(self) return self:GetObeyStepOnDrag() end,
}
--- the value representing the current position of the slider thumb
UI.Property {
name = "Value",
type = Number,
require = { Slider, StatusBar },
default = 0,
set = function(self, val) self:SetValue(val) end,
get = function(self) return self:GetValue() end,
}
--- the minimum increment between allowed slider values
UI.Property {
name = "ValueStep",
type = Number,
require = Slider,
default = 0,
set = function(self, val) self:SetValueStep(val) end,
get = function(self) return self:GetValueStep() end,
}
--- A smooth value accessor instead of the Value
UI.Property {
name = "SmoothValue",
type = Number,
require = { Slider, StatusBar },
default = 0,
set = function(self, val)
if not next(smoothRealValue) then
FireSystemEvent("SCORPIO_UI_SMOOTH_VALUE_PROCESS")
end
smoothRealValue[self] = val
smoothValueFinal[self] = GetTime() + (smoothValueDelay[self] or 1)
end,
}
--- The smooth value delay
UI.Property {
name = "SmoothValueDelay",
type = Number,
require = { Slider, StatusBar },
default = 1,
set = function(self, val)
smoothValueDelay[self] = val
end,
get = function(self)
return smoothValueDelay[self] or 1
end,
}
end
------------------------------------------------------------
-- StatusBar --
------------------------------------------------------------
do
--- whether the status bar's texture is rotated to match its orientation
UI.Property {
name = "RotatesTexture",
type = Boolean,
require = StatusBar,
default = false,
set = function(self, val) self:SetRotatesTexture(val) end,
get = function(self) return self:GetRotatesTexture() end,
}
--- Whether the status bar's texture is reverse filled
UI.Property {
name = "ReverseFill",
type = Boolean,
require = StatusBar,
default = false,
set = function(self, val) self:SetReverseFill(val) end,
get = function(self) return self:GetReverseFill() end,
}
UI.Property {
name = "FillStyle",
type = FillStyle,
require = StatusBar,
default = "STANDARD",
set = function(self, val) self:SetFillStyle(val) end,
get = function(self) return self:GetFillStyle() end,
}
--- The texture atlas
UI.Property {
name = "StatusBarAtlas",
type = String,
require = StatusBar,
set = function(self, val) self:SetStatusBarAtlas(val) end,
get = function(self) return self:GetStatusBarAtlas() end,
}
--- the color shading for the status bar's texture
UI.Property {
name = "StatusBarColor",
type = ColorType,
require = StatusBar,
default = Color.WHITE,
set = function(self, val) self:SetStatusBarColor(val.r, val.g, val.b, val.a) end,
get = function(self) return Color(self:GetStatusBarColor()) end,
}
UI.Property {
name = "StatusBarTexture",
type = Texture,
require = StatusBar,
nilable = true,
childtype = Texture,
set = function(self, val) self:SetStatusBarTexture(val) end,
}
end
------------------------------------------------------------
-- Model --
------------------------------------------------------------
do
--- The model's camera distance
UI.Property {
name = "CameraDistance",
type = Number,
require = Model,
set = function(self, val) self:SetCameraDistance(val) end,
get = function(self) return self:GetCameraDistance() end,
}
--- The model's camera facing
UI.Property {
name = "CameraFacing",
type = Number,
require = Model,
default = 0,
set = function(self, val) self:SetCameraFacing(val) end,
get = function(self) return self:GetCameraFacing() end,
}
--- The model's camera position
UI.Property {
name = "CameraPosition",
type = Position,
require = { Model, ModelScene },
set = function(self, val) self:SetCameraPosition(val.x, val.y, val.z) end,
get = function(self) return Position(self:GetCameraPosition()) end,
}
--- The model's camera target position
UI.Property {
name = "CameraTarget",
type = Position,
require = Model,
set = function(self, val) self:SetCameraTarget(val.x, val.y, val.z) end,
get = function(self) return Position(self:GetCameraTarget()) end,
}
--- The model's camera roll
UI.Property {
name = "CameraRoll",
type = Number,
require = Model,
default = 0,
set = function(self, val) self:SetCameraRoll(val) end,
get = function(self) return self:GetCameraRoll() end,
}
--- Whether has custom camera
UI.Property {
name = "CustomCamera",
type = Boolean,
require = Model,
default = false,
set = function(self, val) self:SetCustomCamera(val) end,
get = function(self) return self:HasCustomCamera() end,
}
--- the model's current fog color
UI.Property {
name = "FogColor",
type = ColorType,
require = { Model, ModelScene },
default = Color.WHITE,
set = function(self, val) self:SetFogColor(val.r, val.g, val.b, val.a) end,
get = function(self) return Color(self:GetFogColor()) end,
}
--- the far clipping distance for the model's fog
UI.Property {
name = "FogFar",
type = Number,
require = { Model, ModelScene },
default = 1,
set = function(self, val) self:SetFogFar(val) end,
get = function(self) return self:GetFogFar() end,
}
--- the near clipping distance for the model's fog
UI.Property {
name = "FogNear",
type = Number,
require = { Model, ModelScene },
default = 0,
set = function(self, val) self:SetFogNear(val) end,
get = function(self) return self:GetFogNear() end,
}
--- The model's facing
UI.Property {
name = "Facing",
type = Number,
require = Model,
default = 0,
set = function(self, val) self:SetFacing(val) end,
get = function(self) return self:GetFacing() end,
}
--- the light sources used when rendering the model
UI.Property {
name = "Light",
type = LightType,
require = Model,
set = function(self, val)
local enabled, omni, dirX, dirY, dirZ, ambIntensity, ambR, ambG, ambB, dirIntensity, dirR, dirG, dirB
enabled = set.enabled or false
omni = set.omni or false
if set.dir then
dirX, dirY, dirZ = set.dir.x, set.dir.y, set.dir.z
if set.ambIntensity and set.ambColor then
ambIntensity = set.ambIntensity
ambR, ambG, ambB = set.ambColor.r, set.ambColor.g, set.ambColor.b
if set.dirIntensity and set.dirColor then
dirIntensity = set.dirIntensity
dirR, dirG, dirB = set.dirColor.r, set.dirColor.g, set.dirColor.b
end
end
end
return self:SetLight(enabled, omni, dirX, dirY, dirZ, ambIntensity, ambR, ambG, ambB, dirIntensity, dirR, dirG, dirB)
end,
get = function(self)
local enabled, omni, dirX, dirY, dirZ, ambIntensity, ambR, ambG, ambB, dirIntensity, dirR, dirG, dirB = self:GetLight()
return LightType(
enabled,
omni,
Position(dirX, dirY, dirZ),
ambIntensity,
Color(ambR, ambG, ambB),
dirIntensity,
Color(dirR, dirG, dirB)
)
end,
}
--- The model to be display
UI.Property {
name = "Model",
type = String,
require = Model,
set = function(self, val) self:SetModel(val) end,
clear = function(self) self:ClearModel() end,
}
--- The model's alpha
UI.Property {
name = "ModelAlpha",
type = ColorFloat,
require = Model,
default = 1,
set = function(self, val) self:SetModelAlpha(val) end,
get = function(self) return self:GetModelAlpha() end,
}
UI.Property {
name = "ModelCenterToTransform",
type = Boolean,
require = Model,
default = false,
set = function(self, val) self:UseModelCenterToTransform(val) end,
get = function(self) return self:IsUsingModelCenterToTransform() end,
}
--- The model's draw layer
UI.Property {
name = "ModelDrawLayer",
type = DrawLayer,
require = Model,
default = "ARTWORK",
set = function(self, val) self:SetModelDrawLayer(val) end,
get = function(self) return self:GetModelDrawLayer() end,
}
--- the scale factor determining the size at which the 3D model appears
UI.Property {
name = "ModelScale",
type = Number,
require = Model,
default = 1,
set = function(self, val) self:SetModelScale(val) end,
get = function(self) return self:GetModelScale() end,
}
--- the position of the 3D model within the frame
UI.Property {
name = "Position",
type = Position,
require = Model,
default = Position(0, 0, 0),
set = function(self, val) self:SetPosition(val.x, val.y, val.z) end,
get = function(self) return Position(self:GetPosition()) end,
}
UI.Property {
name = "Paused",
type = Boolean,
require = Model,
default = false,
set = function(self, val) self:SetPaused(val) end,
get = function(self) return self:GetPaused() end,
}
UI.Property {
name = "ParticlesEnabled",
type = Boolean,
require = Model,
default = false,
set = function(self, val) self:SetParticlesEnabled(val) end,
}
--- The model's pitch
UI.Property {
name = "Pitch",
type = Number,
require = Model,
default = 0,
set = function(self, val) self:SetPitch(val) end,
get = function(self) return self:GetPitch() end,
}
--- The model's roll
UI.Property {
name = "Roll",
type = Number,
require = Model,
default = 0,
set = function(self, val) self:SetRoll(val) end,
get = function(self) return self:GetRoll() end,
}
--- The shadow effect
UI.Property {
name = "ShadowEffect",
type = Number,
require = Model,
default = 0,
set = function(self, val) self:SetShadowEffect(val) end,
get = function(self) return self:GetShadowEffect() end,
}
UI.Property {
name = "ViewInsets",
type = Inset,
require = { Model, ModelScene },
default = Inset(0, 0, 0, 0),
set = function(self, val) self:SetViewInsets(val.left, val.right, val.top, val.bottom) end,
get = function(self) return Inset(self:GetViewInsets()) end,
}
UI.Property {
name = "ViewTranslation",
type = Dimension,
require = { Model, ModelScene },
default = Dimension(0, 0),
set = function(self, val) self:SetViewTranslation(val.x, val.y) end,
get = function(self) return Dimension(self:GetViewTranslation()) end,
}
end
------------------------------------------------------------
-- ModelScene --
------------------------------------------------------------
do
UI.Property {
name = "CameraFarClip",
type = Number,
require = ModelScene,
default = 100,
set = function(self, val) self:SetCameraFarClip(val) end,
get = function(self) return self:GetCameraFarClip() end,
}
UI.Property {
name = "CameraNearClip",
type = Number,
require = ModelScene,
default = 0.2,
set = function(self, val) self:SetCameraNearClip(val) end,
get = function(self) return self:GetCameraNearClip() end,
}
UI.Property {
name = "LightAmbientColor",
type = ColorType,
require = ModelScene,
default = Color(0.7, 0.7, 0.7),
set = function(self, val) self:SetLightAmbientColor(val.r, val.g, val.b) end,
get = function(self) return Color(self:GetLightAmbientColor()) end,
}
UI.Property {
name = "LightPosition",
type = Position,
require = ModelScene,
default = Position(0, 0, 0),
set = function(self, val) self:SetLightPosition(val.x, val.y, val.z) end,
get = function(self) return Position(self:GetLightPosition()) end,
}
UI.Property {
name = "LightType",
type = Number,
require = ModelScene,
default = 1,
set = function(self, val) self:SetLightType(val) end,
get = function(self) return self:GetLightType() end,
}
UI.Property {
name = "LightDirection",
type = Position,
require = ModelScene,
default = Position(0, 1, 0),
set = function(self, val) self:SetLightDirection(val.x, val.y, val.z) end,
get = function(self) return Position(self:GetLightDirection()) end,
}
UI.Property {
name = "CameraFieldOfView",
type = Number,
require = ModelScene,
default = 0.94,
set = function(self, val) self:SetCameraFieldOfView(val) end,
get = function(self) return self:GetCameraFieldOfView() end,
}
UI.Property {
name = "LightDiffuseColor",
type = ColorType,
require = ModelScene,
default = Color(0.8, 0.8, 0.64),
set = function(self, val) self:SetLightDiffuseColor(val.r, val.g, val.b) end,
get = function(self) return Color(self:GetLightDiffuseColor()) end,
}
UI.Property {
name = "LightVisible",
type = Number,
require = ModelScene,
default = true,
set = function(self, val) self:SetLightVisible(val) end,
get = function(self) return self:IsLightVisible() end,
}
end
------------------------------------------------------------
-- DressUpModel --
------------------------------------------------------------
do
--- Whether auto dress
UI.Property {
name = "AutoDress",
type = Boolean,
require = DressUpModel,
default = true,
set = function(self, val) self:SetAutoDress(val) end,
get = function(self) return self:GetAutoDress() end,
}
--- Whether sheathed the weapon
UI.Property {
name = "Sheathed",
type = Boolean,
require = DressUpModel,
default = false,
set = function(self, val) self:SetSheathed(val) end,
get = function(self) return self:GetSheathed() end,
}
--- Whether use transmog skin
UI.Property {
name = "UseTransmogSkin",
type = Boolean,
require = DressUpModel,
default = false,
set = function(self, val) self:SetUseTransmogSkin(val) end,
get = function(self) return self:GetUseTransmogSkin() end,
}
end
------------------------------------------------------------
-- Useful Child Properties --
------------------------------------------------------------
do
-- The left background texture
UI.Property {
name = "LeftBGTexture",
require = Frame,
childtype = Texture,
}
-- The right background texture
UI.Property {
name = "RightBGTexture",
require = Frame,
childtype = Texture,
}
-- The middle background texture
UI.Property {
name = "MiddleBGTexture",
require = Frame,
childtype = Texture,
}
-- The top left background texture
UI.Property {
name = "TopLeftBGTexture",
require = Frame,
childtype = Texture,
}
-- The top right background texture
UI.Property {
name = "TopRightBGTexture",
require = Frame,
childtype = Texture,
}
-- The top background texture
UI.Property {
name = "TopBGTexture",
require = Frame,
childtype = Texture,
}
-- The bottom left background texture
UI.Property {
name = "BottomLeftBGTexture",
require = Frame,
childtype = Texture,
}
-- The bottom right background texture
UI.Property {
name = "BottomRightBGTexture",
require = Frame,
childtype = Texture,
}
-- The bottom background texture
UI.Property {
name = "BottomBGTexture",
require = Frame,
childtype = Texture,
}
-- The background texture
UI.Property {
name = "BackgroundTexture",
require = Frame,
childtype = Texture,
}
-- The icon texture
UI.Property {
name = "IconTexture",
require = Frame,
childtype = Texture,
}
-- The background frame
UI.Property {
name = "BackgroundFrame",
require = Frame,
childtype = Frame,
}
UI.Property {
name = "IconFrame",
require = Frame,
childtype = Frame,
}
end
------------------------------------------------------------
-- Useful Child Properties - Animation --
------------------------------------------------------------
do
--- The animation group
UI.Property {
name = "AnimationGroup",
require = LayoutFrame,
childtype = AnimationGroup,
}
UI.Property {
name = "AnimationGroupIn",
require = LayoutFrame,
childtype = AnimationGroup,
}
UI.Property {
name = "AnimationGroupOut",
require = LayoutFrame,
childtype = AnimationGroup,
}
--- The animations
for i = 0, 3 do
UI.Property {
name = "Alpha" .. (i == 0 and "" or i),
require = AnimationGroup,
childtype = Alpha,
}
UI.Property {
name = "Path" .. (i == 0 and "" or i),
require = AnimationGroup,
childtype = Path,
}
UI.Property {
name = "ControlPoint" .. (i == 0 and "" or i),
require = AnimationGroup,
childtype = ControlPoint,
}
UI.Property {
name = "Rotation" .. (i == 0 and "" or i),
require = AnimationGroup,
childtype = Rotation,
}
UI.Property {
name = "Scale" .. (i == 0 and "" or i),
require = AnimationGroup,
childtype = Scale,
}
UI.Property {
name = "LineScale" .. (i == 0 and "" or i),
require = AnimationGroup,
childtype = LineScale,
}
UI.Property {
name = "Translation" .. (i == 0 and "" or i),
require = AnimationGroup,
childtype = Translation,
}
UI.Property {
name = "LineTranslation" .. (i == 0 and "" or i),
require = AnimationGroup,
childtype = LineTranslation,
}
end
end
------------------------------------------------------------
-- Label Widget --
------------------------------------------------------------
__Sealed__()
__ChildProperty__(Frame, "Label")
__ChildProperty__(Frame, "Label1")
__ChildProperty__(Frame, "Label2")
__ChildProperty__(Frame, "Label3")
class "UIPanelLabel" { FontString }
Style.UpdateSkin("Default", {
[UIPanelLabel] = {
drawLayer = "BACKGROUND",
fontObject = GameFontHighlight,
justifyH = "RIGHT",
},
})
------------------------------------------------------------
-- Backdrop Properties --
------------------------------------------------------------
if Frame.SetBackdrop then -- For 8.0 and classic
--- the backdrop graphic for the frame
UI.Property {
name = "Backdrop",
type = BackdropType,
require = Frame,
nilable = true,
set = function(self, val) self:SetBackdrop(val or nil) end,
get = function(self) return self:GetBackdrop() end,
}
--- the shading color for the frame's border graphic
UI.Property {
name = "BackdropBorderColor",
type = ColorType,
require = Frame,
default = Color.TRANSPARENT,
set = function(self, val) self:SetBackdropBorderColor(val.r, val.g, val.b, val.a) end,
get = function(self) local r, g, b, a = self:GetBackdropBorderColor() if r then return Color(r, g, b, a) end end,
depends = { "Backdrop" },
}
--- the shading color for the frame's background graphic
UI.Property {
name = "BackdropColor",
type = ColorType,
require = Frame,
default = Color.TRANSPARENT,
set = function(self, val) self:SetBackdropColor(val.r, val.g, val.b, val.a) end,
get = function(self) local r, g, b, a = self:GetBackdropColor() if r then return Color(r, g, b, a) end end,
depends = { "Backdrop" },
}
else -- For 9.0
local clone = Toolset.clone
local getPropertyChild = UIObject.GetPropertyChild
local coordStart = 0.0625
local coordEnd = 1 - coordStart
local textureUVs = {
BackdropTopLeft = { setWidth = true, setHeight = true, ULx = 0.5078125, ULy = coordStart, LLx = 0.5078125, LLy = coordEnd, URx = 0.6171875, URy = coordStart, LRx = 0.6171875, LRy = coordEnd, anchors = { Anchor("TOPLEFT") } },
BackdropTopRight = { setWidth = true, setHeight = true, ULx = 0.6328125, ULy = coordStart, LLx = 0.6328125, LLy = coordEnd, URx = 0.7421875, URy = coordStart, LRx = 0.7421875, LRy = coordEnd, anchors = { Anchor("TOPRIGHT") } },
BackdropBottomLeft = { setWidth = true, setHeight = true, ULx = 0.7578125, ULy = coordStart, LLx = 0.7578125, LLy = coordEnd, URx = 0.8671875, URy = coordStart, LRx = 0.8671875, LRy = coordEnd, anchors = { Anchor("BOTTOMLEFT") } },
BackdropBottomRight = { setWidth = true, setHeight = true, ULx = 0.8828125, ULy = coordStart, LLx = 0.8828125, LLy = coordEnd, URx = 0.9921875, URy = coordStart, LRx = 0.9921875, LRy = coordEnd, anchors = { Anchor("BOTTOMRIGHT") } },
BackdropTop = { setWidth = false,setHeight = true, ULx = 0.2578125, ULy = "repeatX", LLx = 0.3671875, LLy = "repeatX", URx = 0.2578125, URy = coordStart, LRx = 0.3671875, LRy = coordStart, anchors = { Anchor("TOPLEFT", 0, 0, "BackdropTopLeft", "TOPRIGHT"), Anchor("TOPRIGHT", 0, 0, "BackdropTopRight", "TOPLEFT") } },
BackdropBottom = { setWidth = false,setHeight = true, ULx = 0.3828125, ULy = "repeatX", LLx = 0.4921875, LLy = "repeatX", URx = 0.3828125, URy = coordStart, LRx = 0.4921875, LRy = coordStart, anchors = { Anchor("BOTTOMLEFT", 0, 0, "BackdropBottomLeft", "BOTTOMRIGHT"), Anchor("BOTTOMRIGHT", 0, 0, "BackdropBottomRight", "BOTTOMLEFT") } },
BackdropLeft = { setWidth = true, setHeight = false,ULx = 0.0078125, ULy = coordStart, LLx = 0.0078125, LLy = "repeatY", URx = 0.1171875, URy = coordStart, LRx = 0.1171875, LRy = "repeatY", anchors = { Anchor("TOPLEFT", 0, 0, "BackdropTopLeft", "BOTTOMLEFT"), Anchor("BOTTOMLEFT", 0, 0, "BackdropBottomLeft", "TOPLEFT") } },
BackdropRight = { setWidth = true, setHeight = false,ULx = 0.1328125, ULy = coordStart, LLx = 0.1328125, LLy = "repeatY", URx = 0.2421875, URy = coordStart, LRx = 0.2421875, LRy = "repeatY", anchors = { Anchor("TOPRIGHT", 0, 0, "BackdropTopRight", "BOTTOMRIGHT"), Anchor("BOTTOMRIGHT", 0, 0, "BackdropBottomRight", "TOPRIGHT") } },
BackdropCenter = { setWidth = false,setHeight = false,ULx = 0, ULy = 0, LLx = 0, LLy = "repeatY", URx = "repeatX", URy = 0, LRx = "repeatX", LRy = "repeatY" },
}
local defaultEdgeSize = 39 -- the old default
for name in pairs(textureUVs) do
UI.Property {
name = name,
require = Frame,
childtype = Texture,
}
end
local backdropHookded = Toolset.newtable(true)
local backdropInfo = Toolset.newtable(true)
local backdropColor = Toolset.newtable(true)
local backdropBrdColor = Toolset.newtable(true)
local backdropBrdBlend = Toolset.newtable(true)
local function getCoordValue(coord, pieceSetup, repeatX, repeatY)
local value = textureUVs[pieceSetup][coord]
if value == "repeatX" then
return repeatX
elseif value == "repeatY" then
return repeatY
else
return value
end
end
local function setupCoordinates(pieceSetup, repeatX, repeatY)
return getCoordValue("ULx", pieceSetup, repeatX, repeatY), getCoordValue("ULy", pieceSetup, repeatX, repeatY),
getCoordValue("LLx", pieceSetup, repeatX, repeatY), getCoordValue("LLy", pieceSetup, repeatX, repeatY),
getCoordValue("URx", pieceSetup, repeatX, repeatY), getCoordValue("URy", pieceSetup, repeatX, repeatY),
getCoordValue("LRx", pieceSetup, repeatX, repeatY), getCoordValue("LRy", pieceSetup, repeatX, repeatY)
end
local function applyTextureCoords(self)
local backdrop = backdropInfo[self[0]]
if not backdrop then return end
local width = self:GetWidth()
local height = self:GetHeight()
local effectiveScale = self:GetEffectiveScale()
local edgeSize = backdrop.edgeSize or defaultEdgeSize
local edgeRepeatX = edgeSize > 0 and max(0, (width / edgeSize) * effectiveScale - 2 - coordStart) or 1
local edgeRepeatY = edgeSize > 0 and max(0, (height / edgeSize) * effectiveScale - 2 - coordStart) or 1
local repeatX = 1
local repeatY = 1
if backdrop.tile then
local divisor = backdrop.tileSize
if not divisor or divisor == 0 then
divisor = edgeSize
end
if divisor ~= 0 then
repeatX = (width / divisor) * effectiveScale
repeatY = (height / divisor) * effectiveScale
end
end
for name in pairs(textureUVs) do
local texture = getPropertyChild(self, name)
if texture then
if texture == "BackdropCenter" then
texture:SetTexCoord(setupCoordinates("BackdropCenter", repeatX, repeatY))
else
texture:SetTexCoord(setupCoordinates(name, edgeRepeatX, edgeRepeatY))
end
end
end
end
local function applyBackdrop(self)
local backdrop = backdropInfo[self[0]]
if backdrop == false then
backdropInfo[self[0]] = nil
-- Clear the backdrop settings
if getPropertyChild(self, "BackdropTopLeft") then
for name in pairs(textureUVs) do
local texture = getPropertyChild(self, name)
if texture then
-- Not using the style to reduce the cost for dynamic settings
texture:ClearAllPoints()
texture:SetDrawLayer("ARTWORK")
texture:SetBlendMode("ADD")
texture:SetTexCoord(0, 1, 0, 1)
texture:SetTexture(nil)
texture:SetVertexColor(1, 1, 1)
end
end
Style[self] = {
BackdropTopLeft = NIL,
BackdropTopRight = NIL,
BackdropBottomLeft = NIL,
BackdropBottomRight = NIL,
BackdropTop = NIL,
BackdropBottom = NIL,
BackdropLeft = NIL,
BackdropRight = NIL,
BackdropCenter = NIL,
}
end
elseif backdrop then
local x, y, x1, y1 = 0, 0, 0, 0
local edgeSize = backdrop.edgeSize or defaultEdgeSize
if backdrop.bgFile then
x = -edgeSize
y = edgeSize
x1 = edgeSize
y1 = -edgeSize
if backdrop.insets then
x = x + (backdrop.insets.left or 0)
y = y - (backdrop.insets.top or 0)
x1 = x1 - (backdrop.insets.right or 0)
y1 = y1 + (backdrop.insets.bottom or 0)
end
end
local tileWrapMode = backdrop.tile and "REPEAT" or nil
local edgeWrapMode = backdrop.tileEdge ~= false and "REPEAT" or nil
for name, set in pairs(textureUVs) do
getPropertyChild(self, name, true)
end
for name, set in pairs(textureUVs) do
local texture = getPropertyChild(self, name)
texture:SetSnapToPixelGrid(false)
texture:SetTexelSnappingBias(0)
if name == "BackdropCenter" then
texture:SetDrawLayer("BACKGROUND")
texture:SetTexture(backdrop.bgFile, tileWrapMode, tileWrapMode)
texture:SetLocation{
Anchor("TOPLEFT", x, y, "BackdropTopLeft", "BOTTOMRIGHT"),
Anchor("BOTTOMRIGHT", x1, y1, "BackdropBottomRight", "TOPLEFT"),
}
else
texture:SetDrawLayer("BORDER")
texture:SetTexture(backdrop.edgeFile, edgeWrapMode, edgeWrapMode)
texture:SetLocation(set.anchors)
if set.setWidth then texture:SetWidth(edgeSize) end
if set.setHeight then texture:SetHeight(edgeSize) end
end
end
return applyTextureCoords(self)
end
end
local function applyBackdropColor(self)
local texture = getPropertyChild(self, "BackdropCenter")
local color = backdropColor[self[0]] or Color.WHITE
if texture then
texture:SetVertexColor(color.r, color.g, color.b, color.a)
end
end
local function applyBackdropBorderColor(self)
local color = backdropBrdColor[self[0]] or Color.WHITE
for name in pairs(textureUVs) do
if name ~= "BackdropCenter" then
local texture = getPropertyChild(self, name)
if texture then
texture:SetVertexColor(color.r, color.g, color.b, color.a)
end
end
end
end
local function applyBackdropBorderBlendMode(self)
local alphaMode = backdropBrdBlend[self[0]] or "ADD"
for name in pairs(textureUVs) do
if name ~= "BackdropCenter" then
local texture = getPropertyChild(self, name)
if texture then
texture:SetBlendMode(alphaMode)
end
end
end
end
--- the backdrop graphic for the frame
UI.Property {
name = "Backdrop",
type = BackdropType,
require = Frame,
nilable = true,
set = function(self, val)
if val and (val.edgeFile or val.bgFile) then
backdropInfo[self[0]] = clone(val, true)
if not backdropHookded[self[0]] then
backdropHookded[self[0]] = true
self:HookScript("OnSizeChanged", applyTextureCoords)
end
elseif backdropInfo[self[0]] then
backdropInfo[self[0]] = false
end
return applyBackdrop(self)
end,
get = function(self)
return clone(backdropInfo[self[0]], true)
end,
}
--- the shading color for the frame's border graphic
UI.Property {
name = "BackdropBorderColor",
type = ColorType,
require = Frame,
default = Color.WHITE,
set = function(self, val)
local color = backdropBrdColor[self[0]]
if not color then
backdropBrdColor[self[0]] = val and Color(val.r, val.g, val.b, val.a)
else
color.r = val.r
color.g = val.g
color.b = val.b
color.a = val.a
end
return applyBackdropBorderColor(self)
end,
get = function(self)
local color = backdropBrdColor[self[0]]
return color and Color(color.r, color.g, color.b, color.a)
end,
depends = { "Backdrop" },
}
--- the shading color for the frame's background graphic
UI.Property {
name = "BackdropColor",
type = ColorType,
require = Frame,
default = Color.WHITE,
set = function(self, val)
local color = backdropColor[self[0]]
if not color then
backdropColor[self[0]] = val and Color(val.r, val.g, val.b, val.a)
else
color.r = val.r
color.g = val.g
color.b = val.b
color.a = val.a
end
return applyBackdropColor(self)
end,
get = function(self)
local color = backdropColor[self[0]]
return color and Color(color.r, color.g, color.b, color.a)
end,
depends = { "Backdrop" },
}
--- The blend mode of the backdrop border
UI.Property {
name = "BackdropBorderBlendMode",
type = AlphaMode,
require = Frame,
default = "ADD",
set = function(self, val)
if backdropInfo[self[0]] then
backdropBrdBlend[self[0]] = val
else
backdropBrdBlend[self[0]] = nil
end
return applyBackdropBorderBlendMode(self)
end,
get = function(self)
return backdropBrdBlend[self[0]]
end,
depends = { "Backdrop" },
}
end