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

430 lines
12 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.SNSMission
local MissionImportanceCfg = {
[GEnums.MissionImportance.Low] = Language["ui_mis_importance_3"],
[GEnums.MissionImportance.Mid] = Language["ui_mis_importance_2"],
[GEnums.MissionImportance.High] = Language["ui_mis_importance_1"],
}
local MissionViewTypeCfg = {
[GEnums.MissionViewType.MissionViewMain] = Language["ui_mis_panel_tab_main_new"],
[GEnums.MissionViewType.MissionViewDiscovery] = Language["ui_mis_panel_tab_discovery"],
[GEnums.MissionViewType.MissionViewSide] = Language["ui_mis_panel_tab_side"],
[GEnums.MissionViewType.MissionViewActivity] = Language["ui_mis_panel_tab_activity"],
[GEnums.MissionViewType.MissionViewOther] = Language["ui_mis_panel_tab_other"],
}
SNSMissionCtrl = HL.Class('SNSMissionCtrl', uiCtrl.UICtrl)
SNSMissionCtrl.m_filterMissionRelatedDialogInfos = HL.Field(HL.Table)
SNSMissionCtrl.m_genMissionDialogCellFunc = HL.Field(HL.Function)
SNSMissionCtrl.m_curSelectDialogId = HL.Field(HL.String) << ""
SNSMissionCtrl.m_dialogId2LuaIndex = HL.Field(HL.Table)
SNSMissionCtrl.m_cachedSelectedTags = HL.Field(HL.Table)
SNSMissionCtrl.m_filterArgs = HL.Field(HL.Table)
SNSMissionCtrl.s_messages = HL.StaticField(HL.Table) << {
}
SNSMissionCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.m_genMissionDialogCellFunc = UIUtils.genCachedCellFunction(self.view.missionDialogCellScrollList)
self.view.missionDialogCellScrollList.onUpdateCell:AddListener(function(go, csIndex)
self:_OnUpdateMissionDialogCell(go, csIndex)
end)
self.view.btnCommonFilter.button.onClick:AddListener(function()
self:_OnBtnFilterClick()
end)
self:_InitData(arg)
self:_InitFilterArgs()
self:_UpdateFilterMissionRelatedDialogInfos({})
self:_RefreshMissionRelatedDialogList()
self:_RefreshContent()
self:_RefreshNaviTarget()
end
SNSMissionCtrl._InitData = HL.Method(HL.Opt(HL.Table)) << function(self, arg)
local dialogId = arg and arg.dialogId
if not string.isEmpty(dialogId) and Tables.sNSDialogTable:ContainsKey(dialogId) then
self.m_curSelectDialogId = dialogId
end
end
SNSMissionCtrl._RefreshContent = HL.Method() << function(self)
local hasSelectDialog = not string.isEmpty(self.m_curSelectDialogId)
if hasSelectDialog then
local dialogId = self.m_curSelectDialogId
local chatId = Tables.sNSDialogTable[dialogId].chatId
GameInstance.player.sns:ReadDialog(dialogId)
self.view.snsDialogContentCore:InitSNSDialogContentCore(chatId, dialogId)
end
self.view.nonSelected.gameObject:SetActive(not hasSelectDialog)
self.view.selected.gameObject:SetActive(hasSelectDialog)
end
SNSMissionCtrl._OnUpdateMissionDialogCell = HL.Method(GameObject, HL.Number) << function(self, go, csIndex)
local cell = self.m_genMissionDialogCellFunc(go)
local luaIndex = LuaIndex(csIndex)
local info = self.m_filterMissionRelatedDialogInfos[luaIndex]
local dialogId = info.dialogId
self.m_dialogId2LuaIndex[dialogId] = luaIndex
cell:InitSNSMissionRelatedDialogCell(info.dialogId, function(chatId, dialogId)
self:_OnClickMissionDialogCell(chatId, dialogId)
end)
cell:SetSelected(self.m_curSelectDialogId == dialogId)
cell.gameObject.name = dialogId
cell.view.btnClick.onIsNaviTargetChanged = function(isTarget, isGroupChanged)
if isTarget then
self.m_focusCellCSIndex = csIndex
end
end
end
SNSMissionCtrl._RefreshMissionRelatedDialogList = HL.Method() << function(self)
local hasResult = #self.m_filterMissionRelatedDialogInfos > 0
self.view.missionDialogCellScrollList.gameObject:SetActive(hasResult)
self.view.nonResult.gameObject:SetActive(not hasResult)
local findTargetLuaIndex
for luaIndex, info in ipairs(self.m_filterMissionRelatedDialogInfos) do
if info.dialogId == self.m_curSelectDialogId then
findTargetLuaIndex = luaIndex
break
end
end
if findTargetLuaIndex == nil then
findTargetLuaIndex = 1
self.m_curSelectDialogId = ""
end
self.m_dialogId2LuaIndex = {}
local count = #self.m_filterMissionRelatedDialogInfos
self.view.missionDialogCellScrollList:UpdateCount(count, CSIndex(findTargetLuaIndex))
end
SNSMissionCtrl._RefreshNaviTarget = HL.Method() << function(self)
if not DeviceInfo.usingController then
return
end
local findTargetLuaIndex
for luaIndex, info in ipairs(self.m_filterMissionRelatedDialogInfos) do
if info.dialogId == self.m_curSelectDialogId then
findTargetLuaIndex = luaIndex
break
end
end
findTargetLuaIndex = findTargetLuaIndex or 1
local cell = self.m_genMissionDialogCellFunc(findTargetLuaIndex)
UIUtils.setAsNaviTarget(cell and cell.view.btnClick)
end
SNSMissionCtrl._OnClickMissionDialogCell = HL.Method(HL.String, HL.String) << function(self, chatId, dialogId)
if self.m_curSelectDialogId == dialogId then
return
end
local preDialogId = self.m_curSelectDialogId
self.m_curSelectDialogId = dialogId
local preCell = self.m_genMissionDialogCellFunc(self.m_dialogId2LuaIndex[preDialogId])
if preCell then
preCell:SetSelected(false)
end
local curCell = self.m_genMissionDialogCellFunc(self.m_dialogId2LuaIndex[dialogId])
curCell:SetSelected(true)
self:_RefreshContent()
end
SNSMissionCtrl._InitFilterArgs = HL.Method() << function(self)
local filterArgs = {}
filterArgs.tagGroups = {}
local missionImportanceFilter = {}
missionImportanceFilter.title = Language.LUA_MISSION_FILTER_IMPORTANCE_TITLE
missionImportanceFilter.tags = {}
for importanceType, name in pairs(MissionImportanceCfg) do
table.insert(missionImportanceFilter.tags, {
importanceType = importanceType,
name = name,
order = importanceType:GetHashCode()
})
end
table.sort(missionImportanceFilter.tags, Utils.genSortFunction({"order"}, true))
table.insert(filterArgs.tagGroups, missionImportanceFilter)
local missionTypeFilter = {}
missionTypeFilter.title = Language.LUA_MISSION_FILTER_VIEW_TYPE_TITLE
missionTypeFilter.tags = {}
for viewType, name in pairs(MissionViewTypeCfg) do
table.insert(missionTypeFilter.tags, {
viewType = viewType,
name = name,
order = viewType:GetHashCode()
})
end
table.sort(missionTypeFilter.tags, Utils.genSortFunction({"order"}, true))
table.insert(filterArgs.tagGroups, missionTypeFilter)
local dialogReadFilter = {}
dialogReadFilter.title = Language.LUA_COMMON_FILTER_END_STATE_TITLE
dialogReadFilter.tags = { { name = Language.LUA_COMMON_FILTER_END_STATE_NO, endState = false },
{ name = Language.LUA_COMMON_FILTER_END_STATE_YES, endState = true } }
table.insert(filterArgs.tagGroups, dialogReadFilter)
filterArgs.onConfirm = function(selectedTags)
self:_OnFilterConfirm(selectedTags)
end
self.m_filterArgs = filterArgs
end
SNSMissionCtrl._OnFilterConfirm = HL.Method(HL.Table) << function(self, selectedTags)
selectedTags = selectedTags or {}
self.m_cachedSelectedTags = selectedTags
self.m_curSelectDialogId = ""
local hasFilter = #selectedTags > 0
self.view.btnCommonFilter.normalNode.gameObject:SetActiveIfNecessary(not hasFilter)
self.view.btnCommonFilter.existNode.gameObject:SetActiveIfNecessary(hasFilter)
self.view.snsDialogContentCore:ClearAsyncHandler()
self:_UpdateFilterMissionRelatedDialogInfos(selectedTags)
self:_RefreshMissionRelatedDialogList()
self:_RefreshContent()
self:_RefreshNaviTarget()
end
SNSMissionCtrl._UpdateFilterMissionRelatedDialogInfos = HL.Method(HL.Table) << function(self, selectedTags)
local sns = GameInstance.player.sns
local missionRelatedDialogInfos = {}
local missionRelatedSNSDialogIds = sns.missionRelatedSNSDialogIds
local missionSys = GameInstance.player.mission
local dialogInfoDic = sns.dialogInfoDic
for _, dialogId in pairs(missionRelatedSNSDialogIds) do
local importanceMatch = true
local hasImportanceTag = false
local viewTypeMatch = true
local hasViewTypeTag = false
local readMatch = true
local hasReadTag = false
local missionId = Tables.sNSDialogTable[dialogId].relatedMissionId
local missionMetaAsset = missionSys:GetMissionMetaAsset(missionId)
local dialogInfo = dialogInfoDic:get_Item(dialogId)
local importanceType = missionMetaAsset.missionImportance
local viewType = missionMetaAsset.viewType
for _, tag in ipairs(selectedTags) do
if tag.importanceType ~= nil then
importanceMatch = false
hasImportanceTag = true
end
if hasImportanceTag then
importanceMatch = importanceMatch or importanceType == tag.importanceType
end
if tag.viewType ~= nil then
viewTypeMatch = false
hasViewTypeTag = true
end
if hasViewTypeTag then
viewTypeMatch = viewTypeMatch or viewType == tag.viewType
end
if tag.endState ~= nil then
readMatch = false
hasReadTag = true
end
if hasReadTag then
readMatch = readMatch or dialogInfo.isEnd == tag.endState
end
end
if importanceMatch and viewTypeMatch and readMatch then
table.insert(missionRelatedDialogInfos, {
dialogId = dialogId,
missionId = missionId,
isReadSort = dialogInfo.isRead and 0 or 1,
isEndSort = dialogInfo.isEnd and 0 or 1,
importance = importanceType:GetHashCode() * -1,
viewType = viewType:GetHashCode() * -1,
timestamp = dialogInfo.timestamp,
})
end
end
table.sort(missionRelatedDialogInfos,
Utils.genSortFunction({ "isReadSort", "isEndSort", "importance", "viewType" }))
self.m_filterMissionRelatedDialogInfos = missionRelatedDialogInfos
end
SNSMissionCtrl._OnBtnFilterClick = HL.Method() << function(self)
self.m_filterArgs.selectedTags = self.m_cachedSelectedTags
self:Notify(MessageConst.SHOW_COMMON_FILTER, self.m_filterArgs)
end
SNSMissionCtrl.GetPanelType = HL.Method().Return(HL.Number) << function(self)
return SNSUtils.PanelType.FullScreenPanel
end
SNSMissionCtrl.m_focusCellCSIndex = HL.Field(HL.Number) << -1
SNSMissionCtrl.OnContentCoreFocus = HL.Method(HL.Boolean) << function(self, isOn)
self.m_phase:OnSNSBarkerContentCoreFocus(isOn)
end
SNSMissionCtrl.ReturnToFocusCell = HL.Method() << function(self)
local cell = self.m_genMissionDialogCellFunc(LuaIndex(self.m_focusCellCSIndex))
UIUtils.setAsNaviTarget(cell.view.btnClick)
end
SNSMissionCtrl.TryContinueDialog = HL.Method() << function(self)
self:_RefreshContent()
end
SNSMissionCtrl.OnSwitchOn = HL.Method(HL.Boolean) << function(self, isOn)
if not isOn then
self.view.snsDialogContentCore:ClearAsyncHandler()
return
end
ClientDataManagerInst:SetBool(SNSUtils.MISSION_TAB_READ, true, false, SNSUtils.SNS_CATEGORY, true)
Notify(MessageConst.ON_SNS_MISSION_TAB_READ_STATE_CHANGE)
if not DeviceInfo.usingController then
return
end
local cell = self.m_genMissionDialogCellFunc(LuaIndex(self.m_focusCellCSIndex))
if cell then
UIUtils.setAsNaviTarget(cell.view.btnClick)
end
local phase = self.m_phase
phase:ToggleBasicPanelCloseBtn(true)
end
HL.Commit(SNSMissionCtrl)