Can we get some lambdas added to the ValueTree::Listener class?
struct ValueTreeListener : private ValueTree::Listener
{
ValueTreeListener(const ValueTree& treeToListenTo) : tree(treeToListenTo)
{
tree.addListener(this);
}
~ValueTreeListener()
{
tree.removeListener(this);
}
std::function<void(ValueTree&, const Identifier&)> onValueTreePropertyChanged;
std::function<void(ValueTree&, ValueTree&)> onValueTreeChildAdded;
std::function<void(ValueTree&, ValueTree&, int)> onValueTreeChildRemoved;
std::function<void(ValueTree&, int, int)> onValueTreeChildOrderChanged;
std::function<void(ValueTree&)> onValueTreeParentChanged;
private:
void valueTreePropertyChanged (ValueTree& treeThatChanged, const Identifier& identifier) override
{
if( onValueTreePropertyChanged )
onValueTreePropertyChanged(treeThatChanged, identifier);
}
void valueTreeChildAdded (ValueTree& parentTree, ValueTree& childTree) override
{
if( onValueTreeChildAdded )
onValueTreeChildAdded(parentTree, childTree);
}
void valueTreeChildRemoved (ValueTree& parentTree, ValueTree& childTree, int i) override
{
if( onValueTreeChildRemoved )
onValueTreeChildRemoved(parentTree, childTree, i);
}
void valueTreeChildOrderChanged (ValueTree& parentTree, int a, int b) override
{
if( onValueTreeChildOrderChanged )
onValueTreeChildOrderChanged(parentTree, a, b);
}
void valueTreeParentChanged (ValueTree& tree) override
{
if( onValueTreeParentChanged )
onValueTreeParentChanged(tree);
}
ValueTree tree;
};
I much prefer using Composition over inheritance for my code, and having this little lambda class lets me do that with classes that have ValueTrees as members.
It also removes the need to implement all 5 ValueTree::Listener functions in whatever class I need to listen to changes on a value tree. I just add an instance of this class as a member alongside the ValueTree class member, and set up the lambda accordingly.
struct Foo : Component
{
ValueTree tree{"tree"};
ValueTreeListener listener{tree};
Foo()
{
listener.onValueTreePropertyChanged = [this](ValueTree& tree, const Identifier& id)
{
if( id == "someCoolID" )
{
DBG("someCoolID changed" );
this->someSetting = tree.getProperty(id);
repaint();
}
};
}
void paint(Graphics& g) override { /* etc */ }
int someSetting = 0;
};
I don’t know, maybe std::function<> is too slow/expensive for this. I just abhor massive if/else if/else if blocks that accompany the listener pattern. thoughts?
