feat: enhance multi-region selection feature to support both shift and cmd/ctrl

This commit is contained in:
Xiaohan-Tian
2026-05-25 13:50:28 -07:00
parent 2c84b48f63
commit 1f330818d8
16 changed files with 763 additions and 93 deletions
@@ -24,6 +24,11 @@ type ResizeEdge = 'start' | 'end' | null;
const REGION_EDGE_HITBOX_PX = 8;
const DRAG_THRESHOLD_PX = 4;
const getRegionClickOptions = (event: Pick<MouseEvent | React.MouseEvent, 'shiftKey' | 'metaKey' | 'ctrlKey'>): RegionClickOptions => ({
shiftKey: event.shiftKey,
metaKey: event.metaKey,
ctrlKey: event.ctrlKey,
});
const GlobalTempoLane: React.FC<GlobalTempoLaneProps> = ({
tempoRegions,
@@ -44,6 +49,7 @@ const GlobalTempoLane: React.FC<GlobalTempoLaneProps> = ({
const [previewBars, setPreviewBars] = useState<Record<string, { startBar: number; lengthBars: number }>>({});
const [hoverEdges, setHoverEdges] = useState<Record<string, ResizeEdge>>({});
const [isModifierPressed, setIsModifierPressed] = useState(false);
const suppressClickSelectionRef = useRef(false);
const interactionRef = useRef<{
mode: 'resize' | null;
regionId: string;
@@ -222,7 +228,8 @@ const GlobalTempoLane: React.FC<GlobalTempoLaneProps> = ({
setPreviewBars({});
if (!shouldResize) {
onSelectRegion(interaction.regionId, { shiftKey: event.shiftKey });
suppressClickSelectionRef.current = true;
onSelectRegion(interaction.regionId, getRegionClickOptions(event));
return;
}
@@ -328,12 +335,16 @@ const GlobalTempoLane: React.FC<GlobalTempoLaneProps> = ({
}}
onClick={(event) => {
event.stopPropagation();
onSelectRegion(region.getId(), { shiftKey: event.shiftKey });
if (suppressClickSelectionRef.current) {
suppressClickSelectionRef.current = false;
return;
}
onSelectRegion(region.getId(), getRegionClickOptions(event));
}}
onDoubleClick={(event) => {
event.preventDefault();
event.stopPropagation();
onSelectRegion(region.getId(), { shiftKey: false });
onSelectRegion(region.getId(), { shiftKey: false, metaKey: false, ctrlKey: false });
onBeginEdit(region.getId());
}}
>