[Feature] Add dblclick. (#15)

diff --git a/studio/components/files/index.tsx b/studio/components/files/index.tsx
index f9ded12..9228e00 100644
--- a/studio/components/files/index.tsx
+++ b/studio/components/files/index.tsx
@@ -22,7 +22,8 @@
   VNodeChild,
   Ref,
   ref,
-  onMounted
+  onMounted,
+  onUnmounted
 } from 'vue'
 import { NTree, NInput, NDropdown } from 'naive-ui'
 import { FILE_TYPES_SUFFIX } from '@/constants/file'
@@ -47,7 +48,7 @@
 export const Files = defineComponent({
   name: 'files',
   props,
-  emits: ['select', 'inputBlur', 'delete', 'rename'],
+  emits: ['select', 'inputBlur', 'delete', 'rename', 'doubleClick'],
   setup(props, { emit, expose }) {
     const keyRef = ref()
     const treeRef = ref()
@@ -74,7 +75,7 @@
     const renderLabel = (info: { option: TreeOption }): VNodeChild => {
       const { isEditing, name, type, id } = info.option as IFileRecord
       return !isEditing
-        ? h('div', { 'data-id': id }, type ? getNameByType(type, name) : '')
+        ? h('div', { 'data-id': id }, type ? getNameByType(type, name) : name)
         : h(
             NInput,
             {
@@ -107,9 +108,19 @@
     const onClickoutside = () => {
       showDropdownRef.value = false
     }
+    const onDoubleClick = (ev: MouseEvent) => {
+      id = (ev.target as HTMLElement)?.dataset.id
+      if (id) emit('doubleClick', id)
+    }
 
     onMounted(() => {
       treeRef.value?.selfElRef.addEventListener('contextmenu', onContextMenu)
+      treeRef.value?.selfElRef.addEventListener('dblclick', onDoubleClick)
+    })
+
+    onUnmounted(() => {
+      treeRef.value?.selfElRef.removeEventListener('contextmenu', onContextMenu)
+      treeRef.value?.selfElRef.removeEventListener('dblclick', onDoubleClick)
     })
 
     return () => (
diff --git a/studio/components/studio-sider/index.tsx b/studio/components/studio-sider/index.tsx
index 1a27d14..4b4111a 100644
--- a/studio/components/studio-sider/index.tsx
+++ b/studio/components/studio-sider/index.tsx
@@ -36,7 +36,8 @@
       onSelectFile,
       onInputBlur,
       onDelete,
-      onRename
+      onRename,
+      onDoubleClick
     } = useFile(inputRef, fileRef)
 
     const onSearch = (value: string) => {
@@ -71,6 +72,7 @@
             onInputBlur={onInputBlur}
             onDelete={onDelete}
             onRename={onRename}
+            onDoubleClick={onDoubleClick}
             inputRef={inputRef}
             selected-keys={[state.currentKey]}
             ref={fileRef}
diff --git a/studio/components/studio-sider/use-file.ts b/studio/components/studio-sider/use-file.ts
index a585387..0a10205 100644
--- a/studio/components/studio-sider/use-file.ts
+++ b/studio/components/studio-sider/use-file.ts
@@ -200,6 +200,17 @@
     refreshFiles()
   }
 
+  const onDoubleClick = (id: number) => {
+    const currentRecord = filesCached[id]
+    if (!currentRecord.type) return
+    if (currentRecord.isEditing) return
+    fileStore.openFile({
+      id,
+      name: getNameByType(currentRecord.type, currentRecord.name),
+      content: ''
+    })
+  }
+
   onMounted(() => {
     pullFiles()
   })
@@ -211,6 +222,7 @@
     onSelectFile,
     onInputBlur,
     onDelete,
-    onRename
+    onRename,
+    onDoubleClick
   }
 }