mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	improve timeline scrolling with dynamic speed (#10677)
This commit is contained in:
		
							parent
							
								
									30d93e1d90
								
							
						
					
					
						commit
						bc6b4c38b8
					
				| @ -42,6 +42,7 @@ function useDraggableElement({ | ||||
| }: DraggableElementProps) { | ||||
|   const [clientYPosition, setClientYPosition] = useState<number | null>(null); | ||||
|   const [initialClickAdjustment, setInitialClickAdjustment] = useState(0); | ||||
|   const [scrollEdgeSize, setScrollEdgeSize] = useState<number>(); | ||||
|   const [segments, setSegments] = useState<HTMLDivElement[]>([]); | ||||
|   const { alignStartDateToTimeline, getCumulativeScrollTop } = useTimelineUtils( | ||||
|     { | ||||
| @ -52,23 +53,24 @@ function useDraggableElement({ | ||||
|   ); | ||||
| 
 | ||||
|   const draggingAtTopEdge = useMemo(() => { | ||||
|     if (clientYPosition && timelineRef.current) { | ||||
|     if (clientYPosition && timelineRef.current && scrollEdgeSize) { | ||||
|       return ( | ||||
|         clientYPosition - timelineRef.current.offsetTop < | ||||
|           timelineRef.current.clientHeight * 0.03 && isDragging | ||||
|         clientYPosition - timelineRef.current.offsetTop < scrollEdgeSize && | ||||
|         isDragging | ||||
|       ); | ||||
|     } | ||||
|   }, [clientYPosition, timelineRef, isDragging]); | ||||
|   }, [clientYPosition, timelineRef, isDragging, scrollEdgeSize]); | ||||
| 
 | ||||
|   const draggingAtBottomEdge = useMemo(() => { | ||||
|     if (clientYPosition && timelineRef.current) { | ||||
|     if (clientYPosition && timelineRef.current && scrollEdgeSize) { | ||||
|       return ( | ||||
|         clientYPosition > | ||||
|           (timelineRef.current.clientHeight + timelineRef.current.offsetTop) * | ||||
|             0.97 && isDragging | ||||
|           timelineRef.current.clientHeight + | ||||
|             timelineRef.current.offsetTop - | ||||
|             scrollEdgeSize && isDragging | ||||
|       ); | ||||
|     } | ||||
|   }, [clientYPosition, timelineRef, isDragging]); | ||||
|   }, [clientYPosition, timelineRef, isDragging, scrollEdgeSize]); | ||||
| 
 | ||||
|   const getClientYPosition = useCallback( | ||||
|     (e: MouseEvent | TouchEvent) => { | ||||
| @ -290,17 +292,26 @@ function useDraggableElement({ | ||||
|           } | ||||
|         }); | ||||
| 
 | ||||
|         if (draggingAtTopEdge || draggingAtBottomEdge) { | ||||
|           let newPosition = clientYPosition; | ||||
| 
 | ||||
|         if ((draggingAtTopEdge || draggingAtBottomEdge) && scrollEdgeSize) { | ||||
|           if (draggingAtTopEdge) { | ||||
|             newPosition = scrolled - segmentHeight; | ||||
|             timelineRef.current.scrollTop = newPosition; | ||||
|             const intensity = Math.max( | ||||
|               0, | ||||
|               (scrollEdgeSize - (clientYPosition - timelineTopAbsolute)) / | ||||
|                 scrollEdgeSize, | ||||
|             ); | ||||
|             timelineRef.current.scrollTop -= segmentHeight * intensity; | ||||
|           } | ||||
| 
 | ||||
|           if (draggingAtBottomEdge) { | ||||
|             newPosition = scrolled + segmentHeight; | ||||
|             timelineRef.current.scrollTop = newPosition; | ||||
|             const intensity = Math.max( | ||||
|               0, | ||||
|               (clientYPosition - | ||||
|                 timelineTopAbsolute - | ||||
|                 (timelineRef.current.getBoundingClientRect().height - | ||||
|                   scrollEdgeSize)) / | ||||
|                 scrollEdgeSize, | ||||
|             ); | ||||
|             timelineRef.current.scrollTop += segmentHeight * intensity; | ||||
|           } | ||||
|         } | ||||
| 
 | ||||
| @ -436,6 +447,12 @@ function useDraggableElement({ | ||||
|     // eslint-disable-next-line react-hooks/exhaustive-deps
 | ||||
|   }, [timelineCollapsed]); | ||||
| 
 | ||||
|   useEffect(() => { | ||||
|     if (timelineRef.current) { | ||||
|       setScrollEdgeSize(timelineRef.current.clientHeight * 0.03); | ||||
|     } | ||||
|   }, [timelineRef]); | ||||
| 
 | ||||
|   return { handleMouseDown, handleMouseUp, handleMouseMove }; | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user