--[[ @description: 一级主选项卡模板 --]] CusVerMainTabsTemplate = CusVerMainTabsTemplate or BaseClass(BaseItem) local CusVerMainTabsTemplate = CusVerMainTabsTemplate local SetSizeDelta = SetSizeDelta local SetAnchoredPosition = SetAnchoredPosition function CusVerMainTabsTemplate:__init(parent_transform, main_tabs_sizebtn, subCon_offset, sub_tabs_class, sub_tabs_spacing, arrow_pos) self.btn_width = main_tabs_sizebtn.x --tab按钮的宽度 self.btn_height = main_tabs_sizebtn.y --tab按钮的高度 self.sub_tabs_width = main_tabs_sizebtn.x - 8 --下一级tab按钮的宽度 self.subCon_offset = subCon_offset self.sub_tabs_class = sub_tabs_class self.sub_tabs_spacing = sub_tabs_spacing self.arrow_pos = arrow_pos or -30 self.have_sub_tabs = sub_tabs_class and true or false self.index = nil self.show = false -- 是否展开 self.select_anything = false -- 是否可以在有子类的时候选中大类 self.force_size = false -- 是否强制设置子选项卡大小 self.sub_tabs_data = nil self.sub_tabs_count = 0 self.sub_btn_list = {} self.select_sub_index = nil self.sub_tabs_load_complete = false self.sub_red_list = nil self:Initialization() end function CusVerMainTabsTemplate:__delete() for i,v in ipairs(self.sub_btn_list) do v:DeleteMe() v = nil end self.sub_btn_list = {} end -- 子类中重写,自定义预设 function CusVerMainTabsTemplate:Initialization() self.layout_file = "UIVerTabBtn" --self.base_file = "" self.prefab_asset = UiFactory.getPrefab(UIType.UIVerTabBtn) self:Load() end function CusVerMainTabsTemplate:Load_callback() self.button, self.iconObj, self.red_dot = GetChildGameObjects(self.transform, { "tab", "tab/icon", "tab/dot" }) self.btnText = GetChildTexts(self.transform, { "tab/Text", }) self.icon_tran, self.subCon, self.tab_btn_tra = GetChildTransforms(self.transform, { "tab/icon", "subCon", "tab" }) self.imgSelect, self.tab_btn_img, self.arrow_img = GetChildImages(self.transform, { "tab/selectBg", "tab", "tab/icon", }) self.select_go = self.imgSelect.gameObject SetAnchoredPosition(self.icon_tran, self.arrow_pos, 0) self:LoadCallbackAfter() end function CusVerMainTabsTemplate:LoadCallbackAfter() lua_resM:setImageSprite(self, self.tab_btn_img,"common_asset","tyui_btn2_2") lua_resM:setImageSprite(self, self.imgSelect,"common_asset","tyui_btn2_1") lua_resM:setImageSprite(self, self.arrow_img, "common_asset", "tyui_btn3_4", true) self.btnText.fontSize = 26 SetSizeDelta(self.select_go.transform, self.btn_width, self.btn_height) SetSizeDelta(self.tab_btn_tra, self.btn_width, self.btn_height) if self.subCon_offset then SetAnchoredPosition(self.subCon, self.subCon_offset.x, - self.btn_height- self.subCon_offset.y) else SetAnchoredPosition(self.subCon, 0, -self.btn_height) end self.btnText.color = Color(167/255, 119/255, 85/255, 1) end function CusVerMainTabsTemplate:SetTabsDetail(tab_data, index, call_back, select_anything, force_size) self.sub_tabs_data = {} self.index = index self.call_back = call_back self.select_anything = select_anything self.force_size = force_size self.select_sub_index = 0 if tab_data == nil then return end local tab_index = "_"..self.index if type(tab_data[tab_index]) == "table" then --主菜单名称 self.btnText.text = tab_data[tab_index].name elseif type(tab_data[tab_index]) == "string" then self.btnText.text = tab_data[tab_index] end for i = 1, TableSize(tab_data) do tab_index = "_"..self.index.."_"..i if not tab_data[tab_index] then break end table.insert(self.sub_tabs_data, tab_data[tab_index]) end self.sub_tabs_count = #self.sub_tabs_data --是否显示展开标志 if self.sub_tabs_count == 0 then self.iconObj:SetActive(false) else self.iconObj:SetActive(true) end self.need_refresh_tabs = true self.sub_tabs_load_complete = false --self:SetSubTabs(self.sub_tabs_data, self.index, call_back) end function CusVerMainTabsTemplate:SetSubTabs(sub_tab_list, parent_index, call_back) if self.force_size then self.sub_tabs_class.real_height = self.btn_height else self.sub_tabs_class.real_height = self.sub_tabs_class.Height or 76 end local sub_tab = nil for i,v in ipairs(sub_tab_list) do sub_tab = self.sub_btn_list[i] if sub_tab == nil then sub_tab = self.sub_tabs_class.New(self.subCon) self.sub_btn_list[i] = sub_tab if self.force_size then sub_tab:SetTabSubBtnSize(self.sub_tabs_width, self.btn_height) end end sub_tab:SetSubDeail(v, parent_index, i, call_back) sub_tab:SetVisible(true) local x = 0 local y = -(i - 1) * self.sub_tabs_class.real_height x = self.sub_tabs_spacing and self.sub_tabs_spacing.x + x or x y = self.sub_tabs_spacing and -(i - 1) * self.sub_tabs_spacing.y + y or y sub_tab:SetPosition(x, y) local function onBtnClickHandler(target) self:SetSelectSubIndex(parent_index, i) end if sub_tab.Button then AddClickEvent(sub_tab.Button, onBtnClickHandler, 2) end end for i = #sub_tab_list + 1, #self.sub_btn_list do self.sub_btn_list[i]:SetVisible(false) end self.subCon.gameObject:SetActive(false) end -- 处理选中tabs function CusVerMainTabsTemplate:SetSelectMode(index, sub_index, force_show, quick_select) --print("CusVerMainTabsTemplate:SetSelectMode() main = "..tostring(index)..", sub = "..tostring(sub_index)) if self.need_refresh_tabs then self:SetSubTabs(self.sub_tabs_data, self.index, self.call_back) self.need_refresh_tabs = false self.sub_tabs_load_complete = true if self.cache_redDot_list then self:ShowRedDot(self.cache_redDot_list) self.cache_redDot_list = nil end end if self.index == index then self.show = not self.show else self.show = false end if self.sub_tabs_count == 0 then self.show = true end if force_show and self.index == index then self.show = true end if self.show and index and self.select_sub_index == 0 then sub_index = sub_index or self:HandleDefaultSelectSubIndex(quick_select) if sub_index > 0 then self:SetSelectSubIndex(index, sub_index) else self:HandleCallback() end elseif not self.show and index and self.select_anything then self:HandleCallback() if self.select_sub_index ~= 0 then self:SetSelectSubIndex(0, 0) end end self:RefreshTabsSelectState(self.show, self.index == index) end function CusVerMainTabsTemplate:HandleDefaultSelectSubIndex(quick_select) local default_index = 0 if quick_select and self.sub_red_list and #self.sub_red_list > 0 then default_index = self.sub_red_list[1] elseif quick_select and self.sub_tabs_count > 0 and not self.select_anything then default_index = 1 end return default_index end function CusVerMainTabsTemplate:HandleCallback() if self.sub_tabs_count > 0 then if self.select_anything then if self.call_back then self.call_back(self.index,0) end end else if self.call_back then self.call_back(self.index,0) end end end -- 处理多级菜单开关,子选项卡显示 function CusVerMainTabsTemplate:RefreshTabsSelectState(show, is_select) if not self.have_sub_tabs then return end self.show = show if self.select_anything and is_select then self:SetSelectState(true) else self:SetSelectState(self.show) end if self.show then lua_resM:setImageSprite(self, self.arrow_img, "common_asset", "tyui_btn3_4a", true) --SetRotate(self.icon_tran, 0, 0, -90) else lua_resM:setImageSprite(self, self.arrow_img, "common_asset", "tyui_btn3_4", true) --SetLocalRotation(self.icon_tran, 0, 0, 0) end if self.subCon and self.sub_btn_list and #self.sub_btn_list ~= 0 then self.subCon.gameObject:SetActive(show) end end -- 设置选中的子一级选项卡 function CusVerMainTabsTemplate:SetSelectSubIndex(main_index, sub_index) if not self.have_sub_tabs then return end --print("CusVerMainTabsTemplate:SetSelectSubIndex() main = "..main_index..", sub = "..sub_index) for i,v in ipairs(self.sub_btn_list) do if v.parent_index == main_index and v.sub_index == sub_index then v:SetSelected(true) else v:SetSelected(false) end end self.select_sub_index = sub_index end -- 子选项卡个数(加载完但不显示的不需计算高度) function CusVerMainTabsTemplate:GetVisibleCount(visible) local count = 0 if self.have_sub_tabs then for _,v in ipairs(self.sub_btn_list) do if v:GetVisible() == visible or not v.is_loaded then count = count + 1 end end end return count end function CusVerMainTabsTemplate:SetSelectState(bool) self.select_go:SetActive(bool) if self.btnText then self.btnText.color = bool and Color(131/255, 87/255, 65/255, 1) or Color(167/255, 119/255, 85/255, 1) end end function CusVerMainTabsTemplate:ShowRedDot(list) if not self.sub_tabs_load_complete then self.cache_redDot_list = list end if list and #list > 0 then table.sort(list) end self.sub_red_list = list for i, v in ipairs(self.sub_btn_list) do v:ShowRedDot(false) end if not list or #list == 0 then self.red_dot:SetActive(false) else self.red_dot:SetActive(true) for i, v in ipairs(list) do if self.sub_btn_list[v] then self.sub_btn_list[v]:ShowRedDot(true) end end end -- 兼容只有主选项卡,没有子选项卡的情况。 if list and list[0] then self.red_dot:SetActive(true) end end function CusVerMainTabsTemplate:SetPosition(x, y) BaseItem.SetAnchoredPosition(self, x, y) end