Compare commits

...

2 Commits

9 changed files with 691 additions and 123 deletions

View File

@ -6,6 +6,7 @@
#include "JuceLibraryCode/BinaryData.h"
namespace AXIOM {
class DesignSystem : public juce::LookAndFeel_V4 {
public:
@ -654,6 +655,7 @@ class PresetMenuButtonLookAndFeel : public juce::LookAndFeel_V4 {
const bool isToggled = button.getToggleState();
auto bounds = button.getLocalBounds().toFloat();
auto iconSize = juce::jmin(bounds.getWidth(), bounds.getHeight()) * 0.5f;
auto hoverFactor = isHovered ? 1.05f : 1.0f;
auto iconBounds = juce::Rectangle<float>(iconSize * hoverFactor, iconSize * hoverFactor)
@ -670,8 +672,6 @@ class PresetMenuButtonLookAndFeel : public juce::LookAndFeel_V4 {
juce::RectanglePlacement::centred, passiveIconOpacity);
}
}
private:
@ -679,6 +679,185 @@ class PresetMenuButtonLookAndFeel : public juce::LookAndFeel_V4 {
std::unique_ptr<juce::XmlElement> activeSvg;
};
class lowBandButtonLookAndFeel : public juce::LookAndFeel_V4 {
public:
lowBandButtonLookAndFeel()
{
lowBypassIcon = juce::XmlDocument::parse(BinaryData::bypass_icon_svg);
lowCutIcon = juce::XmlDocument::parse(BinaryData::low_cut_icon_svg);
lowBellIcon = juce::XmlDocument::parse(BinaryData::bell_icon_svg);
lowShelfIcon = juce::XmlDocument::parse(BinaryData::low_shelf_icon_svg);
}
void drawToggleButton(juce::Graphics& g, juce::ToggleButton& button,
bool shouldDrawButtonAsHighlighted,
bool shouldDrawButtonAsDown) override
{
bool isHovered = button.isMouseOverOrDragging();
bool isToggled = button.getToggleState();
bool isEnabled = button.isEnabled();
auto bounds = button.getLocalBounds().toFloat();
auto iconSize = juce::jmin(bounds.getWidth(), bounds.getHeight()) * 0.5f;
auto hoverFactor = isHovered ? 1.05f : 1.0f;
auto iconBounds = juce::Rectangle<float>(iconSize * hoverFactor, iconSize * hoverFactor)
.withCentre(bounds.getCentre());
float bypassOpacity = 1.0f;
if (lowBypassIcon != nullptr && lowCutIcon != nullptr && lowBellIcon != nullptr && lowShelfIcon != nullptr) {
// WICHTIG: Erstelle für jeden Frame ein NEUES Drawable!
auto bypassIcon = juce::Drawable::createFromSVG(*lowBypassIcon);
auto cutIcon = juce::Drawable::createFromSVG(*lowCutIcon);
auto bellIcon = juce::Drawable::createFromSVG(*lowBellIcon);
auto shelfIcon = juce::Drawable::createFromSVG(*lowShelfIcon);
if (bypassIcon != nullptr && cutIcon != nullptr && bellIcon != nullptr && shelfIcon != nullptr)
{
juce::Colour colour;
if (!isEnabled) {
colour = isToggled ? Colours::ACCENTWEAKCOLOUR : Colours::SURFACEBYPASS;
}
else if (isHovered) {
colour = isToggled ? Colours::ACCENTHOVER : Colours::SURFACEHOVER;
} else {
colour = isToggled
? Colours::ACCENTCOLOUR
: Colours::SURFACECOLOUR;
}
// Icon zeichnen
if (button.getName() == "LowBypass") {
bypassIcon->replaceColour(juce::Colours::black, colour);
bypassIcon->drawWithin(g, iconBounds,
juce::RectanglePlacement::centred, bypassOpacity);
}
else if (button.getName() == "LowCut") {
cutIcon->replaceColour(juce::Colours::black, colour);
cutIcon->drawWithin(g, iconBounds,
juce::RectanglePlacement::centred, bypassOpacity);
}
else if (button.getName() == "LowBell") {
bellIcon->replaceColour(juce::Colours::black, colour);
bellIcon->drawWithin(g, iconBounds,
juce::RectanglePlacement::centred, bypassOpacity);
}
else if (button.getName() == "LowShelf") {
shelfIcon->replaceColour(juce::Colours::black, colour);
shelfIcon->drawWithin(g, iconBounds,
juce::RectanglePlacement::centred, bypassOpacity);
}
}
}
}
private:
std::unique_ptr<juce::XmlElement> lowBypassIcon;
std::unique_ptr<juce::XmlElement> lowCutIcon;
std::unique_ptr<juce::XmlElement> lowBellIcon;
std::unique_ptr<juce::XmlElement> lowShelfIcon;
};
class highBandButtonLookAndFeel : public juce::LookAndFeel_V4 {
public:
highBandButtonLookAndFeel()
{
highBypassIcon = juce::XmlDocument::parse(BinaryData::bypass_icon_svg);
highCutIcon = juce::XmlDocument::parse(BinaryData::high_cut_icon_svg);
highBellIcon = juce::XmlDocument::parse(BinaryData::bell_icon_svg);
highShelfIcon = juce::XmlDocument::parse(BinaryData::high_shelf_icon_svg);
}
void drawToggleButton(juce::Graphics& g, juce::ToggleButton& button,
bool shouldDrawButtonAsHighlighted,
bool shouldDrawButtonAsDown) override
{
bool isHovered = button.isMouseOverOrDragging();
bool isToggled = button.getToggleState();
bool isEnabled = button.isEnabled();
auto bounds = button.getLocalBounds().toFloat();
auto iconSize = juce::jmin(bounds.getWidth(), bounds.getHeight()) * 0.5f;
auto hoverFactor = isHovered ? 1.05f : 1.0f;
auto iconBounds = juce::Rectangle<float>(iconSize * hoverFactor, iconSize * hoverFactor)
.withCentre(bounds.getCentre());
float bypassOpacity = 1.0f;
if (highBypassIcon != nullptr && highCutIcon != nullptr && highBellIcon != nullptr && highShelfIcon != nullptr) {
// WICHTIG: Erstelle für jeden Frame ein NEUES Drawable!
auto bypassIcon = juce::Drawable::createFromSVG(*highBypassIcon);
auto cutIcon = juce::Drawable::createFromSVG(*highCutIcon);
auto bellIcon = juce::Drawable::createFromSVG(*highBellIcon);
auto shelfIcon = juce::Drawable::createFromSVG(*highShelfIcon);
if (bypassIcon != nullptr && cutIcon != nullptr && bellIcon != nullptr && shelfIcon != nullptr)
{
juce::Colour colour;
if (!isEnabled) {
colour = isToggled ? Colours::ACCENTWEAKCOLOUR : Colours::SURFACEBYPASS;
}
else if (isHovered) {
colour = isToggled ? Colours::ACCENTHOVER : Colours::SURFACEHOVER;
} else {
colour = isToggled
? Colours::ACCENTCOLOUR
: Colours::SURFACECOLOUR;
}
// Icon zeichnen
if (button.getName() == "HighBypass") {
bypassIcon->replaceColour(juce::Colours::black, colour);
bypassIcon->drawWithin(g, iconBounds,
juce::RectanglePlacement::centred, bypassOpacity);
}
else if (button.getName() == "HighCut") {
cutIcon->replaceColour(juce::Colours::black, colour);
cutIcon->drawWithin(g, iconBounds,
juce::RectanglePlacement::centred, bypassOpacity);
}
else if (button.getName() == "HighBell") {
bellIcon->replaceColour(juce::Colours::black, colour);
bellIcon->drawWithin(g, iconBounds,
juce::RectanglePlacement::centred, bypassOpacity);
}
else if (button.getName() == "HighShelf") {
shelfIcon->replaceColour(juce::Colours::black, colour);
shelfIcon->drawWithin(g, iconBounds,
juce::RectanglePlacement::centred, bypassOpacity);
}
}
}
}
private:
std::unique_ptr<juce::XmlElement> highBypassIcon;
std::unique_ptr<juce::XmlElement> highCutIcon;
std::unique_ptr<juce::XmlElement> highBellIcon;
std::unique_ptr<juce::XmlElement> highShelfIcon;
};
struct ButtonStyles {
};
@ -692,11 +871,10 @@ class PresetMenuButtonLookAndFeel : public juce::LookAndFeel_V4 {
label->setColour(juce::Label::backgroundColourId, juce::Colours::transparentBlack);
label->setColour(juce::Label::outlineColourId, juce::Colours::transparentBlack);
label->setColour(juce::Label::textColourId, juce::Colours::white);
label->setColour(juce::Label::textColourId, Colours::FOREGROUNDCOLOUR);
label->setJustificationType(juce::Justification::centred);
label->setInterceptsMouseClicks (false, false);
Typography::applyToLabel(*label, Typography::Style::Mono, 1.f);
return label;
}
juce::Slider::SliderLayout getSliderLayout (juce::Slider& slider) override
@ -741,8 +919,6 @@ class PresetMenuButtonLookAndFeel : public juce::LookAndFeel_V4 {
g.setColour(Colours::ACCENTCOLOUR);
g.fillPath(p);
//TODO: ON BYPASS SET TO RING TO SURFACEHOVER, ACCENT TO WEAKACCENTHOVER
}
};
class GainSliderLookAndFeel : public BaseSliderLookAndFeel
@ -845,6 +1021,103 @@ class PresetMenuButtonLookAndFeel : public juce::LookAndFeel_V4 {
g.fillPath(p);
}
};
class SlopeSliderLookAndFeel : public BaseSliderLookAndFeel {
public:
static constexpr float labelPadding = 20.0f;
juce::Slider::SliderLayout getSliderLayout(juce::Slider& slider) override
{
juce::Slider::SliderLayout layout;
auto bounds = slider.getLocalBounds();
// TextBox in der Mitte (wie bei BaseSliderLookAndFeel)
layout.textBoxBounds = juce::Rectangle<int>(
bounds.getCentreX() - bounds.getWidth() / 2,
bounds.getCentreY() - bounds.getHeight() / 2,
bounds.getWidth(),
bounds.getHeight()
);
// HIER IST DER TRICK: Knob-Bereich kleiner als Slider-Bounds!
// So bleibt Platz für die Labels außerhalb
layout.sliderBounds = bounds.reduced(labelPadding);
return layout;
}
void drawRotarySlider(juce::Graphics& g, int x, int y, int width, int height,
float sliderPos, float rotaryStartAngle, float rotaryEndAngle,
juce::Slider& slider) override
{
// Basis-Implementation - wird in Subklassen überschrieben
auto radius = juce::jmin(width / 2, height / 2) - 4.0f;
auto centreX = x + width * 0.5f;
auto centreY = y + height * 0.5f;
auto angle = rotaryStartAngle + sliderPos * (rotaryEndAngle - rotaryStartAngle);
bool isEnabled = slider.isEnabled();
bool isHovered = slider.isMouseOverOrDragging();
// Outer ring
g.setColour(Colours::BACKGROUNDCOLOUR);
g.fillEllipse(centreX - radius, centreY - radius, radius * 2.0f, radius * 2.0f);
juce::Colour accentCol = isEnabled ? Colours::ACCENTCOLOUR : Colours::ACCENTWEAKCOLOUR;
// Indicator
juce::Path p;
auto pointerLength = radius * 0.6f;
auto pointerThickness = 2.0f;
p.addRectangle(-pointerThickness * 0.5f, -radius, pointerThickness, pointerLength);
p.applyTransform(juce::AffineTransform::rotation(angle).translated(centreX, centreY));
g.setColour(accentCol);
g.fillPath(p);
// Dann zeichne die Labels
const auto bounds = juce::Rectangle<int>(x, y, width, height);
const auto centre = bounds.getCentre().toFloat();
const float textRadius = std::min(width, height) * 0.5f + 5.0f;
const juce::StringArray labels = {"12", "24", "36", "48"};
g.setFont(12.0f);
auto value = slider.getValue();
for (int i = 0; i < labels.size(); ++i)
{
const double labelVal = labels[i].getDoubleValue(); // "12" -> 12.0 usw.
const bool isMatch = value == i; // Toleranz: 0.5
juce::Colour colour;
if (!isEnabled) {
colour = isMatch ? Colours::ACCENTWEAKCOLOUR : Colours::FOREGROUNDCOLOUR.withMultipliedAlpha (0.4f);
}
else {
colour = isMatch
? Colours::ACCENTCOLOUR
: Colours::FOREGROUNDCOLOUR;
}
g.setColour(colour);
const double position = (double)i / 3.0;
const float ang = rotaryStartAngle + position * (rotaryEndAngle - rotaryStartAngle);
juce::Point<float> pos(
centre.x + textRadius * std::cos(ang - juce::MathConstants<float>::halfPi),
centre.y + textRadius * std::sin(ang - juce::MathConstants<float>::halfPi)
);
juce::Rectangle<float> textRect(30.0f, 16.0f);
textRect.setCentre(pos);
g.drawText(labels[i], textRect, juce::Justification::centred);
}
}
};
class GlobalSliderLookAndFeel : public BaseSliderLookAndFeel
{
public:

View File

@ -164,6 +164,11 @@
<None Include="..\..\Resources\Fonts\Orbitron-Bold.ttf"/>
<None Include="..\..\Resources\Fonts\Orbitron-Regular.ttf"/>
<None Include="..\..\Resources\Fonts\Roboto-Regular.ttf"/>
<None Include="..\..\Resources\Icons\bell_icon.svg"/>
<None Include="..\..\Resources\Icons\high_cut_icon.svg"/>
<None Include="..\..\Resources\Icons\high_shelf_icon.svg"/>
<None Include="..\..\Resources\Icons\low_cut_icon.svg"/>
<None Include="..\..\Resources\Icons\low_shelf_icon.svg"/>
<None Include="..\..\Resources\Icons\preset_menu_icon.svg"/>
<None Include="..\..\Resources\Icons\crystalize_button_active_icon.svg"/>
<None Include="..\..\Resources\Icons\crystalize_button_passive_icon.svg"/>

View File

@ -74,6 +74,21 @@
<None Include="..\..\Resources\Fonts\Roboto-Regular.ttf">
<Filter>CrystalizerEQ\Resources\Fonts</Filter>
</None>
<None Include="..\..\Resources\Icons\bell_icon.svg">
<Filter>CrystalizerEQ\Resources\Icons</Filter>
</None>
<None Include="..\..\Resources\Icons\high_cut_icon.svg">
<Filter>CrystalizerEQ\Resources\Icons</Filter>
</None>
<None Include="..\..\Resources\Icons\high_shelf_icon.svg">
<Filter>CrystalizerEQ\Resources\Icons</Filter>
</None>
<None Include="..\..\Resources\Icons\low_cut_icon.svg">
<Filter>CrystalizerEQ\Resources\Icons</Filter>
</None>
<None Include="..\..\Resources\Icons\low_shelf_icon.svg">
<Filter>CrystalizerEQ\Resources\Icons</Filter>
</None>
<None Include="..\..\Resources\Icons\preset_menu_icon.svg">
<Filter>CrystalizerEQ\Resources\Icons</Filter>
</None>

View File

@ -21,6 +21,15 @@
file="Resources/Fonts/Roboto-Regular.ttf"/>
</GROUP>
<GROUP id="{3DCFA257-AECE-2625-016F-D02D71FFA24B}" name="Icons">
<FILE id="waE621" name="bell_icon.svg" compile="0" resource="1" file="Resources/Icons/bell_icon.svg"/>
<FILE id="KOfMYl" name="high_cut_icon.svg" compile="0" resource="1"
file="Resources/Icons/high_cut_icon.svg"/>
<FILE id="zBKRpK" name="high_shelf_icon.svg" compile="0" resource="1"
file="Resources/Icons/high_shelf_icon.svg"/>
<FILE id="RZcm3s" name="low_cut_icon.svg" compile="0" resource="1"
file="Resources/Icons/low_cut_icon.svg"/>
<FILE id="SE1ZID" name="low_shelf_icon.svg" compile="0" resource="1"
file="Resources/Icons/low_shelf_icon.svg"/>
<FILE id="MWCD1t" name="preset_menu_icon.svg" compile="0" resource="1"
file="Resources/Icons/preset_menu_icon.svg"/>
<FILE id="cp2JDP" name="crystalize_button_active_icon.svg" compile="0"

View File

@ -11413,111 +11413,233 @@ static const unsigned char temp_binary_data_6[] =
const char* RobotoRegular_ttf = (const char*) temp_binary_data_6;
//================== preset_menu_icon.svg ==================
//================== bell_icon.svg ==================
static const unsigned char temp_binary_data_7[] =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<svg id=\"Ebene_1\" data-name=\"Ebene 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 28 12.02\">\n"
" <path fill=\"black\" d=\"M0,8.02h4.82c.75,0,1.45-.34,1.92-.92L11.42,1.24c1.32-1.65,3.84-1.65,5.16,0l4.68,5.86c.47.58,1.17.92,1.92.92h4.82v4h-4.82c-.75,0-1.45-.34-1.92-.92l-5.73-7.16c-.79-.98-2.28-.98-3.07,0l-5.73,7.16c-.47.58-1.17.92-1.92.92H0s0-4,"
"0-4Z\"/>\n"
"</svg>";
const char* bell_icon_svg = (const char*) temp_binary_data_7;
//================== high_cut_icon.svg ==================
static const unsigned char temp_binary_data_8[] =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<svg id=\"Ebene_1\" data-name=\"Ebene 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n"
" <path fill=\"black\" d=\"M24,23.02V4C24,1.79,22.21,0,20,0H.98C.44,0,0,.44,0,.98v2.03c0,.54.44.98.98.98h17.02c1.2,0,2,.8,2,2v17.02c0,.54.44.98.98.98h2.05c.54,0,.98-.44.98-.98Z\"/>\n"
"</svg>";
const char* high_cut_icon_svg = (const char*) temp_binary_data_8;
//================== high_shelf_icon.svg ==================
static const unsigned char temp_binary_data_9[] =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<svg id=\"Ebene_1\" data-name=\"Ebene 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 28 12\">\n"
" <path fill=\"black\" d=\"M11.23,6.39l5.62-4.77c1.23-1.04,2.79-1.61,4.4-1.61h6.04c.4,0,.72.32.72.72v2.56c0,.4-.32.72-.72.72h-6.08c-1.62,0-3.18.58-4.41,1.63l-5.56,4.75c-1.23,1.05-2.79,1.63-4.41,1.63H.72c-.4,0-.72-.32-.72-.72v-2.56c0-.4.32-.72.72-.72h"
"6.12c1.61,0,3.17-.57,4.4-1.61Z\"/>\n"
"</svg>";
const char* high_shelf_icon_svg = (const char*) temp_binary_data_9;
//================== low_cut_icon.svg ==================
static const unsigned char temp_binary_data_10[] =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<svg id=\"Ebene_1\" data-name=\"Ebene 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n"
" <path fill=\"black\" d=\"M0,23.02V4C0,1.79,1.79,0,4,0h19.02c.54,0,.98.44.98.98v2.03c0,.54-.44.98-.98.98H6c-1.2,0-2,.8-2,2v17.02c0,.54-.44.98-.98.98H.98c-.54,0-.98-.44-.98-.98Z\"/>\n"
"</svg>";
const char* low_cut_icon_svg = (const char*) temp_binary_data_10;
//================== low_shelf_icon.svg ==================
static const unsigned char temp_binary_data_11[] =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<svg id=\"Ebene_1\" data-name=\"Ebene 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 28 12\">\n"
" <path fill=\"black\" d=\"M16.77,6.39L11.15,1.61C9.92.57,8.36,0,6.75,0H.72C.32,0,0,.32,0,.72v2.56c0,.4.32.72.72.72h6.08c1.62,0,3.18.58,4.41,1.63l5.56,4.75c1.23,1.05,2.79,1.63,4.41,1.63h6.11c.4,0,.72-.32.72-.72v-2.56c0-.4-.32-.72-.72-.72h-6.12c-1.61,"
"0-3.17-.57-4.4-1.61Z\"/>\n"
"</svg>";
const char* low_shelf_icon_svg = (const char*) temp_binary_data_11;
//================== preset_menu_icon.svg ==================
static const unsigned char temp_binary_data_12[] =
"<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 30 30\" width=\"60px\" height=\"60px\"><path d=\"M 3 7 A 1.0001 1.0001 0 1 0 3 9 L 27 9 A 1.0001 1.0001 0 1 0 27 7 L 3 7 z M 3 14 A 1.0001 1.0001 0 1 0 3 16 L 27 16 A 1.0001 1.0001 0 1 0 27 14 "
"L 3 14 z M 3 21 A 1.0001 1.0001 0 1 0 3 23 L 27 23 A 1.0001 1.0001 0 1 0 27 21 L 3 21 z\" fill=\"black\"/></svg>";
const char* preset_menu_icon_svg = (const char*) temp_binary_data_7;
const char* preset_menu_icon_svg = (const char*) temp_binary_data_12;
//================== crystalize_button_active_icon.svg ==================
static const unsigned char temp_binary_data_8[] =
static const unsigned char temp_binary_data_13[] =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 80 32.45\">\n"
" <defs>\n"
" <linearGradient id=\"Unbenannter_Verlauf_16\" data-name=\"Unbenannter Verlauf 16\" x1=\"8.69\" y1=\"31.46\" x2=\"70.94\" y2=\"1.29\" gradientUnits=\"userSpaceOnUse\">\n"
" <stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\".1\"/>\n"
" <stop offset=\".48\" stop-color=\"#fff\" stop-opacity=\".3\"/>\n"
" <stop offset=\"1\" stop-color=\"#fff\" stop-opacity=\".5\"/>\n"
" </linearGradient>\n"
" </defs>\n"
" <g id=\"Ebene_2\" data-name=\"Ebene 2\">\n"
" <rect x=\"8\" y=\".22\" width=\"64\" height=\"32\" rx=\"5.96\" ry=\"5.96\" fill=\"#3db7b7\"/>\n"
" <rect x=\"8\" y=\".22\" width=\"64\" height=\"32\" rx=\"5.96\" ry=\"5.96\" fill=\"#56feff\"/>\n"
"<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 32\">\n"
" <g id=\"Ebene_6\" data-name=\"Ebene 6\">\n"
" <rect x=\"0\" y=\"0\" width=\"64\" height=\"32\" fill=\"#171a1a\"/>\n"
" <polygon points=\"0 32 2 30 32 16 62 2 64 0 64 32 0 32\" fill=\"#262b2b\"/>\n"
" </g>\n"
" <g id=\"Ebene_1\" data-name=\"Ebene 1\">\n"
" <g id=\"Ebene_2\" data-name=\"Ebene 2\">\n"
" <rect x=\"2\" y=\"2\" width=\"60\" height=\"28\" fill=\"#3db7b7\"/>\n"
" <rect x=\"2\" y=\"2\" width=\"60\" height=\"28\" fill=\"#56feff\"/>\n"
" </g>\n"
" <g id=\"Ebene_7\" data-name=\"Ebene 7\">\n"
" <g>\n"
" <path d=\"M11.73,19.11c-.18,0-.34-.04-.48-.13-.15-.09-.26-.2-.35-.35-.09-.15-.13-.31-.13-.48v-3.84c0-.18.04-.34.13-.48.08-.15.2-.26.35-.35.15-.09.31-.13.48-.13h4.78v.65h-4.78c-.09,0-.16.03-.22.09s-.09.13-.09.22v3.84c0,.09.03.16.09.22.06.06.13.0"
"9.22.09h4.78v.65h-4.78Z\" fill=\"#fff\"/>\n"
" <path d=\"M17.34,19.11v-5.75h4.8c.18,0,.34.04.48.13s.26.2.35.35c.08.14.13.3.13.48v1.69c0,.18-.04.34-.13.48-.09.14-.2.26-.35.35s-.31.13-.48.13h-4.15v2.14h-.65ZM18.3,16.31h3.84c.08,0,.16-.03.22-.09.06-.06.09-.13.09-.22v-1.69c0-.09-.03-.16-.09-.22"
"s-.13-.09-.22-.09h-3.84c-.09,0-.16.03-.22.09s-.09.13-.09.22v1.69c0,.09.03.16.09.22.06.06.13.09.22.09ZM22.21,19.11l-1.88-2.24h.85l1.89,2.23h0s-.86,0-.86,0Z\" fill=\"#fff\"/>\n"
" <path d=\"M26.4,19.11v-2.17l-2.65-3.59h.74l2.23,2.82,2.21-2.82h.76l-2.65,3.59v2.17h-.65Z\" fill=\"#fff\"/>\n"
" <path d=\"M31.03,19.11c-.18,0-.34-.04-.48-.13s-.26-.2-.35-.35c-.09-.15-.13-.31-.13-.48v-.22h.65v.22c0,.09.03.16.09.22.06.06.13.09.22.09h3.84c.08,0,.16-.03.22-.09.06-.06.09-.13.09-.22v-1.29c0-.08-.03-.16-.09-.22-.06-.06-.13-.09-.22-.09h-3.84c-.1"
"8,0-.34-.04-.48-.13s-.26-.2-.35-.35c-.09-.14-.13-.3-.13-.48v-1.29c0-.18.04-.34.13-.48.08-.15.2-.26.35-.35s.31-.13.48-.13h3.84c.18,0,.34.04.48.13.15.09.26.2.35.35.08.15.13.31.13.48v.22h-.65v-.22c0-.09-.03-.16-.09-.22-.06-.06-.13-.09-.22-.09h-3.84c-.09"
",0-.16.03-.22.09-.06.06-.09.13-.09.22v1.29c0,.09.03.16.09.22s.13.09.22.09h3.84c.18,0,.34.04.48.13.15.09.26.2.35.35.08.14.13.3.13.48v1.29c0,.18-.04.34-.13.48-.09.15-.2.26-.35.35-.15.09-.31.13-.48.13h-3.84Z\" fill=\"#fff\"/>\n"
" <path d=\"M38.96,19.11v-5.11h-2.56v-.65h5.76v.65h-2.55v5.11h-.65Z\" fill=\"#fff\"/>\n"
" <path d=\"M42.78,14.31c0-.18.04-.34.13-.48.09-.15.2-.26.35-.35.15-.09.31-.13.48-.13h3.84c.18,0,.34.04.48.13s.26.2.35.35c.09.15.13.31.13.48v4.8h-.65v-2.1h-4.46v2.1h-.65v-4.8ZM47.89,16.36v-2.05c0-.09-.03-.16-.09-.22-.06-.06-.13-.09-.22-.09h-3.84c"
"-.08,0-.16.03-.22.09-.06.06-.09.13-.09.22v2.05h4.46Z\" fill=\"#fff\"/>\n"
" <path d=\"M49.46,19.11v-5.77h.65v5.12h5.11v.65h-5.76Z\" fill=\"#fff\"/>\n"
" <path d=\"M55.76,19.11v-5.76h.66v5.76h-.66Z\" fill=\"#fff\"/>\n"
" <path d=\"M57.35,19.11v-.89l5.02-4.22h-5.02v-.65h5.76v.89l-5.02,4.22h5.02v.65h-5.76Z\" fill=\"#fff\"/>\n"
" <path d=\"M63.98,19.11v-5.76h5.26v.65h-4.61v1.9h3.7v.66h-3.7v1.9h4.61v.65h-5.26Z\" fill=\"#fff\"/>\n"
" <path d=\"M12.39,18c-.12,0-.23-.03-.34-.09-.1-.06-.18-.14-.24-.24-.06-.1-.09-.21-.09-.34v-2.66c0-.12.03-.23.09-.34.06-.1.14-.18.24-.24.1-.06.21-.09.34-.09h3.32v.45h-3.32c-.06,0-.11.02-.15.06s-.06.09-.06.15v2.66c0,.06.02.11.06.15.04.04.09.06.15."
"06h3.32v.45h-3.32Z\" fill=\"#fff\"/>\n"
" <path d=\"M16.29,18v-3.99h3.33c.12,0,.23.03.34.09s.18.14.24.24c.06.1.09.21.09.33v1.17c0,.12-.03.23-.09.33-.06.1-.14.18-.24.24s-.21.09-.34.09h-2.88v1.49h-.45ZM16.95,16.06h2.66c.06,0,.11-.02.15-.06.04-.04.06-.09.06-.15v-1.17c0-.06-.02-.11-.06-.15"
"s-.09-.06-.15-.06h-2.66c-.06,0-.11.02-.15.06s-.06.09-.06.15v1.17c0,.06.02.11.06.15.04.04.09.06.15.06ZM19.66,18l-1.3-1.55h.59l1.31,1.55h0s-.59,0-.59,0Z\" fill=\"#fff\"/>\n"
" <path d=\"M22.57,18v-1.5l-1.84-2.49h.52l1.55,1.95,1.53-1.95h.53l-1.84,2.49v1.5h-.45Z\" fill=\"#fff\"/>\n"
" <path d=\"M25.78,18c-.12,0-.23-.03-.34-.09s-.18-.14-.24-.24c-.06-.1-.09-.21-.09-.34v-.16h.45v.16c0,.06.02.11.06.15.04.04.09.06.15.06h2.66c.06,0,.11-.02.15-.06.04-.04.06-.09.06-.15v-.89c0-.06-.02-.11-.06-.15-.04-.04-.09-.06-.15-.06h-2.66c-.12,0-"
".23-.03-.34-.09s-.18-.14-.24-.24c-.06-.1-.09-.21-.09-.33v-.89c0-.12.03-.23.09-.34.06-.1.14-.18.24-.24s.21-.09.34-.09h2.66c.12,0,.23.03.34.09.1.06.18.14.24.24.06.1.09.21.09.34v.16h-.45v-.16c0-.06-.02-.11-.06-.15-.04-.04-.09-.06-.15-.06h-2.66c-.06,0-.1"
"1.02-.15.06-.04.04-.06.09-.06.15v.89c0,.06.02.11.06.15s.09.06.15.06h2.66c.12,0,.23.03.34.09.1.06.18.14.24.24.06.1.09.21.09.33v.89c0,.12-.03.23-.09.34-.06.1-.14.18-.24.24-.1.06-.21.09-.34.09h-2.66Z\" fill=\"#fff\"/>\n"
" <path d=\"M31.28,18v-3.54h-1.77v-.45h3.99v.45h-1.77v3.54h-.45Z\" fill=\"#fff\"/>\n"
" <path d=\"M33.92,14.67c0-.12.03-.23.09-.34.06-.1.14-.18.24-.24.1-.06.21-.09.34-.09h2.66c.12,0,.23.03.34.09s.18.14.24.24c.06.1.09.21.09.34v3.33h-.45v-1.46h-3.1v1.46h-.45v-3.33ZM37.47,16.09v-1.42c0-.06-.02-.11-.06-.15-.04-.04-.09-.06-.15-.06h-2.6"
"6c-.06,0-.11.02-.15.06-.04.04-.06.09-.06.15v1.42h3.1Z\" fill=\"#fff\"/>\n"
" <path d=\"M38.56,18v-4h.45v3.55h3.55v.45h-3.99Z\" fill=\"#fff\"/>\n"
" <path d=\"M42.93,18v-3.99h.45v3.99h-.45Z\" fill=\"#fff\"/>\n"
" <path d=\"M44.03,18v-.62l3.48-2.93h-3.48v-.45h3.99v.62l-3.48,2.93h3.48v.45h-3.99Z\" fill=\"#fff\"/>\n"
" <path d=\"M48.63,18v-3.99h3.64v.45h-3.2v1.32h2.57v.46h-2.57v1.32h3.2v.45h-3.64Z\" fill=\"#fff\"/>\n"
" </g>\n"
" </g>\n"
" <g id=\"Ebene_3_Kopie_Kopie_Kopie\" data-name=\"Ebene 3 Kopie Kopie Kopie\">\n"
" <path d=\"M56,24.22l8-4,8,4h-16ZM48,20.22h16l-8-4-8,4ZM72,12.22v-4l-8,4h8ZM72,16.22l-8-4-8,4h16ZM69.61,1.42l-5.61,2.81h7.66c-.39-1.13-1.12-2.1-2.05-2.81ZM72,8.22l-8-4-8,4h16ZM48,12.22h16l-8-4-8,4ZM56,.22l-8,4h16L56,.22ZM48,28.22h16l-8-4-8,4ZM72,2"
"0.22v-4l-8,4h8ZM56,24.22l-8-4-8,4h16ZM40,8.22l-8,4h16l-8-4ZM32,12.22l-8,4h16l-8-4ZM40,16.22l-8,4h16l-8-4ZM32,20.22l-8,4h16l-8-4ZM71.66,28.22c.21-.61.34-1.27.34-1.96v-2.04l-8,4h7.66ZM56,16.22l-8-4-8,4h16ZM32,28.22h16l-8-4-8,4ZM56,8.22l-8-4-8,4h16ZM8,2"
"0.22h8l-8-4v4ZM24,32.22h16l-8-4-8,4ZM24,24.22l-8,4h16l-8-4ZM8,12.22h8l-8-4v4ZM16,20.22l-8,4h16l-8-4ZM10.39,31.03c1,.75,2.23,1.19,3.57,1.19h10.04l-8-4-5.61,2.81ZM64,28.22l-8,4h10.04c1.34,0,2.57-.45,3.57-1.19l-5.61-2.81ZM8.34,4.22h7.66l-5.61-2.81c-.94."
"7-1.66,1.68-2.05,2.81ZM40,32.22h16l-8-4-8,4ZM8,26.27c0,.69.12,1.34.34,1.96h7.66l-8-4v2.04ZM40,.22l-8,4h16L40,.22ZM16,4.22l-8,4h16l-8-4ZM24,8.22l-8,4h16l-8-4ZM40,8.22l-8-4-8,4h16ZM16,12.22l-8,4h16l-8-4ZM24,.22l-8,4h16L24,.22ZM24,16.22l-8,4h16l-8-4Z\" "
"fill=\"url(#Unbenannter_Verlauf_16)\"/>\n"
" <g id=\"Ebene_3_Kopie\" data-name=\"Ebene 3 Kopie\">\n"
" <rect x=\"8\" y=\"8\" width=\"48\" height=\"16\" fill=\"#fffcfc\" opacity=\".21\"/>\n"
" <polygon points=\"2 30 8 24 56 24 62 30 2 30\" fill=\"#fffcfc\" opacity=\".21\"/>\n"
" <polygon points=\"62 2 56 8 8 8 2 2 62 2\" fill=\"#fffcfc\" opacity=\".21\"/>\n"
" <polygon points=\"56 24 56 8 62 2 62 30 56 24\" fill=\"#fffcfc\" opacity=\".21\"/>\n"
" <polygon points=\"8 8 8 24 2 30 2 2 8 8\" fill=\"#fffcfc\" opacity=\".21\"/>\n"
" <polygon points=\"8 24 5 27 2 30 2 24 8 24\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"2 30 5 27 8 24 8 30 2 30\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"8 30 8 24 14 27 20 30 8 30\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"2 8 5 12 8 16 2 16 2 8\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"20 30 26 27 32 24 32 30 20 30\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"32 24 26 27 20 30 20 24 32 24\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"8 16 5 12 2 8 8 8 8 16\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"8 16 5 20 2 24 2 16 8 16\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"20 24 20 30 14 27 8 24 20 24\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"56 30 56 24 50 27 44 30 56 30\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"44 30 38 27 32 24 32 30 44 30\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"32 24 38 27 44 30 44 24 32 24\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"44 24 44 30 50 27 56 24 44 24\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"32 2 32 8 26 5 20 2 32 2\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"20 2 14 5 8 8 8 2 20 2\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"2 24 5 20 8 16 8 24 2 24\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"8 8 14 5 20 2 20 8 8 8\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"8 24 20 20 32 16 32 24 8 24\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"56 24 44 20 32 16 32 24 56 24\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"56 8 44 12 32 16 32 8 56 8\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"8 8 20 12 32 16 32 8 8 8\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"32 16 20 12 8 8 8 16 32 16\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"32 16 44 12 56 8 56 16 32 16\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"32 16 20 20 8 24 8 16 32 16\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"32 16 44 20 56 24 56 16 32 16\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"20 8 20 2 26 5 32 8 20 8\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"32 2 32 8 38 5 44 2 32 2\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"44 2 50 5 56 8 56 2 44 2\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"56 8 50 5 44 2 44 8 56 8\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"44 8 44 2 38 5 32 8 44 8\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"8 2 8 8 5 5 2 2 8 2\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"2 8 2 2 5 5 8 8 2 8\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"56 24 59 27 62 30 62 24 56 24\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"62 8 59 12 56 16 62 16 62 8\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"56 16 59 12 62 8 56 8 56 16\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"56 16 59 20 62 24 56 24 56 16\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"62 30 59 27 56 24 56 30 62 30\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"56 16 59 20 62 24 62 16 56 16\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" <polygon points=\"56 2 56 8 59 5 62 2 56 2\" fill=\"#fff\" opacity=\".21\"/>\n"
" <polygon points=\"62 8 62 2 59 5 56 8 62 8\" fill=\"#d1d1d1\" opacity=\".21\"/>\n"
" </g>\n"
"</svg>";
const char* crystalize_button_active_icon_svg = (const char*) temp_binary_data_8;
const char* crystalize_button_active_icon_svg = (const char*) temp_binary_data_13;
//================== crystalize_button_passive_icon.svg ==================
static const unsigned char temp_binary_data_9[] =
static const unsigned char temp_binary_data_14[] =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 80 32.45\">\n"
" <defs>\n"
" <linearGradient id=\"Unbenannter_Verlauf_16\" data-name=\"Unbenannter Verlauf 16\" x1=\"8.69\" y1=\"31.46\" x2=\"70.94\" y2=\"1.29\" gradientUnits=\"userSpaceOnUse\">\n"
" <stop offset=\"0\" stop-color=\"#fff\" stop-opacity=\".1\"/>\n"
" <stop offset=\".48\" stop-color=\"#fff\" stop-opacity=\".3\"/>\n"
" <stop offset=\"1\" stop-color=\"#fff\" stop-opacity=\".5\"/>\n"
" </linearGradient>\n"
" </defs>\n"
" <g id=\"Ebene_2\" data-name=\"Ebene 2\">\n"
" <rect x=\"8\" y=\".22\" width=\"64\" height=\"32\" rx=\"5.96\" ry=\"5.96\" fill=\"#3db7b7\"/>\n"
"<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 32\">\n"
" <g id=\"Ebene_6\" data-name=\"Ebene 6\">\n"
" <rect x=\"0\" y=\"0\" width=\"64\" height=\"32\" fill=\"#171a1a\"/>\n"
" <polygon points=\"64 0 62 2 32 16 2 30 0 32 0 0 64 0\" fill=\"#262b2b\"/>\n"
" </g>\n"
" <g id=\"Ebene_1\" data-name=\"Ebene 1\">\n"
" <g id=\"Ebene_2\" data-name=\"Ebene 2\">\n"
" <rect x=\"2\" y=\"2\" width=\"60\" height=\"28\" fill=\"#3db7b7\"/>\n"
" </g>\n"
" <g id=\"Ebene_7\" data-name=\"Ebene 7\">\n"
" <g>\n"
" <path d=\"M11.73,19.11c-.18,0-.34-.04-.48-.13-.15-.09-.26-.2-.35-.35-.09-.15-.13-.31-.13-.48v-3.84c0-.18.04-.34.13-.48.08-.15.2-.26.35-.35.15-.09.31-.13.48-.13h4.78v.65h-4.78c-.09,0-.16.03-.22.09s-.09.13-.09.22v3.84c0,.09.03.16.09.22.06.06.13.0"
"9.22.09h4.78v.65h-4.78Z\" fill=\"#fff\"/>\n"
" <path d=\"M17.34,19.11v-5.75h4.8c.18,0,.34.04.48.13s.26.2.35.35c.08.14.13.3.13.48v1.69c0,.18-.04.34-.13.48-.09.14-.2.26-.35.35s-.31.13-.48.13h-4.15v2.14h-.65ZM18.3,16.31h3.84c.08,0,.16-.03.22-.09.06-.06.09-.13.09-.22v-1.69c0-.09-.03-.16-.09-.22"
"s-.13-.09-.22-.09h-3.84c-.09,0-.16.03-.22.09s-.09.13-.09.22v1.69c0,.09.03.16.09.22.06.06.13.09.22.09ZM22.21,19.11l-1.88-2.24h.85l1.89,2.23h0s-.86,0-.86,0Z\" fill=\"#fff\"/>\n"
" <path d=\"M26.4,19.11v-2.17l-2.65-3.59h.74l2.23,2.82,2.21-2.82h.76l-2.65,3.59v2.17h-.65Z\" fill=\"#fff\"/>\n"
" <path d=\"M31.03,19.11c-.18,0-.34-.04-.48-.13s-.26-.2-.35-.35c-.09-.15-.13-.31-.13-.48v-.22h.65v.22c0,.09.03.16.09.22.06.06.13.09.22.09h3.84c.08,0,.16-.03.22-.09.06-.06.09-.13.09-.22v-1.29c0-.08-.03-.16-.09-.22-.06-.06-.13-.09-.22-.09h-3.84c-.1"
"8,0-.34-.04-.48-.13s-.26-.2-.35-.35c-.09-.14-.13-.3-.13-.48v-1.29c0-.18.04-.34.13-.48.08-.15.2-.26.35-.35s.31-.13.48-.13h3.84c.18,0,.34.04.48.13.15.09.26.2.35.35.08.15.13.31.13.48v.22h-.65v-.22c0-.09-.03-.16-.09-.22-.06-.06-.13-.09-.22-.09h-3.84c-.09"
",0-.16.03-.22.09-.06.06-.09.13-.09.22v1.29c0,.09.03.16.09.22s.13.09.22.09h3.84c.18,0,.34.04.48.13.15.09.26.2.35.35.08.14.13.3.13.48v1.29c0,.18-.04.34-.13.48-.09.15-.2.26-.35.35-.15.09-.31.13-.48.13h-3.84Z\" fill=\"#fff\"/>\n"
" <path d=\"M38.96,19.11v-5.11h-2.56v-.65h5.76v.65h-2.55v5.11h-.65Z\" fill=\"#fff\"/>\n"
" <path d=\"M42.78,14.31c0-.18.04-.34.13-.48.09-.15.2-.26.35-.35.15-.09.31-.13.48-.13h3.84c.18,0,.34.04.48.13s.26.2.35.35c.09.15.13.31.13.48v4.8h-.65v-2.1h-4.46v2.1h-.65v-4.8ZM47.89,16.36v-2.05c0-.09-.03-.16-.09-.22-.06-.06-.13-.09-.22-.09h-3.84c"
"-.08,0-.16.03-.22.09-.06.06-.09.13-.09.22v2.05h4.46Z\" fill=\"#fff\"/>\n"
" <path d=\"M49.46,19.11v-5.77h.65v5.12h5.11v.65h-5.76Z\" fill=\"#fff\"/>\n"
" <path d=\"M55.76,19.11v-5.76h.66v5.76h-.66Z\" fill=\"#fff\"/>\n"
" <path d=\"M57.35,19.11v-.89l5.02-4.22h-5.02v-.65h5.76v.89l-5.02,4.22h5.02v.65h-5.76Z\" fill=\"#fff\"/>\n"
" <path d=\"M63.98,19.11v-5.76h5.26v.65h-4.61v1.9h3.7v.66h-3.7v1.9h4.61v.65h-5.26Z\" fill=\"#fff\"/>\n"
" <path d=\"M12.39,18c-.12,0-.23-.03-.34-.09-.1-.06-.18-.14-.24-.24-.06-.1-.09-.21-.09-.34v-2.66c0-.12.03-.23.09-.34.06-.1.14-.18.24-.24.1-.06.21-.09.34-.09h3.32v.45h-3.32c-.06,0-.11.02-.15.06s-.06.09-.06.15v2.66c0,.06.02.11.06.15.04.04.09.06.15."
"06h3.32v.45h-3.32Z\" fill=\"#fff\"/>\n"
" <path d=\"M16.29,18v-3.99h3.33c.12,0,.23.03.34.09s.18.14.24.24c.06.1.09.21.09.33v1.17c0,.12-.03.23-.09.33-.06.1-.14.18-.24.24s-.21.09-.34.09h-2.88v1.49h-.45ZM16.95,16.06h2.66c.06,0,.11-.02.15-.06.04-.04.06-.09.06-.15v-1.17c0-.06-.02-.11-.06-.15"
"s-.09-.06-.15-.06h-2.66c-.06,0-.11.02-.15.06s-.06.09-.06.15v1.17c0,.06.02.11.06.15.04.04.09.06.15.06ZM19.66,18l-1.3-1.55h.59l1.31,1.55h0s-.59,0-.59,0Z\" fill=\"#fff\"/>\n"
" <path d=\"M22.57,18v-1.5l-1.84-2.49h.52l1.55,1.95,1.53-1.95h.53l-1.84,2.49v1.5h-.45Z\" fill=\"#fff\"/>\n"
" <path d=\"M25.78,18c-.12,0-.23-.03-.34-.09s-.18-.14-.24-.24c-.06-.1-.09-.21-.09-.34v-.16h.45v.16c0,.06.02.11.06.15.04.04.09.06.15.06h2.66c.06,0,.11-.02.15-.06.04-.04.06-.09.06-.15v-.89c0-.06-.02-.11-.06-.15-.04-.04-.09-.06-.15-.06h-2.66c-.12,0-"
".23-.03-.34-.09s-.18-.14-.24-.24c-.06-.1-.09-.21-.09-.33v-.89c0-.12.03-.23.09-.34.06-.1.14-.18.24-.24s.21-.09.34-.09h2.66c.12,0,.23.03.34.09.1.06.18.14.24.24.06.1.09.21.09.34v.16h-.45v-.16c0-.06-.02-.11-.06-.15-.04-.04-.09-.06-.15-.06h-2.66c-.06,0-.1"
"1.02-.15.06-.04.04-.06.09-.06.15v.89c0,.06.02.11.06.15s.09.06.15.06h2.66c.12,0,.23.03.34.09.1.06.18.14.24.24.06.1.09.21.09.33v.89c0,.12-.03.23-.09.34-.06.1-.14.18-.24.24-.1.06-.21.09-.34.09h-2.66Z\" fill=\"#fff\"/>\n"
" <path d=\"M31.28,18v-3.54h-1.77v-.45h3.99v.45h-1.77v3.54h-.45Z\" fill=\"#fff\"/>\n"
" <path d=\"M33.92,14.67c0-.12.03-.23.09-.34.06-.1.14-.18.24-.24.1-.06.21-.09.34-.09h2.66c.12,0,.23.03.34.09s.18.14.24.24c.06.1.09.21.09.34v3.33h-.45v-1.46h-3.1v1.46h-.45v-3.33ZM37.47,16.09v-1.42c0-.06-.02-.11-.06-.15-.04-.04-.09-.06-.15-.06h-2.6"
"6c-.06,0-.11.02-.15.06-.04.04-.06.09-.06.15v1.42h3.1Z\" fill=\"#fff\"/>\n"
" <path d=\"M38.56,18v-4h.45v3.55h3.55v.45h-3.99Z\" fill=\"#fff\"/>\n"
" <path d=\"M42.93,18v-3.99h.45v3.99h-.45Z\" fill=\"#fff\"/>\n"
" <path d=\"M44.03,18v-.62l3.48-2.93h-3.48v-.45h3.99v.62l-3.48,2.93h3.48v.45h-3.99Z\" fill=\"#fff\"/>\n"
" <path d=\"M48.63,18v-3.99h3.64v.45h-3.2v1.32h2.57v.46h-2.57v1.32h3.2v.45h-3.64Z\" fill=\"#fff\"/>\n"
" </g>\n"
" </g>\n"
" <g id=\"Ebene_3_Kopie_Kopie_Kopie\" data-name=\"Ebene 3 Kopie Kopie Kopie\">\n"
" <path d=\"M56,24.22l8-4,8,4h-16ZM48,20.22h16l-8-4-8,4ZM72,12.22v-4l-8,4h8ZM72,16.22l-8-4-8,4h16ZM69.61,1.42l-5.61,2.81h7.66c-.39-1.13-1.12-2.1-2.05-2.81ZM72,8.22l-8-4-8,4h16ZM48,12.22h16l-8-4-8,4ZM56,.22l-8,4h16L56,.22ZM48,28.22h16l-8-4-8,4ZM72,2"
"0.22v-4l-8,4h8ZM56,24.22l-8-4-8,4h16ZM40,8.22l-8,4h16l-8-4ZM32,12.22l-8,4h16l-8-4ZM40,16.22l-8,4h16l-8-4ZM32,20.22l-8,4h16l-8-4ZM71.66,28.22c.21-.61.34-1.27.34-1.96v-2.04l-8,4h7.66ZM56,16.22l-8-4-8,4h16ZM32,28.22h16l-8-4-8,4ZM56,8.22l-8-4-8,4h16ZM8,2"
"0.22h8l-8-4v4ZM24,32.22h16l-8-4-8,4ZM24,24.22l-8,4h16l-8-4ZM8,12.22h8l-8-4v4ZM16,20.22l-8,4h16l-8-4ZM10.39,31.03c1,.75,2.23,1.19,3.57,1.19h10.04l-8-4-5.61,2.81ZM64,28.22l-8,4h10.04c1.34,0,2.57-.45,3.57-1.19l-5.61-2.81ZM8.34,4.22h7.66l-5.61-2.81c-.94."
"7-1.66,1.68-2.05,2.81ZM40,32.22h16l-8-4-8,4ZM8,26.27c0,.69.12,1.34.34,1.96h7.66l-8-4v2.04ZM40,.22l-8,4h16L40,.22ZM16,4.22l-8,4h16l-8-4ZM24,8.22l-8,4h16l-8-4ZM40,8.22l-8-4-8,4h16ZM16,12.22l-8,4h16l-8-4ZM24,.22l-8,4h16L24,.22ZM24,16.22l-8,4h16l-8-4Z\" "
"fill=\"url(#Unbenannter_Verlauf_16)\" opacity=\".5\"/>\n"
" <g id=\"Ebene_3_Kopie\" data-name=\"Ebene 3 Kopie\">\n"
" <rect x=\"8\" y=\"8\" width=\"48\" height=\"16\" fill=\"#fffcfc\" opacity=\".17\"/>\n"
" <polygon points=\"2 30 8 24 56 24 62 30 2 30\" fill=\"#fffcfc\" opacity=\".17\"/>\n"
" <polygon points=\"62 2 56 8 8 8 2 2 62 2\" fill=\"#fffcfc\" opacity=\".17\"/>\n"
" <polygon points=\"56 24 56 8 62 2 62 30 56 24\" fill=\"#fffcfc\" opacity=\".17\"/>\n"
" <polygon points=\"8 8 8 24 2 30 2 2 8 8\" fill=\"#fffcfc\" opacity=\".17\"/>\n"
" <polygon points=\"8 24 5 27 2 30 2 24 8 24\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"2 30 5 27 8 24 8 30 2 30\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"8 30 8 24 14 27 20 30 8 30\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"2 8 5 12 8 16 2 16 2 8\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"20 30 26 27 32 24 32 30 20 30\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"32 24 26 27 20 30 20 24 32 24\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"8 16 5 12 2 8 8 8 8 16\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"8 16 5 20 2 24 2 16 8 16\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"20 24 20 30 14 27 8 24 20 24\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"56 30 56 24 50 27 44 30 56 30\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"44 30 38 27 32 24 32 30 44 30\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"32 24 38 27 44 30 44 24 32 24\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"44 24 44 30 50 27 56 24 44 24\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"32 2 32 8 26 5 20 2 32 2\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"20 2 14 5 8 8 8 2 20 2\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"2 24 5 20 8 16 8 24 2 24\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"8 8 14 5 20 2 20 8 8 8\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"8 24 20 20 32 16 32 24 8 24\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"56 24 44 20 32 16 32 24 56 24\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"56 8 44 12 32 16 32 8 56 8\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"8 8 20 12 32 16 32 8 8 8\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"32 16 20 12 8 8 8 16 32 16\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"32 16 44 12 56 8 56 16 32 16\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"32 16 20 20 8 24 8 16 32 16\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"32 16 44 20 56 24 56 16 32 16\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"20 8 20 2 26 5 32 8 20 8\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"32 2 32 8 38 5 44 2 32 2\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"44 2 50 5 56 8 56 2 44 2\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"56 8 50 5 44 2 44 8 56 8\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"44 8 44 2 38 5 32 8 44 8\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"8 2 8 8 5 5 2 2 8 2\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"2 8 2 2 5 5 8 8 2 8\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"56 24 59 27 62 30 62 24 56 24\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"62 8 59 12 56 16 62 16 62 8\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"56 16 59 12 62 8 56 8 56 16\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"56 16 59 20 62 24 56 24 56 16\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"62 30 59 27 56 24 56 30 62 30\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"56 16 59 20 62 24 62 16 56 16\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" <polygon points=\"56 2 56 8 59 5 62 2 56 2\" fill=\"#fff\" opacity=\".17\"/>\n"
" <polygon points=\"62 8 62 2 59 5 56 8 62 8\" fill=\"#d1d1d1\" opacity=\".17\"/>\n"
" </g>\n"
"</svg>";
const char* crystalize_button_passive_icon_svg = (const char*) temp_binary_data_9;
const char* crystalize_button_passive_icon_svg = (const char*) temp_binary_data_14;
//================== bypass_icon.svg ==================
static const unsigned char temp_binary_data_10[] =
static const unsigned char temp_binary_data_15[] =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<svg id=\"Ebene_1\" data-name=\"Ebene 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 22 23\">\n"
" <rect x=\"10\" width=\"2\" height=\"12\"/>\n"
" <path d=\"M13,1.19v1.87c4.1.91,7.17,4.57,7.17,8.94,0,5.06-4.1,9.17-9.17,9.17S1.83,17.06,1.83,12C1.83,7.63,4.9,3.97,9,3.06v-1.87C3.88,2.13,0,6.61,0,12c0,6.08,4.92,11,11,11s11-4.92,11-11c0-5.39-3.88-9.87-9-10.81Z\" fill=\"black\"/>\n"
"</svg>";
const char* bypass_icon_svg = (const char*) temp_binary_data_10;
const char* bypass_icon_svg = (const char*) temp_binary_data_15;
const char* getNamedResource (const char* resourceNameUTF8, int& numBytes);
@ -11538,9 +11660,14 @@ const char* getNamedResource (const char* resourceNameUTF8, int& numBytes)
case 0xcbceafb3: numBytes = 24668; return OrbitronBold_ttf;
case 0x9c8232dc: numBytes = 24716; return OrbitronRegular_ttf;
case 0x93fe9a1e: numBytes = 146004; return RobotoRegular_ttf;
case 0x1024555a: numBytes = 397; return bell_icon_svg;
case 0x46c5a278: numBytes = 316; return high_cut_icon_svg;
case 0x0133c050: numBytes = 420; return high_shelf_icon_svg;
case 0x31532e06: numBytes = 317; return low_cut_icon_svg;
case 0x7e8ca05e: numBytes = 410; return low_shelf_icon_svg;
case 0x4df4bf1e: numBytes = 350; return preset_menu_icon_svg;
case 0xd842aaab: numBytes = 4212; return crystalize_button_active_icon_svg;
case 0x885a7642: numBytes = 4141; return crystalize_button_passive_icon_svg;
case 0xd842aaab: numBytes = 6343; return crystalize_button_active_icon_svg;
case 0x885a7642: numBytes = 6279; return crystalize_button_passive_icon_svg;
case 0xe49e0f15: numBytes = 406; return bypass_icon_svg;
default: break;
}
@ -11558,6 +11685,11 @@ const char* namedResourceList[] =
"OrbitronBold_ttf",
"OrbitronRegular_ttf",
"RobotoRegular_ttf",
"bell_icon_svg",
"high_cut_icon_svg",
"high_shelf_icon_svg",
"low_cut_icon_svg",
"low_shelf_icon_svg",
"preset_menu_icon_svg",
"crystalize_button_active_icon_svg",
"crystalize_button_passive_icon_svg",
@ -11573,6 +11705,11 @@ const char* originalFilenames[] =
"Orbitron-Bold.ttf",
"Orbitron-Regular.ttf",
"Roboto-Regular.ttf",
"bell_icon.svg",
"high_cut_icon.svg",
"high_shelf_icon.svg",
"low_cut_icon.svg",
"low_shelf_icon.svg",
"preset_menu_icon.svg",
"crystalize_button_active_icon.svg",
"crystalize_button_passive_icon.svg",

View File

@ -29,20 +29,35 @@ namespace BinaryData
extern const char* RobotoRegular_ttf;
const int RobotoRegular_ttfSize = 146004;
extern const char* bell_icon_svg;
const int bell_icon_svgSize = 397;
extern const char* high_cut_icon_svg;
const int high_cut_icon_svgSize = 316;
extern const char* high_shelf_icon_svg;
const int high_shelf_icon_svgSize = 420;
extern const char* low_cut_icon_svg;
const int low_cut_icon_svgSize = 317;
extern const char* low_shelf_icon_svg;
const int low_shelf_icon_svgSize = 410;
extern const char* preset_menu_icon_svg;
const int preset_menu_icon_svgSize = 350;
extern const char* crystalize_button_active_icon_svg;
const int crystalize_button_active_icon_svgSize = 4212;
const int crystalize_button_active_icon_svgSize = 6343;
extern const char* crystalize_button_passive_icon_svg;
const int crystalize_button_passive_icon_svgSize = 4141;
const int crystalize_button_passive_icon_svgSize = 6279;
extern const char* bypass_icon_svg;
const int bypass_icon_svgSize = 406;
// Number of elements in the namedResourceList and originalFileNames arrays.
const int namedResourceListSize = 11;
const int namedResourceListSize = 16;
// Points to the start of a list of resource names.
extern const char* namedResourceList[];

View File

@ -32,6 +32,7 @@ void CrystalizerEQAudioProcessorEditor::setupSliders() {
}
gainLookAndFeel = std::make_unique<DesignSystem::Components::GainSliderLookAndFeel>();
freqQLookAndFeel = std::make_unique<DesignSystem::Components::FreqQSliderLookAndFeel>();
slopeLookAndFeel = std::make_unique<DesignSystem::Components::SlopeSliderLookAndFeel>();
globalLookAndFeel = std::make_unique<DesignSystem::Components::GlobalSliderLookAndFeel>();
lowBandGainSlider.setLookAndFeel(gainLookAndFeel.get());
@ -40,6 +41,9 @@ void CrystalizerEQAudioProcessorEditor::setupSliders() {
peak3GainSlider.setLookAndFeel(gainLookAndFeel.get());
highBandGainSlider.setLookAndFeel(gainLookAndFeel.get());
lowBandSlopeSlider.setLookAndFeel(slopeLookAndFeel.get());
highBandSlopeSlider.setLookAndFeel(slopeLookAndFeel.get());
inputSlider.setLookAndFeel(globalLookAndFeel.get());
outputSlider.setLookAndFeel(globalLookAndFeel.get());
@ -178,6 +182,8 @@ void CrystalizerEQAudioProcessorEditor::setupToggleButtons() {
bypassButtonLookAndFeel = std::make_unique<Components::BypassButtonLookAndFeel>();
svgToggleButtonLookAndFeel = std::make_unique<Components::SvgToggleButtonLookAndFeel>();
presetMenuButtonLookAndFeel = std::make_unique<Components::PresetMenuButtonLookAndFeel>();
lowBandButtonLookAndFeel = std::make_unique<Components::lowBandButtonLookAndFeel>();
highBandButtonLookAndFeel = std::make_unique<Components::highBandButtonLookAndFeel>();
peak1BypassButton.setLookAndFeel(bypassButtonLookAndFeel.get());
peak2BypassButton.setLookAndFeel(bypassButtonLookAndFeel.get());
@ -190,6 +196,17 @@ void CrystalizerEQAudioProcessorEditor::setupToggleButtons() {
lowShelf.setToggleState(true, juce::dontSendNotification);
highShelf.setToggleState(true, juce::dontSendNotification);
lowBypass.setLookAndFeel(lowBandButtonLookAndFeel.get());
lowCut.setLookAndFeel(lowBandButtonLookAndFeel.get());
lowBell.setLookAndFeel(lowBandButtonLookAndFeel.get());
lowShelf.setLookAndFeel(lowBandButtonLookAndFeel.get());
highBypass.setLookAndFeel(highBandButtonLookAndFeel.get());
highCut.setLookAndFeel(highBandButtonLookAndFeel.get());
highBell.setLookAndFeel(highBandButtonLookAndFeel.get());
highShelf.setLookAndFeel(highBandButtonLookAndFeel.get());
for (auto* b : {&peak1BypassButton, &peak2BypassButton, &peak3BypassButton, &crystalizeButton, &masterBypassButton}) {
b->onClick = [this, b]() {
juce::String paramID; // nimm juce::String statt std::string
@ -255,6 +272,7 @@ void CrystalizerEQAudioProcessorEditor::disableLowBand(const float target) {
lowBandGainLabel .setEnabled(isToggled);
lowBandQSlider .setEnabled(isToggled);
lowBandQLabel .setEnabled(isToggled);
};
//endregion disableLowBand
@ -379,6 +397,7 @@ void CrystalizerEQAudioProcessorEditor::addComponentsToLayout() {
{
filterArea.addAndMakeVisible(lowFilterArea);
lowBandModeBox.addAndMakeVisible(lowBandModeLabel);
lowBandModeBox.addAndMakeVisible(lowBypass);
lowBandModeBox.addAndMakeVisible(lowCut);
lowBandModeBox.addAndMakeVisible(lowBell);
@ -392,7 +411,13 @@ void CrystalizerEQAudioProcessorEditor::addComponentsToLayout() {
lowFilterArea.addAndMakeVisible(lowBandGainLabel);
lowFilterArea.addAndMakeVisible(lowBandQLabel);
lowFilterArea.addAndMakeVisible(lowBandFreqLabel);
lowBandSlopeSlider.addAndMakeVisible(low12);
lowBandSlopeSlider.addAndMakeVisible(low24);
lowBandSlopeSlider.addAndMakeVisible(low36);
lowBandSlopeSlider.addAndMakeVisible(low48);
lowFilterArea.addAndMakeVisible(lowBandSlopeSlider);
lowFilterArea.addAndMakeVisible(lowBandGainSlider);
lowFilterArea.addAndMakeVisible(lowBandQSlider);
lowFilterArea.addAndMakeVisible(lowBandFreqSlider);
@ -434,6 +459,7 @@ void CrystalizerEQAudioProcessorEditor::addComponentsToLayout() {
{
filterArea.addAndMakeVisible(highFilterArea);
highBandModeBox.addAndMakeVisible(highBandModeLabel);
highBandModeBox.addAndMakeVisible(highBypass);
highBandModeBox.addAndMakeVisible(highCut);
highBandModeBox.addAndMakeVisible(highBell);
@ -446,7 +472,13 @@ void CrystalizerEQAudioProcessorEditor::addComponentsToLayout() {
highFilterArea.addAndMakeVisible(highBandGainLabel);
highFilterArea.addAndMakeVisible(highBandQLabel);
highFilterArea.addAndMakeVisible(highBandFreqLabel);
highBandSlopeSlider.addAndMakeVisible(high12);
highBandSlopeSlider.addAndMakeVisible(high24);
highBandSlopeSlider.addAndMakeVisible(high36);
highBandSlopeSlider.addAndMakeVisible(high48);
highFilterArea.addAndMakeVisible(highBandSlopeSlider);
highFilterArea.addAndMakeVisible(highBandGainSlider);
highFilterArea.addAndMakeVisible(highBandQSlider);
highFilterArea.addAndMakeVisible(highBandFreqSlider);
@ -481,6 +513,11 @@ void CrystalizerEQAudioProcessorEditor::setupLabels() {
setupLabel (lowBandSlopeLabel, "Slope");
setupLabel (lowBandGainLabel, "Low\nGain");
setupLabel(lowBandQLabel, "Low\nQ");
setupLabel(lowBandModeLabel, "Band Mode");
setupLabel(low12, "12");
setupLabel(low24, "24");
setupLabel(low36, "36");
setupLabel(low48, "48");
//PEAK 1
setupLabel (peak1FreqLabel,"Low-Mid\nHz");
@ -502,6 +539,11 @@ void CrystalizerEQAudioProcessorEditor::setupLabels() {
setupLabel (highBandSlopeLabel, "Slope");
setupLabel (highBandGainLabel, "High\nGain");
setupLabel(highBandQLabel, "High\nQ");
setupLabel(highBandModeLabel, "Band Mode");
setupLabel(high12, "12");
setupLabel(high24, "24");
setupLabel(high36, "36");
setupLabel(high48, "48");
setupLabel(presetBoxLabel, "Presets");
@ -561,6 +603,9 @@ void CrystalizerEQAudioProcessorEditor::handleLowBandModes() {
param->endChangeGesture();
}
}
else if (lowBandBools[i]) {
lowBandModeButtons[i]->setToggleState(true, juce::dontSendNotification);
}
};
}
}
@ -593,11 +638,14 @@ void CrystalizerEQAudioProcessorEditor::handleHighBandModes() {
param->endChangeGesture();
}
}
else if (highBandBools[i]) {
highBandModeButtons[i]->setToggleState(true, juce::dontSendNotification);
}
};
}
}
//endregion handleHighBandModes
//region setupEventListeners
void CrystalizerEQAudioProcessorEditor::setupEventListeners() {
presetMenuButton.onClick = [this]() {
@ -706,7 +754,6 @@ CrystalizerEQAudioProcessorEditor::CrystalizerEQAudioProcessorEditor (Crystalize
setupSliders();
initPresetSystem();
addAndMakeVisible (testNoiseButton);
testNoiseButton.onClick = [this]() {
@ -729,7 +776,6 @@ CrystalizerEQAudioProcessorEditor::CrystalizerEQAudioProcessorEditor (Crystalize
};
}
CrystalizerEQAudioProcessorEditor::~CrystalizerEQAudioProcessorEditor() {
@ -743,6 +789,13 @@ CrystalizerEQAudioProcessorEditor::~CrystalizerEQAudioProcessorEditor() {
masterBypassButton.setLookAndFeel(nullptr);
crystalizeButton.setLookAndFeel(nullptr);
presetMenuButton.setLookAndFeel(nullptr);
for (auto* b : lowBandModeButtons) {
b->setLookAndFeel(nullptr);
}
for (auto* b : highBandModeButtons) {
b->setLookAndFeel(nullptr);
}
};
//region paintAnalyzer
@ -763,6 +816,28 @@ void CrystalizerEQAudioProcessorEditor::paintAnalyzer(juce::Graphics &g) {
}
//endregion paintAnalyzer
void CrystalizerEQAudioProcessorEditor::paintModeBoxBorders(juce::Graphics &g) {
for (auto* b : lowBandModeButtons) {
if (b->getToggleState()) {
auto r = getLocalArea(&lowBandModeBox, b->getBounds());
int side = juce::jmin(r.getWidth(), r.getHeight());
r = r.withSizeKeepingCentre(side, side);
auto rf = r.toFloat();
auto rfFilled = rf.toNearestInt().toFloat();
const float stroke = 1.0f;
auto rfStroke = rfFilled.reduced(stroke * 0.5f);
g.setColour(juce::Colours::white.withAlpha(0.3f));
g.fillRoundedRectangle(r.toFloat(), 5);
g.setColour(juce::Colours::white.withAlpha(0.9f));
g.drawRoundedRectangle(rfStroke, 5, stroke);
}
}
}
//==============================================================================
void CrystalizerEQAudioProcessorEditor::paint (juce::Graphics& g)
{
@ -786,7 +861,7 @@ void CrystalizerEQAudioProcessorEditor::paint (juce::Graphics& g)
auto hBH = hB.getHeight();
auto hBPad = ((hBY + mPY) - hBH) / 2;
g.fillRect(hBX, hBY, hBW, mPY - hBPad);
paintBorderLines(g);
//paintBorderLines(g);
g.setColour(Colours::SURFACECOLOUR);
@ -796,7 +871,7 @@ void CrystalizerEQAudioProcessorEditor::paint (juce::Graphics& g)
auto pAWidth = pA.getWidth();
auto pAHeight = pA.getHeight();
g.fillRoundedRectangle(pAX, pAY - 10.f, pAWidth, pAHeight + 10.f, 10.0f);
paintBorderLines(g);
//paintBorderLines(g);
const auto fA = getLocalArea(&filterArea, filterArea.getLocalBounds());
const int fABorderWidth = 3;
@ -815,10 +890,13 @@ void CrystalizerEQAudioProcessorEditor::paint (juce::Graphics& g)
g.fillRect(fA);
paintBorderLines(g);
//paintModeBoxBorders(g);
g.setColour(Colours::SURFACEBYPASS);
const auto fB = getLocalArea(&footerBar, footerBar.getLocalBounds());
g.fillRect(fB);
if constexpr (false) // -> auf false setzen, wenn nicht gebraucht
{
for (auto* c : getChildren()) // headerBar, mainPanel, footerBar
@ -883,6 +961,15 @@ void CrystalizerEQAudioProcessorEditor::paint (juce::Graphics& g)
g.setColour(juce::Colours::cyan.withAlpha(0.9f));
g.drawRect(r, 1.0f);
}
for (auto* c : lowBandModeBox.getChildren())
{
auto r = getLocalArea(&lowBandModeBox, c->getBounds()); // lokal in presetArea
g.setColour(juce::Colours::yellow.withAlpha(0.3f));
g.fillRect(r);
g.setColour(juce::Colours::yellow.withAlpha(0.9f));
g.drawRect(r, 1.0f);
}
for (auto* c : lowMidFilterArea.getChildren())
{
auto r = getLocalArea(&lowMidFilterArea, c->getBounds()); // lokal in presetArea
@ -947,7 +1034,6 @@ void CrystalizerEQAudioProcessorEditor::paint (juce::Graphics& g)
//region paintBorderLines
void CrystalizerEQAudioProcessorEditor::paintBorderLines(juce::Graphics &g) {
//TODO: BRODER LINES DONT ALIGN WITH MARGIN FROM ANALYZERAREA AND FILTERAREA
g.setColour(DesignSystem::Colours::BACKGROUNDCOLOUR);
auto prevRight = (float) lowFilterArea.getRight();
@ -956,7 +1042,7 @@ void CrystalizerEQAudioProcessorEditor::paintBorderLines(juce::Graphics &g) {
const auto area = getLocalArea(c, c->getLocalBounds());
const float xAvg = ((float) area.getX() - prevRight) / 2;
const int x = area.getX() - xAvg;
const int x = area.getX() - xAvg + (filterAreaMargin / 2);
prevRight = (float) c->getRight();
const auto top = (float) area.getY();
@ -991,6 +1077,7 @@ void CrystalizerEQAudioProcessorEditor::setKnobVisibility() {
lowBandGainLabel .setEnabled(lowMode >= 2);
lowBandQSlider .setEnabled(lowMode >= 1);
lowBandQLabel .setEnabled(lowMode >= 1);
lowBandModeLabel.setEnabled (lowMode >= 1);
int highMode = (int) audioProcessor.apvts
.getRawParameterValue("HighBandModes")->load(); // 0..3
@ -1007,6 +1094,7 @@ void CrystalizerEQAudioProcessorEditor::setKnobVisibility() {
highBandGainLabel .setEnabled(highMode >= 2);
highBandQSlider .setEnabled(highMode >= 1);
highBandQLabel .setEnabled(highMode >= 1);
highBandModeLabel.setEnabled (highMode >= 1);
}
//endregion setKnobVisibility
@ -1067,6 +1155,8 @@ void CrystalizerEQAudioProcessorEditor::resized()
setupFooter();
//setSliderSizes();
const auto testBounds = mainPanel.getLocalBounds();
const auto testWidth = testBounds.getWidth();
const auto testHeight = testBounds.getHeight();
@ -1193,7 +1283,6 @@ void CrystalizerEQAudioProcessorEditor::setupBody() {
const auto bodyHeight = static_cast<float>(bounds.getHeight());
const auto bodyWidth = static_cast<float>(bounds.getWidth());
const auto bodyColWidth = bodyWidth / 5.0f;
const int margin = 15;
Layout::GridSpec bodySpec{
/* cols */ { Layout::fr(1), Layout::pxTrack(bodyColWidth), Layout::pxTrack(bodyColWidth), Layout::pxTrack(bodyColWidth), Layout::fr(1) },
@ -1204,10 +1293,10 @@ void CrystalizerEQAudioProcessorEditor::setupBody() {
};
Layout::grid(bounds, bodySpec, {
Layout::area(analyzerArea, 1, 2, 2, 5)
.withMargin(juce::GridItem::Margin(margin, 0, margin, 0)),
.withMargin(juce::GridItem::Margin(filterAreaMargin, 0, filterAreaMargin, 0)),
Layout::area(crystalizeButton, 1, 5, 2, 6),
Layout::area(filterArea, 2, 1, 3, 6)
.withMargin(juce::GridItem::Margin(0, margin, 0, margin))
.withMargin(juce::GridItem::Margin(0, filterAreaMargin, 0, filterAreaMargin))
});
@ -1259,6 +1348,7 @@ void CrystalizerEQAudioProcessorEditor::setupLowBandLayout() {
const auto refH = getReferenceCell()[1];
const auto gainSize = refH * gainMod;
const auto offSetToGainTop = gainSize;
const float labelPadding = Components::SlopeSliderLookAndFeel::labelPadding * 2;
Layout::GridSpec lowBandSpec{
/* cols */ { Layout::fr(1), Layout::pxTrack(knobColWidth), Layout::fr(1) },
@ -1287,13 +1377,13 @@ void CrystalizerEQAudioProcessorEditor::setupLowBandLayout() {
.withAlignSelf(juce::GridItem::AlignSelf::center)
.withJustifySelf(juce::GridItem::JustifySelf::center),
Layout::area(lowBandSlopeSlider, 3, 3, 4, 4)
.withWidth(refW * slopeMod)
.withHeight(refH * slopeMod)
Layout::area(lowBandSlopeSlider, 3, 1, 4, 2)
.withWidth(refW * slopeMod + labelPadding)
.withHeight(refH * slopeMod + labelPadding)
.withAlignSelf(juce::GridItem::AlignSelf::center)
.withJustifySelf(juce::GridItem::JustifySelf::center),
Layout::area(lowBandModeBox, 3, 1, 4, 3),
Layout::area(lowBandModeBox, 3, 2, 4, 4),
Layout::area(lowBandFreqLabel, 2, 1, 3, 2)
@ -1301,8 +1391,8 @@ void CrystalizerEQAudioProcessorEditor::setupLowBandLayout() {
Layout::area(lowBandGainLabel, 1, 2, 2, 3),
Layout::area(lowBandQLabel, 2, 3, 3, 4)
.withMargin(juce::GridItem::Margin(-offSetToGainTop, 0, 0, 0)),
Layout::area(lowBandSlopeLabel, 3, 3, 4, 4)
.withMargin(juce::GridItem::Margin(-offSetToGainTop / 2, 0, 0, 0)),
Layout::area(lowBandSlopeLabel, 3, 1, 4, 2)
.withMargin(juce::GridItem::Margin(-offSetToGainTop / 1.5f, 0, 0, 0)),
});
@ -1311,20 +1401,23 @@ void CrystalizerEQAudioProcessorEditor::setupLowBandLayout() {
const auto modeBoxAreaWidth = static_cast<float>(modeBoxBounds.getWidth());
const auto modeBoxAreaHeight = static_cast<float>(modeBoxBounds.getHeight());
const auto modeBoxButtonColWidth = modeBoxAreaWidth / 4.0f;
const auto slopeH = lowBandSlopeSlider.getY() - lowBandModeBox.getY() + lowBandModeLabel.getFont().getHeight() / 2;
Layout::GridSpec lowBandModeBoxSpec{
/* cols */ { Layout::fr(1), Layout::pxTrack(modeBoxButtonColWidth), Layout::pxTrack(modeBoxButtonColWidth), Layout::fr(1) },
/* rows */ { Layout::fr(1)},
/* cols */ { Layout::fr(1), Layout::fr(1), Layout::fr(1), Layout::fr(1) },
/* rows */ { Layout::fr(1), Layout::fr(1)},
/* colGap */ Spacing::SizeMode::XS,
/* rowGap */ Spacing::SizeMode::XS,
/* pad */ Layout::padding(Spacing::SizeMode::XS)
};
Layout::grid(modeBoxBounds, lowBandModeBoxSpec, {
Layout::area(lowBypass, 1, 1, 2, 2),
Layout::area(lowCut, 1, 2, 2, 3),
Layout::area(lowBell, 1, 3, 2, 4),
Layout::area(lowShelf, 1, 4, 2, 5)
Layout::area(lowBandModeLabel, 1, 2, 2, 4)
.withMargin(juce::GridItem::Margin(slopeH , 0, 0, 0)),
Layout::area(lowBypass, 1, 1, 3, 2),
Layout::area(lowCut, 1, 2, 3, 3),
Layout::area(lowBell, 1, 3, 3, 4),
Layout::area(lowShelf, 1, 4, 3, 5)
});
}
//endregion setupLowBandLayout
@ -1490,6 +1583,8 @@ void CrystalizerEQAudioProcessorEditor::setupHighBandLayout() {
const auto refH = getReferenceCell()[1];
const auto gainSize = refH * gainMod;
const auto offSetToGainTop = gainSize;
const float labelPadding = Components::SlopeSliderLookAndFeel::labelPadding * 2;
Layout::GridSpec highBandSpec{
/* cols */ { Layout::fr(1), Layout::pxTrack(knobColWidth), Layout::fr(1) },
@ -1518,12 +1613,12 @@ void CrystalizerEQAudioProcessorEditor::setupHighBandLayout() {
.withAlignSelf(juce::GridItem::AlignSelf::center)
.withJustifySelf(juce::GridItem::JustifySelf::center),
Layout::area(highBandModeBox, 3, 2, 4, 4),
Layout::area(highBandModeBox, 3, 1, 4, 3),
Layout::area(highBandSlopeSlider, 3, 1, 4, 2)
.withWidth(refW * slopeMod)
.withHeight(refH * slopeMod)
Layout::area(highBandSlopeSlider, 3, 3, 4, 4)
.withWidth(refW * slopeMod + labelPadding)
.withHeight(refH * slopeMod + labelPadding)
.withAlignSelf(juce::GridItem::AlignSelf::center)
.withJustifySelf(juce::GridItem::JustifySelf::center),
@ -1532,8 +1627,8 @@ void CrystalizerEQAudioProcessorEditor::setupHighBandLayout() {
Layout::area(highBandGainLabel, 1, 2, 2, 3),
Layout::area(highBandQLabel, 2, 3, 3, 4)
.withMargin(juce::GridItem::Margin(-offSetToGainTop, 0, 0, 0)),
Layout::area(highBandSlopeLabel, 3, 1, 4, 2)
.withMargin(juce::GridItem::Margin(-offSetToGainTop / 2, 0, 0, 0)),
Layout::area(highBandSlopeLabel, 3, 3, 4, 4)
.withMargin(juce::GridItem::Margin(-offSetToGainTop / 1.5f, 0, 0, 0)),
});
@ -1541,20 +1636,23 @@ void CrystalizerEQAudioProcessorEditor::setupHighBandLayout() {
const auto modeBoxAreaWidth = static_cast<float>(modeBoxBounds.getWidth());
const auto modeBoxAreaHeight = static_cast<float>(modeBoxBounds.getHeight());
const auto modeBoxButtonColWidth = modeBoxAreaWidth / 4.0f;
const auto slopeH = highBandSlopeSlider.getY() - highBandModeBox.getY() + highBandModeLabel.getFont().getHeight() / 2;
Layout::GridSpec highBandModeBoxSpec{
/* cols */ { Layout::fr(1), Layout::pxTrack(modeBoxButtonColWidth), Layout::pxTrack(modeBoxButtonColWidth), Layout::fr(1) },
/* rows */ { Layout::fr(1)},
/* cols */ { Layout::fr(1), Layout::fr(1), Layout::fr(1), Layout::fr(1) },
/* rows */ { Layout::fr(1), Layout::fr(1)},
/* colGap */ Spacing::SizeMode::XS,
/* rowGap */ Spacing::SizeMode::XS,
/* pad */ Layout::padding(Spacing::SizeMode::XS)
};
Layout::grid(modeBoxBounds, highBandModeBoxSpec, {
Layout::area(highBypass, 1, 1, 2, 2),
Layout::area(highCut, 1, 2, 2, 3),
Layout::area(highBell, 1, 3, 2, 4),
Layout::area(highShelf, 1, 4, 2, 5)
Layout::area(highBandModeLabel, 1, 2, 2, 4)
.withMargin(juce::GridItem::Margin(slopeH , 0, 0, 0)),
Layout::area(highBypass, 1, 4, 3, 5),
Layout::area(highCut, 1, 3, 3, 4),
Layout::area(highBell, 1, 2, 3, 3),
Layout::area(highShelf, 1, 1, 3, 2)
});
}
//endregion setupHighBandLayout

View File

@ -134,6 +134,9 @@ public:
~CrystalizerEQAudioProcessorEditor() override;
void paintAnalyzer(juce::Graphics &g);
void paintModeBoxBorders(juce::Graphics &g);
void paintBorderLines(juce::Graphics& g);
//===================================================================
@ -176,22 +179,28 @@ public:
inputAttach, outputAttach;
juce::Label titleLabel, testNoiseLabel,
lowBandFreqLabel, lowBandSlopeLabel, lowBandGainLabel, lowBandQLabel,
lowBandFreqLabel, lowBandSlopeLabel, lowBandGainLabel, lowBandQLabel, lowBandModeLabel,
low12, low24, low36, low48,
peak1FreqLabel, peak1GainLabel, peak1QLabel,
peak2FreqLabel, peak2GainLabel, peak2QLabel,
peak3FreqLabel, peak3GainLabel, peak3QLabel,
highBandFreqLabel, highBandSlopeLabel, highBandGainLabel, highBandQLabel,
highBandFreqLabel, highBandSlopeLabel, highBandGainLabel, highBandQLabel, highBandModeLabel,
high12, high24, high36, high48,
inputLabel, outputLabel,
presetBoxLabel;
const juce::Array<juce::Label*> sliderLabels = {
&lowBandFreqLabel, &lowBandSlopeLabel, &lowBandGainLabel, &lowBandQLabel,
&lowBandFreqLabel, &lowBandSlopeLabel, &lowBandGainLabel, &lowBandQLabel, &lowBandModeLabel,
&peak1FreqLabel, &peak1GainLabel, &peak1QLabel,
&peak2FreqLabel, &peak2GainLabel, &peak2QLabel,
&peak3FreqLabel, &peak3GainLabel, &peak3QLabel,
&highBandFreqLabel, &highBandSlopeLabel, &highBandGainLabel, &highBandQLabel,
&highBandFreqLabel, &highBandSlopeLabel, &highBandGainLabel, &highBandQLabel, &highBandModeLabel,
&inputLabel, &outputLabel
};
const juce::Array<juce::Label*> slopeLabels = {
&low12, &low24, &low36, &low48,
&high12, &high24, &high36, &high48
};
juce::TextButton testNoiseButton, resetButton, savePresetButton, deletePresetButton;
@ -261,9 +270,14 @@ private:
std::unique_ptr<AXIOM::DesignSystem::Components::BaseSliderLookAndFeel> baseLookAndFeel;
std::unique_ptr<DesignSystem::Components::GainSliderLookAndFeel> gainLookAndFeel;
std::unique_ptr<DesignSystem::Components::FreqQSliderLookAndFeel> freqQLookAndFeel;
std::unique_ptr<DesignSystem::Components::SlopeSliderLookAndFeel> slopeLookAndFeel;
std::unique_ptr<DesignSystem::Components::GlobalSliderLookAndFeel> globalLookAndFeel;
std::unique_ptr<Components::BypassButtonLookAndFeel> bypassButtonLookAndFeel;
std::unique_ptr<Components::PresetMenuButtonLookAndFeel> presetMenuButtonLookAndFeel;
std::unique_ptr<Components::lowBandButtonLookAndFeel> lowBandButtonLookAndFeel;
std::unique_ptr<Components::highBandButtonLookAndFeel> highBandButtonLookAndFeel;
std::unique_ptr<Components::SvgToggleButtonLookAndFeel> svgToggleButtonLookAndFeel;
@ -319,6 +333,8 @@ private:
const float slopeMod = SliderStyles::Size::getSliderSizeMod(SliderStyles::Size::SizeMode::Slope);
const float globalMod = SliderStyles::Size::getSliderSizeMod(SliderStyles::Size::SizeMode::Global);
const float filterAreaMargin = 15.0f;
bool isAnimatingCrystalize = false;
bool isFadingToActive = false;

View File

@ -64,7 +64,7 @@ CrystalizerEQAudioProcessor::createParameterLayout() {
params.push_back (std::make_unique<juce::AudioParameterFloat>(
"Peak2Gain", "Peak2 Gain (dB)",
juce::NormalisableRange<float>(-48.f, 48.f, 0.1f), 0.f));
juce::NormalisableRange<float>(-24.f, 24.f, 0.1f), 0.f));
params.push_back (std::make_unique<juce::AudioParameterFloat>(
"Peak2Q", "Peak2 Q",