#pragma once #include class FDNReverbAudioProcessor; // ----------------------------------------------------------------------------- // PresetManager // ----------------------------------------------------------------------------- // preset file manage . // // save location : ~/Documents/Ambivalence/Presets/*.ambpreset // : APVTS getStateInformation/setStateInformation // -> existing save fully reused , minimizes added code // // real-time safety : // - file I/O all message thread (UI) assumed to be called // - processBlock not involved at all // ----------------------------------------------------------------------------- class PresetManager { public: explicit PresetManager(FDNReverbAudioProcessor& processor); // --- preset operations --- bool savePreset(const juce::String& name); bool loadPreset(const juce::String& name); bool deletePreset(const juce::String& name); // --- navigation --- void loadPrevPreset(); void loadNextPreset(); // --- state access --- juce::StringArray getPresetNames() const noexcept { return presetNames; } // --- after changes --- juce::String getCurrentPresetName() const noexcept { return currentPresetName; } void setCurrentPresetName(const juce::String& name) noexcept { currentPresetName = name; } // * added int getCurrentPresetIndex() const noexcept; bool hasPresets() const noexcept { return !presetNames.isEmpty(); } // --- folder access --- juce::File getPresetsFolder() const; // --- UI update callback --- std::function onPresetListChanged; std::function onPresetLoaded; private: void refreshPresetList(); juce::File getPresetFile(const juce::String& name) const; FDNReverbAudioProcessor& processor; juce::StringArray presetNames; juce::String currentPresetName; static constexpr const char* kExtension = ".ambpreset"; static constexpr const char* kSubFolder = "Ambivalence/Presets"; };