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

1294 lines
40 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.HyperlinkPopup
HyperlinkPopupCtrl = HL.Class('HyperlinkPopupCtrl', uiCtrl.UICtrl)
HyperlinkPopupCtrl.s_messages = HL.StaticField(HL.Table) << {
}
HyperlinkPopupCtrl.IsRestore = HL.StaticField(HL.Boolean) << false
HyperlinkPopupCtrl.m_args = HL.Field(HL.Table)
HyperlinkPopupCtrl.m_genTermCells = HL.Field(HL.Forward("UIListCache"))
HyperlinkPopupCtrl.m_genOriginalTxtCells = HL.Field(HL.Forward("UIListCache"))
HyperlinkPopupCtrl.m_maxTermCellCount = HL.Field(HL.Number) << 0
HyperlinkPopupCtrl.m_termDataStack = HL.Field(HL.Forward("Stack"))
HyperlinkPopupCtrl.m_originalTextDataList = HL.Field(HL.Table)
HyperlinkPopupCtrl.m_targetUITextIndex = HL.Field(HL.Number) << 0
HyperlinkPopupCtrl.m_baseLinkId = HL.Field(HL.String) << ""
HyperlinkPopupCtrl.m_refreshTermCellFunc = HL.Field(HL.Function)
HyperlinkPopupCtrl.m_clickTargetTextLinkFunc = HL.Field(HL.Function)
HyperlinkPopupCtrl.m_onOriginalTxtHoverLinkChangeFunc = HL.Field(HL.Function)
HyperlinkPopupCtrl.m_clickTermTextLinkFunc = HL.Field(HL.Function)
local LayerType = {
None = 0,
OriginalText = 1,
TermList = 2,
}
HyperlinkPopupCtrl.m_curFocusLayer = HL.Field(HL.Number) << LayerType.None
HyperlinkPopupCtrl.m_usingController = HL.Field(HL.Boolean) << false
HyperlinkPopupCtrl.m_hyperlinkConfirmBindId = HL.Field(HL.Number) << 0
HyperlinkPopupCtrl.m_isNavi = HL.Field(HL.Boolean) << false
HyperlinkPopupCtrl.m_updateNaviKey = HL.Field(HL.Number) << 0
HyperlinkPopupCtrl.m_isTemporaryHideNavi = HL.Field(HL.Boolean) << false
HyperlinkPopupCtrl.OnCreate = HL.Override(HL.Any) << function(self, args)
self:_InitUI()
self.m_updateNaviKey = self:_StartUpdate(function()
if self.m_isNavi then
self:_AutoRefreshNavi()
end
end)
end
HyperlinkPopupCtrl.OnShow = HL.Override() << function(self)
if self.m_isTemporaryHideNavi then
self.m_isTemporaryHideNavi = false
self.m_isNavi = true
self:_AutoRefreshNavi()
end
end
HyperlinkPopupCtrl.OnHide = HL.Override() << function(self)
if not self.m_isTemporaryHideNavi then
self.m_isTemporaryHideNavi = true
self.m_isNavi = false
self:_ChangeNavi(nil)
end
end
HyperlinkPopupCtrl.OnClose = HL.Override() << function(self)
HyperlinkPopupCtrl.IsRestore = false
self.m_originalTextDataList = nil
self.view.originalTxt.onClickLink:RemoveListener(self.m_clickTargetTextLinkFunc)
self.m_updateNaviKey = self:_RemoveUpdate(self.m_updateNaviKey)
self:_ChangeNavi(nil)
local dataCount = self.m_termDataStack:Count()
for i = 1, dataCount do
local data = self.m_termDataStack:Get(i)
if data.tween then
data.tween:Kill()
end
end
Notify(MessageConst.HIDE_HYPERLINK_TIPS)
AudioAdapter.PostEvent("Au_UI_Popup_DetailsPanel_Close")
end
HyperlinkPopupCtrl.OnAnimationInFinished = HL.Override() << function(self)
if HyperlinkPopupCtrl.IsRestore then
HyperlinkPopupCtrl.IsRestore = false
return
end
local originalTextDataCount = #self.m_originalTextDataList
for i = 1, originalTextDataCount do
local cell = self.m_genOriginalTxtCells:Get(i)
if cell then
self.m_originalTextDataList[i].hyperTextData = HyperlinkPopupCtrl._WrapHyperTextData(cell.originalTxt)
end
end
if string.isEmpty(self.m_baseLinkId) and #self.m_originalTextDataList > 0 then
self.m_baseLinkId = self.m_originalTextDataList[1].hyperTextData.linkDataList[1].linkId
end
if not string.isEmpty(self.m_baseLinkId) then
self:_ForceRefreshBaseLink(self.m_baseLinkId)
self:_AutoRefreshNavi()
end
end
HyperlinkPopupCtrl.ShowPopup = HL.Method(HL.Any) << function(self, args)
UIManager:SetTopOrder(PANEL_ID)
self:_InitData(args)
self:_RefreshAllUI()
end
HyperlinkPopupCtrl.ShowHyperlinkPopupSingle = HL.StaticMethod(HL.Any) << function(args)
if UIManager:IsShow(PANEL_ID) then
return
end
Notify(MessageConst.HIDE_HYPERLINK_TIPS)
local isOpened = UIManager:IsOpen(PANEL_ID)
local self = UIManager:AutoOpen(PANEL_ID)
if isOpened then
self:_ClearStack()
end
local targetUIText, baseLinkId = unpack(args)
self:ShowPopup({
targetUIText = targetUIText,
baseLinkId = baseLinkId,
})
end
HyperlinkPopupCtrl.ShowHyperlinkPopupByGroupId = HL.StaticMethod(HL.String) << function(arg)
if UIManager:IsShow(PANEL_ID) then
return
end
Notify(MessageConst.HIDE_HYPERLINK_TIPS)
local isOpened = UIManager:IsOpen(PANEL_ID)
local self = UIManager:AutoOpen(PANEL_ID)
if isOpened then
self:_ClearStack()
end
self:ShowPopup({
hyperlinkUITextGroupId = arg,
})
end
HyperlinkPopupCtrl._InitData = HL.Method(HL.Table) << function(self, args)
self.m_args = args
self.m_originalTextDataList = {}
self.m_curFocusLayer = LayerType.OriginalText
self.m_targetUITextIndex = 1
local tplCellAniWrapper = self.view.termCell.animationWrapper
self.m_cellAniLengthUpIn = tplCellAniWrapper:GetClipLength("hyperlinkpopup_termcell_up_in")
self.m_cellAniLengthUpOut = tplCellAniWrapper:GetClipLength("hyperlinkpopup_termcell_up_out")
self.m_cellAniLengthDownIn = tplCellAniWrapper:GetClipLength("hyperlinkpopup_termcell_down_in")
self.m_cellAniLengthDownOut = tplCellAniWrapper:GetClipLength("hyperlinkpopup_termcell_down_out")
self.m_cellVertLayoutGroupPaddingBottom = self.view.termCell.cellVertLayoutGroup.padding.bottom
if args.targetUIText then
self.m_usingController = false
local originalTextData = {
uiText = args.targetUIText
}
table.insert(self.m_originalTextDataList, originalTextData)
self.m_baseLinkId = args.baseLinkId
elseif args.hyperlinkUITextGroupId then
self.m_usingController = true
local group = CS.Beyond.UI.UIText.GetGroupDisplayableHyperlinkUIText(args.hyperlinkUITextGroupId)
if group ~= nil then
for _, uiText in cs_pairs(group) do
local textData = {
uiText = uiText
}
table.insert(self.m_originalTextDataList, textData)
end
end
end
end
HyperlinkPopupCtrl._WrapHyperTextData = HL.StaticMethod(CS.Beyond.UI.UIText).Return(HL.Table) << function(uiText)
local textData = {
uiText = uiText,
linkDataList = {},
curFocusIndex = 1,
lineLinkDataListMap = {},
lineOrderList = {},
}
local textInfo = uiText.textInfo
local linkLength = textInfo.linkCount
if linkLength > 0 then
for luaIndex = 1, linkLength do
local csIndex = CSIndex(luaIndex)
local hyperlinkInfo = textInfo.linkInfo[csIndex]
local _, linkId = uiText:TryGetLinkId(csIndex)
local startCharIndex = hyperlinkInfo.linkTextfirstCharacterIndex
local startCharInfo = textInfo.characterInfo[startCharIndex]
local startLineNumber = startCharInfo.lineNumber
local endCharIndex = startCharIndex + hyperlinkInfo.linkTextLength - 1
local endCharInfo = textInfo.characterInfo[endCharIndex]
local endLineNumber = endCharInfo.lineNumber
local linkData = {
index = luaIndex,
linkId = linkId,
lineOrder = 1,
startCharIndex = startCharIndex,
startLineNumber = startLineNumber,
startXPos = startCharInfo.topLeft.x,
endCharIndex = endCharIndex,
endLineNumber = endLineNumber,
endXPos = endCharInfo.topRight.x,
}
table.insert(textData.linkDataList, linkData)
local lineLinkDataList = textData.lineLinkDataListMap[startLineNumber]
if lineLinkDataList == nil then
lineLinkDataList = {}
textData.lineLinkDataListMap[startLineNumber] = lineLinkDataList
table.insert(textData.lineOrderList, startLineNumber)
end
linkData.lineOrder = #textData.lineOrderList
table.insert(lineLinkDataList, linkData)
if startLineNumber ~= endLineNumber then
lineLinkDataList = textData.lineLinkDataListMap[endLineNumber]
if lineLinkDataList == nil then
lineLinkDataList = {}
textData.lineLinkDataListMap[endLineNumber] = lineLinkDataList
table.insert(textData.lineOrderList, endLineNumber)
end
table.insert(lineLinkDataList, linkData)
end
end
end
return textData
end
HyperlinkPopupCtrl._WrapTermData = HL.StaticMethod(HL.String, HL.Number).Return(HL.Table) << function(linkId, stackIndex)
local cfg = Utils.tryGetTableCfg(Tables.hyperlinkTextTable, linkId)
if cfg then
local data = {
id = linkId,
index = stackIndex,
cfg = cfg,
}
return data
else
return nil
end
end
HyperlinkPopupCtrl._InitUI = HL.Method() << function(self)
self.view.closeBtn.onClick:AddListener(function()
self:_ChangeNavi(nil)
self:PlayAnimationOutAndClose()
AudioManager.PostEvent("Au_Ul_Popup_DetailsPanel_Close")
end)
self.m_genTermCells = UIUtils.genCellCache(self.view.termCell)
self.m_genOriginalTxtCells = UIUtils.genCellCache(self.view.originalTxtCell)
self.m_termDataStack = require_ex("Common/Utils/DataStructure/Stack")()
self.m_refreshTermCellFunc = function(cell, luaIndex)
cell.gameObject.name = "TermCell" .. luaIndex
local count = self.m_termDataStack:Count()
local maxCount = self.m_genTermCells:GetCount()
if count > maxCount then
self:_OnRefreshTermCell(cell, count - maxCount + luaIndex)
else
self:_OnRefreshTermCell(cell, luaIndex)
end
end
self.m_clickTargetTextLinkFunc = function(linkId)
self:_ForceRefreshBaseLink(linkId)
end
self.m_onOriginalTxtHoverLinkChangeFunc = function(linkId, isShow)
if not isShow then
Notify(MessageConst.HIDE_HYPERLINK_TIPS)
else
Notify(MessageConst.SHOW_HYPERLINK_TIPS, { linkId })
end
end
self.m_clickTermTextLinkFunc = function(linkId)
if self.m_remainTermAniCount <= 0 then
self:_PushTerm(linkId)
end
end
self:BindInputPlayerAction("common_navigation_4_dir_up_no_hint", function()
self:_OnMoveNaviUp()
local cell = self.m_genOriginalTxtCells:Get(self.m_targetUITextIndex)
if cell then
self.view.originalTxtList:AutoScrollToRectTransform(cell.rectTransform)
end
end)
self:BindInputPlayerAction("common_navigation_4_dir_down", function()
self:_OnMoveNaviDown()
local cell = self.m_genOriginalTxtCells:Get(self.m_targetUITextIndex)
if cell then
self.view.originalTxtList:AutoScrollToRectTransform(cell.rectTransform)
end
end)
self:BindInputPlayerAction("common_navigation_4_dir_left", function()
self:_OnMoveNaviLeft()
local cell = self.m_genOriginalTxtCells:Get(self.m_targetUITextIndex)
if cell then
self.view.originalTxtList:AutoScrollToRectTransform(cell.rectTransform)
end
end)
self:BindInputPlayerAction("common_navigation_4_dir_right", function()
self:_OnMoveNaviRight()
local cell = self.m_genOriginalTxtCells:Get(self.m_targetUITextIndex)
if cell then
self.view.originalTxtList:AutoScrollToRectTransform(cell.rectTransform)
end
end)
self.m_hyperlinkConfirmBindId = self:BindInputPlayerAction("hyperlink_confirm", function()
if self.m_isNavi == false then
return
end
if self.m_curFocusLayer == LayerType.TermList then
local termData = self.m_termDataStack:Peek()
local textData = termData.contentHyperTextData
if #textData.linkDataList > 0 then
local linkData = textData.linkDataList[textData.curFocusIndex]
self:_PushTerm(linkData.linkId)
end
else
self.m_curFocusLayer = LayerType.TermList
end
end)
self:BindInputPlayerAction("hyperlink_cancel", function()
if self.m_curFocusLayer == LayerType.OriginalText then
self:_ChangeNavi(nil)
self:PlayAnimationOutAndClose()
else
if self.m_termDataStack:Count() > 1 then
self:_PopTerm(1)
else
self.m_curFocusLayer = LayerType.OriginalText
end
end
end)
self:BindInputPlayerAction("hyperlink_close", function()
self:_ChangeNavi(nil)
self:PlayAnimationOutAndClose()
end)
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({
self.view.inputGroup.groupId,
})
end
HyperlinkPopupCtrl._RefreshAllUI = HL.Method() << function(self)
self.m_genOriginalTxtCells:Refresh(#self.m_originalTextDataList, function(cell, luaIndex)
self:_OnRefreshOriginalTxtCell(cell, luaIndex)
end)
end
HyperlinkPopupCtrl._ForceRefreshBaseLink = HL.Method(HL.String) << function(self, newBaseLink)
self.m_baseLinkId = newBaseLink
self:_ClearStack()
self:_PushTerm(self.m_baseLinkId)
end
HyperlinkPopupCtrl._OnRefreshOriginalTxtCell = HL.Method(HL.Any, HL.Number) << function(self, cell, luaIndex)
local originalTextData = self.m_originalTextDataList[luaIndex]
cell.originalTxt.text = originalTextData.uiText.text
cell.originalTxt.onClickLink:RemoveListener(self.m_clickTargetTextLinkFunc)
cell.originalTxt.onClickLink:AddListener(self.m_clickTargetTextLinkFunc)
cell.originalTxt.onHoverLinkChange:RemoveListener(self.m_onOriginalTxtHoverLinkChangeFunc)
cell.originalTxt.onHoverLinkChange:AddListener(self.m_onOriginalTxtHoverLinkChangeFunc)
cell.originalTxt:ForceMeshUpdate()
local showLine = luaIndex ~= #self.m_originalTextDataList
cell.lineImg.gameObject:SetActive(showLine)
end
HyperlinkPopupCtrl._OnRefreshTermCell = HL.Method(HL.Any, HL.Number) << function(self, cell, luaIndex)
if luaIndex < 1 or luaIndex > self.m_termDataStack:Count() then
cell.gameObject:SetActive(false)
cell.previousBtn.onClick:RemoveAllListeners()
cell.jumpWikiBtn.onClick:RemoveAllListeners()
cell.titleTxt.text = ""
cell.contentTxt.text = ""
return
end
cell.gameObject:SetActive(true)
local termData = self.m_termDataStack:Get(luaIndex)
local cfg = termData.cfg
cell.titleTxt.text = cfg.name
cell.contentTxt:SetAndResolveTextStyle(cfg.desc)
cell.previousBtn.onClick:RemoveAllListeners()
cell.previousBtn.onClick:AddListener(function()
if self.m_remainTermAniCount > 0 then
return
end
local popCount = self.m_termDataStack:Count() - termData.index
if popCount <= 0 then
return
end
self:_PopTerm(1)
end)
cell.jumpWikiBtn.onClick:RemoveAllListeners()
local jumpWikiId = cfg.jumpWikiId
local canJumpWiki = (not string.isEmpty(jumpWikiId))
and (not DeviceInfo.usingController or luaIndex == self.m_termDataStack:Count())
and Utils.isSystemUnlocked(GEnums.UnlockSystemType.Wiki)
and WikiUtils.isWikiEntryUnlock(jumpWikiId)
and not UIManager:IsShow(PanelId.GuideMedia)
if canJumpWiki then
cell.jumpWikiBtn.onClick:AddListener(function()
if UIManager:ShouldBlockObtainWaysJump() then
Notify(MessageConst.SHOW_TOAST, Language.LUA_OBTAIN_WAYS_JUMP_BLOCKED)
return
end
self:_OnJumpToWiki(jumpWikiId)
end)
end
cell.jumpWikiBtn.gameObject:SetActive(canJumpWiki)
cell.contentTxt.onClickLink:RemoveListener(self.m_clickTermTextLinkFunc)
cell.contentTxt.onClickLink:AddListener(self.m_clickTermTextLinkFunc)
end
HyperlinkPopupCtrl._PushTerm = HL.Method(HL.String) << function(self, linkId)
self:_ChangeNavi(nil)
local preLastIndex = self.m_termDataStack:Count()
for i = 1, preLastIndex do
local data = self.m_termDataStack:Get(i)
if data.id == linkId then
local popCount = preLastIndex - data.index
if popCount > 0 then
self:_PopTerm(popCount)
end
return
end
end
local nowLastIndex = preLastIndex + 1
local data = HyperlinkPopupCtrl._WrapTermData(linkId, nowLastIndex)
if data == nil then
logger.error("[HyperlinkPopupCtrl] linkId data is nil : " .. linkId)
return
end
self.m_termDataStack:Push(data)
local maxCount = self.view.config.MAX_TERM_CELL_COUNT
if nowLastIndex > maxCount then
self.m_genTermCells:Refresh(maxCount + 1, self.m_refreshTermCellFunc)
local cellCount = self.m_genTermCells:GetCount()
local cell = self.m_genTermCells:Get(1)
self:_TermAniUpOut(cell, nowLastIndex - maxCount)
cell = self.m_genTermCells:Get(cellCount - 1)
self:_TermAniCollapse(cell, preLastIndex)
cell = self.m_genTermCells:Get(cellCount)
self:_TermAniUpIn(cell, nowLastIndex)
else
self.m_genTermCells:Refresh(nowLastIndex, self.m_refreshTermCellFunc)
local cell = self.m_genTermCells:Get(nowLastIndex)
self:_TermAniUpIn(cell, nowLastIndex)
if nowLastIndex > 1 then
cell = self.m_genTermCells:Get(preLastIndex)
self:_TermAniCollapse(cell, preLastIndex)
end
end
self.m_onAllTermAniDone = function()
self:_EnableAllTermCellPreviousBtn()
local termCell = self.m_genTermCells:Get(self.m_genTermCells:GetCount())
if termCell then
data.contentHyperTextData = HyperlinkPopupCtrl._WrapHyperTextData(termCell.contentTxt)
self:_AutoRefreshNavi()
end
end
AudioManager.PostEvent("Au_UI_Popup_WikiTipsPanel_Open")
end
HyperlinkPopupCtrl._PopTerm = HL.Method(HL.Number) << function(self, popCount)
self:_ChangeNavi(nil)
local preLastIndex = self.m_termDataStack:Count()
local nowLastIndex = preLastIndex - 1
local maxCount = self.view.config.MAX_TERM_CELL_COUNT
if preLastIndex > maxCount then
local cellCount = self.m_genTermCells:GetCount()
local cell = self.m_genTermCells:Get(1)
self:_TermAniDownIn(cell, preLastIndex - maxCount)
cell = self.m_genTermCells:Get(cellCount - 1)
self:_TermAniExpand(cell, nowLastIndex)
cell = self.m_genTermCells:Get(cellCount)
self:_TermAniDownOut(cell, preLastIndex)
self.m_onAllTermAniDone = function()
self.m_termDataStack:Pop()
if nowLastIndex > maxCount then
self.m_genTermCells:Refresh(maxCount + 1, self.m_refreshTermCellFunc)
local nowCellCount = self.m_genTermCells:GetCount()
local tempCell = self.m_genTermCells:Get(1)
tempCell.gameObject:SetActive(false)
tempCell = self.m_genTermCells:Get(nowCellCount - 1)
tempCell.gameObject:SetActive(true)
tempCell.cellStateCtrl:SetState("Collapse")
tempCell = self.m_genTermCells:Get(nowCellCount)
tempCell.gameObject:SetActive(true)
tempCell.cellStateCtrl:SetState("Expand")
else
self.m_genTermCells:Refresh(nowLastIndex, self.m_refreshTermCellFunc)
end
if popCount <= 1 then
self:_EnableAllTermCellPreviousBtn()
self:_NaviTermCellWaitForRenderDone()
else
self:_PopTerm(popCount - 1)
end
end
else
local cellCount = self.m_genTermCells:GetCount()
local cell = self.m_genTermCells:Get(cellCount - 1)
self:_TermAniExpand(cell, nowLastIndex)
cell = self.m_genTermCells:Get(cellCount)
self:_TermAniDownOut(cell, preLastIndex)
self.m_onAllTermAniDone = function()
self.m_termDataStack:Pop()
self.m_genTermCells:Refresh(nowLastIndex, self.m_refreshTermCellFunc)
if popCount <= 1 then
self:_EnableAllTermCellPreviousBtn()
self:_NaviTermCellWaitForRenderDone()
else
self:_PopTerm(popCount - 1)
end
end
end
AudioManager.PostEvent("Au_UI_Popup_WikiTipsPanel_Open")
end
HyperlinkPopupCtrl._ClearStack = HL.Method() << function(self)
self.m_termDataStack:Clear()
self.m_genTermCells:Refresh(0, self.m_refreshTermCellFunc)
end
HyperlinkPopupCtrl._OnMoveNaviRight = HL.Method() << function(self)
if self.m_isNavi == false then
return
end
if self.m_curFocusLayer == LayerType.OriginalText then
local curTextIndex = self.m_targetUITextIndex
local textData = self.m_originalTextDataList[curTextIndex].hyperTextData
local nextIndex = textData.curFocusIndex + 1
if nextIndex <= #textData.linkDataList then
textData.curFocusIndex = nextIndex
self:_ForceRefreshBaseLink(textData.linkDataList[nextIndex].linkId)
AudioManager.PostEvent("Au_UI_Hover_ControllerSelect")
elseif curTextIndex < #self.m_originalTextDataList then
curTextIndex = curTextIndex + 1
self.m_targetUITextIndex = curTextIndex
textData = self.m_originalTextDataList[curTextIndex].hyperTextData
textData.curFocusIndex = 1
self:_ForceRefreshBaseLink(textData.linkDataList[1].linkId)
AudioManager.PostEvent("Au_UI_Hover_ControllerSelect")
end
else
local termData = self.m_termDataStack:Peek()
local textData = termData.contentHyperTextData
local nextIndex = textData.curFocusIndex + 1
if nextIndex <= #textData.linkDataList then
textData.curFocusIndex = nextIndex
AudioManager.PostEvent("Au_UI_Hover_ControllerSelect")
end
end
end
HyperlinkPopupCtrl._OnMoveNaviLeft = HL.Method() << function(self)
if self.m_isNavi == false then
return
end
if self.m_curFocusLayer == LayerType.OriginalText then
local curTextIndex = self.m_targetUITextIndex
local textData = self.m_originalTextDataList[curTextIndex].hyperTextData
local nextIndex = textData.curFocusIndex - 1
if nextIndex >= 1 then
textData.curFocusIndex = nextIndex
self:_ForceRefreshBaseLink(textData.linkDataList[nextIndex].linkId)
AudioManager.PostEvent("Au_UI_Hover_ControllerSelect")
elseif curTextIndex > 1 then
curTextIndex = curTextIndex - 1
self.m_targetUITextIndex = curTextIndex
textData = self.m_originalTextDataList[curTextIndex].hyperTextData
nextIndex = #textData.linkDataList
textData.curFocusIndex = nextIndex
self:_ForceRefreshBaseLink(textData.linkDataList[nextIndex].linkId)
AudioManager.PostEvent("Au_UI_Hover_ControllerSelect")
end
else
local termData = self.m_termDataStack:Peek()
local textData = termData.contentHyperTextData
local nextIndex = textData.curFocusIndex - 1
if nextIndex >= 1 then
textData.curFocusIndex = nextIndex
AudioManager.PostEvent("Au_UI_Hover_ControllerSelect")
end
end
end
HyperlinkPopupCtrl._OnMoveNaviDown = HL.Method() << function(self)
if self.m_isNavi == false then
return
end
if self.m_curFocusLayer == LayerType.OriginalText then
local curTextIndex = self.m_targetUITextIndex
local textData = self.m_originalTextDataList[curTextIndex].hyperTextData
local nextIndex = HyperlinkPopupCtrl._GetNextLinkIndexDown(textData)
if nextIndex > 0 then
textData.curFocusIndex = nextIndex
self:_ForceRefreshBaseLink(textData.linkDataList[nextIndex].linkId)
AudioManager.PostEvent("Au_UI_Hover_ControllerSelect")
elseif curTextIndex < #self.m_originalTextDataList then
curTextIndex = curTextIndex + 1
self.m_targetUITextIndex = curTextIndex
textData = self.m_originalTextDataList[curTextIndex].hyperTextData
textData.curFocusIndex = 1
self:_ForceRefreshBaseLink(textData.linkDataList[1].linkId)
AudioManager.PostEvent("Au_UI_Hover_ControllerSelect")
else
self:_OnMoveNaviRight()
end
else
local termData = self.m_termDataStack:Peek()
local textData = termData.contentHyperTextData
local nextIndex = HyperlinkPopupCtrl._GetNextLinkIndexDown(textData)
if nextIndex > 0 then
textData.curFocusIndex = nextIndex
AudioManager.PostEvent("Au_UI_Hover_ControllerSelect")
else
self:_OnMoveNaviRight()
end
end
end
HyperlinkPopupCtrl._OnMoveNaviUp = HL.Method() << function(self)
if self.m_isNavi == false then
return
end
if self.m_curFocusLayer == LayerType.OriginalText then
local curTextIndex = self.m_targetUITextIndex
local textData = self.m_originalTextDataList[curTextIndex].hyperTextData
local nextIndex = HyperlinkPopupCtrl._GetNextLinkIndexUp(textData)
if nextIndex > 0 then
textData.curFocusIndex = nextIndex
self:_ForceRefreshBaseLink(textData.linkDataList[nextIndex].linkId)
AudioManager.PostEvent("Au_UI_Hover_ControllerSelect")
elseif curTextIndex > 1 then
curTextIndex = curTextIndex - 1
self.m_targetUITextIndex = curTextIndex
textData = self.m_originalTextDataList[curTextIndex].hyperTextData
nextIndex = #textData.linkDataList
textData.curFocusIndex = nextIndex
self:_ForceRefreshBaseLink(textData.linkDataList[nextIndex].linkId)
AudioManager.PostEvent("Au_UI_Hover_ControllerSelect")
else
self:_OnMoveNaviLeft()
end
else
local termData = self.m_termDataStack:Peek()
local textData = termData.contentHyperTextData
local nextIndex = HyperlinkPopupCtrl._GetNextLinkIndexUp(textData)
if nextIndex > 0 then
textData.curFocusIndex = nextIndex
AudioManager.PostEvent("Au_UI_Hover_ControllerSelect")
else
self:_OnMoveNaviLeft()
end
end
end
HyperlinkPopupCtrl._GetNextLinkIndexDown = HL.StaticMethod(HL.Table).Return(HL.Number) << function(textData)
local curFocusLinkData = textData.linkDataList[textData.curFocusIndex]
if not curFocusLinkData then
return -1
end
local nextLineOrder = curFocusLinkData.lineOrder + 1
local nextIndex = -1
if nextLineOrder > #textData.lineOrderList then
return nextIndex
end
for order = nextLineOrder, #textData.lineOrderList do
local lineNumber = textData.lineOrderList[order]
local lineLinkDataList = textData.lineLinkDataListMap[lineNumber]
local cachedPosDelta = 0
local curPosDelta = 0
for _, linkData in pairs(lineLinkDataList) do
if linkData.index ~= curFocusLinkData.index then
if lineNumber == linkData.startLineNumber then
curPosDelta = math.abs(linkData.startXPos - curFocusLinkData.startXPos)
else
curPosDelta = math.abs(linkData.endXPos - curFocusLinkData.startXPos)
end
if nextIndex < 1 or curPosDelta < cachedPosDelta then
nextIndex = linkData.index
cachedPosDelta = curPosDelta
end
end
end
if nextIndex > 0 then
break
end
end
return nextIndex
end
HyperlinkPopupCtrl._GetNextLinkIndexUp = HL.StaticMethod(HL.Table).Return(HL.Number) << function(textData)
local curFocusLinkData = textData.linkDataList[textData.curFocusIndex]
if not curFocusLinkData then
return -1
end
local nextLineOrder = curFocusLinkData.lineOrder - 1
local nextIndex = -1
if nextLineOrder < 1 then
return nextIndex
end
for order = nextLineOrder, 1, -1 do
local lineNumber = textData.lineOrderList[order]
local lineLinkDataList = textData.lineLinkDataListMap[lineNumber]
local cachedPosDelta = 0
local curPosDelta = 0
for _, linkData in pairs(lineLinkDataList) do
if linkData.index ~= curFocusLinkData.index then
if lineNumber == linkData.startLineNumber then
curPosDelta = math.abs(linkData.startXPos - curFocusLinkData.startXPos)
else
curPosDelta = math.abs(linkData.endXPos - curFocusLinkData.startXPos)
end
if nextIndex < 1 or curPosDelta < cachedPosDelta then
nextIndex = linkData.index
cachedPosDelta = curPosDelta
end
end
end
if nextIndex > 0 then
break
end
end
return nextIndex
end
HyperlinkPopupCtrl._ChangeNavi = HL.Method(HL.Table) << function(self, textData)
if not self.m_usingController then
self.m_isNavi = false
Notify(MessageConst.HIDE_CONTROLLER_NAVI_TEXT_HINT)
return
end
if textData ~= nil then
local focusIndex = textData.curFocusIndex
if focusIndex > 0 and focusIndex <= #textData.linkDataList then
local linkData = textData.linkDataList[textData.curFocusIndex]
InputManagerInst:ToggleBinding(self.m_hyperlinkConfirmBindId, true)
local arg = {
uiText = textData.uiText,
startCharIndex = linkData.startCharIndex,
endCharIndex = linkData.endCharIndex,
}
self.m_isNavi = true
Notify(MessageConst.SHOW_CONTROLLER_NAVI_TEXT_HINT, arg)
logger.info("[Hyper] show navi: " .. textData.linkDataList[textData.curFocusIndex].linkId)
return
end
end
self.m_isNavi = false
InputManagerInst:ToggleBinding(self.m_hyperlinkConfirmBindId, false)
Notify(MessageConst.HIDE_CONTROLLER_NAVI_TEXT_HINT)
logger.info("[Hyper] hide navi")
end
HyperlinkPopupCtrl._AutoRefreshNavi = HL.Method() << function(self)
if self.m_curFocusLayer == LayerType.OriginalText then
local originalTextData = self.m_originalTextDataList[self.m_targetUITextIndex]
self:_ChangeNavi(originalTextData.hyperTextData)
else
local termData = self.m_termDataStack:Peek()
local textData = termData.contentHyperTextData
self:_ChangeNavi(textData)
end
local termData = self.m_termDataStack:Peek()
if termData and termData.contentHyperTextData then
local textData = termData.contentHyperTextData
InputManagerInst:ToggleBinding(self.m_hyperlinkConfirmBindId, #textData.linkDataList > 0)
else
InputManagerInst:ToggleBinding(self.m_hyperlinkConfirmBindId, true)
end
end
HyperlinkPopupCtrl._OnJumpToWiki = HL.Method(HL.String) << function(self, jumpWikiId)
if PhaseManager:IsOpen(PhaseId.Wiki) then
UIManager:Close(PANEL_ID)
PhaseManager:GoToPhase(PhaseId.Wiki, {
wikiEntryId = jumpWikiId,
})
else
UIManager:Hide(PANEL_ID)
PhaseManager:GoToPhase(PhaseId.Wiki, {
wikiEntryId = jumpWikiId,
restoreHyperlinkPopupCallback = function()
if UIManager:IsOpen(PANEL_ID) then
HyperlinkPopupCtrl.IsRestore = true
UIManager:Show(PANEL_ID)
end
end
})
end
end
HyperlinkPopupCtrl._EnableAllTermCellPreviousBtn = HL.Method() << function(self)
local cellCount = self.m_genTermCells:GetCount()
for i = 1, cellCount do
local cell = self.m_genTermCells:Get(i)
if cell then
cell.previousBtn.enabled = true
end
end
end
HyperlinkPopupCtrl.m_cellAniLengthUpIn = HL.Field(HL.Number) << 0
HyperlinkPopupCtrl.m_cellAniLengthUpOut = HL.Field(HL.Number) << 0
HyperlinkPopupCtrl.m_cellAniLengthDownIn = HL.Field(HL.Number) << 0
HyperlinkPopupCtrl.m_cellAniLengthDownOut = HL.Field(HL.Number) << 0
HyperlinkPopupCtrl.m_cellVertLayoutGroupPaddingBottom = HL.Field(HL.Number) << 0
HyperlinkPopupCtrl.m_remainTermAniCount = HL.Field(HL.Number) << 0
HyperlinkPopupCtrl.m_onAllTermAniDone = HL.Field(HL.Function)
HyperlinkPopupCtrl._TermAniUpOut = HL.Method(HL.Table, HL.Number) << function(self, cell, dataIndex)
self.m_remainTermAniCount = self.m_remainTermAniCount + 1
cell.previousBtn.enabled = false
cell.animationWrapper:Play("hyperlinkpopup_termcell_up_out")
cell.cellVertLayoutGroup.childControlHeight = false
local titlePreferredHeight = CS.UnityEngine.UI.LayoutUtility.GetPreferredHeight(cell.titleNode)
local data = self.m_termDataStack:Get(dataIndex)
cell.cellVertLayoutGroup.padding.bottom = self.m_cellVertLayoutGroupPaddingBottom
cell.titleNode:SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, titlePreferredHeight)
logger.info(string.format("[HyperlinkPopup:_TermAniUpOut] index: %d; cellName: %s;", dataIndex, cell.gameObject.name))
local tween = DOTween.To(function()
return titlePreferredHeight
end, function(value)
cell.cellVertLayoutGroup.padding.bottom = math.floor(value / titlePreferredHeight * self.m_cellVertLayoutGroupPaddingBottom)
cell.titleNode:SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, value)
end, 0, self.m_cellAniLengthUpOut)
data.tween = tween
tween:OnComplete(function()
cell.gameObject:SetActive(false)
self:_OnOneTermAniDone()
end)
end
HyperlinkPopupCtrl._TermAniUpIn = HL.Method(HL.Table, HL.Number) << function(self, cell, dataIndex)
self.m_remainTermAniCount = self.m_remainTermAniCount + 1
cell.previousBtn.enabled = false
cell.cellVertLayoutGroup.childControlHeight = true
cell.cellVertLayoutGroup.padding.bottom = self.m_cellVertLayoutGroupPaddingBottom
cell.animationWrapper:Play("hyperlinkpopup_termcell_up_in", function()
self:_OnOneTermAniDone()
local contentPreferredHeight = cell.contentTxtRect.rect.size.y
local data = self.m_termDataStack:Get(dataIndex)
if data == nil then
return
end
data.contentPreferredHeight = contentPreferredHeight
logger.info(string.format("[HyperlinkPopup:_TermAniUpIn] index: %d; cellName: %s; contentPreferredHeight: %.3f", dataIndex, cell.gameObject.name, contentPreferredHeight))
end)
end
HyperlinkPopupCtrl._TermAniCollapse = HL.Method(HL.Table, HL.Number) << function(self, cell, dataIndex)
self.m_remainTermAniCount = self.m_remainTermAniCount + 2
cell.previousBtn.enabled = false
cell.cellVertLayoutGroup.childControlHeight = false
local data = self.m_termDataStack:Get(dataIndex)
local contentPreferredHeight = data.contentPreferredHeight
cell.contentTxtRect.gameObject:SetActive(true)
logger.info(string.format("[HyperlinkPopup:_TermAniCollapse] index: %d; cellName: %s; contentPreferredHeight: %.3f", dataIndex, cell.gameObject.name, contentPreferredHeight))
local tween = DOTween.To(function()
return contentPreferredHeight
end, function(value)
cell.contentTxtRect:SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, value)
end, 0, self.m_cellAniLengthUpOut)
data.tween = tween
tween:OnComplete(function()
cell.contentTxtRect:SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, contentPreferredHeight)
cell.splitLine.gameObject:SetActive(false)
cell.contentTxtRect.gameObject:SetActive(false)
self:_OnOneTermAniDone()
end)
cell.animationWrapper:Play("hyperlinkpopup_termcell_deco_out", function()
self:_OnOneTermAniDone()
end)
end
HyperlinkPopupCtrl._TermAniDownIn = HL.Method(HL.Table, HL.Number) << function(self, cell, dataIndex)
self.m_remainTermAniCount = self.m_remainTermAniCount + 1
cell.previousBtn.enabled = false
cell.animationWrapper:Play("hyperlinkpopup_termcell_down_in")
cell.cellVertLayoutGroup.childControlHeight = false
cell.gameObject:SetActive(true)
local data = self.m_termDataStack:Get(dataIndex)
local titlePreferredHeight = CS.UnityEngine.UI.LayoutUtility.GetPreferredHeight(cell.titleNode)
logger.info(string.format("[HyperlinkPopup:_TermAniDownIn] index: %d; cellName: %s;", dataIndex, cell.gameObject.name))
local tween = DOTween.To(function()
return 0
end, function(value)
cell.cellVertLayoutGroup.padding.bottom = math.floor(self.m_cellVertLayoutGroupPaddingBottom * value / titlePreferredHeight)
cell.titleNode:SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, value)
end, titlePreferredHeight, self.m_cellAniLengthDownIn)
data.tween = tween
tween:OnComplete(function()
cell.cellVertLayoutGroup.padding.bottom = self.m_cellVertLayoutGroupPaddingBottom
self:_OnOneTermAniDone()
end)
end
HyperlinkPopupCtrl._TermAniDownOut = HL.Method(HL.Table, HL.Number) << function(self, cell, dataIndex)
self.m_remainTermAniCount = self.m_remainTermAniCount + 1
cell.previousBtn.enabled = false
cell.cellVertLayoutGroup.childControlHeight = true
cell.gameObject:SetActive(true)
cell.splitLine.gameObject:SetActive(true)
cell.contentTxtRect.gameObject:SetActive(true)
logger.info(string.format("[HyperlinkPopup:_TermAniDownOut] index: %d; cellName: %s;", dataIndex, cell.gameObject.name))
cell.animationWrapper:Play("hyperlinkpopup_termcell_down_out", function()
self:_OnOneTermAniDone()
end)
end
HyperlinkPopupCtrl._TermAniExpand = HL.Method(HL.Table, HL.Number) << function(self, cell, dataIndex)
self.m_remainTermAniCount = self.m_remainTermAniCount + 2
cell.previousBtn.enabled = false
cell.cellVertLayoutGroup.childControlHeight = false
local data = self.m_termDataStack:Get(dataIndex)
local contentPreferredHeight = data.contentPreferredHeight
logger.info(string.format("[HyperlinkPopup:_TermAniExpand] index: %d; cellName: %s; contentPreferredHeight: %.3f", dataIndex, cell.gameObject.name, contentPreferredHeight))
cell.contentTxtRect.gameObject:SetActive(true)
cell.splitLine.gameObject:SetActive(true)
local tween = DOTween.To(function()
return 0
end, function(value)
cell.contentTxtRect:SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, value)
end, contentPreferredHeight, self.m_cellAniLengthDownIn)
data.tween = tween
tween:OnComplete(function()
cell.cellVertLayoutGroup.childControlHeight = true
self:_OnOneTermAniDone()
end)
cell.animationWrapper:Play("hyperlinkpopup_termcell_deco_in", function()
self:_OnOneTermAniDone()
end)
end
HyperlinkPopupCtrl._NaviTermCellWaitForRenderDone = HL.Method() << function(self)
self:_StartCoroutine(function()
coroutine.waitForRenderDone()
local termCell = self.m_genTermCells:Get(self.m_genTermCells:GetCount())
if termCell then
local topData = self.m_termDataStack:Peek()
topData.contentHyperTextData.uiText = termCell.contentTxt
self:_AutoRefreshNavi()
end
end)
end
HyperlinkPopupCtrl._OnOneTermAniDone = HL.Method() << function(self)
self.m_remainTermAniCount = self.m_remainTermAniCount - 1
if self.m_remainTermAniCount <= 0 then
if self.m_onAllTermAniDone then
self.m_onAllTermAniDone()
end
end
end
HL.Commit(HyperlinkPopupCtrl)