#pragma once #include #include "PluginProcessor.h" #include "LcdDisplay.h" #include "MenuSystem.h" #include "Presets.h" #include "SynthParams.h" class SM26AudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, private juce::Slider::Listener { public: SM26AudioProcessorEditor (SM26AudioProcessor&); ~SM26AudioProcessorEditor() override; void paint (juce::Graphics&) override; void resized() override; void timerCallback() override; private: void sliderValueChanged (juce::Slider*) override; void sliderDragStarted (juce::Slider*) override; void sliderDragEnded (juce::Slider*) override; void setupKnobs(); void setupNavButtons(); void buildRootMenu(); void updateLCD(); void cyclePreset (int delta); SM26AudioProcessor& proc; MenuSystem menu; class NavButtonLookAndFeel : public juce::LookAndFeel_V4 { public: juce::Font getTextButtonFont (juce::TextButton&, int) override; } navLookAndFeel; LcdDisplay lcd; bool knobDragging[4] = {}; juce::Slider knobSliders[4]; juce::Label knobLabels[4]; juce::Label knobValueLabels[4]; juce::TextButton navUp { "UP" }; juce::TextButton navDown { "DN" }; juce::TextButton navLeft { "LT" }; juce::TextButton navRight { "RT" }; juce::TextButton navEnter { "OK" }; juce::TextButton navEsc { "ESC" }; juce::Label footer; bool menuWasOpen = false; static juce::String buildGitFooter(); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SM26AudioProcessorEditor) };