"""IOverlayLayer — interface for pluggable overlay layers drawn on CameraView.""" from __future__ import annotations from abc import ABC, abstractmethod from PySide6.QtCore import QRect from PySide6.QtGui import QPainter class IOverlayLayer(ABC): """ Interface for a single overlay layer drawn over the camera frame. Each layer receives the active QPainter and the video rect (the letterboxed area where the camera image was drawn) so it can position elements relative to the actual video content if needed. To add a new overlay (e.g. YOLO bboxes): 1. Subclass IOverlayLayer. 2. Implement paint(). 3. Register with CameraView.add_overlay_layer(). No Qt subclassing is required — layers are plain Python objects. """ @property def name(self) -> str: """Human-readable identifier used in menus / debug output.""" return type(self).__name__ @property def visible(self) -> bool: """Whether this layer should be drawn.""" return self._visible @visible.setter def visible(self, value: bool) -> None: self._visible = value def __init__(self) -> None: self._visible: bool = True @abstractmethod def paint(self, painter: QPainter, video_rect: QRect) -> None: """ Draw this layer. Args: painter: Active QPainter on the CameraView widget. Caller saves/restores painter state around each layer. video_rect: The QRect where the camera image was drawn (letterboxed). Use this to position overlays relative to the video image. """