--[[
|
|
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
|