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
+
+
+
-
+
-
-
-
-
+
+