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

405 lines
13 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
WikiDetailBaseCtrl = HL.Class('WikiDetailBaseCtrl', uiCtrl.UICtrl)
WikiDetailBaseCtrl.s_messages = HL.StaticField(HL.Table) << {
}
WikiDetailBaseCtrl.m_wikiEntryShowData = HL.Field(HL.Table)
WikiDetailBaseCtrl.m_wikiGroupShowDataList = HL.Field(HL.Table)
WikiDetailBaseCtrl.m_itemTipsPosInfo = HL.Field(HL.Table)
WikiDetailBaseCtrl.m_needHideModel = HL.Field(HL.Boolean) << true
WikiDetailBaseCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self:_InitController()
local args = arg
self.m_wikiEntryShowData = args.wikiEntryShowData
self.m_wikiGroupShowDataList = args.wikiGroupShowDataList
self.m_itemTipsPosInfo = {
tipsPosType = UIConst.UI_TIPS_POS_TYPE.LeftTop,
isSideTips = false,
}
if self.view.right and self.view.right.itemTipsNode then
self.m_itemTipsPosInfo.tipsPosTransform = self.view.right.itemTipsNode
end
if self.view.prtsBtn then
self.view.prtsBtn.btn.onClick:AddListener(function()
PhaseManager:GoToPhase(PhaseId.PRTSStoryCollDetail, {
id = self.m_wikiEntryShowData.wikiEntryData.prtsId,
isFirstLvId = false,
})
end)
end
self:_RefreshLeft()
self:_RefreshCenter()
self:_RefreshRight()
end
WikiDetailBaseCtrl.OnClose = HL.Override() << function(self)
if self.m_phase then
self.m_phase:DestroyModel()
end
end
WikiDetailBaseCtrl.OnShow = HL.Override() << function(self)
if self.m_phase then
self.m_phase:ActiveModelRotateRoot(true)
if self.m_phase.m_currentWikiDetailArgs and
self.m_phase.m_currentWikiDetailArgs.wikiEntryShowData.wikiEntryData.id ~= self.m_wikiEntryShowData.wikiEntryData.id then
self:Refresh(self.m_phase.m_currentWikiDetailArgs)
end
end
self.m_needHideModel = true
end
WikiDetailBaseCtrl.OnHide = HL.Override() << function(self)
if self.m_needHideModel and self.m_phase then
self.m_phase:ActiveModelRotateRoot(false)
end
end
WikiDetailBaseCtrl._OnPhaseItemBind = HL.Override() << function(self)
self:_RefreshTop()
end
WikiDetailBaseCtrl.GetPanelId = HL.Virtual().Return(HL.Number) << function(self)
end
WikiDetailBaseCtrl._RefreshTop = HL.Virtual() << function(self)
local wikiTopArgs = {
phase = self.m_phase,
panelId = self:GetPanelId(),
categoryType = self.m_wikiEntryShowData.wikiCategoryType,
wikiEntryShowData = self.m_wikiEntryShowData
}
self.view.top:InitWikiTop(wikiTopArgs)
end
WikiDetailBaseCtrl._RefreshCenter = HL.Virtual() << function(self)
local args = {
wikiEntryShowData = self.m_wikiEntryShowData,
onDetailBtnClick = function()
self:PlayAnimationOutWithCallback(function()
self.m_needHideModel = false
self.m_phase:CreatePhasePanelItem(PanelId.WikiModelShow, self.m_wikiEntryShowData)
end)
end
}
self.view.wikiItemInfo:InitWikiItemInfo(args)
if self.view.prtsBtn then
local prtsId = self.m_wikiEntryShowData.wikiEntryData.prtsId
if not string.isEmpty(prtsId) then
local _, prtsData = Tables.prtsAllItem:TryGetValue(prtsId)
if prtsData then
self.view.prtsBtn.titleTxt.text = prtsData.name
end
end
self.view.prtsBtn.gameObject:SetActive(Utils.isSystemUnlocked(GEnums.UnlockSystemType.PRTS) and
not string.isEmpty(prtsId) and GameInstance.player.prts:IsPrtsUnlocked(prtsId))
end
end
WikiDetailBaseCtrl._RefreshLeft = HL.Virtual() << function(self)
local wikiGroupItemListArgs = {
isInitHidden = true,
wikiGroupShowDataList = self.m_wikiGroupShowDataList,
onItemClicked = function(wikiEntryShowData)
self.m_wikiEntryShowData = wikiEntryShowData
self.m_phase.m_currentWikiDetailArgs = {
categoryType = self.m_wikiEntryShowData.wikiCategoryType,
wikiEntryShowData = self.m_wikiEntryShowData,
wikiGroupShowDataList = self.m_wikiGroupShowDataList
}
self:_RefreshTop()
self:_RefreshCenter()
self:_RefreshRight()
end,
onGetSelectedEntryShowData = function()
return self.m_wikiEntryShowData
end,
btnExpandList = self.view.expandListBtn,
btnClose = self.view.btnEmpty,
wikiItemInfo = self.view.wikiItemInfo,
}
self.view.left:InitWikiGroupItemList(wikiGroupItemListArgs)
end
WikiDetailBaseCtrl._RefreshRight = HL.Virtual() << function(self)
end
WikiDetailBaseCtrl.Refresh = HL.Method(HL.Table) << function(self, args)
if self.view.right.naviGroup then
self.view.right.naviGroup:ManuallyStopFocus()
if self.view.left.gameObject.activeSelf then
self.view.left:_OnCloseBtnClicked(true)
end
end
self.m_wikiEntryShowData = args.wikiEntryShowData
self.m_wikiGroupShowDataList = args.wikiGroupShowDataList
self:_RefreshTop()
self:_RefreshCenter()
self:_RefreshRight()
end
WikiDetailBaseCtrl.m_closeItemTipsBindingId = HL.Field(HL.Number) << -1
WikiDetailBaseCtrl.m_currentNaviCraftCellView = HL.Field(HL.Table)
WikiDetailBaseCtrl._InitController = HL.Virtual() << function(self)
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({self.view.inputGroup.groupId})
if self.view.right.naviGroup then
self.view.right.naviGroup.onIsFocusedChange:AddListener(function(isFocused)
self.view.right.controllerFocusHintNode.gameObject:SetActive(not isFocused)
if not isFocused then
Notify(MessageConst.HIDE_ITEM_TIPS)
end
end)
end
UIUtils.bindHyperlinkPopup(self, "wiki_detail_right", self.view.inputGroup.groupId)
if self.view.selectableNaviGroup then
self.view.selectableNaviGroup:NaviToThisGroup()
end
if self.view.right.inputGroup then
self.m_closeItemTipsBindingId = self:BindInputPlayerAction("common_cancel_no_hint", function()
Notify(MessageConst.HIDE_ITEM_TIPS)
InputManagerInst:ToggleBinding(self.m_closeItemTipsBindingId, false)
end, self.view.right.inputGroup.groupId)
InputManagerInst:ToggleBinding(self.m_closeItemTipsBindingId, false)
end
end
WikiDetailBaseCtrl._InitItemObtainWaysController = HL.Method(HL.Userdata).Return(CS.UnityEngine.UI.Selectable, CS.Beyond.UI.UISelectableNaviGroup) << function(self, itemObtainWaysForWiki)
local lastCraftFirstSelectable = nil
local lastNaviGroup = nil
for i = 1, itemObtainWaysForWiki.m_obtainCells:GetCount() do
local obtainCell = itemObtainWaysForWiki.m_obtainCells:GetItem(i)
obtainCell.normalNode.button.onIsNaviTargetChanged = function(isTarget)
if isTarget then
self.view.right.scrollRect:ScrollToNaviTarget(obtainCell.normalNode.button)
Notify(MessageConst.HIDE_ITEM_TIPS)
end
end
obtainCell.normalNode.button.useExplicitNaviSelect = true
if lastCraftFirstSelectable then
obtainCell.normalNode.button.banExplicitOnUp = false
obtainCell.normalNode.button:SetExplicitSelectOnUp(lastCraftFirstSelectable)
lastCraftFirstSelectable.useExplicitNaviSelect = true
lastCraftFirstSelectable.banExplicitOnLeft = true
lastCraftFirstSelectable.banExplicitOnRight = true
lastCraftFirstSelectable.banExplicitOnUp = true
lastCraftFirstSelectable.banExplicitOnDown = false
lastCraftFirstSelectable:SetExplicitSelectOnDown(obtainCell.normalNode.button)
else
obtainCell.normalNode.button.banExplicitOnUp = true
end
local firstItemSelectable
for j = 1, obtainCell.craftCells:GetCount() do
local craftCell = obtainCell.craftCells:GetItem(j)
craftCell.pinKeyHint.gameObject:SetActive(false)
if DeviceInfo.usingController then
InputManagerInst:ToggleBinding(craftCell.pinBtn.view.pinToggle.toggleBindingId, false)
end
for k = 1, craftCell.itemCells:GetCount() do
local itemCell = craftCell.itemCells:GetItem(k)
local selectable = itemCell.view.button
selectable.useExplicitNaviSelect = false
selectable.onIsNaviTargetChanged = function(isTarget)
self:_OnRightItemIsNaviTargetChanged(isTarget, selectable, craftCell)
end
if firstItemSelectable == nil then
firstItemSelectable = selectable
end
if k == 1 then
lastCraftFirstSelectable = selectable
end
end
craftCell.selectableNaviGroup.naviPartnerOnDown:Clear()
lastNaviGroup = craftCell.selectableNaviGroup
end
if firstItemSelectable then
obtainCell.normalNode.button.banExplicitOnDown = false
obtainCell.normalNode.button:SetExplicitSelectOnDown(firstItemSelectable)
firstItemSelectable.useExplicitNaviSelect = true
firstItemSelectable.banExplicitOnLeft = true
firstItemSelectable.banExplicitOnRight = true
firstItemSelectable.banExplicitOnDown = true
firstItemSelectable.banExplicitOnUp = false
firstItemSelectable:SetExplicitSelectOnUp(obtainCell.normalNode.button)
else
obtainCell.normalNode.button.banExplicitOnDown = true
end
end
itemObtainWaysForWiki.view.emptyNode.button.onIsNaviTargetChanged = function(isTarget)
if isTarget then
self.view.right.scrollRect:ScrollToNaviTarget(itemObtainWaysForWiki.view.emptyNode.button)
Notify(MessageConst.HIDE_ITEM_TIPS)
end
end
itemObtainWaysForWiki.view.selectableNaviGroup.naviPartnerOnDown:Clear()
if not lastNaviGroup then
lastNaviGroup = itemObtainWaysForWiki.view.selectableNaviGroup
end
return lastCraftFirstSelectable, lastNaviGroup
end
WikiDetailBaseCtrl._OnRightItemIsNaviTargetChanged = HL.Method(HL.Boolean, HL.Userdata, HL.Opt(HL.Table)) << function(self, isTarget, selectable, craftCellView)
if not DeviceInfo.usingController then
return
end
local isItemTipsShown = UIManager:IsShow(PanelId.ItemTips)
if craftCellView and not isItemTipsShown and craftCellView.pinBtn.gameObject.activeSelf then
InputManagerInst:ToggleBinding(craftCellView.pinBtn.view.pinToggle.toggleBindingId, isTarget)
craftCellView.pinKeyHint.gameObject:SetActive(isTarget)
end
if isTarget then
if self.view.right.scrollRect then
self.view.right.scrollRect:ScrollToNaviTarget(selectable)
end
if isItemTipsShown then
selectable.onClick:Invoke(nil)
InputManagerInst:ToggleBinding(selectable.hoverConfirmBindingId, false)
InputManagerInst:ToggleBinding(self.view.right.naviGroup.StopFocusBindingId, false)
end
end
self.m_itemTipsPosInfo.isSideTips = UIManager:IsShow(PanelId.ItemTips)
self.m_currentNaviCraftCellView = isTarget and craftCellView or nil
end
WikiDetailBaseCtrl._OnClickRightItemCell = HL.Method(HL.Userdata, HL.Opt(HL.Table)) << function(self, cell, craftCellView)
self.m_itemTipsPosInfo.isSideTips = true
cell:ShowTips(nil, function()
if not DeviceInfo.usingController or self.m_isClosed then
return
end
if not UIManager:IsShow(PanelId.ItemTips) then
if InputManagerInst.controllerNaviManager.curTarget == cell.view.button then
InputManagerInst:ToggleBinding(cell.view.button.hoverConfirmBindingId, true)
end
InputManagerInst:ToggleBinding(self.view.right.naviGroup.StopFocusBindingId, true)
InputManagerInst:ToggleBinding(self.m_closeItemTipsBindingId, false)
end
if self.m_currentNaviCraftCellView then
if self.m_currentNaviCraftCellView.pinBtn.gameObject.activeSelf then
InputManagerInst:ToggleBinding(self.m_currentNaviCraftCellView.pinBtn.view.pinToggle.toggleBindingId, true)
self.m_currentNaviCraftCellView.pinKeyHint.gameObject:SetActive(true)
end
end
self.m_itemTipsPosInfo.isSideTips = false
local isItemTipsShown = UIManager:IsShow(PanelId.ItemTips)
if not isItemTipsShown and InputManagerInst.controllerNaviManager.curTarget == cell.view.button then
cell:_OnHoverChange(true)
end
end)
if DeviceInfo.usingController then
InputManagerInst:ToggleBinding(cell.view.button.hoverConfirmBindingId, false)
InputManagerInst:ToggleBinding(self.m_closeItemTipsBindingId, true)
InputManagerInst:ToggleBinding(self.view.right.naviGroup.StopFocusBindingId, false)
if craftCellView then
InputManagerInst:ToggleBinding(craftCellView.pinBtn.view.pinToggle.toggleBindingId, false)
craftCellView.pinKeyHint.gameObject:SetActive(false)
end
end
end
HL.Commit(WikiDetailBaseCtrl)