Add setting for text on headwind indicator datafield
This commit is contained in:
parent
2563cf83bd
commit
9c76618d19
@ -7,10 +7,9 @@ import androidx.compose.ui.unit.DpSize
|
|||||||
import androidx.glance.appwidget.ExperimentalGlanceRemoteViewsApi
|
import androidx.glance.appwidget.ExperimentalGlanceRemoteViewsApi
|
||||||
import androidx.glance.appwidget.GlanceRemoteViews
|
import androidx.glance.appwidget.GlanceRemoteViews
|
||||||
import de.timklge.karooheadwind.KarooHeadwindExtension
|
import de.timklge.karooheadwind.KarooHeadwindExtension
|
||||||
import de.timklge.karooheadwind.OpenMeteoCurrentWeatherResponse
|
|
||||||
import de.timklge.karooheadwind.OpenMeteoData
|
|
||||||
import de.timklge.karooheadwind.getRelativeHeadingFlow
|
import de.timklge.karooheadwind.getRelativeHeadingFlow
|
||||||
import de.timklge.karooheadwind.screens.HeadwindSettings
|
import de.timklge.karooheadwind.screens.HeadwindSettings
|
||||||
|
import de.timklge.karooheadwind.screens.WindDirectionIndicatorTextSetting
|
||||||
import de.timklge.karooheadwind.streamCurrentWeatherData
|
import de.timklge.karooheadwind.streamCurrentWeatherData
|
||||||
import de.timklge.karooheadwind.streamDataFlow
|
import de.timklge.karooheadwind.streamDataFlow
|
||||||
import de.timklge.karooheadwind.streamSettings
|
import de.timklge.karooheadwind.streamSettings
|
||||||
@ -29,12 +28,10 @@ import kotlinx.coroutines.awaitCancellation
|
|||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.combine
|
import kotlinx.coroutines.flow.combine
|
||||||
import kotlinx.coroutines.flow.filter
|
|
||||||
import kotlinx.coroutines.flow.flow
|
import kotlinx.coroutines.flow.flow
|
||||||
import kotlinx.coroutines.flow.mapNotNull
|
import kotlinx.coroutines.flow.mapNotNull
|
||||||
import kotlinx.coroutines.flow.onCompletion
|
import kotlinx.coroutines.flow.onCompletion
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlin.math.abs
|
|
||||||
import kotlin.math.cos
|
import kotlin.math.cos
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
@ -106,11 +103,17 @@ class HeadwindDirectionDataType(
|
|||||||
Log.d(KarooHeadwindExtension.TAG, "Updating headwind direction view")
|
Log.d(KarooHeadwindExtension.TAG, "Updating headwind direction view")
|
||||||
val windSpeed = streamData.windSpeed
|
val windSpeed = streamData.windSpeed
|
||||||
val windDirection = streamData.value
|
val windDirection = streamData.value
|
||||||
|
val text = when (streamData.settings.windDirectionIndicatorTextSetting) {
|
||||||
|
WindDirectionIndicatorTextSetting.HEADWIND_SPEED -> {
|
||||||
val headwindSpeed = cos( (windDirection + 180) * Math.PI / 180.0) * windSpeed
|
val headwindSpeed = cos( (windDirection + 180) * Math.PI / 180.0) * windSpeed
|
||||||
val windSpeedText = headwindSpeed.roundToInt().toString()
|
headwindSpeed.roundToInt().toString()
|
||||||
|
}
|
||||||
|
WindDirectionIndicatorTextSetting.WIND_SPEED -> windSpeed.roundToInt().toString()
|
||||||
|
WindDirectionIndicatorTextSetting.NONE -> ""
|
||||||
|
}
|
||||||
|
|
||||||
val result = glance.compose(context, DpSize.Unspecified) {
|
val result = glance.compose(context, DpSize.Unspecified) {
|
||||||
HeadwindDirection(baseBitmap, windDirection.roundToInt(), config.textSize, windSpeedText)
|
HeadwindDirection(baseBitmap, windDirection.roundToInt(), config.textSize, text)
|
||||||
}
|
}
|
||||||
|
|
||||||
emitter.updateView(result.remoteViews)
|
emitter.updateView(result.remoteViews)
|
||||||
|
|||||||
@ -60,11 +60,18 @@ enum class PrecipitationUnit(val id: String, val label: String){
|
|||||||
INCH("inch", "Inch")
|
INCH("inch", "Inch")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum class WindDirectionIndicatorTextSetting(val id: String, val label: String){
|
||||||
|
HEADWIND_SPEED("headwind-speed", "Headwind speed"),
|
||||||
|
WIND_SPEED("absolute-wind-speed", "Absolute wind speed"),
|
||||||
|
NONE("none", "None")
|
||||||
|
}
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class HeadwindSettings(
|
data class HeadwindSettings(
|
||||||
val windUnit: WindUnit = WindUnit.KILOMETERS_PER_HOUR,
|
val windUnit: WindUnit = WindUnit.KILOMETERS_PER_HOUR,
|
||||||
val precipitationUnit: PrecipitationUnit = PrecipitationUnit.MILLIMETERS,
|
val precipitationUnit: PrecipitationUnit = PrecipitationUnit.MILLIMETERS,
|
||||||
val welcomeDialogAccepted: Boolean = false,
|
val welcomeDialogAccepted: Boolean = false,
|
||||||
|
val windDirectionIndicatorTextSetting: WindDirectionIndicatorTextSetting = WindDirectionIndicatorTextSetting.HEADWIND_SPEED,
|
||||||
){
|
){
|
||||||
companion object {
|
companion object {
|
||||||
val defaultSettings = Json.encodeToString(HeadwindSettings())
|
val defaultSettings = Json.encodeToString(HeadwindSettings())
|
||||||
@ -93,6 +100,7 @@ fun MainScreen() {
|
|||||||
var selectedWindUnit by remember { mutableStateOf(WindUnit.KILOMETERS_PER_HOUR) }
|
var selectedWindUnit by remember { mutableStateOf(WindUnit.KILOMETERS_PER_HOUR) }
|
||||||
var selectedPrecipitationUnit by remember { mutableStateOf(PrecipitationUnit.MILLIMETERS) }
|
var selectedPrecipitationUnit by remember { mutableStateOf(PrecipitationUnit.MILLIMETERS) }
|
||||||
var welcomeDialogVisible by remember { mutableStateOf(false) }
|
var welcomeDialogVisible by remember { mutableStateOf(false) }
|
||||||
|
var selectedWindDirectionIndicatorTextSetting by remember { mutableStateOf(WindDirectionIndicatorTextSetting.HEADWIND_SPEED) }
|
||||||
|
|
||||||
val stats by ctx.streamStats().collectAsState(HeadwindStats())
|
val stats by ctx.streamStats().collectAsState(HeadwindStats())
|
||||||
val location by karooSystem.getGpsCoordinateFlow().collectAsState(initial = null)
|
val location by karooSystem.getGpsCoordinateFlow().collectAsState(initial = null)
|
||||||
@ -104,6 +112,7 @@ fun MainScreen() {
|
|||||||
selectedWindUnit = settings.windUnit
|
selectedWindUnit = settings.windUnit
|
||||||
selectedPrecipitationUnit = settings.precipitationUnit
|
selectedPrecipitationUnit = settings.precipitationUnit
|
||||||
welcomeDialogVisible = !settings.welcomeDialogAccepted
|
welcomeDialogVisible = !settings.welcomeDialogAccepted
|
||||||
|
selectedWindDirectionIndicatorTextSetting = settings.windDirectionIndicatorTextSetting
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,10 +147,19 @@ fun MainScreen() {
|
|||||||
selectedPrecipitationUnit = PrecipitationUnit.entries.find { unit -> unit.id == selectedOption.id }!!
|
selectedPrecipitationUnit = PrecipitationUnit.entries.find { unit -> unit.id == selectedOption.id }!!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val windDirectionIndicatorTextSettingDropdownOptions = WindDirectionIndicatorTextSetting.entries.toList().map { unit -> DropdownOption(unit.id, unit.label) }
|
||||||
|
val windDirectionIndicatorTextSettingSelection by remember(selectedWindDirectionIndicatorTextSetting) {
|
||||||
|
mutableStateOf(windDirectionIndicatorTextSettingDropdownOptions.find { option -> option.id == selectedWindDirectionIndicatorTextSetting.id }!!)
|
||||||
|
}
|
||||||
|
Dropdown(label = "Text on headwind indicator", options = windDirectionIndicatorTextSettingDropdownOptions, selected = windDirectionIndicatorTextSettingSelection) { selectedOption ->
|
||||||
|
selectedWindDirectionIndicatorTextSetting = WindDirectionIndicatorTextSetting.entries.find { unit -> unit.id == selectedOption.id }!!
|
||||||
|
}
|
||||||
|
|
||||||
FilledTonalButton(modifier = Modifier
|
FilledTonalButton(modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.height(50.dp), onClick = {
|
.height(50.dp), onClick = {
|
||||||
val newSettings = HeadwindSettings(windUnit = selectedWindUnit, precipitationUnit = selectedPrecipitationUnit, welcomeDialogAccepted = true)
|
val newSettings = HeadwindSettings(windUnit = selectedWindUnit, precipitationUnit = selectedPrecipitationUnit,
|
||||||
|
welcomeDialogAccepted = true, windDirectionIndicatorTextSetting = selectedWindDirectionIndicatorTextSetting)
|
||||||
|
|
||||||
coroutineScope.launch {
|
coroutineScope.launch {
|
||||||
saveSettings(ctx, newSettings)
|
saveSettings(ctx, newSettings)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user