Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorObject / MapEditorObjectPanel.cs
using System.Collections.Generic;
using System.Linq;
using Config;
using Godot;
using UI.MapEditor;

namespace UI.MapEditorObject;

public partial class MapEditorObjectPanel : MapEditorObject, IEditorTab
{
    /// <summary>
    /// 编辑器Tile对象
    /// </summary>
    public EditorTileMap EditorTileMap { get; private set; }

    /// <summary>
    /// 临时存储普通层自定义物体数据
    /// </summary>
    public readonly List<RoomObjectInfo> NormalLayerObjects = new List<RoomObjectInfo>();
    
    /// <summary>
    /// 临时存储Y排序层自定义物体数据
    /// </summary>
    public readonly List<RoomObjectInfo> YSortLayerObjects = new List<RoomObjectInfo>();
    
    /// <summary>
    /// 当前页签是否选中
    /// </summary>
    public bool IsActiveTab { get; private set; }

    /// <summary>
    /// 物体网格
    /// </summary>
    public UiGrid<Item, RoomObjectInfo> ObjectGrid { get; private set; }
    
    public override void OnCreateUi()
    {
        var editorPanel = (MapEditorPanel)ParentUi;
        EditorTileMap = editorPanel.S_TileMap.Instance;
        
        ObjectGrid = CreateUiGrid<Item, RoomObjectInfo, ItemCell>(S_Item);
        ObjectGrid.SetHorizontalExpand(true);
        ObjectGrid.SelectEvent += OnSelectEvent;
        
        AddEventListener(EventEnum.OnPutObject, OnPutObject);
        AddEventListener(EventEnum.OnSelectObject, OnSelectObject);
        
        S_SearchButton.Instance.Pressed += OnSearchClick;
        S_LayerOption.Instance.ItemSelected += (index) =>
        {
            OnChangeObjectLayer(index);
            OnSearchClick();
        };

        S_DynamicDeleteButton.Instance.Pressed += OnDelete;
    }

    public override void OnDestroyUi()
    {
        
    }

    /// <summary>
    /// 初始化面板数据
    /// </summary>
    public void InitData()
    {
        var tileInfo = EditorTileMap.CurrRoomSplit.TileInfo;
        if (tileInfo.NormalLayerObjects != null)
        {
            foreach (var temp in tileInfo.NormalLayerObjects)
            {
                if (ExcelConfig.EditorObject_Map.ContainsKey(temp.Id))
                {
                    NormalLayerObjects.Add(temp.Clone());
                }
            }
        }

        if (tileInfo.YSortLayerObjects != null)
        {
            foreach (var temp in tileInfo.YSortLayerObjects)
            {
                if (ExcelConfig.EditorObject_Map.ContainsKey(temp.Id))
                {
                    YSortLayerObjects.Add(temp.Clone());
                }
            }
        }
        
        EditorTileMap.MapEditorPanel.S_MapEditorTools.Instance.InitCustomObjectData();
        //刷新数据
        OnSearchClick();
    }
    
    /// <summary>
    /// 保存配置数据
    /// </summary>
    public void OnSaveData(DungeonTileInfo tileInfo)
    {
        if (tileInfo.NormalLayerObjects == null)
        {
            tileInfo.NormalLayerObjects = new List<RoomObjectInfo>();
        }
        else
        {
            tileInfo.NormalLayerObjects.Clear();
        }

        foreach (var normalLayerObject in NormalLayerObjects)
        {
            tileInfo.NormalLayerObjects.Add(normalLayerObject.Clone());
        }

        if (tileInfo.YSortLayerObjects == null)
        {
            tileInfo.YSortLayerObjects = new List<RoomObjectInfo>();
        }
        else
        {
            tileInfo.YSortLayerObjects.Clear();
        }

        foreach (var ySortLayerObject in YSortLayerObjects)
        {
            tileInfo.YSortLayerObjects.Add(ySortLayerObject.Clone());
        }
    }

    /// <summary>
    /// 聚焦物体
    /// </summary>
    public void FoceSelectObject(RoomObjectInfo info)
    {
        EditorTileMap.SetLookPosition(new Vector2(info.X, info.Y));
    }

    /// <summary>
    /// 获取当前选中的物体层
    /// </summary>
    public List<RoomObjectInfo> GetCurrentObjectLayer()
    {
        return S_LayerOption.Instance.Selected == 0 ? NormalLayerObjects : YSortLayerObjects;
    }

    /// <summary>
    /// 获取当前选中的物体层
    /// </summary>
    public RoomLayerEnum GetCurrentObjectLayerEnum()
    {
        return S_LayerOption.Instance.Selected == 0 ? RoomLayerEnum.NormalLayer : RoomLayerEnum.YSortLayer;
    }

    private void OnChangeObjectLayer(long index)
    {
        var editorToolsPanel = EditorTileMap.MapEditorPanel.S_MapEditorTools.Instance;
        var toolsPanel = editorToolsPanel;

        if (index == 0)
        {
            toolsPanel.CustomNormalRoot.Modulate = Colors.White;
            toolsPanel.CustomYSortRoot.Modulate = new Color(1, 1, 1, 0.5f);
        }
        else
        {
            toolsPanel.CustomNormalRoot.Modulate = new Color(1, 1, 1, 0.5f);
            toolsPanel.CustomYSortRoot.Modulate = Colors.White;
        }
        
        //启用当前层的Area2D物体监视
        foreach (var custonObjectData in editorToolsPanel.CustomObjecMapping)
        {
            var objectData = custonObjectData.Value;
            objectData.Node.Instance.Monitorable = (long)objectData.Layer == index;
        }
    }

    //搜索
    public void OnSearchClick()
    {
        var dataList = GetCurrentObjectLayer();
        var text = S_SearchInput.Instance.Text;
        if (string.IsNullOrEmpty(text))
        {
            ObjectGrid.SetDataList(dataList);
        }
        else
        {
            var result = dataList.Where(data => ExcelConfig.EditorObject_Map[data.Id].Name.Contains(text)).ToArray();
            ObjectGrid.SetDataList(result);
        }
    }
    
    //创建自定义物体
    private void OnPutObject(object obj)
    {
        var temp = (RoomObjectInfo)obj;
        var layer = GetCurrentObjectLayer();
        layer.Add(temp);
        OnSearchClick();
    }
    
    private void OnSelectEvent(int index)
    {
        if (index < 0)
        {
            S_DynamicDeleteButton.Instance.Visible = false;
            S_DynamicDeleteButton.Reparent(this);
        }
        else
        {
            S_DynamicDeleteButton.Instance.Visible = true;
            S_DynamicDeleteButton.Reparent(ObjectGrid.GetCell(index).CellNode.Instance);
        }
    }
    
    //删除
    private void OnDelete()
    {
        if (ObjectGrid.SelectIndex < 0)
        {
            return;
        }

        EditorWindowManager.ShowConfirm("提示", "确定删除该物体吗?", b =>
        {
            if (b)
            {
                var layer = GetCurrentObjectLayer();
                var temp = layer[ObjectGrid.SelectIndex];
                layer.RemoveAt(ObjectGrid.SelectIndex);
                
                //派发删除事件
                EventManager.EmitEvent(EventEnum.OnRemoveObject, temp);
                
                OnSearchClick();

                //标记数据脏了
                EventManager.EmitEvent(EventEnum.OnTileMapDirty);
            }
        });
    }

    public void OnSelectTab()
    {
        IsActiveTab = true;
        var panel = EditorTileMap.MapEditorPanel;
        
        panel.S_LayerPanel.Instance.Visible = true;
        panel.S_LayerPanel.L_MapEditorMapLayer.Instance.HideUi();
        panel.S_LayerPanel.L_MapEditorConfigObject.Instance.ShowUi();
            
        panel.S_MapEditorTools.Instance.SetToolButton(EditorToolEnum.Move, EditorToolEnum.ObjectPen, EditorToolEnum.ObjectTool, EditorToolEnum.Focus);
        OnChangeObjectLayer(S_LayerOption.Instance.Selected);
    }

    public void OnUnSelectTab()
    {
        var panel = EditorTileMap.MapEditorPanel;
        panel.S_MapEditorTools.Instance.CustomNormalRoot.Modulate = Colors.White;
        panel.S_MapEditorTools.Instance.CustomYSortRoot.Modulate = Colors.White;
        IsActiveTab = false;
    }
    
    private void OnSelectObject(object obj)
    {
        var data = (RoomObjectInfo)obj;
        if (ObjectGrid.SelectData != data)
        {
            var uiCell = ObjectGrid.Find(item => item.Data == data);
            if (uiCell != null)
            {
                uiCell.Click();
            }
        }
    }
}