package Ġcom . so y wiz . k orge . view . k tree Ċ Ċ import Ġcom . so y wiz . k ds .* Ċ import Ġcom . so y wiz . k ds . iter ators .* Ċ import Ġcom . so y wiz . k orge . annotations .* Ċ import Ġcom . so y wiz . k orge . particle .* Ċ import Ġcom . so y wiz . k orge . t iled .* Ċ import Ġcom . so y wiz . k orge . ui .* Ċ import Ġcom . so y wiz . k orge . view .* Ċ import Ġcom . so y wiz . k orge . view . Blend Mode Ċ import Ġcom . so y wiz . k orge . view . grid .* Ċ import Ġcom . so y wiz . kor im . bitmap .* Ċ import Ġcom . so y wiz . kor im . color .* Ċ import Ġcom . so y wiz . kor im . text .* Ċ import Ġcom . so y wiz . kor im . vector .* Ċ import Ġcom . so y wiz . kor io . file .* Ċ import Ġcom . so y wiz . kor io . serialization . xml .* Ċ import Ġcom . so y wiz . k orm a . geom .* Ċ import Ġkotlin . jvm .* Ċ import Ġkotlin . reflect .* Ċ Ċ interface ĠK Tree Serializer Holder Ġ{ ĊĠĠĠ Ġval Ġserializer : ĠK Tree Serializer Ċ } Ċ Ċ open Ġclass ĠK Tree Serializer Extension ( val Ġname : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġname LC Ġ= Ġname . toLowerCase () ĊĊĠĠĠ Ġopen Ġfun Ġcomplete ( serializer : ĠK Tree Serializer , Ġview : ĠView ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġget Props ( serializer : ĠK Tree Serializer , Ġview : ĠView ): ĠMap < String , ĠAny ?> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġset Props ( serializer : ĠK Tree Serializer , Ġview : ĠView , Ġxml : ĠXml ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġextend ( serializer : ĠK Tree Serializer , Ġview : ĠView , Ġxml : ĠXml ): ĠXml Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprops Ġ= Ġget Props ( serializer , Ġview ) Ġ?: Ġreturn Ġxml ĊĠĠĠĠĠĠĠ Ġreturn Ġxml . with Extra Child ( Xml ("${ K Tree Serializer .__ ex _ }$ name ", Ġprops )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠK Tree Serializer Ext < T Ġ: ĠView >( val Ġname : ĠString , Ġval Ġclazz : ĠK Class < T >, Ġval Ġfactory : Ġ() Ġ-> ĠT , Ġval Ġblock : ĠK Tree Serializer Ext < T >. () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġname LC Ġ= Ġname . toLowerCase () ĊĠĠĠ Ġdata Ġclass ĠProp < T , ĠR >( val Ġprop : ĠK Mutable Property 1 < T , ĠR >, Ġval Ġdefault : ĠR ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġget () Ġ= Ġprop . name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠCustom Prop < T , ĠR >( val Ġprop : ĠK Mutable Property 1 < T , ĠR >, Ġval Ġserialize : Ġ( String ) Ġ-> ĠR , Ġval Ġdeserialize : Ġ( R ) Ġ-> ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġget () Ġ= Ġprop . name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġprops Boolean Ġ= Ġarray ListOf < Prop < T , ĠBoolean >>() ĊĠĠĠ Ġval Ġprops String Ġ= Ġarray ListOf < Prop < T , ĠString >>() ĊĠĠĠ Ġval Ġprops String Null Ġ= Ġarray ListOf < Prop < T , ĠString ? >>() ĊĠĠĠ Ġval Ġprops Double Ġ= Ġarray ListOf < Prop < T , ĠDouble >>() ĊĠĠĠ Ġval Ġprops Int Ġ= Ġarray ListOf < Prop < T , ĠInt >>() ĊĠĠĠ Ġval Ġprops RGBA Ġ= Ġarray ListOf < Prop < T , ĠRGBA >>() ĊĠĠĠ Ġval Ġprops Custom Ġ= Ġarray ListOf < Custom Prop < T , Ġ* >>() ĊĊĠĠĠ Ġval Ġall Props List Ġ= ĠlistOf ( props Boolean , Ġprops String , Ġprops String Null , Ġprops Double , Ġprops Int , Ġprops RGBA ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Name (" add Custom ") ĊĠĠĠ Ġfun Ġ< R > Ġadd ( prop : ĠK Mutable Property 1 < T , ĠR >, Ġserialize : Ġ( String ) Ġ-> ĠR , Ġdeserialize : Ġ( R ) Ġ-> ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprops Custom . add ( Custom Prop ( prop , Ġserialize , Ġdeserialize )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Name (" add Boolean ") ĊĠĠĠ Ġfun Ġadd ( prop : ĠK Mutable Property 1 < T , ĠBoolean >, Ġdefault : ĠBoolean Ġ= Ġfalse ) Ġ= Ġprops Boolean . add ( Prop ( prop , Ġdefault )) ĊĊĠĠĠ Ġ@ Jvm Name (" add String ") ĊĠĠĠ Ġfun Ġadd ( prop : ĠK Mutable Property 1 < T , ĠString >, Ġdefault : ĠString Ġ= Ġ"") Ġ= Ġprops String . add ( Prop ( prop , Ġdefault )) ĊĊĠĠĠ Ġ@ Jvm Name (" add String Null ") ĊĠĠĠ Ġfun Ġadd ( prop : ĠK Mutable Property 1 < T , ĠString ?> ) Ġ= Ġprops String Null . add ( Prop ( prop , Ġnull )) ĊĊĠĠĠ Ġ@ Jvm Name (" add Double ") ĊĠĠĠ Ġfun Ġadd ( prop : ĠK Mutable Property 1 < T , ĠDouble >, Ġdefault : ĠDouble Ġ= Ġ 0 . 0 ) Ġ= Ġprops Double . add ( Prop ( prop , Ġdefault )) ĊĊĠĠĠ Ġ@ Jvm Name (" add Int ") ĊĠĠĠ Ġfun Ġadd ( prop : ĠK Mutable Property 1 < T , ĠInt >, Ġdefault : ĠInt Ġ= Ġ 0 ) Ġ= Ġprops Int . add ( Prop ( prop , Ġdefault )) ĊĊĠĠĠ Ġ//@ Jvm Name (" add RGBA ") ĊĠĠĠ Ġfun Ġadd ( prop : ĠK Mutable Property 1 < T , ĠRGBA >, Ġdefault : ĠRGBA Ġ= ĠColors . WHITE ) Ġ= Ġprops RGBA . add ( Prop ( prop , Ġdefault )) ĊĊĠĠĠ Ġopen Ġsuspend Ġfun Ġk tree To View Tree ( xml : ĠXml , Ġcurrent V fs : ĠV fs File ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( xml . name LC Ġ!= Ġname LC ) Ġerror (" Not Ġa Ġ'$ name LC ' Ġ($ clazz ) Ġ: Ġ${ xml . name LC }") ĊĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġfactory () ĊĠĠĠĠĠĠĠ Ġprops Boolean . fast ForEach Ġ{ Ġit . prop . set ( instance , Ġxml . str ( it . prop . name , Ġ"${ it . default }") Ġ== Ġ" true ") Ġ} ĊĠĠĠĠĠĠĠ Ġprops String . fast ForEach Ġ{ Ġit . prop . set ( instance , Ġxml . str ( it . prop . name , Ġit . default )) Ġ} ĊĠĠĠĠĠĠĠ Ġprops String Null . fast ForEach Ġ{ Ġit . prop . set ( instance , Ġxml . str Null ( it . prop . name )) Ġ} ĊĠĠĠĠĠĠĠ Ġprops RGBA . fast ForEach Ġ{ Ġit . prop . set ( instance , ĠColors [( xml . str Null ( it . prop . name ) Ġ?: Ġit . default . hex String )]) Ġ} ĊĠĠĠĠĠĠĠ Ġprops Double . fast ForEach Ġ{ Ġit . prop . set ( instance , Ġxml . double ( it . prop . name , Ġit . default )) Ġ} ĊĠĠĠĠĠĠĠ Ġprops Int . fast ForEach Ġ{ Ġit . prop . set ( instance , Ġxml . int ( it . prop . name , Ġit . default )) Ġ} ĊĠĠĠĠĠĠĠ Ġprops Custom . fast ForEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġas ĠCustom Prop < T , ĠAny > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . prop . set ( instance , Ġit . serialize ( xml . str ( it . prop . name ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġinstance ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġview Tree To K Tree ( view : ĠT , Ġcurrent V fs : ĠV fs File , Ġlevel : ĠInt , Ġprops : ĠMutable Map < String , ĠAny ?> ?): ĠXml Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( view :: class Ġ!= Ġclazz ) Ġerror (" Not Ġa Ġ'$ name ' Ġ($ clazz ) Ġ: Ġ$ view ") ĊĠĠĠĠĠĠĠ Ġif Ġ( props Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Props List . fast ForEach Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . fast ForEach Ġ{ Ġprops [ it . name ] Ġ= Ġit . prop . get ( view ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprops Custom . fast ForEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġas ĠCustom Prop < T , ĠAny > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprops [ it . name ] Ġ= Ġit . deserialize ( it . prop . get ( view )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠXml ( name LC , Ġprops ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Opt In ( K orge Experimental :: class ) Ċ open Ġclass ĠK Tree Serializer ( val Ġviews : ĠViews ) Ġ: ĠK Tree Serializer Holder , ĠExtra Ġby ĠExtra . Mixin () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġserializer Ġget () Ġ= Ġthis ĊĊĠĠĠ Ġval Ġregist rations Ext Ġ= Ġmutable Set Of < K Tree Serializer Ext <* >>() ĊĠĠĠ Ġprivate Ġval Ġregist rations By Class Ġ= ĠLinkedHashMap < K Class <* >, ĠK Tree Serializer Ext <* >>() ĊĠĠĠ Ġprivate Ġval Ġregist rations ByName LC Ġ= ĠLinkedHashMap < String , ĠK Tree Serializer Ext <* >>() ĊĠĠĠ Ġprivate Ġval Ġregist rations Ġ= Ġmutable Set Of < Registration >() ĊĠĠĠ Ġval Ġextensions Ġ= Ġmutable Set Of < K Tree Serializer Extension >() ĊĠĠĠ Ġval Ġextensions ByName Ġ= ĠLinkedHashMap < String , ĠK Tree Serializer Extension >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġregister ( UIT ext Button . Serializer ) ĊĠĠĠĠĠĠĠ Ġregister ( Text . Serializer ) ĊĠĠĠĠĠĠĠ Ġregister ( UI ProgressBar . Serializer ) ĊĠĠĠĠĠĠĠ Ġregister ( UIC heck Box . Serializer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠRegistration ( ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġde serializer : Ġsuspend Ġ( xml : ĠXml ) Ġ-> ĠView ?, ĊĠĠĠĠĠĠĠ Ġval Ġserializer : Ġ( view : ĠView , Ġproperties : ĠMutable Map < String , ĠAny ?> ?) Ġ-> ĠXml ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" K Tree Serializer ($ name )" ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Ġ== Ġnull Ġ|| Ġthis :: class Ġ!= Ġother :: class ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġas ĠRegistration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġother . name ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġname . hashCode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister Extension ( ext : ĠK Tree Serializer Extension ) Ġ{ ĊĠĠĠĠĠĠĠ Ġextensions Ġ+= Ġext ĊĠĠĠĠĠĠĠ Ġextensions ByName [ ext . name LC ] Ġ= Ġext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister ( registration : ĠK Tree Serializer Ext <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġregist rations Ext . add ( registration ) ĊĠĠĠĠĠĠĠ Ġregist rations By Class [ registration . clazz ] Ġ= Ġregistration ĊĠĠĠĠĠĠĠ Ġregist rations ByName LC [ registration . name LC ] Ġ= Ġregistration ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister ( registration : ĠRegistration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġregist rations . add ( registration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister ( name : ĠString , Ġde serializer : Ġsuspend Ġ( xml : ĠXml ) Ġ-> ĠView ?, Ġserializer : Ġ( view : ĠView , Ġproperties : ĠMutable Map < String , ĠAny ?> ?) Ġ-> ĠXml ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġregister ( Registration ( name , Ġde serializer , Ġserializer )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġsuspend Ġfun Ġk tree To View Tree ( xml : ĠXml , Ġcurrent V fs : ĠV fs File , Ġparent : ĠContainer ?): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġk tree To View Tree Internal ( xml , Ġcurrent V fs , Ġparent ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( extension Ġin Ġextensions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextension . complete ( this , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġsuspend Ġfun Ġk tree To View Tree Internal ( xml : ĠXml , Ġcurrent V fs : ĠV fs File , Ġparent : ĠContainer ?): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġview : ĠView ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġwhen Ġ( xml . name LC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" solid rect " Ġ-> Ġview Ġ= ĠSolid Rect ( 1 0 0 , Ġ 1 0 0 , ĠColors . RED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ellipse " Ġ-> Ġview Ġ= ĠEl lipse ( 5 0 . 0 , Ġ 5 0 . 0 , ĠColors . RED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" container " Ġ-> Ġview Ġ= ĠContainer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" image " Ġ-> Ġview Ġ= ĠImage ( Bit maps . transparent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" vector image " Ġ-> Ġview Ġ= ĠVector Image . create Default () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" tree view ref " Ġ-> Ġview Ġ= ĠTree View Ref () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" particle " Ġ-> Ġview Ġ= ĠParticle Emitter View ( Particle Emitter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" animation " Ġ-> Ġview Ġ= ĠAnimation View Ref () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" t iled map ref " Ġ-> Ġview Ġ= ĠT iled MapView Ref () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" n ine patch " Ġ-> Ġview Ġ= ĠN ine Patch Ex ( N ine Patch Bitmap 3 2 ( Bitmap 3 2 ( 6 2 , Ġ 6 2 ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" k tree " Ġ-> Ġview Ġ= ĠK Tree Root ( 1 0 0 . 0 , Ġ 1 0 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregistration Ġ= Ġregist rations ByName LC [ xml . name LC ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( registration Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Ġ= Ġregistration . k tree To View Tree ( xml , Ġcurrent V fs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( registration Ġin Ġregist rations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Ġ= Ġregistration . de serializer ( xml ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Ġ!= Ġnull ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( view Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" Unsupported Ġnode Ġ'${ xml . name }' ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( view Ġis ĠView File Ref ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource File Ġ= Ġxml . str (" source File ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source File . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . force Load SourceFile ( views , Ġcurrent V fs , Ġsource File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdouble ( prop : ĠK Mutable Property 0 < Double >, ĠdefaultValue : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprop . set ( xml . double ( prop . name , ĠdefaultValue )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġangle Degrees ( prop : ĠK Mutable Property 0 < Angle >, ĠdefaultValue : ĠAngle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprop . set ( xml . double ( prop . name , ĠdefaultValue . degrees ). degrees ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcolor ( prop : ĠK Mutable Property 0 < RGBA >, ĠdefaultValue : ĠRGBA ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprop . set ( Colors [( xml . str Null ( prop . name ) Ġ?: ĠdefaultValue . hex String )]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġstring ( prop : ĠK Mutable Property 0 < String >, ĠdefaultValue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprop . set ( xml . str ( prop . name , ĠdefaultValue )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġstring Null ( prop : ĠK Mutable Property 0 < String ?> ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprop . set ( xml . str Null ( prop . name )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġboolean ( prop : ĠK Mutable Property 0 < Boolean >, ĠdefaultValue : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprop . set ( xml . boolean ( prop . name , ĠdefaultValue )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstring Null ( view :: name ) ĊĠĠĠĠĠĠĠ Ġcolor ( view :: color Mul , ĠColors . WHITE ) ĊĠĠĠĠĠĠĠ Ġdouble ( view :: alpha , Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠ Ġdouble ( view :: speed , Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠ Ġdouble ( view :: ratio , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġdouble ( view :: x , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġdouble ( view :: y , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġangle Degrees ( view :: rotation , Ġ 0 . degrees ) ĊĠĠĠĠĠĠĠ Ġdouble ( view :: scale X , Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠ Ġdouble ( view :: scale Y , Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠ Ġangle Degrees ( view :: skew X , Ġ 0 . degrees ) ĊĠĠĠĠĠĠĠ Ġangle Degrees ( view :: skew Y , Ġ 0 . degrees ) ĊĠĠĠĠĠĠĠ Ġif Ġ( view Ġis ĠRect Base ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdouble ( view :: anchor X , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdouble ( view :: anchor Y , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdouble ( view :: width , Ġ 1 0 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdouble ( view :: height , Ġ 1 0 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( view Ġis ĠN ine Patch Ex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdouble ( view :: width , Ġ 1 0 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdouble ( view :: height , Ġ 1 0 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( view Ġis ĠText ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring ( view :: text , Ġ" Text ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdouble ( view :: text Size , ĠText . DEFAULT _ TEXT _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboolean ( view :: auto Scaling , ĠText . DEFAULT _ AUTO _ SCAL ING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// view . font Source Ġ= Ġxml . str (" font Source ", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . vertical Align Ġ= ĠVertical Align ( xml . str (" vertical Align ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . horizontal Align Ġ= ĠHorizontal Align ( xml . str (" horizontal Align ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( view Ġis ĠK Tree Root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . width Ġ= Ġxml . double (" width ", Ġ 5 1 2 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . height Ġ= Ġxml . double (" height ", Ġ 5 1 2 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . grid . width Ġ= Ġxml . int (" grid Width ", Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . grid . height Ġ= Ġxml . int (" grid Height ", Ġ 2 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview . blend Mode Ġ= ĠBlend Mode [ xml . str (" blend Mode ", Ġ" IN HER IT ")] ĊĊĠĠĠĠĠĠĠ Ġparent ?. addChild ( view ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( view Ġis ĠContainer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( node Ġin Ġxml . all Node Children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . name LC . startsWith (__ ex _)) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk tree To View Tree Internal ( node , Ġcurrent V fs , Ġview ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( node Ġin Ġxml . all Node Children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! node . name LC . startsWith (__ ex _)) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextension Name Ġ= Ġnode . name LC . remove Prefix (__ ex _) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextension Ġ= Ġextensions ByName [ extension Name ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( extension Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Can 't Ġfind Ġextension Ġ$__ ex _ Ġ: Ġextension Name =$ extension Name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextension ?. set Props ( this , Ġview , Ġnode ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġview ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġview Tree To K Tree ( view : ĠView , Ġcurrent V fs : ĠV fs File , Ġlevel : ĠInt ): ĠXml Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= ĠLinkedHashMap < String , ĠAny ?> () ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd ( prop : ĠK Property 0 <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperties [ prop . name ] Ġ= Ġprop . get () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġadd ( prop : ĠK Property 0 < Angle >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperties [ prop . name ] Ġ= Ġprop . get (). degrees ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( view . name Ġ!== Ġnull ) Ġadd ( view :: name ) ĊĠĠĠĠĠĠĠ Ġif Ġ( view . color Mul Ġ!= ĠColors . WHITE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperties [" color Mul "] Ġ= Ġview . color Mul . hex String ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( view . blend Mode Ġ!= ĠBlend Mode . IN HER IT ) Ġadd ( view :: blend Mode ) ĊĠĠĠĠĠĠĠ Ġif Ġ( view . alpha Ġ!= Ġ 1 . 0 ) Ġadd ( view :: alpha ) ĊĠĠĠĠĠĠĠ Ġif Ġ( view . speed Ġ!= Ġ 1 . 0 ) Ġadd ( view :: speed ) ĊĠĠĠĠĠĠĠ Ġif Ġ( view . ratio Ġ!= Ġ 0 . 0 ) Ġadd ( view :: ratio ) ĊĠĠĠĠĠĠĠ Ġif Ġ( view . x Ġ!= Ġ 0 . 0 ) Ġadd ( view :: x ) ĊĠĠĠĠĠĠĠ Ġif Ġ( view . y Ġ!= Ġ 0 . 0 ) Ġadd ( view :: y ) ĊĠĠĠĠĠĠĠ Ġif Ġ( view . rotation Ġ!= Ġ 0 . radians ) Ġadd ( view :: rotation ) ĊĠĠĠĠĠĠĠ Ġif Ġ( view . scale X Ġ!= Ġ 1 . 0 ) Ġadd ( view :: scale X ) ĊĠĠĠĠĠĠĠ Ġif Ġ( view . scale Y Ġ!= Ġ 1 . 0 ) Ġadd ( view :: scale Y ) ĊĠĠĠĠĠĠĠ Ġif Ġ( view . skew X Ġ!= Ġ 0 . degrees ) Ġadd ( view :: skew X ) ĊĠĠĠĠĠĠĠ Ġif Ġ( view . skew Y Ġ!= Ġ 0 . degrees ) Ġadd ( view :: skew Y ) ĊĠĠĠĠĠĠĠ Ġif Ġ( view Ġis ĠRect Base ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view . anchor X Ġ!= Ġ 0 . 0 ) Ġadd ( view :: anchor X ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view . anchor Y Ġ!= Ġ 0 . 0 ) Ġadd ( view :: anchor Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( view :: width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( view :: height ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( view Ġis ĠN ine Patch Ex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( view :: width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( view :: height ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( view Ġis ĠView File Ref ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( view :: source File ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġr properties : ĠLinkedHashMap < String , ĠAny ?> ? Ġ= Ġif Ġ( level Ġ== Ġ 0 ) Ġnull Ġelse Ġproperties ĊĊĠĠĠĠĠĠĠ Ġval Ġregistration Ġ= Ġregist rations By Class [ view :: class ] ĊĠĠĠĠĠĠĠ Ġvar Ġout Ġ= Ġif Ġ( registration Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( registration Ġas ĠK Tree Serializer Ext < View >). view Tree To K Tree ( view , Ġcurrent V fs , Ġlevel , Ġr properties ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġregist rations . map Ġ{ Ġit . serializer ( view , Ġr properties ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġresults . filter NotNull (). first OrNull () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println (" regist rations : Ġ$ regist rations , Ġ$ result , Ġ$ results ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ?: Ġwhen Ġ( view ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠN ine Patch Ex Ġ-> ĠXml (" n ine patch ", Ġr properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK Tree Root Ġ-> ĠXml (" k tree ", Ġmap Of (" width " Ġto Ġview . width , Ġ" height " Ġto Ġview . height , Ġ" grid Width " Ġto Ġview . grid . width , Ġ" grid Height " Ġto Ġview . grid . height )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . forEach Child Ġ{ Ġthis @ Xml . node ( view Tree To K Tree ( it , Ġcurrent V fs , Ġlevel Ġ+ Ġ 1 )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAnimation View Ref Ġ-> ĠXml (" animation ", Ġr properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParticle Emitter View Ġ-> ĠXml (" particle ", Ġr properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSolid Rect Ġ-> ĠXml (" solid rect ", Ġr properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEl lipse Ġ-> ĠXml (" ellipse ", Ġr properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠImage Ġ-> ĠXml (" image ", Ġr properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVector Image Ġ-> ĠXml (" vector image ", Ġr properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTree View Ref Ġ-> ĠXml (" tree view ref ", Ġr properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT iled MapView Ref Ġ-> ĠXml (" t iled map ref ", Ġr properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠText Ġ-> ĠXml (" text ", Ġr properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUIT ext Button Ġ-> ĠXml (" uit ext button ", Ġr properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠContainer Ġ-> ĠXml (" container ", Ġr properties ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . forEach Child Ġ{ Ġthis @ Xml . node ( view Tree To K Tree ( it , Ġcurrent V fs , Ġlevel Ġ+ Ġ 1 )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Don 't Ġknow Ġhow Ġto Ġserialize Ġ$ view ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// println (" extensions : Ġ$ extensions ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( ext Ġin Ġextensions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Ġ= Ġext . extend ( this , Ġview , Ġout ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġ__ ex _ Ġ= Ġ"__ ex _" ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun ĠXml . k tree To View Tree ( views : ĠViews , Ġcurrent V fs : ĠV fs File Ġ= Ġviews . current V fs , Ġparent : ĠContainer ? Ġ= Ġnull ): ĠView Ġ= Ġviews . serializer . k tree To View Tree ( this , Ġcurrent V fs , Ġparent ) Ċ suspend Ġfun ĠXml . k tree To View Tree ( serializer : ĠK Tree Serializer Holder , Ġcurrent V fs : ĠV fs File , Ġparent : ĠContainer ? Ġ= Ġnull ): ĠView Ġ= Ġserializer . serializer . k tree To View Tree ( this , Ġcurrent V fs , Ġparent ) Ċ suspend Ġfun ĠV fs File . read K Tree ( serializer : ĠK Tree Serializer Holder , Ġparent : ĠContainer ? Ġ= Ġnull ): ĠView Ġ= Ġread Xml (). k tree To View Tree ( serializer , Ġthis . parent , Ġparent ) Ċ Ċ fun ĠView . view Tree To K Tree ( views : ĠViews , Ġlevel : ĠInt Ġ= Ġ 1 ): ĠXml Ġ= Ġviews . serializer . view Tree To K Tree ( this , Ġviews . current V fs , Ġlevel ) Ċ fun ĠView . view Tree To K Tree ( serializer : ĠK Tree Serializer Holder , Ġcurrent V fs : ĠV fs File , Ġlevel : ĠInt Ġ= Ġ 1 ): ĠXml Ġ= Ġserializer . serializer . view Tree To K Tree ( this , Ġcurrent V fs , Ġlevel ) Ċ Ċ // ĠViews Ġfrom Ġcontext Ġversions Ċ Ċ suspend Ġfun ĠXml . k tree To View Tree ( current V fs : ĠV fs File ? Ġ= Ġnull , Ġparent : ĠContainer ? Ġ= Ġnull ): ĠView Ġ{ ĊĠĠĠ Ġval Ġviews Ġ= Ġviews () ĊĠĠĠ Ġreturn Ġk tree To View Tree ( views , Ġcurrent V fs Ġ?: Ġviews . current V fs , Ġparent ) Ċ } Ċ suspend Ġfun ĠV fs File . read K Tree ( parent : ĠContainer ? Ġ= Ġnull ): ĠView Ġ= Ġread K Tree ( views (), Ġparent ) Ċ suspend Ġfun ĠView . view Tree To K Tree ( level : ĠInt Ġ= Ġ 1 ): ĠXml Ġ= Ġview Tree To K Tree ( views (), Ġlevel ) Ċ suspend Ġfun ĠView . view Tree To K Tree ( current V fs : ĠV fs File , Ġlevel : ĠInt Ġ= Ġ 1 ): ĠXml Ġ= Ġview Tree To K Tree ( views (), Ġcurrent V fs , Ġlevel ) ĊĊ Ċ class ĠK Tree Root ( width : ĠDouble , Ġheight : ĠDouble ) Ġ: ĠFixed Size Container ( width , Ġheight ) Ġ{ ĊĠĠĠ Ġval Ġgrid Ġ= ĠOr tho graphic Grid ( 2 0 , Ġ 2 0 ) Ċ } Ċ