Fix/2207 node details respects units (#2374)

This commit is contained in:
DaneEvans 2025-07-07 23:57:34 +10:00 committed by GitHub
parent 43503cd0ce
commit a832ed50c5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 24 additions and 12 deletions

View file

@ -289,6 +289,7 @@ class MetricsViewModel @Inject constructor(
state.copy(
isManaged = profile.config.security.isManaged,
isFahrenheit = moduleConfig.telemetry.environmentDisplayFahrenheit,
displayUnits = profile.config.display.units
)
}
}.launchIn(viewModelScope)

View file

@ -89,11 +89,9 @@ data class Node(
else -> latLongToMeter(latitude, longitude, o.latitude, o.longitude).toInt()
}
// @return a nice human readable string for the distance, or null for unknown
fun distanceStr(o: Node, displayUnits: Int = 0): String? = distance(o)?.let { dist ->
val system = DisplayConfig.DisplayUnits.forNumber(displayUnits)
return if (dist > 0) dist.toDistanceString(system) else null
}
// @return formatted distance string to another node, using the given display units
fun distanceStr(o: Node, displayUnits: DisplayConfig.DisplayUnits): String? =
distance(o)?.toDistanceString(displayUnits)
// @return bearing to the other position in degrees
fun bearing(o: Node?): Int? = when {

View file

@ -308,7 +308,7 @@ fun MapView(
val nodesWithPosition = nodes.filter { it.validPosition != null }
val ourNode = model.ourNodeInfo.value
val gpsFormat = model.config.display.gpsFormat.number
val displayUnits = model.config.display.units.number
val displayUnits = model.config.display.units
val mapFilterState = model.mapFilterStateFlow.value // Access mapFilterState directly
return nodesWithPosition.mapNotNull { node ->
if (mapFilterState.onlyFavorites && !node.isFavorite && !node.equals(ourNode)) {

View file

@ -145,6 +145,7 @@ import com.geeksville.mesh.util.formatAgo
import com.geeksville.mesh.util.formatUptime
import com.geeksville.mesh.util.thenIf
import com.geeksville.mesh.util.toDistanceString
import com.geeksville.mesh.util.toSmallDistanceString
import com.geeksville.mesh.util.toSpeedString
import kotlinx.coroutines.delay
import kotlin.time.Duration.Companion.milliseconds
@ -294,7 +295,7 @@ private fun NodeDetailList(
if (node.hasEnvironmentMetrics) {
PreferenceCategory(stringResource(R.string.environment))
EnvironmentMetrics(node, metricsState.isFahrenheit)
EnvironmentMetrics(node, metricsState.isFahrenheit, metricsState.displayUnits)
Spacer(modifier = Modifier.height(8.dp))
}
@ -732,6 +733,7 @@ private fun InfoCard(
private fun EnvironmentMetrics(
node: Node,
isFahrenheit: Boolean = false,
displayUnits: DisplayUnits,
) = with(node.environmentMetrics) {
FlowRow(
modifier = Modifier.fillMaxWidth(),
@ -799,7 +801,7 @@ private fun EnvironmentMetrics(
InfoCard(
icon = Icons.Default.Height,
text = stringResource(R.string.distance),
value = "%.0f mm".format(distance)
value = distance.toSmallDistanceString(displayUnits)
)
}
if (hasLux()) {
@ -815,7 +817,7 @@ private fun EnvironmentMetrics(
InfoCard(
icon = Icons.Outlined.Navigation,
text = stringResource(R.string.wind),
value = windSpeed.toSpeedString(),
value = windSpeed.toSpeedString(displayUnits),
rotateIcon = normalizedBearing.toFloat(),
)
}

View file

@ -91,7 +91,18 @@ fun Int.toDistanceString(system: DisplayUnits): String {
}
@Suppress("MagicNumber")
fun Float.toSpeedString() = when (DistanceUnit.getFromLocale()) {
DisplayUnits.METRIC -> "%.0f km/h".format(this * 3.6)
else -> "%.0f mph".format(this * 2.23694f)
fun Float.toSpeedString(system: DisplayUnits): String =
if (system == DisplayUnits.METRIC) {
"%.0f km/h".format(this * 3.6)
} else {
"%.0f mph".format(this * 2.23694f)
}
@Suppress("MagicNumber")
fun Float.toSmallDistanceString(system: DisplayUnits): String {
return if (system == DisplayUnits.IMPERIAL) {
"%.2f in".format(this / 25.4f)
} else {
"%.0f mm".format(this)
}
}