diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 2850f52ee..f5924e14a 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -760,6 +760,17 @@ Found in Advanced->Rendering->Info Displays Value 1 + ShowLocalChatFloaterBar + + Comment + Whether or not local chat should have an input bar, requires a restart. + Persist + 1 + Type + Boolean + Value + 1 + OtherChatsTornOff Comment @@ -780,6 +791,17 @@ Found in Advanced->Rendering->Info Displays Type Boolean Value + 1 + + CommunicateSpecificShortcut + + Comment + When true, the keyboard shortcut for Communicate will not bring up the torn off Friends List. + Persist + 1 + Type + Boolean + Value 0 MarketImporterUpdateFreq @@ -6125,6 +6147,22 @@ This should be as low as possible, but too low may break functionality 0 + FloaterChatBarlessRect + + Comment + Rectangle for chat history without input bar + Persist + 1 + Type + Rect + Value + + 0 + 172 + 500 + 0 + + FloaterClothingRect Comment @@ -6189,6 +6227,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/ascentprefschat.cpp b/indra/newview/ascentprefschat.cpp index d4b8c3407..eab67ed86 100644 --- a/indra/newview/ascentprefschat.cpp +++ b/indra/newview/ascentprefschat.cpp @@ -329,6 +329,7 @@ void LLPrefsAscentChat::refreshValues() mIMAnnounceIncoming = gSavedSettings.getBOOL("AscentInstantMessageAnnounceIncoming"); mHideTypingNotification = gSavedSettings.getBOOL("AscentHideTypingNotification"); mShowGroupNameInChatIM = gSavedSettings.getBOOL("OptionShowGroupNameInChatIM"); + mShowLocalChatFloaterBar = gSavedSettings.getBOOL("ShowLocalChatFloaterBar"); mPlayTypingSound = gSavedSettings.getBOOL("PlayTypingSound"); mHideNotificationsInChat = gSavedSettings.getBOOL("HideNotificationsInChat"); mEnableMUPose = gSavedSettings.getBOOL("AscentAllowMUpose"); @@ -536,6 +537,7 @@ void LLPrefsAscentChat::cancel() gSavedSettings.setBOOL("AscentInstantMessageAnnounceIncoming", mIMAnnounceIncoming); gSavedSettings.setBOOL("AscentHideTypingNotification", mHideTypingNotification); gSavedSettings.setBOOL("OptionShowGroupNameInChatIM", mShowGroupNameInChatIM); + gSavedSettings.setBOOL("ShowLocalChatFloaterBar", mShowLocalChatFloaterBar); gSavedSettings.setBOOL("PlayTypingSound", mPlayTypingSound); gSavedSettings.setBOOL("HideNotificationsInChat", mHideNotificationsInChat); gSavedSettings.setBOOL("AscentAllowMUpose", mEnableMUPose); diff --git a/indra/newview/ascentprefschat.h b/indra/newview/ascentprefschat.h index 03e980c3f..4bf8f7551 100644 --- a/indra/newview/ascentprefschat.h +++ b/indra/newview/ascentprefschat.h @@ -66,6 +66,7 @@ protected: BOOL mIMAnnounceIncoming; BOOL mHideTypingNotification; BOOL mShowGroupNameInChatIM; + bool mShowLocalChatFloaterBar; BOOL mPlayTypingSound; BOOL mHideNotificationsInChat; BOOL mEnableMUPose; diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp index bfb4892c6..db38f8009 100644 --- a/indra/newview/llfloaterchat.cpp +++ b/indra/newview/llfloaterchat.cpp @@ -108,7 +108,8 @@ LLFloaterChat::LLFloaterChat(const LLSD& seed) mFactoryMap["active_speakers_panel"] = LLCallbackMap(createSpeakersPanel, NULL); // do not automatically open singleton floaters (as result of getInstance()) BOOL no_open = FALSE; - LLUICtrlFactory::getInstance()->buildFloater(this,"floater_chat_history.xml",&getFactoryMap(),no_open); + bool show_bar = gSavedSettings.getBOOL("ShowLocalChatFloaterBar"); + LLUICtrlFactory::getInstance()->buildFloater(this, (show_bar ? "floater_chat_history.xml" : "floater_chat_history_barless.xml"), &getFactoryMap(), no_open); childSetCommitCallback("show mutes",onClickToggleShowMute,this); //show mutes childSetCommitCallback("translate chat",onClickToggleTranslateChat,this); diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp index 2d7ce1da4..45b2c5c45 100644 --- a/indra/newview/llfloatersettingsdebug.cpp +++ b/indra/newview/llfloatersettingsdebug.cpp @@ -31,117 +31,129 @@ */ #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 "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" #include "rlvextensions.h" // [/RLVa:KB] -LLFloaterSettingsDebug* LLFloaterSettingsDebug::sInstance = NULL; - -LLFloaterSettingsDebug::LLFloaterSettingsDebug() : LLFloater(std::string("Configuration Editor")) +LLFloaterSettingsDebug::LLFloaterSettingsDebug() +: LLFloater(std::string("Configuration Editor")) +, mCurrentControlVariable(NULL) +, mOldControlVariable(NULL) +, mOldSearchTerm(std::string("---")) { + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_settings_debug.xml"); } LLFloaterSettingsDebug::~LLFloaterSettingsDebug() { - sInstance = NULL; + 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(onSettingSelect); - settings_combo->setCallbackUserData(this); - 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)); - childSetCommitCallback("val_spinner_1", onCommitSettings); - childSetUserData("val_spinner_1", this); - childSetCommitCallback("val_spinner_2", onCommitSettings); - childSetUserData("val_spinner_2", this); - childSetCommitCallback("val_spinner_3", onCommitSettings); - childSetUserData("val_spinner_3", this); - childSetCommitCallback("val_spinner_4", onCommitSettings); - childSetUserData("val_spinner_4", this); - childSetCommitCallback("val_text", onCommitSettings); - childSetUserData("val_text", this); - childSetCommitCallback("boolean_combo", onCommitSettings); - childSetUserData("boolean_combo", this); - childSetCommitCallback("color_swatch", onCommitSettings); - childSetUserData("color_swatch", this); - childSetAction("default_btn", onClickDefault, 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)); + getChild("val_spinner_3")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onCommitSettings, this)); + getChild("val_spinner_4")->setCommitCallback(boost::bind(&LLFloaterSettingsDebug::onCommitSettings, this)); + 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(); } -//static -void LLFloaterSettingsDebug::show(void*) +LLControlVariable* LLFloaterSettingsDebug::getControlVariable() { - if (sInstance == NULL) - { - sInstance = new LLFloaterSettingsDebug(); + LLScrollListItem* item = mSettingsScrollList->getFirstSelected(); + if (!item) return NULL; - LLUICtrlFactory::getInstance()->buildFloater(sInstance, "floater_settings_debug.xml"); - } + LLControlVariable* controlp = static_cast(item->getUserdata()); - sInstance->open(); /* Flawfinder: ignore */ + return controlp ? controlp->getCOAActive() : NULL; } -//static -void LLFloaterSettingsDebug::onSettingSelect(LLUICtrl* ctrl, void* user_data) +void LLFloaterSettingsDebug::onSettingSelect() { - LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data; - LLComboBox* combo_box = static_cast(ctrl); - LLControlVariable* controlp = static_cast(combo_box->getCurrentUserdata()); + mCurrentControlVariable = getControlVariable(); - floaterp->updateControl(controlp ? controlp->getCOAActive() : NULL); + 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(); } -//static -void LLFloaterSettingsDebug::onCommitSettings(LLUICtrl* ctrl, void* user_data) +void LLFloaterSettingsDebug::onCommitSettings() { - LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data; - - LLComboBox* settings_combo = floaterp->getChild("settings_combo"); - LLControlVariable* controlp = static_cast(settings_combo->getCurrentUserdata()); - controlp = controlp ? controlp->getCOAActive() : NULL; - if(!controlp)//Uh oh! + if (!mCurrentControlVariable) return; LLVector3 vector; @@ -152,88 +164,89 @@ void LLFloaterSettingsDebug::onCommitSettings(LLUICtrl* ctrl, void* user_data) LLColor4U col4U; LLColor4 color_with_alpha; - switch(controlp->type()) + switch(mCurrentControlVariable->type()) { case TYPE_U32: - controlp->set(floaterp->childGetValue("val_spinner_1")); + mCurrentControlVariable->set(getChild("val_spinner_1")->getValue()); break; case TYPE_S32: - controlp->set(floaterp->childGetValue("val_spinner_1")); + mCurrentControlVariable->set(getChild("val_spinner_1")->getValue()); break; case TYPE_F32: - controlp->set(LLSD(floaterp->childGetValue("val_spinner_1").asReal())); + mCurrentControlVariable->set(LLSD(getChild("val_spinner_1")->getValue().asReal())); break; case TYPE_BOOLEAN: - controlp->set(floaterp->childGetValue("boolean_combo")); + mCurrentControlVariable->set(getChild("boolean_combo")->getValue()); break; case TYPE_STRING: - controlp->set(LLSD(floaterp->childGetValue("val_text").asString())); + mCurrentControlVariable->set(LLSD(getChild("val_text")->getValue().asString())); break; case TYPE_VEC3: - vector.mV[VX] = (F32)floaterp->childGetValue("val_spinner_1").asReal(); - vector.mV[VY] = (F32)floaterp->childGetValue("val_spinner_2").asReal(); - vector.mV[VZ] = (F32)floaterp->childGetValue("val_spinner_3").asReal(); - controlp->set(vector.getValue()); + 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(); + mCurrentControlVariable->set(vector.getValue()); break; case TYPE_VEC3D: - vectord.mdV[VX] = floaterp->childGetValue("val_spinner_1").asReal(); - vectord.mdV[VY] = floaterp->childGetValue("val_spinner_2").asReal(); - vectord.mdV[VZ] = floaterp->childGetValue("val_spinner_3").asReal(); - controlp->set(vectord.getValue()); + 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(); + mCurrentControlVariable->set(vectord.getValue()); break; case TYPE_RECT: - rect.mLeft = floaterp->childGetValue("val_spinner_1").asInteger(); - rect.mRight = floaterp->childGetValue("val_spinner_2").asInteger(); - rect.mBottom = floaterp->childGetValue("val_spinner_3").asInteger(); - rect.mTop = floaterp->childGetValue("val_spinner_4").asInteger(); - controlp->set(rect.getValue()); + 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(); + mCurrentControlVariable->set(rect.getValue()); break; case TYPE_COL4: - col3.setValue(floaterp->childGetValue("color_swatch")); - col4 = LLColor4(col3, (F32)floaterp->childGetValue("val_spinner_4").asReal()); - controlp->set(col4.getValue()); + col3.setValue(getChild("val_color_swatch")->getValue()); + col4 = LLColor4(col3, (F32)getChild("val_spinner_4")->getValue().asReal()); + mCurrentControlVariable->set(col4.getValue()); break; case TYPE_COL3: - controlp->set(floaterp->childGetValue("color_swatch")); - //col3.mV[VRED] = (F32)floaterp->childGetValue("val_spinner_1").asC(); - //col3.mV[VGREEN] = (F32)floaterp->childGetValue("val_spinner_2").asReal(); - //col3.mV[VBLUE] = (F32)floaterp->childGetValue("val_spinner_3").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(floaterp->childGetValue("color_swatch")); + col3.setValue(getChild("val_color_swatch")->getValue()); col4U.setVecScaleClamp(col3); - col4U.mV[VALPHA] = floaterp->childGetValue("val_spinner_4").asInteger(); - controlp->set(col4U.getValue()); + col4U.mV[VALPHA] = getChild("val_spinner_4")->getValue().asInteger(); + mCurrentControlVariable->set(col4U.getValue()); break; default: break; } } -// static -void LLFloaterSettingsDebug::onClickDefault(void* user_data) +void LLFloaterSettingsDebug::onClickDefault() { - LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data; - LLComboBox* settings_combo = floaterp->getChild("settings_combo"); - LLControlVariable* controlp = (LLControlVariable*)settings_combo->getCurrentUserdata(); - - if (controlp) + if (mCurrentControlVariable) { - controlp = controlp->getCOAActive(); - controlp->resetToDefault(true); - floaterp->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("color_swatch"); + LLColorSwatchCtrl* color_swatch = getChild("val_color_swatch"); + LLUICtrl* bool_ctrl = getChild("boolean_combo"); if (!spinner1 || !spinner2 || !spinner3 || !spinner4 || !color_swatch) { @@ -247,45 +260,33 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp) spinner3->setVisible(FALSE); spinner4->setVisible(FALSE); color_swatch->setVisible(FALSE); - childSetVisible("val_text", 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 - childSetVisible("boolean_combo", 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); @@ -311,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: @@ -348,23 +349,17 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp) } break; case TYPE_BOOLEAN: - if (!childHasFocus("boolean_combo")) + bool_ctrl->setVisible(true); + if (!bool_ctrl->hasFocus()) { - if (sd.asBoolean()) - { - childSetValue("boolean_combo", LLSD("true")); - } - else - { - childSetValue("boolean_combo", LLSD("")); - } + bool_ctrl->setValue(sd.asInteger()); } break; case TYPE_STRING: - childSetVisible("val_text", TRUE); - if (!childHasFocus("val_text")) + getChildView("val_text")->setVisible( TRUE); + if (!getChild("val_text")->hasFocus()) { - childSetValue("val_text", sd); + getChild("val_text")->setValue(sd); } break; case TYPE_VEC3: @@ -530,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 e08e6b5d7..cce8fa481 100644 --- a/indra/newview/llfloatersettingsdebug.h +++ b/indra/newview/llfloatersettingsdebug.h @@ -35,9 +35,13 @@ #include "llcontrol.h" #include "llfloater.h" -#include "lltexteditor.h" -class LLFloaterSettingsDebug : public LLFloater +class LLScrollListCtrl; +class LLTextEditor; + +class LLFloaterSettingsDebug +: public LLFloater +, public LLSingleton { public: LLFloaterSettingsDebug(); @@ -46,17 +50,33 @@ public: virtual BOOL postBuild(); virtual void draw(); - void updateControl(LLControlVariable* control); + void updateControl(); - static void show(void*); - static void onSettingSelect(LLUICtrl* ctrl, void* user_data); - static void onCommitSettings(LLUICtrl* ctrl, void* user_data); - static void onClickDefault(void* user_data); + // 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: - static LLFloaterSettingsDebug* sInstance; + 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/llimview.cpp b/indra/newview/llimview.cpp index 92f5cd320..fb8a783ba 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1137,11 +1137,17 @@ LLFloaterIMPanel* LLIMMgr::createFloater( gFloaterView->addChild(floater); // reparent to floater view LLFloater* focused_floater = gFloaterView->getFocusedFloater(); // obtain the focused floater floater->open(); // make the new chat floater appear + static LLCachedControl minimize("OtherChatsTornOffAndMinimized"); if (focused_floater != NULL) // there was a focused floater { - floater->setMinimized(true); // so minimize this one, for now + floater->setMinimized(minimize); // so minimize this one, for now, if desired focused_floater->setFocus(true); // and work around focus being removed by focusing on the last } + else if (minimize) + { + floater->setFocus(false); // work around focus being granted to new floater + floater->setMinimized(true); + } } mFloaters.insert(floater->getHandle()); return floater; @@ -1179,11 +1185,12 @@ LLFloaterIMPanel* LLIMMgr::createFloater( static LLCachedControl minimize("OtherChatsTornOffAndMinimized"); if (focused_floater != NULL) // there was a focused floater { - floater->setMinimized(true); // so minimize this one, for now + floater->setMinimized(minimize); // so minimize this one, for now, if desired focused_floater->setFocus(true); // and work around focus being removed by focusing on the last } else if (minimize) { + floater->setFocus(false); // work around focus being granted to new floater floater->setMinimized(true); } } diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 904a809c9..ef3bb65f4 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -385,7 +385,7 @@ void LLPanelAvatarFirstLife::onClickImage(void* data) S32 left, top; gFloaterView->getNewFloaterPosition(&left, &top); LLRect rect = gSavedSettings.getRect("PreviewTextureRect"); - rect.translate( left - rect.mLeft, top - rect.mTop ); + rect.translate( left - rect.mLeft, rect.mTop - top ); // Changed to avoid textures being sunken below the window border. LLPreviewTexture* preview = new LLPreviewTexture("preview task texture", rect, std::string("Profile First Life Picture"), @@ -433,7 +433,7 @@ void LLPanelAvatarSecondLife::onClickImage(void* data) S32 left, top; gFloaterView->getNewFloaterPosition(&left, &top); LLRect rect = gSavedSettings.getRect("PreviewTextureRect"); - rect.translate( left - rect.mLeft, top - rect.mTop ); + rect.translate( left - rect.mLeft, rect.mTop - top ); // Changed to avoid textures being sunken below the window border. LLPreviewTexture* preview = new LLPreviewTexture("preview task texture", rect, std::string("Profile Picture: ") + name_text, diff --git a/indra/newview/llprefschat.cpp b/indra/newview/llprefschat.cpp index 7290c3fb9..95b442c4c 100644 --- a/indra/newview/llprefschat.cpp +++ b/indra/newview/llprefschat.cpp @@ -66,6 +66,7 @@ private: LLColor4 mHTMLLinkColor; BOOL mChatFullWidth; BOOL mCloseChatOnReturn; + bool mOnlyComm; BOOL mArrowKeysMoveAvatar; BOOL mShowTimestamps; BOOL mPlayTypingAnim; @@ -111,6 +112,7 @@ LLPrefsChatImpl::LLPrefsChatImpl() childSetValue("bubble_chat_opacity", gSavedSettings.getF32("ChatBubbleOpacity")); childSetValue("translate_language_combobox", gSavedSettings.getString("TranslateLanguage")); childSetValue("translate_chat", gSavedSettings.getBOOL("TranslateChat")); + mOnlyComm = gSavedSettings.getBOOL("CommunicateSpecificShortcut"); } void LLPrefsChatImpl::refreshValues() @@ -139,6 +141,7 @@ void LLPrefsChatImpl::refreshValues() mBubbleOpacity = gSavedSettings.getF32("ChatBubbleOpacity"); mTranslateLanguage = gSavedSettings.getString("TranslateLanguage"); mTranslateChat = gSavedSettings.getBOOL("TranslateChat"); + mOnlyComm = gSavedSettings.getBOOL("CommunicateSpecificShortcut"); } void LLPrefsChatImpl::cancel() @@ -166,6 +169,7 @@ void LLPrefsChatImpl::cancel() gSavedSettings.setF32("ChatBubbleOpacity", mBubbleOpacity); gSavedSettings.setString("TranslateLanguage", mTranslateLanguage); gSavedSettings.setBOOL("TranslateChat", mTranslateChat); + gSavedSettings.setBOOL("CommunicateSpecificShortcut", mOnlyComm); } void LLPrefsChatImpl::apply() diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 12fcfc77d..d13ec619a 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -217,6 +217,7 @@ protected: BOOL mNoCopyTextureSelected; F32 mContextConeOpacity; LLSaveFolderState mSavedFolderState; + BOOL mSelectedItemPinned; LLScrollListCtrl* mLocalScrollCtrl; // tag: vaa emerald local_asset_browser }; @@ -249,7 +250,8 @@ LLFloaterTexturePicker::LLFloaterTexturePicker( mSearchEdit(NULL), mImmediateFilterPermMask(immediate_filter_perm_mask), mNonImmediateFilterPermMask(non_immediate_filter_perm_mask), - mContextConeOpacity(0.f) + mContextConeOpacity(0.f), + mSelectedItemPinned(FALSE) { mCanApplyImmediately = can_apply_immediately; LLUICtrlFactory::getInstance()->buildFloater(this,"floater_texture_ctrl.xml"); @@ -506,8 +508,13 @@ BOOL LLFloaterTexturePicker::postBuild() mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); mInventoryPanel->setAllowMultiSelect(FALSE); - // store this filter as the default one - mInventoryPanel->getRootFolder()->getFilter()->markDefault(); + // Disable auto selecting first filtered item because it takes away + // selection from the item set by LLTextureCtrl owning this floater. + mInventoryPanel->getRootFolder()->setAutoSelectOverride(TRUE); + + // Commented out to scroll to currently selected texture. See EXT-5403. + // // store this filter as the default one + // mInventoryPanel->getRootFolder()->getFilter()->markDefault(); // Commented out to stop opening all folders with textures // mInventoryPanel->openDefaultFolderForType(LLAssetType::AT_TEXTURE); @@ -675,6 +682,31 @@ void LLFloaterTexturePicker::draw() // Draw X gl_draw_x(interior, LLColor4::black ); } + + if (mSelectedItemPinned) return; + + LLFolderView* folder_view = mInventoryPanel->getRootFolder(); + if (!folder_view) return; + + LLInventoryFilter* filter = folder_view->getFilter(); + if (!filter) return; + + bool is_filter_active = folder_view->getCompletedFilterGeneration() < filter->getCurrentGeneration() && + filter->isNotDefault(); + + // After inventory panel filter is applied we have to update + // constraint rect for the selected item because of folder view + // AutoSelectOverride set to TRUE. We force PinningSelectedItem + // flag to FALSE state and setting filter "dirty" to update + // scroll container to show selected item (see LLFolderView::doIdle()). + if (!is_filter_active && !mSelectedItemPinned) + { + folder_view->setPinningSelectedItem(mSelectedItemPinned); + folder_view->dirtyFilter(); + folder_view->arrangeFromRoot(); + + mSelectedItemPinned = TRUE; + } } } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index c8fa64f01..a58e8ecf2 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -880,7 +880,7 @@ void init_menus() menu = new LLMenuGL(CLIENT_MENU_NAME); menu->setCanTearOff(FALSE); - menu->addChild(new LLMenuItemCallGL("Debug Settings...", LLFloaterSettingsDebug::show, NULL, NULL)); + menu->addChild(new LLMenuItemCallGL("Debug Settings...", handle_singleton_toggle, NULL, NULL)); gLoginMenuBarView->addChild(menu); menu->updateParent(LLMenuGL::sMenuContainer); @@ -1223,7 +1223,7 @@ void init_client_menu(LLMenuGL* menu) &menu_check_control, (void*)"SaveMinidump")); - menu->addChild(new LLMenuItemCallGL("Debug Settings...", LLFloaterSettingsDebug::show, NULL, NULL)); + menu->addChild(new LLMenuItemCallGL("Debug Settings...", handle_singleton_toggle, NULL, NULL)); menu->addChild(new LLMenuItemCheckGL("View Admin Options", &handle_admin_override_toggle, NULL, &check_admin_override, NULL, 'V', MASK_CONTROL | MASK_ALT)); menu->addChild(new LLMenuItemCallGL("Request Admin Status", @@ -2062,7 +2062,8 @@ class LLViewCommunicate : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - if (LLFloaterChatterBox::getInstance()->getFloaterCount() == 0) + static LLCachedControl only_comm("CommunicateSpecificShortcut"); + if (!only_comm && LLFloaterChatterBox::getInstance()->getFloaterCount() == 0) { LLFloaterMyFriends::toggleInstance(); } diff --git a/indra/newview/skins/default/xui/en-us/floater_chat_history_barless.xml b/indra/newview/skins/default/xui/en-us/floater_chat_history_barless.xml new file mode 100644 index 000000000..fd6eb9091 --- /dev/null +++ b/indra/newview/skins/default/xui/en-us/floater_chat_history_barless.xml @@ -0,0 +1,42 @@ + + + Connecting to in-world Voice Chat... + Connected + Voice not available at your current location + Disconnected from in-world Voice Chat + icn_voice-localchat.tga + -- Instant message logging enabled -- + -- End of Log -- + '[OBJECTNAME]', an object owned by '[OWNERNAME]', located in [REGIONNAME] at [REGIONPOS], has been granted permission to: [PERMISSIONS]. + '[OBJECTNAME]', an object owned by '[OWNERNAME]', located in [REGIONNAME] at [REGIONPOS], has been denied permission to: [PERMISSIONS]. + Take in-world money ([CURRENCY]) from you + Act on your control inputs + Remap your control inputs + Animate your avatar + Attach to your avatar + Release ownership and become public + Link and delink from other objects + Add and remove joints with other objects + Change its permissions + Track your camera + Teleport you + Control your camera + + + + Gestures + + + +