|
|
@@ -26,8 +26,8 @@
|
|
|
spellcheck="false"
|
|
|
></el-input>
|
|
|
</el-form-item>
|
|
|
- <el-form-item :label="$t('projectPath')" prop="path" required>
|
|
|
- <el-input v-model="formData.path" readonly>
|
|
|
+ <el-form-item :label="$t('projectPath')" prop="path">
|
|
|
+ <el-input spellcheck="false" v-model="formData.path">
|
|
|
<template #append>
|
|
|
<el-button @click="selectPath('path')" :disabled="mode === 'edit'"
|
|
|
><LuFolder :size="16" :disabled="mode === 'edit'"
|
|
|
@@ -35,8 +35,8 @@
|
|
|
</template>
|
|
|
</el-input>
|
|
|
</el-form-item>
|
|
|
- <el-form-item :label="$t('codePath')" prop="codePath" required>
|
|
|
- <el-input v-model="formData.codePath" readonly>
|
|
|
+ <el-form-item :label="$t('codePath')" prop="codePath">
|
|
|
+ <el-input spellcheck="false" v-model="formData.codePath">
|
|
|
<template #append>
|
|
|
<el-button @click="selectPath('codePath')"
|
|
|
><LuFolder :size="16" :disabled="mode === 'edit'"
|
|
|
@@ -44,7 +44,7 @@
|
|
|
</template>
|
|
|
</el-input>
|
|
|
</el-form-item>
|
|
|
- <el-form-item :label="$t('projectType')" prop="type" required>
|
|
|
+ <el-form-item :label="$t('projectType')" prop="type">
|
|
|
<el-select v-model="formData.type" @change="handlChangeType">
|
|
|
<el-option
|
|
|
v-for="item in typeOptions"
|
|
|
@@ -59,7 +59,7 @@
|
|
|
<template v-if="formData.type === 'chip'">
|
|
|
<el-row :gutter="12">
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item :label="$t('chipModel')" prop="chip.model" required>
|
|
|
+ <el-form-item :label="$t('chipModel')" prop="chip.model">
|
|
|
<el-select v-model="formData.chip.model" @change="handleSelectChip">
|
|
|
<el-option
|
|
|
v-for="item in chipOptions"
|
|
|
@@ -71,7 +71,7 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item :label="$t('flashSize')" prop="chip.flash_size.capacity" required>
|
|
|
+ <el-form-item :label="$t('flashSize')" prop="chip.flash_size.capacity">
|
|
|
<el-autocomplete
|
|
|
size="small"
|
|
|
style="width: 100%"
|
|
|
@@ -143,8 +143,8 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item :label="$t('interfaceType')">
|
|
|
- <el-select v-model="item.interface" prop="interface" required>
|
|
|
+ <el-form-item :label="$t('interfaceType')" :prop="`screens.${index}.interface`">
|
|
|
+ <el-select v-model="item.interface">
|
|
|
<el-option
|
|
|
v-for="item in getScreenOptions('interface')?.[index] || []"
|
|
|
:label="item"
|
|
|
@@ -154,7 +154,7 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item :label="$t('colorFormat')">
|
|
|
+ <el-form-item :label="$t('colorFormat')" :prop="`screens.${index}.colorFormat`">
|
|
|
<el-select v-model="item.colorFormat">
|
|
|
<el-option
|
|
|
v-for="item in getScreenOptions('color_format')?.[index] || []"
|
|
|
@@ -165,7 +165,7 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item :label="$t('colorDepth')">
|
|
|
+ <el-form-item :label="$t('colorDepth')" :prop="`screens.${index}.colorDepth`">
|
|
|
<el-select v-model="item.colorDepth">
|
|
|
<el-option
|
|
|
v-for="item in getScreenOptions('color_depth')?.[index] || []"
|
|
|
@@ -176,7 +176,7 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="PCLK">
|
|
|
+ <el-form-item label="PCLK" :prop="`screens.${index}.params.PCLK`">
|
|
|
<el-input-number
|
|
|
controls-position="right"
|
|
|
style="width: 100%"
|
|
|
@@ -185,7 +185,7 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="VBP">
|
|
|
+ <el-form-item label="VBP" :prop="`screens.${index}.params.VBP`">
|
|
|
<el-input-number
|
|
|
controls-position="right"
|
|
|
style="width: 100%"
|
|
|
@@ -194,7 +194,7 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="VFP">
|
|
|
+ <el-form-item label="VFP" :prop="`screens.${index}.params.VFP`">
|
|
|
<el-input-number
|
|
|
controls-position="right"
|
|
|
style="width: 100%"
|
|
|
@@ -203,7 +203,7 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="HFP">
|
|
|
+ <el-form-item label="HFP" :prop="`screens.${index}.params.HFP`">
|
|
|
<el-input-number
|
|
|
controls-position="right"
|
|
|
style="width: 100%"
|
|
|
@@ -212,7 +212,7 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="HSYNC">
|
|
|
+ <el-form-item label="HSYNC" :prop="`screens.${index}.params.HSYNC`">
|
|
|
<el-input-number
|
|
|
controls-position="right"
|
|
|
style="width: 100%"
|
|
|
@@ -221,7 +221,7 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="VSYNC">
|
|
|
+ <el-form-item label="VSYNC" :prop="`screens.${index}.params.VSYNC`">
|
|
|
<el-input-number
|
|
|
controls-position="right"
|
|
|
style="width: 100%"
|
|
|
@@ -230,7 +230,7 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="HsyncWidth">
|
|
|
+ <el-form-item label="HsyncWidth" :prop="`screens.${index}.params.HsyncWidth`">
|
|
|
<el-input-number
|
|
|
controls-position="right"
|
|
|
style="width: 100%"
|
|
|
@@ -239,7 +239,7 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="VsyncWidth">
|
|
|
+ <el-form-item label="VsyncWidth" :prop="`screens.${index}.params.VsyncWidth`">
|
|
|
<el-input-number
|
|
|
controls-position="right"
|
|
|
style="width: 100%"
|
|
|
@@ -291,7 +291,11 @@
|
|
|
:label="$t('screenIndexResolution', [index + 1])"
|
|
|
label-width="120px"
|
|
|
>
|
|
|
- <el-input :model-value="`${screen.width}x${screen.height}`" disabled />
|
|
|
+ <el-input
|
|
|
+ spellcheck="false"
|
|
|
+ :model-value="`${screen.width}x${screen.height}`"
|
|
|
+ disabled
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
@@ -343,7 +347,7 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item :label="$t('colorFormat')">
|
|
|
+ <el-form-item :label="$t('colorFormat')" :prop="`screens.${index}.colorFormat`">
|
|
|
<el-select v-model="item.colorFormat">
|
|
|
<el-option
|
|
|
v-for="item in getAnalogDisplayOptions('color_format')?.[index] || []"
|
|
|
@@ -354,7 +358,7 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item :label="$t('colorDepth')">
|
|
|
+ <el-form-item :label="$t('colorDepth')" :prop="`screens.${index}.colorDepth`">
|
|
|
<el-select v-model="item.colorDepth">
|
|
|
<el-option
|
|
|
v-for="item in getAnalogDisplayOptions('color_depth')?.[index] || []"
|
|
|
@@ -370,8 +374,8 @@
|
|
|
<el-divider />
|
|
|
<el-row :gutter="12">
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item :label="$t('version')">
|
|
|
- <el-input v-model="formData.version" />
|
|
|
+ <el-form-item :label="$t('version')" prop="version">
|
|
|
+ <el-input spellcheck="false" v-model="formData.version" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
@@ -383,13 +387,17 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item v-if="formData.resourcePackaging === 'c_bin'" :label="$t('binNumber')">
|
|
|
- <el-input v-model.number="formData.binNum" />
|
|
|
+ <el-form-item
|
|
|
+ v-if="formData.resourcePackaging === 'c_bin'"
|
|
|
+ :label="$t('binNumber')"
|
|
|
+ prop="binNum"
|
|
|
+ >
|
|
|
+ <el-input spellcheck="false" v-model.number="formData.binNum" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="24">
|
|
|
<el-form-item :label="$t('projectDesc')">
|
|
|
- <el-input type="textarea" v-model="formData.description" />
|
|
|
+ <el-input spellcheck="false" type="textarea" v-model="formData.description" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
@@ -414,12 +422,20 @@
|
|
|
:modal="false"
|
|
|
align-center
|
|
|
>
|
|
|
- <el-form>
|
|
|
- <el-form-item :label="$t('width')">
|
|
|
- <el-input v-model.number="customScreen.width" />
|
|
|
+ <el-form ref="resolutionFormRef" :model="customScreen" hide-required-asterisk>
|
|
|
+ <el-form-item
|
|
|
+ :label="$t('width')"
|
|
|
+ prop="width"
|
|
|
+ :rules="[{ required: true, message: $t('widthRequired') }]"
|
|
|
+ >
|
|
|
+ <el-input spellcheck="false" v-model.number="customScreen.width" />
|
|
|
</el-form-item>
|
|
|
- <el-form-item :label="$t('height')">
|
|
|
- <el-input v-model.number="customScreen.height" />
|
|
|
+ <el-form-item
|
|
|
+ :label="$t('height')"
|
|
|
+ prop="height"
|
|
|
+ :rules="[{ required: true, message: $t('heightRequired') }]"
|
|
|
+ >
|
|
|
+ <el-input spellcheck="false" v-model.number="customScreen.height" />
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
@@ -437,6 +453,7 @@ import { LuFolder } from 'vue-icons-plus/lu'
|
|
|
import { useProjectStore } from '@/store/modules/project'
|
|
|
import { useRecentProject } from '@/store/modules/recentProject'
|
|
|
import { useAppStore } from '@/store/modules/app'
|
|
|
+import { useLocalStorageState } from 'vue-hooks-plus'
|
|
|
import { useI18n } from 'vue-i18n'
|
|
|
import Recent from './Recent.vue'
|
|
|
|
|
|
@@ -449,6 +466,10 @@ const props = defineProps<{
|
|
|
initHide?: boolean
|
|
|
}>()
|
|
|
|
|
|
+const [projectPath, setProjectPath] = useLocalStorageState('projectPath', {
|
|
|
+ defaultValue: 'D:\\sunmicroDesignerProjects'
|
|
|
+})
|
|
|
+const [codePath, setCodePath] = useLocalStorageState('codePath', { defaultValue: '\\code' })
|
|
|
const { t } = useI18n()
|
|
|
const mode = ref<'add' | 'edit'>('add')
|
|
|
const projectStore = useProjectStore()
|
|
|
@@ -463,8 +484,8 @@ const formData = reactive<
|
|
|
version: '1.0.0',
|
|
|
description: '',
|
|
|
name: '',
|
|
|
- path: 'D:\\sunmicroDesignerProjects',
|
|
|
- codePath: '\\code',
|
|
|
+ path: projectPath.value || '',
|
|
|
+ codePath: codePath.value || '',
|
|
|
type: 'chip',
|
|
|
chip: {
|
|
|
model: '',
|
|
|
@@ -512,17 +533,23 @@ const formData = reactive<
|
|
|
videoFormats: []
|
|
|
})
|
|
|
|
|
|
-watch(
|
|
|
- () => recentProject.recentProjects,
|
|
|
- () => {
|
|
|
- formData.name = `projectName${(recentProject.recentProjects?.length || 0) + 1}`
|
|
|
- },
|
|
|
- {
|
|
|
- immediate: true
|
|
|
- }
|
|
|
-)
|
|
|
+/**
|
|
|
+ * 设置默认项目名
|
|
|
+ */
|
|
|
+const setProjectDefaultName = () => {
|
|
|
+ const list =
|
|
|
+ recentProject.recentProjects
|
|
|
+ ?.map((item) => Number(item.projectName.split('_')?.[1]))
|
|
|
+ ?.filter((n) => !Number.isNaN(n)) || []
|
|
|
+ const index = list.length ? Math.max(...list) + 1 : 1
|
|
|
+
|
|
|
+ formData.name = `projectName_${index}`
|
|
|
+}
|
|
|
+
|
|
|
+watch(() => recentProject.recentProjects, setProjectDefaultName, { immediate: true })
|
|
|
|
|
|
const form = ref<FormInstance>()
|
|
|
+const resolutionFormRef = ref<FormInstance>()
|
|
|
// 显示模态框
|
|
|
const showModal = ref(!props.initHide)
|
|
|
// 显示自定义屏幕模态框
|
|
|
@@ -561,11 +588,39 @@ const rules = computed(() => {
|
|
|
}
|
|
|
],
|
|
|
codePath: [{ required: true, message: t('codePathRequired'), trigger: 'blur' }],
|
|
|
+ path: [{ required: true, message: t('pathRequired'), trigger: 'blur' }],
|
|
|
+ version: [{ required: true, message: t('versionRequired'), trigger: 'blur' }],
|
|
|
'chip.model': [{ required: true, message: t('chipIsRequired'), trigger: 'blur' }],
|
|
|
'chip.flash_size.capacity': [
|
|
|
{ required: true, message: t('flashIsRequired'), trigger: 'blur' }
|
|
|
],
|
|
|
- 'chip.ram_size.capacity': [{ required: true, message: t('ramIsRequired'), trigger: 'blur' }]
|
|
|
+ 'chip.ram_size.capacity': [{ required: true, message: t('ramIsRequired'), trigger: 'blur' }],
|
|
|
+ 'screens.0.params.PCLK': [{ required: true, message: t('pclkRequired'), trigger: 'change' }],
|
|
|
+ 'screens.0.params.VBP': [{ required: true, message: t('VBPRequired'), trigger: 'change' }],
|
|
|
+ 'screens.0.params.VFP': [{ required: true, message: t('VFPRequired'), trigger: 'change' }],
|
|
|
+ 'screens.0.params.HBP': [{ required: true, message: t('HBPRequired'), trigger: 'change' }],
|
|
|
+ 'screens.0.params.HFP': [{ required: true, message: t('HFPRequired'), trigger: 'change' }],
|
|
|
+ 'screens.0.params.HSYNC': [{ required: true, message: t('HSYNCRequired'), trigger: 'change' }],
|
|
|
+ 'screens.0.params.VSYNC': [{ required: true, message: t('VSYNCRequired'), trigger: 'change' }],
|
|
|
+ 'screens.0.params.HsyncWidth': [
|
|
|
+ { required: true, message: t('HsyncWidthRequired'), trigger: 'change' }
|
|
|
+ ],
|
|
|
+ 'screens.0.params.VsyncWidth': [
|
|
|
+ { required: true, message: t('VsyncWidthRequired'), trigger: 'change' }
|
|
|
+ ],
|
|
|
+ 'screens.1.params.PCLK': [{ required: true, message: t('pclkRequired'), trigger: 'change' }],
|
|
|
+ 'screens.1.params.VBP': [{ required: true, message: t('VBPRequired'), trigger: 'change' }],
|
|
|
+ 'screens.1.params.VFP': [{ required: true, message: t('VFPRequired'), trigger: 'change' }],
|
|
|
+ 'screens.1.params.HBP': [{ required: true, message: t('HBPRequired'), trigger: 'change' }],
|
|
|
+ 'screens.1.params.HFP': [{ required: true, message: t('HFPRequired'), trigger: 'change' }],
|
|
|
+ 'screens.1.params.HSYNC': [{ required: true, message: t('HSYNCRequired'), trigger: 'change' }],
|
|
|
+ 'screens.1.params.VSYNC': [{ required: true, message: t('VSYNCRequired'), trigger: 'change' }],
|
|
|
+ 'screens.1.params.HsyncWidth': [
|
|
|
+ { required: true, message: t('HsyncWidthRequired'), trigger: 'change' }
|
|
|
+ ],
|
|
|
+ 'screens.1.params.VsyncWidth': [
|
|
|
+ { required: true, message: t('VsyncWidthRequired'), trigger: 'change' }
|
|
|
+ ]
|
|
|
}
|
|
|
})
|
|
|
|
|
|
@@ -609,6 +664,7 @@ const handleSetResolution = (str: string, index: number) => {
|
|
|
|
|
|
// 设置自定义分辨率
|
|
|
const handleSetScreen = () => {
|
|
|
+ resolutionFormRef.value?.validate()
|
|
|
if (!customScreen.value.width || !customScreen.value.height) return
|
|
|
|
|
|
formData.screens[customScreen.value.index].width = customScreen.value.width
|
|
|
@@ -845,6 +901,9 @@ const handleSubmit = async () => {
|
|
|
ElMessage.warning(t('selectBoard'))
|
|
|
return
|
|
|
}
|
|
|
+ // 记住项目路径
|
|
|
+ setProjectPath(formData.path)
|
|
|
+ setCodePath(formData.codePath)
|
|
|
|
|
|
projectStore.createApp(formData)
|
|
|
form.value?.resetFields()
|
|
|
@@ -858,10 +917,10 @@ const handleEdit = async () => {
|
|
|
|
|
|
// 关闭弹窗
|
|
|
const close = (done?: () => void) => {
|
|
|
- if (!projectStore.project) {
|
|
|
- ElMessage.warning(t('createProjectFirst'))
|
|
|
- return
|
|
|
- }
|
|
|
+ // if (!projectStore.project) {
|
|
|
+ // ElMessage.warning(t('createProjectFirst'))
|
|
|
+ // return
|
|
|
+ // }
|
|
|
|
|
|
done?.()
|
|
|
form.value?.resetFields()
|
|
|
@@ -873,8 +932,11 @@ defineExpose({
|
|
|
create: async () => {
|
|
|
mode.value = 'add'
|
|
|
showModal.value = true
|
|
|
- await nextTick()
|
|
|
form.value?.resetFields()
|
|
|
+ await nextTick()
|
|
|
+ formData.path = projectPath.value || ''
|
|
|
+ formData.codePath = codePath.value || ''
|
|
|
+ setProjectDefaultName()
|
|
|
},
|
|
|
edit: () => {
|
|
|
const data = klona(projectStore.project?.meta || {})
|