From a9923337448244e76ac134524c6ad5d70a579ebf Mon Sep 17 00:00:00 2001 From: Lirusaito Date: Sat, 5 Jan 2013 01:43:17 -0500 Subject: [PATCH] Zi Ree's Debug Setting Floater awesomeness (Search!!) Made to work with Singularity, and also be a bit better.. Alphabetizes includes. Switches settings combobox to a scrolllist, and Boolean combobox to a radiogroup. Makes floater resizable, aligns a lot of the UI, and prepares it all for proper resize behavior. Adds Copy button for copying the name of the debug setting. Yay, verbosity! Also adds FloaterDebugSettingsRect to keep track of the floater's size. Also somehow the getInstance line snuck out of last commit... tossed it in here. --- indra/newview/app_settings/settings.xml | 16 ++ indra/newview/llfloatersettingsdebug.cpp | 265 ++++++++++++------ indra/newview/llfloatersettingsdebug.h | 29 +- .../xui/en-us/floater_settings_debug.xml | 44 +-- 4 files changed, 236 insertions(+), 118 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 423207776..33c8d0f0f 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -6178,6 +6178,22 @@ This should be as low as possible, but too low may break functionality 0 + FloaterDebugSettingsRect + + Comment + Rectangle for the Debug Settings floater + Persist + 1 + Type + Rect + Value + + 0 + 300 + 245 + 0 + + FloaterEnvRect Comment diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp index c7330e3d2..45b2c5c45 100644 --- a/indra/newview/llfloatersettingsdebug.cpp +++ b/indra/newview/llfloatersettingsdebug.cpp @@ -31,15 +31,18 @@ */ #include "llviewerprecompiledheaders.h" + #include "llfloatersettingsdebug.h" -#include "llfloater.h" -#include "lluictrlfactory.h" -//#include "llfirstuse.h" -#include "llcombobox.h" -#include "llspinctrl.h" + #include "llcolorswatch.h" -#include "llviewercontrol.h" +//#include "llfirstuse.h" +#include "llfloater.h" +#include "llscrolllistctrl.h" +#include "llspinctrl.h" #include "lltexteditor.h" +#include "lluictrlfactory.h" +#include "llviewercontrol.h" +#include "llwindow.h" // [RLVa:KB] #include "rlvhandler.h" @@ -48,36 +51,53 @@ LLFloaterSettingsDebug::LLFloaterSettingsDebug() : LLFloater(std::string("Configuration Editor")) +, mCurrentControlVariable(NULL) +, mOldControlVariable(NULL) +, mOldSearchTerm(std::string("---")) { + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_settings_debug.xml"); } LLFloaterSettingsDebug::~LLFloaterSettingsDebug() -{} +{ + if (mOldControlVariable) + mOldControlVariable->getCommitSignal()->disconnect(boost::bind(&LLFloaterSettingsDebug::onSettingSelect, this)); +} BOOL LLFloaterSettingsDebug::postBuild() { - LLComboBox* settings_combo = getChild("settings_combo"); + mSettingsScrollList = getChild("settings_scroll_list"); struct f : public LLControlGroup::ApplyFunctor { - LLComboBox* combo; - f(LLComboBox* c) : combo(c) {} + settings_map_t* map; + f(settings_map_t* m) : map(m) {} virtual void apply(const std::string& name, LLControlVariable* control) { if (!control->isHiddenFromSettingsEditor()) { - combo->add(name, (void*)control); + (*map)[name]=control; } } - } func(settings_combo); + } func(&mSettingsMap); gSavedSettings.applyToAll(&func); gSavedPerAccountSettings.applyToAll(&func); gColors.applyToAll(&func); - settings_combo->sortByName(); - settings_combo->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onSettingSelect, this, settings_combo)); - settings_combo->updateSelection(); + // Populate the list + { + for(settings_map_t::iterator it = mSettingsMap.begin(); it != mSettingsMap.end(); it++) + { + LLSD item; + item["columns"][0]["value"] = it->second->getName(); + mSettingsScrollList->addElement(item, ADD_BOTTOM, it->second); + } + } + mSettingsScrollList->sortByColumnIndex(0, true); + mSettingsScrollList->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onSettingSelect, this)); + + llinfos << mSettingsScrollList->getItemCount() << " total debug settings displayed." << llendl; getChild("val_spinner_1")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onCommitSettings, this)); getChild("val_spinner_2")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onCommitSettings, this)); @@ -86,34 +106,54 @@ BOOL LLFloaterSettingsDebug::postBuild() getChild("val_text")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onCommitSettings, this)); getChild("boolean_combo")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onCommitSettings, this)); getChild("color_swatch")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onCommitSettings, this)); + getChild("copy_btn")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onCopyToClipboard, this)); getChild("default_btn")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onClickDefault, this)); + getChild("search_settings_input")->setSearchCallback(onUpdateFilter, this); mComment = getChild("comment_text"); return TRUE; } void LLFloaterSettingsDebug::draw() { - LLComboBox* settings_combo = getChild("settings_combo"); - LLControlVariable* controlp = static_cast(settings_combo->getCurrentUserdata()); - updateControl(controlp ? controlp->getCOAActive() : NULL); + // check for changes in control visibility, like RLVa does + if(mCurrentControlVariable && mCurrentControlVariable->isHiddenFromSettingsEditor() != mOldVisibility) + updateControl(); LLFloater::draw(); } -void LLFloaterSettingsDebug::onSettingSelect(LLUICtrl* ctrl) +LLControlVariable* LLFloaterSettingsDebug::getControlVariable() { - LLComboBox* combo_box = static_cast(ctrl); - LLControlVariable* controlp = static_cast(combo_box->getCurrentUserdata()); + LLScrollListItem* item = mSettingsScrollList->getFirstSelected(); + if (!item) return NULL; - updateControl(controlp ? controlp->getCOAActive() : NULL); + LLControlVariable* controlp = static_cast(item->getUserdata()); + + return controlp ? controlp->getCOAActive() : NULL; +} + +void LLFloaterSettingsDebug::onSettingSelect() +{ + mCurrentControlVariable = getControlVariable(); + + if (mOldControlVariable == mCurrentControlVariable) return; + + // unbind change control signal from previously selected control + if(mOldControlVariable) + mOldControlVariable->getCommitSignal()->disconnect(boost::bind(&LLFloaterSettingsDebug::onSettingSelect, this)); + + // bind change control signal, so we can see updates to the current control in realtime + if(mCurrentControlVariable) + mCurrentControlVariable->getCommitSignal()->connect(boost::bind(&LLFloaterSettingsDebug::onSettingSelect, this)); + + mOldControlVariable = mCurrentControlVariable; + + updateControl(); } void LLFloaterSettingsDebug::onCommitSettings() { - LLComboBox* settings_combo = getChild("settings_combo"); - LLControlVariable* controlp = static_cast(settings_combo->getCurrentUserdata()); - controlp = controlp ? controlp->getCOAActive() : NULL; - if(!controlp)//Uh oh! + if (!mCurrentControlVariable) return; LLVector3 vector; @@ -124,87 +164,89 @@ void LLFloaterSettingsDebug::onCommitSettings() LLColor4U col4U; LLColor4 color_with_alpha; - switch(controlp->type()) + switch(mCurrentControlVariable->type()) { case TYPE_U32: - controlp->set(getChild("val_spinner_1")->getValue()); + mCurrentControlVariable->set(getChild("val_spinner_1")->getValue()); break; case TYPE_S32: - controlp->set(getChild("val_spinner_1")->getValue()); + mCurrentControlVariable->set(getChild("val_spinner_1")->getValue()); break; case TYPE_F32: - controlp->set(LLSD(getChild("val_spinner_1")->getValue().asReal())); + mCurrentControlVariable->set(LLSD(getChild("val_spinner_1")->getValue().asReal())); break; case TYPE_BOOLEAN: - controlp->set(getChild("boolean_combo")->getValue()); + mCurrentControlVariable->set(getChild("boolean_combo")->getValue()); break; case TYPE_STRING: - controlp->set(LLSD(getChild("val_text")->getValue().asString())); + mCurrentControlVariable->set(LLSD(getChild("val_text")->getValue().asString())); break; case TYPE_VEC3: vector.mV[VX] = (F32)getChild("val_spinner_1")->getValue().asReal(); vector.mV[VY] = (F32)getChild("val_spinner_2")->getValue().asReal(); vector.mV[VZ] = (F32)getChild("val_spinner_3")->getValue().asReal(); - controlp->set(vector.getValue()); + mCurrentControlVariable->set(vector.getValue()); break; case TYPE_VEC3D: vectord.mdV[VX] = getChild("val_spinner_1")->getValue().asReal(); vectord.mdV[VY] = getChild("val_spinner_2")->getValue().asReal(); vectord.mdV[VZ] = getChild("val_spinner_3")->getValue().asReal(); - controlp->set(vectord.getValue()); + mCurrentControlVariable->set(vectord.getValue()); break; case TYPE_RECT: rect.mLeft = getChild("val_spinner_1")->getValue().asInteger(); rect.mRight = getChild("val_spinner_2")->getValue().asInteger(); rect.mBottom = getChild("val_spinner_3")->getValue().asInteger(); rect.mTop = getChild("val_spinner_4")->getValue().asInteger(); - controlp->set(rect.getValue()); + mCurrentControlVariable->set(rect.getValue()); break; case TYPE_COL4: col3.setValue(getChild("val_color_swatch")->getValue()); col4 = LLColor4(col3, (F32)getChild("val_spinner_4")->getValue().asReal()); - controlp->set(col4.getValue()); + mCurrentControlVariable->set(col4.getValue()); break; case TYPE_COL3: - controlp->set(getChild("val_color_swatch")->getValue()); - //col3.mV[VRED] = (F32)floaterp->getChild("val_spinner_1")->getValue().asC(); - //col3.mV[VGREEN] = (F32)floaterp->getChild("val_spinner_2")->getValue().asReal(); - //col3.mV[VBLUE] = (F32)floaterp->getChild("val_spinner_3")->getValue().asReal(); - //controlp->set(col3.getValue()); + mCurrentControlVariable->set(getChild("val_color_swatch")->getValue()); + //col3.mV[VRED] = (F32)getChild("val_spinner_1")->getValue().asC(); + //col3.mV[VGREEN] = (F32)getChild("val_spinner_2")->getValue().asReal(); + //col3.mV[VBLUE] = (F32)getChild("val_spinner_3")->getValue().asReal(); + //mCurrentControlVariable->set(col3.getValue()); break; case TYPE_COL4U: col3.setValue(getChild("val_color_swatch")->getValue()); col4U.setVecScaleClamp(col3); col4U.mV[VALPHA] = getChild("val_spinner_4")->getValue().asInteger(); - controlp->set(col4U.getValue()); + mCurrentControlVariable->set(col4U.getValue()); break; default: break; } } -// static void LLFloaterSettingsDebug::onClickDefault() { - LLComboBox* settings_combo = getChild("settings_combo"); - LLControlVariable* controlp = (LLControlVariable*)settings_combo->getCurrentUserdata(); - - if (controlp) + if (mCurrentControlVariable) { - controlp = controlp->getCOAActive(); - controlp->resetToDefault(true); - updateControl(controlp); + mCurrentControlVariable->resetToDefault(true); + updateControl(); } } -// we've switched controls, or doing per-frame update, so update spinners, etc. -void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp) +void LLFloaterSettingsDebug::onCopyToClipboard() +{ + if (mCurrentControlVariable) + getWindow()->copyTextToClipboard(utf8str_to_wstring(mCurrentControlVariable->getName())); +} + +// we've switched controls, so update spinners, etc. +void LLFloaterSettingsDebug::updateControl() { LLSpinCtrl* spinner1 = getChild("val_spinner_1"); LLSpinCtrl* spinner2 = getChild("val_spinner_2"); LLSpinCtrl* spinner3 = getChild("val_spinner_3"); LLSpinCtrl* spinner4 = getChild("val_spinner_4"); LLColorSwatchCtrl* color_swatch = getChild("val_color_swatch"); + LLUICtrl* bool_ctrl = getChild("boolean_combo"); if (!spinner1 || !spinner2 || !spinner3 || !spinner4 || !color_swatch) { @@ -220,43 +262,31 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp) color_swatch->setVisible(FALSE); getChildView("val_text")->setVisible( FALSE); mComment->setText(LLStringUtil::null); + childSetEnabled("copy_btn", false); + childSetEnabled("default_btn", false); + bool_ctrl->setVisible(false); - if (controlp) + if (mCurrentControlVariable) { -// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.1d - if (rlv_handler_t::isEnabled()) - { - // Don't allow changing DBG_WRITE debug settings under @setdebug=n - bool fEnable = !( (gRlvHandler.hasBehaviour(RLV_BHVR_SETDEBUG)) && - (RlvExtGetSet::getDebugSettingFlags(controlp->getName()) & RlvExtGetSet::DBG_WRITE) ); - // Don't allow toggling "Basic Shaders" and/or "Atmopsheric Shaders" through the debug settings under @setenv=n - fEnable &= !((gRlvHandler.hasBehaviour(RLV_BHVR_SETENV)) && - (("VertexShaderEnable" == controlp->getName()) || ("WindLightUseAtmosShaders" == controlp->getName()))); - #ifdef RLV_EXTENSION_STARTLOCATION - // Don't allow toggling RLVaLoginLastLocation - fEnable &= !(RLV_SETTING_LOGINLASTLOCATION == controlp->getName()); - #endif // RLV_EXTENSION_STARTLOCATION - - // NOTE: this runs per-frame so there's no need to explictly handle onCommitSettings() or onClickDefault() - spinner1->setEnabled(fEnable); - spinner2->setEnabled(fEnable); - spinner3->setEnabled(fEnable); - spinner4->setEnabled(fEnable); - color_swatch->setEnabled(fEnable); - childSetEnabled("val_text", fEnable); - childSetEnabled("boolean_combo", fEnable); - childSetEnabled("default_btn", fEnable); - } +// [RLVa:KB] - Checked: 2011-05-28 (RLVa-1.4.0a) | Modified: RLVa-1.4.0a + // If "HideFromEditor" was toggled while the floater is open then we need to manually disable access to the control + mOldVisibility = mCurrentControlVariable->isHiddenFromSettingsEditor(); + spinner1->setEnabled(!mOldVisibility); + spinner2->setEnabled(!mOldVisibility); + spinner3->setEnabled(!mOldVisibility); + spinner4->setEnabled(!mOldVisibility); + color_swatch->setEnabled(!mOldVisibility); + childSetEnabled("val_text", !mOldVisibility); + bool_ctrl->setEnabled(!mOldVisibility); + childSetEnabled("default_btn", !mOldVisibility); // [/RLVa:KB] - controlp = controlp->getCOAActive(); - eControlType type = controlp->type(); + childSetEnabled("copy_btn", true); - //hide combo box only for non booleans, otherwise this will result in the combo box closing every frame - getChildView("boolean_combo")->setVisible(type == TYPE_BOOLEAN); - + eControlType type = mCurrentControlVariable->type(); + + mComment->setText(mCurrentControlVariable->getName() + std::string(": ") + mCurrentControlVariable->getComment()); - mComment->setText(controlp->getComment()); spinner1->setMaxValue(F32_MAX); spinner2->setMaxValue(F32_MAX); spinner3->setMaxValue(F32_MAX); @@ -282,7 +312,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp) spinner4->setIncrement(0.1f); } - LLSD sd = controlp->get(); + LLSD sd = mCurrentControlVariable->get(); switch(type) { case TYPE_U32: @@ -319,16 +349,10 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp) } break; case TYPE_BOOLEAN: - if (!getChild("boolean_combo")->hasFocus()) + bool_ctrl->setVisible(true); + if (!bool_ctrl->hasFocus()) { - if (sd.asBoolean()) - { - getChild("boolean_combo")->setValue(LLSD("true")); - } - else - { - getChild("boolean_combo")->setValue(LLSD("")); - } + bool_ctrl->setValue(sd.asInteger()); } break; case TYPE_STRING: @@ -501,3 +525,58 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp) } } + +void LLFloaterSettingsDebug::onUpdateFilter(const std::string& searchTerm, void*) +{ + LLFloaterSettingsDebug::getInstance()->updateFilter(searchTerm); +} + +void LLFloaterSettingsDebug::updateFilter(std::string searchTerm) +{ + // make sure not to reselect the first item in the list on focus restore + if (searchTerm == mOldSearchTerm) return; + + mOldSearchTerm = searchTerm; + + LLStringUtil::toLower(searchTerm); + + mSettingsScrollList->deleteAllItems(); + + for(settings_map_t::iterator it = mSettingsMap.begin(); it != mSettingsMap.end(); it++) + { + bool addItem = searchTerm.empty(); + if (!addItem) + { + std::string itemValue = it->second->getName(); + + LLStringUtil::toLower(itemValue); + + if (itemValue.find(searchTerm, 0) != std::string::npos) + { + addItem = true; + } + else // performance: broken out to save toLower calls on comments + { + std::string itemComment = it->second->getComment(); + LLStringUtil::toLower(itemComment); + if (itemComment.find(searchTerm, 0) != std::string::npos) + addItem = true; + } + } + + if (addItem) + { + LLSD item; + item["columns"][0]["value"] = it->second->getName(); + mSettingsScrollList->addElement(item, ADD_BOTTOM, it->second); + } + } + mSettingsScrollList->sortByColumnIndex(0, true); + + // if at least one match was found, highlight and select the topmost entry in the list + // but only if actually a search term was given + if (mSettingsScrollList->getItemCount() && !searchTerm.empty()) + mSettingsScrollList->selectFirstItem(); + + onSettingSelect(); +} diff --git a/indra/newview/llfloatersettingsdebug.h b/indra/newview/llfloatersettingsdebug.h index 334399caa..cce8fa481 100644 --- a/indra/newview/llfloatersettingsdebug.h +++ b/indra/newview/llfloatersettingsdebug.h @@ -36,6 +36,9 @@ #include "llcontrol.h" #include "llfloater.h" +class LLScrollListCtrl; +class LLTextEditor; + class LLFloaterSettingsDebug : public LLFloater , public LLSingleton @@ -47,15 +50,33 @@ public: virtual BOOL postBuild(); virtual void draw(); - void updateControl(LLControlVariable* control); + void updateControl(); - void onSettingSelect(LLUICtrl* ctrl); + // updates control filter to display in the controls list on keystroke + static void onUpdateFilter(const std::string& searchTerm, void*); + void updateFilter(std::string searchTerm); + + void onSettingSelect(); void onCommitSettings(); void onClickDefault(); + void onCopyToClipboard(); + +private: + // returns a pointer to the currently selected control variable, or NULL + LLControlVariable* getControlVariable(); protected: - class LLTextEditor* mComment; + typedef std::map settings_map_t; + + settings_map_t mSettingsMap; + + std::string mOldSearchTerm; + LLControlVariable* mCurrentControlVariable; + LLControlVariable* mOldControlVariable; + bool mOldVisibility; + + LLScrollListCtrl* mSettingsScrollList; + LLTextEditor* mComment; }; #endif //LLFLOATERDEBUGSETTINGS_H - diff --git a/indra/newview/skins/default/xui/en-us/floater_settings_debug.xml b/indra/newview/skins/default/xui/en-us/floater_settings_debug.xml index 6875e35fb..61cf756e8 100644 --- a/indra/newview/skins/default/xui/en-us/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/en-us/floater_settings_debug.xml @@ -1,31 +1,33 @@ - - + + + - - - TRUE - - - FALSE - - - + + True + + + False + + + - + - - - -