00001
00032 #include "llviewerprecompiledheaders.h"
00033
00034 #include "lldebugmessagebox.h"
00035
00036 #include "llresmgr.h"
00037 #include "llfontgl.h"
00038 #include "llbutton.h"
00039 #include "llsliderctrl.h"
00040 #include "llcheckboxctrl.h"
00041 #include "lltextbox.h"
00042 #include "lllineeditor.h"
00043 #include "llfocusmgr.h"
00044
00048
00049 std::map<LLString, LLDebugVarMessageBox*> LLDebugVarMessageBox::sInstances;
00050
00051 LLDebugVarMessageBox::LLDebugVarMessageBox(const std::string& title, EDebugVarType var_type, void *var) :
00052 LLFloater("msg box", LLRect(10,160,400,10), title),
00053 mVarType(var_type), mVarData(var), mAnimate(FALSE)
00054 {
00055 switch(var_type)
00056 {
00057 case VAR_TYPE_F32:
00058 mSlider1 = new LLSliderCtrl("slider 1", LLRect(20,130,190,110), title, NULL, 70, 130, TRUE, TRUE, FALSE, NULL, NULL, *((F32*)var), -100.f, 100.f, 0.1f, NULL);
00059 mSlider1->setPrecision(3);
00060 addChild(mSlider1);
00061 mSlider2 = NULL;
00062 mSlider3 = NULL;
00063 break;
00064 case VAR_TYPE_S32:
00065 mSlider1 = new LLSliderCtrl("slider 1", LLRect(20,100,190,80), title, NULL, 70, 130, TRUE, TRUE, FALSE, NULL, NULL, (F32)*((S32*)var), -255.f, 255.f, 1.f, NULL);
00066 mSlider1->setPrecision(0);
00067 addChild(mSlider1);
00068 mSlider2 = NULL;
00069 mSlider3 = NULL;
00070 break;
00071 case VAR_TYPE_VEC3:
00072 mSlider1 = new LLSliderCtrl("slider 1", LLRect(20,130,190,110), "x: ", NULL, 70, 130, TRUE, TRUE, FALSE, NULL, NULL, ((LLVector3*)var)->mV[VX], -100.f, 100.f, 0.1f, NULL);
00073 mSlider1->setPrecision(3);
00074 mSlider2 = new LLSliderCtrl("slider 2", LLRect(20,100,190,80), "y: ", NULL, 70, 130, TRUE, TRUE, FALSE, NULL, NULL, ((LLVector3*)var)->mV[VY], -100.f, 100.f, 0.1f, NULL);
00075 mSlider2->setPrecision(3);
00076 mSlider3 = new LLSliderCtrl("slider 3", LLRect(20,70,190,50), "z: ", NULL, 70, 130, TRUE, TRUE, FALSE, NULL, NULL, ((LLVector3*)var)->mV[VZ], -100.f, 100.f, 0.1f, NULL);
00077 mSlider3->setPrecision(3);
00078 addChild(mSlider1);
00079 addChild(mSlider2);
00080 addChild(mSlider3);
00081 break;
00082 default:
00083 llwarns << "Unhandled var type " << var_type << llendl;
00084 break;
00085 }
00086
00087 mAnimateButton = new LLButton("Animate", LLRect(20, 45, 180, 25), "", onAnimateClicked, this);
00088 addChild(mAnimateButton);
00089
00090 mText = new LLTextBox("value", LLRect(20,20,190,0));
00091 addChild(mText);
00092
00093
00094 setDefaultBtn();
00095 }
00096
00097 LLDebugVarMessageBox::~LLDebugVarMessageBox()
00098 {
00099 sInstances.erase(mTitle);
00100 }
00101
00102 void LLDebugVarMessageBox::show(const std::string& title, F32 *var, F32 max_value, F32 increment)
00103 {
00104 #ifndef LL_RELEASE_FOR_DOWNLOAD
00105 LLDebugVarMessageBox* box = show(title, VAR_TYPE_F32, (void*)var);
00106 max_value = llabs(max_value);
00107 box->mSlider1->setMaxValue(max_value);
00108 box->mSlider1->setMinValue(-max_value);
00109 box->mSlider1->setIncrement(increment);
00110 if (!gFocusMgr.childHasKeyboardFocus(box))
00111 {
00112 box->mSlider1->setValue(*var);
00113 }
00114 box->mSlider1->setCommitCallback(slider_changed);
00115 box->mSlider1->setCallbackUserData(box);
00116 #endif
00117 }
00118
00119 void LLDebugVarMessageBox::show(const std::string& title, S32 *var, S32 max_value, S32 increment)
00120 {
00121 #ifndef LL_RELEASE_FOR_DOWNLOAD
00122 LLDebugVarMessageBox* box = show(title, VAR_TYPE_S32, (void*)var);
00123 F32 max_val = llabs((F32)max_value);
00124 box->mSlider1->setMaxValue(max_val);
00125 box->mSlider1->setMinValue(-max_val);
00126 box->mSlider1->setIncrement((F32)increment);
00127 if (!gFocusMgr.childHasKeyboardFocus(box))
00128 {
00129 box->mSlider1->setValue((F32)*var);
00130 }
00131 box->mSlider1->setCommitCallback(slider_changed);
00132 box->mSlider1->setCallbackUserData(box);
00133 #endif
00134 }
00135
00136 void LLDebugVarMessageBox::show(const std::string& title, LLVector3 *var, LLVector3 max_value, LLVector3 increment)
00137 {
00138 #ifndef LL_RELEASE_FOR_DOWNLOAD
00139 LLDebugVarMessageBox* box = show(title, VAR_TYPE_VEC3, (LLVector3*)var);
00140 max_value.abs();
00141 box->mSlider1->setMaxValue(max_value.mV[VX]);
00142 box->mSlider1->setMinValue(-max_value.mV[VX]);
00143 box->mSlider1->setIncrement(increment.mV[VX]);
00144 box->mSlider1->setCommitCallback(slider_changed);
00145 box->mSlider1->setCallbackUserData(box);
00146
00147 box->mSlider2->setMaxValue(max_value.mV[VX]);
00148 box->mSlider2->setMinValue(-max_value.mV[VX]);
00149 box->mSlider2->setIncrement(increment.mV[VX]);
00150 box->mSlider2->setCommitCallback(slider_changed);
00151 box->mSlider2->setCallbackUserData(box);
00152
00153 box->mSlider3->setMaxValue(max_value.mV[VX]);
00154 box->mSlider3->setMinValue(-max_value.mV[VX]);
00155 box->mSlider3->setIncrement(increment.mV[VX]);
00156 box->mSlider3->setCommitCallback(slider_changed);
00157 box->mSlider3->setCallbackUserData(box);
00158 #endif
00159 }
00160
00161 LLDebugVarMessageBox* LLDebugVarMessageBox::show(const std::string& title, EDebugVarType var_type, void *var)
00162 {
00163 LLString title_string(title);
00164
00165 LLDebugVarMessageBox *box = sInstances[title_string];
00166 if (!box)
00167 {
00168 box = new LLDebugVarMessageBox(title, var_type, var);
00169 sInstances[title_string] = box;
00170 gFloaterView->addChild(box);
00171 box->reshape(200,150);
00172 box->open();
00173 box->mTitle = title_string;
00174 }
00175
00176 return box;
00177 }
00178
00179 void LLDebugVarMessageBox::slider_changed(LLUICtrl* ctrl, void* user_data)
00180 {
00181 LLDebugVarMessageBox *msg_box = (LLDebugVarMessageBox*)user_data;
00182 if (!msg_box || !msg_box->mVarData) return;
00183
00184 switch(msg_box->mVarType)
00185 {
00186 case VAR_TYPE_F32:
00187 *((F32*)msg_box->mVarData) = (F32)msg_box->mSlider1->getValue().asReal();
00188 break;
00189 case VAR_TYPE_S32:
00190 *((S32*)msg_box->mVarData) = (S32)msg_box->mSlider1->getValue().asInteger();
00191 break;
00192 case VAR_TYPE_VEC3:
00193 {
00194 LLVector3* vec_p = (LLVector3*)msg_box->mVarData;
00195 vec_p->setVec((F32)msg_box->mSlider1->getValue().asReal(),
00196 (F32)msg_box->mSlider2->getValue().asReal(),
00197 (F32)msg_box->mSlider3->getValue().asReal());
00198 break;
00199 }
00200 default:
00201 llwarns << "Unhandled var type " << msg_box->mVarType << llendl;
00202 break;
00203 }
00204 }
00205
00206 void LLDebugVarMessageBox::onAnimateClicked(void* user_data)
00207 {
00208 LLDebugVarMessageBox* msg_boxp = (LLDebugVarMessageBox*)user_data;
00209 msg_boxp->mAnimate = !msg_boxp->mAnimate;
00210 msg_boxp->mAnimateButton->setToggleState(msg_boxp->mAnimate);
00211 }
00212
00213 void LLDebugVarMessageBox::onClose(bool app_quitting)
00214 {
00215 setVisible(FALSE);
00216 }
00217
00218 void LLDebugVarMessageBox::draw()
00219 {
00220 LLString text;
00221 switch(mVarType)
00222 {
00223 case VAR_TYPE_F32:
00224 text = llformat("%.3f", *((F32*)mVarData));
00225 break;
00226 case VAR_TYPE_S32:
00227 text = llformat("%d", *((S32*)mVarData));
00228 break;
00229 case VAR_TYPE_VEC3:
00230 {
00231 LLVector3* vec_p = (LLVector3*)mVarData;
00232 text= llformat("%.3f %.3f %.3f", vec_p->mV[VX], vec_p->mV[VY], vec_p->mV[VZ]);
00233 break;
00234 }
00235 default:
00236 llwarns << "Unhandled var type " << mVarType << llendl;
00237 break;
00238 }
00239 mText->setText(text);
00240
00241 if(mAnimate)
00242 {
00243 if (mSlider1)
00244 {
00245 F32 animated_val = clamp_rescale(fmodf((F32)LLFrameTimer::getElapsedSeconds() / 5.f, 1.f), 0.f, 1.f, 0.f, mSlider1->getMaxValue());
00246 mSlider1->setValue(animated_val);
00247 slider_changed(mSlider1, this);
00248 if (mSlider2)
00249 {
00250 mSlider2->setValue(animated_val);
00251 slider_changed(mSlider2, this);
00252 }
00253 if (mSlider3)
00254 {
00255 mSlider3->setValue(animated_val);
00256 slider_changed(mSlider3, this);
00257 }
00258 }
00259 }
00260 LLFloater::draw();
00261 }