local uiCtrl = require_ex('UI/Panels/Base/UICtrl') local PANEL_ID = PanelId.WikiSearch WikiSearchCtrl = HL.Class('WikiSearchCtrl', uiCtrl.UICtrl) local STATE_NAME = { SEARCH = "search", RESULT = "result", EMPTY = "empty", } local CONTENT_IN_ANIM = "wiki_search_content_in" local CONTENT_OUT_ANIM = "wiki_search_content_out" WikiSearchCtrl.s_messages = HL.StaticField(HL.Table) << { [MessageConst.ON_CHECK_SENSITIVE_SUCCESS] = '_OnCheckSensitiveSuccess', } WikiSearchCtrl.m_isShowingResult = HL.Field(HL.Boolean) << false WikiSearchCtrl.m_checkSensitiveKeyword = HL.Field(HL.Any) WikiSearchCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg) self:_InitController() self.m_readWikiEntries = {} self.view.btnBackBlack.onClick:AddListener(function() self:_ClearSearch(true) self:PlayAnimationOutAndHide() end) self.view.detailsBtn.onClick:AddListener(function() self:PlayAnimationOutWithCallback(function() Notify(MessageConst.SHOW_WIKI_ENTRY, { wikiEntryId = self.m_curWikiEntryShowData.wikiEntryData.id }) end) end) UIUtils.initSearchInput(self.view.inputField, { clearBtn = self.view.clearBtn, searchBtn = self.view.searchBtn, onInputValueChanged = function(text) local hasContent = not string.isEmpty(self.view.inputField.text) self.view.searchBtn.interactable = hasContent end, onInputSubmit = function() self:_OnSearchBtnClicked() end, onInputFocused = function() local isEmpty = string.isEmpty(self.view.inputField.text) self.view.searchBtn.interactable = not isEmpty if not self.m_isShowingResult then self:_ShowHistory() end end, onInputEndEdit = function() local isPsController = Utils.checkIsPSDevice() if isPsController then self:_OnSearchBtnClicked() end end, onClearClick = function() self:_ClearSearch(false, false, true) end, onSearchClick = function() self:_OnSearchBtnClicked() end, }) self.view.inputField.onValidateCharacterLimit = I18nUtils.GetRealTextByLengthLimit self.view.inputField.onGetTextLength = I18nUtils.GetTextRealLength self:_ClearSearch(false, true) end WikiSearchCtrl.OnShow = HL.Override() << function(self) self.view.selectableNaviGroup:NaviToThisGroup() if string.isEmpty(self.view.inputField.text) then if DeviceInfo.usingController then self:_StartCoroutine(function() self.view.searchNodeNaviGroup:ManuallyFocus() end) else self.view.inputField:ActivateInputField() end self:_ShowHistory() else if DeviceInfo.usingController then self.view.leftNaviGroup:NaviToThisGroup() end end end WikiSearchCtrl.OnHide = HL.Override() << function (self) AudioAdapter.PostEvent("Au_UI_Popup_Common_Large_Close") end WikiSearchCtrl._OnSearchBtnClicked = HL.Method() << function(self) local keyword = string.trim(self.view.inputField.text) self.view.inputField.text = keyword if DeviceInfo.usingController then self.view.searchNodeNaviGroup:ManuallyStopFocus() end if string.isEmpty(keyword) or keyword == self.m_phase.curSearchKeyword then return end if I18nUtils.GetTextRealLength(keyword) <= 1 then Notify(MessageConst.SHOW_TOAST, Language.LUA_WIKI_SEARCH_KEYWORD_TOO_SHORT) return end self.view.inputField:DeactivateInputField(true) self.m_checkSensitiveKeyword = keyword GameInstance.player.wikiSystem:CheckSensitive(keyword) end WikiSearchCtrl._OnCheckSensitiveSuccess = HL.Method() << function(self) if not self.m_checkSensitiveKeyword then return end local keyword = self.m_checkSensitiveKeyword self.m_checkSensitiveKeyword = nil self:_Search(keyword) end WikiSearchCtrl._Search = HL.Method(HL.String) << function(self, keyword) self.m_phase.curSearchKeyword = keyword Notify(MessageConst.ON_WIKI_SEARCH_KEYWORD_CHANGED, keyword) self.m_isShowingResult = true local resultItems, resultTutorials = self:_GetSearchResult(keyword) if #resultItems == 0 and #resultTutorials == 0 then self.view.emptyTxt.text = string.format(Language.LUA_WIKI_SEARCH_NOT_FOUND_FORMAT, keyword) self.view.stateCtrl:SetState(STATE_NAME.EMPTY) return end WikiUtils.addHistorySearchKeyword(keyword) self:_RefreshResult(resultItems, resultTutorials) AudioAdapter.PostEvent("Au_UI_Popup_Common_Large_Open") end WikiSearchCtrl._ClearSearch = HL.Method(HL.Opt(HL.Boolean, HL.Boolean, HL.Boolean)) << function(self, isClosed, showHistory, activeInput) if self.m_phase then self.m_phase.curSearchKeyword = "" end self.view.inputField.text = "" Notify(MessageConst.ON_WIKI_SEARCH_KEYWORD_CHANGED, "") if isClosed == true then return end if activeInput then if DeviceInfo.usingController then self.view.searchNodeNaviGroup:ManuallyFocus() else self.view.inputField:ActivateInputField() end end if showHistory then self:_ShowHistory() end end WikiSearchCtrl._ShowHistory = HL.Method() << function(self) local function show() self.view.stateCtrl:SetState(STATE_NAME.SEARCH) self.m_isShowingResult = false self:_RefreshHistory() self:_MarkWikiEntryRead() end if self.m_isShowingResult then self:PlayAnimation(CONTENT_OUT_ANIM, show) else show() end end WikiSearchCtrl._GetSearchResult = HL.Method(HL.String).Return(HL.Table, HL.Table) << function(self, keyword) local resultItems = {} local resultTutorials = {} local hasValue for categoryId, _ in pairs(Tables.wikiCategoryTable) do local categoryResult = {} local wikiGroupDataList = Tables.wikiGroupTable[categoryId] for _, wikiGroupData in pairs(wikiGroupDataList.list) do local _, wikiEntryList = Tables.wikiEntryTable:TryGetValue(wikiGroupData.groupId) if wikiEntryList then for _, wikiEntryId in pairs(wikiEntryList.list) do if GameInstance.player.wikiSystem:GetWikiEntryState(wikiEntryId) ~= CS.Beyond.Gameplay.WikiSystem.EWikiEntryState.Locked then local _, wikiEntryData = Tables.wikiEntryDataTable:TryGetValue(wikiEntryId) local entryDesc if not string.isEmpty(wikiEntryData.refItemId) then local itemData hasValue, itemData = Tables.itemTable:TryGetValue(wikiEntryData.refItemId) if hasValue then entryDesc = itemData.name end elseif not string.isEmpty(wikiEntryData.refMonsterTemplateId) then local enemyDisplayInfoData hasValue, enemyDisplayInfoData = Tables.enemyTemplateDisplayInfoTable:TryGetValue(wikiEntryData.refMonsterTemplateId) if hasValue then entryDesc = enemyDisplayInfoData.name end else entryDesc = wikiEntryData.desc end if entryDesc and string.find(string.lower(entryDesc), string.lower(keyword), 1, true) then table.insert(categoryResult, { wikiCategoryType = categoryId, wikiGroupData = wikiGroupData, wikiEntryData = wikiEntryData, }) end end end end end if #categoryResult > 0 then local result = categoryId == WikiConst.EWikiCategoryType.Tutorial and resultTutorials or resultItems table.insert(result, { categoryId = categoryId, categoryResult = categoryResult, }) end end return resultItems, resultTutorials end WikiSearchCtrl.m_groupItemsCache = HL.Field(HL.Forward("UIListCache")) WikiSearchCtrl.m_groupTutorialsCache = HL.Field(HL.Forward("UIListCache")) WikiSearchCtrl._RefreshResult = HL.Method(HL.Table, HL.Table) << function(self, resultItems, resultTutorials) self:_MarkWikiEntryRead() self.view.stateCtrl:SetState(STATE_NAME.RESULT) local contentPosition = self.view.scrollContent.localPosition contentPosition.y = 0 self.view.scrollContent.localPosition = contentPosition self:PlayAnimation(CONTENT_IN_ANIM) local isFirstSelected = nil if not self.m_groupItemsCache then self.m_groupItemsCache = UIUtils.genCellCache(self.view.wikiSearchGroupItems) end self.m_groupItemsCache:Refresh(#resultItems, function(cell, luaIndex) isFirstSelected = true local wikiSearchResult = resultItems[luaIndex] cell:InitWikiSearchGroupItems(wikiSearchResult, function(itemCell, entryShowData) self:_SetItemSelected(itemCell, entryShowData) end, self.m_readWikiEntries, luaIndex == 1) cell.view.transform:SetAsLastSibling() end) if not self.m_groupTutorialsCache then self.m_groupTutorialsCache = UIUtils.genCellCache(self.view.wikiSearchGroupTutorials) end self.m_groupTutorialsCache:Refresh(#resultTutorials, function(cell, luaIndex) local wikiSearchResult = resultTutorials[luaIndex] cell:InitWikiSearchGroupTutorials(wikiSearchResult, function(itemCell, entryShowData) self:_SetItemSelected(itemCell, entryShowData) end, not isFirstSelected and luaIndex == 1) cell.view.transform:SetAsLastSibling() end) end WikiSearchCtrl.m_selectedItem = HL.Field(HL.Userdata) WikiSearchCtrl._SetItemSelected = HL.Method(HL.Userdata, HL.Table) << function(self, itemCell, entryShowData) if self.m_selectedItem then self.m_selectedItem:SetSelected(false, true) end if itemCell then itemCell:SetSelected(true, true) self.m_selectedItem = itemCell end local entryId = entryShowData.wikiEntryData.id if WikiUtils.isWikiEntryUnread(entryId) then GameInstance.player.wikiSystem:MarkWikiEntryRead({ entryId }) end self:_RefreshDetails(entryShowData) end WikiSearchCtrl.m_curWikiEntryShowData = HL.Field(HL.Table) WikiSearchCtrl._RefreshDetails = HL.Method(HL.Table) << function(self, wikiEntryShowData) self.m_curWikiEntryShowData = wikiEntryShowData self.view.wikiItemInfo:InitWikiItemInfo({ wikiEntryShowData = wikiEntryShowData, itemImg = self.view.itemImg, wikiGuideMediaCell = self.view.wikiGuideMediaCell, hideDetailBtn = true, }) end WikiSearchCtrl.m_historyCache = HL.Field(HL.Forward("UIListCache")) WikiSearchCtrl._RefreshHistory = HL.Method() << function(self) local historyKeywords = WikiUtils.getHistorySearchKeywords() local hasHistory = historyKeywords and #historyKeywords > 0 self.view.historyNode.gameObject:SetActive(hasHistory) if not hasHistory then return end if not self.m_historyCache then self.m_historyCache = UIUtils.genCellCache(self.view.historyCell) end self.m_historyCache:Refresh(#historyKeywords, function(cell, luaIndex) local keyword = historyKeywords[luaIndex] cell.nameTxt.text = keyword cell.btn.onClick:RemoveAllListeners() cell.btn.onClick:AddListener(function() self.view.inputField.text = keyword self:_Search(keyword) end) end) end WikiSearchCtrl.m_readWikiEntries = HL.Field(HL.Table) WikiSearchCtrl._MarkWikiEntryRead = HL.Method() << function(self) if self.m_readWikiEntries then local entryIdList = {} for entryId, _ in pairs(self.m_readWikiEntries) do table.insert(entryIdList, entryId) end GameInstance.player.wikiSystem:MarkWikiEntryRead(entryIdList) self.m_readWikiEntries = {} end end WikiSearchCtrl._InitController = HL.Method() << function(self) self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({self.view.inputGroup.groupId}) self.view.searchNodeNaviGroup.onIsFocusedChange:AddListener(function(isFocused) if isFocused then self.view.inputField:ActivateInputField() InputManagerInst:ChangeParent(true, self.view.searchBtnInputGroup.groupId, self.view.searchNodeInputGroup.groupId) else self.view.inputField:DeactivateInputField() if self.view.historyNode.gameObject.activeSelf and self.m_historyCache and self.m_historyCache:GetCount() > 0 then UIUtils.setAsNaviTarget(self.m_historyCache:Get(1).btn) end InputManagerInst:ChangeParent(true, self.view.searchBtnInputGroup.groupId, self.view.inputGroup.groupId) end end) end HL.Commit(WikiSearchCtrl)