#pragma once #include #include #include "../Resources.h" namespace serum { // =========================================================================== // Rotary knob — a juce::Slider styled by SerumLookAndFeel. 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); } juce::String getTextFromValue (double value) 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; }; } // namespace serum