diff options
| -rw-r--r-- | indra/newview/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | indra/newview/llavataractions.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llimview.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llnotificationhandler.h | 24 | ||||
| -rw-r--r-- | indra/newview/llnotificationmanager.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/llnotificationofferhandler.cpp | 153 | ||||
| -rw-r--r-- | indra/newview/llnotificationscripthandler.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/llscreenchannel.h | 3 | ||||
| -rw-r--r-- | indra/newview/llsyswellwindow.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/notifications.xml | 8 | 
10 files changed, 193 insertions, 10 deletions
| diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index a54db070e6..b8d27b5e7b 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -290,6 +290,7 @@ set(viewer_SOURCE_FILES      llnotificationalerthandler.cpp      llnotificationgrouphandler.cpp      llnotificationmanager.cpp +    llnotificationofferhandler.cpp      llnotificationscripthandler.cpp      llnotificationtiphandler.cpp      llnotify.cpp diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 97e0aa5f46..67ffe54b7e 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -57,6 +57,7 @@  #include "llviewerobjectlist.h"  #include "llviewermessage.h"	// for handle_lure  #include "llviewerregion.h" +#include "llimfloater.h"  // static @@ -176,7 +177,8 @@ void LLAvatarActions::startIM(const LLUUID& id)  	std::string name;  	gCacheName->getFullName(id, name); -	gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id); +	LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id); +	LLIMFloater::show(session_id);  	make_ui_sound("UISndStartIM");  } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 66a3e3e85c..7e8701bf21 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1604,7 +1604,6 @@ LLUUID LLIMMgr::addSession(  		LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids);  	} -	LLIMFloater::show(session_id);  	//*TODO remove this "floater" thing when Communicate Floater's gone  	LLFloaterIMPanel* floater = findFloaterBySession(session_id); diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index cd4e640ec4..23998a0e5d 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -53,7 +53,8 @@ typedef enum e_notification_type  	NT_GROUPCHAT,   	NT_NEARBYCHAT,   	NT_ALERT, -	NT_ALERTMODAL +	NT_ALERTMODAL, +	NT_OFFER  } ENotificationType;  /** @@ -231,6 +232,27 @@ protected:  	bool	mIsModal;  }; +/** + * Handler for offers notices. + * It manages life time of offer notices. + */ +class LLOfferHandler : public LLSysHandler +{ +public: +	LLOfferHandler(e_notification_type type, const LLSD& id); +	virtual ~LLOfferHandler(); + +	// base interface functions +	virtual bool processNotification(const LLSD& notify); + +protected: +	virtual void onDeleteToast(LLToast* toast); +	virtual void initChannel(); + +	// own handlers +	void onRejectToast(LLUUID& id); +}; +  }  #endif diff --git a/indra/newview/llnotificationmanager.cpp b/indra/newview/llnotificationmanager.cpp index 81a6b32917..1083cf3634 100644 --- a/indra/newview/llnotificationmanager.cpp +++ b/indra/newview/llnotificationmanager.cpp @@ -63,6 +63,7 @@ void LLNotificationManager::init()  	LLNotificationChannel::buildChannel("Alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert"));  	LLNotificationChannel::buildChannel("AlertModal", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alertmodal"));  	LLNotificationChannel::buildChannel("IM Notifications", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "notifytoast")); +	LLNotificationChannel::buildChannel("Offer", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "offer"));  	LLNotifications::instance().getChannel("Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));  	LLNotifications::instance().getChannel("NotificationTips")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); @@ -70,6 +71,7 @@ void LLNotificationManager::init()  	LLNotifications::instance().getChannel("Alerts")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));  	LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));  	LLNotifications::instance().getChannel("IM Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); +	LLNotifications::instance().getChannel("Offer")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));  	mNotifyHandlers["notify"] = boost::shared_ptr<LLEventHandler>(new LLScriptHandler(NT_NOTIFY, LLSD()));  	mNotifyHandlers["notifytip"] =  boost::shared_ptr<LLEventHandler>(new LLTipHandler(NT_NOTIFY, LLSD())); @@ -80,6 +82,7 @@ void LLNotificationManager::init()  	mNotifyHandlers["notifytoast"] = boost::shared_ptr<LLEventHandler>(new LLIMHandler(NT_IMCHAT, LLSD()));  	mNotifyHandlers["nearbychat"] = boost::shared_ptr<LLEventHandler>(new LLNearbyChatHandler(NT_NEARBYCHAT, LLSD())); +	mNotifyHandlers["offer"] = boost::shared_ptr<LLEventHandler>(new LLOfferHandler(NT_OFFER, LLSD()));  }  //-------------------------------------------------------------------------- diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp new file mode 100644 index 0000000000..8e3a44682c --- /dev/null +++ b/indra/newview/llnotificationofferhandler.cpp @@ -0,0 +1,153 @@ +/** + * @file llnotificationofferhandler.cpp + * @brief Notification Handler Class for Simple Notifications and Notification Tips + * + * $LicenseInfo:firstyear=2000&license=viewergpl$ + * + * Copyright (c) 2000-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + + +#include "llviewerprecompiledheaders.h" // must be first include + +#include "llnotificationhandler.h" +#include "lltoastnotifypanel.h" +#include "llviewercontrol.h" +#include "llviewerwindow.h" +#include "llimview.h" +#include "llimfloater.h" +#include "llnotificationmanager.h" + +using namespace LLNotificationsUI; + +//-------------------------------------------------------------------------- +LLOfferHandler::LLOfferHandler(e_notification_type type, const LLSD& id) +{ +	mType = type; + +	// Getting a Channel for our notifications +	mChannel = LLChannelManager::getInstance()->createNotificationChannel(); +	mChannel->setControlHovering(true); + +	LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel); +	if(channel) +		channel->setOnRejectToastCallback(boost::bind(&LLOfferHandler::onRejectToast, this, _1)); +} + +//-------------------------------------------------------------------------- +LLOfferHandler::~LLOfferHandler() +{ +} + +//-------------------------------------------------------------------------- +void LLOfferHandler::initChannel() +{ +	S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); +	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); +	mChannel->init(channel_right_bound - channel_width, channel_right_bound); +} + +//-------------------------------------------------------------------------- +bool LLOfferHandler::processNotification(const LLSD& notify) +{ +	if(!mChannel) +	{ +		return false; +	} + +	LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID()); + +	if(!notification) +		return false; + +	// arrange a channel on a screen +	if(!mChannel->getVisible()) +	{ +		initChannel(); +	} + +	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change") +	{ +		// add message to IM +		LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, notification->getPayload()["from_id"]); +		if (!LLIMMgr::instance().hasSession(session_id)) +		{ +			// create session with faked type to avoid creating chicklets +			session_id = LLIMMgr::instance().addSession( +					notification->getSubstitutions()["NAME"], IM_NOTHING_SPECIAL, +					notification->getPayload()["from_id"]); +		} +		LLIMMgr::instance().addMessage(session_id, LLUUID(), +				notification->getSubstitutions()["NAME"], +				notification->getMessage()); + +		LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification); + +		LLToast::Params p; +		p.notif_id = notification->getID(); +		p.notification = notification; +		p.panel = notify_box; +		p.on_delete_toast = boost::bind(&LLOfferHandler::onDeleteToast, this, _1); + +		LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel); +		if(channel) +			channel->addToast(p); + +		// send a signal to the counter manager +		mNewNotificationSignal(); +	} +	else if (notify["sigtype"].asString() == "delete") +	{ +		mChannel->killToastByNotificationID(notification->getID()); +	} + +	return true; +} + +//-------------------------------------------------------------------------- + +void LLOfferHandler::onDeleteToast(LLToast* toast) +{ +	// send a signal to the counter manager +	mDelNotificationSignal(); + +	// send a signal to a listener to let him perform some action +	// in this case listener is a SysWellWindow and it will remove a corresponding item from its list +	mNotificationIDSignal(toast->getNotificationID()); +} + +//-------------------------------------------------------------------------- +void LLOfferHandler::onRejectToast(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/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp index 070af432d6..dac7a4ca3a 100644 --- a/indra/newview/llnotificationscripthandler.cpp +++ b/indra/newview/llnotificationscripthandler.cpp @@ -37,6 +37,7 @@  #include "lltoastnotifypanel.h"  #include "llviewercontrol.h"  #include "llviewerwindow.h" +#include "llnotificationmanager.h"  using namespace LLNotificationsUI; @@ -129,7 +130,9 @@ void LLScriptHandler::onRejectToast(LLUUID& id)  {  	LLNotificationPtr notification = LLNotifications::instance().find(id); -	if(notification) +	if (notification +			&& LLNotificationManager::getInstance()->getHandlerForNotification( +					notification->getType()) == this)  	{  		LLNotifications::instance().cancel(notification);  	} diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h index 987bc4b596..fd31690622 100644 --- a/indra/newview/llscreenchannel.h +++ b/indra/newview/llscreenchannel.h @@ -204,8 +204,7 @@ public:  	// signal on rejecting of a toast event  	typedef boost::function<void (LLUUID id)> reject_tost_callback_t;  	typedef boost::signals2::signal<void (LLUUID id)> reject_tost_signal_t; -	reject_tost_signal_t mRejectToastSignal;	 -	boost::signals2::connection setOnRejectToastCallback(reject_tost_callback_t cb) { return mRejectToastSignal.connect(cb); } +	reject_tost_signal_t mRejectToastSignal; boost::signals2::connection setOnRejectToastCallback(reject_tost_callback_t cb) { return mRejectToastSignal.connect(cb); }  private:  	struct ToastElem diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index c255418429..723ac0fc33 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -66,6 +66,7 @@ BOOL LLSysWellWindow::postBuild()  	// init connections to the list's update events  	connectListUpdaterToSignal("notify");  	connectListUpdaterToSignal("groupnotify"); +	connectListUpdaterToSignal("offer");  	// get a corresponding channel  	initChannel(); diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index babed28f10..f26a4d09d4 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4982,7 +4982,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a    <notification     icon="notify.tga"     name="UserGiveItem" -   type="notify"> +   type="offer">  [NAME] has given you a [OBJECTTYPE] named '[OBJECTNAME]'.      <form name="form">        <button @@ -5028,7 +5028,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a    <notification     icon="notify.tga"     name="TeleportOffered" -   type="notify"> +   type="offer">  [NAME] has offered to teleport you to their location:  [MESSAGE] @@ -5065,7 +5065,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a    <notification     icon="notify.tga"     name="OfferFriendship" -   type="notify"> +   type="offer">  [NAME] is offering friendship.  [MESSAGE] @@ -5105,7 +5105,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a    <notification     icon="notify.tga"     name="FriendshipAccepted" -   type="notify"> +   type="offer">  [NAME] accepted your friendship offer.    </notification> | 
