Регулятор «Высота» экрана очков (0..1, с учётом масштаба): SetVertical по протоколу, offset Y в кино/коннект/оверлее, слайдер на пульте

This commit is contained in:
2026-08-25 02:11:01 +03:00
parent b17b5bf424
commit 6d22f56bd8
10 changed files with 120 additions and 3 deletions
@@ -17,6 +17,7 @@ import pw.binom.viewmate.core.protocol.MediaCommandMsg
import pw.binom.viewmate.core.protocol.PlayVideo
import pw.binom.viewmate.core.protocol.SetMode
import pw.binom.viewmate.core.protocol.SetScale
import pw.binom.viewmate.core.protocol.SetVertical
import pw.binom.viewmate.core.protocol.ShowText
import pw.binom.viewmate.core.protocol.Shutdown
@@ -275,6 +276,13 @@ class PhoneActions(
return "масштаб → $clamped"
}
/** Вертикаль экрана очков: SetVertical (0..1; 1 — верх, 0 — низ). */
suspend fun applyVertical(vertical: Float): String {
val clamped = vertical.coerceIn(0f, 1f)
sender.send(SetVertical(clamped))
return "высота → $clamped"
}
/** Закрыть приложение на очках (телефон остаётся открытым). */
suspend fun shutdownGlasses(): String {
sender.send(Shutdown())
@@ -39,6 +39,16 @@ class PhoneState {
log("state", "масштаб → $value")
}
private val _vertical = MutableStateFlow(1f)
val verticalFlow: StateFlow<Float> = _vertical.asStateFlow()
/** Вертикаль экрана очков (0..1): 1.0 — у верха, 0.0 — нижняя кромка у низа. */
var vertical: Float
get() = _vertical.value
set(value) {
_vertical.value = value.coerceIn(0f, 1f)
log("state", "высота → $value")
}
private val _currentItem = MutableStateFlow<JellyfinItem?>(null)
val currentItemFlow: StateFlow<JellyfinItem?> = _currentItem.asStateFlow()
var currentItem: JellyfinItem?
@@ -81,6 +81,11 @@ data class ChatSessionMsg(val sessionId: String, val title: String) : HostToGlas
@SerialName("set_scale")
data class SetScale(val scale: Float) : HostToGlasses
/** Вертикальное положение экрана очков (0..1); 1.0 — у верха, 0.0 — нижняя кромка у низа. */
@Serializable
@SerialName("set_vertical")
data class SetVertical(val vertical: Float) : HostToGlasses
/** Фраза распознана (streaming): phrase — фраза, full — весь накопленный текст сессии. */
@Serializable
@SerialName("stt_phrase")