package Ġcom . be ok . ch il ten . ui . pager Ċ Ċ import Ġandroidx . compose . foundation . gest ures . Orientation Ċ import Ġandroidx . compose . foundation . gest ures . draggable Ċ import Ġandroidx . compose . foundation . gest ures . remember Drag gable State Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . key Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . runtime . remember Coroutine Scope Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . layout . Layout Ċ import Ġandroidx . compose . ui . layout . Meas ur able Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlinx . coroutines . launch Ċ Ċ private Ġval ĠMe as ur able . page : ĠInt ĊĠĠĠ Ġget () Ġ= Ġ( parent Data Ġas ? ĠPage Data )?. page Ġ?: Ġerror (" no ĠPage Data Ġfor Ġmeas ur able Ġ$ this ") Ċ Ċ @ Composable Ċ fun ĠP ager ( ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġstate : ĠP ager State , ĊĠĠĠ Ġoff screen Limit : ĠInt Ġ= Ġ 2 , ĊĠĠĠ Ġcontent : Ġ@ Composable ĠP ager Scope . () Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġvar ĠpageSize Ġby Ġremember Ġ{ Ġmutable State Of ( 0 ) Ġ} ĊĠĠĠ Ġval Ġcoroutine Scope Ġ= Ġremember Coroutine Scope () ĊĠĠĠ ĠLayout ( ĊĠĠĠĠĠĠĠ Ġcontent Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Page Ġ= Ġ( state . currentPage Ġ- Ġoff screen Limit ). coerce At Least ( state . min Page ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Page Ġ= Ġ( state . currentPage Ġ+ Ġoff screen Limit ). coerce At Most ( state . max Page ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( page Ġin Ġmin Page .. max Page ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Data Ġ= ĠPage Data ( page ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope Ġ= ĠP ager Scope ( state , Ġpage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( page Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( content Alignment Ġ= ĠAlignment . Center , Ġmodifier Ġ= Ġpage Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . content () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier . draggable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠOrientation . Horizontal , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Drag Started Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . selection State Ġ= ĠP ager State . Selection State . Un dec ided ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Drag Stopped Ġ= Ġ{ Ġvelocity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVe locity Ġis Ġin Ġpixels Ġper Ġsecond , Ġbut Ġwe Ġdeal Ġin Ġpercentage Ġoffsets , Ġso Ġwe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġneed Ġto Ġscale Ġthe Ġvelocity Ġto Ġmatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . fl ing ( velocity Ġ/ ĠpageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġremember Drag gable State Ġ{ Ġdy Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= ĠpageSize Ġ* ĠcurrentPage Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġif Ġ( currentPage Ġ== Ġmin Page ) Ġ 0 Ġelse ĠpageSize Ġ* Ġoff screen Limit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Ġ= Ġif Ġ( currentPage Ġ== Ġmax Page ) Ġ 0 Ġelse Ġ- pageSize Ġ* Ġoff screen Limit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Pos Ġ= Ġ( pos Ġ+ Ġdy ). coerce In ( min . toFloat (), Ġmax . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsnap To Offset ( new Pos Ġ/ ĠpageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ġ{ Ġmeas ur ables , Ġconstraints Ġ-> ĊĠĠĠĠĠĠĠ Ġlayout ( constraints . maxWidth , Ġconstraints . max Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcurrentPage Ġ= Ġstate . currentPage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġstate . currentPage Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Constraints Ġ= Ġconstraints . copy ( min Width Ġ= Ġ 0 , ĠminHeight Ġ= Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeas ur ables ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . measure ( child Constraints ) Ġto Ġit . page ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( place able , Ġpage ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Center Offset Ġ= Ġ( constraints . maxWidth Ġ- Ġplace able . width ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Center Offset Ġ= Ġ( constraints . max Height Ġ- Ġplace able . height ) Ġ/ Ġ 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentPage Ġ== Ġpage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġplace able . width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Item Offset Ġ= Ġ(( page Ġ+ Ġoffset Ġ- ĠcurrentPage ) Ġ* Ġplace able . width ). round ToInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace able . place ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġx Center Offset Ġ+ Ġx Item Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġy Center Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ