Change precedence of effects when order in list is changed

pull/170/head
James Ball 2023-03-28 16:21:18 +01:00
rodzic 4cf64c9654
commit 945acf1df9
5 zmienionych plików z 43 dodań i 7 usunięć

Wyświetl plik

@ -1,7 +1,7 @@
#include "EffectsComponent.h"
#include "audio/BitCrushEffect.h"
EffectsComponent::EffectsComponent(OscirenderAudioProcessor& p) : audioProcessor(p), listBoxModel(listBox, itemData) {
EffectsComponent::EffectsComponent(OscirenderAudioProcessor& p) : audioProcessor(p), itemData(p), listBoxModel(listBox, itemData) {
setText("Audio Effects");
addAndMakeVisible(frequency);

Wyświetl plik

@ -173,14 +173,32 @@ void OscirenderAudioProcessor::enableEffect(std::shared_ptr<Effect> effect) {
for (auto& e : *enabledEffects) {
newEffects->push_back(e);
}
if (std::find(newEffects->begin(), newEffects->end(), effect) == newEffects->end()) {
// insert according to precedence (sorts from lowest to highest precedence)
auto it = newEffects->begin();
while (it != newEffects->end() && (*it)->getPrecedence() <= effect->getPrecedence()) {
// remove any existing effects with the same id
for (auto it = newEffects->begin(); it != newEffects->end();) {
if ((*it)->getId() == effect->getId()) {
it = newEffects->erase(it);
} else {
it++;
}
newEffects->insert(it, effect);
}
// insert according to precedence (sorts from lowest to highest precedence)
auto it = newEffects->begin();
while (it != newEffects->end() && (*it)->getPrecedence() <= effect->getPrecedence()) {
it++;
}
newEffects->insert(it, effect);
enabledEffects = newEffects;
}
void OscirenderAudioProcessor::updateEffectPrecedence() {
// need to make a new vector because the old one is being iterated over in another thread
std::shared_ptr<std::vector<std::shared_ptr<Effect>>> newEffects = std::make_shared<std::vector<std::shared_ptr<Effect>>>();
for (auto& e : *enabledEffects) {
newEffects->push_back(e);
}
std::sort(newEffects->begin(), newEffects->end(), [](std::shared_ptr<Effect> a, std::shared_ptr<Effect> b) {
return a->getPrecedence() < b->getPrecedence();
});
enabledEffects = newEffects;
}

Wyświetl plik

@ -81,6 +81,7 @@ public:
void updateAngleDelta();
void addFrame(std::vector<std::unique_ptr<Shape>> frame) override;
void enableEffect(std::shared_ptr<Effect> effect);
void updateEffectPrecedence();
private:
double theta = 0.0;
double thetaDelta = 0.0;

Wyświetl plik

@ -56,6 +56,7 @@ void DraggableListBoxItem::hideInsertLines()
{
insertBefore = false;
insertAfter = false;
repaint();
}
void DraggableListBoxItem::itemDragEnter(const SourceDetails& dragSourceDetails)

Wyświetl plik

@ -1,12 +1,16 @@
#pragma once
#include "DraggableListBox.h"
#include <JuceHeader.h>
#include "../PluginProcessor.h"
#include "../audio/Effect.h"
// Application-specific data container
struct MyListBoxItemData : public DraggableListBoxItemData
{
std::vector<std::shared_ptr<Effect>> data;
OscirenderAudioProcessor& audioProcessor;
MyListBoxItemData(OscirenderAudioProcessor& p) : audioProcessor(p) {}
int getNumItems() override {
return data.size();
@ -27,13 +31,19 @@ struct MyListBoxItemData : public DraggableListBoxItemData
}
void moveBefore(int indexOfItemToMove, int indexOfItemToPlaceBefore) override {
auto temp = data[indexOfItemToMove];
auto effect = data[indexOfItemToMove];
if (indexOfItemToMove < indexOfItemToPlaceBefore) {
move(data, indexOfItemToMove, indexOfItemToPlaceBefore - 1);
} else {
move(data, indexOfItemToMove, indexOfItemToPlaceBefore);
}
for (int i = 0; i < data.size(); i++) {
data[i]->setPrecedence(i);
}
audioProcessor.updateEffectPrecedence();
}
void moveAfter(int indexOfItemToMove, int indexOfItemToPlaceAfter) override {
@ -44,6 +54,12 @@ struct MyListBoxItemData : public DraggableListBoxItemData
} else {
move(data, indexOfItemToMove, indexOfItemToPlaceAfter + 1);
}
for (int i = 0; i < data.size(); i++) {
data[i]->setPrecedence(i);
}
audioProcessor.updateEffectPrecedence();
}
template <typename t> void move(std::vector<t>& v, size_t oldIndex, size_t newIndex) {