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.
217 lines
6.9 KiB
217 lines
6.9 KiB
-- ========================================================================= --
|
|
-- SylingTracker --
|
|
-- https://www.curseforge.com/wow/addons/sylingtracker --
|
|
-- --
|
|
-- Repository: --
|
|
-- https://github.com/Skamer/SylingTracker --
|
|
-- --
|
|
-- ========================================================================= --
|
|
Syling "SylingTracker.Core.IView" ""
|
|
-- ========================================================================= --
|
|
namespace "SLT"
|
|
-- ========================================================================= --
|
|
Linear = Utils.Math.Linear
|
|
|
|
_AnimationMethods = {
|
|
["Linear"] = Linear,
|
|
["QuadraticEaseIn"] = Utils.Math.QuadraticEaseIn,
|
|
["QuadraticEaseOut"] = Utils.Math.QuadracticEaseInout,
|
|
["QuadracticEaseInout"] = Utils.Math.QuadracticEaseInout,
|
|
["ExponentialEaseIn"] = Utils.Math.ExponentialEaseIn,
|
|
["ExponentialEaseOut"] = Utils.Math.ExponentialEaseOut,
|
|
["ExponentialEaseInOut"] = Utils.Math.ExponentialEaseInOut
|
|
}
|
|
|
|
|
|
interface "IView" (function(_ENV)
|
|
-----------------------------------------------------------------------------
|
|
-- Methods --
|
|
-----------------------------------------------------------------------------
|
|
-- This is important to not redefine this method,
|
|
-- use "OnUpdate" for updating your view.
|
|
function UpdateView(self, data, updater)
|
|
if self.HookData then
|
|
local modifyData = self:HookData(data, updater)
|
|
self:OnViewUpdate(modifyData, updater)
|
|
else
|
|
self:OnViewUpdate(data, updater)
|
|
end
|
|
end
|
|
|
|
-- You need redefine its function for handling the stuffs for your views
|
|
-- when updated.
|
|
-- REVIEW: Probably add an content id (e.g, quest, scenario) as arguement ?
|
|
function OnViewUpdate(self, data, updater) end
|
|
|
|
|
|
--- This is helper function you can use.
|
|
-- Redefine this function in putting your logic to recompute the height frame.
|
|
-- I advise you to not call directly this function, but instead to use "AdjustHeight"
|
|
function OnAdjustHeight(self, useAnimation) end
|
|
|
|
|
|
--- This is helper function will call "OnAdjustHeight".
|
|
--- This is safe to call it multiple time in short time, resulting only a one
|
|
--- call of "OnAdjustHeight"
|
|
function AdjustHeight(self, useAnimation)
|
|
self._useAnimation = useAnimation
|
|
if not self._pendingAdjustHeight then
|
|
self._pendingAdjustHeight = true
|
|
|
|
Scorpio.Delay(0.1, function()
|
|
local aborted = false
|
|
if self._cancelAdjustHeight then
|
|
aborted = self._cancelAdjustHeight
|
|
end
|
|
|
|
if not aborted then
|
|
self:OnAdjustHeight(self._useAnimation)
|
|
end
|
|
|
|
self._pendingAdjustHeight = nil
|
|
self._cancelAdjustHeight = nil
|
|
self._useAnimation = nil
|
|
end)
|
|
end
|
|
end
|
|
|
|
|
|
-- __Async__()
|
|
-- function AdjustHeight(self, useAnimation)
|
|
-- self._useAnimation = useAnimation
|
|
-- if self._pendingAjustHeight then
|
|
-- return
|
|
-- end
|
|
|
|
-- self._pendingAdjustHeight = true
|
|
|
|
-- Delay(0.1)
|
|
|
|
-- local aborted = false
|
|
-- if self._cancelAdjustHeight then
|
|
-- aborted = self._cancelAdjustHeight
|
|
-- end
|
|
|
|
-- if not aborted then
|
|
-- self:OnAdjustHeight(self._useAnimation)
|
|
-- end
|
|
|
|
-- self._pendingAdjustHeight = nil
|
|
-- self._cancelAdjustHeight = nil
|
|
-- self._useAnimation = nil
|
|
-- end
|
|
|
|
|
|
function ForceAdjustHeight(self, useAnimation)
|
|
self:CancelAdjustHeight()
|
|
self:CancelAnimatingHeight()
|
|
self:OnAdjustHeight(useAnimation)
|
|
end
|
|
|
|
__Async__() function SetAnimatedHeight(self, height, info)
|
|
-- If it's currently animated, cancel it
|
|
if self.__animatingHeight then
|
|
self.__cancelAnimatingHeight = true
|
|
|
|
-- We need to wait the next update for avoiding to cancel the new
|
|
-- animation
|
|
Next()
|
|
end
|
|
|
|
local duration = self.AnimationInfo and self.AnimationInfo.duration or 1
|
|
local method = self.AnimationInfo and self.AnimationInfo.method or "Linear"
|
|
local start = GetTime()
|
|
local target = start + duration
|
|
local startHeight = self:GetHeight()
|
|
self.__animatingHeight = true
|
|
|
|
if info then
|
|
if info.duration then
|
|
duration = info.duration
|
|
end
|
|
|
|
if info.method then
|
|
method = info.method
|
|
end
|
|
end
|
|
|
|
local methodFunc = _AnimationMethods[method]
|
|
if not methodFunc then
|
|
methodFunc = Linear
|
|
end
|
|
|
|
while GetTime() <= target and not self.__cancelAnimatingHeight do
|
|
local current = GetTime()
|
|
-- local ratio = (current - start) / (target - start)
|
|
-- PixelUtil.SetHeight(self, methodFunc(current - start, startHeight, height - startHeight, duration))
|
|
-- self:SetHeight(Round(methodFunc(current - start, startHeight, height - startHeight, duration)))
|
|
PixelUtil.SetHeight(self, methodFunc(current - start, startHeight, height - startHeight, duration))
|
|
Next()
|
|
end
|
|
|
|
if not self.__cancelAnimatingHeight then
|
|
self:SetHeight(height)
|
|
-- PixelUtil.SetHeight(self, height)
|
|
end
|
|
|
|
self.__cancelAnimatingHeight = nil
|
|
self.__animatingHeight = nil
|
|
end
|
|
|
|
function CancelAnimatingHeight(self)
|
|
if self.__animatingHeight then
|
|
self.__cancelAnimatingHeight = true
|
|
end
|
|
end
|
|
|
|
|
|
|
|
--- Cancel the "OnAdjustHeight" call if there is one in queue.
|
|
--- You probably do when the obj is releasing.
|
|
function CancelAdjustHeight(self)
|
|
if self._pendingAdjustHeight then
|
|
self._cancelAdjustHeight = true
|
|
end
|
|
end
|
|
-----------------------------------------------------------------------------
|
|
-- Properties --
|
|
-----------------------------------------------------------------------------
|
|
--- Indicate to view holder, in which order this should be displayed.
|
|
--- NOTE: The holder may ignore this property, and follow its own order system
|
|
property "Order" {
|
|
type = Number,
|
|
default = 100,
|
|
event = "OnOrderChanged"
|
|
}
|
|
|
|
--- The ID of view
|
|
--- REVIEW: Check if this property may have some usefull stuff.
|
|
property "ID" {
|
|
type = String
|
|
}
|
|
|
|
-- The name of view
|
|
--- REVIEW: Same thing as ID
|
|
property "Name" {
|
|
type = String
|
|
}
|
|
|
|
--- Indicate to view holder, if this view is active.
|
|
--- NOTE: The holder is free to not respect this property, and follow its own
|
|
--- active system
|
|
property "Active" {
|
|
type = Boolean,
|
|
default = true,
|
|
event = "OnActiveChanged"
|
|
}
|
|
|
|
property "ShouldBeDisplayed" {
|
|
type = Boolean,
|
|
default = true,
|
|
event = "OnShouldBeDisplayedChanged"
|
|
}
|
|
|
|
property "AnimationInfo" {
|
|
type = Table
|
|
}
|
|
end)
|