miduo_client/Assets/ManagedResources/~Lua/Modules/Setting/HeadChangePopup.lua

376 lines
13 KiB
Lua

require("Base/BasePanel")
local HeadChangePopup = Inherit(BasePanel)
local this = HeadChangePopup
-- 获取头像框数据, 并排序
local _HeadFrameList = {}
local _HeadList = {}
-- 头像对象管理
local _PlayerHeadList = {}
-- Tab管理器
local TabBox = require("Modules/Common/TabBox")
local _TabFontColor = { default = Color.New(168 / 255, 168 / 255, 167 / 255, 1),
lock = Color.New(168 / 255, 168 / 255, 167 / 255, 1),
select = Color.New(250 / 255, 227 / 255, 175 / 255, 1) }
local _TabData = {
[1] = { default = "Btn_hz_tongyong_002", lock = "Btn_hz_tongyong_002", select = "Btn_hz_tongyong_001", name = Language[11847] , rpType = RedPointType.HeadChange_Head},
[2] = { default = "Btn_hz_tongyong_002", lock = "Btn_hz_tongyong_002", select = "Btn_hz_tongyong_001", name = Language[11848] , rpType = RedPointType.HeadChange_Frame}}
local SELECT_TYPE = {
HEAD = 1,
FRAME = 2,
}
--初始化组件(用于子类重写)
function HeadChangePopup:InitComponent()
this.spLoader = SpriteLoader.New()
-- 获取节点
this.btnBack = Util.GetGameObject(this.transform, "btnBack")
this.title = Util.GetGameObject(this.transform, "Title"):GetComponent("Text")
this.content = Util.GetGameObject(this.transform, "content"):GetComponent("Text")
this.btnConfirm = Util.GetGameObject(this.transform, "confirm")
this.scrollpos = Util.GetGameObject(this.transform, "scrollpos")
this.headFrameItem = Util.GetGameObject(this.transform, "scrollpos/item")
this.select = Util.GetGameObject(this.transform, "scrollpos/select")
this.using = Util.GetGameObject(this.transform, "scrollpos/using")
local height = this.scrollpos.transform.rect.height
local width = this.scrollpos.transform.rect.width
this.ScrollView = SubUIManager.Open(SubUIConfig.ScrollCycleView, this.scrollpos.transform,
this.headFrameItem, nil, Vector2.New(width, height), 1, 4, Vector2.New(25,40))
this.ScrollView.gameObject:GetComponent("RectTransform").anchoredPosition = Vector2.New(0, 0)
this.ScrollView.gameObject:GetComponent("RectTransform").anchorMin = Vector2.New(0.5, 0.5)
this.ScrollView.gameObject:GetComponent("RectTransform").anchorMax = Vector2.New(0.5, 0.5)
this.ScrollView.gameObject:GetComponent("RectTransform").pivot = Vector2.New(0.5, 0.5)
this.ScrollView.moveTween.MomentumAmount = 1
this.ScrollView.moveTween.Strength = 2
this.tabbox = Util.GetGameObject(this.transform, "top")
end
--绑定事件(用于子类重写)
function HeadChangePopup:BindEvent()
-- 初始化Tab管理器
this.TabCtrl = TabBox.New()
this.TabCtrl:SetTabAdapter(this.TabAdapter)
this.TabCtrl:SetTabIsLockCheck(this.TabIsLockCheck)
this.TabCtrl:SetChangeTabCallBack(this.OnTabChange)
this.TabCtrl:Init(this.tabbox, _TabData)
-- 绑定红点
local tabList = this.TabCtrl:GetTabList()
for index = 1, #tabList do
local tab = tabList[index]
local redpot = Util.GetGameObject(tab, "redpot")
if _TabData[index].rpType then
BindRedPointObject(_TabData[index].rpType, redpot)
else
redpot:SetActive(false)
end
end
--
Util.AddClick(this.btnBack, function()
PlaySoundWithoutClick(SoundConfig.Sound_UICancel)
-- 清除当前打开的类型界面全部红点
if this.CurSelectType then
if this.CurSelectType == SELECT_TYPE.FRAME then
HeadManager.RemoveAllNewHead(ItemType.HeadFrame)
elseif this.CurSelectType == SELECT_TYPE.HEAD then
HeadManager.RemoveAllNewHead(ItemType.Head)
end
end
this:ClosePanel()
end)
-- 确认点击确认按钮
Util.AddClick(this.btnConfirm, function()
-- 请求更换头像框
if this.CurSelectType == SELECT_TYPE.FRAME then
local frameId = _HeadFrameList[this.CurSelectIndex].Id
local num = HeadManager.headFrameData[frameId]
if not num then
PopupTipPanel.ShowTip(Language[11849])
return
end
NetManager.RequestChangeModifyDecoration(0, frameId, function ()
PopupTipPanel.ShowTip(Language[11850])
HeadManager.SetCurFrameId(frameId)
Game.GlobalEvent:DispatchEvent(GameEvent.Player.OnHeadFrameChange)
this.RefreshCurShow(false,false)
end)
elseif this.CurSelectType == SELECT_TYPE.HEAD then
local headId = _HeadList[this.CurSelectIndex].Id
local num = BagManager.GetItemCountById(headId)
if num <= 0 then
PopupTipPanel.ShowTip(Language[11851])
return
end
NetManager.RequestChangeModifyDecoration(1, headId, function ()
PopupTipPanel.ShowTip(Language[11850])
PlayerManager.head = headId
Game.GlobalEvent:DispatchEvent(GameEvent.Player.OnHeadChange)
this.RefreshCurShow(false,false)
end)
end
end)
end
--添加事件监听(用于子类重写)
function HeadChangePopup:AddListener()
end
--移除事件监听(用于子类重写)
function HeadChangePopup:RemoveListener()
end
--界面打开时调用(用于子类重写)
function HeadChangePopup:OnOpen(...)
_HeadList = HeadManager.GetHeadList()
_HeadFrameList = HeadManager.GetHeadFrameList()
if this.TabCtrl then
this.TabCtrl:ChangeTab(1)
end
end
--界面打开或者重新打开后,界面刷新时调用(用于子类重写)
function HeadChangePopup:OnShow()
end
--
function HeadChangePopup:OnSortingOrderChange()
for _, playerHead in pairs(_PlayerHeadList) do
playerHead:SetLayer(self.sortingOrder)
end
end
-- tab节点显示自定义
function this.TabAdapter(tab, index, status)
local tabLab = Util.GetGameObject(tab, "Text")
Util.GetGameObject(tab,"Img"):GetComponent("Image").sprite = this.spLoader:LoadSprite(_TabData[index][status])
tabLab:GetComponent("Text").text = _TabData[index].name
tabLab:GetComponent("Text").color = _TabFontColor[status]
end
-- tab可用性检测
function this.TabIsLockCheck(index)
--if index == SELECT_TYPE.HEAD then
-- return true, "功能尚未开启"
--end
return false
end
-- tab改变回调事件
function this.OnTabChange(index, lastIndex)
-- 切换页签时清除上一个页签的所有红点数据
if lastIndex and index ~= lastIndex then
if lastIndex == SELECT_TYPE.FRAME then
HeadManager.RemoveAllNewHead(ItemType.HeadFrame)
elseif lastIndex == SELECT_TYPE.HEAD then
HeadManager.RemoveAllNewHead(ItemType.Head)
end
end
-- 构建数据
local datalist = {}
local curId = nil
if index == SELECT_TYPE.FRAME then
datalist = _HeadFrameList
--print(#datalist.." 77777")
curId = HeadManager.GetCurFrameId()
this.title.text = Language[11852]
elseif index == SELECT_TYPE.HEAD then
datalist = _HeadList
curId = PlayerManager.head
--print(#datalist.." 88888")
this.title.text = Language[11853]
end
-- 排序
table.sort(datalist, function(a, b)
-- 使用中的头像在最前面
if curId == a.Id then return true end
if curId == b.Id then return false end
-- 拥有的头像往前放
local anum = BagManager.GetItemCountById(a.Id)
local bnum = BagManager.GetItemCountById(b.Id)
if anum > 0 and bnum <= 0 then return true end
if anum <= 0 and bnum > 0 then return false end
-- 按id排序
return a.Id < b.Id
end)
--
this.CurSelectType = index
this.CurSelectIndex = 1
this.ScrollView:SetData(datalist, function(index, go)
this.HeadFrameItemAdapter(go, datalist[index], index)
end,not true,not true)
-- this.ScrollView:SetIndex(1)
end
--
function this.RefreshCurShow(isTop,isAni)
local datalist = {}
if this.CurSelectType == SELECT_TYPE.FRAME then
datalist = _HeadFrameList
elseif this.CurSelectType == SELECT_TYPE.HEAD then
datalist = _HeadList
end
this.ScrollView:SetData(datalist, function(index, go)
this.HeadFrameItemAdapter(go, datalist[index], index)
end,not isTop,not isAni)
end
--
function this.HeadFrameItemAdapter(item, data, index)
local imgRoot = Util.GetGameObject(item, "Img")
local name = Util.GetGameObject(item, "name")
local redpot = Util.GetGameObject(item, "redpot")
if not _PlayerHeadList[item] then
_PlayerHeadList[item] = SubUIManager.Open(SubUIConfig.PlayerHeadView, imgRoot.transform)
end
_PlayerHeadList[item]:Reset()
if this.CurSelectType == SELECT_TYPE.FRAME then
local frameId = data.Id
name:GetComponent("Text").text = GetLanguageStrById(data.Name)
_PlayerHeadList[item]:SetFrame(frameId)
_PlayerHeadList[item]:SetHead(PlayerManager.head)
_PlayerHeadList[item]:SetLayer(this.sortingOrder)
_PlayerHeadList[item]:SetEffectScale(1.1)
if frameId == HeadManager.GetCurFrameId() then
this:SetUsing(_PlayerHeadList[item].gameObject)
else
this:RecycleUsing(_PlayerHeadList[item].gameObject)
end
local num = HeadManager.headFrameData[frameId]
_PlayerHeadList[item]:SetGray( not num)
redpot:SetActive(num and HeadManager.IsNewHead(frameId))
Util.AddOnceClick(item, function()
this.SelectItem(index, item)
end)
elseif this.CurSelectType == SELECT_TYPE.HEAD then
local headId = data.Id
name:GetComponent("Text").text = GetLanguageStrById(data.Name)
_PlayerHeadList[item]:SetHead(headId)
_PlayerHeadList[item]:SetFrame(HeadManager.GetCurFrameId())
_PlayerHeadList[item]:SetLayer(this.sortingOrder)
_PlayerHeadList[item]:SetEffectScale(1.1)
if headId == PlayerManager.head then
this:SetUsing(_PlayerHeadList[item].gameObject)
else
this:RecycleUsing(_PlayerHeadList[item].gameObject)
end
local num = BagManager.GetItemCountById(headId)
--print(num.." !!!!!!")
_PlayerHeadList[item]:SetGray(num <= 0)
redpot:SetActive(num > 0 and HeadManager.IsNewHead(headId))
Util.AddOnceClick(item, function()
this.SelectItem(index, item)
end)
end
-- 判断选中框的显示
if this.CurSelectIndex == index then
this.SelectItem(index, item)
else
local select = Util.GetGameObject(item, "selectroot/select")
if select then select:SetActive(false) end
end
end
--
function this.SelectItem(index, item)
-- 保存选中的index
this.CurSelectIndex = index
-- 显示选中图标
this.select:SetActive(true)
this.select.transform:SetParent(Util.GetGameObject(item, "selectroot").transform)
this.select.transform.localPosition = Vector3.zero
-- 设置content显示
local data = nil
local HeadData = nil
if this.CurSelectType == SELECT_TYPE.FRAME then
data = _HeadFrameList[index]
--print(data.Id)
HeadData = HeadManager.GetSingleFrame(data.Id)
elseif this.CurSelectType == SELECT_TYPE.HEAD then
data = _HeadList[index]
end
if not data then return end
if data.Id >=80000 and HeadData and HeadData.validTime - GetTimeStamp() > 0 then
-- body
this.content.text = GetLanguageStrById(data.ItemDescribe) ..Language[12173]..TimeStampToDateStr2(HeadData.validTime)
else
this.content.text = GetLanguageStrById(data.ItemDescribe)
end
--..",到期时间:"..HeadData.validTime
-- 红点
if HeadManager.IsNewHead(data.Id) then
HeadManager.SetNotNewHeadAnyMore(data.Id)
Util.GetGameObject(item, "redpot"):SetActive(false)
end
end
-- 设置使用中的状态
function HeadChangePopup:SetUsing(node)
local head = Util.GetGameObject(node, "icon")
this.using.transform:SetParent(head.transform)
this.using.transform.localPosition = Vector3.zero
this.using:SetActive(true)
end
function HeadChangePopup:RecycleUsing(node)
-- 如果node中包含using就回收
if node then
local using = Util.GetGameObject(node, "icon/using")
if not using then return end
end
this.using.transform:SetParent(this.scrollpos.transform)
this.using:SetActive(false)
end
--界面关闭时调用(用于子类重写)
function HeadChangePopup:OnClose()
end
--界面销毁时调用(用于子类重写)
function HeadChangePopup:OnDestroy()
this.spLoader:Destroy()
this:RecycleUsing()
for _, playerHead in pairs(_PlayerHeadList) do
playerHead:Recycle()
end
_PlayerHeadList = {}
this.ScrollView = nil
-- 清除红点绑定
for _, v in ipairs(_TabData) do
if v.rpType then
ClearRedPointObject(v.rpType)
end
end
end
return HeadChangePopup