Files
StellaSora_DataLua/lua/game/ui/mall/mallskinctrl.lua
T
SL1900 46f967a584 Update - 1.6.0.84
EN: 1.6.0.84
CN: 1.6.0.87
JP: 1.6.0.88
KR: 1.6.0.91
2026-02-04 13:00:00 +09:00

238 lines
7.0 KiB
Lua

local MallSkinCtrl = class("MallSkinCtrl", BaseCtrl)
MallSkinCtrl._mapNodeConfig = {
sv = {
sComponentName = "LoopScrollView"
},
cgSv = {
sNodeName = "sv",
sComponentName = "CanvasGroup"
},
tab = {},
trTab = {sComponentName = "Transform"},
svTab = {sComponentName = "ScrollRect"},
goEmpty = {},
txtSkinEmpty = {
sComponentName = "TMP_Text",
sLanguageId = "Mall_Skin_Empty"
}
}
MallSkinCtrl._mapEventConfig = {MallOrderClear = "Refresh"}
function MallSkinCtrl:Refresh(bResetPos)
if self._panel.nCurTog ~= AllEnum.MallToggle.Skin then
return
end
NovaAPI.SetCanvasGroupAlpha(self._mapNode.cgSv, 0)
local callback = function(tbList, nTime)
self:RefreshData(tbList)
self:RefreshTab()
self:RefreshList(bResetPos)
self:SetTimer(nTime)
NovaAPI.SetCanvasGroupAlpha(self._mapNode.cgSv, 1)
end
PlayerData.Mall:SendMallPackageListReq(callback)
end
function MallSkinCtrl:RefreshData(tbList)
local tbPage = PlayerData.Mall:GetPackagePage(GameEnum.MallItemType.Skin)
local tbAllList = {}
local tbPackageToPage = {}
for _, v in pairs(tbList) do
local mapCfg = ConfigTable.GetData("MallPackage", v.sId)
if mapCfg.Tag == GameEnum.MallItemType.Skin then
local nGroupId = mapCfg.GroupId
if not tbPackageToPage[nGroupId] then
tbPackageToPage[nGroupId] = {}
end
table.insert(tbPackageToPage[nGroupId], v)
table.insert(tbAllList, v)
end
end
self.tbPackagePage, self.tbPages = {}, {}
table.insert(self.tbPackagePage, tbAllList)
self.tbPages[1] = {
Id = 0,
Name = ConfigTable.GetUIText("Mall_Package_TabAll")
}
for _, v in pairs(tbPage) do
if tbPackageToPage[v.Id] then
table.insert(self.tbPackagePage, tbPackageToPage[v.Id])
table.insert(self.tbPages, v)
end
end
self.nPageCount = #self.tbPages
if self._panel.nDefaultId then
for k, v in ipairs(self.tbPages) do
if v.Id == self._panel.nDefaultId then
self.nCurTab = k
self._panel.nDefaultId = nil
break
end
end
end
if not self.tbPages[self.nCurTab] or self.nSelectPage and self.tbPages[self.nCurTab].Id ~= self.nSelectPage then
self.nCurTab = 1
end
self.nSelectPage = self.tbPages[self.nCurTab].Id
end
function MallSkinCtrl:RefreshList(bResetPos)
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self.tbCurList = self.tbPackagePage[self.nCurTab] or {}
if #self.tbCurList == 0 then
self._mapNode.goEmpty.gameObject:SetActive(true)
self._mapNode.sv.gameObject:SetActive(false)
self._mapNode.svTab.gameObject:SetActive(false)
else
self._mapNode.goEmpty.gameObject:SetActive(false)
self._mapNode.sv.gameObject:SetActive(true)
self._mapNode.svTab.gameObject:SetActive(true)
self._mapNode.sv:SetAnim(0.04)
self._mapNode.sv:Init(#self.tbCurList, self, self.OnGridRefresh, self.OnGridBtnClick, not bResetPos)
end
end
function MallSkinCtrl:RefreshTab()
NovaAPI.SetScrollHorizontal(self._mapNode.svTab, self.nPageCount > 4)
self.ctrlTab = {}
delChildren(self._mapNode.trTab)
for i = 1, self.nPageCount do
local goTab = instantiate(self._mapNode.tab, self._mapNode.trTab)
goTab:SetActive(true)
local btn = goTab.transform:Find("btnTab"):GetComponent("UIButton")
local func_Handler = ui_handler(self, self.OnBtnClick_ChangeSheet, goTab, i)
btn.onClick:AddListener(func_Handler)
self.ctrlTab[i] = self:BindCtrlByNode(goTab, "Game.UI.TemplateEx.TemplateTabCtrl")
local goTabNew = goTab.transform:Find("btnTab/AnimRoot/redDot_New").gameObject
if i == 1 then
RedDotManager.RegisterNode(RedDotDefine.Mall_Page_New, {
AllEnum.MallToggle.Skin
}, goTabNew)
else
RedDotManager.RegisterNode(RedDotDefine.Mall_Tab_New, {
AllEnum.MallToggle.Skin,
self.tbPages[i].Sort
}, goTabNew)
end
self.ctrlTab[i]:SetText(self.tbPages[i].Name)
end
for i = 1, self.nPageCount do
local nState = self:GetTabState(i)
self.ctrlTab[i]:SetSelect(i == self.nCurTab, nState)
if i == self.nCurTab and 1 < i then
self.ctrlTab[i - 1]:SetLine(false)
end
end
end
function MallSkinCtrl:SetTimer(nTime)
if self.timer ~= nil then
self.timer:Cancel(false)
self.timer = nil
end
if 0 < nTime then
self.timer = self:AddTimer(1, nTime, function()
self:Refresh(true)
EventManager.Hit("MallCloseDetail")
end, true, true, false)
end
end
function MallSkinCtrl:GetTabState(nCurTab)
local nState = 2
if nCurTab == 1 then
nState = 1
elseif nCurTab == self.nPageCount then
nState = 3
end
return nState
end
function MallSkinCtrl:OnGridRefresh(goGrid, gridIndex)
local nIndex = gridIndex + 1
local mapData = self.tbPackagePage[self.nCurTab][nIndex]
local nInstanceID = goGrid:GetInstanceID()
if not self.tbGridCtrl[nInstanceID] then
self.tbGridCtrl[nInstanceID] = self:BindCtrlByNode(goGrid, "Game.UI.Mall.MallSkinItemCtrl")
end
self.tbGridCtrl[nInstanceID]:Refresh(mapData)
end
function MallSkinCtrl:OnGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
local mapData = self.tbPackagePage[self.nCurTab][nIndex]
local mapCfg = ConfigTable.GetData("MallPackage", mapData.sId)
if not mapCfg then
return
end
local tbParam = decodeJson(mapCfg.Items)
local nSkinId = 0
for nId, v in pairs(tbParam) do
nSkinId = tonumber(nId)
break
end
local func = function()
EventManager.Hit(EventId.OpenPanel, PanelId.MallSkinPreview, self.tbCurList, nSkinId, nIndex)
end
EventManager.Hit(EventId.SetTransition, 5, func)
end
function MallSkinCtrl:ResetTab()
if not self.ctrlTab then
return
end
if self.nCurTab and self.nCurTab > 1 then
local nState = self:GetTabState(self.nCurTab)
self.ctrlTab[self.nCurTab]:SetSelect(false, nState)
self.ctrlTab[self.nCurTab - 1]:SetLine(true)
end
self.nCurTab = 1
self.ctrlTab[self.nCurTab]:SetSelect(true, 1)
end
function MallSkinCtrl:GetCurTab()
if self.tbPages[self.nCurTab].Sort == nil then
return nil
else
return self.tbPages[self.nCurTab].Sort
end
end
function MallSkinCtrl:Awake()
self.tbGridCtrl = {}
self._mapNode.goEmpty.gameObject:SetActive(false)
self._mapNode.sv.gameObject:SetActive(false)
self._mapNode.svTab.gameObject:SetActive(false)
end
function MallSkinCtrl:OnEnable()
end
function MallSkinCtrl:OnDisable()
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self.tbGridCtrl = {}
if self.ctrlTab then
for nTab, objCtrl in pairs(self.ctrlTab) do
self:UnbindCtrlByNode(objCtrl)
self.ctrlTab[nTab] = nil
end
self.ctrlTab = nil
end
end
function MallSkinCtrl:OnDestroy()
end
function MallSkinCtrl:OnBtnClick_ChangeSheet(btn, nIndex)
if nIndex == self.nCurTab then
return
end
local nTab = self:GetCurTab()
PlayerData.Mall:RemovePackageNew(GameEnum.MallItemType.Skin, nTab)
local nState = self:GetTabState(self.nCurTab)
self.ctrlTab[self.nCurTab]:SetSelect(false, nState)
if self.nCurTab > 1 then
self.ctrlTab[self.nCurTab - 1]:SetLine(true)
end
nState = self:GetTabState(nIndex)
self.ctrlTab[nIndex]:SetSelect(true, nState)
if 1 < nIndex then
self.ctrlTab[nIndex - 1]:SetLine(false)
end
self.nCurTab = nIndex
self.nSelectPage = self.tbPages[self.nCurTab].Id
self:RefreshList(true)
end
return MallSkinCtrl