From f2382a8eed1ac4cb5026083cdede7ccf348d0d2d Mon Sep 17 00:00:00 2001 From: Roe-xin Date: Tue, 16 Dec 2025 16:58:35 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=E5=AE=9E=E7=8E=B0=E6=B3=A2=E5=BD=A2?= =?UTF-8?q?=E9=A2=84=E8=A7=88=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/波形预览功能技术文档.md | 444 ++++++++++++++++++++++++++++ src/panels/ICHelperPanel.ts | 182 ++++++++++++ src/utils/messageHandler.ts | 24 +- src/views/waveformPreviewContent.ts | 350 ++++++++++++++++++++++ src/views/webviewContent.ts | 28 ++ 5 files changed, 1020 insertions(+), 8 deletions(-) create mode 100644 docs/波形预览功能技术文档.md create mode 100644 src/views/waveformPreviewContent.ts diff --git a/docs/波形预览功能技术文档.md b/docs/波形预览功能技术文档.md new file mode 100644 index 0000000..3102c62 --- /dev/null +++ b/docs/波形预览功能技术文档.md @@ -0,0 +1,444 @@ +# 波形预览功能技术文档 + +## 功能概述 + +在对话界面中显示 VCD 波形文件的预览卡片,用户可以查看前几个信号的真实波形,并通过"展开查看"按钮打开完整的波形查看器。 + +## 功能流程 + +``` +用户输入"生成VCD"命令 + ↓ +系统执行 iverilog 编译和仿真 + ↓ +生成 VCD 文件 + ↓ +在对话界面显示波形预览卡片 + ├─ 显示真实的波形图(前3个信号) + ├─ 显示信号名称和波形 + └─ "展开查看"按钮 + ↓ +点击"展开查看"按钮 + ↓ +打开完整的 VCDViewerPanel 波形查看器 +``` + +## 文件结构 + +### 1. `src/views/waveformPreviewContent.ts` +**功能:** 波形预览组件的独立模块 + +**导出函数:** +- `getWaveformPreviewContent()` - 返回波形预览组件的 CSS 样式 +- `getWaveformPreviewScript()` - 返回波形预览组件的 JavaScript 代码 + +**主要功能:** +- 创建波形预览卡片的 HTML 结构 +- 从 VCD 文件中提取真实信号数据 +- 使用 SVG 绘制波形图 + - 单比特信号:绘制数字波形(高/低电平) + - 多比特信号:绘制总线波形(梯形) +- 处理"展开查看"按钮点击事件 + +**关键函数:** +```javascript +createWaveformPreview(vcdFilePath, fileName) + - 创建波形预览卡片的 DOM 结构 + - 包含头部(标题 + 展开按钮)和内容区域 + +loadMiniWaveform(containerId, vcdFilePath, loadingDiv) + - 请求后端获取 VCD 文件信息 + +renderWaveformInfo(containerId, vcdInfo) + - 接收 VCD 信息并渲染波形 + +drawRealWaveform(signals) + - 根据真实信号数据绘制 SVG 波形图 + - 支持单比特和多比特信号 + - 使用不同颜色区分信号 + +openFullWaveform(vcdFilePath) + - 发送消息打开完整波形查看器 + +addWaveformPreviewToMessage(messageDiv, vcdFilePath, fileName) + - 将波形预览组件添加到消息中 +``` + +--- + +### 2. `src/views/webviewContent.ts` +**功能:** 主 WebView 页面,集成波形预览组件 + +**修改内容:** +- 导入波形预览组件的样式和脚本 +- 在 ` + ${getConversationHistoryBarContent()}
IC Coder @@ -553,35 +571,7 @@ export function getWebviewContent(iconUri?: string): string {
-
-

📁 文件读取

-
- - -
-
- 文件内容将在这里显示... -
- -
- -
-

✏️ 编辑文件:

- -
- - -
-
-
-
- 👋 你好!我是 IC Coder 助手,可以帮你生成代码、回答问题。 -
-
+
@@ -823,10 +813,20 @@ export function getWebviewContent(iconUri?: string): string { div.appendChild(actionsDiv); } else { div.textContent = text; + // 当添加用户消息时,隐藏 header + hideHeaderIfNeeded(); } messagesEl.appendChild(div); messagesEl.scrollTop = messagesEl.scrollHeight; + + // 添加消息后检查 header 显示状态 + checkHeaderVisibility(); + } + + // 检查是否需要隐藏 header + function hideHeaderIfNeeded() { + checkHeaderVisibility(); } function copyMessage(text, button) { @@ -995,6 +995,32 @@ export function getWebviewContent(iconUri?: string): string { renderWaveformInfo(message.containerId, message.vcdInfo); } break; + case 'conversationHistory': + // 接收到会话历史数据 + if (message.history) { + renderConversationHistory(message.history); + } + break; + case 'conversationLoaded': + // 会话加载成功,清空当前消息并显示历史消息 + messagesEl.innerHTML = ''; + if (message.messages && message.messages.length > 0) { + message.messages.forEach(msg => { + addMessage(msg.text, msg.sender); + }); + } + currentConversationId = message.conversationId; + break; + case 'newConversationCreated': + // 新会话创建成功,清空消息区域 + messagesEl.innerHTML = ''; + currentConversationId = message.conversationId; + // 显示 header + const header = document.querySelector('.header'); + if (header) { + header.classList.remove('hidden'); + } + break; } }); @@ -1017,9 +1043,24 @@ export function getWebviewContent(iconUri?: string): string { // 初始化时调整一次高度 autoResizeTextarea(); + // 初始化时检查是否需要显示 header + checkHeaderVisibility(); + messageInput.focus(); + // 检查 header 显示状态 + function checkHeaderVisibility() { + const allMessages = messagesEl.querySelectorAll('.message'); + const header = document.querySelector('.header'); + if (allMessages.length > 0 && header) { + header.classList.add('hidden'); + } else if (header) { + header.classList.remove('hidden'); + } + } + ${getWaveformPreviewScript()} + ${getConversationHistoryBarScript()} `; From b0e199589705b8a89a9732b155909dcf1b6c2d70 Mon Sep 17 00:00:00 2001 From: Roe-xin Date: Wed, 17 Dec 2025 10:03:43 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=E4=BC=98=E5=8C=96=E5=B0=8F=E7=BB=86?= =?UTF-8?q?=E8=8A=82=E8=BE=93=E5=85=A5=E6=A1=86=E7=9A=84=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/webviewContent.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/views/webviewContent.ts b/src/views/webviewContent.ts index 271f4d0..3674dbe 100644 --- a/src/views/webviewContent.ts +++ b/src/views/webviewContent.ts @@ -195,6 +195,7 @@ export function getWebviewContent(iconUri?: string): string { align-items: center; justify-content: space-between; gap: 10px; + margin-bottom: -17px; } .mode-selector { display: flex; @@ -208,12 +209,13 @@ export function getWebviewContent(iconUri?: string): string { } .mode-selector select { padding: 2px 4px; - background: transparent; + background: var(--vscode-input-background); color: var(--vscode-foreground); border: none; cursor: pointer; font-size: 12px; outline: none; + border-radius: 4px; } .mode-selector select:hover { background: var(--vscode-list-hoverBackground);