/// <summary> /// /// </summary> /// <param name="combi"></param> /// <param name="clearAfterCopy"></param> /// <returns></returns> public IClipBoardCombi CopyCombiToClipBoard(ICombi combi, bool clearAfterCopy) { // Copy combi. IClipBoardCombi clipBoardCombi = null; if (combi.PcgRoot.Content != null) { clipBoardCombi = new ClipBoardCombi(combi); Combis.CopiedPatches.Add(clipBoardCombi); if (clearAfterCopy) { combi.Clear(); } // Copy references (timbres). if (!CutPasteSelected) { foreach (var timbre in combi.Timbres.TimbresCollection) { CopyTimbreOfCombiToClipboard(timbre, clipBoardCombi); } } } return(clipBoardCombi); }
/// <summary> /// /// </summary> /// <param name="clipBoardPatches"></param> private void FixPasteProgramReferencesInCombis(IEnumerable <IClipBoardPatch> clipBoardPatches) { foreach (IClipBoardPatch program in clipBoardPatches) { foreach (IClipBoardPatch clipBoardPatch in Combis.CopiedPatches) { IClipBoardCombi combi = (IClipBoardCombi)clipBoardPatch; for (int timbreIndex = 0; timbreIndex < combi.References.CopiedPatches.Count; timbreIndex++) { IClipBoardPatch timbre = combi.References.CopiedPatches[timbreIndex]; if (timbre != program) { continue; } // Program used by timbre in combi. if ((program.PasteDestination != null) && (combi.PasteDestination != null)) { // When pasting to the same file, then it is not wanted to fix references, // because a duplicate program/combi can exist before the original reference // so it will be changed unnecessarily. if (program.OriginalLocation.Root != PastePcgMemory) { ((ICombi)(combi.PasteDestination)).Timbres.TimbresCollection[timbreIndex].UsedProgram = (IProgram)program.PasteDestination; } combi.References.CopiedPatches[timbreIndex] = null; // Prevent fixing it again } } } } }
/// <summary> /// /// </summary> /// <param name="timbre"></param> /// <param name="clipBoardCombi"></param> private void CopyTimbreOfCombiToClipboard(ITimbre timbre, IClipBoardCombi clipBoardCombi) { IClipBoardProgram clipBoardProgramToAdd = null; var usedProgramBank = timbre.UsedProgramBank; var usedProgram = (usedProgramBank == null) ? null : timbre.UsedProgram; if (ShouldTimbreBeCopied(timbre, usedProgramBank, usedProgram)) { clipBoardProgramToAdd = FindProgram(usedProgram) as IClipBoardProgram ?? CopyProgramToClipBoard(usedProgram, false); } clipBoardCombi.References.CopiedPatches.Add(clipBoardProgramToAdd); }