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.
This commit is contained in:
Lirusaito
2013-01-05 01:43:17 -05:00
parent 9498375e75
commit a992333744
4 changed files with 236 additions and 118 deletions

View File

@@ -6178,6 +6178,22 @@ This should be as low as possible, but too low may break functionality</string>
<integer>0</integer>
</array>
</map>
<key>FloaterDebugSettingsRect</key>
<map>
<key>Comment</key>
<string>Rectangle for the Debug Settings floater</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Rect</string>
<key>Value</key>
<array>
<integer>0</integer>
<integer>300</integer>
<integer>245</integer>
<integer>0</integer>
</array>
</map>
<key>FloaterEnvRect</key>
<map>
<key>Comment</key>

View File

@@ -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<LLComboBox>("settings_combo");
mSettingsScrollList = getChild<LLScrollListCtrl>("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<LLUICtrl>("val_spinner_1")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onCommitSettings, this));
getChild<LLUICtrl>("val_spinner_2")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onCommitSettings, this));
@@ -86,34 +106,54 @@ BOOL LLFloaterSettingsDebug::postBuild()
getChild<LLUICtrl>("val_text")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onCommitSettings, this));
getChild<LLUICtrl>("boolean_combo")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onCommitSettings, this));
getChild<LLUICtrl>("color_swatch")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onCommitSettings, this));
getChild<LLUICtrl>("copy_btn")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onCopyToClipboard, this));
getChild<LLUICtrl>("default_btn")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onClickDefault, this));
getChild<LLSearchEditor>("search_settings_input")->setSearchCallback(onUpdateFilter, this);
mComment = getChild<LLTextEditor>("comment_text");
return TRUE;
}
void LLFloaterSettingsDebug::draw()
{
LLComboBox* settings_combo = getChild<LLComboBox>("settings_combo");
LLControlVariable* controlp = static_cast<LLControlVariable*>(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<LLComboBox*>(ctrl);
LLControlVariable* controlp = static_cast<LLControlVariable*>(combo_box->getCurrentUserdata());
LLScrollListItem* item = mSettingsScrollList->getFirstSelected();
if (!item) return NULL;
updateControl(controlp ? controlp->getCOAActive() : NULL);
LLControlVariable* controlp = static_cast<LLControlVariable*>(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<LLComboBox>("settings_combo");
LLControlVariable* controlp = static_cast<LLControlVariable*>(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<LLUICtrl>("val_spinner_1")->getValue());
mCurrentControlVariable->set(getChild<LLUICtrl>("val_spinner_1")->getValue());
break;
case TYPE_S32:
controlp->set(getChild<LLUICtrl>("val_spinner_1")->getValue());
mCurrentControlVariable->set(getChild<LLUICtrl>("val_spinner_1")->getValue());
break;
case TYPE_F32:
controlp->set(LLSD(getChild<LLUICtrl>("val_spinner_1")->getValue().asReal()));
mCurrentControlVariable->set(LLSD(getChild<LLUICtrl>("val_spinner_1")->getValue().asReal()));
break;
case TYPE_BOOLEAN:
controlp->set(getChild<LLUICtrl>("boolean_combo")->getValue());
mCurrentControlVariable->set(getChild<LLUICtrl>("boolean_combo")->getValue());
break;
case TYPE_STRING:
controlp->set(LLSD(getChild<LLUICtrl>("val_text")->getValue().asString()));
mCurrentControlVariable->set(LLSD(getChild<LLUICtrl>("val_text")->getValue().asString()));
break;
case TYPE_VEC3:
vector.mV[VX] = (F32)getChild<LLUICtrl>("val_spinner_1")->getValue().asReal();
vector.mV[VY] = (F32)getChild<LLUICtrl>("val_spinner_2")->getValue().asReal();
vector.mV[VZ] = (F32)getChild<LLUICtrl>("val_spinner_3")->getValue().asReal();
controlp->set(vector.getValue());
mCurrentControlVariable->set(vector.getValue());
break;
case TYPE_VEC3D:
vectord.mdV[VX] = getChild<LLUICtrl>("val_spinner_1")->getValue().asReal();
vectord.mdV[VY] = getChild<LLUICtrl>("val_spinner_2")->getValue().asReal();
vectord.mdV[VZ] = getChild<LLUICtrl>("val_spinner_3")->getValue().asReal();
controlp->set(vectord.getValue());
mCurrentControlVariable->set(vectord.getValue());
break;
case TYPE_RECT:
rect.mLeft = getChild<LLUICtrl>("val_spinner_1")->getValue().asInteger();
rect.mRight = getChild<LLUICtrl>("val_spinner_2")->getValue().asInteger();
rect.mBottom = getChild<LLUICtrl>("val_spinner_3")->getValue().asInteger();
rect.mTop = getChild<LLUICtrl>("val_spinner_4")->getValue().asInteger();
controlp->set(rect.getValue());
mCurrentControlVariable->set(rect.getValue());
break;
case TYPE_COL4:
col3.setValue(getChild<LLUICtrl>("val_color_swatch")->getValue());
col4 = LLColor4(col3, (F32)getChild<LLUICtrl>("val_spinner_4")->getValue().asReal());
controlp->set(col4.getValue());
mCurrentControlVariable->set(col4.getValue());
break;
case TYPE_COL3:
controlp->set(getChild<LLUICtrl>("val_color_swatch")->getValue());
//col3.mV[VRED] = (F32)floaterp->getChild<LLUICtrl>("val_spinner_1")->getValue().asC();
//col3.mV[VGREEN] = (F32)floaterp->getChild<LLUICtrl>("val_spinner_2")->getValue().asReal();
//col3.mV[VBLUE] = (F32)floaterp->getChild<LLUICtrl>("val_spinner_3")->getValue().asReal();
//controlp->set(col3.getValue());
mCurrentControlVariable->set(getChild<LLUICtrl>("val_color_swatch")->getValue());
//col3.mV[VRED] = (F32)getChild<LLUICtrl>("val_spinner_1")->getValue().asC();
//col3.mV[VGREEN] = (F32)getChild<LLUICtrl>("val_spinner_2")->getValue().asReal();
//col3.mV[VBLUE] = (F32)getChild<LLUICtrl>("val_spinner_3")->getValue().asReal();
//mCurrentControlVariable->set(col3.getValue());
break;
case TYPE_COL4U:
col3.setValue(getChild<LLUICtrl>("val_color_swatch")->getValue());
col4U.setVecScaleClamp(col3);
col4U.mV[VALPHA] = getChild<LLUICtrl>("val_spinner_4")->getValue().asInteger();
controlp->set(col4U.getValue());
mCurrentControlVariable->set(col4U.getValue());
break;
default:
break;
}
}
// static
void LLFloaterSettingsDebug::onClickDefault()
{
LLComboBox* settings_combo = getChild<LLComboBox>("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<LLSpinCtrl>("val_spinner_1");
LLSpinCtrl* spinner2 = getChild<LLSpinCtrl>("val_spinner_2");
LLSpinCtrl* spinner3 = getChild<LLSpinCtrl>("val_spinner_3");
LLSpinCtrl* spinner4 = getChild<LLSpinCtrl>("val_spinner_4");
LLColorSwatchCtrl* color_swatch = getChild<LLColorSwatchCtrl>("val_color_swatch");
LLUICtrl* bool_ctrl = getChild<LLUICtrl>("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<LLUICtrl>("boolean_combo")->hasFocus())
bool_ctrl->setVisible(true);
if (!bool_ctrl->hasFocus())
{
if (sd.asBoolean())
{
getChild<LLUICtrl>("boolean_combo")->setValue(LLSD("true"));
}
else
{
getChild<LLUICtrl>("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();
}

View File

@@ -36,6 +36,9 @@
#include "llcontrol.h"
#include "llfloater.h"
class LLScrollListCtrl;
class LLTextEditor;
class LLFloaterSettingsDebug
: public LLFloater
, public LLSingleton<LLFloaterSettingsDebug>
@@ -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<std::string,LLControlVariable*> settings_map_t;
settings_map_t mSettingsMap;
std::string mOldSearchTerm;
LLControlVariable* mCurrentControlVariable;
LLControlVariable* mOldControlVariable;
bool mOldVisibility;
LLScrollListCtrl* mSettingsScrollList;
LLTextEditor* mComment;
};
#endif //LLFLOATERDEBUGSETTINGS_H

View File

@@ -1,31 +1,33 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater can_close="true" can_drag_on_left="false" can_minimize="false"
can_resize="false" height="215" name="settings_debug"
title="Debug Settings" width="350">
<combo_box allow_text_entry="true" bottom="-50" follows="top|left" font="SansSerifSmall"
height="20" left="15" max_chars="255" name="settings_combo" />
<text_editor bottom_delta="-75" enabled="false" height="60" width="320" hide_scrollbar="true"
can_resize="true" height="220" name="settings_debug" min_height="220" min_width="285"
title="Debug Settings" width="300" rect_control="FloaterDebugSettingsRect">
<search_editor bottom="-40" follows="top|left|right" height="20" label="Search" left="10" right="-10" max_chars="255" name="search_settings_input" tool_tip="Type the search term you are interested in here. Results will be displayed for partial fulltext matches within the setting's name or comment."/>
<scroll_list height="20" bottom_delta="-24" follows="all" left="10" right="-10" name="settings_scroll_list" />
<text_editor follows="left|right" bottom_delta="-64" enabled="false" height="60" width="320" left="10" right="-10" hide_scrollbar="true"
name="comment_text" word_wrap="true" />
<combo_box bottom_delta="-30" follows="top|left" font="SansSerifSmall" height="20"
<radio_group bottom_delta="-48" draw_border="false" follows="bottom|left|right" height="36"
left="15" name="boolean_combo" visible="false">
<combo_item name="TRUE" value="true">
TRUE
</combo_item>
<combo_item name="FALSE" value="">
FALSE
</combo_item>
</combo_box>
<line_editor bottom_delta="0" height="20" name="val_text" visible="false" width="300" />
<radio_item bottom="-18" height="15" name="TRUE" value="1">
True
</radio_item>
<radio_item bottom="-36" height="15" name="FALSE" value="0">
False
</radio_item>
</radio_group>
<line_editor follows="bottom|left|right" bottom="52" left="15" right="-15" height="20" name="val_text" visible="false" width="300" />
<color_swatch bottom="30" can_apply_immediately="true" height="55" label="Color"
name="val_color_swatch" visible="true" width="37" />
<spinner bottom_delta="25" height="20" label="x" label_width="40" max_val="10000000"
name="val_color_swatch" visible="false" width="37" />
<spinner bottom_delta="31" height="24" label="x" label_width="40" max_val="10000000"
name="val_spinner_1" visible="false" width="120" />
<spinner bottom_delta="0" height="20" label="x" label_width="40" left_delta="135"
<spinner bottom_delta="0" height="24" label="x" label_width="40" left_delta="135"
max_val="10000000" name="val_spinner_2" visible="false" width="120" />
<spinner bottom_delta="-20" height="20" label="x" label_width="40" left="15"
<spinner bottom_delta="-23" height="24" label="x" label_width="40" left="15"
max_val="10000000" name="val_spinner_3" visible="false" width="120" />
<spinner bottom_delta="0" height="20" label="x" label_width="40" left_delta="135"
<spinner bottom_delta="0" height="24" label="x" label_width="40" left_delta="135"
max_val="10000000" name="val_spinner_4" visible="false" width="120" />
<button bottom="5" height="20" label="Reset to default" left="15" name="default_btn"
width="150" />
<button bottom="10" height="20" label="Copy Name" left="10" name="copy_btn" tool_tip="Copy the name of this setting."
width="130" />
<button follows="right" bottom_delta="0" height="20" label="Reset to default" right="-10" name="default_btn"
width="130" />
</floater>