using GameEditor.Core.TreeViewBase; using GameEditor.Core.Util; using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEditor.IMGUI.Controls; using UnityEngine; namespace GameEditor.Core.DataConfig { public class DataConfigExcelTab { public DataConfigWindow configWin; private ExcelTreeView excelTreeView = null; private TreeViewState excelTreeViewState = null; private ExcelTreeViewData selectedExcelData = null; private ExcelSheetView sheetTreeView = null; private TreeViewState sheetTreeViewState = null; public DataConfigExcelTab(DataConfigWindow win) { configWin = win; } private const float Excel_Tree_Width = 200; public void OnGUI(Rect rect) { Rect excelRect = new Rect(rect.x, rect.y, Excel_Tree_Width, rect.height); GUI.Box(excelRect, "",EditorStyles.helpBox); Rect excelTitleRect = new Rect(rect.x+2, rect.y+2, Excel_Tree_Width, 20); EditorGUI.LabelField(excelTitleRect, "Excel Tree List", GTEditorGUIStyle.BigLabelMidCeneterStyle); Rect excelTreeRect = excelTitleRect; excelTreeRect.y = excelTitleRect.y + excelTitleRect.height+10; excelTreeRect.height = rect.height - excelTitleRect.y - excelTitleRect.height - 20; if(excelTreeView == null) { InitExcelTreeView(); } excelTreeView.OnGUI(excelTreeRect); Rect splitRect = new Rect(Excel_Tree_Width+5,rect.y,4,rect.height); GTEditorGUI.DrawHorizontalSplitter(splitRect); Rect tableRect = new Rect(splitRect.x + splitRect.width + 2, rect.y, rect.width - splitRect.x - splitRect.width - 10, rect.height); GUI.Box(tableRect,"",EditorStyles.helpBox); Rect tableTitleRect = tableRect; tableTitleRect.height = 20; EditorGUI.LabelField(tableTitleRect, "Excel Table", GTEditorGUIStyle.BigLabelMidCeneterStyle); Rect sheetRect = tableTitleRect; sheetRect.y += tableTitleRect.height; sheetRect.height = rect.height - 60; if (selectedExcelData == null || !selectedExcelData.IsSheet()) { EditorGUI.LabelField(sheetRect, "请从左侧选择要查看数据表"); Rect exportBtnRect = rect; exportBtnRect.x = rect.x + rect.width - 120; exportBtnRect.y = rect.y + rect.height - 30; exportBtnRect.width = 100; exportBtnRect.height = 20; if (GUI.Button(exportBtnRect, "Export All")) { List excels = DataConfigWindow.window.excels; if(excels != null) { for (int i = 0; i < excels.Count; i++) { if(excels[i].sheets != null) { for (int j = 0; j < excels[i].sheets.Count; j++) { DataSheet sheet = excels[i].sheets[j]; bool isServer = true; foreach (DataField df in sheet.fields) { if(df.exportType == DataFieldExportType.Client || df.exportType == DataFieldExportType.All) { isServer = false; break; } } if (!isServer) { try { if (DataToOptimizeLuaExporter.CheckIsExport(sheet)) { new DataToOptimizeLuaExporter(sheet, DataConfigWindow.window.setting).Export(); } else { Debug.LogError("前端没有数据导出"); } DataToTxtExporter.Export(sheet, DataConfigWindow.window.setting); AssetDatabase.Refresh(); } catch (System.Exception e) { Debug.Log(e); } } else { Debug.Log("该表为纯后端表,无需导出!" + sheet.name); } } } } EditorUtil.ShowSureDialog("配置表数据导入完毕!"); } } } else { List excels = DataConfigWindow.window.excels; DataSheet sheet = excels[selectedExcelData.excelIndex].sheets[selectedExcelData.sheetIndex]; if(sheet == null || sheet.fields.Count == 0) { EditorGUI.LabelField(sheetRect, "解析数据表错误,请检查需要查询的数据表格式"); }else { if(sheetTreeView == null) InitSheetTreeView(sheet); } if(sheetTreeView!=null) { sheetTreeView.OnGUI(sheetRect); Rect exportBtnRect = rect; exportBtnRect.x = rect.x + rect.width - 80; exportBtnRect.y = rect.y + rect.height - 30; exportBtnRect.width = 60; exportBtnRect.height = 20; if(GUI.Button(exportBtnRect, "Export")) { System.Diagnostics.Stopwatch time = new System.Diagnostics.Stopwatch(); time.Start(); if (DataToOptimizeLuaExporter.CheckIsExport(sheet)) { new DataToOptimizeLuaExporter(sheet, DataConfigWindow.window.setting).Export(); } else { Debug.LogError("前端没有数据导出"); } DataToTxtExporter.Export(sheet, DataConfigWindow.window.setting); AssetDatabase.Refresh(); time.Stop(); Debug.LogError("耗时:" + time.ElapsedMilliseconds); EditorUtil.ShowSureDialog("配置表数据导入完毕!"); } } } } public void InitExcelTreeView() { excelTreeViewState = new TreeViewState(); excelTreeView = new ExcelTreeView(excelTreeViewState, GetExcelTreeViewModel()); excelTreeView.onSelected = OnSelected; } public void InitSheetTreeView(DataSheet sheetData) { var hs = ExcelSheetView.CreateDefaultMultiColumnHeaderState(sheetData.fields); var header = new MultiColumnHeader(hs); sheetTreeViewState = new TreeViewState(); sheetTreeView = new ExcelSheetView(sheetTreeViewState, header, GetSheetTreeViewModel(sheetData)); } private TreeModel> GetSheetTreeViewModel(DataSheet sheetData) { TreeModel> model = new TreeModel>( new List>() { new TreeElementWithData(new ExcelSheetData(){sheet = null,lineIndex = -1},"",-1,-1), } ); for(int i =0;i(new ExcelSheetData() { sheet = sheetData,lineIndex = i},"",0,i), model.root, model.root.hasChildren ? model.root.children.Count : 0); } return model; } private void OnSelected(TreeElementWithData data) { selectedExcelData = data.Data; sheetTreeView = null; } private TreeModel> GetExcelTreeViewModel() { TreeModel> data = new TreeModel>( new List>() { new TreeElementWithData(ExcelTreeViewData.Root,"",-1,-1), }); List excels = DataConfigWindow.window.excels; for (int i = 0; i < excels.Count; ++i) { TreeElementWithData excelData = new TreeElementWithData( new ExcelTreeViewData() { excelIndex = i, sheetIndex = -1 }, Path.GetFileNameWithoutExtension(excels[i].excelPath),0, (i + 1) * 100); data.AddElement(excelData, data.root, data.root.hasChildren ? data.root.children.Count : 0); for (int j =0;j sheetData = new TreeElementWithData( new ExcelTreeViewData() { excelIndex = i, sheetIndex = j }, Path.GetFileNameWithoutExtension(excels[i].sheets[j].name), 1, (i + 1) * 100+(j+1)); data.AddElement(sheetData, excelData, excelData.hasChildren ? excelData.children.Count : 0); } } return data; } } }