diff --git a/modules/foleys_gui_magic/Widgets/foleys_MagicLevelMeter.cpp b/modules/foleys_gui_magic/Widgets/foleys_MagicLevelMeter.cpp index c456d33b..b68330c0 100644 --- a/modules/foleys_gui_magic/Widgets/foleys_MagicLevelMeter.cpp +++ b/modules/foleys_gui_magic/Widgets/foleys_MagicLevelMeter.cpp @@ -45,18 +45,43 @@ MagicLevelMeter::MagicLevelMeter() setColour (outlineColourId, juce::Colours::silver); setColour (tickmarkColourId, juce::Colours::silver); + lookAndFeelChanged(); + startTimerHz (30); } void MagicLevelMeter::paint (juce::Graphics& g) { - if (auto* lnf = dynamic_cast<LookAndFeelMethods*>(&getLookAndFeel())) - { - lnf->drawLevelMeter (g, *this, source, getLocalBounds()); - return; - } + actualLookAndFeel->drawLevelMeter (g, *this, source, getLocalBounds()); +} + +void MagicLevelMeter::setLevelSource (MagicLevelSource* newSource) +{ + source = newSource; +} + +void MagicLevelMeter::timerCallback() +{ + repaint(); +} + +void MagicLevelMeter::lookAndFeelChanged() +{ + auto* lnf = dynamic_cast<LookAndFeelMethods*> (&getLookAndFeel()); + + if (lnf) + actualLookAndFeel = lnf; + else + actualLookAndFeel = &lookAndFeelFallback; + + repaint(); +} + +// ================================================================================ - const auto backgroundColour = findColour (backgroundColourId); +void MagicLevelMeter::LookAndFeelFallback::drawLevelMeter (juce::Graphics& g, MagicLevelMeter& meter, MagicLevelSource* source, juce::Rectangle<int> bounds) +{ + const auto backgroundColour = meter.findColour (backgroundColourId); if (!backgroundColour.isTransparent()) g.fillAll (backgroundColour); @@ -67,39 +92,29 @@ void MagicLevelMeter::paint (juce::Graphics& g) if (numChannels == 0) return; - auto bounds = getLocalBounds().reduced (3).toFloat(); + auto inner = bounds.reduced (3).toFloat(); - const auto width = bounds.getWidth() / numChannels; - const auto barBackgroundColour = findColour (barBackgroundColourId); - const auto barFillColour = findColour (barFillColourId); - const auto outlineColour = findColour (outlineColourId); + const auto width = inner.getWidth() / static_cast<float> (numChannels); + const auto barBackgroundColour = meter.findColour (barBackgroundColourId); + const auto barFillColour = meter.findColour (barFillColourId); + const auto outlineColour = meter.findColour (outlineColourId); const auto infinity = -100.0f; - for (int i=0; i < numChannels; ++i) + for (int i = 0; i < numChannels; ++i) { - auto bar = bounds.removeFromLeft (width).reduced (1); + auto bar = inner.removeFromLeft (width).reduced (1); g.setColour (barBackgroundColour); g.fillRect (bar); g.setColour (outlineColour); g.drawRect (bar, 1.0f); bar.reduce (1, 1); g.setColour (barFillColour); - g.fillRect (bar.withTop (juce::jmap (juce::Decibels::gainToDecibels (source->getRMSvalue (i), infinity), - infinity, 0.0f, bar.getBottom(), bar.getY()))); - g.drawHorizontalLine (juce::roundToInt (juce::jmap (juce::Decibels::gainToDecibels (source->getMaxValue (i), infinity), - infinity, 0.0f, bar.getBottom (), bar.getY ())), - static_cast<float>(bar.getX ()), static_cast<float>(bar.getRight ())); + g.fillRect (bar.withTop (juce::jmap (juce::Decibels::gainToDecibels (source->getRMSvalue (i), infinity), infinity, 0.0f, bar.getBottom(), bar.getY()))); + g.drawHorizontalLine (juce::roundToInt ( + juce::jmap (juce::Decibels::gainToDecibels (source->getMaxValue (i), infinity), infinity, 0.0f, bar.getBottom(), bar.getY())), + static_cast<float> (bar.getX()), static_cast<float> (bar.getRight())); } } -void MagicLevelMeter::setLevelSource (MagicLevelSource* newSource) -{ - source = newSource; -} - -void MagicLevelMeter::timerCallback() -{ - repaint(); -} -} // namespace foleys +} // namespace foleys diff --git a/modules/foleys_gui_magic/Widgets/foleys_MagicLevelMeter.h b/modules/foleys_gui_magic/Widgets/foleys_MagicLevelMeter.h index d45268bc..0c554f59 100644 --- a/modules/foleys_gui_magic/Widgets/foleys_MagicLevelMeter.h +++ b/modules/foleys_gui_magic/Widgets/foleys_MagicLevelMeter.h @@ -40,9 +40,10 @@ namespace foleys class MagicLevelSource; -class MagicLevelMeter : public juce::Component, - public juce::SettableTooltipClient, - private juce::Timer +class MagicLevelMeter + : public juce::Component + , public juce::SettableTooltipClient + , private juce::Timer { public: enum ColourIds @@ -56,11 +57,8 @@ class MagicLevelMeter : public juce::Component, struct LookAndFeelMethods { - virtual ~LookAndFeelMethods()=default; - virtual void drawLevelMeter (juce::Graphics& g, - MagicLevelMeter& meter, - MagicLevelSource* source, - juce::Rectangle<int> bounds) = 0; + virtual ~LookAndFeelMethods() = default; + virtual void drawLevelMeter (juce::Graphics& g, MagicLevelMeter& meter, MagicLevelSource* source, juce::Rectangle<int> bounds) = 0; }; MagicLevelMeter(); @@ -71,11 +69,23 @@ class MagicLevelMeter : public juce::Component, void timerCallback() override; + void lookAndFeelChanged() override; + private: juce::WeakReference<MagicLevelSource> source; + class LookAndFeelFallback : public LookAndFeel, public LookAndFeelMethods + { + public: + LookAndFeelFallback() = default; + void drawLevelMeter (juce::Graphics& g, MagicLevelMeter& meter, MagicLevelSource* source, juce::Rectangle<int> bounds) override; + }; + + LookAndFeelFallback lookAndFeelFallback; + LookAndFeelMethods* actualLookAndFeel = &lookAndFeelFallback; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MagicLevelMeter) }; -} // namespace foleys +} // namespace foleys