diff options
43 files changed, 521 insertions, 118 deletions
| diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 8145d6d347..52812dc050 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -713,6 +713,13 @@ void LLFloater::closeFloater(bool app_quitting)  			make_ui_sound("UISndWindowClose");  		} +        //If floater is a dependent, remove it from parent (dependee) +        LLFloater* dependee = mDependeeHandle.get(); +        if (dependee) +        { +            dependee->removeDependentFloater(this); +        } +  		// now close dependent floater  		for(handle_set_iter_t dependent_it = mDependents.begin();  			dependent_it != mDependents.end(); ) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index ab1ea6bdbc..b98fea7032 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1639,6 +1639,39 @@        <key>Value</key>        <string />      </map> +    <key>ContextConeInAlpha</key> +    <map> +      <key>Comment</key> +      <string>Cone In Alpha</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map> +    <key>ContextConeOutAlpha</key> +    <map> +      <key>Comment</key> +      <string>Cone Out Alpha</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>ContextConeFadeTime</key> +    <map> +      <key>Comment</key> +      <string>Cone Fade Time</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>.08</real> +    </map>      <key>ConversationHistoryPageSize</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 08a1a237f5..4dacde4792 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1834,7 +1834,10 @@ bool LLAppViewer::cleanup()  	LLMuteList::getInstance()->cache(gAgent.getID());  	//save call log list -	LLConversationLog::instance().cache(); +	if (gSavedPerAccountSettings.getBOOL("LogInstantMessages")) +	{ +		LLConversationLog::instance().cache(); +	}  	if (mPurgeOnExit)  	{ diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 93e8b9ca40..42a0376774 100755 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -744,12 +744,13 @@ std::set<LLUUID> LLAvatarActions::getInventorySelectedUUIDs()  }  //static -void LLAvatarActions::shareWithAvatars() +void LLAvatarActions::shareWithAvatars(LLView * panel)  {  	using namespace action_give_inventory; +    LLFloater* root_floater = gFloaterView->getParentFloater(panel);  	LLFloaterAvatarPicker* picker = -		LLFloaterAvatarPicker::show(boost::bind(give_inventory, _1, _2), TRUE, FALSE); +		LLFloaterAvatarPicker::show(boost::bind(give_inventory, _1, _2), TRUE, FALSE, FALSE, root_floater->getName());  	if (!picker)  	{  		return; @@ -757,6 +758,11 @@ void LLAvatarActions::shareWithAvatars()  	picker->setOkBtnEnableCb(boost::bind(is_give_inventory_acceptable));  	picker->openFriendsTab(); +     +    if (root_floater) +    { +        root_floater->addDependentFloater(picker); +    }  	LLNotificationsUtil::add("ShareNotification");  } diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index 259e87c336..473b9cecc3 100644 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -37,6 +37,7 @@  class LLAvatarName;  class LLInventoryPanel;  class LLFloater; +class LLView;  /**   * Friend-related actions (add, remove, offer teleport, etc) @@ -117,7 +118,7 @@ public:  	/**  	 * Share items with the picked avatars.  	 */ -	static void shareWithAvatars(); +	static void shareWithAvatars(LLView * panel);  	/**  	 * Block/unblock the avatar. diff --git a/indra/newview/llconversationlog.cpp b/indra/newview/llconversationlog.cpp index 486cea4064..7db6a93709 100644 --- a/indra/newview/llconversationlog.cpp +++ b/indra/newview/llconversationlog.cpp @@ -33,7 +33,8 @@ struct Conversation_params  {  	Conversation_params(time_t time)  	:	mTime(time), -		mTimestamp(LLConversation::createTimestamp(time)) +		mTimestamp(LLConversation::createTimestamp(time)), +		mIsConversationPast(true)  	{}  	time_t		mTime; @@ -44,6 +45,7 @@ struct Conversation_params  	LLUUID		mSessionID;  	LLUUID		mParticipantID;  	bool		mIsVoice; +	bool		mIsConversationPast;  	bool		mHasOfflineIMs;  }; @@ -60,6 +62,7 @@ LLConversation::LLConversation(const Conversation_params& params)  	mSessionID(params.mSessionID),  	mParticipantID(params.mParticipantID),  	mIsVoice(params.mIsVoice), +	mIsConversationPast(params.mIsConversationPast),  	mHasOfflineIMs(params.mHasOfflineIMs)  {  	setListenIMFloaterOpened(); @@ -74,6 +77,7 @@ LLConversation::LLConversation(const LLIMModel::LLIMSession& session)  	mSessionID(session.mSessionID),  	mParticipantID(session.mOtherParticipantID),  	mIsVoice(session.mStartedAsIMCall), +	mIsConversationPast(false),  	mHasOfflineIMs(session.mHasOfflineMessage)  {  	setListenIMFloaterOpened(); @@ -89,6 +93,7 @@ LLConversation::LLConversation(const LLConversation& conversation)  	mSessionID			= conversation.getSessionID();  	mParticipantID		= conversation.getParticipantID();  	mIsVoice			= conversation.isVoice(); +	mIsConversationPast = conversation.isConversationPast();  	mHasOfflineIMs		= conversation.hasOfflineMessages();  	setListenIMFloaterOpened(); @@ -99,6 +104,14 @@ LLConversation::~LLConversation()  	mIMFloaterShowedConnection.disconnect();  } +void LLConversation::setIsVoice(bool is_voice) +{ +	if (mIsConversationPast) +		return; + +	mIsVoice = is_voice; +} +  void LLConversation::onIMFloaterShown(const LLUUID& session_id)  {  	if (mSessionID == session_id) @@ -172,11 +185,34 @@ LLConversationLog::LLConversationLog()  {  	loadFromFile(getFileName()); -	LLIMMgr::instance().addSessionObserver(this); -	 +	LLControlVariable* ctrl = gSavedPerAccountSettings.getControl("LogInstantMessages").get(); +	if (ctrl) +	{ +		ctrl->getSignal()->connect(boost::bind(&LLConversationLog::observeIMSession, this)); + +		if (ctrl->getValue().asBoolean()) +		{ +			LLIMMgr::instance().addSessionObserver(this); +		} +	} +  	mFriendObserver = new LLConversationLogFriendObserver;  	LLAvatarTracker::instance().addObserver(mFriendObserver); +  } + +void LLConversationLog::observeIMSession() +{ +	if (gSavedPerAccountSettings.getBOOL("LogInstantMessages")) +	{ +		LLIMMgr::instance().addSessionObserver(this); +	} +	else +	{ +		LLIMMgr::instance().removeSessionObserver(this); +	} +} +  void LLConversationLog::logConversation(const LLConversation& conversation)  {  	mConversations.push_back(conversation); @@ -228,6 +264,21 @@ void LLConversationLog::sessionAdded(const LLUUID& session_id, const std::string  	{  		LLConversation conversation(*session);  		LLConversationLog::instance().logConversation(conversation); +		session->mVoiceChannel->setStateChangedCallback(boost::bind(&LLConversationLog::onVoiceChannelConnected, this, _5, _2)); +	} +} + +void LLConversationLog::sessionRemoved(const LLUUID& session_id) +{ +	conversations_vec_t::reverse_iterator rev_iter = mConversations.rbegin(); + +	for (; rev_iter != mConversations.rend(); ++rev_iter) +	{ +		if (rev_iter->getSessionID() == session_id && !rev_iter->isConversationPast()) +		{ +			rev_iter->setIsPast(true); +			return; // return here because only one session with session_id may be active +		}  	}  } @@ -350,3 +401,27 @@ void LLConversationLog::notifyObservers()  		(*iter)->changed();  	}  } + +void LLConversationLog::notifyPrticularConversationObservers(const LLUUID& session_id, U32 mask) +{ +	std::set<LLConversationLogObserver*>::const_iterator iter = mObservers.begin(); +	for (; iter != mObservers.end(); ++iter) +	{ +		(*iter)->changed(session_id, mask); +	} +} + +void LLConversationLog::onVoiceChannelConnected(const LLUUID& session_id, const LLVoiceChannel::EState& state) +{ +	conversations_vec_t::reverse_iterator rev_iter = mConversations.rbegin(); + +	for (; rev_iter != mConversations.rend(); ++rev_iter) +	{ +		if (rev_iter->getSessionID() == session_id && !rev_iter->isConversationPast() && LLVoiceChannel::STATE_CALL_STARTED == state) +		{ +			rev_iter->setIsVoice(true); +			notifyPrticularConversationObservers(session_id, LLConversationLogObserver::VOICE_STATE); +			return; // return here because only one session with session_id may be active +		} +	} +} diff --git a/indra/newview/llconversationlog.h b/indra/newview/llconversationlog.h index a7457d55e3..9fd54c61c9 100644 --- a/indra/newview/llconversationlog.h +++ b/indra/newview/llconversationlog.h @@ -57,8 +57,12 @@ public:  	const std::string&	getTimestamp()			const	{ return mTimestamp; }  	const time_t&		getTime()				const	{ return mTime; }  	bool				isVoice()				const	{ return mIsVoice; } +	bool				isConversationPast()	const	{ return mIsConversationPast; }  	bool				hasOfflineMessages()	const	{ return mHasOfflineIMs; } +	void	setIsVoice(bool is_voice); +	void	setIsPast (bool is_past) { mIsConversationPast = is_past; } +  	/*  	 * Resets flag of unread offline message to false when im floater with this conversation is opened.  	 */ @@ -87,6 +91,7 @@ private:  	LLUUID			mParticipantID;  	bool			mIsVoice;  	bool			mHasOfflineIMs; +	bool			mIsConversationPast; // once session is finished conversation became past forever  	std::string		mTimestamp; // conversation start time in form of: mm/dd/yyyy hh:mm  }; @@ -122,12 +127,14 @@ public:  	// LLIMSessionObserver triggers  	virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id); -	virtual void sessionVoiceOrIMStarted(const LLUUID& session_id){}							// Stub -	virtual void sessionRemoved(const LLUUID& session_id){}										// Stub -	virtual void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id){}	// Stub +	virtual void sessionRemoved(const LLUUID& session_id); +	virtual void sessionVoiceOrIMStarted(const LLUUID& session_id){};								// Stub +	virtual void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id){};	// Stub -	// Triggered by LLFriendObserver change  	void notifyObservers(); +	void notifyPrticularConversationObservers(const LLUUID& session_id, U32 mask); + +	void onVoiceChannelConnected(const LLUUID& session_id, const LLVoiceChannel::EState& state);  	/**  	 * public method which is called on viewer exit to save conversation log @@ -138,10 +145,11 @@ private:  	LLConversationLog(); +	void observeIMSession(); +  	/**  	 * constructs file name in which conversations log will be saved -	 * file name template: agentID.call_log. -	 * For example: a086icaa-782d-88d0-ae29-987a55c99sss.call_log +	 * file name is conversation.log  	 */  	std::string getFileName(); @@ -158,8 +166,15 @@ private:  class LLConversationLogObserver  {  public: + +	enum EConversationChange +		{ +			VOICE_STATE = 1 +		}; +  	virtual ~LLConversationLogObserver(){}  	virtual void changed() = 0; +	virtual void changed(const LLUUID& session_id, U32 mask){};  };  #endif /* LLCONVERSATIONLOG_H_ */ diff --git a/indra/newview/llconversationloglist.cpp b/indra/newview/llconversationloglist.cpp index 257ec082a5..d39e090c22 100644 --- a/indra/newview/llconversationloglist.cpp +++ b/indra/newview/llconversationloglist.cpp @@ -141,6 +141,28 @@ void LLConversationLogList::changed()  	refresh();  } +void LLConversationLogList::changed(const LLUUID& session_id, U32 mask) +{ +	if (mask & LLConversationLogObserver::VOICE_STATE) +	{ +		std::vector<LLPanel*> panels; +		LLFlatListViewEx::getItems(panels); + +		std::vector<LLPanel*>::iterator iter = panels.begin(); + +		for (; iter != panels.end(); ++iter) +		{ +			LLConversationLogListItem* item = dynamic_cast<LLConversationLogListItem*>(*iter); + +			if (item && session_id == item->getConversation()->getSessionID() && !item->getConversation()->isConversationPast()) +			{ +				item->initIcons(); +				return; +			} +		} +	} +} +  void LLConversationLogList::addNewItem(const LLConversation* conversation)  {  	LLConversationLogListItem* item = new LLConversationLogListItem(&*conversation); @@ -241,15 +263,18 @@ void LLConversationLogList::onCustomAction(const LLSD& userdata)  	{  		LLAvatarActions::offerTeleport(selected_id);  	} -	else if("add_rem_friend" == command_name) +	else if("add_friend" == command_name)  	{ -		if (LLAvatarActions::isFriend(selected_id)) +		if (!LLAvatarActions::isFriend(selected_id))  		{ -			LLAvatarActions::removeFriendDialog(selected_id); +			LLAvatarActions::requestFriendshipDialog(selected_id);  		} -		else +	} +	else if("remove_friend" == command_name) +	{ +		if (LLAvatarActions::isFriend(selected_id))  		{ -			LLAvatarActions::requestFriendshipDialog(selected_id); +			LLAvatarActions::removeFriendDialog(selected_id);  		}  	}  	else if ("invite_to_group" == command_name) @@ -336,6 +361,10 @@ bool LLConversationLogList::isActionChecked(const LLSD& userdata)  	{  		return is_p2p && LLAvatarActions::isFriend(selected_id);  	} +	else if ("is_not_friend" == command_name) +	{ +		return is_p2p && !LLAvatarActions::isFriend(selected_id); +	}  	return false;  } diff --git a/indra/newview/llconversationloglist.h b/indra/newview/llconversationloglist.h index dff34a74c6..5e7fc0a9fb 100644 --- a/indra/newview/llconversationloglist.h +++ b/indra/newview/llconversationloglist.h @@ -68,6 +68,7 @@ public:  	 * Changes from LLConversationLogObserver  	 */  	virtual void changed(); +	virtual void changed(const LLUUID& session_id, U32 mask);  private: diff --git a/indra/newview/llconversationloglistitem.h b/indra/newview/llconversationloglistitem.h index 8943e11604..2aaafa0fba 100644 --- a/indra/newview/llconversationloglistitem.h +++ b/indra/newview/llconversationloglistitem.h @@ -64,10 +64,10 @@ public:  	void onDoubleClick(); -private: -  	void initIcons(); +private: +  	const LLConversation* mConversation;  	LLTextBox*		mConversationName; diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index 47acdf7057..6ada809cdb 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -49,6 +49,8 @@  #include "llscrolllistcell.h"  #include "lltabcontainer.h"  #include "lluictrlfactory.h" +#include "llfocusmgr.h" +#include "lldraghandle.h"  #include "message.h"  //#include "llsdserialize.h" @@ -59,11 +61,13 @@ static std::map<LLUUID, LLAvatarName> sAvatarNameMap;  LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(select_callback_t callback,  												   BOOL allow_multiple,  												   BOOL closeOnSelect, -												   BOOL skip_agent) +												   BOOL skip_agent, +                                                   const std::string& name, +                                                   LLView * frustumOrigin)  {  	// *TODO: Use a key to allow this not to be an effective singleton  	LLFloaterAvatarPicker* floater =  -		LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker"); +		LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker", LLSD(name));  	if (!floater)  	{  		llwarns << "Cannot instantiate avatar picker" << llendl; @@ -85,6 +89,11 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(select_callback_t callback,  		floater->getChild<LLButton>("cancel_btn")->setLabel(close_string);  	} +    if(frustumOrigin) +    { +        floater->mFrustumOrigin = frustumOrigin->getHandle(); +    } +  	return floater;  } @@ -93,9 +102,17 @@ LLFloaterAvatarPicker::LLFloaterAvatarPicker(const LLSD& key)    : LLFloater(key),  	mNumResultsReturned(0),  	mNearMeListComplete(FALSE), -	mCloseOnSelect(FALSE) +	mCloseOnSelect(FALSE), +    mContextConeOpacity	(0.f), +    mContextConeInAlpha(0.f), +    mContextConeOutAlpha(0.f), +    mContextConeFadeTime(0.f)  {  	mCommitCallbackRegistrar.add("Refresh.FriendList", boost::bind(&LLFloaterAvatarPicker::populateFriend, this)); + +    mContextConeInAlpha = gSavedSettings.getF32("ContextConeInAlpha"); +    mContextConeOutAlpha = gSavedSettings.getF32("ContextConeOutAlpha"); +    mContextConeFadeTime = gSavedSettings.getF32("ContextConeFadeTime");  }  BOOL LLFloaterAvatarPicker::postBuild() @@ -340,8 +357,67 @@ void LLFloaterAvatarPicker::populateFriend()  	friends_scroller->sortByColumnIndex(0, TRUE);  } +void LLFloaterAvatarPicker::drawFrustum() +{ +    if(mFrustumOrigin.get()) +    { +        LLView * frustumOrigin = mFrustumOrigin.get(); +        LLRect origin_rect; +        frustumOrigin->localRectToOtherView(frustumOrigin->getLocalRect(), &origin_rect, this); +        // draw context cone connecting color picker with color swatch in parent floater +        LLRect local_rect = getLocalRect(); +        if (hasFocus() && frustumOrigin->isInVisibleChain() && mContextConeOpacity > 0.001f) +        { +            gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +            LLGLEnable(GL_CULL_FACE); +            gGL.begin(LLRender::QUADS); +            { +                gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); +                gGL.vertex2i(origin_rect.mLeft, origin_rect.mTop); +                gGL.vertex2i(origin_rect.mRight, origin_rect.mTop); +                gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); +                gGL.vertex2i(local_rect.mRight, local_rect.mTop); +                gGL.vertex2i(local_rect.mLeft, local_rect.mTop); + +                gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); +                gGL.vertex2i(local_rect.mLeft, local_rect.mTop); +                gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); +                gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); +                gGL.vertex2i(origin_rect.mLeft, origin_rect.mBottom); +                gGL.vertex2i(origin_rect.mLeft, origin_rect.mTop); + +                gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); +                gGL.vertex2i(local_rect.mRight, local_rect.mBottom); +                gGL.vertex2i(local_rect.mRight, local_rect.mTop); +                gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); +                gGL.vertex2i(origin_rect.mRight, origin_rect.mTop); +                gGL.vertex2i(origin_rect.mRight, origin_rect.mBottom); + +                gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); +                gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); +                gGL.vertex2i(local_rect.mRight, local_rect.mBottom); +                gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); +                gGL.vertex2i(origin_rect.mRight, origin_rect.mBottom); +                gGL.vertex2i(origin_rect.mLeft, origin_rect.mBottom); +            } +            gGL.end(); +        } + +        if (gFocusMgr.childHasMouseCapture(getDragHandle())) +        { +            mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), LLCriticalDamp::getInterpolant(mContextConeFadeTime)); +        } +        else +        { +            mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLCriticalDamp::getInterpolant(mContextConeFadeTime)); +        } +    } +} +  void LLFloaterAvatarPicker::draw()  { +    drawFrustum(); +  	// sometimes it is hard to determine when Select/Ok button should be disabled (see LLAvatarActions::shareWithAvatars).  	// lets check this via mOkButtonValidateSignal callback periodically.  	static LLFrameTimer timer; @@ -384,8 +460,9 @@ class LLAvatarPickerResponder : public LLHTTPClient::Responder  {  public:  	LLUUID mQueryID; +    std::string mName; -	LLAvatarPickerResponder(const LLUUID& id) : mQueryID(id) { } +	LLAvatarPickerResponder(const LLUUID& id, const std::string& name) : mQueryID(id), mName(name) { }  	/*virtual*/ void completed(U32 status, const std::string& reason, const LLSD& content)  	{ @@ -398,7 +475,7 @@ public:  		if (isGoodStatus(status) || status == 400)  		{  			LLFloaterAvatarPicker* floater = -				LLFloaterReg::findTypedInstance<LLFloaterAvatarPicker>("avatar_picker"); +				LLFloaterReg::findTypedInstance<LLFloaterAvatarPicker>("avatar_picker", mName);  			if (floater)  			{  				floater->processResponse(mQueryID, content); @@ -441,7 +518,7 @@ void LLFloaterAvatarPicker::find()  		url += "?page_size=100&names=";  		url += LLURI::escape(text);  		llinfos << "avatar picker " << url << llendl; -		LLHTTPClient::get(url, new LLAvatarPickerResponder(mQueryID)); +		LLHTTPClient::get(url, new LLAvatarPickerResponder(mQueryID, getKey().asString()));  	}  	else  	{ diff --git a/indra/newview/llfloateravatarpicker.h b/indra/newview/llfloateravatarpicker.h index 7067cd7b3e..ed3e51c56f 100644 --- a/indra/newview/llfloateravatarpicker.h +++ b/indra/newview/llfloateravatarpicker.h @@ -34,7 +34,7 @@  class LLAvatarName;  class LLScrollListCtrl; -class LLFloaterAvatarPicker : public LLFloater +class LLFloaterAvatarPicker :public LLFloater  {  public:  	typedef boost::signals2::signal<bool(const uuid_vec_t&), boost_boolean_combiner> validate_signal_t; @@ -46,7 +46,9 @@ public:  	static LLFloaterAvatarPicker* show(select_callback_t callback,   									   BOOL allow_multiple = FALSE,  									   BOOL closeOnSelect = FALSE, -									   BOOL skip_agent = FALSE); +									   BOOL skip_agent = FALSE, +                                       const std::string& name = "", +                                       LLView * frustumOrigin = NULL);  	LLFloaterAvatarPicker(const LLSD& key);  	virtual ~LLFloaterAvatarPicker(); @@ -86,6 +88,7 @@ private:  	void setAllowMultiple(BOOL allow_multiple);  	LLScrollListCtrl* getActiveList(); +    void drawFrustum();  	virtual void draw();  	virtual BOOL handleKeyHere(KEY key, MASK mask); @@ -94,6 +97,11 @@ private:  	BOOL				mNearMeListComplete;  	BOOL				mCloseOnSelect;  	BOOL                mExcludeAgentFromSearchResults; +    LLHandle <LLView>   mFrustumOrigin; +    F32		            mContextConeOpacity; +    F32                 mContextConeInAlpha; +    F32                 mContextConeOutAlpha; +    F32                 mContextConeFadeTime;  	validate_signal_t mOkButtonValidateSignal;  	select_callback_t mSelectionCallback; diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp index 05d73c2416..3c230bc58c 100644 --- a/indra/newview/llfloatercolorpicker.cpp +++ b/indra/newview/llfloatercolorpicker.cpp @@ -62,10 +62,6 @@  #include <sstream>  #include <iomanip> -const F32 CONTEXT_CONE_IN_ALPHA = 0.0f; -const F32 CONTEXT_CONE_OUT_ALPHA = 1.f; -const F32 CONTEXT_FADE_TIME = 0.08f; -  //////////////////////////////////////////////////////////////////////////////  //  // Class LLFloaterColorPicker @@ -105,7 +101,10 @@ LLFloaterColorPicker::LLFloaterColorPicker (LLColorSwatchCtrl* swatch, BOOL show  	  mSwatch				( swatch ),  	  mActive				( TRUE ),  	  mCanApplyImmediately	( show_apply_immediate ), -	  mContextConeOpacity	( 0.f ) +	  mContextConeOpacity	( 0.f ), +      mContextConeInAlpha   ( 0.f ), +      mContextConeOutAlpha   ( 0.f ), +      mContextConeFadeTime   ( 0.f )  {  	buildFromFile ( "floater_color_picker.xml"); @@ -117,6 +116,10 @@ LLFloaterColorPicker::LLFloaterColorPicker (LLColorSwatchCtrl* swatch, BOOL show  		mApplyImmediateCheck->setEnabled(FALSE);  		mApplyImmediateCheck->set(FALSE);  	} + +    mContextConeInAlpha = gSavedSettings.getF32("ContextConeInAlpha"); +    mContextConeOutAlpha = gSavedSettings.getF32("ContextConeOutAlpha"); +    mContextConeFadeTime = gSavedSettings.getF32("ContextConeFadeTime");  }  LLFloaterColorPicker::~LLFloaterColorPicker() @@ -486,37 +489,37 @@ void LLFloaterColorPicker::draw()  	mSwatch->localRectToOtherView(mSwatch->getLocalRect(), &swatch_rect, this);  	// draw context cone connecting color picker with color swatch in parent floater  	LLRect local_rect = getLocalRect(); -	if (gFocusMgr.childHasKeyboardFocus(this) && mSwatch->isInVisibleChain() && mContextConeOpacity > 0.001f) +	if (hasFocus() && mSwatch->isInVisibleChain() && mContextConeOpacity > 0.001f)  	{  		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);  		LLGLEnable(GL_CULL_FACE);  		gGL.begin(LLRender::QUADS);  		{ -			gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity); +			gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);  			gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mTop);  			gGL.vertex2i(swatch_rect.mRight, swatch_rect.mTop); -			gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity); +			gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);  			gGL.vertex2i(local_rect.mRight, local_rect.mTop);  			gGL.vertex2i(local_rect.mLeft, local_rect.mTop); -			gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity); +			gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);  			gGL.vertex2i(local_rect.mLeft, local_rect.mTop);  			gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); -			gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity); +			gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);  			gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mBottom);  			gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mTop); -			gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity); +			gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);  			gGL.vertex2i(local_rect.mRight, local_rect.mBottom);  			gGL.vertex2i(local_rect.mRight, local_rect.mTop); -			gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity); +			gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);  			gGL.vertex2i(swatch_rect.mRight, swatch_rect.mTop);  			gGL.vertex2i(swatch_rect.mRight, swatch_rect.mBottom); -			gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity); +			gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);  			gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);  			gGL.vertex2i(local_rect.mRight, local_rect.mBottom); -			gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity); +			gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);  			gGL.vertex2i(swatch_rect.mRight, swatch_rect.mBottom);  			gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mBottom);  		} @@ -525,11 +528,12 @@ void LLFloaterColorPicker::draw()  	if (gFocusMgr.childHasMouseCapture(getDragHandle()))  	{ -		mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), LLCriticalDamp::getInterpolant(CONTEXT_FADE_TIME)); +		mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"),  +                                        LLCriticalDamp::getInterpolant(mContextConeFadeTime));  	}  	else  	{ -		mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLCriticalDamp::getInterpolant(CONTEXT_FADE_TIME)); +		mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLCriticalDamp::getInterpolant(mContextConeFadeTime));  	}  	mPipetteBtn->setToggleState(LLToolMgr::getInstance()->getCurrentTool() == LLToolPipette::getInstance()); diff --git a/indra/newview/llfloatercolorpicker.h b/indra/newview/llfloatercolorpicker.h index 8e387c4f7c..bab0617712 100644 --- a/indra/newview/llfloatercolorpicker.h +++ b/indra/newview/llfloatercolorpicker.h @@ -189,6 +189,10 @@ class LLFloaterColorPicker  		LLButton* mPipetteBtn;  		F32		  mContextConeOpacity; +        F32       mContextConeInAlpha; +        F32       mContextConeOutAlpha; +        F32       mContextConeFadeTime; +  };  #endif // LL_LLFLOATERCOLORPICKER_H diff --git a/indra/newview/llfloaterconversationlog.cpp b/indra/newview/llfloaterconversationlog.cpp index c77a9e74bb..4375ce5726 100644 --- a/indra/newview/llfloaterconversationlog.cpp +++ b/indra/newview/llfloaterconversationlog.cpp @@ -28,6 +28,7 @@  #include "llconversationloglist.h"  #include "llfiltereditor.h"  #include "llfloaterconversationlog.h" +#include "llfloaterreg.h"  #include "llmenubutton.h"  LLFloaterConversationLog::LLFloaterConversationLog(const LLSD& key) @@ -97,6 +98,10 @@ void LLFloaterConversationLog::onCustomAction (const LLSD& userdata)  	{  		mConversationLogList->toggleSortFriendsOnTop();  	} +	else if ("view_nearby_chat_history" == command_name) +	{ +		LLFloaterReg::showInstance("preview_conversation", LLSD(LLUUID::null), true); +	}  }  bool LLFloaterConversationLog::isActionEnabled(const LLSD& userdata) diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp index ae6f1441eb..7083fb987d 100644 --- a/indra/newview/llfloaterconversationpreview.cpp +++ b/indra/newview/llfloaterconversationpreview.cpp @@ -29,6 +29,7 @@  #include "llfloaterconversationpreview.h"  #include "llimview.h"  #include "lllineeditor.h" +#include "lltrans.h"  LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_id)  :	LLFloater(session_id), @@ -44,20 +45,28 @@ BOOL LLFloaterConversationPreview::postBuild()  	getChild<LLUICtrl>("more_history")->setCommitCallback(boost::bind(&LLFloaterConversationPreview::onMoreHistoryBtnClick, this));  	const LLConversation* conv = LLConversationLog::instance().getConversation(mSessionID); -	if (conv) -	{ -		std::string name = conv->getConversationName(); -		LLStringUtil::format_map_t args; -		args["[NAME]"] = name; -		std::string title = getString("Title", args); -		setTitle(title); +	std::string name; +	std::string file; -		getChild<LLLineEditor>("description")->setValue(name); +	if (mSessionID != LLUUID::null && conv) +	{ +		name = conv->getConversationName(); +		file = conv->getHistoryFileName(); +	} +	else +	{ +		name = LLTrans::getString("NearbyChatTitle"); +		file = "chat";  	} -	std::string file = conv->getHistoryFileName(); -	LLLogChat::loadChatHistory(file, mMessages, true); +	LLStringUtil::format_map_t args; +	args["[NAME]"] = name; +	std::string title = getString("Title", args); +	setTitle(title); + +	getChild<LLLineEditor>("description")->setValue(name); +	LLLogChat::loadChatHistory(file, mMessages, true);  	mCurrentPage = mMessages.size() / mPageSize;  	return LLFloater::postBuild(); @@ -68,7 +77,7 @@ void LLFloaterConversationPreview::draw()  	LLFloater::draw();  } -void LLFloaterConversationPreview::onOpen(const LLSD& session_id) +void LLFloaterConversationPreview::onOpen(const LLSD& key)  {  	showHistory();  } @@ -88,13 +97,8 @@ void LLFloaterConversationPreview::showHistory()  	int delta = 0;  	if (mCurrentPage)  	{ -		// stinson 08/28/2012 : This operation could be simplified using integer math with the mod (%) operator. -		//                      e.g. The following code should give the same output. -		//                           int remainder = mMessages.size() % mPageSize; -		//                           delta = (remainder == 0) ? 0 : (mPageSize - remainder); -		//                      Though without examining further, the remainder might be a more appropriate value. -		double num_of_pages = static_cast<double>(mMessages.size()) / static_cast<double>(mPageSize); -		delta = static_cast<int>((ceil(num_of_pages) - num_of_pages) * static_cast<double>(mPageSize)); +		int remainder = mMessages.size() % mPageSize; +		delta = (remainder == 0) ? 0 : (mPageSize - remainder);  	}  	std::advance(iter, (mCurrentPage * mPageSize) - delta); diff --git a/indra/newview/llfloaterconversationpreview.h b/indra/newview/llfloaterconversationpreview.h index 5105ef3702..2246a44761 100644 --- a/indra/newview/llfloaterconversationpreview.h +++ b/indra/newview/llfloaterconversationpreview.h @@ -39,7 +39,7 @@ public:  	virtual BOOL postBuild();  	virtual void draw(); -	virtual void onOpen(const LLSD& session_id); +	virtual void onOpen(const LLSD& key);  private:  	void onMoreHistoryBtnClick(); diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index fb905eae11..38abdcc830 100644 --- a/indra/newview/llfloatergodtools.cpp +++ b/indra/newview/llfloatergodtools.cpp @@ -1123,11 +1123,13 @@ bool LLPanelObjectTools::callbackSimWideDeletes( const LLSD& notification, const  void LLPanelObjectTools::onClickSet()  { -	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelObjectTools::callbackAvatarID, this, _1,_2)); +    LLView * button = findChild<LLButton>("Set Target"); +    LLFloater * root_floater = gFloaterView->getParentFloater(this); +	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelObjectTools::callbackAvatarID, this, _1,_2), FALSE, FALSE, FALSE, root_floater->getName(), button);  	// grandparent is a floater, which can have a dependent  	if (picker)  	{ -		gFloaterView->getParentFloater(this)->addDependentFloater(picker); +		root_floater->addDependentFloater(picker);  	}  } diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 55f3d548ec..4fc6684e8e 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2733,11 +2733,13 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)  void LLPanelLandAccess::onClickAddAccess()  { +    LLView * button = findChild<LLButton>("add_allowed"); +    LLFloater * root_floater = gFloaterView->getParentFloater(this);  	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( -		boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1)); +		boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1), FALSE, FALSE, FALSE, root_floater->getName(), button);  	if (picker)  	{ -		gFloaterView->getParentFloater(this)->addDependentFloater(picker); +		root_floater->addDependentFloater(picker);  	}  } @@ -2782,11 +2784,13 @@ void LLPanelLandAccess::onClickRemoveAccess(void* data)  // static  void LLPanelLandAccess::onClickAddBanned()  { +    LLView * button = findChild<LLButton>("add_banned"); +    LLFloater * root_floater = gFloaterView->getParentFloater(this);  	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( -		boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1)); +		boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1), FALSE, FALSE, FALSE, root_floater->getName(), button);  	if (picker)  	{ -		gFloaterView->getParentFloater(this)->addDependentFloater(picker); +		root_floater->addDependentFloater(picker);  	}  } diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index fe29bb38c7..e6b76159a1 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -647,8 +647,10 @@ void LLPanelRegionGeneralInfo::onClickKick()  	// this depends on the grandparent view being a floater  	// in order to set up floater dependency +    LLView * button = findChild<LLButton>("kick_btn");  	LLFloater* parent_floater = gFloaterView->getParentFloater(this); -	LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionGeneralInfo::onKickCommit, this, _1), FALSE, TRUE); +	LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionGeneralInfo::onKickCommit, this, _1),  +                                                                                FALSE, TRUE, FALSE, parent_floater->getName(), button);  	if (child_floater)  	{  		parent_floater->addDependentFloater(child_floater); @@ -924,7 +926,14 @@ BOOL LLPanelRegionDebugInfo::sendUpdate()  void LLPanelRegionDebugInfo::onClickChooseAvatar()  { -	LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionDebugInfo::callbackAvatarID, this, _1, _2), FALSE, TRUE); +    LLView * button = findChild<LLButton>("choose_avatar_btn"); +    LLFloater* parent_floater = gFloaterView->getParentFloater(this); +	LLFloater * child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionDebugInfo::callbackAvatarID, this, _1, _2),  +                                                                                    FALSE, TRUE, FALSE, parent_floater->getName(), button); +	if (child_floater) +	{ +		parent_floater->addDependentFloater(child_floater); +	}  } @@ -1470,8 +1479,10 @@ void LLPanelEstateInfo::onClickKickUser()  {  	// this depends on the grandparent view being a floater  	// in order to set up floater dependency +    LLView * button = findChild<LLButton>("kick_user_from_estate_btn");  	LLFloater* parent_floater = gFloaterView->getParentFloater(this); -	LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::onKickUserCommit, this, _1), FALSE, TRUE); +	LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::onKickUserCommit, this, _1),  +                                                                        FALSE, TRUE, FALSE, parent_floater->getName(), button);  	if (child_floater)  	{  		parent_floater->addDependentFloater(child_floater); @@ -1646,8 +1657,39 @@ bool LLPanelEstateInfo::accessAddCore2(const LLSD& notification, const LLSD& res  	}  	LLEstateAccessChangeInfo* change_info = new LLEstateAccessChangeInfo(notification["payload"]); +    //Get parent floater name +    LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); +    LLFloater* parent_floater = panel ? gFloaterView->getParentFloater(panel) : NULL; +    const std::string& parent_floater_name = parent_floater ? parent_floater->getName() : ""; +     +    //Determine the button that triggered opening of the avatar picker  +    //(so that a shadow frustum from the button to the avatar picker can be created) +    LLView * button = NULL; +    switch(change_info->mOperationFlag) +    { +        case ESTATE_ACCESS_ALLOWED_AGENT_ADD: +            button = panel->findChild<LLButton>("add_allowed_avatar_btn"); +            break; +             +        case ESTATE_ACCESS_BANNED_AGENT_ADD: +            button = panel->findChild<LLButton>("add_banned_avatar_btn"); +            break; +             +        case ESTATE_ACCESS_MANAGER_ADD: +            button = panel->findChild<LLButton>("add_estate_manager_btn"); +            break; +    } +  	// avatar picker yes multi-select, yes close-on-select -	LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::accessAddCore3, _1, (void*)change_info), TRUE, TRUE); +	LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::accessAddCore3, _1, (void*)change_info),  +                                                    TRUE, TRUE, FALSE, parent_floater_name, button); + +    //Allows the closed parent floater to close the child floater (avatar picker) +    if (child_floater) +    { +        parent_floater->addDependentFloater(child_floater); +    } +  	return false;  } diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 3ec1e372eb..cf2481f99a 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -285,10 +285,13 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)  void LLFloaterReporter::onClickSelectAbuser()  { -	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, this, _1, _2), FALSE, TRUE ); +    LLView * button = findChild<LLButton>("select_abuser", TRUE); + +    LLFloater * root_floater = gFloaterView->getParentFloater(this); +	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, this, _1, _2), FALSE, TRUE, FALSE, root_floater->getName(), button);  	if (picker)  	{ -		gFloaterView->getParentFloater(this)->addDependentFloater(picker); +		root_floater->addDependentFloater(picker);  	}  } diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp index 64c0dfa023..484ecbcd04 100644 --- a/indra/newview/llfloatersellland.cpp +++ b/indra/newview/llfloatersellland.cpp @@ -392,7 +392,8 @@ void LLFloaterSellLandUI::onChangeValue(LLUICtrl *ctrl, void *userdata)  void LLFloaterSellLandUI::doSelectAgent()  { -	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterSellLandUI::callbackAvatarPick, this, _1, _2), FALSE, TRUE); +    LLView * button = findChild<LLView>("sell_to_select_agent"); +	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterSellLandUI::callbackAvatarPick, this, _1, _2), FALSE, TRUE, FALSE, this->getName(), button);  	// grandparent is a floater, in order to set up dependency  	if (picker)  	{ diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 1c6445610f..a601561c62 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -359,7 +359,9 @@ BOOL LLIMFloater::postBuild()  void LLIMFloater::onAddButtonClicked()  { -	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLIMFloater::addSessionParticipants, this, _1), TRUE, TRUE); +    LLView * button = findChild<LLView>("toolbar_panel")->findChild<LLButton>("add_btn"); +    LLFloater* root_floater = gFloaterView->getParentFloater(this); +	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLIMFloater::addSessionParticipants, this, _1), TRUE, TRUE, FALSE, root_floater->getName(), button);  	if (!picker)  	{  		return; @@ -367,7 +369,7 @@ void LLIMFloater::onAddButtonClicked()  	// Need to disable 'ok' button when selected users are already in conversation.  	picker->setOkBtnEnableCb(boost::bind(&LLIMFloater::canAddSelectedToChat, this, _1)); -	LLFloater* root_floater = gFloaterView->getParentFloater(this); +	  	if (root_floater)  	{  		root_floater->addDependentFloater(picker); diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index dfe9e6491d..1be0c5f075 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -40,6 +40,7 @@  #include "llavatarnamecache.h"  #include "llgroupiconctrl.h"  #include "llfloateravatarpicker.h" +#include "llfloaterpreference.h"  #include "llimview.h"  #include "lltransientfloatermgr.h"  #include "llviewercontrol.h" @@ -53,6 +54,8 @@ LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)  	mExpandCollapseBtn(NULL),  	mConversationsRoot(NULL)  { +	mCommitCallbackRegistrar.add("IMFloaterContainer.Action", boost::bind(&LLIMFloaterContainer::onCustomAction,  this, _2)); +  	// Firstly add our self to IMSession observers, so we catch session events      LLIMMgr::getInstance()->addSessionObserver(this); @@ -468,8 +471,10 @@ void LLIMFloaterContainer::updateState(bool collapse, S32 delta_width)  void LLIMFloaterContainer::onAddButtonClicked()  { -    LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLIMFloaterContainer::onAvatarPicked, this, _1), TRUE, TRUE, TRUE); +    LLView * button = findChild<LLView>("conversations_pane_buttons_expanded")->findChild<LLButton>("add_btn");      LLFloater* root_floater = gFloaterView->getParentFloater(this); +    LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLIMFloaterContainer::onAvatarPicked, this, _1), TRUE, TRUE, TRUE, root_floater->getName(), button); +          if (picker && root_floater)      {          root_floater->addDependentFloater(picker); @@ -488,6 +493,25 @@ void LLIMFloaterContainer::onAvatarPicked(const uuid_vec_t& ids)      }  } +void LLIMFloaterContainer::onCustomAction(const LLSD& userdata) +{ +	std::string command = userdata.asString(); + +	if ("chat_preferences" == command) +	{ +		LLFloaterPreference* floater_prefs = LLFloaterReg::showTypedInstance<LLFloaterPreference>("preferences"); +		if (floater_prefs) +		{ +			LLTabContainer* tab_container = floater_prefs->getChild<LLTabContainer>("pref core"); +			LLPanel* chat_panel = tab_container->getPanelByName("chat"); +			if (tab_container && chat_panel) +			{ +				tab_container->selectTabPanel(chat_panel); +			} +		} +	} +} +  void LLIMFloaterContainer::repositioningWidgets()  {  	LLRect panel_rect = mConversationsListPanel->getRect(); diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h index 300a820a26..a72a3e2221 100644 --- a/indra/newview/llimfloatercontainer.h +++ b/indra/newview/llimfloatercontainer.h @@ -103,6 +103,8 @@ private:  	void onAddButtonClicked();  	void onAvatarPicked(const uuid_vec_t& ids); +	void onCustomAction (const LLSD& userdata); +  	LLButton* mExpandCollapseBtn;  	LLLayoutPanel* mMessagesPane;  	LLLayoutPanel* mConversationsPane; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 745375fe3d..72c54e5ce2 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -3193,16 +3193,8 @@ void LLFolderBridge::pasteFromClipboard()  						LLViewerInventoryCategory* vicat = (LLViewerInventoryCategory *) model->getCategory(item_id);  						llassert(vicat);  						if (vicat) -						{ -                            //Set the pasted folder to dirty, could do this in changeCategoryParent() but only need to set dirty -                            //when pasting from the clipboard. Setting dirty allows updating the filter state, which determines -                            //visibility in the new pasted location. -                            LLFolderViewFolder * folderViewItem = mInventoryPanel.get() ? mInventoryPanel.get()->getFolderByID(item_id) : NULL; -                            if(folderViewItem && folderViewItem->getViewModelItem()) -                            { -                                folderViewItem->getViewModelItem()->dirtyFilter(); -                            } -                          +						{        +                            //changeCategoryParent() implicity calls dirtyFilter  							changeCategoryParent(model, vicat, parent_id, FALSE);  						}  					} diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 0673970d89..e7d59d92d9 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -986,6 +986,7 @@ void LLInventoryModel::updateCategory(const LLViewerInventoryCategory* cat)  				cat_array->put(old_cat);  			}  			mask |= LLInventoryObserver::STRUCTURE; +            mask |= LLInventoryObserver::INTERNAL;  		}  		if(old_cat->getName() != cat->getName())  		{ diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 03dfada77c..2a84616ddf 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -147,7 +147,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :  	mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLInventoryPanel::doCreate, this, _2));  	mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2));  	mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this)); -	mCommitCallbackRegistrar.add("Inventory.Share",  boost::bind(&LLAvatarActions::shareWithAvatars)); +	mCommitCallbackRegistrar.add("Inventory.Share",  boost::bind(&LLAvatarActions::shareWithAvatars, this));  } diff --git a/indra/newview/llpanelblockedlist.cpp b/indra/newview/llpanelblockedlist.cpp index 35cda14f8d..7612af8f5e 100644 --- a/indra/newview/llpanelblockedlist.cpp +++ b/indra/newview/llpanelblockedlist.cpp @@ -66,10 +66,19 @@ LLPanelBlockedList::LLPanelBlockedList()  	mEnableCallbackRegistrar.add("Block.Check",		boost::bind(&LLPanelBlockedList::isActionChecked, this, _2));  } +void LLPanelBlockedList::removePicker() +{ +    if(mPicker.get()) +    { +        mPicker.get()->closeFloater(); +    } +} +  BOOL LLPanelBlockedList::postBuild()  {  	mBlockedList = getChild<LLBlockList>("blocked");  	mBlockedList->setCommitOnSelectionChange(TRUE); +    this->setVisibleCallback(boost::bind(&LLPanelBlockedList::removePicker, this));  	switch (gSavedSettings.getU32("BlockPeopleSortOrder"))  	{ @@ -185,11 +194,18 @@ void LLPanelBlockedList::blockResidentByName()  {  	const BOOL allow_multiple = FALSE;  	const BOOL close_on_select = TRUE; -	/*LLFloaterAvatarPicker* picker = */LLFloaterAvatarPicker::show(boost::bind(&LLPanelBlockedList::callbackBlockPicked, this, _1, _2), allow_multiple, close_on_select); - -	// *TODO: mantipov: should LLFloaterAvatarPicker be closed when panel is closed? -	// old Floater dependency is not enable in panel -	// addDependentFloater(picker); +     +    LLView * button = findChild<LLButton>("plus_btn", TRUE); +    LLFloater* root_floater = gFloaterView->getParentFloater(this); +	LLFloaterAvatarPicker * picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelBlockedList::callbackBlockPicked, this, _1, _2),  +                                                                                    allow_multiple, close_on_select, FALSE, root_floater->getName(), button); +     +    if (root_floater) +    { +        root_floater->addDependentFloater(picker); +    } + +    mPicker = picker->getHandle();  }  void LLPanelBlockedList::blockObjectByName() diff --git a/indra/newview/llpanelblockedlist.h b/indra/newview/llpanelblockedlist.h index 332349dfc0..07f0437656 100644 --- a/indra/newview/llpanelblockedlist.h +++ b/indra/newview/llpanelblockedlist.h @@ -61,6 +61,7 @@ private:  		E_SORT_BY_TYPE = 1,  	} ESortOrder; +    void removePicker();  	void updateButtons();  	// UI callbacks @@ -78,6 +79,7 @@ private:  private:  	LLBlockList* mBlockedList; +    LLHandle<LLFloater> mPicker;  };  //----------------------------------------------------------------------------- diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index 00dd206571..36bd5d9b77 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -301,11 +301,13 @@ void LLPanelGroupInvite::impl::callbackClickAdd(void* userdata)  		//Soon the avatar picker will be embedded into this panel  		//instead of being it's own separate floater.  But that is next week.  		//This will do for now. -jwolk May 10, 2006 +        LLView * button = panelp->findChild<LLButton>("add_button"); +        LLFloater * root_floater = gFloaterView->getParentFloater(panelp);  		LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( -			boost::bind(impl::callbackAddUsers, _1, panelp->mImplementation), TRUE); +			boost::bind(impl::callbackAddUsers, _1, panelp->mImplementation), TRUE, FALSE, FALSE, root_floater->getName(), button);  		if (picker)  		{ -			gFloaterView->getParentFloater(panelp)->addDependentFloater(picker); +			root_floater->addDependentFloater(picker);  		}  	}  } diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index eb3877da5a..35cb3d59c5 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -118,7 +118,7 @@ LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)  	mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this));  	mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLPanelMainInventory::resetFilters, this));  	mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2)); -	mCommitCallbackRegistrar.add("Inventory.Share",  boost::bind(&LLAvatarActions::shareWithAvatars)); +	mCommitCallbackRegistrar.add("Inventory.Share",  boost::bind(&LLAvatarActions::shareWithAvatars, this));  	mSavedFolderState = new LLSaveFolderState();  	mSavedFolderState->setApply(FALSE); diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 82956beb3d..de12826452 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -1498,7 +1498,7 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par  	mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&do_nothing));  	mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&do_nothing));  	mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&do_nothing)); -	mCommitCallbackRegistrar.add("Inventory.Share",  boost::bind(&LLAvatarActions::shareWithAvatars)); +	mCommitCallbackRegistrar.add("Inventory.Share",  boost::bind(&LLAvatarActions::shareWithAvatars, this));  }  // Destroys the object diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 260de40eef..90e857265d 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -556,6 +556,15 @@ void LLPanelPeople::onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LL  	}  } + +void LLPanelPeople::removePicker() +{ +    if(mPicker.get()) +    { +        mPicker.get()->closeFloater(); +    } +} +  BOOL LLPanelPeople::postBuild()  {  	getChild<LLFilterEditor>("nearby_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2)); @@ -571,6 +580,7 @@ BOOL LLPanelPeople::postBuild()  	LLPanel* friends_tab = getChild<LLPanel>(FRIENDS_TAB_NAME);  	// updater is active only if panel is visible to user.  	friends_tab->setVisibleCallback(boost::bind(&Updater::setActive, mFriendListUpdater, _2)); +    friends_tab->setVisibleCallback(boost::bind(&LLPanelPeople::removePicker, this));  	mOnlineFriendList = friends_tab->getChild<LLAvatarList>("avatars_online");  	mAllFriendList = friends_tab->getChild<LLAvatarList>("avatars_all");  	mOnlineFriendList->setNoItemsCommentText(getString("no_friends_online")); @@ -1079,8 +1089,12 @@ bool LLPanelPeople::isItemsFreeOfFriends(const uuid_vec_t& uuids)  void LLPanelPeople::onAddFriendWizButtonClicked()  { +    LLPanel* cur_panel = mTabContainer->getCurrentPanel(); +    LLView * button = cur_panel->findChild<LLButton>("friends_add_btn", TRUE); +  	// Show add friend wizard. -	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelPeople::onAvatarPicked, _1, _2), FALSE, TRUE); +    LLFloater* root_floater = gFloaterView->getParentFloater(this); +	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelPeople::onAvatarPicked, _1, _2), FALSE, TRUE, FALSE, root_floater->getName(), button);  	if (!picker)  	{  		return; @@ -1088,11 +1102,13 @@ void LLPanelPeople::onAddFriendWizButtonClicked()  	// Need to disable 'ok' button when friend occurs in selection  	picker->setOkBtnEnableCb(boost::bind(&LLPanelPeople::isItemsFreeOfFriends, this, _1)); -	LLFloater* root_floater = gFloaterView->getParentFloater(this); +	  	if (root_floater)  	{  		root_floater->addDependentFloater(picker);  	} + +    mPicker = picker->getHandle();  }  void LLPanelPeople::onDeleteFriendButtonClicked() diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index da27f83074..4740964dee 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -68,6 +68,8 @@ private:  		E_SORT_BY_RECENT_SPEAKERS = 4,  	} ESortOrder; +    void				    removePicker(); +  	// methods indirectly called by the updaters  	void					updateFriendListHelpText();  	void					updateFriendList(); @@ -139,6 +141,7 @@ private:  	Updater*				mNearbyListUpdater;  	Updater*				mRecentListUpdater;  	Updater*				mButtonsUpdater; +    LLHandle< LLFloater >	mPicker;  };  #endif //LL_LLPANELPEOPLE_H diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index acb232c77f..8915bb2fef 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -448,7 +448,7 @@ void LLSidepanelInventory::onInfoButtonClicked()  void LLSidepanelInventory::onShareButtonClicked()  { -	LLAvatarActions::shareWithAvatars(); +	LLAvatarActions::shareWithAvatars(this);  }  void LLSidepanelInventory::onShopButtonClicked() diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index bd12328a6b..ceff75a0cc 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -414,7 +414,7 @@ void LLVoiceChannel::doSetState(const EState& new_state)  	mState = new_state;  	if (!mStateChangedCallback.empty()) -		mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent); +		mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent, mSessionID);  }  //static diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h index b8597ee5cb..fed44974fd 100644 --- a/indra/newview/llvoicechannel.h +++ b/indra/newview/llvoicechannel.h @@ -52,7 +52,7 @@ public:  		OUTGOING_CALL  	} EDirection; -	typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction, bool ended_by_agent)> state_changed_signal_t; +	typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction, bool ended_by_agent, const LLUUID& session_id)> state_changed_signal_t;  	// on current channel changed signal  	typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t; diff --git a/indra/newview/skins/default/xui/en/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/en/menu_conversation_log_gear.xml index b8d0eef956..8796b87955 100644 --- a/indra/newview/skins/default/xui/en/menu_conversation_log_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_conversation_log_gear.xml @@ -57,20 +57,28 @@        parameter="can_offer_teleport"/>      </menu_item_call>      <menu_item_separator /> -    <menu_item_check -     label="Add friend/Remove friend" +    <menu_item_call +     label="Add Friend"       layout="topleft" -     name="Friend_add_remove"> -        <menu_item_check.on_click +     name="add_friend"> +        <on_click           function="Calllog.Action" -         parameter="add_rem_friend" /> -        <menu_item_check.on_check +         parameter="add_friend"/> +        <on_visible +         function="Calllog.Check" +         parameter="is_not_friend" /> +    </menu_item_call> +    <menu_item_call +     label="Remove Friend" +     layout="topleft" +     name="remove_friend"> +        <on_click +         function="Calllog.Action" +         parameter="remove_friend"/> +        <on_visible           function="Calllog.Check"           parameter="is_friend" /> -        <menu_item_check.on_enable -         function="Calllog.Enable" -         parameter="add_rem_friend" /> -    </menu_item_check> +    </menu_item_call>      <menu_item_call       label="Invite to group..."       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/en/menu_conversation_log_view.xml index 4ab8cb4f7d..ce65b23971 100644 --- a/indra/newview/skins/default/xui/en/menu_conversation_log_view.xml +++ b/indra/newview/skins/default/xui/en/menu_conversation_log_view.xml @@ -34,4 +34,12 @@         function="CallLog.Check"         parameter="sort_friends_on_top" />    </menu_item_check> +  <menu_item_separator /> +  <menu_item_call +   label="View Nearby chat history..." +   name="view_nearby_chat_history"> +      <on_click +       function="CallLog.Action" +       parameter="view_nearby_chat_history" /> +  </menu_item_call>  </toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_participant_view.xml b/indra/newview/skins/default/xui/en/menu_participant_view.xml index 6401b0e3b7..df2700c94c 100644 --- a/indra/newview/skins/default/xui/en/menu_participant_view.xml +++ b/indra/newview/skins/default/xui/en/menu_participant_view.xml @@ -2,6 +2,13 @@  <toggleable_menu   layout="topleft"   name="participant_manu_view"> +    <menu_item_call +         label="Chat preferences..." +         name="chat_preferences"> +        <on_click +         function="IMFloaterContainer.Action" +         parameter="chat_preferences" /> +      </menu_item_call>      <menu_item_check           label="Open conversation log"           name="Conversation" diff --git a/indra/newview/skins/default/xui/en/panel_blocked_list_item.xml b/indra/newview/skins/default/xui/en/panel_blocked_list_item.xml index 84e7e467b1..752321b949 100644 --- a/indra/newview/skins/default/xui/en/panel_blocked_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_blocked_list_item.xml @@ -60,7 +60,6 @@      <text       follows="left|right"       font="SansSerifSmall" -     font.color="DkGray"       height="15"       layout="topleft"       left_pad="5" diff --git a/indra/newview/skins/default/xui/en/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/en/panel_conversation_log_list_item.xml index cee7d8581a..8a58eb1ca6 100644 --- a/indra/newview/skins/default/xui/en/panel_conversation_log_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_conversation_log_list_item.xml @@ -28,7 +28,6 @@       visible="false"       width="380" />      <icon -     default_icon_name="voice_session_icon"       follows="top|left"       height="20"       layout="topleft" @@ -72,7 +71,6 @@      <text       follows="left|right"       font="SansSerifSmall" -     font.color="DkGray"       height="15"       layout="topleft"       left_pad="5" @@ -84,7 +82,6 @@      <text       follows="right"       font="SansSerifSmall" -     font.color="DkGray"       height="15"       layout="topleft"       left_pad="5" | 
