From 45934baf0accce7ba320874c74de0750e17e95f5 Mon Sep 17 00:00:00 2001 From: Roe-xin Date: Fri, 6 Mar 2026 10:13:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E6=96=87=E9=A1=B9=E7=82=B9=E5=87=BB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 文件类型可点击打开文件 - 代码片段可点击打开文件并选中对应代码 - 文件夹类型不可点击 --- src/panels/ICHelperPanel.ts | 21 +++++++++++++++++++++ src/views/contextDisplay.ts | 34 +++++++++++++++++++++++++++++++--- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/panels/ICHelperPanel.ts b/src/panels/ICHelperPanel.ts index fade7a0..871a987 100644 --- a/src/panels/ICHelperPanel.ts +++ b/src/panels/ICHelperPanel.ts @@ -494,6 +494,27 @@ export async function showICHelperPanel( // 退出登录 vscode.commands.executeCommand("ic-coder.logout"); break; + case "openFile": + // 打开文件 + if (message.filePath) { + vscode.workspace.openTextDocument(message.filePath).then(doc => { + vscode.window.showTextDocument(doc); + }); + } + break; + case "openFileWithSelection": + // 打开文件并选中代码 + if (message.filePath) { + vscode.workspace.openTextDocument(message.filePath).then(doc => { + vscode.window.showTextDocument(doc).then(editor => { + const start = new vscode.Position(message.startLine - 1, 0); + const end = new vscode.Position(message.endLine - 1, doc.lineAt(message.endLine - 1).text.length); + editor.selection = new vscode.Selection(start, end); + editor.revealRange(new vscode.Range(start, end)); + }); + }); + } + break; case "acceptChange": // 采纳变更 if (message.changeId) { diff --git a/src/views/contextDisplay.ts b/src/views/contextDisplay.ts index 98fd2b3..32f9422 100644 --- a/src/views/contextDisplay.ts +++ b/src/views/contextDisplay.ts @@ -51,7 +51,11 @@ export function getContextDisplayStyles(): string { transition: all 0.2s ease; } - .context-item:hover { + .context-item.clickable { + cursor: pointer; + } + + .context-item.clickable:hover { background: var(--vscode-list-hoverBackground); } @@ -180,11 +184,14 @@ export function getContextDisplayScript(): string { case 'code': icon = getCodeIcon(); break; } + const clickable = item.type !== 'folder' ? 'clickable' : ''; + const onclick = item.type !== 'folder' ? \`onclick="window.handleContextItemClick(\${item.id})"\` : ''; + return \` -
+
\${icon} \${item.displayPath || getFileName(item.path)} - + \${getRemoveIcon()}
@@ -192,6 +199,27 @@ export function getContextDisplayScript(): string { }).join(''); } + // 全局访问函数 + window.handleContextItemClick = function(id) { + const item = contextItems.find(i => i.id === id); + if (!item || item.type === 'folder') return; + + if (item.type === 'code') { + const codeData = JSON.parse(item.path); + vscode.postMessage({ + command: 'openFileWithSelection', + filePath: codeData.fileName, + startLine: codeData.startLine, + endLine: codeData.endLine + }); + } else { + vscode.postMessage({ + command: 'openFile', + filePath: item.path + }); + } + }; + // 处理后端返回的文件选择结果 window.addEventListener('message', event => { const message = event.data;