diff options
| author | Oz Linden <oz@lindenlab.com> | 2013-03-22 10:51:16 -0400 | 
|---|---|---|
| committer | Oz Linden <oz@lindenlab.com> | 2013-03-22 10:51:16 -0400 | 
| commit | 61726237888b72de5bc49444adfeb931330fa929 (patch) | |
| tree | 28abb6abb7f04e532a5085ccbdc346819c2fcd97 | |
| parent | ed7785bf97a601448ba2da5fb2f19ea2861454c5 (diff) | |
| parent | ef544a22218d59c6a121d4bf88c49868a2b9a713 (diff) | |
merge changes for 3.5.0-beta5
40 files changed, 703 insertions, 237 deletions
| @@ -425,3 +425,7 @@ a49c715243a36a8a380504d14cb7416b3039c956 3.4.5-release  c6b3561c7d7ad365eeba669db54eb57b5149ce75 3.5.0-beta2  6d91ffd77bf2a20f18a2175eb7579da880ae12ac DRTVWR-302  f6ca5bb75bca975ff0bc77e71e615f6478c4559c 3.5.0-beta3 +910b5fad950e343b58229f5a0aefa7729b9308b3 DRTVWR-303 +53cffdde0b3cc367ba9bb6abd5c83ae14df5e882 3.5.0-beta4 +4d5f6234dc59a0fb6ead5e02c7d343a0610e0488 DRTVWR-304 +dd058a6093c493120d67c8e02c812c0f7b2d3db0 3.5.0-beta5 diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 9e4857b6bc..c8cf3713ab 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -597,11 +597,6 @@ bool LLGLManager::initGL()  	if (mGLVendor.substr(0,4) == "ATI ")  	{  		mGLVendorShort = "ATI"; -		BOOL mobile = FALSE; -		if (mGLRenderer.find("MOBILITY") != std::string::npos) -		{ -			mobile = TRUE; -		}  		mIsATI = TRUE;  #if LL_WINDOWS && !LL_MESA_HEADLESS @@ -1489,9 +1484,7 @@ void assert_glerror()  void clear_glerror()  { -	//  Create or update texture to be used with this data  -	GLenum error; -	error = glGetError(); +	glGetError();  }  /////////////////////////////////////////////////////////////// diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 0c43a571b8..6f895ed939 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -1483,16 +1483,22 @@ BOOL LLTabContainer::setTab(S32 which)  		for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)  		{  			LLTabTuple* tuple = *iter; -			if (!tuple) -				continue;  			BOOL is_selected = ( tuple == selected_tuple ); -			tuple->mButton->setUseEllipses(mUseTabEllipses); -			tuple->mButton->setHAlign(mFontHalign); -			tuple->mTabPanel->setVisible( is_selected ); -// 			tuple->mTabPanel->setFocus(is_selected); // not clear that we want to do this here. -			tuple->mButton->setToggleState( is_selected ); -			// RN: this limits tab-stops to active button only, which would require arrow keys to switch tabs -			tuple->mButton->setTabStop( is_selected ); +             +            // Although the selected tab must be complete, we may have hollow LLTabTuple tucked in the list +            if (tuple->mButton) +            { +                tuple->mButton->setUseEllipses(mUseTabEllipses); +                tuple->mButton->setHAlign(mFontHalign); +                tuple->mButton->setToggleState( is_selected ); +                // RN: this limits tab-stops to active button only, which would require arrow keys to switch tabs +                tuple->mButton->setTabStop( is_selected ); +            } +            if (tuple->mTabPanel) +            { +                tuple->mTabPanel->setVisible( is_selected ); +                //tuple->mTabPanel->setFocus(is_selected); // not clear that we want to do this here. +            }  			if (is_selected)  			{ @@ -1563,8 +1569,7 @@ BOOL LLTabContainer::selectTabByName(const std::string& name)  	LLPanel* panel = getPanelByName(name);  	if (!panel)  	{ -		llwarns << "LLTabContainer::selectTabByName(" -			<< name << ") failed" << llendl; +		llwarns << "LLTabContainer::selectTabByName(" << name << ") failed" << llendl;  		return FALSE;  	} diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index c4ec1edc73..ebc9ee244e 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -359,7 +359,6 @@ void LLTextBase::drawSelectionBackground()  		S32 selection_left		= llmin( mSelectionStart, mSelectionEnd );  		S32 selection_right		= llmax( mSelectionStart, mSelectionEnd ); -		LLRect selection_rect = mVisibleTextRect;  		// Skip through the lines we aren't drawing.  		LLRect content_display_rect = getVisibleDocumentRect(); diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp index b9256dd890..1c74395c66 100644 --- a/indra/llui/lltoolbar.cpp +++ b/indra/llui/lltoolbar.cpp @@ -1059,10 +1059,9 @@ BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  	// Convert drag position into insert position and rank   	if (!isReadOnly() && handled && !drop)  	{ -		LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data; -		LLAssetType::EType type = inv_item->getType(); -		if (type == LLAssetType::AT_WIDGET) +		if (cargo_type == DAD_WIDGET)  		{ +			LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;  			LLCommandId dragged_command(inv_item->getUUID());  			int orig_rank = getRankFromPosition(dragged_command);  			mDragRank = getRankFromPosition(x, y); diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index e216c7865d..4c305e1d60 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1716,17 +1716,6 @@        <key>Value</key>        <integer>131073</integer>      </map> -    <key>NearbyChatIsNotTornOff</key> -    <map> -      <key>Comment</key> -      <string>saving torn-off state of the nearby chat between sessions</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>1</integer> -    </map>      <key>CloseChatOnReturn</key>      <map>        <key>Comment</key> @@ -4282,6 +4271,17 @@        <key>Value</key>        <integer>1</integer>      </map> +     <key>IMShowContentPanel</key> +    <map> +      <key>Comment</key> +      <string>Show Toolbar and Body Panels</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>IgnoreAllNotifications</key>      <map>        <key>Comment</key> diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index 363713f2f4..ada374f892 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -281,6 +281,17 @@        	<key>Value</key>        		<integer>2</integer>      	</map>     +    <key>NearbyChatIsNotTornOff</key> +    <map> +      <key>Comment</key> +      <string>saving torn-off state of the nearby chat between sessions</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ShowFavoritesOnLogin</key>          <map>          <key>Comment</key> diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 3dbb43c657..b221daf936 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -427,6 +427,8 @@ LLChicletPanel::~LLChicletPanel()  void LLChicletPanel::onMessageCountChanged(const LLSD& data)  { +    // *TODO : we either suppress this method or return a value. Right now, it servers no purpose. +    /*  	LLUUID session_id = data["session_id"].asUUID();  	S32 unread = data["participant_unread"].asInteger(); @@ -435,6 +437,7 @@ void LLChicletPanel::onMessageCountChanged(const LLSD& data)  	{  		unread = 0;  	} +    */  }  void LLChicletPanel::objectChicletCallback(const LLSD& data) diff --git a/indra/newview/llconversationlog.cpp b/indra/newview/llconversationlog.cpp index dd20ca15ae..7883e4cb89 100644 --- a/indra/newview/llconversationlog.cpp +++ b/indra/newview/llconversationlog.cpp @@ -194,14 +194,17 @@ LLConversationLog::LLConversationLog() :  	mAvatarNameCacheConnection(),  	mLoggingEnabled(false)  { -	LLControlVariable * keep_log_ctrlp = gSavedPerAccountSettings.getControl("KeepConversationLogTranscripts").get(); -	S32 log_mode = keep_log_ctrlp->getValue(); -	keep_log_ctrlp->getSignal()->connect(boost::bind(&LLConversationLog::enableLogging, this, _2)); -	if (log_mode > 0) +	if(gSavedPerAccountSettings.controlExists("KeepConversationLogTranscripts"))  	{ -		loadFromFile(getFileName()); +		LLControlVariable * keep_log_ctrlp = gSavedPerAccountSettings.getControl("KeepConversationLogTranscripts").get(); +		S32 log_mode = keep_log_ctrlp->getValue(); +		keep_log_ctrlp->getSignal()->connect(boost::bind(&LLConversationLog::enableLogging, this, _2)); +		if (log_mode > 0) +		{ +			loadFromFile(getFileName()); -		enableLogging(log_mode); +			enableLogging(log_mode); +		}  	}  } diff --git a/indra/newview/llconversationloglist.cpp b/indra/newview/llconversationloglist.cpp index b202cfc9d3..5ab108b39f 100644 --- a/indra/newview/llconversationloglist.cpp +++ b/indra/newview/llconversationloglist.cpp @@ -390,7 +390,7 @@ bool LLConversationLogList::isActionEnabled(const LLSD& userdata)  	{  		return is_p2p && LLAvatarActions::canOfferTeleport(selected_id);  	} -	else if ("can_show_on_map") +	else if ("can_show_on_map" == command_name)  	{  		return is_p2p && ((LLAvatarTracker::instance().isBuddyOnline(selected_id) && is_agent_mappable(selected_id)) || gAgent.isGodlike());  	} diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp index 009fce0a92..c74ce24872 100644 --- a/indra/newview/llconversationmodel.cpp +++ b/indra/newview/llconversationmodel.cpp @@ -139,6 +139,8 @@ void LLConversationItem::buildParticipantMenuOptions(menuentry_vec_t& items, U32  		items.push_back(std::string("remove_friend"));  		items.push_back(std::string("invite_to_group"));  		items.push_back(std::string("separator_invite_to_group")); +		if (static_cast<LLConversationItem*>(mParent)->getType() == CONV_SESSION_NEARBY) +			items.push_back(std::string("zoom_in"));  		items.push_back(std::string("map"));  		items.push_back(std::string("share"));  		items.push_back(std::string("pay")); diff --git a/indra/newview/lldelayedgestureerror.cpp b/indra/newview/lldelayedgestureerror.cpp index 80e7c9f1b2..ef1b644ad4 100644 --- a/indra/newview/lldelayedgestureerror.cpp +++ b/indra/newview/lldelayedgestureerror.cpp @@ -113,9 +113,11 @@ bool LLDelayedGestureError::doDialog(const LLErrorEntry &ent, bool uuid_ok)  		}  	} - -	LLNotificationsUtil::add(ent.mNotifyName, args); - +	if(!LLApp::isQuitting()) +	{ +		LLNotificationsUtil::add(ent.mNotifyName, args); +	} +	  	return true;  } diff --git a/indra/newview/lldonotdisturbnotificationstorage.cpp b/indra/newview/lldonotdisturbnotificationstorage.cpp index 22f35752bd..be20adeb8a 100644 --- a/indra/newview/lldonotdisturbnotificationstorage.cpp +++ b/indra/newview/lldonotdisturbnotificationstorage.cpp @@ -33,6 +33,7 @@  #include "lldir.h"  #include "llerror.h"  #include "llfloaterreg.h" +#include "llimview.h"  #include "llnotifications.h"  #include "llnotificationhandler.h"  #include "llnotificationstorage.h" @@ -145,6 +146,8 @@ void LLDoNotDisturbNotificationStorage::loadNotifications()  	LLNotifications& instance = LLNotifications::instance();      bool imToastExists = false; +	bool group_ad_hoc_toast_exists = false; +	S32 toastSessionType;      bool offerExists = false;  	for (LLSD::array_const_iterator notification_it = data.beginArray(); @@ -158,7 +161,20 @@ void LLDoNotDisturbNotificationStorage::loadNotifications()          if(notificationName == toastName)          { -            imToastExists = true; +			toastSessionType = notification_params["payload"]["SESSION_TYPE"]; +			if(toastSessionType == LLIMModel::LLIMSession::P2P_SESSION) +			{ +				imToastExists = true; +			} +			//Don't add group/ad-hoc messages to the notification system because +			//this means the group/ad-hoc session has to be re-created +			else if(toastSessionType == LLIMModel::LLIMSession::GROUP_SESSION  +					|| toastSessionType == LLIMModel::LLIMSession::ADHOC_SESSION) +			{ +				//Just allows opening the conversation log for group/ad-hoc messages upon startup +				group_ad_hoc_toast_exists = true; +				continue; +			}          }          else if(notificationName == offerName)          { @@ -197,7 +213,12 @@ void LLDoNotDisturbNotificationStorage::loadNotifications()          LLFloaterReg::showInstance("im_container");      } -    if(imToastExists || offerExists) +	if(group_ad_hoc_toast_exists) +	{ +		LLFloaterReg::showInstance("conversation"); +	} + +    if(imToastExists || group_ad_hoc_toast_exists || offerExists)      {  		make_ui_sound_deferred("UISndNewIncomingIMSession");      } diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 7437dd8cda..5e0cd8ef78 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -53,6 +53,7 @@  #include "llcallbacklist.h"  #include "llworld.h"  #include "llsdserialize.h" +#include "llviewerobjectlist.h"  //  // LLFloaterIMContainer @@ -62,8 +63,7 @@ LLFloaterIMContainer::LLFloaterIMContainer(const LLSD& seed, const Params& param  	mExpandCollapseBtn(NULL),  	mConversationsRoot(NULL),  	mConversationsEventStream("ConversationsEvents"), -	mInitialized(false), -	mIsFirstLaunch(false) +	mInitialized(false)  {      mEnableCallbackRegistrar.add("IMFloaterContainer.Check", boost::bind(&LLFloaterIMContainer::isActionChecked, this, _2));  	mCommitCallbackRegistrar.add("IMFloaterContainer.Action", boost::bind(&LLFloaterIMContainer::onCustomAction,  this, _2)); @@ -245,7 +245,6 @@ BOOL LLFloaterIMContainer::postBuild()  	mGeneralTitle = getTitle();  	mInitialized = true; -	mIsFirstLaunch = true;  	// Add callbacks:  	// We'll take care of view updates on idle @@ -280,12 +279,6 @@ void LLFloaterIMContainer::addFloater(LLFloater* floaterp,  	LLUUID session_id = floaterp->getKey(); -	// Make sure the message panel is open when adding a floater or it stays mysteriously hidden -	if (!mIsFirstLaunch) -	{ -		collapseMessagesPane(false); -	} -  	// Add the floater  	LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point); @@ -646,8 +639,6 @@ void LLFloaterIMContainer::collapseMessagesPane(bool collapse)  		return;  	} -	mIsFirstLaunch = false; -  	// Save current width of panels before collapsing/expanding right pane.  	S32 conv_pane_width = mConversationsPane->getRect().getWidth();      S32 msg_pane_width = mMessagesPane->getRect().getWidth(); @@ -1036,6 +1027,10 @@ void LLFloaterIMContainer::doToParticipants(const std::string& command, uuid_vec  		{  			LLAvatarActions::inviteToGroup(userID);  		} +		else if ("zoom_in" == command) +		{ +			handle_zoom_to_object(userID); +		}  		else if ("map" == command)  		{  			LLAvatarActions::showOnMap(userID); @@ -1257,6 +1252,10 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v      {          return LLAvatarActions::canCall();      } +	else if ("can_zoom_in" == item) +	{ +		return is_single_select && gObjectList.findObject(single_id); +	}      else if ("can_show_on_map" == item)      {          return (is_single_select ? (LLAvatarTracker::instance().isBuddyOnline(single_id) && is_agent_mappable(single_id)) || gAgent.isGodlike() : false); @@ -1330,6 +1329,9 @@ void LLFloaterIMContainer::showConversation(const LLUUID& session_id)  {      setVisibleAndFrontmost(false);      selectConversationPair(session_id, true); + +    LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id); +    session_floater->restoreFloater();  }  void LLFloaterIMContainer::clearAllFlashStates() @@ -1419,7 +1421,7 @@ BOOL LLFloaterIMContainer::selectConversationPair(const LLUUID& session_id, bool  			session_floater->setMinimized(is_minimized);  		}  	} - +	flashConversationItemWidget(session_id,false);      return handled;  } diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h index 5139651d8d..2cbc1e99f9 100644 --- a/indra/newview/llfloaterimcontainer.h +++ b/indra/newview/llfloaterimcontainer.h @@ -174,7 +174,6 @@ private:  	LLLayoutStack* mConversationsStack;  	bool mInitialized; -	bool mIsFirstLaunch;  	LLUUID mSelectedSession;  	std::string mGeneralTitle; diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp index cfee5001a6..b287950c21 100644 --- a/indra/newview/llfloaterimnearbychat.cpp +++ b/indra/newview/llfloaterimnearbychat.cpp @@ -274,8 +274,8 @@ void LLFloaterIMNearbyChat::onTearOffClicked()  	LLFloaterIMSessionTab::onTearOffClicked();  	// see CHUI-170: Save torn-off state of the nearby chat between sessions -	BOOL in_the_multifloater = !isTornOff(); -	gSavedSettings.setBOOL("NearbyChatIsNotTornOff", in_the_multifloater); +	BOOL in_the_multifloater = (BOOL)getHost(); +	gSavedPerAccountSettings.setBOOL("NearbyChatIsNotTornOff", in_the_multifloater);  } @@ -290,6 +290,7 @@ void LLFloaterIMNearbyChat::onOpen(const LLSD& key)  void LLFloaterIMNearbyChat::onClose(bool app_quitting)  {  	// Override LLFloaterIMSessionTab::onClose() so that Nearby Chat is not removed from the conversation floater +	LLFloaterIMSessionTab::restoreFloater();  	onClickCloseBtn();  } @@ -297,8 +298,10 @@ void LLFloaterIMNearbyChat::onClose(bool app_quitting)  void LLFloaterIMNearbyChat::onClickCloseBtn()  {  	if (!isTornOff()) +	{  		return; -	onTearOffClicked(); +	} +	LLFloaterIMSessionTab::onTearOffClicked();  	LLFloaterIMContainer *im_box = LLFloaterIMContainer::findInstance();  	if (im_box) @@ -334,7 +337,7 @@ bool LLFloaterIMNearbyChat::isChatVisible() const  	if (im_box != NULL)  	{  		isVisible = -				isChatMultiTab() && gSavedSettings.getBOOL("NearbyChatIsNotTornOff")? +				isChatMultiTab() && gSavedPerAccountSettings.getBOOL("NearbyChatIsNotTornOff")?  						im_box->getVisible() && !im_box->isMinimized() :  						getVisible() && !isMinimized();  	} @@ -345,6 +348,11 @@ bool LLFloaterIMNearbyChat::isChatVisible() const  void LLFloaterIMNearbyChat::showHistory()  {  	openFloater(); +	if(!isMessagePaneExpanded()) +	{ +		restoreFloater(); +		setFocus(true); +	}  	setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT);  } @@ -417,6 +425,12 @@ BOOL LLFloaterIMNearbyChat::matchChatTypeTrigger(const std::string& in_str, std:  void LLFloaterIMNearbyChat::onChatBoxKeystroke()  { +	LLFloaterIMContainer* im_box = LLFloaterIMContainer::findInstance(); +	if (im_box) +	{ +		im_box->flashConversationItemWidget(mSessionID,false); +	} +  	LLFirstUse::otherAvatarChatFirst(false);  	LLWString raw_text = mInputEditor->getWText(); @@ -725,7 +739,14 @@ void LLFloaterIMNearbyChat::startChat(const char* line)  	LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");  	if (nearby_chat)  	{ -		nearby_chat->show(); +		if(!nearby_chat->isTornOff()) +		{ +			nearby_chat->show(); +		} +		if(nearby_chat->isMinimized()) +		{ +			nearby_chat->setMinimized(false); +		}  		nearby_chat->setVisible(TRUE);  		nearby_chat->setFocus(TRUE);  		nearby_chat->mInputEditor->setFocus(TRUE); diff --git a/indra/newview/llfloaterimnearbychathandler.cpp b/indra/newview/llfloaterimnearbychathandler.cpp index 8870d54cd2..7afcf288ce 100644 --- a/indra/newview/llfloaterimnearbychathandler.cpp +++ b/indra/newview/llfloaterimnearbychathandler.cpp @@ -559,12 +559,14 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,      LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); -	if( nearby_chat->hasFocus()  +	if(( nearby_chat->hasFocus()          || im_box->hasFocus()  		|| ( chat_msg.mSourceType == CHAT_SOURCE_AGENT  			&& gSavedSettings.getBOOL("UseChatBubbles") )  		|| mChannel.isDead() -		|| !mChannel.get()->getShowToasts() ) // to prevent toasts in Do Not Disturb mode +		|| !mChannel.get()->getShowToasts() ) +		&& nearby_chat->isMessagePaneExpanded()) +		// to prevent toasts in Do Not Disturb mode  		return;//no need in toast if chat is visible or if bubble chat is enabled  	// arrange a channel on a screen @@ -606,7 +608,7 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,  		//Don't show nearby toast, if conversation is visible but not focused  		LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(LLUUID()); -		if (session_floater +		if (session_floater && session_floater->isMessagePaneExpanded()  		    && session_floater->isInVisibleChain() && !session_floater->isMinimized()  		    && !(session_floater->getHost() && session_floater->getHost()->isMinimized()))  		{ @@ -614,7 +616,7 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,  		}          //Will show toast when chat preference is set         -        if(gSavedSettings.getString("NotificationNearbyChatOptions") == "toast") +        if((gSavedSettings.getString("NotificationNearbyChatOptions") == "toast") || !session_floater->isMessagePaneExpanded())          {              // Add a nearby chat toast.              LLUUID id; diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp index 50b2ed8c51..73adfd0eda 100644 --- a/indra/newview/llfloaterimsession.cpp +++ b/indra/newview/llfloaterimsession.cpp @@ -618,7 +618,7 @@ void LLFloaterIMSession::onClose(bool app_quitting)  	// Last change:  	// EXT-3516 X Button should end IM session, _ button should hide  	gIMMgr->leaveSession(mSessionID); - +	LLFloaterIMSessionTab::restoreFloater();  	// Clean up the conversation *after* the session has been ended  	LLFloaterIMSessionTab::onClose(app_quitting);  } @@ -892,6 +892,11 @@ void LLFloaterIMSession::onInputEditorFocusLost(LLFocusableElement* caller, void  void LLFloaterIMSession::onInputEditorKeystroke(LLTextEditor* caller, void* userdata)  {  	LLFloaterIMSession* self = (LLFloaterIMSession*)userdata; +	LLFloaterIMContainer* im_box = LLFloaterIMContainer::findInstance(); +	if (im_box) +	{ +		im_box->flashConversationItemWidget(self->mSessionID,false); +	}  	std::string text = self->mInputEditor->getText();  		// Deleting all text counts as stopping typing. diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 9fd22b1537..eab2ce7798 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -30,6 +30,7 @@  #include "llfloaterimsessiontab.h"  #include "llagent.h" +#include "llagentcamera.h"  #include "llavataractions.h"  #include "llchatentry.h"  #include "llchathistory.h" @@ -57,11 +58,12 @@ LLFloaterIMSessionTab::LLFloaterIMSessionTab(const LLSD& session_id)    , mSpeakingIndicator(NULL)    , mChatHistory(NULL)    , mInputEditor(NULL) -  , mInputEditorTopPad(0) +  , mInputEditorPad(0)    , mRefreshTimer(new LLTimer())    , mIsHostAttached(false)    , mHasVisibleBeenInitialized(false)    , mIsParticipantListExpanded(true) +  , mChatLayoutPanel(NULL)  {      setAutoFocus(FALSE);  	mSession = LLIMModel::getInstance()->findIMSession(mSessionID); @@ -125,8 +127,12 @@ void LLFloaterIMSessionTab::setVisible(BOOL visible)  	if(visible && !mHasVisibleBeenInitialized)  	{  		mHasVisibleBeenInitialized = true; -		LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")->setVisible(true); +		if(!gAgentCamera.cameraMouselook()) +		{ +			LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")->setVisible(true); +		}  		LLFloaterIMSessionTab::addToHost(mSessionID); +		mInputButtonPanel->setVisible(isTornOff());  	}  	LLTransientDockableFloater::setVisible(visible); @@ -170,7 +176,7 @@ void LLFloaterIMSessionTab::addToHost(const LLUUID& session_id)  			conversp->setHostAttached(true);  			if (!conversp->isNearbyChat() -					|| gSavedSettings.getBOOL("NearbyChatIsNotTornOff")) +					|| gSavedPerAccountSettings.getBOOL("NearbyChatIsNotTornOff"))  			{  				floater_container->addFloater(conversp, false, LLTabContainer::RIGHT_OF_CURRENT);  			} @@ -190,23 +196,51 @@ void LLFloaterIMSessionTab::addToHost(const LLUUID& session_id)  	}  } +void LLFloaterIMSessionTab::assignResizeLimits() +{ +	bool is_participants_pane_collapsed = mParticipantListPanel->isCollapsed(); + +    // disable a layoutstack's functionality when participant list panel is collapsed +	mRightPartPanel->setIgnoreReshape(is_participants_pane_collapsed); + +    S32 participants_pane_target_width = is_participants_pane_collapsed? +    		0 : (mParticipantListPanel->getRect().getWidth() + LLPANEL_BORDER_WIDTH); + +    S32 new_min_width = participants_pane_target_width + mRightPartPanel->getExpandedMinDim() + mFloaterExtraWidth; + +	setResizeLimits(new_min_width, getMinHeight()); + +	this->mParticipantListAndHistoryStack->updateLayout(); +} +  BOOL LLFloaterIMSessionTab::postBuild()  {  	BOOL result; +	mBodyStack = getChild<LLLayoutStack>("main_stack"); +    mParticipantListAndHistoryStack = getChild<LLLayoutStack>("im_panels"); +  	mCloseBtn = getChild<LLButton>("close_btn");  	mCloseBtn->setCommitCallback(boost::bind(&LLFloater::onClickClose, this));  	mExpandCollapseBtn = getChild<LLButton>("expand_collapse_btn");  	mExpandCollapseBtn->setClickedCallback(boost::bind(&LLFloaterIMSessionTab::onSlide, this)); +	mExpandCollapseLineBtn = getChild<LLButton>("minz_btn"); +	mExpandCollapseLineBtn->setClickedCallback(boost::bind(&LLFloaterIMSessionTab::onCollapseToLine, this)); +  	mTearOffBtn = getChild<LLButton>("tear_off_btn");  	mTearOffBtn->setCommitCallback(boost::bind(&LLFloaterIMSessionTab::onTearOffClicked, this));  	mGearBtn = getChild<LLButton>("gear_btn");  	mParticipantListPanel = getChild<LLLayoutPanel>("speakers_list_panel"); -	 +	mRightPartPanel = getChild<LLLayoutPanel>("right_part_holder"); + +	mToolbarPanel = getChild<LLLayoutPanel>("toolbar_panel"); +	mContentPanel = getChild<LLLayoutPanel>("body_panel"); +	mInputButtonPanel = getChild<LLLayoutPanel>("input_button_layout_panel"); +	mInputButtonPanel->setVisible(false);  	// Add a scroller for the folder (participant) view  	LLRect scroller_view_rect = mParticipantListPanel->getRect();  	scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom); @@ -223,17 +257,20 @@ BOOL LLFloaterIMSessionTab::postBuild()  	mChatHistory = getChild<LLChatHistory>("chat_history");  	mInputEditor = getChild<LLChatEntry>("chat_editor"); -	mInputEditor->setTextExpandedCallback(boost::bind(&LLFloaterIMSessionTab::reshapeChatHistory, this)); + +	mChatLayoutPanel = getChild<LLLayoutPanel>("chat_layout_panel"); +	 +	mInputEditor->setTextExpandedCallback(boost::bind(&LLFloaterIMSessionTab::reshapeChatLayoutPanel, this));  	mInputEditor->setCommitOnFocusLost( FALSE );  	mInputEditor->setPassDelete(TRUE);  	mInputEditor->setFont(LLViewerChat::getChatFont()); -	mInputEditorTopPad = mChatHistory->getRect().mBottom - mInputEditor->getRect().mTop; +	mInputEditorPad = mChatLayoutPanel->getRect().getHeight() - mInputEditor->getRect().getHeight();  	setOpenPositioning(LLFloaterEnums::POSITIONING_RELATIVE);  	mSaveRect = isNearbyChat() -					&&  !gSavedSettings.getBOOL("NearbyChatIsNotTornOff"); +					&&  !gSavedPerAccountSettings.getBOOL("NearbyChatIsNotTornOff");  	initRectControl();  	if (isChatMultiTab()) @@ -264,6 +301,8 @@ BOOL LLFloaterIMSessionTab::postBuild()  	mConversationsRoot->setFollowsAll();  	mConversationsRoot->addChild(mConversationsRoot->mStatusTextBox); +	setMessagePaneExpanded(true); +  	buildConversationViewParticipant();  	refreshConversation(); @@ -277,6 +316,15 @@ BOOL LLFloaterIMSessionTab::postBuild()  		LLFloaterIMSessionTab::onSlide(this);  	} +	// The resize limits for LLFloaterIMSessionTab should be updated, based on current values of width of conversation and message panels +	mParticipantListPanel->getResizeBar()->setResizeListener(boost::bind(&LLFloaterIMSessionTab::assignResizeLimits, this)); +	mFloaterExtraWidth = +			getRect().getWidth() +			- mParticipantListAndHistoryStack->getRect().getWidth() +			- (mParticipantListPanel->isCollapsed()? 0 : LLPANEL_BORDER_WIDTH); + +	assignResizeLimits(); +  	return result;  } @@ -649,7 +697,7 @@ void LLFloaterIMSessionTab::updateHeaderAndToolbar()  			&& mIsParticipantListExpanded  			&& !mIsP2PChat; -	mParticipantListPanel->setVisible(is_participant_list_visible); +	mParticipantListAndHistoryStack->collapsePanel(mParticipantListPanel, !is_participant_list_visible);  	// Display collapse image (<<) if the floater is hosted  	// or if it is torn off but has an open control panel. @@ -674,6 +722,7 @@ void LLFloaterIMSessionTab::updateHeaderAndToolbar()  	mTearOffBtn->setImageOverlay(getString(is_not_torn_off? "tear_off_icon" : "return_icon"));  	mTearOffBtn->setToolTip(getString(is_not_torn_off? "tooltip_to_separate_window" : "tooltip_to_main_window")); +  	mCloseBtn->setVisible(is_not_torn_off && !mIsNearbyChat);  	enableDisableCallBtn(); @@ -690,15 +739,11 @@ void LLFloaterIMSessionTab::forceReshape()  } -void LLFloaterIMSessionTab::reshapeChatHistory() +void LLFloaterIMSessionTab::reshapeChatLayoutPanel()  { -	LLRect chat_rect  = mChatHistory->getRect(); +	LLRect chat_layout_panel_rect = mChatLayoutPanel->getRect();  	LLRect input_rect = mInputEditor->getRect(); - -	int delta_height = chat_rect.mBottom - (input_rect.mTop + mInputEditorTopPad); - -	chat_rect.setLeftTopAndSize(chat_rect.mLeft, chat_rect.mTop, chat_rect.getWidth(), chat_rect.getHeight() + delta_height); -	mChatHistory->setShape(chat_rect); +	mChatLayoutPanel->reshape(chat_layout_panel_rect.getWidth(), input_rect.getHeight() + mInputEditorPad, FALSE);  }  void LLFloaterIMSessionTab::showTranslationCheckbox(BOOL show) @@ -773,14 +818,74 @@ void LLFloaterIMSessionTab::onSlide(LLFloaterIMSessionTab* self)  	{  		if (!self->mIsP2PChat)  		{ -			bool expand = !self->mParticipantListPanel->getVisible(); +            bool should_be_expanded = self->mParticipantListPanel->isCollapsed(); + +			// Expand/collapse the participant list panel +            self->mParticipantListAndHistoryStack->collapsePanel(self->mParticipantListPanel, !should_be_expanded); +            self->mParticipantListPanel->setVisible(should_be_expanded); +            gSavedSettings.setBOOL("IMShowControlPanel", should_be_expanded); +            self->mIsParticipantListExpanded = should_be_expanded; +			self->mExpandCollapseBtn->setImageOverlay(self->getString(should_be_expanded ? "collapse_icon" : "expand_icon")); +		} +	} + +	self->assignResizeLimits(); +} + +void LLFloaterIMSessionTab::onCollapseToLine(LLFloaterIMSessionTab* self) +{ +	LLFloaterIMContainer* host_floater = dynamic_cast<LLFloaterIMContainer*>(self->getHost()); +	if (!host_floater) +	{ +		bool expand = self->isMessagePaneExpanded(); +		self->mExpandCollapseLineBtn->setImageOverlay(self->getString(expand ? "collapseline_icon" : "expandline_icon")); +		self->mContentPanel->setVisible(!expand); +		self->mToolbarPanel->setVisible(!expand); +		self->reshapeFloater(expand); +		self->setMessagePaneExpanded(!expand); +	} +} -			// Expand/collapse the IM control panel -			self->mParticipantListPanel->setVisible(expand); -            gSavedSettings.setBOOL("IMShowControlPanel", expand); -            self->mIsParticipantListExpanded = expand; -			self->mExpandCollapseBtn->setImageOverlay(self->getString(expand ? "collapse_icon" : "expand_icon")); +void LLFloaterIMSessionTab::reshapeFloater(bool collapse) +{ +	LLRect floater_rect = getRect(); + +	if(collapse) +	{ +		mFloaterHeight = floater_rect.getHeight(); +		S32 height = mContentPanel->getRect().getHeight() + mToolbarPanel->getRect().getHeight(); +		floater_rect.mTop -= height; +		enableResizeCtrls(true, true, false); +	} +	else +	{ +		floater_rect.mTop = floater_rect.mBottom + mFloaterHeight; +		enableResizeCtrls(true, true, true); + +	} + +	setShape(floater_rect, true); +	mBodyStack->updateLayout(); + +} + +void LLFloaterIMSessionTab::restoreFloater() +{ +	if(!isMessagePaneExpanded()) +	{ +		if(isMinimized()) +		{ +			setMinimized(false);  		} +		mContentPanel->setVisible(true); +		mToolbarPanel->setVisible(true); +		LLRect floater_rect = getRect(); +		floater_rect.mTop = floater_rect.mBottom + mFloaterHeight; +		setShape(floater_rect, true); +		mBodyStack->updateLayout(); +		mExpandCollapseLineBtn->setImageOverlay(getString("expandline_icon")); +		setMessagePaneExpanded(true); +		enableResizeCtrls(true, true, true);  	}  } @@ -793,12 +898,15 @@ void LLFloaterIMSessionTab::onOpen(const LLSD& key)  		// Show the messages pane when opening a floater hosted in the Conversations  		host_floater->collapseMessagesPane(false);  	} + +	mInputButtonPanel->setVisible(isTornOff());  }  void LLFloaterIMSessionTab::onTearOffClicked()  { -    setFollows(isTornOff()? FOLLOWS_ALL : FOLLOWS_NONE); +	restoreFloater(); +	setFollows(isTornOff()? FOLLOWS_ALL : FOLLOWS_NONE);      mSaveRect = isTornOff();      initRectControl();  	LLFloater::onClickTearOff(this); @@ -813,7 +921,10 @@ void LLFloaterIMSessionTab::onTearOffClicked()  	else  	{  		container->selectConversation(mSessionID); +  	} +	mInputButtonPanel->setVisible(isTornOff()); +  	refreshConversation();  	updateGearBtn();  } diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h index e8ae557412..f0899a3c09 100644 --- a/indra/newview/llfloaterimsessiontab.h +++ b/indra/newview/llfloaterimsessiontab.h @@ -98,6 +98,9 @@ public:  	LLConversationItem* getCurSelectedViewModelItem();  	void forceReshape();  	virtual BOOL handleKeyHere( KEY key, MASK mask ); +	bool isMessagePaneExpanded(){return mMessagePaneExpanded;} +	void setMessagePaneExpanded(bool expanded){mMessagePaneExpanded = expanded;} +	void restoreFloater();  protected: @@ -111,6 +114,8 @@ protected:  	bool onIMShowModesMenuItemCheck(const LLSD& userdata);  	bool onIMShowModesMenuItemEnable(const LLSD& userdata);  	static void onSlide(LLFloaterIMSessionTab *self); +	static void onCollapseToLine(LLFloaterIMSessionTab *self); +	void reshapeFloater(bool collapse);  	// refresh a visual state of the Call button  	void updateCallBtnState(bool callIsActive); @@ -135,18 +140,30 @@ protected:  	void appendMessage(const LLChat& chat, const LLSD &args = 0);  	std::string appendTime(); +	void assignResizeLimits(); + +	S32  mFloaterExtraWidth;  	bool mIsNearbyChat;  	bool mIsP2PChat; + +	bool mMessagePaneExpanded;  	bool mIsParticipantListExpanded; +  	LLIMModel::LLIMSession* mSession;  	// Participants list: model and view  	LLConversationViewParticipant* createConversationViewParticipant(LLConversationItem* item);  	LLUUID mSessionID;  +	LLLayoutStack* mBodyStack; +	LLLayoutStack* mParticipantListAndHistoryStack;  	LLLayoutPanel* mParticipantListPanel;	// add the widgets to that see mConversationsListPanel +	LLLayoutPanel* mRightPartPanel; +	LLLayoutPanel* mContentPanel; +	LLLayoutPanel* mToolbarPanel; +	LLLayoutPanel* mInputButtonPanel;  	LLParticipantList* getParticipantList();  	conversations_widgets_map mConversationsWidgets;  	LLConversationViewModel mConversationViewModel; @@ -156,13 +173,17 @@ protected:      LLOutputMonitorCtrl* mSpeakingIndicator;  	LLChatHistory* mChatHistory;  	LLChatEntry* mInputEditor; -	int mInputEditorTopPad; // padding between input field and chat history +	LLLayoutPanel * mChatLayoutPanel; +	int mInputEditorPad; // padding between input field and chat history +	LLButton* mExpandCollapseLineBtn;  	LLButton* mExpandCollapseBtn;  	LLButton* mTearOffBtn;  	LLButton* mCloseBtn;  	LLButton* mGearBtn; +	S32 mFloaterHeight; +  private:  	// Handling selection and contextual menu @@ -180,7 +201,7 @@ private:  	 * and avoid overlapping, since input chat field can be vertically expanded.  	 * Implementation: chat history bottom "follows" top+top_pad of input chat field  	 */ -	void reshapeChatHistory(); +	void reshapeChatLayoutPanel();  	bool checkIfTornOff();      bool mIsHostAttached; diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index b308a820b2..a28af2101b 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -443,6 +443,8 @@ BOOL LLFloaterPreference::postBuild()  	std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");  	setCacheLocation(cache_location); +	getChild<LLUICtrl>("log_path_string")->setEnabled(FALSE); // make it read-only but selectable +  	getChild<LLComboBox>("language_combobox")->setCommitCallback(boost::bind(&LLFloaterPreference::onLanguageChange, this));  	getChild<LLComboBox>("FriendIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"FriendIMOptions")); @@ -1572,7 +1574,6 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im  	getChildView("send_im_to_email")->setEnabled(TRUE);  	getChild<LLUICtrl>("send_im_to_email")->setValue(im_via_email);  	getChildView("favorites_on_login_check")->setEnabled(TRUE); -	getChildView("log_path_string")->setEnabled(FALSE);// LineEditor becomes readonly in this case.  	getChildView("log_path_button")->setEnabled(TRUE);  	getChildView("chat_font_size")->setEnabled(TRUE);  } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 37f5888e8c..8c862548bb 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -154,6 +154,7 @@ static void on_avatar_name_cache_toast(const LLUUID& agent_id,  	args["FROM"] = av_name.getCompleteName();  	args["FROM_ID"] = msg["from_id"];  	args["SESSION_ID"] = msg["session_id"]; +	args["SESSION_TYPE"] = msg["session_type"];  	LLNotificationsUtil::add("IMToast", args, args, boost::bind(&LLFloaterIMContainer::showConversation, LLFloaterIMContainer::getInstance(), msg["session_id"].asUUID()));  } @@ -199,13 +200,13 @@ void on_new_message(const LLSD& msg)      // execution of the action      LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); - -	if (im_box->isFrontmost() && im_box->getSelectedSession() == session_id) +	LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(session_id); +	 +	if (im_box->isFrontmost() && im_box->getSelectedSession() == session_id +		&& !(session_floater->getHost() ? im_box->isMinimized() : session_floater->isMinimized()))  	{  		return;  	} - -	LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(session_id);      //session floater not focused (visible or not)      bool session_floater_not_focused = session_floater && !session_floater->hasFocus(); @@ -226,17 +227,18 @@ void on_new_message(const LLSD& msg)              && !session_floater->isMinimized()              && !(session_floater->getHost() && session_floater->getHost()->isMinimized()); -    if ("toast" == action && !session_floater_is_open) +    bool conversation_floater_collapsed = !session_floater->isMessagePaneExpanded(); +    if (("toast" == action && !session_floater_is_open) || conversation_floater_collapsed)      {          //User is not focused on conversation containing the message -        if(session_floater_not_focused) +        if(session_floater_not_focused || conversation_floater_collapsed)          {          	if(!LLMuteList::getInstance()->isMuted(participant_id))          	{          		im_box->flashConversationItemWidget(session_id, true);          	}              //The conversation floater isn't focused/open -            if(conversation_floater_not_focused) +            if(conversation_floater_not_focused || conversation_floater_collapsed)              {              	if(!LLMuteList::getInstance()->isMuted(participant_id)                       && !gAgent.isDoNotDisturb()) @@ -285,10 +287,23 @@ void on_new_message(const LLSD& msg)              {  				//Surface conversations floater  				LLFloaterReg::showInstance("im_container"); - -				if (session_floater && session_floater->isMinimized()) +				im_box->collapseMessagesPane(false); +				if (session_floater)  				{ -					LLFloater::onClickMinimize(session_floater); +					if (session_floater->getHost()) +					{ +						if (NULL != im_box && im_box->isMinimized()) +						{ +							LLFloater::onClickMinimize(im_box); +						} +					} +					else +					{ +						if (session_floater->isMinimized()) +						{ +							LLFloater::onClickMinimize(session_floater); +						} +					}  				}  			} @@ -641,8 +656,7 @@ void LLIMModel::LLIMSession::loadHistory()  LLIMModel::LLIMSession* LLIMModel::findIMSession(const LLUUID& session_id) const  { -	return get_if_there(mId2SessionMap, session_id, -		(LLIMModel::LLIMSession*) NULL); +	return get_if_there(mId2SessionMap, session_id, (LLIMModel::LLIMSession*) NULL);  }  //*TODO consider switching to using std::set instead of std::list for holding LLUUIDs across the whole code @@ -995,6 +1009,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co  	arg["from"] = from;  	arg["from_id"] = from_id;  	arg["time"] = LLLogChat::timestamp(false); +	arg["session_type"] = session->mSessionType;  	mNewMsgSignal(arg);  	return true; @@ -2638,7 +2653,7 @@ void LLIMMgr::addMessage(  	if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly"))  	{  		// Evaluate if we need to skip this message when that setting is true (default is false) -		LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id); +		LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(new_session_id);  		skip_message = (LLAvatarTracker::instance().getBuddyInfo(other_participant_id) == NULL);	// Skip non friends...  		skip_message &= !session->isGroupSessionType();			// Do not skip group chats...  		skip_message &= !(other_participant_id == gAgentID);	// You are your best friend... Don't skip yourself @@ -2654,7 +2669,7 @@ void LLIMMgr::addMessage(      {          LLFloaterReg::showInstance("im_container");  	    LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")-> -	    		flashConversationItemWidget(session_id, true); +	    		flashConversationItemWidget(new_session_id, true);      }  } @@ -2809,7 +2824,7 @@ LLUUID LLIMMgr::addSession(  		}  	} -	bool new_session = !LLIMModel::getInstance()->findIMSession(session_id); +	bool new_session = (LLIMModel::getInstance()->findIMSession(session_id) == NULL);  	//works only for outgoing ad-hoc sessions  	if (new_session && IM_SESSION_CONFERENCE_START == dialog && ids.size()) diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index c5283404f1..4138558bad 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -611,10 +611,10 @@ BOOL LLPanelPeople::postBuild()  	mGroupList->setNoItemsMsg(getString("no_groups_msg"));  	mGroupList->setNoFilteredItemsMsg(getString("no_filtered_groups_msg")); -	mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); -	mRecentList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); -	mAllFriendList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); -	mOnlineFriendList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); +	mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyPeopleContextMenu); +	mRecentList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu); +	mAllFriendList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu); +	mOnlineFriendList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu);  	setSortOrder(mRecentList,		(ESortOrder)gSavedSettings.getU32("RecentPeopleSortOrder"),	false);  	setSortOrder(mAllFriendList,	(ESortOrder)gSavedSettings.getU32("FriendsSortOrder"),		false); @@ -1143,7 +1143,10 @@ void LLPanelPeople::onGearButtonClicked(LLUICtrl* btn)  	uuid_vec_t selected_uuids;  	getCurrentItemIDs(selected_uuids);  	// Spawn at bottom left corner of the button. -	LLPanelPeopleMenus::gNearbyMenu.show(btn, selected_uuids, 0, 0); +	if (getActiveTabName() == NEARBY_TAB_NAME) +		LLPanelPeopleMenus::gNearbyPeopleContextMenu.show(btn, selected_uuids, 0, 0); +	else +		LLPanelPeopleMenus::gPeopleContextMenu.show(btn, selected_uuids, 0, 0);  }  void LLPanelPeople::onImButtonClicked() diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index 8af981b8ba..a68772a35d 100644 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -39,15 +39,18 @@  #include "llcallingcard.h"			// for LLAvatarTracker  #include "lllogchat.h"  #include "llviewermenu.h"			// for gMenuHolder +#include "llconversationmodel.h" +#include "llviewerobjectlist.h"  namespace LLPanelPeopleMenus  { -NearbyMenu gNearbyMenu; +PeopleContextMenu gPeopleContextMenu; +NearbyPeopleContextMenu gNearbyPeopleContextMenu; -//== NearbyMenu =============================================================== +//== PeopleContextMenu =============================================================== -LLContextMenu* NearbyMenu::createMenu() +LLContextMenu* PeopleContextMenu::createMenu()  {  	// set up the callbacks for all of the avatar menu items  	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; @@ -64,7 +67,8 @@ LLContextMenu* NearbyMenu::createMenu()  		registrar.add("Avatar.RemoveFriend",	boost::bind(&LLAvatarActions::removeFriendDialog, 		id));  		registrar.add("Avatar.IM",				boost::bind(&LLAvatarActions::startIM,					id));  		registrar.add("Avatar.Call",			boost::bind(&LLAvatarActions::startCall,				id)); -		registrar.add("Avatar.OfferTeleport",	boost::bind(&NearbyMenu::offerTeleport,					this)); +		registrar.add("Avatar.OfferTeleport",	boost::bind(&PeopleContextMenu::offerTeleport,			this)); +		registrar.add("Avatar.ZoomIn",			boost::bind(&handle_zoom_to_object,						id));  		registrar.add("Avatar.ShowOnMap",		boost::bind(&LLAvatarActions::showOnMap,				id));  		registrar.add("Avatar.Share",			boost::bind(&LLAvatarActions::share,					id));  		registrar.add("Avatar.Pay",				boost::bind(&LLAvatarActions::pay,						id)); @@ -73,33 +77,72 @@ LLContextMenu* NearbyMenu::createMenu()  		registrar.add("Avatar.TeleportRequest",	boost::bind(&LLAvatarActions::teleportRequest,			id));  		registrar.add("Avatar.Calllog",			boost::bind(&LLAvatarActions::viewChatHistory,			id)); -		enable_registrar.add("Avatar.EnableItem", boost::bind(&NearbyMenu::enableContextMenuItem,	this, _2)); -		enable_registrar.add("Avatar.CheckItem",  boost::bind(&NearbyMenu::checkContextMenuItem,	this, _2)); +		enable_registrar.add("Avatar.EnableItem", boost::bind(&PeopleContextMenu::enableContextMenuItem, this, _2)); +		enable_registrar.add("Avatar.CheckItem",  boost::bind(&PeopleContextMenu::checkContextMenuItem,	this, _2));  		// create the context menu from the XUI  		menu = createFromFile("menu_people_nearby.xml"); +		buildContextMenu(*menu, 0x0);  	}  	else  	{  		// Set up for multi-selected People  		// registrar.add("Avatar.AddFriend",	boost::bind(&LLAvatarActions::requestFriendshipDialog,	mUUIDs)); // *TODO: unimplemented -		registrar.add("Avatar.IM",			boost::bind(&LLAvatarActions::startConference,			mUUIDs, LLUUID::null)); -		registrar.add("Avatar.Call",		boost::bind(&LLAvatarActions::startAdhocCall,			mUUIDs, LLUUID::null)); -		registrar.add("Avatar.OfferTeleport",	boost::bind(&NearbyMenu::offerTeleport,					this)); -		registrar.add("Avatar.RemoveFriend",boost::bind(&LLAvatarActions::removeFriendsDialog,		mUUIDs)); +		registrar.add("Avatar.IM",				boost::bind(&LLAvatarActions::startConference,			mUUIDs, LLUUID::null)); +		registrar.add("Avatar.Call",			boost::bind(&LLAvatarActions::startAdhocCall,			mUUIDs, LLUUID::null)); +		registrar.add("Avatar.OfferTeleport",	boost::bind(&PeopleContextMenu::offerTeleport,			this)); +		registrar.add("Avatar.RemoveFriend",	boost::bind(&LLAvatarActions::removeFriendsDialog,		mUUIDs));  		// registrar.add("Avatar.Share",		boost::bind(&LLAvatarActions::startIM,					mUUIDs)); // *TODO: unimplemented -		// registrar.add("Avatar.Pay",		boost::bind(&LLAvatarActions::pay,						mUUIDs)); // *TODO: unimplemented -		enable_registrar.add("Avatar.EnableItem",	boost::bind(&NearbyMenu::enableContextMenuItem,	this, _2)); +		// registrar.add("Avatar.Pay",			boost::bind(&LLAvatarActions::pay,						mUUIDs)); // *TODO: unimplemented +		 +		enable_registrar.add("Avatar.EnableItem",	boost::bind(&PeopleContextMenu::enableContextMenuItem, this, _2));  		// create the context menu from the XUI  		menu = createFromFile("menu_people_nearby_multiselect.xml"); +		buildContextMenu(*menu, ITEM_IN_MULTI_SELECTION);  	}      return menu;  } -bool NearbyMenu::enableContextMenuItem(const LLSD& userdata) +void PeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags) +{ +    menuentry_vec_t items; +    menuentry_vec_t disabled_items; +	 +	if (flags & ITEM_IN_MULTI_SELECTION) +	{ +		items.push_back(std::string("add_friends")); +		items.push_back(std::string("remove_friends")); +		items.push_back(std::string("im")); +		items.push_back(std::string("call")); +		items.push_back(std::string("share")); +		items.push_back(std::string("pay")); +		items.push_back(std::string("offer_teleport")); +	} +	else  +	{ +		items.push_back(std::string("view_profile")); +		items.push_back(std::string("im")); +		items.push_back(std::string("offer_teleport")); +		items.push_back(std::string("voice_call")); +		items.push_back(std::string("chat_history")); +		items.push_back(std::string("separator_chat_history")); +		items.push_back(std::string("add_friend")); +		items.push_back(std::string("remove_friend")); +		items.push_back(std::string("invite_to_group")); +		items.push_back(std::string("separator_invite_to_group")); +		items.push_back(std::string("map")); +		items.push_back(std::string("share")); +		items.push_back(std::string("pay")); +		items.push_back(std::string("block_unblock")); +	} + +    hide_context_entries(menu, items, disabled_items); +} + +bool PeopleContextMenu::enableContextMenuItem(const LLSD& userdata)  {  	if(gAgent.getID() == mUUIDs.front())  	{ @@ -171,6 +214,12 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)  	{  		return LLAvatarActions::canCall();  	} +	else if (item == std::string("can_zoom_in")) +	{ +		const LLUUID& id = mUUIDs.front(); + +		return gObjectList.findObject(id); +	}  	else if (item == std::string("can_show_on_map"))  	{  		const LLUUID& id = mUUIDs.front(); @@ -194,7 +243,7 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)  	return false;  } -bool NearbyMenu::checkContextMenuItem(const LLSD& userdata) +bool PeopleContextMenu::checkContextMenuItem(const LLSD& userdata)  {  	std::string item = userdata.asString();  	const LLUUID& id = mUUIDs.front(); @@ -207,11 +256,50 @@ bool NearbyMenu::checkContextMenuItem(const LLSD& userdata)  	return false;  } -void NearbyMenu::offerTeleport() +void PeopleContextMenu::offerTeleport()  {  	// boost::bind cannot recognize overloaded method LLAvatarActions::offerTeleport(),  	// so we have to use a wrapper.  	LLAvatarActions::offerTeleport(mUUIDs);  } +//== NearbyPeopleContextMenu =============================================================== + +void NearbyPeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags) +{ +    menuentry_vec_t items; +    menuentry_vec_t disabled_items; +	 +	if (flags & ITEM_IN_MULTI_SELECTION) +	{ +		items.push_back(std::string("add_friends")); +		items.push_back(std::string("remove_friends")); +		items.push_back(std::string("im")); +		items.push_back(std::string("call")); +		items.push_back(std::string("share")); +		items.push_back(std::string("pay")); +		items.push_back(std::string("offer_teleport")); +	} +	else  +	{ +		items.push_back(std::string("view_profile")); +		items.push_back(std::string("im")); +		items.push_back(std::string("offer_teleport")); +		items.push_back(std::string("voice_call")); +		items.push_back(std::string("chat_history")); +		items.push_back(std::string("separator_chat_history")); +		items.push_back(std::string("add_friend")); +		items.push_back(std::string("remove_friend")); +		items.push_back(std::string("invite_to_group")); +		items.push_back(std::string("separator_invite_to_group")); +		items.push_back(std::string("zoom_in")); +		items.push_back(std::string("map")); +		items.push_back(std::string("share")); +		items.push_back(std::string("pay")); +		items.push_back(std::string("block_unblock")); +	} + +    hide_context_entries(menu, items, disabled_items); +} +  } // namespace LLPanelPeopleMenus diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h index d51eaec716..0a1dcef303 100644 --- a/indra/newview/llpanelpeoplemenus.h +++ b/indra/newview/llpanelpeoplemenus.h @@ -33,19 +33,33 @@ namespace LLPanelPeopleMenus  {  /** - * Menu used in the nearby people list. + * Menu used in the people lists.   */ -class NearbyMenu : public LLListContextMenu +class PeopleContextMenu : public LLListContextMenu  {  public:  	/*virtual*/ LLContextMenu* createMenu(); + +protected: +	virtual void buildContextMenu(class LLMenuGL& menu, U32 flags); +  private:  	bool enableContextMenuItem(const LLSD& userdata);  	bool checkContextMenuItem(const LLSD& userdata);  	void offerTeleport();  }; -extern NearbyMenu gNearbyMenu; +/** + * Menu used in the nearby people list. + */ +class NearbyPeopleContextMenu : public PeopleContextMenu +{ +protected: +	/*virtual*/ void buildContextMenu(class LLMenuGL& menu, U32 flags); +}; + +extern PeopleContextMenu gPeopleContextMenu; +extern NearbyPeopleContextMenu gNearbyPeopleContextMenu;  } // namespace LLPanelPeopleMenus diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index ffeea2f4df..40577118ba 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -1038,7 +1038,6 @@ void render_hud_attachments()  	if (LLPipeline::sShowHUDAttachments && !gDisconnected && setup_hud_matrices())  	{  		LLCamera hud_cam = *LLViewerCamera::getInstance(); -		LLVector3 origin = hud_cam.getOrigin();  		hud_cam.setOrigin(-1.f,0,0);  		hud_cam.setAxes(LLVector3(1,0,0), LLVector3(0,1,0), LLVector3(0,0,1));  		LLViewerCamera::updateFrustumPlanes(hud_cam, TRUE); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 8b674e479f..35839aeca0 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2382,7 +2382,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  	    LLPostponedNotification::add<LLPostponedIMSystemTipNotification>(params, from_id, false);  		break; -	case IM_NOTHING_SPECIAL:  +	case IM_NOTHING_SPECIAL:	// p2p IM  		// Don't show dialog, just do IM  		if (!gAgent.isGodlike()  				&& gAgent.getRegion()->isPrelude()  @@ -2783,47 +2783,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  	}  	break; -	case IM_SESSION_SEND: -	{ -		if (is_do_not_disturb) -		{ -			return; -		} - -		// Only show messages if we have a session open (which -		// should happen after you get an "invitation" -		if ( !gIMMgr->hasSession(session_id) ) -		{ -			return; -		} - -		// standard message, not from system -		std::string saved; -		if(offline == IM_OFFLINE) -		{ -			saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str()); -		} -		buffer = saved + message; -		BOOL is_this_agent = FALSE; -		if(from_id == gAgentID) -		{ -			is_this_agent = TRUE; -		} -		gIMMgr->addMessage( -			session_id, -			from_id, -			name, -			buffer, -			IM_OFFLINE == offline, -			ll_safe_string((char*)binary_bucket), -			IM_SESSION_INVITE, -			parent_estate_id, -			region_id, -			position, -			true); -	} -	break; -  	case IM_FROM_TASK:  		{  			if (is_do_not_disturb && !is_owned_by_me) @@ -2922,6 +2881,76 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			LLPostponedNotification::add<LLPostponedServerObjectNotification>(params, from_id, from_group);  		}  		break; + +	case IM_SESSION_SEND:		// ad-hoc or group IMs + +		// Only show messages if we have a session open (which +		// should happen after you get an "invitation" +		if ( !gIMMgr->hasSession(session_id) ) +		{ +			return; +		} + +		else if (offline == IM_ONLINE && is_do_not_disturb) +		{ + +			// return a standard "do not disturb" message, but only do it to online IM  +			// (i.e. not other auto responses and not store-and-forward IM) +			if (!gIMMgr->hasSession(session_id)) +			{ +				// if there is not a panel for this conversation (i.e. it is a new IM conversation +				// initiated by the other party) then... +				send_do_not_disturb_message(msg, from_id, session_id); +			} + +			// now store incoming IM in chat history + +			buffer = message; +	 +			LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL; + +			// add to IM panel, but do not bother the user +			gIMMgr->addMessage( +				session_id, +				from_id, +				name, +				buffer, +				IM_OFFLINE == offline, +				ll_safe_string((char*)binary_bucket), +				IM_SESSION_INVITE, +				parent_estate_id, +				region_id, +				position, +				true); +		} +		else +		{ +			// standard message, not from system +			std::string saved; +			if(offline == IM_OFFLINE) +			{ +				saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str()); +			} + +			buffer = saved + message; + +			LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL; + +			gIMMgr->addMessage( +				session_id, +				from_id, +				name, +				buffer, +				IM_OFFLINE == offline, +				ll_safe_string((char*)binary_bucket), +				IM_SESSION_INVITE, +				parent_estate_id, +				region_id, +				position, +				true); +		} +		break; +  	case IM_FROM_TASK_AS_ALERT:  		if (is_do_not_disturb && !is_owned_by_me)  		{ diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index e44a2cc4df..4afd90b44c 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2827,7 +2827,6 @@ void LLViewerWindow::updateUI()  	BOOL handled = FALSE; -	BOOL handled_by_top_ctrl = FALSE;  	LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();  	LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();  	LLView* captor_view = dynamic_cast<LLView*>(mouse_captor); @@ -3012,7 +3011,6 @@ void LLViewerWindow::updateUI()  				S32 local_x, local_y;  				top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );  				handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleHover(local_x, local_y, mask); -				handled_by_top_ctrl = TRUE;  			}  			if ( !handled ) diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index c74d9f1292..d295fc60cd 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3097,6 +3097,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)  	// Rebuild name tag if state change detected  	if (mNameString.empty() +		|| (mNameString.size() == 2 && mNameString[0] == 10 && mNameString[1] == 10) // *TODO : find out why mNameString is sometimes ""  		|| new_name  		|| (!title && !mTitle.empty())  		|| (title && mTitle != title->getString()) diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index ccc513b80d..11b2770ec0 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -965,8 +965,6 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&  	S32 text_x = x;  	S32 text_y = (S32)(y - sTrackCircleImage->getHeight()/2 - font->getLineHeight()); -	BOOL is_in_window = true; -  	if(    x < 0   		|| y < 0   		|| x >= getRect().getWidth()  @@ -979,7 +977,6 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&  			text_x = sTrackingArrowX;  			text_y = sTrackingArrowY;  		} -		is_in_window = false;  	}  	else if (LLTracker::getTrackingStatus() == LLTracker::TRACKING_LOCATION &&  		LLTracker::getTrackedLocationType() != LLTracker::LOCATION_NOTHING) diff --git a/indra/newview/skins/default/textures/icons/collapse_to_one_line.png b/indra/newview/skins/default/textures/icons/collapse_to_one_line.pngBinary files differ new file mode 100644 index 0000000000..d57144a645 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/collapse_to_one_line.png diff --git a/indra/newview/skins/default/textures/icons/expand_one_liner.png b/indra/newview/skins/default/textures/icons/expand_one_liner.pngBinary files differ new file mode 100644 index 0000000000..58b7d90131 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/expand_one_liner.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index a07d7e4855..93c9cb02cb 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -171,6 +171,8 @@ with the same filename but different name    <texture name="Conv_toolbar_call_log" file_name="icons/Conv_toolbar_call_log.png" preload="false" />    <texture name="Conv_toolbar_close" file_name="icons/Conv_toolbar_close.png" preload="false" />    <texture name="Conv_toolbar_collapse" file_name="icons/Conv_toolbar_collapse.png" preload="false" /> +  <texture name="Conv_collapse_to_one_line" file_name="icons/collapse_to_one_line.png" preload="false" /> +  <texture name="Conv_expand_one_line" file_name="icons/expand_one_liner.png" preload="false" />    <texture name="Conv_toolbar_expand" file_name="icons/Conv_toolbar_expand.png" preload="false" />    <texture name="Conv_toolbar_hang_up" file_name="icons/Conv_toolbar_hang_up.png" preload="false" />    <texture name="Conv_toolbar_open_call" file_name="icons/Conv_toolbar_open_call.png" preload="false" /> diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml index 12c1676127..65f623a47e 100644 --- a/indra/newview/skins/default/xui/en/floater_im_container.xml +++ b/indra/newview/skins/default/xui/en/floater_im_container.xml @@ -61,7 +61,7 @@                       image_unselected="Toolbar_Middle_Off"                       menu_filename="menu_participant_view.xml"                       layout="topleft" -                     left="10" +                     left="5"                       name="sort_btn"                       tool_tip="View/sort options"                       top="5" @@ -75,7 +75,7 @@                       image_unselected="Toolbar_Middle_Off"                       layout="topleft"                       top="5" -                     left_pad="4" +                     left_pad="2"                       name="add_btn"                       tool_tip="Start a new conversation"                       width="31"/> @@ -88,7 +88,7 @@                       image_unselected="Toolbar_Middle_Off"                       layout="topleft"                       top="5" -                     left_pad="4" +                     left_pad="2"                       name="speak_btn"                       tool_tip="Speak with people using your microphone"                       width="31"/>	 @@ -114,7 +114,7 @@                  </layout_panel>              </layout_stack>              <panel -             bottom="-5" +             bottom="-1"               follows="all"               layout="topleft"               name="conversations_list_panel" @@ -129,7 +129,7 @@           name="messages_layout_panel"           expanded_min_dim="222">              <panel_container -             bottom="-5" +             bottom="-1"               follows="all"               layout="topleft"               left="0" diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index 8f0574177f..d8b085063f 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -14,12 +14,17 @@   width="394"   can_resize="true"   can_tear_off="false" - min_width="340"   min_height="190"   positioning="relative">      <floater.string name="call_btn_start">Conv_toolbar_open_call</floater.string>      <floater.string name="call_btn_stop">Conv_toolbar_hang_up</floater.string>      <floater.string +     name="collapseline_icon" +     value="Conv_collapse_to_one_line"/> +    <floater.string +     name="expandline_icon" +     value="Conv_expand_one_line"/> +    <floater.string       name="collapse_icon"       value="Conv_toolbar_collapse"/>      <floater.string @@ -65,14 +70,28 @@          top="0"          left="0"          height="355" -        width="394">  -     <panel +        width="394"> +   <layout_stack +   animate="false"  +   default_tab_group="2" +   follows="all" +  height="355" +  width="394" +  layout="topleft" +  orientation="vertical" +   name="main_stack" +  tab_group="1" +  top="0" +  left="0"> +   +     <layout_panel           follows="left|top|right"           layout="topleft"           name="toolbar_panel"           top="0"           left="0"           height="35" +         min_height="35"           width="394">                        <menu_button                   menu_filename="menu_im_session_showmodes.xml" @@ -98,7 +117,7 @@  				 image_unselected="Toolbar_Middle_Off"  				 layout="topleft"  			 	 top="5" -			 	 left_pad="4" +			 	 left_pad="2"  				 name="gear_btn"  				 visible="false"  				 tool_tip="Actions on selected person" @@ -113,7 +132,7 @@                   image_unselected="Toolbar_Middle_Off"                   layout="topleft"                   top="5" -                 left_pad="4" +                 left_pad="2"                   name="add_btn"                   tool_tip="Add someone to this conversation"                   width="31"/> @@ -126,7 +145,7 @@                   image_unselected="Toolbar_Middle_Off"                   layout="topleft"                   top="5" -                 left_pad="4" +                 left_pad="2"                   name="voice_call_btn"                   tool_tip="Open voice connection"                   width="31"/> @@ -151,7 +170,7 @@                   image_unselected="Toolbar_Middle_Off"                   layout="topleft"                   top="5" -                 left="283" +                 left="292"                   name="close_btn"                   tool_tip="End this conversation"                   width="31" /> @@ -164,7 +183,7 @@               	 image_unselected="Toolbar_Middle_Off"                   layout="topleft"                   top="5" -                 left_pad="5" +                 left_pad="2"                   name="expand_collapse_btn"                   tool_tip="Collapse/Expand this pane"                   width="31" /> @@ -177,15 +196,22 @@               	 image_unselected="Toolbar_Middle_Off"                   layout="topleft"                   top="5" -                 left_pad="5" +                 left_pad="2"                   name="tear_off_btn"                   width="31" /> -     </panel> +     </layout_panel> +     <layout_panel +      name="body_panel" +      follows="all" +      width="394"  +      height="235"  +      user_resize="false" +      auto_resize="true">    <layout_stack     animate="true"      default_tab_group="2"    follows="all" -  height="310" +  height="275"    width="394"    layout="topleft"    orientation="horizontal" @@ -196,11 +222,12 @@      <layout_panel        name="speakers_list_panel"        follows="all" -      min_width="115" +      expanded_min_dim="115" +      min_dim="0"        width="150"  -      height="310"  +      height="275"        user_resize="true" -      auto_resize="true"> +      auto_resize="false">        </layout_panel>      <layout_panel         default_tab_group="3" @@ -208,26 +235,26 @@         tab_group="2"         follows="all"         top="0" -       height="310" +       height="275"  	   width="244"         layout="topleft"         user_resize="true"         auto_resize="true"         visible="true" -       name="left_part_holder" +       name="right_part_holder"         min_width="221">          <panel           name="trnsAndChat_panel"           follows="all"           layout="topleft"           visible="true" -         height="275" +         height="240"           width="244">           <layout_stack            animate="true"             default_tab_group="2"            follows="all" -          height="275" +          height="240"            width="244"            layout="topleft"            visible="true" @@ -239,6 +266,7 @@            left="0">              <layout_panel               auto_resize="false" +             user_resize="false"               height="26"               layout="topleft"               left_delta="0" @@ -258,7 +286,6 @@                   width="230" />              </layout_panel>              <layout_panel -             height="248"               width="210"               layout="topleft"               follows="all" @@ -266,43 +293,109 @@               top_delta="0"               bottom="0"               visible="true" -             user_resize="true" +             user_resize="false"               auto_resize="true"               name="chat_holder">                       <chat_history                  font="SansSerifSmall"                  follows="all"                  visible="true" -                height="240"                  name="chat_history"                  parse_highlights="true"                  parse_urls="true" +                layout="topleft"                  right="-5" -                left="5"> +                left="5" +                top="0" +                bottom="1">                 </chat_history>              </layout_panel>             </layout_stack>             </panel> -            <chat_editor +    </layout_panel> +  </layout_stack> +  </layout_panel> +  <layout_panel +             height="35" +             layout="topleft" +             follows="left|right|bottom" +             left_delta="0" +             right="0" +             top_delta="0"               bottom="0" +             visible="true" +             user_resize="false" +             auto_resize="false" +             name="chat_layout_panel"> +   <layout_stack +   animate="true"  +   default_tab_group="2" +   follows="all" +   height="35" +   right="0" +   layout="topleft" +   orientation="horizontal" +   name="input_panels" +   top_pad="0" +   left="0"> +     <layout_panel +             height="35" +             layout="topleft" +             follows="left|right|bottom" +             left_delta="0" +             top_delta="0" +             bottom="0" +             visible="true" +             user_resize="false" +             auto_resize="true" +             name="input_editor_layout_panel"> +              <chat_editor               expand_lines_count="5"               follows="left|right|bottom" -	           font="SansSerifSmall" +               font="SansSerifSmall"               visible="true"               height="20"               is_expandable="true"               label="To"               text_tentative_color="TextFgTentativeColor" -             layout="bottomleft" +             layout="topleft"               name="chat_editor"               max_length="1023"               spellcheck="true"               tab_group="3" -             width="220" -             left="10" +             width="160" +             top="6" +             left="5" +             right="-5"               wrap="true">              </chat_editor> -    </layout_panel> +            </layout_panel> +            <layout_panel              +             height="35" +             layout="topleft" +             follows="left|right|bottom" +             left_delta="0" +             top_delta="0" +             bottom="0" +             width="35" +             visible="true" +             user_resize="false" +             auto_resize="false" +             name="input_button_layout_panel"> +            <button +                 follows="left|right|bottom" +                 height="25" +                 image_hover_unselected="Toolbar_Middle_Over" +                 image_overlay="Conv_expand_one_line" +                 image_selected="Toolbar_Middle_Selected" +                 image_unselected="Toolbar_Middle_Off" +                 layout="topleft" +                 name="minz_btn" +                 tool_tip="Shows/hides message panel" +                 width="28"/> +           </layout_panel> +  </layout_stack> +  </layout_panel>    </layout_stack>      </view>  </floater> diff --git a/indra/newview/skins/default/xui/en/menu_conversation.xml b/indra/newview/skins/default/xui/en/menu_conversation.xml index fd5c86b3ca..5a13ef0a59 100644 --- a/indra/newview/skins/default/xui/en/menu_conversation.xml +++ b/indra/newview/skins/default/xui/en/menu_conversation.xml @@ -89,7 +89,14 @@          <on_click function="Avatar.DoToSelected" parameter="invite_to_group" />          <on_enable function="Avatar.EnableItem" parameter="can_invite" />      </menu_item_call> -    <menu_item_separator layout="topleft" name="separator_invite_to_group"/>		 +    <menu_item_separator layout="topleft" name="separator_invite_to_group"/> +    <menu_item_call +     label="Zoom In" +     layout="topleft" +     name="zoom_in"> +      <on_click function="Avatar.DoToSelected" parameter="zoom_in" /> +      <on_enable function="Avatar.EnableItem" parameter="can_zoom_in" /> +    </menu_item_call>      <menu_item_call       label="Map"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_im_conversation.xml b/indra/newview/skins/default/xui/en/menu_im_conversation.xml index 8882d0a7d8..43287c6ec3 100644 --- a/indra/newview/skins/default/xui/en/menu_im_conversation.xml +++ b/indra/newview/skins/default/xui/en/menu_im_conversation.xml @@ -50,6 +50,13 @@      <menu_item_separator       layout="topleft"/>      <menu_item_call +       label="Zoom In" +       layout="topleft" +       name="zoom_in"> +      <on_click function="Avatar.DoToSelected" parameter="zoom_in" /> +      <on_enable function="Avatar.EnableItem" parameter="can_zoom_in" /> +    </menu_item_call> +    <menu_item_call       label="Map"       layout="topleft"       name="map"> diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml index 3f3bef6fe7..25b100bc94 100644 --- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml @@ -1,18 +1,18 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <context_menu   layout="topleft" - name="Avatar Context Menu"> + name="Nearby People Context Menu">      <menu_item_call       label="View Profile"       layout="topleft" -     name="View Profile"> +     name="view_profile">          <menu_item_call.on_click           function="Avatar.Profile" />      </menu_item_call>      <menu_item_call       label="IM"       layout="topleft" -     name="IM"> +     name="im">          <menu_item_call.on_click           function="Avatar.IM" />          <menu_item_call.on_enable @@ -21,7 +21,7 @@      </menu_item_call>      <menu_item_call      label="Offer Teleport" -    name="teleport"> +    name="offer_teleport">        <menu_item_call.on_click         function="Avatar.OfferTeleport"/>        <menu_item_call.on_enable @@ -31,7 +31,7 @@      <menu_item_call       label="Voice call"       layout="topleft" -     name="Call"> +     name="voice_call">          <menu_item_call.on_click           function="Avatar.Call" />          <menu_item_call.on_enable @@ -42,18 +42,18 @@      <menu_item_call       label="View chat history..."       layout="topleft" -     name="Chat history"> +     name="chat_history">          <menu_item_call.on_click           function="Avatar.Calllog" />          <menu_item_call.on_enable        	 function="Avatar.EnableItem"           parameter="can_callog"/>      </menu_item_call> -    <menu_item_separator /> +    <menu_item_separator name="separator_chat_history"/>      <menu_item_call       label="Add Friend"       layout="topleft" -     name="Add Friend"> +     name="add_friend">          <menu_item_call.on_click           function="Avatar.AddFriend" />          <menu_item_call.on_visible @@ -63,7 +63,7 @@      <menu_item_call       label="Remove Friend"       layout="topleft" -     name="Remove Friend"> +     name="remove_friend">          <menu_item_call.on_click           function="Avatar.RemoveFriend" />          <menu_item_call.on_enable @@ -73,18 +73,28 @@      <menu_item_call       label="Invite to group..."       layout="topleft" -     name="Invite"> +     name="invite_to_group">          <menu_item_call.on_click           function="Avatar.InviteToGroup" />          <menu_item_call.on_enable        	 function="Avatar.EnableItem"           parameter="can_invite"/>      </menu_item_call> -    <menu_item_separator /> +    <menu_item_separator name="separator_invite_to_group"/> +    <menu_item_call +     label="Zoom In" +     layout="topleft" +     name="zoom_in"> +      <menu_item_call.on_click +       function="Avatar.ZoomIn" /> +      <menu_item_call.on_enable +       function="Avatar.EnableItem" +       parameter="can_zoom_in"/> +    </menu_item_call>      <menu_item_call       label="Map"       layout="topleft" -     name="Map"> +     name="map">          <menu_item_call.on_click           function="Avatar.ShowOnMap" />          <menu_item_call.on_enable @@ -94,7 +104,7 @@      <menu_item_call       label="Share"       layout="topleft" -     name="Share"> +     name="share">          <menu_item_call.on_click           function="Avatar.Share" />          <menu_item_call.on_enable @@ -104,7 +114,7 @@      <menu_item_call       label="Pay"       layout="topleft" -     name="Pay"> +     name="pay">          <menu_item_call.on_click           function="Avatar.Pay" />          <menu_item_call.on_enable @@ -114,7 +124,7 @@      <menu_item_check       label="Block/Unblock"       layout="topleft" -     name="Block/Unblock"> +     name="block_unblock">          <menu_item_check.on_click           function="Avatar.BlockUnblock" />          <menu_item_check.on_check diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml index 5d58a9d289..5f973088fd 100644 --- a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml @@ -6,7 +6,7 @@       enabled="false"       label="Add Friends"       layout="topleft" -     name="Add Friends"> +     name="add_friends">          <on_click           function="Avatar.AddFriends" />          <on_enable @@ -16,7 +16,7 @@      <menu_item_call       label="Remove Friends"       layout="topleft" -     name="Remove Friend"> +     name="remove_friends">          <menu_item_call.on_click           function="Avatar.RemoveFriend" />          <menu_item_call.on_enable @@ -26,7 +26,7 @@      <menu_item_call       label="IM"       layout="topleft" -     name="IM"> +     name="im">          <on_click           function="Avatar.IM" />      </menu_item_call> @@ -34,7 +34,7 @@       enabled="false"       label="Call"       layout="topleft" -     name="Call"> +     name="call">          <on_click           function="Avatar.Call" />          <on_enable @@ -45,7 +45,7 @@       enabled="false"       label="Share"       layout="topleft" -     name="Share"> +     name="share">          <on_click           function="Avatar.Share" />      </menu_item_call> @@ -53,13 +53,13 @@       enabled="false"       label="Pay"       layout="topleft" -     name="Pay"> +     name="pay">          <on_click           function="Avatar.Pay" />      </menu_item_call>      <menu_item_call      label="Offer Teleport" -    name="teleport"> +    name="offer_teleport">        <menu_item_call.on_click         function="Avatar.OfferTeleport"/>        <menu_item_call.on_enable diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index 9db3816c92..bd096ebb88 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -429,7 +429,6 @@      </text>      <line_editor -    	enabled="false"          control_name="InstantMessageLogPath"          border_style="line"          border_thickness="1" | 
