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.

128 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