Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions src/layer/segmentation/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1255,6 +1255,9 @@ export class SegmentationUserLayer extends Base {
readonly selectedSpatialSkeletonNodeId = new WatchableValue<
number | undefined
>(undefined);
readonly hoveredSpatialSkeletonNodeId = new WatchableValue<
number | undefined
>(undefined);
readonly spatialSkeletonVisibleChunksNeeded = new WatchableValue(0);
readonly spatialSkeletonVisibleChunksAvailable = new WatchableValue(0);
readonly spatialSkeletonVisibleChunksLoaded = new WatchableValue(false);
Expand Down Expand Up @@ -1493,6 +1496,20 @@ export class SegmentationUserLayer extends Base {
}, pin);
};

captureSelectionState(
state: this["selectionState"],
mouseState: MouseSelectionState,
) {
super.captureSelectionState(state, mouseState);
const nodeId = getSpatialSkeletonNodeIdFromViewerHover(mouseState, this);
if (nodeId === undefined) return;
state.spatialSkeletonNodeId = String(nodeId);
const segmentId = mouseState.pickedSpatialSkeletonSegmentId;
if (segmentId !== undefined && Number.isSafeInteger(segmentId) && segmentId > 0) {
state.spatialSkeletonSegmentId = String(segmentId);
}
}

filterBySegmentLabel = (id: bigint) => {
const augmented = augmentSegmentId(this.displayState, id);
const { label } = augmented;
Expand Down Expand Up @@ -1569,6 +1586,18 @@ export class SegmentationUserLayer extends Base {
),
);
syncSelectedSpatialSkeletonNodeIdFromGlobalSelection();
const syncHoveredSpatialSkeletonNodeId = () => {
this.hoveredSpatialSkeletonNodeId.value =
getSpatialSkeletonNodeIdFromViewerHover(
this.manager.layerSelectedValues.mouseState,
this,
);
};
this.registerDisposer(
this.manager.layerSelectedValues.changed.add(
syncHoveredSpatialSkeletonNodeId,
),
);
this.displayState.selectedAlpha.changed.add(
this.specificationChanged.dispatch,
);
Expand Down
28 changes: 28 additions & 0 deletions src/skeleton/frontend.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2865,6 +2865,16 @@ export class SpatiallyIndexedSkeletonLayer
);
}

resolveNodePickFromChunk(
chunk: SpatiallyIndexedSkeletonChunk,
pickedOffset: number,
): number | undefined {
for (const [nodeId, vertexIndex] of chunk.nodeMap) {
if (vertexIndex === pickedOffset) return nodeId;
}
return undefined;
}

updateVisibleChunksForView(
view: SpatiallyIndexedSkeletonView,
transformedSources: readonly TransformedSource[][],
Expand Down Expand Up @@ -3560,6 +3570,15 @@ export class PerspectiveViewSpatiallyIndexedSkeletonLayer extends PerspectiveVie
if (segmentId !== undefined) {
mouseState.pickedSpatialSkeletonSegmentId = segmentId;
}
if (pickData.kind === "segment-node") {
const nodeId = this.base.resolveNodePickFromChunk(
pickData.chunk,
pickedOffset,
);
if (nodeId !== undefined) {
mouseState.pickedSpatialSkeletonNodeId = nodeId;
}
}
}
}

Expand Down Expand Up @@ -3865,6 +3884,15 @@ export class SliceViewPanelSpatiallyIndexedSkeletonLayer extends SliceViewPanelR
if (segmentId !== undefined) {
mouseState.pickedSpatialSkeletonSegmentId = segmentId;
}
if (pickData.kind === "segment-node") {
const nodeId = this.base.resolveNodePickFromChunk(
pickData.chunk,
pickedOffset,
);
if (nodeId !== undefined) {
mouseState.pickedSpatialSkeletonNodeId = nodeId;
}
}
}
}

Expand Down
6 changes: 2 additions & 4 deletions src/ui/spatial_skeleton_edit_tab.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ import svg_retweet from "ikonate/icons/retweet.svg?raw";
import svg_share_android from "ikonate/icons/share-android.svg?raw";
import svg_undo from "ikonate/icons/undo.svg?raw";
import type { SegmentationUserLayer } from "#src/layer/segmentation/index.js";
import { getSpatialSkeletonNodeIdFromViewerHover } from "#src/layer/segmentation/selection.js";
import {
executeSpatialSkeletonDeleteNode,
executeSpatialSkeletonNodeTrueEndUpdate,
Expand Down Expand Up @@ -316,7 +315,6 @@ export class SpatialSkeletonEditTab extends Tab {
const renderedRowsByNodeId = new Map<number, HTMLDivElement>();
const renderedEntriesByNodeId = new Map<number, HTMLDivElement>();
const skeletonState = layer.spatialSkeletonState;
const mouseState = layer.manager.root.layerSelectedValues.mouseState;
const navigationGraphCache = new Map<
number,
{
Expand Down Expand Up @@ -528,7 +526,7 @@ export class SpatialSkeletonEditTab extends Tab {
layer.getSpatialSkeletonNodeDisplayDescription(node);

const getHoveredNodeIdFromViewer = () => {
return getSpatialSkeletonNodeIdFromViewerHover(mouseState, layer);
return layer.hoveredSpatialSkeletonNodeId.value;
};

const applyRowInteractionState = (
Expand Down Expand Up @@ -1742,7 +1740,7 @@ export class SpatialSkeletonEditTab extends Tab {
}),
);
this.registerDisposer(
mouseState.changed.add(() => {
layer.hoveredSpatialSkeletonNodeId.changed.add(() => {
updateHoveredViewerNode();
}),
);
Expand Down