diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index 5eaca5c32..f422ed4ae 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -29,7 +29,7 @@ if (WINDOWS) # Don't build DLLs. set(BUILD_SHARED_LIBS OFF) - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /arch:SSE2" + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /MP /arch:SSE2" CACHE STRING "C++ compiler debug options" FORCE) set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD /MP /arch:SSE2" diff --git a/indra/llcharacter/llbvhconsts.h b/indra/llcharacter/llbvhconsts.h index d5876aa07..b77732de1 100644 --- a/indra/llcharacter/llbvhconsts.h +++ b/indra/llcharacter/llbvhconsts.h @@ -33,7 +33,7 @@ #ifndef LL_LLBVHCONSTS_H #define LL_LLBVHCONSTS_H -const F32 MAX_ANIM_DURATION = 30.f; +const F32 MAX_ANIM_DURATION = 60.f; typedef enum e_constraint_type { diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp index 5c715d3ff..b193c22b2 100644 --- a/indra/llui/llradiogroup.cpp +++ b/indra/llui/llradiogroup.cpp @@ -316,7 +316,8 @@ void LLRadioGroup::setValue( const LLSD& value ) } else { - llwarns << "LLRadioGroup::setValue: value not found: " << value_name << llendl; + llwarns << "LLRadioGroup::setValue: radio_item with name=\"" << value_name << "\" not found, radio_group values are set by radio_item name not value. Falling back on LLUICtrl::setValue." << llendl; + LLUICtrl::setValue(value); } } } diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 0925bb785..38c9b67d7 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -3224,16 +3224,20 @@ LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac for (child = node->getFirstChild(); child.notNull(); child = child->getNextSibling()) { - if (child->hasName("row")) + if (child->hasName("row") || child->hasName("rows")) { LLUUID id; - child->getAttributeUUID("id", id); - LLSD row; - - row["id"] = id; + std::string value; + child->getAttributeString("value",value); + bool id_found = child->getAttributeUUID("id", id); + if(id_found) + row["id"] = id; + else + row["id"] = value; S32 column_idx = 0; + bool explicit_column = false; LLXMLNodePtr row_child; for (row_child = child->getFirstChild(); row_child.notNull(); row_child = row_child->getNextSibling()) { @@ -3255,15 +3259,24 @@ LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac row["columns"][column_idx]["font"] = font; row["columns"][column_idx]["font-style"] = font_style; column_idx++; + explicit_column = true; } } - scroll_list->addElement(row); + if(explicit_column) + scroll_list->addElement(row); + else + { + LLSD entry_id; + if(id_found) + entry_id = id; + scroll_list->addSimpleElement(value,ADD_BOTTOM,entry_id); + } } } std::string contents = node->getTextContents(); scroll_list->setCommentText(contents); - + return scroll_list; } diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index d3d5f1dbf..e23f9e182 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -760,6 +760,50 @@ Found in Advanced->Rendering->Info Displays Value 1 + ContactsUseHorizontalButtons + + Comment + Whether or not groups and friends lists use horizontal buttons at the bottom of the panel or vertical ones on the right, requires a restart. + Persist + 1 + Type + Boolean + Value + 0 + + UseConciseIMButtons + + Comment + Whether or not IMs use buttons concisely on the same line as the name of the receiver, changes apply to new IMs only. + Persist + 1 + Type + Boolean + Value + 0 + + UseConciseGroupChatButtons + + Comment + Whether or not group chats use buttons concisely on the same line as the group name, changes apply to new group chats only. + Persist + 1 + Type + Boolean + Value + 0 + + UseConciseConferenceButtons + + Comment + Whether or not conferences use buttons concisely on the same line as the name of the conference, changes apply to new conferences only. + Persist + 1 + Type + Boolean + Value + 0 + ShowLocalChatFloaterBar Comment @@ -6182,7 +6226,23 @@ This should be as low as possible, but too low may break functionality FloaterContactsRect Comment - Rectangle for chat history + Rectangle for contacts floater + Persist + 1 + Type + Rect + Value + + 0 + 390 + 395 + 0 + + + FloaterContactsHorizRect + + Comment + Rectangle for contacts floater in horizontal mode Persist 1 Type @@ -6515,6 +6575,17 @@ This should be as low as possible, but too low may break functionality Value 52 + RadarColumnNameWidth + + Comment + Width for radar's name column + Persist + 1 + Type + S32 + Value + 80 + RadarColumnMarkHidden Comment @@ -6694,7 +6765,18 @@ This should be as low as possible, but too low may break functionality RadarChatKeys Comment - Enable private chat alerts for avatars entering the region + Enable alerting scripts about avatars detected by the radar + Persist + 1 + Type + Boolean + Value + 0 + + RadarChatKeysStopAsking + + Comment + Do not ask if RadarChatKeys should be enabled when a script requests for the radar's keys. Persist 1 Type diff --git a/indra/newview/ascentprefschat.cpp b/indra/newview/ascentprefschat.cpp index eab67ed86..dd8531965 100644 --- a/indra/newview/ascentprefschat.cpp +++ b/indra/newview/ascentprefschat.cpp @@ -325,11 +325,9 @@ void LLPrefsAscentChat::onCommitKeywords(LLUICtrl* ctrl, void* user_data) void LLPrefsAscentChat::refreshValues() { //Chat/IM ----------------------------------------------------------------------------- - mWoLfVerticalIMTabs = gSavedSettings.getBOOL("WoLfVerticalIMTabs"); 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"); @@ -337,7 +335,6 @@ void LLPrefsAscentChat::refreshValues() mLinksForChattingObjects = gSavedSettings.getU32("LinksForChattingObjects"); mSecondsInChatAndIMs = gSavedSettings.getBOOL("SecondsInChatAndIMs"); mSecondsInLog = gSavedSettings.getBOOL("SecondsInLog"); - mOtherChatsTornOff = gSavedSettings.getBOOL("OtherChatsTornOff"); std::string format = gSavedSettings.getString("ShortTimeFormat"); if (format.find("%p") == -1) @@ -375,6 +372,16 @@ void LLPrefsAscentChat::refreshValues() mIMResponseItem = gSavedPerAccountSettings.getBOOL("AscentInstantMessageResponseItem"); mIMResponseText = gSavedPerAccountSettings.getString("AscentInstantMessageResponse"); + //Chat UI ----------------------------------------------------------------------------- + mWoLfVerticalIMTabs = gSavedSettings.getBOOL("WoLfVerticalIMTabs"); + mOtherChatsTornOff = gSavedSettings.getBOOL("OtherChatsTornOff"); + mShowLocalChatFloaterBar = gSavedSettings.getBOOL("ShowLocalChatFloaterBar"); + mHorizButt = gSavedSettings.getBOOL("ContactsUseHorizontalButtons"); + mOneLineIMButt = gSavedSettings.getBOOL("UseConciseIMButtons"); + mOneLineGroupButt = gSavedSettings.getBOOL("UseConciseGroupChatButtons"); + mOneLineConfButt = gSavedSettings.getBOOL("UseConciseConferenceButtons"); + mOnlyComm = gSavedSettings.getBOOL("CommunicateSpecificShortcut"); + //Spam -------------------------------------------------------------------------------- mEnableAS = gSavedSettings.getBOOL("AntiSpamEnabled"); mGlobalQueue = gSavedSettings.getBOOL("_NACL_AntiSpamGlobalQueue"); @@ -533,11 +540,9 @@ void LLPrefsAscentChat::refresh() void LLPrefsAscentChat::cancel() { //Chat/IM ----------------------------------------------------------------------------- - gSavedSettings.setBOOL("WoLfVerticalIMTabs", mWoLfVerticalIMTabs); 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); @@ -545,7 +550,6 @@ void LLPrefsAscentChat::cancel() gSavedSettings.setU32("LinksForChattingObjects", mLinksForChattingObjects); gSavedSettings.setBOOL("SecondsInChatAndIMs", mSecondsInChatAndIMs); gSavedSettings.setBOOL("SecondsInLog", mSecondsInLog); - gSavedSettings.setBOOL("OtherChatsTornOff", mOtherChatsTornOff); std::string short_date, long_date, short_time, long_time, timestamp; @@ -596,6 +600,16 @@ void LLPrefsAscentChat::cancel() gSavedPerAccountSettings.setBOOL("AscentInstantMessageResponseItem", mIMResponseItem); gSavedPerAccountSettings.setString("AscentInstantMessageResponse", mIMResponseText); + //Chat UI ----------------------------------------------------------------------------- + gSavedSettings.setBOOL("WoLfVerticalIMTabs", mWoLfVerticalIMTabs); + gSavedSettings.setBOOL("OtherChatsTornOff", mOtherChatsTornOff); + gSavedSettings.setBOOL("ShowLocalChatFloaterBar", mShowLocalChatFloaterBar); + gSavedSettings.setBOOL("ContactsUseHorizontalButtons", mHorizButt); + gSavedSettings.setBOOL("UseConciseIMButtons", mOneLineIMButt); + gSavedSettings.setBOOL("UseConciseGroupChatButtons", mOneLineGroupButt); + gSavedSettings.setBOOL("UseConciseConferenceButtons", mOneLineConfButt); + gSavedSettings.setBOOL("CommunicateSpecificShortcut", mOnlyComm); + //Spam -------------------------------------------------------------------------------- gSavedSettings.setBOOL("AntiSpamEnabled", mEnableAS); gSavedSettings.setBOOL("_NACL_AntiSpamGlobalQueue", mGlobalQueue); diff --git a/indra/newview/ascentprefschat.h b/indra/newview/ascentprefschat.h index 4bf8f7551..63cedf611 100644 --- a/indra/newview/ascentprefschat.h +++ b/indra/newview/ascentprefschat.h @@ -62,11 +62,9 @@ protected: static void onCommitKeywords(LLUICtrl* ctrl, void* user_data); //Chat/IM ----------------------------------------------------------------------------- - BOOL mWoLfVerticalIMTabs; BOOL mIMAnnounceIncoming; BOOL mHideTypingNotification; BOOL mShowGroupNameInChatIM; - bool mShowLocalChatFloaterBar; BOOL mPlayTypingSound; BOOL mHideNotificationsInChat; BOOL mEnableMUPose; @@ -78,7 +76,6 @@ protected: U32 tempDateFormat; BOOL mSecondsInChatAndIMs; BOOL mSecondsInLog; - BOOL mOtherChatsTornOff; BOOL mIMResponseAnyone; BOOL mIMResponseFriends; @@ -89,6 +86,16 @@ protected: BOOL mIMResponseItem; std::string mIMResponseText; + //Chat UI ----------------------------------------------------------------------------- + bool mWoLfVerticalIMTabs; + bool mOtherChatsTornOff; + bool mShowLocalChatFloaterBar; + bool mHorizButt; + bool mOneLineIMButt; + bool mOneLineGroupButt; + bool mOneLineConfButt; + bool mOnlyComm; + //Spam -------------------------------------------------------------------------------- BOOL mEnableAS; BOOL mGlobalQueue; diff --git a/indra/newview/chatbar_as_cmdline.cpp b/indra/newview/chatbar_as_cmdline.cpp index 7dcd34a59..6d19d693c 100644 --- a/indra/newview/chatbar_as_cmdline.cpp +++ b/indra/newview/chatbar_as_cmdline.cpp @@ -461,7 +461,7 @@ bool cmd_line_chat(std::string revised_text, EChatType type) return true; } -//case insensative search for avatar in draw distance +//case insensitive search for avatar in draw distance //TODO: make this use the avatar list floaters list so we have EVERYONE // even if they are out of draw distance. LLUUID cmdline_partial_name2key(std::string partial_name) @@ -471,7 +471,7 @@ LLUUID cmdline_partial_name2key(std::string partial_name) LLStringUtil::toLower(partial_name); LLWorld::getInstance()->getAvatars(&avatars); typedef std::vector::const_iterator av_iter; - bool has_avatarlist = (LLFloaterAvatarList::getInstance() ? true : false); + bool has_avatarlist = LLFloaterAvatarList::instanceExists(); if(has_avatarlist) LLFloaterAvatarList::getInstance()->updateAvatarList(); for(av_iter i = avatars.begin(); i != avatars.end(); ++i) @@ -511,7 +511,7 @@ void cmdline_tp2name(std::string target) cmdline_printchat("Avatar not found."); return; } - LLFloaterAvatarList* avlist = LLFloaterAvatarList::getInstance(); + LLFloaterAvatarList* avlist = LLFloaterAvatarList::instanceExists() ? LLFloaterAvatarList::getInstance() : NULL; LLVOAvatar* avatarp = gObjectList.findAvatar(avkey); if(avatarp) { diff --git a/indra/newview/llfloateravatarlist.cpp b/indra/newview/llfloateravatarlist.cpp index e12b95156..92a80a517 100644 --- a/indra/newview/llfloateravatarlist.cpp +++ b/indra/newview/llfloateravatarlist.cpp @@ -84,6 +84,8 @@ typedef enum e_radar_alert_type ALERT_TYPE_AGE = 16, } ERadarAlertType; +namespace +{ void chat_avatar_status(std::string name, LLUUID key, ERadarAlertType type, bool entering) { if(gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) return; //RLVa:LF Don't announce people are around when blind, that cheats the system. @@ -94,7 +96,6 @@ void chat_avatar_status(std::string name, LLUUID key, ERadarAlertType type, bool static LLCachedControl radar_alert_shout_range(gSavedSettings, "RadarAlertShoutRange"); static LLCachedControl radar_alert_chat_range(gSavedSettings, "RadarAlertChatRange"); static LLCachedControl radar_alert_age(gSavedSettings, "RadarAlertAge"); - static LLCachedControl radar_chat_keys(gSavedSettings, "RadarChatKeys"); LLFloaterAvatarList* self = LLFloaterAvatarList::getInstance(); LLStringUtil::format_map_t args; @@ -153,6 +154,21 @@ void chat_avatar_status(std::string name, LLUUID key, ERadarAlertType type, bool } } + void send_keys_message(const int transact_num, const int num_ids, const std::string ids) + { + gMessageSystem->newMessage("ScriptDialogReply"); + gMessageSystem->nextBlock("AgentData"); + gMessageSystem->addUUID("AgentID", gAgent.getID()); + gMessageSystem->addUUID("SessionID", gAgent.getSessionID()); + gMessageSystem->nextBlock("Data"); + gMessageSystem->addUUID("ObjectID", gAgent.getID()); + gMessageSystem->addS32("ChatChannel", -777777777); + gMessageSystem->addS32("ButtonIndex", 1); + gMessageSystem->addString("ButtonLabel", llformat("%d,%d", transact_num, num_ids) + ids); + gAgent.sendReliableMessage(); + } +} //namespace + LLAvatarListEntry::LLAvatarListEntry(const LLUUID& id, const std::string &name, const LLVector3d &position) : mID(id), mName(name), mPosition(position), mDrawPosition(), mMarked(false), mFocused(false), mUpdateTimer(), mFrame(gFrameCount), mInSimFrame(U32_MAX), mInDrawFrame(U32_MAX), @@ -427,7 +443,7 @@ BOOL LLFloaterAvatarList::postBuild() return TRUE; } -void col_helper(const bool hide, const std::string width_ctrl_name, LLScrollListColumn* col) +void col_helper(const bool hide, LLCachedControl &setting, LLScrollListColumn* col) { // Brief Explanation: // Check if we want the column hidden, and if it's still showing. If so, hide it, but save its width. @@ -437,44 +453,64 @@ void col_helper(const bool hide, const std::string width_ctrl_name, LLScrollList if (hide && width) { - gSavedSettings.setS32(width_ctrl_name, width); + setting = width; col->setWidth(0); } else if(!hide && !width) { - llinfos << "We got into the setter!!" << llendl; - col->setWidth(gSavedSettings.getS32(width_ctrl_name)); + col->setWidth(setting); } } +//Macro to reduce redundant lines. Preprocessor concatenation and stringizing avoids bloat that +//wrapping in a class would create. +#define BIND_COLUMN_TO_SETTINGS(col, name)\ + static const LLCachedControl hide_##name(gSavedSettings, "RadarColumn"#name"Hidden");\ + static LLCachedControl width_##name(gSavedSettings, "RadarColumn"#name"Width");\ + col_helper(hide_##name, width_##name, mAvatarList->getColumn(col)); + void LLFloaterAvatarList::assessColumns() { - static LLCachedControl hide_mark(gSavedSettings, "RadarColumnMarkHidden"); - col_helper(hide_mark, "RadarColumnMarkWidth", mAvatarList->getColumn(LIST_MARK)); + BIND_COLUMN_TO_SETTINGS(LIST_MARK,Mark); + BIND_COLUMN_TO_SETTINGS(LIST_POSITION,Position); + BIND_COLUMN_TO_SETTINGS(LIST_ALTITUDE,Altitude); + BIND_COLUMN_TO_SETTINGS(LIST_ACTIVITY,Activity); + BIND_COLUMN_TO_SETTINGS(LIST_AGE,Age); + BIND_COLUMN_TO_SETTINGS(LIST_TIME,Time); - static LLCachedControl hide_pos(gSavedSettings, "RadarColumnPositionHidden"); - col_helper(hide_pos, "RadarColumnPositionWidth", mAvatarList->getColumn(LIST_POSITION)); + static const LLCachedControl hide_client(gSavedSettings, "RadarColumnClientHidden"); + static LLCachedControl width_name(gSavedSettings, "RadarColumnNameWidth"); + bool client_hidden = hide_client || gHippoGridManager->getConnectedGrid()->isSecondLife(); + LLScrollListColumn* name_col = mAvatarList->getColumn(LIST_AVATAR_NAME); + LLScrollListColumn* client_col = mAvatarList->getColumn(LIST_CLIENT); - static LLCachedControl hide_alt(gSavedSettings, "RadarColumnAltitudeHidden"); - col_helper(hide_alt, "RadarColumnAltitudeWidth", mAvatarList->getColumn(LIST_ALTITUDE)); + if (client_hidden != !!name_col->mDynamicWidth) + { + //Don't save if its being hidden because of detected grid. Not that it really matters, as this setting(along with the other RadarColumn*Width settings) + //isn't handled in a way that allows it to carry across sessions, but I assume that may want to be fixed in the future.. + if(client_hidden && !gHippoGridManager->getConnectedGrid()->isSecondLife() && name_col->getWidth() > 0) + width_name = name_col->getWidth(); - static LLCachedControl hide_act(gSavedSettings, "RadarColumnActivityHidden"); - col_helper(hide_act, "RadarColumnActivityWidth", mAvatarList->getColumn(LIST_ACTIVITY)); + //MUST call setWidth(0) first to clear out mTotalStaticColumnWidth accumulation in parent before changing the mDynamicWidth value + client_col->setWidth(0); + name_col->setWidth(0); - static LLCachedControl hide_age(gSavedSettings, "RadarColumnAgeHidden"); - col_helper(hide_age, "RadarColumnAgeWidth", mAvatarList->getColumn(LIST_AGE)); + client_col->mDynamicWidth = !client_hidden; + name_col->mDynamicWidth = client_hidden; - static LLCachedControl hide_time(gSavedSettings, "RadarColumnTimeHidden"); - col_helper(hide_time, "RadarColumnTimeWidth", mAvatarList->getColumn(LIST_TIME)); - - static LLCachedControl hide_client(gSavedSettings, "RadarColumnClientHidden"); - if (gHippoGridManager->getConnectedGrid()->isSecondLife() || hide_client){ - mAvatarList->getColumn(LIST_AVATAR_NAME)->setWidth(0); + if(!client_hidden) + { + name_col->setWidth(width_name); + } + } + else if (!hide_client) + { mAvatarList->getColumn(LIST_CLIENT)->setWidth(0); - mAvatarList->getColumn(LIST_CLIENT)->mDynamicWidth = FALSE; - mAvatarList->getColumn(LIST_CLIENT)->mRelWidth = 0; - mAvatarList->getColumn(LIST_AVATAR_NAME)->mDynamicWidth = TRUE; - mAvatarList->getColumn(LIST_AVATAR_NAME)->mRelWidth = -1; + mAvatarList->getColumn(LIST_AVATAR_NAME)->setWidth(0); + mAvatarList->getColumn(LIST_AVATAR_NAME)->mDynamicWidth = FALSE; + mAvatarList->getColumn(LIST_AVATAR_NAME)->mRelWidth = 0; + mAvatarList->getColumn(LIST_CLIENT)->mDynamicWidth = TRUE; + mAvatarList->getColumn(LIST_CLIENT)->mRelWidth = -1; } mAvatarList->updateLayout(); @@ -558,7 +594,7 @@ void LLFloaterAvatarList::updateAvatarList() size_t i; size_t count = avatar_ids.size(); - bool announce = gSavedSettings.getBOOL("RadarChatKeys"); + static LLCachedControl announce(gSavedSettings, "RadarChatKeys"); std::queue announce_keys; for (i = 0; i < count; ++i) @@ -650,8 +686,9 @@ void LLFloaterAvatarList::updateAvatarList() } } //let us send the keys in a more timely fashion - if(announce && !announce_keys.empty()) + if (announce && !announce_keys.empty()) { + // NOTE: This fragment is repeated in sendKey std::ostringstream ids; int transact_num = (int)gFrameCount; int num_ids = 0; @@ -663,37 +700,17 @@ void LLFloaterAvatarList::updateAvatarList() ids << "," << id.asString(); ++num_ids; - if(ids.tellp() > 200) + if (ids.tellp() > 200) { - gMessageSystem->newMessage("ScriptDialogReply"); - gMessageSystem->nextBlock("AgentData"); - gMessageSystem->addUUID("AgentID", gAgent.getID()); - gMessageSystem->addUUID("SessionID", gAgent.getSessionID()); - gMessageSystem->nextBlock("Data"); - gMessageSystem->addUUID("ObjectID", gAgent.getID()); - gMessageSystem->addS32("ChatChannel", -777777777); - gMessageSystem->addS32("ButtonIndex", 1); - gMessageSystem->addString("ButtonLabel",llformat("%d,%d", transact_num, num_ids) + ids.str()); - gAgent.sendReliableMessage(); + send_keys_message(transact_num, num_ids, ids.str()); num_ids = 0; ids.seekp(0); ids.str(""); } } - if(num_ids > 0) - { - gMessageSystem->newMessage("ScriptDialogReply"); - gMessageSystem->nextBlock("AgentData"); - gMessageSystem->addUUID("AgentID", gAgent.getID()); - gMessageSystem->addUUID("SessionID", gAgent.getSessionID()); - gMessageSystem->nextBlock("Data"); - gMessageSystem->addUUID("ObjectID", gAgent.getID()); - gMessageSystem->addS32("ChatChannel", -777777777); - gMessageSystem->addS32("ButtonIndex", 1); - gMessageSystem->addString("ButtonLabel",llformat("%d,%d", transact_num, num_ids) + ids.str()); - gAgent.sendReliableMessage(); - } + if (num_ids > 0) + send_keys_message(transact_num, num_ids, ids.str()); } } @@ -1387,19 +1404,17 @@ void LLFloaterAvatarList::onClickGetKey() void LLFloaterAvatarList::sendKeys() { + // This would break for send_keys_btn callback, check this beforehand, if it matters. + //static LLCachedControl radar_chat_keys(gSavedSettings, "RadarChatKeys"); + //if (radar_chat_keys) return; + LLViewerRegion* regionp = gAgent.getRegion(); - if(!regionp)return;//ALWAYS VALIDATE DATA - std::ostringstream ids; + if (!regionp) return;//ALWAYS VALIDATE DATA + static int last_transact_num = 0; int transact_num = (int)gFrameCount; - int num_ids = 0; - if(!gSavedSettings.getBOOL("RadarChatKeys")) - { - return; - } - - if(transact_num > last_transact_num) + if (transact_num > last_transact_num) { last_transact_num = transact_num; } @@ -1410,7 +1425,9 @@ void LLFloaterAvatarList::sendKeys() return; } - if (!regionp) return; // caused crash if logged out/connection lost + std::ostringstream ids; + int num_ids = 0; + for (int i = 0; i < regionp->mMapAvatarIDs.count(); i++) { const LLUUID &id = regionp->mMapAvatarIDs.get(i); @@ -1419,67 +1436,54 @@ void LLFloaterAvatarList::sendKeys() ++num_ids; - if(ids.tellp() > 200) + if (ids.tellp() > 200) { - gMessageSystem->newMessage("ScriptDialogReply"); - gMessageSystem->nextBlock("AgentData"); - gMessageSystem->addUUID("AgentID", gAgent.getID()); - gMessageSystem->addUUID("SessionID", gAgent.getSessionID()); - gMessageSystem->nextBlock("Data"); - gMessageSystem->addUUID("ObjectID", gAgent.getID()); - gMessageSystem->addS32("ChatChannel", -777777777); - gMessageSystem->addS32("ButtonIndex", 1); - gMessageSystem->addString("ButtonLabel",llformat("%d,%d", transact_num, num_ids) + ids.str()); - gAgent.sendReliableMessage(); + send_keys_message(transact_num, num_ids, ids.str()); num_ids = 0; ids.seekp(0); ids.str(""); } } - if(num_ids > 0) - { - gMessageSystem->newMessage("ScriptDialogReply"); - gMessageSystem->nextBlock("AgentData"); - gMessageSystem->addUUID("AgentID", gAgent.getID()); - gMessageSystem->addUUID("SessionID", gAgent.getSessionID()); - gMessageSystem->nextBlock("Data"); - gMessageSystem->addUUID("ObjectID", gAgent.getID()); - gMessageSystem->addS32("ChatChannel", -777777777); - gMessageSystem->addS32("ButtonIndex", 1); - gMessageSystem->addString("ButtonLabel",llformat("%d,%d", transact_num, num_ids) + ids.str()); - gAgent.sendReliableMessage(); - } + if (num_ids > 0) + send_keys_message(transact_num, num_ids, ids.str()); } //static void LLFloaterAvatarList::sound_trigger_hook(LLMessageSystem* msg,void **) { + if (!LLFloaterAvatarList::instanceExists()) return; // Don't bother if we're closed. + LLUUID sound_id,owner_id; msg->getUUIDFast(_PREHASH_SoundData, _PREHASH_SoundID, sound_id); msg->getUUIDFast(_PREHASH_SoundData, _PREHASH_OwnerID, owner_id); - if(owner_id == gAgent.getID() && sound_id == LLUUID("76c78607-93f9-f55a-5238-e19b1a181389")) + if (owner_id == gAgent.getID() && sound_id == LLUUID("76c78607-93f9-f55a-5238-e19b1a181389")) { - //let's ask if they want to turn it on. - if(gSavedSettings.getBOOL("RadarChatKeys")) - { + static LLCachedControl on("RadarChatKeys"); + static LLCachedControl do_not_ask("RadarChatKeysStopAsking"); + if (on) LLFloaterAvatarList::getInstance()->sendKeys(); - }else - { - LLSD args; - args["MESSAGE"] = "An object owned by you has request the keys from your radar.\nWould you like to enable announcing keys to objects in the sim?"; - LLNotificationsUtil::add("GenericAlertYesCancel", args, LLSD(), onConfirmRadarChatKeys); - } + else if (!do_not_ask) // Let's ask if they want to turn it on, but not pester them. + LLNotificationsUtil::add("RadarChatKeysRequest", LLSD(), LLSD(), onConfirmRadarChatKeys); } } // static bool LLFloaterAvatarList::onConfirmRadarChatKeys(const LLSD& notification, const LLSD& response ) { S32 option = LLNotification::getSelectedOption(notification, response); - if(option == 0) // yes + if (option == 1) // no { - gSavedSettings.setBOOL("RadarChatKeys",TRUE); + return false; + } + else if (option == 0) // yes + { + gSavedSettings.setBOOL("RadarChatKeys", true); LLFloaterAvatarList::getInstance()->sendKeys(); } + else if (option == 2) // No, and stop asking!! + { + gSavedSettings.setBOOL("RadarChatKeysStopAsking", true); + } + return false; } diff --git a/indra/newview/llfloaterchatterbox.cpp b/indra/newview/llfloaterchatterbox.cpp index 9e41340fe..876e2c321 100644 --- a/indra/newview/llfloaterchatterbox.cpp +++ b/indra/newview/llfloaterchatterbox.cpp @@ -54,7 +54,8 @@ LLFloaterMyFriends::LLFloaterMyFriends(const LLSD& seed) mFactoryMap["groups_panel"] = LLCallbackMap(LLFloaterMyFriends::createGroupsPanel, NULL); // do not automatically open singleton floaters (as result of getInstance()) BOOL no_open = FALSE; - LLUICtrlFactory::getInstance()->buildFloater(this, "floater_my_friends.xml", &getFactoryMap(), no_open); + static LLCachedControl horiz("ContactsUseHorizontalButtons"); + LLUICtrlFactory::getInstance()->buildFloater(this, (horiz ? "floater_my_friends_horiz.xml" : "floater_my_friends.xml"), &getFactoryMap(), no_open); } LLFloaterMyFriends::~LLFloaterMyFriends() diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp index 45b2c5c45..5bd332024 100644 --- a/indra/newview/llfloatersettingsdebug.cpp +++ b/indra/newview/llfloatersettingsdebug.cpp @@ -352,7 +352,14 @@ void LLFloaterSettingsDebug::updateControl() bool_ctrl->setVisible(true); if (!bool_ctrl->hasFocus()) { - bool_ctrl->setValue(sd.asInteger()); + if (sd.asBoolean()) + { + bool_ctrl->setValue(LLSD("TRUE")); + } + else + { + bool_ctrl->setValue(LLSD("FALSE")); + } } break; case TYPE_STRING: diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index 2c6b4dea6..1a2860998 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -1186,40 +1186,43 @@ void LLFloaterIMPanel::init(const std::string& session_label) // [Ansariel: Display name support] mProfileButtonEnabled = FALSE; // [/Ansariel: Display name support] - + + static LLCachedControl concise_im("UseConciseIMButtons"); + static LLCachedControl concise_group("UseConciseGroupChatButtons"); + static LLCachedControl concise_conf("UseConciseConferenceButtons"); std::string xml_filename; switch(mDialog) { case IM_SESSION_GROUP_START: mFactoryMap["active_speakers_panel"] = LLCallbackMap(createSpeakersPanel, this); - xml_filename = "floater_instant_message_group.xml"; + xml_filename = concise_group ? "floater_instant_message_group_concisebuttons.xml" : "floater_instant_message_group.xml"; mVoiceChannel = new LLVoiceChannelGroup(mSessionUUID, mSessionLabel); break; case IM_SESSION_INVITE: mFactoryMap["active_speakers_panel"] = LLCallbackMap(createSpeakersPanel, this); if (gAgent.isInGroup(mSessionUUID)) { - xml_filename = "floater_instant_message_group.xml"; + xml_filename = concise_group ? "floater_instant_message_group_concisebuttons.xml" : "floater_instant_message_group.xml"; } else // must be invite to ad hoc IM { - xml_filename = "floater_instant_message_ad_hoc.xml"; + xml_filename = concise_conf ? "floater_instant_message_ad_hoc_concisebuttons.xml" : "floater_instant_message_ad_hoc.xml"; } mVoiceChannel = new LLVoiceChannelGroup(mSessionUUID, mSessionLabel); break; case IM_SESSION_P2P_INVITE: - xml_filename = "floater_instant_message.xml"; + xml_filename = concise_im ? "floater_instant_message_concisebuttons.xml" : "floater_instant_message.xml"; mVoiceChannel = new LLVoiceChannelP2P(mSessionUUID, mSessionLabel, mOtherParticipantUUID); break; case IM_SESSION_CONFERENCE_START: mFactoryMap["active_speakers_panel"] = LLCallbackMap(createSpeakersPanel, this); - xml_filename = "floater_instant_message_ad_hoc.xml"; + xml_filename = concise_conf ? "floater_instant_message_ad_hoc_concisebuttons.xml" : "floater_instant_message_ad_hoc.xml"; mVoiceChannel = new LLVoiceChannelGroup(mSessionUUID, mSessionLabel); break; // just received text from another user case IM_NOTHING_SPECIAL: - xml_filename = "floater_instant_message.xml"; + xml_filename = concise_im ? "floater_instant_message_concisebuttons.xml" : "floater_instant_message.xml"; mTextIMPossible = LLVoiceClient::getInstance()->isSessionTextIMPossible(mSessionUUID); mProfileButtonEnabled = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionUUID); @@ -1229,7 +1232,7 @@ void LLFloaterIMPanel::init(const std::string& session_label) break; default: llwarns << "Unknown session type" << llendl; - xml_filename = "floater_instant_message.xml"; + xml_filename = concise_im ? "floater_instant_message_concisebuttons.xml" : "floater_instant_message.xml"; break; } diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index b1f702bcd..4e5bc6987 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -130,6 +130,10 @@ LLVector3 LLPanelObject::mClipboardPos; LLVector3 LLPanelObject::mClipboardSize; LLVector3 LLPanelObject::mClipboardRot; LLVolumeParams LLPanelObject::mClipboardVolumeParams; +LLFlexibleObjectData* LLPanelObject::mClipboardFlexiParams = NULL; +LLLightParams* LLPanelObject::mClipboardLightParams = NULL; +LLSculptParams* LLPanelObject::mClipboardSculptParams = NULL; +LLLightImageParams* LLPanelObject::mClipboardLightImageParams = NULL; BOOL LLPanelObject::hasParamClipboard = FALSE; BOOL LLPanelObject::postBuild() @@ -2493,15 +2497,65 @@ void LLPanelObject::onCopyRot(void* user_data) void LLPanelObject::onCopyParams(void* user_data) { LLPanelObject* self = (LLPanelObject*) user_data; + if (!self) return; + self->getVolumeParams(mClipboardVolumeParams); hasParamClipboard = TRUE; + + LLViewerObject* objp = self->mObject; + + mClipboardFlexiParams = (LLFlexibleObjectData*)objp->getParameterEntry(LLNetworkData::PARAMS_FLEXIBLE); + mClipboardLightParams = (LLLightParams*)objp->getParameterEntry(LLNetworkData::PARAMS_LIGHT); + mClipboardSculptParams = (LLSculptParams*)objp->getParameterEntry(LLNetworkData::PARAMS_SCULPT); + if (mClipboardSculptParams) + { + LLUUID id = mClipboardSculptParams->getSculptTexture(); + + // Texture perms check + if (!(id.isNull() || gInventory.isObjectDescendentOf(id, gInventory.getLibraryRootFolderID()) + || id == LLUUID(gSavedSettings.getString("UIImgWhiteUUID")) + || id == LLUUID(gSavedSettings.getString("UIImgInvisibleUUID")) + || id == LLUUID(std::string("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903"))) // alpha + && findItemID(id).isNull()) + { + mClipboardSculptParams->setSculptTexture(LLUUID(SCULPT_DEFAULT_TEXTURE)); + } + } + mClipboardLightImageParams = (LLLightImageParams*)objp->getParameterEntry(LLNetworkData::PARAMS_LIGHT_IMAGE); + if (mClipboardLightImageParams) + { + LLUUID id = mClipboardLightImageParams->getLightTexture(); + + // Texture perms check + if (!(id.isNull() || gInventory.isObjectDescendentOf(id, gInventory.getLibraryRootFolderID()) + || id == LLUUID(gSavedSettings.getString("UIImgWhiteUUID")) + || id == LLUUID(gSavedSettings.getString("UIImgInvisibleUUID")) + || id == LLUUID("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903"))) // alpha + { + mClipboardLightImageParams->setLightTexture(findItemID(id)); + } + } } void LLPanelObject::onPasteParams(void* user_data) { + if(!hasParamClipboard) return; + LLPanelObject* self = (LLPanelObject*) user_data; - if(hasParamClipboard) - self->mObject->updateVolume(mClipboardVolumeParams); + if(!self) return; + + LLViewerObject* objp = self->mObject; + + objp->updateVolume(mClipboardVolumeParams); + + if (mClipboardFlexiParams) + objp->setParameterEntry(LLNetworkData::PARAMS_FLEXIBLE, *mClipboardFlexiParams, true); + if (mClipboardLightParams) + objp->setParameterEntry(LLNetworkData::PARAMS_LIGHT, *mClipboardLightParams, true); + if (mClipboardSculptParams) + objp->setParameterEntry(LLNetworkData::PARAMS_SCULPT, *mClipboardSculptParams, true); + if (mClipboardLightImageParams) + objp->setParameterEntry(LLNetworkData::PARAMS_LIGHT_IMAGE, *mClipboardLightImageParams, true); } void LLPanelObject::onLinkObj(void* user_data) diff --git a/indra/newview/llpanelobject.h b/indra/newview/llpanelobject.h index ae2397294..e34d318c6 100644 --- a/indra/newview/llpanelobject.h +++ b/indra/newview/llpanelobject.h @@ -50,6 +50,10 @@ class LLColorSwatchCtrl; class LLTextureCtrl; class LLInventoryItem; class LLUUID; +class LLFlexibleObjectData; +class LLLightParams; +class LLLightImageParams; +class LLSculptParams; class LLPanelObject : public LLPanel { @@ -119,6 +123,10 @@ protected: static LLVector3 mClipboardSize; static LLVector3 mClipboardRot; static LLVolumeParams mClipboardVolumeParams; + static LLFlexibleObjectData* mClipboardFlexiParams; + static LLLightParams* mClipboardLightParams; + static LLSculptParams* mClipboardSculptParams; + static LLLightImageParams* mClipboardLightImageParams; static BOOL hasParamClipboard; S32 mComboMaterialItemCount; diff --git a/indra/newview/llprefschat.cpp b/indra/newview/llprefschat.cpp index 95b442c4c..7290c3fb9 100644 --- a/indra/newview/llprefschat.cpp +++ b/indra/newview/llprefschat.cpp @@ -66,7 +66,6 @@ private: LLColor4 mHTMLLinkColor; BOOL mChatFullWidth; BOOL mCloseChatOnReturn; - bool mOnlyComm; BOOL mArrowKeysMoveAvatar; BOOL mShowTimestamps; BOOL mPlayTypingAnim; @@ -112,7 +111,6 @@ 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() @@ -141,7 +139,6 @@ void LLPrefsChatImpl::refreshValues() mBubbleOpacity = gSavedSettings.getF32("ChatBubbleOpacity"); mTranslateLanguage = gSavedSettings.getString("TranslateLanguage"); mTranslateChat = gSavedSettings.getBOOL("TranslateChat"); - mOnlyComm = gSavedSettings.getBOOL("CommunicateSpecificShortcut"); } void LLPrefsChatImpl::cancel() @@ -169,7 +166,6 @@ 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/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 4a4b3863b..ec425421b 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -4655,8 +4655,8 @@ void LLSelectMgr::packObjectName(LLSelectNode* node, void* user_data) void LLSelectMgr::packObjectDescription(LLSelectNode* node, void* user_data) { const std::string* desc = (const std::string*)user_data; - if(!desc->empty()) - { + if(desc) + { // Empty (non-null, but zero length) descriptions are OK gMessageSystem->nextBlockFast(_PREHASH_ObjectData); gMessageSystem->addU32Fast(_PREHASH_LocalID, node->getObject()->getLocalID()); gMessageSystem->addStringFast(_PREHASH_Description, *desc); diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h index c1814874d..ac6ac0227 100644 --- a/indra/newview/lltexturecache.h +++ b/indra/newview/lltexturecache.h @@ -24,7 +24,7 @@ * $/LicenseInfo$ */ -#ifndef LL_LLTEXTURECACHE_ +#ifndef LL_LLTEXTURECACHE_H #define LL_LLTEXTURECACHE_H #include "lldir.h" diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp index efeb6bc2f..716edd7dd 100644 --- a/indra/newview/lltoolmgr.cpp +++ b/indra/newview/lltoolmgr.cpp @@ -272,7 +272,8 @@ void LLToolMgr::updateToolStatus() bool LLToolMgr::inEdit() { - return mBaseTool != LLToolPie::getInstance() && mBaseTool != gToolNull; + static const LLCachedControl freeze_time("FreezeTime",false); + return mBaseTool != LLToolPie::getInstance() && mBaseTool != gToolNull && (mCurrentToolset != gCameraToolset || !freeze_time); } bool LLToolMgr::canEdit() diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index e48565496..80cc2fb2a 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2011,7 +2011,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) // BOOL is_busy = gAgent.getBusy(); - BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat); + BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat) + // object IMs contain sender object id in session_id (STORM-1209) + || dialog == IM_FROM_TASK && LLMuteList::getInstance()->isMuted(session_id); BOOL is_linden = LLMuteList::getInstance()->isLinden(name); BOOL is_owned_by_me = FALSE; @@ -2509,7 +2511,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) info->mFolderID = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(info->mType)); std::string from_name; - from_name += "A group member named "; + from_name += LLTrans::getString("AGroupMemberNamed") + " "; from_name += name; info->mFromName = from_name; diff --git a/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc_concisebuttons.xml b/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc_concisebuttons.xml new file mode 100644 index 000000000..bd0208d92 --- /dev/null +++ b/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc_concisebuttons.xml @@ -0,0 +1,27 @@ + + + Joining Voice Chat... + Connected, click End Call to hang up + Left Voice Chat + icn_voice-groupfocus.tga + Instant Message with [NAME] + [NAME] is typing... + Starting session with [NAME], please wait. + Click here to instant message. +