-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathApp.vue
More file actions
167 lines (153 loc) · 5.97 KB
/
App.vue
File metadata and controls
167 lines (153 loc) · 5.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
<template>
<div class="rt-page create-project-page">
<Banner sub-title="创建项目" />
<div class="rt-page__content rt-stack">
<div class="rt-card create-project-card">
<el-form :model="projectInfo" label-width="120">
<el-form-item label="工程名称">
<div class="create-project-row create-project-row--name">
<el-input v-model="projectInfo.name" :placeholder="'请输入工程名称'" />
</div>
</el-form-item>
<el-form-item label="空间路径">
<div class="create-project-row create-project-row--path">
<el-input v-model="projectInfo.folder" :placeholder="'请输入路径'" />
<el-button type="primary" plain @click="getProjectFolderFunction">浏览</el-button>
</div>
</el-form-item>
<el-form-item label="RT-Thread 基线">
<div class="create-project-row create-project-row--baseline">
<el-select class="create-project-select" v-model="projectInfo.manufacturer" :placeholder="'请选择'" @change="vendorChanged">
<el-option
v-for="item in projectInfo.projectList"
:key="item.manufacturer"
:label="item.manufacturer"
:value="item.manufacturer"
/>
</el-select>
<el-select class="create-project-select" v-model="projectInfo.board" :placeholder="'请选择'" @change="boardChanged">
<el-option
v-for="item in projectInfo.projectList[vendorIndex].boards"
:key="typeof item === 'string' ? item : item.board"
:label="typeof item === 'string' ? item : item.name"
:value="typeof item === 'string' ? item : item.board"
/>
</el-select>
<el-button type="primary" plain @click="createProject">创建</el-button>
</div>
</el-form-item>
<el-form-item>
<div class="create-project-row">
<el-checkbox class="create-project-checkbox" v-model="projectInfo.linkRTT" disabled>链接RT-Thread</el-checkbox>
<el-checkbox class="create-project-checkbox" v-model="projectInfo.linkDriver" disabled>链接驱动</el-checkbox>
</div>
</el-form-item>
</el-form>
</div>
<div class="rt-card create-project-note">
<h3 class="rt-section-title">创建工程说明</h3>
<p>请在工程名称中填写名称,它会在工程空间路径中创建这样名称的目录放置新创建的工程。</p>
<p class="create-project-warning">⚠️ 请确保空间路径 + 工程名称的路径不存在;否则创建检查失败。</p>
<div v-if="selectedBoardDescription" class="create-project-board-info">
<h4 class="rt-subsection-title">选中的板卡信息</h4>
<p>{{ selectedBoardDescription }}</p>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { computed, onMounted } from 'vue';
import { projectInfo, extensionInfo, envInfo } from './data';
import { sendCommand, sendCommandData } from '../api/vscode';
import Banner from '../components/Banner.vue';
import { useTheme } from '../composables/useTheme';
useTheme();
onMounted(() => {
sendCommand('getExtensionInfo');
window.addEventListener('message', event => {
const message = event.data;
switch (message.command) {
case 'extensionInfo':
extensionInfo.value.version = message.data.version;
projectInfo.value.projectList = message.data.projectList;
envInfo.value.version = message.data.env.version;
envInfo.value.path = message.data.env.path;
if (message.data.configInfo && message.data.configInfo.length > 0) {
envInfo.value.rtConfig.path = message.data.configInfo[0].path || '';
}
break;
case 'setProjectFolder':
projectInfo.value.folder = message.data;
break;
default:
break;
}
});
});
const vendorIndex = computed(() => {
let current = 0;
projectInfo.value.projectList.filter((item: any, index: number) => {
if (item.manufacturer === projectInfo.value.manufacturer) {
current = index;
}
});
return current;
});
const selectedBoardDescription = computed(() => {
if (!projectInfo.value.board || !projectInfo.value.projectList || projectInfo.value.projectList.length === 0) {
return '';
}
const currentVendor = projectInfo.value.projectList[vendorIndex.value];
if (!currentVendor || !currentVendor.boards) {
return '';
}
const board = currentVendor.boards.find((b: any) => {
if (typeof b === 'string') {
return b === projectInfo.value.board;
} else {
return b.board === projectInfo.value.board;
}
});
if (board && typeof board === 'object' && board.description) {
return board.description;
}
return '';
});
const vendorChanged = () => {
let current = -1;
projectInfo.value.projectList.filter((item: any, index: number) => {
if (item.manufacturer === projectInfo.value.manufacturer) {
current = index;
}
});
if (current === -1) {
projectInfo.value.board = '';
} else {
const boards = projectInfo.value.projectList[current].boards;
if (boards && boards.length > 0) {
projectInfo.value.board = typeof boards[0] === 'string' ? boards[0] : boards[0].board;
}
}
};
const getProjectFolderFunction = () => {
sendCommandData('browseProjectFolder', projectInfo.value.folder);
};
const boardChanged = () => {
// reserved for future behaviour
};
const createProject = () => {
const project = {
name: projectInfo.value.name,
folder: projectInfo.value.folder,
board: projectInfo.value.board,
manufacturer: projectInfo.value.manufacturer,
linkRTT: projectInfo.value.linkRTT,
linkDriver: projectInfo.value.linkDriver,
};
sendCommand('createProject', [project]);
};
</script>
<style scoped lang="less">
@import './index.less';
</style>