diff options
| author | Kent Quirk <q@lindenlab.com> | 2010-03-19 12:05:15 -0400 | 
|---|---|---|
| committer | Kent Quirk <q@lindenlab.com> | 2010-03-19 12:05:15 -0400 | 
| commit | 1e50e4a13a37a236470e088c32c40ff62d46d497 (patch) | |
| tree | 08c0d4ee106f40e8f2d11ab89df83bae7a6704f4 /indra/newview | |
| parent | 637105e5cf346e5a88fe5820f36f6233b404d5aa (diff) | |
| parent | 7d50a19d6cb46b60ba005280223522672736592d (diff) | |
Merge
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/llchiclet.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llimfloater.cpp | 16 | ||||
| -rw-r--r-- | indra/newview/llimview.cpp | 23 | ||||
| -rw-r--r-- | indra/newview/llimview.h | 11 | ||||
| -rw-r--r-- | indra/newview/llnotificationhandler.h | 5 | ||||
| -rw-r--r-- | indra/newview/llnotificationhandlerutil.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/llnotificationofferhandler.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/lltoastnotifypanel.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llviewermessage.cpp | 3 | 
9 files changed, 66 insertions, 10 deletions
| diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 8efa814a2e..1f92686a43 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -1137,7 +1137,7 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){  	S32 unread = data["participant_unread"].asInteger();  	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id); -	if (im_floater && im_floater->getVisible()) +	if (im_floater && im_floater->getVisible() && im_floater->hasFocus())  	{  		unread = 0;  	} diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index f0e195c37a..91f4f57e54 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -128,6 +128,11 @@ void LLIMFloater::onFocusReceived()  	LLIMModel::getInstance()->setActiveSessionID(mSessionID);  	LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true); + +	if (getVisible()) +	{ +		LLIMModel::instance().sendNoUnreadMessages(mSessionID); +	}  }  // virtual @@ -609,7 +614,16 @@ void LLIMFloater::updateMessages()  	bool use_plain_text_chat_history = gSavedSettings.getBOOL("PlainTextChatHistory");  	std::list<LLSD> messages; -	LLIMModel::instance().getMessages(mSessionID, messages, mLastMessageIndex+1); + +	// we shouldn't reset unread message counters if IM floater doesn't have focus +	if (hasFocus()) +	{ +		LLIMModel::instance().getMessages(mSessionID, messages, mLastMessageIndex+1); +	} +	else +	{ +		LLIMModel::instance().getMessagesSilently(mSessionID, messages, mLastMessageIndex+1); +	}  	if (messages.size())  	{ diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 6ce06adc80..7a4febec20 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -608,10 +608,10 @@ bool LLIMModel::clearSession(const LLUUID& session_id)  	return true;  } -void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index) +void LLIMModel::getMessagesSilently(const LLUUID& session_id, std::list<LLSD>& messages, int start_index)  {  	LLIMSession* session = findIMSession(session_id); -	if (!session)  +	if (!session)  	{  		llwarns << "session " << session_id << "does not exist " << llendl;  		return; @@ -619,7 +619,7 @@ void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages,  	int i = session->mMsgs.size() - start_index; -	for (std::list<LLSD>::iterator iter = session->mMsgs.begin();  +	for (std::list<LLSD>::iterator iter = session->mMsgs.begin();  		iter != session->mMsgs.end() && i > 0;  		iter++)  	{ @@ -628,6 +628,16 @@ void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages,  		messages.push_back(*iter);  		i--;  	} +} + +void LLIMModel::sendNoUnreadMessages(const LLUUID& session_id) +{ +	LLIMSession* session = findIMSession(session_id); +	if (!session) +	{ +		llwarns << "session " << session_id << "does not exist " << llendl; +		return; +	}  	session->mNumUnread = 0;  	session->mParticipantUnreadMessageCount = 0; @@ -639,6 +649,13 @@ void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages,  	mNoUnreadMsgsSignal(arg);  } +void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index) +{ +	getMessagesSilently(session_id, messages, start_index); + +	sendNoUnreadMessages(session_id); +} +  bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text) {  	LLIMSession* session = findIMSession(session_id); diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index e7404074e0..f1693d0e17 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -178,6 +178,17 @@ public:  	bool clearSession(const LLUUID& session_id);  	/** +	 * Populate supplied std::list with messages starting from index specified by start_index without +	 * emitting no unread messages signal. +	 */ +	void getMessagesSilently(const LLUUID& session_id, std::list<LLSD>& messages, int start_index = 0); + +	/** +	 * Sends no unread messages signal. +	 */ +	void sendNoUnreadMessages(const LLUUID& session_id); + +	/**  	 * Populate supplied std::list with messages starting from index specified by start_index  	 */  	void getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index = 0); diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index 62008b91a0..1dc0e414a2 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -291,6 +291,11 @@ public:  	static bool canAddNotifPanelToIM(const LLNotificationPtr& notification);  	/** +	 * Checks whether notification can be used multiple times or not. +	 */ +	static bool isNotificationReusable(const LLNotificationPtr& notification); + +	/**  	 * Checks if passed notification can create IM session and be written into it.  	 *  	 * This method uses canLogToIM() & canSpawnIMSession(). diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index 55e0f33121..d3ad61128d 100644 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -177,6 +177,14 @@ bool LLHandlerUtil::canAddNotifPanelToIM(const LLNotificationPtr& notification)  }  // static +bool LLHandlerUtil::isNotificationReusable(const LLNotificationPtr& notification) +{ +	return OFFER_FRIENDSHIP == notification->getName() +		|| USER_GIVE_ITEM == notification->getName() +		|| TELEPORT_OFFERED == notification->getName(); +} + +// static  bool LLHandlerUtil::canSpawnSessionAndLogToIM(const LLNotificationPtr& notification)  {  	return canLogToIM(notification) && canSpawnIMSession(notification); diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index 0a42d8adbe..e93aec9d01 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -103,6 +103,8 @@ bool LLOfferHandler::processNotification(const LLSD& notify)  		}  		else  		{ +			notification->setReusable(LLHandlerUtil::isNotificationReusable(notification)); +  			LLUUID session_id;  			if (LLHandlerUtil::canSpawnIMSession(notification))  			{ diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index d7a3bc1462..907740a88e 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -205,7 +205,7 @@ mCloseNotificationOnDestroy(true)  	mInfoPanel->setFollowsAll();  	snapToMessageHeight(mTextBox, MAX_LENGTH); -	if(notification->getPayload()["reusable"].asBoolean()) +	if(notification->isReusable())  	{  		mButtonClickConnection = sButtonClickSignal.connect(  			boost::bind(&LLToastNotifyPanel::onToastPanelButtonClicked, this, _1, _2)); @@ -288,6 +288,8 @@ LLToastNotifyPanel::~LLToastNotifyPanel()  	std::for_each(mBtnCallbackData.begin(), mBtnCallbackData.end(), DeletePointer());  	if (mCloseNotificationOnDestroy && LLNotificationsUtil::find(mNotification->getID()) != NULL)  	{ +		// let reusable notification be deleted +		mNotification->setReusable(false);  		LLNotifications::getInstance()->cancel(mNotification);  	}  } @@ -473,7 +475,7 @@ void LLToastNotifyPanel::onClickButton(void* data)  		response[button_name] = true;  	} -	bool is_reusable = self->mNotification->getPayload()["reusable"].asBoolean(); +	bool is_reusable = self->mNotification->isReusable();  	// When we call respond(), LLOfferInfo will delete itself in inventory_offer_callback(),   	// lets copy it while it's still valid.  	LLOfferInfo* old_info = static_cast<LLOfferInfo*>(self->mNotification->getResponder()); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 7ecff4c2d8..3d0dfbed40 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1590,7 +1590,6 @@ void inventory_offer_handler(LLOfferInfo* info)  	}  	else // Agent -> Agent Inventory Offer  	{ -		payload["reusable"] = true;  		p.responder = info;  		// Note: sets inventory_offer_callback as the callback  		// *TODO fix memory leak @@ -2323,7 +2322,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				payload["from_id"] = from_id;  				payload["lure_id"] = session_id;  				payload["godlike"] = FALSE; -				payload["reusable"] = true;  				LLNotificationsUtil::add("TeleportOffered", args, payload);  			}  		} @@ -2392,7 +2390,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				}  				else  				{ -					payload["reusable"] = true;  					args["[MESSAGE]"] = message;  				        LLNotificationsUtil::add("OfferFriendship", args, payload);  				} | 
