/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠAr te ar ĠS . A . Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// 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 . art ear . ste ved ore . ste ved ore views . presentation Ċ Ċ import Ġcom . art ear . domain . coroutine . Data Sh aper Ċ import Ġcom . art ear . ste ved ore . ste ved ore items . presentation . model . Ar te ar Item Ċ import Ġcom . art ear . ste ved ore . ste ved ore items . presentation . model . Ar te ar Item Decoration Ċ import Ġcom . art ear . ste ved ore . ste ved ore items . repository . model . box . Box Ċ import Ġcom . art ear . ste ved ore . ste ved ore views . presentation . Grid Space Position Enum .* Ċ import Ġcom . art ear . ste ved ore . ste ved ore views . presentation . model . Empty Item Ċ import Ġcom . art ear . ste ved ore . ste ved ore views . repository . model . Container Ċ import Ġcom . art ear . ste ved ore . ste ved ore views . repository . model . Ste ved ore Ċ import Ġkotlin . math . round ToInt Ċ Ċ class ĠSte ved ore Data Sh aper ( private Ġval Ġste ved ore Register : ĠSte ved ore Register ) Ġ: ĊĠĠĠĠĠĠĠ ĠData Sh aper < Ste ved ore , ĠList < Ar te ar Item >> Ġ{ ĊĊĠĠĠ Ġvar Ġhalf Gap : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġis Right Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis Top Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġtransform ( input : ĠSte ved ore ): ĠList < Ar te ar Item > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġlist : ĠMutable List < Ar te ar Item > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġis Right Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġis Top Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġinput . containers . forEach Ġ{ Ġcontainer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Top Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhalf Gap Ġ= Ġcontainer . style . items . gap . round ToInt () Ġ/ Ġ 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . header ?. let Ġ{ Ġheader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġste ved ore Register . header Sh aper ?. let Ġ{ Ġsh aper Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġart ear Item Ġ= Ġsh aper . transform ( header ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġart ear Item ?. let Ġ{ Ġitem Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrect Header Ġ= Ġcontainer . header . style . margin . rect ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrect Container Ġ= Ġcontainer . style . margin . rect ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġart ear Item . art ear Item Decoration Ġ= ĠAr te ar Item Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginLeft Ġ= Ġrect Container . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginTop Ġ= Ġrect Container . top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginRight Ġ= Ġrect Container . right , ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Ġ= Ġrect Header . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Top Ġ= Ġrect Header . top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Right Ġ= Ġrect Header . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Bottom Ġ= Ġrect Header . bottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . style . background ?. color ?. let Ġ{ Ġcolor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġart ear Item . art ear Item Decoration . backgroundColor Ġ= Ġcolor . light ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . items . forEach Indexed Ġ{ Ġindex , Ġbox Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsh aper Map Ġ= Ġste ved ore Register . sh aper Map ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sh aper Map . containsKey ( box . type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġart ear Item Ġ= Ġsh aper Map . getValue ( box . type ). transform ( box ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġart ear Item ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgrid Space Position Ġ= ĠgetItem Position ( box ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Top Ġ&& Ġindex Ġ> Ġ 0 Ġ&& Ġgrid Space Position Ġ!= ĠRIGHT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Top Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Bottom Ġ= Ġis Bottom ( grid Space Position , Ġindex , Ġcontainer . items . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġart ear Item . art ear Item Decoration Ġ= Ġget Ar te ar Item Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrid Space Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Bottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Bottom Ġ&& Ġgrid Space Position Ġ== ĠLEFT Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ== Ġcontainer . items . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( create Empty Item ( container )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠ ĠItem ĠCreator Ġused Ġwhen Ġcollections Ġhave Ġodd Ġdouble Ġitems ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate Empty Item ( container : ĠContainer ): ĠAr te ar Item Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠAr te ar Item ( Empty Item (), Ġget Ar te ar Item Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRIGHT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Top Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Bottom Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġis Bottom ( grid Space Position : ĠGrid Space Position Enum , Ġindex : ĠInt , Ġsize : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġwhen Ġ( grid Space Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ>= Ġsize Ġ- Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRIGHT , ĠDOUBLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġsize Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetItem Position ( box : ĠBox ): ĠGrid Space Position Enum Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbox . style . weight Ġ== Ġ 1 f Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDOUBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif Ġ( is Right ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Right Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRIGHT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Right Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġget Ar te ar Item Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer : ĠContainer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition : ĠGrid Space Position Enum , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Top : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Bottom : ĠBoolean ĊĠĠĠ Ġ): ĠAr te ar Item Decoration Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠmarginLeft : ĠInt ĊĠĠĠĠĠĠĠ Ġval ĠmarginRight : ĠInt ĊĠĠĠĠĠĠĠ Ġvar ĠmarginBottom Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar ĠmarginTop Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġpadding Left Ġ= Ġhalf Gap ĊĠĠĠĠĠĠĠ Ġvar Ġpadding Right Ġ= Ġhalf Gap ĊĊĠĠĠĠĠĠĠ Ġvar Ġpadding Top Ġ= Ġhalf Gap ĊĠĠĠĠĠĠĠ Ġvar Ġpadding Bottom Ġ= Ġhalf Gap ĊĊĠĠĠĠĠĠĠ Ġval Ġrect Container Ġ= Ġcontainer . style . margin . rect ĊĠĠĠĠĠĠĠ Ġval Ġrect Items Ġ= Ġcontainer . style . items . margin . rect ĊĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginLeft Ġ= Ġrect Container . left ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Ġ= Ġrect Items . left ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginRight Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Right Ġ= Ġhalf Gap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRIGHT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginLeft Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Ġ= Ġhalf Gap ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginRight Ġ= Ġrect Container . right ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Right Ġ= Ġrect Items . right ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDOUBLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginLeft Ġ= Ġrect Container . left ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Ġ= Ġrect Items . left ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginRight Ġ= Ġrect Container . right ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Right Ġ= Ġrect Items . right ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Top ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Top Ġ= Ġrect Items . top ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( container . header Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginTop Ġ= Ġrect Container . top ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Bottom ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Bottom Ġ= Ġrect Items . bottom ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmarginBottom Ġ= Ġrect Container . bottom ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġart ear Item Decoration Ġ= ĠAr te ar Item Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Ġ= Ġpadding Left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Top Ġ= Ġpadding Top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Right Ġ= Ġpadding Right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Bottom Ġ= Ġpadding Bottom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginLeft Ġ= ĠmarginLeft , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginTop Ġ= ĠmarginTop , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginRight Ġ= ĠmarginRight , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginBottom Ġ= ĠmarginBottom ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcontainer . style . background ?. color ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġart ear Item Decoration . backgroundColor Ġ= Ġit . light ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġart ear Item Decoration ĊĠĠĠ Ġ} Ċ Ċ } Ċ