/* Copyright (C) 2017 Xenakios This program is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License (version 3) for more details. www.gnu.org/licenses */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" #include #include #include #include "envelope_component.h" #include "CustomLookAndFeel.h" class zoom_scrollbar : public Component { public: enum hot_area { ha_none, ha_left_edge, ha_right_edge, ha_handle }; void mouseDown(const MouseEvent& e) override; void mouseMove(const MouseEvent& e) override; void mouseDrag(const MouseEvent& e) override; void mouseEnter(const MouseEvent &event) override; void mouseExit(const MouseEvent &event) override; void mouseDoubleClick (const MouseEvent&) override; void paint(Graphics &g) override; std::function)> RangeChanged; Range get_range() const { return m_therange; } void setRange(Range rng, bool docallback); private: Range m_therange{ 0.0,1.0 }; hot_area m_hot_area = ha_none; hot_area get_hot_area(int x, int y); int m_drag_start_x = 0; }; class SpectralVisualizer : public Component { public: SpectralVisualizer(); void setState(const ProcessParameters& pars, int nfreqs, double samplerate); void paint(Graphics& g) override; private: Image m_img; std::vector m_insamples,m_freqs1, m_freqs2, m_freqs3; std::unique_ptr m_fft; int m_nfreqs = 0; double m_elapsed = 0.0; }; class MySlider : public Slider { public: MySlider() {} MySlider(NormalisableRange* range); double proportionOfLengthToValue(double x) override; double valueToProportionOfLength(double x) override; private: NormalisableRange* m_range = nullptr; }; class ParameterComponent : public Component, public Slider::Listener, public Button::Listener { public: ParameterComponent(AudioProcessorParameter* par, bool notifyOnlyOnRelease, bool useDrawableToggle=false); void resized() override; void sliderValueChanged(Slider* slid) override; void sliderDragStarted(Slider* slid) override; void sliderDragEnded(Slider* slid) override; void buttonClicked(Button* but) override; void updateComponent(); void setHighLighted(bool b); int m_group_id = -1; Slider* getSlider() const { return m_slider.get(); } DrawableButton* getDrawableButton() const { return m_drawtogglebut.get(); } ToggleButton* getToggleButton() const { return m_togglebut.get(); } private: Label m_label; AudioProcessorParameter* m_par = nullptr; std::unique_ptr m_slider; std::unique_ptr m_combobox; std::unique_ptr m_togglebut; std::unique_ptr m_drawtogglebut; bool m_notify_only_on_release = false; bool m_dragging = false; Colour m_labeldefcolor; }; class ParameterGroupComponent : public Component { public: ParameterGroupComponent(const String & name, int groupid, PaulstretchpluginAudioProcessor* proc, bool showtoggle=true); void resized() override; void paint(Graphics &g) override; //void addParameterComponent(std::unique_ptr pcomp); void addParameterComponent(ParameterComponent * pcomp); void replaceParameterComponent(ParameterComponent * oldcomp, ParameterComponent * newcomp); void updateParameterComponents(); void setBackgroundColor(Colour col) { m_bgcolor = col; } Colour getBackgroundColor() const { return m_bgcolor; } void setToggleEnabled(bool flag){ if (m_enableButton) m_enableButton->setToggleState(flag, dontSendNotification); } bool getToggleEnabled() const { if (m_enableButton) return m_enableButton->getToggleState(); return false; } String name; int groupId = -1; int getMinimumHeight(int forWidth); std::function EnabledChangedCallback; private: int doLayout(Rectangle bounds); // returns min height //uptrvec m_parcomps; std::vector m_parcomps; std::unique_ptr