package Ġme . j ray nor . objects . screen Ċ Ċ import Ġcom . moj ang . bl aze 3 d . matrix .* Ċ import Ġimg ui .* Ċ import Ġimg ui . extension . node d itor .* Ċ import Ġimg ui . extension . node d itor . flag .* Ċ import Ġimg ui . flag .* Ċ import Ġimg ui . type .* Ċ import Ġme . j ray nor . api . render .* Ċ import Ġme . j ray nor . api . core .* Ċ import Ġme . j ray nor . api . core . component .* Ċ import Ġme . j ray nor . api . core . impl .* Ċ import Ġme . j ray nor . api . utilities . enums .* Ċ import Ġme . j ray nor . logic . capability .* Ċ import Ġme . j ray nor . logic . select .* Ċ import Ġme . j ray nor . nodes .* Ċ import Ġme . j ray nor . render .* Ċ Ċ /** This Ġis Ġthe Ġimplementation Ġof Ġour Ġnode Ġscreen . Ġ**/ Ċ class ĠSing ularity Screen ( parent : ĠGraph TileEntity , Ġgraph In : ĠI Graph ? Ġ= Ġnull ) Ġ: ĠAbstract Node Screen ( parent , Ġgraph In ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġselected Nodes : ĠLong Array Ġ= Ġlong ArrayOf () ĊĠĠĠ Ġprivate Ġval Ġname Buffer Ġ= ĠIm String () ĊĠĠĠ Ġprivate Ġval Ġcontext Ġ= ĠNode Editor Context () ĊĠĠĠ Ġprivate Ġvar Ġpreviously Clicked Ġ= Ġfalse ; ĊĊĠĠĠ Ġ/** It 's Ġnot Ġfe asible Ġto Ġcache Ġthis Ġinside Ġthe Ġ[ IG raph ]. ĠStores Ġthe Ġfrom Ġand Ġto Ġlink Ġstate **/ ĊĠĠĠ Ġprivate Ġval Ġlinks Ġ= ĠHashMap < Long , ĠLink >() ĊĊĠĠĠ Ġ/** The Ġcurrent Ġlink Ġtarget **/ ĊĠĠĠ Ġprivate Ġvar Ġtarget Link : ĠLong Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġtarget Node : ĠLong Ġ= Ġ- 1 ĊĊĠĠĠ Ġ/** Stores Ġthe Ġadd able Ġnodes **/ ĊĠĠĠ Ġprivate Ġval Ġadd able Nodes : ĠMap < String , Ġ() Ġ-> ĠI Node > Ġ= ĊĠĠĠĠĠĠĠ Ġhash Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" Tick Node ") Ġ{ ĠTick Node (). apply Ġ{ Ġgraph Ġ= Ġthis @ Sing ularity Screen . graph ; Ġupdate Position ( this ) Ġ} Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" Extract Node ") Ġ{ ĠExtract Node (). apply Ġ{ Ġgraph Ġ= Ġthis @ Sing ularity Screen . graph ; Ġupdate Position ( this ) Ġ} Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" Link Node ") Ġ{ ĠLink Node (). apply Ġ{ Ġgraph Ġ= Ġthis @ Sing ularity Screen . graph ; Ġupdate Position ( this ) Ġ} Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" Var Node ") Ġ{ ĠVar Node (). apply Ġ{ Ġgraph Ġ= Ġthis @ Sing ularity Screen . graph ; Ġupdate Position ( this ) Ġ} Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" Filter Node ") Ġ{ ĠFilter Node (). apply Ġ{ Ġgraph Ġ= Ġthis @ Sing ularity Screen . graph ; Ġupdate Position ( this ) Ġ} Ġ}, ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** Keep Ġtrack Ġof Ġwhether Ġor Ġnot Ġwe Ġhave Ġcentered Ġour Ġself **/ ĊĠĠĠ Ġprivate Ġvar Ġhas Center ed Ġ= Ġfalse ĊĊĠĠĠ Ġ/** This Ġwill Ġmake Ġsure Ġour Ġnodes Ġare Ġin Ġthe Ġcorrect Ġpositions **/ ĊĠĠĠ Ġoverride Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . init () ĊĠĠĠĠĠĠĠ ĠNode Editor . setCurrent Editor ( context ) ĊĠĠĠĠĠĠĠ Ġgraph . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . graph X Ġ!= ĠFloat . MIN _ VALUE Ġ&& Ġit . graph Y Ġ!= ĠFloat . MIN _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode Editor . set Node Position ( it . nodeId . to Long (), Ġit . graph X , Ġit . graph Y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** This Ġwill Ġrender Ġour Ġmain Ġcontent Ġarea .** / ĊĠĠĠ Ġoverride Ġfun Ġrender Graph () Ġ{ ĊĠĠĠĠĠĠĠ ĠNode Editor . setCurrent Editor ( context ) ĊĠĠĠĠĠĠĠ ĠUser Interface . node Graph ( name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNode Editor . push Style Var ( Node Editor Style Var . Flow Speed , Ġ 7 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNode Editor . push Style Var ( Node Editor Style Var . Flow Marker Distance , Ġ 5 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph . forEach ( Node Renderer :: render ) Ġ// R enders Ġall Ġof Ġthe Ġnodes ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNode Editor . suspend () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsus pended () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph . forEach ( IN ode :: post Process ) Ġ// Process Ġall Ġof Ġthe Ġsus pended Ġfor Ġthe Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNode Editor . resume () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Links () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Links () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNode Editor . pop Style Var ( 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcenter Graph () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** This Ġwill Ġallow Ġus Ġto Ġadd Ġremove Ġand Ġdo Ġall Ġkinds Ġof Ġstuff Ġrel ating Ġto Ġnodes .** / ĊĠĠĠ Ġprivate Ġfun Ġsus pended () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode WithContext Menu Ġ= ĠNode Editor . getNode WithContext Menu () ĊĠĠĠĠĠĠĠ Ġvar Ġselected Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( node WithContext Menu Ġ!= Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Size Ġ= ĠNode Editor . getSelected Object Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Nodes Ġ= ĠLong Array ( node Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode Editor . getSelected Nodes ( selected Nodes , Ġnode Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . open Popup (" node _ multi _ context ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . getState Storage (). setInt ( ImGui . getID (" selected _ node _ size "), Ġnode Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Nodes . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( graph . has Node ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġselected Nodes Ġ= Ġlong ArrayOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Node Ġ= Ġnode WithContext Menu ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . open Popup (" node _ context ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . getState Storage (). setInt ( ImGui . getID (" selected _ node _ id "), Ġnode WithContext Menu . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlink WithContext Menu Ġ= ĠNode Editor . get Link WithContext Menu () ĊĠĠĠĠĠĠĠ Ġif Ġ( link WithContext Menu Ġ!= Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Link Ġ= Ġlink WithContext Menu ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . open Popup (" link _ context ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Node Editor . show Background ContextMenu ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . open Popup (" node _ editor _ context ") ĊĊĠĠĠĠĠĠĠ Ġadd Context () ĊĠĠĠĠĠĠĠ Ġnode Context () ĊĠĠĠĠĠĠĠ Ġmulti Node Context () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Shows Ġour Ġadd Ġcontext Ġwhen Ġrequested **/ ĊĠĠĠ Ġprivate Ġfun Ġadd Context () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ImGui . begin Popup (" node _ editor _ context ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . text (" Add Ġnodes ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . separator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add able Nodes . forEach Ġ{ Ġ( name , Ġsupplier ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ImGui . button ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġsupplier () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( graph . add Node ( node )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode Editor . set Node Position ( node . nodeId , Ġnode . graph X , Ġnode . graph Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Update () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . close Current Popup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . end Popup () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** This Ġwill Ġopen Ġa Ġpopup Ġfor Ġdeleting Ġthe Ġcurrently Ġselected Ġnode . Ġthere Ġis Ġa Ġcallback Ġin Ġthe Ġnode Ġgraph **/ ĊĠĠĠ Ġprivate Ġfun Ġmulti Node Context () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ImGui . is Popup Open (" node _ multi _ context ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ImGui . begin Popup (" node _ multi _ context ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ImGui . button (" Delete Ġ${ selected Nodes . size } Ġnode ( s ) ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( node In Ġin Ġthis . selected Nodes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Remove Ġ= Ġgraph . find Node ( node In ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( to Remove ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( graph . remove Node ( to Remove )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode Editor . delete Node ( node In ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Update () Ġ// We Ġwant Ġto Ġinform Ġthe Ġserver Ġgraph Ġof Ġthe Ġdeletion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . close Current Popup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . end Popup () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** This Ġwill Ġopen Ġa Ġpopup Ġfor Ġdeleting Ġthe Ġcurrently Ġselected Ġnode . Ġthere Ġis Ġa Ġcallback Ġin Ġthe Ġnode Ġgraph **/ ĊĠĠĠ Ġprivate Ġfun Ġnode Context () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġopen Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( ImGui . is Popup Open (" node _ context ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ImGui . begin Popup (" node _ context ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ImGui . button (" Delete Ġnode ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Node Ġ!= Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Remove Ġ= Ġgraph . find Node ( target Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( graph . remove Node ( to Remove )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode Editor . delete Node ( target Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Node Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Update () Ġ// We Ġwant Ġto Ġinform Ġthe Ġserver Ġgraph Ġof Ġthe Ġdeletion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . close Current Popup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ImGui . button (" Copy Ġnode ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Copy Ġ= Ġgraph . find Node ( target Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( graph . remove Node ( to Copy )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Update () Ġ// We Ġwant Ġto Ġinform Ġthe Ġserver Ġgraph Ġof Ġthe Ġdeletion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . close Current Popup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ImGui . button (" Rename Ġnode ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . close Current Popup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . end Popup () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( open ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . open Popup (" Rename Ġnode ") ĊĠĠĠĠĠĠĠ Ġif Ġ( ImGui . begin Popup (" Rename Ġnode ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Node Ġ!= Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Rename Ġ= Ġgraph . find Node ( target Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Buffer . set ( to Rename . title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . set Keyboard Focus Here () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . push Item Width ( 8 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ImGui . input Text (" name ", Ġname Buffer , ĠImGui Input Text Flags . Enter Returns True )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Rename . title Ġ= Ġname Buffer . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Rename . push Update () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . close Current Popup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . end Popup () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( ImGui . is Popup Open (" link _ context ") Ġ&& Ġtarget Link Ġ!= Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ImGui . begin Popup (" link _ context ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ImGui . button (" Delete Ġlink ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( links . containsKey ( target Link )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlink Ġ= Ġlinks [ target Link ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġlink . source Node ( graph ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source Ġis ĠI Container Ġ&& Ġsource . has ( Link able :: class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source [ Link able :: class ]. remove ( target Link )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph . remove Links References ( link ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Update () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinks . remove ( target Link ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . push Update () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Link Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . close Current Popup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . end Popup () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** This Ġwill Ġcreate Ġa Ġnew Ġnode Ġof Ġthe Ġgiven Ġtype Ġand Ġreturn Ġit **/ ĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠI Node > Ġupdate Position ( node : ĠT ): ĠT Ġ= Ġnode . apply Ġ{ ĊĠĠĠĠĠĠĠ Ġgraph X Ġ= ĠNode Editor . to Canvas X ( ImGui . get Mouse Pos X ()) ĊĠĠĠĠĠĠĠ Ġgraph Y Ġ= ĠNode Editor . to Canvas Y ( ImGui . get Mouse Pos Y ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** R enders Ġthe Ġlinks Ġbetween Ġnodes **/ ĊĠĠĠ Ġprivate Ġfun Ġrender Links () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Node Editor . begin Create ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠIm Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠIm Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Node Editor . query New Link ( a , Ġb )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlink Ġ= ĠLink ( a . get (), Ġb . get (), ĠInput Output . Output ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( link . isValid ( graph )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Node Editor . accept New Item ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlink Id Ġ= Ġgraph . next Id () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattempt Link ( link Id , Ġlink . source Node ( graph ), Ġlink ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph . add Links ( link . target Id , ĠLink ( b . get (), Ġa . get (), ĠInput Output . Input )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Update () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠNode Editor . end Create () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** This Ġshould Ġcreate Ġa Ġlink Ġbetween Ġthe Ġgive Ġnodes **/ ĊĠĠĠ Ġprivate Ġfun Ġattempt Link ( link Id : ĠLong , Ġnode : ĠI Node , Ġlink : ĠLink ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( node Ġ! is ĠI Container ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ(! node . has ( Link able :: class )) Ġreturn ĊĠĠĠĠĠĠĠ Ġnode [ Link able :: class ]. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [ link Id ] Ġ= Ġlink ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnode . push Update () ĊĠĠĠĠĠĠĠ Ġprintln (" updated Ġconnection Ġfor Ġnode Ġfor Ġlink able : Ġ${ link . toString ( link Id , Ġgraph )} ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġwill Ġrender Ġthe Ġlinks Ġof Ġthe Ġgraph ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġprocess Links () Ġ{ ĊĠĠĠĠĠĠĠ Ġgraph . filter Ġ{ Ġit Ġis ĠI Container Ġ&& Ġit . has ( Link able :: class ) Ġ}. forEach Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlink able Ġ= Ġ( node Ġas ĠI Container )[ Link able :: class ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlink able . forEach Ġret @{ Ġlink Id , Ġlink Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( link . source Node ( graph ). nodeId Ġ== Ġnode . nodeId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinks [ link Id ] Ġ= Ġlink ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode Editor . link ( link Id , Ġlink . source Id , Ġlink . target Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Ġis ĠTick Node Ġ&& Ġnode . isEnabled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode Editor . flow ( link Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( link . target Node ( graph ). isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinks . remove ( link Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlink able . remove ( link Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph . remove Node ( link . target Node ( graph )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Update () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ ret ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Handles Ġthe Ġcenter ing Ġof Ġthe Ġgraph **/ ĊĠĠĠ Ġprivate Ġfun Ġcenter Graph () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcenter Ġ= ĠUser Interface . getContent Center () ĊĠĠĠĠĠĠĠ Ġval Ġgraph X Ġ= ĠNode Editor . to Canvas X ( center . x ) ĊĠĠĠĠĠĠĠ Ġval Ġgraph Y Ġ= ĠNode Editor . to Canvas Y ( center . y ) ĊĠĠĠĠĠĠĠ Ġgraph . center X Ġ= Ġgraph X ĊĠĠĠĠĠĠĠ Ġgraph . center Y Ġ= Ġgraph Y ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Center ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNode Editor . navigate To Content ( 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Center ed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** This Ġwill Ġrender Ġthe Ġside Ġpanel / properties Ġwindow .** / ĊĠĠĠ Ġoverride Ġfun Ġrender Variables () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġgraph . filter Is Instance < Var Node >(). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġif Ġ( it . title Ġ== Ġ" Variable ") Ġ" Variable Ġ#$ count " Ġelse Ġit . title ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ImGui . tree Node ("${ name } ## ${ it . nodeId } ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . render Content ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . tree Pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** This Ġwill Ġrender Ġour Ġnode Ġscreen **/ ĊĠĠĠ Ġoverride Ġfun Ġrender ( matrix Stack : ĠMatrix Stack , Ġmouse X : ĠInt , ĠmouseY : ĠInt , Ġpartial Ticks : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . render ( matrix Stack , Ġmouse X , ĠmouseY , Ġpartial Ticks ) ĊĠĠĠĠĠĠĠ Ġthis . graph . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠI Selectable Ġ&& Ġit . should Close ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . onClose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . should Close Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Update Ġthe Ġserver Ġof Ġthe Ġgraph Ġwhen Ġwe Ġclose Ġthe Ġscreen **/ ĊĠĠĠ Ġoverride Ġfun Ġremoved () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠIm Vec 2 () ĊĠĠĠĠĠĠĠ Ġgraph . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNode Editor . getNode Position ( it . nodeId . to Long (), Ġbuffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . graph X Ġ= Ġbuffer . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . graph Y Ġ= Ġbuffer . y ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpush Update () ĊĠĠĠĠĠĠĠ Ġcontext . destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtick () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmouse Clicked Ġ= ĠImGui . is MouseDown ( 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! mouse Clicked Ġ&& Ġpreviously Clicked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Context () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }