源战役客户端
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.

234 lines
5.4 KiB

преди 4 седмици
  1. --[[
  2. info_list: {{"名称", call_back}}
  3. ]]
  4. DropDown = DropDown or BaseClass(BaseItem)
  5. DropDown.TYPE = {
  6. UP = 1, --上拉
  7. DOWN = 2, --下拉
  8. }
  9. local GetChildTexts = GetChildTexts
  10. local GetChildGameObjects = GetChildGameObjects
  11. local GetChildTransforms = GetChildTransforms
  12. function DropDown:__init(parent_wnd)
  13. self.base_file = "uiComponent"
  14. self.layout_file = "DropDown"
  15. self.max_height = 200
  16. self.item_list = {}
  17. self.is_open = false
  18. self:SetLayerName()
  19. self.callback = nil
  20. self.is_item_select = false
  21. self:Load()
  22. end
  23. function DropDown:__delete()
  24. if self.delay_timer then
  25. GlobalTimerQuest:CancelQuest(self.delay_timer)
  26. self.delay_timer = nil
  27. end
  28. for i, v in ipairs(self.item_list) do
  29. v:DeleteMe()
  30. v = nil
  31. end
  32. self.item_list = {}
  33. end
  34. function DropDown:Load_callback()
  35. self.select,
  36. self.item_content,
  37. self.Btn
  38. = GetChildTransforms(self.transform,
  39. {
  40. "Select",
  41. "Select/ScrollView/Viewport/Content",
  42. "btn",
  43. })
  44. self.main_text
  45. = GetChildTexts(self.transform,
  46. {
  47. "bg/text",
  48. })
  49. self.bg_obj,
  50. self.redDot
  51. = GetChildGameObjects(self.transform,
  52. {
  53. "bg",
  54. "bg/redDot",
  55. })
  56. self:InitEvent()
  57. self.redDot:SetActive(self.is_show_redDot)
  58. --确认active再执行,否则overrideSorting勾选不上
  59. local function delay_func()
  60. if not IsNull(self.gameObject) and self.gameObject.activeInHierarchy then
  61. if self.delay_timer then
  62. GlobalTimerQuest:CancelQuest(self.delay_timer)
  63. self.delay_timer = nil
  64. end
  65. self:SetUIDepth(self.gameObject)
  66. end
  67. end
  68. self.delay_timer = GlobalTimerQuest:AddPeriodQuest(delay_func, 0.01, -1)
  69. if self.need_refresh then
  70. self:SetData(self.info_list, self._type, self.run_first, self.callback, self.default_index, self.is_item_select)
  71. end
  72. if self.need_refreshView then
  73. self:SetViewType(self.view_type)
  74. end
  75. end
  76. --提高一个层次 确保覆盖在特效之上
  77. function DropDown:SetLayerName()
  78. self.layer_name = self.layer_name or "UI"
  79. if self.layer_name == "UI" then
  80. self.layer_name = "Activity"
  81. elseif self.layer_name == "Activity" then
  82. self.layer_name = "Top"
  83. end
  84. end
  85. function DropDown:InitEvent()
  86. local function click_func(target)
  87. if target == self.Btn.gameObject or target == self.bg_obj then
  88. self:ChangeState(not self.is_open)
  89. if self.callback then
  90. self.callback()
  91. end
  92. end
  93. end
  94. AddClickEvent(self.Btn.gameObject, click_func)
  95. AddClickEvent(self.bg_obj, click_func)
  96. end
  97. function DropDown:SetData(info_list, _type, run_first, callback, default_index, is_item_select)
  98. self._type = _type or DropDown.TYPE.UP
  99. self.info_list = info_list or {}
  100. self.run_first = run_first
  101. self.callback = callback
  102. self.default_index = default_index
  103. self.is_item_select = is_item_select
  104. if self.is_loaded then
  105. local function call_back(name)
  106. self:ChangeState(false)
  107. self.main_text.text = name
  108. self:SetItemSelect(name)
  109. end
  110. for i, v in ipairs(self.item_list) do
  111. v:SetVisible(false)
  112. end
  113. for i, v in ipairs(self.info_list) do
  114. local item = self.item_list[i]
  115. if not item then
  116. item = DropDownItem.New(self.item_content)
  117. self.item_list[i] = item
  118. end
  119. item:SetVisible(true)
  120. item:SetData(v[1], v[2], call_back)
  121. end
  122. --下拉过长时只显示4个
  123. local len = #self.info_list < 5 and #self.info_list or 4.5
  124. local height = (DropDownItem.HEIGHT + 2) * (len+0.5)
  125. --height = height <= 200 and height or 200
  126. self.select.sizeDelta = Vector2(self.select.sizeDelta.x, height)
  127. --self.item_content.sizeDelta = Vector2(self.item_content.sizeDelta.x, DropDownItem.HEIGHT * #self.info_list + 10)
  128. --初始化
  129. self:ChangeState(false)
  130. default_index = default_index or 1
  131. if self.info_list[default_index] and self.info_list[default_index][1] then
  132. self.main_text.text = self.info_list[default_index][1]
  133. end
  134. if self.run_first then
  135. self:SetSelectIndex(default_index)
  136. end
  137. if self._type == DropDown.TYPE.DOWN then
  138. local size = self.select.sizeDelta
  139. SetAnchoredPosition(self.select, 0, -size.y - 50)
  140. end
  141. if self.cache_redDot_list then
  142. self:ShowRedDot(self.cache_redDot_list)
  143. self.cache_redDot_list = nil
  144. end
  145. else
  146. self.need_refresh = true
  147. end
  148. end
  149. function DropDown:SetViewType(view_type)
  150. self.view_type = view_type
  151. if self.is_loaded then
  152. if view_type then
  153. if view_type == 1 then
  154. lua_resM:setImageSprite(self, self.bg_obj.transform:GetComponent("Image"), "common_asset", "tips_k")
  155. end
  156. end
  157. else
  158. self.need_refreshView = true
  159. end
  160. end
  161. function DropDown:ChangeState(bool)
  162. self.is_open = bool
  163. self.select.gameObject:SetActive(bool)
  164. self.Btn.localRotation = bool and Vector3(0,0,180) or Vector3(0,0,0)
  165. end
  166. function DropDown:SetSelectIndex(index)
  167. if self.item_list[index] then
  168. self.item_list[index]:SetSelected()
  169. end
  170. end
  171. function DropDown:SetItemSelect(name)
  172. local index = 1
  173. for k,v in pairs(self.info_list) do
  174. if v and v[1] and v[1] == name then
  175. index = k
  176. break
  177. end
  178. end
  179. if self.is_item_select then
  180. if self.last_index and self.last_index == index then
  181. return
  182. end
  183. if self.last_index then
  184. self.item_list[self.last_index]:SelectStatus(false)
  185. end
  186. self.item_list[index]:SelectStatus(true)
  187. self.last_index = index
  188. end
  189. end
  190. function DropDown:ShowRedDot(list)
  191. if self.is_loaded and self.item_list and #self.item_list > 0 then
  192. local show = false
  193. for i, v in ipairs(self.item_list) do
  194. v:ShowRedDot(list[i])
  195. show = show or list[i]
  196. end
  197. self.is_show_redDot = show
  198. if self.is_loaded then
  199. self.redDot:SetActive(show)
  200. end
  201. else
  202. self.cache_redDot_list = list
  203. end
  204. end