diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2021-04-06 20:12:28 +0300 | 
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2021-04-06 20:12:52 +0300 | 
| commit | 77147012fff0673fc5c8ab9ffe654bd32305ad1a (patch) | |
| tree | b1d72437f34abd6f728aa4f391ca81daa74a1b99 | |
| parent | 2be5baf70dcf4e55fcac3935e304828ced202123 (diff) | |
SL-14770 Sorting group notices by date disconnects the viewer.
getItemIndex() on each insertion can be very expensive, use std::set's find instead
| -rw-r--r-- | indra/newview/llpanelgroupnotices.cpp | 38 | ||||
| -rw-r--r-- | indra/newview/llpanelgroupnotices.h | 1 | 
2 files changed, 16 insertions, 23 deletions
| diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index c63d04cd55..ab32ea3956 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -305,8 +305,11 @@ BOOL LLPanelGroupNotices::postBuild()  void LLPanelGroupNotices::activate()  { -	if(mNoticesList) -		mNoticesList->deleteAllItems(); +    if (mNoticesList) +    { +        mNoticesList->deleteAllItems(); +        mKnownNoticeIds.clear(); +    }  	mPrevSelectedNotice = LLUUID(); @@ -413,6 +416,7 @@ void LLPanelGroupNotices::onClickSendMessage(void* data)  	row["columns"][4]["value"] = llformat( "%u", timestamp);  	self->mNoticesList->addElement(row, ADD_BOTTOM); +	self->mKnownNoticeIds.insert(id);  	self->mCreateMessage->clear();  	self->mCreateSubject->clear(); @@ -443,27 +447,13 @@ void LLPanelGroupNotices::onClickNewMessage(void* data)  void LLPanelGroupNotices::refreshNotices()  {  	onClickRefreshNotices(this); -	/* -	LL_DEBUGS() << "LLPanelGroupNotices::onClickGetPastNotices" << LL_ENDL; -	 -	mNoticesList->deleteAllItems(); - -	LLMessageSystem* msg = gMessageSystem; -	msg->newMessage("GroupNoticesListRequest"); -	msg->nextBlock("AgentData"); -	msg->addUUID("AgentID",gAgent.getID()); -	msg->addUUID("SessionID",gAgent.getSessionID()); -	msg->nextBlock("Data"); -	msg->addUUID("GroupID",self->mGroupID); -	gAgent.sendReliableMessage(); -	*/ -	  }  void LLPanelGroupNotices::clearNoticeList()  {  	mPrevSelectedNotice = mNoticesList->getStringUUIDSelectedItem();  	mNoticesList->deleteAllItems(); +	mKnownNoticeIds.clear();  }  void LLPanelGroupNotices::onClickRefreshNotices(void* data) @@ -541,13 +531,14 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg)  			return;  		} -		//with some network delays we can receive notice list more then once... -		//so add only unique notices -		S32 pos = mNoticesList->getItemIndex(id); +        // Due to some network delays we can receive notice list more than once... +        // So add only unique notices +        if (mKnownNoticeIds.find(id) != mKnownNoticeIds.end()) +        { +            // If items with this ID already in the list - skip it +            continue; +        } -		if(pos!=-1)//if items with this ID already in the list - skip it -			continue; -			  		msg->getString("Data","Subject",subj,i);  		msg->getString("Data","FromName",name,i);  		msg->getBOOL("Data","HasAttachment",has_attachment,i); @@ -582,6 +573,7 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg)  		row["columns"][4]["value"] = llformat( "%u", timestamp);  		mNoticesList->addElement(row, ADD_BOTTOM); +		mKnownNoticeIds.insert(id);  	}  	mNoticesList->setNeedsSort(save_sort); diff --git a/indra/newview/llpanelgroupnotices.h b/indra/newview/llpanelgroupnotices.h index 46c8c241c6..55319cb9ae 100644 --- a/indra/newview/llpanelgroupnotices.h +++ b/indra/newview/llpanelgroupnotices.h @@ -110,6 +110,7 @@ private:  	LLIconCtrl		 *mViewInventoryIcon;  	LLScrollListCtrl *mNoticesList; +    std::set<LLUUID>  mKnownNoticeIds; // Dupplicate avoidance, to avoid searching and inserting dupplciates into mNoticesList  	std::string		mNoNoticesStr; | 
