PageRenderTime 34ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/indra/newview/lldebugmessagebox.cpp

https://bitbucket.org/lindenlab/viewer-beta/
C++ | 291 lines | 233 code | 29 blank | 29 comment | 8 complexity | 7a61c05c0e8271efdca10fc76196e18e MD5 | raw file
Possible License(s): LGPL-2.1
  1. /**
  2. * @file lldebugmessagebox.cpp
  3. * @brief Implementation of a simple, non-modal message box.
  4. *
  5. * $LicenseInfo:firstyear=2002&license=viewerlgpl$
  6. * Second Life Viewer Source Code
  7. * Copyright (C) 2010, Linden Research, Inc.
  8. *
  9. * This library is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public
  11. * License as published by the Free Software Foundation;
  12. * version 2.1 of the License only.
  13. *
  14. * This library is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with this library; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22. *
  23. * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
  24. * $/LicenseInfo$
  25. */
  26. #include "llviewerprecompiledheaders.h"
  27. #include "lldebugmessagebox.h"
  28. #include "llresmgr.h"
  29. #include "llfontgl.h"
  30. #include "llbutton.h"
  31. #include "llsliderctrl.h"
  32. #include "llcheckboxctrl.h"
  33. #include "lltextbox.h"
  34. #include "lllineeditor.h"
  35. #include "llfocusmgr.h"
  36. ///----------------------------------------------------------------------------
  37. /// Class LLDebugVarMessageBox
  38. ///----------------------------------------------------------------------------
  39. std::map<std::string, LLDebugVarMessageBox*> LLDebugVarMessageBox::sInstances;
  40. LLDebugVarMessageBox::LLDebugVarMessageBox(const std::string& title, EDebugVarType var_type, void *var) :
  41. LLFloater(LLSD()),
  42. mVarType(var_type), mVarData(var), mAnimate(FALSE)
  43. {
  44. setRect(LLRect(10,160,400,10));
  45. LLSliderCtrl::Params slider_p;
  46. slider_p.label(title);
  47. slider_p.label_width(70);
  48. slider_p.text_width(40);
  49. slider_p.can_edit_text(true);
  50. slider_p.show_text(true);
  51. mSlider1 = NULL;
  52. mSlider2 = NULL;
  53. mSlider3 = NULL;
  54. switch(var_type)
  55. {
  56. case VAR_TYPE_F32:
  57. slider_p.name("slider 1");
  58. slider_p.rect(LLRect(20,130,190,110));
  59. slider_p.initial_value(*((F32*)var));
  60. slider_p.min_value(-100.f);
  61. slider_p.max_value(100.f);
  62. slider_p.increment(0.1f);
  63. slider_p.decimal_digits(3);
  64. mSlider1 = LLUICtrlFactory::create<LLSliderCtrl>(slider_p);
  65. addChild(mSlider1);
  66. break;
  67. case VAR_TYPE_S32:
  68. slider_p.name("slider 1");
  69. slider_p.rect(LLRect(20,100,190,80));
  70. slider_p.initial_value((F32)*((S32*)var));
  71. slider_p.min_value(-255.f);
  72. slider_p.max_value(255.f);
  73. slider_p.increment(1.f);
  74. slider_p.decimal_digits(0);
  75. mSlider1 = LLUICtrlFactory::create<LLSliderCtrl>(slider_p);
  76. addChild(mSlider1);
  77. break;
  78. case VAR_TYPE_VEC3:
  79. slider_p.name("slider 1");
  80. slider_p.label("x: ");
  81. slider_p.rect(LLRect(20,130,190,110));
  82. slider_p.initial_value(((LLVector3*)var)->mV[VX]);
  83. slider_p.min_value(-100.f);
  84. slider_p.max_value(100.f);
  85. slider_p.increment(0.1f);
  86. slider_p.decimal_digits(3);
  87. mSlider1 = LLUICtrlFactory::create<LLSliderCtrl>(slider_p);
  88. slider_p.name("slider 2");
  89. slider_p.label("y: ");
  90. slider_p.rect(LLRect(20,100,190,80));
  91. slider_p.initial_value(((LLVector3*)var)->mV[VY]);
  92. mSlider2 = LLUICtrlFactory::create<LLSliderCtrl>(slider_p);
  93. slider_p.name("slider 3");
  94. slider_p.label("z: ");
  95. slider_p.rect(LLRect(20,70,190,50));
  96. slider_p.initial_value(((LLVector3*)var)->mV[VZ]);
  97. mSlider2 = LLUICtrlFactory::create<LLSliderCtrl>(slider_p);
  98. addChild(mSlider1);
  99. addChild(mSlider2);
  100. addChild(mSlider3);
  101. break;
  102. default:
  103. llwarns << "Unhandled var type " << var_type << llendl;
  104. break;
  105. }
  106. LLButton::Params p;
  107. p.name(std::string("Animate"));
  108. p.label(std::string("Animate"));
  109. p.rect(LLRect(20, 45, 180, 25));
  110. p.click_callback.function(boost::bind(&LLDebugVarMessageBox::onAnimateClicked, this, _2));
  111. mAnimateButton = LLUICtrlFactory::create<LLButton>(p);
  112. addChild(mAnimateButton);
  113. LLTextBox::Params params;
  114. params.name("value");
  115. params.initial_value(params.name());
  116. params.rect(LLRect(20,20,190,0));
  117. mText = LLUICtrlFactory::create<LLTextBox> (params);
  118. addChild(mText);
  119. //disable hitting enter closes dialog
  120. setDefaultBtn();
  121. }
  122. LLDebugVarMessageBox::~LLDebugVarMessageBox()
  123. {
  124. sInstances.erase(mTitle);
  125. }
  126. void LLDebugVarMessageBox::show(const std::string& title, F32 *var, F32 max_value, F32 increment)
  127. {
  128. #ifndef LL_RELEASE_FOR_DOWNLOAD
  129. LLDebugVarMessageBox* box = show(title, VAR_TYPE_F32, (void*)var);
  130. max_value = llabs(max_value);
  131. box->mSlider1->setMaxValue(max_value);
  132. box->mSlider1->setMinValue(-max_value);
  133. box->mSlider1->setIncrement(increment);
  134. if (!gFocusMgr.childHasKeyboardFocus(box))
  135. {
  136. box->mSlider1->setValue(*var);
  137. }
  138. box->mSlider1->setCommitCallback(boost::bind(&LLDebugVarMessageBox::sliderChanged, box, _2));
  139. #endif
  140. }
  141. void LLDebugVarMessageBox::show(const std::string& title, S32 *var, S32 max_value, S32 increment)
  142. {
  143. #ifndef LL_RELEASE_FOR_DOWNLOAD
  144. LLDebugVarMessageBox* box = show(title, VAR_TYPE_S32, (void*)var);
  145. F32 max_val = llabs((F32)max_value);
  146. box->mSlider1->setMaxValue(max_val);
  147. box->mSlider1->setMinValue(-max_val);
  148. box->mSlider1->setIncrement((F32)increment);
  149. if (!gFocusMgr.childHasKeyboardFocus(box))
  150. {
  151. box->mSlider1->setValue((F32)*var);
  152. }
  153. box->mSlider1->setCommitCallback(boost::bind(&LLDebugVarMessageBox::sliderChanged, box, _2));
  154. #endif
  155. }
  156. void LLDebugVarMessageBox::show(const std::string& title, LLVector3 *var, LLVector3 max_value, LLVector3 increment)
  157. {
  158. #ifndef LL_RELEASE_FOR_DOWNLOAD
  159. LLDebugVarMessageBox* box = show(title, VAR_TYPE_VEC3, (LLVector3*)var);
  160. max_value.abs();
  161. box->mSlider1->setMaxValue(max_value.mV[VX]);
  162. box->mSlider1->setMinValue(-max_value.mV[VX]);
  163. box->mSlider1->setIncrement(increment.mV[VX]);
  164. box->mSlider1->setCommitCallback(boost::bind(&LLDebugVarMessageBox::sliderChanged, box, _2));
  165. box->mSlider2->setMaxValue(max_value.mV[VX]);
  166. box->mSlider2->setMinValue(-max_value.mV[VX]);
  167. box->mSlider2->setIncrement(increment.mV[VX]);
  168. box->mSlider2->setCommitCallback(boost::bind(&LLDebugVarMessageBox::sliderChanged, box, _2));
  169. box->mSlider3->setMaxValue(max_value.mV[VX]);
  170. box->mSlider3->setMinValue(-max_value.mV[VX]);
  171. box->mSlider3->setIncrement(increment.mV[VX]);
  172. box->mSlider3->setCommitCallback(boost::bind(&LLDebugVarMessageBox::sliderChanged, box, _2));
  173. #endif
  174. }
  175. LLDebugVarMessageBox* LLDebugVarMessageBox::show(const std::string& title, EDebugVarType var_type, void *var)
  176. {
  177. std::string title_string(title);
  178. LLDebugVarMessageBox *box = sInstances[title_string];
  179. if (!box)
  180. {
  181. box = new LLDebugVarMessageBox(title, var_type, var);
  182. sInstances[title_string] = box;
  183. gFloaterView->addChild(box);
  184. box->reshape(200,150);
  185. box->openFloater();
  186. box->mTitle = title_string;
  187. }
  188. return box;
  189. }
  190. void LLDebugVarMessageBox::sliderChanged(const LLSD& data)
  191. {
  192. if (!mVarData)
  193. return;
  194. switch(mVarType)
  195. {
  196. case VAR_TYPE_F32:
  197. *((F32*)mVarData) = (F32)mSlider1->getValue().asReal();
  198. break;
  199. case VAR_TYPE_S32:
  200. *((S32*)mVarData) = (S32)mSlider1->getValue().asInteger();
  201. break;
  202. case VAR_TYPE_VEC3:
  203. {
  204. LLVector3* vec_p = (LLVector3*)mVarData;
  205. vec_p->setVec((F32)mSlider1->getValue().asReal(),
  206. (F32)mSlider2->getValue().asReal(),
  207. (F32)mSlider3->getValue().asReal());
  208. break;
  209. }
  210. default:
  211. llwarns << "Unhandled var type " << mVarType << llendl;
  212. break;
  213. }
  214. }
  215. void LLDebugVarMessageBox::onAnimateClicked(const LLSD& data)
  216. {
  217. mAnimate = !mAnimate;
  218. mAnimateButton->setToggleState(mAnimate);
  219. }
  220. void LLDebugVarMessageBox::draw()
  221. {
  222. std::string text;
  223. switch(mVarType)
  224. {
  225. case VAR_TYPE_F32:
  226. text = llformat("%.3f", *((F32*)mVarData));
  227. break;
  228. case VAR_TYPE_S32:
  229. text = llformat("%d", *((S32*)mVarData));
  230. break;
  231. case VAR_TYPE_VEC3:
  232. {
  233. LLVector3* vec_p = (LLVector3*)mVarData;
  234. text= llformat("%.3f %.3f %.3f", vec_p->mV[VX], vec_p->mV[VY], vec_p->mV[VZ]);
  235. break;
  236. }
  237. default:
  238. llwarns << "Unhandled var type " << mVarType << llendl;
  239. break;
  240. }
  241. mText->setText(text);
  242. if(mAnimate)
  243. {
  244. if (mSlider1)
  245. {
  246. F32 animated_val = clamp_rescale(fmodf((F32)LLFrameTimer::getElapsedSeconds() / 5.f, 1.f), 0.f, 1.f, 0.f, mSlider1->getMaxValue());
  247. mSlider1->setValue(animated_val);
  248. sliderChanged(LLSD());
  249. if (mSlider2)
  250. {
  251. mSlider2->setValue(animated_val);
  252. sliderChanged(LLSD());
  253. }
  254. if (mSlider3)
  255. {
  256. mSlider3->setValue(animated_val);
  257. sliderChanged(LLSD());
  258. }
  259. }
  260. }
  261. LLFloater::draw();
  262. }