Address Copilot review: touch handling, null guards, and test accuracy

- Add touch-none class to drag overlay for reliable touch event capture
- Guard status.Position access when GetStatus fails (status is None)
- Make RelativeZoomTranslationSpace lookup resilient to missing/None fields
- Fix test inputs to use "relative_" prefix matching actual dispatcher format

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ryan Gregg 2026-03-18 02:46:12 +00:00
parent 6be57614dd
commit 0760704db8
3 changed files with 21 additions and 14 deletions

View File

@ -255,23 +255,30 @@ class OnvifController:
status = None status = None
# Check for relative zoom support # Check for relative zoom support
zoom_space_id = next( zoom_spaces = getattr(
getattr(ptz_config, "Spaces", None),
"RelativeZoomTranslationSpace",
None,
)
zoom_space_id = (
next(
( (
i i
for i, space in enumerate( for i, space in enumerate(zoom_spaces)
ptz_config.Spaces.RelativeZoomTranslationSpace
)
if "TranslationGenericSpace" in space["URI"] if "TranslationGenericSpace" in space["URI"]
), ),
None, None,
) )
if zoom_spaces
else None
)
# setup relative moving request (for click-to-move, drag-to-zoom, and autotracking) # setup relative moving request (for click-to-move, drag-to-zoom, and autotracking)
if fov_space_id is not None: if fov_space_id is not None:
move_request = ptz.create_type("RelativeMove") move_request = ptz.create_type("RelativeMove")
move_request.ProfileToken = profile.token move_request.ProfileToken = profile.token
logger.debug(f"{camera_name}: Relative move request: {move_request}") logger.debug(f"{camera_name}: Relative move request: {move_request}")
if move_request.Translation is None: if move_request.Translation is None and status is not None:
move_request.Translation = status.Position move_request.Translation = status.Position
move_request.Translation.PanTilt.space = ptz_config["Spaces"][ move_request.Translation.PanTilt.space = ptz_config["Spaces"][
"RelativePanTiltTranslationSpace" "RelativePanTiltTranslationSpace"

View File

@ -35,25 +35,25 @@ class TestMoveRelativeParsing(TestCase):
return float(pan), float(tilt), zoom return float(pan), float(tilt), zoom
def test_pan_tilt_only(self): def test_pan_tilt_only(self):
pan, tilt, zoom = self._parse_move_relative("move_0.5_-0.3") pan, tilt, zoom = self._parse_move_relative("relative_0.5_-0.3")
self.assertAlmostEqual(pan, 0.5) self.assertAlmostEqual(pan, 0.5)
self.assertAlmostEqual(tilt, -0.3) self.assertAlmostEqual(tilt, -0.3)
self.assertAlmostEqual(zoom, 0) self.assertAlmostEqual(zoom, 0)
def test_pan_tilt_with_zoom(self): def test_pan_tilt_with_zoom(self):
pan, tilt, zoom = self._parse_move_relative("move_0.5_-0.3_0.8") pan, tilt, zoom = self._parse_move_relative("relative_0.5_-0.3_0.8")
self.assertAlmostEqual(pan, 0.5) self.assertAlmostEqual(pan, 0.5)
self.assertAlmostEqual(tilt, -0.3) self.assertAlmostEqual(tilt, -0.3)
self.assertAlmostEqual(zoom, 0.8) self.assertAlmostEqual(zoom, 0.8)
def test_zero_zoom(self): def test_zero_zoom(self):
pan, tilt, zoom = self._parse_move_relative("move_0.0_0.0_0.0") pan, tilt, zoom = self._parse_move_relative("relative_0.0_0.0_0.0")
self.assertAlmostEqual(pan, 0.0) self.assertAlmostEqual(pan, 0.0)
self.assertAlmostEqual(tilt, 0.0) self.assertAlmostEqual(tilt, 0.0)
self.assertAlmostEqual(zoom, 0.0) self.assertAlmostEqual(zoom, 0.0)
def test_negative_values(self): def test_negative_values(self):
pan, tilt, zoom = self._parse_move_relative("move_-1.0_-1.0_0.5") pan, tilt, zoom = self._parse_move_relative("relative_-1.0_-1.0_0.5")
self.assertAlmostEqual(pan, -1.0) self.assertAlmostEqual(pan, -1.0)
self.assertAlmostEqual(tilt, -1.0) self.assertAlmostEqual(tilt, -1.0)
self.assertAlmostEqual(zoom, 0.5) self.assertAlmostEqual(zoom, 0.5)

View File

@ -760,7 +760,7 @@ export default function LiveCameraView({
> >
{clickOverlay && ( {clickOverlay && (
<div <div
className="absolute inset-0 z-40 cursor-crosshair select-none" className="absolute inset-0 z-40 cursor-crosshair select-none touch-none"
onMouseDown={handleOverlayMouseDown} onMouseDown={handleOverlayMouseDown}
onMouseMove={handleOverlayMouseMove} onMouseMove={handleOverlayMouseMove}
onMouseUp={handleOverlayMouseUp} onMouseUp={handleOverlayMouseUp}