/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠPeter ĠRes pon dek Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . l any ard . canvas Ċ import Ġandroid . graphics .* Ċ import Ġcom . l any ard . helpers . plus Ċ import Ġcom . l any ard . helpers . plus Assign Ċ import Ġcom . l any ard . helpers . set Ċ import Ġjava . util . Collections . synchronized List Ċ Ċ interface ĠCanvas Node Transform Ċ { ĊĠĠĠ Ġval Ġposition Ġ: ĠPoint ĊĠĠĠ Ġval Ġscale Ġ: ĠSize F ĊĠĠĠ Ġvar Ġopacity Ġ: ĠFloat ĊĊĠĠĠ Ġfun Ġset ( other : ĠCanvas Node Transform ) Ġ{ ĊĠĠĠĠĠĠĠ Ġposition . set ( other . position ) ĊĠĠĠĠĠĠĠ Ġscale . set ( other . scale ) ĊĠĠĠĠĠĠĠ Ġopacity Ġ= Ġother . opacity ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtransform Ġ( other : ĠCanvas Node Transform ) Ġ{ ĊĠĠĠĠĠĠĠ Ġposition Ġ+= Ġother . position ĊĠĠĠĠĠĠĠ Ġscale Ġ*= Ġother . scale ĊĠĠĠĠĠĠĠ Ġopacity Ġ*= Ġother . opacity ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠCanvas Node Transform Data ( position Ġ: ĠPoint , Ġscale Ġ: ĠSize F , Ġopacity : ĠFloat ) Ġ: ĠCanvas Node Transform Ċ { ĊĠĠĠ Ġoverride Ġval Ġposition Ġ: ĠPoint ĊĠĠĠ Ġoverride Ġval Ġscale Ġ: ĠSize F ĊĠĠĠ Ġoverride Ġvar Ġopacity Ġ= Ġ 0 . 0 f ĊĊĠĠĠ Ġconstructor ( other : ĠCanvas Node Transform ) Ġ: Ġthis ( other . position , Ġother . scale , Ġother . opacity ) ĊĠĠĠ Ġconstructor () Ġ: Ġthis ( Point ( 0 , 0 ), ĠSize F ( 1 . 0 f , 1 . 0 f ), Ġ 1 . 0 f ) ĊĠĠĠ Ġinit Ġ{ ĊĊĠĠĠĠĠĠĠ Ġthis . position Ġ= ĠPoint ( position ) ĊĠĠĠĠĠĠĠ Ġthis . scale Ġ= ĠSize F ( scale ) ĊĠĠĠĠĠĠĠ Ġthis . opacity Ġ= Ġopacity ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ Ġtransformed Ġ( other : ĠCanvas Node Transform ) Ġ: ĠCanvas Node Transform Data Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCanvas Node Transform Data ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ+ Ġother . position , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale Ġ* Ġother . scale , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopacity Ġ* Ġother . opacity ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠCanvas Node () Ġ: ĠCanvas Node Transform Ċ { ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdebug Bounds Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġval Ġ_ children Ġ= Ġsynchronized List < Canvas Node >( ArrayList ()) ĊĠĠĠ Ġprotected Ġval Ġ_ actions Ġ= Ġsynchronized List < Canvas Action >( ArrayList ()) ĊĠĠĠ Ġoverride Ġval Ġposition Ġ= ĠPoint ( 0 , 0 ) ĊĠĠĠ Ġopen Ġval Ġmagnitude Ġ= ĠSize ( 0 , 0 ) ĊĠĠĠ Ġoverride Ġvar Ġopacity Ġ= Ġ 1 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġ_ sort Children Ġ= Ġfalse ĊĊĠĠĠ Ġval Ġsize Ġ: ĠSize ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmagnitude Ġ* Ġscale ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġview Ġ: ĠCanvas View ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġparent Ġ: ĠCanvas Node ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Ġfield Ġ== Ġvalue Ġ) Ġ{ Ġreturn Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Ġfield Ġ!= Ġnull Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield !! ._ children . removeAll Ġ{ Ġit Ġ== Ġthis Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . view Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Ġvalue Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ._ children . add ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . view Ġ= Ġvalue . view ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġvar Ġanchor Ġ= ĠPoint F ( 0 . 5 f , 0 . 5 f ) ĊĠĠĠ Ġoverride Ġval Ġscale Ġ= ĠSize F ( 1 . 0 f , 1 . 0 f ) ĊĊĠĠĠ Ġvar Ġz Order Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġtag Ġ= Ġ"" ĊĠĠĠ Ġvar Ġhidden Ġ: ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// _ children Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġ// _ actions Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġhidden Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( Ġx : ĠInt , Ġy : ĠInt Ġ) Ġ: Ġthis () Ġ Ġ{ ĊĠĠĠĠĠĠĠ Ġposition . set ( x , y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Child ( Ġnode : ĠCanvas Node Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ sort Children Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġnode . parent Ġ= Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove All Children ( Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ children . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Children ( list : ĠIterable < Canvas Node >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ sort Children Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ_ children . removeAll ( list ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Child ( Ġnode : ĠCanvas Node Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ sort Children Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ_ children . remove ( node ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Action Ġ( Ġtag : ĠString Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ actions . removeAll Ġ{ Ġit . tag Ġ== Ġtag Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġchildren Ġ: ĠList < Canvas Node > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ Ġreturn Ġ_ children Ġ} ĊĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġbounds ( transform : ĠCanvas Node Transform ): ĠRect ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġleft Ġ= ĠĠĠĠĠ Ġ( transform . position . x Ġ+ Ġposition . x Ġ- Ġmagnitude . width Ġ* Ġscale . width Ġ* Ġtransform . scale . width Ġ* Ġanchor . x ). toInt () ĊĠĠĠĠĠĠĠ Ġvar Ġtop Ġ= ĠĠĠĠĠĠ Ġ( transform . position . y Ġ+ Ġposition . y Ġ- Ġmagnitude . height Ġ* Ġscale . height Ġ* Ġtransform . scale . height Ġ* Ġ( 1 - anchor . y )). toInt () ĊĠĠĠĠĠĠĠ Ġvar Ġright Ġ= ĠĠĠĠ Ġ( left Ġ+ Ġmagnitude . width Ġ* Ġscale . width Ġ* Ġtransform . scale . width ). toInt () ĊĠĠĠĠĠĠĠ Ġvar Ġbottom Ġ= ĠĠĠ Ġ( top Ġ+ Ġmagnitude . height Ġ* Ġscale . height Ġ* Ġtransform . scale . height ). toInt () ĊĠĠĠĠĠĠĠ Ġreturn ĠRect ( left , top , right , bottom ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( dt : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized (_ actions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġitr Ġ= Ġ_ actions . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( itr . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// for Ġ( a Ġin Ġ_ actions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġa Ġ= Ġitr . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a . isValid ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a . running Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . start ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . update ( this , Ġdt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitr . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsynchronized (_ children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ sort Children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ children . sortBy Ġ{ Ġch lid -> Ġch lid . z Order Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ sort Children Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchildren Ġ= Ġ_ children . to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġitr Ġ= Ġchildren . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( itr . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnode Ġ= Ġitr . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . parent Ġ== Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . update ( dt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġdraw Ġ( Ġcanvas : ĠCanvas , Ġtransform : ĠCanvas Node Transform Data , Ġview : ĠRect , Ġtimestamp : ĠLong Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtransform . transform ( this ) ĊĠĠĠĠĠĠĠ Ġsynchronized (_ children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitr Ġ= Ġ_ children . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( itr . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġitr . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . hidden Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . draw ( canvas , ĠCanvas Node Transform Data ( transform ), Ġview , Ġtimestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug Bounds ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpaint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbounds Ġ= Ġnode . bounds ( transform ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . stroke Width Ġ= Ġ 4 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠColor . parse Color ("# ffffffff ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( bounds , Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrun Ġ( Ġaction : ĠCanvas Action ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun ( action , action . tag ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrun Ġ( Ġaction : ĠCanvas Action , Ġtag : ĠString ? Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ actions . add ( action ) ĊĠĠĠĠĠĠĠ Ġaction . tag Ġ= Ġtag ĊĠĠĠ Ġ} Ċ Ċ }