Added a few visual fixes to extended data output feature

This commit is contained in:
Arty Bishop committed 2026-02-21 12:31:59 +00:00
1 parent a545863473
commit e717d75324
4 files changed
+32 -64

No files matched your search

@@ -34,10 +34,8 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.ElevatedCard import androidx.compose.material3.ElevatedCard
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
@@ -58,7 +56,6 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.compose.ui.graphics.Brush
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavGraphBuilder import androidx.navigation.NavGraphBuilder
@@ -345,9 +342,8 @@ private fun TransmittersList(
TransmitterItem( TransmitterItem(
radio, radio,
(selectedUuid != null), (selectedUuid != null),
(radio.uuid == selectedUuid), (radio.uuid == selectedUuid)
{ onSelect(radio.uuid) } ) { onSelect(radio.uuid) }
)
} }
} }
} }
@@ -359,7 +355,7 @@ private fun TransmitterItemPreview() {
"", "Extremely powerful transmitter", true, 10000000000L, 10000000000L, "", "Extremely powerful transmitter", true, 10000000000L, 10000000000L,
null, 10000000000L, 10000000000L, "FSK AX.100 Mode 5", true, 0 null, 10000000000L, 10000000000L, "FSK AX.100 Mode 5", true, 0
) )
MainTheme { TransmitterItem(transmitter, true, true,{}) } MainTheme { TransmitterItem(transmitter, isClickable = true, isSelected = true, onClick = {}) }
} }
@Composable @Composable
@@ -405,73 +401,42 @@ private fun TransmitterItem(
isSelected: Boolean, isSelected: Boolean,
onClick: () -> Unit onClick: () -> Unit
) { ) {
// LaunchedEffect(radio) {
// BluetoothCIV.updateOnce(radio)
// }
val title = if (radio.isInverted) "INVERTED: ${radio.info}" else radio.info val title = if (radio.isInverted) "INVERTED: ${radio.info}" else radio.info
val fullTitle = "$title - (${radio.downlinkMode ?: "--"}/${radio.uplinkMode ?: "--"})" val fullTitle = "$title - (${radio.downlinkMode ?: "--"}/${radio.uplinkMode ?: "--"})"
Surface( Surface(
color = MaterialTheme.colorScheme.background, color = MaterialTheme.colorScheme.background,
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.then( .then(if (isClickable) Modifier.clickable { onClick() } else Modifier)
if (isClickable) Modifier.clickable { onClick() } else Modifier
)
// modifier = Modifier.clickable(onClick = {
// Log.d("BluetoothCivManager", radio.toString())
// if(radio.uuid == BluetoothCIV.selected) BluetoothCIV.selected = "NONE" else
// {
// BluetoothCIV.connect(radio)
// BluetoothCIV.updateOnce(radio)
// }
// })
) { ) {
Surface(modifier = Modifier.padding(bottom = 2.dp)) { Surface(modifier = Modifier.padding(bottom = 2.dp)) {
Box { Column(
Column( horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(6.dp), verticalArrangement = Arrangement.spacedBy(6.dp),
modifier = Modifier modifier = Modifier
.background(MaterialTheme.colorScheme.surface) .background(MaterialTheme.colorScheme.surface)
.padding(horizontal = 8.dp, vertical = 6.dp) .padding(horizontal = 8.dp, vertical = 6.dp)
) { ) {
Box {
Text( Text(
text = fullTitle, text = fullTitle,
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 6.dp)
.infiniteMarquee() .infiniteMarquee()
) )
FrequencyRow(radio = radio, isDownlink = true) if (isSelected) {
FrequencyRow(radio = radio, isDownlink = false)
}
if (isSelected) {
Box(
modifier = Modifier
.align(Alignment.TopStart)
.padding(start = 4.dp, top = 5.dp)
.background(
brush = Brush.radialGradient(
colors = listOf(
MaterialTheme.colorScheme.surface,
MaterialTheme.colorScheme.surface.copy(alpha = 0f)
),
radius = 80f
),
shape = CircleShape
)
.width(30.dp)
) {
Icon( Icon(
painter = painterResource(id = R.drawable.ic_radios), painter = painterResource(id = R.drawable.ic_radios),
contentDescription = null, contentDescription = null,
tint = MaterialTheme.colorScheme.primary, tint = MaterialTheme.colorScheme.primary,
modifier = Modifier modifier = Modifier.background(color = MaterialTheme.colorScheme.surface)
.align(Alignment.TopStart)
.padding(start = 4.dp)
.size(24.dp)
) )
} }
} }
FrequencyRow(radio = radio, isDownlink = true)
FrequencyRow(radio = radio, isDownlink = false)
} }
} }
} }
@@ -238,6 +238,7 @@ fun NetworkOutputDialog(
Boolean, String, String, String Boolean, String, String, String
) -> Unit ) -> Unit
) { ) {
val padding = LocalSpacing.current.large
val rotatorState = rememberSaveable { mutableStateOf(initialSettings.rotatorState) } val rotatorState = rememberSaveable { mutableStateOf(initialSettings.rotatorState) }
val rotatorAddress = rememberSaveable { mutableStateOf(initialSettings.rotatorAddress) } val rotatorAddress = rememberSaveable { mutableStateOf(initialSettings.rotatorAddress) }
val rotatorPort = rememberSaveable { mutableStateOf(initialSettings.rotatorPort) } val rotatorPort = rememberSaveable { mutableStateOf(initialSettings.rotatorPort) }
@@ -264,7 +265,7 @@ fun NetworkOutputDialog(
onCancel = onDismiss, onCancel = onDismiss,
onAccept = onAccept onAccept = onAccept
) { ) {
Column(modifier = Modifier.padding(8.dp)) { Column(modifier = Modifier.padding(horizontal = padding)) {
Row( Row(
horizontalArrangement = Arrangement.SpaceBetween, horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
@@ -277,7 +278,7 @@ fun NetworkOutputDialog(
) )
} }
Row( Row(
horizontalArrangement = Arrangement.spacedBy(8.dp), horizontalArrangement = Arrangement.spacedBy(6.dp),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
OutlinedTextField( OutlinedTextField(
@@ -297,7 +298,7 @@ fun NetworkOutputDialog(
enabled = rotatorState.value enabled = rotatorState.value
) )
} }
Spacer(modifier = Modifier.height(8.dp)) Spacer(modifier = Modifier.height(6.dp))
OutlinedTextField( OutlinedTextField(
value = rotatorFormat.value, value = rotatorFormat.value,
onValueChange = { rotatorFormat.value = it }, onValueChange = { rotatorFormat.value = it },
@@ -306,7 +307,7 @@ fun NetworkOutputDialog(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
enabled = rotatorState.value enabled = rotatorState.value
) )
Spacer(modifier = Modifier.height(12.dp)) Spacer(modifier = Modifier.height(6.dp))
Row( Row(
horizontalArrangement = Arrangement.SpaceBetween, horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
@@ -319,7 +320,7 @@ fun NetworkOutputDialog(
) )
} }
Row( Row(
horizontalArrangement = Arrangement.spacedBy(8.dp), horizontalArrangement = Arrangement.spacedBy(6.dp),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
OutlinedTextField( OutlinedTextField(
@@ -339,7 +340,7 @@ fun NetworkOutputDialog(
enabled = frequencyState.value enabled = frequencyState.value
) )
} }
Spacer(modifier = Modifier.height(8.dp)) Spacer(modifier = Modifier.height(6.dp))
OutlinedTextField( OutlinedTextField(
value = frequencyFormat.value, value = frequencyFormat.value,
onValueChange = { frequencyFormat.value = it }, onValueChange = { frequencyFormat.value = it },
@@ -389,6 +390,7 @@ fun BluetoothOutputDialog(
Boolean, String, String Boolean, String, String
) -> Unit ) -> Unit
) { ) {
val padding = LocalSpacing.current.large
val rotatorState = rememberSaveable { mutableStateOf(initialSettings.bluetoothRotatorState) } val rotatorState = rememberSaveable { mutableStateOf(initialSettings.bluetoothRotatorState) }
val rotatorAddress = rememberSaveable { mutableStateOf(initialSettings.bluetoothRotatorAddress) } val rotatorAddress = rememberSaveable { mutableStateOf(initialSettings.bluetoothRotatorAddress) }
val rotatorFormat = rememberSaveable { mutableStateOf(initialSettings.bluetoothRotatorFormat) } val rotatorFormat = rememberSaveable { mutableStateOf(initialSettings.bluetoothRotatorFormat) }
@@ -411,7 +413,7 @@ fun BluetoothOutputDialog(
onCancel = onDismiss, onCancel = onDismiss,
onAccept = onAccept onAccept = onAccept
) { ) {
Column(modifier = Modifier.padding(8.dp)) { Column(modifier = Modifier.padding(horizontal = padding)) {
Row( Row(
horizontalArrangement = Arrangement.SpaceBetween, horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
@@ -424,7 +426,7 @@ fun BluetoothOutputDialog(
) )
} }
Row( Row(
horizontalArrangement = Arrangement.spacedBy(8.dp), horizontalArrangement = Arrangement.spacedBy(6.dp),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
OutlinedTextField( OutlinedTextField(
@@ -444,7 +446,7 @@ fun BluetoothOutputDialog(
enabled = rotatorState.value enabled = rotatorState.value
) )
} }
Spacer(modifier = Modifier.height(12.dp)) Spacer(modifier = Modifier.height(6.dp))
Row( Row(
horizontalArrangement = Arrangement.SpaceBetween, horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
@@ -457,7 +459,7 @@ fun BluetoothOutputDialog(
) )
} }
Row( Row(
horizontalArrangement = Arrangement.spacedBy(8.dp), horizontalArrangement = Arrangement.spacedBy(6.dp),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
OutlinedTextField( OutlinedTextField(
@@ -32,6 +32,7 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.GridItemSpan
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.material3.ElevatedCard import androidx.compose.material3.ElevatedCard
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
@@ -299,7 +300,7 @@ private fun SettingsScreen(uiState: SettingsState) {
LocationCard(posSettings, setGpsPos, showPosDialog, showLocDialog, dismissPos, uiState.sendSystemAction) LocationCard(posSettings, setGpsPos, showPosDialog, showLocDialog, dismissPos, uiState.sendSystemAction)
} }
item { DataCard(dataSettings, updateFromWeb, clearAllData, showDataSourcesDialog) } item { DataCard(dataSettings, updateFromWeb, clearAllData, showDataSourcesDialog) }
item { OutputCard({ showNetworkDialog() }, { showBluetoothDialog() }) } item(span = { GridItemSpan(maxLineSpan) }) { OutputCard({ showNetworkDialog() }, { showBluetoothDialog() }) }
item { OtherCard(otherSettings, toggleUtc, toggleUpdate, toggleSweep, toggleSensor) } item { OtherCard(otherSettings, toggleUtc, toggleUpdate, toggleSweep, toggleSensor) }
item { CardCredits() } item { CardCredits() }
} }
+1 -1
View File
@@ -1,6 +1,6 @@
[versions] [versions]
android-gradle-plugin = "9.0.1" android-gradle-plugin = "9.0.1"
google-ksp = "2.3.2" google-ksp = "2.3.5"
kotlin = "2.3.10" kotlin = "2.3.10"
androidx-core-ktx = "1.17.0" androidx-core-ktx = "1.17.0"