源战役客户端
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 

234 wiersze
5.4 KiB

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