83 lines
2.8 KiB
TypeScript
83 lines
2.8 KiB
TypeScript
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;
|
|
}; |