package Ġsilent orb . my th ic . bloom Ċ Ċ import Ġsilent orb . my th ic . ha ft .* Ċ import Ġsilent orb . my th ic . spatial . Vector 2 i Ċ import Ġsilent orb . my th ic . spatial . Vector 4 Ċ import Ġsilent orb . my th ic . spatial . min Max Ċ import Ġkotlin . math . max Ċ Ċ const Ġval Ġscrollbar Width Ġ= Ġ 1 5 Ċ Ċ fun Ġprune Cli pped Boxes ( dimensions : ĠVector 2 i , Ġoffset : ĠVector 2 i , Ġboxes : ĠList < Offset Box >): ĠList < Offset Box > Ġ{ ĊĠ Ġval Ġfiltered Ġ= Ġboxes ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġbox Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġoffset . y Ġ+ Ġbox . bounds . top Ġ<= Ġdimensions . y Ġ&& Ġoffset . y Ġ+ Ġbox . bounds . bottom Ġ>= Ġ 0 ĊĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠ Ġ} ĊĊĠ Ġreturn Ġfiltered ĊĠĠĠĠĠ Ġ. map Ġ{ Ġbox Ġ-> ĊĠĠĠĠĠĠĠ Ġbox . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Ġ= Ġbox . child . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboxes Ġ= Ġprune Cli pped Boxes ( dimensions , Ġoffset Ġ+ Ġbox . bounds . position , Ġbox . boxes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġprune Cli pped Boxes ( dimensions : ĠVector 2 i , Ġoffset : ĠVector 2 i , Ġbox : ĠOffset Box ): ĠOffset Box Ġ= ĊĠĠĠ Ġbox . copy ( ĊĠĠĠĠĠĠĠ Ġchild Ġ= Ġbox . child . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboxes Ġ= Ġprune Cli pped Boxes ( dimensions , Ġoffset , Ġbox . boxes ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ċ Ċ fun Ġfind Nested Box ( box : ĠOffset Box , Ġpredicate : Ġ( Offset Box ) Ġ-> ĠBoolean ): ĠOffset Box ? Ġ= ĊĠĠĠ Ġif Ġ( predicate ( box )) ĊĠĠĠĠĠ Ġbox ĊĠĠĠ Ġelse ĊĠĠĠĠĠ Ġbox . boxes ĊĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġfind Nested Box ( it , Ġpredicate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ?. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġresult . offset Ġ+ Ġbox . offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. first OrNull () Ċ Ċ fun Ġscroll able Y ( key : ĠString , Ġcontent : ĠF lower ): ĠF lower Ġ= Ġ{ Ġseed Ġ-> ĊĠ Ġval Ġspacing Ġ= Ġ 1 0 ĊĠ Ġval Ġinset Ġ= Ġscrollbar Width Ġ+ Ġspacing ĊĠ Ġval Ġchild Seed Ġ= Ġseed . copy ( dimensions Ġ= Ġseed . dimensions . copy ( x Ġ= Ġseed . dimensions . x Ġ- Ġinset )) ĊĠ Ġval Ġbox Ġ= Ġcontent ( child Seed ) ĊĠ Ġval Ġc Ġ= Ġif Ġ( box . dimensions . y Ġ== Ġ 0 ) Ġ 1 Ġelse Ġbox . dimensions . y ĊĠ Ġval Ġv Ġ= Ġseed . dimensions . y ĊĠ Ġval Ġscroll Bar Height Ġ= Ġseed . dimensions . y Ġ* Ġv Ġ/ Ġc ĊĠ Ġval Ġdrag Key Ġ= Ġ"${ key }_ drag " ĊĠ Ġval Ġis Dragging Ġ= Ġseed . state . containsKey ( drag Key ) ĊĠ Ġval Ġpage Increment Ġ= Ġseed . dimensions . y Ġ/ Ġ 8 ĊĠ Ġval Ġkey Scroll Increment Ġ= Ġseed . dimensions . y Ġ/ Ġ 3 2 ĊĠ Ġval Ġscroll Max Ġ= Ġbox . dimensions . y Ġ- Ġseed . dimensions . y ĊĠ Ġval Ġconstr ain Offset Ġ= Ġ{ Ġoffset : ĠInt Ġ-> Ġmin Max ( 0 , Ġscroll Max , Ġoffset ) Ġ} ĊĠ Ġval Ġinitial Content Offset Ġ= Ġseed . state [ key ] Ġas ? ĠInt Ġ?: Ġ 0 ĊĠ Ġval Ġinitial Cli pped Content Offset Ġ= Ġconstr ain Offset ( initial Content Offset ) ĊĊĠ Ġval Ġfocus Index Ġ= Ġget Focus Index ( seed . state ) ĊĠ Ġval Ġhas Menu Ġ= Ġfind Nested Box ( Offset Box ( box )) Ġ{ Ġb Ġ-> ĊĠĠĠ Ġb . child . attributes . containsKey ( menuItem Index Key ) ĊĠ Ġ} Ġ!= Ġnull ĊĊĠ Ġval Ġfocused Box Ġ= Ġif Ġ( get Focus Index ( seed . previous State ) Ġ!= Ġfocus Index ) ĊĠĠĠ Ġfind Nested Box ( Offset Box ( box )) Ġ{ Ġb Ġ-> ĊĠĠĠĠĠ Ġb . child . attributes [ menuItem Index Key ] Ġ== Ġfocus Index ĊĠĠĠ Ġ} ĊĠ Ġelse ĊĠĠĠ Ġnull ĊĊĠ Ġval Ġcontent Offset Ġ= Ġif Ġ( focused Box Ġ!= Ġnull ) Ġ{ ĊĠĠĠ Ġval Ġupper Hidden Ġ= Ġinitial Cli pped Content Offset Ġ- Ġfocused Box . bounds . top ĊĠĠĠ Ġval Ġlower Hidden Ġ= Ġfocused Box . bounds . bottom Ġ- Ġseed . dimensions . y Ġ- Ġinitial Cli pped Content Offset ĊĠĠĠ Ġval Ġpage Ad ust ment Ġ= Ġ( page Increment . toFloat () Ġ* Ġ 3 . 5 f ). toInt () ĊĠĠĠ Ġif Ġ( upper Hidden Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġadjustment Ġ= Ġmax ( upper Hidden , Ġpage Ad ust ment ) ĊĠĠĠĠĠ Ġconstr ain Offset ( initial Content Offset Ġ- Ġadjustment ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( lower Hidden Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġadjustment Ġ= Ġmax ( lower Hidden , Ġpage Ad ust ment ) ĊĠĠĠĠĠ Ġconstr ain Offset ( initial Content Offset Ġ+ Ġadjustment ) ĊĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠ Ġinitial Content Offset ĊĠ Ġ} Ġelse ĊĠĠĠ Ġinitial Content Offset ĊĊĠ Ġval Ġlogic Ġ= Ġcompose Logic ( ĊĠĠĠĠĠ ĠlistOf NotNull ( ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Dragging ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Hover ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Input Event ( Device Indexes . mouse ) Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event . index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMouse Commands . scroll Down Ġ-> Ġmap Of ( key Ġto Ġconstr ain Offset ( content Offset Ġ+ Ġpage Increment )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMouse Commands . scroll Up Ġ-> Ġmap Of ( key Ġto Ġconstr ain Offset ( content Offset Ġ- Ġpage Increment )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmap Of () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( content Offset Ġ!= Ġinitial Content Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ({ Ġ_, Ġ_ Ġ-> Ġmap Of ( key Ġto Ġcontent Offset ) Ġ}) ĊĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Menu ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompose Logic ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Input Event ( Device Indexes . keyboard ) Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event . index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 6 4 Ġ-> Ġmap Of ( key Ġto Ġconstr ain Offset ( content Offset Ġ+ Ġkey Scroll Increment )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 6 5 Ġ-> Ġmap Of ( key Ġto Ġconstr ain Offset ( content Offset Ġ- Ġkey Scroll Increment )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 6 7 Ġ-> Ġmap Of ( key Ġto Ġconstr ain Offset ( content Offset Ġ+ Ġpage Increment )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 6 6 Ġ-> Ġmap Of ( key Ġto Ġconstr ain Offset ( content Offset Ġ- Ġpage Increment )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmap Of () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Input Event ( Device Indexes . gamepad ) Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event . index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGAME PAD _ AXIS _ RIGHT _ DOWN , ĠGAME PAD _ AXIS _ LEFT _ DOWN , ĠGAME PAD _ BUTTON _ DP AD _ DOWN Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( key Ġto Ġconstr ain Offset ( content Offset Ġ+ Ġkey Scroll Increment )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGAME PAD _ AXIS _ RIGHT _ UP , ĠGAME PAD _ AXIS _ LEFT _ UP , ĠGAME PAD _ BUTTON _ DP AD _ UP Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( key Ġto Ġconstr ain Offset ( content Offset Ġ- Ġkey Scroll Increment )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmap Of () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠ Ġ) ĊĠ Ġ) ĊĊĠ Ġval Ġcli pped Content Offset Ġ= Ġconstr ain Offset ( content Offset ) ĊĠ Ġval Ġscroll Bar Offset Ġ= Ġcli pped Content Offset Ġ* Ġv Ġ/ Ġc ĊĊĠ ĠBox ( ĊĠĠĠĠĠ Ġdimensions Ġ= ĠVector 2 i ( box . dimensions . x Ġ+ Ġinset , Ġseed . dimensions . y ), ĊĠĠĠĠĠ Ġboxes Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠ Ġprune Cli pped Boxes ( seed . dimensions , ĠVector 2 i ( 0 , Ġ- cli pped Content Offset ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOffset Box ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Ġ= Ġbox , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= ĠVector 2 i ( 0 , Ġ- cli pped Content Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠ ĠOffset Box ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Ġ= ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdimensions Ġ= ĠVector 2 i ( scrollbar Width , Ġscroll Bar Height ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde pi ction Ġ= Ġsolid Background ( Vector 4 ( 0 f , Ġ 0 f , Ġ 0 f , Ġ 0 . 9 f )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogic Ġ= Ġcompose Logic ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Drag ( drag Key ) Ġ{ Ġoffset Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġif Ġ( offset Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcli pped Content Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Offset Ġ+ Ġoffset . y Ġ* Ġc Ġ/ Ġv ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( key Ġto Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= ĠVector 2 i ( box . dimensions . x Ġ+ Ġspacing , Ġscroll Bar Offset ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ), ĊĠĠĠĠĠ Ġlogic Ġ= Ġlogic , ĊĠ Ġ) ĊĠĠĠĠĠ Ġ. add Attributes ( clip Bounds Key Ġto Ġtrue ) Ċ } Ċ