1- import { Button } from "@/components/ui/button" ;
21import { Dialog } from "@/components/ui/dialog" ;
32import {
43 Menubar ,
@@ -12,15 +11,14 @@ import {
1211 MenubarTrigger ,
1312} from "@/components/ui/menubar" ;
1413
15- import { Input } from "@/components/ui/input" ;
16- import { Textarea } from "@/components/ui/textarea" ;
1714import { loadAllServicesAfterInit , loadAllServicesBeforeInit } from "@/core/loadAllServices" ;
1815import { Project } from "@/core/Project" ;
1916import { activeProjectAtom , isClassroomModeAtom , projectsAtom , store } from "@/state" ;
2017import AIWindow from "@/sub/AIWindow" ;
2118import AttachmentsWindow from "@/sub/AttachmentsWindow" ;
2219import ExportPngWindow from "@/sub/ExportPngWindow" ;
2320import FindWindow from "@/sub/FindWindow" ;
21+ import GenerateNodeTree , { GenerateNodeGraph } from "@/sub/GenerateNodeWindow" ;
2422import LoginWindow from "@/sub/LoginWindow" ;
2523import NodeDetailsWindow from "@/sub/NodeDetailsWindow" ;
2624import RecentFilesWindow from "@/sub/RecentFilesWindow" ;
@@ -29,9 +27,8 @@ import TestWindow from "@/sub/TestWindow";
2927import UserWindow from "@/sub/UserWindow" ;
3028import { getDeviceId } from "@/utils/otherApi" ;
3129import { PathString } from "@/utils/pathString" ;
32- import { Color , Vector } from "@graphif/data-structures" ;
30+ import { Color } from "@graphif/data-structures" ;
3331import { deserialize , serialize } from "@graphif/serializer" ;
34- import { Rectangle } from "@graphif/shapes" ;
3532import { Decoder } from "@msgpack/msgpack" ;
3633import { getVersion } from "@tauri-apps/api/app" ;
3734import { appCacheDir , dataDir , join } from "@tauri-apps/api/path" ;
@@ -59,23 +56,26 @@ import {
5956 FileOutput ,
6057 FilePlus ,
6158 Folder ,
62- Images ,
6359 FolderClock ,
6460 FolderCog ,
6561 FolderOpen ,
6662 FolderTree ,
6763 Frown ,
6864 Fullscreen ,
65+ GitCompareArrows ,
66+ Images ,
6967 Keyboard ,
7068 LayoutGrid ,
7169 Loader ,
7270 MapPin ,
7371 MessageCircleWarning ,
7472 MousePointer2 ,
73+ Network ,
7574 Palette ,
7675 Paperclip ,
7776 PersonStanding ,
7877 PictureInPicture2 ,
78+ Plus ,
7979 Rabbit ,
8080 Radiation ,
8181 Redo ,
@@ -101,11 +101,10 @@ import { ProjectUpgrader } from "../stage/ProjectUpgrader";
101101import { LineEdge } from "../stage/stageObject/association/LineEdge" ;
102102import { TextNode } from "../stage/stageObject/entity/TextNode" ;
103103import { RecentFileManager } from "./dataFileService/RecentFileManager" ;
104+ import { DragFileIntoStageEngine } from "./dataManageService/dragFileIntoStageEngine/dragFileIntoStageEngine" ;
104105import { FeatureFlags } from "./FeatureFlags" ;
105106import { Settings } from "./Settings" ;
106- import { SubWindow } from "./SubWindow" ;
107107import { Telemetry } from "./Telemetry" ;
108- import { DragFileIntoStageEngine } from "./dataManageService/dragFileIntoStageEngine/dragFileIntoStageEngine" ;
109108
110109const Content = MenubarContent ;
111110const Item = MenubarItem ;
@@ -579,90 +578,26 @@ export function GlobalMenu() {
579578 { /* 生成子菜单 */ }
580579 < Sub >
581580 < SubTrigger >
582- < RefreshCcwDot />
581+ < Plus />
583582 { t ( "actions.generate.title" ) }
584583 </ SubTrigger >
585584 < SubContent >
586585 < Item
587586 onClick = { async ( ) => {
588- // 创建自定义对话框
589- const result = await new Promise < { text : string ; indention : number } | undefined > ( ( resolve ) => {
590- function CustomDialog ( { winId } : { winId ?: string } ) {
591- const [ text , setText ] = useState ( "" ) ;
592- const [ indention , setIndention ] = useState ( "4" ) ;
593-
594- return (
595- < div className = "space-y-4 p-6" >
596- < div >
597- < h3 className = "mb-2 text-xl font-semibold" >
598- { t ( "actions.generate.generateNodeTreeByText" ) }
599- </ h3 >
600- < p className = "text-muted-foreground mb-4" >
601- { t ( "actions.generate.generateNodeTreeByTextDescription" ) }
602- </ p >
603- </ div >
604- < Textarea
605- value = { text }
606- onChange = { ( e ) => setText ( e . target . value ) }
607- placeholder = { t ( "actions.generate.generateNodeTreeByTextPlaceholder" ) }
608- className = "min-h-[200px]"
609- />
610- < div className = "flex items-center gap-2" >
611- < label htmlFor = "indention" > { t ( "actions.generate.indention" ) } :</ label >
612- < Input
613- id = "indention"
614- type = "number"
615- value = { indention }
616- onChange = { ( e ) => setIndention ( e . target . value ) }
617- min = "1"
618- max = "10"
619- className = "w-20"
620- />
621- </ div >
622- < div className = "flex justify-end gap-2" >
623- < Button
624- variant = "outline"
625- onClick = { ( ) => {
626- resolve ( undefined ) ;
627- setTimeout ( ( ) => {
628- SubWindow . close ( winId ! ) ;
629- } , 100 ) ;
630- } }
631- >
632- { t ( "actions.cancel" ) }
633- </ Button >
634- < Button
635- onClick = { ( ) => {
636- resolve ( { text, indention : parseInt ( indention ) || 4 } ) ;
637- setTimeout ( ( ) => {
638- SubWindow . close ( winId ! ) ;
639- } , 100 ) ;
640- } }
641- >
642- { t ( "actions.confirm" ) }
643- </ Button >
644- </ div >
645- </ div >
646- ) ;
647- }
648-
649- SubWindow . create ( {
650- title : t ( "actions.generate.generateNodeTreeByText" ) ,
651- titleBarOverlay : true ,
652- closable : true ,
653- rect : new Rectangle ( Vector . same ( 100 ) , new Vector ( 600 , 450 ) ) ,
654- children : < CustomDialog /> ,
655- } ) ;
656- } ) ;
657-
658- if ( result ) {
659- activeProject ?. stageManager . generateNodeTreeByText ( result . text , result . indention ) ;
660- }
587+ GenerateNodeTree . open ( ) ;
661588 } }
662589 >
663- < RefreshCcwDot />
590+ < Network className = "-rotate-90" />
664591 { t ( "actions.generate.generateNodeTreeByText" ) }
665592 </ Item >
593+ < Item
594+ onClick = { async ( ) => {
595+ GenerateNodeGraph . open ( ) ;
596+ } }
597+ >
598+ < GitCompareArrows />
599+ { t ( "actions.generate.generateNodeGraphByText" ) }
600+ </ Item >
666601 </ SubContent >
667602 </ Sub >
668603 { /* 清空舞台最不常用,放在最后一个 */ }
0 commit comments