|
--[[
|
|
@description:自定义多级选项卡
|
|
|
|
@example:
|
|
|
|
local data = {["_1"] = {name = "一级选项卡1", ...}, ["_1_1"] = {name = "二级选项卡1", ...}}
|
|
or
|
|
local data = {["_1"] = "一级选项卡1", ["_1_1"] = "二级选项卡1"}
|
|
|
|
self.tabs = CustomVerTabs.New(self.tab_parent_tra, co.TableXY(265, 599),
|
|
CusVerMainTabsTemplate, co.TableXY(256, 70), co.TableXY(0, 6), co.TableXY(0, 3),
|
|
co.TableXY(0, 3), UIVerTabSubBtn, co.TableXY(0, 3))
|
|
|
|
local function call_back(main_index, sub_index)
|
|
|
|
end
|
|
self.tabs:SetTabs(data, call_back, true, true)
|
|
|
|
--]]
|
|
|
|
CustomVerTabs = CustomVerTabs or BaseClass(BaseComponent)
|
|
local CustomVerTabs = CustomVerTabs
|
|
|
|
local SetSizeDelta = SetSizeDelta
|
|
local SetAnchoredPosition = SetAnchoredPosition
|
|
|
|
--[[
|
|
@scroll_rect: 选项卡区域
|
|
@main_tabs_class: 自定义一级选项卡
|
|
@main_tabs_btnSize:一级选项卡按钮大小
|
|
@main_tabs_padding:一级选项卡顶部,左侧内边距
|
|
@main_tabs_spacing: 一级选项卡间距
|
|
@subCon_offset:一级选项卡子内容偏移
|
|
|
|
@sub_tabs_class: 自定义的二级选项卡
|
|
@sub_tabs_spacing: 二级选项卡间距
|
|
--]]
|
|
function CustomVerTabs:__init(parent_transform, scroll_rect, main_tabs_class, main_tabs_btnSize, main_tabs_padding, main_tabs_spacing, subCon_offset, sub_tabs_class, sub_tabs_spacing, arrow_pos)
|
|
self.scroll_rect = scroll_rect or co.TableXY(202, 561)
|
|
self.main_tabs_class = main_tabs_class
|
|
self.main_tabs_btnSize = main_tabs_btnSize or co.TableXY(189, 66)
|
|
self.main_tabs_padding = main_tabs_padding or co.TableXY(0, 0)
|
|
self.main_tabs_spacing = main_tabs_spacing or co.TableXY(0, 0)
|
|
self.subCon_offset = subCon_offset
|
|
self.arrow_pos = arrow_pos
|
|
|
|
self.sub_tabs_class = sub_tabs_class
|
|
self.sub_tabs_spacing = sub_tabs_spacing
|
|
|
|
self.quick_select = true
|
|
self.select_main_index = nil
|
|
self.btn_list = {}
|
|
self.btn_load_complete = false
|
|
self:CreateGameObject(UIType.ScrollView, "ScrollView")
|
|
end
|
|
|
|
function CustomVerTabs:__delete()
|
|
for i,v in ipairs(self.btn_list) do
|
|
v:DeleteMe()
|
|
v = nil
|
|
end
|
|
self.btn_list = {}
|
|
|
|
self:CancelTimer()
|
|
end
|
|
|
|
function CustomVerTabs:LoadSuccess()
|
|
|
|
local vec2 = Vector2(0, 1)
|
|
self.transform.anchorMax = vec2
|
|
self.transform.anchorMin = vec2
|
|
self.transform.pivot = vec2
|
|
SetAnchoredPosition(self.transform, 0, 0)
|
|
SetSizeDelta(self.transform, self.scroll_rect.x, self.scroll_rect.y)
|
|
|
|
self.scroll_view_content = self:GetChild("Viewport/Content")
|
|
self.viewport_mask = self:GetChild("Viewport"):GetComponent("Mask")
|
|
self.viewport_image = self:GetChild("Viewport"):GetComponent("Image")
|
|
end
|
|
|
|
function CustomVerTabs:SetTabs(bar_list, call_back, select_anything, force_size, quick_select)
|
|
if bar_list == nil or TableSize(bar_list) == 0 then return end
|
|
self.quick_select = quick_select == nil and true or quick_select
|
|
|
|
self:ResetTabsIndex()
|
|
self:RefreshTabsList(bar_list, call_back, select_anything, force_size)
|
|
--self:RefreshTabsPos()
|
|
self:ResetTabsConPos()
|
|
end
|
|
|
|
function CustomVerTabs:ResetTabsIndex()
|
|
if self.select_main_index then
|
|
self:CancelSelectTabs(self.select_main_index)
|
|
self:RefreshTabsPos()
|
|
end
|
|
self.select_main_index = nil
|
|
end
|
|
|
|
function CustomVerTabs:RefreshTabsList(bar_list, call_back, select_anything, force_size)
|
|
|
|
self:CancelTimer()
|
|
|
|
local count = 0
|
|
local gap_y = self.main_tabs_padding.y
|
|
local gap_x = self.main_tabs_padding.x + self.main_tabs_spacing.x
|
|
local function refresh_view_func()
|
|
if self._use_delete_method then
|
|
return
|
|
end
|
|
|
|
count = count + 1
|
|
local index = count
|
|
local tabs_index = "_" .. index
|
|
if bar_list[tabs_index] then
|
|
local tabs_btn = self.btn_list[index]
|
|
if tabs_btn == nil then
|
|
tabs_btn = self.main_tabs_class.New(self.scroll_view_content, self.main_tabs_btnSize, self.subCon_offset, self.sub_tabs_class, self.sub_tabs_spacing, self.arrow_pos)
|
|
self.btn_list[index] = tabs_btn
|
|
end
|
|
tabs_btn:SetTabsDetail(bar_list, index, call_back, select_anything, force_size)
|
|
tabs_btn:SetVisible(true)
|
|
|
|
local function onBtnClickHandler(target)
|
|
self:SetSelectTabs(index)
|
|
end
|
|
if tabs_btn.button then
|
|
AddClickEvent(tabs_btn.button, onBtnClickHandler, 2)
|
|
end
|
|
|
|
tabs_btn:SetPosition(gap_x, -gap_y)
|
|
gap_y = gap_y + tabs_btn.btn_height + self.main_tabs_spacing.y
|
|
else
|
|
for i = count, #self.btn_list do
|
|
self.btn_list[i]:SetVisible(false)
|
|
end
|
|
self:RefreshTabsPos()
|
|
self:CancelTimer()
|
|
self.btn_load_complete = true
|
|
|
|
if self.redDot_list then
|
|
for k, v in pairs(self.redDot_list) do
|
|
self:ShowRedDot(k, v)
|
|
end
|
|
self.redDot_list = nil
|
|
end
|
|
|
|
if self.cache_select then
|
|
self.cache_select = false
|
|
self:SetSelectTabs(self.cache_main_index,self.cache_sub_index,self.cache_force_show)
|
|
end
|
|
end
|
|
end
|
|
|
|
self.view_timer_id = GlobalTimerQuest:AddPeriodQuest(refresh_view_func,0.04)
|
|
refresh_view_func()
|
|
end
|
|
|
|
function CustomVerTabs:CancelTimer()
|
|
if self.view_timer_id then
|
|
GlobalTimerQuest:CancelQuest(self.view_timer_id)
|
|
self.view_timer_id = nil
|
|
end
|
|
end
|
|
|
|
function CustomVerTabs:SetSelectTabs(main_index, sub_index, force_show)
|
|
if not self.btn_load_complete then
|
|
self.cache_select = true
|
|
self.cache_main_index = main_index
|
|
self.cache_sub_index = sub_index
|
|
self.cache_force_show = force_show
|
|
return
|
|
end
|
|
|
|
--print("CustomVerTabs:SetSelectTabs() main = "..tostring(main_index)..", sub = "..tostring(sub_index))
|
|
for i,v in ipairs(self.btn_list) do
|
|
if v.index and v.index == main_index then
|
|
if self.select_main_index ~= main_index and self.select_main_index ~= nil then
|
|
self:CancelSelectTabs(self.select_main_index)
|
|
end
|
|
|
|
self.select_main_index = main_index
|
|
|
|
v:SetSelectMode(main_index, sub_index, force_show, self.quick_select)
|
|
sub_index = v.select_sub_index
|
|
break
|
|
end
|
|
end
|
|
self:RefreshTabsPos(main_index, sub_index)
|
|
end
|
|
|
|
function CustomVerTabs:CancelSelectTabs(index)
|
|
|
|
if self.btn_list[index] then
|
|
self.btn_list[index]:RefreshTabsSelectState(false)
|
|
self.btn_list[index]:SetSelectSubIndex(0, 0)
|
|
end
|
|
--[[if index and index * self.main_tabs_btnSize.y > self.transform.sizeDelta.y / 2 then
|
|
SetAnchoredPosition(self.scroll_view_content, 0, (index - 1) * self.main_tabs_btnSize.y)
|
|
else
|
|
SetAnchoredPosition(self.scroll_view_content, 0, 0)
|
|
end--]]
|
|
end
|
|
|
|
--更新tabBar的位置
|
|
function CustomVerTabs:RefreshTabsPos(main_index, sub_index)
|
|
local gap_y = self.main_tabs_padding.y
|
|
local gap_x = self.main_tabs_padding.x + self.main_tabs_spacing.x
|
|
local sub_tabs_height = self.sub_tabs_class and self.sub_tabs_class.real_height or 0
|
|
local subCon_offset_y = self.subCon_offset and self.subCon_offset.y or 0
|
|
local btn_height, off, h, sub_tabs_count
|
|
for i,v in ipairs(self.btn_list) do
|
|
if v:GetVisible() then
|
|
btn_height = v.btn_height
|
|
if v.show == true then
|
|
sub_tabs_count = v:GetVisibleCount(true)
|
|
off = self.sub_tabs_spacing and (sub_tabs_count - 1) * self.sub_tabs_spacing.y or 0
|
|
off = off < 0 and 0 or off + subCon_offset_y
|
|
h = sub_tabs_count * sub_tabs_height + off
|
|
v:SetPosition(gap_x, -gap_y)
|
|
gap_y = gap_y + btn_height + self.main_tabs_spacing.y + h
|
|
else
|
|
v:SetPosition(gap_x, -gap_y)
|
|
gap_y = gap_y + btn_height + self.main_tabs_spacing.y
|
|
end
|
|
end
|
|
end
|
|
|
|
SetSizeDelta(self.scroll_view_content, 0, gap_y + 40)
|
|
if main_index and sub_index then
|
|
sub_index = sub_index > 0 and sub_index - 1 or 0
|
|
--print("CustomVerTabs:RefreshTabsPos()",main_index,sub_index)
|
|
local y_1 = (main_index - 1) * self.main_tabs_btnSize.y + sub_index * self.sub_tabs_class.Height
|
|
local y_2 = self.scroll_view_content.sizeDelta.y - self.transform.sizeDelta.y
|
|
|
|
if y_2 < self.main_tabs_btnSize.y then
|
|
y_2 = 0
|
|
end
|
|
SetAnchoredPosition(self.scroll_view_content, 0, y_1 > y_2 and y_2 or y_1)
|
|
end
|
|
end
|
|
|
|
function CustomVerTabs:ResetTabsConPos()
|
|
SetAnchoredPosition(self.scroll_view_content, 0, 0)
|
|
end
|
|
|
|
function CustomVerTabs:CancelAllRedDot()
|
|
for i, v in pairs(self.btn_list) do
|
|
v:ShowRedDot()
|
|
end
|
|
end
|
|
|
|
function CustomVerTabs:ShowRedDot(index, index_list)
|
|
if not self.btn_load_complete then
|
|
self.redDot_list = self.redDot_list or {}
|
|
self.redDot_list[index] = index_list
|
|
return
|
|
end
|
|
|
|
if self.btn_list[index] and self.btn_list[index].ShowRedDot then
|
|
self.btn_list[index]:ShowRedDot(index_list)
|
|
end
|
|
end
|
|
|
|
-- 设置不规则遮罩显示
|
|
function CustomVerTabs:SetMaskImage(res)
|
|
lua_resM:setOutsideImageSprite(self,self.viewport_image,res,false,function ()
|
|
self.viewport_mask.showMaskGraphic = true
|
|
end)
|
|
end
|
|
|
|
function CustomVerTabs:SetDefaultSelected(index)
|
|
self:SetSelectTabs(index)
|
|
end
|