Skip to content
This repository has been archived by the owner on Feb 24, 2024. It is now read-only.

Commit

Permalink
feat: navigate
Browse files Browse the repository at this point in the history
add more data for test
  • Loading branch information
neko-para committed Aug 3, 2023
1 parent 7814a80 commit 28afce4
Show file tree
Hide file tree
Showing 17 changed files with 1,063 additions and 665 deletions.
7 changes: 7 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"devDependencies": {
"@tsconfig/node18": "^18.2.0",
"@types/node": "^18.17.0",
"@vicons/material": "^0.12.0",
"@vitejs/plugin-vue": "^4.2.3",
"@vitejs/plugin-vue-jsx": "^3.0.1",
"@vue/tsconfig": "^0.4.0",
Expand Down
152 changes: 8 additions & 144 deletions src/TaskEdit.vue
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
<script setup lang="ts">
import { NSelect, NButton, NSwitch, NInput } from 'naive-ui'
import { computed, type Ref } from 'vue'
import type { Task, Rect, TextRepl } from '@/types'
import { type Task, type Rect, type TextRepl, wrapProp } from '@/types'
import ClearButton from '@/components/ClearButton.vue'
import SingleArrayEdit from '@/components/SingleArrayEdit.vue'
import RectEdit from '@/components/RectEdit.vue'
import TemplateEdit from '@/components/TemplateEdit.vue'
import StringArrayEdit from '@/components/StringArrayEdit.vue'
import JsonEdit from './components/JsonEdit.vue'
import NavigateEdit from './components/NavigateEdit.vue'
import RecognizerEdit from '@/components/RecognizerEdit.vue'
defineProps<{
name: string
Expand All @@ -20,55 +22,6 @@ const task = defineModel<Task>('value', {
required: true
})
type RemUndefined<T> = T extends undefined ? never : T
function wrapProp<T extends Record<string, unknown>, K extends string>(
obj: Ref<T>,
key: K
) {
return computed<RemUndefined<T[K]> | null>({
set(v: RemUndefined<T[K]> | null) {
if (v === null) {
if (key in obj.value) {
delete obj.value[key]
}
} else {
obj.value[key] = v
}
},
get(): RemUndefined<T[K]> | null {
return (obj.value[key] ?? null) as RemUndefined<T[K]> | null
}
})
}
const recoOptions = ['DirectHit', 'TemplateMatch', 'OCR', 'Custom'].map(x => ({
label: x,
value: x
}))
const taskReco = wrapProp(task, 'recognition')
const taskRecoValue = computed(() => taskReco.value ?? 'DirectHit')
const taskRoi = wrapProp(task, 'roi')
const taskTemplate = wrapProp(task, 'template')
const taskThreshold = wrapProp(task, 'threshold')
const taskMethod = wrapProp(task, 'method')
const templMethodOptions = [1, 3, 5].map(x => ({
label: `${x}`,
value: x
}))
const taskGMask = wrapProp(task, 'green_mask')
const taskText = wrapProp(task, 'text')
const taskReplace = wrapProp(task, 'replace')
const taskOnlyRec = wrapProp(task, 'only_rec')
const taskCustomReco = wrapProp(task, 'custom_recognizer')
const taskCustomRecoParam = wrapProp(task, 'custom_recognizer_param')
const taskNext = wrapProp(task, 'next')
const taskNextArr = computed(() =>
typeof taskNext.value === 'string'
Expand All @@ -93,101 +46,12 @@ const taskNextArr = computed(() =>
row-gap: 1rem;
"
>
<ClearButton v-model="taskReco"> 识别 </ClearButton>
<NSelect
v-model:value="taskReco"
:options="recoOptions"
:placeholder="recoOptions[0].label"
></NSelect>
<template v-if="taskRecoValue !== 'Custom'">
<ClearButton v-model="taskRoi"> 区域 </ClearButton>
<SingleArrayEdit
v-model:value="taskRoi"
:def="() => [0, 0, 0, 0] as Rect"
:is-t="
v =>
v instanceof Array && v.length === 4 && typeof v[0] === 'number'
"
>
<template #edit="{ value, update }">
<RectEdit :value="value" @update:value="update"></RectEdit>
</template>
</SingleArrayEdit>
</template>
<template v-if="taskRecoValue === 'TemplateMatch'">
<TemplateEdit
v-model:template="taskTemplate"
v-model:threshold="taskThreshold"
></TemplateEdit>
<ClearButton v-model="taskMethod"> 匹配算法 </ClearButton>
<NSelect
:options="templMethodOptions"
v-model:value="taskMethod"
placeholder="5"
></NSelect>
<ClearButton v-model="taskGMask"> 绿色掩码 </ClearButton>
<div>
<NSwitch
:value="taskGMask ?? false"
@update:value="(v: boolean) => taskGMask = v"
></NSwitch>
</div>
</template>
<template v-if="taskRecoValue === 'OCR'">
<ClearButton v-model="taskText" invalid> 文本 </ClearButton>
<StringArrayEdit
v-model:value="taskText"
:def="'test'"
></StringArrayEdit>
<ClearButton v-model="taskReplace"> 文本替换 </ClearButton>
<SingleArrayEdit
v-model:value="taskReplace"
:nullable="true"
:def="() => (['aaa', 'bbb'] as TextRepl)"
:is-t="(v: TextRepl | TextRepl[]) => (v.length === 2 && typeof v[0] === 'string')"
>
<template #edit="{ value, update }">
<div class="flex gap-2">
<NInput
:value="value[0]"
@update:value="(v: string) => update([v, value[1]])"
>
<template #prefix> 替换: </template>
</NInput>
<NInput
:value="value[1]"
@update:value="(v: string) => update([value[0], v])"
>
<template #prefix> 为: </template>
</NInput>
</div>
</template>
</SingleArrayEdit>
<ClearButton v-model="taskOnlyRec"> 仅识别 </ClearButton>
<div>
<NSwitch
:value="taskOnlyRec ?? false"
@update:value="(v: boolean) => taskOnlyRec = v"
></NSwitch>
</div>
</template>
<template v-if="taskRecoValue === 'Custom'">
<ClearButton v-model="taskCustomReco" invalid> 识别器 </ClearButton>
<NInput
:value="taskCustomReco ?? 'demo_reco'"
@update:value="v => (taskCustomReco = v)"
></NInput>
<ClearButton v-model="taskCustomRecoParam"> 识别参数 </ClearButton>
<JsonEdit v-model:value="taskCustomRecoParam"></JsonEdit>
</template>
<RecognizerEdit v-model:value="task"></RecognizerEdit>
<ClearButton v-model="taskNext"> 导航 </ClearButton>
<div class="flex flex-col gap-2">
<div v-for="(s, i) in taskNextArr" :key="i" class="flex">
<NButton @click="$emit('navigate', s)">
{{ s }}
</NButton>
</div>
</div>
<NavigateEdit
v-model:value="taskNext"
:navigate="s => $emit('navigate', s)"
></NavigateEdit>
</div>
<JsonEdit v-model:value="task"></JsonEdit>
</div>
Expand Down
30 changes: 30 additions & 0 deletions src/components/NavigateEdit.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<script setup lang="ts">
import SingleArrayEdit from './SingleArrayEdit.vue'
import SingleNavigateEdit from './SingleNavigateEdit.vue'
defineProps<{
navigate: (to: string) => void
}>()
const val = defineModel<string | string[] | null>('value', {
required: true
})
</script>

<template>
<SingleArrayEdit
v-model:value="val"
:nullable="true"
:no-single="true"
:def="() => 'FakeTask'"
:is-t="(v: string | string[]) => (typeof v === 'string')"
>
<template #edit="{ value, update }">
<SingleNavigateEdit
:value="value"
@update:value="update"
:navigate="navigate"
></SingleNavigateEdit>
</template>
</SingleArrayEdit>
</template>
130 changes: 130 additions & 0 deletions src/components/RecognizerEdit.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
<script setup lang="ts">
import { NSelect, NButton, NSwitch, NInput } from 'naive-ui'
import { computed, type Ref } from 'vue'
import { type Task, type Rect, type TextRepl, wrapProp } from '@/types'
import ClearButton from './ClearButton.vue'
import SingleArrayEdit from './SingleArrayEdit.vue'
import RectEdit from './RectEdit.vue'
import TemplateEdit from './TemplateEdit.vue'
import StringArrayEdit from './StringArrayEdit.vue'
import JsonEdit from './JsonEdit.vue'
import NavigateEdit from './NavigateEdit.vue'
const task = defineModel<Task>('value', {
required: true
})
const recoOptions = ['DirectHit', 'TemplateMatch', 'OCR', 'Custom'].map(x => ({
label: x,
value: x
}))
const taskReco = wrapProp(task, 'recognition')
const taskRecoValue = computed(() => taskReco.value ?? 'DirectHit')
const taskRoi = wrapProp(task, 'roi')
const taskTemplate = wrapProp(task, 'template')
const taskThreshold = wrapProp(task, 'threshold')
const taskMethod = wrapProp(task, 'method')
const templMethodOptions = [1, 3, 5].map(x => ({
label: `${x}`,
value: x
}))
const taskGMask = wrapProp(task, 'green_mask')
const taskText = wrapProp(task, 'text')
const taskReplace = wrapProp(task, 'replace')
const taskOnlyRec = wrapProp(task, 'only_rec')
const taskCustomReco = wrapProp(task, 'custom_recognizer')
const taskCustomRecoParam = wrapProp(task, 'custom_recognizer_param')
</script>

<template>
<ClearButton v-model="taskReco"> 识别 </ClearButton>
<NSelect
v-model:value="taskReco"
:options="recoOptions"
:placeholder="recoOptions[0].label"
></NSelect>
<template v-if="taskRecoValue !== 'Custom'">
<ClearButton v-model="taskRoi"> 识别区域 </ClearButton>
<SingleArrayEdit
v-model:value="taskRoi"
:nullable="true"
:def="() => [0, 0, 0, 0] as Rect"
:is-t="
v => v instanceof Array && v.length === 4 && typeof v[0] === 'number'
"
>
<template #edit="{ value, update }">
<RectEdit :value="value" @update:value="update"></RectEdit>
</template>
</SingleArrayEdit>
</template>
<template v-if="taskRecoValue === 'TemplateMatch'">
<TemplateEdit
v-model:template="taskTemplate"
v-model:threshold="taskThreshold"
></TemplateEdit>
<ClearButton v-model="taskMethod"> 匹配算法 </ClearButton>
<NSelect
:options="templMethodOptions"
v-model:value="taskMethod"
placeholder="5"
></NSelect>
<ClearButton v-model="taskGMask"> 绿色掩码 </ClearButton>
<div>
<NSwitch
:value="taskGMask ?? false"
@update:value="(v: boolean) => taskGMask = v"
></NSwitch>
</div>
</template>
<template v-if="taskRecoValue === 'OCR'">
<ClearButton v-model="taskText" invalid> 文本 </ClearButton>
<StringArrayEdit v-model:value="taskText" :def="'test'"></StringArrayEdit>
<ClearButton v-model="taskReplace"> 文本替换 </ClearButton>
<SingleArrayEdit
v-model:value="taskReplace"
:nullable="true"
:def="() => (['aaa', 'bbb'] as TextRepl)"
:is-t="(v: TextRepl | TextRepl[]) => (v.length === 2 && typeof v[0] === 'string')"
>
<template #edit="{ value, update }">
<div class="flex gap-2">
<NInput
:value="value[0]"
@update:value="(v: string) => update([v, value[1]])"
>
<template #prefix> 替换: </template>
</NInput>
<NInput
:value="value[1]"
@update:value="(v: string) => update([value[0], v])"
>
<template #prefix> 为: </template>
</NInput>
</div>
</template>
</SingleArrayEdit>
<ClearButton v-model="taskOnlyRec"> 仅识别 </ClearButton>
<div>
<NSwitch
:value="taskOnlyRec ?? false"
@update:value="(v: boolean) => taskOnlyRec = v"
></NSwitch>
</div>
</template>
<template v-if="taskRecoValue === 'Custom'">
<ClearButton v-model="taskCustomReco" invalid> 识别器 </ClearButton>
<NInput
:value="taskCustomReco ?? 'demo_reco'"
@update:value="v => (taskCustomReco = v)"
></NInput>
<ClearButton v-model="taskCustomRecoParam"> 识别参数 </ClearButton>
<JsonEdit v-model:value="taskCustomRecoParam"></JsonEdit>
</template>
</template>
Loading

0 comments on commit 28afce4

Please sign in to comment.