Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feat] Custom sensor boundaries #48

Merged
merged 4 commits into from
Dec 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package app.cleanmeter.target.desktop.model

import androidx.compose.runtime.Immutable
import app.cleanmeter.target.desktop.ui.settings.SensorType
import kotlinx.serialization.Serializable

@Serializable
@Immutable
data class OverlaySettings(
val isDarkTheme: Boolean = false,
val isHorizontal: Boolean = true,
Expand All @@ -18,11 +20,13 @@ data class OverlaySettings(
val sensors: Sensors = Sensors(),
) {
@Serializable
@Immutable
enum class ProgressType {
Circular, Bar, None
}

@Serializable
@Immutable
data class Sensors(
val framerate: Sensor.Framerate = Sensor.Framerate(),
val frametime: Sensor.Frametime = Sensor.Frametime(),
Expand All @@ -38,30 +42,106 @@ data class OverlaySettings(
)

@Serializable
sealed class Sensor(val sensorType: SensorType) {
@Immutable
sealed class Sensor {
abstract val isEnabled: Boolean
abstract val customReadingId: String

@Serializable
data class Framerate(override val isEnabled: Boolean = true, val customReadingId: String = "") : Sensor(SensorType.Framerate)
@Immutable
abstract class GraphSensor : Sensor() {
abstract val boundaries: Boundaries

@Serializable
@Immutable
data class Boundaries(
val low: Int = 60,
val medium: Int = 80,
val high: Int = 90,
)
}

@Serializable
data class Frametime(override val isEnabled: Boolean = true, val customReadingId: String = "") : Sensor(SensorType.Frametime)
@Immutable
data class Framerate(
override val isEnabled: Boolean = true,
override val customReadingId: String = ""
) : Sensor()

@Serializable
data class CpuTemp(override val isEnabled: Boolean = true, val customReadingId: String = "") : Sensor(SensorType.CpuTemp)
@Immutable
data class Frametime(
override val isEnabled: Boolean = true,
override val customReadingId: String = ""
) : Sensor()

@Serializable
data class CpuUsage(override val isEnabled: Boolean = true, val customReadingId: String = "") : Sensor(SensorType.CpuUsage)
@Immutable
data class CpuTemp(
override val isEnabled: Boolean = true,
override val customReadingId: String = "",
override val boundaries: Boundaries = Boundaries(),
) : GraphSensor()

@Serializable
data class GpuTemp(override val isEnabled: Boolean = true, val customReadingId: String = "") : Sensor(SensorType.GpuTemp)
@Immutable
data class CpuUsage(
override val isEnabled: Boolean = true,
override val customReadingId: String = "",
override val boundaries: Boundaries = Boundaries(),
) : GraphSensor()

@Serializable
data class GpuUsage(override val isEnabled: Boolean = true, val customReadingId: String = "") : Sensor(SensorType.GpuUsage)
@Immutable
data class GpuTemp(
override val isEnabled: Boolean = true,
override val customReadingId: String = "",
override val boundaries: Boundaries = Boundaries(),
) : GraphSensor()

@Serializable
data class VramUsage(override val isEnabled: Boolean = true, val customReadingId: String = "") : Sensor(SensorType.VramUsage)
@Immutable
data class GpuUsage(
override val isEnabled: Boolean = true,
override val customReadingId: String = "",
override val boundaries: Boundaries = Boundaries(),
) : GraphSensor()

@Serializable
@Immutable
data class VramUsage(
override val isEnabled: Boolean = true,
override val customReadingId: String = "",
override val boundaries: Boundaries = Boundaries(),
) : GraphSensor()

@Serializable
data class TotalVramUsed(override val isEnabled: Boolean = true, val customReadingId: String = "") : Sensor(SensorType.TotalVramUsed)
@Immutable
data class TotalVramUsed(
override val isEnabled: Boolean = true,
override val customReadingId: String = "",
) : Sensor()

@Serializable
data class RamUsage(override val isEnabled: Boolean = true, val customReadingId: String = "") : Sensor(SensorType.RamUsage)
@Immutable
data class RamUsage(
override val isEnabled: Boolean = true,
override val customReadingId: String = "",
override val boundaries: Boundaries = Boundaries(),
) : GraphSensor()

@Serializable
data class UpRate(override val isEnabled: Boolean = true, val customReadingId: String = "") : Sensor(SensorType.UpRate)
@Immutable
data class UpRate(
override val isEnabled: Boolean = true,
override val customReadingId: String = ""
) : Sensor()

@Serializable
data class DownRate(override val isEnabled: Boolean = true, val customReadingId: String = "") : Sensor(SensorType.DownRate)
@Immutable
data class DownRate(
override val isEnabled: Boolean = true,
override val customReadingId: String = ""
) : Sensor()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ internal fun CustomReadingProgress(
customReadingId: String,
progressType: OverlaySettings.ProgressType,
progressUnit: String,
boundaries: OverlaySettings.Sensor.GraphSensor.Boundaries
) {
val reading = data.getReading(customReadingId)
val value = (reading?.Value ?: 1f).coerceAtLeast(1f)
Expand All @@ -20,6 +21,7 @@ internal fun CustomReadingProgress(
value = value / 100f,
label = label(value),
unit = progressUnit,
progressType = progressType
progressType = progressType,
boundaries = boundaries
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package app.cleanmeter.target.desktop.ui.components

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.material.Icon
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Info
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import app.cleanmeter.core.designsystem.LocalColorScheme
import app.cleanmeter.core.designsystem.LocalTypography

@Composable
internal fun Disclaimer(text: String) = Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(4.dp)
) {
Icon(
imageVector = Icons.Outlined.Info,
contentDescription = "Trailing icon for exposed dropdown menu",
tint = LocalColorScheme.current.icon.bolderActive,
modifier = Modifier.size(16.dp)
)
Text(
text = text,
color = LocalColorScheme.current.text.disabled,
style = LocalTypography.current.labelSMedium,
modifier = Modifier.wrapContentHeight()
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ internal fun KeyboardShortcutInfoLabel() {
text = "Hot key for showing/hiding the overlay",
color = LocalColorScheme.current.text.heading,
style = LocalTypography.current.labelLMedium,
modifier = Modifier.wrapContentHeight(align = Alignment.CenterVertically),
modifier = Modifier.wrapContentHeight(),
)
}
HotKeySymbol(listOf("Ctrl", "Alt", "F10"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,27 +17,31 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Color.Companion.White
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.unit.dp
import app.cleanmeter.target.desktop.model.OverlaySettings
import app.cleanmeter.target.desktop.ui.ColorTokens.ClearGray
import app.cleanmeter.target.desktop.ui.ColorTokens.Green
import app.cleanmeter.target.desktop.ui.ColorTokens.Red
import app.cleanmeter.target.desktop.ui.ColorTokens.Yellow
import app.cleanmeter.target.desktop.model.OverlaySettings
import kotlin.math.abs

@Composable
fun Progress(
value: Float,
label: String,
unit: String,
progressType: OverlaySettings.ProgressType
progressType: OverlaySettings.ProgressType,
boundaries: OverlaySettings.Sensor.GraphSensor.Boundaries
) {
val color = when {
value > 0.8f -> Red
value in 0.6f..0.8f -> Yellow
else -> Green
value in 0f..boundaries.low.div(100f) -> Green
value in boundaries.low.div(100f)..boundaries.medium.div(100f) -> Yellow
value > boundaries.high.div(100f) -> Red
else -> White
}

Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) {
when (progressType) {
OverlaySettings.ProgressType.Circular -> CircularProgressIndicator(
Expand Down Expand Up @@ -88,35 +92,40 @@ private fun ProgressPreview() {
value = 0.5f,
label = "05",
progressType = OverlaySettings.ProgressType.Bar,
unit = "C"
unit = "C",
boundaries = OverlaySettings.Sensor.GraphSensor.Boundaries()
)

Progress(
value = 0.6f,
label = "06",
progressType = OverlaySettings.ProgressType.Bar,
unit = "C"
unit = "C",
boundaries = OverlaySettings.Sensor.GraphSensor.Boundaries()
)

Progress(
value = 0.7f,
label = "07",
progressType = OverlaySettings.ProgressType.Bar,
unit = "C"
unit = "C",
boundaries = OverlaySettings.Sensor.GraphSensor.Boundaries()
)

Progress(
value = 0.8f,
label = "08",
progressType = OverlaySettings.ProgressType.Bar,
unit = "C"
unit = "C",
boundaries = OverlaySettings.Sensor.GraphSensor.Boundaries()
)

Progress(
value = 0.9f,
label = "09",
progressType = OverlaySettings.ProgressType.Bar,
unit = "C"
unit = "C",
boundaries = OverlaySettings.Sensor.GraphSensor.Boundaries()
)
}
}
Loading
Loading