2023-03-26 12:58:31 +00:00
|
|
|
#pragma once
|
|
|
|
#include "DraggableListBox.h"
|
|
|
|
#include <JuceHeader.h>
|
2023-03-28 15:21:18 +00:00
|
|
|
#include "../PluginProcessor.h"
|
2023-03-28 12:12:41 +00:00
|
|
|
#include "../audio/Effect.h"
|
2023-07-02 17:47:04 +00:00
|
|
|
#include "EffectComponent.h"
|
2023-03-26 12:58:31 +00:00
|
|
|
|
|
|
|
// Application-specific data container
|
2023-07-02 20:00:14 +00:00
|
|
|
struct AudioEffectListBoxItemData : public DraggableListBoxItemData
|
2023-03-26 12:58:31 +00:00
|
|
|
{
|
2023-03-28 12:12:41 +00:00
|
|
|
std::vector<std::shared_ptr<Effect>> data;
|
2023-03-28 15:21:18 +00:00
|
|
|
OscirenderAudioProcessor& audioProcessor;
|
|
|
|
|
2023-07-02 20:00:14 +00:00
|
|
|
AudioEffectListBoxItemData(OscirenderAudioProcessor& p) : audioProcessor(p) {}
|
2023-03-26 12:58:31 +00:00
|
|
|
|
2023-03-28 12:12:41 +00:00
|
|
|
int getNumItems() override {
|
2023-03-26 12:58:31 +00:00
|
|
|
return data.size();
|
|
|
|
}
|
|
|
|
|
2023-07-05 14:17:17 +00:00
|
|
|
// CURRENTLY NOT USED
|
2023-03-28 12:12:41 +00:00
|
|
|
void deleteItem(int indexOfItemToDelete) override {
|
2023-07-05 14:17:17 +00:00
|
|
|
// data.erase(data.begin() + indexOfItemToDelete);
|
2023-03-26 12:58:31 +00:00
|
|
|
}
|
|
|
|
|
2023-07-05 14:17:17 +00:00
|
|
|
// CURRENTLY NOT USED
|
2023-03-28 12:12:41 +00:00
|
|
|
void addItemAtEnd() override {
|
|
|
|
// data.push_back(juce::String("Yahoo"));
|
2023-03-26 12:58:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void moveBefore(int indexOfItemToMove, int indexOfItemToPlaceBefore) override {
|
2023-07-05 14:17:17 +00:00
|
|
|
juce::SpinLock::ScopedLockType lock(audioProcessor.effectsLock);
|
|
|
|
|
2023-03-28 15:21:18 +00:00
|
|
|
auto effect = data[indexOfItemToMove];
|
2023-03-26 12:58:31 +00:00
|
|
|
|
|
|
|
if (indexOfItemToMove < indexOfItemToPlaceBefore) {
|
|
|
|
move(data, indexOfItemToMove, indexOfItemToPlaceBefore - 1);
|
|
|
|
} else {
|
|
|
|
move(data, indexOfItemToMove, indexOfItemToPlaceBefore);
|
|
|
|
}
|
2023-03-28 15:21:18 +00:00
|
|
|
|
|
|
|
for (int i = 0; i < data.size(); i++) {
|
|
|
|
data[i]->setPrecedence(i);
|
|
|
|
}
|
|
|
|
|
|
|
|
audioProcessor.updateEffectPrecedence();
|
2023-03-26 12:58:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void moveAfter(int indexOfItemToMove, int indexOfItemToPlaceAfter) override {
|
2023-07-05 14:17:17 +00:00
|
|
|
juce::SpinLock::ScopedLockType lock(audioProcessor.effectsLock);
|
|
|
|
|
2023-03-28 12:12:41 +00:00
|
|
|
auto temp = data[indexOfItemToMove];
|
2023-03-26 12:58:31 +00:00
|
|
|
|
|
|
|
if (indexOfItemToMove <= indexOfItemToPlaceAfter) {
|
|
|
|
move(data, indexOfItemToMove, indexOfItemToPlaceAfter);
|
|
|
|
} else {
|
|
|
|
move(data, indexOfItemToMove, indexOfItemToPlaceAfter + 1);
|
|
|
|
}
|
2023-03-28 15:21:18 +00:00
|
|
|
|
|
|
|
for (int i = 0; i < data.size(); i++) {
|
|
|
|
data[i]->setPrecedence(i);
|
|
|
|
}
|
|
|
|
|
|
|
|
audioProcessor.updateEffectPrecedence();
|
2023-03-26 12:58:31 +00:00
|
|
|
}
|
|
|
|
|
2023-03-28 12:12:41 +00:00
|
|
|
template <typename t> void move(std::vector<t>& v, size_t oldIndex, size_t newIndex) {
|
2023-03-26 12:58:31 +00:00
|
|
|
if (oldIndex > newIndex) {
|
|
|
|
std::rotate(v.rend() - oldIndex - 1, v.rend() - oldIndex, v.rend() - newIndex);
|
|
|
|
} else {
|
|
|
|
std::rotate(v.begin() + oldIndex, v.begin() + oldIndex + 1, v.begin() + newIndex + 1);
|
|
|
|
}
|
|
|
|
}
|
2023-03-28 12:12:41 +00:00
|
|
|
|
|
|
|
void setValue(int itemIndex, double value) {
|
|
|
|
data[itemIndex]->setValue(value);
|
2023-03-26 12:58:31 +00:00
|
|
|
}
|
2023-03-29 09:55:11 +00:00
|
|
|
|
|
|
|
void setSelected(int itemIndex, bool selected) {
|
|
|
|
if (selected) {
|
|
|
|
audioProcessor.enableEffect(data[itemIndex]);
|
|
|
|
} else {
|
|
|
|
audioProcessor.disableEffect(data[itemIndex]);
|
|
|
|
}
|
|
|
|
}
|
2023-03-28 12:12:41 +00:00
|
|
|
|
|
|
|
juce::String getText(int itemIndex) {
|
|
|
|
return data[itemIndex]->getName();
|
|
|
|
}
|
|
|
|
|
|
|
|
double getValue(int itemIndex) {
|
|
|
|
return data[itemIndex]->getValue();
|
|
|
|
}
|
2023-03-29 09:55:11 +00:00
|
|
|
|
|
|
|
juce::String getId(int itemIndex) {
|
|
|
|
return data[itemIndex]->getId();
|
|
|
|
}
|
2023-03-26 12:58:31 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// Custom list-item Component (which includes item-delete button)
|
2023-07-02 20:00:14 +00:00
|
|
|
class EffectsListComponent : public DraggableListBoxItem
|
2023-03-26 12:58:31 +00:00
|
|
|
{
|
|
|
|
public:
|
2023-07-02 20:00:14 +00:00
|
|
|
EffectsListComponent(DraggableListBox& lb, AudioEffectListBoxItemData& data, int rn, std::shared_ptr<EffectComponent> effectComponent);
|
|
|
|
~EffectsListComponent();
|
2023-03-26 12:58:31 +00:00
|
|
|
|
2023-07-02 17:47:04 +00:00
|
|
|
void paint(juce::Graphics& g) override;
|
2023-03-26 12:58:31 +00:00
|
|
|
void resized() override;
|
|
|
|
|
|
|
|
protected:
|
2023-07-02 17:47:04 +00:00
|
|
|
std::shared_ptr<EffectComponent> effectComponent;
|
2023-03-26 12:58:31 +00:00
|
|
|
private:
|
2023-07-02 20:00:14 +00:00
|
|
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(EffectsListComponent)
|
2023-03-26 12:58:31 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// Customized DraggableListBoxModel overrides refreshComponentForRow() to ensure that every
|
2023-07-02 20:00:14 +00:00
|
|
|
// list-item Component is a EffectsListComponent.
|
|
|
|
class EffectsListBoxModel : public DraggableListBoxModel
|
2023-03-26 12:58:31 +00:00
|
|
|
{
|
|
|
|
public:
|
2023-07-02 20:00:14 +00:00
|
|
|
EffectsListBoxModel(DraggableListBox& lb, DraggableListBoxItemData& md)
|
2023-07-05 16:57:41 +00:00
|
|
|
: DraggableListBoxModel(lb, md) {
|
|
|
|
OscirenderAudioProcessor& audioProcessor = ((AudioEffectListBoxItemData&)md).audioProcessor;
|
|
|
|
juce::SpinLock::ScopedLockType lock(audioProcessor.effectsLock);
|
|
|
|
audioProcessor.updateEffectPrecedence();
|
|
|
|
}
|
2023-03-26 12:58:31 +00:00
|
|
|
|
|
|
|
juce::Component* refreshComponentForRow(int, bool, juce::Component*) override;
|
|
|
|
};
|