742 lines
28 KiB
Lua
742 lines
28 KiB
Lua
|
local XUiChristmasTree = XLuaUiManager.Register(XLuaUi, "UiChristmasTreeMain")
|
||
|
|
||
|
local AttrCount = 0
|
||
|
local LocalStateCount = 0
|
||
|
-- 全局的index设定为局部状态总数+1
|
||
|
local OverallIndex = LocalStateCount + 1
|
||
|
-- 触发拖拽前的延时
|
||
|
local LongClickOffset = 200
|
||
|
-- 计算最近挂点的范围
|
||
|
local MaxDistance = 0.3
|
||
|
local CSXTextManagerGetText = CS.XTextManager.GetText
|
||
|
|
||
|
function XUiChristmasTree:OnAwake()
|
||
|
self:AddListener()
|
||
|
self.DynamicTable = XDynamicTableNormal.New(self.PanelGiftList.gameObject)
|
||
|
self.DynamicTable:SetProxy(XUiOrnamentGrid)
|
||
|
self.DynamicTable:SetDelegate(self)
|
||
|
self.Camera = CS.XUiManager.Instance.UiCamera
|
||
|
self.RectTransform = self.Transform:GetComponent("RectTransform")
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnEnable()
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnStart(actId)
|
||
|
self.ActTemplate = XDataCenter.ChristmasTreeManager.Reset(actId)
|
||
|
self.ActId = actId
|
||
|
|
||
|
self.GridTreasureList = {} -- 任务格子
|
||
|
self.BtnFilterList = {} -- 筛选排序页签
|
||
|
self.AttrViewList = {} -- 首页评分
|
||
|
self.BtnChangeList = {} -- 编辑模式普通状态切换按钮
|
||
|
self.AttrViewEditList = {} -- 编辑模式评分
|
||
|
self.BtnChangeEditList = {} -- 编辑模式预览状态切换按钮
|
||
|
self.TreePartList = {} -- 预制体上的各个挂点
|
||
|
self.PlacePoint = {} -- XUiPlacedOrnamentGrid
|
||
|
self.CurrentGroup = 0 -- 当前的状态index
|
||
|
self.LongClick = {}
|
||
|
|
||
|
self.AutoLayout = self.Transform:Find("SafeAreaContentPane/PanelView/PanelScore/panelScoreDetail")
|
||
|
|
||
|
OverallIndex, LocalStateCount = XChristmasTreeConfig.GetTreePartCount()
|
||
|
OverallIndex = LocalStateCount + 1
|
||
|
AttrCount = #self.ActTemplate.AttrName
|
||
|
MaxDistance = self.ActTemplate.MaxDistance or MaxDistance
|
||
|
LongClickOffset = self.ActTemplate.LongClickOffset or LongClickOffset
|
||
|
self:InitUiView()
|
||
|
self.PanelDress.gameObject:SetActiveEx(false)
|
||
|
self.PanelView.gameObject:SetActiveEx(true)
|
||
|
self.InDressMode = false
|
||
|
self:SwitchView(OverallIndex)
|
||
|
self:UpdateTaskProgress()
|
||
|
self:UpdateOrnamentRedPoint()
|
||
|
self:CheckFirstOpen()
|
||
|
CS.UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(self.AutoLayout)
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnDestroy()
|
||
|
self.IsOpenDetails = nil
|
||
|
self:StopActivityTimer()
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:CheckFirstOpen()
|
||
|
local firstOpen, openIndex, storyId = XDataCenter.ChristmasTreeManager.CheckFirstOpen()
|
||
|
if firstOpen then
|
||
|
XDataCenter.MovieManager.PlayMovie(storyId, function()
|
||
|
XDataCenter.ChristmasTreeManager.SetOpen(openIndex)
|
||
|
-- XSoundManager.PauseMusic()
|
||
|
end)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:InitUiView()
|
||
|
local now = XTime.GetServerNowTimestamp()
|
||
|
local _, endTimeSecond = XFunctionManager.GetTimeByTimeId(self.ActTemplate.TimeId)
|
||
|
if endTimeSecond then
|
||
|
self.TxtDay.text = XUiHelper.GetTime(endTimeSecond - now, XUiHelper.TimeFormatType.ACTIVITY)
|
||
|
self:CreateActivityTimer(now, endTimeSecond)
|
||
|
end
|
||
|
self.TxtTitle.text = self.ActTemplate.Name
|
||
|
|
||
|
for i, name in ipairs(self.ActTemplate.AttrName) do
|
||
|
local scoreDetail = self.PanelScore:Find("panelScoreDetail/Score".. i)
|
||
|
self.AttrViewList[i] = scoreDetail
|
||
|
scoreDetail:Find("TxtTitle"):GetComponent("Text").text = name
|
||
|
|
||
|
scoreDetail = self.PanelScoreEdit:Find("panelScoreDetail/Score".. i)
|
||
|
self.AttrViewEditList[i] = scoreDetail
|
||
|
scoreDetail:Find("TxtTitle"):GetComponent("Text").text = name
|
||
|
|
||
|
local btnFilter = self.PanelFilter.transform:Find("BtnAttr".. i):GetComponent("XUiButton")
|
||
|
self.BtnFilterList[i] = btnFilter
|
||
|
btnFilter:SetNameByGroup(0, name)
|
||
|
end
|
||
|
self.AttrViewList[#self.AttrViewList + 1] = self.PanelScore:Find("ScoreTotal")
|
||
|
self.AttrViewEditList[#self.AttrViewEditList + 1] = self.PanelScoreEdit:Find("ScoreTotal")
|
||
|
self.BtnFilterList[#self.BtnFilterList + 1] = self.PanelFilter.transform:Find("BtnDefault"):GetComponent("XUiButton")
|
||
|
for i = 1, LocalStateCount do
|
||
|
local btnChange = self.PanelChangeOver.transform:Find("BtnChange".. i):GetComponent("XUiButton")
|
||
|
self.BtnChangeList[i] = btnChange
|
||
|
btnChange = self.PanelChangeOverEdit.transform:Find("BtnChange".. i):GetComponent("XUiButton")
|
||
|
self.BtnChangeEditList[i] = btnChange
|
||
|
end
|
||
|
|
||
|
self.PanelChangeOver:Init(self.BtnChangeList, function(index)
|
||
|
self:SwitchView(index)
|
||
|
self.PanelChangeOverEdit:SelectIndex(index, false)
|
||
|
end, -1)
|
||
|
self.PanelChangeOverEdit:Init(self.BtnChangeEditList, function(index) self:SwitchView(index) end, -1)
|
||
|
-- 默认页签的index设为属性总数+1
|
||
|
self.PanelFilter:Init(self.BtnFilterList, function(index) self:OnBtnFilter(index) end, AttrCount + 1 )
|
||
|
self.PanelTreasure.gameObject:SetActiveEx(false)
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:AddListener()
|
||
|
self.BtnBack.CallBack = function() self:OnBtnBackClick() end
|
||
|
self.BtnMainUi.CallBack = function() self:OnBtnMainUiClick() end
|
||
|
self.BtnHelp.CallBack = function() self:OnBtnHelpClick() end
|
||
|
self.BtnDress.CallBack = function() self:OnBtnDressClick() end
|
||
|
self.BtnSave.CallBack = function() self:OnBtnSaveClick() end
|
||
|
self.BtnPreview.CallBack = function() self:SwitchView() end
|
||
|
self.BtnActiveOrnament.CallBack = function() self:OnBtnActiveOrnament() end
|
||
|
self.BtnClear.CallBack = function() self:OnBtnClear() end
|
||
|
self.BtnSubItem.CallBack = function() self:OnBtnSubItem() end
|
||
|
|
||
|
self:RegisterClickEvent(self.BtnTreasureBg, self.OnBtnTreasureBgClick)
|
||
|
self:RegisterClickEvent(self.BtnTreasure, self.OnBtnTreasureClick)
|
||
|
|
||
|
self.RedPointActive = XRedPointManager.AddRedPointEvent(self.BtnActiveOrnament, self.OnCheckActive, self, { XRedPointConditions.Types.CONDITION_CHRISTMAS_TREE_ORNAMENT_ACTIVE }, nil, true)
|
||
|
self.RedPointReward = XRedPointManager.AddRedPointEvent(self.ImgRedProgress, self.OnCheckRewards, self, { XRedPointConditions.Types.CONDITION_CHRISTMAS_TREE_AWARD }, nil, true)
|
||
|
self.RedPointUnread = XRedPointManager.AddRedPointEvent(self.BtnDress, self.OnCheckUnread, self, { XRedPointConditions.Types.CONDITION_CHRISTMAS_TREE_ORNAMENT_READ }, nil, true)
|
||
|
end
|
||
|
|
||
|
-- 是否显示红点
|
||
|
function XUiChristmasTree:OnCheckActive(count)
|
||
|
self.BtnActiveOrnament:ShowReddot(count >= 0)
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnCheckRewards(count)
|
||
|
self.ImgRedProgress.gameObject:SetActiveEx(count >= 0)
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnCheckUnread(count)
|
||
|
self.BtnDress:ShowReddot(count >= 0)
|
||
|
self:UpdateOrnamentRedPoint()
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:UpdateOrnamentRedPoint()
|
||
|
if not self.DynamicTable then return end
|
||
|
self.DynamicTable:ReloadDataASync()
|
||
|
for i = 1, LocalStateCount do
|
||
|
local isUnread = XDataCenter.ChristmasTreeManager.CheckOrnamentGrpUnread(i)
|
||
|
self.BtnChangeList[i]:ShowReddot(isUnread)
|
||
|
self.BtnChangeEditList[i]:ShowReddot(isUnread)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnBtnBackClick()
|
||
|
if self.InDressMode then
|
||
|
self:OnBtnQuitDressClick()
|
||
|
else
|
||
|
self:Close()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnBtnMainUiClick()
|
||
|
if XDataCenter.ChristmasTreeManager.CheckChange() then
|
||
|
local title = CSXTextManagerGetText("TipTitle")
|
||
|
local content = CSXTextManagerGetText("ChristmasTreeRestoreHint")
|
||
|
XUiManager.DialogTip(title, content, XUiManager.DialogType.Normal,nil, XLuaUiManager.RunMain)
|
||
|
return
|
||
|
end
|
||
|
XLuaUiManager.RunMain()
|
||
|
end
|
||
|
|
||
|
-- 搬运function XUiManager.ShowHelpTip(helpDataKey, cb)接口
|
||
|
function XUiChristmasTree:OnBtnHelpClick()
|
||
|
local config = XHelpCourseConfig.GetHelpCourseTemplateByFunction("ChristmasTree")
|
||
|
if not config then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if config.IsShowCourse == 1 then
|
||
|
XLuaUiManager.Open("UiHelp", config, nil)
|
||
|
else
|
||
|
XUiManager.UiFubenDialogTip(config.Name, config.Describe)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnBtnTreasureClick()
|
||
|
self:InitTreasureGrade()
|
||
|
self.PanelTreasure.gameObject:SetActiveEx(true)
|
||
|
self:PlayAnimation("TreasureEnable")
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnBtnTreasureBgClick()
|
||
|
self:PlayAnimation("TreasureDisable", function()
|
||
|
self.PanelTreasure.gameObject:SetActiveEx(false)
|
||
|
self:UpdateTaskProgress()
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnBtnQuitDressClick()
|
||
|
if XDataCenter.ChristmasTreeManager.CheckChange() then
|
||
|
local title = CSXTextManagerGetText("TipTitle")
|
||
|
local content = CSXTextManagerGetText("ChristmasTreeRestoreHint")
|
||
|
XUiManager.DialogTip(title, content, XUiManager.DialogType.Normal,nil, function() self:QuitDressMode() end)
|
||
|
else
|
||
|
self:QuitDressMode()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:QuitDressMode()
|
||
|
XDataCenter.ChristmasTreeManager.ResetChange()
|
||
|
self.PanelView.gameObject:SetActiveEx(true)
|
||
|
self:PlayAnimation("QieHuan2", function ()
|
||
|
self.PanelDress.gameObject:SetActiveEx(false)
|
||
|
end)
|
||
|
self.InDressMode = false
|
||
|
self:SwitchView(OverallIndex)
|
||
|
self:UpdateTaskProgress()
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnBtnDressClick()
|
||
|
self.PanelDress.gameObject:SetActiveEx(true)
|
||
|
self:PlayAnimation("QieHuan1", function ()
|
||
|
self.PanelView.gameObject:SetActiveEx(false)
|
||
|
end)
|
||
|
self.InDressMode = true
|
||
|
self.PanelChangeOverEdit:SelectIndex(1)
|
||
|
self.PanelFilter:SelectIndex(AttrCount + 1)
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnBtnSaveClick()
|
||
|
XDataCenter.ChristmasTreeManager.SubmitChange(function()
|
||
|
XUiManager.TipText("ChristmasTreeSaveAppearanceSuccess")
|
||
|
self:OnBtnQuitDressClick()
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:UnselectAllItem(exceptIndex)
|
||
|
for index in pairs(self.TreePartList) do
|
||
|
local item = self.PlacePoint[index]
|
||
|
if exceptIndex then
|
||
|
item:SetSelect(item.Index == exceptIndex and self.CurrentGroup ~= OverallIndex)
|
||
|
else
|
||
|
item:SetSelect(false)
|
||
|
item:SetLight(self.CurrentGroup ~= OverallIndex)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if exceptIndex then
|
||
|
self.CurSelectGridIndex = exceptIndex
|
||
|
else
|
||
|
self.BtnRemove.gameObject:SetActiveEx(false)
|
||
|
end
|
||
|
|
||
|
if self.CloseBg then
|
||
|
self.CloseBg.raycastTarget = false
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnBtnRemove()
|
||
|
XDataCenter.ChristmasTreeManager.RemoveOrnament(self.CurSelectGridIndex)
|
||
|
self:RefreshView()
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnBtnFilter(index)
|
||
|
self.CurrentFilterIndex = index or self.LastFilterIndex
|
||
|
self.SRComponent.enabled = true
|
||
|
if self.InDressMode and self.CurrentGroup == OverallIndex then
|
||
|
self.GiftList = XDataCenter.ChristmasTreeManager.GetAvailableOrnaments(self.LastGroup, self.CurrentFilterIndex) or {}
|
||
|
else
|
||
|
self.GiftList = XDataCenter.ChristmasTreeManager.GetAvailableOrnaments(self.CurrentGroup, self.CurrentFilterIndex)
|
||
|
end
|
||
|
|
||
|
if self.LastGroup ~= self.CurrentGroup then
|
||
|
self:PlayAnimation("PanelGiftListEnable")
|
||
|
elseif self.LastFilterIndex ~= self.CurrentFilterIndex then
|
||
|
self:PlayAnimation("PanelGiftListEnable")
|
||
|
end
|
||
|
|
||
|
self.DynamicTable:SetDataSource(self.GiftList)
|
||
|
self.DynamicTable:ReloadDataSync()
|
||
|
|
||
|
self.SRComponent.enabled = false
|
||
|
self.LastFilterIndex = self.CurrentFilterIndex
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnBtnClear()
|
||
|
if XDataCenter.ChristmasTreeManager.CheckPartGrpEmpty(self.CurrentGroup) then return end
|
||
|
local title = CSXTextManagerGetText("TipTitle")
|
||
|
local content = CSXTextManagerGetText("ChristmasTreeRemoveOrnamentHint")
|
||
|
XUiManager.DialogTip(title, content, XUiManager.DialogType.Normal,nil, function ()
|
||
|
XDataCenter.ChristmasTreeManager.RemoveOrnamentGrp(self.CurrentGroup)
|
||
|
self:RefreshView()
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnBtnActiveOrnament()
|
||
|
local result, minItemId, minItemCount = XDataCenter.ChristmasTreeManager.CheckCanGetOrnament()
|
||
|
if not result then
|
||
|
if minItemCount > 0 then
|
||
|
XUiManager.TipMsg(CSXTextManagerGetText("ChristmasTreeSubItemInsufficientQuantity", XDataCenter.ItemManager.GetItemName(minItemId)))
|
||
|
else
|
||
|
XUiManager.TipMsg(CSXTextManagerGetText("ChristmasTreeOrnamentFull"))
|
||
|
end
|
||
|
else
|
||
|
XDataCenter.ChristmasTreeManager.ActiveOrnament(0, function ()
|
||
|
self:RefreshView()
|
||
|
if self.InDressMode then
|
||
|
self:OnBtnFilter()
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnBtnSubItem()
|
||
|
local _, id = XDataCenter.ChristmasTreeManager.CheckCanGetOrnament()
|
||
|
XLuaUiManager.Open("UiTip", id)
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnCancelRemoveBtn()
|
||
|
self:UnselectAllItem()
|
||
|
self.CurSelectGridIndex = nil
|
||
|
end
|
||
|
|
||
|
-- 更新左下角的奖励按钮的状态
|
||
|
function XUiChristmasTree:UpdateTaskProgress()
|
||
|
-- self.TxtDesc.gameObject:SetActiveEx(false)
|
||
|
self.ImgStarIcon.gameObject:SetActiveEx(false)
|
||
|
local curStars, totalStars = XDataCenter.ChristmasTreeManager.GetTaskProgress()
|
||
|
local received = XDataCenter.ChristmasTreeManager.CheckTaskAllFinish()
|
||
|
|
||
|
XRedPointManager.Check(self.RedPointReward)
|
||
|
|
||
|
self.ImgJindu.fillAmount = totalStars > 0 and curStars / totalStars or 0
|
||
|
self.ImgJindu.gameObject:SetActiveEx(true)
|
||
|
self.TxtStarNum.text = CSXTextManagerGetText("Fract", curStars, totalStars)
|
||
|
self.ImgLingqu.gameObject:SetActiveEx(received)
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:InitTreasureGrade()
|
||
|
self.GridTreasureGrade.gameObject:SetActiveEx(false)
|
||
|
-- 先把所有的格子隐藏
|
||
|
for j = 1, #self.GridTreasureList do
|
||
|
self.GridTreasureList[j].GameObject:SetActiveEx(false)
|
||
|
end
|
||
|
|
||
|
local targetList = self.ActTemplate.TaskId
|
||
|
if not targetList then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local offsetValue = 260
|
||
|
local gridCount = #targetList
|
||
|
|
||
|
for i = 1, gridCount do
|
||
|
local offerY = (1 - i) * offsetValue
|
||
|
local grid = self.GridTreasureList[i]
|
||
|
|
||
|
if not grid then
|
||
|
local item = CS.UnityEngine.Object.Instantiate(self.GridTreasureGrade) -- 复制一个item
|
||
|
grid = XUiGridTreasureTask.New(self, item)
|
||
|
grid.Transform:SetParent(self.PanelGradeContent, false)
|
||
|
grid.Transform.localPosition = CS.UnityEngine.Vector3(item.transform.localPosition.x, item.transform.localPosition.y + offerY, item.transform.localPosition.z)
|
||
|
self.GridTreasureList[i] = grid
|
||
|
end
|
||
|
|
||
|
grid:UpdateGradeGridTask(targetList[i])
|
||
|
|
||
|
grid:InitTreasureList()
|
||
|
grid.GameObject:SetActiveEx(true)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:SwitchView(nextView)
|
||
|
--XLog.Warning("last", self.LastGroup, self.CurrentGroup )
|
||
|
local lastGroup = self.CurrentGroup or 0
|
||
|
if nextView then
|
||
|
self.CurrentGroup = nextView
|
||
|
elseif self.CurrentGroup == OverallIndex then
|
||
|
self.PanelChangeOver:SelectIndex(self.LastGroup, false)
|
||
|
self.CurrentGroup = self.LastGroup
|
||
|
else
|
||
|
self.CurrentGroup = OverallIndex
|
||
|
end
|
||
|
self:RefreshView(lastGroup)
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:RefreshView(lastGroup)
|
||
|
local AttrValue = XDataCenter.ChristmasTreeManager.GetAttrValue()
|
||
|
local AttrDelta = XDataCenter.ChristmasTreeManager.GetAttrDeltaValue()
|
||
|
for i, attrScore in ipairs(self.InDressMode and self.AttrViewEditList or self.AttrViewList) do
|
||
|
local txtScore = attrScore:Find("TxtScore"):GetComponent("Text")
|
||
|
txtScore.text = AttrValue[i]
|
||
|
-- 仅显示子属性差值
|
||
|
if i < #self.AttrViewList then
|
||
|
local txtDelta = attrScore:Find("TxtScorePlus"):GetComponent("Text")
|
||
|
local value = AttrDelta[i]
|
||
|
if value > 0 then
|
||
|
txtDelta.text = CSXTextManagerGetText("ChristmasTreeAttrDeltaPlus", value)
|
||
|
elseif value < 0 then
|
||
|
txtDelta.text = CSXTextManagerGetText("ChristmasTreeAttrDeltaMinus", value)
|
||
|
else
|
||
|
txtDelta.text = ""
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if self.InDressMode then
|
||
|
local own, count = XDataCenter.ChristmasTreeManager.GetOrnamentCount()
|
||
|
self.TxtGiftCount.text = string.format("%d/%d", own, count)
|
||
|
if self.CurrentGroup ~= OverallIndex then
|
||
|
local isEmpty = XDataCenter.ChristmasTreeManager.CheckPartGrpEmpty(self.CurrentGroup)
|
||
|
self.BtnClear:SetButtonState(not isEmpty and XUiButtonState.Normal or XUiButtonState.Disable)
|
||
|
end
|
||
|
else
|
||
|
local canGet, minItemId, minItemCount = XDataCenter.ChristmasTreeManager.CheckCanGetOrnament()
|
||
|
local own = XDataCenter.ItemManager.GetCount(minItemId)
|
||
|
|
||
|
self.TxtConsume.text = string.format("%d/%d", own, minItemCount)
|
||
|
self.RImgSubItem:SetRawImage(XDataCenter.ItemManager.GetItemIcon(minItemId))
|
||
|
self.BtnActiveOrnament:SetButtonState(canGet and XUiButtonState.Normal or XUiButtonState.Disable)
|
||
|
end
|
||
|
|
||
|
self.LastGroup = lastGroup or self.CurrentGroup
|
||
|
if self.LastGroup ~= self.CurrentGroup then
|
||
|
local isLoad = self.Tree.gameObject:GetComponent(typeof(CS.XUiLoadPrefab))
|
||
|
if isLoad then
|
||
|
self:PlayAnimation("TreeDisable",function ()
|
||
|
self:RefreshTree(self.CurrentGroup)
|
||
|
self:PlayAnimation("TreeEnable")
|
||
|
end)
|
||
|
return
|
||
|
end
|
||
|
end
|
||
|
|
||
|
self:RefreshTree(self.CurrentGroup)
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:ResetLongClicker()
|
||
|
--for i,v in pairs(self.LongClick) do
|
||
|
-- if self.PlacePoint[i].IsPointChange then
|
||
|
-- v:Destroy()
|
||
|
-- self.LongClick[i] = nil
|
||
|
-- end
|
||
|
--end
|
||
|
|
||
|
for i in pairs(self.TreePartList) do
|
||
|
if self.PlacePoint[i].IsPointChange then
|
||
|
self.LongClick[i] = XUiButtonLongClick.New(self.TreePartList[i]:GetComponent("XUiPointer") , 15, self, nil, self.OnDrag, function()self:OnEndDrag(true) end, false, self.PlacePoint[i])
|
||
|
self.LongClick[i]:SetTriggerOffset(LongClickOffset)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:RefreshTree(index)
|
||
|
local path
|
||
|
if index == OverallIndex then
|
||
|
path = self.ActTemplate.OverallPrefab
|
||
|
else
|
||
|
path = self.ActTemplate.PartPrefab[index]
|
||
|
end
|
||
|
self.TreeGroup = self.Tree.gameObject:LoadPrefab(path).transform
|
||
|
self:SwitchBtnChange()
|
||
|
-- 加载挂点
|
||
|
self.IsPartGroupFull = true
|
||
|
self.PosInfo = XDataCenter.ChristmasTreeManager.GetCurrentOrnamentPos()
|
||
|
self.TreePartList = {}
|
||
|
for i = 1, XChristmasTreeConfig.GetTreePartCount() do
|
||
|
local part = self.TreeGroup:Find("Point"..i)
|
||
|
if part then
|
||
|
local itemInfo
|
||
|
if self.PosInfo[i] and self.PosInfo[i] ~= 0 then
|
||
|
itemInfo = XChristmasTreeConfig.GetOrnamentById(self.PosInfo[i])
|
||
|
else
|
||
|
self.IsPartGroupFull = false
|
||
|
end
|
||
|
if not self.PlacePoint[i] then
|
||
|
self.PlacePoint[i] = XUiPlacedOrnamentGrid.New(self)
|
||
|
end
|
||
|
self.PlacePoint[i]:Refresh(part, itemInfo, i)
|
||
|
self.TreePartList[i] = self.PlacePoint[i].RImgIcon.transform
|
||
|
end
|
||
|
end
|
||
|
|
||
|
self:UnselectAllItem()
|
||
|
self:SetAllItemLight(true)
|
||
|
if self.InDressMode then
|
||
|
self:OnBtnFilter()
|
||
|
end
|
||
|
self:ResetLongClicker()
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:SelectItem(index)
|
||
|
if not index or self.CurrentGroup == OverallIndex then return end
|
||
|
if self.DragItem then
|
||
|
return
|
||
|
end
|
||
|
self.CloseBg = self.TreeGroup:Find("RawImage"):GetComponent("RawImage")
|
||
|
local item = self.PlacePoint[index]
|
||
|
if self.CurSelectGridIndex == index then
|
||
|
self:OnCancelRemoveBtn()
|
||
|
elseif self.PosInfo[index] then
|
||
|
self.BtnRemove.gameObject:SetActiveEx(true)
|
||
|
self.BtnRemove.transform.localPosition = item.Transform.localPosition
|
||
|
self.BtnRemove.CallBack = function() self:OnBtnRemove() end
|
||
|
self:UnselectAllItem(index)
|
||
|
self.CloseBg.raycastTarget = true
|
||
|
self:RegisterClickEvent(self.CloseBg, function () self:OnCancelRemoveBtn() end)
|
||
|
|
||
|
self.CurSelectGridIndex = index
|
||
|
else
|
||
|
self:UnselectAllItem()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:SetAllItemLight(isLight)
|
||
|
for index in pairs(self.TreePartList) do
|
||
|
local item = self.PlacePoint[index]
|
||
|
item:SetLight(self.CurrentGroup ~= OverallIndex and isLight)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- 切换显示按钮
|
||
|
function XUiChristmasTree:SwitchBtnChange()
|
||
|
if not self.InDressMode then
|
||
|
self.PanelChangeOver.gameObject:SetActiveEx(false)
|
||
|
self.PanelChangeOverEdit.gameObject:SetActiveEx(false)
|
||
|
elseif self.CurrentGroup == OverallIndex then
|
||
|
self.PanelChangeOver.gameObject:SetActiveEx(true)
|
||
|
self.PanelChangeOverEdit.gameObject:SetActiveEx(false)
|
||
|
for i = 1, AttrCount do
|
||
|
self.BtnChangeList[i]:SetButtonState(XUiButtonState.Normal)
|
||
|
end
|
||
|
self.BtnClear.gameObject:SetActiveEx(false)
|
||
|
else
|
||
|
self.PanelChangeOver.gameObject:SetActiveEx(false)
|
||
|
self.PanelChangeOverEdit.gameObject:SetActiveEx(true)
|
||
|
self.BtnClear.gameObject:SetActiveEx(true)
|
||
|
end
|
||
|
|
||
|
for i = 1, LocalStateCount do
|
||
|
self.BtnChangeList[i].gameObject:SetActiveEx(true)
|
||
|
self.BtnChangeEditList[i].gameObject:SetActiveEx(true)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
--动态列表事件
|
||
|
function XUiChristmasTree:OnDynamicTableEvent(event, index, grid)
|
||
|
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_INIT then
|
||
|
grid:Init(self)
|
||
|
local clicker = XUiButtonLongClick.New(grid.GridPointer, 15, self, nil, self.OnDrag, function()self:OnEndDrag(false) end, false, grid)
|
||
|
clicker:SetTriggerOffset(LongClickOffset)
|
||
|
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
|
||
|
local data = self.GiftList[index]
|
||
|
if not data then
|
||
|
return
|
||
|
end
|
||
|
grid:Refresh(data, index)
|
||
|
if self.CurrentFilterIndex <= AttrCount then
|
||
|
grid:ShowAttr(self.CurrentFilterIndex)
|
||
|
end
|
||
|
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_TOUCHED then
|
||
|
--grid:OpenDetail()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- 计时器
|
||
|
function XUiChristmasTree:CreateActivityTimer(startTime, endTime)
|
||
|
local time = XTime.GetServerNowTimestamp()
|
||
|
self:StopActivityTimer()
|
||
|
self.ActivityTimer = XScheduleManager.ScheduleForever(function()
|
||
|
time = XTime.GetServerNowTimestamp()
|
||
|
if time > endTime then
|
||
|
self:Close()
|
||
|
XUiManager.TipError(CSXTextManagerGetText("ActivityMainLineEnd"))
|
||
|
self:StopActivityTimer()
|
||
|
return
|
||
|
end
|
||
|
self.TxtDay.text = XUiHelper.GetTime(endTime - time, XUiHelper.TimeFormatType.ACTIVITY)
|
||
|
end, XScheduleManager.SECOND, 0)
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:StopActivityTimer()
|
||
|
if self.ActivityTimer then
|
||
|
XScheduleManager.UnSchedule(self.ActivityTimer)
|
||
|
self.ActivityTimer = nil
|
||
|
end
|
||
|
if self.AnimTimer then
|
||
|
XScheduleManager.UnSchedule(self.AnimTimer)
|
||
|
self.AnimTimer = nil
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:CalculateNearestBlockIndex(ignorePlaced)
|
||
|
local nearestIndex = nil
|
||
|
local nearestDistance = 0
|
||
|
for index, block in pairs(self.TreePartList) do
|
||
|
local ornamentId = self.PosInfo[index] or 0
|
||
|
if block and (ignorePlaced or ornamentId == 0) then
|
||
|
local x1 = self.DragItem.gameObject.transform.position.x
|
||
|
local y1 = self.DragItem.gameObject.transform.position.y
|
||
|
local x2 = block.position.x
|
||
|
local y2 = block.position.y
|
||
|
local distance = (y2-y1)^2 + (x2-x1)^2
|
||
|
if nearestDistance == 0 then
|
||
|
nearestIndex = index
|
||
|
nearestDistance = distance
|
||
|
else
|
||
|
if distance < nearestDistance then
|
||
|
nearestIndex = index
|
||
|
nearestDistance = distance
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
if nearestDistance <= MaxDistance then
|
||
|
return nearestIndex
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnDrag(time, caller, item) -- 拖拽
|
||
|
local data, index, isPlaced, isOwn = item:GetInfo()
|
||
|
|
||
|
if not self.DragItem then -- 第一次进入拖拽 没有拖拽的碎片
|
||
|
self.IsDraging = true
|
||
|
if self.CurrentGroup == OverallIndex then
|
||
|
caller:Reset()
|
||
|
if self.InDressMode then
|
||
|
XUiManager.TipText("ChristmasTreeInPreviewMode")
|
||
|
end
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if not isOwn then
|
||
|
caller:Reset()
|
||
|
XUiManager.TipText("ChristmasTreeOrnamentNotOwn")
|
||
|
return
|
||
|
end
|
||
|
if self.IsPartGroupFull and not isPlaced then
|
||
|
caller:Reset()
|
||
|
XUiManager.TipText("ChristmasTreePartGroupFull")
|
||
|
return
|
||
|
end
|
||
|
-- 锁定中 退出
|
||
|
if self.ClickLock then
|
||
|
caller:Reset()
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if data then
|
||
|
self.CurDragItemId = data.Id
|
||
|
self.NearestIndex = nil
|
||
|
self.DragItem = self.OrnamentDragItem
|
||
|
self.DragItem.gameObject:SetActiveEx(true)
|
||
|
self.DragItem:SetRawImage(data.ResPath)
|
||
|
self.DragItem.rectTransform.sizeDelta = CS.UnityEngine.Vector2(data.Width, data.Height)
|
||
|
self.DragItem.rectTransform.localPosition = self:GetPoint()
|
||
|
end
|
||
|
if isPlaced then
|
||
|
item.RImgIcon:CrossFadeAlpha(0.2, 0.2, false);
|
||
|
end
|
||
|
self.LastClickIndex = index
|
||
|
self:UnselectAllItem()
|
||
|
elseif self.IsDraging then-- 持续更新拖拽的碎片位置
|
||
|
self.DragItem.gameObject.transform.localPosition = self:GetPoint()
|
||
|
local nearestIndex = self:CalculateNearestBlockIndex(isPlaced)
|
||
|
-- XLog.Warning(nearestIndex, nearestDistance)
|
||
|
if nearestIndex then
|
||
|
if not self.NearestIndex then
|
||
|
self.NearestIndex = nearestIndex
|
||
|
self.PlacePoint[nearestIndex]:SetSelect(true)
|
||
|
elseif self.NearestIndex ~= nearestIndex then
|
||
|
self.PlacePoint[self.NearestIndex]:SetSelect(false)
|
||
|
self.NearestIndex = nearestIndex
|
||
|
self.PlacePoint[nearestIndex]:SetSelect(true)
|
||
|
end
|
||
|
elseif self.NearestIndex then
|
||
|
self.PlacePoint[self.NearestIndex]:SetSelect(false)
|
||
|
self.NearestIndex = nil
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:OnEndDrag(isChangePiece) -- 抬起
|
||
|
if not self.IsDraging then return end
|
||
|
if not self.NearestIndex then -- 点击抬起过快可能导致NearestIndex为空 或者 周围无可用挂点
|
||
|
if self.DragItem then
|
||
|
if isChangePiece then
|
||
|
self.PlacePoint[self.LastClickIndex].RImgIcon:CrossFadeAlpha(1, 0.2, false);
|
||
|
end
|
||
|
self.DragItem.gameObject:SetActiveEx(false)
|
||
|
self.DragItem = nil
|
||
|
self.LastClickIndex = nil
|
||
|
end
|
||
|
self:UnselectAllItem()
|
||
|
elseif self.DragItem then
|
||
|
self.DragItem.gameObject:SetActiveEx(false)
|
||
|
self.DragItem = nil
|
||
|
self.PlacePoint[self.NearestIndex]:SetSelect(false)
|
||
|
if isChangePiece then
|
||
|
XDataCenter.ChristmasTreeManager.SwapOrnamentPos(self.NearestIndex ,self.LastClickIndex)
|
||
|
self.CurDragItemId = nil
|
||
|
-- self:SelectItem(self.LastClickIndex, ture)
|
||
|
self.PlacePoint[self.LastClickIndex].RImgIcon:CrossFadeAlpha(1, 0.2, false);
|
||
|
else
|
||
|
XDataCenter.ChristmasTreeManager.PutOrnament(self.NearestIndex ,self.CurDragItemId)
|
||
|
end
|
||
|
self.LastClickIndex = nil
|
||
|
self.NearestIndex = nil
|
||
|
self:RefreshView()
|
||
|
end
|
||
|
self.CurSelectGridIndex = nil
|
||
|
self.IsDraging = false
|
||
|
self.ClickLock = true
|
||
|
XScheduleManager.ScheduleOnce(function()
|
||
|
self.ClickLock = false
|
||
|
end, 100)
|
||
|
end
|
||
|
|
||
|
function XUiChristmasTree:GetPoint()
|
||
|
local screenPoint
|
||
|
if CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.WindowsEditor or CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.WindowsPlayer then
|
||
|
screenPoint = CS.UnityEngine.Vector2(CS.UnityEngine.Input.mousePosition.x, CS.UnityEngine.Input.mousePosition.y)
|
||
|
else
|
||
|
screenPoint = CS.UnityEngine.Input.GetTouch(0).position
|
||
|
end
|
||
|
|
||
|
-- 设置拖拽
|
||
|
local hasValue, v2 = CS.UnityEngine.RectTransformUtility.ScreenPointToLocalPointInRectangle(self.RectTransform, screenPoint, self.Camera)
|
||
|
if hasValue then
|
||
|
local x = v2.x
|
||
|
local y = v2.y
|
||
|
--if x < -self.PieceMoveLimitX then x = -self.PieceMoveLimitX elseif x > self.PieceMoveLimitX then x = self.PieceMoveLimitX end
|
||
|
--if y < -self.PieceMoveLimitY then y = -self.PieceMoveLimitY elseif y > self.PieceMoveLimitY then y = self.PieceMoveLimitY end
|
||
|
return CS.UnityEngine.Vector3(x, y, 0)
|
||
|
else
|
||
|
return CS.UnityEngine.Vector3.zero
|
||
|
end
|
||
|
end
|