Added preset menu button.

This commit is contained in:
Legaeli 2025-11-08 00:15:46 +01:00
parent ad58381614
commit 857e0655fd
5 changed files with 116 additions and 53 deletions

View File

@ -531,8 +531,7 @@ namespace AXIOM {
public:
BypassButtonLookAndFeel()
{
svgXml = juce::XmlDocument::parse(BinaryData::bypass_icon_svg);
}
svgXml = juce::XmlDocument::parse(BinaryData::bypass_icon_svg);}
@ -578,12 +577,64 @@ namespace AXIOM {
juce::RectanglePlacement::centred, bypassOpacity);
}
}
}
private:
std::unique_ptr<juce::XmlElement> svgXml;
};
class PresetMenuButtonLookAndFeel : public juce::LookAndFeel_V4 {
public:
PresetMenuButtonLookAndFeel()
{
presetMenuButton = juce::XmlDocument::parse(BinaryData::preset_menu_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()) * 1.5f;
auto hoverFactor = isHovered ? 1.05f : 1.0f;
auto iconBounds = juce::Rectangle<float>(iconSize * hoverFactor, iconSize * hoverFactor)
.withCentre(bounds.getCentre())
.withX(bounds.getX());
// ganz links im Button starten
;
float bypassOpacity = 1.0f;
if (presetMenuButton != nullptr) {
auto menuIcon = juce::Drawable::createFromSVG(*presetMenuButton);
juce::Colour colour;
if (isHovered) {
colour = isToggled ? Colours::ACCENTHOVER : Colours::BACKGROUNDHOVER;
} else {
colour = isToggled
? Colours::ACCENTCOLOUR
: Colours::BACKGROUNDCOLOUR;
}
// Icon zeichnen
menuIcon->replaceColour(juce::Colours::black, colour);
menuIcon->drawWithin(g, iconBounds,
juce::RectanglePlacement::centred, 1.0f);
}
}
private:
std::unique_ptr<juce::XmlElement> presetMenuButton;
};
class SvgToggleButtonLookAndFeel : public juce::LookAndFeel_V4 {
public:
SvgToggleButtonLookAndFeel() {
@ -982,7 +1033,9 @@ namespace AXIOM {
int rowStart, int colStart,
int rowEnd, int colEnd)
{
return juce::GridItem(c).withArea(rowStart, colStart, rowEnd, colEnd);
return juce::GridItem(c)
.withArea(rowStart, colStart, rowEnd, colEnd);
}
static void grid(juce::Rectangle<int> bounds,

View File

@ -11416,7 +11416,7 @@ const char* RobotoRegular_ttf = (const char*) temp_binary_data_6;
//================== preset_menu_icon.svg ==================
static const unsigned char temp_binary_data_7[] =
"<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\"/></svg>";
"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;
@ -11501,7 +11501,7 @@ 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 0x4df4bf1e: numBytes = 337; return preset_menu_icon_svg;
case 0x4df4bf1e: numBytes = 350; return preset_menu_icon_svg;
case 0xd842aaab: numBytes = 2478; return crystalize_button_active_icon_svg;
case 0x885a7642: numBytes = 2508; return crystalize_button_passive_icon_svg;
case 0xe49e0f15: numBytes = 406; return bypass_icon_svg;

View File

@ -30,7 +30,7 @@ namespace BinaryData
const int RobotoRegular_ttfSize = 146004;
extern const char* preset_menu_icon_svg;
const int preset_menu_icon_svgSize = 337;
const int preset_menu_icon_svgSize = 350;
extern const char* crystalize_button_active_icon_svg;
const int crystalize_button_active_icon_svgSize = 2478;

View File

@ -192,6 +192,7 @@ void CrystalizerEQAudioProcessorEditor::setupDisplayNames() {
void CrystalizerEQAudioProcessorEditor::setupToggleButtons() {
bypassButtonLookAndFeel = std::make_unique<Components::BypassButtonLookAndFeel>();
svgToggleButtonLookAndFeel = std::make_unique<Components::SvgToggleButtonLookAndFeel>();
presetMenuButtonLookAndFeel = std::make_unique<Components::PresetMenuButtonLookAndFeel>();
peak1BypassButton.setLookAndFeel(bypassButtonLookAndFeel.get());
peak2BypassButton.setLookAndFeel(bypassButtonLookAndFeel.get());
@ -199,6 +200,7 @@ void CrystalizerEQAudioProcessorEditor::setupToggleButtons() {
masterBypassButton.setLookAndFeel(bypassButtonLookAndFeel.get());
crystalizeButton.setLookAndFeel(svgToggleButtonLookAndFeel.get());
presetMenuButton.setLookAndFeel(presetMenuButtonLookAndFeel.get());
for (auto* b : {&peak1BypassButton, &peak2BypassButton, &peak3BypassButton, &crystalizeButton, &masterBypassButton}) {
b->onClick = [this, b]() {
@ -601,7 +603,6 @@ void CrystalizerEQAudioProcessorEditor::initPresetSystem() {
presetBox.setSelectedId(1, juce::dontSendNotification);
presetMenuButton.setName("PresetMenuButton");
presetMenuButton.setButtonText("Preset Menu");
presetMenuButton.setColour (juce::ToggleButton::textColourId, juce::Colours::black);
presetMenuButton.setColour(juce::ToggleButton::tickColourId, juce::Colours::black);
presetMenuButton.setToggleState(false, juce::dontSendNotification);
@ -668,6 +669,7 @@ CrystalizerEQAudioProcessorEditor::~CrystalizerEQAudioProcessorEditor() {
peak3BypassButton.setLookAndFeel(nullptr);
masterBypassButton.setLookAndFeel(nullptr);
crystalizeButton.setLookAndFeel(nullptr);
presetMenuButton.setLookAndFeel(nullptr);
};
//region paintAnalyzer
@ -695,6 +697,55 @@ void CrystalizerEQAudioProcessorEditor::paint (juce::Graphics& g)
g.fillAll (Colours::BACKGROUNDCOLOUR);
g.setColour (AXIOM::DesignSystem::Colours::FOREGROUNDCOLOUR);
const auto mP = getLocalArea(&mainPanel, mainPanel.getLocalBounds());
auto mPX = mP.getX();
auto mPY = mP.getY();
auto mPW = mP.getWidth();
auto mPH = mP.getHeight();
paintAnalyzer(g);
g.setColour(Colours::SURFACEBYPASS);
const auto hB = getLocalArea(&headerBar, headerBar.getLocalBounds());
auto hBX = hB.getX();
auto hBY = hB.getY();
auto hBW = hB.getWidth();
auto hBH = hB.getHeight();
auto hBPad = ((hBY + mPY) - hBH) / 2;
g.fillRect(hBX, hBY, hBW, mPY - hBPad);
paintBorderLines(g);
g.setColour(Colours::SURFACECOLOUR);
const auto pA = getLocalArea(&presetArea, presetArea.getLocalBounds());
auto pAX = pA.getX();
auto pAY = pA.getY();
auto pAWidth = pA.getWidth();
auto pAHeight = pA.getHeight();
g.fillRoundedRectangle(pAX, pAY - 10.f, pAWidth, pAHeight + 10.f, 10.0f);
paintBorderLines(g);
const auto fA = getLocalArea(&filterArea, filterArea.getLocalBounds());
const int fABorderWidth = 3;
auto fABorder = fA.withSizeKeepingCentre(fA.getWidth() + fABorderWidth, fA.getHeight() + fABorderWidth);
fABorder = fABorder.withX(fABorder.getX() + fABorderWidth).withY(fABorder.getY() + fABorderWidth);
g.setColour(Colours::SURFACECOLOUR);
g.fillRect(fABorder);
fABorder = fABorder.withX(fABorder.getX() - 2* fABorderWidth).withY(fABorder.getY() - 2 * fABorderWidth);
//g.setColour(Colours::FOREGROUNDBYPASS);
g.fillRect(fABorder);
g.setColour(Colours::BACKGROUNDBYPASS);
g.fillRect(fA);
paintBorderLines(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
@ -819,51 +870,6 @@ void CrystalizerEQAudioProcessorEditor::paint (juce::Graphics& g)
}
}
const auto mP = getLocalArea(&mainPanel, mainPanel.getLocalBounds());
auto mPX = mP.getX();
auto mPY = mP.getY();
auto mPW = mP.getWidth();
auto mPH = mP.getHeight();
paintAnalyzer(g);
g.setColour(Colours::SURFACEBYPASS);
const auto hB = getLocalArea(&headerBar, headerBar.getLocalBounds());
auto hBX = hB.getX();
auto hBY = hB.getY();
auto hBW = hB.getWidth();
auto hBH = hB.getHeight();
auto hBPad = ((hBY + mPY) - hBH) / 2;
g.fillRect(hBX, hBY, hBW, mPY - hBPad);
paintBorderLines(g);
g.setColour(Colours::SURFACECOLOUR);
const auto pA = getLocalArea(&presetArea, presetArea.getLocalBounds());
auto pAX = pA.getX();
auto pAY = pA.getY();
auto pAWidth = pA.getWidth();
auto pAHeight = pA.getHeight();
g.fillRoundedRectangle(pAX, pAY - 10.f, pAWidth, pAHeight + 10.f, 10.0f);
paintBorderLines(g);
const auto fA = getLocalArea(&filterArea, filterArea.getLocalBounds());
const int fABorderWidth = 3;
//TODO: BORDER OF FILTERAREA
auto fABorder = fA.withSizeKeepingCentre(fA.getWidth() + fABorderWidth, fA.getHeight() + fABorderWidth);
fABorder = fABorder.withX(fABorder.getX() + fABorderWidth).withY(fABorder.getY() + fABorderWidth);
g.setColour(Colours::SURFACECOLOUR);
g.fillRect(fABorder);
fABorder = fABorder.withX(fABorder.getX() - 2* fABorderWidth).withY(fABorder.getY() - 2 * fABorderWidth);
//g.setColour(Colours::FOREGROUNDBYPASS);
g.fillRect(fABorder);
g.setColour(Colours::BACKGROUNDBYPASS);
g.fillRect(fA);
paintBorderLines(g);
}
//region paintBorderLines
@ -1088,7 +1094,8 @@ void CrystalizerEQAudioProcessorEditor::setupHeader() {
Layout::area(presetBox, 2, 2, 3, 3),
Layout::area(resetButton, 2, 1, 2, 2),
// Menütaste unten rechts (row2, col2)
Layout::area(presetMenuButton, 2, 3, 3, 4),
Layout::area(presetMenuButton, 2, 3, 3, 4)
,
});

View File

@ -253,8 +253,11 @@ private:
std::unique_ptr<DesignSystem::Components::FreqQSliderLookAndFeel> freqQLookAndFeel;
std::unique_ptr<DesignSystem::Components::GlobalSliderLookAndFeel> globalLookAndFeel;
std::unique_ptr<Components::BypassButtonLookAndFeel> bypassButtonLookAndFeel;
std::unique_ptr<Components::PresetMenuButtonLookAndFeel> presetMenuButtonLookAndFeel;
std::unique_ptr<Components::SvgToggleButtonLookAndFeel> svgToggleButtonLookAndFeel;
//SPECRTRUM ANALYZER