Add sync clock entity for synchronized animation timing
Introduces Synchronization Clocks — shared, controllable time bases that CSS sources can optionally reference for synchronized animation. Backend: - New SyncClock dataclass, JSON store, Pydantic schemas, REST API - Runtime clock with thread-safe pause/resume/reset and speed control - Ref-counted runtime pool with eager creation for API control - clock_id field on all ColorStripSource types - Stream integration: clock time/speed replaces source-local values - Paused clock skips rendering (saves CPU + stops frame pushes) - Included in backup/restore via STORE_MAP Frontend: - Sync Clocks tab in Streams section with cards and controls - Clock dropdown in CSS editor (hidden speed slider when clock set) - Clock crosslink badge on CSS source cards (replaces speed badge) - Targets tab uses DataCache for picture/audio sources and sync clocks Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -307,6 +307,7 @@
|
||||
"common.delete": "Удалить",
|
||||
"common.edit": "Редактировать",
|
||||
"common.clone": "Клонировать",
|
||||
"common.none": "Нет",
|
||||
"section.filter.placeholder": "Фильтр...",
|
||||
"section.filter.reset": "Очистить фильтр",
|
||||
"section.expand_all": "Развернуть все секции",
|
||||
@@ -950,6 +951,7 @@
|
||||
"audio_template.error.required": "Пожалуйста, заполните все обязательные поля",
|
||||
"audio_template.error.delete": "Не удалось удалить аудиошаблон",
|
||||
"streams.group.value": "Источники значений",
|
||||
"streams.group.sync": "Часы синхронизации",
|
||||
"value_source.group.title": "Источники значений",
|
||||
"value_source.add": "Добавить источник значений",
|
||||
"value_source.edit": "Редактировать источник значений",
|
||||
@@ -1137,5 +1139,32 @@
|
||||
"theme.switched.dark": "Переключено на тёмную тему",
|
||||
"theme.switched.light": "Переключено на светлую тему",
|
||||
"accent.color.updated": "Цвет акцента обновлён",
|
||||
"search.footer": "↑↓ навигация · Enter выбор · Esc закрыть"
|
||||
"search.footer": "↑↓ навигация · Enter выбор · Esc закрыть",
|
||||
"sync_clock.group.title": "Часы синхронизации",
|
||||
"sync_clock.add": "Добавить часы",
|
||||
"sync_clock.edit": "Редактировать часы",
|
||||
"sync_clock.name": "Название:",
|
||||
"sync_clock.name.placeholder": "Основные часы анимации",
|
||||
"sync_clock.name.hint": "Описательное название для этих часов синхронизации",
|
||||
"sync_clock.speed": "Скорость:",
|
||||
"sync_clock.speed.hint": "Множитель скорости, общий для всех привязанных источников. 1.0 = нормальная скорость.",
|
||||
"sync_clock.description": "Описание (необязательно):",
|
||||
"sync_clock.description.placeholder": "Необязательное описание",
|
||||
"sync_clock.description.hint": "Необязательные заметки о назначении этих часов",
|
||||
"sync_clock.status.running": "Работает",
|
||||
"sync_clock.status.paused": "Приостановлено",
|
||||
"sync_clock.action.pause": "Приостановить",
|
||||
"sync_clock.action.resume": "Возобновить",
|
||||
"sync_clock.action.reset": "Сбросить",
|
||||
"sync_clock.error.name_required": "Название часов обязательно",
|
||||
"sync_clock.error.load": "Не удалось загрузить часы синхронизации",
|
||||
"sync_clock.created": "Часы синхронизации созданы",
|
||||
"sync_clock.updated": "Часы синхронизации обновлены",
|
||||
"sync_clock.deleted": "Часы синхронизации удалены",
|
||||
"sync_clock.paused": "Часы приостановлены",
|
||||
"sync_clock.resumed": "Часы возобновлены",
|
||||
"sync_clock.reset_done": "Часы сброшены на ноль",
|
||||
"sync_clock.delete.confirm": "Удалить эти часы синхронизации? Источники, использующие их, вернутся к собственной скорости.",
|
||||
"color_strip.clock": "Часы синхронизации:",
|
||||
"color_strip.clock.hint": "Привязка к часам синхронизации для синхронной анимации. При установке скорость берётся из часов."
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user