Hello @jules @ed95 @fabian and the rest of the JUCE team. Here is a suggested addition to allow lambdas as the callbacks for mouseEvents on any/all Components. If the lambda doesn’t exist, it defaults to the regular MouseListener methods. To make it work, just modify juce::Component so that it inherits from LambdaMouseListener instead of MouseListener and every component in the API will now have access to this lambda ability
class LambdaMouseListener : public juce::MouseListener
{
public:
LambdaMouseListener() {}
~LambdaMouseListener() {}
//these are the mouse event lambdas
std::function<void(const MouseEvent& e)> mouseMoveHandler;
std::function<void(const MouseEvent& e)> mouseEnterHandler;
std::function<void(const MouseEvent& e)> mouseExitHandler;
std::function<void(const MouseEvent& e)> mouseDownHandler;
std::function<void(const MouseEvent& e)> mouseDragHandler;
std::function<void(const MouseEvent& e)> mouseUpHandler;
std::function<void(const MouseEvent& e)> mouseDoubleClickHandler;
std::function<void(const MouseEvent& e, const MouseWheelDetails& wheel)> mouseWheelMoveHandler;
protected:
//these are the mouse event handlers. if the lambda exists, use it. if not, use the default mouse event handler for the component
void mouseMove(const MouseEvent& e) override
{
if( mouseMoveHandler ) { mouseMoveHandler(e); }
else { MouseListener::mouseMove(e); }
}
void mouseEnter(const MouseEvent& e) override
{
if( mouseEnterHandler ) { mouseEnterHandler(e); }
else { MouseListener::mouseEnter(e); }
}
void mouseExit(const MouseEvent& e) override
{
if( mouseExitHandler ) { mouseExitHandler(e); }
else { MouseListener::mouseExit(e); }
}
void mouseDown(const MouseEvent& e) override
{
if( mouseDownHandler ) { mouseDownHandler(e); }
else { MouseListener::mouseDown(e); }
}
void mouseDrag(const MouseEvent& e) override
{
if( mouseDragHandler ) { mouseDragHandler(e); }
else { MouseListener::mouseDrag(e); }
}
void mouseUp(const MouseEvent& e) override
{
if( mouseUpHandler ) { mouseUpHandler(e); }
else { MouseListener::mouseUp(e); }
}
void mouseDoubleClick(const MouseEvent& e) override
{
if( mouseDoubleClickHandler ) { mouseDoubleClickHandler(e); }
else { MouseListener::mouseDoubleClick(e); }
}
void mouseWheelMove(const MouseEvent& e, const MouseWheelDetails& wheel) override
{
if( mouseWheelMoveHandler ) { mouseWheelMoveHandler(e, wheel); }
else { MouseListener::mouseWheelMove(e, wheel); }
}
};
I’ve also created a similar tool that lets you use Lambdas as the callbacks for Buttons. I’ll share that in a separate post.
usage:
Component c;
c.mouseMoveHandler = [this](const MouseEvent&) { DBG( "you moved the mouse over " + this->c.getName() );};