Skip to content

Commit 833b72b

Browse files
committed
feat: 优化SDK版本选择功能,添加单选按钮样式,保存SDK配置到.config文件
1 parent 4359912 commit 833b72b

File tree

4 files changed

+137
-53
lines changed

4 files changed

+137
-53
lines changed

src/vue/setting/view/sdk/index.less

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -114,28 +114,41 @@
114114
}
115115

116116
.sdk-versions {
117-
.el-radio-group {
118-
display: flex;
119-
flex-direction: column;
120-
gap: 12px;
121-
align-items: flex-start;
122-
}
117+
display: flex;
118+
flex-direction: column;
119+
gap: 12px;
123120

124-
.el-radio {
125-
margin-right: 0;
126-
margin-left: 0;
121+
.version-radio-item {
122+
display: flex;
123+
align-items: center;
124+
cursor: pointer;
125+
padding: 4px 8px;
126+
border-radius: 4px;
127+
transition: background-color 0.2s;
127128

128-
.el-radio__label {
129+
&:hover {
130+
background-color: #f5f7fa;
131+
}
132+
133+
input[type="radio"] {
134+
width: 16px;
135+
height: 16px;
136+
margin: 0;
137+
cursor: pointer;
138+
accent-color: #409eff;
139+
}
140+
141+
label {
142+
margin-left: 8px;
129143
font-size: 14px;
130144
color: #606266;
131-
padding-left: 10px;
145+
cursor: pointer;
146+
user-select: none;
132147
}
133148

134-
&.is-checked {
135-
.el-radio__label {
136-
color: #409eff;
137-
font-weight: 500;
138-
}
149+
input[type="radio"]:checked + label {
150+
color: #409eff;
151+
font-weight: 500;
139152
}
140153
}
141154
}

src/vue/setting/view/sdk/index.vue

Lines changed: 33 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,20 @@
2424
<template #default="props">
2525
<div class="sdk-expand-content">
2626
<div class="sdk-versions">
27-
<el-radio-group v-model="props.row.selectedVersion">
28-
<el-radio
29-
v-for="version in props.row.versions"
30-
:key="version"
31-
:label="version"
32-
@change="onVersionChange(props.row)"
33-
>
34-
{{ version }}
35-
</el-radio>
36-
</el-radio-group>
27+
<div
28+
v-for="version in props.row.versions"
29+
:key="version"
30+
class="version-radio-item"
31+
@click="handleRadioClick(props.row, version)"
32+
>
33+
<input
34+
type="radio"
35+
:name="`sdk-${props.row.name}`"
36+
:checked="props.row.selectedVersion === version"
37+
@click.stop
38+
/>
39+
<label>{{ version }}</label>
40+
</div>
3741
</div>
3842
</div>
3943
</template>
@@ -129,39 +133,34 @@ const expandAll = () => {
129133
isAllExpanded.value = !isAllExpanded.value;
130134
};
131135
132-
// 版本变更
133-
const onVersionChange = (row: SDKListItem) => {
134-
console.log(`SDK ${row.name} 版本变更为: ${row.selectedVersion}`);
135-
// 标记该SDK已被修改
136+
// 处理单选按钮点击
137+
const handleRadioClick = (row: SDKListItem, version: string) => {
136138
const sdk = sdkList.value.find(s => s.name === row.name);
137139
if (sdk) {
138-
sdk.selectedVersion = row.selectedVersion;
140+
// 如果点击的是已选中的版本,则取消选择
141+
if (sdk.selectedVersion === version) {
142+
sdk.selectedVersion = '';
143+
} else {
144+
// 否则选择新版本
145+
sdk.selectedVersion = version;
146+
}
147+
console.log(`SDK ${row.name} 版本变更为: ${sdk.selectedVersion || '未选择'}`);
139148
}
140149
};
141150
142151
// 应用更改
143152
const applyChanges = () => {
144-
// 收集有变更的SDK配置信息
145-
const changedSDKs = sdkList.value.filter(sdk => {
146-
// 已安装但版本变更,或未安装但选择了版本
147-
return (sdk.installed && sdk.selectedVersion !== sdk.installedVersion) ||
148-
(!sdk.installed && sdk.selectedVersion);
149-
});
150-
151-
if (changedSDKs.length === 0) {
152-
showMessage('没有需要应用的更改');
153-
return;
154-
}
155-
156-
// 发送配置到后端
157-
const configs = changedSDKs.map(sdk => ({
153+
// 收集所有SDK的配置信息
154+
const sdkConfigs = sdkList.value.map(sdk => ({
158155
name: sdk.name,
159-
version: sdk.selectedVersion,
160-
install: !!sdk.selectedVersion
156+
version: sdk.selectedVersion || '',
157+
selected: !!sdk.selectedVersion,
158+
path: sdk.path || ''
161159
}));
162160
163-
sendCommand('applySDKConfig', configs);
164-
showMessage(`正在应用 ${changedSDKs.length} 个SDK的更改...`);
161+
// 发送配置到后端保存到.config文件
162+
sendCommand('saveSDKDotConfig', [sdkConfigs]);
163+
showMessage('正在保存SDK配置...');
165164
};
166165
167166
// 组件挂载时获取SDK列表
@@ -189,9 +188,7 @@ onMounted(() => {
189188
break;
190189
case 'sdkConfigApplied':
191190
// SDK配置应用成功
192-
showMessage('SDK 配置已成功应用');
193-
// 重新加载SDK列表
194-
sendCommand('getSDKList');
191+
showMessage('SDK 配置已保存到 .config 文件');
195192
break;
196193
case 'sdkConfigError':
197194
// SDK配置应用失败

src/webviews/setting.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ export function openSettingWebview(context: vscode.ExtensionContext) {
8888
panel.webview.postMessage({ command: 'envStatus', status: envStatus });
8989
});
9090

91+
// 初始化时发送SDK配置
92+
if (extensionInfo.SDKConfig) {
93+
panel.webview.postMessage({ command: 'setSDKConfig', data: extensionInfo.SDKConfig });
94+
}
95+
9196
// read out/${name}/index.html
9297
const indexHtmlPath = vscode.Uri.file(context.asAbsolutePath(`out/${name}/index.html`));
9398
const htmlFolder = vscode.Uri.file(context.asAbsolutePath(`out`));
@@ -101,6 +106,16 @@ export function openSettingWebview(context: vscode.ExtensionContext) {
101106

102107
return `"${panel.webview.asWebviewUri(vscode.Uri.file(absPath)).toString()}"`;
103108
});
109+
110+
// 在HTML设置完成后延迟发送初始数据
111+
setTimeout(() => {
112+
// 发送SDK配置
113+
if (extensionInfo.SDKConfig) {
114+
panel.webview.postMessage({ command: 'setSDKConfig', data: extensionInfo.SDKConfig });
115+
}
116+
// 发送扩展信息
117+
panel.webview.postMessage({command: 'extensionInfo', data: extensionInfo});
118+
}, 100);
104119
});
105120
panel.webview.onDidReceiveMessage(async (message) => {
106121
// 先尝试使用SDK处理器处理消息
@@ -139,12 +154,14 @@ export function openSettingWebview(context: vscode.ExtensionContext) {
139154
case 'getSDkConfig':
140155
data = readJsonObject(sdkCfgFn);
141156
if (data) {
142-
panel.webview.postMessage({command: 'setConfig', data: data});
157+
panel.webview.postMessage({command: 'setSDKConfig', data: data});
143158
}
144159
return ;
145160
case 'setSDKConfig':
146161
data = message.args[0];
147162
writeJsonObject(message.args[0], sdkCfgFn);
163+
// 更新内存中的配置
164+
extensionInfo.SDKConfig = data;
148165

149166
vscode.window.showInformationMessage('保存工具链配置成功');
150167
return ;

src/webviews/settings_sdk.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,40 @@ function removeConfigLine(content: string, key: string): string {
240240
return content.replace(regex, '');
241241
}
242242

243+
// 保存完整的SDK配置到.config文件
244+
export async function saveSDKDotConfig(configs: Array<{ name: string; version: string; selected: boolean; path: string }>): Promise<void> {
245+
const configPath = getConfigPath();
246+
let content = 'CONFIG_TARGET_FILE=""\n';
247+
248+
// 生成所有SDK的配置
249+
for (const config of configs) {
250+
const upperName = config.name.replace(/-/g, '_').toUpperCase();
251+
const usingKey = `CONFIG_PKG_USING_${upperName}`;
252+
253+
if (config.selected && config.version) {
254+
// SDK已选择
255+
content += `${usingKey}=y\n`;
256+
content += `CONFIG_PKG_${upperName}_VER="${config.version}"\n`;
257+
258+
// 设置路径
259+
const sdkPath = config.path || path.join('sdk', config.name, config.version);
260+
content += `CONFIG_PKG_${upperName}_PATH="${sdkPath}"\n`;
261+
} else {
262+
// SDK未选择
263+
content += `# ${usingKey} is not set\n`;
264+
}
265+
}
266+
267+
// 确保目录存在
268+
const configDir = path.dirname(configPath);
269+
if (!fs.existsSync(configDir)) {
270+
fs.mkdirSync(configDir, { recursive: true });
271+
}
272+
273+
// 写入配置文件
274+
fs.writeFileSync(configPath, content, 'utf8');
275+
}
276+
243277
// 处理SDK相关消息
244278
export function handleSDKMessage(webview: vscode.Webview, message: any): boolean {
245279
switch (message.command) {
@@ -258,6 +292,29 @@ export function handleSDKMessage(webview: vscode.Webview, message: any): boolean
258292
});
259293
return true;
260294

295+
case 'saveSDKDotConfig':
296+
if (message.args && message.args[0] && Array.isArray(message.args[0])) {
297+
saveSDKDotConfig(message.args[0]).then(() => {
298+
webview.postMessage({
299+
command: 'sdkConfigApplied'
300+
});
301+
vscode.window.showInformationMessage('SDK配置已保存到 .config 文件');
302+
}).catch(error => {
303+
console.error('Failed to save SDK config:', error);
304+
webview.postMessage({
305+
command: 'sdkConfigError',
306+
error: '保存SDK配置失败'
307+
});
308+
});
309+
} else {
310+
console.error('Invalid data format for saveSDKDotConfig:', message);
311+
webview.postMessage({
312+
command: 'sdkConfigError',
313+
error: 'SDK配置数据格式错误'
314+
});
315+
}
316+
return true;
317+
261318
case 'applySDKConfig':
262319
if (message.data && Array.isArray(message.data)) {
263320
updateSDKConfig(message.data).then(() => {

0 commit comments

Comments
 (0)