diff options
| -rw-r--r-- | indra/llui/llfolderviewmodel.h | 2 | ||||
| -rw-r--r-- | indra/newview/llconversationmodel.cpp | 53 | ||||
| -rwxr-xr-x | indra/newview/llconversationmodel.h | 10 | ||||
| -rw-r--r-- | indra/newview/llimconversation.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/llimfloater.cpp | 4 | ||||
| -rwxr-xr-x | indra/newview/llimfloatercontainer.cpp | 15 | ||||
| -rw-r--r-- | indra/newview/llimfloatercontainer.h | 1 | ||||
| -rw-r--r-- | indra/newview/llnearbychat.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llparticipantlist.cpp | 7 | 
9 files changed, 75 insertions, 29 deletions
| diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h index 22bfc4dfb4..c99fa07c8b 100644 --- a/indra/llui/llfolderviewmodel.h +++ b/indra/llui/llfolderviewmodel.h @@ -226,7 +226,7 @@ public:  		mParent(NULL),  		mRootViewModel(root_view_model)  	{ -		std::for_each(mChildren.begin(), mChildren.end(), DeletePointer()); +		mChildren.clear();  	}  	void requestSort() { mSortVersion = -1; } diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp index 31f9ca6a32..e090d1647f 100644 --- a/indra/newview/llconversationmodel.cpp +++ b/indra/newview/llconversationmodel.cpp @@ -38,7 +38,8 @@ LLConversationItem::LLConversationItem(std::string display_name, const LLUUID& u  	mName(display_name),  	mUUID(uuid),  	mNeedsRefresh(true), -	mConvType(CONV_UNKNOWN) +	mConvType(CONV_UNKNOWN), +	mLastActiveTime(0.0)  {  } @@ -47,7 +48,8 @@ LLConversationItem::LLConversationItem(const LLUUID& uuid, LLFolderViewModelInte  	mName(""),  	mUUID(uuid),  	mNeedsRefresh(true), -	mConvType(CONV_UNKNOWN) +	mConvType(CONV_UNKNOWN), +	mLastActiveTime(0.0)  {  } @@ -56,7 +58,8 @@ LLConversationItem::LLConversationItem(LLFolderViewModelInterface& root_view_mod  	mName(""),  	mUUID(),  	mNeedsRefresh(true), -	mConvType(CONV_UNKNOWN) +	mConvType(CONV_UNKNOWN), +	mLastActiveTime(0.0)  {  } @@ -167,8 +170,10 @@ void LLConversationItemSession::setParticipantIsModerator(const LLUUID& particip  	}  } -void LLConversationItemSession::setParticipantTimeNow(const LLUUID& participant_id) +void LLConversationItemSession::setTimeNow(const LLUUID& participant_id)  { +	mLastActiveTime = LLFrameTimer::getElapsedSeconds(); +	mNeedsRefresh = true;  	LLConversationItemParticipant* participant = findParticipant(participant_id);  	if (participant)  	{ @@ -176,11 +181,11 @@ void LLConversationItemSession::setParticipantTimeNow(const LLUUID& participant_  	}  } -// The time of activity of a session is the time of the most recent participation +// The time of activity of a session is the time of the most recent activity, session and participants included  const bool LLConversationItemSession::getTime(F64& time) const  { -	bool has_time = false; -	F64 most_recent_time = 0.0; +	F64 most_recent_time = mLastActiveTime; +	bool has_time = (most_recent_time > 0.1);  	LLConversationItemParticipant* participant = NULL;  	child_list_t::const_iterator iter;  	for (iter = mChildren.begin(); iter != mChildren.end(); iter++) @@ -197,7 +202,6 @@ const bool LLConversationItemSession::getTime(F64& time) const  	{  		time = most_recent_time;  	} -	llinfos << "Merov debug : get time session, uuid = " << mUUID << ", has_time = " << has_time << ", time = " << time << llendl;  	return has_time;  } @@ -220,8 +224,7 @@ void LLConversationItemSession::dumpDebugData()  LLConversationItemParticipant::LLConversationItemParticipant(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) :  	LLConversationItem(display_name,uuid,root_view_model),  	mIsMuted(false), -	mIsModerator(false), -	mLastActiveTime(0.0) +	mIsModerator(false)  {  	mConvType = CONV_PARTICIPANT;  } @@ -265,19 +268,34 @@ bool LLConversationSort::operator()(const LLConversationItem* const& a, const LL  		{  			F64 time_a = 0.0;  			F64 time_b = 0.0; -			if (a->getTime(time_a) && b->getTime(time_b)) +			bool has_time_a = a->getTime(time_a); +			bool has_time_b = b->getTime(time_b); +			if (has_time_a && has_time_b)  			{  				return (time_a > time_b);  			} +			else if (has_time_a || has_time_b) +			{ +				// If we have only one time updated, we consider the element with time as the "highest". +				// That boils down to "has_time_a" if you think about it. +				return has_time_a; +			} +			// If not time available, we'll default to sort by name at the end of this method  		}  		else if (sort_order == LLConversationFilter::SO_DISTANCE)  		{  			F32 dist_a = 0.0;  			F32 dist_b = 0.0; -			if (a->getDistanceToAgent(dist_a) && b->getDistanceToAgent(dist_b)) +			bool has_dist_a = a->getDistanceToAgent(dist_a); +			bool has_dist_b = b->getDistanceToAgent(dist_b); +			if (has_dist_a && has_dist_b)  			{  				return (dist_a > dist_b);  			} +			else if (has_dist_a || has_dist_b) +			{ +				return has_dist_a; +			}  		}  	}  	else if ((type_a > LLConversationItem::CONV_PARTICIPANT) && (type_b > LLConversationItem::CONV_PARTICIPANT)) @@ -288,10 +306,19 @@ bool LLConversationSort::operator()(const LLConversationItem* const& a, const LL  		{  			F64 time_a = 0.0;  			F64 time_b = 0.0; -			if (a->getTime(time_a) && b->getTime(time_b)) +			bool has_time_a = a->getTime(time_a); +			bool has_time_b = b->getTime(time_b); +			if (has_time_a && has_time_b)  			{  				return (time_a > time_b);  			} +			else if (has_time_a || has_time_b) +			{ +				// If we have only one time updated, we consider the element with time as the "highest". +				// That boils down to "has_time_a" if you think about it. +				return has_time_a; +			} +			// If not time available, we'll default to sort by name at the end of this method  		}  		else if (sort_order == LLConversationFilter::SO_SESSION_TYPE)  		{ diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h index e2c88785a2..e67aeb9aca 100755 --- a/indra/newview/llconversationmodel.h +++ b/indra/newview/llconversationmodel.h @@ -106,7 +106,7 @@ public:  	// Methods used in sorting (see LLConversationSort::operator())  	EConversationType const getType() const { return mConvType; } -	virtual const bool getTime(F64& time) const { return false; } +	virtual const bool getTime(F64& time) const { time = mLastActiveTime; return (time > 0.1); }  	virtual const bool getDistanceToAgent(F32& distance) const { return false; }  	// This method will be called to determine if a drop can be @@ -129,6 +129,7 @@ protected:  	LLUUID mUUID;		// UUID of the session or the participant  	EConversationType mConvType;	// Type of conversation item  	bool mNeedsRefresh;	// Flag signaling to the view that something changed for this item +	F64  mLastActiveTime;  };  class LLConversationItemSession : public LLConversationItem @@ -149,7 +150,7 @@ public:  	void setParticipantIsMuted(const LLUUID& participant_id, bool is_muted);  	void setParticipantIsModerator(const LLUUID& participant_id, bool is_moderator); -	void setParticipantTimeNow(const LLUUID& participant_id); +	void setTimeNow(const LLUUID& participant_id);  	bool isLoaded() { return mIsLoaded; } @@ -172,18 +173,15 @@ public:  	bool isModerator() {return mIsModerator; }  	void setIsMuted(bool is_muted) { mIsMuted = is_muted; mNeedsRefresh = true; }  	void setIsModerator(bool is_moderator) { mIsModerator = is_moderator; mNeedsRefresh = true; } -	void setTimeNow() { mLastActiveTime = LLFrameTimer::getElapsedSeconds(); } +	void setTimeNow() { mLastActiveTime = LLFrameTimer::getElapsedSeconds(); mNeedsRefresh = true; }  	void onAvatarNameCache(const LLAvatarName& av_name); -	virtual const bool getTime(F64& time) const { time = mLastActiveTime; return (time > 0.1 ? true : false); } -  	void dumpDebugData();  private:  	bool mIsMuted;		// default is false  	bool mIsModerator;	// default is false -	F64  mLastActiveTime;  };  // We don't want to ever filter conversations but we need to declare that class to create a conversation view model. diff --git a/indra/newview/llimconversation.cpp b/indra/newview/llimconversation.cpp index a2efe63546..5425baec6d 100644 --- a/indra/newview/llimconversation.cpp +++ b/indra/newview/llimconversation.cpp @@ -250,6 +250,14 @@ std::string LLIMConversation::appendTime()  void LLIMConversation::appendMessage(const LLChat& chat, const LLSD &args)  { +	// Update the participant activity time +	LLIMFloaterContainer* im_box = LLIMFloaterContainer::findInstance(); +	if (im_box) +	{ +		im_box->setTimeNow(mSessionID,chat.mFromID); +	} +	 +  	LLChat& tmp_chat = const_cast<LLChat&>(chat);  	if(tmp_chat.mTimeStr.empty()) diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 8268764816..43adfdfd08 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -907,10 +907,6 @@ void LLIMFloater::updateMessages()  				chat.mText = message;  			} -			// Update the participant activity time -			mParticipantList->setParticipantTimeNow(from_id); -			llinfos << "Merov debug : LLIMFloater::updateMessages, session = " << mSessionID << ", from = " << msg["from"].asString() << ", uuid = " << msg["from_id"].asString() << ", date = " << LLFrameTimer::getElapsedSeconds() << llendl; -  			// Add the message to the chat log  			appendMessage(chat);  			mLastMessageIndex = msg["index"].asInteger(); diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index 4e0fba9502..f84da25baa 100755 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -710,6 +710,21 @@ void LLIMFloaterContainer::setConvItemSelect(LLUUID& session_id)  	}  } +void LLIMFloaterContainer::setTimeNow(const LLUUID& session_id, const LLUUID& participant_id) +{ +	conversations_items_map::iterator item_it = mConversationsItems.find(session_id); +	if (item_it != mConversationsItems.end()) +	{ +		LLConversationItemSession* item = dynamic_cast<LLConversationItemSession*>(item_it->second); +		if (item) +		{ +			item->setTimeNow(participant_id); +			mConversationViewModel.requestSortAll(); +			mConversationsRoot->arrangeAll(); +		} +	} +} +  void LLIMFloaterContainer::addConversationListItem(const LLUUID& uuid)  {  	bool is_nearby_chat = uuid.isNull(); diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h index 1f526091bb..a7a5b8a391 100644 --- a/indra/newview/llimfloatercontainer.h +++ b/indra/newview/llimfloatercontainer.h @@ -124,6 +124,7 @@ private:  public:  	void removeConversationListItem(const LLUUID& uuid, bool change_focus = true);  	void addConversationListItem(const LLUUID& uuid); +	void setTimeNow(const LLUUID& session_id, const LLUUID& participant_id);  private:  	LLConversationViewSession* createConversationItemWidget(LLConversationItem* item); diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 0d52a9e14c..76626bd5a6 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -233,10 +233,6 @@ void LLNearbyChat::loadHistory()   			gCacheName->getUUID(legacy_name, from_id);   		} -		// Update the participant activity time -		mParticipantList->setParticipantTimeNow(from_id); -		llinfos << "Merov debug : LLNearbyChat::loadHistory, session = " << mSessionID << ", from = " << msg[IM_FROM].asString() << ", uuid = " << msg[IM_FROM_ID].asString() << ", date = " << LLFrameTimer::getElapsedSeconds() << llendl; -		  		LLChat chat;  		chat.mFromName = from;  		chat.mFromID = from_id; diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 6283c8f296..09f2716773 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -34,6 +34,7 @@  #include "llagent.h"  #include "llimview.h" +#include "llimfloatercontainer.h"  #include "llpanelpeoplemenus.h"  #include "llnotificationsutil.h"  #include "llparticipantlist.h" @@ -592,7 +593,11 @@ bool LLParticipantList::onSpeakerUpdateEvent(LLPointer<LLOldEvents::LLEvent> eve  	if ( evt_data.has("id") )  	{  		LLUUID participant_id = evt_data["id"]; -		setParticipantTimeNow(participant_id); +		LLIMFloaterContainer* im_box = LLIMFloaterContainer::findInstance(); +		if (im_box) +		{ +			im_box->setTimeNow(mUUID,participant_id); +		}  	}  	return true;  } | 
