diff options
| author | Alexei Arabadji <aarabadji@productengine.com> | 2010-03-03 19:48:16 +0200 | 
|---|---|---|
| committer | Alexei Arabadji <aarabadji@productengine.com> | 2010-03-03 19:48:16 +0200 | 
| commit | 41c3b459f2fa381bdc3e79864ef917f833257274 (patch) | |
| tree | 8a9d0a54370ec168871fe7cce965431f85e13f2b | |
| parent | 66128f678465345850547d9906390f9bc3d3465d (diff) | |
fixed EXT-5685 “Duplicated 'user online/offline' toasts after coming back to
Viewer”,
implemented filtering of exclusive notifications;
--HG--
branch : product-engine
| -rw-r--r-- | indra/newview/llnotificationhandler.h | 9 | ||||
| -rw-r--r-- | indra/newview/llnotificationhandlerutil.cpp | 77 | ||||
| -rw-r--r-- | indra/newview/llnotificationtiphandler.cpp | 17 | ||||
| -rw-r--r-- | indra/newview/llscreenchannel.cpp | 5 | 
4 files changed, 106 insertions, 2 deletions
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index 0d5c431d75..a163b6fd62 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -122,9 +122,17 @@ protected:  class LLSysHandler : public LLEventHandler  {  public: +	LLSysHandler();  	virtual ~LLSysHandler() {};  	virtual bool processNotification(const LLSD& notify)=0; + +protected : +	static void init(); +	void removeExclusiveNotifications(const LLNotificationPtr& notif); + +	typedef std::list< std::set<std::string> > exclusive_notif_sets; +	static exclusive_notif_sets sExclusiveNotificationGroups;  };  /** @@ -171,6 +179,7 @@ public:  protected:  	virtual void onDeleteToast(LLToast* toast); +	virtual void onRejectToast(const LLUUID& id);  	virtual void initChannel();  }; diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index 9de9998cbd..546017f028 100644 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -43,6 +43,75 @@  using namespace LLNotificationsUI; +// static +std::list< std::set<std::string> > LLSysHandler::sExclusiveNotificationGroups; + +// static +void LLSysHandler::init() +{ +	std::set<std::string> online_offline_group; +	online_offline_group.insert("FriendOnline"); +	online_offline_group.insert("FriendOffline"); + +	sExclusiveNotificationGroups.push_back(online_offline_group); +} + +LLSysHandler::LLSysHandler() +{ +	if(sExclusiveNotificationGroups.empty()) +	{ +		init(); +	} +} + +void LLSysHandler::removeExclusiveNotifications(const LLNotificationPtr& notif) +{ +	LLScreenChannel* channel = dynamic_cast<LLScreenChannel *>(mChannel); +	if (channel == NULL) +	{ +		return; +	} + +	class ExclusiveMatcher: public LLScreenChannel::Matcher +	{ +	public: +		ExclusiveMatcher(const std::set<std::string>& excl_group, +				const std::string& from_name) : +			mExclGroup(excl_group), mFromName(from_name) +		{ +		} +		bool matches(const LLNotificationPtr notification) const +		{ +			for (std::set<std::string>::iterator it = mExclGroup.begin(); it +					!= mExclGroup.end(); it++) +			{ +				std::string from_name = LLHandlerUtil::getSubstitutionName(notification); +				if (notification->getName() == *it && from_name == mFromName) +				{ +					return true; +				} +			} +			return false; +		} +	private: +		const std::set<std::string>& mExclGroup; +		const std::string& mFromName; +	}; + + +	for (exclusive_notif_sets::iterator it = sExclusiveNotificationGroups.begin(); it +			!= sExclusiveNotificationGroups.end(); it++) +	{ +		std::set<std::string> group = *it; +		std::set<std::string>::iterator g_it = group.find(notif->getName()); +		if (g_it != group.end()) +		{ +			channel->killMatchedToasts(ExclusiveMatcher(group, +					LLHandlerUtil::getSubstitutionName(notif))); +		} +	} +} +  const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),  		REVOKED_MODIFY_RIGHTS("RevokedModifyRights"), OBJECT_GIVE_ITEM(  				"ObjectGiveItem"), OBJECT_GIVE_ITEM_UNKNOWN_USER( @@ -249,9 +318,15 @@ LLUUID LLHandlerUtil::spawnIMSession(const std::string& name, const LLUUID& from  // static  std::string LLHandlerUtil::getSubstitutionName(const LLNotificationPtr& notification)  { -	return notification->getSubstitutions().has("NAME") +	std::string res = notification->getSubstitutions().has("NAME")  		? notification->getSubstitutions()["NAME"]  		: notification->getSubstitutions()["[NAME]"]; +	if (res.empty()) +	{ +		LLUUID from_id = notification->getPayload()["FROM_ID"]; +		gCacheName->getFullName(from_id, res); +	} +	return res;  }  // static diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index be76959d07..4e2c5085ed 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -40,6 +40,7 @@  #include "lltoastnotifypanel.h"  #include "llviewercontrol.h"  #include "llviewerwindow.h" +#include "llnotificationmanager.h"  using namespace LLNotificationsUI; @@ -82,6 +83,10 @@ LLTipHandler::LLTipHandler(e_notification_type type, const LLSD& id)  	// Getting a Channel for our notifications  	mChannel = LLChannelManager::getInstance()->createNotificationChannel(); + +	LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel); +	if(channel) +		channel->setOnRejectToastCallback(boost::bind(&LLTipHandler::onRejectToast, this, _1));  }  //-------------------------------------------------------------------------- @@ -167,6 +172,8 @@ bool LLTipHandler::processNotification(const LLSD& notify)  		p.is_tip = true;  		p.can_be_stored = false; +		removeExclusiveNotifications(notification); +  		LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);  		if(channel)  			channel->addToast(p); @@ -185,4 +192,14 @@ void LLTipHandler::onDeleteToast(LLToast* toast)  //-------------------------------------------------------------------------- +void LLTipHandler::onRejectToast(const LLUUID& id) +{ +	LLNotificationPtr notification = LLNotifications::instance().find(id); +	if (notification +			&& LLNotificationManager::getInstance()->getHandlerForNotification( +					notification->getType()) == this) +	{ +		LLNotifications::instance().cancel(notification); +	} +} diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index c75d90be6f..a4426b370e 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -687,7 +687,10 @@ void LLNotificationsUI::LLScreenChannel::startFadingToasts()  	while (it != mToastList.end())  	{  		ToastElem& elem = *it; -		elem.toast->startFading(); +		if (elem.toast->getVisible()) +		{ +			elem.toast->startFading(); +		}  		++it;  	}  }  | 
