From 57ce06cecd97be7135e572450001163c29e6bb94 Mon Sep 17 00:00:00 2001 From: "Robin E.R. Davies" Date: Tue, 16 Jun 2026 03:39:50 -0400 Subject: [PATCH] Copy/Paste for splits effects. --- vite/src/pipedal/Pedalboard.tsx | 30 ++++++++++++++- vite/src/pipedal/PluginPresetSelector.tsx | 45 +++++++++++------------ 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/vite/src/pipedal/Pedalboard.tsx b/vite/src/pipedal/Pedalboard.tsx index e2afa4f..85fd1e6 100644 --- a/vite/src/pipedal/Pedalboard.tsx +++ b/vite/src/pipedal/Pedalboard.tsx @@ -59,7 +59,13 @@ export class ControlValue implements Deserializable { } export class PedalboardItem implements Deserializable { - clone() { + clone(): PedalboardItem { + if (this.isSplit()) + { + let result = new PedalboardSplitItem(); + result.deserialize(this); + return result as PedalboardItem;; + } return new PedalboardItem().deserialize(this); } deserializePedalboardItem(input: any): PedalboardItem { @@ -770,7 +776,20 @@ export class Pedalboard implements Deserializable { } return false; } - + + assignNewInstanceIds(items: PedalboardItem[]) + { + for (let i = 0; i < items.length; ++i) + { + items[i].instanceId = ++this.nextInstanceId; + if (items[i].isSplit()) + { + let splitItem = items[i] as PedalboardSplitItem; + this.assignNewInstanceIds(splitItem.topChain); + this.assignNewInstanceIds(splitItem.bottomChain); + } + } + } replaceItem(instanceId: number, newItem: PedalboardItem) { newItem.instanceId = ++this.nextInstanceId; @@ -780,6 +799,13 @@ export class Pedalboard implements Deserializable { { throw new PiPedalArgumentError("instanceId not found."); } + if (newItem.isSplit()) + { + // Generate new instance ids for all children, to avoid conflicts. + let splitItem = newItem as PedalboardSplitItem; + this.assignNewInstanceIds(splitItem.topChain); + this.assignNewInstanceIds(splitItem.bottomChain); + } return newItem.instanceId; } private _addItem(items: PedalboardItem[], newItem: PedalboardItem, instanceId: number, append: boolean) diff --git a/vite/src/pipedal/PluginPresetSelector.tsx b/vite/src/pipedal/PluginPresetSelector.tsx index 698651c..0365f34 100644 --- a/vite/src/pipedal/PluginPresetSelector.tsx +++ b/vite/src/pipedal/PluginPresetSelector.tsx @@ -114,7 +114,7 @@ const PluginPresetSelector = hasPresets(pedalboardItem: PedalboardItem | null): boolean { if (pedalboardItem === null) return false; if (!pedalboardItem.uri) return false; - if (pedalboardItem.isStart() || pedalboardItem.isEnd() + if (pedalboardItem.isStart() || pedalboardItem.isEnd() || pedalboardItem.isEmpty() || pedalboardItem.isSplit()) { return false; } @@ -123,8 +123,8 @@ const PluginPresetSelector = isVisible(pedalboardItem: PedalboardItem | null): boolean { if (pedalboardItem === null) return false; if (!pedalboardItem.uri) return false; - if (pedalboardItem.isStart() || pedalboardItem.isEnd() - || pedalboardItem.isSplit()) { + if (pedalboardItem.isStart() || pedalboardItem.isEnd() + ) { return false; } return true; @@ -197,7 +197,7 @@ const PluginPresetSelector = loadPresets(): void { if (this.props.pedalboardItem === null) return; - if (!this.hasPresets(this.props.pedalboardItem)) return; + if (!this.hasPresets(this.props.pedalboardItem)) return; let captureUri: string = this.props.pedalboardItem.uri; this.model.getPluginPresets(captureUri) .then((presets: PluginUiPresets) => { @@ -235,20 +235,18 @@ const PluginPresetSelector = currentPedalboard?: PedalboardItem; componentDidUpdate( - prevProps: Readonly, - prevState: Readonly, - snapshot?: any): void - { + prevProps: Readonly, + prevState: Readonly, + snapshot?: any): void { if (this.props.pedalboardItem !== prevProps.pedalboardItem) { - this.setState({ + this.setState({ isVisible: this.isVisible(this.props.pedalboardItem), - hasPresets: this.hasPresets(this.props.pedalboardItem) }); + hasPresets: this.hasPresets(this.props.pedalboardItem) + }); if (this.props.pedalboardItem) { - if (this.props.pedalboardItem.isEmpty()) - { + if (this.props.pedalboardItem.isEmpty()) { this.setState({ presets: new PluginUiPresets() }); - } else - { + } else { this.loadPresets(); } } @@ -272,7 +270,8 @@ const PluginPresetSelector = } isMenuCopyPluginEnabled(): boolean { - return this.state.hasPresets; + if (this.props.pedalboardItem === null) return false; + return !this.props.pedalboardItem.isEmpty(); } handleMenuCopyPlugin(): void { this.handlePresetsMenuClose(); @@ -340,7 +339,7 @@ const PluginPresetSelector = } buildMenuItems() { - let result : React.ReactNode[] = []; + let result: React.ReactNode[] = []; if (this.state.hasPresets) { result.push(( this.handlePluginPresetsMenuSaveAs(e)}>Save plugin preset...)); result.push(( this.handleMenuEditPluginPresets()}>Manage plugin presets...)); @@ -355,7 +354,7 @@ const PluginPresetSelector = {preset.label} - )); + )); hasPresets = true; } if (hasPresets) { @@ -402,12 +401,12 @@ const PluginPresetSelector = } {this.state.hasPresets && this.state.showPresetsDialog && ( - this.handleDialogClose()} /> + this.handleDialogClose()} /> )}