package Ġsilent orb . my th ic . editing . updating Ċ Ċ import Ġsilent orb . my th ic . editing . components . name Text Ċ import Ġsilent orb . my th ic . editing . main .* Ċ import Ġsilent orb . my th ic . ent .* Ċ import Ġsilent orb . my th ic . ent . sc ener y . get Absolute Node Transform Ċ import Ġsilent orb . my th ic . ent . sc ener y . get Graph Roots Ċ import Ġsilent orb . my th ic . ent . sc ener y . getLocal Node Transform Ċ import Ġsilent orb . my th ic . ent . sc ener y . remove Nodes And Children Ċ import Ġsilent orb . my th ic . h appen ings . handle Commands Ċ import Ġsilent orb . my th ic . sc ener y . Scene Properties Ċ import Ġsilent orb . my th ic . spatial . Matrix Ċ Ċ fun Ġduplicate Node ( graph : ĠGraph , Ġnode : ĠKey ): ĠGraph Ġ{ ĊĠ Ġval Ġparent Ġ= ĠgetNode Value < String >( graph , Ġnode , ĠScene Properties . parent ) ĊĠ Ġreturn Ġif Ġ( parent Ġ== Ġnull ) ĊĠĠĠ Ġgraph ĊĠ Ġelse Ġ{ ĊĠĠĠ Ġval Ġselected Ġ= Ġgather Selection Hierarchy ( graph , Ġset Of ( node )) Ġ+ ĊĠĠĠĠĠĠĠ ĠEntry ( node , ĠScene Properties . parent , Ġparent ) ĊĊĠĠĠ Ġmerge Graph sWith Ren aming ( graph , Ġselected ) ĊĠ Ġ} Ċ } Ċ Ċ // ĠOnly Ġreturns Ġthe Ġneeded Ġchange Ġentries , Ġnot Ġthe Ġwhole Ġgraph Ċ fun Ġtransform Node ( graph : ĠGraph , Ġnode : ĠKey , Ġtransform : ĠMatrix ): ĠGraph Ġ{ ĊĠ Ġval Ġprevious Ġ= Ġget Local Node Transform ( graph , Ġnode ) ĊĠ Ġval Ġnext Ġ= Ġtransform Ġ* Ġprevious ĊĠ Ġreturn ĠlistOf NotNull ( ĊĠĠĠĠĠ Ġif Ġ( next . translation () Ġ!= Ġprevious . translation ()) ĊĠĠĠĠĠĠĠ ĠEntry ( node , ĠScene Properties . translation , Ġnext . translation ()) ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠ Ġif Ġ( next . rotation () Ġ!= Ġprevious . rotation ()) ĊĠĠĠĠĠĠĠ ĠEntry ( node , ĠScene Properties . rotation , Ġnext . rotation ()) ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠ Ġif Ġ( next . get Scale () Ġ!= Ġprevious . get Scale ()) ĊĠĠĠĠĠĠĠ ĠEntry ( node , ĠScene Properties . scale , Ġnext . get Scale ()) ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġnull , ĊĠ Ġ) Ċ } Ċ Ċ fun Ġupdate Scene Graph ( editor : ĠEditor ) Ġ= Ġhandle Commands < Graph > Ġ{ Ġcommand , Ġgraph Ġ-> ĊĠ Ġval Ġselection Ġ= ĠgetNode Selection ( editor ) ĊĊĠ Ġwhen Ġ( command . type ) Ġ{ ĊĊĠĠĠ ĠEditor Commands . add Node Ġ-> Ġ{ ĊĠĠĠĠĠ Ġif Ġ( selection . size Ġ!= Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġgraph ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselected Ġ= Ġselection . first () ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġname Text . get () ĊĠĠĠĠĠĠĠ Ġgraph Ġ+ ĠEntry ( key , ĠScene Properties . parent , Ġselected ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠEditor Commands . paste Node Ġ-> Ġ{ ĊĠĠĠĠĠ Ġval Ġclipboard Ġ= Ġeditor . clipboard ĊĠĠĠĠĠ Ġif Ġ( clipboard Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġgraph ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Selection Ġ= Ġselection . first () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( clipboard . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠClip board DataTypes . scene Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selection . size Ġ!= Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġclipboard . data Ġas ĠGraph ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Clipboard Graph Ġ= Ġprepare Graph For Mer ging ( graph , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroots Ġ= Ġget Graph Roots ( new Clipboard Graph ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġglue Ġ= Ġroots . map Ġ{ ĠEntry ( it , ĠScene Properties . parent , Ġnode Selection ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġgraph Ġ+ Ġnew Clipboard Graph Ġ+ Ġglue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠClip board DataTypes . properties Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġclipboard . data Ġas ĠGraph ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Entries Ġ= Ġselection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . map Ġ{ Ġit . copy ( source Ġ= Ġnode ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge Graphs ( editor . enum er ations . schema , Ġgraph , Ġnew Entries ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġgraph ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠEditor Commands . duplicate Node Ġ-> Ġ{ ĊĠĠĠĠĠ Ġif Ġ( selection . size Ġ!= Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġgraph ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġselection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( graph , Ġ:: duplicate Node ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠEditor Commands . rename Node Ġ-> Ġ{ ĊĠĠĠĠĠ Ġif Ġ( selection . size Ġ!= Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġgraph ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselected Ġ= Ġselection . first () ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġcommand . value Ġas ? ĠString Ġ?: Ġname Text . get () ĊĠĠĠĠĠĠĠ Ġrename Node ( graph , Ġselected , Ġkey ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠEditor Commands . move Node Ġ-> Ġ{ ĊĠĠĠĠĠ Ġval Ġpair Ġ= Ġcommand . value Ġas ? ĠPair < *, Ġ*> ĊĠĠĠĠĠ Ġval Ġnode Ġ= Ġpair ?. first Ġas ? ĠString ĊĠĠĠĠĠ Ġval Ġnew Parent Ġ= Ġpair ?. second Ġas ? ĠString ĊĠĠĠĠĠ Ġif Ġ( node Ġ== Ġnull Ġ|| Ġnew Parent Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġgraph ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Parent Ġ= ĠgetNode Value < String >( graph , Ġnode , ĠScene Properties . parent ) !! ĊĠĠĠĠĠĠĠ Ġval Ġold Parent Transform Ġ= Ġget Absolute Node Transform ( graph , Ġold Parent ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Parent Transform Ġ= Ġget Absolute Node Transform ( graph , Ġnew Parent ) ĊĠĠĠĠĠĠĠ Ġval Ġtransform Ġ= Ġold Parent Transform Ġ* Ġnew Parent Transform . invert () ĊĠĠĠĠĠĠĠ Ġval Ġtransform Entries Ġ= Ġtransform Node ( graph , Ġnode , Ġtransform ) ĊĠĠĠĠĠĠĠ Ġval Ġchanges Ġ= ĠlistOf ( Entry ( node , ĠScene Properties . parent , Ġnew Parent )) Ġ+ Ġtransform Entries ĊĠĠĠĠĠĠĠ Ġreplace Values ( graph , Ġchanges ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠEditor Commands . move File Item Ġ-> Ġ{ ĊĠĠĠĠĠ Ġval Ġselected Ġ= Ġget Selected File Item ( editor ) ĊĠĠĠĠĠ Ġval Ġ( from , Ġto ) Ġ= Ġcommand . value Ġas ĠPair < String , ĠString > ĊĠĠĠĠĠ Ġval Ġprevious Ġ= Ġget FileName ( from ). split ('. '). first () ĊĠĠĠĠĠ Ġval Ġnext Ġ= Ġget FileName ( to ). split ('. '). first () ĊĠĠĠĠĠ Ġif Ġ( selected Ġ== Ġnull Ġ|| Ġprevious Ġ== Ġnext ) ĊĠĠĠĠĠĠĠ Ġgraph ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġgraph ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . property Ġ== ĠScene Properties . type Ġ&& Ġentry . target Ġ== Ġprevious ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . copy ( target Ġ= Ġnext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠEditor Commands . delete Node Ġ-> Ġ{ ĊĠĠĠĠĠ Ġremove Nodes And Children ( graph , Ġselection ) ĊĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠEditor Commands . set Graph Value Ġ-> Ġ{ ĊĠĠĠĠĠ Ġval Ġnew Entry Ġ= Ġcommand . value Ġas ĠEntry ĊĠĠĠĠĠ Ġif Ġ( is ManyToMany ( editor , Ġnew Entry . property )) ĊĠĠĠĠĠĠĠ Ġgraph Ġ+ Ġnew Entry ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġreplace Values ( graph , ĠlistOf ( new Entry )) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠEditor Commands . replace Graph Value Ġ-> Ġ{ ĊĠĠĠĠĠ Ġval Ġ( previous , Ġnext ) Ġ= Ġcommand . value Ġas ĠPair < Entry , ĠEntry > ĊĠĠĠĠĠ Ġ( graph Ġ- Ġprevious ) Ġ+ Ġnext ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠEditor Commands . remove Graph Value Ġ-> Ġ{ ĊĠĠĠĠĠ Ġval Ġentry Ġ= Ġcommand . value Ġas ĠEntry ĊĠĠĠĠĠ Ġgraph Ġ- ĠlistOf ( entry ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠ Ġval Ġhandler Ġ= Ġeditor . enum er ations . graph Editors [ command . type ] ĊĠĠĠĠĠ Ġif Ġ( handler Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġhandler ( editor , Ġcommand , Ġgraph ) ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġgraph ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ