| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517 |
- local CacheWidget = requireUtil("CacheWidget")
- local GoodsItem = class("GoodsItem", CacheWidget)
- local ItemConfigProxy = global.Facade:retrieveProxy(global.ProxyTable.ItemConfigProxy)
- local RichTextHelp = requireUtil("RichTextHelp")
- -- 点击事件
- local kTouchAll = 0
- local kTouchPress = 1 -- 长按
- local kTouchClick = 2 -- 点击
- local kTouchWidget = 3 -- widget touch
- local kDoubleTime = global.MMO.CLICK_DOUBLE_TIME
- local itemMoveState = {
- begin = 1,
- moving = 2,
- end_move = 3,
- }
- local mmax = math.max
- local mmin = math.min
- local sformat = string.format
- function GoodsItem:ctor()
- GoodsItem.super.ctor(self)
- self._pressCallback = nil
- self._clickCallback = nil
- self._replaceClickEvent = nil
- self._iconTouchEventListener = nil
- self._doubleEvent = nil
- self._lastClickTime = nil
- self._clickDelayHandler = nil
- self._moveCancelCallBack = nil
- self._data = nil
- self._itemData = nil
- self._from = nil
- self._movable = nil
- self._canLooks = nil
- self._mouseEventCheckTimes = nil
- self._moveItem = nil
- self._noSwallow = nil
- self._extraLockStatus = nil
- self._greyStatus = nil
- self._itemTipsCenter = nil
- end
- function GoodsItem:init(data)
- self._quickUI = ui_delegate(self)
- self:InitGUI(data)
- end
- function GoodsItem:InitGUI(data)
- self._itemClass = require(SLDefine.LUAFile.LUA_FILE_ITEM).new(self, data)
- self:Cleanup()
- self:InitData(data)
- end
- function GoodsItem:InitData(data)
- if tonumber(data) then
- local index = data
- data = {}
- data.index = index
- end
- local ItemConfigProxy = global.Facade:retrieveProxy(global.ProxyTable.ItemConfigProxy)
- data = data or {}
- self._data = data
- self._itemData = data.itemData or ItemConfigProxy:GetItemDataByIndex(data.index)
- self._mouseEventCheckTimes = data.mouseCheckTimes
- self._moveItem = data.moveItem
- if data.from then
- self._from = data.from
- end
- -- 是否注册鼠标tips
- local isShowMouseTip = data.noMouseTips
- if not isShowMouseTip and global.isWinPlayMode then
- self:RegisterWin32MouseMove()
- global.mouseEventController:registerMouseButtonEvent(self, {checkIsVisible = true})
- end
- local noSwallow = data.noSwallow
- if type(noSwallow) == "boolean" then
- self:setItemTouchSwallow(noSwallow)
- end
- -- 是否查看道具信息
- local look = data.look
- -- 是否可移动
- local movable = data.movable
- if look or movable then
- self._movable = movable
- self._canLooks = look
- self:addLookItemInfoEvent(data.posType)
- end
- end
- function GoodsItem:OnEnter()
- end
- function GoodsItem:OnExit()
- if self._clickDelayHandler then
- UnSchedule(self._clickDelayHandler)
- self._clickDelayHandler = nil
- end
- if not global.isWinPlayMode then
- if not self._moveItem and self._itemData and self._itemData.MakeIndex then
- global.Facade:sendNotification(global.NoticeTable.Layer_Moved_Cancel, {MakeIndex = self._itemData.MakeIndex})
- end
- end
-
- local eventDispatcher = cc.Director:getInstance():getEventDispatcher()
- eventDispatcher:removeEventListenersForTarget(self, true)
- end
- function GoodsItem:Cleanup()
- self._movingState = false
- self._data = nil
- self._itemData = nil
- self._from = nil
- self._movable = nil
- self._canLooks = nil
- self._mouseEventCheckTimes = nil
- self._moveItem = nil
- self._noSwallow = nil
- self._extraLockStatus = nil
- self._greyStatus = nil
- self._pressCallback = nil
- self._clickCallback = nil
- self._replaceClickEvent = nil
- self._iconTouchEventListener = nil
- self._doubleEvent = nil
- self._lastClickTime = nil
- self._clickDelayHandler = nil
- self._moveCancelCallBack = nil
- end
- function GoodsItem:OnRunFunc(func, ...)
- if self._itemClass and self._itemClass[func] and type(self._itemClass[func]) == "function" then
- return self._itemClass[func](self._itemClass, ...)
- end
- end
- function GoodsItem:UpdateItem(data)
- self._itemClass:Cleanup()
- self._itemClass:InitData(data)
- self:Cleanup()
- self:InitData(data)
- end
- function GoodsItem:setCount(count)
- self._itemClass:SetCount(count)
- end
- function GoodsItem:setItemExtraLockStatus(status)
- self._extraLockStatus = status
- self._itemClass:SetItemExtraLockStatus(status)
- end
- function GoodsItem:setIconGrey(value)
- self._greyStatus = value
- self._itemClass:SetIconGrey(value)
- end
- function GoodsItem:setItemPowerTag()
- self._itemClass:SetItemPowerFlag()
- end
- function GoodsItem:UpdateGoodsItem(itemData)
- self._itemData = itemData
- self._itemClass:UpdateGoodsItem(itemData)
- end
- function GoodsItem:SetItemIndex(index)
- self._itemData = ItemConfigProxy:GetItemDataByIndex(index)
- if self._itemData.Looks == null then return end
- self._itemClass._looks = self._itemData.Looks
- self._itemClass._index = index
- self._itemClass:SetItemIndex(index)
- GUI:setVisible(self._itemClass._ui["Button_icon"], true)
- end
- function GoodsItem:setItemTouchSwallow(bool)
- if not type(bool) == "boolean" then
- return false
- end
- self._noSwallow = not bool
- self._itemClass:SetItemTouchSwallow(bool)
- end
- function GoodsItem:SetMoveEable(enable)
- self._movable = enable
- end
- function GoodsItem:GetLayoutExtra()
- return self._quickUI.Panel_extra
- end
- function GoodsItem:GetButtonIcon()
- return self._quickUI.Button_icon
- end
- function GoodsItem:GetTextCount()
- return self._quickUI.Text_count
- end
- function GoodsItem:SetGoodItemState( state, pos )
- if not self._from or not self._movable then
- return
- end
- if itemMoveState.begin == state then
- self:setVisible(false)
- self._movingState = true
- global.Facade:sendNotification(global.NoticeTable.Layer_ItemTips_Close)
- global.Facade:sendNotification(global.NoticeTable.Layer_Moved_Begin,{
- pos = pos,
- itemData = self._itemData,
- cancelCallBack = self._moveCancelCallBack,
- goodsItem = self,
- from = self._from
- })
- elseif itemMoveState.moving == state then
- elseif itemMoveState.end_move == state then
- global.Facade:sendNotification(global.NoticeTable.Layer_Moved_End, pos)
- end
- end
- function GoodsItem:resetMoveState(bool)
- self._movingState = bool
- self:setVisible(not bool)
- end
- function GoodsItem:showIteminfo(posType, setPos)
- if not self._itemData or self._movingState then
- return nil
- end
- local result = true
- if self._replaceClickEvent then
- result = self._replaceClickEvent(self)
- end
- if result then
- local pos = self:getWorldPosition()
- -- pick item audio
- if global.isWinPlayMode and self._movable then
- if setPos and next(setPos) then-- 交换道具位置后的
- pos = setPos
- end
- self:SetGoodItemState(itemMoveState.begin, pos)
- else
- if self._canLooks and not global.isWinPlayMode then
- if not self._itemData or next(self._itemData) == nil then
- return
- end
- local data = {}
- data.itemData = self._itemData
- data.pos = pos
- data.from = self._from
- data.lookPlayer = self._data and self._data.lookPlayer
- global.Facade:sendNotification(global.NoticeTable.Layer_ItemTips_Open, data)
- end
- end
- end
- end
- function GoodsItem:addLookItemInfoEvent(posType, eventType)
- eventType = eventType or kTouchClick
- self:addTouchEventListener(function()
- self:showIteminfo(posType)
- end, eventType)
- end
- function GoodsItem:addReplaceClickEventListener(callback)
- self._replaceClickEvent = callback
- end
- function GoodsItem:addDoubleEventListener(callback)
- self._doubleEvent = callback
- end
- function GoodsItem:addMoveCancelCallBack(callback)
- self._moveCancelCallBack = callback
- end
- function GoodsItem:addPressCallBack(callback)
- self._pressCallback = callback
- end
- function GoodsItem:SetChooseState(visible)
- self._quickUI.Image_choosTag:setVisible(visible)
- end
- -- 注册鼠标移动事件
- function GoodsItem:RegisterWin32MouseMove()
- local function UnScheduler()
- if self._delayFunc then
- cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self._delayFunc)
- self._delayFunc = nil
- end
- end
- local function onShowItemTips(touchPos)
- if self._movingState then
- return false
- end
- if not (self._itemData and next(self._itemData)) then
- return false
- end
- if not CheckNodeCanCallBack(self, touchPos, self._mouseEventCheckTimes) then
- return false
- end
-
- local data = {}
- data.itemData = self._itemData
- data.pos = self:getWorldPosition()
- data.from = self._from
- data.lookPlayer = self._data and self._data.lookPlayer
- SL:OpenItemTips(data)
- end
- local function onLeaveFunc()
- SL:CloseItemTips()
- UnScheduler()
- end
- local function onEnterFunc(touchPos)
- if self._delayFunc then
- return false
- end
- self._delayFunc = PerformWithDelayGlobal(function()
- onShowItemTips(touchPos)
- end, global.MMO.PC_TIPS_DELAY_TIME)
- end
- GUI:addMouseMoveEvent(self, {onEnterFunc = onEnterFunc, onLeaveFunc = onLeaveFunc, checkIsVisible = true})
- self.isSignMouListner = true
- end
- --注册鼠标滚动回调
- function GoodsItem:RegisterWin32MouseMoveScrollCall(data)
- global.Facade:sendNotification(global.NoticeTable.Layer_ItemTips_Mouse_Scroll, data)
- end
- function GoodsItem:addTouchEventListener(callback, eventType)
- -- 0:长按,点击 1:长按 2:点击 3:touch响应回调
- eventType = eventType or kTouchClick
- if eventType == kTouchAll then
- self._pressCallback = callback
- self._clickCallback = callback
- elseif eventType == kTouchPress then
- self._pressCallback = callback
- elseif eventType == kTouchClick then
- self._clickCallback = callback
- elseif eventType == kTouchWidget then
- self._iconTouchEventListener = callback
- end
- local isEventPress = false
- local isMoved = true
- local canCallBack = true
- local isMobile = not global.isWinPlayMode
- local isMoveNode = false
- local function delayCallback()
- isEventPress = true
- if self._pressCallback then
- if not self._pressCallback then
- return false
- end
- if not isMoved then
- self._pressCallback(self)
- return false
- end
- local movedPos = self._quickUI.Panel_bg:getTouchMovePosition()
- local beganPos = self._quickUI.Panel_bg:getTouchBeganPosition()
- local diff = cc.pSub(movedPos, beganPos)
- local distSq = cc.pLengthSQ(diff)
- if distSq <= 100 then
- self._pressCallback(self)
- end
- end
- end
- local function touchEvent(_, eventType)
- if not isMobile then
- local ItemMoveProxy = global.Facade:retrieveProxy(global.ProxyTable.ItemMoveProxy)
- local itemMoving = ItemMoveProxy:GetMovingItemState()
- if itemMoving then --在道具移动中
- if eventType == 0 then
- self:retain()
- canCallBack = ItemMoveProxy:GetItemMoveFrome() ~= ItemMoveProxy.ItemGoTo.BAG or self._from ~= ItemMoveProxy.ItemGoTo.BAG
- end
- return
- end
-
- local BagProxy = global.Facade:retrieveProxy(global.ProxyTable.Bag)
- if BagProxy:GetBagCollimator() then
- self:retain()
- return
- end
- end
- if self._iconTouchEventListener then
- self._iconTouchEventListener(self, eventType)
- end
- if eventType == 0 then
- self:retain()
- isEventPress = false
- isMoved = false
- canCallBack = true
- isMoveNode = false
- if self._pressCallback then
- self._quickUI.Panel_bg:stopAllActions()
- performWithDelay(self._quickUI.Panel_bg, delayCallback, kDoubleTime)
- end
- elseif eventType == 1 then
- local movedPos = self._quickUI.Panel_bg:getTouchMovePosition()
- local beganPos = self._quickUI.Panel_bg:getTouchBeganPosition()
- local diff = cc.pSub(movedPos, beganPos)
- local distSq = cc.pLengthSQ(diff)
- if not isMoved and distSq > 100 then
- isMoved = true
- if isMobile and self._movable then
- local beginMovePos = self:getWorldPosition()
- self:SetGoodItemState(itemMoveState.begin, beginMovePos)
- end
- end
- if isMobile and self._movable then
- local movedPos = self._quickUI.Panel_bg:getTouchMovePosition()
- global.Facade:sendNotification(global.NoticeTable.Layer_Moved_Moving,{pos = movedPos})
- end
- elseif eventType == 2 or eventType == 3 then
-
- self:autorelease()
- self._quickUI.Panel_bg:stopAllActions()
- if not isMoved then
- if not isEventPress then
- -- 判断是否有双击事件
- if self._doubleEvent then
- -- 记录上一次点击时间
- if not self._lastClickTime then
- self._lastClickTime = true
- -- 记录单击触发
- self._clickDelayHandler =
- PerformWithDelayGlobal(
- function()
- if self._clickCallback and canCallBack then
- self._clickCallback(self, eventType)
- canCallBack = false
- end
- self._lastClickTime = nil
- end,
- kDoubleTime
- )
- else
- if self._clickDelayHandler then
- UnSchedule(self._clickDelayHandler)
- self._clickDelayHandler = nil
- end
- if self._doubleEvent then
- self._doubleEvent(self)
- end
- self._lastClickTime = nil
- end
- else
- if self._clickCallback and canCallBack then
- self._clickCallback(self, eventType)
- canCallBack = false
- end
- end
- end
- else
- if isMobile and self._movable then
- local endPos = self._quickUI.Panel_bg:getTouchEndPosition()
- self:SetGoodItemState(itemMoveState.end_move, endPos)
- end
- end
- end
- end
- RemoveAllWidgetTouchEventListener(self._quickUI.Panel_bg)
- self._quickUI.Panel_bg:addTouchEventListener(touchEvent)
- self._quickUI.Panel_bg:setTouchEnabled(true)
- self._quickUI.Panel_bg:setSwallowTouches(not self._noSwallow)
- end
- function GoodsItem:DelayTouchEnabled(delay)
- GUI:delayTouchEnabled(self._quickUI.Panel_bg, delay)
- end
- return GoodsItem
|