Files
Endfield-Data/LuaScripts/UI/Panels/ShopToken/ShopTokenCtrl.lua
2025-12-02 20:37:18 +07:00

448 lines
13 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.ShopToken
local VERTICAL_TAB_ICON = {
"item_gachabyproducts_charticket",
"item_gachabyproducts_weaponticket",
"item_gachabyproducts_potentialticket",
}
ShopTokenCtrl = HL.Class('ShopTokenCtrl', uiCtrl.UICtrl)
ShopTokenCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_SHOP_REFRESH] = '_OnShopRefresh',
[MessageConst.ON_BUY_ITEM_SUCC] = 'UpdateAll',
[MessageConst.ON_SHOP_GOODS_CONDITION_REFRESH] = '_OnShopRefresh',
}
ShopTokenCtrl.m_getItemCell = HL.Field(HL.Function)
ShopTokenCtrl.m_getTabCell = HL.Field(HL.Function)
ShopTokenCtrl.m_goodsDataList = HL.Field(HL.Userdata)
ShopTokenCtrl.m_shopSystem = HL.Field(HL.Userdata)
ShopTokenCtrl.m_shopIdToTabCell = HL.Field(HL.Table)
ShopTokenCtrl.m_shopDataList = HL.Field(HL.Table)
ShopTokenCtrl.m_currShopId = HL.Field(HL.String) << ""
ShopTokenCtrl.m_currNaviIndex = HL.Field(HL.Int) << 1
ShopTokenCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.m_shopSystem = GameInstance.player.shopSystem
self.m_phase = arg.phase
self:_InitUICallback()
self:_InitShortCut()
self:_InitContentList()
self:_InitTabList()
self:_ProcessArg(arg)
self.m_phase:HidePsStore()
end
ShopTokenCtrl.OnShow = HL.Override() << function(self)
self:UpdateAll()
if self.m_phase.m_needGameEvent then
self.m_phase.m_needGameEvent = false
EventLogManagerInst:GameEvent_ShopEnter(
self.m_phase.m_enterButton,
self.m_phase.m_enterPanel,
"",
CashShopConst.CashShopCategoryType.Token,
""
)
end
end
ShopTokenCtrl._InitShortCut = HL.Method() << function(self)
if not DeviceInfo.usingController then
return
end
self:BindInputPlayerAction("cashshop_giftpack_goto_right", function()
self:_OnGoRightList()
end, self.view.verticalTabList.groupTarget.groupId)
self:BindInputPlayerAction("cashshop_giftpack_goto_right_2", function()
self:_OnGoRightList()
end, self.view.verticalTabList.groupTarget.groupId)
self:BindInputPlayerAction("cashshop_giftpack_goto_left", function()
InputManagerInst:ToggleGroup(self.view.scrollGroupTarget.groupId, false)
self:_NaviTargetCurrTab()
end, self.view.scrollGroupTarget.groupId)
self:BindInputPlayerAction("cashshop_navigation_4_dir_left", function()
self:_OnGoLeft()
end, self.view.scrollGroupTarget.groupId)
self:BindInputPlayerAction("cashshop_navigation_4_dir_up", function()
self:_OnGoUp()
end, self.view.scrollGroupTarget.groupId)
self:BindInputPlayerAction("cashshop_navigation_4_dir_right", function()
self:_OnGoRight()
end, self.view.scrollGroupTarget.groupId)
self:BindInputPlayerAction("cashshop_navigation_4_dir_down", function()
self:_OnGoDown()
end, self.view.scrollGroupTarget.groupId)
InputManagerInst:ToggleGroup(self.view.scrollGroupTarget.groupId, false)
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({
self.view.inputGroup.groupId,
self.m_phase.cashShopCtrl.view.inputGroup.groupId,
})
end
ShopTokenCtrl.UpdateAll = HL.Method(HL.Opt(HL.Any)) << function(self, arg)
self:Refresh(self.m_goodsDataList)
end
ShopTokenCtrl._OnShopRefresh = HL.Method() << function(self)
if UIManager:IsOpen(PanelId.ShopDetail) then
UIManager:Close(PanelId.ShopDetail)
end
local shop = self.m_shopSystem:GetShopData(self.m_currShopId)
local goodList = shop:GetOpenGoodList()
self:Refresh(goodList)
end
ShopTokenCtrl.Refresh = HL.Method(HL.Any) << function(self, goodsDataList)
if goodsDataList == nil then
Notify(MessageConst.CASH_SHOP_SHOW_WALLET_BAR, {
moneyIds = {},
})
return
end
if goodsDataList.Count > 0 then
local firstGoodsData = goodsDataList[CSIndex(1)]
local templateId = firstGoodsData.goodsTemplateId
local goodsTableData = Tables.shopGoodsTable[templateId]
local moneyId = goodsTableData.moneyId
Notify(MessageConst.CASH_SHOP_SHOW_WALLET_BAR, {
moneyIds = { moneyId },
})
end
local showExchange = true
if self.m_currShopId == "shop_pay_yellow_1" then
showExchange = false
end
self.view.redemptionVoucherNode.gameObject:SetActive(showExchange)
self.view.tokensInfo.gameObject:SetActive(not showExchange)
self.m_goodsDataList = goodsDataList
self.m_shopSystem:SortGoodsList(goodsDataList)
self.view.scrollList:UpdateCount(self.m_goodsDataList.Count)
end
ShopTokenCtrl._InitTabList = HL.Method() << function(self)
local _, shopGroupData = Tables.shopGroupTable:TryGetValue(CashShopConst.CashShopCategoryType.Token)
if not shopGroupData then
return
end
self.m_shopIdToTabCell = {}
self.m_shopDataList = {}
for _, shopId in pairs(shopGroupData.shopIds) do
local _, shopData = Tables.shopTable:TryGetValue(shopId)
if shopData then
table.insert(self.m_shopDataList, shopData)
end
end
table.sort(self.m_shopDataList, Utils.genSortFunction({"shopGroupNumber"}, true))
self.m_getTabCell = UIUtils.genCachedCellFunction(self.view.verticalTabList.scrollList)
self.view.verticalTabList.scrollList.onUpdateCell:AddListener(function(obj, index)
local cell = self.m_getTabCell(obj)
local shopData = self.m_shopDataList[LuaIndex(index)]
cell.cellNameTxt.text = shopData.shopName
cell.cellNameShadownTxt.text = shopData.shopName
cell.stateController:SetState("Icon")
cell.iconImg:LoadSprite(UIConst.UI_SPRITE_ITEM, VERTICAL_TAB_ICON[LuaIndex(index)])
local shop = self.m_shopSystem:GetShopData(shopData.shopId)
self.m_currShopId = shopData.shopId
local goodList = shop:GetOpenGoodList()
local goodsIds = {}
for _, goodsData in pairs(goodList) do
table.insert(goodsIds, goodsData.goodsId)
end
cell.redDot:InitRedDot("CashShopToken", goodsIds)
cell.toggle.onValueChanged:RemoveAllListeners()
cell.toggle.onValueChanged:AddListener(function(isOn)
if isOn then
self:_SetCurrGoodsRead()
local shop = self.m_shopSystem:GetShopData(shopData.shopId)
self.m_currShopId = shopData.shopId
local goodList = shop:GetOpenGoodList()
self:Refresh(goodList)
end
end)
self.m_shopIdToTabCell[shopData.shopId] = cell
end)
self.view.verticalTabList.scrollList:UpdateCount(#self.m_shopDataList)
self.m_currShopId = self.m_shopDataList[1].shopId
end
ShopTokenCtrl._InitUICallback = HL.Method() << function(self)
local exchangeMaterialBtn = self.view.redemptionVoucherNode.voucherList
exchangeMaterialBtn.onClick:AddListener(function()
CashShopUtils.TryOpenShopTokenExchangePopUpPanel()
end)
self.view.tokensInfo.tipsButton.onClick:AddListener(function()
UIManager:Open(PanelId.InstructionBook, "ShopToken_" .. self.m_currShopId)
end)
self.view.redemptionVoucherNode.tipsButton.onClick:AddListener(function()
UIManager:Open(PanelId.InstructionBook, "ShopTokenExchangePopUp")
end)
end
ShopTokenCtrl._InitContentList = HL.Method() << function(self)
self.m_getItemCell = UIUtils.genCachedCellFunction(self.view.scrollList)
self.view.scrollList.onUpdateCell:AddListener(function(obj, index)
local cell = self.m_getItemCell(obj)
cell:InitCashShopItem(self.m_goodsDataList[(index)])
cell.view.click.customBindingViewLabelText = Language.LUA_CASH_SHOP_TOKEN_PANEL_BUTTON_BUTTON_KEY_HINT
end)
end
ShopTokenCtrl._ProcessArg = HL.Method(HL.Any) << function(self, arg)
local shopId = self.m_shopDataList[1].shopId
if arg and not string.isEmpty(arg.shopId) then
shopId = arg.shopId
arg.shopId = nil
end
local tabCell = self.m_shopIdToTabCell[shopId]
if tabCell then
tabCell.toggle:SetIsOnWithoutNotify(true)
self.m_currShopId = shopId
UIUtils.setAsNaviTarget(tabCell.toggle)
local shop = self.m_shopSystem:GetShopData(shopId)
local goodList = shop:GetOpenGoodList()
self:Refresh(goodList)
end
end
ShopTokenCtrl._SetCurrGoodsRead = HL.Method() << function(self)
local range = self.view.scrollList:GetShowRange()
local showIds = {}
for i = range.x, range.y do
if i >= 0 and i < self.m_goodsDataList.Count then
local goodsData = self.m_goodsDataList[i]
table.insert(showIds, goodsData.goodsId)
end
end
for _, goodsId in ipairs(showIds) do
GameInstance.player.shopSystem:RecordSeeGoodsId(goodsId)
end
GameInstance.player.shopSystem:SetGoodsIdSee()
end
ShopTokenCtrl._SetSingleGoodsReadByGoodsId = HL.Method(HL.String) << function(self, goodsId)
GameInstance.player.shopSystem:SetSingleGoodsIdSee(goodsId)
end
ShopTokenCtrl._SetSingleGoodsReadByIndex = HL.Method(HL.Number) << function(self, luaIndex)
local csIndex = CSIndex(luaIndex)
if csIndex >= 0 and csIndex < self.m_goodsDataList.Count then
local goodsId = self.m_goodsDataList[CSIndex(luaIndex)].goodsId
GameInstance.player.shopSystem:SetSingleGoodsIdSee(goodsId)
end
end
ShopTokenCtrl._OnGoRightList = HL.Method() << function(self)
logger.info("ShopTokenCtrl._OnGoRightList 被触发")
InputManagerInst:ToggleGroup(self.view.verticalTabList.groupTarget.groupId, false)
self:TargetFirstCell()
end
ShopTokenCtrl.TargetFirstCell = HL.Method() << function(self)
logger.info("ShopTokenCtrl: TargetFirstCell")
InputManagerInst:ToggleGroup(self.view.scrollGroupTarget.groupId, true)
local range = self.view.scrollList:GetShowRange()
local firstCell = self.m_getItemCell(self.view.scrollList:Get(range.x))
UIUtils.setAsNaviTarget(firstCell.view.inputBindingGroupNaviDecorator)
self.m_currNaviIndex = LuaIndex(range.x)
self:_SetSingleGoodsReadByIndex(self.m_currNaviIndex)
end
ShopTokenCtrl._NaviTargetCurrTab = HL.Method() << function(self)
logger.info("ShopTokenCtrl: _NaviTargetCurrTab")
local currTabCell = self.m_shopIdToTabCell[self.m_currShopId]
UIUtils.setAsNaviTarget(currTabCell.toggle)
InputManagerInst:ToggleGroup(self.view.verticalTabList.groupTarget.groupId, true)
end
ShopTokenCtrl._OnGoLeft = HL.Method() << function(self)
logger.info("ShopTokenCtrl: _OnGoLeft")
local currIndex = self.m_currNaviIndex
local countPerLine = self.view.scrollList.countPerLine
if currIndex and currIndex % countPerLine == 1 then
InputManagerInst:ToggleGroup(self.view.scrollGroupTarget.groupId, false)
self:_NaviTargetCurrTab()
logger.info("ShopTokenCtrl: _OnGoLeft: NaviTargetCurrTab, currIndex is: " .. currIndex)
else
local targetCell = self.m_getItemCell(self.view.scrollList:Get(CSIndex(currIndex - 1)))
UIUtils.setAsNaviTarget(targetCell.view.inputBindingGroupNaviDecorator)
self.m_currNaviIndex = self.m_currNaviIndex - 1
self:_SetSingleGoodsReadByIndex(self.m_currNaviIndex)
end
end
ShopTokenCtrl._OnGoUp = HL.Method() << function(self)
local countPerLine = self.view.scrollList.countPerLine
local targetIndex = self.m_currNaviIndex - countPerLine
if targetIndex <= 0 then
return
end
local targetCell = self.m_getItemCell(self.view.scrollList:Get(CSIndex(targetIndex)))
UIUtils.setAsNaviTarget(targetCell.view.inputBindingGroupNaviDecorator)
self.m_currNaviIndex = targetIndex
self:_SetSingleGoodsReadByIndex(self.m_currNaviIndex)
end
ShopTokenCtrl._OnGoRight = HL.Method() << function(self)
local targetIndex = self.m_currNaviIndex + 1
if targetIndex > self.m_goodsDataList.Count then
return
end
local targetCell = self.m_getItemCell(self.view.scrollList:Get(CSIndex(targetIndex)))
UIUtils.setAsNaviTarget(targetCell.view.inputBindingGroupNaviDecorator)
self.m_currNaviIndex = targetIndex
self:_SetSingleGoodsReadByIndex(self.m_currNaviIndex)
end
ShopTokenCtrl._OnGoDown = HL.Method() << function(self)
local countPerLine = self.view.scrollList.countPerLine
local targetIndex = self.m_currNaviIndex + countPerLine
if targetIndex > self.m_goodsDataList.Count then
local lineNumber = (self.m_goodsDataList.Count // countPerLine) +
((self.m_goodsDataList.Count % countPerLine > 0) and 1 or 0)
if self.m_currNaviIndex <= countPerLine * (lineNumber - 1) then
targetIndex = self.m_goodsDataList.Count
else
return
end
end
local targetCell = self.m_getItemCell(self.view.scrollList:Get(CSIndex(targetIndex)))
UIUtils.setAsNaviTarget(targetCell.view.inputBindingGroupNaviDecorator)
self.m_currNaviIndex = targetIndex
self:_SetSingleGoodsReadByIndex(self.m_currNaviIndex)
end
HL.Commit(ShopTokenCtrl)