The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
2.5KB

  1. #ifndef SIMPLEMETER_H_INCLUDED
  2. #define SIMPLEMETER_H_INCLUDED
  3. #include "../JuceLibraryCode/JuceHeader.h"
  4. // A very simple decaying meter.
  5. class SimpleMeter : public Component,
  6. private Timer
  7. {
  8. public:
  9. SimpleMeter()
  10. {
  11. startTimerHz (30);
  12. }
  13. //==============================================================================
  14. void paint (Graphics& g) override
  15. {
  16. g.fillAll(Colours::transparentBlack);
  17. auto area = g.getClipBounds();
  18. g.setColour (Colours::skyblue);
  19. g.fillRoundedRectangle(area.toFloat(), 6.0);
  20. auto unfilledHeight = area.getHeight() * (1.0 - level);
  21. g.reduceClipRegion (area.getX(), area.getY(),
  22. area.getWidth(), (int) unfilledHeight);
  23. g.setColour (Colours::grey);
  24. g.fillRoundedRectangle(area.toFloat(), 6.0);
  25. }
  26. void resized() override {}
  27. //==============================================================================
  28. // Called from the audio thread.
  29. void update (float newLevel)
  30. {
  31. // We don't care if maxLevel gets set to zero (in timerCallback) between the
  32. // load and the assignment.
  33. maxLevel = jmax (maxLevel.load(), newLevel);
  34. }
  35. private:
  36. //==============================================================================
  37. void timerCallback() override
  38. {
  39. auto callbackLevel = maxLevel.exchange (0.0);
  40. auto decayFactor = 0.95;
  41. if (callbackLevel > level)
  42. level = callbackLevel;
  43. else if (level > 0.001)
  44. level *= decayFactor;
  45. else
  46. level = 0;
  47. repaint();
  48. }
  49. std::atomic<float> maxLevel {0.0};
  50. float level = 0;
  51. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SimpleMeter)
  52. };
  53. #if JUCE_PROJUCER_LIVE_BUILD
  54. // Animate the meter in the Projucer live build.
  55. struct MockSimpleMeter : public Component,
  56. private Timer
  57. {
  58. MockSimpleMeter()
  59. {
  60. addAndMakeVisible (meter);
  61. resized();
  62. startTimerHz (100);
  63. }
  64. void paint (Graphics&) override {}
  65. void resized() override
  66. {
  67. meter.setBounds (getBounds());
  68. }
  69. void timerCallback() override
  70. {
  71. meter.update (std::pow (randomNumberGenerator.nextFloat(), 2));
  72. }
  73. SimpleMeter meter;
  74. Random randomNumberGenerator;
  75. };
  76. #endif
  77. #endif // SIMPLEMETER_H_INCLUDED