fix: restore main content global track updates after refactor

This commit is contained in:
Xiaohan-Tian
2026-05-25 15:41:00 -07:00
parent 3f96b13d8a
commit 742b2fecf3
3 changed files with 38 additions and 49 deletions
+13 -9
View File
@@ -122,6 +122,9 @@ const MainContent: React.FC<MainContentProps> = ({
editingRegionIds: mainContentGlobalTracks.editingRegionIds, editingRegionIds: mainContentGlobalTracks.editingRegionIds,
findProjectRegionById: mainContentRegions.selection.findProjectRegionById, findProjectRegionById: mainContentRegions.selection.findProjectRegionById,
}); });
const deleteSelectedRegularRegions = mainContentRegions.deleteSelectedRegions;
const deleteSelectedGlobalRegions = mainContentGlobalTracks.deleteSelectedGlobalRegions;
const isGlobalRegionId = mainContentRegions.selection.isGlobalRegionId;
const deleteSelectedTrackAutomationPoints = useCallback((): boolean => { const deleteSelectedTrackAutomationPoints = useCallback((): boolean => {
if (!activeTrackAutomationTrackId || !activeTrackAutomationType || selectedTrackAutomationPointIds.length === 0) { if (!activeTrackAutomationTrackId || !activeTrackAutomationType || selectedTrackAutomationPointIds.length === 0) {
@@ -159,22 +162,22 @@ const MainContent: React.FC<MainContentProps> = ({
useEffect(() => { useEffect(() => {
regionDeleteManager.registerDeleteCallback(() => { regionDeleteManager.registerDeleteCallback(() => {
if (mainContentGlobalTracks.deleteSelectedGlobalRegions()) { if (deleteSelectedGlobalRegions()) {
return true; return true;
} }
if (deleteSelectedTrackAutomationPoints()) { if (deleteSelectedTrackAutomationPoints()) {
return true; return true;
} }
return mainContentRegions.deleteSelectedRegions(); return deleteSelectedRegularRegions();
}); });
return () => { return () => {
regionDeleteManager.unregisterDeleteCallback(); regionDeleteManager.unregisterDeleteCallback();
}; };
}, [ }, [
deleteSelectedGlobalRegions,
deleteSelectedRegularRegions,
deleteSelectedTrackAutomationPoints, deleteSelectedTrackAutomationPoints,
mainContentGlobalTracks,
mainContentRegions,
]); ]);
useEffect(() => { useEffect(() => {
@@ -192,12 +195,12 @@ const MainContent: React.FC<MainContentProps> = ({
if (event.key === 'Backspace' || event.key === 'Delete') { if (event.key === 'Backspace' || event.key === 'Delete') {
const isInPianoRoll = document.querySelector('.piano-roll')?.contains(event.target as Node); const isInPianoRoll = document.querySelector('.piano-roll')?.contains(event.target as Node);
const hasSelectedGlobalRegions = selectedRegionIds.some(mainContentRegions.selection.isGlobalRegionId); const hasSelectedGlobalRegions = selectedRegionIds.some(isGlobalRegionId);
if (!isInPianoRoll && (!showPianoRoll || hasSelectedGlobalRegions)) { if (!isInPianoRoll && (!showPianoRoll || hasSelectedGlobalRegions)) {
const deleted = mainContentGlobalTracks.deleteSelectedGlobalRegions() const deleted = deleteSelectedGlobalRegions()
|| deleteSelectedTrackAutomationPoints() || deleteSelectedTrackAutomationPoints()
|| mainContentRegions.deleteSelectedRegions(); || deleteSelectedRegularRegions();
if (deleted) { if (deleted) {
event.preventDefault(); event.preventDefault();
} }
@@ -208,9 +211,10 @@ const MainContent: React.FC<MainContentProps> = ({
window.addEventListener('keydown', handleKeyDown); window.addEventListener('keydown', handleKeyDown);
return () => window.removeEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown);
}, [ }, [
deleteSelectedGlobalRegions,
deleteSelectedRegularRegions,
deleteSelectedTrackAutomationPoints, deleteSelectedTrackAutomationPoints,
mainContentGlobalTracks, isGlobalRegionId,
mainContentRegions,
selectedRegionIds, selectedRegionIds,
showPianoRoll, showPianoRoll,
]); ]);
+10 -4
View File
@@ -9,6 +9,7 @@ import type { RegionClickOptions, RegionPreviewContentStyle, RegionUI, ResizeAct
import { REGION_CONSTANTS, DEBUG_MODE } from '../../constants'; import { REGION_CONSTANTS, DEBUG_MODE } from '../../constants';
import { KGMainContentState } from '../../core/state/KGMainContentState'; import { KGMainContentState } from '../../core/state/KGMainContentState';
import { useProjectStore } from '../../stores/projectStore'; import { useProjectStore } from '../../stores/projectStore';
import { isModifierKeyPressed } from '../../util/osUtil';
interface RegionResizePreviewBaseline { interface RegionResizePreviewBaseline {
regionId: string; regionId: string;
@@ -201,21 +202,26 @@ const TrackGridItem: React.FC<TrackGridItemProps> = ({
// Track tool state for cursor feedback. // Track tool state for cursor feedback.
useEffect(() => { useEffect(() => {
const syncCursorState = () => { const syncCursorState = (event?: KeyboardEvent | MouseEvent) => {
const isPencilMode = KGMainContentState.instance().getActiveTool() === 'pencil';
const hasModifierPressed = event ? isModifierKeyPressed(event) : false;
setIsModifierPressed(isPencilMode || hasModifierPressed);
};
const syncCursorStateFromFocus = () => {
setIsModifierPressed(KGMainContentState.instance().getActiveTool() === 'pencil'); setIsModifierPressed(KGMainContentState.instance().getActiveTool() === 'pencil');
}; };
// Add global event listeners // Add global event listeners
window.addEventListener('keydown', syncCursorState); window.addEventListener('keydown', syncCursorState);
window.addEventListener('keyup', syncCursorState); window.addEventListener('keyup', syncCursorState);
window.addEventListener('focus', syncCursorState); window.addEventListener('focus', syncCursorStateFromFocus);
syncCursorState(); syncCursorStateFromFocus();
// Cleanup listeners on unmount // Cleanup listeners on unmount
return () => { return () => {
window.removeEventListener('keydown', syncCursorState); window.removeEventListener('keydown', syncCursorState);
window.removeEventListener('keyup', syncCursorState); window.removeEventListener('keyup', syncCursorState);
window.removeEventListener('focus', syncCursorState); window.removeEventListener('focus', syncCursorStateFromFocus);
}; };
}, []); }, []);
+15 -36
View File
@@ -1,4 +1,4 @@
import { useCallback, useMemo, useState } from 'react'; import { useCallback, useState } from 'react';
import type { KeySignature } from '../core/KGProject'; import type { KeySignature } from '../core/KGProject';
import { KGCore } from '../core/KGCore'; import { KGCore } from '../core/KGCore';
import { GlobalTrackType, KGGlobalTrack } from '../core/global-track'; import { GlobalTrackType, KGGlobalTrack } from '../core/global-track';
@@ -88,37 +88,21 @@ export function useMainContentGlobalTracks({
const [editingTempoText, setEditingTempoText] = useState(''); const [editingTempoText, setEditingTempoText] = useState('');
const [editingChordRegionId, setEditingChordRegionId] = useState<string | null>(null); const [editingChordRegionId, setEditingChordRegionId] = useState<string | null>(null);
const markerTrack = useMemo( const markerTrack = globalTracks.find(track => track.getType() === GlobalTrackType.Marker) ?? null;
() => globalTracks.find(track => track.getType() === GlobalTrackType.Marker) ?? null, const markerRegions = (markerTrack?.getRegions() ?? []).filter(
[globalTracks] (region): region is KGMarkerRegion => region instanceof KGMarkerRegion
); );
const markerRegions = useMemo( const signatureTrack = globalTracks.find(track => track.getType() === GlobalTrackType.Signature) ?? null;
() => (markerTrack?.getRegions() ?? []).filter((region): region is KGMarkerRegion => region instanceof KGMarkerRegion), const signatureRegions = signatureTrack
[markerTrack] ? getSortedKeySignatureRegions(signatureTrack, timeSignature.numerator)
); : [];
const signatureTrack = useMemo( const tempoTrack = globalTracks.find(track => track.getType() === GlobalTrackType.Tempo) ?? null;
() => globalTracks.find(track => track.getType() === GlobalTrackType.Signature) ?? null, const tempoRegions = tempoTrack
[globalTracks] ? getSortedTempoRegions(tempoTrack, timeSignature.numerator)
); : [];
const signatureRegions = useMemo( const chordTrack = globalTracks.find(track => track.getType() === GlobalTrackType.Chord) ?? null;
() => (signatureTrack ? getSortedKeySignatureRegions(signatureTrack, timeSignature.numerator) : []), const chordRegions = (chordTrack?.getRegions() ?? []).filter(
[signatureTrack, timeSignature.numerator] (region): region is KGChordRegion => region instanceof KGChordRegion
);
const tempoTrack = useMemo(
() => globalTracks.find(track => track.getType() === GlobalTrackType.Tempo) ?? null,
[globalTracks]
);
const tempoRegions = useMemo(
() => (tempoTrack ? getSortedTempoRegions(tempoTrack, timeSignature.numerator) : []),
[tempoTrack, timeSignature.numerator]
);
const chordTrack = useMemo(
() => globalTracks.find(track => track.getType() === GlobalTrackType.Chord) ?? null,
[globalTracks]
);
const chordRegions = useMemo(
() => (chordTrack?.getRegions() ?? []).filter((region): region is KGChordRegion => region instanceof KGChordRegion),
[chordTrack]
); );
const beginEditingGlobalRegion = useCallback((regionId: string) => { const beginEditingGlobalRegion = useCallback((regionId: string) => {
@@ -202,7 +186,6 @@ export function useMainContentGlobalTracks({
return; return;
} }
selectGlobalRegion(createdRegion.getId(), DEFAULT_REGION_CLICK_OPTIONS);
setEditingGlobalRegionId(createdRegion.getId()); setEditingGlobalRegionId(createdRegion.getId());
setEditingGlobalRegionText(createdRegion.getName()); setEditingGlobalRegionText(createdRegion.getName());
} catch (error) { } catch (error) {
@@ -253,7 +236,6 @@ export function useMainContentGlobalTracks({
return; return;
} }
selectGlobalRegion(createdRegion.getId(), DEFAULT_REGION_CLICK_OPTIONS);
setEditingKeySignatureRegionId(createdRegion.getId()); setEditingKeySignatureRegionId(createdRegion.getId());
} catch (error) { } catch (error) {
console.error('Error creating key signature region:', error); console.error('Error creating key signature region:', error);
@@ -339,7 +321,6 @@ export function useMainContentGlobalTracks({
return; return;
} }
selectGlobalRegion(createdRegion.getId(), DEFAULT_REGION_CLICK_OPTIONS);
setEditingTempoRegionId(createdRegion.getId()); setEditingTempoRegionId(createdRegion.getId());
setEditingTempoText(createdRegion.getBpm().toString()); setEditingTempoText(createdRegion.getBpm().toString());
} catch (error) { } catch (error) {
@@ -385,7 +366,6 @@ export function useMainContentGlobalTracks({
return; return;
} }
selectGlobalRegion(createdRegion.getId(), DEFAULT_REGION_CLICK_OPTIONS);
setEditingChordRegionId(createdRegion.getId()); setEditingChordRegionId(createdRegion.getId());
} catch (error) { } catch (error) {
console.error('Error creating chord region:', error); console.error('Error creating chord region:', error);
@@ -416,7 +396,6 @@ export function useMainContentGlobalTracks({
return null; return null;
} }
selectGlobalRegion(createdRegion.getId(), DEFAULT_REGION_CLICK_OPTIONS);
setEditingChordRegionId(createdRegion.getId()); setEditingChordRegionId(createdRegion.getId());
return createdRegion; return createdRegion;
} catch (error) { } catch (error) {