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.
127 lines
3.2 KiB
127 lines
3.2 KiB
-- AnimPageFrame.lua
|
|
-- @Author : DengSir (tdaddon@163.com)
|
|
-- @Link : https://dengsir.github.io
|
|
-- @Date : 9/20/2018, 11:09:58 PM
|
|
|
|
local MAJOR, MINOR = 'AnimPageFrame', 2
|
|
local GUI = LibStub('tdGUI-1.0')
|
|
local AnimPageFrame, oldminor = GUI:NewClass(MAJOR, MINOR, 'ScrollFrame', 'Refresh')
|
|
if not AnimPageFrame then return end
|
|
|
|
function AnimPageFrame:Constructor()
|
|
local Body = CreateFrame('Frame', nil, self) do
|
|
Body:SetPoint('TOPLEFT')
|
|
Body:SetSize(1, 1)
|
|
self:SetScrollChild(Body)
|
|
end
|
|
|
|
local Group = self:CreateAnimationGroup() do
|
|
Group:SetLooping('NONE')
|
|
Group:SetScript('OnFinished', function()
|
|
self:OnFinished()
|
|
end)
|
|
end
|
|
|
|
local Anim = Group:CreateAnimation('Translation') do
|
|
Anim:SetDuration(0.3)
|
|
end
|
|
|
|
self.Body = Body
|
|
self.Group = Group
|
|
self.Anim = Anim
|
|
|
|
|
|
self._pageIndex = 1
|
|
self._pages = {}
|
|
self:SetScript('OnSizeChanged', self.Refresh)
|
|
self:SetOrientation('HORIZONTAL')
|
|
self:Refresh()
|
|
end
|
|
|
|
function AnimPageFrame:UpdateHorizontal()
|
|
local width, height = self:GetSize()
|
|
|
|
self.Body:SetHeight(height)
|
|
self.Body:SetWidth(width * self:GetPageCount())
|
|
|
|
for i, frame in ipairs(self._pages) do
|
|
frame:ClearAllPoints()
|
|
frame:SetPoint('TOPLEFT', (i - 1) * width, 0)
|
|
frame:SetSize(width, height)
|
|
end
|
|
end
|
|
|
|
function AnimPageFrame:UpdateVertical()
|
|
local width, height = self:GetSize()
|
|
|
|
self.Body:SetHeight(height * self:GetPageCount())
|
|
self.Body:SetWidth(width)
|
|
|
|
for i, frame in ipairs(self._pages) do
|
|
frame:ClearAllPoints()
|
|
frame:SetPoint('TOPLEFT', 0, - (i - 1) * height)
|
|
frame:SetSize(width, height)
|
|
end
|
|
end
|
|
|
|
function AnimPageFrame:GetPageCount()
|
|
return #self._pages
|
|
end
|
|
|
|
function AnimPageFrame:AddPage(frame)
|
|
local id = self:GetPageCount() + 1
|
|
frame:SetParent(self.Body)
|
|
frame:SetID(id)
|
|
frame:ClearAllPoints()
|
|
|
|
self._pages[id] = frame
|
|
self:Refresh()
|
|
end
|
|
|
|
function AnimPageFrame:GetOrientation()
|
|
return self._orientation
|
|
end
|
|
|
|
function AnimPageFrame:SetOrientation(orientation)
|
|
self._orientation = orientation
|
|
self.Update = orientation == 'HORIZONTAL' and self.UpdateHorizontal or self.UpdateVertical
|
|
self:Refresh()
|
|
end
|
|
|
|
function AnimPageFrame:GetPage()
|
|
return self._pageIndex
|
|
end
|
|
|
|
function AnimPageFrame:SetPage(id, force)
|
|
if self._pageIndex == id then
|
|
return
|
|
end
|
|
|
|
if self.Anim:IsPlaying() then
|
|
self.Anim:Stop()
|
|
self.Group:Stop()
|
|
end
|
|
|
|
local delta = self._pageIndex - id
|
|
self._pageIndex = id
|
|
|
|
if force then
|
|
self:OnFinished()
|
|
else
|
|
if self._orientation == 'HORIZONTAL' then
|
|
self.Anim:SetOffset(delta * self:GetWidth(), 0)
|
|
else
|
|
self.Anim:SetOffset(0, - delta * self:GetHeight())
|
|
end
|
|
self.Group:Play()
|
|
self.Anim:Play()
|
|
end
|
|
end
|
|
|
|
function AnimPageFrame:OnFinished()
|
|
if self._orientation == 'HORIZONTAL' then
|
|
self:SetHorizontalScroll((self._pageIndex - 1) * self:GetWidth())
|
|
else
|
|
self:SetVerticalScroll((self._pageIndex - 1) * self:GetHeight())
|
|
end
|
|
end
|
|
|