|
@@ -1,5 +1,9 @@
|
|
|
import {uiType, UIType, VectorType} from "@/hook/useGraphic";
|
|
|
-import {computed, Ref, ref, toRaw} from 'vue'
|
|
|
+import {
|
|
|
+ findMenuByAttr,
|
|
|
+ generateByMenus as generateByMenusRaw,
|
|
|
+ generateMixMenus as generateMixMenusRaw
|
|
|
+} from '@/utils/menus'
|
|
|
|
|
|
export const UITypeExtend = {
|
|
|
structure: "structure",
|
|
@@ -14,7 +18,8 @@ export const UITypeExtend = {
|
|
|
}
|
|
|
|
|
|
export type MenuRaw = {
|
|
|
- key: string, text: string,
|
|
|
+ key: string,
|
|
|
+ text: string,
|
|
|
icon?: string,
|
|
|
children?: MenusRaw
|
|
|
extend?: MenusRaw
|
|
@@ -140,72 +145,24 @@ focusMenuRaw[VectorType.CurveRoadEdge] = focusMenuRaw[VectorType.RoadEdge]
|
|
|
focusMenuRaw[VectorType.CurveRoad] = focusMenuRaw[VectorType.Road]
|
|
|
|
|
|
|
|
|
-export const isUITypeExtend = (key: string) =>
|
|
|
- Object.values(UITypeExtend).some(v => v === key)
|
|
|
-
|
|
|
-type GenerateResult<T extends {}, E = {}> = Array<T & { children: GenerateResult<T> } & E>;
|
|
|
-export const generateByMenus = <T>(
|
|
|
+export const generateByMenus = <T extends MenuRaw>(
|
|
|
generateFn: (men: MenuRaw) => T,
|
|
|
mainMenus: MenusRaw = mainMenusRaw
|
|
|
-): GenerateResult<T> => {
|
|
|
- return mainMenus.map(mainMenu => ({
|
|
|
- ...generateFn(mainMenu),
|
|
|
- children: mainMenu.children ? generateByMenus(generateFn, mainMenu.children) : []
|
|
|
- }))
|
|
|
-}
|
|
|
+) => generateByMenusRaw(generateFn, mainMenus);
|
|
|
+
|
|
|
export const findMainMenuByAttr = (
|
|
|
value: MenusRaw,
|
|
|
- attr = "extend",
|
|
|
+ attr = "extend" as const,
|
|
|
mainMenus = mainMenusRaw
|
|
|
-) => {
|
|
|
- for (const mainMenu of mainMenus) {
|
|
|
- if (toRaw(mainMenu[attr]) === toRaw(value)) {
|
|
|
- return mainMenu
|
|
|
- } else if (mainMenu.children) {
|
|
|
- const childMainMenu = findMainMenuByAttr(value, attr, mainMenu.children)
|
|
|
- if (childMainMenu) {
|
|
|
- return childMainMenu;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
+) => findMenuByAttr(value, attr, mainMenus)
|
|
|
|
|
|
-export type GenerateMinMenusResult<T extends {}, K extends keyof MenuRaw> = {
|
|
|
- menus: GenerateResult<T, { onClick: () => void }>,
|
|
|
- child: Ref<MenuRaw[K]>,
|
|
|
- activeMenuKey: Ref<string>
|
|
|
-}
|
|
|
export const generateMixMenus = <T extends {}, K extends keyof MenuRaw>(
|
|
|
childKey: K,
|
|
|
generateFn: (men: MenuRaw) => T,
|
|
|
mainMenus: MenusRaw = mainMenusRaw
|
|
|
-): GenerateMinMenusResult<T, K> => {
|
|
|
- const child = ref();
|
|
|
- const menus = generateByMenus((menu) => ({
|
|
|
- ...generateFn(menu),
|
|
|
- onClick: () => {
|
|
|
- if (menu[childKey]) {
|
|
|
- if (toRaw(menu[childKey]) !== toRaw(child.value)) {
|
|
|
- child.value = menu[childKey]
|
|
|
- console.log("变成为", child.value)
|
|
|
- return;
|
|
|
- }
|
|
|
- } else {
|
|
|
- uiType.change(menu.key as any)
|
|
|
- }
|
|
|
- child.value = null
|
|
|
- }
|
|
|
- }), mainMenus)
|
|
|
-
|
|
|
- const activeMenuKey = computed(() =>
|
|
|
- child.value
|
|
|
- ? findMainMenuByAttr(child.value, childKey, mainMenus)?.key
|
|
|
- : uiType.current
|
|
|
- )
|
|
|
-
|
|
|
- return {
|
|
|
- child,
|
|
|
- menus,
|
|
|
- activeMenuKey
|
|
|
- };
|
|
|
-}
|
|
|
+) => generateMixMenusRaw(
|
|
|
+ childKey,
|
|
|
+ generateFn,
|
|
|
+ mainMenus,
|
|
|
+ menu => uiType.change(menu.key as any)
|
|
|
+);
|