Copy/Paste for splits effects.

This commit is contained in:
Robin E.R. Davies
2026-06-16 03:39:50 -04:00
parent 0bd7cea73c
commit 57ce06cecd
2 changed files with 50 additions and 25 deletions
+27 -1
View File
@@ -59,7 +59,13 @@ export class ControlValue implements Deserializable<ControlValue> {
} }
export class PedalboardItem implements Deserializable<PedalboardItem> { export class PedalboardItem implements Deserializable<PedalboardItem> {
clone() { clone(): PedalboardItem {
if (this.isSplit())
{
let result = new PedalboardSplitItem();
result.deserialize(this);
return result as PedalboardItem;;
}
return new PedalboardItem().deserialize(this); return new PedalboardItem().deserialize(this);
} }
deserializePedalboardItem(input: any): PedalboardItem { deserializePedalboardItem(input: any): PedalboardItem {
@@ -771,6 +777,19 @@ export class Pedalboard implements Deserializable<Pedalboard> {
return false; 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) replaceItem(instanceId: number, newItem: PedalboardItem)
{ {
newItem.instanceId = ++this.nextInstanceId; newItem.instanceId = ++this.nextInstanceId;
@@ -780,6 +799,13 @@ export class Pedalboard implements Deserializable<Pedalboard> {
{ {
throw new PiPedalArgumentError("instanceId not found."); 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; return newItem.instanceId;
} }
private _addItem(items: PedalboardItem[], newItem: PedalboardItem, instanceId: number, append: boolean) private _addItem(items: PedalboardItem[], newItem: PedalboardItem, instanceId: number, append: boolean)
+9 -10
View File
@@ -124,7 +124,7 @@ const PluginPresetSelector =
if (pedalboardItem === null) return false; if (pedalboardItem === null) return false;
if (!pedalboardItem.uri) return false; if (!pedalboardItem.uri) return false;
if (pedalboardItem.isStart() || pedalboardItem.isEnd() if (pedalboardItem.isStart() || pedalboardItem.isEnd()
|| pedalboardItem.isSplit()) { ) {
return false; return false;
} }
return true; return true;
@@ -237,18 +237,16 @@ const PluginPresetSelector =
componentDidUpdate( componentDidUpdate(
prevProps: Readonly<PluginPresetSelectorProps>, prevProps: Readonly<PluginPresetSelectorProps>,
prevState: Readonly<PluginPresetSelectorState>, prevState: Readonly<PluginPresetSelectorState>,
snapshot?: any): void snapshot?: any): void {
{
if (this.props.pedalboardItem !== prevProps.pedalboardItem) { if (this.props.pedalboardItem !== prevProps.pedalboardItem) {
this.setState({ this.setState({
isVisible: this.isVisible(this.props.pedalboardItem), 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) {
if (this.props.pedalboardItem.isEmpty()) if (this.props.pedalboardItem.isEmpty()) {
{
this.setState({ presets: new PluginUiPresets() }); this.setState({ presets: new PluginUiPresets() });
} else } else {
{
this.loadPresets(); this.loadPresets();
} }
} }
@@ -272,7 +270,8 @@ const PluginPresetSelector =
} }
isMenuCopyPluginEnabled(): boolean { isMenuCopyPluginEnabled(): boolean {
return this.state.hasPresets; if (this.props.pedalboardItem === null) return false;
return !this.props.pedalboardItem.isEmpty();
} }
handleMenuCopyPlugin(): void { handleMenuCopyPlugin(): void {
this.handlePresetsMenuClose(); this.handlePresetsMenuClose();
@@ -340,7 +339,7 @@ const PluginPresetSelector =
} }
buildMenuItems() { buildMenuItems() {
let result : React.ReactNode[] = []; let result: React.ReactNode[] = [];
if (this.state.hasPresets) { if (this.state.hasPresets) {
result.push((<MenuItem key="menuSaveAs" onClick={(e) => this.handlePluginPresetsMenuSaveAs(e)}>Save plugin preset...</MenuItem>)); result.push((<MenuItem key="menuSaveAs" onClick={(e) => this.handlePluginPresetsMenuSaveAs(e)}>Save plugin preset...</MenuItem>));
result.push((<MenuItem key="menuEdit" onClick={(e) => this.handleMenuEditPluginPresets()}>Manage plugin presets...</MenuItem>)); result.push((<MenuItem key="menuEdit" onClick={(e) => this.handleMenuEditPluginPresets()}>Manage plugin presets...</MenuItem>));