Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorProject / MapEditorProjectPanel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using Godot;
using UI.MapEditor;

namespace UI.MapEditorProject;

public partial class MapEditorProjectPanel : MapEditorProject
{
    /// <summary>
    /// 当前显示的组数据
    /// </summary>
    public UiGrid<GroupButton, DungeonRoomGroup> GroupGrid { get; private set; }

    /// <summary>
    /// 当前显示的房间数据
    /// </summary>
    public UiGrid<RoomButton, DungeonRoomSplit> RoomGrid { get; private set; }

    private EventFactory _eventFactory;

    public override void OnCreateUi()
    {
        //初始化枚举选项
        var roomTypes = Enum.GetValues<DungeonRoomType>();
        var optionButton = S_RoomTypeButton.Instance;
        optionButton.AddItem("全部", 0);
        for (var i = 0; i < roomTypes.Length; i++)
        {
            var dungeonRoomType = roomTypes[i];
            if (dungeonRoomType == DungeonRoomType.None) continue;
            optionButton.AddItem(DungeonManager.DungeonRoomTypeToDescribeString(dungeonRoomType),
                (int)dungeonRoomType + 1);
        }

        GroupGrid = new UiGrid<MapEditorProject.GroupButton, DungeonRoomGroup>(S_GroupButton, typeof(GroupButtonCell));
        GroupGrid.SetCellOffset(new Vector2I(0, 2));
        GroupGrid.SetHorizontalExpand(true);

        RoomGrid = new UiGrid<MapEditorProject.RoomButton, DungeonRoomSplit>(S_RoomButton, typeof(RoomButtonCell));
        RoomGrid.SetAutoColumns(true);
        RoomGrid.SetCellOffset(new Vector2I(10, 10));
        RoomGrid.SetHorizontalExpand(true);

        S_GroupSearchButton.Instance.Pressed += OnSearchGroupButtonClick;
        S_GroupEditButton.Instance.Pressed += OnEditGroup;
        S_GroupAddButton.Instance.Pressed += OnCreateGroupClick;
        S_GroupDeleteButton.Instance.Pressed += OnDeleteGroup;

        S_RoomSearchButton.Instance.Pressed += OnSearchRoomButtonClick;
        S_RoomAddButton.Instance.Pressed += OnCreateRoomClick;
        S_RoomEditButton.Instance.Pressed += OnEditRoom;
        S_RoomDeleteButton.Instance.Pressed += OnDeleteRoom;

        _eventFactory = EventManager.CreateEventFactory();
        _eventFactory.AddEventListener(EventEnum.OnCreateGroupFinish, OnCreateGroupFinish);
        _eventFactory.AddEventListener(EventEnum.OnDeleteGroupFinish, OnDeleteGroupFinish);
        _eventFactory.AddEventListener(EventEnum.OnCreateRoomFinish, OnCreateRoomFinish);
    }

    public override void OnShowUi()
    {
        RefreshGroup();
        OnSearchRoomButtonClick();
    }

    public override void OnDestroyUi()
    {
        _eventFactory.RemoveAllEventListener();
        _eventFactory = null;
        GroupGrid.Destroy();
        GroupGrid = null;

        RoomGrid.Destroy();
        RoomGrid = null;
    }

    /// <summary>
    /// 刷新组数据
    /// </summary>
    public void RefreshGroup()
    {
        MapProjectManager.RefreshMapGroup();
        OnSearchGroupButtonClick();
    }

    /// <summary>
    /// 选中地牢组
    /// </summary>
    public void SelectGroup(DungeonRoomGroup group)
    {
        EditorTileMapManager.SetSelectDungeonGroup(group);
        OnSearchRoomButtonClick();
    }

    /// <summary>
    /// 选择地图并打开地图编辑器
    /// </summary>
    public void OpenSelectRoom(DungeonRoomSplit room, TileSetSplit tileSetSplit)
    {
        //创建地牢Ui
        var mapEditor = ParentUi.OpenNextUi<MapEditorPanel>(UiManager.UiNames.MapEditor);
        //加载地牢
        mapEditor.LoadMap(room, tileSetSplit);
    }

    //搜索组按钮点击
    private void OnSearchGroupButtonClick()
    {
        var select = GroupGrid.SelectIndex;
        if (select < 0)
        {
            select = 0;
        }

        //输入文本
        var text = S_GroupSearchInput.Instance.Text;
        if (!string.IsNullOrEmpty(text))
        {
            var str = text.Trim().ToLower();
            var list = new List<DungeonRoomGroup>();
            foreach (var valuePair in MapProjectManager.GroupMap)
            {
                if (valuePair.Value.GroupName.Trim().ToLower().Contains(str))
                {
                    list.Add(valuePair.Value);
                }
            }

            GroupGrid.SetDataList(list.ToArray());
        }
        else
        {
            GroupGrid.SetDataList(MapProjectManager.GroupMap.Values.ToArray());
        }

        GroupGrid.SelectIndex = select;
    }

    //搜索房间按钮点击
    private void OnSearchRoomButtonClick()
    {
        if (EditorTileMapManager.SelectDungeonGroup != null)
        {
            //输入文本
            var text = S_RoomSearchInput.Instance.Text;
            //房间类型
            var roomType = S_RoomTypeButton.Instance.GetSelectedId();

            IEnumerable<DungeonRoomSplit> result = EditorTileMapManager.SelectDungeonGroup.GetAllRoomList();

            //名称搜索
            if (!string.IsNullOrEmpty(text))
            {
                var queryText = text.Trim().ToLower();
                result = result.Where(split =>
                {
                    return split.RoomInfo.RoomName.Trim().ToLower().Contains(queryText);
                });
            }

            //类型搜索
            if (roomType > 0)
            {
                var type = (DungeonRoomType)(roomType - 1);
                result = result.Where(split => split.RoomInfo.RoomType == type);
            }

            RoomGrid.SetDataList(result.ToArray());
        }
        else
        {
            RoomGrid.RemoveAll();
        }
    }

    //创建组按钮点击
    private void OnCreateGroupClick()
    {
        EditorWindowManager.ShowCreateGroup(CreateGroup);
    }

    //编辑组按钮点击
    private void OnEditGroup()
    {
        if (GroupGrid.SelectIndex != -1)
        {
            EditorWindowManager.ShowEditGroup(GroupGrid.SelectData, EditGroup);
        }
        else
        {
            EditorWindowManager.ShowTips("提示", "请选择需要编辑的组!");
        }
    }

    //删除组按钮点击
    private void OnDeleteGroup()
    {
        if (GroupGrid.SelectIndex != -1)
        {
            EditorWindowManager.ShowDelayConfirm("提示", "确定删除该组吗?\n该操作不可取消!", 5, DeleteGroup);
        }
        else
        {
            EditorWindowManager.ShowTips("提示", "请选择需要删除的组!");
        }
    }

    //创建地牢房间按钮点击
    private void OnCreateRoomClick()
    {
        var groupName = EditorTileMapManager.SelectDungeonGroup != null
            ? EditorTileMapManager.SelectDungeonGroup.GroupName
            : null;
        EditorWindowManager.ShowCreateRoom(groupName, Mathf.Max(S_RoomTypeButton.Instance.Selected - 1, 0), CreateRoom);
    }


    //编辑房间
    private void OnEditRoom()
    {
        var selectRoom = RoomGrid.SelectData;
        if (selectRoom == null)
        {
            EditorWindowManager.ShowTips("提示", "请选择需要编辑的房间!");
        }
        else
        {
            EditorWindowManager.ShowEditRoom(selectRoom, (room) =>
            {
                //保存房间数据
                MapProjectManager.SaveRoomInfo(room);
                OnSearchRoomButtonClick();
            });
        }
    }

    //删除房间
    private void OnDeleteRoom()
    {
        var selectRoom = RoomGrid.SelectData;
        if (selectRoom == null)
        {
            EditorWindowManager.ShowTips("提示", "请选择需要删除的房间!");
        }
        else
        {
            EditorWindowManager.ShowDelayConfirm("提示", $"是否删除房间: {selectRoom.RoomInfo.RoomName}, 该操作无法撤销!", 3, result =>
            {
                if (result)
                {
                    //删除房间
                    if (MapProjectManager.DeleteRoom(EditorTileMapManager.SelectDungeonGroup, selectRoom))
                    {
                        MapProjectManager.SaveGroupMap();
                        OnSearchRoomButtonClick();
                    }
                }
            });
        }
    }

    //创建地牢组
    private void CreateGroup(DungeonRoomGroup group)
    {
        MapProjectManager.CreateGroup(group);
    }

    //编辑地牢组
    private void EditGroup(DungeonRoomGroup group)
    {
        MapProjectManager.SaveGroupMap();
    }

    //删除地牢组
    private void DeleteGroup(bool v)
    {
        if (v)
        {
            MapProjectManager.DeleteGroup(GroupGrid.SelectData.GroupName);
        }
    }

    //创建房间
    private void CreateRoom(DungeonRoomSplit roomSplit)
    {
        MapProjectManager.CreateRoom(roomSplit);
    }

    //创建地牢组完成
    private void OnCreateGroupFinish(object group)
    {
        OnSearchGroupButtonClick();
    }

    //删除地牢组完成
    private void OnDeleteGroupFinish(object group)
    {
        OnSearchGroupButtonClick();
    }

//创建地牢房间完成
    private void OnCreateRoomFinish(object roomSplit)
    {
        OnSearchRoomButtonClick();
    }
}