1package soy.iko.opencode.ui.settings
3import androidx.compose.foundation.layout.Arrangement
4import androidx.compose.foundation.layout.Column
5import androidx.compose.foundation.layout.fillMaxWidth
6import androidx.compose.foundation.layout.padding
7import androidx.compose.foundation.selection.selectable
8import androidx.compose.material.icons.Icons
9import androidx.compose.material.icons.automirrored.filled.ArrowBack
10import androidx.compose.material3.ExperimentalMaterial3Api
11import androidx.compose.material3.HorizontalDivider
12import androidx.compose.material3.Icon
13import androidx.compose.material3.IconButton
14import androidx.compose.material3.MaterialTheme
15import androidx.compose.material3.RadioButton
16import androidx.compose.material3.Scaffold
17import androidx.compose.material3.Text
18import androidx.compose.material3.TopAppBar
19import androidx.compose.runtime.Composable
20import androidx.compose.runtime.getValue
21import androidx.compose.runtime.rememberCoroutineScope
22import androidx.compose.ui.Alignment
23import androidx.compose.ui.Modifier
24import androidx.compose.ui.unit.dp
25import androidx.lifecycle.compose.collectAsStateWithLifecycle
26import kotlinx.coroutines.launch
27import soy.iko.opencode.data.repo.ThemeMode
28import soy.iko.opencode.di.AppContainer
30@OptIn(ExperimentalMaterial3Api::class)
32fun SettingsScreen(container: AppContainer, onBack: () -> Unit) {
33 val scope = rememberCoroutineScope()
34 val themeMode by container.settingsStore.themeMode.collectAsStateWithLifecycle(initialValue = ThemeMode.SYSTEM)
35 val activeProfile = container.activeConnection.collectAsStateWithLifecycle().value?.profile
40 title = { Text("Settings") },
42 IconButton(onClick = onBack) {
43 Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Back")
49 Column(modifier = Modifier.padding(padding).padding(16.dp)) {
50 Text("Appearance", style = MaterialTheme.typography.titleSmall, color = MaterialTheme.colorScheme.primary)
51 ThemeMode.entries.forEach { mode ->
54 selected = themeMode == mode,
55 onSelect = { scope.launch { container.settingsStore.setThemeMode(mode) } },
59 HorizontalDivider(modifier = Modifier.padding(vertical = 16.dp))
61 Text("Connection", style = MaterialTheme.typography.titleSmall, color = MaterialTheme.colorScheme.primary)
62 if (activeProfile != null) {
63 Text(activeProfile.displayLabel, modifier = Modifier.padding(top = 8.dp))
65 activeProfile.baseUrl + if (activeProfile.hasAuth) " • Basic auth" else "",
66 style = MaterialTheme.typography.bodySmall,
67 color = MaterialTheme.colorScheme.onSurfaceVariant,
72 modifier = Modifier.padding(top = 8.dp),
73 color = MaterialTheme.colorScheme.onSurfaceVariant,
81private fun Row(mode: ThemeMode, selected: Boolean, onSelect: () -> Unit) {
82 androidx.compose.foundation.layout.Row(
85 .selectable(selected = selected, onClick = onSelect)
86 .padding(vertical = 8.dp),
87 horizontalArrangement = Arrangement.spacedBy(8.dp),
88 verticalAlignment = Alignment.CenterVertically,
90 RadioButton(selected = selected, onClick = onSelect)
92 mode.name.lowercase().replaceFirstChar { it.uppercase() },
93 style = MaterialTheme.typography.bodyLarge,
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list