How to set additional properties on the buttons in a ButtonGroup (Starling version)

ButtonGroup supports setting a number of properties on its buttons through its dataProvider property, like label and isEnabled. Sometimes, we may need to set additional properties on the buttons. ButtonGroup makes it easy to customize how its dataProvider is interpreted with the buttonInitializer property.

The buttonInitializer is a function that is called for each item in the data provider. The ButtonGroup passes in a Button and an item from the data provider. The function signature looks like this:

function( button:Button, item:Object ):void

If we want the ButtonGroup to support additional properties on its buttons, we can pass in a custom buttonInitializer. First, though, let's save a reference to the default buttonInitializer in a variable because we want to preserve the default behavior:

var group:ButtonGroup = new ButtonGroup();
var defaultButtonInitializer:Function = group.buttonInitializer;

Now, we can create our own custom buttonInitializer function that sets additional properties:

function customButtonInitializer( button:Button, item:Object ):void
	// keep the default behavior
	defaultButtonInitializer( button, item );

	// then add new properties!
	button.scaleWhenDown = item.scaleWhenDown;

group.buttonInitializer = customButtonInitializer;

Notice that we call the defaultButtonInitializer first. We still want to set properties like label and isEnabled and add listeners like Event.TRIGGERED.

Afterwards, we've also chosen to copy the scaleWhenDown property from the item to the button.

If we wanted to make some properties optional, we could call hasOwnProperty() before setting them, like this:

if( item.hasOwnProperty( "scaleWhenDown" ) )
	button.scaleWhenDown = item.scaleWhenDown;