package Ġcom . mr 3 y . thought s . components . bottom bar . state Ċ Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . layout . Sub compose Layout Ċ import Ġandroidx . compose . ui . layout . Sub compose Layout State Ċ import Ġandroidx . compose . ui . unit . Dp Ċ import Ġkotlin . math . round ToInt Ċ Ċ internal Ġenum Ġclass ĠBottom Bar Slots Ġ{ ĊĠĠĠ ĠTab , ĊĊĠĠĠ ĠCurve , ĊĊĠĠĠ ĠF ab Ċ } Ċ Ċ /** Ċ Ġ* ĠA ĠCustom ĠLayout Ġto Ġposition ĠBottom Bar Ġtabs Ġ& Ġcurve Ġh orizontally Ġlike Ġ[ Row ] Ġlayout . Ċ Ġ* ĠThe Ġdifference Ġis Ġ[ Row ] Ġpositions Ġitems Ġin Ġthe Ġorder Ġthey Ġare Ġdeclared , Ġthis Ġlayout Ġallows Ġfor Ġmore Ġflexibility Ċ Ġ* Ġby Ġcontrolling Ġthe Ġposition Ġof Ġits Ġelements Ġwhile Ġtaking Ġadvantage Ġof Ġsome Ġ[ Row ] Ġlayout Ġproperties . Ċ Ġ*/ Ċ @ Composable Ċ internal Ġfun ĠBottom Bar Layout ( ĊĠĠĠ Ġstate : ĠBottom Bar State , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġbottom Bar Items Height : ĠD p , ĊĠĠĠ Ġvertical Alignment : ĠAlignment . Vertical Ġ= ĠAlignment . Center Vert ically , ĊĠĠĠ Ġfab : Ġ@ Composable ĠBottom Bar Scope .( selectedIndex : ĠInt ) Ġ-> ĠUnit , ĊĠĠĠ Ġcurve : Ġ@ Composable ĠBottom Bar Scope . () Ġ-> ĠUnit , ĊĠĠĠ Ġtab : Ġ@ Composable ĠBottom Bar Scope .( index : ĠInt ) Ġ-> ĠUnit , Ċ ) Ġ{ ĊĠĠĠ Ġval Ġbottom Bar Scope Ġ= ĠBottom Bar Scope Impl ĊĠĠĠ Ġval Ġsub compose State Ġ= Ġremember Ġ{ ĠSub compose Layout State ( 1 ) Ġ} ĊĠĠĠ ĠSub compose Layout ( state Ġ= Ġsub compose State , Ġmodifier Ġ= Ġmodifier ) Ġ{ Ġparent Constraints Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġitems Height Ġ= Ġbottom Bar Items Height . round To Px () ĊĠĠĠĠĠĠĠ Ġval Ġcurve Meas ur able Ġ= Ġsub compose ( Bottom Bar Slots . Curve ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Bar Scope . curve () ĊĠĠĠĠĠĠĠ Ġ}. single () ĊĊĠĠĠĠĠĠĠ Ġval Ġtab Measure ables Ġ= Ġsub compose ( Bottom Bar Slots . Tab ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( state . tabs Num Ex cluding Curve ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtab Index Ġ= Ġindex . map To Corre sponding Index ( state . selected TabIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Bar Scope . tab ( tab Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfab Meas ur able Ġ= Ġsub compose ( Bottom Bar Slots . Fab ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Bar Scope . fab ( state . selected TabIndex ) ĊĠĠĠĠĠĠĠ Ġ}. single () ĊĊĠĠĠĠĠĠĠ Ġ// Ġnote Ġthat Ġall Ġtabs Ġwill Ġbe Ġweighted Ġequ ally ĊĠĠĠĠĠĠĠ Ġval Ġtabs Weight Ġ= Ġtab Measure ables . map Ġ{ Ġit . weight Ġ}. sum () ĊĠĠĠĠĠĠĠ Ġval Ġ( curve Width , Ġtabs Width ) Ġ= Ġparent Constraints . maxWidth . partition By Ratio ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR atio ( curve Meas ur able . weight , Ġtabs Weight ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġtab Width Ġ= Ġ( tabs Width Ġ/ Ġstate . tabs Num Ex cluding Curve ). round ToInt () ĊĠĠĠĠĠĠĠ Ġval Ġcurve Constraints Ġ= Ġparent Constraints ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. copy ( min Width Ġ= Ġ 0 , ĠmaxWidth Ġ= Ġcurve Width . round ToInt (), ĠminHeight Ġ= Ġ 0 , ĠmaxHeight Ġ= Ġitems Height ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcurve Place able Ġ= Ġcurve Meas ur able . measure ( curve Constraints ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtab Constraints Ġ= Ġparent Constraints . copy ( min Width Ġ= Ġ 0 , ĠmaxWidth Ġ= Ġtab Width , ĠminHeight Ġ= Ġ 0 , ĠmaxHeight Ġ= Ġitems Height ) ĊĠĠĠĠĠĠĠ Ġval Ġtab Place ables Ġ= Ġtab Measure ables . map Ġ{ Ġit . measure ( tab Constraints ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfab Height Ġ= Ġ( fab Meas ur able . weight . coerce In ( 0 . 1 f .. 1 f ) Ġ* Ġparent Constraints . max Height ) ĊĠĠĠĠĠĠĠ Ġval Ġfab Constraints Ġ= Ġparent Constraints . copy ( min Width Ġ= Ġ 0 , ĠmaxWidth Ġ= Ġcurve Place able . meas ured Width , ĠminHeight Ġ= Ġ 0 , ĠmaxHeight Ġ= Ġfab Height . round ToInt ()) ĊĠĠĠĠĠĠĠ Ġval Ġfab Place able Ġ= Ġfab Meas ur able . measure ( fab Constraints ) ĊĠĠĠĠĠĠĠ Ġfill Layout Metadata Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . tab Width Ġ= Ġtab Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . curve Width Ġ= Ġcurve Place able . meas ured Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . fab Width Ġ= Ġfab Place able . meas ured Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . fab Height Ġ= Ġfab Place able . meas ured Height ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġ( curve Layer , Ġfab Layer ) Ġ= Ġcurve Meas ur able . graphics Layer Ġto Ġfab Meas ur able . graphics Layer ĊĠĠĠĠĠĠĠ Ġlayout ( parent Constraints . maxWidth , Ġparent Constraints . max Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Offset Y Ġ= Ġparent Constraints . max Height Ġ- Ġitems Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtab Place ables . forEach Indexed Ġ{ Ġindex , Ġtab Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtab Alignment Ġ= Ġvertical Alignment . align ( tab . meas ured Height , Ġitems Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab . place ( x , Ġitems Offset Y Ġ+ Ġtab Alignment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ+= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ== Ġstate . selected TabIndex Ġ- Ġ 1 Ġ-> Ġ( tab Width Ġ+ Ġcurve Constraints . maxWidth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtab Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLayout Ġthe Ġcurve ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurve Alignment Ġ= Ġvertical Alignment . align ( curve Place able . meas ured Height , Ġitems Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurve Place able . place With Layer ( 0 , Ġitems Offset Y Ġ+ Ġcurve Alignment , Ġlayer Block Ġ= Ġcurve Layer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLayout Ġthe Ġfab ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfab Horizontal Alignment Ġ= ĠAlignment . Center H orizontally ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. align ( fab Place able . meas ured Width , Ġcurve Place able . meas ured Width , Ġlayout Direction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfab Place able . place With Layer ( fab Horizontal Alignment , Ġ 0 , Ġlayer Block Ġ= Ġfab Layer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ