You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
188 lines
4.3 KiB
188 lines
4.3 KiB
#include "ofxRadioList.h"
|
|
|
|
ofxRadioList::ofxRadioList()
|
|
{
|
|
storedTitle = "";
|
|
storedSelectedItem = 0;
|
|
}
|
|
|
|
ofxRadioList::ofxRadioList(vector<string> &labels)
|
|
{
|
|
ofxRadioList();
|
|
setup(labels);
|
|
}
|
|
|
|
ofxRadioList::ofxRadioList(string title, vector<string> &labels)
|
|
{
|
|
ofxRadioList();
|
|
setup(title, labels);
|
|
}
|
|
|
|
ofxRadioList::~ofxRadioList()
|
|
{
|
|
clear();
|
|
}
|
|
|
|
void ofxRadioList::setup(vector<string> &labels)
|
|
{
|
|
// Copy incomming labels for later use
|
|
storedLabels = labels;
|
|
|
|
// Create toggles with labels from the labels arg
|
|
int i;
|
|
for (i = 0; i < labels.size(); i++) {
|
|
ofxToggle* toggle = new ofxToggle();
|
|
toggle->setup(false);
|
|
toggle->setName(labels[i]);
|
|
toggle->addListener(this, &ofxRadioList::onToggleClicked);
|
|
guiGroup.add(toggle);
|
|
}
|
|
|
|
cout << "num items: " << guiGroup.getNumControls() << endl;
|
|
}
|
|
|
|
void ofxRadioList::setup(string title, vector<string> &labels)
|
|
{
|
|
// Store title for later use
|
|
storedTitle = title;
|
|
guiGroup.setName(title);
|
|
setup(labels);
|
|
}
|
|
|
|
void ofxRadioList::draw()
|
|
{
|
|
guiGroup.draw();
|
|
}
|
|
|
|
void ofxRadioList::setTitle(string title)
|
|
{
|
|
storedTitle = title;
|
|
guiGroup.setName(title);
|
|
}
|
|
|
|
void ofxRadioList::setPosition(ofPoint p)
|
|
{
|
|
guiGroup.setPosition(p);
|
|
}
|
|
|
|
void ofxRadioList::setPosition(float x, float y)
|
|
{
|
|
guiGroup.setPosition(x, y);
|
|
}
|
|
|
|
void ofxRadioList::selectItem(int index)
|
|
{
|
|
if (index >= guiGroup.getNumControls()) {
|
|
return;
|
|
}
|
|
|
|
unselectAll();
|
|
|
|
ofxToggle* toggle = static_cast<ofxToggle*>(guiGroup.getControl(index));
|
|
toggle->removeListener(this, &ofxRadioList::onToggleClicked);
|
|
*toggle = true; // Select the specific radio button
|
|
toggle->addListener(this, &ofxRadioList::onToggleClicked);
|
|
string name = toggle->getName();
|
|
ofNotifyEvent(radioSelectedEvent, name, this);
|
|
|
|
storedSelectedItem = index;
|
|
}
|
|
|
|
void ofxRadioList::enable()
|
|
{
|
|
if (guiGroup.getNumControls() >= 0) {
|
|
clear();
|
|
}
|
|
|
|
// Rebuild everyting
|
|
setup(storedTitle, storedLabels);
|
|
|
|
// Select the stored selected item without throwing an event
|
|
ofxToggle* toggle = static_cast<ofxToggle*>(guiGroup.getControl(storedSelectedItem));
|
|
toggle->removeListener(this, &ofxRadioList::onToggleClicked);
|
|
*toggle = true;
|
|
toggle->addListener(this, &ofxRadioList::onToggleClicked);
|
|
|
|
cout << "num items after enable: " << guiGroup.getNumControls() << endl;
|
|
}
|
|
|
|
void ofxRadioList::disable()
|
|
{
|
|
// Just remove everything
|
|
clear();
|
|
}
|
|
|
|
void ofxRadioList::clear()
|
|
{
|
|
int i;
|
|
for (i = 0; i < guiGroup.getNumControls(); i++) {
|
|
ofxToggle* toggle = static_cast<ofxToggle*>(guiGroup.getControl(i));
|
|
toggle->removeListener(this, &ofxRadioList::onToggleClicked);
|
|
delete toggle;
|
|
}
|
|
guiGroup.clear();
|
|
}
|
|
|
|
void ofxRadioList::unselectAll()
|
|
{
|
|
int i;
|
|
for (i = 0; i < guiGroup.getNumControls(); i++) {
|
|
ofxToggle* toggle = static_cast<ofxToggle*>(guiGroup.getControl(i));
|
|
ofParameter<bool>* paramPtr = static_cast<ofParameter<bool>*>(&toggle->getParameter());
|
|
toggle->removeListener(this, &ofxRadioList::onToggleClicked);
|
|
*toggle = false;
|
|
toggle->addListener(this, &ofxRadioList::onToggleClicked);
|
|
}
|
|
}
|
|
|
|
ofPoint ofxRadioList::getPosition()
|
|
{
|
|
return guiGroup.getPosition();
|
|
}
|
|
|
|
float ofxRadioList::getWidth()
|
|
{
|
|
return guiGroup.getWidth();
|
|
}
|
|
|
|
float ofxRadioList::getHeight()
|
|
{
|
|
return guiGroup.getHeight();
|
|
}
|
|
|
|
string ofxRadioList::getTitle()
|
|
{
|
|
return guiGroup.getName();
|
|
}
|
|
|
|
string ofxRadioList::getItemName(int index)
|
|
{
|
|
if (index >= guiGroup.getNumControls()) {
|
|
return "";
|
|
}
|
|
|
|
ofxToggle* toggle = static_cast<ofxToggle*>(guiGroup.getControl(index));
|
|
return toggle->getName();
|
|
}
|
|
|
|
int ofxRadioList::size()
|
|
{
|
|
return guiGroup.getNumControls();
|
|
}
|
|
|
|
void ofxRadioList::onToggleClicked(bool &toggleValue)
|
|
{
|
|
unselectAll();
|
|
|
|
// Search for the actual toggle triggering the event
|
|
int i;
|
|
for (i = 0; i < guiGroup.getNumControls(); i++) {
|
|
ofxToggle* toggle = static_cast<ofxToggle*>(guiGroup.getControl(i));
|
|
ofParameter<bool>* paramPtr = static_cast<ofParameter<bool>*>(&toggle->getParameter());
|
|
|
|
if (&(paramPtr->get()) == &toggleValue) {
|
|
selectItem(i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|