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
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)
|
|
|