Preset recall GUI fix
This commit is contained in:
parent
caa6f6d010
commit
5869f6435f
4 changed files with 112 additions and 61 deletions
|
@ -14,22 +14,33 @@ It contains the basic startup code for a Juce application.
|
|||
|
||||
//==============================================================================
|
||||
ObxdAudioProcessorEditor::ObxdAudioProcessorEditor (ObxdAudioProcessor& ownerFilter)
|
||||
: AudioProcessorEditor (&ownerFilter), processor (ownerFilter)
|
||||
: AudioProcessorEditor (&ownerFilter), processor (ownerFilter),
|
||||
skinFolder (processor.getSkinFolder()),
|
||||
progStart (2000),
|
||||
bankStart (1000),
|
||||
skinStart (0),
|
||||
skins (processor.getSkinFiles()),
|
||||
banks (processor.getBankFiles())
|
||||
{
|
||||
skinFolder = ownerFilter.getCurrentSkinFolder();
|
||||
loadSkin(processor);
|
||||
// skinFolder = ownerFilter.getCurrentSkinFolder(); // initialized above
|
||||
loadSkin (processor);
|
||||
repaint();
|
||||
}
|
||||
|
||||
void ObxdAudioProcessorEditor::loadSkin(ObxdAudioProcessor& ownerFilter){
|
||||
void ObxdAudioProcessorEditor::loadSkin (ObxdAudioProcessor& ownerFilter)
|
||||
{
|
||||
knobAttachments.clear();
|
||||
buttonListAttachments.clear();
|
||||
toggleAttachments.clear();
|
||||
imageButtons.clear();
|
||||
popupMenus.clear();
|
||||
ownerFilter.removeChangeListener (this);
|
||||
//File coords("/Users/jimmy/Downloads/coords.xml");
|
||||
skinFolder = ownerFilter.getCurrentSkinFolder();
|
||||
File coords = skinFolder.getChildFile ("coords.xml");
|
||||
bool useClassicSkin = coords.existsAsFile();
|
||||
if (!useClassicSkin) {
|
||||
addMenu (14, 25, 20, ImageCache::getFromMemory(BinaryData::menu_png, BinaryData::menu_pngSize));
|
||||
addMenuButton (14, 25, 20, ImageCache::getFromMemory(BinaryData::menu_png, BinaryData::menu_pngSize));
|
||||
rebuildComponents (processor);
|
||||
return;
|
||||
}
|
||||
|
@ -151,7 +162,7 @@ void ObxdAudioProcessorEditor::loadSkin(ObxdAudioProcessor& ownerFilter){
|
|||
|
||||
if (name == "menu")
|
||||
{
|
||||
addMenu (x, y, d,
|
||||
addMenuButton (x, y, d,
|
||||
ImageCache::getFromFile (skinFolder.getChildFile ("menu.png")));
|
||||
}
|
||||
|
||||
|
@ -162,27 +173,28 @@ void ObxdAudioProcessorEditor::loadSkin(ObxdAudioProcessor& ownerFilter){
|
|||
}
|
||||
|
||||
// Prepare data
|
||||
if (voiceSwitch){
|
||||
|
||||
if (voiceSwitch)
|
||||
{
|
||||
for (int i = 1; i <= 32; ++i)
|
||||
{
|
||||
voiceSwitch->addChoice (String (i));
|
||||
}
|
||||
|
||||
auto voiceOption = ownerFilter.getPluginState().getParameter (ownerFilter.getEngineParameterId (VOICE_COUNT))->getValue();
|
||||
voiceSwitch->setValue (voiceOption, dontSendNotification);
|
||||
}
|
||||
if (legatoSwitch) {
|
||||
|
||||
if (legatoSwitch)
|
||||
{
|
||||
legatoSwitch->addChoice ("Keep All");
|
||||
legatoSwitch->addChoice ("Keep Filter Envelope");
|
||||
legatoSwitch->addChoice ("Keep Amplitude Envelope");
|
||||
legatoSwitch->addChoice ("Retrig");
|
||||
auto legatoOption = ownerFilter.getPluginState().getParameter (ownerFilter.getEngineParameterId (LEGATOMODE))->getValue();
|
||||
legatoSwitch->setValue (legatoOption, dontSendNotification);
|
||||
}
|
||||
buttonListAttachments.add (new ButtonList::ButtonListAttachment (ownerFilter.getPluginState(),
|
||||
ownerFilter.getEngineParameterId (VOICE_COUNT),
|
||||
*voiceSwitch));
|
||||
|
||||
buttonListAttachments.add (new ButtonList::ButtonListAttachment (ownerFilter.getPluginState(),
|
||||
ownerFilter.getEngineParameterId (LEGATOMODE),
|
||||
*legatoSwitch));
|
||||
|
||||
createMenu();
|
||||
ownerFilter.addChangeListener (this);
|
||||
repaint();
|
||||
}
|
||||
|
@ -204,7 +216,11 @@ void ObxdAudioProcessorEditor::placeLabel (int x, int y, String text)
|
|||
|
||||
ButtonList* ObxdAudioProcessorEditor::addList (int x, int y, int width, int height, ObxdAudioProcessor& filter, int parameter, String /*name*/, Image img)
|
||||
{
|
||||
ButtonList *bl = new ButtonList (img, height*2); //*2 preliminar retina support
|
||||
ButtonList *bl = new ButtonList (img, height*2);
|
||||
buttonListAttachments.add (new ButtonList::ButtonListAttachment (filter.getPluginState(),
|
||||
filter.getEngineParameterId (parameter),
|
||||
*bl));
|
||||
|
||||
bl->setBounds (x, y, width, height);
|
||||
addAndMakeVisible (bl);
|
||||
|
||||
|
@ -215,40 +231,46 @@ ButtonList* ObxdAudioProcessorEditor::addList (int x, int y, int width, int heig
|
|||
Knob* ObxdAudioProcessorEditor::addKnob (int x, int y, int d, ObxdAudioProcessor& filter, int parameter, String /*name*/, float defval)
|
||||
{
|
||||
Knob* knob = new Knob (ImageCache::getFromFile(skinFolder.getChildFile("knob.png")), 144);
|
||||
knobAttachments.add (new Knob::KnobAttachment (filter.getPluginState(),
|
||||
filter.getEngineParameterId (parameter),
|
||||
*knob));
|
||||
|
||||
knob->setSliderStyle (Slider::RotaryVerticalDrag);
|
||||
knob->setTextBoxStyle (knob->NoTextBox, true, 0, 0);
|
||||
knob->setRange (0, 1);
|
||||
addAndMakeVisible (knob);
|
||||
knob->setBounds (x, y, d+(d/6), d+(d/6));
|
||||
knob->setTextBoxIsEditable (false);
|
||||
knob->setDoubleClickReturnValue (true, defval);
|
||||
knobAttachments.add (new Knob::KnobAttachment (filter.getPluginState(),
|
||||
|
||||
filter.getEngineParameterId (parameter),
|
||||
*knob));
|
||||
knob->setValue (filter.getPluginState().getParameter (filter.getEngineParameterId (parameter))->getValue());
|
||||
addAndMakeVisible (knob);
|
||||
|
||||
return knob;
|
||||
}
|
||||
|
||||
|
||||
void ObxdAudioProcessorEditor::clean(){
|
||||
void ObxdAudioProcessorEditor::clean()
|
||||
{
|
||||
this->removeAllChildren();
|
||||
}
|
||||
|
||||
TooglableButton* ObxdAudioProcessorEditor::addButton (int x, int y, int w, int h, ObxdAudioProcessor& filter, int parameter, String name)
|
||||
{
|
||||
TooglableButton* button = new TooglableButton (ImageCache::getFromFile(skinFolder.getChildFile("button.png")));
|
||||
addAndMakeVisible (button);
|
||||
button->setBounds (x, y, w, h);
|
||||
button->setButtonText (name);
|
||||
toggleAttachments.add (new TooglableButton::ToggleAttachment (filter.getPluginState(),
|
||||
filter.getEngineParameterId (parameter),
|
||||
*button));
|
||||
|
||||
button->setBounds (x, y, w, h);
|
||||
button->setButtonText (name);
|
||||
button->setValue (filter.getPluginState().getParameter (filter.getEngineParameterId (parameter))->getValue(),
|
||||
dontSendNotification);
|
||||
|
||||
addAndMakeVisible (button);
|
||||
|
||||
return button;
|
||||
}
|
||||
|
||||
void ObxdAudioProcessorEditor::addMenu (int x, int y, int d, const Image& image)
|
||||
void ObxdAudioProcessorEditor::addMenuButton (int x, int y, int d, const Image& image)
|
||||
{
|
||||
ImageButton* imageButton;
|
||||
imageButtons.add (imageButton = new ImageButton());
|
||||
|
@ -284,18 +306,15 @@ void ObxdAudioProcessorEditor::rebuildComponents (ObxdAudioProcessor& ownerFilte
|
|||
repaint();
|
||||
}
|
||||
|
||||
void ObxdAudioProcessorEditor::createMenu (const Point<int> pos)
|
||||
void ObxdAudioProcessorEditor::createMenu ()
|
||||
{
|
||||
PopupMenu menu;
|
||||
PopupMenu* menu = new PopupMenu();
|
||||
PopupMenu progMenu;
|
||||
PopupMenu bankMenu;
|
||||
PopupMenu skinMenu;
|
||||
|
||||
|
||||
Array<File> skins;
|
||||
const Array<File>& banks = processor.getBankFiles();
|
||||
|
||||
int progStart = 2000;
|
||||
skins = processor.getSkinFiles();
|
||||
banks = processor.getBankFiles();
|
||||
|
||||
{
|
||||
for (int i = 0; i < processor.getNumPrograms(); ++i)
|
||||
|
@ -306,11 +325,9 @@ void ObxdAudioProcessorEditor::createMenu (const Point<int> pos)
|
|||
i == processor.getCurrentProgram());
|
||||
}
|
||||
|
||||
menu.addSubMenu("Programs", progMenu);
|
||||
menu->addSubMenu("Programs", progMenu);
|
||||
}
|
||||
|
||||
int bankStart = 1000;
|
||||
|
||||
{
|
||||
const String currentBank = processor.getCurrentBankFile().getFileName();
|
||||
|
||||
|
@ -323,19 +340,10 @@ void ObxdAudioProcessorEditor::createMenu (const Point<int> pos)
|
|||
bank.getFileName() == currentBank);
|
||||
}
|
||||
|
||||
menu.addSubMenu ("Banks", bankMenu);
|
||||
menu->addSubMenu ("Banks", bankMenu);
|
||||
}
|
||||
|
||||
int skinStart = 0;
|
||||
|
||||
{
|
||||
DirectoryIterator it (processor.getSkinFolder(), false, "*", File::findDirectories);
|
||||
|
||||
while (it.next())
|
||||
{
|
||||
skins.addUsingDefaultSort (it.getFile());
|
||||
}
|
||||
|
||||
for (int i = 0; i < skins.size(); ++i)
|
||||
{
|
||||
const File skin = skins.getUnchecked (i);
|
||||
|
@ -345,12 +353,16 @@ void ObxdAudioProcessorEditor::createMenu (const Point<int> pos)
|
|||
skin.getFileName() == skinFolder.getFileName());
|
||||
}
|
||||
|
||||
menu.addSubMenu ("Themes", skinMenu);
|
||||
menu->addSubMenu ("Themes", skinMenu);
|
||||
// About // menu.addItem(1, String("Release ") + String(JucePlugin_VersionString).dropLastCharacters(2), false);
|
||||
}
|
||||
|
||||
|
||||
int result = menu.showAt (Rectangle<int> (pos.getX(), pos.getY(), 1, 1));
|
||||
popupMenus.add (menu);
|
||||
}
|
||||
|
||||
void ObxdAudioProcessorEditor::resultFromMenu (const Point<int> pos)
|
||||
{
|
||||
int result = popupMenus[0]->showAt (Rectangle<int> (pos.getX(), pos.getY(), 1, 1));
|
||||
|
||||
if (result >= (skinStart + 1) && result <= (skinStart + skins.size()))
|
||||
{
|
||||
|
@ -369,14 +381,18 @@ void ObxdAudioProcessorEditor::createMenu (const Point<int> pos)
|
|||
result -= 1;
|
||||
result -= bankStart;
|
||||
|
||||
const File bankFile = banks.getUnchecked(result);
|
||||
const File bankFile = banks.getUnchecked (result);
|
||||
processor.loadFromFXBFile (bankFile);
|
||||
clean();
|
||||
loadSkin (processor);
|
||||
}
|
||||
else if (result >= (progStart + 1) && result <= (progStart + processor.getNumPrograms()))
|
||||
{
|
||||
result -= 1;
|
||||
result -= progStart;
|
||||
processor.setCurrentProgram (result);
|
||||
clean();
|
||||
loadSkin (processor);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -391,7 +407,7 @@ void ObxdAudioProcessorEditor::buttonClicked (Button* b)
|
|||
auto dx = imageButton->getWidth();
|
||||
auto pos = Point<int> (x, y + dx);
|
||||
|
||||
createMenu (pos);
|
||||
resultFromMenu (pos);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -399,17 +415,21 @@ void ObxdAudioProcessorEditor::buttonClicked (Button* b)
|
|||
void ObxdAudioProcessorEditor::changeListenerCallback (ChangeBroadcaster* source)
|
||||
{
|
||||
|
||||
for (int i = 0; i < knobAttachments.size(); i++){
|
||||
for (int i = 0; i < knobAttachments.size(); ++i)
|
||||
{
|
||||
knobAttachments[i]->updateToSlider();
|
||||
}
|
||||
|
||||
for (int i = 0; i < toggleAttachments.size(); i++){
|
||||
for (int i = 0; i < toggleAttachments.size(); ++i)
|
||||
{
|
||||
toggleAttachments[i]->updateToSlider();
|
||||
}
|
||||
|
||||
for (int i = 0; i < buttonListAttachments.size(); i++){
|
||||
for (int i = 0; i < buttonListAttachments.size(); ++i)
|
||||
{
|
||||
buttonListAttachments[i]->updateToSlider();
|
||||
}
|
||||
|
||||
repaint();
|
||||
}
|
||||
|
||||
|
@ -417,7 +437,7 @@ void ObxdAudioProcessorEditor::mouseUp (const MouseEvent& e)
|
|||
{
|
||||
if (e.mods.isRightButtonDown() || e.mods.isCommandDown())
|
||||
{
|
||||
createMenu (e.getMouseDownScreenPosition());
|
||||
resultFromMenu (e.getMouseDownScreenPosition());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -46,8 +46,9 @@ private:
|
|||
void placeLabel (int x, int y, String text);
|
||||
TooglableButton* addButton (int x, int y, int w, int h, ObxdAudioProcessor& filter, int parameter, String name);
|
||||
ButtonList* addList(int x, int y, int w, int h, ObxdAudioProcessor& filter, int parameter, String name, Image img);
|
||||
void addMenu (int x, int y, int d, const Image&);
|
||||
void createMenu (const Point<int>);
|
||||
void addMenuButton (int x, int y, int d, const Image&);
|
||||
void createMenu ();
|
||||
void resultFromMenu (const Point<int>);
|
||||
void clean();
|
||||
|
||||
void rebuildComponents (ObxdAudioProcessor&);
|
||||
|
@ -137,6 +138,14 @@ private:
|
|||
OwnedArray<ButtonList::ButtonListAttachment> buttonListAttachments;
|
||||
|
||||
OwnedArray<ImageButton> imageButtons;
|
||||
|
||||
OwnedArray<PopupMenu> popupMenus;
|
||||
|
||||
int progStart;
|
||||
int bankStart;
|
||||
int skinStart;
|
||||
Array<File> skins;
|
||||
Array<File> banks;
|
||||
};
|
||||
|
||||
#endif // PLUGINEDITOR_H_INCLUDED
|
||||
|
|
|
@ -75,6 +75,7 @@ ObxdAudioProcessor::ObxdAudioProcessor()
|
|||
currentBank = "Init";
|
||||
|
||||
scanAndUpdateBanks();
|
||||
scanAndUpdateSkins();
|
||||
initAllParams();
|
||||
|
||||
if (bankFiles.size() > 0)
|
||||
|
@ -574,18 +575,36 @@ void ObxdAudioProcessor::scanAndUpdateBanks()
|
|||
{
|
||||
bankFiles.clearQuick();
|
||||
|
||||
DirectoryIterator it(getBanksFolder(), false, "*.fxb", File::findFiles);
|
||||
while (it.next())
|
||||
DirectoryIterator it (getBanksFolder(), false, "*.fxb", File::findFiles);
|
||||
|
||||
while (it.next())
|
||||
{
|
||||
bankFiles.addUsingDefaultSort(it.getFile());
|
||||
bankFiles.addUsingDefaultSort (it.getFile());
|
||||
}
|
||||
}
|
||||
|
||||
void ObxdAudioProcessor::scanAndUpdateSkins()
|
||||
{
|
||||
skinFiles.clearQuick();
|
||||
DirectoryIterator it (getSkinFolder(), false, "*", File::findDirectories);
|
||||
|
||||
while (it.next())
|
||||
{
|
||||
skinFiles.addUsingDefaultSort (it.getFile());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const Array<File>& ObxdAudioProcessor::getBankFiles() const
|
||||
{
|
||||
return bankFiles;
|
||||
}
|
||||
|
||||
const Array<File>& ObxdAudioProcessor::getSkinFiles() const
|
||||
{
|
||||
return skinFiles;
|
||||
}
|
||||
|
||||
File ObxdAudioProcessor::getCurrentBankFile() const
|
||||
{
|
||||
return getBanksFolder().getChildFile(currentBank);
|
||||
|
|
|
@ -164,7 +164,9 @@ public:
|
|||
|
||||
//==============================================================================
|
||||
void scanAndUpdateBanks();
|
||||
void scanAndUpdateSkins();
|
||||
const Array<File>& getBankFiles() const;
|
||||
const Array<File>& getSkinFiles() const;
|
||||
bool loadFromFXBFile(const File& fxbFile);
|
||||
bool restoreProgramSettings(const fxProgram* const prog);
|
||||
File getCurrentBankFile() const;
|
||||
|
@ -208,6 +210,7 @@ private:
|
|||
String currentSkin;
|
||||
String currentBank;
|
||||
Array<File> bankFiles;
|
||||
Array<File> skinFiles;
|
||||
|
||||
std::unique_ptr<PropertiesFile> config;
|
||||
InterProcessLock configLock;
|
||||
|
|
Loading…
Reference in a new issue