feat: Added quad-custom property tweening (such as roundSize,paddingAllOffset and so on)

class.lua
  Added getProperty method that allow user to get custom property value. this method is used on atween
  Refactored setProperty method
  Now register:tween{} can add Ended, OnStepped. argments are same with atween but added item(pointing it self) as first argment

round.lua
  Added getRound, getOutline method, this method is used on getProperty

atween/index.lua
  Added Setter,Getter option on runTween/s
This commit is contained in:
Qwreey 2022-12-19 02:54:30 +09:00
parent 39f9d8c972
commit e10170958a
4 changed files with 115 additions and 42 deletions

0
README.md Normal file
View file

View file

@ -26,37 +26,67 @@ function module.init(shared)
local round = shared.round; ---@module "src.libs.round"
local function InstanceNewWithName(classname,parent,name)
local item = InstanceNew(classname,parent)
item.Name = name
return item
local item = InstanceNew(classname,parent);
item.Name = name;
return item;
end
-- TODO: refactor getProperty
-- local propertyGetterRaw = {}
-- local propertySetterRaw = {}
local function getProperty(item,index,ClassName)
if type(item) == "table" then return item[index]; end
ClassName = ClassName or item.ClassName;
local isImage = (ClassName == "ImageLabel" or ClassName == "ImageButton");
if (index == "RoundSize" or index == "roundSize") and isImage then
if not round then
error("module 'round' needs to be loaded for get image round size but it is not found on 'src.libs'. you should adding that to src.libs directory");
end
return round.getRound(item);
elseif index == "UiRoundSize" or index == "uiRoundSize" or index == "UIRoundSize" then
local target = (ClassName == "UICorner" and item) or item:FindFirstChildOfClass("UICorner");
return (target and target.CornerRadius.Offset) or 0;
elseif index == "PaddingAll" or index == "paddingAll" then
local target = (ClassName == "UIPadding" and item) or item:FindFirstChildOfClass("UIPadding");
return (target and target.PaddingLeft) or UDim.new(0,0);
elseif index == "PaddingAllOffset" or index == "paddingAllOffset" then
local target = (ClassName == "UIPadding" and item) or item:FindFirstChildOfClass("UIPadding");
return (target and target.PaddingLeft.Offset) or 0;
elseif index == "Scale" then
local target = (ClassName == "UIScale" and item) or item:FindFirstChildOfClass("UIScale");
return (target and target.Scale) or 1;
end
return item[index];
end
local function setProperty(item,index,value,ClassName)
if type(item) == "table" then item[index] = value; return; end
ClassName = ClassName or item.ClassName;
local isImage = (ClassName == "ImageLabel" or ClassName == "ImageButton");
if (index == "roundSize" or index == "RoundSize") and isImage then
if (index == "RoundSize" or index == "roundSize") and isImage then
if not round then
warn "module 'round' needs to be loaded for set images round size but it is not found on 'src.libs'. you should adding that to src.libs directory"
error("module 'round' needs to be loaded for set image round size but it is not found on 'src.libs'. you should adding that to src.libs directory");
end
round.setRound(item,value);
elseif index == "uiRoundSize" or index == "UIRoundSize" then
local uiCorner = item:FindFirstChildOfClass("UICorner") or InstanceNewWithName("UICorner",item,"_quad_round");
elseif index == "UiRoundSize" or index == "uiRoundSize" or index == "UIRoundSize" then
local uiCorner = (ClassName == "UICorner" and item) or item:FindFirstChildOfClass("UICorner") or InstanceNewWithName("UICorner",item,"_quad_round");
uiCorner.CornerRadius = UDim.new(0,value);
elseif index == "PaddingAll" or index == "paddingAll" then
local target = ClassName == "UIPadding" and item or (item:FindFirstChildOfClass("UIPadding") or InstanceNewWithName("UIPadding",item,"_quad_padding"));
local target = (ClassName == "UIPadding" and item) or item:FindFirstChildOfClass("UIPadding") or InstanceNewWithName("UIPadding",item,"_quad_padding");
target.PaddingLeft = value;
target.PaddingRight = value;
target.PaddingTop = value;
target.PaddingBottom = value;
elseif index == "PaddingAllOffset" or index == "PaddingAllOffset" then
local target = ClassName == "UIPadding" and item or (item:FindFirstChildOfClass("UIPadding") or InstanceNewWithName("UIPadding",item,"_quad_padding"));
elseif index == "PaddingAllOffset" or index == "paddingAllOffset" then
local target = (ClassName == "UIPadding" and item) or item:FindFirstChildOfClass("UIPadding") or InstanceNewWithName("UIPadding",item,"_quad_padding");
local padding = UDim.new(0,value);
target.PaddingLeft = padding;
target.PaddingRight = padding;
target.PaddingTop = padding;
target.PaddingBottom = padding;
elseif index == "Scale" then
local target = ClassName == "UIScale" and item or (item:FindFirstChildOfClass("UIScale") or InstanceNewWithName("UIScale",item,"_quad_scale"));
local target = (ClassName == "UIScale" and item) or item:FindFirstChildOfClass("UIScale") or InstanceNewWithName("UIScale",item,"_quad_scale");
target.Scale = value;
else
item[index] = value; -- set property
@ -156,7 +186,18 @@ function module.init(shared)
if not advancedTween then
return warn "module 'AdvancedTween' needs to be loaded for tween properties but it is not found on 'src.libs'. you should adding that to src.libs directory";
end
advancedTween.RunTween(item,tween,{[index] = newValue});
local ended, onStepped;
if tween.Ended then
ended = function (...)
tween.Ended(item,...);
end
end
if tween.OnStepped then
onStepped = function (...)
tween.OnStepped(item,...);
end
end
advancedTween.RunTween(item,tween,{[index] = newValue},ended,onStepped,setProperty,getProperty);
else
setProperty(item,index,newValue,ClassName);
end

View file

@ -64,12 +64,20 @@ local DefaultItems = {
-- 예전 값,목표 값,알파를 주고 각각 해당하는 속성에 입력해줌
-- 기본적으로 모든 속성값 적용은 여기에서 이루워짐
function LerpProperties(Item,Old,New,Alpha)
function LerpProperties(Item,Old,New,Alpha,Setter)
for Property,OldValue in pairs(Old) do
local NewValue = New[Property]
if NewValue ~= nil then
local Type = type(OldValue)
if DefaultItems[Type] then
local Value
if Type ~= type(NewValue) then
error(
("Unable to lerp property '%s' of '%s' due to type invalid. Old value type is '%s'. but New value type is '%s'")
:format(
tostring(Type),
tostring(type(NewValue))
)
)
elseif DefaultItems[Type] then
Item[Property] = Lerp(OldValue,NewValue,Alpha)
elseif Type == "UDim2" then
Item[Property] = UDim2.new(
@ -89,10 +97,24 @@ function LerpProperties(Item,Old,New,Alpha)
Lerp(OldValue.g*255,NewValue.g*255),
Lerp(OldValue.b*255,NewValue.b*255)
)
else
error(
("Unable to lerp property '%s' of '%s'. Old value type is '%s'. but tweenable types are UDim2, UDim, Color3, Vector2, Vector3, CFrame, number only")
:format(
tostring(Property),
tostring(Item),
tostring(Type)
)
)
end
if Setter then
Setter(Item,Property,NewValue)
else
Item[Property] = Value
end
end
end
module.LerpProperties = LerpProperties
------------------------------------
-- 모듈 함수 지정
@ -108,9 +130,9 @@ end
--해당 함수가 실행됨
--Properties : 트윈할 속성과 목표값 예시 :
--Data.Properties.Position = UDim2.new(1,0,1,0) 처럼 하면 Position 속성의 목표를 1,0,1,0 으로 지정
function module.RunTween(Item,Data,Properties,Ended,OnStepped,_)
function module.RunTween(Item,Data,Properties,Ended,OnStepped,Setter,Getter,_)
-- remove self
if Item == module then Item = Data; Data = Properties; Properties = Ended; Ended = OnStepped; OnStepped = _; end
if Item == module then Item = Data; Data = Properties; Properties = Ended; Ended = OnStepped; OnStepped = Setter; Setter = Getter; Getter = _; end
-- 시간 저장
local Time = Data.Time or 1
@ -124,7 +146,11 @@ function module.RunTween(Item,Data,Properties,Ended,OnStepped,_)
local NowAnimationIndex = {}
local LastProperties = {}
for Property,_ in pairs(Properties) do
if Getter then
LastProperties[Property] = Getter(Property)
else
LastProperties[Property] = Item[Property]
end
ThisPlayIndex[Property] = ThisPlayIndex[Property] ~= nil and ThisPlayIndex[Property] + 1 or 1
NowAnimationIndex[Property] = ThisPlayIndex[Property]
end
@ -168,7 +194,8 @@ function module.RunTween(Item,Data,Properties,Ended,OnStepped,_)
Item,
LastProperties,
Properties,
Alpha
Alpha,
Setter
)
-- 다른 트윈이 속성을 바꾸고 있다면(이후 트윈이) 그 속성을 건들지 않도록 없엠
@ -240,11 +267,11 @@ function module.RunTween(Item,Data,Properties,Ended,OnStepped,_)
end
-- 여러개의 개체를 트윈시킴
function module.RunTweens(Items,Data,Properties,Ended,OnStepped,_)
function module.RunTweens(Items,Data,Properties,Ended,OnStepped,Setter,Getter,_)
-- remove self
if Items == module then Items = Data; Data = Properties; Properties = Ended; Ended = OnStepped; OnStepped = _; end
if Items == module then Items = Data; Data = Properties; Properties = Ended; Ended = OnStepped; OnStepped = Setter; Setter = Getter; Getter = _; end
for _,Item in pairs(Items) do
module.RunTween(Item,Data,Properties,Ended,OnStepped)
module.RunTween(Item,Data,Properties,Ended,OnStepped,Setter,Getter)
end
end

View file

@ -25,6 +25,11 @@ function round.setOutline(ImageFrame,RoundSize)
ImageFrame.SliceScale = outlineSliceScale * RoundSize;
return ImageFrame;
end
function round.getRound(ImageFrame)
return ImageFrame.SliceScale / roundSliceScale;
end
function round.getOutline(ImageFrame)
return ImageFrame.SliceScale / outlineSliceScale;
end
return round;