LambdaButton

Thanks to @jules example above, in the process of Lambda-ifying a class to make it more “functional style” and flexible I needed to set a callback on a TransportAudioSource when it reaches the end of a file:

void attachChangeListenerCallback (ChangeBroadcaster& source, std::function<bool ()> callback)
{
    struct ChangeListenerCallback  : public ChangeListener
    {
        ChangeListenerCallback (ChangeBroadcaster& b, std::function<bool()> f) : target (b), fn (f)
        {
            target.addChangeListener (this);
        }

        ~ChangeListenerCallback()
        {
            target.removeChangeListener (this);
        }

        void changeListenerCallback (ChangeBroadcaster*) override
        {
            if (fn())
            {
                // Delete listener once successfully executed
                delete this;
            }
        }

        ChangeBroadcaster& target;
        std::function<bool()> fn;

        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChangeListenerCallback)
    };

    new ChangeListenerCallback (source, callback);
}

I made the lambda return a bool so that the listener can be deleted once a condition is met.

you’ll probably like my lambdaMouse implementation here, as a macro:

1 Like