fix: restore main content global track updates after refactor
This commit is contained in:
@@ -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,
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user