feat: add Ctrl+A select all items and Del key delete selected items/groups

- Ctrl+A already existed for selecting all timeline items across tracks
- Added Del/Backspace key handler for selectedItemIds: deletes all selected sections, MIDI items, and audio clips from the selected track(s)
- Clears selection after deletion and shows toast with count
This commit is contained in:
2026-07-28 18:22:31 +07:00
parent 6604f85e0d
commit a41284ccf7
+34
View File
@@ -8158,6 +8158,40 @@ const App = () => {
return;
}
if (e.key === 'Delete' || e.key === 'Backspace' || e.key === 'Del') {
if (selectedItemIds && selectedItemIds.size > 0) {
e.preventDefault();
const idsToDelete = new Set(selectedItemIds);
setSelectedItemIds(new Set());
updateActiveTracks(prev => prev.map(t => {
let changed = false;
const sections = (t.sections || []).filter(s => {
if (idsToDelete.has(s.id)) { changed = true; return false; }
return true;
});
const midiItems = (t.midiItems || []).filter(m => {
if (idsToDelete.has(m.id)) { changed = true; return false; }
return true;
});
const clips = (t.clips || []).filter(c => {
const canonical = c.id === 'default' ? 'default_' + t.id : c.id;
if (idsToDelete.has(canonical)) { changed = true; return false; }
return true;
});
if (!changed) return t;
return {
...t,
sections,
midiItems,
clips,
buffer: clips[0]?.buffer || null,
startTime: clips[0]?.startTime || 0,
name: clips[0]?.name || t.name
};
}));
const count = idsToDelete.size;
showToast(count === 1 ? 'Đã xóa 1 item.' : `Đã xóa ${count} items.`, 'info');
return;
}
const selClip = selectedClipIdRef.current;
if (selClip) {
e.preventDefault();