#pragma once #include #include #include "../Resources.h" #include "KnobLookAndFeel.h" namespace serum { // =========================================================================== // Rotary knob — a juce::Slider drawn by KnobLookAndFeel. The knob paints its // own name below the dial, so no control is a bare arc whose only hint is a // tooltip. The value readout is formatted by a user-provided function via // getTextFromValue(). // // While the knob is being dragged it also shows a small floating label near the // mouse cursor with the live (formatted) value, giving immediate feedback // without changing the slider's normal behaviour. // =========================================================================== class Knob : public juce::Slider { public: explicit Knob (const juce::String& name, std::function formatter = {}); void setFormatter (std::function f) { formatter = std::move (f); } // Value a double click returns to. Call it with the parameter's own default // so the gesture restores the real default, never a hardcoded 0.5. void setDefaultValue (double v) { setDoubleClickReturnValue (true, v); } juce::String getTextFromValue (double value) override; void paint (juce::Graphics& g) override; void resized() override; void visibilityChanged() override; void mouseDown (const juce::MouseEvent& e) override; void mouseDrag (const juce::MouseEvent& e) override; void mouseUp (const juce::MouseEvent& e) override; void mouseExit (const juce::MouseEvent& e) override; private: void showValuePopup (const juce::MouseEvent& e); void hideValuePopup(); std::function formatter; std::unique_ptr valuePopup; juce::Rectangle textArea; // name strip under the dial }; } // namespace serum