initial public release.
This commit is contained in:
@@ -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;
|
||||
};
|
||||
Reference in New Issue
Block a user