#pragma once
#include "global.h"
#include "CMyListBox.h"
#include "CMyTreeCtrl.h"
#include "CMapEditorDraw.h"
#include "CMapEditorBrush.h"
#include "CBrushPreview.h"
#include "CMyPicButton.h"
#define CMAPEDITOR_MENUINDEX_FILE 0
#define CMAPEDITOR_MENUINDEX_EDIT 1
#define CMAPEDITOR_MENUINDEX_OPTION 2
//地图编辑器
class CMapEditor : public CDialog
{
	DECLARE_DYNAMIC(CMapEditor)
	DECLARE_MESSAGE_MAP()
public:
	CMapEditor(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~CMapEditor();
	// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_CMAPEDITOR };
#endif
	void* pMainEditor = nullptr;
	bool Light();
	bool Grid();
	bool Bk();
	bool Pxa();
	bool FGround();
	bool BGround();
	bool Entity();
	bool EntityLabel();
	bool EntityShow();
	bool IsEditMapMode();
	bool IsEditEntityMode();
	int GetPaintMode();//0涂画 1替换 2填充 3矩形 4复制 5粘贴
	CString GetMapFileName();
	CMyListBox* GetMapListBox();
	bool Close();
	void Draw();
	void Load(CString mapfilename);//载入文件
	void Save();//保存
	bool CheckSaved();
	bool IsLoaded();
	void ResetContext();
	void UpdateMenuState();//更新菜单状态
	void UpdateWindowTitle();//更新窗口标题
	CString XMLSaved();//保存地图数据到XML字符串
	void XMLLoad(CString xml);//读取XML数据到step
	CString LayerListNameToLayerName(CString listName);//名字转换 1.cave* -> cave
	void UpdateLayerList(CString setSel = L"");
	MyMapLayer* GetSelectLayer();
	void ResetWindowPos();//重置笔刷窗口位置
	void SelectToEntity();//选择到实体
	void SelectOutEntity();//没有选择到实体
	void UpdateMapCache();//更新地图缓存
	////////////////////热键//////////////////
	HACCEL hAccel = nullptr;//热键
	HACCEL hAccel_Save = nullptr;//热键
	BOOL PreTranslateMessage(MSG* pMsg) override;
protected:
	void DoDataExchange(CDataExchange* pDX) override;
	BOOL OnInitDialog() override;
	void OnCancel() override;
	BOOL OnCommand(WPARAM wParam, LPARAM lParam) override;
	void OnEnterKey();//空函数 阻止回车键退出
public:
	afx_msg void OnSize(UINT nType, int cx, int cy);
	afx_msg void OnMoving(UINT fwSide, LPRECT pRect);
	afx_msg void OnSizing(UINT fwSide, LPRECT pRect);
	afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
	afx_msg void OnTimer(UINT_PTR nIDEvent);
	//控件事件
	afx_msg void OnBnClickedCheckMaplist();//点击地图列表
	afx_msg void OnBnClickedCheckEntitylist();//点击实体列表
	afx_msg void OnBnClickedCheckLayerlist();//点击图层列表
	//全局
	afx_msg void OnBnClickedCheckLight();//点击光照
	//显示
	afx_msg void OnBnClickedRadioEditmap();//点击编辑地图
	afx_msg void OnBnClickedRadioEditentity();//点击编辑实体
	afx_msg void OnBnClickedCheckEntity();//点击实体
	afx_msg void OnBnClickedCheckEntitylabel();//点击实体标签
	afx_msg void OnBnClickedCheckEntityshow();//点击实体形态
	afx_msg void OnUpdateDraw();//点击网格
	afx_msg void OnBnClickedRadioPaint();//点击涂画
	afx_msg void OnBnClickedRadioReplace();//点击替换
	afx_msg void OnBnClickedRadioFill();//点击填充
	afx_msg void OnBnClickedRadioRect();//点击矩形
	afx_msg void OnBnClickedRadioCopy();//点击复制
	afx_msg void OnBnClickedRadioPaste();//点击粘贴
	afx_msg void OnBnClickedButtonBrushwnd();//点击显示地形组
	afx_msg void OnBnClickedButtonEntityoption();//点击设置选项
	//地图列表右键菜单
	afx_msg void OnEditMap();//编辑地图
	afx_msg void OnPrepMap();//编辑地图属性
	afx_msg void OnScriptMap();//编辑地图脚本
	afx_msg void OnScriptDrawclickMap();
	afx_msg void OnCopyMap();//复制地图
	afx_msg void OnAddMap();//添加地图
	afx_msg void OnDeleteMap();//删除地图
	afx_msg void OnOpenFolder();//打开所在文件夹
	afx_msg void OnUpdateList();//刷新列表
	//地图列表左键双击
	afx_msg void OnLbnDblclkListMaplist();//载入地图
	//主菜单
	afx_msg void OnOpenFile();//打开文件
	afx_msg void OnSaveFile();//保存文件
	afx_msg void OnCloseFile();//关闭文件
	afx_msg void OnUndo();//撤销
	afx_msg void OnRedo();//重做
	afx_msg void OnCopy();//复制
	afx_msg void OnPaste();//粘贴
	afx_msg void OnCut();//剪切
	afx_msg void OnMoveMap();//平移地图
	afx_msg void OnWallAdjust();//墙壁纹理矫正
	afx_msg void OnShowBk();//绘制透明背景
	afx_msg void OnShowGrid();//绘制网格
	afx_msg void OnEditGlobalscript();//编辑全局脚本
	afx_msg void OnSwitchLanguage();//切换语言
	afx_msg void OnImportCavestoryPxm();//导入洞窟物语地图
	afx_msg void OnScreenshot();
	afx_msg void OnRoomnametable();
	afx_msg void OnUpdatefontsubset();
	afx_msg void OnRefreshImage();//立即更新图像
	//图层列表
	afx_msg void OnLbnSelchangeListLayerlist();//变更了选择
	//图层列表右键菜单
	afx_msg void OnAddLayer();//添加图层
	afx_msg void OnPrepLayer();//图层属性
	afx_msg void OnCopyLayer();//复制图层
	afx_msg void OnPasteLayer();
	afx_msg void OnDeleteLayer();//删除图层
	afx_msg void OnShowLayer();//切换图层是否可见
	afx_msg void OnHideotherLayer();
	afx_msg void OnShowallLayer();
	//图层列表双击左键
	afx_msg void OnLbnDblclkListLayerlist();
	//点击按钮
	afx_msg LRESULT OnMyPicButtonLButtonUp(WPARAM wParam, LPARAM lParam);
	//实体编辑右键菜单
	afx_msg void OnAddEntity();//添加实体
	afx_msg void OnDeleteEntity();//删除实体
	afx_msg void OnCopyEntity();//复制实体
	afx_msg void OnPasteEntity();//粘贴实体
	afx_msg void OnTestpos();//直接测试
	afx_msg void OnSetRecordEndPos();//设置录制结束点
	afx_msg void OnStartRecord();//开始录制
	//实体信息修改变更
	afx_msg void OnEnChangeEditEntityname();//编辑实体类型
	afx_msg void OnEnChangeEditEntityid();//编辑实体号
	afx_msg void OnEnChangeEditEvent();//编辑实体事件
	afx_msg void OnEnChangeEditArg();//编辑实体参数
	afx_msg void OnEnChangeEditArg2();//编辑实体参数2
	afx_msg void OnEnChangeEditArg3();//编辑实体参数3
	//实体列表
	afx_msg void OnTvnSelchangedTreeEntitylist(NMHDR* pNMHDR, LRESULT* pResult);
private:
	//控件
	//地图列表
	CStatic* static_mapList;
	CMyListBox list_mapList;
	//列表
	CStatic* static_listOP;
	CButton check_mapList;
	CButton check_entityList;
	CButton check_layerList;
	//全局
	CStatic* static_light;
	CButton check_light;
	//显示
	CStatic* static_display;
	CButton radio_editMap;
	CButton radio_editEntity;
	CButton check_fGround;
	CButton check_entity;
	CButton check_bGround;
	CButton check_entityLabel;
	CButton check_bk;
	CButton check_entityShow;
	CButton check_pxaType;
	CButton check_grid;
	//信息
	CStatic* static_info;
	CButton radio_paint;
	CButton radio_replace;
	CButton radio_fill;
	CButton radio_rect;
	CButton radio_copy;
	CButton radio_paste;
	CButton button_brushWnd;
	//实体信息
	CStatic* static_entityType;
	CEdit edit_entityName;
	CStatic* static_entityID;
	CEdit edit_entityID;
	CStatic* static_entityOption;
	CButton button_entityOption;
	CStatic* static_event;
	CEdit edit_event;
	CStatic* static_arg;
	CEdit edit_arg;
	CStatic* static_arg2;
	CEdit edit_arg2;
	CStatic* static_arg3;
	CEdit edit_arg3;
	//实体列表
	CStatic* static_entityList;
	CMyTreeCtrl tree_entityList;
	//图层列表
	CStatic* static_layerList;
	CMyListBox list_layerList;
	//子窗口
	CMapEditorDraw pDrawWnd;
	CMapEditorBrush pBrushWnd;
	CBrushPreview pBrushPreview;
	CMyPicButton btn_play, btn_pause, btn_stop, btn_refresh;
	//变量
	CString mapfilename;//地图文件名 cave
	CString pxmfile;//./data/map/cave.pxm
	MyMapSet mapSet;//地图数据
	MyMapSet saved;//已保存的数据
	std::list<MyMapLayer*> drawLayer;//排列好的图层表
	std::mutex mtx;
	//动画播放
	bool playing = false;//是否正在播放动画
	UINT_PTR timeid;//计时器
	int timeCounter = 0;
	//风场动画
	float windAniIndex = 0;//风场动画下标
	float windAniSpeed = 0.1f;//风场动画速度
	float windAniIndex2 = 0;//风场动画下标
	float windAniSpeed2 = windAniSpeed * sqrtf(2) / 2;//风场动画速度
	//实体编辑
	bool dragEntity = false;//是否拖拽实体
	EntityLoad copyEntity;//拷贝的实体
	//图层编辑
	MyMapLayer copyLayer;//拷贝的图层
	void RedrawControlWnd();//重绘控件
	void ShowMapInfo(bool bShow);
	void ShowEntityInfo(bool bShow);
	void EnableControl(bool bEnable);//启用禁用控件
	void EnableEdit(bool bEnable);//丢失或选中图层
	void EnableMapEdit(bool bEnable);
	void EnableEntityEdit(bool bEnable);
	void StepCopyToSaved();
	CString GetSelectLayerName();
	void SwitchPaintMenu(MyMapLayer* pLayer);//切换擦除功能
	void RefreshEntityList();//重新载入实体列表
	//录制系统
	int recordEndPos_x = 0, recordEndPos_y = 0;
	//其他
	int last_CImportCaveStoryPxmOffX = 0;
	int last_CImportCaveStoryPxmOffY = 0;
};

