Files
Endfield-Data/LuaScripts/UI/Widgets/GemItemList.lua
2025-12-02 20:37:18 +07:00

357 lines
9.1 KiB
Lua

local UIWidgetBase = require_ex('Common/Core/UIWidgetBase')
local LIST_CONFIG = {
[GEnums.ItemType.WeaponGem] = {
filterTagGroupFunc = "generateConfig_WEAPON_EXHIBIT_GEM",
infoProcessFunc = "processWeaponGem",
sortOption = UIConst.WEAPON_GEM_SORT_OPTION,
getDepotFunc = "_GetWeaponGemDepot"
},
}
GemItemList = HL.Class('GemItemList', UIWidgetBase)
GemItemList.m_getItemCell = HL.Field(HL.Function)
GemItemList.m_itemInfoList = HL.Field(HL.Table)
GemItemList.m_filteredInfoList = HL.Field(HL.Table)
GemItemList.m_selectedTags = HL.Field(HL.Table)
GemItemList.m_curSelectIndex = HL.Field(HL.Number) << 0
GemItemList.m_curSelectId = HL.Field(HL.Any) << 0
GemItemList.m_filterTagGroups = HL.Field(HL.Table)
GemItemList.m_onClickItem = HL.Field(HL.Function)
GemItemList.m_onLongPressItem = HL.Field(HL.Function)
GemItemList.m_refreshItemAddOn = HL.Field(HL.Function)
GemItemList.m_isItemSelected = HL.Field(HL.Function)
GemItemList._OnFirstTimeInit = HL.Override() << function(self)
self.m_getItemCell = UIUtils.genCachedCellFunction(self.view.itemList)
self.view.itemList.onUpdateCell:AddListener(function(object, csIndex)
self:_RefreshItemCell(object, LuaIndex(csIndex))
end)
self.view.filterBtn.normal.onClick:AddListener(function()
self.view.commonFilterList.gameObject:SetActive(true)
end)
self.view.filterBtn.haveSelected.onClick:AddListener(function()
self.view.commonFilterList.gameObject:SetActive(true)
end)
end
GemItemList.InitGemItemList = HL.Method(HL.Table) << function(self, arg)
self:_FirstTimeInit()
local listConfig = LIST_CONFIG[arg.itemType]
local skipGraduallyShow = arg.skipGraduallyShow
self.m_onClickItem = arg.onClickItem
self.m_onLongPressItem = arg.onLongPressItem
self.m_refreshItemAddOn = arg.refreshItemAddOn
self.m_isItemSelected = arg.isItemSelected
self.m_curSelectIndex = 0
self.m_curSelectId = 0
self:_InitSortNode(listConfig)
self:_InitFilterNode(listConfig)
local itemInfoList = self:_CollectItemInfoList(listConfig)
if not itemInfoList then
return
end
local filteredList = self:_ApplyFilter(itemInfoList, self.m_selectedTags)
filteredList = self:_ApplySort(filteredList, self.view.sortNode:GetCurSortData(), self.view.sortNode.isIncremental)
self.m_itemInfoList = itemInfoList
self.m_filteredInfoList = filteredList
self:_RefreshItemList(filteredList, skipGraduallyShow)
end
GemItemList.SetSelectedId = HL.Method(HL.Opt(HL.Any)) << function(self, id)
if not id then
self:SetSelectedIndex(1)
return
end
for index, filteredInfo in pairs(self.m_filteredInfoList) do
if type(filteredInfo.indexId) == type(id) and filteredInfo.indexId == id then
self:SetSelectedIndex(index)
return
end
end
self:SetSelectedIndex(1)
end
GemItemList.SetSelectedIndex = HL.Method(HL.Opt(HL.Number)) << function(self, luaIndex)
if luaIndex == nil then
return
end
if CSIndex(luaIndex) >= 0 then
self.view.itemList:ScrollToIndex(CSIndex(luaIndex))
end
local curGo = self.view.itemList:Get(CSIndex(self.m_curSelectIndex))
if curGo then
local curCell = self.m_getItemCell(curGo)
if curCell then
curCell.itemBig.view.selectedBG.gameObject:SetActive(false)
end
end
local nextGo = self.view.itemList:Get(CSIndex(luaIndex))
if nextGo then
local nextCell = self.m_getItemCell(nextGo)
if nextCell then
nextCell.itemBig.view.selectedBG.gameObject:SetActive(true)
end
end
local selectedInfo = self.m_filteredInfoList[luaIndex]
self.m_curSelectIndex = luaIndex
self.m_curSelectId = selectedInfo and self.m_filteredInfoList[luaIndex].indexId or 0
if self.m_onClickItem then
self.m_onClickItem(selectedInfo)
end
end
GemItemList._InitSortNode = HL.Method(HL.Table) << function(self, listConfig)
local sortOption = listConfig.sortOption or {}
self.view.sortNode:InitSortNode(sortOption, function(optData, isIncremental)
local filteredList = self.m_filteredInfoList
if not filteredList then
return
end
filteredList = self:_ApplySort(filteredList, optData, isIncremental)
self.view.emptyNode.gameObject:SetActive(#filteredList == 0)
self.view.itemList:UpdateCount(#filteredList, false, false, false, false)
self:SetSelectedId(self.m_curSelectId)
end)
end
GemItemList._InitFilterNode = HL.Method(HL.Table) << function(self, listConfig)
local filterTagGroups = {}
local filterTagGroupFunc = listConfig.filterTagGroupFunc
if filterTagGroupFunc and FilterUtils[filterTagGroupFunc] then
filterTagGroups = FilterUtils[filterTagGroupFunc]() or {}
end
self.m_selectedTags = {}
self.m_filterTagGroups = filterTagGroups
local hasFilter = filterTagGroups and next(filterTagGroups)
self.view.filterBtn.gameObject:SetActive(hasFilter)
self.view.commonFilterList:InitFilterListWithTagGroups(filterTagGroups, function(tags)
local itemInfoList = self.m_itemInfoList
local filteredList = self:_ApplyFilter(itemInfoList, tags)
filteredList = self:_ApplySort(filteredList, self.view.sortNode:GetCurSortData(), self.view.sortNode.isIncremental)
self.m_selectedTags = tags
self.m_filteredInfoList = filteredList
self:_RefreshItemList(filteredList, false)
self:SetSelectedId(self.m_curSelectId)
self.view.commonFilterList.gameObject:SetActive(false)
end, self.m_selectedTags)
end
GemItemList._RefreshItemList = HL.Method(HL.Table, HL.Opt(HL.Boolean)) << function(self, filteredList, skipGraduallyShow)
self.view.emptyNode.gameObject:SetActive(#filteredList == 0)
self.view.itemList:UpdateCount(#filteredList, false, false, false, skipGraduallyShow == true)
end
GemItemList._RefreshItemCell = HL.Method(HL.Userdata, HL.Number) << function(self, object, index)
local itemCell = self.m_getItemCell(object)
local itemInfo = self.m_filteredInfoList[index]
itemCell.itemBig:InitItem({
id = itemInfo.itemCfg.id,
instId = itemInfo.itemInst.instId,
count = 1,
}, true)
itemCell.itemBig.view.button.onClick:RemoveAllListeners()
itemCell.itemBig.view.button.onClick:AddListener(function()
self:SetSelectedIndex(index)
end)
itemCell.itemBig.view.button.onLongPress:RemoveAllListeners()
itemCell.itemBig.view.button.onLongPress:AddListener(function()
if self.m_onLongPressItem then
self.m_onLongPressItem(itemInfo)
end
end)
if self.m_refreshItemAddOn then
self.m_refreshItemAddOn(itemCell, itemInfo)
end
if self.m_isItemSelected then
itemCell.itemBig.view.selectedBG.gameObject:SetActive(self.m_isItemSelected(itemCell, itemInfo))
end
end
GemItemList._ApplyFilter = HL.Method(HL.Table, HL.Table).Return(HL.Table) << function(self, itemInfoList, selectedTags)
if not selectedTags or not next(selectedTags) then
return itemInfoList
end
local filteredList = {}
for _, itemInfo in pairs(itemInfoList) do
if FilterUtils.checkIfPassFilter(itemInfo, selectedTags) then
table.insert(filteredList, itemInfo)
end
end
return filteredList
end
GemItemList._ApplySort = HL.Method(HL.Table, HL.Table, HL.Boolean).Return(HL.Table) << function(self, itemInfoList, optData, isIncremental)
if not optData or not next(optData) then
return itemInfoList
end
if isIncremental == nil then
isIncremental = true
end
table.sort(itemInfoList, Utils.genSortFunction(optData.keys, isIncremental))
return itemInfoList
end
GemItemList._CollectItemInfoList = HL.Method(HL.Table).Return(HL.Table) << function(self, listConfig)
local itemInfoList = {}
local index = 1
local listItems
local depotFunc = listConfig.getDepotFunc
listItems = self[depotFunc](self)
if not listItems then
return
end
for _, itemBundle in pairs(listItems) do
local templateId = itemBundle.id
local instId = itemBundle.instId or 0
local instData = itemBundle.instData
local _, itemCfg = Tables.itemTable:TryGetValue(templateId)
if not itemCfg then
logger.error("GemItemList-> Can't get itemCfg for templateId: " .. templateId)
else
local infoProcessFunc = listConfig.infoProcessFunc
local itemInfo = FilterUtils[infoProcessFunc](templateId, instId)
itemInfo.itemCfg = itemCfg
itemInfo.itemInst = instData
table.insert(itemInfoList, itemInfo)
index = index + 1
end
end
return itemInfoList
end
GemItemList._GetWeaponGemDepot = HL.Method().Return(HL.Userdata) << function(self)
local gemDepot = GameInstance.player.inventory.valuableDepots[GEnums.ItemValuableDepotType.WeaponGem]:GetOrFallback(Utils.getCurrentScope())
if not gemDepot then
return
end
return gemDepot.instItems
end
HL.Commit(GemItemList)
return GemItemList