From dfab850b6158afc94ad254e019bafcd3062ba08b Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Thu, 7 Mar 2024 22:02:29 -0600 Subject: [PATCH] Better segment clicking (#10321) * better segment clicking on motion segments * move handlebar on click when handlebar is showing * only scroll handlebar if needed --- .../timeline/EventReviewTimeline.tsx | 1 + web/src/components/timeline/EventSegment.tsx | 6 +++ web/src/components/timeline/MotionSegment.tsx | 38 +++++++++++-------- web/src/hooks/use-handle-dragging.ts | 1 + web/src/hooks/use-motion-segment-utils.ts | 2 +- web/src/pages/UIPlayground.tsx | 4 +- 6 files changed, 34 insertions(+), 18 deletions(-) diff --git a/web/src/components/timeline/EventReviewTimeline.tsx b/web/src/components/timeline/EventReviewTimeline.tsx index 88cf515c1..6b23ac610 100644 --- a/web/src/components/timeline/EventReviewTimeline.tsx +++ b/web/src/components/timeline/EventReviewTimeline.tsx @@ -97,6 +97,7 @@ export function EventReviewTimeline({ minimapEndTime={minimapEndTime} severityType={severityType} contentRef={contentRef} + setHandlebarTime={setHandlebarTime} /> ); }); diff --git a/web/src/components/timeline/EventSegment.tsx b/web/src/components/timeline/EventSegment.tsx index c91e3cc11..ed86ee66c 100644 --- a/web/src/components/timeline/EventSegment.tsx +++ b/web/src/components/timeline/EventSegment.tsx @@ -29,6 +29,7 @@ type EventSegmentProps = { minimapEndTime?: number; severityType: ReviewSeverity; contentRef: RefObject; + setHandlebarTime?: React.Dispatch>; }; export function EventSegment({ @@ -41,6 +42,7 @@ export function EventSegment({ minimapEndTime, severityType, contentRef, + setHandlebarTime, }: EventSegmentProps) { const { getSeverity, @@ -192,6 +194,10 @@ export function EventSegment({ element.classList.add("outline-0", "shadow-none"); }, 3000); } + + if (setHandlebarTime) { + setHandlebarTime(startTimestamp); + } } // we know that these deps are correct // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/web/src/components/timeline/MotionSegment.tsx b/web/src/components/timeline/MotionSegment.tsx index 2c7138967..2efdd73d0 100644 --- a/web/src/components/timeline/MotionSegment.tsx +++ b/web/src/components/timeline/MotionSegment.tsx @@ -82,6 +82,19 @@ export function MotionSegment({ return isMobile ? 30 : 50; }, []); + const segmentWidth = useMemo(() => { + return interpolateMotionAudioData( + getMotionSegmentValue(segmentTime + segmentDuration / 2), + maxSegmentWidth, + ); + }, [ + segmentTime, + segmentDuration, + maxSegmentWidth, + getMotionSegmentValue, + interpolateMotionAudioData, + ]); + const alignedMinimapStartTime = useMemo( () => alignStartDateToTimeline(minimapStartTime ?? 0), [minimapStartTime, alignStartDateToTimeline], @@ -154,13 +167,18 @@ export function MotionSegment({ }; const segmentClick = useCallback(() => { - if (startTimestamp && setHandlebarTime) { + if (startTimestamp && setHandlebarTime && segmentWidth > 1) { setHandlebarTime(startTimestamp); } - }, [startTimestamp, setHandlebarTime]); + }, [startTimestamp, setHandlebarTime, segmentWidth]); return ( -
+
handleTouchStart(event, segmentClick)} + > handleTouchStart(event, segmentClick)} style={{ - width: interpolateMotionAudioData( - getMotionSegmentValue(segmentTime + segmentDuration / 2), - maxSegmentWidth, - ), + width: segmentWidth, }} >
@@ -202,13 +215,8 @@ export function MotionSegment({
handleTouchStart(event, segmentClick)} style={{ - width: interpolateMotionAudioData( - getMotionSegmentValue(segmentTime), - maxSegmentWidth, - ), + width: segmentWidth, }} >
diff --git a/web/src/hooks/use-handle-dragging.ts b/web/src/hooks/use-handle-dragging.ts index 5d813528e..c6556189e 100644 --- a/web/src/hooks/use-handle-dragging.ts +++ b/web/src/hooks/use-handle-dragging.ts @@ -130,6 +130,7 @@ function useDraggableHandler({ scrollIntoView(thumb, { block: "center", behavior: "smooth", + scrollMode: "if-needed", }); } } diff --git a/web/src/hooks/use-motion-segment-utils.ts b/web/src/hooks/use-motion-segment-utils.ts index 514f91c0c..4cf0c15e1 100644 --- a/web/src/hooks/use-motion-segment-utils.ts +++ b/web/src/hooks/use-motion-segment-utils.ts @@ -43,7 +43,7 @@ export const useMotionSegmentUtils = ( const matchingEvent = motion_events.find((event) => { return ( time >= getSegmentStart(event.start_time) && - time < getSegmentEnd(event.start_time) + time <= getSegmentEnd(event.start_time) ); }); diff --git a/web/src/pages/UIPlayground.tsx b/web/src/pages/UIPlayground.tsx index bbfe211b9..40ddb5d2a 100644 --- a/web/src/pages/UIPlayground.tsx +++ b/web/src/pages/UIPlayground.tsx @@ -124,7 +124,7 @@ function UIPlayground() { const [mockEvents, setMockEvents] = useState([]); const [mockMotionData, setMockMotionData] = useState([]); const [handlebarTime, setHandlebarTime] = useState( - Math.floor(Date.now() / 1000) - 15 * 60, + Math.round((Date.now() / 1000 - 15 * 60) / 60) * 60, ); useMemo(() => { @@ -285,7 +285,7 @@ function UIPlayground() {