Files
serumalt/Source/GUI/ToggleButton.cpp
T
biggy e4cea300db chore: land janitor round 1 and graft integration
Round 1 findings and fixes, all previously uncommitted:
- FXProcessor per-slot DSP history repair (HEAD does not compile without it)
- SynthVoice::getModulationValue, editor control-lock guard
- ExactCompare.h naming the deliberate exact float comparisons
- KnobLookAndFeel replacing the never-installed SerumLookAndFeel
- 55 first-party compiler warnings to 0
- AGENT.md renamed to AGENTS.md across Source/
- graft repository context graph and its hooks
- JANITOR_TASKS.md and UI_UX_AUDIT.md records
2026-10-06 08:50:45 +02:00

80 lines
2.3 KiB
C++

#include "ToggleButton.h"
namespace serum
{
ToggleButton::ToggleButton (const juce::String& lbl) : label (lbl)
{
setRepaintsOnMouseActivity (true);
}
void ToggleButton::attach (juce::AudioProcessorValueTreeState& apvts, const juce::String& paramId)
{
attachment.reset();
if (auto* param = apvts.getParameter (paramId))
{
attachment = std::make_unique<juce::ParameterAttachment> (*param,
[this] (float newValue) { setToggleState (newValue > 0.5f); });
attachment->sendInitialUpdate();
}
}
void ToggleButton::setToggleState (bool s)
{
if (state == s)
return;
state = s;
repaint();
}
void ToggleButton::paint (juce::Graphics& g)
{
const auto bounds = getLocalBounds().toFloat();
const float ledSize = juce::jmin (bounds.getHeight() - 16.0f, 16.0f);
const juce::Rectangle<float> led ((bounds.getWidth() - ledSize) * 0.5f, 4.0f, ledSize, ledSize);
const bool live = isEnabled();
const bool hovered = live && isMouseOverOrDragging();
if (state)
{
// Hover brightens the halo, disabled dims it, so the three states are
// distinguishable without relying on colour alone.
const float halo = live ? (hovered ? 0.55f : 0.35f) : 0.15f;
g.setColour (onColour.withAlpha (halo));
g.fillEllipse (led.expanded (6.0f));
g.setColour (live ? onColour : onColour.withAlpha (0.4f));
}
else
{
g.setColour (hovered ? theme::textDim : theme::outline);
}
g.fillEllipse (led);
g.setColour (state ? juce::Colours::black : theme::textDim);
g.drawEllipse (led, live ? (hovered ? 1.6f : 1.0f) : 0.8f);
const auto labelColour = ! live ? theme::outline
: (state ? theme::text : (hovered ? theme::text : theme::textDim));
g.setColour (labelColour);
g.setFont (juce::Font (11.0f));
g.drawText (label, 0, (int) (led.getBottom() + 2), getWidth(), 14, juce::Justification::centred, false);
}
void ToggleButton::mouseDown (const juce::MouseEvent&)
{
const bool newState = ! state;
if (onClick)
{
onClick (newState);
}
else if (attachment != nullptr)
{
attachment->setValueAsCompleteGesture (newState ? 1.0f : 0.0f);
}
setToggleState (newState);
}
} // namespace serum