Enhance stack management by preventing duplicate stacks and optimizing stack index usage
This commit is contained in:
@@ -2459,12 +2459,23 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer
|
|||||||
const seriesGroups = await deriveSeriesGroupsFromImageIds(imageIds);
|
const seriesGroups = await deriveSeriesGroupsFromImageIds(imageIds);
|
||||||
const primarySeries = seriesGroups[0]?.imageIds || imageIds;
|
const primarySeries = seriesGroups[0]?.imageIds || imageIds;
|
||||||
|
|
||||||
// Add the incoming stack to the panel and capture its index.
|
|
||||||
let newStackIdx = 0;
|
// Check if a stack with the same imageIds already exists
|
||||||
|
let existingStackIdx = -1;
|
||||||
|
let newStackIdx = -1;
|
||||||
setAvailableStacks(prev => {
|
setAvailableStacks(prev => {
|
||||||
|
existingStackIdx = prev.findIndex(
|
||||||
|
s =>
|
||||||
|
s.imageIds.length === imageIds.length &&
|
||||||
|
s.imageIds.every((id, idx) => id === imageIds[idx])
|
||||||
|
);
|
||||||
|
if (existingStackIdx !== -1) {
|
||||||
|
return prev;
|
||||||
|
}
|
||||||
newStackIdx = prev.length;
|
newStackIdx = prev.length;
|
||||||
return [...prev, { imageIds, name, seriesGroups }];
|
return [...prev, { imageIds, name, seriesGroups }];
|
||||||
});
|
});
|
||||||
|
const stackIdxToUse = existingStackIdx !== -1 ? existingStackIdx : newStackIdx;
|
||||||
|
|
||||||
const resolvedZone = resolveDropZone(requestedZone);
|
const resolvedZone = resolveDropZone(requestedZone);
|
||||||
if (resolvedZone === 'center') {
|
if (resolvedZone === 'center') {
|
||||||
@@ -2472,7 +2483,7 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer
|
|||||||
try {
|
try {
|
||||||
setViewportModes(prev => { const n = [...prev]; n[viewportIdx] = 'stack'; return n; });
|
setViewportModes(prev => { const n = [...prev]; n[viewportIdx] = 'stack'; return n; });
|
||||||
setViewportImageIds(prev => { const n = [...prev]; n[viewportIdx] = primarySeries; return n; });
|
setViewportImageIds(prev => { const n = [...prev]; n[viewportIdx] = primarySeries; return n; });
|
||||||
setSelectedStackIdx(prev => { const n = [...prev]; n[viewportIdx] = newStackIdx; return n; });
|
setSelectedStackIdx(prev => { const n = [...prev]; n[viewportIdx] = stackIdxToUse; return n; });
|
||||||
setSeriesGroupsByViewport(prev => {
|
setSeriesGroupsByViewport(prev => {
|
||||||
const n = [...prev];
|
const n = [...prev];
|
||||||
n[viewportIdx] = seriesGroups;
|
n[viewportIdx] = seriesGroups;
|
||||||
@@ -2504,7 +2515,7 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer
|
|||||||
try {
|
try {
|
||||||
setViewportModes(prev => { const n = [...prev]; n[viewportIdx] = 'stack'; return n; });
|
setViewportModes(prev => { const n = [...prev]; n[viewportIdx] = 'stack'; return n; });
|
||||||
setViewportImageIds(prev => { const n = [...prev]; n[viewportIdx] = imageIds; return n; });
|
setViewportImageIds(prev => { const n = [...prev]; n[viewportIdx] = imageIds; return n; });
|
||||||
setSelectedStackIdx(prev => { const n = [...prev]; n[viewportIdx] = newStackIdx; return n; });
|
setSelectedStackIdx(prev => { const n = [...prev]; n[viewportIdx] = stackIdxToUse; return n; });
|
||||||
setActiveViewport(viewportIdx);
|
setActiveViewport(viewportIdx);
|
||||||
await setLoadedImageIdsAndCacheMeta(imageIds);
|
await setLoadedImageIdsAndCacheMeta(imageIds);
|
||||||
} finally {
|
} finally {
|
||||||
@@ -2518,6 +2529,7 @@ function App({ container_id, imageStacks, autoCacheStack, annotationJson, viewer
|
|||||||
const insertedViewportIndex = targetNewRow * newCols + targetNewCol;
|
const insertedViewportIndex = targetNewRow * newCols + targetNewCol;
|
||||||
|
|
||||||
const nextImageIds = Array(MAX_VIEWPORTS).fill([] as string[]);
|
const nextImageIds = Array(MAX_VIEWPORTS).fill([] as string[]);
|
||||||
|
// If you use newStackIdx below, ensure it is only used if a new stack was added
|
||||||
const nextModes = Array(MAX_VIEWPORTS).fill('stack') as Array<'stack' | 'volume'>;
|
const nextModes = Array(MAX_VIEWPORTS).fill('stack') as Array<'stack' | 'volume'>;
|
||||||
const nextSelected = Array(MAX_VIEWPORTS).fill(0);
|
const nextSelected = Array(MAX_VIEWPORTS).fill(0);
|
||||||
const nextSeriesGroups = Array(MAX_VIEWPORTS).fill(null).map(() => [] as StackSeriesGroup[]);
|
const nextSeriesGroups = Array(MAX_VIEWPORTS).fill(null).map(() => [] as StackSeriesGroup[]);
|
||||||
|
|||||||
Reference in New Issue
Block a user