Files
SL1900 b5f384616a Update - 1.4.0.77
EN: 1.4.0.77
CN: 1.4.0.79
JP: 1.4.0.81
KR: 1.4.0.84
2026-01-06 14:30:00 +09:00

217 lines
6.4 KiB
Lua

local DiscListCtrl = class("DiscListCtrl", BaseCtrl)
DiscListCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
imgEmpty = {},
labEmpty = {
sNodeName = "txt_EmptyTitle",
sComponentName = "TMP_Text",
sLanguageId = "Filter_NoAim"
},
sv = {
sComponentName = "LoopScrollView"
},
btnFilter = {
sComponentName = "UIButton",
callback = "OnBtnClick_Filter"
},
imgFilterChoose = {},
aniPanel = {
sNodeName = "----SafeAreaRoot----",
sComponentName = "Animator"
},
goSortDropdown = {
sCtrlName = "Game.UI.TemplateEx.TemplateDropdownCtrl"
},
btnOrder = {
sComponentName = "UIButton",
callback = "OnBtnClick_Order"
},
imgArrowUpEnable = {},
imgArrowUpDisable = {},
imgArrowDownEnable = {},
imgArrowDownDisable = {},
btnBreakLimitAll = {
sComponentName = "UIButton",
callback = "OnBtnClick_BreakLimitAll"
},
txtBtnBreakLimitAll = {
sComponentName = "TMP_Text",
sLanguageId = "Disc_Btn_BreakLimitAll"
}
}
DiscListCtrl._mapEventConfig = {
[EventId.FilterConfirm] = "RefreshByFilter",
SelectTemplateDD = "OnEvent_SortRuleChange"
}
function DiscListCtrl:Refresh()
local isDirty = PlayerData.Filter:IsDirty(AllEnum.OptionType.Disc)
self._mapNode.imgFilterChoose:SetActive(isDirty)
self:FilterDisc()
self:SortDisc()
self:RefreshOrderState()
self:RefreshAllBreakLimit()
local nCurCount = #self.tbSortedDisc
if 0 < nCurCount then
self._mapNode.imgEmpty:SetActive(false)
self._mapNode.sv.gameObject:SetActive(true)
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self._mapNode.sv:Init(nCurCount, self, self.OnGridRefresh, self.OnGridBtnClick, self.bFirstIn == false)
else
self._mapNode.imgEmpty:SetActive(true)
self._mapNode.sv.gameObject:SetActive(false)
end
end
function DiscListCtrl:FilterDisc()
self.tbSortedDisc = {}
for _, data in pairs(self.tbAllDisc) do
local mapCfg = ConfigTable.GetData("Disc", data.nId)
if mapCfg.Visible then
local isFilter = PlayerData.Filter:CheckFilterByDisc(data.nId)
if isFilter then
table.insert(self.tbSortedDisc, data)
end
end
end
end
function DiscListCtrl:SortDisc()
self.tbDiscId = {}
UTILS.SortByPriority(self.tbSortedDisc, {
AllEnum.DiscSortField[self.tbSortCfg.nSortType]
}, PlayerData.Disc:GetDiscSortField(), self.tbSortCfg.bOrder)
for i = 1, #self.tbSortedDisc do
table.insert(self.tbDiscId, self.tbSortedDisc[i].nId)
end
end
function DiscListCtrl:OnGridRefresh(goGrid, gridIndex)
local nIndex = gridIndex + 1
local nInstanceId = goGrid:GetInstanceID()
if not self.tbGridCtrl[nInstanceId] then
self.tbGridCtrl[nInstanceId] = self:BindCtrlByNode(goGrid, "Game.UI.TemplateEx.TemplateDiscCtrl")
end
self.tbGridCtrl[nInstanceId]:Refresh(self.tbSortedDisc[nIndex].nId)
end
function DiscListCtrl:OnGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
EventManager.Hit(EventId.OpenPanel, PanelId.Disc, self.tbSortedDisc[nIndex].nId, self.tbDiscId)
self._panel._nFadeInType = 2
end
function DiscListCtrl:RefreshOrderState()
self._mapNode.imgArrowUpEnable:SetActive(self.tbSortCfg.bOrder)
self._mapNode.imgArrowUpDisable:SetActive(not self.tbSortCfg.bOrder)
self._mapNode.imgArrowDownEnable:SetActive(not self.tbSortCfg.bOrder)
self._mapNode.imgArrowDownDisable:SetActive(self.tbSortCfg.bOrder)
end
function DiscListCtrl:RefreshAllBreakLimit()
self.tbMat = PlayerData.Disc:GetAllBreakLimitMat()
self._mapNode.btnBreakLimitAll.gameObject:SetActive(next(self.tbMat) ~= nil)
end
function DiscListCtrl:FadeIn(bPlayFadeIn)
if self._panel._nFadeInType == 1 then
EventManager.Hit(EventId.SetTransition)
self._mapNode.aniPanel:SetTrigger("tIn")
EventManager.Hit(EventId.TemporaryBlockInput, 0.4)
end
end
function DiscListCtrl:Awake()
self.tbFilterCfg = {}
self.bFirstIn = true
self.bOpen = false
end
function DiscListCtrl:OnEnable()
self.tbSortCfg = {
nSortType = PlayerData.Filter.nFormationDiscSrotType,
bOrder = PlayerData.Filter.bFormationDiscOrder
}
local curSortIdx = 1
local tbSortType = PlayerData.Char:GetCharSortType()
for nIdx, nSortType in ipairs(tbSortType) do
if self.tbSortCfg.nSortType == nSortType then
curSortIdx = nIdx
end
end
self._mapNode.goSortDropdown:SetList(PlayerData.Disc:GetDiscSortNameTextCfg(), curSortIdx - 1)
self.tbAllDisc = PlayerData.Disc:GetAllDisc()
self.tbSortedDisc = {}
self.tbDiscId = {}
self.tbGridCtrl = {}
self:Refresh()
self.bOpen = true
end
function DiscListCtrl:OnDisable()
self.bOpen = false
self.tbSortedDisc = nil
self.tbDiscId = nil
self.tbAllDisc = nil
self.bFirstIn = false
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self.tbGridCtrl = {}
end
function DiscListCtrl:OnDestroy()
self.tbFilterCfg = nil
self.tbSortCfg = nil
end
function DiscListCtrl:RefreshByFilter()
self:Refresh()
end
function DiscListCtrl:OnEvent_SortRuleChange(nValue)
if not self.bOpen then
return
end
local nV = nValue + 1
self.tbSortCfg.nSortType = PlayerData.Disc:GetDiscSortType()[nV]
self.tbSortCfg.bOrder = false
PlayerData.Filter:CacheDiscSort(self.tbSortCfg.nSortType, self.tbSortCfg.bOrder)
self:Refresh()
end
function DiscListCtrl:OnBtnClick_Order(btn)
self.tbSortCfg.bOrder = not self.tbSortCfg.bOrder
PlayerData.Filter:CacheDiscSort(self.tbSortCfg.nSortType, self.tbSortCfg.bOrder)
self:Refresh()
end
function DiscListCtrl:OnBtnClick_Filter()
local tbOption = {
AllEnum.ChooseOption.Star_Rarity,
AllEnum.ChooseOption.Star_Element,
AllEnum.ChooseOption.Star_Tag,
AllEnum.ChooseOption.Star_Note
}
EventManager.Hit(EventId.OpenPanel, PanelId.FilterPopupPanel, tbOption)
end
function DiscListCtrl:OnCharacterScreenConfirm(tbFilterCfg)
end
function DiscListCtrl:OnBtnClick_BreakLimitAll()
local callback = function()
EventManager.Hit(EventId.OpenPanel, PanelId.DiscSucBar, {
tbMat = self.tbMat
}, AllEnum.DiscSucBar.BreakLimitAll)
self.tbAllDisc = PlayerData.Disc:GetAllDisc()
if not self.bOpen then
return
end
self:Refresh()
end
local allBreak = function()
PlayerData.Disc:SendAllDiscLimitBreakReq(callback)
end
local msg = {
nType = AllEnum.MessageBox.Item,
sTitle = ConfigTable.GetUIText("Disc_BreakLimitAll_Title"),
sContent = ConfigTable.GetUIText("Disc_BreakLimitAll_Tip"),
tbItem = self.tbMat,
callbackConfirm = function()
allBreak()
end
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
return DiscListCtrl