c1_lua/lua/app/ui/common/component/chat_btn_comp.lua
2023-04-03 10:59:13 +08:00

154 lines
4.9 KiB
Lua

local ChatBtnComp = class("ChatBtnComp", LuaComponent)
function ChatBtnComp:init()
local x, y = self.baseObject:fastGetSizeDelta()
self.width = x
self.height = y
self.baseObject:addDragListener(function(eventType, x, y)
self:onGrag(eventType, x, y)
end)
self:adsorbent()
local uiMap = self.baseObject:genAllChildren()
self.redPoint = uiMap["chat_btn.red_point"]
self.redPointTx = uiMap["chat_btn.red_point.text"]
self.isBindData = false
self.initPosition = false
end
function ChatBtnComp:bindData()
self.isBindData = true
self:bind(DataManager.ChatData:getChatGuild(), "chatCount", function()
self:refreshRedPoint()
end)
self:bind(DataManager.ChatData:getChatGuild(), "readMsgIndex", function()
self:refreshRedPoint()
end)
self:bind(DataManager.ChatData:getChatWorld(), "chatCount", function()
self:refreshRedPoint()
end)
self:bind(DataManager.ChatData:getChatWorld(), "readMsgIndex", function()
self:refreshRedPoint()
end)
self:bind(DataManager.ChatData, "isBlockWorldRedPoint", function()
self:refreshRedPoint()
end)
self:bind(DataManager.ChatData, "isBlockGuildRedPoint", function()
self:refreshRedPoint()
end)
end
function ChatBtnComp:show(isFirstEnter)
if DataManager.TutorialData:getIsInTutorial() then -- 有新手引导的时候隐藏
self.baseObject:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS).enabled = false
return
end
if isFirstEnter or not self.initPosition then
self.initPosition = true
local width = GConst.UI_SCREEN_WIDTH
local height = GConst.UI_SCREEN_HEIGHT
self.baseObject:setAnchoredPosition(-width/2 + 60, -height/2 + 220)
self:bindData()
end
if not self.isBindData then
self:bindData()
end
self:refreshRedPoint()
self.baseObject:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS).enabled = true
end
function ChatBtnComp:hide()
if not self.baseObject:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS).enabled then
return
end
self.baseObject:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS).enabled = false
self:unBindAll()
self.isBindData = false
end
function ChatBtnComp:adsorbent()
local notchScreenHeight = SafeAreaManager:getNotchScreenHeight()
if notchScreenHeight < 1 then -- 没有刘海
notchScreenHeight = 0
end
local posX, posY = self.baseObject:fastGetAnchoredPosition()
local width = GConst.UI_SCREEN_WIDTH
local height = GConst.UI_SCREEN_HEIGHT
if posY < -height/2 + self.height/2 then
posY = -height/2 + self.height/2
elseif posY > height/2 - self.height/2 - notchScreenHeight then
posY = height/2 - self.height/2 - notchScreenHeight
end
local distanceLeft = posX + width/2
local distanceRight = width - distanceLeft
local min = math.min(distanceLeft, distanceRight)
local x, y = width/2 - self.width/2 - 20, posY-- 默认向右吸附
if distanceLeft == min then -- 离左边最近
x, y = -width/2 + self.width/2 + 20, posY
end
self.baseObject:setAnchoredPosition(x, y)
end
function ChatBtnComp:onGrag(eventType, x, y)
if eventType == GConst.TOUCH_EVENT.DOWN then
elseif eventType == GConst.TOUCH_EVENT.DRAG then
local uiCamera = UIManager:getUICameraComponent()
local worldPosition = uiCamera:ScreenToWorldPoint(BF.Vector2(x, y))
local convertPosition = UIManager:getMainCanvas():getTransform():InverseTransformPoint(worldPosition)
local x = convertPosition.x
local y = convertPosition.y
if x > GConst.UI_SCREEN_WIDTH/2 then
x = GConst.UI_SCREEN_WIDTH/2
elseif x < -GConst.UI_SCREEN_WIDTH/2 then
x = -GConst.UI_SCREEN_WIDTH/2
end
if y > GConst.UI_SCREEN_HEIGHT/2 then
y = GConst.UI_SCREEN_HEIGHT/2
elseif y < -GConst.UI_SCREEN_HEIGHT/2 then
y = -GConst.UI_SCREEN_HEIGHT/2
end
self.baseObject:setAnchoredPosition(x, y)
elseif eventType == GConst.TOUCH_EVENT.UP_INSIDE then
ModuleManager.ChatManager:showChatUI()
elseif eventType == GConst.TOUCH_EVENT.DRAG_CANCEL_UP then
self:adsorbent()
end
end
function ChatBtnComp:refreshRedPoint()
local count = 0
if not DataManager.ChatData:getIsBlockWorldRedPoint() then
local wordChat = DataManager.ChatData:getChatWorld()
local worldReadIndex = wordChat:getReadMsgIndex()
local chatWorldCount = wordChat:getChatCount()
if worldReadIndex < chatWorldCount then
count = count + chatWorldCount - worldReadIndex
end
end
if not DataManager.ChatData:getIsBlockGuildRedPoint() then
if DataManager.GuildData:checkInGuild() then
local chatGuild = DataManager.ChatData:getChatGuild()
local guildReadIndex = chatGuild:getReadMsgIndex()
local chatGuildCount = chatGuild:getChatCount()
if guildReadIndex < chatGuildCount then
count = count + chatGuildCount - guildReadIndex
end
end
end
if count > 99 then
self.redPoint:setLocalScale(1, 1, 1)
self.redPointTx:setText("99")
elseif count > 0 then
self.redPoint:setLocalScale(1, 1, 1)
self.redPointTx:setText(tostring(count))
else
self.redPoint:setLocalScale(0, 0, 0)
end
end
return ChatBtnComp