ofxPiMapper fixed for C++17 & oF 12.0
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

#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;
}
}
}