using System; using System.IO; using TMPro; using UnityEngine; using UnityEngine.UI; /// /// 文件选择对话框 /// 提供文件选择和保存功能 /// public class FileSelectionDialog : BasePanel { [Header("UI组件")] public TextMeshProUGUI TitleText; public TMP_InputField FilePathInput; // 文件路径输入框 public Button BrowseButton; // 浏览按钮 public Button ConfirmButton; // 确认按钮 public Button CancelButton; // 取消按钮 public TMP_Dropdown FileTypeDropdown; // 文件类型下拉框 [Header("文件浏览")] public ScrollRect DirectoryScrollRect; // 目录滚动视图 public Transform DirectoryContent; // 目录内容容器 public GameObject DirectoryItemPrefab; // 目录项预制体 public GameObject FileItemPrefab; // 文件项预制体 private Action _onConfirm; private Action _onCancel; private string _currentDirectory = Application.streamingAssetsPath; private string[] _fileFilters; private bool _isSaveMode; private string _defaultFileName; public override void Init() { InitializeButtons(); _currentDirectory = Application.streamingAssetsPath; RefreshDirectoryView(); } private void InitializeButtons() { if (BrowseButton != null) { BrowseButton.onClick.AddListener(OnBrowseClicked); } if (ConfirmButton != null) { ConfirmButton.onClick.AddListener(OnConfirmClicked); } if (CancelButton != null) { CancelButton.onClick.AddListener(OnCancelClicked); } if (FileTypeDropdown != null) { FileTypeDropdown.onValueChanged.AddListener(OnFileTypeChanged); } } /// /// 显示文件选择对话框 /// public static void Show(string title, string fileFilter, Action onConfirm, Action onCancel = null) { var dialog = EnhancedUIManager.Instance.ShowPanel(UIPanelType.Dialog, true, true); if (dialog != null) { dialog.ShowFileDialog(title, fileFilter, false, "", onConfirm, onCancel); } } /// /// 显示文件保存对话框 /// public static void ShowSave(string title, string fileFilter, string defaultFileName, Action onConfirm, Action onCancel = null) { var dialog = EnhancedUIManager.Instance.ShowPanel(UIPanelType.Dialog, true, true); if (dialog != null) { dialog.ShowFileDialog(title, fileFilter, true, defaultFileName, onConfirm, onCancel); } } private void ShowFileDialog(string title, string fileFilter, bool isSaveMode, string defaultFileName, Action onConfirm, Action onCancel) { _onConfirm = onConfirm; _onCancel = onCancel; _isSaveMode = isSaveMode; _defaultFileName = defaultFileName; if (TitleText != null) { TitleText.text = title; } SetupFileFilters(fileFilter); if (_isSaveMode && !string.IsNullOrEmpty(_defaultFileName)) { if (FilePathInput != null) { FilePathInput.text = Path.Combine(_currentDirectory, _defaultFileName); } } RefreshDirectoryView(); } private void SetupFileFilters(string fileFilter) { if (FileTypeDropdown != null) { FileTypeDropdown.options.Clear(); if (string.IsNullOrEmpty(fileFilter)) { FileTypeDropdown.options.Add(new TMP_Dropdown.OptionData("所有文件 (*.*)", null)); _fileFilters = new string[] { "*.*" }; } else { // 解析文件过滤器 "描述|*.ext;*.ext2|描述2|*.ext3" string[] parts = fileFilter.Split('|'); _fileFilters = new string[parts.Length / 2]; for (int i = 0; i < parts.Length; i += 2) { if (i + 1 < parts.Length) { string description = parts[i]; string extensions = parts[i + 1]; FileTypeDropdown.options.Add(new TMP_Dropdown.OptionData(description, null)); _fileFilters[i / 2] = extensions; } } } FileTypeDropdown.value = 0; FileTypeDropdown.RefreshShownValue(); } } private void RefreshDirectoryView() { if (DirectoryContent == null) return; // 清空现有项目 foreach (Transform child in DirectoryContent) { Destroy(child.gameObject); } try { // 添加返回上级目录项 var parentDir = Directory.GetParent(_currentDirectory); if (parentDir != null) { CreateDirectoryItem("..", parentDir.FullName, true); } // 添加子目录 string[] directories = Directory.GetDirectories(_currentDirectory); foreach (string dir in directories) { string dirName = Path.GetFileName(dir); CreateDirectoryItem(dirName, dir, false); } // 添加文件 string[] files = Directory.GetFiles(_currentDirectory); foreach (string file in files) { if (IsFileMatchFilter(file)) { string fileName = Path.GetFileName(file); CreateFileItem(fileName, file); } } } catch (Exception ex) { Debug.LogError($"刷新目录视图失败: {ex.Message}"); } } private bool IsFileMatchFilter(string filePath) { if (_fileFilters == null || _fileFilters.Length == 0) return true; string selectedFilter = _fileFilters[FileTypeDropdown?.value ?? 0]; if (selectedFilter == "*.*") return true; string[] extensions = selectedFilter.Split(';'); string fileExtension = Path.GetExtension(filePath).ToLower(); foreach (string ext in extensions) { string filterExt = ext.Replace("*", "").ToLower(); if (fileExtension == filterExt) return true; } return false; } private void CreateDirectoryItem(string name, string path, bool isParent) { if (DirectoryItemPrefab == null) return; var item = Instantiate(DirectoryItemPrefab, DirectoryContent); var text = item.GetComponentInChildren(); if (text != null) { text.text = isParent ? ".. (上级目录)" : $"[{name}]"; } var button = item.GetComponent