package Ġpw . bin om . scene Editor Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġm og ot . Node Ċ import Ġpw . bin om . Services Ċ import Ġpw . bin om . scene . Scene Ċ import Ġpw . bin om . scene Editor . node Controller . Editable Node Ċ Ċ object ĠScene File Loader Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmapper Ġ= ĠObjectMapper () ĊĠĠĠ Ġprivate Ġval Ġservices Ġby ĠServices . by Class Sequence ( Node Service :: class . java ) ĊĊĠĠĠ Ġfun Ġload Node ( view : ĠScene Editor View , Ġfile : ĠVirtual File , Ġnode : ĠScene . Node ): ĠNode ? Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġservices . map Ġ{ Ġit . load ( view , Ġfile , Ġnode . className , Ġnode . properties ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġservices . filter Ġ{ Ġit . node Class Ġ== Ġnode . className Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . newInstance ( view ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Can 't Ġload Ġ${ node . className }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġout . id Ġ= Ġnode . id ĊĠĠĠĠĠĠĠ Ġnode . properties . forEach Ġ{ Ġ( k , Ġv ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("${ node . className } Ġ-> Ġ$ k ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Ġas ĠEdit able Node ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġout . get Editable Fields (). find Ġ{ Ġit . name Ġ== Ġk Ġ} Ġ?: Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . current Value Ġ= Ġm og ot . Field . Type . from Text ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( view . getService ( out )?. is Internal Child s ( out ) Ġ!= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . child s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Node ( view , Ġfile , Ġit )?. parent Ġ= Ġout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġout Ġas ĠEdit able Node ĊĠĠĠĠĠĠĠ Ġout . after Init () ĊĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload ( view : ĠScene Editor View , Ġfile : ĠVirtual File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscene Ġ= Ġfile . inputStream . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScene . load ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġscene . child s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Node ( view , Ġfile , Ġit )?. parent Ġ= Ġview . scene Root ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave ( view : ĠScene Editor View , Ġfile : ĠVirtual File ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġsave Node ( node : ĠNode ): ĠScene . Node ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeditable Ġ= Ġnode Ġas ĠEdit able Node ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= ĠHashMap < String , ĠString >(); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeditable . get Editable Fields (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperties [ it . name ] Ġ= Ġit . fieldType . toString ( it . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getSub Fields (). forEach Ġ{ Ġsub Field Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperties [" ${ it . name }> ${ sub Field . name } "] Ġ= Ġsub Field . fieldType . toString ( sub Field . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild s Ġ= Ġif Ġ( view . getService ( node )?. is Internal Child s ( node ) Ġ!= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . child s . map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Node ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= Ġview . getService ( node )?. get ClassName ( node ) Ġ?: Ġnode :: class . java . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠScene . Node ( id Ġ= Ġnode . id , ĠclassName Ġ= ĠclassName , Ġproperties Ġ= Ġproperties , Ġchild s Ġ= Ġchild s ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Write Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . get OutputStream ( view ). use Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScene ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scene Root . child s . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Node ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. filter NotNull (), ĠScene . Type . D 3 ). save ( stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }