diff --git a/src/ui/ofxRadioList.cpp b/src/ui/ofxRadioList.cpp new file mode 100644 index 0000000..655fbe7 --- /dev/null +++ b/src/ui/ofxRadioList.cpp @@ -0,0 +1,95 @@ +#include "ofxRadioList.h" + +ofxRadioList::ofxRadioList(){} + +ofxRadioList::ofxRadioList(vector &labels) +{ + setup(labels); +} + +ofxRadioList::~ofxRadioList() +{ + removeListeners(); + + int i; + for (i = 0; i < toggles.size(); i++) { + delete toggles[i]; + } + toggles.clear(); +} + +void ofxRadioList::setup(vector &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->setPosition(0, toggle->getHeight() * i); + toggles.push_back(toggle); + } + + addListeners(); +} + +void ofxRadioList::draw() +{ + int i; + for (i = 0; i < toggles.size(); i++) { + toggles[i]->draw(); + } +} + +void ofxRadioList::addListeners() +{ + if (toggles.size() <= 0) return; + + int i; + for (i = 0; i < toggles.size(); i++) { + toggles[i]->addListener(this, &ofxRadioList::onToggleClicked); + } +} + +void ofxRadioList::removeListeners() +{ + if (toggles.size() <= 0) return; + + int i; + for (i = 0; i < toggles.size(); i++) { + toggles[i]->removeListener(this, &ofxRadioList::onToggleClicked); + } +} + +void ofxRadioList::unselectAll() +{ + int i; + + removeListeners(); + + for (i = 0; i < toggles.size(); i++) { + ofParameter* paramPtr = static_cast*>(&toggles[i]->getParameter()); + *toggles[i] = false; + } + + addListeners(); +} + +void ofxRadioList::onToggleClicked(bool &toggleValue) +{ + unselectAll(); + + // Search for the actual toggle triggering the event + int i; + for (i = 0; i < toggles.size(); i++) { + ofParameter* paramPtr = static_cast*>(&toggles[i]->getParameter()); + + if (&(paramPtr->get()) == &toggleValue) { + removeListeners(); + *toggles[i] = true; + cout << toggles[i]->getName() << endl; + addListeners(); + break; + } + } +} diff --git a/src/ui/ofxRadioList.h b/src/ui/ofxRadioList.h new file mode 100644 index 0000000..fa1a34c --- /dev/null +++ b/src/ui/ofxRadioList.h @@ -0,0 +1,23 @@ +#pragma once + +#include "ofGraphics.h" +#include "ofxToggle.h" + +class ofxRadioList +{ +public: + ofxRadioList(); + ofxRadioList(vector &labels); + ~ofxRadioList(); + + void setup(vector &labels); + void draw(); + +private: + vector toggles; + + void addListeners(); + void removeListeners(); + void unselectAll(); + void onToggleClicked(bool &toggleValue); +}; \ No newline at end of file