kopia lustrzana https://github.com/jameshball/osci-render
131 wiersze
3.8 KiB
C++
131 wiersze
3.8 KiB
C++
#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();
|
|
}
|
|
|
|
void deleteItem(int indexOfItemToDelete) override {
|
|
data.erase(data.begin() + indexOfItemToDelete);
|
|
}
|
|
|
|
void addItemAtEnd() override {
|
|
// data.push_back(juce::String("Yahoo"));
|
|
}
|
|
|
|
void paintContents(int rowNum, juce::Graphics& g, juce::Rectangle<int> bounds) override {
|
|
g.fillAll(juce::Colours::lightgrey);
|
|
g.setColour(juce::Colours::black);
|
|
g.drawRect(bounds);
|
|
bounds.removeFromLeft(30);
|
|
g.drawText(data[rowNum]->getName(), bounds, juce::Justification::left);
|
|
}
|
|
|
|
void moveBefore(int indexOfItemToMove, int indexOfItemToPlaceBefore) override {
|
|
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 {
|
|
auto temp = data[indexOfItemToMove];
|
|
|
|
if (indexOfItemToMove <= indexOfItemToPlaceAfter) {
|
|
move(data, indexOfItemToMove, indexOfItemToPlaceAfter);
|
|
} 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) {
|
|
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);
|
|
}
|
|
}
|
|
|
|
void setValue(int itemIndex, double value) {
|
|
data[itemIndex]->setValue(value);
|
|
}
|
|
|
|
void setSelected(int itemIndex, bool selected) {
|
|
if (selected) {
|
|
audioProcessor.enableEffect(data[itemIndex]);
|
|
} else {
|
|
audioProcessor.disableEffect(data[itemIndex]);
|
|
}
|
|
}
|
|
|
|
juce::String getText(int itemIndex) {
|
|
return data[itemIndex]->getName();
|
|
}
|
|
|
|
double getValue(int itemIndex) {
|
|
return data[itemIndex]->getValue();
|
|
}
|
|
|
|
juce::String getId(int itemIndex) {
|
|
return data[itemIndex]->getId();
|
|
}
|
|
};
|
|
|
|
// Custom list-item Component (which includes item-delete button)
|
|
class MyListComponent : public DraggableListBoxItem
|
|
{
|
|
public:
|
|
MyListComponent(DraggableListBox& lb, MyListBoxItemData& data, int rn);
|
|
~MyListComponent();
|
|
|
|
void paint(juce::Graphics&) override;
|
|
void resized() override;
|
|
|
|
protected:
|
|
juce::Rectangle<int> dataArea;
|
|
|
|
juce::Slider slider;
|
|
juce::String id;
|
|
juce::ToggleButton selected;
|
|
|
|
private:
|
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(MyListComponent)
|
|
};
|
|
|
|
// Customized DraggableListBoxModel overrides refreshComponentForRow() to ensure that every
|
|
// list-item Component is a MyListComponent.
|
|
class MyListBoxModel : public DraggableListBoxModel
|
|
{
|
|
public:
|
|
MyListBoxModel(DraggableListBox& lb, DraggableListBoxItemData& md)
|
|
: DraggableListBoxModel(lb, md) {}
|
|
|
|
juce::Component* refreshComponentForRow(int, bool, juce::Component*) override;
|
|
};
|