151 lines
4.8 KiB
C++
151 lines
4.8 KiB
C++
/*
|
|
==============================================================================
|
|
|
|
OPLLookAndFeel.cpp
|
|
Created: 10 Oct 2016 9:38:20pm
|
|
Author: bruce
|
|
|
|
==============================================================================
|
|
*/
|
|
|
|
#include "OPLLookAndFeel.h"
|
|
#include "PluginGui.h"
|
|
|
|
const Colour OPLLookAndFeel::DOS_GREEN = Colour(0xff007f00);
|
|
const Colour OPLLookAndFeel::DOS_GREEN_DARK = Colour(0xff003f00);
|
|
|
|
OPLLookAndFeel::OPLLookAndFeel()
|
|
{
|
|
toggleOff = ImageCache::getFromMemory(PluginGui::toggle_off_sq_png, PluginGui::toggle_off_sq_pngSize);
|
|
toggleOn = ImageCache::getFromMemory(PluginGui::toggle_on_sq_png, PluginGui::toggle_on_sq_pngSize);
|
|
toggleRect = Rectangle<float>((float)toggleOff.getWidth(), (float)toggleOn.getHeight());
|
|
|
|
// Prevents an ugly white border from being drawn around a component with keyboard focus.
|
|
setColour(TextEditor::ColourIds::focusedOutlineColourId, Colours::black);
|
|
setColour(Slider::ColourIds::textBoxOutlineColourId, DOS_GREEN);
|
|
|
|
setColour(TextButton::ColourIds::buttonColourId, DOS_GREEN);
|
|
setColour(TextButton::ColourIds::buttonOnColourId, DOS_GREEN);
|
|
setColour(TextButton::ColourIds::textColourOnId, Colours::black);
|
|
setColour(TextButton::ColourIds::textColourOffId, Colours::black);
|
|
|
|
setColour(ComboBox::ColourIds::focusedOutlineColourId, DOS_GREEN);
|
|
setColour(PopupMenu::ColourIds::backgroundColourId, Colours::black);
|
|
setColour(PopupMenu::ColourIds::textColourId, DOS_GREEN);
|
|
setColour(PopupMenu::ColourIds::highlightedBackgroundColourId, DOS_GREEN);
|
|
setColour(PopupMenu::ColourIds::highlightedTextColourId, Colours::black);
|
|
|
|
}
|
|
|
|
void OPLLookAndFeel::drawTickBox(Graphics &g,
|
|
Component &c,
|
|
float x,
|
|
float y,
|
|
float w,
|
|
float h,
|
|
bool ticked,
|
|
bool isEnabled,
|
|
bool isMouseOverButton,
|
|
bool isButtonDown
|
|
) {
|
|
g.drawImage(ticked ? toggleOn : toggleOff, toggleRect.withY(y + 2));
|
|
}
|
|
|
|
// From JuceLookAndFeel_V2
|
|
static Colour createBaseColour(Colour buttonColour,
|
|
bool hasKeyboardFocus,
|
|
bool isMouseOverButton,
|
|
bool isButtonDown) noexcept
|
|
{
|
|
const float sat = hasKeyboardFocus ? 1.3f : 0.9f;
|
|
const Colour baseColour(buttonColour.withMultipliedSaturation(sat));
|
|
|
|
if (isButtonDown) return baseColour.contrasting(0.2f);
|
|
if (isMouseOverButton) return baseColour.contrasting(0.1f);
|
|
|
|
return baseColour;
|
|
}
|
|
|
|
int OPLLookAndFeel::getSliderThumbRadius(Slider& s) {
|
|
return 10;
|
|
}
|
|
|
|
// Adapted rom JuceLookAndFeel_V2 - changed round thumb to plain filled rectangle and tweake size.
|
|
void OPLLookAndFeel::drawLinearSliderThumb(Graphics& g, int x, int y, int width, int height,
|
|
float sliderPos, float minSliderPos, float maxSliderPos,
|
|
const Slider::SliderStyle style, Slider& slider) {
|
|
|
|
const float sliderRadius = (float)(getSliderThumbRadius(slider));
|
|
|
|
Colour knobColour(createBaseColour(slider.findColour(Slider::thumbColourId),
|
|
slider.hasKeyboardFocus(false) && slider.isEnabled(),
|
|
slider.isMouseOverOrDragging() && slider.isEnabled(),
|
|
slider.isMouseButtonDown() && slider.isEnabled()));
|
|
|
|
if (style == Slider::LinearHorizontal || style == Slider::LinearVertical)
|
|
{
|
|
float kx, ky;
|
|
float sw, sh;
|
|
|
|
if (style == Slider::LinearVertical)
|
|
{
|
|
sw = sliderRadius * 2.0f;
|
|
sh = sliderRadius;
|
|
kx = x + width * 0.5f;
|
|
ky = sliderPos + sh * 0.5f;
|
|
}
|
|
else
|
|
{
|
|
sw = sliderRadius;
|
|
sh = sliderRadius * 2.0f;
|
|
kx = sliderPos + sw * 0.5f;
|
|
ky = y + height * 0.5f;
|
|
}
|
|
|
|
g.setColour(knobColour);
|
|
g.fillRect(kx - sliderRadius, ky - sliderRadius, sw, sh);
|
|
}
|
|
else
|
|
{
|
|
LookAndFeel_V2::drawLinearSliderThumb(g, x, y, width, height, sliderPos, minSliderPos, maxSliderPos, style, slider);
|
|
}
|
|
}
|
|
|
|
// Adapted from JuceLookAndFeel_V3 - replace rounded rectangles with regular ones.
|
|
void OPLLookAndFeel::drawLinearSliderBackground(Graphics& g, int x, int y, int width, int height,
|
|
float /*sliderPos*/,
|
|
float /*minSliderPos*/,
|
|
float /*maxSliderPos*/,
|
|
const Slider::SliderStyle /*style*/, Slider& slider)
|
|
{
|
|
const float sliderRadius = (float)(getSliderThumbRadius(slider) - -14);
|
|
|
|
const Colour trackColour(slider.findColour(Slider::trackColourId));
|
|
const Colour gradCol1(trackColour.overlaidWith(Colour(slider.isEnabled() ? 0x13000000 : 0x09000000)));
|
|
const Colour gradCol2(trackColour.overlaidWith(Colour(0x06000000)));
|
|
Path indent;
|
|
|
|
if (slider.isHorizontal())
|
|
{
|
|
const float iy = y + height * 0.5f - sliderRadius * 0.5f;
|
|
|
|
g.setGradientFill(ColourGradient(gradCol1, 0.0f, iy,
|
|
gradCol2, 0.0f, iy + sliderRadius, false));
|
|
|
|
indent.addRectangle(x - sliderRadius + 17, iy, width + sliderRadius - 10, sliderRadius);
|
|
}
|
|
else
|
|
{
|
|
const float ix = x + width * 0.5f - sliderRadius * 0.5f;
|
|
|
|
g.setGradientFill(ColourGradient(gradCol1, ix, 0.0f,
|
|
gradCol2, ix + sliderRadius, 0.0f, false));
|
|
|
|
indent.addRectangle(ix , y - 8, sliderRadius, height + 16);
|
|
}
|
|
|
|
g.fillPath(indent);
|
|
|
|
g.setColour(trackColour.contrasting(0.5f));
|
|
g.strokePath(indent, PathStrokeType(0.5f));
|
|
}
|