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.

653 lines
18 KiB

--========================================================--
-- Scorpio UI FrameWork --
-- --
-- Author : kurapica125@outlook.com --
-- Create Date : 2016/12/27 --
--========================================================--
--========================================================--
Scorpio "Scorpio.UI" "1.0.0"
--========================================================--
----------------------------------------------
-- UI Core --
----------------------------------------------
__Sealed__() struct "Scorpio.UI" (function(_ENV)
----------------------------------------------
-- Predefined --
----------------------------------------------
class "UIObject" {}
----------------------------------------------
-- Static Methods --
----------------------------------------------
local _ProxyMap = setmetatable({}, META_WEAKALL)
local _RawUIMap = setmetatable({}, META_WEAKALL)
local isSubType = Class.IsSubType
local isClass = Class.Validate
--- Gets the raw ui of the given ui element, normally created by CreateFrame
__Static__() __Arguments__{ UI }
function GetRawUI(self)
return _RawUIMap[self[0]] or self
end
--- Gets the proxy ui of the given ui element, maybe the raw ui itself
__Static__() __Arguments__{ UI }
function GetProxyUI(self)
return _ProxyMap[self[0]] or self
end
--- Gets the wrapper ui of the given ui element
-- if the ui is generated from scorpio, itself will be returned
-- if not, a wrapper will be generated
__Static__() __Arguments__{ UI }
function GetWrapperUI(self)
local proxy = _ProxyMap[self[0]]
if proxy then return proxy end
if isClass(getmetatable(self)) then return self end
return UI[self:GetObjectType()](self)
end
--- Whether the two UI is the same
__Static__()
function IsSameUI(self, target)
return type(self) == "table" and type(target) == "table" and type(self[0]) == "userdata" and self[0] == target[0]
end
--- Registers the raw ui element
__Static__() __Arguments__{ UI }
function RegisterRawUI(self)
_RawUIMap[self[0]] = _RawUIMap[self[0]] or self
end
--- Registers the proxy ui element
__Static__() __Arguments__{ UI }
function RegisterProxyUI(self)
_ProxyMap[self[0]] = self
end
__Static__()
function IsUIObject(self)
return type(self) == "table" and type(self[0]) == "userdata"
end
__Static__()
function IsUIObjectType(cls)
return isSubType(cls, UIObject)
end
----------------------------------------------
-- Validator --
----------------------------------------------
function __valid(self, onlyvalid)
if not (type(self) == "table" and type(self[0]) == "userdata") then
return onlyvalid or "the %s must be a valid ui element"
end
end
end)
----------------------------------------------
-- System Prepare --
----------------------------------------------
Environment.RegisterGlobalNamespace("Scorpio.UI")
----------------------------------------------
-- Basic Features --
----------------------------------------------
namespace "Scorpio.UI"
----------------------------------------------
-- Enums(UI.xsd) --
----------------------------------------------
do
__Sealed__()
enum "FramePoint" {
"TOPLEFT",
"TOPRIGHT",
"BOTTOMLEFT",
"BOTTOMRIGHT",
"TOP",
"BOTTOM",
"LEFT",
"RIGHT",
"CENTER",
}
__Sealed__()
enum "FlyoutDirection" {
"UP",
"DOWN",
"LEFT",
"RIGHT",
}
__Sealed__()
enum "FrameStrata" {
"PARENT",
"BACKGROUND",
"LOW",
"MEDIUM",
"HIGH",
"DIALOG",
"FULLSCREEN",
"FULLSCREEN_DIALOG",
"TOOLTIP",
}
__Sealed__()
enum "DrawLayer" {
"BACKGROUND",
"BORDER",
"ARTWORK",
"OVERLAY",
"HIGHLIGHT",
}
__Sealed__() __Default__"ADD"
enum "AlphaMode" {
"DISABLE",
"BLEND",
"ALPHAKEY",
"ADD",
"MOD",
}
__Sealed__() __Default__"NONE"
enum "OutlineType" {
"NONE",
"NORMAL",
"THICK",
}
__Sealed__() __Default__ "MIDDLE"
enum "JustifyVType" {
"TOP",
"MIDDLE",
"BOTTOM",
}
__Sealed__() __Default__ "CENTER"
enum "JustifyHType" {
"LEFT",
"CENTER",
"RIGHT",
}
__Sealed__()
enum "InsertMode" {
"TOP",
"BOTTOM",
}
__Sealed__() __Default__ "HORIZONTAL"
enum "Orientation" {
"HORIZONTAL",
"VERTICAL",
}
__Sealed__()
enum "AttributeType" {
"nil",
"boolean",
"number",
"string",
}
__Sealed__()
enum "KeyValueType" {
"nil",
"boolean",
"number",
"string",
"global",
}
__Sealed__()
enum "ScriptInheritType" {
"prepend",
"append",
"none",
}
__Sealed__()
enum "ScriptIntrinsicOrderType" {
"precall",
"postcall",
"none",
}
__Sealed__()
enum "FontAlphabet" {
"roman",
"korean",
"simplifiedchinese",
"traditionalchinese",
"russian",
}
__Sealed__()
enum "WrapMode" {
"CLAMP",
"REPEAT",
"CLAMPTOBLACK",
"CLAMPTOBLACKADDITIVE",
"CLAMPTOWHITE",
"MIRROR",
}
__Sealed__()
enum "FilterMode" {
"LINEAR",
"TRILINEAR",
"NEAREST",
}
__Sealed__() __Default__"NONE"
enum "AnimLoopType" {
"NONE",
"REPEAT",
"BOUNCE",
}
__Sealed__() __Default__"NONE"
enum "AnimSmoothType" {
"NONE",
"IN",
"OUT",
"IN_OUT",
"OUT_IN",
}
__Sealed__() __Default__"NONE"
enum "AnimCurveType" {
"NONE",
"SMOOTH",
}
__Sealed__()
enum "AnchorType" {
"ANCHOR_TOPRIGHT",
"ANCHOR_RIGHT",
"ANCHOR_BOTTOMRIGHT",
"ANCHOR_TOPLEFT",
"ANCHOR_LEFT",
"ANCHOR_BOTTOMLEFT",
"ANCHOR_CURSOR",
"ANCHOR_PRESERVE",
"ANCHOR_NONE",
}
__Sealed__()
enum "ButtonStateType" {
"PUSHED",
"NORMAL",
}
__Sealed__()
enum "ButtonClickType" {
"LeftButtonUp",
"RightButtonUp",
"MiddleButtonUp",
"Button4Up",
"Button5Up",
"LeftButtonDown",
"RightButtonDown",
"MiddleButtonDown",
"Button4Down",
"Button5Down",
"AnyUp",
"AnyDown",
}
__Sealed__()
enum "VertexIndexType" {
UpperLeft = _G.UPPER_LEFT_VERTEX or 1,
LowerLeft = _G.LOWER_LEFT_VERTEX or 2,
UpperRight = _G.UPPER_RIGHT_VERTEX or 3,
LowerRight = _G.LOWER_RIGHT_VERTEX or 4,
}
__Sealed__() __Default__("STANDARD")
enum "FillStyle" {
"STANDARD",
"STANDARD_NO_RANGE_FILL",
"CENTER",
"REVERSE",
}
__Sealed__()
enum "ScriptsType" {
"OnLoad",
"OnAttributeChanged",
"OnSizeChanged",
"OnEvent",
"OnUpdate",
"OnShow",
"OnHide",
"OnEnter",
"OnLeave",
"OnMouseDown",
"OnMouseUp",
"OnMouseWheel",
"OnJoystickStickMotion", -- deprecated in 9.0
"OnJoystickAxisMotion", -- deprecated in 9.0
"OnJoystickButtonDown", -- deprecated in 9.0
"OnJoystickButtonUp", -- deprecated in 9.0
"OnJoystickHatMotion", -- deprecated in 9.0
"OnGamePadButtonDown",
"OnGamePadButtonUp",
"OnGamePadStick",
"OnDragStart",
"OnDragStop",
"OnReceiveDrag",
"PreClick",
"OnClick",
"PostClick",
"OnDoubleClick",
"OnValueChanged",
"OnMinMaxChanged",
"OnUpdateModel",
"OnModelLoaded",
"OnAnimFinished",
"OnEnterPressed",
"OnEscapePressed",
"OnSpacePressed",
"OnTabPressed",
"OnTextChanged",
"OnTextSet",
"OnCursorChanged",
"OnInputLanguageChanged",
"OnEditFocusGained",
"OnEditFocusLost",
"OnHorizontalScroll",
"OnVerticalScroll",
"OnScrollRangeChanged",
"OnCharComposition",
"OnChar",
"OnKeyDown",
"OnKeyUp",
"OnColorSelect",
"OnHyperlinkEnter",
"OnHyperlinkLeave",
"OnHyperlinkClick",
"OnMessageScrollChanged",
"OnMovieFinished",
"OnMovieShowSubtitle",
"OnMovieHideSubtitle",
"OnTooltipSetDefaultAnchor",
"OnTooltipCleared",
"OnTooltipAddMoney",
"OnTooltipSetUnit",
"OnTooltipSetItem",
"OnTooltipSetSpell",
"OnTooltipSetQuest",
"OnTooltipSetAchievement",
"OnTooltipSetFramestack",
"OnTooltipSetEquipmentSet",
"OnEnable",
"OnDisable",
"OnArrowPressed",
"OnExternalLink",
"OnButtonUpdate",
"OnError",
"OnDressModel",
"OnCooldownDone",
"OnPanFinished",
"OnUiMapChanged",
"OnRequestNewSize",
-- Animation
"OnPlay",
"OnPause",
"OnStop",
"OnFinished",
"OnLoop",
-- Actor
"OnModelLoading",
"OnModelLoaded",
"OnAnimFinished",
}
end
----------------------------------------------
-- Data Types(UI.xsd) --
----------------------------------------------
do
__Sealed__()
struct "AtlasType" {
{ name = "atlas", type = String },
{ name = "useAtlasSize",type = Boolean },
}
__Sealed__()
struct "AnimOrderType" {
__base = Integer,
function(val, onlyvalid) if (val < 1 or val > 100) then return onlyvalid or "the %s must between [1, 100]" end end
}
__Sealed__()
struct "Dimension" {
{ name = "x", type = Number },
{ name = "y", type = Number },
}
__Sealed__()
struct "Position" {
{ name = "x", type = Number },
{ name = "y", type = Number },
{ name = "z", type = Number },
}
__Sealed__()
struct "Size" {
{ name = "width", type = Number, require = true },
{ name = "height", type = Number, require = true },
}
__Sealed__()
struct "MinMax" {
{ name = "min", type = Number, require = true },
{ name = "max", type = Number, require = true },
function(val, onlyvalid)
return val.min > val.max and (onlyvalid or "%s.min can't be greater than %s.max") or nil
end,
}
__Sealed__()
struct "Inset" {
{ name = "left", type = Number },
{ name = "right", type = Number },
{ name = "top", type = Number },
{ name = "bottom", type = Number },
}
__Sealed__()
struct "GradientType" {
{ name = "orientation", type = Orientation },
{ name = "mincolor", type = ColorType },
{ name = "maxcolor", type = ColorType },
}
__Sealed__()
struct "AlphaGradientType" {
{ name = "start", type = Number },
{ name = "length", type = Number }
}
__Sealed__()
struct "FontType" {
{ name = "font", type = String },
{ name = "height", type = Number },
{ name = "outline", type = OutlineType },
{ name = "monochrome", type = Boolean },
}
__Sealed__()
struct "BackdropType" {
{ name = "bgFile", type = String },
{ name = "edgeFile", type = String },
{ name = "tile", type = Boolean },
{ name = "tileEdge", type = Boolean },
{ name = "tileSize", type = Number },
{ name = "edgeSize", type = Number },
{ name = "alphaMode", type = AlphaMode },
{ name = "insets", type = Inset },
}
__Sealed__()
struct "Anchor" {
{ name = "point", type = FramePoint, require = true },
{ name = "x", type = Number },
{ name = "y", type = Number },
{ name = "relativeTo", type = String },
{ name ="relativePoint",type = FramePoint },
}
__Sealed__()
struct "Anchors" { Anchor }
__Sealed__()
struct "RectType" {
{ name = "left", type = Number },
{ name = "right", type = Number },
{ name = "top", type = Number },
{ name = "bottom", type = Number },
{ name = "ULx", type = Number },
{ name = "ULy", type = Number },
{ name = "LLx", type = Number },
{ name = "LLy", type = Number },
{ name = "URx", type = Number },
{ name = "URy", type = Number },
{ name = "LRx", type = Number },
{ name = "LRy", type = Number },
}
__Sealed__()
struct "TexCoords" { RectType }
__Sealed__()
struct "AnimOriginType" {
{ name = "point", type = FramePoint, Default = "CENTER" },
{ name = "x", type = Number },
{ name = "y", type = Number },
}
__Sealed__()
struct "LightType" {
{ name = "enabled", type = Boolean },
{ name = "omni", type = Boolean },
{ name = "dir", type = Position },
{ name = "ambIntensity",type = ColorFloat },
{ name = "ambColor", type = ColorType },
{ name = "dirIntensity",type = ColorFloat },
{ name = "dirColor", type = ColorType },
}
__Sealed__()
struct "TextureType" {
{ name = "file", type = String + Number },
{ name = "color", type = ColorType },
}
__Sealed__()
struct "FadeoutOption" {
{ name = "duration", type = Number, require = true },
{ name = "delay", type = Number, default = 0 },
{ name = "start", type = Number, default = 1 },
{ name = "stop", type = Number, default = 0 },
{ name = "autohide", type = Boolean },
}
__Sealed__()
struct "AnimateTexCoords" {
{ name = "textureWidth",type = Number, require = true },
{ name ="textureHeight",type = Number, require = true },
{ name = "frameWidth", type = Number, require = true },
{ name = "frameHeight", type = Number, require = true },
{ name = "numFrames", type = Number, require = true },
{ name = "throttle", type = Number, require = true },
}
__Sealed__()
struct "PropertyAccessor" {
{ name = "set", type = Function, require = true },
{ name = "get", type = Any }
}
end
----------------------------------------------
-- Font --
----------------------------------------------
__Sealed__()
struct "FontObject" { function(val, onlyvalid) if not (type(val) == "table" and val.GetObjectType and val:GetObjectType() == "Font") then return onlyvalid or "the %s must a font object" end end }
--- The Font object is to be shared between other objects that share font characteristics
__Sealed__() __Final__()
class "Font" (function(_ENV)
----------------------------------------------
-- Methods --
----------------------------------------------
for name, method in pairs(getmetatable(_G.GameFontNormal).__index) do
_ENV[name] = method
end
----------------------------------------------
-- Constructor --
----------------------------------------------
__Arguments__{ NEString, FontType/nil }
function __new(_, name, font)
local self = CreateFont(name)
if font then
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
self:SetFont(font.font, font.height, flags)
end
return self, true
end
__Arguments__{ NEString, String, Number, OutlineType/nil, Boolean/nil }
function __new(_, name, font, height, outline, monochrome)
local self = CreateFont(name)
local flags
if outline then
if outline == "NORMAL" then
flags = "OUTLINE"
elseif outline == "THICK" then
flags = "THICKOUTLINE"
end
end
if monochrome then
if flags then
flags = flags..",MONOCHROME"
else
flags = "MONOCHROME"
end
end
self:SetFont(font, height, flags)
return self, true
end
end)