11<script setup lang="ts">
22import type { TreeOption , UploadFileInfo } from ' naive-ui'
33import type { Level } from ' @/libs/types'
4- import { CaretRight } from ' @vicons/fa'
5- import { NButton , NCard , NCheckbox , NCollapse , NCollapseItem , NGrid , NGridItem , NIcon , NScrollbar , NSelect , NTree , NUpload , useMessage } from ' naive-ui'
4+ import { CaretRight , EllipsisH } from ' @vicons/fa'
5+ import { NButton , NCard , NCheckbox , NCollapse , NCollapseItem , NDropdown , NGrid , NGridItem , NIcon , NScrollbar , NSelect , NTree , NUpload , useMessage } from ' naive-ui'
66import OpenDrive from ' opendrive-parser'
77import { storeToRefs } from ' pinia'
8- import { computed , ref , watch } from ' vue'
8+ import { computed , h , ref , watch } from ' vue'
99import { useAppStore } from ' @/store'
1010import AppTitle from ' ./AppTitle.vue'
1111
@@ -25,6 +25,26 @@ const precisionOptions = [{
2525 value: 1 ,
2626}]
2727
28+ const dropdownOptions = [
29+ {
30+ label: ' Zoom to' ,
31+ key: ' zoom-to' ,
32+ },
33+ {
34+ label: ' Toogle' ,
35+ key: ' toogle' ,
36+ },
37+ ]
38+
39+ function handleSelect(key : string | number , option : TreeOption ) {
40+ if (key === ' zoom-to' ) {
41+ viewer .value ?.zoomTo (option .level as Level , option .key as string )
42+ }
43+ // if (key === 'toogle') {
44+ // viewer.value?.toggle(option.level as Level, option.key as string)
45+ // }
46+ }
47+
2848watch (precision , () => {
2949 if (! viewer .value )
3050 return
@@ -46,6 +66,10 @@ async function loadDefaultMap() {
4666 const res = await fetch (' /data/Town04_Opt.xodr' )
4767 const content = await res .text ()
4868 if (content && viewer .value ) {
69+ store .setFileInfo ({
70+ name: ' Town04_Opt.xodr' ,
71+ size: 0 ,
72+ })
4973 store .setOpenDriveContent (content )
5074 const openDrive = parseOpenDrive (content , precision .value )
5175 store .setOpenDrive (openDrive )
@@ -71,12 +95,17 @@ function handleChange({ file }: { file: UploadFileInfo }) {
7195 loading .value = true
7296 const t1 = performance .now ()
7397 const reader = new FileReader ()
98+
99+ store .clear ()
100+ store .setFileInfo ({
101+ name: file .name ,
102+ size: file .file ?.size || 0 ,
103+ })
74104 reader .onload = (event ) => {
75105 if (! viewer .value )
76106 return
77107 const content = event .target ?.result as string
78108 if (content ) {
79- store .clear ()
80109 store .setOpenDriveContent (content )
81110 const openDrive = parseOpenDrive (content , precision .value )
82111 store .setOpenDrive (openDrive )
@@ -106,6 +135,34 @@ function nodeProps({ option }: { option: TreeOption }) {
106135 }
107136}
108137
138+ function renderSuffix({ option }: { option: TreeOption }) {
139+ return h (
140+ NDropdown ,
141+ {
142+ trigger: ' click' ,
143+ size: ' small' ,
144+ placement: ' left-start' ,
145+ options: dropdownOptions ,
146+ onSelect : (key : string | number ) => handleSelect (key , option ),
147+ },
148+ {
149+ default : () => h (
150+ NButton ,
151+ {
152+ text: true ,
153+ style: ' margin-left: 4px; display: flex; align-items: center;' ,
154+ onClick : (e : MouseEvent ) => {
155+ e .stopPropagation ()
156+ },
157+ },
158+ {
159+ default : () => h (NIcon , { size: 12 }, { default : () => h (EllipsisH ) }),
160+ },
161+ ),
162+ },
163+ )
164+ }
165+
109166const roadNetworkData = computed (() => {
110167 if (! openDrive .value )
111168 return []
@@ -192,7 +249,8 @@ function handlePerfMonitor(v: boolean) {
192249 <NScrollbar style =" max-height : 320px ;" >
193250 <NTree
194251 block-line :data =" roadNetworkData " :indent =" 14 " :show-line =" true "
195- :node-props =" nodeProps "
252+ expand-on-click :selectable =" false "
253+ :node-props =" nodeProps " :render-suffix =" renderSuffix "
196254 />
197255 </NScrollbar >
198256 </NCollapseItem >
0 commit comments