diff options
Diffstat (limited to 'indra/newview/llfloatersettingsdebug.cpp')
-rw-r--r-- | indra/newview/llfloatersettingsdebug.cpp | 1276 |
1 files changed, 638 insertions, 638 deletions
diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp index 210f938667..51569fb7d3 100644 --- a/indra/newview/llfloatersettingsdebug.cpp +++ b/indra/newview/llfloatersettingsdebug.cpp @@ -1,638 +1,638 @@ -/** - * @file llfloatersettingsdebug.cpp - * @brief floater for debugging internal viewer settings - * - * $LicenseInfo:firstyear=2022&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2022, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" -#include "llfloatersettingsdebug.h" -#include "llfloater.h" -#include "llfiltereditor.h" -#include "lluictrlfactory.h" -#include "llcombobox.h" -#include "llspinctrl.h" -#include "llcolorswatch.h" -#include "llviewercontrol.h" -#include "lltexteditor.h" - - -LLFloaterSettingsDebug::LLFloaterSettingsDebug(const LLSD& key) -: LLFloater(key), - mSettingList(NULL) -{ - mCommitCallbackRegistrar.add("CommitSettings", boost::bind(&LLFloaterSettingsDebug::onCommitSettings, this)); - mCommitCallbackRegistrar.add("ClickDefault", boost::bind(&LLFloaterSettingsDebug::onClickDefault, this)); -} - -LLFloaterSettingsDebug::~LLFloaterSettingsDebug() -{} - -bool LLFloaterSettingsDebug::postBuild() -{ - enableResizeCtrls(true, false, true); - - mComment = getChild<LLTextEditor>("comment_text"); - - getChild<LLFilterEditor>("filter_input")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::setSearchFilter, this, _2)); - - mSettingList = getChild<LLScrollListCtrl>("setting_list"); - mSettingList->setCommitOnSelectionChange(true); - mSettingList->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onSettingSelect, this)); - - updateList(); - - gSavedSettings.getControl("DebugSettingsHideDefault")->getCommitSignal()->connect(boost::bind(&LLFloaterSettingsDebug::updateList, this, false)); - - return true; -} - -void LLFloaterSettingsDebug::draw() -{ - LLScrollListItem* first_selected = mSettingList->getFirstSelected(); - if (first_selected) - { - LLControlVariable* controlp = (LLControlVariable*)first_selected->getUserdata(); - updateControl(controlp); - } - - LLFloater::draw(); -} - -void LLFloaterSettingsDebug::onCommitSettings() -{ - LLScrollListItem* first_selected = mSettingList->getFirstSelected(); - if (!first_selected) - { - return; - } - LLControlVariable* controlp = (LLControlVariable*)first_selected->getUserdata(); - - if (!controlp) - { - return; - } - - LLVector3 vector; - LLVector3d vectord; - LLQuaternion quat; - LLRect rect; - LLColor4 col4; - LLColor3 col3; - LLColor4U col4U; - LLColor4 color_with_alpha; - - switch(controlp->type()) - { - case TYPE_U32: - controlp->set(getChild<LLUICtrl>("val_spinner_1")->getValue()); - break; - case TYPE_S32: - controlp->set(getChild<LLUICtrl>("val_spinner_1")->getValue()); - break; - case TYPE_F32: - controlp->set(LLSD(getChild<LLUICtrl>("val_spinner_1")->getValue().asReal())); - break; - case TYPE_BOOLEAN: - controlp->set(getChild<LLUICtrl>("boolean_combo")->getValue()); - break; - case TYPE_STRING: - controlp->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()); - 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()); - break; - case TYPE_QUAT: - quat.mQ[VX] = getChild<LLUICtrl>("val_spinner_1")->getValue().asReal(); - quat.mQ[VY] = getChild<LLUICtrl>("val_spinner_2")->getValue().asReal(); - quat.mQ[VZ] = getChild<LLUICtrl>("val_spinner_3")->getValue().asReal(); - quat.mQ[VS] = getChild<LLUICtrl>("val_spinner_4")->getValue().asReal();; - controlp->set(quat.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()); - 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()); - 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()); - break; - default: - break; - } - updateDefaultColumn(controlp); -} - -// static -void LLFloaterSettingsDebug::onClickDefault() -{ - LLScrollListItem* first_selected = mSettingList->getFirstSelected(); - if (first_selected) - { - LLControlVariable* controlp = (LLControlVariable*)first_selected->getUserdata(); - if (controlp) - { - controlp->resetToDefault(true); - updateDefaultColumn(controlp); - updateControl(controlp); - } - } -} - -// we've switched controls, or doing per-frame update, so update spinners, etc. -void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp) -{ - 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"); - - if (!spinner1 || !spinner2 || !spinner3 || !spinner4 || !color_swatch) - { - LL_WARNS() << "Could not find all desired controls by name" - << LL_ENDL; - return; - } - - hideUIControls(); - - if (controlp && !isSettingHidden(controlp)) - { - eControlType type = controlp->type(); - - //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); - getChildView("default_btn")->setVisible(true); - getChildView("setting_name_txt")->setVisible(true); - getChild<LLTextBox>("setting_name_txt")->setText(controlp->getName()); - getChild<LLTextBox>("setting_name_txt")->setToolTip(controlp->getName()); - mComment->setVisible(true); - - std::string old_text = mComment->getText(); - std::string new_text = controlp->getComment(); - // Don't setText if not nessesary, it will reset scroll - // This is a debug UI that reads from xml, there might - // be use cases where comment changes, but not the name - if (old_text != new_text) - { - mComment->setText(controlp->getComment()); - } - - spinner1->setMaxValue(F32_MAX); - spinner2->setMaxValue(F32_MAX); - spinner3->setMaxValue(F32_MAX); - spinner4->setMaxValue(F32_MAX); - spinner1->setMinValue(-F32_MAX); - spinner2->setMinValue(-F32_MAX); - spinner3->setMinValue(-F32_MAX); - spinner4->setMinValue(-F32_MAX); - if (!spinner1->hasFocus()) - { - spinner1->setIncrement(0.1f); - } - if (!spinner2->hasFocus()) - { - spinner2->setIncrement(0.1f); - } - if (!spinner3->hasFocus()) - { - spinner3->setIncrement(0.1f); - } - if (!spinner4->hasFocus()) - { - spinner4->setIncrement(0.1f); - } - - LLSD sd = controlp->get(); - switch(type) - { - case TYPE_U32: - spinner1->setVisible(true); - spinner1->setLabel(std::string("value")); // Debug, don't translate - if (!spinner1->hasFocus()) - { - spinner1->setValue(sd); - spinner1->setMinValue((F32)U32_MIN); - spinner1->setMaxValue((F32)U32_MAX); - spinner1->setIncrement(1.f); - spinner1->setPrecision(0); - } - break; - case TYPE_S32: - spinner1->setVisible(true); - spinner1->setLabel(std::string("value")); // Debug, don't translate - if (!spinner1->hasFocus()) - { - spinner1->setValue(sd); - spinner1->setMinValue((F32)S32_MIN); - spinner1->setMaxValue((F32)S32_MAX); - spinner1->setIncrement(1.f); - spinner1->setPrecision(0); - } - break; - case TYPE_F32: - spinner1->setVisible(true); - spinner1->setLabel(std::string("value")); // Debug, don't translate - if (!spinner1->hasFocus()) - { - spinner1->setPrecision(3); - spinner1->setValue(sd); - } - break; - case TYPE_BOOLEAN: - if (!getChild<LLUICtrl>("boolean_combo")->hasFocus()) - { - if (sd.asBoolean()) - { - getChild<LLUICtrl>("boolean_combo")->setValue(LLSD("true")); - } - else - { - getChild<LLUICtrl>("boolean_combo")->setValue(LLSD("")); - } - } - break; - case TYPE_STRING: - getChildView("val_text")->setVisible( true); - if (!getChild<LLUICtrl>("val_text")->hasFocus()) - { - getChild<LLUICtrl>("val_text")->setValue(sd); - } - break; - case TYPE_VEC3: - { - LLVector3 v; - v.setValue(sd); - spinner1->setVisible(true); - spinner1->setLabel(std::string("X")); - spinner2->setVisible(true); - spinner2->setLabel(std::string("Y")); - spinner3->setVisible(true); - spinner3->setLabel(std::string("Z")); - if (!spinner1->hasFocus()) - { - spinner1->setPrecision(3); - spinner1->setValue(v[VX]); - } - if (!spinner2->hasFocus()) - { - spinner2->setPrecision(3); - spinner2->setValue(v[VY]); - } - if (!spinner3->hasFocus()) - { - spinner3->setPrecision(3); - spinner3->setValue(v[VZ]); - } - break; - } - case TYPE_VEC3D: - { - LLVector3d v; - v.setValue(sd); - spinner1->setVisible(true); - spinner1->setLabel(std::string("X")); - spinner2->setVisible(true); - spinner2->setLabel(std::string("Y")); - spinner3->setVisible(true); - spinner3->setLabel(std::string("Z")); - if (!spinner1->hasFocus()) - { - spinner1->setPrecision(3); - spinner1->setValue(v[VX]); - } - if (!spinner2->hasFocus()) - { - spinner2->setPrecision(3); - spinner2->setValue(v[VY]); - } - if (!spinner3->hasFocus()) - { - spinner3->setPrecision(3); - spinner3->setValue(v[VZ]); - } - break; - } - case TYPE_QUAT: - { - LLQuaternion q; - q.setValue(sd); - spinner1->setVisible(true); - spinner1->setLabel(std::string("X")); - spinner2->setVisible(true); - spinner2->setLabel(std::string("Y")); - spinner3->setVisible(true); - spinner3->setLabel(std::string("Z")); - spinner4->setVisible(true); - spinner4->setLabel(std::string("S")); - if (!spinner1->hasFocus()) - { - spinner1->setPrecision(4); - spinner1->setValue(q.mQ[VX]); - } - if (!spinner2->hasFocus()) - { - spinner2->setPrecision(4); - spinner2->setValue(q.mQ[VY]); - } - if (!spinner3->hasFocus()) - { - spinner3->setPrecision(4); - spinner3->setValue(q.mQ[VZ]); - } - if (!spinner4->hasFocus()) - { - spinner4->setPrecision(4); - spinner4->setValue(q.mQ[VS]); - } - break; - } - case TYPE_RECT: - { - LLRect r; - r.setValue(sd); - spinner1->setVisible(true); - spinner1->setLabel(std::string("Left")); - spinner2->setVisible(true); - spinner2->setLabel(std::string("Right")); - spinner3->setVisible(true); - spinner3->setLabel(std::string("Bottom")); - spinner4->setVisible(true); - spinner4->setLabel(std::string("Top")); - if (!spinner1->hasFocus()) - { - spinner1->setPrecision(0); - spinner1->setValue(r.mLeft); - } - if (!spinner2->hasFocus()) - { - spinner2->setPrecision(0); - spinner2->setValue(r.mRight); - } - if (!spinner3->hasFocus()) - { - spinner3->setPrecision(0); - spinner3->setValue(r.mBottom); - } - if (!spinner4->hasFocus()) - { - spinner4->setPrecision(0); - spinner4->setValue(r.mTop); - } - - spinner1->setMinValue((F32)S32_MIN); - spinner1->setMaxValue((F32)S32_MAX); - spinner1->setIncrement(1.f); - - spinner2->setMinValue((F32)S32_MIN); - spinner2->setMaxValue((F32)S32_MAX); - spinner2->setIncrement(1.f); - - spinner3->setMinValue((F32)S32_MIN); - spinner3->setMaxValue((F32)S32_MAX); - spinner3->setIncrement(1.f); - - spinner4->setMinValue((F32)S32_MIN); - spinner4->setMaxValue((F32)S32_MAX); - spinner4->setIncrement(1.f); - break; - } - case TYPE_COL4: - { - LLColor4 clr; - clr.setValue(sd); - color_swatch->setVisible(true); - // only set if changed so color picker doesn't update - if(clr != LLColor4(color_swatch->getValue())) - { - color_swatch->set(LLColor4(sd), true, false); - } - spinner4->setVisible(true); - spinner4->setLabel(std::string("Alpha")); - if (!spinner4->hasFocus()) - { - spinner4->setPrecision(3); - spinner4->setMinValue(0.0); - spinner4->setMaxValue(1.f); - spinner4->setValue(clr.mV[VALPHA]); - } - break; - } - case TYPE_COL3: - { - LLColor3 clr; - clr.setValue(sd); - color_swatch->setVisible(true); - color_swatch->setValue(sd); - break; - } - default: - mComment->setText(std::string("unknown")); - break; - } - } - -} - -void LLFloaterSettingsDebug::updateList(bool skip_selection) -{ - std::string last_selected; - LLScrollListItem* item = mSettingList->getFirstSelected(); - if (item) - { - LLScrollListCell* cell = item->getColumn(1); - if (cell) - { - last_selected = cell->getValue().asString(); - } - } - - mSettingList->deleteAllItems(); - struct f : public LLControlGroup::ApplyFunctor - { - LLScrollListCtrl* setting_list; - LLFloaterSettingsDebug* floater; - std::string selected_setting; - bool skip_selection; - f(LLScrollListCtrl* list, LLFloaterSettingsDebug* floater, std::string setting, bool skip_selection) - : setting_list(list), floater(floater), selected_setting(setting), skip_selection(skip_selection) {} - virtual void apply(const std::string& name, LLControlVariable* control) - { - if (!control->isHiddenFromSettingsEditor() && floater->matchesSearchFilter(name) && !floater->isSettingHidden(control)) - { - LLSD row; - - row["columns"][0]["column"] = "changed_setting"; - row["columns"][0]["value"] = control->isDefault() ? "" : "*"; - - row["columns"][1]["column"] = "setting"; - row["columns"][1]["value"] = name; - - LLScrollListItem* item = setting_list->addElement(row, ADD_BOTTOM, (void*)control); - if (!floater->mSearchFilter.empty() && (selected_setting == name) && !skip_selection) - { - std::string lower_name(name); - LLStringUtil::toLower(lower_name); - if (LLStringUtil::startsWith(lower_name, floater->mSearchFilter)) - { - item->setSelected(true); - } - } - } - } - } func(mSettingList, this, last_selected, skip_selection); - - std::string key = getKey().asString(); - if (key == "all" || key == "base") - { - gSavedSettings.applyToAll(&func); - } - if (key == "all" || key == "account") - { - gSavedPerAccountSettings.applyToAll(&func); - } - - - if (!mSettingList->isEmpty()) - { - if (mSettingList->hasSelectedItem()) - { - mSettingList->scrollToShowSelected(); - } - else if (!mSettingList->hasSelectedItem() && !mSearchFilter.empty() && !skip_selection) - { - if (!mSettingList->selectItemByPrefix(mSearchFilter, false, 1)) - { - mSettingList->selectFirstItem(); - } - mSettingList->scrollToShowSelected(); - } - } - else - { - LLSD row; - - row["columns"][0]["column"] = "changed_setting"; - row["columns"][0]["value"] = ""; - row["columns"][1]["column"] = "setting"; - row["columns"][1]["value"] = "No matching settings."; - - mSettingList->addElement(row); - hideUIControls(); - } -} - -void LLFloaterSettingsDebug::onSettingSelect() -{ - LLScrollListItem* first_selected = mSettingList->getFirstSelected(); - if (first_selected) - { - LLControlVariable* controlp = (LLControlVariable*)first_selected->getUserdata(); - if (controlp) - { - updateControl(controlp); - } - } -} - -void LLFloaterSettingsDebug::setSearchFilter(const std::string& filter) -{ - if(mSearchFilter == filter) - return; - mSearchFilter = filter; - LLStringUtil::toLower(mSearchFilter); - updateList(); -} - -bool LLFloaterSettingsDebug::matchesSearchFilter(std::string setting_name) -{ - // If the search filter is empty, everything passes. - if (mSearchFilter.empty()) return true; - - LLStringUtil::toLower(setting_name); - std::string::size_type match_name = setting_name.find(mSearchFilter); - - return (std::string::npos != match_name); -} - -bool LLFloaterSettingsDebug::isSettingHidden(LLControlVariable* control) -{ - static LLCachedControl<bool> hide_default(gSavedSettings, "DebugSettingsHideDefault", false); - return hide_default && control->isDefault(); -} - -void LLFloaterSettingsDebug::updateDefaultColumn(LLControlVariable* control) -{ - if (isSettingHidden(control)) - { - hideUIControls(); - updateList(true); - return; - } - - LLScrollListItem* item = mSettingList->getFirstSelected(); - if (item) - { - LLScrollListCell* cell = item->getColumn(0); - if (cell) - { - std::string is_default = control->isDefault() ? "" : "*"; - cell->setValue(is_default); - } - } -} - -void LLFloaterSettingsDebug::hideUIControls() -{ - getChildView("val_spinner_1")->setVisible(false); - getChildView("val_spinner_2")->setVisible(false); - getChildView("val_spinner_3")->setVisible(false); - getChildView("val_spinner_4")->setVisible(false); - getChildView("val_color_swatch")->setVisible(false); - getChildView("val_text")->setVisible(false); - getChildView("default_btn")->setVisible(false); - getChildView("boolean_combo")->setVisible(false); - getChildView("setting_name_txt")->setVisible(false); - mComment->setVisible(false); -} - +/**
+ * @file llfloatersettingsdebug.cpp
+ * @brief floater for debugging internal viewer settings
+ *
+ * $LicenseInfo:firstyear=2022&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2022, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llfloatersettingsdebug.h"
+#include "llfloater.h"
+#include "llfiltereditor.h"
+#include "lluictrlfactory.h"
+#include "llcombobox.h"
+#include "llspinctrl.h"
+#include "llcolorswatch.h"
+#include "llviewercontrol.h"
+#include "lltexteditor.h"
+
+
+LLFloaterSettingsDebug::LLFloaterSettingsDebug(const LLSD& key)
+: LLFloater(key),
+ mSettingList(NULL)
+{
+ mCommitCallbackRegistrar.add("CommitSettings", boost::bind(&LLFloaterSettingsDebug::onCommitSettings, this));
+ mCommitCallbackRegistrar.add("ClickDefault", boost::bind(&LLFloaterSettingsDebug::onClickDefault, this));
+}
+
+LLFloaterSettingsDebug::~LLFloaterSettingsDebug()
+{}
+
+bool LLFloaterSettingsDebug::postBuild()
+{
+ enableResizeCtrls(true, false, true);
+
+ mComment = getChild<LLTextEditor>("comment_text");
+
+ getChild<LLFilterEditor>("filter_input")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::setSearchFilter, this, _2));
+
+ mSettingList = getChild<LLScrollListCtrl>("setting_list");
+ mSettingList->setCommitOnSelectionChange(true);
+ mSettingList->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onSettingSelect, this));
+
+ updateList();
+
+ gSavedSettings.getControl("DebugSettingsHideDefault")->getCommitSignal()->connect(boost::bind(&LLFloaterSettingsDebug::updateList, this, false));
+
+ return true;
+}
+
+void LLFloaterSettingsDebug::draw()
+{
+ LLScrollListItem* first_selected = mSettingList->getFirstSelected();
+ if (first_selected)
+ {
+ LLControlVariable* controlp = (LLControlVariable*)first_selected->getUserdata();
+ updateControl(controlp);
+ }
+
+ LLFloater::draw();
+}
+
+void LLFloaterSettingsDebug::onCommitSettings()
+{
+ LLScrollListItem* first_selected = mSettingList->getFirstSelected();
+ if (!first_selected)
+ {
+ return;
+ }
+ LLControlVariable* controlp = (LLControlVariable*)first_selected->getUserdata();
+
+ if (!controlp)
+ {
+ return;
+ }
+
+ LLVector3 vector;
+ LLVector3d vectord;
+ LLQuaternion quat;
+ LLRect rect;
+ LLColor4 col4;
+ LLColor3 col3;
+ LLColor4U col4U;
+ LLColor4 color_with_alpha;
+
+ switch(controlp->type())
+ {
+ case TYPE_U32:
+ controlp->set(getChild<LLUICtrl>("val_spinner_1")->getValue());
+ break;
+ case TYPE_S32:
+ controlp->set(getChild<LLUICtrl>("val_spinner_1")->getValue());
+ break;
+ case TYPE_F32:
+ controlp->set(LLSD(getChild<LLUICtrl>("val_spinner_1")->getValue().asReal()));
+ break;
+ case TYPE_BOOLEAN:
+ controlp->set(getChild<LLUICtrl>("boolean_combo")->getValue());
+ break;
+ case TYPE_STRING:
+ controlp->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());
+ 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());
+ break;
+ case TYPE_QUAT:
+ quat.mQ[VX] = getChild<LLUICtrl>("val_spinner_1")->getValue().asReal();
+ quat.mQ[VY] = getChild<LLUICtrl>("val_spinner_2")->getValue().asReal();
+ quat.mQ[VZ] = getChild<LLUICtrl>("val_spinner_3")->getValue().asReal();
+ quat.mQ[VS] = getChild<LLUICtrl>("val_spinner_4")->getValue().asReal();;
+ controlp->set(quat.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());
+ 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());
+ 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());
+ break;
+ default:
+ break;
+ }
+ updateDefaultColumn(controlp);
+}
+
+// static
+void LLFloaterSettingsDebug::onClickDefault()
+{
+ LLScrollListItem* first_selected = mSettingList->getFirstSelected();
+ if (first_selected)
+ {
+ LLControlVariable* controlp = (LLControlVariable*)first_selected->getUserdata();
+ if (controlp)
+ {
+ controlp->resetToDefault(true);
+ updateDefaultColumn(controlp);
+ updateControl(controlp);
+ }
+ }
+}
+
+// we've switched controls, or doing per-frame update, so update spinners, etc.
+void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
+{
+ 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");
+
+ if (!spinner1 || !spinner2 || !spinner3 || !spinner4 || !color_swatch)
+ {
+ LL_WARNS() << "Could not find all desired controls by name"
+ << LL_ENDL;
+ return;
+ }
+
+ hideUIControls();
+
+ if (controlp && !isSettingHidden(controlp))
+ {
+ eControlType type = controlp->type();
+
+ //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);
+ getChildView("default_btn")->setVisible(true);
+ getChildView("setting_name_txt")->setVisible(true);
+ getChild<LLTextBox>("setting_name_txt")->setText(controlp->getName());
+ getChild<LLTextBox>("setting_name_txt")->setToolTip(controlp->getName());
+ mComment->setVisible(true);
+
+ std::string old_text = mComment->getText();
+ std::string new_text = controlp->getComment();
+ // Don't setText if not nessesary, it will reset scroll
+ // This is a debug UI that reads from xml, there might
+ // be use cases where comment changes, but not the name
+ if (old_text != new_text)
+ {
+ mComment->setText(controlp->getComment());
+ }
+
+ spinner1->setMaxValue(F32_MAX);
+ spinner2->setMaxValue(F32_MAX);
+ spinner3->setMaxValue(F32_MAX);
+ spinner4->setMaxValue(F32_MAX);
+ spinner1->setMinValue(-F32_MAX);
+ spinner2->setMinValue(-F32_MAX);
+ spinner3->setMinValue(-F32_MAX);
+ spinner4->setMinValue(-F32_MAX);
+ if (!spinner1->hasFocus())
+ {
+ spinner1->setIncrement(0.1f);
+ }
+ if (!spinner2->hasFocus())
+ {
+ spinner2->setIncrement(0.1f);
+ }
+ if (!spinner3->hasFocus())
+ {
+ spinner3->setIncrement(0.1f);
+ }
+ if (!spinner4->hasFocus())
+ {
+ spinner4->setIncrement(0.1f);
+ }
+
+ LLSD sd = controlp->get();
+ switch(type)
+ {
+ case TYPE_U32:
+ spinner1->setVisible(true);
+ spinner1->setLabel(std::string("value")); // Debug, don't translate
+ if (!spinner1->hasFocus())
+ {
+ spinner1->setValue(sd);
+ spinner1->setMinValue((F32)U32_MIN);
+ spinner1->setMaxValue((F32)U32_MAX);
+ spinner1->setIncrement(1.f);
+ spinner1->setPrecision(0);
+ }
+ break;
+ case TYPE_S32:
+ spinner1->setVisible(true);
+ spinner1->setLabel(std::string("value")); // Debug, don't translate
+ if (!spinner1->hasFocus())
+ {
+ spinner1->setValue(sd);
+ spinner1->setMinValue((F32)S32_MIN);
+ spinner1->setMaxValue((F32)S32_MAX);
+ spinner1->setIncrement(1.f);
+ spinner1->setPrecision(0);
+ }
+ break;
+ case TYPE_F32:
+ spinner1->setVisible(true);
+ spinner1->setLabel(std::string("value")); // Debug, don't translate
+ if (!spinner1->hasFocus())
+ {
+ spinner1->setPrecision(3);
+ spinner1->setValue(sd);
+ }
+ break;
+ case TYPE_BOOLEAN:
+ if (!getChild<LLUICtrl>("boolean_combo")->hasFocus())
+ {
+ if (sd.asBoolean())
+ {
+ getChild<LLUICtrl>("boolean_combo")->setValue(LLSD("true"));
+ }
+ else
+ {
+ getChild<LLUICtrl>("boolean_combo")->setValue(LLSD(""));
+ }
+ }
+ break;
+ case TYPE_STRING:
+ getChildView("val_text")->setVisible( true);
+ if (!getChild<LLUICtrl>("val_text")->hasFocus())
+ {
+ getChild<LLUICtrl>("val_text")->setValue(sd);
+ }
+ break;
+ case TYPE_VEC3:
+ {
+ LLVector3 v;
+ v.setValue(sd);
+ spinner1->setVisible(true);
+ spinner1->setLabel(std::string("X"));
+ spinner2->setVisible(true);
+ spinner2->setLabel(std::string("Y"));
+ spinner3->setVisible(true);
+ spinner3->setLabel(std::string("Z"));
+ if (!spinner1->hasFocus())
+ {
+ spinner1->setPrecision(3);
+ spinner1->setValue(v[VX]);
+ }
+ if (!spinner2->hasFocus())
+ {
+ spinner2->setPrecision(3);
+ spinner2->setValue(v[VY]);
+ }
+ if (!spinner3->hasFocus())
+ {
+ spinner3->setPrecision(3);
+ spinner3->setValue(v[VZ]);
+ }
+ break;
+ }
+ case TYPE_VEC3D:
+ {
+ LLVector3d v;
+ v.setValue(sd);
+ spinner1->setVisible(true);
+ spinner1->setLabel(std::string("X"));
+ spinner2->setVisible(true);
+ spinner2->setLabel(std::string("Y"));
+ spinner3->setVisible(true);
+ spinner3->setLabel(std::string("Z"));
+ if (!spinner1->hasFocus())
+ {
+ spinner1->setPrecision(3);
+ spinner1->setValue(v[VX]);
+ }
+ if (!spinner2->hasFocus())
+ {
+ spinner2->setPrecision(3);
+ spinner2->setValue(v[VY]);
+ }
+ if (!spinner3->hasFocus())
+ {
+ spinner3->setPrecision(3);
+ spinner3->setValue(v[VZ]);
+ }
+ break;
+ }
+ case TYPE_QUAT:
+ {
+ LLQuaternion q;
+ q.setValue(sd);
+ spinner1->setVisible(true);
+ spinner1->setLabel(std::string("X"));
+ spinner2->setVisible(true);
+ spinner2->setLabel(std::string("Y"));
+ spinner3->setVisible(true);
+ spinner3->setLabel(std::string("Z"));
+ spinner4->setVisible(true);
+ spinner4->setLabel(std::string("S"));
+ if (!spinner1->hasFocus())
+ {
+ spinner1->setPrecision(4);
+ spinner1->setValue(q.mQ[VX]);
+ }
+ if (!spinner2->hasFocus())
+ {
+ spinner2->setPrecision(4);
+ spinner2->setValue(q.mQ[VY]);
+ }
+ if (!spinner3->hasFocus())
+ {
+ spinner3->setPrecision(4);
+ spinner3->setValue(q.mQ[VZ]);
+ }
+ if (!spinner4->hasFocus())
+ {
+ spinner4->setPrecision(4);
+ spinner4->setValue(q.mQ[VS]);
+ }
+ break;
+ }
+ case TYPE_RECT:
+ {
+ LLRect r;
+ r.setValue(sd);
+ spinner1->setVisible(true);
+ spinner1->setLabel(std::string("Left"));
+ spinner2->setVisible(true);
+ spinner2->setLabel(std::string("Right"));
+ spinner3->setVisible(true);
+ spinner3->setLabel(std::string("Bottom"));
+ spinner4->setVisible(true);
+ spinner4->setLabel(std::string("Top"));
+ if (!spinner1->hasFocus())
+ {
+ spinner1->setPrecision(0);
+ spinner1->setValue(r.mLeft);
+ }
+ if (!spinner2->hasFocus())
+ {
+ spinner2->setPrecision(0);
+ spinner2->setValue(r.mRight);
+ }
+ if (!spinner3->hasFocus())
+ {
+ spinner3->setPrecision(0);
+ spinner3->setValue(r.mBottom);
+ }
+ if (!spinner4->hasFocus())
+ {
+ spinner4->setPrecision(0);
+ spinner4->setValue(r.mTop);
+ }
+
+ spinner1->setMinValue((F32)S32_MIN);
+ spinner1->setMaxValue((F32)S32_MAX);
+ spinner1->setIncrement(1.f);
+
+ spinner2->setMinValue((F32)S32_MIN);
+ spinner2->setMaxValue((F32)S32_MAX);
+ spinner2->setIncrement(1.f);
+
+ spinner3->setMinValue((F32)S32_MIN);
+ spinner3->setMaxValue((F32)S32_MAX);
+ spinner3->setIncrement(1.f);
+
+ spinner4->setMinValue((F32)S32_MIN);
+ spinner4->setMaxValue((F32)S32_MAX);
+ spinner4->setIncrement(1.f);
+ break;
+ }
+ case TYPE_COL4:
+ {
+ LLColor4 clr;
+ clr.setValue(sd);
+ color_swatch->setVisible(true);
+ // only set if changed so color picker doesn't update
+ if(clr != LLColor4(color_swatch->getValue()))
+ {
+ color_swatch->set(LLColor4(sd), true, false);
+ }
+ spinner4->setVisible(true);
+ spinner4->setLabel(std::string("Alpha"));
+ if (!spinner4->hasFocus())
+ {
+ spinner4->setPrecision(3);
+ spinner4->setMinValue(0.0);
+ spinner4->setMaxValue(1.f);
+ spinner4->setValue(clr.mV[VALPHA]);
+ }
+ break;
+ }
+ case TYPE_COL3:
+ {
+ LLColor3 clr;
+ clr.setValue(sd);
+ color_swatch->setVisible(true);
+ color_swatch->setValue(sd);
+ break;
+ }
+ default:
+ mComment->setText(std::string("unknown"));
+ break;
+ }
+ }
+
+}
+
+void LLFloaterSettingsDebug::updateList(bool skip_selection)
+{
+ std::string last_selected;
+ LLScrollListItem* item = mSettingList->getFirstSelected();
+ if (item)
+ {
+ LLScrollListCell* cell = item->getColumn(1);
+ if (cell)
+ {
+ last_selected = cell->getValue().asString();
+ }
+ }
+
+ mSettingList->deleteAllItems();
+ struct f : public LLControlGroup::ApplyFunctor
+ {
+ LLScrollListCtrl* setting_list;
+ LLFloaterSettingsDebug* floater;
+ std::string selected_setting;
+ bool skip_selection;
+ f(LLScrollListCtrl* list, LLFloaterSettingsDebug* floater, std::string setting, bool skip_selection)
+ : setting_list(list), floater(floater), selected_setting(setting), skip_selection(skip_selection) {}
+ virtual void apply(const std::string& name, LLControlVariable* control)
+ {
+ if (!control->isHiddenFromSettingsEditor() && floater->matchesSearchFilter(name) && !floater->isSettingHidden(control))
+ {
+ LLSD row;
+
+ row["columns"][0]["column"] = "changed_setting";
+ row["columns"][0]["value"] = control->isDefault() ? "" : "*";
+
+ row["columns"][1]["column"] = "setting";
+ row["columns"][1]["value"] = name;
+
+ LLScrollListItem* item = setting_list->addElement(row, ADD_BOTTOM, (void*)control);
+ if (!floater->mSearchFilter.empty() && (selected_setting == name) && !skip_selection)
+ {
+ std::string lower_name(name);
+ LLStringUtil::toLower(lower_name);
+ if (LLStringUtil::startsWith(lower_name, floater->mSearchFilter))
+ {
+ item->setSelected(true);
+ }
+ }
+ }
+ }
+ } func(mSettingList, this, last_selected, skip_selection);
+
+ std::string key = getKey().asString();
+ if (key == "all" || key == "base")
+ {
+ gSavedSettings.applyToAll(&func);
+ }
+ if (key == "all" || key == "account")
+ {
+ gSavedPerAccountSettings.applyToAll(&func);
+ }
+
+
+ if (!mSettingList->isEmpty())
+ {
+ if (mSettingList->hasSelectedItem())
+ {
+ mSettingList->scrollToShowSelected();
+ }
+ else if (!mSettingList->hasSelectedItem() && !mSearchFilter.empty() && !skip_selection)
+ {
+ if (!mSettingList->selectItemByPrefix(mSearchFilter, false, 1))
+ {
+ mSettingList->selectFirstItem();
+ }
+ mSettingList->scrollToShowSelected();
+ }
+ }
+ else
+ {
+ LLSD row;
+
+ row["columns"][0]["column"] = "changed_setting";
+ row["columns"][0]["value"] = "";
+ row["columns"][1]["column"] = "setting";
+ row["columns"][1]["value"] = "No matching settings.";
+
+ mSettingList->addElement(row);
+ hideUIControls();
+ }
+}
+
+void LLFloaterSettingsDebug::onSettingSelect()
+{
+ LLScrollListItem* first_selected = mSettingList->getFirstSelected();
+ if (first_selected)
+ {
+ LLControlVariable* controlp = (LLControlVariable*)first_selected->getUserdata();
+ if (controlp)
+ {
+ updateControl(controlp);
+ }
+ }
+}
+
+void LLFloaterSettingsDebug::setSearchFilter(const std::string& filter)
+{
+ if(mSearchFilter == filter)
+ return;
+ mSearchFilter = filter;
+ LLStringUtil::toLower(mSearchFilter);
+ updateList();
+}
+
+bool LLFloaterSettingsDebug::matchesSearchFilter(std::string setting_name)
+{
+ // If the search filter is empty, everything passes.
+ if (mSearchFilter.empty()) return true;
+
+ LLStringUtil::toLower(setting_name);
+ std::string::size_type match_name = setting_name.find(mSearchFilter);
+
+ return (std::string::npos != match_name);
+}
+
+bool LLFloaterSettingsDebug::isSettingHidden(LLControlVariable* control)
+{
+ static LLCachedControl<bool> hide_default(gSavedSettings, "DebugSettingsHideDefault", false);
+ return hide_default && control->isDefault();
+}
+
+void LLFloaterSettingsDebug::updateDefaultColumn(LLControlVariable* control)
+{
+ if (isSettingHidden(control))
+ {
+ hideUIControls();
+ updateList(true);
+ return;
+ }
+
+ LLScrollListItem* item = mSettingList->getFirstSelected();
+ if (item)
+ {
+ LLScrollListCell* cell = item->getColumn(0);
+ if (cell)
+ {
+ std::string is_default = control->isDefault() ? "" : "*";
+ cell->setValue(is_default);
+ }
+ }
+}
+
+void LLFloaterSettingsDebug::hideUIControls()
+{
+ getChildView("val_spinner_1")->setVisible(false);
+ getChildView("val_spinner_2")->setVisible(false);
+ getChildView("val_spinner_3")->setVisible(false);
+ getChildView("val_spinner_4")->setVisible(false);
+ getChildView("val_color_swatch")->setVisible(false);
+ getChildView("val_text")->setVisible(false);
+ getChildView("default_btn")->setVisible(false);
+ getChildView("boolean_combo")->setVisible(false);
+ getChildView("setting_name_txt")->setVisible(false);
+ mComment->setVisible(false);
+}
+
|