mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-18 00:54:27 +03:00
use virtual segments in motion review timeline
This commit is contained in:
parent
dd37958d40
commit
e4dbfdae9f
@ -1,9 +1,12 @@
|
|||||||
import { useCallback, useMemo, useRef, RefObject } from "react";
|
import React, { useCallback, useMemo, useRef, RefObject } from "react";
|
||||||
import MotionSegment from "./MotionSegment";
|
|
||||||
import { useTimelineUtils } from "@/hooks/use-timeline-utils";
|
import { useTimelineUtils } from "@/hooks/use-timeline-utils";
|
||||||
import { MotionData, ReviewSegment, ReviewSeverity } from "@/types/review";
|
import { MotionData, ReviewSegment } from "@/types/review";
|
||||||
import ReviewTimeline from "./ReviewTimeline";
|
import ReviewTimeline from "./ReviewTimeline";
|
||||||
import { useMotionSegmentUtils } from "@/hooks/use-motion-segment-utils";
|
import { useMotionSegmentUtils } from "@/hooks/use-motion-segment-utils";
|
||||||
|
import {
|
||||||
|
VirtualizedMotionSegments,
|
||||||
|
VirtualizedMotionSegmentsRef,
|
||||||
|
} from "./VirtualizedMotionSegments";
|
||||||
|
|
||||||
export type MotionReviewTimelineProps = {
|
export type MotionReviewTimelineProps = {
|
||||||
segmentDuration: number;
|
segmentDuration: number;
|
||||||
@ -25,7 +28,6 @@ export type MotionReviewTimelineProps = {
|
|||||||
setExportEndTime?: React.Dispatch<React.SetStateAction<number>>;
|
setExportEndTime?: React.Dispatch<React.SetStateAction<number>>;
|
||||||
events: ReviewSegment[];
|
events: ReviewSegment[];
|
||||||
motion_events: MotionData[];
|
motion_events: MotionData[];
|
||||||
severityType: ReviewSeverity;
|
|
||||||
contentRef: RefObject<HTMLDivElement>;
|
contentRef: RefObject<HTMLDivElement>;
|
||||||
timelineRef?: RefObject<HTMLDivElement>;
|
timelineRef?: RefObject<HTMLDivElement>;
|
||||||
onHandlebarDraggingChange?: (isDragging: boolean) => void;
|
onHandlebarDraggingChange?: (isDragging: boolean) => void;
|
||||||
@ -59,6 +61,7 @@ export function MotionReviewTimeline({
|
|||||||
}: MotionReviewTimelineProps) {
|
}: MotionReviewTimelineProps) {
|
||||||
const internalTimelineRef = useRef<HTMLDivElement>(null);
|
const internalTimelineRef = useRef<HTMLDivElement>(null);
|
||||||
const selectedTimelineRef = timelineRef || internalTimelineRef;
|
const selectedTimelineRef = timelineRef || internalTimelineRef;
|
||||||
|
const virtualizedSegmentsRef = useRef<VirtualizedMotionSegmentsRef>(null);
|
||||||
|
|
||||||
const timelineDuration = useMemo(
|
const timelineDuration = useMemo(
|
||||||
() => timelineStart - timelineEnd + 4 * segmentDuration,
|
() => timelineStart - timelineEnd + 4 * segmentDuration,
|
||||||
@ -80,8 +83,8 @@ export function MotionReviewTimeline({
|
|||||||
motion_events,
|
motion_events,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Generate segments for the timeline
|
// Generate segment times for the timeline
|
||||||
const generateSegments = useCallback(() => {
|
const segmentTimes = useMemo(() => {
|
||||||
const segments = [];
|
const segments = [];
|
||||||
let segmentTime = timelineStartAligned;
|
let segmentTime = timelineStartAligned;
|
||||||
|
|
||||||
@ -111,23 +114,7 @@ export function MotionReviewTimeline({
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
segments.push(
|
segments.push(segmentTime);
|
||||||
<MotionSegment
|
|
||||||
key={segmentTime}
|
|
||||||
events={events}
|
|
||||||
firstHalfMotionValue={firstHalfMotionValue}
|
|
||||||
secondHalfMotionValue={secondHalfMotionValue}
|
|
||||||
segmentDuration={segmentDuration}
|
|
||||||
segmentTime={segmentTime}
|
|
||||||
timestampSpread={timestampSpread}
|
|
||||||
motionOnly={motionOnly}
|
|
||||||
showMinimap={showMinimap}
|
|
||||||
minimapStartTime={minimapStartTime}
|
|
||||||
minimapEndTime={minimapEndTime}
|
|
||||||
setHandlebarTime={setHandlebarTime}
|
|
||||||
dense={dense}
|
|
||||||
/>,
|
|
||||||
);
|
|
||||||
segmentTime -= segmentDuration;
|
segmentTime -= segmentDuration;
|
||||||
}
|
}
|
||||||
return segments;
|
return segments;
|
||||||
@ -135,33 +122,21 @@ export function MotionReviewTimeline({
|
|||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [
|
}, [
|
||||||
segmentDuration,
|
segmentDuration,
|
||||||
timestampSpread,
|
|
||||||
timelineStartAligned,
|
timelineStartAligned,
|
||||||
timelineDuration,
|
timelineDuration,
|
||||||
showMinimap,
|
|
||||||
minimapStartTime,
|
|
||||||
minimapEndTime,
|
|
||||||
events,
|
events,
|
||||||
|
getMotionSegmentValue,
|
||||||
motion_events,
|
motion_events,
|
||||||
motionOnly,
|
motionOnly,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const segments = useMemo(
|
const scrollToSegment = useCallback(
|
||||||
() => generateSegments(),
|
(segmentTime: number, ifNeeded?: boolean) => {
|
||||||
// we know that these deps are correct
|
if (virtualizedSegmentsRef.current) {
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
virtualizedSegmentsRef.current.scrollToSegment(segmentTime, ifNeeded);
|
||||||
[
|
}
|
||||||
segmentDuration,
|
},
|
||||||
timestampSpread,
|
[],
|
||||||
timelineStartAligned,
|
|
||||||
timelineDuration,
|
|
||||||
showMinimap,
|
|
||||||
minimapStartTime,
|
|
||||||
minimapEndTime,
|
|
||||||
events,
|
|
||||||
motion_events,
|
|
||||||
motionOnly,
|
|
||||||
],
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -183,8 +158,26 @@ export function MotionReviewTimeline({
|
|||||||
setExportEndTime={setExportEndTime}
|
setExportEndTime={setExportEndTime}
|
||||||
timelineCollapsed={motionOnly}
|
timelineCollapsed={motionOnly}
|
||||||
dense={dense}
|
dense={dense}
|
||||||
|
segments={segmentTimes}
|
||||||
|
scrollToSegment={scrollToSegment}
|
||||||
>
|
>
|
||||||
{segments}
|
<VirtualizedMotionSegments
|
||||||
|
ref={virtualizedSegmentsRef}
|
||||||
|
timelineRef={selectedTimelineRef}
|
||||||
|
segments={segmentTimes}
|
||||||
|
events={events}
|
||||||
|
motion_events={motion_events}
|
||||||
|
segmentDuration={segmentDuration}
|
||||||
|
timestampSpread={timestampSpread}
|
||||||
|
showMinimap={showMinimap}
|
||||||
|
minimapStartTime={minimapStartTime}
|
||||||
|
minimapEndTime={minimapEndTime}
|
||||||
|
contentRef={contentRef}
|
||||||
|
setHandlebarTime={setHandlebarTime}
|
||||||
|
dense={dense}
|
||||||
|
motionOnly={motionOnly}
|
||||||
|
getMotionSegmentValue={getMotionSegmentValue}
|
||||||
|
/>
|
||||||
</ReviewTimeline>
|
</ReviewTimeline>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user