# 文件内容区状态管理改进 ## 问题描述 用户报告:点击文件查看内容后,再点击另一个文件夹,文件内容区仍显示之前文件的内容,看起来与当前目录脱离了关联。 ## 需求分析 经过进一步沟通,用户实际上希望: - **切换目录浏览时,保留对原文件的关联** - 这样可以方便跨目录编辑文件 - 例如:在 A 目录打开文件编辑,然后浏览 B 目录复制内容,再回到编辑器继续编辑原文件 ## 改进方案 ### 修改 1:优化文件列表选择状态 **位置:** `frontend/src/components/FileSystem.vue:843-847` **修改内容:** ```javascript // 切换目录时,保留原文件内容状态,方便跨目录编辑 // 清空 selectedFileItem,因为原文件可能不在新目录的列表中 selectedFileItem.value = null if (selectedFilePath.value) { debugLog('[listDirectory] 目录已切换,保留原文件引用:', selectedFilePath.value) } ``` **效果:** - 保留 `selectedFilePath` 和 `fileContent`,用户可以继续编辑原文件 - 清空 `selectedFileItem`,避免在新目录中错误地高亮不存在的文件 ### 修改 2:增强文件路径显示 **位置:** - `frontend/src/components/FileSystem.vue:1423-1465` - 新增计算属性 - `frontend/src/components/FileSystem.vue:192-218` - 更新模板 - `frontend/src/components/FileSystem.vue:3369-3385` - 新增样式 **新增计算属性:** 1. **`isFileInCurrentDirectory`** - 判断文件是否在当前目录中 ```javascript const isFileInCurrentDirectory = computed(() => { if (!selectedFilePath.value || !filePath.value) return false const fileDir = selectedFilePath.value.substring( 0, Math.max( selectedFilePath.value.lastIndexOf('\\'), selectedFilePath.value.lastIndexOf('/') ) ) return normalizePath(fileDir) === normalizePath(filePath.value) }) ``` 2. **`currentFileFullPath`** - 获取文件完整路径(用于tooltip) ```javascript const currentFileFullPath = computed(() => { return selectedFilePath.value || '' }) ``` 3. **更新 `currentFileName`** - 根据文件位置智能显示 ```javascript const currentFileName = computed(() => { // ... ZIP模式处理 ... if (selectedFilePath.value) { // 如果文件在当前目录,只显示文件名;否则显示完整路径 if (isFileInCurrentDirectory.value) { return getFileName(selectedFilePath.value) } else { return selectedFilePath.value // 显示完整路径 } } return '' }) ``` **模板更新:** ```vue {{ currentFileName }} ``` **样式更新:** ```css .panel-filename.file-outside-dir { color: rgb(var(--warning-6)); font-weight: 500; } .file-location-hint { font-size: 11px; color: var(--color-text-3); font-weight: normal; } ``` ## 用户体验改进 ### 改进前的问题 - 切换目录后,文件内容区显示旧文件 - 只显示文件名(如 "file.txt") - 用户不清楚这个文件在哪里 - 可能造成混淆 ### 改进后的效果 - 切换目录时保留文件内容,方便跨目录编辑 ✅ - 文件在当前目录时:只显示文件名(简洁) - 文件不在当前目录时: - 显示完整路径(如 "C:\path\to\file.txt") - 添加 "(不在当前目录)" 提示 - 文件名以橙色高亮显示 - 鼠标悬停显示完整路径 tooltip ### 使用场景示例 1. **场景1:跨目录复制** - 用户在 `C:\Project` 打开 `config.ini` 编辑 - 浏览到 `D:\Templates` 复制配置 - 回到编辑器,`config.ini` 内容仍然保留,可以继续编辑 - 标题显示:"C:\Project\config.ini (不在当前目录)",清晰明了 2. **场景2:浏览参考文件** - 用户在 `C:\Work` 编辑 `main.js` - 浏览到 `C:\Docs` 查看 API 文档 - 回到编辑器,`main.js` 内容保留 - 用户可以参考文档内容继续编辑 ## 技术细节 ### 状态管理 - `selectedFilePath`: 选中的文件完整路径(保留,不因切换目录而清空) - `selectedFileItem`: 文件列表中的选中项(切换目录时清空) - `fileContent`: 文件内容(保留,支持跨目录编辑) ### 路径标准化 使用 `normalizePath()` 函数确保路径比较的一致性,处理不同操作系统的路径分隔符差异。 ### 视觉提示 - **橙色文字**:警告色,提醒用户注意 - **完整路径**:让用户知道文件的准确位置 - **文字提示**:"(不在当前目录)" 明确告知状态 ## 测试建议 1. **基本功能测试** - 打开文件A查看内容 - 切换到其他文件夹 - 验证文件内容仍然保留 - 验证标题显示完整路径和提示 2. **跨目录编辑测试** - 在目录A打开文件 - 切换到目录B - 修改文件内容 - 点击保存 - 验证文件保存到原位置(目录A) 3. **UI显示测试** - 文件在当前目录:只显示文件名 - 文件不在当前目录:显示完整路径 + 橙色 + 提示文字 - 鼠标悬停:显示完整路径 tooltip 4. **边界情况** - ZIP 模式下的行为 - 导航历史(后退/前进) - 路径包含特殊字符 ## 相关代码 - `FileSystem.vue:833-859` - `listDirectory()` 函数 - `FileSystem.vue:944-957` - `selectFile()` 函数 - `FileSystem.vue:961-1025` - `readFile()` 函数 - `FileSystem.vue:1423-1465` - 计算属性(`isFileInCurrentDirectory`, `currentFileName`, `currentFileFullPath`) - `FileSystem.vue:192-218` - 模板更新 - `FileSystem.vue:3369-3385` - 样式更新