class RadioButtonGroup
{
public:
RadioButtonGroup() :
size(0),
radioButtonClicked(this, &RadioButtonGroup::radioButtonClickedHandler),
radioButtonUnselected(this, &RadioButtonGroup::radioButtonDeselectedHandler),
radioButtonSelectedCallback(0),
radioButtonDeselectedCallback(0)
{
}
virtual ~RadioButtonGroup()
{
}
virtual void add(RadioButton& radioButton)
{
assert(size < CAPACITY && "RadioButtonGroup capacity exceeded!");
radioButton.setAction(radioButtonClicked);
radioButton.setDeselectedAction(radioButtonUnselected);
radioButtons[size++] = &radioButton;
}
virtual RadioButton* getRadioButton(uint16_t index) const
{
return (size > index) ? radioButtons[index] : 0;
}
virtual int32_t getSelectedRadioButtonIndex() const
{
for (uint16_t i = 0; i < size; i++)
{
if (radioButtons[i]->getSelected())
{
return i;
}
}
return -1;
}
virtual RadioButton* getSelectedRadioButton() const
{
int32_t index = getSelectedRadioButtonIndex();
return (index < 0) ? 0 : getRadioButton(index);
}
virtual void setSelected(RadioButton& radioButton)
{
radioButton.setSelected(true);
radioButtonClickedHandler(radioButton);
}
virtual void setDeselectionEnabled(bool deselectionEnabled)
{
for (uint16_t i = 0; i < size; i++)
{
radioButtons[i]->setDeselectionEnabled(deselectionEnabled);
}
}
virtual bool getDeselectionEnabled() const
{
return (size > 0) ? radioButtons[0]->getDeselectionEnabled() : false;
}
void setRadioButtonSelectedHandler(GenericCallback< const AbstractButton& >& callback)
{
radioButtonSelectedCallback = &callback;
}
void setRadioButtonDeselectedHandler(GenericCallback< const AbstractButton& >& callback)
{
radioButtonDeselectedCallback = &callback;
}
protected:
RadioButton* radioButtons[CAPACITY];
uint16_t size;
Callback<RadioButtonGroup, const AbstractButton& > radioButtonClicked;
Callback<RadioButtonGroup, const AbstractButton& > radioButtonUnselected;
GenericCallback<const AbstractButton& >* radioButtonSelectedCallback;
GenericCallback<const AbstractButton& >* radioButtonDeselectedCallback;
virtual void radioButtonClickedHandler(const AbstractButton& radioButton)
{
for (uint16_t i = 0; i < size; i++)
{
if (radioButtons[i] != &radioButton)
{
if (radioButtons[i]->getSelected())
{
radioButtons[i]->setSelected(false);
}
}
}
if (radioButtonSelectedCallback && radioButtonSelectedCallback->isValid())
{
radioButtonSelectedCallback->execute(radioButton);
}
}
virtual void radioButtonDeselectedHandler(const AbstractButton& radioButton)
{
if (radioButtonDeselectedCallback && radioButtonDeselectedCallback->isValid())
{
radioButtonDeselectedCallback->execute(radioButton);
}
}
};