Files
ai-diff-preview/src/render/statusBar.ts
T

102 lines
3.8 KiB
TypeScript
Raw Normal View History

/**
* 状态栏管理器 — 常驻显示
*
* 始终在左侧状态栏显示 AI Diff 状态:
* - 有 pending 变更: $(diff) AI Diff: N文件 M编辑 (黄色) — 点击打开文件列表
* - Diff 活跃: 右侧额外显示 Accept/Reject 按钮
* - 无变更: $(diff) AI Diff (暗色) — 点击打开文件列表
*/
import * as vscode from 'vscode';
import { ChangeSetManager } from '../snapshot/snapshotManager';
import { DiffViewer, DiffSession } from './diffViewer';
import { COMMANDS } from '../models/constants';
export class StatusBarManager {
/** ★ 常驻摘要按钮 */
private summaryItem: vscode.StatusBarItem;
/** Diff 模式 Accept 按钮(接受当前文件所有变更) */
private acceptBtn: vscode.StatusBarItem;
/** Diff 模式 Reject 按钮(拒绝当前文件所有变更) */
private rejectBtn: vscode.StatusBarItem;
constructor(
private changeSetManager: ChangeSetManager,
private diffViewer: DiffViewer
) {
// ★ 常驻摘要 — 始终显示
this.summaryItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100);
this.summaryItem.command = COMMANDS.SHOW_DIFF_PANEL;
this.summaryItem.text = '$(diff) AI Diff';
this.summaryItem.tooltip = 'AI Diff — 点击查看变更列表';
this.summaryItem.show();
// Accept 按钮(接受当前文件所有变更)
this.acceptBtn = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 100);
this.acceptBtn.command = 'aiDiffPreview.acceptAllFromDiff';
// Reject 按钮(拒绝当前文件所有变更)
this.rejectBtn = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 99);
this.rejectBtn.command = 'aiDiffPreview.rejectCurrentDiff';
}
enterDiffMode(_session: DiffSession): void {
this.acceptBtn.text = '$(check) Accept';
this.acceptBtn.backgroundColor = new vscode.ThemeColor('statusBarItem.warningBackground');
this.acceptBtn.tooltip = '接受此文件所有变更';
this.acceptBtn.show();
this.rejectBtn.text = '$(close) Reject';
this.rejectBtn.backgroundColor = new vscode.ThemeColor('statusBarItem.errorBackground');
this.rejectBtn.tooltip = '拒绝此文件所有变更';
this.rejectBtn.show();
}
exitDiffMode(): void {
this.acceptBtn.hide();
this.rejectBtn.hide();
}
/** ★ 常驻刷新 */
refresh(): void {
const session = this.diffViewer.getActiveSession();
if (session) {
this.enterDiffMode(session);
} else {
this.exitDiffMode();
}
const set = this.changeSetManager.getCurrentSet();
if (!set) {
// ★ 无变更集也常驻显示
this.summaryItem.text = '$(diff) AI Diff';
this.summaryItem.tooltip = 'AI Diff — 等待变更';
this.summaryItem.backgroundColor = undefined;
this.summaryItem.show();
return;
}
const pendingFiles = set.changes.filter(c => c.status === 'pending');
const totalEdits = pendingFiles.reduce(
(sum, c) => sum + c.edits.filter(e => e.status === 'pending').length, 0
);
if (pendingFiles.length === 0 && set.changes.length > 0) {
this.summaryItem.text = '$(diff) AI Diff: 已完成';
this.summaryItem.tooltip = '所有变更已处理';
this.summaryItem.backgroundColor = undefined;
} else if (pendingFiles.length > 0) {
this.summaryItem.text = `$(diff) AI Diff: ${pendingFiles.length}文件 ${totalEdits}编辑`;
this.summaryItem.tooltip = `点击查看变更列表\n${pendingFiles.map(c => `• ${c.filePath} (${c.edits.length}次)`).join('\n')}`;
this.summaryItem.backgroundColor = new vscode.ThemeColor('statusBarItem.warningBackground');
}
this.summaryItem.show();
}
dispose(): void {
this.summaryItem.dispose();
this.acceptBtn.dispose();
this.rejectBtn.dispose();
}
}