GwenParameterInterface.cpp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. #include "GwenParameterInterface.h"
  2. #include "gwenInternalData.h"
  3. struct MyButtonEventHandler : public Gwen::Event::Handler
  4. {
  5. ButtonParamChangedCallback m_callback;
  6. void* m_userPointer;
  7. int m_buttonId;
  8. MyButtonEventHandler(ButtonParamChangedCallback callback, int buttonId, void* userPointer)
  9. :m_callback(callback),
  10. m_userPointer(userPointer),
  11. m_buttonId(buttonId)
  12. {
  13. }
  14. void onButtonPress( Gwen::Controls::Base* pControl )
  15. {
  16. if (m_callback)
  17. {
  18. (*m_callback)(m_buttonId, true, m_userPointer);
  19. }
  20. }
  21. };
  22. template<typename T>
  23. struct MySliderEventHandler : public Gwen::Event::Handler
  24. {
  25. SliderParamChangedCallback m_callback;
  26. Gwen::Controls::TextBox* m_label;
  27. Gwen::Controls::Slider* m_pSlider;
  28. char m_variableName[1024];
  29. T* m_targetValue;
  30. bool m_showValue;
  31. MySliderEventHandler(const char* varName, Gwen::Controls::TextBox* label, Gwen::Controls::Slider* pSlider,T* target,SliderParamChangedCallback callback)
  32. :m_label(label),
  33. m_pSlider(pSlider),
  34. m_targetValue(target),
  35. m_showValue(true),
  36. m_callback(callback)
  37. {
  38. memcpy(m_variableName,varName,strlen(varName)+1);
  39. }
  40. void SliderMoved( Gwen::Controls::Base* pControl )
  41. {
  42. Gwen::Controls::Slider* pSlider = (Gwen::Controls::Slider*)pControl;
  43. //printf("value = %f\n", pSlider->GetValue());//UnitPrint( Utility::Format( L"Slider Value: %.2f", pSlider->GetValue() ) );
  44. float bla = pSlider->GetValue();
  45. T v = T(bla);
  46. SetValue(v);
  47. if (m_callback)
  48. {
  49. (*m_callback)(v);
  50. }
  51. }
  52. void SetValue(T v)
  53. {
  54. if (v < m_pSlider->GetRangeMin())
  55. {
  56. printf("?\n");
  57. }
  58. if (v > m_pSlider->GetRangeMax())
  59. {
  60. printf("?\n");
  61. }
  62. m_pSlider->SetValue(v,true);
  63. (*m_targetValue) = v;
  64. float val = float(v);//todo: specialize on template type
  65. if (m_showValue)
  66. {
  67. char txt[1024];
  68. sprintf(txt,"%s : %.3f", m_variableName,val);
  69. m_label->SetText(txt);
  70. }
  71. }
  72. };
  73. struct GwenParameters
  74. {
  75. b3AlignedObjectArray<MySliderEventHandler<btScalar>*> m_sliderEventHandlers;
  76. b3AlignedObjectArray<Gwen::Controls::HorizontalSlider*> m_sliders;
  77. b3AlignedObjectArray<Gwen::Controls::ComboBox*> m_comboBoxes;
  78. b3AlignedObjectArray<Gwen::Controls::Button*> m_buttons;
  79. b3AlignedObjectArray<MyButtonEventHandler*> m_buttonEventHandlers;
  80. b3AlignedObjectArray<Gwen::Controls::TextBox*> m_textLabels;
  81. int m_savedYposition;
  82. };
  83. GwenParameterInterface::GwenParameterInterface(GwenInternalData* gwenInternalData)
  84. :m_gwenInternalData(gwenInternalData)
  85. {
  86. m_paramInternalData = new GwenParameters;
  87. m_paramInternalData->m_savedYposition = m_gwenInternalData->m_curYposition;
  88. }
  89. GwenParameterInterface::~GwenParameterInterface()
  90. {
  91. removeAllParameters();
  92. delete m_paramInternalData;
  93. }
  94. void GwenParameterInterface::setSliderValue(int sliderIndex, double sliderValue)
  95. {
  96. int sliderCapped = sliderValue+4;
  97. sliderCapped /= 8;
  98. sliderCapped *= 8;
  99. if (sliderIndex>=0 && sliderIndex<m_paramInternalData->m_sliders.size())
  100. {
  101. m_paramInternalData->m_sliders[sliderIndex]->GetRangeMin();
  102. m_paramInternalData->m_sliders[sliderIndex]->GetRangeMax();
  103. float mappedValue =m_paramInternalData->m_sliders[sliderIndex]->GetRangeMin()+
  104. (m_paramInternalData->m_sliders[sliderIndex]->GetRangeMax()-
  105. m_paramInternalData->m_sliders[sliderIndex]->GetRangeMin())*sliderCapped/128.f;
  106. printf("mappedValue = %f\n",mappedValue);
  107. m_paramInternalData->m_sliders[sliderIndex]->SetValue(mappedValue);
  108. }
  109. }
  110. #include <stdio.h>
  111. void GwenParameterInterface::registerButtonParameter(ButtonParams& params)
  112. {
  113. Gwen::Controls::Button* button = new Gwen::Controls::Button(m_gwenInternalData->m_demoPage->GetPage());
  114. MyButtonEventHandler* handler = new MyButtonEventHandler(params.m_callback,params.m_buttonId,params.m_userPointer);
  115. button->SetText(params.m_name);
  116. button->onPress.Add( handler, &MyButtonEventHandler::onButtonPress );
  117. button->SetIsToggle(params.m_isTrigger);
  118. m_paramInternalData->m_buttons.push_back(button);
  119. m_paramInternalData->m_buttonEventHandlers.push_back(handler);
  120. button->SetPos( 5, m_gwenInternalData->m_curYposition );
  121. button->SetWidth(220);
  122. m_gwenInternalData->m_curYposition+=22;
  123. }
  124. struct MyComboBoxHander2 :public Gwen::Event::Handler
  125. {
  126. GwenInternalData* m_data;
  127. int m_buttonId;
  128. ComboBoxCallback m_callback;
  129. void* m_userPointer;
  130. MyComboBoxHander2 (GwenInternalData* data, int buttonId,ComboBoxCallback callback, void* userPointer)
  131. :m_data(data),
  132. m_buttonId(buttonId),
  133. m_callback(callback),
  134. m_userPointer(userPointer)
  135. {
  136. }
  137. void onSelect( Gwen::Controls::Base* pControl )
  138. {
  139. Gwen::Controls::ComboBox* but = (Gwen::Controls::ComboBox*) pControl;
  140. Gwen::String str = Gwen::Utility::UnicodeToString( but->GetSelectedItem()->GetText());
  141. if (m_callback)
  142. (*m_callback)(m_buttonId,str.c_str(),m_userPointer);
  143. }
  144. };
  145. void GwenParameterInterface::registerComboBox(ComboBoxParams& params)
  146. {
  147. Gwen::Controls::ComboBox* combobox = new Gwen::Controls::ComboBox(m_gwenInternalData->m_demoPage->GetPage());
  148. m_paramInternalData->m_comboBoxes.push_back(combobox);
  149. MyComboBoxHander2* handler = new MyComboBoxHander2(m_gwenInternalData, params.m_comboboxId,params.m_callback, params.m_userPointer);
  150. m_gwenInternalData->m_handlers.push_back(handler);
  151. combobox->onSelection.Add(handler,&MyComboBoxHander2::onSelect);
  152. int ypos = m_gwenInternalData->m_curYposition;
  153. m_gwenInternalData->m_curYposition+=22;
  154. combobox->SetPos(5, ypos );
  155. combobox->SetWidth( 220 );
  156. //box->SetPos(120,130);
  157. for (int i=0;i<params.m_numItems;i++)
  158. {
  159. Gwen::Controls::MenuItem* item = combobox->AddItem(Gwen::Utility::StringToUnicode(params.m_items[i]));
  160. if (i==params.m_startItem)
  161. combobox->OnItemSelected(item);
  162. }
  163. }
  164. void GwenParameterInterface::registerSliderFloatParameter(SliderParams& params)
  165. {
  166. Gwen::Controls::TextBox* label = new Gwen::Controls::TextBox(m_gwenInternalData->m_demoPage->GetPage());
  167. m_paramInternalData->m_textLabels.push_back(label);
  168. //m_data->m_myControls.push_back(label);
  169. label->SetText( params.m_name);
  170. label->SetPos( 10, 10 + 25 );
  171. label->SetWidth(210);
  172. label->SetPos(10,m_gwenInternalData->m_curYposition);
  173. m_gwenInternalData->m_curYposition+=22;
  174. Gwen::Controls::HorizontalSlider* pSlider = new Gwen::Controls::HorizontalSlider( m_gwenInternalData->m_demoPage->GetPage());
  175. m_paramInternalData->m_sliders.push_back(pSlider);
  176. //m_data->m_myControls.push_back(pSlider);
  177. pSlider->SetPos( 10, m_gwenInternalData->m_curYposition );
  178. pSlider->SetSize( 200, 20 );
  179. pSlider->SetRange( params.m_minVal, params.m_maxVal);
  180. pSlider->SetNotchCount(16);//float(params.m_maxVal-params.m_minVal)/100.f);
  181. pSlider->SetClampToNotches( params.m_clampToNotches );
  182. pSlider->SetValue( *params.m_paramValuePointer);//dimensions[i] );
  183. char labelName[1024];
  184. sprintf(labelName,"%s",params.m_name);//axisNames[0]);
  185. MySliderEventHandler<btScalar>* handler = new MySliderEventHandler<btScalar>(labelName,label,pSlider,params.m_paramValuePointer,params.m_callback);
  186. handler->m_showValue = params.m_showValues;
  187. m_paramInternalData->m_sliderEventHandlers.push_back(handler);
  188. pSlider->onValueChanged.Add( handler, &MySliderEventHandler<btScalar>::SliderMoved );
  189. handler->SliderMoved(pSlider);
  190. // float v = pSlider->GetValue();
  191. m_gwenInternalData->m_curYposition+=22;
  192. }
  193. void GwenParameterInterface::syncParameters()
  194. {
  195. for (int i=0;i<m_paramInternalData->m_sliderEventHandlers.size();i++)
  196. {
  197. MySliderEventHandler<btScalar>* handler = m_paramInternalData->m_sliderEventHandlers[i];
  198. handler->m_pSlider->SetValue(*handler->m_targetValue,true);
  199. }
  200. }
  201. void GwenParameterInterface::removeAllParameters()
  202. {
  203. for (int i=0;i<m_paramInternalData->m_buttons.size();i++)
  204. {
  205. delete m_paramInternalData->m_buttons[i];
  206. }
  207. m_paramInternalData->m_buttons.clear();
  208. for (int i=0;i<m_paramInternalData->m_buttonEventHandlers.size();i++)
  209. {
  210. delete m_paramInternalData->m_buttonEventHandlers[i];
  211. }
  212. m_paramInternalData->m_buttonEventHandlers.clear();
  213. m_gwenInternalData->m_curYposition+=22;
  214. for (int i=0;i<m_paramInternalData->m_sliders.size();i++)
  215. {
  216. delete m_paramInternalData->m_sliders[i];
  217. }
  218. m_paramInternalData->m_sliders.clear();
  219. for (int i=0;i<m_paramInternalData->m_sliderEventHandlers.size();i++)
  220. {
  221. delete m_paramInternalData->m_sliderEventHandlers[i];
  222. }
  223. m_paramInternalData->m_sliderEventHandlers.clear();
  224. for (int i=0;i<m_paramInternalData->m_textLabels.size();i++)
  225. {
  226. delete m_paramInternalData->m_textLabels[i];
  227. }
  228. m_paramInternalData->m_textLabels.clear();
  229. for (int i=0;i<m_paramInternalData->m_comboBoxes.size();i++)
  230. {
  231. delete m_paramInternalData->m_comboBoxes[i];
  232. }
  233. m_paramInternalData->m_comboBoxes.clear();
  234. m_gwenInternalData->m_curYposition = this->m_paramInternalData->m_savedYposition;
  235. for (int i=0;i<m_gwenInternalData->m_handlers.size();i++)
  236. {
  237. delete m_gwenInternalData->m_handlers[i];
  238. }
  239. m_gwenInternalData->m_handlers.clear();
  240. }