rt300@0: // rt300@0: // sliderPanel.cpp rt300@0: // tweakathlon rt300@0: // rt300@0: // Created by Robert Tubb on 11/02/2014. rt300@0: // rt300@0: // rt300@0: rt300@0: #include "sliderPanel.h" rt300@0: rt300@0: //----------------------------------------------------------------------------- rt300@0: SliderPanel::SliderPanel(float ax, rt300@0: float ay, rt300@0: float awidth, rt300@0: float aheight, rt300@0: const UIProps& aprops, rt300@0: vector elemList) : rt300@0: UIElementContainer(ax,ay,awidth,aheight,aprops) rt300@0: { rt300@0: cout << "SliderPanel auto layout contructor\n"; rt300@0: rt300@0: // generateControls(elemList);// called from messageorganiser rt300@28: rt300@28: rt300@28: ofVec3f ori; rt300@28: ori.x = 1.; rt300@28: ori.y = 0.5; rt300@28: rt300@28: resultLight.setOrientation(ori); rt300@28: resultLight.setDirectional(); rt300@28: resultLight.setDiffuseColor(ofColor::white); rt300@0: } rt300@27: //-------------------------------------------------------------------------------- rt300@0: rt300@27: void SliderPanel::showHint(bool value){ rt300@27: if (thisPanelType == ALL_SLIDERS){ rt300@27: vector::iterator UIitr; rt300@27: for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@27: rt300@27: rt300@27: ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr); rt300@27: thisSlider->showHint(value); rt300@27: } rt300@27: }else if(thisPanelType == LEAP6DOF){ rt300@27: if (subElements[0]->getType() == LEAP6D){ rt300@27: Leap6DBox * box = (Leap6DBox*)subElements[0]; rt300@27: rt300@27: box->showHint(value); rt300@27: } rt300@27: } rt300@27: } rt300@27: //------------------------ rt300@27: void SliderPanel::setHintColor(ofColor c){ rt300@27: vector::iterator UIitr; rt300@27: for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@27: (*UIitr)->setHintColor(c); rt300@27: } rt300@27: } rt300@27: //------------------------ rt300@27: void SliderPanel::setSliderColors(ofColor c){ rt300@27: for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@27: ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr); rt300@27: thisSlider->setColor(c); rt300@27: } rt300@27: } rt300@27: //------------------------ rt300@27: void SliderPanel::flash(){ rt300@27: // turn hilight on and off rt300@27: if (!flashing){ rt300@27: vector::iterator UIitr; rt300@27: for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@27: (*UIitr)->setHighlight(true); rt300@27: } rt300@27: // set up timer rt300@27: TimerCallbackFunction tcb; rt300@27: tcb = boost::bind(&SliderPanel::flash, this); rt300@27: timeController.scheduleEvent(tcb, 250); rt300@27: flashing = true; rt300@27: }else{ rt300@27: vector::iterator UIitr; rt300@27: for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@27: (*UIitr)->setHighlight(false); rt300@27: } rt300@27: flashing = false; rt300@27: } rt300@27: rt300@27: } rt300@27: //------------------------ rt300@27: void SliderPanel::setBgColor(ofColor c){ rt300@27: vector::iterator UIitr; rt300@27: for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@27: (*UIitr)->setColor(c); rt300@27: } rt300@27: } rt300@27: //------------------------ rt300@27: //------------------------ rt300@27: UIElement* SliderPanel::getSlider(int index){ rt300@27: if (index < subElements.size()){ rt300@27: return subElements[index]; rt300@27: }else{ rt300@27: cout << "ERROR: index too big for sldiers" << endl; rt300@27: return NULL; rt300@27: } rt300@27: }; rt300@27: //------------------------ rt300@27: void SliderPanel::showValueIndicators(bool show){ rt300@27: rt300@27: rt300@27: if (thisPanelType == LEAP6DOF){ // yeuch rt300@27: if (subElements[0]->getType() == LEAP6D){ rt300@27: Leap6DBox * box = (Leap6DBox*)subElements[0]; rt300@27: rt300@27: box->showValueIndicator(show); rt300@27: } rt300@27: rt300@27: }else if(thisPanelType == ALL_SLIDERS){ rt300@27: for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@27: ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr); rt300@27: thisSlider->showValueIndicator(show); rt300@27: } rt300@27: } rt300@27: } rt300@27: //------------------------ rt300@27: void SliderPanel::setHintValues(vector vals){ rt300@27: if (thisPanelType == LEAP6DOF){ // yeuch rt300@27: if (subElements[0]->getType() == LEAP6D){ rt300@27: Leap6DBox * box = (Leap6DBox*)subElements[0]; rt300@27: rt300@27: box->setHintValues(vals); rt300@27: } rt300@27: }else if(thisPanelType == ALL_SLIDERS){ rt300@29: int i = 0; rt300@29: for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@29: ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr); rt300@29: thisSlider->setHintValue(vals[i]); rt300@29: i++; rt300@29: } rt300@27: } rt300@27: } rt300@28: //------------------------ rt300@28: void SliderPanel::setValues(vector vals){ rt300@28: if (thisPanelType == LEAP6DOF){ // yeuch rt300@28: if (subElements[0]->getType() == LEAP6D){ rt300@28: Leap6DBox * box = (Leap6DBox*)subElements[0]; rt300@32: cout << "set values" << endl; rt300@28: box->setValues(vals); rt300@28: } rt300@28: }else if(thisPanelType == ALL_SLIDERS){ rt300@28: int i = 0; rt300@28: for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@28: ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr); rt300@31: thisSlider->setValueAndScale(vals[i]); rt300@28: i++; rt300@28: } rt300@28: } rt300@28: } rt300@27: rt300@0: //----------------------------------------------------------------------------- rt300@0: vector SliderPanel::generateControls(vector elemList, controlPanelType panelType){ rt300@0: removeAllSubelements(); rt300@0: vector::iterator i; rt300@0: rt300@0: // 10 cm is 520 pixels rt300@0: rt300@0: // calc positions rt300@0: int top = y + myProps.spacerSize; rt300@0: rt300@0: float pixPerElem = width/(float)elemList.size(); rt300@0: if (pixPerElem < myProps.sliderWidth ){ rt300@0: cout << "error not enough room for sliders" << endl; rt300@0: } rt300@0: rt300@0: int n=0; rt300@0: for(i=elemList.begin(); isetLabel("unassigned"); rt300@0: subElements.push_back(revslider); rt300@0: revslider->showHint(false); rt300@0: // grey out all but first rt300@0: if(panelType == SEQUENTIAL && i != elemList.begin()){ rt300@0: revslider->setActive(false); rt300@0: } rt300@0: rt300@0: n++; rt300@0: rt300@0: }else if(*i == XYPAD){ rt300@0: // add a xy rt300@0: float c = (n + 0.5) * pixPerElem; rt300@0: float left = c - myProps.XYsize/2; rt300@0: ButtronXY * xyp = new ButtronXY(left , top , myProps); rt300@0: xyp->setLabel("unassigned","unassigned"); rt300@0: xyp->showHint(false); rt300@0: subElements.push_back(xyp); rt300@0: n++; rt300@0: }else if(*i == LEAP3D){ rt300@0: // add a threed box rt300@0: float c = x+width*0.5; rt300@0: float left = c - myProps.XYsize; rt300@0: rt300@0: //Leap3DBox * l3d = new Leap3DBox(left , top+50 , myProps.XYsize*0.75,myProps.XYsize*0.75,150,50, myProps); rt300@0: rt300@0: Leap3DBoxGL * l3d = new Leap3DBoxGL(left , top+50 , myProps.XYsize*0.75,myProps.XYsize*0.75,150,50, myProps); rt300@0: rt300@0: rt300@0: rt300@0: subElements.push_back(l3d); rt300@0: n++; rt300@27: }else if(*i == LEAP6D){ rt300@27: // add a threed box rt300@27: float c = x+width*0.5; rt300@27: float left = c - myProps.XYsize; rt300@27: rt300@27: Leap6DBox * l6d = new Leap6DBox(left , top+50 , myProps.XYsize*0.75,myProps.XYsize*0.75,150,50, myProps); rt300@27: rt300@27: rt300@27: subElements.push_back(l6d); rt300@27: n++; rt300@0: rt300@0: }else{ rt300@0: cout << "ERROR: slider panel only handles xy pads and sliders" << endl; rt300@0: } rt300@0: rt300@0: rt300@0: } rt300@27: thisPanelType = panelType; rt300@0: autoArrangeRow(); // will set positions rt300@0: rt300@0: rt300@0: rt300@0: return subElements; rt300@0: } rt300@27: //----------------------------------------------------------------------- rt300@27: void SliderPanel::setAndShowHint(vector values, ofImage* texture){ rt300@28: animating = false; rt300@27: setHintValues(values); rt300@27: setHintTexture(texture); rt300@27: showHint(true); rt300@0: rt300@27: } rt300@31: void SliderPanel::setHintNoShow(vector values, ofImage* texture){ rt300@31: animating = false; rt300@31: setHintValues(values); rt300@31: setHintTexture(texture); rt300@31: showHint(false); rt300@31: rt300@31: } rt300@27: //------------------------------------------ rt300@27: void SliderPanel::setHintTexture(ofImage* texture){ rt300@27: if (thisPanelType == LEAP6DOF){ // yeuch rt300@27: if (subElements[0]->getType() == LEAP6D){ rt300@27: Leap6DBox * box = (Leap6DBox*)subElements[0]; rt300@27: rt300@27: box->setHintTexture(texture); rt300@27: } rt300@27: rt300@37: }else if(thisPanelType == ALL_SLIDERS){ rt300@37: rt300@37: for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@37: ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr); rt300@37: thisSlider->setHandTexture(texture); rt300@37: } rt300@27: } rt300@27: } rt300@28: //------------------------------------------ rt300@28: void SliderPanel::setIndicatorTexture(ofImage* texture){ rt300@28: if (thisPanelType == LEAP6DOF){ // yeuch rt300@28: if (subElements[0]->getType() == LEAP6D){ rt300@28: Leap6DBox * box = (Leap6DBox*)subElements[0]; rt300@28: rt300@36: box->setHandTexture(texture); rt300@28: } rt300@28: rt300@37: }else if(thisPanelType == ALL_SLIDERS){ rt300@37: rt300@37: for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@37: ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr); rt300@37: thisSlider->setHandTexture(texture); rt300@37: } rt300@28: } rt300@28: } rt300@28: //--------------------------------------------- rt300@28: void SliderPanel::animateToNewHintValues(vector newTargetValues, float timeToTake, ofImage* newTexture){ rt300@28: animating = true; rt300@28: rt300@28: if(thisPanelType == LEAP6DOF){ rt300@28: if (subElements[0]->getType() == LEAP6D){ rt300@28: Leap6DBox * box = (Leap6DBox*)subElements[0]; rt300@28: rt300@28: box->animateHintToNewValues(newTargetValues, timeToTake, newTexture); rt300@28: } rt300@29: }else if(thisPanelType == ALL_SLIDERS){ rt300@29: int i = 0; rt300@29: for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@29: ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr); rt300@29: rt300@29: thisSlider->animateHintToNewValue(newTargetValues[i], timeToTake); rt300@29: i++; rt300@29: } rt300@28: } rt300@28: rt300@28: } rt300@28: //--------------------------------------------- rt300@31: void SliderPanel::animateToNewValues(vector newTargetValues, float timeToTake){ rt300@31: animating = true; rt300@31: rt300@31: if(thisPanelType == LEAP6DOF){ rt300@31: if (subElements[0]->getType() == LEAP6D){ rt300@31: Leap6DBox * box = (Leap6DBox*)subElements[0]; rt300@31: rt300@31: box->animateToNewValues(newTargetValues, timeToTake); rt300@31: } rt300@31: }else if(thisPanelType == ALL_SLIDERS){ rt300@31: int i = 0; rt300@31: for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@31: ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr); rt300@31: rt300@31: thisSlider->animateToNewValue(newTargetValues[i], timeToTake); rt300@31: i++; rt300@31: } rt300@31: } rt300@31: rt300@31: } rt300@31: //--------------------------------------------- rt300@27: rt300@28: void SliderPanel::update(){ rt300@28: if(!animating) return; rt300@28: if(thisPanelType == LEAP6DOF){ rt300@28: if (subElements[0]->getType() == LEAP6D){ rt300@28: Leap6DBox * box = (Leap6DBox*)subElements[0]; rt300@28: rt300@28: box->update(); rt300@28: } rt300@29: }else if(thisPanelType == ALL_SLIDERS){ rt300@29: for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@29: ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr); rt300@29: thisSlider->update(); rt300@29: rt300@29: } rt300@28: } rt300@28: rt300@28: } rt300@28: rt300@28: rt300@28: void SliderPanel::flashResultLight(ofColor c, int howLong){ rt300@28: rt300@28: resultLight.setDiffuseColor(c); rt300@28: resultLight.enable(); rt300@28: // set up timer rt300@28: TimerCallbackFunction tcb; rt300@28: tcb = boost::bind(&SliderPanel::turnOffResultLight, this); rt300@28: timeController.scheduleEvent(tcb, howLong); rt300@31: if(thisPanelType == LEAP6DOF){ rt300@31: if (subElements[0]->getType() == LEAP6D){ rt300@31: Leap6DBox * box = (Leap6DBox*)subElements[0]; rt300@31: rt300@39: box->flashScore(5, c,howLong); rt300@31: } rt300@31: }else if(thisPanelType == ALL_SLIDERS){ rt300@37: for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){ rt300@37: ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr); rt300@39: thisSlider->flashScore(5, c,howLong); rt300@37: rt300@37: } rt300@31: } rt300@31: rt300@28: } rt300@28: void SliderPanel::turnOffResultLight(){ rt300@28: rt300@28: resultLight.setDiffuseColor(ofColor::white); rt300@28: resultLight.disable(); rt300@28: } rt300@37: rt300@28: //--------------------------------------------- rt300@28: //--------------------------------------------- rt300@28: //--------------------------------------------- rt300@28: //--------------------------------------------- rt300@28: