The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
3.5KB

  1. /*
  2. ==============================================================================
  3. GenericEditor.h
  4. Created: 23 Nov 2015 3:08:33pm
  5. Author: Fabian Renn
  6. ==============================================================================
  7. */
  8. class GenericEditor : public AudioProcessorEditor,
  9. public SliderListener,
  10. private Timer
  11. {
  12. public:
  13. enum
  14. {
  15. kParamSliderHeight = 40,
  16. kParamLabelWidth = 80,
  17. kParamSliderWidth = 300
  18. };
  19. GenericEditor (AudioProcessor& parent)
  20. : AudioProcessorEditor (parent),
  21. noParameterLabel ("noparam", "No parameters available")
  22. {
  23. const OwnedArray<AudioProcessorParameter>& params = parent.getParameters();
  24. for (int i = 0; i < params.size(); ++i)
  25. {
  26. if (const AudioParameterFloat* param = dynamic_cast<AudioParameterFloat*>(params[i]))
  27. {
  28. Slider* aSlider;
  29. paramSliders.add (aSlider = new Slider (param->name));
  30. aSlider->setRange (param->range.start, param->range.end);
  31. aSlider->setSliderStyle (Slider::LinearHorizontal);
  32. aSlider->setValue (dynamic_cast<const AudioProcessorParameter*>(param)->getValue());
  33. aSlider->addListener (this);
  34. addAndMakeVisible (aSlider);
  35. Label* aLabel;
  36. paramLabels.add (aLabel = new Label (param->name, param->name));
  37. addAndMakeVisible (aLabel);
  38. }
  39. }
  40. noParameterLabel.setJustificationType (Justification::horizontallyCentred | Justification::verticallyCentred);
  41. noParameterLabel.setFont (noParameterLabel.getFont().withStyle (Font::italic));
  42. setSize (kParamSliderWidth + kParamLabelWidth,
  43. jmax (1, kParamSliderHeight * paramSliders.size()));
  44. if (paramSliders.size() == 0)
  45. addAndMakeVisible (noParameterLabel);
  46. else
  47. startTimer (100);
  48. }
  49. ~GenericEditor()
  50. {
  51. }
  52. void resized() override
  53. {
  54. Rectangle<int> r = getLocalBounds();
  55. noParameterLabel.setBounds (r);
  56. for (int i = 0; i < paramSliders.size(); ++i)
  57. {
  58. Rectangle<int> paramBounds = r.removeFromTop (kParamSliderHeight);
  59. Rectangle<int> labelBounds = paramBounds.removeFromLeft (kParamLabelWidth);
  60. paramLabels[i]->setBounds (labelBounds);
  61. paramSliders[i]->setBounds (paramBounds);
  62. }
  63. }
  64. void paint (Graphics& g) override
  65. {
  66. g.fillAll (Colours::white);
  67. }
  68. void sliderValueChanged (Slider* slider) override
  69. {
  70. const OwnedArray<AudioProcessorParameter>& params = getAudioProcessor()->getParameters();
  71. int paramIndex = paramSliders.indexOf (slider);
  72. if (paramIndex >= 0 && paramIndex < params.size())
  73. params[paramIndex]->setValueNotifyingHost ((float) slider->getValue());
  74. }
  75. private:
  76. void timerCallback() override
  77. {
  78. const OwnedArray<AudioProcessorParameter>& params = getAudioProcessor()->getParameters();
  79. for (int i = 0; i < params.size(); ++i)
  80. {
  81. if (const AudioProcessorParameter* param = params[i])
  82. {
  83. if (i < paramSliders.size())
  84. paramSliders[i]->setValue (param->getValue());
  85. }
  86. }
  87. }
  88. Label noParameterLabel;
  89. OwnedArray<Slider> paramSliders;
  90. OwnedArray<Label> paramLabels;
  91. };