✨ feat(vscode): 代码阅读侧栏拆成多栏:常驻未提交的更改、收藏目录各占一栏
This commit is contained in:
1 parent
45e526afa9
commit
b40ddb5e3a
27 files changed
+2427
-674
No files matched your search
@@ -7,6 +7,7 @@ import { logger } from '../logging/logger'
|
||||
import { packageCommandRules } from './commands/packageCommands'
|
||||
import { shellCommandRules } from './commands/shellCommands'
|
||||
import { systemCommandRules } from './commands/systemCommands'
|
||||
import { locatedDiffBases } from './diff/diffBase'
|
||||
import { BlockFilter } from './editor/blockFilter'
|
||||
import { NEXT_OCCURRENCE, PREVIOUS_OCCURRENCE } from './editor/occurrenceNavigation'
|
||||
import { languageOf, openingFor } from './editor/openTarget'
|
||||
@@ -19,8 +20,9 @@ import { FileTreeProvider } from './explorer/fileTree'
|
||||
import { registerPathAsk } from './explorer/pathAskPanel'
|
||||
import { registerRevealCommands } from './explorer/revealCommands'
|
||||
import { RowDecorator } from './explorer/rowDecorator'
|
||||
import { TreeFilters } from './explorer/treeFilters'
|
||||
import { TreeLocator } from './explorer/treeLocator'
|
||||
import { FAVORITE_SLOTS, favoriteCommand } from './favorites/favoriteSlots'
|
||||
import { FavoriteViews } from './favorites/favoriteViews'
|
||||
import { createBashAdapter } from './languages/bash'
|
||||
import { createDockerfileAdapter } from './languages/dockerfile'
|
||||
import { createPythonAdapter } from './languages/python'
|
||||
@@ -52,7 +54,8 @@ import { dockerfileZhTranslator } from './translators/dockerfileZh'
|
||||
import { pythonZhTranslator } from './translators/pythonZh'
|
||||
import { rustZhTranslator } from './translators/rustZh'
|
||||
import { typescriptZhTranslator } from './translators/typescriptZh'
|
||||
import { UncommittedMode } from './uncommitted/uncommittedMode'
|
||||
import { HeadBases } from './uncommitted/headBases'
|
||||
import { UncommittedView } from './uncommitted/uncommittedView'
|
||||
import { workspaceIndexHost } from './workspaceFiles'
|
||||
import { WorkspaceIndexes } from './workspaceIndex'
|
||||
|
||||
@@ -72,7 +75,8 @@ async function openFile(uri: Uri, registry: CodeReaderRegistry): Promise<void> {
|
||||
}
|
||||
|
||||
/**
|
||||
* 接入代码阅读:注册表、侧栏文件树(问路径、复制、在系统文件管理器里显示、文件注释、筛选:按审查工单只看 PR 改过的文件、只看未提交的更改)、预览编辑器(含问 AI)、编辑器右上角的「预览 / 编辑」切换。
|
||||
* 接入代码阅读:注册表、侧栏的几栏(主栏的文件树可以按审查工单只看 PR 改过的文件,常驻的「未提交的更改」,每个收藏目录一栏;
|
||||
* 行上有问路径、复制、在系统文件管理器里显示、文件注释、收藏目录)、预览编辑器(含问 AI,按文件所在位置标差异)、编辑器右上角的「预览 / 编辑」切换。
|
||||
* 内置的语言插件、翻译插件、库规则和命令规则与其他扩展一样通过返回的 API 注册。
|
||||
*/
|
||||
export function registerCodeReader(context: ExtensionContext): CodeReaderApi {
|
||||
@@ -94,14 +98,17 @@ export function registerCodeReader(context: ExtensionContext): CodeReaderApi {
|
||||
}
|
||||
const notes = new FileNotes()
|
||||
const entries = new WorkspaceEntries()
|
||||
const files = new FileTreeProvider(OPEN_COMMAND, new RowDecorator(notes, entries))
|
||||
const decorator = new RowDecorator(notes, entries)
|
||||
const files = new FileTreeProvider(OPEN_COMMAND, decorator)
|
||||
const view = window.createTreeView(FILES_VIEW, { treeDataProvider: files, showCollapseAll: true })
|
||||
const locator = new TreeLocator(files, view)
|
||||
const filters = new TreeFilters(files, view, context.workspaceState)
|
||||
const review = new ReviewMode(context, FILES_VIEW, view, files, filters)
|
||||
const uncommitted = new UncommittedMode(context, FILES_VIEW, view, files, filters)
|
||||
// 侧栏开着的筛选定预览对比什么:未提交的更改对比上一次提交,审查工单对比 PR 的目标分支
|
||||
const previews = new PreviewEditorProvider(context.extensionUri, registry, runtime, new BlockFilter(context.workspaceState), resolve, qa, namesIn, (index, key) => indexes.find(index, key), filters, entries, uri => locator.reveal(uri))
|
||||
const review = new ReviewMode(context, FILES_VIEW, view, files)
|
||||
const uncommitted = new UncommittedView(context, OPEN_COMMAND, decorator)
|
||||
const favorites = new FavoriteViews(context.workspaceState, OPEN_COMMAND, decorator)
|
||||
const heads = new HeadBases()
|
||||
// 预览对比什么按文件所在的位置定:审查工作副本里的对比 PR 的目标分支,工作区仓库里有改动的对比上一次提交
|
||||
const diffBases = locatedDiffBases([review, heads])
|
||||
const previews = new PreviewEditorProvider(context.extensionUri, registry, runtime, new BlockFilter(context.workspaceState), resolve, qa, namesIn, (index, key) => indexes.find(index, key), diffBases, entries, uri => locator.reveal(uri))
|
||||
|
||||
context.subscriptions.push(
|
||||
qa,
|
||||
@@ -129,18 +136,27 @@ export function registerCodeReader(context: ExtensionContext): CodeReaderApi {
|
||||
files,
|
||||
view,
|
||||
locator,
|
||||
filters,
|
||||
review,
|
||||
uncommitted,
|
||||
// 开着筛选时刷新是重读它摆的文件(PR 改过的、git 状态),平时是重读工作区文件树
|
||||
commands.registerCommand('superpowers.codeReader.refresh', () => filters.active ? filters.active.reload() : files.refresh()),
|
||||
favorites,
|
||||
heads,
|
||||
// 主栏审查时刷新是重读 PR 改过的文件,平时是重读工作区文件树
|
||||
commands.registerCommand('superpowers.codeReader.refresh', () => review.reviewing ? review.reload() : files.refresh()),
|
||||
commands.registerCommand('superpowers.codeReader.pickReviewIssue', () => review.pick()),
|
||||
commands.registerCommand('superpowers.codeReader.showUncommitted', () => uncommitted.enter()),
|
||||
commands.registerCommand('superpowers.codeReader.hideTests', () => filters.setTestsHidden(true)),
|
||||
commands.registerCommand('superpowers.codeReader.showTests', () => filters.setTestsHidden(false)),
|
||||
commands.registerCommand('superpowers.codeReader.hideReviewTests', () => review.setTestsHidden(true)),
|
||||
commands.registerCommand('superpowers.codeReader.showReviewTests', () => review.setTestsHidden(false)),
|
||||
commands.registerCommand('superpowers.codeReader.showAllFiles', () => review.exit()),
|
||||
commands.registerCommand('superpowers.codeReader.refreshUncommitted', () => uncommitted.reload()),
|
||||
commands.registerCommand('superpowers.codeReader.hideUncommittedTests', () => uncommitted.setTestsHidden(true)),
|
||||
commands.registerCommand('superpowers.codeReader.showUncommittedTests', () => uncommitted.setTestsHidden(false)),
|
||||
// 「更改」组文件行上的按钮传来的是这一行的节点
|
||||
commands.registerCommand('superpowers.codeReader.stage', (node?: FileNode) => uncommitted.stage(node)),
|
||||
commands.registerCommand('superpowers.codeReader.showAllFiles', () => filters.active?.exit()),
|
||||
// 目录行上的按钮传来的是这一行的节点;收藏栏标题栏上的按钮不带是哪一栏,所以每个栏位各一条命令
|
||||
commands.registerCommand('superpowers.codeReader.addFavorite', (node?: FileNode) => favorites.add(node)),
|
||||
...FAVORITE_SLOTS.flatMap(slot => [
|
||||
commands.registerCommand(favoriteCommand('rename', slot), () => favorites.rename(slot)),
|
||||
commands.registerCommand(favoriteCommand('remove', slot), () => favorites.remove(slot)),
|
||||
]),
|
||||
commands.registerCommand(OPEN_COMMAND, (uri: Uri) => openFile(uri, registry)),
|
||||
// 标题栏按钮传来的是 (文件 Uri, { groupId }),原样转给 VS Code 定位是哪一组的哪个标签
|
||||
commands.registerCommand('superpowers.codeReader.showPreview', (...args: unknown[]) => showPreview(previews, args)),
|
||||
|
||||
Reference in new issue
Block a user