|
|
- --[[
- info_list:格式为 {{"名称", call_back}}
- ]]
- DropDown = DropDown or BaseClass(BaseItem)
-
- DropDown.TYPE = {
- UP = 1, --上拉
- DOWN = 2, --下拉
- }
-
- local GetChildTexts = GetChildTexts
- local GetChildGameObjects = GetChildGameObjects
- local GetChildTransforms = GetChildTransforms
-
- function DropDown:__init(parent_wnd)
- self.base_file = "uiComponent"
- self.layout_file = "DropDown"
-
- self.max_height = 200
- self.item_list = {}
- self.is_open = false
- self:SetLayerName()
- self.callback = nil
- self.is_item_select = false
-
- self:Load()
- end
-
- function DropDown:__delete()
- if self.delay_timer then
- GlobalTimerQuest:CancelQuest(self.delay_timer)
- self.delay_timer = nil
- end
-
- for i, v in ipairs(self.item_list) do
- v:DeleteMe()
- v = nil
- end
- self.item_list = {}
- end
-
- function DropDown:Load_callback()
-
- self.select,
- self.item_content,
- self.Btn
- = GetChildTransforms(self.transform,
- {
- "Select",
- "Select/ScrollView/Viewport/Content",
- "btn",
- })
-
- self.main_text
- = GetChildTexts(self.transform,
- {
- "bg/text",
- })
-
- self.bg_obj,
- self.redDot
- = GetChildGameObjects(self.transform,
- {
- "bg",
- "bg/redDot",
- })
-
- self:InitEvent()
-
- self.redDot:SetActive(self.is_show_redDot)
-
- --确认active再执行,否则overrideSorting勾选不上
- local function delay_func()
- if not IsNull(self.gameObject) and self.gameObject.activeInHierarchy then
- if self.delay_timer then
- GlobalTimerQuest:CancelQuest(self.delay_timer)
- self.delay_timer = nil
- end
- self:SetUIDepth(self.gameObject)
- end
- end
- self.delay_timer = GlobalTimerQuest:AddPeriodQuest(delay_func, 0.01, -1)
-
- if self.need_refresh then
- self:SetData(self.info_list, self._type, self.run_first, self.callback, self.default_index, self.is_item_select)
- end
- if self.need_refreshView then
- self:SetViewType(self.view_type)
- end
- end
-
- --提高一个层次 确保覆盖在特效之上
- function DropDown:SetLayerName()
- self.layer_name = self.layer_name or "UI"
- if self.layer_name == "UI" then
- self.layer_name = "Activity"
- elseif self.layer_name == "Activity" then
- self.layer_name = "Top"
- end
- end
-
- function DropDown:InitEvent()
- local function click_func(target)
- if target == self.Btn.gameObject or target == self.bg_obj then
- self:ChangeState(not self.is_open)
- if self.callback then
- self.callback()
- end
- end
- end
- AddClickEvent(self.Btn.gameObject, click_func)
- AddClickEvent(self.bg_obj, click_func)
- end
-
- function DropDown:SetData(info_list, _type, run_first, callback, default_index, is_item_select)
- self._type = _type or DropDown.TYPE.UP
- self.info_list = info_list or {}
- self.run_first = run_first
- self.callback = callback
- self.default_index = default_index
- self.is_item_select = is_item_select
-
- if self.is_loaded then
- local function call_back(name)
- self:ChangeState(false)
- self.main_text.text = name
- self:SetItemSelect(name)
- end
-
- for i, v in ipairs(self.item_list) do
- v:SetVisible(false)
- end
-
- for i, v in ipairs(self.info_list) do
- local item = self.item_list[i]
- if not item then
- item = DropDownItem.New(self.item_content)
- self.item_list[i] = item
- end
- item:SetVisible(true)
- item:SetData(v[1], v[2], call_back)
- end
- --下拉过长时只显示4个
- local len = #self.info_list < 5 and #self.info_list or 4.5
- local height = (DropDownItem.HEIGHT + 2) * (len+0.5)
- --height = height <= 200 and height or 200
- self.select.sizeDelta = Vector2(self.select.sizeDelta.x, height)
- --self.item_content.sizeDelta = Vector2(self.item_content.sizeDelta.x, DropDownItem.HEIGHT * #self.info_list + 10)
-
- --初始化
- self:ChangeState(false)
- default_index = default_index or 1
- if self.info_list[default_index] and self.info_list[default_index][1] then
- self.main_text.text = self.info_list[default_index][1]
- end
- if self.run_first then
- self:SetSelectIndex(default_index)
- end
-
- if self._type == DropDown.TYPE.DOWN then
- local size = self.select.sizeDelta
- SetAnchoredPosition(self.select, 0, -size.y - 50)
- end
-
- if self.cache_redDot_list then
- self:ShowRedDot(self.cache_redDot_list)
- self.cache_redDot_list = nil
- end
- else
- self.need_refresh = true
- end
- end
-
- function DropDown:SetViewType(view_type)
- self.view_type = view_type
- if self.is_loaded then
- if view_type then
- if view_type == 1 then
- lua_resM:setImageSprite(self, self.bg_obj.transform:GetComponent("Image"), "common_asset", "tips_k")
- end
- end
- else
- self.need_refreshView = true
- end
- end
-
- function DropDown:ChangeState(bool)
- self.is_open = bool
- self.select.gameObject:SetActive(bool)
- self.Btn.localRotation = bool and Vector3(0,0,180) or Vector3(0,0,0)
- end
-
- function DropDown:SetSelectIndex(index)
- if self.item_list[index] then
- self.item_list[index]:SetSelected()
- end
- end
-
- function DropDown:SetItemSelect(name)
- local index = 1
- for k,v in pairs(self.info_list) do
- if v and v[1] and v[1] == name then
- index = k
- break
- end
- end
- if self.is_item_select then
- if self.last_index and self.last_index == index then
- return
- end
- if self.last_index then
- self.item_list[self.last_index]:SelectStatus(false)
- end
- self.item_list[index]:SelectStatus(true)
- self.last_index = index
- end
- end
-
- function DropDown:ShowRedDot(list)
- if self.is_loaded and self.item_list and #self.item_list > 0 then
- local show = false
- for i, v in ipairs(self.item_list) do
- v:ShowRedDot(list[i])
- show = show or list[i]
- end
-
- self.is_show_redDot = show
- if self.is_loaded then
- self.redDot:SetActive(show)
- end
- else
- self.cache_redDot_list = list
- end
- end
|