123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- using UnityEditor;
- using UnityEngine;
- using UnityEngine.UIElements;
- using System.Collections.Generic;
- namespace ProjectExporter
- {
- public class ProjectExporterWindow : EditorWindow
- {
- private ProjectExporterController _controller;
- private VisualElement _rootElement;
- private VisualElement _contentContainer;
- private Dictionary<string, AssetModel> _assetTrees;
- private string _currentTab = "Scenes";
- [MenuItem("Tools/Project Exporter")]
- public static void ShowWindow()
- {
- ProjectExporterWindow wnd = GetWindow<ProjectExporterWindow>(true, "Project Exporter");
- wnd.minSize = new Vector2(400, 300);
- }
- private void OnEnable()
- {
- _controller = new ProjectExporterController();
- _assetTrees = new Dictionary<string, AssetModel>();
- _rootElement = rootVisualElement;
- // Build the UI frame without loading asset data initially
- BuildUI();
-
- // Trigger the first content refresh
- RefreshContent(_currentTab);
- }
- private void BuildUI()
- {
- _rootElement.Clear();
- var tabContainer = new VisualElement { style = { flexDirection = FlexDirection.Row } };
- tabContainer.Add(ProjectExporterUI.CreateTab("Scenes"));
- tabContainer.Add(ProjectExporterUI.CreateTab("Prefabs"));
- tabContainer.Add(ProjectExporterUI.CreateTab("Scriptable Objects"));
- tabContainer.Add(ProjectExporterUI.CreateTab("Meta Files"));
- tabContainer.Add(ProjectExporterUI.CreateTab("Settings"));
- _rootElement.Add(tabContainer);
- // Create a scrollable container for the main content
- var scrollView = new ScrollView(ScrollViewMode.Vertical);
- _rootElement.Add(scrollView);
- _contentContainer = ProjectExporterUI.CreateMainContainer();
- scrollView.Add(_contentContainer);
- var generateButton = ProjectExporterUI.CreateGenerateButton();
- _rootElement.Add(generateButton);
- generateButton.clicked += () => _controller.ExportAssets(_assetTrees[_currentTab], _currentTab);
- var tabs = tabContainer.Query<Button>().ToList();
- tabs[0].clicked += () => RefreshContent("Scenes");
- tabs[1].clicked += () => RefreshContent("Prefabs");
- tabs[2].clicked += () => RefreshContent("Scriptable Objects");
- tabs[3].clicked += () => RefreshContent("Meta Files");
- tabs[4].clicked += () => RefreshContent("Settings");
- }
- private void RefreshContent(string tabName)
- {
- _currentTab = tabName;
- _contentContainer.Clear();
- // Load data on demand if it hasn't been loaded yet
- if (!_assetTrees.ContainsKey(tabName))
- {
- EditorUtility.DisplayProgressBar("Loading...", $"Fetching {tabName}...", 0.5f);
- try
- {
- switch (tabName)
- {
- case "Scenes":
- _assetTrees[tabName] = _controller.GetAssets("t:Scene");
- break;
- case "Prefabs":
- _assetTrees[tabName] = _controller.GetAssets("t:Prefab");
- break;
- case "Scriptable Objects":
- _assetTrees[tabName] = _controller.GetAssets("t:ScriptableObject");
- break;
- case "Meta Files":
- _assetTrees[tabName] = _controller.GetAllMetaFiles();
- break;
- case "Settings":
- _assetTrees[tabName] = _controller.GetProjectSettingsFiles();
- break;
- }
- }
- finally
- {
- EditorUtility.ClearProgressBar();
- }
- }
- var rootModel = _assetTrees[tabName];
- if (rootModel != null)
- {
- foreach (var child in rootModel.Children)
- {
- _contentContainer.Add(CreateAssetView(child, 0));
- }
- }
- }
- private VisualElement CreateAssetView(AssetModel model, int indentLevel)
- {
- const int indentWidth = 20;
- if (model.Children.Count > 0)
- {
- var row = new VisualElement { style = { flexDirection = FlexDirection.Row, alignItems = Align.Center, marginLeft = indentLevel * indentWidth } };
- var foldout = ProjectExporterUI.CreateFoldout(model.Name);
- foldout.style.flexGrow = 1;
- var toggle = new Toggle { value = model.IsSelected, text = "" };
-
- toggle.RegisterValueChangedCallback(evt => {
- model.IsSelected = evt.newValue;
- SetChildrenSelection(model, evt.newValue);
- UpdateChildTogglesUI(foldout, evt.newValue);
- });
- row.Add(toggle);
- row.Add(foldout);
- foreach (var child in model.Children)
- {
- foldout.Add(CreateAssetView(child, indentLevel + 1));
- }
- return row;
- }
- else
- {
- var toggle = ProjectExporterUI.CreateToggle(model.Name);
- toggle.style.marginLeft = (indentLevel + 1) * indentWidth;
- toggle.value = model.IsSelected;
- toggle.RegisterValueChangedCallback(evt => model.IsSelected = evt.newValue);
- return toggle;
- }
- }
-
- private void UpdateChildTogglesUI(VisualElement container, bool isSelected)
- {
- container.Query<Toggle>().ForEach(childToggle => {
- childToggle.SetValueWithoutNotify(isSelected);
- });
- }
- private void SetChildrenSelection(AssetModel parent, bool isSelected)
- {
- parent.IsSelected = isSelected;
- foreach (var child in parent.Children)
- {
- SetChildrenSelection(child, isSelected);
- }
- }
- }
- }
|