Files
Endfield-Data/LuaScripts/UI/Widgets/ItemSlot.lua
2025-12-02 20:37:18 +07:00

256 lines
7.2 KiB
Lua

local UIWidgetBase = require_ex('Common/Core/UIWidgetBase')
ItemSlot = HL.Class('ItemSlot', UIWidgetBase)
ItemSlot.item = HL.Field(HL.Forward('Item'))
ItemSlot.supportQuickMovingHalfItem = HL.Field(HL.Boolean) << false
ItemSlot._OnFirstTimeInit = HL.Override() << function(self)
self.item = self.view.item
end
ItemSlot.InitItemSlot = HL.Method(HL.Opt(HL.Any, HL.Any, HL.String, HL.Boolean)) <<
function(self, itemBundle, onClick, limitId, clickableEvenEmpty)
self:_FirstTimeInit()
self.item.view.button.longPressImg = nil
self.view.pressHintImg.gameObject:SetActive(false)
self.view.lockNode.gameObject:SetActive(false)
self.view.item.gameObject:SetActive(true)
self.item:InitItem(itemBundle, onClick, limitId, clickableEvenEmpty)
local isEmpty = itemBundle == nil or itemBundle.id == ""
if self.view.emptyNode then
self.view.emptyNode.gameObject:SetActive(isEmpty)
end
if isEmpty then
self.view.dragItem.enabled = false
self.view.dropItem:ClearEvents()
self.view.dragItem:ClearEvents()
return
end
self.view.dropItem:ClearEvents()
self.view.dragItem:ClearEvents()
self.view.dragItem.enabled = true
self.view.dragItem.dragPivot = DeviceInfo.isMobile and self.config.DRAG_PIVOT_FOR_MOBILE or self.config.DRAG_PIVOT_FOR_PC
self.item.view.button.longPressHintTextId = "virtual_mouse_hint_drag"
self.view.dragItem.onUpdateDragObject:AddListener(function(dragObj)
if self.view.dragItem.luaTable == nil then
dragItem:InitItem({ id = itemBundle.id, count = 0 })
else
local dragHelper = self.view.dragItem.luaTable[1]
dragHelper.isHalfDragging = self.supportQuickMovingHalfItem and UIUtils.isQuickMovingHalfItem()
local dragItem = UIWidgetManager:Wrap(dragObj)
dragItem:InitItem({ id = itemBundle.id, count = dragHelper:GetCount() })
end
end)
end
ItemSlot.InitLockSlot = HL.Method() << function(self)
self:_FirstTimeInit()
self.item.view.button.longPressImg = nil
self.view.pressHintImg.gameObject:SetActive(false)
self.view.item.gameObject:SetActive(false)
self.view.lockNode.gameObject:SetActive(true)
self.view.dragItem.enabled = false
self.view.lockNode.onClick:RemoveAllListeners()
self.view.lockNode.onClick:AddListener(function()
Notify(MessageConst.SHOW_TOAST, Language.LUA_ITEM_BAG_SLOT_LOCKED)
end)
self.view.dropItem.onDropEvent:RemoveAllListeners()
self.view.dragItem.onBeginDragEvent:RemoveAllListeners()
self.view.dragItem.onDragEvent:RemoveAllListeners()
self.view.dragItem.onDragEventWhenCantStartDrag:RemoveAllListeners()
self.view.dragItem.onEndDragEvent:RemoveAllListeners()
self.view.dragItem.onUpdateDragObject:RemoveAllListeners()
end
ItemSlot.InitPressDrag = HL.Method() << function(self)
if DeviceInfo.usingTouch then
self:InitPressDragForTouch()
end
end
ItemSlot.InitPressDragForTouch = HL.Method() << function(self)
self.item.view.button.longPressImg = self.view.pressHintImg
if not self.view.dragItem.inDragging then
self.view.dragItem.canStartDrag = false
end
self.item.view.button.onLongPress:AddListener(function(eventData)
if not self.view.dragItem.enabled or self.view.dragItem.canStartDrag then
return
end
self.view.dragItem.canStartDrag = true
self.view.dragItem:OnBeginDrag(eventData)
GameInstance.mobileMotionManager:PostEventCommonShort()
end)
local startPressTime
local needCheckIsDragItem
self.item.view.button.onPressStart:AddListener(function(eventData)
startPressTime = Time.unscaledTime
needCheckIsDragItem = true
end)
self.view.dragItem.onDragEventWhenCantStartDrag:AddListener(function(eventData)
if not needCheckIsDragItem then
return
end
if self.view.dragItem.canStartDrag then
needCheckIsDragItem = false
return
end
local delta = eventData.position - eventData.pressPosition
if delta.sqrMagnitude >= self.view.config.MOBILE_AUTO_CHECK_IS_DRAG_ITEM_MAX_DIST_SQR then
needCheckIsDragItem = false
local isDragItem = math.abs(delta.x) > math.abs(delta.y)
if isDragItem then
self.view.dragItem.canStartDrag = true
self.view.dragItem:OnBeginDrag(eventData)
GameInstance.mobileMotionManager:PostEventCommonShort()
end
return
end
if Time.unscaledTime >= startPressTime + self.item.view.button.longPressTime then
needCheckIsDragItem = false
return
end
end)
self.view.dragItem.onEndDragEvent:AddListener(function(eventData)
self.view.dragItem.canStartDrag = false
end)
self.item.view.button.onPressEnd:AddListener(function(eventData)
if (not eventData.dragging) and self.view.dragItem.inDragging then
self.view.dragItem:OnEndDrag(eventData)
end
end)
end
ItemSlot._GetQuickDropTarget = HL.Method().Return(HL.Opt(HL.Userdata)) << function(self)
if not self.view.dragItem.luaTable then
return
end
local dragHelper = self.view.dragItem.luaTable[1]
local UIDropHelper = require_ex("Common/Utils/UI/UIDropHelper")
local maxPriority, targetDropHelper
for dropHelper, _ in pairs(UIDropHelper.s_dropAreas) do
if not maxPriority or dropHelper.dropPriority > maxPriority then
local checkTarget = dropHelper.info.quickDropCheckGameObject or dropHelper.uiDropItem.gameObject
if dropHelper.uiDropItem.enabled and checkTarget.activeInHierarchy and dropHelper:Accept(dragHelper) then
maxPriority = dropHelper.dropPriority
targetDropHelper = dropHelper
end
end
end
return targetDropHelper
end
ItemSlot.QuickDrop = HL.Method() << function(self)
if DeviceInfo.usingController and GameInstance.player.guide.isInForceGuide and not GameInstance.player.guide.isInHelperGuideStep then
if not InputManager.instance.guideUseActionIds:Contains("common_quick_drop") then
return
end
end
local targetDropHelper = self:_GetQuickDropTarget()
if targetDropHelper then
local dragHelper = self.view.dragItem.luaTable[1]
targetDropHelper.info.onDropItem(nil, dragHelper)
end
end
ItemSlot.IsQuickDropTargetValid = HL.Method().Return(HL.Boolean) << function(self)
return self:_GetQuickDropTarget() ~= nil
end
ItemSlot.SetAsNaviTarget = HL.Method() << function(self)
self.item:SetAsNaviTarget()
end
ItemSlot.PlayDropAnimation = HL.Method() << function(self)
self.view.animationWrapper:Play("itemslot_item_drop")
end
ItemSlot.SetDropHighlighted = HL.Method(HL.Boolean) << function(self, active)
Notify(MessageConst.ON_TOGGLE_ITEM_SLOT_DROP_HIGHLIGHT, {
active,
CS.Beyond.UI.CommonDropHintType.Square,
self.view.transform:TransformPoint(self.view.transform.rect.center:XY()),
self.view.transform.parent,
self,
})
end
HL.Commit(ItemSlot)
return ItemSlot