Files
Endfield-Data/LuaScripts/UI/Panels/FacQuickBar/FacQuickBarCtrl.lua
2026-01-31 21:42:01 +07:00

1266 lines
35 KiB
Lua

local QuickBarItemType = FacConst.QuickBarItemType
local autoCalcOrderUICtrl = require_ex('UI/Panels/Base/AutoCalcOrderUICtrl')
local PANEL_ID = PanelId.FacQuickBar
FacQuickBarCtrl = HL.Class('FacQuickBarCtrl', autoCalcOrderUICtrl.AutoCalcOrderUICtrl)
FacQuickBarCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.HIDE_FAC_QUICK_BAR] = 'HideFacQuickBar',
[MessageConst.PLAY_FAC_QUICK_BAR_OUT_ANIM] = 'PlayOutAnim',
[MessageConst.ON_BLOCK_KEYBOARD_EVENT_PANEL_ORDER_CHANGED] = 'PanelOrderChanged',
[MessageConst.ON_ITEM_COUNT_CHANGED] = 'OnItemCountChanged',
[MessageConst.ON_SET_IN_SAFE_ZONE] = 'OnSetInSafeZone',
[MessageConst.ON_QUICK_BAR_CHANGED] = 'OnQuickBarChanged',
[MessageConst.ON_START_UI_DRAG] = 'OnOtherStartDragItem',
[MessageConst.ON_END_UI_DRAG] = 'OnOtherEndDragItem',
[MessageConst.FAC_ON_BELT_UNLOCKED] = 'OnBeltUnlocked',
[MessageConst.FAC_ON_PIPE_UNLOCKED] = 'OnPipeUnlocked',
[MessageConst.NAVI_TO_FAC_QUICK_BAR] = 'NaviToFacQuickBar',
[MessageConst.START_SET_BUILDING_ON_FAC_QUICK_BAR] = 'StartSetBuildingOnFacQuickBar',
[MessageConst.START_SWITCH_SLOT_ON_FAC_QUICK_BAR] = 'StartSwitchSlotOnFacQuickBar',
[MessageConst.QUICK_DROP_TO_FAC_QUICK_BAR] = '_OnQuickDropItemToQuickBar',
[MessageConst.ON_NEW_SCOPE_INFO_RECEIVED] = '_OnNewScopeInfoReceived',
[MessageConst.FAC_TOGGLE_CAN_DEACTIVE_QUICK_BAR] = 'ToggleCanDeactiveQuickBar',
}
FacQuickBarCtrl.m_typeCells = HL.Field(HL.Forward("UIListCache"))
FacQuickBarCtrl.m_itemCells = HL.Field(HL.Forward("UIListCache"))
FacQuickBarCtrl.maxItemCount = HL.Const(HL.Number) << 9
FacQuickBarCtrl.m_useActiveAction = HL.Field(HL.Boolean) << false
FacQuickBarCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.m_attachedPanels = {}
self.m_itemCells = UIUtils.genCellCache(self.view.itemSlot)
self.m_typeCells = UIUtils.genCellCache(self.view.typeTabCell)
self:_InitBeltNode()
self:_InitPipeNode()
self:_InitController()
self.view.facQuickBarClearDropZone:InitFacQuickBarClearDropZone()
end
FacQuickBarCtrl.OnShow = HL.Override() << function(self)
FacQuickBarCtrl.Super.OnShow(self)
self.view.dropHint.gameObject:SetActive(false)
self.view.facQuickBarClearDropZone.gameObject:SetActive(false)
end
FacQuickBarCtrl.OnHide = HL.Override() << function(self)
FacQuickBarCtrl.Super.OnHide(self)
if DeviceInfo.usingController then
if not string.isEmpty(self.m_curSettingBuildingItemId) then
self:_ExitSetBuilding()
else
InputManagerInst.controllerNaviManager:TryRemoveLayer(self.view.main)
end
end
end
FacQuickBarCtrl.OnClose = HL.Override() << function(self)
FacQuickBarCtrl.Super.OnClose(self)
end
FacQuickBarCtrl._OnPanelInputBlocked = HL.Override(HL.Boolean) << function(self, isActive)
end
FacQuickBarCtrl._RefreshContent = HL.Method() << function(self)
self:_InitDataInfo()
self:_RefreshTypes()
end
FacQuickBarCtrl.m_typeInfos = HL.Field(HL.Table)
FacQuickBarCtrl._InitDataInfo = HL.Method() << function(self)
local remoteFactoryCore = GameInstance.player.remoteFactory.core
local curChapterInfo = remoteFactoryCore:GetCurrentChapterInfo()
if not curChapterInfo then
self.view.beltNode.gameObject:SetActive(false)
self.view.pipeNode.gameObject:SetActive(false)
self.view.decoLine.gameObject:SetActive(false)
return
end
local typeInfos = {}
local isInFacMainRegion = Utils.isInFacMainRegion()
local isInSettlementDefenseDefending = Utils.isInSettlementDefenseDefending()
local fcType = GEnums.FCQuickBarType.Inner
local quickBarList = remoteFactoryCore.isTempQuickBarActive and
remoteFactoryCore:GetCurrentTempQuickBar() or
curChapterInfo:GetQuickBar(fcType)
local needShowBelt = self.m_arg.showBelt and not isInSettlementDefenseDefending and isInFacMainRegion and GameInstance.remoteFactoryManager.unlockSystem.systemUnlockedBelt
self.view.beltNode.gameObject:SetActive(needShowBelt)
local needShowPipe = self.m_arg.showPipe and not isInSettlementDefenseDefending and FactoryUtils.canShowPipe()
self.view.pipeNode.gameObject:SetActive(needShowPipe)
self.view.decoLine.gameObject:SetActive(needShowBelt or needShowPipe)
local typeData = Tables.factoryQuickBarTypeTable:GetValue("custom")
local typeInfo = {
data = typeData,
priority = typeData.priority,
fcType = fcType,
items = {},
canDrop = true,
}
for _, id in pairs(quickBarList) do
local info = {
itemId = id,
isCustomQuickBarItem = true,
}
if not string.isEmpty(id) then
local buildingData = FactoryUtils.getItemBuildingData(id)
if buildingData then
info.type = QuickBarItemType.Building
info.onlyShowOnMain = buildingData.onlyShowOnMain
else
info.type = QuickBarItemType.Logistic
if FacConst.FLUID_LOGISTIC_ITEMS[id] then
info.onlyShowOnMain = false
else
info.onlyShowOnMain = true
end
end
end
table.insert(typeInfo.items, info)
end
table.insert(typeInfos, typeInfo)
table.sort(typeInfos, Utils.genSortFunction({"priority"}))
self.m_typeInfos = typeInfos
end
FacQuickBarCtrl.m_selectedTypeIndex = HL.Field(HL.Number) << 1
FacQuickBarCtrl._RefreshTypes = HL.Method() << function(self)
if not self.m_typeInfos then
return
end
local count = #self.m_typeInfos
self.m_selectedTypeIndex = math.min(math.max(self.m_selectedTypeIndex, 1), count)
self.m_typeCells:Refresh(count, function(cell, index)
local info = self.m_typeInfos[index]
local name = info.data.name
cell.default.icon:LoadSprite(info.data.icon)
cell.default.nameTxt.text = name
cell.selected.icon:LoadSprite(info.data.icon)
cell.selected.nameTxt.text = name
cell.toggle.onValueChanged:RemoveAllListeners()
cell.toggle.isOn = index == self.m_selectedTypeIndex
cell.toggle.onValueChanged:AddListener(function(isOn)
if isOn then
self:_OnClickType(index)
end
end)
cell.gameObject.name = "TypeTabCell_" .. info.data.id
end)
self:_RefreshItemList()
end
FacQuickBarCtrl._OnClickType = HL.Method(HL.Number) << function(self, index)
self.m_selectedTypeIndex = index
self:_RefreshItemList()
end
FacQuickBarCtrl._RefreshItemList = HL.Method() << function(self)
if self.m_selectedTypeIndex == 0 then
self.m_itemCells:Refresh(0)
return
end
local info = self.m_typeInfos[self.m_selectedTypeIndex]
self.m_itemCells:Refresh(#info.items, function(cell, index)
self:_UpdateCell(cell, index)
end)
end
FacQuickBarCtrl._UpdateCell = HL.Method(HL.Any, HL.Number) << function(self, cell, index)
local item = self.m_typeInfos[self.m_selectedTypeIndex].items[index]
local itemId = item.itemId
local isEmpty = string.isEmpty(itemId)
local count
local isBuilding = item.type == QuickBarItemType.Building
if isBuilding then
count = isEmpty and 0 or Utils.getItemCount(itemId)
end
local itemCell = cell.view.item
itemCell.m_enableHoverTips = DeviceInfo.usingKeyboard or not self.m_useActiveAction
cell:InitItemSlot({
id = itemId,
count = count,
}, function()
if DeviceInfo.usingController then
if not self.m_useActiveAction then
if string.isEmpty(self.m_curSettingBuildingItemId) then
itemCell:ShowActionMenu(false, UIConst.UI_TIPS_POS_TYPE.RightDown)
else
self:_OnClickItem(index)
end
end
else
self:_OnClickItem(index)
end
end, nil, true)
if itemCell.customShowTipsFunc == nil then
itemCell.customShowTipsFunc = function()
if not string.isEmpty(self.m_curSettingBuildingItemId) then
self.view.setBuildingHint.gameObject:SetActive(false)
end
end
itemCell.customHideTipsFunc = function()
if self.m_isClosed or IsNull(self.view.main) then
return
end
if not string.isEmpty(self.m_curSettingBuildingItemId) then
self.view.setBuildingHint.gameObject:SetActive(true)
end
if self.m_useActiveAction and not InputManagerInst:GetKey(CS.Beyond.Input.GamepadKeyCode.LB) then
self.view.main:ManuallyStopFocus()
end
end
end
if string.isEmpty(self.m_curSettingBuildingItemId) then
itemCell:AddHoverBinding("fac_quick_bar_controller_build", function()
self:_OnClickItem(index)
end)
end
if cell.view.setBuildingHint then
if string.isEmpty(self.m_curSettingBuildingItemId) and self.m_switchSlotFromIndex < 0 then
cell.view.setBuildingHint.gameObject:SetActive(false)
else
cell.view.setBuildingHint.gameObject:SetActive(itemCell.view.button.isNaviTarget)
itemCell.view.button.onHoverChange:AddListener(function(isHover)
cell.view.setBuildingHint.gameObject:SetActive(isHover and not (string.isEmpty(self.m_curSettingBuildingItemId) and self.m_switchSlotFromIndex < 0))
end)
end
end
itemCell.canPlace = true
if isEmpty or count == 0 then
itemCell.canPlace = false
end
itemCell.actionMenuArgs = {
source = UIConst.UI_DRAG_DROP_SOURCE_TYPE.QuickBar,
canSwitch = self.m_arg.controllerSwitchArgs ~= nil,
fromIndex = index,
}
cell.item.view.button.onDoubleClick:RemoveAllListeners()
if isBuilding then
local hasCraft = Tables.FactoryItemAsHubCraftOutcomeTable:TryGetValue(itemId)
if hasCraft then
cell.item.view.button.onDoubleClick:AddListener(function()
if count == 0 then
Notify(MessageConst.OPEN_FAC_BUILD_MODE_SELECT, { selectedId = itemId })
end
end)
end
end
cell.item.view.nameNode.gameObject:SetActive(false)
if cell.view.hoverKeyHint then
cell.view.hoverKeyHint.gameObject:SetActive(false)
end
cell.item.view.button.onIsNaviTargetChanged = function(active)
if active then
self.m_currentNaviIndex = index
self:_RefreshCellHoverBinding(cell, index)
end
local showHoverHint = self.m_useActiveAction and active
cell.item.view.nameNode.gameObject:SetActive(showHoverHint)
if cell.view.hoverKeyHint then
cell.view.hoverKeyHint.gameObject:SetActive(showHoverHint)
end
if cell.view.setBuildingHint then
local inSetting = not string.isEmpty(self.m_curSettingBuildingItemId) or self.m_switchSlotFromIndex > 0
cell.view.setBuildingHint.gameObject:SetActive(inSetting and active)
end
end
self:_RefreshCellHoverBinding(cell, index)
local actionId = "fac_use_quick_item_" .. index
cell.item.view.button.onClick:ChangeBindingPlayerAction(actionId)
cell.gameObject.name = "Item_" .. (isEmpty and index or itemId)
if not isEmpty then
local data = Tables.itemTable:GetValue(itemId)
if item.isCustomQuickBarItem then
UIUtils.initUIDragHelper(cell.view.dragItem, {
source = UIConst.UI_DRAG_DROP_SOURCE_TYPE.QuickBar,
type = data.type,
csIndex = CSIndex(index),
itemId = itemId,
onEndDrag = function(enterObj, enterDrop, eventData)
self:_OnQuickBarEndDrag(index, enterObj, enterDrop, eventData)
end,
onDropTargetChanged = function(enterObj, dropHelper)
local dragObj = cell.view.dragItem.curDragObj
if not dragObj then
return
end
local dragItem = dragObj:GetComponent("LuaUIWidget").table[1]
if not dropHelper or not dropHelper.info.isQuickBarClearDropZone then
dragItem.view.clearNode.gameObject:SetActive(false)
return
end
dragItem.view.clearNode.gameObject:SetActive(true)
end,
})
else
UIUtils.initUIDragHelper(cell.view.dragItem, {
source = UIConst.UI_DRAG_DROP_SOURCE_TYPE.QuickBar,
type = data.type,
itemId = itemId,
onEndDrag = function(enterObj, enterDrop, eventData)
self:_OnQuickBarEndDrag(index, enterObj, enterDrop, eventData)
end
})
end
if DeviceInfo.usingController then
cell:InitPressDrag()
else
cell.item:OpenLongPressTips()
end
end
if item.isCustomQuickBarItem then
cell.view.dropItem.enabled = true
UIUtils.initUIDropHelper(cell.view.dropItem, {
acceptTypes = UIConst.FACTORY_QUICK_BAR_DROP_ACCEPT_INFO,
onDropItem = function(eventData, dragHelper)
self:_OnDropItem(index, dragHelper)
end,
})
else
cell.view.dropItem.enabled = false
end
if DeviceInfo.usingController then
cell.item:SetExtraInfo({
tipsPosTransform = cell.view.controllerTipsRect,
})
end
cell.item.view.nameNode.gameObject:SetActive(false)
end
FacQuickBarCtrl._RefreshCellHoverBinding = HL.Method(HL.Forward("ItemSlot"), HL.Number) << function(self, cell, index)
local button = cell.item.view.button
local item = self.m_typeInfos[self.m_selectedTypeIndex].items[index]
local itemId = item.itemId
local isEmpty = string.isEmpty(itemId)
local count
if item.type == QuickBarItemType.Building then
count = isEmpty and 0 or Utils.getItemCount(itemId)
end
if not string.isEmpty(self.m_curSettingBuildingItemId) then
InputManagerInst:ToggleBinding(button.hoverConfirmBindingId, false)
InputManagerInst:SetBindingText(button.hoverConfirmBindingId, nil)
return
end
if self.m_arg.controllerSwitchArgs ~= nil then
if self.m_switchSlotFromIndex > 0 or isEmpty then
InputManagerInst:ToggleBinding(button.hoverConfirmBindingId, false)
end
InputManagerInst:SetBindingText(button.hoverConfirmBindingId, Language["key_hint_item_open_action_menu"])
return
end
if isEmpty or count == 0 then
InputManagerInst:ToggleBinding(button.hoverConfirmBindingId, false)
return
end
InputManagerInst:SetBindingText(button.hoverConfirmBindingId, Language.LUA_ITEM_ACTION_PLACE)
end
FacQuickBarCtrl._OnClickItem = HL.Method(HL.Number, HL.Opt(Vector2)) << function(self, index, mousePosition)
self:_BuildItem(index, mousePosition)
end
FacQuickBarCtrl._BuildItem = HL.Method(HL.Number, HL.Opt(Vector2)) << function(self, index, mousePosition)
local item = self.m_typeInfos[self.m_selectedTypeIndex].items[index]
if item == nil or string.isEmpty(item.itemId) then
return
end
local isBuilding = item.type == QuickBarItemType.Building
if item.onlyShowOnMain then
if item.type ~= GEnums.FacBuildingType.Hub:GetHashCode() and not Utils.isInFacMainRegion() then
Notify(MessageConst.SHOW_TOAST, Language.LUA_FAC_CANT_BUILD_IN_NOT_MAIN_REGION)
return
end
end
if isBuilding then
local itemId = item.itemId
local count, backpackCount = Utils.getItemCount(itemId)
local cell = self.m_itemCells:GetItem(index)
if count > 0 then
local args = {
itemId = itemId,
initMousePos = mousePosition,
}
Notify(MessageConst.FAC_ENTER_BUILDING_MODE, args)
return
else
local hasCraft = Tables.FactoryItemAsHubCraftOutcomeTable:TryGetValue(itemId)
local showJumpToast = hasCraft and not DeviceInfo.usingController
Notify(MessageConst.SHOW_TOAST, showJumpToast and Language.LUA_FAC_QUICK_BAR_COUNT_ZERO or Language.LUA_FAC_QUICK_BAR_COUNT_ZERO_NO_JUMP)
return
end
else
if item.type == QuickBarItemType.Belt then
Notify(MessageConst.FAC_ENTER_BELT_MODE, {beltId = item.id})
elseif item.type == QuickBarItemType.Logistic then
Notify(MessageConst.FAC_ENTER_LOGISTIC_MODE, {itemId = item.itemId})
end
end
end
FacQuickBarCtrl._CanDrop = HL.Method().Return(HL.Boolean) << function(self)
return self.m_typeInfos[self.m_selectedTypeIndex].canDrop == true
end
FacQuickBarCtrl.OnOtherStartDragItem = HL.Method(HL.Forward('UIDragHelper')) << function(self, dragHelper)
if not self:IsShow() then
return
end
if not self:_CanDrop() then
return
end
if UIUtils.isTypeDropValid(dragHelper, UIConst.FACTORY_QUICK_BAR_DROP_ACCEPT_INFO) then
if dragHelper.source ~= UIConst.UI_DRAG_DROP_SOURCE_TYPE.QuickBar then
self.view.dropHint.gameObject:SetActive(true)
self.view.dropHint.transform:SetAsLastSibling()
end
else
self.view.cantDropHint.gameObject:SetActive(true)
self.view.cantDropHint.transform:SetAsLastSibling()
end
self.view.beltNode.notDropHint.gameObject:SetActive(true)
self.view.pipeNode.notDropHint.gameObject:SetActive(true)
end
FacQuickBarCtrl.OnOtherEndDragItem = HL.Method(HL.Forward('UIDragHelper')) << function(self, dragHelper)
if UIUtils.isTypeDropValid(dragHelper, UIConst.FACTORY_QUICK_BAR_DROP_ACCEPT_INFO) then
self.view.dropHint.gameObject:SetActive(false)
else
self.view.cantDropHint.gameObject:SetActive(false)
end
self.view.beltNode.notDropHint.gameObject:SetActive(false)
self.view.pipeNode.notDropHint.gameObject:SetActive(false)
end
FacQuickBarCtrl._OnDropItem = HL.Method(HL.Number, HL.Forward('UIDragHelper')) << function(self, index, dragHelper)
local csIndex = CSIndex(index)
local source = dragHelper.source
local fcType = self.m_typeInfos[self.m_selectedTypeIndex].fcType
local remoteFactoryCore = GameInstance.player.remoteFactory.core
if source == UIConst.UI_DRAG_DROP_SOURCE_TYPE.QuickBar then
local fromCSIndex = dragHelper.info.csIndex
if remoteFactoryCore.isTempQuickBarActive then
remoteFactoryCore:SwitchTempQuickBarItem(fromCSIndex, csIndex)
else
GameInstance.player.remoteFactory:SendMoveQuickBar(fcType, 0, fromCSIndex, csIndex)
end
else
local itemId = dragHelper:GetId()
if remoteFactoryCore.isTempQuickBarActive then
remoteFactoryCore:MoveItemToTempQuickBar(itemId, csIndex)
else
GameInstance.player.remoteFactory:SendSetQuickBar(fcType, 0, csIndex, itemId)
end
end
UIUtils.playItemDropAudio(dragHelper:GetId())
AudioAdapter.PostEvent("au_ui_common_put_down")
end
FacQuickBarCtrl.OnQuickBarChanged = HL.Method() << function(self)
if not self.m_arg then
return
end
self:_InitDataInfo()
self:_RefreshTypes()
end
FacQuickBarCtrl._OnQuickBarEndDrag = HL.Method(HL.Number, HL.Opt(HL.Userdata, HL.Forward('UIDropHelper'), HL.Any)) << function(self, index, enterObj, enterDrop, eventData)
if not eventData then
return
end
if enterDrop then
return
end
if enterObj ~= UIManager.commonTouchPanel.gameObject then
return
end
self:_OnClickItem(index, eventData.position)
end
FacQuickBarCtrl.m_arg = HL.Field(HL.Table)
FacQuickBarCtrl.ShowFacQuickBar = HL.StaticMethod(HL.Table) << function(arg)
if not Utils.isSystemUnlocked(GEnums.UnlockSystemType.FacMode) then
return
end
local self = FacQuickBarCtrl.AutoOpen(PANEL_ID, nil, true)
self.m_arg = arg
self.m_useActiveAction = arg.useActiveAction == true
self:_AttachToPanel(arg)
self:_RefreshContent()
self:_RefreshControllerSettingOnShow()
end
FacQuickBarCtrl.HideFacQuickBar = HL.Method(HL.Number) << function(self, panelId)
self:_CustomHide(panelId)
end
FacQuickBarCtrl.CustomSetPanelOrder = HL.Override(HL.Opt(HL.Number, HL.Table)) << function(self, maxOrder, args)
self.m_curArgs = args
self:SetSortingOrder(maxOrder, false)
self:UpdateInputGroupState()
end
FacQuickBarCtrl.OnSetInSafeZone = HL.Method(HL.Opt(HL.Any)) << function(self, args)
if self:IsHide() then
return
end
self:_InitDataInfo()
self:_RefreshItemList()
end
FacQuickBarCtrl.OnItemCountChanged = HL.Method(HL.Table) << function(self, args)
if not self.m_typeInfos then
return
end
if self:IsHide() then
return
end
local itemId2DiffCount = unpack(args)
local items = self.m_typeInfos[self.m_selectedTypeIndex].items
for k, v in ipairs(items) do
if itemId2DiffCount:ContainsKey(v.itemId) then
local cell = self.m_itemCells:GetItem(k)
local count = Utils.getItemCount(v.itemId)
cell.item:UpdateCount(count)
end
end
end
FacQuickBarCtrl._OnQuickDropItemToQuickBar = HL.Method(HL.Any) << function(self, itemId)
if type(itemId) == "table" then
itemId = unpack(itemId)
end
local info = self.m_typeInfos[self.m_selectedTypeIndex]
local fcType = info.fcType
local targetIndex
for index, barItemData in ipairs(info.items) do
local barItemId = barItemData.itemId
if barItemId == itemId then
return
end
if targetIndex == nil and string.isEmpty(barItemId) then
targetIndex = index
end
end
if targetIndex == nil then
return
end
local success, itemData = Tables.itemTable:TryGetValue(itemId)
if not success then
return
end
local findType = false
for _, type in ipairs(UIConst.FACTORY_QUICK_BAR_DROP_ACCEPT_INFO.types) do
if type == itemData.type then
findType = true
break
end
end
if not findType then
return
end
local remoteFactoryCore = GameInstance.player.remoteFactory.core
local csIndex = CSIndex(targetIndex)
if remoteFactoryCore.isTempQuickBarActive then
remoteFactoryCore:MoveItemToTempQuickBar(itemId, csIndex)
else
GameInstance.player.remoteFactory:SendSetQuickBar(fcType, 0, csIndex, itemId)
end
end
FacQuickBarCtrl._OnNewScopeInfoReceived = HL.Method(HL.Any) << function(self, scopeName)
self:_RefreshContent()
end
FacQuickBarCtrl.OnBeltUnlocked = HL.Method() << function(self)
if self:IsShow() then
self:_InitDataInfo()
self:_RefreshTypes()
end
end
FacQuickBarCtrl._InitBeltNode = HL.Method() << function(self)
local node = self.view.beltNode
node.notDropHint.gameObject:SetActive(false)
local item = node.item
item:SetEnableHoverTips(DeviceInfo.usingKeyboard)
item:InitItem({ id = FacConst.BELT_ITEM_ID }, function()
self:_OnClickBelt()
end)
item:AddHoverBinding("fac_quick_bar_controller_build", function()
self:_OnClickBelt()
end)
item:OpenLongPressTips()
item.canPlace = true
item.actionMenuArgs = {
source = UIConst.UI_DRAG_DROP_SOURCE_TYPE.QuickBar,
}
if node.itemDragHandler then
node.itemDragHandler.onDrag:AddListener(function(eventData)
Notify(MessageConst.MOVE_LEVEL_CAMERA, eventData.delta)
end)
end
item.view.button.onHoverChange:AddListener(function(isHover)
if DeviceInfo.usingController then
node.keyHint.gameObject:SetActive(not isHover)
item.view.nameNode.gameObject:SetActive(isHover)
node.hoverKeyHint.gameObject:SetActive(isHover)
end
end)
item.view.nameNode.gameObject:SetActive(false)
if node.hoverKeyHint then
node.hoverKeyHint.gameObject:SetActive(false)
end
end
FacQuickBarCtrl._OnClickBelt = HL.Method() << function(self)
Notify(MessageConst.FAC_ENTER_BELT_MODE, { beltId = FacConst.BELT_ID })
end
FacQuickBarCtrl.OnPipeUnlocked = HL.Method() << function(self)
if self:IsShow() then
self:_InitDataInfo()
self:_RefreshTypes()
end
end
FacQuickBarCtrl._InitPipeNode = HL.Method() << function(self)
local node = self.view.pipeNode
node.notDropHint.gameObject:SetActive(false)
local item = node.item
item:SetEnableHoverTips(DeviceInfo.usingKeyboard)
item:InitItem({ id = FacConst.PIPE_ITEM_ID }, function()
self:_OnClickPipe()
end)
item:AddHoverBinding("fac_quick_bar_controller_build", function()
self:_OnClickPipe()
end)
item:OpenLongPressTips()
item.canPlace = true
item.actionMenuArgs = {
source = UIConst.UI_DRAG_DROP_SOURCE_TYPE.QuickBar,
}
if node.itemDragHandler then
node.itemDragHandler.onDrag:AddListener(function(eventData)
Notify(MessageConst.MOVE_LEVEL_CAMERA, eventData.delta)
end)
end
local btn = item.view.button
btn.onHoverChange:AddListener(function(isHover)
if DeviceInfo.usingController then
node.keyHint.gameObject:SetActive(not isHover)
item.view.nameNode.gameObject:SetActive(isHover)
node.hoverKeyHint.gameObject:SetActive(isHover)
end
end)
item.view.nameNode.gameObject:SetActive(false)
if node.hoverKeyHint then
node.hoverKeyHint.gameObject:SetActive(false)
end
end
FacQuickBarCtrl._OnClickPipe = HL.Method() << function(self)
Notify(MessageConst.FAC_ENTER_BELT_MODE, { beltId = FacConst.PIPE_ID })
end
FacQuickBarCtrl.m_setBuildingBindingGroupId = HL.Field(HL.Number) << -1
FacQuickBarCtrl.m_isSetSlot = HL.Field(HL.Boolean) << false
FacQuickBarCtrl._InitSetBindings = HL.Method() << function(self)
self.m_setBuildingBindingGroupId = InputManagerInst:CreateGroup(self.view.mainInputBindingGroupMonoTarget.groupId)
self:BindInputPlayerAction("common_confirm", function()
self:_OnConfirmSetInController()
end, self.m_setBuildingBindingGroupId)
self:BindInputPlayerAction("common_back", function()
self:_OnCancelSetInController()
end, self.m_setBuildingBindingGroupId)
InputManagerInst:ToggleGroup(self.m_setBuildingBindingGroupId, false)
end
FacQuickBarCtrl._OnConfirmSetInController = HL.Method() << function(self)
if self.m_isSetSlot then
self:_OnConfirmSwitchSlot()
else
self:_SetBuildingOnFacQuickBar()
end
end
FacQuickBarCtrl._OnCancelSetInController = HL.Method() << function(self)
if self.m_isSetSlot then
self:_OnCancelSwitchSlot()
else
self:_ExitSetBuilding()
end
end
FacQuickBarCtrl._OnEnterSetModeInController = HL.Method(HL.Table) << function(self, args)
UIUtils.changeAndTrySetNaviBindingType(self.view.main, CS.UnityEngine.UI.NavigationBindingType.HorizontalOnly)
InputManagerInst:ToggleGroup(self.m_setBuildingBindingGroupId, true)
Notify(MessageConst.SHOW_AS_CONTROLLER_SMALL_MENU, {
panelId = PANEL_ID,
isGroup = true,
id = self.view.mainInputBindingGroupMonoTarget.groupId,
hintPlaceholder = self.m_arg.controllerSwitchArgs.hintPlaceholder,
rectTransform = self.view.rectTransform,
noHighlight = true,
})
self:_RefreshContent()
end
FacQuickBarCtrl._OnExitSetModeInController = HL.Method(HL.Boolean) << function(self, removeLayer)
Notify(MessageConst.CLOSE_CONTROLLER_SMALL_MENU, self.view.mainInputBindingGroupMonoTarget.groupId)
if removeLayer then
InputManagerInst.controllerNaviManager:TryRemoveLayer(self.naviGroup)
end
InputManagerInst:ToggleGroup(self.m_setBuildingBindingGroupId, false)
self.view.main.navigationBindingType = CS.UnityEngine.UI.NavigationBindingType.AllDirections
end
FacQuickBarCtrl._OnDefaultNaviFailed = HL.Method(CS.UnityEngine.UI.NaviDirection) << function(self, dir)
if not string.isEmpty(self.m_curSettingBuildingItemId) then
return
end
if dir == Unity.UI.NaviDirection.Up and not self.m_useActiveAction then
InputManagerInst.controllerNaviManager:TryRemoveLayer(self.naviGroup)
end
end
FacQuickBarCtrl.m_curSettingBuildingItemId = HL.Field(HL.String) << ''
FacQuickBarCtrl.StartSetBuildingOnFacQuickBar = HL.Method(HL.Table) << function(self, args)
local itemId = args.itemId
self.m_curSettingBuildingItemId = itemId
self.view.setBuildingHint.gameObject:SetActive(true)
self.m_isSetSlot = false
self:_OnEnterSetModeInController(args)
local curInfo = self.m_typeInfos[self.m_selectedTypeIndex]
for k, v in ipairs(curInfo.items) do
if v.itemId == itemId then
local cell = self.m_itemCells:Get(k)
cell:SetAsNaviTarget()
return
end
end
local cell = self.m_itemCells:Get(1)
cell:SetAsNaviTarget()
end
FacQuickBarCtrl._SetBuildingOnFacQuickBar = HL.Method() << function(self)
if string.isEmpty(self.m_curSettingBuildingItemId) then
return
end
local fcType = self.m_typeInfos[self.m_selectedTypeIndex].fcType
GameInstance.player.remoteFactory:SendSetQuickBar(fcType, 0, CSIndex(self.m_currentNaviIndex), self.m_curSettingBuildingItemId)
self:_ExitSetBuilding()
end
FacQuickBarCtrl._ExitSetBuilding = HL.Method() << function(self)
self:_OnExitSetModeInController(true)
self.m_curSettingBuildingItemId = ""
self.view.setBuildingHint.gameObject:SetActive(false)
self:_RefreshContent()
end
FacQuickBarCtrl.m_switchSlotFromIndex = HL.Field(HL.Number) << -1
FacQuickBarCtrl.StartSwitchSlotOnFacQuickBar = HL.Method(HL.Table) << function(self, args)
self.m_isSetSlot = true
self.m_switchSlotFromIndex = args.fromIndex
self:_OnEnterSetModeInController(args)
local fromCell = self.m_itemCells:GetItem(self.m_switchSlotFromIndex)
fromCell.item.view.button.enabled = false
fromCell.item:SetSelected(true)
local initNaviCell = self.m_itemCells:GetItem(self.m_switchSlotFromIndex ~= 1 and 1 or 2)
initNaviCell.item:SetAsNaviTarget()
end
FacQuickBarCtrl._ExitSwitchSlot = HL.Method(HL.Boolean) << function(self, isConfirm)
self:_OnExitSetModeInController(false)
local fromCell = self.m_itemCells:GetItem(self.m_switchSlotFromIndex)
self.m_switchSlotFromIndex = -1
fromCell.item.view.button.enabled = true
fromCell.item:SetSelected(false)
if isConfirm then
local currCell = self.m_itemCells:GetItem(self.m_currentNaviIndex)
InputManagerInst:ToggleBinding(currCell.item.view.button.hoverConfirmBindingId, true)
else
UIUtils.setAsNaviTarget(fromCell.item.view.button)
InputManagerInst:ToggleBinding(fromCell.item.view.button.hoverConfirmBindingId, true)
end
end
FacQuickBarCtrl._OnConfirmSwitchSlot = HL.Method() << function(self)
local fcType = self.m_typeInfos[self.m_selectedTypeIndex].fcType
GameInstance.player.remoteFactory:SendMoveQuickBar(fcType, 0, CSIndex(self.m_switchSlotFromIndex), CSIndex(self.m_currentNaviIndex))
self:_ExitSwitchSlot(true)
end
FacQuickBarCtrl._OnCancelSwitchSlot = HL.Method() << function(self)
self:_ExitSwitchSlot(false)
end
FacQuickBarCtrl.m_manualFocusBindingId = HL.Field(HL.Number) << -1
FacQuickBarCtrl.m_manualUnFocusBindingId = HL.Field(HL.Number) << -1
FacQuickBarCtrl.m_currentNaviIndex = HL.Field(HL.Number) << -1
FacQuickBarCtrl.m_zoomCamGroupId = HL.Field(HL.Number) << 0
FacQuickBarCtrl._InitController = HL.Method() << function(self)
if not DeviceInfo.usingController then
return
end
self.view.main.onIsTopLayerChanged:AddListener(function(isTopLayer)
self:_OnIsTopLayerChanged(isTopLayer)
end)
self.view.main.getDefaultSelectableFunc = function()
return self.m_itemCells:Get(1).item.view.button
end
self.view.main.onDefaultNaviFailed:AddListener(function(dir)
self:_OnDefaultNaviFailed(dir)
end)
self.view.main.focusPanelSortingOrder = UIManager:GetBaseOrder(Types.EPanelOrderTypes.PopUp) - 1
self.m_manualFocusBindingId = self:BindInputPlayerAction("fac_activate_quick_bar", function()
local curTarget = self.view.main.lastFocusNaviTarget
if curTarget and not curTarget.gameObject.activeInHierarchy then
self.view.main:ClearLastFocusNaviTarget()
end
self.view.main:ManuallyFocus()
end, self.view.mainInputBindingGroupMonoTarget.groupId)
self.m_manualUnFocusBindingId = self:BindInputPlayerAction("fac_deactivate_quick_bar", function()
self.view.main:ManuallyStopFocus()
end, self.view.mainInputBindingGroupMonoTarget.groupId)
self.m_zoomCamGroupId = InputManagerInst:CreateGroup(self.view.mainInputBindingGroupMonoTarget.groupId)
UIUtils.bindControllerCamZoom(self.m_zoomCamGroupId)
InputManagerInst:ToggleGroup(self.m_zoomCamGroupId, false)
self:_InitSetBindings()
end
FacQuickBarCtrl._OnIsTopLayerChanged = HL.Method(HL.Boolean) << function(self, isTopLayer)
InputManagerInst:ToggleGroup(self.m_zoomCamGroupId, isTopLayer and self.m_useActiveAction and not UIUtils.isBattleControllerModifyKeyChanged())
if not self.m_useActiveAction then
return
end
if isTopLayer then
if not InputManagerInst:GetKey(CS.Beyond.Input.GamepadKeyCode.LB) then
self:_StartTimer(0, function()
self.view.main:ManuallyStopFocus()
end)
return
end
end
self.view.barNodeSimpleActiveAnimationHelper.isActive = isTopLayer
self.view.activeKeyHint.gameObject:SetActive(not isTopLayer)
Notify(MessageConst.TOGGLE_HIDE_INTERACT_OPTION_LIST, { "FacQuickBar", isTopLayer })
local isOpen, jsPanelCtrl = UIManager:IsOpen(PanelId.Joystick)
if isOpen then
local jsGroupId = jsPanelCtrl.view.joystick.groupId
if isTopLayer then
InputManagerInst:ChangeParent(true, jsGroupId, self.view.mainInputBindingGroupMonoTarget.groupId)
else
InputManagerInst:ChangeParent(true, jsGroupId, jsPanelCtrl.view.inputGroup.groupId)
end
end
end
FacQuickBarCtrl._RefreshControllerSettingOnShow = HL.Method() << function(self)
if DeviceInfo.usingTouch then
return
end
local useActiveAction = DeviceInfo.usingController and self.m_useActiveAction
self.view.barNodeSimpleActiveAnimationHelper.enabled = useActiveAction
if not useActiveAction then
self.view.barNodeAnimation:Play("facquickbar_default")
end
self.view.activeKeyHint.gameObject:SetActive(useActiveAction)
InputManagerInst:ToggleBinding(self.m_manualFocusBindingId, useActiveAction)
InputManagerInst:ToggleBinding(self.m_manualUnFocusBindingId, useActiveAction)
self.view.main.navigationBindingType = useActiveAction and CS.UnityEngine.UI.NavigationBindingType.RightJsHorizontalOnly or CS.UnityEngine.UI.NavigationBindingType.AllDirections
end
FacQuickBarCtrl.ToggleCanDeactiveQuickBar = HL.Method(HL.Table) << function(self, args)
local canDeactive = unpack(args)
if not self.m_useActiveAction then
return
end
InputManagerInst:ToggleBinding(self.m_manualUnFocusBindingId, canDeactive)
if canDeactive then
self.view.main:ManuallyStopFocus()
end
end
FacQuickBarCtrl.NaviToFacQuickBar = HL.Method() << function(self)
if not self:IsShow() then
return
end
local cell = self.m_itemCells:Get(1)
cell:SetAsNaviTarget()
end
HL.Commit(FacQuickBarCtrl)