Add screen overlay visualization for LED target testing

Implements transparent on-screen overlay that displays LED calibration data
directly on the target display for easier setup and debugging. Overlay shows
border zones, LED position axes with tick labels, and calibration details.

Features:
- Tkinter-based transparent overlay window with click-through support
- Border zones highlighting pixel sampling areas (colored rectangles)
- LED position axes with numbered tick marks at regular intervals
- Calibration info box showing target name, LED counts, and configuration
- Toggle button (eye icon) in target cards for show/hide
- Localized UI strings (English and Russian)

Implementation:
- New screen_overlay.py module with OverlayWindow and OverlayManager classes
- Overlay runs in background thread with proper asyncio integration
- API endpoints for start/stop/status overlay control
- overlay_active state tracking in processor manager

Known limitation: tkinter threading cleanup causes server restart when overlay
is closed, but functionality works correctly while overlay is active.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-16 22:33:16 +03:00
parent ac5c1d0c82
commit 4f4d17c44d
7 changed files with 850 additions and 2 deletions

View File

@@ -439,5 +439,17 @@
"pattern.name.hint": "Описательное имя для этой раскладки прямоугольников",
"pattern.description.hint": "Необязательные заметки о назначении этого паттерна",
"pattern.visual_editor.hint": "Нажмите кнопки + чтобы добавить прямоугольники. Тяните края для изменения размера, тяните внутри для перемещения.",
"pattern.rectangles.hint": "Точная настройка позиций и размеров прямоугольников в координатах (0.0 до 1.0)"
"pattern.rectangles.hint": "Точная настройка позиций и размеров прямоугольников в координатах (0.0 до 1.0)",
"overlay": {
"button": {
"show": "Показать визуализацию наложения",
"hide": "Скрыть визуализацию наложения"
},
"started": "Визуализация наложения запущена",
"stopped": "Визуализация наложения остановлена",
"error": {
"start": "Не удалось запустить наложение",
"stop": "Не удалось остановить наложение"
}
}
}