diff --git a/web/src/components/settings/PolygonCanvas.tsx b/web/src/components/settings/PolygonCanvas.tsx index 1d534842d..74f228f1e 100644 --- a/web/src/components/settings/PolygonCanvas.tsx +++ b/web/src/components/settings/PolygonCanvas.tsx @@ -191,6 +191,7 @@ export function PolygonCanvas({ flattenedPoints={flattenPoints(polygon.points)} isActive={index === activePolygonIndex} isFinished={polygon.isFinished} + color={polygon.color} handlePointDragMove={handlePointDragMove} handleGroupDragEnd={handleGroupDragEnd} handleMouseOverStartPoint={handleMouseOverStartPoint} diff --git a/web/src/components/settings/PolygonControls.tsx b/web/src/components/settings/PolygonControls.tsx index 7425fe685..fe62cd343 100644 --- a/web/src/components/settings/PolygonControls.tsx +++ b/web/src/components/settings/PolygonControls.tsx @@ -53,6 +53,7 @@ export function PolygonControls({ points: [], isFinished: false, name: "new", + color: updatedPolygons[activePolygonIndex].color ?? [220, 0, 0], }; setPolygons(updatedPolygons); } @@ -65,6 +66,7 @@ export function PolygonControls({ points: [], isFinished: false, name: zoneName, + color: [220, 0, 0], }, ]); setActivePolygonIndex(polygons.length); diff --git a/web/src/components/settings/PolygonDrawer.tsx b/web/src/components/settings/PolygonDrawer.tsx index 60baf4a50..edb02bbdc 100644 --- a/web/src/components/settings/PolygonDrawer.tsx +++ b/web/src/components/settings/PolygonDrawer.tsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { useCallback, useState } from "react"; import { Line, Circle, Group } from "react-konva"; import { minMax, dragBoundFunc } from "@/utils/canvasUtil"; import type { KonvaEventObject } from "konva/lib/Node"; @@ -10,6 +10,7 @@ type PolygonDrawerProps = { flattenedPoints: number[]; isActive: boolean; isFinished: boolean; + color: number[]; handlePointDragMove: (e: KonvaEventObject) => void; handleGroupDragEnd: (e: KonvaEventObject) => void; handleMouseOverStartPoint: (e: KonvaEventObject) => void; @@ -21,6 +22,7 @@ export default function PolygonDrawer({ flattenedPoints, isActive, isFinished, + color, handlePointDragMove, handleGroupDragEnd, handleMouseOverStartPoint, @@ -66,6 +68,17 @@ export default function PolygonDrawer({ return { x, y }; }; + const colorString = useCallback( + (darkened: boolean) => { + if (color.length !== 3) { + return "rgb(220,0,0,0.5)"; + } + + return `rgb(${color[0]},${color[1]},${color[2]},${darkened ? "0.8" : "0.5"})`; + }, + [color], + ); + return ( {points.map((point, index) => { if (!isActive) { @@ -104,7 +117,7 @@ export default function PolygonDrawer({ x={x} y={y} radius={vertexRadius} - fill="#dd0000" + fill={colorString(false)} stroke="#cccccc" strokeWidth={2} draggable={isActive} diff --git a/web/src/components/settings/Zones.tsx b/web/src/components/settings/Zones.tsx index 1f9ba6ceb..955dd6032 100644 --- a/web/src/components/settings/Zones.tsx +++ b/web/src/components/settings/Zones.tsx @@ -34,8 +34,8 @@ const parseCoordinates = (coordinatesString: string) => { const points = []; for (let i = 0; i < coordinates.length; i += 2) { - const x = parseInt(coordinates[i], 10); - const y = parseInt(coordinates[i + 1], 10); + const x = parseFloat(coordinates[i]); + const y = parseFloat(coordinates[i + 1]); points.push([x, y]); } @@ -132,12 +132,13 @@ export default function SettingsZones() { name, points: interpolatePoints( parseCoordinates(zoneData.coordinates), - cameraConfig.detect.width, - cameraConfig.detect.height, + 1, + 1, scaledWidth, scaledHeight, ), isFinished: true, + color: zoneData.color, })), ); } diff --git a/web/src/types/canvas.ts b/web/src/types/canvas.ts index fe39d0225..b4fdd99ce 100644 --- a/web/src/types/canvas.ts +++ b/web/src/types/canvas.ts @@ -2,4 +2,5 @@ export type Polygon = { name: string; points: number[][]; isFinished: boolean; + color: number[]; }; diff --git a/web/src/types/frigateConfig.ts b/web/src/types/frigateConfig.ts index a6c6b3864..ce8c88bb4 100644 --- a/web/src/types/frigateConfig.ts +++ b/web/src/types/frigateConfig.ts @@ -200,6 +200,7 @@ export interface CameraConfig { filters: Record; inertia: number; objects: string[]; + color: number[]; }; }; }