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.
144 lines
3.9 KiB
144 lines
3.9 KiB
|
5 years ago
|
--[[
|
||
|
|
ListView2.lua
|
||
|
|
@Author : DengSir (tdaddon@163.com)
|
||
|
|
@Link : https://dengsir.github.io
|
||
|
|
]]
|
||
|
|
|
||
|
|
local MAJOR, MINOR = 'ListView', 2
|
||
|
|
local ListView = LibStub('tdGUI-1.0'):NewClass(MAJOR, MINOR, 'ScrollFrame.BasicHybridScrollFrameTemplate', 'Refresh', 'View', 'Select')
|
||
|
|
if not ListView then return end
|
||
|
|
|
||
|
|
function ListView:Constructor(parent)
|
||
|
|
self._buttons = {}
|
||
|
|
self.update = self.Refresh
|
||
|
|
self:SetScript('OnSizeChanged', self.OnSizeChanged)
|
||
|
|
|
||
|
|
self.scrollBar:ClearAllPoints()
|
||
|
|
self.scrollBar:SetPoint('TOPRIGHT', 0, -18)
|
||
|
|
self.scrollBar:SetPoint('BOTTOMRIGHT', 0, 18)
|
||
|
|
|
||
|
|
self.scrollBar.doNotHide = true
|
||
|
|
|
||
|
|
self:SetSelectMode('NONE')
|
||
|
|
self:ClearAllPoints()
|
||
|
|
end
|
||
|
|
|
||
|
|
function ListView:OnSizeChanged()
|
||
|
|
self._maxCount = nil
|
||
|
|
self._needUpdateScroll = true
|
||
|
|
self.scrollChild:SetWidth(self:GetWidth() - 18)
|
||
|
|
|
||
|
|
self:Refresh()
|
||
|
|
end
|
||
|
|
|
||
|
|
function ListView:Update()
|
||
|
|
if self._needUpdateLayout then
|
||
|
|
self:UpdateLayout()
|
||
|
|
self._needUpdateLayout = nil
|
||
|
|
end
|
||
|
|
if self._needUpdateScroll then
|
||
|
|
self:UpdateScroll()
|
||
|
|
self._needUpdateScroll = nil
|
||
|
|
end
|
||
|
|
self:UpdateItems()
|
||
|
|
end
|
||
|
|
|
||
|
|
function ListView:UpdateLayout()
|
||
|
|
for i in ipairs(self._buttons) do
|
||
|
|
self:UpdateItemPosition(i)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function ListView:UpdateScroll()
|
||
|
|
local maxCount = self:GetMaxCount()
|
||
|
|
local buttonHeight = self:GetButtonHeight()
|
||
|
|
local maxHeight = maxCount * buttonHeight
|
||
|
|
|
||
|
|
self.buttonHeight = buttonHeight
|
||
|
|
|
||
|
|
self:GetScrollChild():SetSize(self:GetWidth(), maxHeight)
|
||
|
|
self:SetVerticalScroll(0)
|
||
|
|
self:UpdateScrollChildRect()
|
||
|
|
|
||
|
|
self.scrollBar:SetMinMaxValues(0, maxHeight)
|
||
|
|
self.scrollBar.buttonHeight = buttonHeight
|
||
|
|
self.scrollBar:SetValueStep(buttonHeight)
|
||
|
|
self.scrollBar:SetStepsPerPage(maxCount - 2)
|
||
|
|
self.scrollBar:SetValue(0)
|
||
|
|
end
|
||
|
|
|
||
|
|
function ListView:UpdateItems()
|
||
|
|
local offset = self:GetOffset()
|
||
|
|
local itemCount = self:GetItemCount()
|
||
|
|
local maxCount = self:GetMaxCount()
|
||
|
|
local itemHeight = self:GetItemHeight()
|
||
|
|
local itemSpacing = self:GetItemSpacing()
|
||
|
|
local top, bottom = select(3, self:GetPadding())
|
||
|
|
local realCount = min(itemCount, maxCount)
|
||
|
|
|
||
|
|
for i = 1, realCount do
|
||
|
|
local index = offset + i
|
||
|
|
local button = self:GetButton(i)
|
||
|
|
|
||
|
|
if self:GetItem(index) then
|
||
|
|
button:SetID(index)
|
||
|
|
button:SetHeight(itemHeight)
|
||
|
|
button:Show()
|
||
|
|
button:FireFormat()
|
||
|
|
else
|
||
|
|
button:Hide()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
for i = realCount + 1, #self._buttons do
|
||
|
|
self:GetButton(i):Hide()
|
||
|
|
end
|
||
|
|
HybridScrollFrame_Update(self, self:GetItemCount() * self:GetButtonHeight() + top + bottom , self:GetHeight());
|
||
|
|
end
|
||
|
|
|
||
|
|
function ListView:UpdateItemPosition(i)
|
||
|
|
local itemSpacing = self:GetItemSpacing()
|
||
|
|
local left, right, top = self:GetPadding()
|
||
|
|
local button = self:GetButton(i)
|
||
|
|
|
||
|
|
button:ClearAllPoints()
|
||
|
|
|
||
|
|
if i == 1 then
|
||
|
|
button:SetPoint('TOPLEFT', left, -top)
|
||
|
|
button:SetPoint('TOPRIGHT', -18-right, -top)
|
||
|
|
else
|
||
|
|
button:SetPoint('TOPLEFT', self:GetButton(i-1), 'BOTTOMLEFT', 0, -itemSpacing)
|
||
|
|
button:SetPoint('TOPRIGHT', self:GetButton(i-1), 'BOTTOMRIGHT', 0, -itemSpacing)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function ListView:GetMaxCount()
|
||
|
|
if not self._maxCount then
|
||
|
|
local itemHeight = self:GetItemHeight()
|
||
|
|
local itemSpacing = self:GetItemSpacing()
|
||
|
|
local height = self:GetHeight()
|
||
|
|
local _, _, top, bottom = self:GetPadding()
|
||
|
|
|
||
|
|
self._maxCount = math.ceil((height - top - bottom) / (itemHeight + itemSpacing)) + 1
|
||
|
|
end
|
||
|
|
return self._maxCount
|
||
|
|
end
|
||
|
|
|
||
|
|
function ListView:GetButtonHeight()
|
||
|
|
return self:GetItemHeight() + self:GetItemSpacing()
|
||
|
|
end
|
||
|
|
|
||
|
|
---- override
|
||
|
|
|
||
|
|
function ListView:SetItemHeight(itemHeight)
|
||
|
|
self._itemHeight = itemHeight
|
||
|
|
self._needUpdateScroll = true
|
||
|
|
end
|
||
|
|
|
||
|
|
function ListView:SetItemSpacing(itemSpacing)
|
||
|
|
self._itemSpacing = itemSpacing
|
||
|
|
self._needUpdateScroll = true
|
||
|
|
end
|
||
|
|
|
||
|
|
ListView.GetOffset = HybridScrollFrame_GetOffset
|