源战役客户端
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

352 líneas
9.2 KiB

hace 4 semanas
  1. --[[
  2. @description:
  3. --]]
  4. CusVerMainTabsTemplate = CusVerMainTabsTemplate or BaseClass(BaseItem)
  5. local CusVerMainTabsTemplate = CusVerMainTabsTemplate
  6. local SetSizeDelta = SetSizeDelta
  7. local SetAnchoredPosition = SetAnchoredPosition
  8. function CusVerMainTabsTemplate:__init(parent_transform, main_tabs_sizebtn, subCon_offset, sub_tabs_class, sub_tabs_spacing, arrow_pos)
  9. self.btn_width = main_tabs_sizebtn.x --tab按钮的宽度
  10. self.btn_height = main_tabs_sizebtn.y --tab按钮的高度
  11. self.sub_tabs_width = main_tabs_sizebtn.x - 8 --下一级tab按钮的宽度
  12. self.subCon_offset = subCon_offset
  13. self.sub_tabs_class = sub_tabs_class
  14. self.sub_tabs_spacing = sub_tabs_spacing
  15. self.arrow_pos = arrow_pos or -30
  16. self.have_sub_tabs = sub_tabs_class and true or false
  17. self.index = nil
  18. self.show = false -- 是否展开
  19. self.select_anything = false -- 是否可以在有子类的时候选中大类
  20. self.force_size = false -- 是否强制设置子选项卡大小
  21. self.sub_tabs_data = nil
  22. self.sub_tabs_count = 0
  23. self.sub_btn_list = {}
  24. self.select_sub_index = nil
  25. self.sub_tabs_load_complete = false
  26. self.sub_red_list = nil
  27. self:Initialization()
  28. end
  29. function CusVerMainTabsTemplate:__delete()
  30. for i,v in ipairs(self.sub_btn_list) do
  31. v:DeleteMe()
  32. v = nil
  33. end
  34. self.sub_btn_list = {}
  35. end
  36. -- 子类中重写,自定义预设
  37. function CusVerMainTabsTemplate:Initialization()
  38. self.layout_file = "UIVerTabBtn"
  39. --self.base_file = ""
  40. self.prefab_asset = UiFactory.getPrefab(UIType.UIVerTabBtn)
  41. self:Load()
  42. end
  43. function CusVerMainTabsTemplate:Load_callback()
  44. self.button,
  45. self.iconObj,
  46. self.red_dot
  47. = GetChildGameObjects(self.transform,
  48. {
  49. "tab",
  50. "tab/icon",
  51. "tab/dot"
  52. })
  53. self.btnText = GetChildTexts(self.transform,
  54. {
  55. "tab/Text",
  56. })
  57. self.icon_tran,
  58. self.subCon,
  59. self.tab_btn_tra
  60. = GetChildTransforms(self.transform,
  61. {
  62. "tab/icon",
  63. "subCon",
  64. "tab"
  65. })
  66. self.imgSelect,
  67. self.tab_btn_img,
  68. self.arrow_img
  69. = GetChildImages(self.transform,
  70. {
  71. "tab/selectBg",
  72. "tab",
  73. "tab/icon",
  74. })
  75. self.select_go = self.imgSelect.gameObject
  76. SetAnchoredPosition(self.icon_tran, self.arrow_pos, 0)
  77. self:LoadCallbackAfter()
  78. end
  79. function CusVerMainTabsTemplate:LoadCallbackAfter()
  80. lua_resM:setImageSprite(self, self.tab_btn_img,"common_asset","tyui_btn2_2")
  81. lua_resM:setImageSprite(self, self.imgSelect,"common_asset","tyui_btn2_1")
  82. lua_resM:setImageSprite(self, self.arrow_img, "common_asset", "tyui_btn3_4", true)
  83. self.btnText.fontSize = 26
  84. SetSizeDelta(self.select_go.transform, self.btn_width, self.btn_height)
  85. SetSizeDelta(self.tab_btn_tra, self.btn_width, self.btn_height)
  86. if self.subCon_offset then
  87. SetAnchoredPosition(self.subCon, self.subCon_offset.x, - self.btn_height- self.subCon_offset.y)
  88. else
  89. SetAnchoredPosition(self.subCon, 0, -self.btn_height)
  90. end
  91. self.btnText.color = Color(167/255, 119/255, 85/255, 1)
  92. end
  93. function CusVerMainTabsTemplate:SetTabsDetail(tab_data, index, call_back, select_anything, force_size)
  94. self.sub_tabs_data = {}
  95. self.index = index
  96. self.call_back = call_back
  97. self.select_anything = select_anything
  98. self.force_size = force_size
  99. self.select_sub_index = 0
  100. if tab_data == nil then return end
  101. local tab_index = "_"..self.index
  102. if type(tab_data[tab_index]) == "table" then --主菜单名称
  103. self.btnText.text = tab_data[tab_index].name
  104. elseif type(tab_data[tab_index]) == "string" then
  105. self.btnText.text = tab_data[tab_index]
  106. end
  107. for i = 1, TableSize(tab_data) do
  108. tab_index = "_"..self.index.."_"..i
  109. if not tab_data[tab_index] then break end
  110. table.insert(self.sub_tabs_data, tab_data[tab_index])
  111. end
  112. self.sub_tabs_count = #self.sub_tabs_data
  113. --是否显示展开标志
  114. if self.sub_tabs_count == 0 then
  115. self.iconObj:SetActive(false)
  116. else
  117. self.iconObj:SetActive(true)
  118. end
  119. self.need_refresh_tabs = true
  120. self.sub_tabs_load_complete = false
  121. --self:SetSubTabs(self.sub_tabs_data, self.index, call_back)
  122. end
  123. function CusVerMainTabsTemplate:SetSubTabs(sub_tab_list, parent_index, call_back)
  124. if self.force_size then
  125. self.sub_tabs_class.real_height = self.btn_height
  126. else
  127. self.sub_tabs_class.real_height = self.sub_tabs_class.Height or 76
  128. end
  129. local sub_tab = nil
  130. for i,v in ipairs(sub_tab_list) do
  131. sub_tab = self.sub_btn_list[i]
  132. if sub_tab == nil then
  133. sub_tab = self.sub_tabs_class.New(self.subCon)
  134. self.sub_btn_list[i] = sub_tab
  135. if self.force_size then
  136. sub_tab:SetTabSubBtnSize(self.sub_tabs_width, self.btn_height)
  137. end
  138. end
  139. sub_tab:SetSubDeail(v, parent_index, i, call_back)
  140. sub_tab:SetVisible(true)
  141. local x = 0
  142. local y = -(i - 1) * self.sub_tabs_class.real_height
  143. x = self.sub_tabs_spacing and self.sub_tabs_spacing.x + x or x
  144. y = self.sub_tabs_spacing and -(i - 1) * self.sub_tabs_spacing.y + y or y
  145. sub_tab:SetPosition(x, y)
  146. local function onBtnClickHandler(target)
  147. self:SetSelectSubIndex(parent_index, i)
  148. end
  149. if sub_tab.Button then
  150. AddClickEvent(sub_tab.Button, onBtnClickHandler, 2)
  151. end
  152. end
  153. for i = #sub_tab_list + 1, #self.sub_btn_list do
  154. self.sub_btn_list[i]:SetVisible(false)
  155. end
  156. self.subCon.gameObject:SetActive(false)
  157. end
  158. -- 处理选中tabs
  159. function CusVerMainTabsTemplate:SetSelectMode(index, sub_index, force_show, quick_select)
  160. --print("CusVerMainTabsTemplate:SetSelectMode() main = "..tostring(index)..", sub = "..tostring(sub_index))
  161. if self.need_refresh_tabs then
  162. self:SetSubTabs(self.sub_tabs_data, self.index, self.call_back)
  163. self.need_refresh_tabs = false
  164. self.sub_tabs_load_complete = true
  165. if self.cache_redDot_list then
  166. self:ShowRedDot(self.cache_redDot_list)
  167. self.cache_redDot_list = nil
  168. end
  169. end
  170. if self.index == index then
  171. self.show = not self.show
  172. else
  173. self.show = false
  174. end
  175. if self.sub_tabs_count == 0 then
  176. self.show = true
  177. end
  178. if force_show and self.index == index then
  179. self.show = true
  180. end
  181. if self.show and index and self.select_sub_index == 0 then
  182. sub_index = sub_index or self:HandleDefaultSelectSubIndex(quick_select)
  183. if sub_index > 0 then
  184. self:SetSelectSubIndex(index, sub_index)
  185. else
  186. self:HandleCallback()
  187. end
  188. elseif not self.show and index and self.select_anything then
  189. self:HandleCallback()
  190. if self.select_sub_index ~= 0 then
  191. self:SetSelectSubIndex(0, 0)
  192. end
  193. end
  194. self:RefreshTabsSelectState(self.show, self.index == index)
  195. end
  196. function CusVerMainTabsTemplate:HandleDefaultSelectSubIndex(quick_select)
  197. local default_index = 0
  198. if quick_select and self.sub_red_list and #self.sub_red_list > 0 then
  199. default_index = self.sub_red_list[1]
  200. elseif quick_select and self.sub_tabs_count > 0 and not self.select_anything then
  201. default_index = 1
  202. end
  203. return default_index
  204. end
  205. function CusVerMainTabsTemplate:HandleCallback()
  206. if self.sub_tabs_count > 0 then
  207. if self.select_anything then
  208. if self.call_back then self.call_back(self.index,0) end
  209. end
  210. else
  211. if self.call_back then self.call_back(self.index,0) end
  212. end
  213. end
  214. -- 处理多级菜单开关,子选项卡显示
  215. function CusVerMainTabsTemplate:RefreshTabsSelectState(show, is_select)
  216. if not self.have_sub_tabs then
  217. return
  218. end
  219. self.show = show
  220. if self.select_anything and is_select then
  221. self:SetSelectState(true)
  222. else
  223. self:SetSelectState(self.show)
  224. end
  225. if self.show then
  226. lua_resM:setImageSprite(self, self.arrow_img, "common_asset", "tyui_btn3_4a", true)
  227. --SetRotate(self.icon_tran, 0, 0, -90)
  228. else
  229. lua_resM:setImageSprite(self, self.arrow_img, "common_asset", "tyui_btn3_4", true)
  230. --SetLocalRotation(self.icon_tran, 0, 0, 0)
  231. end
  232. if self.subCon and self.sub_btn_list and #self.sub_btn_list ~= 0 then
  233. self.subCon.gameObject:SetActive(show)
  234. end
  235. end
  236. -- 设置选中的子一级选项卡
  237. function CusVerMainTabsTemplate:SetSelectSubIndex(main_index, sub_index)
  238. if not self.have_sub_tabs then
  239. return
  240. end
  241. --print("CusVerMainTabsTemplate:SetSelectSubIndex() main = "..main_index..", sub = "..sub_index)
  242. for i,v in ipairs(self.sub_btn_list) do
  243. if v.parent_index == main_index and v.sub_index == sub_index then
  244. v:SetSelected(true)
  245. else
  246. v:SetSelected(false)
  247. end
  248. end
  249. self.select_sub_index = sub_index
  250. end
  251. -- 子选项卡个数(加载完但不显示的不需计算高度)
  252. function CusVerMainTabsTemplate:GetVisibleCount(visible)
  253. local count = 0
  254. if self.have_sub_tabs then
  255. for _,v in ipairs(self.sub_btn_list) do
  256. if v:GetVisible() == visible or not v.is_loaded then
  257. count = count + 1
  258. end
  259. end
  260. end
  261. return count
  262. end
  263. function CusVerMainTabsTemplate:SetSelectState(bool)
  264. self.select_go:SetActive(bool)
  265. if self.btnText then
  266. self.btnText.color = bool and Color(131/255, 87/255, 65/255, 1) or Color(167/255, 119/255, 85/255, 1)
  267. end
  268. end
  269. function CusVerMainTabsTemplate:ShowRedDot(list)
  270. if not self.sub_tabs_load_complete then
  271. self.cache_redDot_list = list
  272. end
  273. if list and #list > 0 then
  274. table.sort(list)
  275. end
  276. self.sub_red_list = list
  277. for i, v in ipairs(self.sub_btn_list) do
  278. v:ShowRedDot(false)
  279. end
  280. if not list or #list == 0 then
  281. self.red_dot:SetActive(false)
  282. else
  283. self.red_dot:SetActive(true)
  284. for i, v in ipairs(list) do
  285. if self.sub_btn_list[v] then
  286. self.sub_btn_list[v]:ShowRedDot(true)
  287. end
  288. end
  289. end
  290. -- 兼容只有主选项卡,没有子选项卡的情况。
  291. if list and list[0] then
  292. self.red_dot:SetActive(true)
  293. end
  294. end
  295. function CusVerMainTabsTemplate:SetPosition(x, y)
  296. BaseItem.SetAnchoredPosition(self, x, y)
  297. end