- 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();
- }
- }
- }
- }