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
+28 -2
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 {
@@ -770,7 +776,20 @@ 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)
+22 -23
View File
@@ -114,7 +114,7 @@ const PluginPresetSelector =
hasPresets(pedalboardItem: PedalboardItem | null): boolean { hasPresets(pedalboardItem: PedalboardItem | null): boolean {
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.isEmpty() || pedalboardItem.isSplit()) { || pedalboardItem.isEmpty() || pedalboardItem.isSplit()) {
return false; return false;
} }
@@ -123,8 +123,8 @@ const PluginPresetSelector =
isVisible(pedalboardItem: PedalboardItem | null): boolean { isVisible(pedalboardItem: PedalboardItem | null): boolean {
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;
@@ -197,7 +197,7 @@ const PluginPresetSelector =
loadPresets(): void { loadPresets(): void {
if (this.props.pedalboardItem === null) return; 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; let captureUri: string = this.props.pedalboardItem.uri;
this.model.getPluginPresets(captureUri) this.model.getPluginPresets(captureUri)
.then((presets: PluginUiPresets) => { .then((presets: PluginUiPresets) => {
@@ -235,20 +235,18 @@ const PluginPresetSelector =
currentPedalboard?: PedalboardItem; currentPedalboard?: PedalboardItem;
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>));
@@ -355,7 +354,7 @@ const PluginPresetSelector =
<PluginPresetIcon className={this.props.classes?.pluginMenuIcon ?? ""} /> <PluginPresetIcon className={this.props.classes?.pluginMenuIcon ?? ""} />
{preset.label}</MenuItem> {preset.label}</MenuItem>
)); ));
hasPresets = true; hasPresets = true;
} }
if (hasPresets) { if (hasPresets) {
@@ -402,12 +401,12 @@ const PluginPresetSelector =
} }
</Menu> </Menu>
{this.state.hasPresets && this.state.showPresetsDialog && ( {this.state.hasPresets && this.state.showPresetsDialog && (
<PluginPresetsDialog <PluginPresetsDialog
instanceId={this.props.instanceId} instanceId={this.props.instanceId}
presets={this.state.presets} presets={this.state.presets}
show={this.state.showPresetsDialog} show={this.state.showPresetsDialog}
isEditDialog={this.state.showEditPresetsDialog} isEditDialog={this.state.showEditPresetsDialog}
onDialogClose={() => this.handleDialogClose()} /> onDialogClose={() => this.handleDialogClose()} />
)} )}
<RenameDialog open={this.state.renameDialogOpen} <RenameDialog open={this.state.renameDialogOpen}
title="Rename" title="Rename"