rt300@0: // rt300@0: // UIElementContainer.h rt300@0: // emptyExample rt300@0: // rt300@0: // Created by Robert Tubb on 22/05/2013. rt300@0: // rt300@0: // rt300@0: rt300@0: rt300@0: // a meta button, with border. rt300@0: rt300@0: #ifndef __emptyExample__UIElementContainer__ rt300@0: #define __emptyExample__UIElementContainer__ rt300@0: rt300@0: #include rt300@0: #include "globalVariables.h" rt300@0: #include "ofMain.h" rt300@0: #include "UIElement.h" rt300@0: #include "boost/bind.hpp" rt300@0: #include "boost/function.hpp" rt300@0: #include "timeController.h" rt300@0: // is a UI "panel" containing sub elements rt300@0: // helps control the focus of the touch event rt300@0: rt300@0: rt300@0: extern TimeController timeController; rt300@0: rt300@0: class UIElementContainer: public UIElement{ rt300@0: public: rt300@0: UIProps myProps; rt300@0: vector subElements; rt300@0: UIElementContainer(); rt300@0: ~UIElementContainer(){ rt300@0: removeAllSubelements(); rt300@0: }; rt300@0: UIElementContainer(float ax, rt300@0: float ay, rt300@0: float awidth, rt300@0: float aheight, rt300@0: const UIProps& props); // constructor 1 : we add stuff later rt300@0: rt300@0: void addElement(UIElement *elm){ rt300@0: subElements.push_back(elm); rt300@0: rt300@0: }; rt300@0: void removeAllSubelements(); rt300@0: rt300@0: int getNumberOfControls(); rt300@0: UIElement* getElement(int idx){ rt300@0: if (idx < subElements.size()){ rt300@0: return subElements[idx]; rt300@0: }else{ rt300@0: cout << "ERROR ERROR: index too big for subelemens" << endl; rt300@0: } rt300@0: rt300@0: } rt300@0: void showBorder(bool s){ rt300@0: if(s){ rt300@0: cthickness = 1; rt300@0: rt300@0: } rt300@0: } rt300@0: virtual void draw(); rt300@0: bool handleMyTouch(int x, int y, touchType ttype, int touchID){ rt300@0: vector::iterator UIitr; rt300@0: for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@0: (*UIitr)->touch(x,y,ttype,touchID); rt300@0: } rt300@0: return true; rt300@0: } rt300@0: rt300@0: void setActive(bool isActive){ rt300@0: vector::iterator UIitr; rt300@0: for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@0: (*UIitr)->setActive(isActive); rt300@0: } rt300@0: } rt300@0: rt300@0: void autoArrangeRow(){ rt300@0: // goes thru subelements and sets x and y pos to something sensible rt300@0: rt300@0: // add up all element widths rt300@0: float sum = accumulate(subElements.begin(), subElements.end(), 0.0, &UIElement::sumWidth); rt300@0: rt300@0: float spaceLeft = width - sum; rt300@0: rt300@0: float spac = spaceLeft/(getNumberOfControls()+1); rt300@0: rt300@0: if (spac <= 0){ rt300@0: cout << "ERROR: not enough space for controls" << endl; rt300@0: rt300@0: } rt300@0: float pos = spac; rt300@0: vector::iterator ei; rt300@0: for(ei = subElements.begin(); ei < subElements.end(); ei++){ rt300@0: (*ei)->setX(pos); rt300@0: pos = pos + (*ei)->getWidth() + spac; rt300@0: } rt300@0: // TODO y set to centred rt300@0: } rt300@42: rt300@42: rt300@42: void showHideElementWithName(string label, bool show){ rt300@42: rt300@42: for( auto eit = subElements.begin(); eit < subElements.end(); eit++){ rt300@42: if( (*eit)->getLabel() == label ){ rt300@42: if (show){ rt300@42: (*eit)->show(); rt300@42: }else{ rt300@42: (*eit)->hide(); rt300@42: } rt300@42: } rt300@42: } rt300@42: } rt300@42: void showOnlyElementNamed(string label){ rt300@42: for( auto eit = subElements.begin(); eit < subElements.end(); eit++){ rt300@42: if( (*eit)->getLabel() == label ){ rt300@42: rt300@42: (*eit)->show(); rt300@42: }else{ rt300@42: (*eit)->hide(); rt300@42: } rt300@42: } rt300@42: } rt300@42: void showAllElements(){ rt300@42: for( auto eit = subElements.begin(); eit < subElements.end(); eit++){ rt300@42: rt300@42: (*eit)->show(); rt300@49: (*eit)->setOn(false); rt300@49: rt300@42: } rt300@42: } rt300@0: private: rt300@0: void drawBorder(); rt300@0: double cthickness; rt300@0: bool flashing; rt300@0: }; rt300@0: rt300@0: #endif /* defined(__emptyExample__UIElementContainer__) */