initial public release.

This commit is contained in:
Xiaohan-Tian
2025-08-11 18:37:21 -07:00
commit de51967b49
186 changed files with 32322 additions and 0 deletions
+83
View File
@@ -0,0 +1,83 @@
import { KGCore } from '../core/KGCore';
import { useProjectStore } from '../stores/projectStore';
/**
* Utility functions for copy/paste operations
* Extracted from useGlobalKeyboardHandler for reuse in toolbar buttons
*/
/**
* Handles copy operation for currently selected items
* @returns {boolean} true if items were copied, false if no items were selected
*/
export const handleCopyOperation = (): boolean => {
const core = KGCore.instance();
const selectedItems = core.getSelectedItems();
if (selectedItems.length > 0) {
core.copySelectedItems();
console.log(`Copied ${selectedItems.length} items to clipboard`);
return true;
}
console.log('No items selected to copy');
return false;
};
/**
* Handles paste operation based on current context
* @returns {boolean} true if items were pasted, false if paste was not possible
*/
export const handlePasteOperation = (): boolean => {
const core = KGCore.instance();
const copiedItems = core.getCopiedItems();
if (copiedItems.length === 0) {
console.log('No items in clipboard to paste');
return false;
}
// Get current store state
const {
selectedTrackId,
showPianoRoll,
activeRegionId,
pasteRegionsAtTrack,
pasteNotesToActiveRegion
} = useProjectStore.getState();
// Determine paste context and handle accordingly
const hasRegions = copiedItems.some(item => item.getRootType() === 'KGRegion');
const hasNotes = copiedItems.some(item => item.getRootType() === 'KGMidiNote');
if (hasRegions && !hasNotes) {
// Pasting regions - need selected track and playhead position
if (selectedTrackId) {
const playheadPosition = core.getPlayheadPosition();
pasteRegionsAtTrack(selectedTrackId, playheadPosition);
console.log(`Pasted ${copiedItems.length} regions at track ${selectedTrackId}, position ${playheadPosition}`);
return true;
} else {
console.log('No track selected for pasting regions');
return false;
}
} else if (hasNotes && !hasRegions) {
// Pasting notes - only when piano roll is open
if (showPianoRoll && activeRegionId) {
// Use the active region's playhead position (could be different from global playhead)
// For now, we'll use global playhead - this can be refined later
const playheadPosition = core.getPlayheadPosition();
pasteNotesToActiveRegion(activeRegionId, playheadPosition);
console.log(`Pasted ${copiedItems.length} notes to active region ${activeRegionId}, position ${playheadPosition}`);
return true;
} else {
console.log('Piano roll must be open to paste notes');
return false;
}
} else if (hasRegions && hasNotes) {
console.log('Mixed clipboard content (regions + notes) cannot be pasted');
return false;
}
return false;
};