PGRData/Script/matrix/xui/xuicollectionwall/XUiCollectionWallEdit.lua

599 lines
20 KiB
Lua
Raw Normal View History

local XUiCollectionWallEdit = XLuaUiManager.Register(XLuaUi, "UiCollectionWallEdit")
local XUiGridSelectItem = require("XUi/XUiCollectionWall/XUiCollectionWallGrid/XUiGridSelectItem")
local XUiGridPlacedCollection = require("XUi/XUiCollectionWall/XUiCollectionWallGrid/XUiGridPlacedCollection")
function XUiCollectionWallEdit:OnStart(wallData)
self.IsEditMode = false
self.WallData = wallData
self.CurSelectCollection = nil -- 摆放模式中选择的收藏品
self.IsPanelSelectItemDraging = false -- 底部的Item选择界面是否在拖动中
self.RedHorPool = {} -- 水平红格子条
self.RedVerPool = {} -- 垂直红格子条
self.BlueHorPool = {} -- 水平蓝格子条
self.BlueVerPool = {} -- 垂直蓝格子条
self.GridOccupy = {} -- 记录被占用中的格子索引xy坐标如01,22x为十位数y为个位数,值占用这个格子的收藏品Id
self.CollectionDic = {} -- 墙面上的收藏品字典id做索引
self:InitComponent()
self:AddListener()
-- 默认中心位置
self.DefaultLocalPos = {}
self.DefaultLocalPos.x = self.PanelWall.rect.width / 2
self.DefaultLocalPos.y = self.PanelWall.rect.height / 2
self:Refresh()
end
function XUiCollectionWallEdit:OnEnable()
if self.IsEditMode then
-- 处于编辑模式,释放编辑模式开启动画
self:PlayAnimation("PanelCenterEnable")
end
end
function XUiCollectionWallEdit:OnDisable()
if self.CurSelectCollection then
-- 处于摆放模式,返回到编辑模式
self:OnBtnCancelClick()
end
end
---
--- 根据Manager中存放的WallData来生成墙面
function XUiCollectionWallEdit:Refresh()
self.PedestalId = self.WallData:GetPedestalId()
self.BackgroundId = self.WallData:GetBackgroundId()
self:RefreshBackground()
self:GenerateCollection(self.WallData:GetCollectionSetInfos())
self:RefreshEmpty()
self:UpdateGridOccupy()
if self.IsEditMode then
self:RefreshSelectItemList()
end
end
function XUiCollectionWallEdit:InitComponent()
self.RImgFrame.gameObject:SetActiveEx(false)
self.PanelTag.gameObject:SetActiveEx(false)
self.PanelConfirmMenu.gameObject:SetActiveEx(false)
self.PanelSelectItem.gameObject:SetActiveEx(false)
self.GridDecorationItem.gameObject:SetActiveEx(false)
self.ImgEmpty.gameObject:SetActiveEx(false)
self.BlueHorItem.gameObject:SetActiveEx(false)
self.BlueVerItem.gameObject:SetActiveEx(false)
self.RedHorItem.gameObject:SetActiveEx(false)
self.RedVerItem.gameObject:SetActiveEx(false)
self.BtnEdit.gameObject:SetActiveEx(true)
self:InitTagGroup()
self:InitDynamicTable()
end
function XUiCollectionWallEdit:InitTagGroup()
self.Tag = {
self.TagBackground,
self.TagPedestal,
self.TagLittle,
self.TagMiddle,
self.TagBig,
}
self.TagGroup:Init(self.Tag, function(tagIndex)
self:OnClickTagCallBack(tagIndex)
end)
end
function XUiCollectionWallEdit:OnPanelItemListDrag(eventData)
if self.PanelItemListScorllRect then
self.PanelItemListScorllRect:OnDrag(eventData);
end
end
function XUiCollectionWallEdit:OnPanelItemListBeginDrag(eventData)
if self.PanelItemListScorllRect then
self.PanelItemListScorllRect:OnBeginDrag(eventData);
end
end
function XUiCollectionWallEdit:OnPanelItemListEndDrag(eventData)
if self.PanelItemListScorllRect then
self.PanelItemListScorllRect:OnEndDrag(eventData);
end
end
---
--- 设置摆放模式时,操作菜单的位置
function XUiCollectionWallEdit:SetPanelConfirmMenuPos()
-- 如果操作菜单显示在界面上,则更新位置
if self.PanelConfirmMenu.gameObject.activeSelf or self.PanelConfirmMenu.gameObject.activeInHierarchy then
if not self.CurSelectCollection then
XLog.Error("XUiCollectionWallEdit:SetPanelConfirmMenuPos函数错误,CurSelectCollection为 nil")
else
self.PanelConfirmMenu.localPosition = self.CurSelectCollection:GetPos()
end
end
end
---
--- 'index'与XCollectionWallConfigs.EnumSelectType一致
function XUiCollectionWallEdit:OnClickTagCallBack(index)
self.SelectType = index
self:SetupDynamicTable(index)
self:PlayAnimation("ViewportQieHuan")
self.PanelSelectItem.gameObject:SetActiveEx(true)
end
function XUiCollectionWallEdit:RefreshSelectItemList()
if self.IsEditMode then
self:SetupDynamicTable(self.SelectType)
end
end
function XUiCollectionWallEdit:InitDynamicTable()
self.DynamicTable = XDynamicTableNormal.New(self.PanelItemList)
self.DynamicTable:SetProxy(XUiGridSelectItem, self)
self.DynamicTable:SetDelegate(self)
end
function XUiCollectionWallEdit:SetupDynamicTable(type)
local curWallData = self:GenerateCurWallData()
self.PageDatas = XDataCenter.CollectionWallManager.GetItemList(curWallData, type)
self.DynamicTable:SetDataSource(self.PageDatas)
self.DynamicTable:ReloadDataASync()
self.ImgEmpty.gameObject:SetActiveEx(#self.PageDatas <= 0)
end
function XUiCollectionWallEdit:OnDynamicTableEvent(event, index, grid)
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
grid:UpdateGrid(self.PageDatas[index], self.SelectType)
end
end
---
--- 根据'collectionId'收藏品Id在'localPos'上创建收藏品
--- 'localPos'为空,则使用中心位置
---@param collectionId number
---@param isNew boolean
---@param localPos table
---@param sizeId number
---@return table
function XUiCollectionWallEdit:CreatePlacedCollection(collectionId, isNew, localPos, sizeId)
if not collectionId then
XLog.Error("XUiCollectionWallEdit.CreatePlacedCollection函数错误参数collectionId为 nil")
return
end
local baseItemPath = XCollectionWallConfigs.GetColDecPath(self.PedestalId)
local baseItem = self.WallContent:LoadPrefab(baseItemPath)
if baseItem == nil or not baseItem:Exist() then
return
end
baseItem.gameObject:SetActiveEx(false)
local obj = CS.UnityEngine.Object.Instantiate(baseItem)
local scale = XCollectionWallConfigs.GetCollectionScale(sizeId)
obj.transform:SetParent(self.WallContent, false)
obj.transform.localScale = CS.UnityEngine.Vector3(scale, scale, scale)
obj.gameObject:SetActiveEx(true)
local data = {}
data.Id = collectionId
data.LocalPos = localPos or self.DefaultLocalPos
data.SizeId = sizeId
data.IsNew = isNew
local placedCollection = XUiGridPlacedCollection.New(obj, self, self.WallContent, data)
self.CollectionDic[collectionId] = placedCollection
return placedCollection
end
---
--- 收纳收藏品时,清理对应的脚本引用
function XUiCollectionWallEdit:StorageCollection(collectionId)
CS.UnityEngine.GameObject.Destroy(self.CollectionDic[collectionId].GameObject)
self.CollectionDic[collectionId] = nil
end
---
--- 根据CollectionDic中存放的收藏品脚本来生成当前收藏品墙的数据
function XUiCollectionWallEdit:GenerateCurWallData()
local data = {}
data.Id = self.WallData:GetId()
data.BackgroundId = self.BackgroundId
data.PedestalId = self.PedestalId
data.CollectionSetInfos = {}
for id, placedCollection in pairs(self.CollectionDic) do
local temp = {}
local gridPos = placedCollection:GetGridPos()
temp.Id = id
temp.X = gridPos.x
temp.Y = gridPos.y
temp.SizeId = placedCollection:GetSizeId()
table.insert(data.CollectionSetInfos, temp)
end
return data
end
---
--- 是否进入摆放模式
--- 进入摆放模式需要参数'placedCollection'XUiGridPlacedCollection
--- 如果'placedCollection'为空,则视为退出摆放模式
--- 'isFollowMouse':摆放的物体是否跟随鼠标
--- 'isNew':是新摆放的物体,还是点击旧的物体
---@param placedCollection table
function XUiCollectionWallEdit:EnterPutModel(placedCollection)
self.CurSelectCollection = placedCollection
local isEnter = placedCollection and true or false
if isEnter then
self:PlayAnimation("PanelCenterDisable",function()
self.PanelTag.gameObject:SetActiveEx(not isEnter)
self.PanelSelectItem.gameObject:SetActiveEx(not isEnter)
end)
else
self:PlayAnimation("PanelCenterEnable")
self.PanelTag.gameObject:SetActiveEx(not isEnter)
self.PanelSelectItem.gameObject:SetActiveEx(not isEnter)
end
self.PanelTop.gameObject:SetActiveEx(not isEnter)
self.PanelConfirmMenu.gameObject:SetActiveEx(isEnter)
self.RImgFrame.gameObject:SetActiveEx(isEnter)
if placedCollection then
local count = self.WallContent.childCount
placedCollection.Transform:SetSiblingIndex(count - 1)
self.IsPanelSelectItemDraging = false
placedCollection:SetSelect(true)
self:SetPanelConfirmMenuPos()
self:CheckConflict(placedCollection:GetId(), placedCollection:GetOccupyGridsList(), false)
self:SetAcross()
end
end
---
--- 设置摆放模式时的蓝色与红色格子条
function XUiCollectionWallEdit:SetAcross()
if self.CurSelectCollection then
local gridNum = XCollectionWallConfigs.GetCollectionGridNum(self.CurSelectCollection:GetSizeId())
self:RecoverAcross(gridNum)
if self.HasConflict then
self:GenerateAcross(self.RedHorPool, self.RedHorItem, gridNum)
self:GenerateAcross(self.RedVerPool, self.RedVerItem, gridNum)
else
self:GenerateAcross(self.BlueHorPool, self.BlueHorItem, gridNum)
self:GenerateAcross(self.BlueVerPool, self.BlueVerItem, gridNum)
end
self:UpdateAcrossPos(gridNum)
end
end
function XUiCollectionWallEdit:GenerateAcross(pool, baseItem, gridNum)
for i = 1, gridNum do
local grid = pool[i]
if not grid then
grid = CS.UnityEngine.Object.Instantiate(baseItem)
grid.transform:SetParent(self.PanelAcross, false)
table.insert(pool, grid)
end
grid.gameObject:SetActiveEx(true)
end
end
function XUiCollectionWallEdit:RecoverAcross(gridNum)
for i = 1, gridNum do
-- 蓝条
if self.RedHorPool[i] then
self.RedHorPool[i].gameObject:SetActiveEx(false)
end
if self.RedVerPool[i] then
self.RedVerPool[i].gameObject:SetActiveEx(false)
end
-- 红条
if self.BlueHorPool[i] then
self.BlueHorPool[i].gameObject:SetActiveEx(false)
end
if self.BlueVerPool[i] then
self.BlueVerPool[i].gameObject:SetActiveEx(false)
end
end
end
---
--- 设置格子条的位置
function XUiCollectionWallEdit:UpdateAcrossPos(gridNum)
if not self.CurSelectCollection then
return
end
local gridPos = self.CurSelectCollection:GetGridPos()
if self.HasConflict then
for i = 1, gridNum do
-- 水平
self.RedHorPool[i].transform.localPosition = CS.UnityEngine.Vector3(
self.RedHorPool[i].transform.localPosition.x,
(gridPos.y + i - 1) * XCollectionWallConfigs.CellSize,
0)
-- 垂直
self.RedVerPool[i].transform.localPosition = CS.UnityEngine.Vector3(
(gridPos.x + i - 1) * XCollectionWallConfigs.CellSize,
self.RedVerPool[i].transform.localPosition.y,
0)
end
else
for i = 1, gridNum do
-- 水平
self.BlueHorPool[i].transform.localPosition = CS.UnityEngine.Vector3(
self.BlueHorPool[i].transform.localPosition.x,
(gridPos.y + i - 1) * XCollectionWallConfigs.CellSize,
0)
-- 垂直
self.BlueVerPool[i].transform.localPosition = CS.UnityEngine.Vector3(
(gridPos.x + i - 1) * XCollectionWallConfigs.CellSize,
self.BlueVerPool[i].transform.localPosition.y,
0)
end
end
end
---
--- 更新格子占用情况
function XUiCollectionWallEdit:UpdateGridOccupy()
self.GridOccupy = {}
for _, placedCollection in pairs(self.CollectionDic) do
local occupyGridList = placedCollection:GetOccupyGridsList()
for _,gridPos in pairs(occupyGridList) do
local gridId = gridPos.x * 10 + gridPos.y
self.GridOccupy[gridId] = placedCollection:GetId()
end
end
end
---
--- 检查冲突,设置标志位
--- 'isSetAcross'是否需要设置格子条
--- @param collectionId number
--- @param occupyGridList table
--- @param isSetAcross boolean
function XUiCollectionWallEdit:CheckConflict(collectionId, occupyGridList, isSetAcross)
if self.CurSelectCollection then
for _, gridPos in pairs(occupyGridList) do
local gridId = gridPos.x * 10 + gridPos.y
if self.GridOccupy[gridId] and self.GridOccupy[gridId] ~= collectionId then
local oriConflict = self.HasConflict
self.HasConflict = true
if oriConflict == false and isSetAcross then
self:SetAcross()
end
return
else
local oriConflict = self.HasConflict
self.HasConflict = false
if oriConflict == true and isSetAcross then
self:SetAcross()
end
end
end
end
end
---
--- 设置冲突标志
function XUiCollectionWallEdit:SetConflict(isConflict)
self.HasConflict = isConflict
end
---
--- 是否冲突
function XUiCollectionWallEdit:IsConflict()
return self.HasConflict
end
---
--- 更改墙面
---@param data table
function XUiCollectionWallEdit:ChangeBackgroundId(backgroundId)
if self.BackgroundId == backgroundId then
return
end
self.BackgroundId = backgroundId
self:RefreshBackground()
self.DynamicTable:ReloadDataASync()
end
function XUiCollectionWallEdit:RefreshBackground()
self:PlayAnimation("RImgWallBgQieHuan")
local bgPath = XCollectionWallConfigs.GetColDecPath(self.BackgroundId)
self.RImgWallBg:SetRawImage(bgPath)
end
---
--- 更改底座
---@param pedestalId table
function XUiCollectionWallEdit:ChangePedestalId(pedestalId)
if self.PedestalId == pedestalId then
return
end
self.PedestalId = pedestalId
local data = self:GenerateCurWallData()
self:ClearAllCollection()
self:GenerateCollection(data.CollectionSetInfos)
self.DynamicTable:ReloadDataASync()
end
function XUiCollectionWallEdit:GenerateCollection(collectionSetInfos)
for _, info in pairs(collectionSetInfos) do
local gridPos = {}
gridPos.x = info.X
gridPos.y = info.Y
local size = XCollectionWallConfigs.GetCollectionSize(info.SizeId)
local localPos = XDataCenter.CollectionWallManager.GetLocalPosByGridPos(gridPos, size)
self:CreatePlacedCollection(info.Id, false, localPos, info.SizeId)
end
end
function XUiCollectionWallEdit:RefreshEmpty()
local count = 0
for k , v in pairs(self.CollectionDic) do
count = count + 1
end
self.CollectionEmpty.gameObject:SetActiveEx(count == 0)
end
function XUiCollectionWallEdit:ClearAllCollection()
for _, placedCollection in pairs(self.CollectionDic) do
CS.UnityEngine.GameObject.Destroy(placedCollection.GameObject)
end
self.CollectionDic = {}
end
function XUiCollectionWallEdit:QuitEditMode()
self:PlayAnimation("PanelCenterDisable", function()
self.RImgFrame.gameObject:SetActiveEx(false)
self.PanelTag.gameObject:SetActiveEx(false)
self.PanelConfirmMenu.gameObject:SetActiveEx(false)
self.BtnEdit.gameObject:SetActiveEx(true)
self.PanelSelectItem.gameObject:SetActiveEx(false)
end)
self.IsEditMode = false
self.CurSelectCollection = nil
end
function XUiCollectionWallEdit:AddListener()
self.BtnBack.CallBack = function()
self:OnBtnBackClick()
end
self:BindHelpBtn(self.BtnExplain, "CollectionWall")
self.BtnEdit.CallBack = function()
self:OnBtnEditClick()
end
self.BtnUndo.CallBack = function()
self:OnBtnUndoClick()
end
self.BtnSave.CallBack = function()
self:OnBtnSaveClick()
end
self.BtnOk.CallBack = function()
self:OnBtnOkClick()
end
self.BtnCancel.CallBack = function()
self:OnBtnCancelClick()
end
self.BtnStorage.CallBack = function()
self:OnBtnStorageClick()
end
end
function XUiCollectionWallEdit:OnBtnUndoClick()
XUiManager.DialogTip(CS.XTextManager.GetText("TipTitle"), CS.XTextManager.GetText("CollectionWallUndo"),
XUiManager.DialogType.Normal, nil, function()
self:ClearAllCollection()
self:Refresh()
end)
end
function XUiCollectionWallEdit:OnBtnSaveClick()
-- 构造发送请求需要的数据
local wallId = self.WallData:GetId()
local setInfo = self:GenerateCurWallData()
local pedestalId = setInfo.PedestalId
local backgroundId = setInfo.BackgroundId
XDataCenter.CollectionWallManager.RequestEditCollectionWall(wallId, pedestalId, backgroundId, setInfo.CollectionSetInfos, function()
-- 截图保存
self.PanelTop.gameObject:SetActiveEx(false)
self.ImgWire.gameObject:SetActiveEx(false)
self.BtnEdit.gameObject:SetActiveEx(false)
self.PanelSelectItem.gameObject:SetActiveEx(false)
self.PanelTag.gameObject:SetActiveEx(false)
local imgName = XDataCenter.CollectionWallManager.GetCaptureImgName(wallId)
XDataCenter.CollectionWallManager.CaptureCamera(imgName, function()
-- 截图完成后重新设置Ui
self.PanelTop.gameObject:SetActiveEx(true)
self.ImgWire.gameObject:SetActiveEx(true)
self.BtnEdit.gameObject:SetActiveEx(not self.IsEditMode)
self.PanelSelectItem.gameObject:SetActiveEx(self.IsEditMode)
self.PanelTag.gameObject:SetActiveEx(self.IsEditMode)
XUiManager.TipSuccess(CS.XTextManager.GetText("SetAppearanceSuccess"))
end)
end)
end
function XUiCollectionWallEdit:OnBtnOkClick()
if self.HasConflict then
XUiManager.TipError(CS.XTextManager.GetText("CollectionWallPlaceNotCorrect"))
return
else
local gridNum = XCollectionWallConfigs.GetCollectionGridNum(self.CurSelectCollection:GetSizeId())
self:RecoverAcross(gridNum)
self.CurSelectCollection:Confirm()
self:EnterPutModel(nil)
self:RefreshEmpty()
end
end
function XUiCollectionWallEdit:OnBtnCancelClick()
local gridNum = XCollectionWallConfigs.GetCollectionGridNum(self.CurSelectCollection:GetSizeId())
self:RecoverAcross(gridNum)
self.CurSelectCollection:Cancel()
self:EnterPutModel(nil)
end
function XUiCollectionWallEdit:OnBtnStorageClick()
local gridNum = XCollectionWallConfigs.GetCollectionGridNum(self.CurSelectCollection:GetSizeId())
self:RecoverAcross(gridNum)
self.CurSelectCollection:Storage()
self:EnterPutModel(nil)
self:RefreshEmpty()
end
function XUiCollectionWallEdit:OnBtnEditClick()
self.BtnEdit.gameObject:SetActiveEx(false)
self.PanelTag.gameObject:SetActiveEx(true)
self.DynamicTable:Clear()
self.TagGroup:SelectIndex(1)
self:PlayAnimation("PanelCenterEnable")
self.IsEditMode = true
end
function XUiCollectionWallEdit:OnBtnBackClick()
if self.IsEditMode then
local curWallData = self:GenerateCurWallData()
if XDataCenter.CollectionWallManager.IsNeedSave(self.WallData:GetId(), curWallData) then
XUiManager.DialogTip(CS.XTextManager.GetText("FurnitureTips"), CS.XTextManager.GetText("FurnitureIsSave"),
XUiManager.DialogType.Normal, function()
self:ClearAllCollection()
self:Refresh()
self:QuitEditMode()
end, function()
self:QuitEditMode()
self:OnBtnSaveClick()
end)
else
self:QuitEditMode()
end
else
self:Close()
end
end