forked from endernon/PGRData
277 lines
No EOL
10 KiB
Lua
277 lines
No EOL
10 KiB
Lua
local XUiTheatre3EquipmentCell = require("XUi/XUiTheatre3/Equip/XUiTheatre3EquipmentCell")
|
||
|
||
local EffectType = { Equip = 1, Suit = 2 }
|
||
local CONDITION_COLOR = {
|
||
[true] = XUiHelper.Hexcolor2Color("3F3F3FFF"),
|
||
[false] = XUiHelper.Hexcolor2Color("9A9C9DFF"),
|
||
}
|
||
|
||
---@class XUiTheatre3EquipmentTip : XUiNode 装备Tip子UI
|
||
---@field Parent XUiTheatre3EquipmentChoose
|
||
---@field _Control XTheatre3Control
|
||
---@field _Equipment XUiTheatre3EquipmentCell
|
||
local XUiTheatre3EquipmentTip = XClass(XUiNode, "XUiTheatre3EquipmentTip")
|
||
|
||
function XUiTheatre3EquipmentTip:OnStart()
|
||
self._Pool = {}
|
||
self._Attrs = {}
|
||
self:InitBtnDetail()
|
||
self:ShowCurEquipTag(false)
|
||
self:ShowDontGainTag(false)
|
||
XUiHelper.RegisterClickEvent(self, self.BtnSuit, self.ShowSuitEffectDetail)
|
||
XUiHelper.RegisterClickEvent(self, self.BtnEquip, self.ShowEquipEffectDetail)
|
||
XUiHelper.RegisterClickEvent(self, self.BtnMask, self.OnClickTip)
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:InitBtnDetail()
|
||
if not self.BtnDetail then
|
||
self.BtnDetail = XUiHelper.TryGetComponent(self.Transform, "PanelEquipment/PanelBase/BtnDetail", "XUiButton")
|
||
end
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:SetBtnDetailCallBack(cb)
|
||
if self.BtnDetail then
|
||
self.BtnDetail.gameObject:SetActiveEx(true)
|
||
self.BtnDetail.CallBack = cb
|
||
end
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:SetSelectCallBack(cb)
|
||
-- 选中回调
|
||
self._SelectCb = cb
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:DoSelectCallBack()
|
||
if self._SelectCb then
|
||
self._SelectCb(self._EquipConfig.Id)
|
||
end
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:ShowEquipTip(equipId, btnTxt, callBack, isDetailTxt)
|
||
if isDetailTxt == nil then
|
||
isDetailTxt = true
|
||
end
|
||
self._EquipConfig = self._Control:GetEquipById(equipId)
|
||
if not self._Equipment then
|
||
self._Equipment = XUiTheatre3EquipmentCell.New(self.UiEquipment, self.Parent, equipId)
|
||
else
|
||
self._Equipment:ShowEquip(equipId)
|
||
end
|
||
self.TxtTitle.text = self._EquipConfig.EquipName
|
||
self.TxtBaseBuff1.text = self._EquipConfig.BaseAttDesc[1]
|
||
self.TxtBaseBuff2.text = self._EquipConfig.BaseAttDesc[2]
|
||
self:SetSuitInfo(self._EquipConfig.SuitId)
|
||
self:ShowButton(btnTxt, callBack)
|
||
self:CheckTxtClick()
|
||
self:ShowDetailOrSimpleTxt(isDetailTxt)
|
||
end
|
||
|
||
---显示详细版/简略版描述
|
||
function XUiTheatre3EquipmentTip:ShowDetailOrSimpleTxt(isDetailTxt)
|
||
if self._EquipConfig then
|
||
local desc = isDetailTxt and self._EquipConfig.EffectDesc or self._EquipConfig.SimpleEffectDesc
|
||
self.TxtDetails.text = XUiHelper.ReplaceUnicodeSpace(XUiHelper.ReplaceTextNewLine(XUiHelper.FormatText(desc, self._EquipConfig.TraitName)))
|
||
end
|
||
if self._SuitConfig then
|
||
local desc = isDetailTxt and self._SuitConfig.Desc or self._SuitConfig.SimpleEffectDesc
|
||
self.TxtSuitDetails.text = XUiHelper.ReplaceUnicodeSpace(XUiHelper.ReplaceTextNewLine(XUiHelper.FormatText(desc, self._SuitConfig.TraitName)))
|
||
end
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:SetLockTip(isLock)
|
||
self._IsLock = isLock
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:SetSuitInfo(suitId)
|
||
self._SuitConfig = self._Control:GetSuitById(suitId)
|
||
self.TxtSuitDetails.color = CONDITION_COLOR[self._Control:IsSuitComplete(suitId)]
|
||
self.TxtStory.text = self._SuitConfig.RecommendDesc
|
||
self.PanelTag.gameObject:SetActiveEx(self._Control:IsWearSuit(suitId))
|
||
self:ShowEquipWearState(suitId)
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:ShowSuitEffectDetail()
|
||
if self._IsLock then
|
||
return
|
||
end
|
||
if XTool.IsTableEmpty(self._SuitConfig.TraitName) then
|
||
self.PanelAffix.gameObject:SetActiveEx(false)
|
||
return
|
||
end
|
||
if self._CurShowIndex == EffectType.Suit or not self.PanelAffix.gameObject.activeSelf then
|
||
self.PanelAffix.gameObject:SetActiveEx(not self.PanelAffix.gameObject.activeSelf)
|
||
end
|
||
self._CurShowIndex = EffectType.Suit
|
||
self:InstantiateEffectGrid(self._SuitConfig)
|
||
self:DoSelectCallBack()
|
||
self:UpdateBuffDetailPos()
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:ShowEquipEffectDetail()
|
||
if self._IsLock then
|
||
return
|
||
end
|
||
if XTool.IsTableEmpty(self._EquipConfig.TraitName) then
|
||
self.PanelAffix.gameObject:SetActiveEx(false)
|
||
return
|
||
end
|
||
if self._CurShowIndex == EffectType.Equip or not self.PanelAffix.gameObject.activeSelf then
|
||
self.PanelAffix.gameObject:SetActiveEx(not self.PanelAffix.gameObject.activeSelf)
|
||
end
|
||
self._CurShowIndex = EffectType.Equip
|
||
self:InstantiateEffectGrid(self._EquipConfig)
|
||
self:DoSelectCallBack()
|
||
self:UpdateBuffDetailPos()
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:CloseEffectDetail()
|
||
if self.PanelAffix.gameObject.activeSelf then
|
||
self.PanelAffix.gameObject:SetActiveEx(false)
|
||
end
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:OnClickTip()
|
||
-- 点击Tip背景时:关闭属性详情展示,选中该Tip(装备选择)
|
||
self:CloseEffectDetail()
|
||
self:DoSelectCallBack()
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:UpdateBuffDetailPos()
|
||
-- 左边超屏了就放到右边
|
||
if not self.PanelAffixPosX or not self.PanelAffixPosY then
|
||
local anchoredPosition = self.PanelAffix.anchoredPosition
|
||
self.PanelAffixPosX = anchoredPosition.x
|
||
self.PanelAffixPosY = anchoredPosition.y
|
||
end
|
||
|
||
local pos = self.Parent.Transform:InverseTransformPoint(self.PanelEquipment.position)
|
||
if self.Parent.Transform.rect.width / 2 + pos.x < self.PanelAffix.rect.width then
|
||
self.PanelAffix.anchorMin = Vector2(1, 1)
|
||
self.PanelAffix.anchorMax = Vector2(1, 1)
|
||
self.PanelAffix.pivot = Vector2(0, 1)
|
||
self.PanelAffix.anchoredPosition = Vector2(-self.PanelAffixPosX, self.PanelAffixPosY)
|
||
else
|
||
self.PanelAffix.anchorMin = Vector2(0, 1)
|
||
self.PanelAffix.anchorMax = Vector2(0, 1)
|
||
self.PanelAffix.pivot = Vector2(1, 1)
|
||
self.PanelAffix.anchoredPosition = Vector2(self.PanelAffixPosX, self.PanelAffixPosY)
|
||
end
|
||
end
|
||
|
||
---@param config XTableTheatre3Equip
|
||
function XUiTheatre3EquipmentTip:InstantiateEffectGrid(config)
|
||
for k, v in ipairs(config.TraitName) do
|
||
if not string.IsNilOrEmpty(v) then
|
||
if not self._Attrs[k] then
|
||
self._Attrs[k] = k == 1 and self.ImgBubbleBg or XUiHelper.Instantiate(self.ImgBubbleBg, self.PanelAffix)
|
||
end
|
||
self._Attrs[k].gameObject:SetActiveEx(true)
|
||
self._Attrs[k]:GetObject("TxtTitle").text = v
|
||
self._Attrs[k]:GetObject("TxtInformation").text = XUiHelper.ReplaceUnicodeSpace(XUiHelper.ConvertLineBreakSymbol(config.TraitDesc[k]))
|
||
end
|
||
end
|
||
for i = #config.TraitName + 1, #self._Attrs do
|
||
self._Attrs[i].gameObject:SetActiveEx(false)
|
||
end
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:ShowButton(btnTxt, callBack)
|
||
if not callBack then
|
||
self.BtnTongBlue.gameObject:SetActiveEx(false)
|
||
return
|
||
end
|
||
self.BtnTongBlue.gameObject:SetActiveEx(true)
|
||
self.BtnTongBlue.CallBack = callBack
|
||
self.BtnTongBlue:SetNameByGroup(0, btnTxt)
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:CheckTxtClick()
|
||
self.BtnSuit.gameObject:SetActiveEx(self._SuitConfig and not XTool.IsTableEmpty(self._SuitConfig.TraitName))
|
||
self.BtnEquip.gameObject:SetActiveEx(self._EquipConfig and not XTool.IsTableEmpty(self._EquipConfig.TraitName))
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:SetPosition(worldPos)
|
||
local tipWidth = self.Transform.sizeDelta.x
|
||
local tipHeight = self.Transform.sizeDelta.y
|
||
local pos = self.Transform.parent.worldToLocalMatrix:MultiplyPoint(worldPos)
|
||
pos.x = pos.x + tipWidth / 2
|
||
if pos.x + tipWidth / 2 > self.Parent.Transform.rect.width / 2 then
|
||
pos.x = self.Parent.Transform.rect.width / 2 - tipWidth / 2
|
||
end
|
||
if tipHeight - pos.y > self.Parent.Transform.rect.height / 2 then
|
||
pos.y = tipHeight - self.Parent.Transform.rect.height / 2
|
||
end
|
||
self.Transform.localPosition = pos
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:SetPositionByAlign(dimObj, alignment)
|
||
local posX = 0
|
||
local pos = self.Transform.parent:InverseTransformPoint(dimObj.position)
|
||
|
||
-- 超框
|
||
-- PS:Parent.Transform是UiTheatre3BubbleEquipment,而Transform.parent是SafeAreaContentPane,刚好能做异形屏适配
|
||
local centerW = self.Transform.parent.rect.width / 2
|
||
local centerH = self.Transform.parent.rect.height / 2
|
||
local tipW = self.Transform.rect.width
|
||
local tipH = self.Transform.rect.height
|
||
local minW = tipW - centerW
|
||
local maxW = centerW - tipW
|
||
local minH = tipH - centerH
|
||
local maxH = centerH
|
||
|
||
if alignment == XEnumConst.THEATRE3.TipAlign.Left then
|
||
self.Transform.pivot = Vector2(1, 1)
|
||
posX = pos.x - dimObj.rect.width * dimObj.localScale.x * dimObj.pivot.x
|
||
posX = math.max(posX, minW)
|
||
else
|
||
self.Transform.pivot = Vector2(0, 1)
|
||
posX = pos.x + dimObj.rect.width * dimObj.localScale.x * (1 - dimObj.pivot.x)
|
||
posX = math.min(posX, maxW)
|
||
end
|
||
local posY = pos.y + dimObj.rect.height * dimObj.localScale.y * (1 - dimObj.pivot.y)
|
||
posY = math.min(math.max(posY, minH), maxH)
|
||
|
||
self.Transform.localPosition = Vector3(posX, posY, 0)
|
||
end
|
||
|
||
function XUiTheatre3EquipmentTip:ShowEquipWearState(suitId)
|
||
local equips = self._Control:GetAllSuitEquip(suitId)
|
||
for i, v in ipairs(equips) do
|
||
local go = self._Pool[i]
|
||
if not go then
|
||
go = i == 1 and self.PanelNum or XUiHelper.Instantiate(self.PanelNum, self.PanelNow)
|
||
self._Pool[i] = go
|
||
end
|
||
go.gameObject:SetActiveEx(true)
|
||
local uiObject = {}
|
||
XTool.InitUiObjectByUi(uiObject, go)
|
||
uiObject.Mask.gameObject:SetActiveEx(not self._Control:IsWearEquip(v.Id))
|
||
uiObject.TxtIndex.text = XTool.ConvertRomanNumberString(i)
|
||
end
|
||
for i = #equips + 1, #self._Pool do
|
||
self._Pool[i].gameObject:SetActiveEx(false)
|
||
end
|
||
end
|
||
|
||
---显示【未获得】标签
|
||
function XUiTheatre3EquipmentTip:ShowDontGainTag(isShow)
|
||
if self.RImgType then
|
||
self.RImgType.gameObject:SetActiveEx(isShow)
|
||
end
|
||
end
|
||
|
||
---显示【当前装备】标签
|
||
function XUiTheatre3EquipmentTip:ShowCurEquipTag(isShow)
|
||
if self.RImgCurrent then
|
||
self.RImgCurrent.gameObject:SetActiveEx(isShow)
|
||
end
|
||
end
|
||
|
||
---显示【可激活】标签
|
||
function XUiTheatre3EquipmentTip:ShowCanActiveTag(canActive)
|
||
if self.PanelCanActive then
|
||
self.PanelCanActive.gameObject:SetActiveEx(canActive)
|
||
end
|
||
end
|
||
|
||
return XUiTheatre3EquipmentTip |