mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-04-05 14:47:40 +03:00
feat: persist camera zoom per camera group
Each camera now stores zoom state under a group-scoped key (live:grid-card:zoom:<group>:<camera>), so different groups can have independent zoom levels for the same camera. https://claude.ai/code/session_01WidMYGkyBCFf4L9PnFEiZ5
This commit is contained in:
parent
a92a95dea4
commit
3f39819fbe
@ -201,14 +201,23 @@ export function getNextScaleFromWheelDelta(
|
||||
return clampScale(currentScale + direction * step, minScale, maxScale);
|
||||
}
|
||||
|
||||
export function getCameraZoomStorageKey(cameraName: string): string {
|
||||
export function getCameraZoomStorageKey(
|
||||
cameraName: string,
|
||||
cameraGroup?: string,
|
||||
): string {
|
||||
if (cameraGroup) {
|
||||
return `live:grid-card:zoom:${cameraGroup}:${cameraName}`;
|
||||
}
|
||||
return `live:grid-card:zoom:${cameraName}`;
|
||||
}
|
||||
|
||||
export function loadPersistedCameraZoomState(
|
||||
cameraName: string,
|
||||
cameraGroup?: string,
|
||||
): CameraZoomPersistedState | undefined {
|
||||
const serialized = localStorage.getItem(getCameraZoomStorageKey(cameraName));
|
||||
const serialized = localStorage.getItem(
|
||||
getCameraZoomStorageKey(cameraName, cameraGroup),
|
||||
);
|
||||
|
||||
if (!serialized) {
|
||||
return undefined;
|
||||
@ -225,9 +234,10 @@ export function loadPersistedCameraZoomState(
|
||||
export function savePersistedCameraZoomState(
|
||||
cameraName: string,
|
||||
state: CameraZoomPersistedState,
|
||||
cameraGroup?: string,
|
||||
): void {
|
||||
localStorage.setItem(
|
||||
getCameraZoomStorageKey(cameraName),
|
||||
getCameraZoomStorageKey(cameraName, cameraGroup),
|
||||
JSON.stringify(state),
|
||||
);
|
||||
}
|
||||
|
||||
@ -661,7 +661,7 @@ export default function DraggableGridLayout({
|
||||
return prev;
|
||||
}
|
||||
|
||||
const persisted = loadPersistedCameraZoomState(cameraName);
|
||||
const persisted = loadPersistedCameraZoomState(cameraName, cameraGroup);
|
||||
if (!persisted) {
|
||||
return prev;
|
||||
}
|
||||
@ -677,7 +677,7 @@ export default function DraggableGridLayout({
|
||||
};
|
||||
});
|
||||
},
|
||||
[getCardZoomDimensions],
|
||||
[cameraGroup, getCardZoomDimensions],
|
||||
);
|
||||
|
||||
const getDefaultZoomTransform = useCallback(
|
||||
@ -724,7 +724,7 @@ export default function DraggableGridLayout({
|
||||
contentHeight: content?.clientHeight ?? bounds.height,
|
||||
});
|
||||
|
||||
savePersistedCameraZoomState(cameraName, persisted);
|
||||
savePersistedCameraZoomState(cameraName, persisted, cameraGroup);
|
||||
|
||||
return {
|
||||
...prev,
|
||||
@ -732,7 +732,7 @@ export default function DraggableGridLayout({
|
||||
};
|
||||
});
|
||||
},
|
||||
[getDefaultZoomTransform],
|
||||
[cameraGroup, getDefaultZoomTransform],
|
||||
);
|
||||
|
||||
const detachCardZoomWheelListener = useCallback((cameraName: string) => {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user