From 736d34a7a71507958dba208bcc6062307c9f1e5e Mon Sep 17 00:00:00 2001 From: George Reales Date: Thu, 3 Nov 2022 18:18:45 +0100 Subject: [PATCH] Windows and Linux Copy Paste Preset --- Source/PluginEditor.cpp | 32 ++++++++++++++++++++++++++++++-- Source/PluginProcessor.cpp | 15 +++++++++++++++ Source/PluginProcessor.h | 1 + 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/Source/PluginEditor.cpp b/Source/PluginEditor.cpp index bcdf126..df05431 100755 --- a/Source/PluginEditor.cpp +++ b/Source/PluginEditor.cpp @@ -865,6 +865,10 @@ void ObxdAudioProcessorEditor::createMenu () { #if JUCE_MAC bool enablePasteOption = macPasteboard::containsPresetData(); // Check if the clipboard contains data for a Preset +#else + juce::MemoryBlock memoryBlock; + memoryBlock.fromBase64Encoding(SystemClipboard::getTextFromClipboard()); + bool enablePasteOption = processor.isMemoryBlockAPreset(memoryBlock); #endif popupMenus.clear(); PopupMenu* menu = new PopupMenu(); @@ -929,7 +933,6 @@ void ObxdAudioProcessorEditor::createMenu () true, false); -#if JUCE_MAC fileMenu.addSeparator(); @@ -942,7 +945,7 @@ void ObxdAudioProcessorEditor::createMenu () "Paste Preset...", enablePasteOption, false); -#endif + /* fileMenu.addItem(static_cast(MenuAction::DeleteBank), "Delete Bank...", @@ -1366,6 +1369,31 @@ void ObxdAudioProcessorEditor::MenuActionCallback(int action){ processor.loadFromMemoryBlock(memoryBlock); //loadPreset(memoryBlock); } } +#else + // Copy to clipboard + if (action == MenuAction::CopyPreset) + { + juce::MemoryBlock serializedData; + + // Serialize the Preset, produces the same data as an export but into memory instead of a file. + processor.serializePreset(serializedData); + + // Place the data onto the clipboard + SystemClipboard::copyTextToClipboard(serializedData.toBase64Encoding()); + } + + // Paste from clipboard + if (action == MenuAction::PastePreset) + { + juce::MemoryBlock memoryBlock; + + // Fetch Preset data from the clipboard + memoryBlock.fromBase64Encoding(SystemClipboard::getTextFromClipboard()); + + // Load the data + processor.loadFromMemoryBlock(memoryBlock); //loadPreset(memoryBlock); + + } #endif } diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index a553601..39a5f2e 100644 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -670,6 +670,21 @@ bool ObxdAudioProcessor::loadFromFXBFile(const File& fxbFile) return true; } +bool ObxdAudioProcessor::isMemoryBlockAPreset(const MemoryBlock& mb) +{ + const void* const data = mb.getData(); + const size_t dataSize = mb.getSize(); + + if (dataSize < 28) + return false; + + const fxSet* const set = (const fxSet*)data; + + if ((!compareMagic(set->chunkMagic, "CcnK")) || fxbSwap(set->version) > fxbVersionNum) + return false; + return true; +} + bool ObxdAudioProcessor::loadFromMemoryBlock(MemoryBlock& mb) { const void* const data = mb.getData(); diff --git a/Source/PluginProcessor.h b/Source/PluginProcessor.h index 3363d3f..91d08f5 100644 --- a/Source/PluginProcessor.h +++ b/Source/PluginProcessor.h @@ -184,6 +184,7 @@ public: bool loadFromFXPFile(const File& fxbFile); bool loadFromFXBFile(const File& fxbFile); + bool isMemoryBlockAPreset(const MemoryBlock& memoryBlock); bool loadFromMemoryBlock(MemoryBlock& memoryBlock); bool saveFXBFile(const File& fxbFile); bool saveFXPFile(const File& fxpFile);