mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	Draggable grid layout bugfixes (#11777)
* Maintain aspect ratio when overdragging * add existing x value * Better handle portrait and wide cam aspect ratios
This commit is contained in:
		
							parent
							
								
									53fa64fd14
								
							
						
					
					
						commit
						8cc170f027
					
				| @ -171,4 +171,10 @@ | ||||
| 
 | ||||
| .react-resizable-handle { | ||||
|   z-index: 30; | ||||
|   background-image: none !important; | ||||
| } | ||||
| 
 | ||||
| .react-grid-item.react-grid-placeholder { | ||||
|   border: 3px solid #a00000 !important; | ||||
|   opacity: 0.5 !important; | ||||
| } | ||||
|  | ||||
| @ -94,6 +94,7 @@ export default function DraggableGridLayout({ | ||||
|   // editing
 | ||||
| 
 | ||||
|   const [editGroup, setEditGroup] = useState(false); | ||||
|   const [showCircles, setShowCircles] = useState(true); | ||||
| 
 | ||||
|   useEffect(() => { | ||||
|     setEditGroup(false); | ||||
| @ -115,6 +116,7 @@ export default function DraggableGridLayout({ | ||||
|       } | ||||
|       // save layout to idb
 | ||||
|       setGridLayout(currentLayout); | ||||
|       setShowCircles(true); | ||||
|     }, | ||||
|     [setGridLayout, isGridLayoutLoaded, gridLayout, currentGridLayout], | ||||
|   ); | ||||
| @ -321,13 +323,37 @@ export default function DraggableGridLayout({ | ||||
|     const heightDiff = layoutItem.h - oldLayoutItem.h; | ||||
|     const widthDiff = layoutItem.w - oldLayoutItem.w; | ||||
|     const changeCoef = oldLayoutItem.w / oldLayoutItem.h; | ||||
|     if (Math.abs(heightDiff) < Math.abs(widthDiff) || layoutItem.w == 12) { | ||||
|       layoutItem.h = layoutItem.w / changeCoef; | ||||
|       placeholder.h = layoutItem.w / changeCoef; | ||||
| 
 | ||||
|     let newWidth, newHeight; | ||||
| 
 | ||||
|     if (Math.abs(heightDiff) < Math.abs(widthDiff)) { | ||||
|       newHeight = Math.round(layoutItem.w / changeCoef); | ||||
|       newWidth = Math.round(newHeight * changeCoef); | ||||
|     } else { | ||||
|       layoutItem.w = layoutItem.h * changeCoef; | ||||
|       placeholder.w = layoutItem.h * changeCoef; | ||||
|       newWidth = Math.round(layoutItem.h * changeCoef); | ||||
|       newHeight = Math.round(newWidth / changeCoef); | ||||
|     } | ||||
| 
 | ||||
|     // Ensure dimensions maintain aspect ratio and fit within the grid
 | ||||
|     if (layoutItem.x + newWidth > 12) { | ||||
|       newWidth = 12 - layoutItem.x; | ||||
|       newHeight = Math.round(newWidth / changeCoef); | ||||
|     } | ||||
| 
 | ||||
|     if (changeCoef == 0.5) { | ||||
|       // portrait
 | ||||
|       newHeight = Math.ceil(newHeight / 2) * 2; | ||||
|     } else if (changeCoef == 2) { | ||||
|       // pano/wide
 | ||||
|       newHeight = Math.ceil(newHeight * 2) / 2; | ||||
|     } | ||||
| 
 | ||||
|     newWidth = Math.round(newHeight * changeCoef); | ||||
| 
 | ||||
|     layoutItem.w = newWidth; | ||||
|     layoutItem.h = newHeight; | ||||
|     placeholder.w = layoutItem.w; | ||||
|     placeholder.h = layoutItem.h; | ||||
|   }; | ||||
| 
 | ||||
|   return ( | ||||
| @ -378,6 +404,7 @@ export default function DraggableGridLayout({ | ||||
|             resizeHandles={isEditMode ? ["sw", "nw", "se", "ne"] : []} | ||||
|             onDragStop={handleLayoutChange} | ||||
|             onResize={handleResize} | ||||
|             onResizeStart={() => setShowCircles(false)} | ||||
|             onResizeStop={handleLayoutChange} | ||||
|           > | ||||
|             {includeBirdseye && birdseyeConfig?.enabled && ( | ||||
| @ -385,13 +412,14 @@ export default function DraggableGridLayout({ | ||||
|                 key="birdseye" | ||||
|                 className={cn( | ||||
|                   isEditMode && | ||||
|                     showCircles && | ||||
|                     "outline outline-2 outline-muted-foreground hover:cursor-grab hover:outline-4 active:cursor-grabbing", | ||||
|                 )} | ||||
|                 birdseyeConfig={birdseyeConfig} | ||||
|                 liveMode={birdseyeConfig.restream ? "mse" : "jsmpeg"} | ||||
|                 onClick={() => onSelectCamera("birdseye")} | ||||
|               > | ||||
|                 {isEditMode && <CornerCircles />} | ||||
|                 {isEditMode && showCircles && <CornerCircles />} | ||||
|               </BirdseyeLivePlayerGridItem> | ||||
|             )} | ||||
|             {cameras.map((camera) => { | ||||
| @ -412,6 +440,7 @@ export default function DraggableGridLayout({ | ||||
|                     "rounded-lg bg-black md:rounded-2xl", | ||||
|                     grow, | ||||
|                     isEditMode && | ||||
|                       showCircles && | ||||
|                       "outline-2 outline-muted-foreground hover:cursor-grab hover:outline-4 active:cursor-grabbing", | ||||
|                   )} | ||||
|                   windowVisible={ | ||||
| @ -423,7 +452,7 @@ export default function DraggableGridLayout({ | ||||
|                     !isEditMode && onSelectCamera(camera.name); | ||||
|                   }} | ||||
|                 > | ||||
|                   {isEditMode && <CornerCircles />} | ||||
|                   {isEditMode && showCircles && <CornerCircles />} | ||||
|                 </LivePlayerGridItem> | ||||
|               ); | ||||
|             })} | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user