private void OnGUI() { isCompiling = EditorApplication.isCompiling; GUI.enabled = !isCompiling; scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition); EditorGUILayout.BeginVertical(); DrawSelectFolder("엑셀 테이블 경로", ref settingData.excelPath); DrawSelectFolder("테이블 클래스 경로", ref settingData.classPath); DrawSelectFolder("데이터 저장 경로", ref settingData.dataPath); DrawSelectFolder("CSV 저장 경로", ref settingData.csvPath); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("엑셀 파일 검색", GUILayout.Width(120))) { listSearchedFiles.Clear(); string[] _arrData = Directory.GetFiles(settingData.GetExcelFullPath()); for (int _index = 0; _index < _arrData.Length; _index++) { string _extention = GetExtensionString(_arrData[_index]); if (_extention == "xls" || _extention == "xlsx") { listSearchedFiles.Add(_arrData[_index]); } } multiListView.Reload(); singleListView.Reload(); } if (GUILayout.Button("네임스페이스 편집", GUILayout.Width(120))) { if (File.Exists(excelLoaderPath + "Setting/ExcelLoaderNamespace.txt") == false) { FileStream _stream = File.Create(excelLoaderPath + "Setting/ExcelLoaderNamespace.txt"); _stream.Close(); AssetDatabase.Refresh(); } Process.Start(Application.dataPath.Replace("Assets", excelLoaderPath) + "Setting/ExcelLoaderNamespace.txt"); } EditorGUILayout.EndHorizontal(); eExcelLoaderType _prevLoadType = currentLoadType; currentLoadType = (eExcelLoaderType)GUILayout.Toolbar((int)currentLoadType, new string[2] { "다중 선택", "단일 선택" }); EditorGUILayout.EndVertical(); //현재 로드 타입이 이전에 타입과 다르면 선택된 내용을 지워준다. if (_prevLoadType != currentLoadType) { selectWorkbook = null; selectSheet = null; listSelectSheetHeaders.Clear(); excelSelectID = 0; sheetSelectID = 0; lastSelectExcelName = string.Empty; lastSelectSheetName = string.Empty; listExcelSheets.Clear(); sheetListView.Reload(); multiListView.SetSelection(new List <int>()); multiListView.searchString = string.Empty; if (currentLoadType == eExcelLoaderType.MultiSelect) { searchField.downOrUpArrowKeyPressed -= singleListView.SetFocusAndEnsureSelectedItem; searchField.downOrUpArrowKeyPressed += multiListView.SetFocusAndEnsureSelectedItem; } else { searchField.downOrUpArrowKeyPressed -= multiListView.SetFocusAndEnsureSelectedItem; searchField.downOrUpArrowKeyPressed += singleListView.SetFocusAndEnsureSelectedItem; } } switch (currentLoadType) { case eExcelLoaderType.MultiSelect: { multiListView.searchString = searchField.OnGUI(new Rect(treeViewPadding, treeViewStartPosY - 20, excelListViewWidth, 20), multiListView.searchString); multiListView.OnGUI(multiSelectListViewRect); GUILayout.Space(treeViewEndPosY + 30); Color _deaultColor = GUI.color; GUI.color = Color.green; if (GUILayout.Button("전체 선택", GUILayout.Width(100))) { multiListView.SelectAllRows(); } GUI.color = _deaultColor; GUILayout.BeginHorizontal(); GUI.enabled = !isCompiling && multiListViewState.selectedIDs.Count > 0; if (GUILayout.Button("CS 파일 생성/갱신", GUILayout.Width(position.width / 2 - 5))) { EditorUtility.DisplayProgressBar("Work...", "CS파일 생성중...", 0); IList <int> _selects = multiListView.GetSelection(); listMultiSelects = new List <int>(_selects); string _namespace = LoadNamespaceText(); for (int _index = 0; _index < _selects.Count; _index++) { TreeViewItem _item = multiListView.GetItem(_selects[_index]); EditorUtility.DisplayProgressBar("Work...", string.Format("CS파일 생성중({0})...", _item.displayName), (float)(_index + 1) / _selects.Count); string _sheetName; string _excelFilePath; GetExcelFilePathAndSheetName(_item, out _excelFilePath, out _sheetName); LoadExcel(_excelFilePath); ISheet _tableSheet; List <HeaderData> _headers = LoadSheet(selectWorkbook, _item.displayName, _sheetName, out _tableSheet); string _log = string.Format("File Name = {0}, Sheet Name = {1}", _item.displayName, _sheetName); if (_tableSheet == null) { UnityEngine.Debug.LogErrorFormat("ExcelLoader Error : 엑셀 파일에 해당 시트가 존재하지 않습니다. {0}", _log); continue; } if (_headers.Count < 1) { UnityEngine.Debug.LogErrorFormat("ExcelLoader Error : 엑셀 파일에 필드가 존재하지 않습니다. {0}", _log); } else { scriptGenerator.SetScriptGenerator(_sheetName, _namespace, settingData, _headers); scriptGenerator.DataScriptGenerate(); } } EditorUtility.ClearProgressBar(); AssetDatabase.Refresh(); } //현재 선택한 엑셀파일들중에 CS파일이 생성되지 않은 엑셀이 있는 경우 GUI를 disable한다. bool _guiEnable = !isCompiling && multiListViewState.selectedIDs.Count > 0; if (_guiEnable == true) { IList <int> _selects = multiListView.GetSelection(); for (int _index = 0; _index < _selects.Count; _index++) { TreeViewItem _item = multiListView.GetItem(_selects[_index]); string _sheetName; string _excelFilePath; GetExcelFilePathAndSheetName(_item, out _excelFilePath, out _sheetName); if (File.Exists(string.Format("{0}/{1}.cs", settingData.GetClassFullPath(), ScriptGenerator.GetDataName(_sheetName))) == false) { _guiEnable = false; break; } } } GUI.enabled = _guiEnable; if (GUILayout.Button("바이너리,CSV 생성/갱신", GUILayout.Width(position.width / 2 - 5))) { IList <int> _selects = multiListView.GetSelection(); listMultiSelects = new List <int>(_selects); EditorUtility.DisplayProgressBar("Work...", "바이너리 작성중...", 0); for (int _index = 0; _index < _selects.Count; _index++) { TreeViewItem _item = multiListView.GetItem(_selects[_index]); EditorUtility.DisplayProgressBar("Work...", string.Format("바이너리 작성중({0})...", _item.displayName), (float)(_index + 1) / _selects.Count); string _sheetName; string _excelFilePath; GetExcelFilePathAndSheetName(_item, out _excelFilePath, out _sheetName); LoadExcel(_excelFilePath); ISheet _tableSheet; List <HeaderData> _headers = LoadSheet(selectWorkbook, _item.displayName, _sheetName, out _tableSheet); string _log = string.Format("File Name = {0}, Sheet Name = {1}", _item.displayName, _sheetName); if (_tableSheet == null) { UnityEngine.Debug.LogErrorFormat("ExcelLoader Error : 엑셀 파일에 해당 시트가 존재하지 않습니다. {0}", _log); continue; } Type _tableType = ScriptGenerator.GetType("ExcelLoader.DataContainer"); Type _dataType = ScriptGenerator.GetType(string.Format("{0}Data", _sheetName)); if (_dataType == null) { UnityEngine.Debug.LogErrorFormat("ExcelLoader Error : 엑셀 파일에 해당하는 CS파일이 존재하지 않습니다. {0}", _log); continue; } if (_headers.Count < 1) { UnityEngine.Debug.LogErrorFormat("ExcelLoader Error : 엑셀 파일에 필드가 존재하지 않습니다. {0}", _log); } else { if (WriteBinary(_headers, _tableSheet, _tableType, _dataType, settingData.GetDataFullPath(), _sheetName)) { WriteCSV(_headers, _tableSheet, _dataType, settingData.GetCsvFullPath(), _sheetName); } } } EditorUtility.ClearProgressBar(); AssetDatabase.Refresh(); RefreshGUI(); } GUI.enabled = !isCompiling; GUILayout.EndHorizontal(); } break; case eExcelLoaderType.SingleSelect: { singleListView.searchString = searchField.OnGUI(new Rect(treeViewPadding, treeViewStartPosY - 20, excelListViewWidth, 20), singleListView.searchString); singleListView.OnGUI(singleSelectListViewRect); sheetListView.OnGUI(sheetListViewRect); GUILayout.Space(treeViewEndPosY + 20 + 20); using (new GUILayout.HorizontalScope(EditorStyles.toolbar)) { GUILayout.Label("Member", GUILayout.MinWidth(100)); GUILayout.FlexibleSpace(); string[] names = { "Type", "Array" }; int[] widths = { 55, 40 }; for (int i = 0; i < names.Length; i++) { GUILayout.Label(new GUIContent(names[i]), GUILayout.Width(widths[i])); } } using (new EditorGUILayout.VerticalScope("box")) { GUILayout.BeginVertical(); if (listSelectSheetHeaders != null) { foreach (HeaderData header in listSelectSheetHeaders) { GUILayout.BeginHorizontal(); EditorGUILayout.LabelField(header.name, GUILayout.MinWidth(100)); GUILayout.FlexibleSpace(); EditorGUILayout.EnumPopup(header.type, GUILayout.Width(60)); GUILayout.Space(20); EditorGUILayout.Toggle(header.arrayGroup > 0, GUILayout.Width(20)); GUILayout.Space(10); GUILayout.EndHorizontal(); } } EditorGUILayout.EndVertical(); } GUILayout.BeginHorizontal(); GUI.enabled = !isCompiling && listSelectSheetHeaders.Count > 0; if (GUILayout.Button("CS 파일 생성/갱신", GUILayout.Width(position.width / 2 - 5))) { scriptGenerator.DataScriptGenerate(); AssetDatabase.Refresh(); } GUI.enabled = !isCompiling && (selectSheet == null ? false : File.Exists(string.Format("{0}/{1}.cs", settingData.GetClassFullPath(), scriptGenerator.dataFileName))); if (GUILayout.Button("바이너리,CSV 생성/갱신", GUILayout.Width(position.width / 2 - 5))) { if (WriteBinary( listSelectSheetHeaders, selectSheet, scriptGenerator.GetTableType(), scriptGenerator.GetDataType(), settingData.GetDataFullPath(), scriptGenerator.dataTableName)) { WriteCSV(listSelectSheetHeaders, selectSheet, scriptGenerator.GetDataType(), settingData.GetCsvFullPath(), scriptGenerator.dataTableName); } AssetDatabase.Refresh(); RefreshGUI(); } GUI.enabled = !isCompiling; GUILayout.EndHorizontal(); //if (GUILayout.Button("테이블 로드 테스트")) //{ // string _path = settingData.dataPath + '/' + scriptGenerator.dataTableName + ".bytes"; // _path = _path.Remove(0, _path.IndexOf("Assets")); // DataContainer _table = DataContainer.LoadTable(AssetDatabase.LoadAssetAtPath<TextAsset>(_path)); //} } break; default: break; } EditorGUILayout.EndScrollView(); }
/// <summary> /// GUI 갱신 /// </summary> private void RefreshGUI() { sheetListView.Reload(); singleListView.Reload(); }