@ file : Suppress (" FunctionName ") Ċ Ċ import Ġandroidx . compose . desktop . Window Ċ import Ġandroidx . compose . foundation . Scroll able Column Ċ import Ġandroidx . compose . foundation . border Ċ import Ġandroidx . compose . foundation . click able Ċ import Ġandroidx . compose . foundation . layout .* Ċ import Ġandroidx . compose . material .* Ċ import Ġandroidx . compose . material . Material Theme . typography Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . Mutable State Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . text . style . Text Overflow Ċ import Ġandroidx . compose . ui . unit . Dp Ċ import Ġandroidx . compose . ui . unit . Int Size Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . compose . ui . window . Dialog Properties Ċ import Ġapi . Course Ċ import Ġapi . chinese Reverse Mapping Ċ Ċ fun Ġmain () Ġ= ĠWindow ( ĊĠĠĠ Ġtitle Ġ= Ġ" FC U ĠCourse ĠSearch ĠPlus ", ĊĠĠĠ Ġsize Ġ= ĠInt Size ( 1 9 2 0 , Ġ 1 0 0 0 ), Ċ ) Ġ{ ĊĠĠĠ Ġval Ġvm Ġ= ĠMy ViewModel () ĊĠĠĠ ĠTable ( vm ) Ċ } Ċ Ċ @ Composable Ċ fun ĠTable ( viewModel : ĠMy ViewModel ) Ġ{ ĊĠĠĠ ĠMaterial Theme Ġ{ ĊĠĠĠĠĠĠĠ ĠRow ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . fill MaxSize (). padding ( 2 0 . dp ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWeek ( viewModel . courses . value ) Ġ{ ĠviewModel . onClick ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSp acer ( Modifier . preferred Height ( 1 6 . dp )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSearch Panel ( viewModel ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPopup Window ( viewModel . pop State ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠSearch Panel ( viewModel : ĠMy ViewModel ) Ġ{ ĊĠĠĠ ĠColumn Ġ{ ĊĠĠĠĠĠĠĠ ĠSearch Field ({ ĠviewModel . on Name Field Change ( it ) Ġ}, ĠviewModel . name Field , Ġ" èª ² ç¨ĭ åĲį ç¨ ± ") ĊĠĠĠĠĠĠĠ ĠSearch Field ({ ĠviewModel . on Day Field Change ( it ) Ġ}, ĠviewModel . day Field , Ġ" æĺŁ æľŁ ") ĊĠĠĠĠĠĠĠ ĠSearch Field ({ ĠviewModel . on Section Field Change ( it ) Ġ}, ĠviewModel . section Field , Ġ" ç¯ Ģ æķ¸ ") ĊĠĠĠĠĠĠĠ ĠSearch Field ({ ĠviewModel . on Location Field Change ( it ) Ġ}, ĠviewModel . location Field , Ġ" åľ° é» ŀ ") ĊĠĠĠĠĠĠĠ ĠSp acer ( Modifier . preferred Height ( 1 6 . dp )) ĊĠĠĠĠĠĠĠ ĠRow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠButton ({ ĠviewModel . fetch () Ġ}) Ġ{ ĠText (" æŁ¥ è© ¢ ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSp acer ( Modifier . preferred Width ( 8 . dp )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠButton ({ ĠviewModel . clear () Ġ}) Ġ{ ĠText (" æ¸ħ ç©º ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠSearch Field ( ĊĠĠĠ Ġon Value Change : Ġ( String ) Ġ-> ĠUnit , ĊĠĠĠ Ġstate : ĠMutable State < String >, ĊĠĠĠ ĠfieldName : ĠString Ċ ) Ġ{ ĊĠĠĠ ĠRow ( ĊĠĠĠĠĠĠĠ Ġvertical Alignment Ġ= ĠAlignment . Center Vert ically ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠOut lined TextField ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Ġ= Ġ{ ĠText ( fieldName ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġon Value Change , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Line Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Lines Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠWeek ( courses : ĠList < Course >, ĠonClick : Ġ( Course ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ ĠScroll able Column ( ĊĠĠĠĠĠĠĠ ĠModifier . padding ( horizontal Ġ= Ġ 1 0 . dp ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠHeader View () ĊĠĠĠĠĠĠĠ Ġfor Ġ( section Ġin Ġ 1 .. 1 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSection ( section , Ġcourses . filter Ġ{ Ġc Ġ-> Ġc . periods . flatMap Ġ{ Ġit . range Ġ}. contains ( section ) Ġ}, ĠonClick ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ @ Composable Ċ fun ĠSection ( index : ĠInt , Ġcourses : ĠList < Course >, ĠonClick : Ġ( Course ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ ĠRow ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . border ( 1 . dp , ĠColor . Black ), ĊĠĠĠĠĠĠĠ Ġhorizontal Arrange ment Ġ= ĠArrange ment . Center ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCustom View ( index , Ġ 5 0 . dp , Ġ 1 0 0 . dp ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( day Ġin Ġ 1 .. 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoverlapping Ġ= Ġcourses . filter Ġ{ Ġc Ġ-> Ġc . periods . map Ġ{ Ġit . day Ġ}. contains ( day ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass View ( over lapping , ĠonClick ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠHeader View () Ġ{ ĊĠĠĠ ĠRow ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . border ( 1 . dp , ĠColor . Black ), ĊĠĠĠĠĠĠĠ Ġhorizontal Arrange ment Ġ= ĠArrange ment . Center ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCustom View ( null , Ġ 5 0 . dp , Ġ 5 0 . dp ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( day Ġin Ġ 1 .. 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCustom View ( day , Ġ 1 5 0 . dp , Ġ 5 0 . dp ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠCustom View ( index : ĠInt ?, Ġw : ĠD p , Ġh : ĠD p ) Ġ{ ĊĠĠĠ ĠColumn ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. preferred Size ( w , Ġh ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. border ( 1 . dp , ĠColor . Black ), ĊĠĠĠĠĠĠĠ Ġvertical Arrange ment Ġ= ĠArrange ment . Center , ĊĠĠĠĠĠĠĠ Ġhorizontal Alignment Ġ= ĠAlignment . Center H orizontally ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠColumn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ?. toString () Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= Ġty pography . h 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Lines Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠClass View ( courses : ĠList < Course >, ĠonClick : Ġ( Course ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ ĠColumn ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. preferred Size ( 1 5 0 . dp , Ġ 1 0 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. border ( 1 . dp , ĠColor . Black ), ĊĠĠĠĠĠĠĠ Ġvertical Arrange ment Ġ= ĠArrange ment . Top , ĊĠĠĠĠĠĠĠ Ġhorizontal Alignment Ġ= ĠAlignment . Start ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġcourses . map Ġ{ Ġit . name . trim () Ġ} ĊĠĠĠĠĠĠĠ ĠColumn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcourses . sub List ( 0 , Ġcourses . size . coerce At Most ( 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= Ġty pography . body 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Lines Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverflow Ġ= ĠText Overflow . El lipsis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . click able Ġ{ ĠonClick ( c ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( courses . size Ġ> Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ...... ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= Ġty pography . body 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Lines Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverflow Ġ= ĠText Overflow . El lipsis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠPopup Window ( pop State : ĠMutable State < Course ?> ) Ġ{ ĊĠĠĠ Ġval Ġc Ġ= Ġpop State . value Ġ?: Ġreturn ĊĠĠĠ ĠAlertDialog ( ĊĠĠĠĠĠĠĠ Ġshape Ġ= ĠMaterial Theme . shapes . large , ĊĠĠĠĠĠĠĠ Ġon Dismiss Request Ġ= Ġ{ Ġpop State . value Ġ= Ġnull Ġ}, ĊĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĠText ( text Ġ= Ġc . name ) Ġ}, ĊĠĠĠĠĠĠĠ Ġtext Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" èª ² ç¨ĭ ç· ¨ èĻ Ł ï¼ļ Ġ${ c . id }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" éģ¸ èª ² ä»£ èĻ Ł ï¼ļ Ġ${ c . code }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" æķĻ å¸ « ï¼ļ Ġ${ c . teacher }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" åŃ ¸ åĪĨ ï¼ļ Ġ${ c . credit }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" å·² æĶ¶ / éĸĭ æĶ¾ åĲį é¡ į ï¼ļ Ġ${ c . accept Num }/${ c . open Num }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" èª ² ç¨ĭ é¡ŀ åŀĭ ï¼ļ Ġ${ c . type . value }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" éĸĭ èª ² çıŃ ç´ ļ ï¼ļ Ġ${ c . op ener }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ä¸Ĭ èª ² æĻĤ æ®µ èĪĩ åľ° é» ŀ ï¼ļ \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . periods . join ToString ("\ n ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠ Ġ æĺŁ æľŁ ${ chinese Reverse Mapping [ it . day ]} Ġ ç¬¬ ${ it . range . first } ~ ${ it . range . last } ç¯ Ģ ï¼ļ ${ it . location }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġconfirm Button Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠButton ( onClick Ġ= Ġ{ Ġpop State . value Ġ= Ġnull Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Close ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ