+
+
+
+
创建个人规则
+
-
- 这些规则会在生成代码时应用
+
+
+
-
-
-
Verilog 规则
-
-
-
- 这些规则会在生成 Verilog 代码时应用
-
-
-
-
-
-
-
-
`;
}
@@ -85,11 +63,144 @@ export function getRulesSettingsComponentStyles(): string {
max-width: 700px;
}
- .rules-textarea-container {
- margin-top: 8px;
+ .rules-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 16px;
}
- .rules-textarea {
+ .add-rule-button {
+ padding: 6px 12px;
+ background: var(--vscode-button-background);
+ color: var(--vscode-button-foreground);
+ border: none;
+ border-radius: 4px;
+ cursor: pointer;
+ font-size: 13px;
+ }
+
+ .add-rule-button:hover {
+ background: var(--vscode-button-hoverBackground);
+ }
+
+ .rules-list {
+ margin-top: 16px;
+ }
+
+ .rule-item {
+ background: var(--vscode-editor-background);
+ border: 1px solid var(--vscode-input-border);
+ border-radius: 4px;
+ padding: 12px;
+ margin-bottom: 8px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ position: relative;
+ }
+
+ .rule-item-name {
+ color: var(--vscode-foreground);
+ font-size: 13px;
+ }
+
+ .rule-item > div:first-child svg {
+ background-color: rgba(148, 204, 241, 0.3);
+ border-radius: 4px;
+ padding: 4px;
+ }
+
+ .rule-item-menu {
+ position: relative;
+ }
+
+ .rule-menu-icon {
+ width: 20px;
+ height: 20px;
+ cursor: pointer;
+ padding: 4px;
+ border-radius: 3px;
+ }
+
+ .rule-menu-icon:hover {
+ background: var(--vscode-toolbar-hoverBackground);
+ }
+
+ .rule-dropdown {
+ position: absolute;
+ right: 0;
+ top: 28px;
+ background: var(--vscode-menu-background);
+ border: 1px solid var(--vscode-menu-border);
+ border-radius: 4px;
+ box-shadow: 0 2px 8px rgba(0,0,0,0.3);
+ z-index: 100;
+ min-width: 100px;
+ }
+
+ .rule-dropdown button {
+ display: block;
+ width: 100%;
+ padding: 8px 12px;
+ background: transparent;
+ color: var(--vscode-menu-foreground);
+ border: none;
+ text-align: left;
+ cursor: pointer;
+ font-size: 13px;
+ }
+
+ .rule-dropdown button:hover {
+ background: var(--vscode-menu-selectionBackground);
+ color: var(--vscode-menu-selectionForeground);
+ }
+
+ .rule-modal {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0.5);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 1000;
+ }
+
+ .rule-modal-content {
+ background: var(--vscode-editor-background);
+ border: 1px solid var(--vscode-input-border);
+ border-radius: 6px;
+ padding: 20px;
+ width: 500px;
+ max-width: 90%;
+ }
+
+ .rule-modal-content h4 {
+ margin: 0 0 16px 0;
+ color: var(--vscode-foreground);
+ }
+
+ .rule-name-input {
+ width: 100%;
+ padding: 8px;
+ background: var(--vscode-input-background);
+ color: var(--vscode-input-foreground);
+ border: 1px solid var(--vscode-input-border);
+ border-radius: 4px;
+ font-size: 13px;
+ margin-bottom: 12px;
+ box-sizing: border-box;
+ }
+
+ .rule-name-input:focus {
+ outline: none;
+ border-color: var(--vscode-focusBorder);
+ }
+
+ .rule-textarea {
width: 100%;
padding: 12px;
background: var(--vscode-input-background);
@@ -98,26 +209,20 @@ export function getRulesSettingsComponentStyles(): string {
border-radius: 4px;
font-size: 13px;
font-family: var(--vscode-editor-font-family);
- line-height: 1.5;
resize: vertical;
outline: none;
box-sizing: border-box;
}
- .rules-textarea:focus {
+ .rule-textarea:focus {
border-color: var(--vscode-focusBorder);
}
- .rules-textarea::placeholder {
- color: var(--vscode-input-placeholderForeground);
- opacity: 0.6;
- }
-
- .rules-textarea-hint {
- margin-top: 8px;
- font-size: 12px;
- color: var(--vscode-descriptionForeground);
- font-style: italic;
+ .rule-modal-actions {
+ display: flex;
+ gap: 8px;
+ margin-top: 16px;
+ justify-content: flex-end;
}
`;
}
@@ -127,51 +232,143 @@ export function getRulesSettingsComponentStyles(): string {
*/
export function getRulesSettingsComponentScript(): string {
return `
- // 保存规则设置
- function saveRulesSettings() {
- const settings = {
- enableCustomRules: document.getElementById('enableCustomRulesCheckbox').checked,
- systemRules: document.getElementById('systemRulesTextarea').value,
- codeRules: document.getElementById('codeRulesTextarea').value,
- verilogRules: document.getElementById('verilogRulesTextarea').value,
- };
+ let currentRules = [];
+ let editingRule = null;
- // 发送消息到扩展
+ // 显示添加规则弹窗
+ function showAddRuleModal() {
+ editingRule = null;
+ document.getElementById('modalTitle').textContent = '创建个人规则';
+ document.getElementById('ruleNameInput').value = '';
+ document.getElementById('ruleTextarea').value = '';
+ document.getElementById('ruleModal').style.display = 'flex';
+ }
+
+ // 关闭弹窗
+ function closeRuleModal() {
+ document.getElementById('ruleModal').style.display = 'none';
+ closeAllDropdowns();
+ }
+
+ // 切换下拉菜单
+ function toggleDropdown(filename, event) {
+ event.stopPropagation();
+ closeAllDropdowns();
+ const dropdown = document.getElementById('dropdown-' + filename);
+ if (dropdown) {
+ dropdown.style.display = dropdown.style.display === 'block' ? 'none' : 'block';
+ }
+ }
+
+ // 关闭所有下拉菜单
+ function closeAllDropdowns() {
+ document.querySelectorAll('.rule-dropdown').forEach(d => d.style.display = 'none');
+ }
+
+ // 点击页面其他地方关闭下拉菜单
+ document.addEventListener('click', closeAllDropdowns);
+
+ // 编辑规则
+ function editRule(filename) {
+ const rule = currentRules.find(r => r.filename === filename);
+ if (rule) {
+ editingRule = rule;
+ document.getElementById('modalTitle').textContent = '修改个人规则';
+ document.getElementById('ruleNameInput').value = rule.name;
+ document.getElementById('ruleTextarea').value = rule.content;
+ document.getElementById('ruleModal').style.display = 'flex';
+ }
+ }
+
+ // 保存规则
+ function saveRule() {
+ const name = document.getElementById('ruleNameInput').value.trim();
+ const content = document.getElementById('ruleTextarea').value.trim();
+
+ if (!name) {
+ alert('规则名称不能为空');
+ return;
+ }
+ if (!content) {
+ alert('规则内容不能为空');
+ return;
+ }
+
+ const enabled = document.getElementById('enablePersonalRulesCheckbox').checked;
+
+ if (editingRule) {
+ vscode.postMessage({
+ command: 'updatePersonalRule',
+ filename: editingRule.filename,
+ name: name,
+ content: content,
+ enabled: enabled
+ });
+ } else {
+ vscode.postMessage({
+ command: 'savePersonalRule',
+ name: name,
+ content: content,
+ enabled: enabled
+ });
+ }
+
+ closeRuleModal();
+ }
+
+ // 删除规则
+ function deleteRule(filename) {
+ closeAllDropdowns();
vscode.postMessage({
- command: 'saveRulesSettings',
- settings: settings
+ command: 'deletePersonalRule',
+ filename: filename
});
-
- // 显示保存成功提示
- console.log('规则设置已保存', settings);
}
- // 重置规则设置
- function resetRulesSettings() {
- document.getElementById('enableCustomRulesCheckbox').checked = true;
- document.getElementById('systemRulesTextarea').value = '';
- document.getElementById('codeRulesTextarea').value = '';
- document.getElementById('verilogRulesTextarea').value = '';
+ // 渲染规则列表
+ function renderRulesList(rules) {
+ currentRules = rules || [];
+ const listEl = document.getElementById('rulesList');
- console.log('规则设置已重置为默认值');
+ if (currentRules.length === 0) {
+ listEl.innerHTML = '
暂无规则,点击"+ 创建"添加
';
+ return;
+ }
+
+ const peopleRulesIcon = '${peopleRules}';
+
+ listEl.innerHTML = currentRules.map(rule => \`
+
+
+ \${peopleRulesIcon}
+
\${rule.filename}
+
+
+
+ \`).join('');
}
- // 加载规则设置
- function loadRulesSettings(settings) {
- if (!settings) return;
-
- if (settings.enableCustomRules !== undefined) {
- document.getElementById('enableCustomRulesCheckbox').checked = settings.enableCustomRules;
+ // 加载规则列表
+ function loadPersonalRules(data) {
+ if (data && data.enabled !== undefined) {
+ document.getElementById('enablePersonalRulesCheckbox').checked = data.enabled;
}
- if (settings.systemRules) {
- document.getElementById('systemRulesTextarea').value = settings.systemRules;
- }
- if (settings.codeRules) {
- document.getElementById('codeRulesTextarea').value = settings.codeRules;
- }
- if (settings.verilogRules) {
- document.getElementById('verilogRulesTextarea').value = settings.verilogRules;
+ if (data && data.rules) {
+ renderRulesList(data.rules);
}
}
+
+ // 页面加载时请求规则数据
+ vscode.postMessage({ command: 'loadPersonalRules' });
`;
}
diff --git a/src/views/webviewContent.ts b/src/views/webviewContent.ts
index 2a36bb5..05c4ac3 100644
--- a/src/views/webviewContent.ts
+++ b/src/views/webviewContent.ts
@@ -715,6 +715,13 @@ export function getWebviewContent(
}
break;
+ case 'personalRulesLoaded':
+ // 加载个人规则数据
+ if (typeof loadPersonalRules === 'function') {
+ loadPersonalRules(message.data);
+ }
+ break;
+
case 'autoSendMessage':
// 自动发送待发送的消息(登录后)
console.log('[WebView] 自动发送待发送消息:', message.text);