diff options
| author | Loren Shih <seraph@lindenlab.com> | 2010-11-04 10:32:58 -0400 | 
|---|---|---|
| committer | Loren Shih <seraph@lindenlab.com> | 2010-11-04 10:32:58 -0400 | 
| commit | c24586756954107218b6a85b480732c46444a02a (patch) | |
| tree | ba410d561dd5cbe53574c313380c676b16e0db0c /indra | |
| parent | 89f191cd68c54f1d6f46d7d8d4011df180c9de8d (diff) | |
| parent | 6a9e70053beaa0fb936482f5594137a8bcdf2f1e (diff) | |
Automated merge up from viewer-development
Diffstat (limited to 'indra')
42 files changed, 518 insertions, 158 deletions
| diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp index 522b99bc02..a8f53a38c3 100644 --- a/indra/llmessage/llcachename.cpp +++ b/indra/llmessage/llcachename.cpp @@ -556,25 +556,38 @@ std::string LLCacheName::buildUsername(const std::string& full_name)  //static   std::string LLCacheName::buildLegacyName(const std::string& complete_name)  { -	boost::regex complete_name_regex("(.+)( \\()([A-Za-z]+)(.[A-Za-z]+)*(\\))"); -	boost::match_results<std::string::const_iterator> name_results; -	if (!boost::regex_match(complete_name, name_results, complete_name_regex)) return complete_name; +	// regexp doesn't play nice with unicode, chop off the display name +	S32 open_paren = complete_name.rfind(" ("); -	std::string legacy_name = name_results[3]; +	if (open_paren == std::string::npos) +	{ +		return complete_name; +	} + +	std::string username = complete_name.substr(open_paren); +	boost::regex complete_name_regex("( \\()([a-z0-9]+)(.[a-z]+)*(\\))");
 +	boost::match_results<std::string::const_iterator> name_results;
 +	if (!boost::regex_match(username, name_results, complete_name_regex)) return complete_name;
 +
 +	std::string legacy_name = name_results[2];  	// capitalize the first letter  	std::string cap_letter = legacy_name.substr(0, 1);  	LLStringUtil::toUpper(cap_letter); -	legacy_name = cap_letter + legacy_name.substr(1); - -	if (name_results[4].matched) -	{ -		std::string last_name = name_results[4]; +	legacy_name = cap_letter + legacy_name.substr(1);
 +
 +	if (name_results[3].matched)
 +	{
 +		std::string last_name = name_results[3];  		std::string cap_letter = last_name.substr(1, 1);  		LLStringUtil::toUpper(cap_letter); -		last_name = cap_letter + last_name.substr(2); -		legacy_name = legacy_name + " " + last_name; -	} - +		last_name = cap_letter + last_name.substr(2);
 +		legacy_name = legacy_name + " " + last_name;
 +	}
 +	else
 +	{
 +		legacy_name = legacy_name + " Resident";
 +	}
 +
  	return legacy_name;  } diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 758df418e8..5721df6b36 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -2214,19 +2214,39 @@ bool LLTextBase::scrolledToEnd()  	return mScroller->isAtBottom();  } -  bool LLTextBase::setCursor(S32 row, S32 column)  { -	if (0 <= row && row < (S32)mLineInfoList.size()) +	if (row < 0 || column < 0) return false; + +	S32 n_lines = mLineInfoList.size(); +	for (S32 line = row; line < n_lines; ++line)  	{ -		S32 doc_pos = mLineInfoList[row].mDocIndexStart; -		column = llclamp(column, 0, mLineInfoList[row].mDocIndexEnd - mLineInfoList[row].mDocIndexStart - 1); -		doc_pos += column; -		updateCursorXPos(); +		const line_info& li = mLineInfoList[line]; + +		if (li.mLineNum < row) +		{ +			continue; +		} +		else if (li.mLineNum > row) +		{ +			break; // invalid column specified +		} + +		// Found the given row. +		S32 line_length = li.mDocIndexEnd - li.mDocIndexStart;; +		if (column >= line_length) +		{ +			column -= line_length; +			continue; +		} +		// Found the given column. +		updateCursorXPos(); +		S32 doc_pos = li.mDocIndexStart + column;  		return setCursorPos(doc_pos);  	} -	return false; + +	return false; // invalid row or column specified  } diff --git a/indra/llui/lluistring.h b/indra/llui/lluistring.h index eff2467bf0..4faa0e070e 100644 --- a/indra/llui/lluistring.h +++ b/indra/llui/lluistring.h @@ -58,10 +58,12 @@ class LLUIString  public:  	// These methods all perform appropriate argument substitution  	// and modify mOrig where appropriate -        LLUIString() : mArgs(NULL), mNeedsResult(false), mNeedsWResult(false) {} +	LLUIString() : mArgs(NULL), mNeedsResult(false), mNeedsWResult(false) {}  	LLUIString(const std::string& instring, const LLStringUtil::format_map_t& args);  	LLUIString(const std::string& instring) : mArgs(NULL) { assign(instring); } +	~LLUIString() { delete mArgs; } +  	void assign(const std::string& instring);  	LLUIString& operator=(const std::string& s) { assign(s); return *this; } @@ -81,14 +83,14 @@ public:  	void clear();  	void clearArgs() { if (mArgs) mArgs->clear(); } -	 +  	// These utility functions are included for text editing.  	// They do not affect mOrig and do not perform argument substitution  	void truncate(S32 maxchars);  	void erase(S32 charidx, S32 len);  	void insert(S32 charidx, const LLWString& wchars);  	void replace(S32 charidx, llwchar wc); -	 +  private:  	// something changed, requiring reformatting of strings  	void dirty(); @@ -100,7 +102,7 @@ private:  	void updateResult() const;  	void updateWResult() const;  	LLStringUtil::format_map_t& getArgs(); -	 +  	std::string mOrig;  	mutable std::string mResult;  	mutable LLWString mWResult; // for displaying diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index f49dfec82b..84678ef4db 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -989,7 +989,8 @@ std::string LLUrlEntryNoLink::getLabel(const std::string &url, const LLUrlLabelC  LLStyle::Params LLUrlEntryNoLink::getStyle() const   {  -	return LLStyle::Params();  +	// Don't render as URL (i.e. no context menu or hand cursor). +	return LLStyle::Params().is_link(false);  } diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 33c6c939d4..3f23fee865 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2578,6 +2578,28 @@        <key>Value</key>        <integer>1</integer>      </map> +    <key>EnableGroupChatPopups</key> +    <map> +      <key>Comment</key> +      <string>Enable Incoming Group Chat Popups</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map> +    <key>EnableIMChatPopups</key> +    <map> +      <key>Comment</key> +      <string>Enable Incoming IM Chat Popups</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>DisplayAvatarAgentTarget</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index ed5e8ceee3..62074ddcd5 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -2204,12 +2204,11 @@ void LLAppearanceMgr::updateIsDirty()  		base_outfit = catp->getUUID();  	} -	if(base_outfit.isNull()) -	{ -		// no outfit link found, display "unsaved outfit" -		mOutfitIsDirty = true; -	} -	else +	// Set dirty to "false" if no base outfit found to disable "Save" +	// and leave only "Save As" enabled in My Outfits. +	mOutfitIsDirty = false; + +	if (base_outfit.notNull())  	{  		LLIsOfAssetType collector = LLIsOfAssetType(LLAssetType::AT_LINK); @@ -2248,8 +2247,6 @@ void LLAppearanceMgr::updateIsDirty()  				return;  			}  		} - -		mOutfitIsDirty = false;  	}  } @@ -2635,6 +2632,7 @@ void LLAppearanceMgr::dumpItemArray(const LLInventoryModel::item_array_t& items,  LLAppearanceMgr::LLAppearanceMgr():  	mAttachmentInvLinkEnabled(false),  	mOutfitIsDirty(false), +	mOutfitLocked(false),  	mIsInUpdateAppearanceFromCOF(false)  {  	LLOutfitObserver& outfit_observer = LLOutfitObserver::instance(); diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index a56dc129d4..30eecfe323 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -41,7 +41,7 @@  bool LLAvatarListItem::sStaticInitialized = false;  S32 LLAvatarListItem::sLeftPadding = 0; -S32 LLAvatarListItem::sRightNamePadding = 0; +S32 LLAvatarListItem::sNameRightPadding = 0;  S32 LLAvatarListItem::sChildrenWidths[LLAvatarListItem::ALIC_COUNT];  static LLWidgetNameRegistry::StaticRegistrar sRegisterAvatarListItemParams(&typeid(LLAvatarListItem::Params), "avatar_list_item"); @@ -52,7 +52,8 @@ LLAvatarListItem::Params::Params()  	voice_call_joined_style("voice_call_joined_style"),  	voice_call_left_style("voice_call_left_style"),  	online_style("online_style"), -	offline_style("offline_style") +	offline_style("offline_style"), +	name_right_pad("name_right_pad", 0)  {}; @@ -119,6 +120,9 @@ BOOL  LLAvatarListItem::postBuild()  		// so that we can hide and show them again later.  		initChildrenWidths(this); +		// Right padding between avatar name text box and nearest visible child. +		sNameRightPadding = LLUICtrlFactory::getDefaultParams<LLAvatarListItem>().name_right_pad; +  		sStaticInitialized = true;  	} @@ -486,7 +490,6 @@ void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item)  	S32 icon_width = avatar_item->mAvatarName->getRect().mLeft - avatar_item->mAvatarIcon->getRect().mLeft;  	sLeftPadding = avatar_item->mAvatarIcon->getRect().mLeft; -	sRightNamePadding = avatar_item->mLastInteractionTime->getRect().mLeft - avatar_item->mAvatarName->getRect().mRight;  	S32 index = ALIC_COUNT;  	sChildrenWidths[--index] = icon_width; @@ -565,7 +568,7 @@ void LLAvatarListItem::updateChildren()  	// apply paddings  	name_new_width -= sLeftPadding; -	name_new_width -= sRightNamePadding; +	name_new_width -= sNameRightPadding;  	name_view_rect.setLeftTopAndSize(  		name_new_left, diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index a069838ac3..c95ac39696 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -51,6 +51,8 @@ public:  									online_style,  									offline_style; +		Optional<S32>				name_right_pad; +  		Params();  	}; @@ -215,7 +217,7 @@ private:  	static bool	sStaticInitialized; // this variable is introduced to improve code readability  	static S32  sLeftPadding; // padding to first left visible child (icon or name) -	static S32  sRightNamePadding; // right padding from name to next visible child +	static S32  sNameRightPadding; // right padding from name to next visible child  	/**  	 * Contains widths of each child specified by EAvatarListItemChildIndex diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index cb5cf4a61d..3dc6e786d3 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -790,8 +790,9 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL  				// (don't let object names with hyperlinks override our objectim Url)  				LLStyle::Params link_params(style_params);  				link_params.color.control = "HTMLLinkColor"; +				link_params.is_link = true;  				link_params.link_href = url; -				mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>"  + delimiter, +				mEditor->appendText(chat.mFromName + delimiter,  									false, link_params);  			}  			else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log) @@ -804,7 +805,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL  			}  			else  			{ -				mEditor->appendText(chat.mFromName + delimiter, false, style_params); +				mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>" + delimiter, false, style_params);  			}  		}  	} diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp index a1d291fea6..351b9ac5da 100644 --- a/indra/newview/llfloatermap.cpp +++ b/indra/newview/llfloatermap.cpp @@ -43,6 +43,8 @@  #include "lldraghandle.h"  #include "lltextbox.h"  #include "llviewermenu.h" +#include "llfloaterworldmap.h" +#include "llagent.h"  //  // Constants @@ -122,11 +124,36 @@ BOOL LLFloaterMap::postBuild()  	return TRUE;  } -BOOL LLFloaterMap::handleDoubleClick( S32 x, S32 y, MASK mask ) +BOOL LLFloaterMap::handleDoubleClick(S32 x, S32 y, MASK mask)  {  	// If floater is minimized, minimap should be shown on doubleclick (STORM-299) -	std::string floater_to_show = this->isMinimized() ? "mini_map" : "world_map"; -	LLFloaterReg::showInstance(floater_to_show); +	if (isMinimized()) +	{ +		setMinimized(FALSE); +		return TRUE; +	} + +	LLVector3d pos_global = mMap->viewPosToGlobal(x, y); +	 +	// If we're not tracking a beacon already, double-click will set one  +	if (!LLTracker::isTracking(NULL)) +	{ +		LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance(); +		if (world_map) +		{ +			world_map->trackLocation(pos_global); +		} +	} +	 +	if (gSavedSettings.getBOOL("DoubleClickTeleport")) +	{ +		// If DoubleClickTeleport is on, double clicking the minimap will teleport there +		gAgent.teleportViaLocationLookAt(pos_global); +	} +	else  +	{ +		LLFloaterReg::showInstance("world_map"); +	}  	return TRUE;  } diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp index 7f6df627e0..3f0deb98cd 100644 --- a/indra/newview/llhints.cpp +++ b/indra/newview/llhints.cpp @@ -109,7 +109,14 @@ public:  	/*virtual*/ BOOL postBuild(); -	void onClickClose() { hide(); LLNotifications::instance().cancel(mNotification); } +	void onClickClose()  +	{  +		if (!mHidden)  +		{ +			hide();  +			LLNotifications::instance().cancel(mNotification); +		} +	}  	void draw();  	void hide() { if(!mHidden) {mHidden = true; mFadeTimer.reset();} } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 914e7a3df0..857c27be63 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -131,6 +131,20 @@ void toast_callback(const LLSD& msg){  		return;  	} +	// *NOTE Skip toasting if the user disable it in preferences/debug settings ~Alexandrea +	LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession( +				msg["session_id"]); +	if (!gSavedSettings.getBOOL("EnableGroupChatPopups") +			&& session->isGroupSessionType()) +	{ +		return; +	} +	if (!gSavedSettings.getBOOL("EnableIMChatPopups") +			&& !session->isGroupSessionType()) +	{ +		return; +	} +  	// Skip toasting if we have open window of IM with this session id  	LLIMFloater* open_im_floater = LLIMFloater::findInstance(msg["session_id"]);  	if (open_im_floater && open_im_floater->getVisible()) @@ -257,21 +271,17 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&  	// history files have consistent (English) names in different locales.  	if (isAdHocSessionType() && IM_SESSION_INVITE == type)  	{ -		// Name here has a form of "<Avatar's name> Conference" -		// Lets update it to localize the "Conference" word. See EXT-8429. -		S32 separator_index = mName.rfind(" "); -		std::string name = mName.substr(0, separator_index); -		++separator_index; -		std::string conference_word = mName.substr(separator_index, mName.length()); +		LLAvatarNameCache::get(mOtherParticipantID,  +							   boost::bind(&LLIMModel::LLIMSession::onAdHocNameCache,  +							   this, _2)); +	} +} -		// additional check that session name is what we expected -		if ("Conference" == conference_word) -		{ +void LLIMModel::LLIMSession::onAdHocNameCache(const LLAvatarName& av_name) +{  			LLStringUtil::format_map_t args; -			args["[AGENT_NAME]"] = name; +	args["[AGENT_NAME]"] = av_name.getCompleteName();  			LLTrans::findString(mName, "conference-title-incoming", args); -		} -	}  }  void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction) diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 3da4465862..650d329e18 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -100,6 +100,8 @@ public:  		void onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name); +		void onAdHocNameCache(const LLAvatarName& av_name);
 +  		//*TODO make private  		static std::string generateHash(const std::set<LLUUID>& sorted_uuids); diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index e672892282..5ba87423c7 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1643,17 +1643,18 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  	const BOOL is_agent_inventory = (model->getCategory(inv_cat->getUUID()) != NULL)  		&& (LLToolDragAndDrop::SOURCE_AGENT == source); +	const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false); +	const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); +  	BOOL accept = FALSE;  	if (is_agent_inventory)  	{  		const LLUUID &cat_id = inv_cat->getUUID();  		const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH, false); -		const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);  		const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false);  		const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);  		const BOOL move_is_into_outfit = getCategory() && (getCategory()->getPreferredType() == LLFolderType::FT_OUTFIT); -		const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);  		const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id);  		//-------------------------------------------------------------------------------- @@ -1794,6 +1795,17 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  		LLUUID category_id = mUUID;  		accept = move_inv_category_world_to_agent(object_id, category_id, drop);  	} +	else if (LLToolDragAndDrop::SOURCE_LIBRARY == source) +	{ +		// Accept folders that contain complete outfits. +		accept = move_is_into_current_outfit && LLAppearanceMgr::instance().getCanMakeFolderIntoOutfit(inv_cat->getUUID()); + +		if (accept && drop) +		{ +			LLAppearanceMgr::instance().wearInventoryCategory(inv_cat, true, false); +		} +	} +  	return accept;  } @@ -2896,6 +2908,7 @@ static BOOL can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_curr  {  	if ((inv_item->getInventoryType() != LLInventoryType::IT_WEARABLE) &&  		(inv_item->getInventoryType() != LLInventoryType::IT_GESTURE) && +		(inv_item->getInventoryType() != LLInventoryType::IT_ATTACHMENT) &&  		(inv_item->getInventoryType() != LLInventoryType::IT_OBJECT))  	{  		return FALSE; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 50adae09c0..0870b5b8dd 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -290,7 +290,10 @@ void LLInventoryPanel::modelChanged(U32 mask)  		const LLUUID& item_id = (*items_iter);  		const LLInventoryObject* model_item = model->getObject(item_id);  		LLFolderViewItem* view_item = mFolderRoot->getItemByID(item_id); -		LLFolderViewFolder* view_folder = mFolderRoot->getFolderByID(item_id); + +		// LLFolderViewFolder is derived from LLFolderViewItem so dynamic_cast from item +		// to folder is the fast way to get a folder without searching through folders tree. +		LLFolderViewFolder* view_folder = dynamic_cast<LLFolderViewFolder*>(view_item);  		//////////////////////////////  		// LABEL Operation diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index 47d32e57fb..d2ad78f140 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -64,6 +64,18 @@ public:  	LLNearbyChatScreenChannel(const LLUUID& id):LLScreenChannelBase(id)   	{  		mStopProcessing = false; + +		LLControlVariable* ctrl = gSavedSettings.getControl("NearbyToastLifeTime").get(); +		if (ctrl) +		{ +			ctrl->getSignal()->connect(boost::bind(&LLNearbyChatScreenChannel::updateToastsLifetime, this)); +		} + +		ctrl = gSavedSettings.getControl("NearbyToastFadingTime").get(); +		if (ctrl) +		{ +			ctrl->getSignal()->connect(boost::bind(&LLNearbyChatScreenChannel::updateToastFadingTime, this)); +		}  	}  	void addNotification	(LLSD& notification); @@ -109,13 +121,26 @@ protected:  		if (!toast) return;  		LL_DEBUGS("NearbyChat") << "Pooling toast" << llendl;  		toast->setVisible(FALSE); -		toast->stopTimer(); +		toast->stopFading();  		toast->setIsHidden(true); + +		// Nearby chat toasts that are hidden, not destroyed. They are collected to the toast pool, so that +		// they can be used next time, this is done for performance. But if the toast lifetime was changed +		// (from preferences floater (STORY-36)) while it was shown (at this moment toast isn't in the pool yet) +		// changes don't take affect. +		// So toast's lifetime should be updated each time it's added to the pool. Otherwise viewer would have +		// to be restarted so that changes take effect. +		toast->setLifetime(gSavedSettings.getS32("NearbyToastLifeTime")); +		toast->setFadingTime(gSavedSettings.getS32("NearbyToastFadingTime"));  		m_toast_pool.push_back(toast->getHandle());  	}  	void	createOverflowToast(S32 bottom, F32 timer); +	void 	updateToastsLifetime(); + +	void	updateToastFadingTime(); +  	create_toast_panel_callback_t m_create_toast_panel_callback_t;  	bool	createPoolToast(); @@ -205,6 +230,27 @@ void LLNearbyChatScreenChannel::onToastFade(LLToast* toast)  	arrangeToasts();  } +void LLNearbyChatScreenChannel::updateToastsLifetime() +{ +	S32 seconds = gSavedSettings.getS32("NearbyToastLifeTime"); +	toast_list_t::iterator it; + +	for(it = m_toast_pool.begin(); it != m_toast_pool.end(); ++it) +	{ +		(*it).get()->setLifetime(seconds); +	} +} + +void LLNearbyChatScreenChannel::updateToastFadingTime() +{ +	S32 seconds = gSavedSettings.getS32("NearbyToastFadingTime"); +	toast_list_t::iterator it; + +	for(it = m_toast_pool.begin(); it != m_toast_pool.end(); ++it) +	{ +		(*it).get()->setFadingTime(seconds); +	} +}  bool	LLNearbyChatScreenChannel::createPoolToast()  { @@ -250,7 +296,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)  			{  				panel->addMessage(notification);  				toast->reshapeToPanel(); -				toast->resetTimer(); +				toast->startFading();  				arrangeToasts();  				return; @@ -295,7 +341,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)  	panel->init(notification);  	toast->reshapeToPanel(); -	toast->resetTimer(); +	toast->startFading();  	m_active_toasts.push_back(toast->getHandle()); @@ -325,9 +371,9 @@ void LLNearbyChatScreenChannel::arrangeToasts()  int sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> second)  { -	F32 v1 = first.get()->getTimer()->getEventTimer().getElapsedTimeF32(); -	F32 v2 = second.get()->getTimer()->getEventTimer().getElapsedTimeF32(); -	return v1 < v2; +	F32 v1 = first.get()->getTimeLeftToLive(); +	F32 v2 = second.get()->getTimeLeftToLive(); +	return v1 > v2;  }  void LLNearbyChatScreenChannel::showToastsBottom() diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h index 650bce0da4..e053b1c177 100644 --- a/indra/newview/llnetmap.h +++ b/indra/newview/llnetmap.h @@ -38,6 +38,7 @@ class LLColor4U;  class LLCoordGL;  class LLImageRaw;  class LLViewerTexture; +class LLFloaterMap;  class LLNetMap : public LLUICtrl  { @@ -55,6 +56,7 @@ public:  protected:  	LLNetMap (const Params & p);  	friend class LLUICtrlFactory; +	friend class LLFloaterMap;  public:  	virtual ~LLNetMap(); diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 70295259b3..6435126fc0 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -115,7 +115,7 @@ public:  		registrar.add("Gear.Wear", boost::bind(&LLOutfitListGearMenu::onWear, this));  		registrar.add("Gear.TakeOff", boost::bind(&LLOutfitListGearMenu::onTakeOff, this));  		registrar.add("Gear.Rename", boost::bind(&LLOutfitListGearMenu::onRename, this)); -		registrar.add("Gear.Delete", boost::bind(&LLOutfitListGearMenu::onDelete, this)); +		registrar.add("Gear.Delete", boost::bind(&LLOutfitsList::removeSelected, mOutfitList));  		registrar.add("Gear.Create", boost::bind(&LLOutfitListGearMenu::onCreate, this, _2));  		registrar.add("Gear.WearAdd", boost::bind(&LLOutfitListGearMenu::onAdd, this)); @@ -197,15 +197,6 @@ private:  		}  	} -	void onDelete() -	{ -		const LLUUID& selected_outfit_id = getSelectedOutfitID(); -		if (selected_outfit_id.notNull()) -		{ -			remove_category(&gInventory, selected_outfit_id); -		} -	} -  	void onCreate(const LLSD& data)  	{  		LLWearableType::EType type = LLWearableType::typeNameToType(data.asString()); @@ -260,6 +251,12 @@ private:  class LLOutfitContextMenu : public LLListContextMenu  { +public: + +	LLOutfitContextMenu(LLOutfitsList* outfit_list) +	:		LLListContextMenu(), +	 		mOutfitList(outfit_list) +	{}  protected:  	/* virtual */ LLContextMenu* createMenu()  	{ @@ -275,7 +272,7 @@ protected:  				boost::bind(&LLAppearanceMgr::takeOffOutfit, &LLAppearanceMgr::instance(), selected_id));  		registrar.add("Outfit.Edit", boost::bind(editOutfit));  		registrar.add("Outfit.Rename", boost::bind(renameOutfit, selected_id)); -		registrar.add("Outfit.Delete", boost::bind(deleteOutfit, selected_id)); +		registrar.add("Outfit.Delete", boost::bind(&LLOutfitsList::removeSelected, mOutfitList));  		enable_registrar.add("Outfit.OnEnable", boost::bind(&LLOutfitContextMenu::onEnable, this, _2));  		enable_registrar.add("Outfit.OnVisible", boost::bind(&LLOutfitContextMenu::onVisible, this, _2)); @@ -338,10 +335,8 @@ protected:  		LLAppearanceMgr::instance().renameOutfit(outfit_cat_id);  	} -	static void deleteOutfit(const LLUUID& outfit_cat_id) -	{ -		remove_category(&gInventory, outfit_cat_id); -	} +private: +	LLOutfitsList*	mOutfitList;  };  ////////////////////////////////////////////////////////////////////////// @@ -358,7 +353,7 @@ LLOutfitsList::LLOutfitsList()  	mCategoriesObserver = new LLInventoryCategoriesObserver();  	mGearMenu = new LLOutfitListGearMenu(this); -	mOutfitMenu = new LLOutfitContextMenu(); +	mOutfitMenu = new LLOutfitContextMenu(this);  }  LLOutfitsList::~LLOutfitsList() @@ -635,6 +630,14 @@ void LLOutfitsList::performAction(std::string action)  void LLOutfitsList::removeSelected()  { +	LLNotificationsUtil::add("DeleteOutfits", LLSD(), LLSD(), boost::bind(&LLOutfitsList::onOutfitsRemovalConfirmation, this, _1, _2)); +} + +void LLOutfitsList::onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if (option != 0) return; // canceled +  	if (mSelectedOutfitUUID.notNull())  	{  		remove_category(&gInventory, mSelectedOutfitUUID); diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h index 5fecbb83e7..a0598737f1 100644 --- a/indra/newview/lloutfitslist.h +++ b/indra/newview/lloutfitslist.h @@ -110,6 +110,8 @@ public:  private: +	void onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response); +  	/**  	 * Wrapper for LLCommonUtils::computeDifference. @see LLCommonUtils::computeDifference  	 */ diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index 80df420a4e..ec340dc258 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -692,7 +692,8 @@ void LLPanelGroupGeneral::updateMembers()  	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);  	if (!mListVisibleMembers || !gdatap  -		|| !gdatap->isMemberDataComplete()) +		|| !gdatap->isMemberDataComplete() +		|| gdatap->mMembers.empty())  	{  		return;  	} diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 0d1d96eae6..d1362d7922 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -1576,6 +1576,7 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc)  void LLPanelGroupMembersSubTab::addMemberToList(LLUUID id, LLGroupMemberData* data)  { +	if (!data) return;  	LLUIString donated = getString("donation_area");  	donated.setArg("[AREA]", llformat("%d", data->getContribution())); @@ -1616,9 +1617,12 @@ void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, const LLUUI  	std::string fullname;  	gCacheName->getFullName(id, fullname); -	if (matchesSearchFilter(fullname)) + +	LLGroupMemberData* data; +	// trying to avoid unnecessary hash lookups +	if (matchesSearchFilter(fullname) && ((data = gdatap->mMembers[id]) != NULL))  	{ -		addMemberToList(id, gdatap->mMembers[id]); +		addMemberToList(id, data);  		if(!mMembersList->getEnabled())  		{  			mMembersList->setEnabled(TRUE); diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index 4f2cfa2bbc..a90f864ae2 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -258,17 +258,7 @@ void LLPanelOutfitsInventory::updateListCommands()  void LLPanelOutfitsInventory::onTrashButtonClick()  { -	LLNotificationsUtil::add("DeleteOutfits", LLSD(), LLSD(), boost::bind(&LLPanelOutfitsInventory::onOutfitsRemovalConfirmation, this, _1, _2)); -} - -void LLPanelOutfitsInventory::onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response) -{ -	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); -	if (option != 0) return; // canceled -  	mMyOutfitsPanel->removeSelected(); -	updateListCommands(); -	updateVerbs();  }  bool LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata) diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index f1ca1dbfeb..a7917b457c 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -89,7 +89,6 @@ protected:  	void onWearButtonClick();  	void showGearMenu();  	void onTrashButtonClick(); -	void onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response);  	bool isActionEnabled(const LLSD& userdata);  	void setWearablesLoading(bool val);  	void onWearablesLoaded(); diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 18c9ac28c1..61f4897ed0 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -369,7 +369,7 @@ void LLScreenChannel::loadStoredToastsToChannel()  	for(it = mStoredToastList.begin(); it != mStoredToastList.end(); ++it)  	{  		(*it).toast->setIsHidden(false); -		(*it).toast->resetTimer(); +		(*it).toast->startFading();  		mToastList.push_back((*it));  	} @@ -394,7 +394,7 @@ void LLScreenChannel::loadStoredToastByNotificationIDToChannel(LLUUID id)  	}  	toast->setIsHidden(false); -	toast->resetTimer(); +	toast->startFading();  	mToastList.push_back((*it));  	redrawToasts(); @@ -477,7 +477,7 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)  		toast->removeChild(old_panel);  		delete old_panel;  		toast->insertPanel(panel); -		toast->resetTimer(); +		toast->startFading();  		redrawToasts();  	}  } @@ -588,7 +588,7 @@ void LLScreenChannel::showToastsBottom()  		mHiddenToastsNum = 0;  		for(; it != mToastList.rend(); it++)  		{ -			(*it).toast->stopTimer(); +			(*it).toast->stopFading();  			(*it).toast->setVisible(FALSE);  			mHiddenToastsNum++;  		} diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index f9c0fd398e..be797ea937 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -68,10 +68,22 @@ private:  void LLItemPropertiesObserver::changed(U32 mask)  { -	// if there's a change we're interested in. -	if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0) +	const std::set<LLUUID>& mChangedItemIDs = gInventory.getChangedIDs(); +	std::set<LLUUID>::const_iterator it; + +	const LLUUID& object_id = mFloater->getObjectID(); + +	for (it = mChangedItemIDs.begin(); it != mChangedItemIDs.end(); it++)  	{ -		mFloater->dirty(); +		// set dirty for 'item profile panel' only if changed item is the item for which 'item profile panel' is shown (STORM-288) +		if (*it == object_id) +		{ +			// if there's a change we're interested in. +			if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0) +			{ +				mFloater->dirty(); +			} +		}  	}  } @@ -179,6 +191,11 @@ void LLSidepanelItemInfo::setItemID(const LLUUID& item_id)  	mItemID = item_id;  } +const LLUUID& LLSidepanelItemInfo::getObjectID() const +{ +	return mObjectID; +} +  void LLSidepanelItemInfo::reset()  {  	LLSidepanelInventorySubpanel::reset(); diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h index 10e93dd7de..6416e2cfe4 100644 --- a/indra/newview/llsidepaneliteminfo.h +++ b/indra/newview/llsidepaneliteminfo.h @@ -54,6 +54,8 @@ public:  	void setItemID(const LLUUID& item_id);  	void setEditMode(BOOL edit); +	const LLUUID& getObjectID() const; +  protected:  	/*virtual*/ void refresh();  	/*virtual*/ void save(); diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index c3090cb1fc..8176b8c1f9 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -35,6 +35,13 @@  using namespace LLNotificationsUI; +//-------------------------------------------------------------------------- +LLToastLifeTimer::LLToastLifeTimer(LLToast* toast, F32 period) +	: mToast(toast), +	  LLEventTimer(period) +{ +} +  /*virtual*/  BOOL LLToastLifeTimer::tick()  { @@ -45,6 +52,38 @@ BOOL LLToastLifeTimer::tick()  	return FALSE;  } +void LLToastLifeTimer::stop() +{ +	mEventTimer.stop(); +} + +void LLToastLifeTimer::start() +{ +	mEventTimer.start(); +} + +void LLToastLifeTimer::restart() +{ +	mEventTimer.reset(); +} + +BOOL LLToastLifeTimer::getStarted() +{ +	return mEventTimer.getStarted(); +} + +void LLToastLifeTimer::setPeriod(F32 period) +{ +	mPeriod = period; +} + +F32 LLToastLifeTimer::getRemainingTimeF32() +{ +	F32 et = mEventTimer.getElapsedTimeF32(); +	if (!getStarted() || et > mPeriod) return 0.0f; +	return mPeriod - et; +} +  //--------------------------------------------------------------------------  LLToast::Params::Params()   :	can_fade("can_fade", true), @@ -73,7 +112,8 @@ LLToast::LLToast(const LLToast::Params& p)  	mIsHidden(false),  	mHideBtnPressed(false),  	mIsTip(p.is_tip), -	mWrapperPanel(NULL) +	mWrapperPanel(NULL), +	mIsTransparent(false)  {  	mTimer.reset(new LLToastLifeTimer(this, p.lifetime_secs)); @@ -143,6 +183,7 @@ LLToast::~LLToast()  void LLToast::hide()  {  	setVisible(FALSE); +	setTransparentState(false);  	mTimer->stop();  	mIsHidden = true;  	mOnFadeSignal(this);  @@ -166,6 +207,16 @@ void LLToast::onFocusReceived()  	}  } +void LLToast::setLifetime(S32 seconds) +{ +	mToastLifetime = seconds; +} + +void LLToast::setFadingTime(S32 seconds) +{ +	mToastFadingTime = seconds; +} +  S32 LLToast::getTopPad()  {  	if(mWrapperPanel) @@ -195,13 +246,46 @@ void LLToast::setCanFade(bool can_fade)  //--------------------------------------------------------------------------  void LLToast::expire()  { -	// if toast has fade property - hide it -	if(mCanFade) +	if (mCanFade)  	{ -		hide(); +		if (mIsTransparent) +		{ +			hide(); +		} +		else +		{ +			setTransparentState(true); +			mTimer->restart(); +		}  	}  } +void LLToast::setTransparentState(bool transparent) +{ +	setBackgroundOpaque(!transparent); +	mIsTransparent = transparent; + +	if (transparent) +	{ +		mTimer->setPeriod(mToastFadingTime); +	} +	else +	{ +		mTimer->setPeriod(mToastLifetime); +	} +} + +F32 LLToast::getTimeLeftToLive() +{ +	F32 time_to_live = mTimer->getRemainingTimeF32(); + +	if (!mIsTransparent) +	{ +		time_to_live += mToastFadingTime; +	} + +	return time_to_live; +}  //--------------------------------------------------------------------------  void LLToast::reshapeToPanel() @@ -245,13 +329,6 @@ void LLToast::draw()  			drawChild(mHideBtn);  		}  	} - -	// if timer started and remaining time <= fading time -	if (mTimer->getStarted() && (mToastLifetime -			- mTimer->getEventTimer().getElapsedTimeF32()) <= mToastFadingTime) -	{ -		setBackgroundOpaque(FALSE); -	}  }  //-------------------------------------------------------------------------- @@ -267,6 +344,11 @@ void LLToast::setVisible(BOOL show)  		return;  	} +	if (show && getVisible()) +	{ +		return; +	} +  	if(show)  	{  		setBackgroundOpaque(TRUE); @@ -372,7 +454,8 @@ void LLNotificationsUI::LLToast::stopFading()  {  	if(mCanFade)  	{ -		stopTimer(); +		setTransparentState(false); +		mTimer->stop();  	}  } @@ -380,7 +463,8 @@ void LLNotificationsUI::LLToast::startFading()  {  	if(mCanFade)  	{ -		resetTimer(); +		setTransparentState(false); +		mTimer->start();  	}  } diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h index 0a96c092a0..fb534561c9 100644 --- a/indra/newview/lltoast.h +++ b/indra/newview/lltoast.h @@ -49,14 +49,16 @@ class LLToast;  class LLToastLifeTimer: public LLEventTimer  {  public: -	LLToastLifeTimer(LLToast* toast, F32 period) : mToast(toast), LLEventTimer(period){} +	LLToastLifeTimer(LLToast* toast, F32 period);  	/*virtual*/  	BOOL tick(); -	void stop() { mEventTimer.stop(); } -	void start() { mEventTimer.start(); } -	void restart() {mEventTimer.reset(); } -	BOOL getStarted() { return mEventTimer.getStarted(); } +	void stop(); +	void start(); +	void restart(); +	BOOL getStarted(); +	void setPeriod(F32 period); +	F32 getRemainingTimeF32();  	LLTimer&  getEventTimer() { return mEventTimer;}  private : @@ -80,8 +82,14 @@ public:  		Optional<LLUUID>				notif_id,	 //notification ID  										session_id;	 //im session ID  		Optional<LLNotificationPtr>		notification; -		Optional<F32>					lifetime_secs, -										fading_time_secs; // Number of seconds while a toast is fading + +		//NOTE: Life time of a toast (i.e. period of time from the moment toast was shown +		//till the moment when toast was hidden) is the sum of lifetime_secs and fading_time_secs. + +		Optional<F32>					lifetime_secs, // Number of seconds while a toast is non-transparent +										fading_time_secs; // Number of seconds while a toast is transparent + +  		Optional<toast_callback_t>		on_delete_toast,  										on_mouse_enter;  		Optional<bool>					can_fade, @@ -125,10 +133,8 @@ public:  	LLPanel* getPanel() { return mPanel; }  	// enable/disable Toast's Hide button  	void setHideButtonEnabled(bool enabled); -	//  -	void resetTimer() { mTimer->start(); }  	// -	void stopTimer() { mTimer->stop(); } +	F32 getTimeLeftToLive();  	//  	LLToastLifeTimer* getTimer() { return mTimer.get();}  	// @@ -144,6 +150,10 @@ public:  	/*virtual*/ void onFocusReceived(); +	void setLifetime(S32 seconds); + +	void setFadingTime(S32 seconds); +  	/**  	 * Returns padding between floater top and wrapper_panel top.  	 * This padding should be taken into account when positioning or reshaping toasts @@ -196,7 +206,9 @@ private:  	void onToastMouseLeave(); -	void	expire(); +	void expire(); + +	void setTransparentState(bool transparent);  	LLUUID				mNotificationID;  	LLUUID				mSessionID; @@ -222,6 +234,7 @@ private:  	bool		mHideBtnPressed;  	bool		mIsHidden;  // this flag is TRUE when a toast has faded or was hidden with (x) button (EXT-1849)  	bool		mIsTip; +	bool		mIsTransparent;  	commit_signal_t mToastMouseEnterSignal;  	commit_signal_t mToastMouseLeaveSignal; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 9b1f2e67c6..672213d3e8 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1511,7 +1511,12 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  		// MUTE falls through to decline  	case IOR_DECLINE:  		{ -			log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +"."; +			{ +				LLStringUtil::format_map_t log_message_args; +				log_message_args["DESC"] = mDesc; +				log_message_args["NAME"] = mFromName; +				log_message = LLTrans::getString("InvOfferDecline", log_message_args); +			}  			chat.mText = log_message;  			if( LLMuteList::getInstance()->isMuted(mFromID ) && ! LLMuteList::getInstance()->isLinden(mFromName) )  // muting for SL-42269  			{ @@ -1710,8 +1715,12 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const  			msg->addBinaryDataFast(_PREHASH_BinaryBucket, EMPTY_BINARY_BUCKET, EMPTY_BINARY_BUCKET_SIZE);  			// send the message  			msg->sendReliable(mHost); -			 -			log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +"."; +			{ +				LLStringUtil::format_map_t log_message_args; +				log_message_args["DESC"] = mDesc; +				log_message_args["NAME"] = mFromName; +				log_message = LLTrans::getString("InvOfferDecline", log_message_args); +			}  			LLSD args;  			args["MESSAGE"] = log_message;  			LLNotificationsUtil::add("SystemMessage", args); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index f4f1235d55..a779a1735c 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -33,6 +33,8 @@  #include <string>  #include <vector> +#include <boost/signals2.hpp> +  #include "imageids.h"			// IMG_INVISIBLE  #include "llchat.h"  #include "lldrawpoolalpha.h" @@ -71,7 +73,8 @@ class LLVOAvatarSkeletonInfo;  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  class LLVOAvatar :  	public LLViewerObject, -	public LLCharacter +	public LLCharacter, +	public boost::signals2::trackable  {  public:  	friend class LLVOAvatarSelf; diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 0a27cc7bc9..3dd6c60095 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -255,7 +255,6 @@              </text>     <!--TODO: HOOK UP GROUP ICON-->              <text -             enabled="false"               follows="left|top"               height="16"               left_pad="2" diff --git a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml index 457142f11c..4e0cfb0cd4 100644 --- a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml @@ -7,7 +7,7 @@   name="floaterbulkperms"   help_topic="floaterbulkperms"   title="EDIT CONTENT PERMISSIONS" - width="300"> + width="410">      <floater.string       name="nothing_to_modify_text">          Selection contains no editable contents. @@ -71,7 +71,7 @@       control_name="BulkChangeIncludeGestures"       height="16"       name="check_gesture" -     left="65" +     left="95"       width="16"       top="25" />      <icon @@ -87,7 +87,7 @@       height="16"       layout="topleft"       name="check_notecard" -     left="65" +     left="95"       width="16"       top_pad="5" />      <icon @@ -102,7 +102,7 @@       control_name="BulkChangeIncludeObjects"       height="16"       name="check_object" -     left="65" +     left="95"       top_pad="5"       width="16" />     <icon @@ -117,7 +117,7 @@       height="16"       name="check_script"       top="25" -     left="120" +     left="180"       width="16"       />      <icon @@ -133,7 +133,7 @@       height="16"       name="check_sound"       top_pad="5" -     left="120" +     left="180"       width="16" />      <icon       height="16" @@ -147,7 +147,7 @@       height="16"       name="check_texture"       top_pad="5" -     left="120" +     left="180"       width="16" />      <icon       height="16" @@ -162,7 +162,7 @@      layout="topleft"     name="check_all"       label="√ All" -     left="180" +     left="290"       top="26"       width="115">        <button.commit_callback @@ -221,7 +221,7 @@       height="28"       layout="topleft"       name="AnyoneLabel" -     left="104" +     left="124"       top="110"       width="92"       word_wrap="true"> @@ -243,7 +243,7 @@       layout="topleft"       name="NextOwnerLabel"       top="110" -     left="189" +     left="275"       width="92"       word_wrap="true">          Next owner: @@ -292,7 +292,7 @@       height="23"       label="OK"       layout="topleft" -     left="95" +     left="205"       name="apply"       top_pad="10"       width="90"> diff --git a/indra/newview/skins/default/xui/en/floater_display_name.xml b/indra/newview/skins/default/xui/en/floater_display_name.xml index 7a3fb9334a..9a9fd32a77 100644 --- a/indra/newview/skins/default/xui/en/floater_display_name.xml +++ b/indra/newview/skins/default/xui/en/floater_display_name.xml @@ -63,7 +63,7 @@         width="300"         height="20"        font="SansSerif" -    name="set_name_label"> +    name="name_confirm_label">        Type your new name again to confirm:      </text>      <line_editor diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index d5be64192b..f361cb7f8e 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -965,7 +965,7 @@               top_pad="10"               left="10"               name="label click action" -             width="98"> +             width="118">                  Click to:              </text>              <combo_box @@ -973,7 +973,7 @@               height="23"               layout="topleft"               name="clickaction" -             width="168" +             width="148"               left_pad="0">                  <combo_box.item                   label="Touch  (default)" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index d34c0c29a8..68c423d7dd 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -307,7 +307,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M  				           image_unselected="Toolbar_Right_Off"  				           left="0"  				           layout="topleft" -				           name="trash_btn" +				           name="del_btn"  				           tool_tip="Remove selected person from your Friends list"  				           top="0"  				           width="31"/> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index 31e160ec33..85824c2576 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -308,6 +308,38 @@       width="95">          URLs      </text> +    <spinner +     control_name="NearbyToastLifeTime" +     decimal_digits="0" +     follows="left|top" +     height="23" +     increment="1" +     initial_value="23" +     label="Nearby chat toasts life time:" +     label_width="190" +     layout="topleft" +     left="290" +     max_val="60" +     min_val="1" +     name="nearby_toasts_lifetime" +     top_pad="33" +     width="210" /> +    <spinner +     control_name="NearbyToastFadingTime" +     decimal_digits="0" +     follows="left|top" +     height="23" +     increment="1" +     initial_value="3" +     label="Nearby chat toasts fading time:" +     label_width="190" +     layout="topleft" +     left_delta="00" +     max_val="60" +     min_val="0" +     name="nearby_toasts_fadingtime" +     top_pad="15" +     width="210" />      <check_box       control_name="PlayTypingAnim"       height="16" @@ -316,7 +348,7 @@       layout="topleft"       left="30"       name="play_typing_animation" -     top_pad="32" +     top="205"       width="400" />      <check_box       enabled="false" @@ -343,7 +375,7 @@       left="30"       height="20"       width="170" -     top_pad="14"> +     top_pad="7">       Show IMs in:      </text>      <text @@ -359,14 +391,14 @@        (requires restart)        </text>      <radio_group +     follows="left|top"       height="30" -     layout="topleft"       left="40"       control_name="ChatWindow"       name="chat_window"       top_pad="0"       tool_tip="Show your Instant Messages in separate floaters, or in one floater with many tabs (Requires restart)" -     width="331"> +     width="150">       <radio_item        height="16"        label="Separate windows" @@ -386,6 +418,36 @@        top_pad="5"        width="150" />      </radio_group> +    <text +     name="disable_toast_label" +     follows="left|top" +     layout="topleft" +     top_delta="-22"  +     left="280"  +     height="10" +     width="180"> +      Enable Incoming Chat popups: +      </text> +    <check_box +     control_name="EnableGroupChatPopups" +     name="EnableGroupChatPopups" +     label="Group Chats"  +     layout="topleft" +     top_delta="18"  +     left="295"  +     height="20" +     tool_tip="Check to see popups when a Group Chat message arrives" +     width="400" /> +    <check_box +     control_name="EnableIMChatPopups" +     name="EnableIMChatPopups" +     label="IM Chats"  +     layout="topleft" +     top_delta="22"  +     left="295"  +     height="20" +     tool_tip="Check to see popups when an instant message arrives" +     width="400" />      <check_box       control_name="TranslateChat"       enabled="true" @@ -488,4 +550,4 @@           name="Korean"           value="ko" />      </combo_box> -</panel> +</panel>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 403d976350..5d3f19edcf 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2242,8 +2242,7 @@ Clears (deletes) the media and all params from the given face.  	<string name="InvOfferOwnedBy">owned by</string>  	<string name="InvOfferOwnedByUnknownUser">owned by an unknown user</string>  	<string name="InvOfferGaveYou">gave you</string> -	<string name="InvOfferYouDecline">You decline</string> -	<string name="InvOfferFrom">from</string> +	<string name="InvOfferDecline">You decline [DESC] from <nolink>[NAME]</nolink>.</string>  	<!-- group money -->  	<string name="GroupMoneyTotal">Total</string> diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml b/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml index ed8df69bf4..1bb3188cc8 100644 --- a/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml +++ b/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml @@ -1,5 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <avatar_list_item + name_right_pad="5"   height="0"   layout="topleft"   left="0" diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml index 9867f1b575..249e9e0913 100644 --- a/indra/newview/skins/default/xui/es/floater_tools.xml +++ b/indra/newview/skins/default/xui/es/floater_tools.xml @@ -186,10 +186,10 @@  			<button label="Configurar..." label_selected="Configurar..." name="button set group" tool_tip="Elige un grupo con el que compartir los permisos de este objeto"/>  			<check_box label="Compartir" name="checkbox share with group" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación en este objeto. Debes transferirlo para activar las restricciones según los roles."/>  			<button label="Transferir" label_selected="Transferir" name="button deed" tool_tip="La transferencia entrega este objeto con los permisos del próximo propietario. Los objetos compartidos por el grupo pueden ser transferidos por un oficial del grupo."/> -			<text name="label click action" width="180"> +			<text name="label click action">  				Al tocarlo:  			</text> -			<combo_box name="clickaction" width="192"> +			<combo_box name="clickaction">  				<combo_box.item label="Tocarlo (por defecto)" name="Touch/grab(default)"/>  				<combo_box.item label="Sentarse en el objeto" name="Sitonobject"/>  				<combo_box.item label="Comprar el objeto" name="Buyobject"/> diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml index 666aaa8147..8a128c0308 100644 --- a/indra/newview/skins/default/xui/fr/floater_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_tools.xml @@ -189,7 +189,7 @@  			<text name="label click action">  				Cliquer pour :  			</text> -			<combo_box name="clickaction" width="178"> +			<combo_box name="clickaction">  				<combo_box.item label="Toucher (par défaut)" name="Touch/grab(default)"/>  				<combo_box.item label="S'asseoir sur l'objet" name="Sitonobject"/>  				<combo_box.item label="Acheter l'objet" name="Buyobject"/> diff --git a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml index be24960c6e..d8d0164618 100644 --- a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml @@ -43,7 +43,7 @@  		全員:  	</text>  	<check_box label="コピー" name="everyone_copy"/> -	<text name="NextOwnerLabel" left="160"> +	<text name="NextOwnerLabel">  		次の所有者:  	</text>  	<check_box label="修正" name="next_owner_modify"/> diff --git a/indra/newview/skins/default/xui/nl/floater_tools.xml b/indra/newview/skins/default/xui/nl/floater_tools.xml index 212cac0a5b..b72e4d4681 100644 --- a/indra/newview/skins/default/xui/nl/floater_tools.xml +++ b/indra/newview/skins/default/xui/nl/floater_tools.xml @@ -144,7 +144,7 @@  			<text name="label click action">  				Wanneer links-geklikt:  			</text> -			<combo_box name="clickaction" width="178"> +			<combo_box name="clickaction">  				<combo_box.item name="Touch/grab(default)" label="Aanraken/pakken (standaard)"  				/>  				<combo_box.item name="Sitonobject" label="Zit op object" | 
