diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml index 8daf8ea584d019557b6d8c1402cbc2b7f76e320f..b570947949e6c6e15075774db55139c2141cedc6 100644 --- a/indra/newview/app_settings/settings_alchemy.xml +++ b/indra/newview/app_settings/settings_alchemy.xml @@ -211,6 +211,17 @@ <key>Value</key> <string>/tp2cam</string> </map> + <key>AlchemyChatMarkUnnamedObjects</key> + <map> + <key>Comment</key> + <string>Marks unnamed objects in chat and IMs.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>AlchemyCinematicModeHideHoverText</key> <map> <key>Comment</key> @@ -508,6 +519,28 @@ <key>Value</key> <real>0.15</real> </map> + <key>AlchemyNearbyTypingIndicators</key> + <map> + <key>Comment</key> + <string>Show nearby chat typing indicator in nametags</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>AlchemyNotifyIncomingMessage</key> + <map> + <key>Comment</key> + <string>Notify of incoming messages by looking for typing indicator</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>AlchemyPointAtPrivate</key> <map> <key>Comment</key> diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp index cc2a0f7f32a7f6fa5b83b838e48bcecc0b9820c1..9dd8bfa89008a56687442beec17fa18adae1221b 100644 --- a/indra/newview/llimprocessing.cpp +++ b/indra/newview/llimprocessing.cpp @@ -481,7 +481,8 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, // make sure that we don't have an empty or all-whitespace name LLStringUtil::trim(name); - if (name.empty()) + static const LLCachedControl<bool> sMarkUnnamedObjects(gSavedSettings, "AlchemyChatMarkUnnamedObjects", true); + if (sMarkUnnamedObjects && name.empty()) { name = LLTrans::getString("Unnamed"); } @@ -668,9 +669,33 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, break; case IM_TYPING_START: - { + { + static LLCachedControl<bool> sNotifyIncomingMessage(gSavedSettings, "AlchemyNotifyIncomingMessage"); + if (sNotifyIncomingMessage && + !gIMMgr->hasSession(session_id) && + ((accept_im_from_only_friend && (is_friend || is_linden)) || + (!(is_muted || is_do_not_disturb))) + ) + { + LLStringUtil::format_map_t args; + args["[NAME]"] = name; + const std::string notify_str = LLTrans::getString("NotifyIncomingMessage", args); + gIMMgr->addMessage(session_id, + from_id, + LLStringUtil::null, + notify_str, + IM_ONLINE, + LLStringUtil::null, + IM_NOTHING_SPECIAL, + parent_estate_id, + region_id, + position, + false + ); + } + gIMMgr->processIMTypingStart(from_id, dialog); - } + } break; case IM_TYPING_STOP: diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 6b77091bbf2588fce70c45277e874a62e70033f4..7cd59e24e005642a3257ea1714350dcef9735976 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -639,6 +639,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mIsSitting(FALSE), mTimeVisible(), mTyping(FALSE), + mTypingLast(false), mMeshValid(FALSE), mVisible(FALSE), mLastImpostorUpdateFrameTime(0.f), @@ -3264,6 +3265,8 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) bool is_friend = (fRlvShowAvName) && isInBuddyList(); // [/RLVa:KB] bool is_cloud = getIsCloud(); + static LLCachedControl<bool> sShowTyping(gSavedSettings, "AlchemyNearbyTypingIndicators", true); + bool is_typing = sShowTyping && mTyping; if (is_appearance != mNameAppearance) { @@ -3287,13 +3290,14 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) || is_muted != mNameMute || is_appearance != mNameAppearance || is_friend != mNameFriend - || is_cloud != mNameCloud) + || is_cloud != mNameCloud + || is_typing != mTypingLast) { LLColor4 name_tag_color = getNameTagColor(is_friend); clearNameTag(); - if (is_away || is_muted || is_do_not_disturb || is_appearance) + if (is_away || is_muted || is_do_not_disturb || is_appearance || is_typing) { std::string line; if (is_away) @@ -3321,6 +3325,11 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) line += LLTrans::getString("LoadingData"); line += ", "; } + if (is_typing) + { + line += LLTrans::getString("AvatarTyping"); + line += ", "; + } // trim last ", " line.resize( line.length() - 2 ); addNameTagLine(line, name_tag_color, LLFontGL::NORMAL, @@ -3397,6 +3406,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) mNameAppearance = is_appearance; mNameFriend = is_friend; mNameCloud = is_cloud; + mTypingLast = is_typing; mTitle = title ? title->getString() : ""; LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR); new_name = TRUE; @@ -3456,7 +3466,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) } mNameText->setVisibleOffScreen(TRUE); - if (mTyping) + if (is_typing) { S32 dot_count = (llfloor(mTypingTimer.getElapsedTimeF32() * 3.f) + 2) % 3 + 1; switch(dot_count) diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 33a3c2180ca148a9caa6210edea23765c1d5e338..110138a004671cea39c92f24f5914f4d8c097b8b 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -1040,6 +1040,7 @@ class LLVOAvatar : LLFrameTimer mTimeVisible; std::deque<LLChat> mChats; BOOL mTyping; + bool mTypingLast; LLFrameTimer mTypingTimer; /** Name diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 2eb0b7e243255b9eda0985f1e68a5314751c6a35..2ad9368352439088a97be1aa1a87ce044fe44bfe 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -4360,6 +4360,8 @@ and report the problem. <string name="outfit_photo_load_codec_error">Invalid image format. Please use another image</string> <!-- Alchemy Strings --> + <string name="NotifyIncomingMessage">Incoming message from [NAME]...</string> + <string name="AvatarTyping">Typing</string> <string name="UnknownAvatar">Unknown Avatar</string> </strings>