rt300@0
|
1 //
|
rt300@0
|
2 // sliderPanel.cpp
|
rt300@0
|
3 // tweakathlon
|
rt300@0
|
4 //
|
rt300@0
|
5 // Created by Robert Tubb on 11/02/2014.
|
rt300@0
|
6 //
|
rt300@0
|
7 //
|
rt300@0
|
8
|
rt300@0
|
9 #include "sliderPanel.h"
|
rt300@0
|
10
|
rt300@0
|
11 //-----------------------------------------------------------------------------
|
rt300@0
|
12 SliderPanel::SliderPanel(float ax,
|
rt300@0
|
13 float ay,
|
rt300@0
|
14 float awidth,
|
rt300@0
|
15 float aheight,
|
rt300@0
|
16 const UIProps& aprops,
|
rt300@0
|
17 vector<controllerType> elemList) :
|
rt300@0
|
18 UIElementContainer(ax,ay,awidth,aheight,aprops)
|
rt300@0
|
19 {
|
rt300@0
|
20 cout << "SliderPanel auto layout contructor\n";
|
rt300@0
|
21
|
rt300@0
|
22 // generateControls(elemList);// called from messageorganiser
|
rt300@28
|
23
|
rt300@28
|
24
|
rt300@28
|
25 ofVec3f ori;
|
rt300@28
|
26 ori.x = 1.;
|
rt300@28
|
27 ori.y = 0.5;
|
rt300@28
|
28
|
rt300@28
|
29 resultLight.setOrientation(ori);
|
rt300@28
|
30 resultLight.setDirectional();
|
rt300@28
|
31 resultLight.setDiffuseColor(ofColor::white);
|
rt300@0
|
32 }
|
rt300@27
|
33 //--------------------------------------------------------------------------------
|
rt300@0
|
34
|
rt300@27
|
35 void SliderPanel::showHint(bool value){
|
rt300@27
|
36 if (thisPanelType == ALL_SLIDERS){
|
rt300@27
|
37 vector<UIElement *>::iterator UIitr;
|
rt300@27
|
38 for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
|
rt300@27
|
39
|
rt300@27
|
40
|
rt300@27
|
41 ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
|
rt300@27
|
42 thisSlider->showHint(value);
|
rt300@27
|
43 }
|
rt300@27
|
44 }else if(thisPanelType == LEAP6DOF){
|
rt300@27
|
45 if (subElements[0]->getType() == LEAP6D){
|
rt300@27
|
46 Leap6DBox * box = (Leap6DBox*)subElements[0];
|
rt300@27
|
47
|
rt300@27
|
48 box->showHint(value);
|
rt300@27
|
49 }
|
rt300@27
|
50 }
|
rt300@27
|
51 }
|
rt300@27
|
52 //------------------------
|
rt300@27
|
53 void SliderPanel::setHintColor(ofColor c){
|
rt300@27
|
54 vector<UIElement *>::iterator UIitr;
|
rt300@27
|
55 for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
|
rt300@27
|
56 (*UIitr)->setHintColor(c);
|
rt300@27
|
57 }
|
rt300@27
|
58 }
|
rt300@27
|
59 //------------------------
|
rt300@27
|
60 void SliderPanel::setSliderColors(ofColor c){
|
rt300@27
|
61 for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
|
rt300@27
|
62 ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
|
rt300@27
|
63 thisSlider->setColor(c);
|
rt300@27
|
64 }
|
rt300@27
|
65 }
|
rt300@27
|
66 //------------------------
|
rt300@27
|
67 void SliderPanel::flash(){
|
rt300@27
|
68 // turn hilight on and off
|
rt300@27
|
69 if (!flashing){
|
rt300@27
|
70 vector<UIElement *>::iterator UIitr;
|
rt300@27
|
71 for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
|
rt300@27
|
72 (*UIitr)->setHighlight(true);
|
rt300@27
|
73 }
|
rt300@27
|
74 // set up timer
|
rt300@27
|
75 TimerCallbackFunction tcb;
|
rt300@27
|
76 tcb = boost::bind(&SliderPanel::flash, this);
|
rt300@27
|
77 timeController.scheduleEvent(tcb, 250);
|
rt300@27
|
78 flashing = true;
|
rt300@27
|
79 }else{
|
rt300@27
|
80 vector<UIElement *>::iterator UIitr;
|
rt300@27
|
81 for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
|
rt300@27
|
82 (*UIitr)->setHighlight(false);
|
rt300@27
|
83 }
|
rt300@27
|
84 flashing = false;
|
rt300@27
|
85 }
|
rt300@27
|
86
|
rt300@27
|
87 }
|
rt300@27
|
88 //------------------------
|
rt300@27
|
89 void SliderPanel::setBgColor(ofColor c){
|
rt300@27
|
90 vector<UIElement *>::iterator UIitr;
|
rt300@27
|
91 for(UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
|
rt300@27
|
92 (*UIitr)->setColor(c);
|
rt300@27
|
93 }
|
rt300@27
|
94 }
|
rt300@27
|
95 //------------------------
|
rt300@27
|
96 //------------------------
|
rt300@27
|
97 UIElement* SliderPanel::getSlider(int index){
|
rt300@27
|
98 if (index < subElements.size()){
|
rt300@27
|
99 return subElements[index];
|
rt300@27
|
100 }else{
|
rt300@27
|
101 cout << "ERROR: index too big for sldiers" << endl;
|
rt300@27
|
102 return NULL;
|
rt300@27
|
103 }
|
rt300@27
|
104 };
|
rt300@27
|
105 //------------------------
|
rt300@27
|
106 void SliderPanel::showValueIndicators(bool show){
|
rt300@27
|
107
|
rt300@27
|
108
|
rt300@27
|
109 if (thisPanelType == LEAP6DOF){ // yeuch
|
rt300@27
|
110 if (subElements[0]->getType() == LEAP6D){
|
rt300@27
|
111 Leap6DBox * box = (Leap6DBox*)subElements[0];
|
rt300@27
|
112
|
rt300@27
|
113 box->showValueIndicator(show);
|
rt300@27
|
114 }
|
rt300@27
|
115
|
rt300@27
|
116 }else if(thisPanelType == ALL_SLIDERS){
|
rt300@27
|
117 for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
|
rt300@27
|
118 ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
|
rt300@27
|
119 thisSlider->showValueIndicator(show);
|
rt300@27
|
120 }
|
rt300@27
|
121 }
|
rt300@27
|
122 }
|
rt300@27
|
123 //------------------------
|
rt300@27
|
124 void SliderPanel::setHintValues(vector<int> vals){
|
rt300@27
|
125 if (thisPanelType == LEAP6DOF){ // yeuch
|
rt300@27
|
126 if (subElements[0]->getType() == LEAP6D){
|
rt300@27
|
127 Leap6DBox * box = (Leap6DBox*)subElements[0];
|
rt300@27
|
128
|
rt300@27
|
129 box->setHintValues(vals);
|
rt300@27
|
130 }
|
rt300@27
|
131 }else if(thisPanelType == ALL_SLIDERS){
|
rt300@29
|
132 int i = 0;
|
rt300@29
|
133 for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
|
rt300@29
|
134 ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
|
rt300@29
|
135 thisSlider->setHintValue(vals[i]);
|
rt300@29
|
136 i++;
|
rt300@29
|
137 }
|
rt300@27
|
138 }
|
rt300@27
|
139 }
|
rt300@28
|
140 //------------------------
|
rt300@28
|
141 void SliderPanel::setValues(vector<int> vals){
|
rt300@28
|
142 if (thisPanelType == LEAP6DOF){ // yeuch
|
rt300@28
|
143 if (subElements[0]->getType() == LEAP6D){
|
rt300@28
|
144 Leap6DBox * box = (Leap6DBox*)subElements[0];
|
rt300@32
|
145 cout << "set values" << endl;
|
rt300@28
|
146 box->setValues(vals);
|
rt300@28
|
147 }
|
rt300@28
|
148 }else if(thisPanelType == ALL_SLIDERS){
|
rt300@28
|
149 int i = 0;
|
rt300@28
|
150 for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
|
rt300@28
|
151 ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
|
rt300@31
|
152 thisSlider->setValueAndScale(vals[i]);
|
rt300@28
|
153 i++;
|
rt300@28
|
154 }
|
rt300@28
|
155 }
|
rt300@28
|
156 }
|
rt300@27
|
157
|
rt300@0
|
158 //-----------------------------------------------------------------------------
|
rt300@0
|
159 vector<UIElement*> SliderPanel::generateControls(vector<controllerType> elemList, controlPanelType panelType){
|
rt300@0
|
160 removeAllSubelements();
|
rt300@0
|
161 vector<controllerType>::iterator i;
|
rt300@0
|
162
|
rt300@0
|
163 // 10 cm is 520 pixels
|
rt300@0
|
164
|
rt300@0
|
165 // calc positions
|
rt300@0
|
166 int top = y + myProps.spacerSize;
|
rt300@0
|
167
|
rt300@0
|
168 float pixPerElem = width/(float)elemList.size();
|
rt300@0
|
169 if (pixPerElem < myProps.sliderWidth ){
|
rt300@0
|
170 cout << "error not enough room for sliders" << endl;
|
rt300@0
|
171 }
|
rt300@0
|
172
|
rt300@0
|
173 int n=0;
|
rt300@0
|
174 for(i=elemList.begin(); i<elemList.end();i++){
|
rt300@0
|
175 if(*i == SLIDER){
|
rt300@0
|
176 // add a slider
|
rt300@0
|
177 float c = (n + 0.5) * pixPerElem;
|
rt300@0
|
178 float l = c - myProps.sliderWidth/2;
|
rt300@0
|
179 if(n==1){
|
rt300@0
|
180 cout << "centre " << c << endl;
|
rt300@0
|
181 cout << l << endl;
|
rt300@0
|
182 }
|
rt300@0
|
183
|
rt300@38
|
184 ButtronSlider * revslider = new ButtronSlider(l , top , myProps.sliderWidth, myProps.sliderHeight,FILL, myProps);
|
rt300@0
|
185 revslider->setLabel("unassigned");
|
rt300@0
|
186 subElements.push_back(revslider);
|
rt300@0
|
187 revslider->showHint(false);
|
rt300@0
|
188 // grey out all but first
|
rt300@0
|
189 if(panelType == SEQUENTIAL && i != elemList.begin()){
|
rt300@0
|
190 revslider->setActive(false);
|
rt300@0
|
191 }
|
rt300@0
|
192
|
rt300@0
|
193 n++;
|
rt300@0
|
194
|
rt300@0
|
195 }else if(*i == XYPAD){
|
rt300@0
|
196 // add a xy
|
rt300@0
|
197 float c = (n + 0.5) * pixPerElem;
|
rt300@0
|
198 float left = c - myProps.XYsize/2;
|
rt300@0
|
199 ButtronXY * xyp = new ButtronXY(left , top , myProps);
|
rt300@0
|
200 xyp->setLabel("unassigned","unassigned");
|
rt300@0
|
201 xyp->showHint(false);
|
rt300@0
|
202 subElements.push_back(xyp);
|
rt300@0
|
203 n++;
|
rt300@0
|
204 }else if(*i == LEAP3D){
|
rt300@0
|
205 // add a threed box
|
rt300@0
|
206 float c = x+width*0.5;
|
rt300@0
|
207 float left = c - myProps.XYsize;
|
rt300@0
|
208
|
rt300@0
|
209 //Leap3DBox * l3d = new Leap3DBox(left , top+50 , myProps.XYsize*0.75,myProps.XYsize*0.75,150,50, myProps);
|
rt300@0
|
210
|
rt300@0
|
211 Leap3DBoxGL * l3d = new Leap3DBoxGL(left , top+50 , myProps.XYsize*0.75,myProps.XYsize*0.75,150,50, myProps);
|
rt300@0
|
212
|
rt300@0
|
213
|
rt300@0
|
214
|
rt300@0
|
215 subElements.push_back(l3d);
|
rt300@0
|
216 n++;
|
rt300@27
|
217 }else if(*i == LEAP6D){
|
rt300@27
|
218 // add a threed box
|
rt300@27
|
219 float c = x+width*0.5;
|
rt300@27
|
220 float left = c - myProps.XYsize;
|
rt300@27
|
221
|
rt300@27
|
222 Leap6DBox * l6d = new Leap6DBox(left , top+50 , myProps.XYsize*0.75,myProps.XYsize*0.75,150,50, myProps);
|
rt300@27
|
223
|
rt300@27
|
224
|
rt300@27
|
225 subElements.push_back(l6d);
|
rt300@27
|
226 n++;
|
rt300@0
|
227
|
rt300@0
|
228 }else{
|
rt300@0
|
229 cout << "ERROR: slider panel only handles xy pads and sliders" << endl;
|
rt300@0
|
230 }
|
rt300@0
|
231
|
rt300@0
|
232
|
rt300@0
|
233 }
|
rt300@27
|
234 thisPanelType = panelType;
|
rt300@0
|
235 autoArrangeRow(); // will set positions
|
rt300@0
|
236
|
rt300@0
|
237
|
rt300@0
|
238
|
rt300@0
|
239 return subElements;
|
rt300@0
|
240 }
|
rt300@27
|
241 //-----------------------------------------------------------------------
|
rt300@27
|
242 void SliderPanel::setAndShowHint(vector<int> values, ofImage* texture){
|
rt300@28
|
243 animating = false;
|
rt300@27
|
244 setHintValues(values);
|
rt300@27
|
245 setHintTexture(texture);
|
rt300@27
|
246 showHint(true);
|
rt300@0
|
247
|
rt300@27
|
248 }
|
rt300@31
|
249 void SliderPanel::setHintNoShow(vector<int> values, ofImage* texture){
|
rt300@31
|
250 animating = false;
|
rt300@31
|
251 setHintValues(values);
|
rt300@31
|
252 setHintTexture(texture);
|
rt300@31
|
253 showHint(false);
|
rt300@31
|
254
|
rt300@31
|
255 }
|
rt300@27
|
256 //------------------------------------------
|
rt300@27
|
257 void SliderPanel::setHintTexture(ofImage* texture){
|
rt300@27
|
258 if (thisPanelType == LEAP6DOF){ // yeuch
|
rt300@27
|
259 if (subElements[0]->getType() == LEAP6D){
|
rt300@27
|
260 Leap6DBox * box = (Leap6DBox*)subElements[0];
|
rt300@27
|
261
|
rt300@27
|
262 box->setHintTexture(texture);
|
rt300@27
|
263 }
|
rt300@27
|
264
|
rt300@37
|
265 }else if(thisPanelType == ALL_SLIDERS){
|
rt300@37
|
266
|
rt300@37
|
267 for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
|
rt300@37
|
268 ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
|
rt300@37
|
269 thisSlider->setHandTexture(texture);
|
rt300@37
|
270 }
|
rt300@27
|
271 }
|
rt300@27
|
272 }
|
rt300@28
|
273 //------------------------------------------
|
rt300@28
|
274 void SliderPanel::setIndicatorTexture(ofImage* texture){
|
rt300@28
|
275 if (thisPanelType == LEAP6DOF){ // yeuch
|
rt300@28
|
276 if (subElements[0]->getType() == LEAP6D){
|
rt300@28
|
277 Leap6DBox * box = (Leap6DBox*)subElements[0];
|
rt300@28
|
278
|
rt300@36
|
279 box->setHandTexture(texture);
|
rt300@28
|
280 }
|
rt300@28
|
281
|
rt300@37
|
282 }else if(thisPanelType == ALL_SLIDERS){
|
rt300@37
|
283
|
rt300@37
|
284 for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
|
rt300@37
|
285 ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
|
rt300@37
|
286 thisSlider->setHandTexture(texture);
|
rt300@37
|
287 }
|
rt300@28
|
288 }
|
rt300@28
|
289 }
|
rt300@28
|
290 //---------------------------------------------
|
rt300@28
|
291 void SliderPanel::animateToNewHintValues(vector<int> newTargetValues, float timeToTake, ofImage* newTexture){
|
rt300@28
|
292 animating = true;
|
rt300@28
|
293
|
rt300@28
|
294 if(thisPanelType == LEAP6DOF){
|
rt300@28
|
295 if (subElements[0]->getType() == LEAP6D){
|
rt300@28
|
296 Leap6DBox * box = (Leap6DBox*)subElements[0];
|
rt300@28
|
297
|
rt300@28
|
298 box->animateHintToNewValues(newTargetValues, timeToTake, newTexture);
|
rt300@28
|
299 }
|
rt300@29
|
300 }else if(thisPanelType == ALL_SLIDERS){
|
rt300@29
|
301 int i = 0;
|
rt300@29
|
302 for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
|
rt300@29
|
303 ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
|
rt300@29
|
304
|
rt300@29
|
305 thisSlider->animateHintToNewValue(newTargetValues[i], timeToTake);
|
rt300@29
|
306 i++;
|
rt300@29
|
307 }
|
rt300@28
|
308 }
|
rt300@28
|
309
|
rt300@28
|
310 }
|
rt300@28
|
311 //---------------------------------------------
|
rt300@31
|
312 void SliderPanel::animateToNewValues(vector<int> newTargetValues, float timeToTake){
|
rt300@31
|
313 animating = true;
|
rt300@31
|
314
|
rt300@31
|
315 if(thisPanelType == LEAP6DOF){
|
rt300@31
|
316 if (subElements[0]->getType() == LEAP6D){
|
rt300@31
|
317 Leap6DBox * box = (Leap6DBox*)subElements[0];
|
rt300@31
|
318
|
rt300@31
|
319 box->animateToNewValues(newTargetValues, timeToTake);
|
rt300@31
|
320 }
|
rt300@31
|
321 }else if(thisPanelType == ALL_SLIDERS){
|
rt300@31
|
322 int i = 0;
|
rt300@31
|
323 for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
|
rt300@31
|
324 ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
|
rt300@31
|
325
|
rt300@31
|
326 thisSlider->animateToNewValue(newTargetValues[i], timeToTake);
|
rt300@31
|
327 i++;
|
rt300@31
|
328 }
|
rt300@31
|
329 }
|
rt300@31
|
330
|
rt300@31
|
331 }
|
rt300@31
|
332 //---------------------------------------------
|
rt300@27
|
333
|
rt300@28
|
334 void SliderPanel::update(){
|
rt300@28
|
335 if(!animating) return;
|
rt300@28
|
336 if(thisPanelType == LEAP6DOF){
|
rt300@28
|
337 if (subElements[0]->getType() == LEAP6D){
|
rt300@28
|
338 Leap6DBox * box = (Leap6DBox*)subElements[0];
|
rt300@28
|
339
|
rt300@28
|
340 box->update();
|
rt300@28
|
341 }
|
rt300@29
|
342 }else if(thisPanelType == ALL_SLIDERS){
|
rt300@29
|
343 for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
|
rt300@29
|
344 ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
|
rt300@29
|
345 thisSlider->update();
|
rt300@29
|
346
|
rt300@29
|
347 }
|
rt300@28
|
348 }
|
rt300@28
|
349
|
rt300@28
|
350 }
|
rt300@28
|
351
|
rt300@28
|
352
|
rt300@28
|
353 void SliderPanel::flashResultLight(ofColor c, int howLong){
|
rt300@28
|
354
|
rt300@28
|
355 resultLight.setDiffuseColor(c);
|
rt300@28
|
356 resultLight.enable();
|
rt300@28
|
357 // set up timer
|
rt300@28
|
358 TimerCallbackFunction tcb;
|
rt300@28
|
359 tcb = boost::bind(&SliderPanel::turnOffResultLight, this);
|
rt300@28
|
360 timeController.scheduleEvent(tcb, howLong);
|
rt300@31
|
361 if(thisPanelType == LEAP6DOF){
|
rt300@31
|
362 if (subElements[0]->getType() == LEAP6D){
|
rt300@31
|
363 Leap6DBox * box = (Leap6DBox*)subElements[0];
|
rt300@31
|
364
|
rt300@39
|
365 box->flashScore(5, c,howLong);
|
rt300@31
|
366 }
|
rt300@31
|
367 }else if(thisPanelType == ALL_SLIDERS){
|
rt300@37
|
368 for(auto UIitr = subElements.begin(); UIitr < subElements.end(); UIitr++){
|
rt300@37
|
369 ButtronSlider* thisSlider = (ButtronSlider *)(*UIitr);
|
rt300@39
|
370 thisSlider->flashScore(5, c,howLong);
|
rt300@37
|
371
|
rt300@37
|
372 }
|
rt300@31
|
373 }
|
rt300@31
|
374
|
rt300@28
|
375 }
|
rt300@28
|
376 void SliderPanel::turnOffResultLight(){
|
rt300@28
|
377
|
rt300@28
|
378 resultLight.setDiffuseColor(ofColor::white);
|
rt300@28
|
379 resultLight.disable();
|
rt300@28
|
380 }
|
rt300@37
|
381
|
rt300@28
|
382 //---------------------------------------------
|
rt300@28
|
383 //---------------------------------------------
|
rt300@28
|
384 //---------------------------------------------
|
rt300@28
|
385 //---------------------------------------------
|
rt300@28
|
386
|