11import androidx.compose.runtime.Composable
2+ import androidx.compose.runtime.LaunchedEffect
23import androidx.compose.runtime.collectAsState
34import androidx.compose.runtime.getValue
45import androidx.compose.runtime.mutableStateOf
56import androidx.compose.runtime.remember
67import androidx.compose.runtime.setValue
7- import com.jakewharton.mosaic.Color
8- import com.jakewharton.mosaic.Column
9- import com.jakewharton.mosaic.Text
8+ import co.touchlab.kermit.Logger
9+ import com.jakewharton.mosaic.layout.KeyEvent
10+ import com.jakewharton.mosaic.layout.onKeyEvent
11+ import com.jakewharton.mosaic.modifier.Modifier
1012import com.jakewharton.mosaic.runMosaic
13+ import com.jakewharton.mosaic.ui.Color
14+ import com.jakewharton.mosaic.ui.Column
15+ import com.jakewharton.mosaic.ui.Text
1116import com.mfriend.collection.CollectionImporter
1217import com.mfriend.collection.CollectionImporterImpl
1318import com.mfriend.db.databaseModule
14- import kotlinx.coroutines.Dispatchers
15- import kotlinx.coroutines.isActive
16- import kotlinx.coroutines.withContext
19+ import kotlinx.coroutines.awaitCancellation
1720import models.CardDto
18- import org.koin.core .KoinApplication
19- import org.koin.core.context.GlobalContext.startKoin
21+ import org.koin.compose .KoinApplication
22+ import org.koin.compose.koinInject
2023import org.koin.core.module.dsl.singleOf
21- import org.koin.core.parameter.parametersOf
2224import org.koin.dsl.bind
2325import org.koin.dsl.module
2426import kotlin.system.exitProcess
@@ -28,15 +30,17 @@ enum class Action(val text: String) {
2830 Parse (" Translate CardCastle file" ),
2931 ViewCollection (" View Collection" ),
3032 BuildCube (" Build Cube" ),
31- Exit (" Exit" )
33+ Exit (" Exit" ),
3234}
3335
3436suspend fun main () = runMosaic {
35- var activeAction by mutableStateOf<Action ?>(null )
36- val koin = initKoin().koin
37- val viewModel: CliViewModel = koin.get { parametersOf(coroutineContext) }
37+ KoinApplication (application = {
38+ Logger .setLogWriters()
39+ modules(scryfallModule, databaseModule, cliModule)
40+ }) {
41+ var activeAction by mutableStateOf<Action ?>(null )
42+ val viewModel: CliViewModel = koinInject()
3843
39- setContent {
4044 when (activeAction) {
4145 Action .Search -> SearchCardAction (viewModel) { activeAction = null }
4246 Action .Parse -> Parse (viewModel) { activeAction = null }
@@ -45,10 +49,8 @@ suspend fun main() = runMosaic {
4549 Action .Exit -> exitProcess(0 )
4650 null -> ActionSelection (viewModel) { activeAction = it }
4751 }
48- }
49- withContext(Dispatchers .IO ) {
50- while (isActive) {
51- // Wait loop
52+ LaunchedEffect (Unit ) {
53+ awaitCancellation()
5254 }
5355 }
5456}
@@ -98,19 +100,22 @@ fun Collection(viewModel: CliViewModel, onComplete: Event) {
98100@Composable
99101fun ActionSelection (viewModel : CliViewModel , onSelect : (Action ) -> Unit ) {
100102 var selection by mutableStateOf(0 )
101- Column {
102- for (action in Action .values()) {
103- Text (action.text, background = Color .White .takeIf { selection == action.ordinal })
103+ Column (
104+ modifier = Modifier .onKeyEvent {
105+ println (it)
106+ selection = when (it) {
107+ KeyEvent (" ArrowUp" ) -> (selection - 1 ).coerceAtLeast(0 )
108+ KeyEvent (" ArrowDown" ) -> (selection + 1 ).coerceAtLeast(0 )
109+ KeyEvent (" q" ) -> exitProcess(0 )
110+ else -> return @onKeyEvent false
111+ }
112+ true
113+ },
114+ ) {
115+ for (action in Action .entries) {
116+ Text (action.text, background = Color .White .takeIf { selection == action.ordinal } ? : Color .Unspecified )
104117 }
105118 }
106- TrackKeysFlow (
107- viewModel,
108- ' q' to { exitProcess(0 ) },
109- upArrow = { selection = (selection - 1 ).coerceAtLeast(0 ) },
110- downArrow = { selection = (selection + 1 ).coerceAtMost(Action .values().size - 1 ) },
111- onEnter = { onSelect(Action .values()[selection]) },
112- onSpace = { onSelect(Action .values()[selection]) }
113- )
114119}
115120
116121@Composable
@@ -129,10 +134,6 @@ fun SearchCardAction(viewModel: CliViewModel, onComplete: () -> Unit) {
129134 }
130135}
131136
132- fun initKoin (): KoinApplication = startKoin {
133- modules(scryfallModule, databaseModule, cliModule)
134- }
135-
136137private val cliModule = module {
137138 singleOf(::CliViewModel )
138139 singleOf(::CollectionImporterImpl ) bind CollectionImporter ::class
0 commit comments