quantumVERB  1.0.0
A FOSS convolution reverb plugin
LookAndFeel.cpp
1 /*
2  ==============================================================================
3 
4  LookAndFeel.cpp
5 
6  ==============================================================================
7 */
8 
9 #include "LookAndFeel.h"
10 
11 #include "Logger.h"
12 
13 #include "BinaryData.h"
14 
15 namespace reverb
16 {
17 
18  LookAndFeel::LookAndFeel()
19  {
20  setColour(juce::ResizableWindow::ColourIds::backgroundColourId, juce::Colour(0xff212121));
21 
22  setColour(juce::Slider::ColourIds::backgroundColourId, juce::Colour(0x00000000));
23  setColour(juce::Slider::ColourIds::rotarySliderOutlineColourId, juce::Colour(0xff141414));
24  setColour(juce::Slider::ColourIds::rotarySliderFillColourId, juce::Colour(0xff9a9a9a));
25  setColour(juce::Slider::ColourIds::trackColourId, juce::Colour(0xff0079c1));
26 
27  setColour(juce::ToggleButton::ColourIds::tickColourId, juce::Colour(0xff212121));
28  setColour(juce::ToggleButton::ColourIds::tickDisabledColourId, juce::Colour(0xffcccccc));
29 
30  setColour(juce::TextButton::ColourIds::buttonColourId, juce::Colour(0x00000000));
31  setColour(juce::TextButton::ColourIds::textColourOffId, juce::Colour(0xffffffff));
32  setColour(juce::TextButton::ColourIds::buttonOnColourId, juce::Colour(0xff03a9f4));
33  setColour(juce::TextButton::ColourIds::textColourOnId, juce::Colour(0xffffffff));
34 
35  setColour(juce::TextEditor::ColourIds::backgroundColourId, juce::Colour(0x00000000));
36  setColour(juce::TextEditor::ColourIds::focusedOutlineColourId, juce::Colour(0xff808080));
37  setColour(juce::TextEditor::ColourIds::highlightColourId, juce::Colour(0xff0079c1));
38  setColour(juce::TextEditor::ColourIds::highlightedTextColourId, juce::Colour(0xffffffff));
39  setColour(juce::TextEditor::ColourIds::outlineColourId, juce::Colour(0xff808080));
40  setColour(juce::TextEditor::ColourIds::shadowColourId, juce::Colour(0x00000000));
41  setColour(juce::TextEditor::ColourIds::textColourId, juce::Colour(0xffffffff));
42 
43 
44  }
45 
46  juce::Typeface::Ptr LookAndFeel::getTypefaceForFont(const juce::Font& font)
47  {
48  static auto ubuntuL = juce::Typeface::createSystemTypefaceFor(BinaryData::UbuntuLight_ttf,
49  BinaryData::UbuntuLight_ttfSize);
50 
51  static auto ubuntuB = juce::Typeface::createSystemTypefaceFor(BinaryData::UbuntuBold_ttf,
52  BinaryData::UbuntuBold_ttfSize);
53 
54  if (font.isBold())
55  {
56  return ubuntuB;
57  }
58  else
59  {
60  return ubuntuL;
61  }
62  }
63 
64  juce::Font LookAndFeel::getTextButtonFont(juce::TextButton&, int buttonHeight)
65  {
66  static juce::Font tmp(15.0f, juce::Font::bold);
67 
68  juce::Font font(getTypefaceForFont(tmp));
69 
70  font.setSizeAndStyle(std::min(15.0f, 0.6f * buttonHeight),
71  font.getStyleFlags(),
72  font.getHorizontalScale(),
73  font.getExtraKerningFactor());
74 
75  return font;
76  }
77 
78  juce::Font LookAndFeel::getLabelFont(juce::Label& label)
79  {
80  static juce::Font tmp;
81 
82  juce::Font font(getTypefaceForFont(tmp));
83 
84  font.setSizeAndStyle(std::min(16.0f, 0.9f * label.getHeight()),
85  font.getStyleFlags(),
86  font.getHorizontalScale(),
87  font.getExtraKerningFactor());
88 
89  return font;
90  }
91 
92  void LookAndFeel::drawRotarySlider(juce::Graphics& g, int x, int y, int width, int height, float sliderPosProportional, float rotaryStartAngle, float rotaryEndAngle, juce::Slider& slider)
93  {
94  constexpr float pi = juce::MathConstants<float>::pi;
95 
96  // Geometric values
97  juce::Rectangle<float> bounds = juce::Rectangle<int>(x, y, width, height).toFloat().reduced(10);
98 
99  float radius = std::min(bounds.getWidth(), bounds.getHeight()) / 2.0f;
100  float toAngle = rotaryStartAngle + sliderPosProportional * (rotaryEndAngle - rotaryStartAngle);
101  float lineW = std::min(8.0f, radius * 0.5f);
102  float arcRadius = radius - lineW * 0.5f;
103 
104  float knobRadius = arcRadius - lineW * 0.1f;
105  float knobPointerAngle = pi / 4.0f;
106 
107  float knobPointerHeight = radius - knobRadius + 1.0f;
108  juce::Point<float> knobPointerTip(bounds.getCentreX(),
109  bounds.getCentreY() - (knobPointerHeight + arcRadius));
110 
111  // Colours
112  juce::Colour arcInactive = slider.findColour(juce::Slider::rotarySliderOutlineColourId);
113  juce::Colour arcActive = slider.findColour(juce::Slider::trackColourId);
114  juce::Colour fillOuter = slider.findColour(juce::Slider::rotarySliderFillColourId);
115  juce::Colour fillInner = fillOuter.brighter();
116 
117  juce::ColourGradient fill(fillInner, bounds.getCentre(),
118  fillOuter, bounds.getTopLeft(),
119  true);
120 
121  auto arcStrokeType = juce::PathStrokeType(lineW,
122  juce::PathStrokeType::curved,
123  juce::PathStrokeType::EndCapStyle::butt);
124 
125  // Background arc
126  juce::Path backgroundArc;
127  backgroundArc.addCentredArc(bounds.getCentreX(), bounds.getCentreY(),
128  arcRadius, arcRadius,
129  0.0f,
130  rotaryStartAngle, rotaryEndAngle,
131  true);
132 
133  g.setColour(arcInactive);
134 
135  g.strokePath(backgroundArc, arcStrokeType);
136 
137  // Value arc
138  if (slider.isEnabled())
139  {
140  juce::Path valueArc;
141  valueArc.addCentredArc(bounds.getCentreX(),
142  bounds.getCentreY(),
143  arcRadius,
144  arcRadius,
145  0.0f,
146  rotaryStartAngle,
147  toAngle,
148  true);
149 
150  g.setColour(arcActive);
151  g.strokePath(valueArc, arcStrokeType);
152  }
153 
154  // Knob
155  juce::Path knob;
156  knob.addCentredArc(bounds.getCentreX(), bounds.getCentreY(),
157  knobRadius, knobRadius,
158  0.0f,
159  knobPointerAngle / 2.0f,
160  2 * pi - knobPointerAngle / 2.0f,
161  true);
162 
163  knob.lineTo(knobPointerTip);
164  knob.closeSubPath();
165 
166  knob.applyTransform(juce::AffineTransform::rotation(toAngle, bounds.getCentreX(), bounds.getCentreY()));
167 
168  g.setGradientFill(fill);
169  g.fillPath(knob);
170 
171  return void();
172  }
173 
174 }
float getParam(const juce::AudioProcessorValueTreeState &params, const juce::String &blockId) const
Internal method used to get (and check) a parameter&#39;s value.
Definition: Task.h:111