diff options
Diffstat (limited to 'indra/newview')
60 files changed, 1004 insertions, 580 deletions
| diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml index ab18febccc..e825f13e82 100644 --- a/indra/newview/app_settings/ignorable_dialogs.xml +++ b/indra/newview/app_settings/ignorable_dialogs.xml @@ -177,21 +177,10 @@        <key>Value</key>        <integer>1</integer>      </map> -    <key>FirstStreamingMusic</key> +    <key>FirstStreamingMedia</key>      <map>        <key>Comment</key> -      <string>Enables FirstStreamingMusic warning dialog</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>1</integer> -    </map> -    <key>FirstStreamingVideo</key> -    <map> -      <key>Comment</key> -      <string>Enables FirstStreamingVideo warning dialog</string> +      <string>Enables FirstStreamingMedia warning dialog</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index e24e1a8605..61cb93b675 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -276,7 +276,7 @@        <key>Value</key>        <real>0.5</real>      </map> -	<key>AudioSteamingMedia</key> +	<key>AudioStreamingMedia</key>      <map>        <key>Comment</key>        <string>Enable streaming</string> @@ -408,6 +408,17 @@        <key>Value</key>        <integer>1</integer>      </map> +    <key>AvalinePhoneSeparator</key> +    <map> +      <key>Comment</key> +      <string>Separator of phone parts to have Avaline numbers human readable in Voice Control Panel</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>-</string> +    </map>      <key>AvatarAxisDeadZone0</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index d2a56f65dd..5e2e374df6 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -2812,7 +2812,7 @@ void LLAgent::endAnimationUpdateUI()  		LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); -		LLFloaterCamera::toPrevModeIfInAvatarViewMode(); +		LLFloaterCamera::onLeavingMouseLook();  		// Only pop if we have pushed...  		if (TRUE == mViewsPushed) @@ -2915,10 +2915,6 @@ void LLAgent::endAnimationUpdateUI()  		// JC - Added for always chat in third person option  		gFocusMgr.setKeyboardFocus(NULL); -		//Making sure Camera Controls floater is in the right state  -		//when entering Mouse Look using wheel scrolling -		LLFloaterCamera::updateIfNotInAvatarViewMode(); -  		LLToolMgr::getInstance()->setCurrentToolset(gMouselookToolset);  		mViewsPushed = TRUE; diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index dc1598aacd..d21965568d 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -116,6 +116,39 @@ BOOL LLAgentWearables::mInitialWearablesUpdateReceived = FALSE;  using namespace LLVOAvatarDefines; +// HACK: For EXT-3923: Pants item shows in inventory with skin icon and messes with "current look" +// Some db items are corrupted, have inventory flags = 0, implying wearable type = shape, even though +// wearable type stored in asset is some other value. +// Calling this function whenever a wearable is added to increase visibility if this problem +// turns up in other inventories. +void checkWearableAgainstInventory(LLWearable *wearable) +{ +	if (wearable->getItemID().isNull()) +		return; +	 +	// Check for wearable type consistent with inventory item wearable type. +	LLViewerInventoryItem *item = gInventory.getItem(wearable->getItemID()); +	if (item) +	{ +		if (!item->isWearableType()) +		{ +			llwarns << "wearable associated with non-wearable item" << llendl; +		} +		if (item->getWearableType() != wearable->getType()) +		{ +			llwarns << "type mismatch: wearable " << wearable->getName() +					<< " has type " << wearable->getType() +					<< " but inventory item " << item->getName() +					<< " has type "  << item->getWearableType() << llendl; +		} +	} +	else +	{ +		llwarns << "wearable inventory item not found" << wearable->getName() +				<< " itemID " << wearable->getItemID().asString() << llendl; +	} +} +  void LLAgentWearables::dump()  {  	llinfos << "LLAgentWearablesDump" << llendl; @@ -657,6 +690,7 @@ LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 index)  void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearable *wearable)  { +  	LLWearable *old_wearable = getWearable(type,index);  	if (!old_wearable)  	{ @@ -680,6 +714,7 @@ void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearab  		wearable_vec[index] = wearable;  		old_wearable->setLabelUpdated();  		wearableUpdated(wearable); +		checkWearableAgainstInventory(wearable);  	}  } @@ -695,6 +730,7 @@ U32 LLAgentWearables::pushWearable(const EWearableType type, LLWearable *wearabl  	{  		mWearableDatas[type].push_back(wearable);  		wearableUpdated(wearable); +		checkWearableAgainstInventory(wearable);  		return mWearableDatas[type].size()-1;  	}  	return MAX_WEARABLES_PER_TYPE; @@ -1360,6 +1396,7 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)  	LLPointer<LLInventoryCallback> cb = new LLAutoRenameFolder(folder_id);  	LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, cb); +	LLAppearanceManager::instance().createBaseOutfitLink(folder_id, NULL);  	return folder_id;  } @@ -1705,6 +1742,7 @@ void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* n  		mWearableDatas[type].push_back(new_wearable);  		llinfos << "Added additional wearable for type " << type  				<< " size is now " << mWearableDatas[type].size() << llendl; +		checkWearableAgainstInventory(new_wearable);  	}  	else  	{ diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 43b2f34ecd..25f1accb22 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -364,7 +364,7 @@ LLUUID LLAppearanceManager::getCOF()  } -const LLViewerInventoryItem* LLAppearanceManager::getCurrentOutfitLink() +const LLViewerInventoryItem* LLAppearanceManager::getBaseOutfitLink()  {  	const LLUUID& current_outfit_cat = getCOF();  	LLInventoryModel::cat_array_t cat_array; @@ -444,6 +444,28 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID  	}  } +void LLAppearanceManager::purgeBaseOutfitLink(const LLUUID& category) +{ +	LLInventoryModel::cat_array_t cats; +	LLInventoryModel::item_array_t items; +	gInventory.collectDescendents(category, cats, items, +								  LLInventoryModel::EXCLUDE_TRASH); +	for (S32 i = 0; i < items.count(); ++i) +	{ +		LLViewerInventoryItem *item = items.get(i); +		if (item->getActualType() != LLAssetType::AT_LINK_FOLDER) +			continue; +		if (item->getIsLinkType()) +		{ +			LLViewerInventoryCategory* catp = item->getLinkedCategory(); +			if(catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT) +			{ +				gInventory.purgeObject(item->getUUID()); +			} +		} +	} +} +  void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links)  {  	LLInventoryModel::cat_array_t cats; @@ -578,17 +600,9 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)  	linkAll(cof, gest_items, link_waiter);  	// Add link to outfit if category is an outfit.  -	LLViewerInventoryCategory* catp = gInventory.getCategory(category);  	if (!append)  	{ -		std::string new_outfit_name = ""; -		if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT) -		{ -			link_inventory_item(gAgent.getID(), category, cof, catp->getName(), -								LLAssetType::AT_LINK_FOLDER, link_waiter); -			new_outfit_name = catp->getName(); -		} -		updatePanelOutfitName(new_outfit_name); +		createBaseOutfitLink(category, link_waiter);  	}  } @@ -602,6 +616,22 @@ void LLAppearanceManager::updatePanelOutfitName(const std::string& name)  	}  } +void LLAppearanceManager::createBaseOutfitLink(const LLUUID& category, LLPointer<LLInventoryCallback> link_waiter) +{ +	const LLUUID cof = getCOF(); +	LLViewerInventoryCategory* catp = gInventory.getCategory(category); +	std::string new_outfit_name = ""; + +	purgeBaseOutfitLink(cof); + +	if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT) +	{ +		link_inventory_item(gAgent.getID(), category, cof, catp->getName(), +							LLAssetType::AT_LINK_FOLDER, link_waiter); +		new_outfit_name = catp->getName(); +	} +	updatePanelOutfitName(new_outfit_name); +}  void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append)  { diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index b625d42a50..11b910ee11 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -62,11 +62,13 @@ public:  	LLUUID getCOF();  	// Finds the folder link to the currently worn outfit -	const LLViewerInventoryItem *getCurrentOutfitLink(); +	const LLViewerInventoryItem *getBaseOutfitLink();  	// Update the displayed outfit name in UI.  	void updatePanelOutfitName(const std::string& name); +	void createBaseOutfitLink(const LLUUID& category, LLPointer<LLInventoryCallback> link_waiter); +  	void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);  	// For debugging - could be moved elsewhere. @@ -114,6 +116,7 @@ private:  								   bool follow_folder_links);  	void purgeCategory(const LLUUID& category, bool keep_outfit_links); +	void purgeBaseOutfitLink(const LLUUID& category);  	std::set<LLUUID> mRegisteredAttachments;  	bool mAttachmentInvLinkEnabled; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index becc30832d..e0356bc091 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1929,8 +1929,7 @@ bool LLAppViewer::initConfiguration()  	LLFirstUse::addConfigVariable("FirstSandbox");  	LLFirstUse::addConfigVariable("FirstFlexible");  	LLFirstUse::addConfigVariable("FirstDebugMenus"); -	LLFirstUse::addConfigVariable("FirstStreamingMusic"); -	LLFirstUse::addConfigVariable("FirstStreamingVideo"); +	LLFirstUse::addConfigVariable("FirstStreamingMedia");  	LLFirstUse::addConfigVariable("FirstSculptedPrim");  	LLFirstUse::addConfigVariable("FirstVoice");  	LLFirstUse::addConfigVariable("FirstMedia"); diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 2a8c55e5db..c3deb602ee 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -168,8 +168,28 @@ void LLAvatarActions::offerTeleport(const LLUUID& invitee)  // static  void LLAvatarActions::offerTeleport(const std::vector<LLUUID>& ids)   { -	if (ids.size() > 0) -		handle_lure(ids); +	if (ids.size() == 0) +		return; + +	handle_lure(ids); + +	// Record the offer. +	for (std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++) +	{ +		LLUUID target_id = *it; +		std::string target_name; + +		gCacheName->getFullName(target_id, target_name); + +		LLSD args; +		args["TO_NAME"] = target_name; + +		LLSD payload; +		payload["from_id"] = target_id; +		payload["SESSION_NAME"] = target_name; +		payload["SUPPRESS_TOAST"] = true; +		LLNotificationsUtil::add("TeleportOfferSent", args, payload); +	}  }  // static @@ -595,9 +615,11 @@ void LLAvatarActions::requestFriendship(const LLUUID& target_id, const std::stri  	LLSD args;  	args["TO_NAME"] = target_name; +  	LLSD payload; +	payload["from_id"] = target_id;  	payload["SESSION_NAME"] = target_name; -	payload["SUPPRES_TOST"] = true; +	payload["SUPPRESS_TOAST"] = true;  	LLNotificationsUtil::add("FriendshipOffered", args, payload);  } diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index a402f59fa1..1468f6d584 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -47,6 +47,7 @@  #include "llfloaterreg.h"  #include "llparticipantlist.h"  #include "llspeakers.h" +#include "lltextutil.h"  #include "lltransientfloatermgr.h"  #include "llviewerwindow.h"  #include "llvoicechannel.h" @@ -76,6 +77,12 @@ public:  		return rv;  	} +	void setName(const std::string& name) +	{ +		const std::string& formatted_phone = LLTextUtil::formatPhoneNumber(name); +		LLAvatarListItem::setName(formatted_phone); +	} +  	void setSpeakerId(const LLUUID& id) { mSpeakingIndicator->setSpeakerId(id); }  }; @@ -270,6 +277,11 @@ void LLCallFloater::updateSession()  		case IM_NOTHING_SPECIAL:  		case IM_SESSION_P2P_INVITE:  			mVoiceType = VC_PEER_TO_PEER; + +			if (!im_session->mOtherParticipantIsAvatar) +			{ +				mVoiceType = VC_PEER_TO_PEER_AVALINE; +			}  			break;  		case IM_SESSION_CONFERENCE_START:  		case IM_SESSION_GROUP_START: @@ -321,16 +333,13 @@ void LLCallFloater::updateSession()  void LLCallFloater::refreshParticipantList()  { -	bool non_avatar_caller = false; -	if (VC_PEER_TO_PEER == mVoiceType) +	bool non_avatar_caller = VC_PEER_TO_PEER_AVALINE == mVoiceType; + +	if (non_avatar_caller)  	{  		LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(mSpeakerManager->getSessionID()); -		non_avatar_caller = !session->mOtherParticipantIsAvatar; -		if (non_avatar_caller) -		{ -			mNonAvatarCaller->setSpeakerId(session->mOtherParticipantID); -			mNonAvatarCaller->setName(session->mName); -		} +		mNonAvatarCaller->setSpeakerId(session->mOtherParticipantID); +		mNonAvatarCaller->setName(session->mName);  	}  	mNonAvatarCaller->setVisible(non_avatar_caller); @@ -390,9 +399,17 @@ void LLCallFloater::updateTitle()  		title = getString("title_nearby");  		break;  	case VC_PEER_TO_PEER: +	case VC_PEER_TO_PEER_AVALINE:  		{ +			title = voice_channel->getSessionName(); + +			if (VC_PEER_TO_PEER_AVALINE == mVoiceType) +			{ +				title = LLTextUtil::formatPhoneNumber(title); +			} +  			LLStringUtil::format_map_t args; -			args["[NAME]"] = voice_channel->getSessionName(); +			args["[NAME]"] = title;  			title = getString("title_peer_2_peer", args);  		}  		break; diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h index 8aba93fc43..2b40225906 100644 --- a/indra/newview/llcallfloater.h +++ b/indra/newview/llcallfloater.h @@ -88,7 +88,8 @@ private:  		VC_LOCAL_CHAT,  		VC_GROUP_CHAT,  		VC_AD_HOC_CHAT, -		VC_PEER_TO_PEER +		VC_PEER_TO_PEER, +		VC_PEER_TO_PEER_AVALINE  	}EVoiceControls;  	typedef enum e_speaker_state diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index 92df281307..60a37ac4af 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -253,10 +253,32 @@ void LLNearbyChatToastPanel::onMouseEnter				(S32 x, S32 y, MASK mask)  BOOL	LLNearbyChatToastPanel::handleMouseDown	(S32 x, S32 y, MASK mask)  { +	return LLPanel::handleMouseDown(x,y,mask); +} + +BOOL	LLNearbyChatToastPanel::handleMouseUp	(S32 x, S32 y, MASK mask) +{  	if(mSourceType != CHAT_SOURCE_AGENT) -		return LLPanel::handleMouseDown(x,y,mask); +		return LLPanel::handleMouseUp(x,y,mask); + +	LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false); +	S32 local_x = x - text_box->getRect().mLeft; +	S32 local_y = y - text_box->getRect().mBottom; +	 +	//if text_box process mouse up (ussually this is click on url) - we didn't show nearby_chat. +	if (text_box->pointInView(local_x, local_y) ) +	{ +		if (text_box->handleMouseUp(local_x,local_y,mask) == TRUE) +			return TRUE; +		else +		{ +			LLFloaterReg::showInstance("nearby_chat",LLSD()); +			return FALSE; +		} +	} +  	LLFloaterReg::showInstance("nearby_chat",LLSD()); -	return LLPanel::handleMouseDown(x,y,mask); +	return LLPanel::handleMouseUp(x,y,mask);  }  void	LLNearbyChatToastPanel::setHeaderVisibility(EShowItemHeader e) diff --git a/indra/newview/llchatitemscontainerctrl.h b/indra/newview/llchatitemscontainerctrl.h index 0a85c52401..f4b8655054 100644 --- a/indra/newview/llchatitemscontainerctrl.h +++ b/indra/newview/llchatitemscontainerctrl.h @@ -68,6 +68,7 @@ public:  	void	onMouseLeave	(S32 x, S32 y, MASK mask);  	void	onMouseEnter	(S32 x, S32 y, MASK mask);  	BOOL	handleMouseDown	(S32 x, S32 y, MASK mask); +	BOOL	handleMouseUp	(S32 x, S32 y, MASK mask);  	virtual BOOL postBuild(); diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 6ae6b4877a..4103ccf175 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -644,7 +644,7 @@ LLXMLNodePtr LLFavoritesBarCtrl::getButtonXMLNode()  	bool success = LLUICtrlFactory::getLayeredXMLNode("favorites_bar_button.xml", buttonXMLNode);  	if (!success)  	{ -		llwarns << "Unable to read xml file with button for Favorites Bar: favorites_bar_button.xml" << llendl; +		llwarns << "Failed to create Favorites Bar button from favorites_bar_button.xml" << llendl;  		buttonXMLNode = NULL;  	}  	return buttonXMLNode; diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index 764aff68c9..9496e94780 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -144,6 +144,11 @@ void  LLPanelCameraZoom::onSliderValueChanged()  	mSavedSliderVal = val;  } +void activate_camera_tool() +{ +	LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance()); +}; +  //  // Member functions  // @@ -151,7 +156,7 @@ void  LLPanelCameraZoom::onSliderValueChanged()  /*static*/ bool LLFloaterCamera::inFreeCameraMode()  {  	LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance(); -	if (floater_camera && floater_camera->mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA) +	if (floater_camera && floater_camera->mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA && gAgent.getCameraMode() != CAMERA_MODE_MOUSELOOK)  	{  		return true;  	} @@ -177,27 +182,17 @@ void LLFloaterCamera::update()  } -/*static*/ void LLFloaterCamera::updateIfNotInAvatarViewMode() -{ -	LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance(); -	if (floater_camera && !floater_camera->inAvatarViewMode())  -	{ -		floater_camera->update(); -	} -} - -  void LLFloaterCamera::toPrevMode()  {  	switchMode(mPrevMode);  } -/*static*/ void LLFloaterCamera::toPrevModeIfInAvatarViewMode() +/*static*/ void LLFloaterCamera::onLeavingMouseLook()  {  	LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance(); -	if (floater_camera && floater_camera->inAvatarViewMode()) +	if (floater_camera && floater_camera->inFreeCameraMode())  	{ -		floater_camera->toPrevMode(); +		activate_camera_tool();  	}  } @@ -325,7 +320,7 @@ void LLFloaterCamera::switchMode(ECameraControlMode mode)  		break;  	case CAMERA_CTRL_MODE_FREE_CAMERA: -		LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance()); +		activate_camera_tool();  		break;  	case CAMERA_CTRL_MODE_AVATAR_VIEW: diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h index 5d44b4944d..45d5e9a845 100644 --- a/indra/newview/llfloatercamera.h +++ b/indra/newview/llfloatercamera.h @@ -61,7 +61,7 @@ public:  	/* callback for camera presets changing */  	static void onClickCameraPresets(const LLSD& param); -	static void toPrevModeIfInAvatarViewMode(); +	static void onLeavingMouseLook();  	/** resets current camera mode to orbit mode */  	static void resetCameraMode(); @@ -69,8 +69,6 @@ public:  	/* determines actual mode and updates ui */  	void update(); -	static void updateIfNotInAvatarViewMode(); -  	virtual void onOpen(const LLSD& key);  	virtual void onClose(bool app_quitting); diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index babef5b63d..9cae6f0ebd 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -1221,10 +1221,10 @@ void LLFloaterTools::getMediaState()  			mNeedMediaTitle = false;  		} -		childSetEnabled("media_tex",  bool_has_media & editable); -		childSetEnabled( "edit_media", bool_has_media & editable ); -		childSetEnabled( "delete_media", bool_has_media & editable ); -		childSetEnabled( "add_media", ( ! bool_has_media ) & editable ); +		childSetEnabled("media_tex",  bool_has_media && editable); +		childSetEnabled( "edit_media", bool_has_media && LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo && editable ); +		childSetEnabled( "delete_media", bool_has_media && editable ); +		childSetEnabled( "add_media", ( ! bool_has_media ) && editable );  			// TODO: display a list of all media on the face - use 'identical' flag  	}  	else // not all face has media but at least one does. @@ -1252,7 +1252,7 @@ void LLFloaterTools::getMediaState()  		}  		childSetEnabled("media_tex",  TRUE); -		childSetEnabled( "edit_media", TRUE); +		childSetEnabled( "edit_media", LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo);  		childSetEnabled( "delete_media", TRUE);  		childSetEnabled( "add_media", FALSE );  	} @@ -1423,7 +1423,7 @@ void LLFloaterTools::updateMediaSettings()              return mMediaEntry.getControls();          }; -		const LLMediaEntry & mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_controls(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_controls, value_u8 ); @@ -1446,7 +1446,7 @@ void LLFloaterTools::updateMediaSettings()              return mMediaEntry.getFirstClickInteract();          }; -		const LLMediaEntry & mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_first_click(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_first_click, value_bool ); @@ -1469,7 +1469,7 @@ void LLFloaterTools::updateMediaSettings()              return mMediaEntry.getHomeURL();          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_home_url(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_home_url, value_str ); @@ -1492,7 +1492,7 @@ void LLFloaterTools::updateMediaSettings()              return mMediaEntry.getCurrentURL();          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_current_url(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_current_url, value_str ); @@ -1516,7 +1516,7 @@ void LLFloaterTools::updateMediaSettings()              return mMediaEntry.getAutoZoom();          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_auto_zoom(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_auto_zoom, value_bool ); @@ -1539,7 +1539,7 @@ void LLFloaterTools::updateMediaSettings()              return mMediaEntry.getAutoPlay();          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_auto_play(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_auto_play, value_bool ); @@ -1563,7 +1563,7 @@ void LLFloaterTools::updateMediaSettings()              return mMediaEntry.getAutoScale();;          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_auto_scale(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_auto_scale, value_bool ); @@ -1586,7 +1586,7 @@ void LLFloaterTools::updateMediaSettings()              return mMediaEntry.getAutoLoop();          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_auto_loop(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_auto_loop, value_bool ); @@ -1609,7 +1609,7 @@ void LLFloaterTools::updateMediaSettings()              return mMediaEntry.getWidthPixels();          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_width_pixels(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_width_pixels, value_int ); @@ -1632,7 +1632,7 @@ void LLFloaterTools::updateMediaSettings()              return mMediaEntry.getHeightPixels();          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_height_pixels(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_height_pixels, value_int ); @@ -1655,7 +1655,7 @@ void LLFloaterTools::updateMediaSettings()              return mMediaEntry.getAltImageEnable();          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_enable_alt_image(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_enable_alt_image, value_bool ); @@ -1678,7 +1678,7 @@ void LLFloaterTools::updateMediaSettings()              return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_OWNER );          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_perms_owner_interact(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_perms_owner_interact, value_bool ); @@ -1701,7 +1701,7 @@ void LLFloaterTools::updateMediaSettings()              return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_OWNER );          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_perms_owner_control(default_media_data);      identical = selected_objects ->getSelectedTEValue( &func_perms_owner_control, value_bool ); @@ -1724,7 +1724,7 @@ void LLFloaterTools::updateMediaSettings()              return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_GROUP );          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_perms_group_interact(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_perms_group_interact, value_bool ); @@ -1747,7 +1747,7 @@ void LLFloaterTools::updateMediaSettings()              return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_GROUP );          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_perms_group_control(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_perms_group_control, value_bool ); @@ -1770,7 +1770,7 @@ void LLFloaterTools::updateMediaSettings()              return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_ANYONE );          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_perms_anyone_interact(default_media_data);      identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func_perms_anyone_interact, value_bool ); @@ -1793,7 +1793,7 @@ void LLFloaterTools::updateMediaSettings()              return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_ANYONE );          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_perms_anyone_control(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_perms_anyone_control, value_bool ); @@ -1816,7 +1816,7 @@ void LLFloaterTools::updateMediaSettings()              return mMediaEntry.getWhiteListEnable();          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_whitelist_enable(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_whitelist_enable, value_bool ); @@ -1839,7 +1839,7 @@ void LLFloaterTools::updateMediaSettings()              return mMediaEntry.getWhiteList();          }; -		const LLMediaEntry &  mMediaEntry; +		const LLMediaEntry &mMediaEntry;      } func_whitelist_urls(default_media_data);      identical = selected_objects->getSelectedTEValue( &func_whitelist_urls, value_vector_str ); diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index 3ca459a403..e75d35bea4 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -210,7 +210,6 @@ void LLGroupList::addNewItem(const LLUUID& id, const std::string& name, const LL  	item->setGroupID(id);  	item->setName(name, mNameFilter);  	item->setGroupIconID(icon_id); -//	item->setContextMenu(mContextMenu);  	item->childSetVisible("info_btn", false);  	item->childSetVisible("profile_btn", false); @@ -268,8 +267,9 @@ bool LLGroupList::onContextMenuItemEnable(const LLSD& userdata)  	LLUUID selected_group_id = getSelectedUUID();  	bool real_group_selected = selected_group_id.notNull(); // a "real" (not "none") group is selected +	// each group including "none" can be activated  	if (userdata.asString() == "activate") -		return real_group_selected && gAgent.getGroupID() != selected_group_id; +		return gAgent.getGroupID() != selected_group_id;  	return real_group_selected;  } @@ -283,7 +283,6 @@ LLGroupListItem::LLGroupListItem()  mGroupIcon(NULL),  mGroupNameBox(NULL),  mInfoBtn(NULL), -//mContextMenu(NULL), //TODO:  mGroupID(LLUUID::null)  {  	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_group_list_item.xml"); diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 259f629bdd..fdc5d14d97 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -120,6 +120,12 @@ void LLIMFloater::onFocusLost()  void LLIMFloater::onFocusReceived()  {  	LLIMModel::getInstance()->setActiveSessionID(mSessionID); + +	// return focus to the input field when active tab in the multitab container is clicked. +	if (isChatMultiTab() && mInputEditor) +	{ +		mInputEditor->setFocus(TRUE); +	}  }  // virtual @@ -618,6 +624,15 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void*  		//in disconnected state IM input editor should be disabled  		self->mInputEditor->setEnabled(!gDisconnected);  	} + +	// when IM Floater is a part of the multitab container LLTabContainer set focus to the first +	// child on tab button's mouse up. This leads input field lost focus. See EXT-3852. +	if (isChatMultiTab()) +	{ +		// So, clear control captured mouse to prevent LLTabContainer set focus on the panel's first child. +		// do not pass self->mInputEditor, this leads to have "Edit Text" mouse pointer wherever it is. +		gFocusMgr.setMouseCapture(NULL); +	}  }  // static diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 40227539d0..daabf1f717 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -82,6 +82,7 @@  #include "llfirstuse.h"  #include "llagentui.h" +#include "lltextutil.h"  const static std::string IM_TIME("time");  const static std::string IM_TEXT("message"); @@ -92,6 +93,7 @@ const static std::string NO_SESSION("(IM Session Doesn't Exist)");  const static std::string ADHOC_NAME_SUFFIX(" Conference");  std::string LLCallDialogManager::sPreviousSessionlName = ""; +LLIMModel::LLIMSession::SType LLCallDialogManager::sPreviousSessionType = LLIMModel::LLIMSession::P2P_SESSION;  std::string LLCallDialogManager::sCurrentSessionlName = "";  LLIMModel::LLIMSession* LLCallDialogManager::sSession = NULL;  LLVoiceChannel::EState LLCallDialogManager::sOldState = LLVoiceChannel::STATE_READY; @@ -178,6 +180,7 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&  	if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type)  	{  		mVoiceChannel  = new LLVoiceChannelP2P(session_id, name, other_participant_id); +		mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID);  		// check if it was AVALINE call  		if (!mOtherParticipantIsAvatar) @@ -208,7 +211,10 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&  	mSpeakers = new LLIMSpeakerMgr(mVoiceChannel);  	// All participants will be added to the list of people we've recently interacted with. -	mSpeakers->addListener(&LLRecentPeople::instance(), "add"); + +	// we need to add only _active_ speakers...so comment this.  +	// may delete this later on cleanup +	//mSpeakers->addListener(&LLRecentPeople::instance(), "add");  	//we need to wait for session initialization for outgoing ad-hoc and group chat session  	//correct session id for initiated ad-hoc chat will be received from the server @@ -224,7 +230,6 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&  	{  		mCallBackEnabled = LLVoiceClient::getInstance()->isSessionCallBackPossible(mSessionID);  		mTextIMPossible = LLVoiceClient::getInstance()->isSessionTextIMPossible(mSessionID); -		mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID);  	}  	if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") ) @@ -377,6 +382,10 @@ void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& f  		mSpeakers->speakerChatted(from_id);  		mSpeakers->setSpeakerTyping(from_id, FALSE);  	} + +	if( mSessionType == P2P_SESSION || +		mSessionType == ADHOC_SESSION) +		LLRecentPeople::instance().add(from_id);  }  void LLIMModel::LLIMSession::addMessagesFromHistory(const std::list<LLSD>& history) @@ -781,7 +790,7 @@ LLIMSpeakerMgr* LLIMModel::getSpeakerManager( const LLUUID& session_id ) const  	LLIMSession* session = findIMSession(session_id);  	if (!session)  	{ -		llwarns << "session " << session_id << "does not exist " << llendl; +		llwarns << "session " << session_id << " does not exist " << llendl;  		return NULL;  	} @@ -1360,6 +1369,13 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)  		sCurrentSessionlName = ""; // Empty string results in "Nearby Voice Chat" after substitution  		return;  	} +	 +	if (sSession) +	{ +		// store previous session type to process Avaline calls in dialogs +		sPreviousSessionType = sSession->mSessionType; +	} +  	sSession = session;  	sSession->mVoiceChannel->setStateChangedCallback(LLCallDialogManager::onVoiceChannelStateChanged);  	if(sCurrentSessionlName != session->mName) @@ -1378,6 +1394,7 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)  		mCallDialogPayload["session_name"] = sSession->mName;  		mCallDialogPayload["other_user_id"] = sSession->mOtherParticipantID;  		mCallDialogPayload["old_channel_name"] = sPreviousSessionlName; +		mCallDialogPayload["old_session_type"] = sPreviousSessionType;  		mCallDialogPayload["state"] = LLVoiceChannel::STATE_CALL_STARTED;  		mCallDialogPayload["disconnected_channel_name"] = sSession->mName;  		mCallDialogPayload["session_type"] = sSession->mSessionType; @@ -1407,6 +1424,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat  	mCallDialogPayload["session_name"] = sSession->mName;  	mCallDialogPayload["other_user_id"] = sSession->mOtherParticipantID;  	mCallDialogPayload["old_channel_name"] = sPreviousSessionlName; +	mCallDialogPayload["old_session_type"] = sPreviousSessionType;  	mCallDialogPayload["state"] = new_state;  	mCallDialogPayload["disconnected_channel_name"] = sSession->mName;  	mCallDialogPayload["session_type"] = sSession->mSessionType; @@ -1421,6 +1439,11 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat  		}  		break; +	case LLVoiceChannel::STATE_HUNG_UP: +		// this state is coming before session is changed, so, put it into payload map +		mCallDialogPayload["old_session_type"] = sSession->mSessionType; +		break; +  	case LLVoiceChannel::STATE_CONNECTED :  		ocd = LLFloaterReg::findTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);  		if (ocd) @@ -1561,7 +1584,15 @@ void LLOutgoingCallDialog::show(const LLSD& key)  	// tell the user which voice channel they are leaving  	if (!mPayload["old_channel_name"].asString().empty())  	{ -		childSetTextArg("leaving", "[CURRENT_CHAT]", mPayload["old_channel_name"].asString()); +		bool was_avaline_call = LLIMModel::LLIMSession::AVALINE_SESSION == mPayload["old_session_type"].asInteger(); + +		std::string old_caller_name = mPayload["old_channel_name"].asString(); +		if (was_avaline_call) +		{ +			old_caller_name = LLTextUtil::formatPhoneNumber(old_caller_name); +		} + +		childSetTextArg("leaving", "[CURRENT_CHAT]", old_caller_name);  	}  	else  	{ @@ -1575,10 +1606,18 @@ void LLOutgoingCallDialog::show(const LLSD& key)  	}  	std::string callee_name = mPayload["session_name"].asString(); + +	LLUUID session_id = mPayload["session_id"].asUUID(); +	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id); +  	if (callee_name == "anonymous")  	{  		callee_name = getString("anonymous");  	} +	else if (!is_avatar) +	{ +		callee_name = LLTextUtil::formatPhoneNumber(callee_name); +	}  	setTitle(callee_name); @@ -1728,16 +1767,21 @@ BOOL LLIncomingCallDialog::postBuild()  		call_type = getString(mPayload["notify_box_type"]);  	} +	 +	// check to see if this is an Avaline call +	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id); +	childSetVisible("Start IM", is_avatar); // no IM for avaline +  	if (caller_name == "anonymous")  	{  		caller_name = getString("anonymous");  	} -	 -	setTitle(caller_name + " " + call_type); +	else if (!is_avatar) +	{ +		caller_name = LLTextUtil::formatPhoneNumber(caller_name); +	} -	// check to see if this is an Avaline call -	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id); -	childSetVisible("Start IM", is_avatar); // no IM for avaline +	setTitle(caller_name + " " + call_type);  	LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name");  	caller_name_widget->setValue(caller_name + " " + call_type); diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 11860d0efb..20d8e28392 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -475,6 +475,7 @@ public:  protected:  	static std::string sPreviousSessionlName; +	static LLIMModel::LLIMSession::SType sPreviousSessionType;  	static std::string sCurrentSessionlName;  	static LLIMModel::LLIMSession* sSession;  	static LLVoiceChannel::EState sOldState; diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index dae980feb1..7f206cb873 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -112,6 +112,7 @@ private:  	void onClickAddFriend();  	void onClickViewProfile();  	void onClickIM(); +	void onClickCall();  	void onClickTeleport();  	void onClickInviteToGroup();  	void onClickPay(); @@ -204,6 +205,7 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)  	mCommitCallbackRegistrar.add("InspectAvatar.AddFriend",	boost::bind(&LLInspectAvatar::onClickAddFriend, this));	  	mCommitCallbackRegistrar.add("InspectAvatar.IM",  		boost::bind(&LLInspectAvatar::onClickIM, this));	 +	mCommitCallbackRegistrar.add("InspectAvatar.Call",		boost::bind(&LLInspectAvatar::onClickCall, this));	  	mCommitCallbackRegistrar.add("InspectAvatar.Teleport",	boost::bind(&LLInspectAvatar::onClickTeleport, this));	  	mCommitCallbackRegistrar.add("InspectAvatar.InviteToGroup",	boost::bind(&LLInspectAvatar::onClickInviteToGroup, this));	  	mCommitCallbackRegistrar.add("InspectAvatar.Pay",	boost::bind(&LLInspectAvatar::onClickPay, this));	 @@ -611,6 +613,12 @@ void LLInspectAvatar::onClickIM()  	closeFloater();  } +void LLInspectAvatar::onClickCall() +{  +	LLAvatarActions::startCall(mAvatarID); +	closeFloater(); +} +  void LLInspectAvatar::onClickTeleport()  {  	LLAvatarActions::offerTeleport(mAvatarID); diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 2ad82d3e8e..e7043b2d00 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -63,7 +63,7 @@  static const S32 RESIZE_BAR_THICKNESS = 3;  LLNearbyChat::LLNearbyChat(const LLSD& key)  -	: LLDockableFloater(NULL, false, key) +	: LLDockableFloater(NULL, false, false, key)  	,mChatHistory(NULL)  { @@ -137,7 +137,7 @@ std::string appendTime()  	time_t utc_time;  	utc_time = time_corrected();  	std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:[" -		+LLTrans::getString("TimeMin")+"] "; +		+LLTrans::getString("TimeMin")+"]";  	LLSD substitution; diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index dd66a6c507..fad0c6a91e 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -112,8 +112,8 @@ bool LLOfferHandler::processNotification(const LLSD& notify)  				LLHandlerUtil::spawnIMSession(name, from_id);  			} -			if (notification->getPayload().has("SUPPRES_TOST") -						&& notification->getPayload()["SUPPRES_TOST"]) +			if (notification->getPayload().has("SUPPRESS_TOAST") +						&& notification->getPayload()["SUPPRESS_TOAST"])  			{  				LLNotificationsUtil::cancel(notification);  			} diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index fff2575893..94de17c17d 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -413,10 +413,13 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)  			if(tab_land->getDisplayChildren())  				tab_land->changeOpenClose(tab_land->getDisplayChildren());  		} + +		LLGroupData agent_gdatap; +		bool is_member = gAgent.getGroupData(mID,agent_gdatap); -		tab_roles->canOpenClose(true); -		tab_notices->canOpenClose(true); -		tab_land->canOpenClose(true); +		tab_roles->canOpenClose(is_member); +		tab_notices->canOpenClose(is_member); +		tab_land->canOpenClose(is_member);  		getChild<LLUICtrl>("group_name")->setVisible(true);  		getChild<LLUICtrl>("group_name_editor")->setVisible(false); diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index 279818d52f..b547997e7a 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -70,9 +70,9 @@ void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::E  void LLPanelChatControlPanel::updateButtons(bool is_call_started)  { -	childSetVisible("end_call_btn", is_call_started); -	childSetVisible("voice_ctrls_btn", is_call_started); -	childSetVisible("call_btn", ! is_call_started); +	childSetVisible("end_call_btn_panel", is_call_started); +	childSetVisible("voice_ctrls_btn_panel", is_call_started); +	childSetVisible("call_btn_panel", ! is_call_started);  }  LLPanelChatControlPanel::~LLPanelChatControlPanel() diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 751705dd57..ada65c98a4 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -411,6 +411,7 @@ BOOL LLPanelPicks::postBuild()  	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar plus_registar;  	plus_registar.add("Picks.Plus.Action", boost::bind(&LLPanelPicks::onPlusMenuItemClicked, this, _2)); +	mEnableCallbackRegistrar.add("Picks.Plus.Enable", boost::bind(&LLPanelPicks::isActionEnabled, this, _2));  	mPlusMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_picks_plus.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  	return TRUE; @@ -430,6 +431,18 @@ void LLPanelPicks::onPlusMenuItemClicked(const LLSD& param)  	}  } +bool LLPanelPicks::isActionEnabled(const LLSD& userdata) const +{ +	std::string command_name = userdata.asString(); + +	if (command_name == "new_pick" && LLAgentPicksInfo::getInstance()->isPickLimitReached()) +	{ +		return false; +	} + +	return true; +} +  void LLPanelPicks::onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab)  {  	if(!mPicksAccTab->getDisplayChildren()) @@ -652,7 +665,6 @@ void LLPanelPicks::updateButtons()  	if (getAvatarId() == gAgentID)  	{ -		childSetEnabled(XML_BTN_NEW, !LLAgentPicksInfo::getInstance()->isPickLimitReached());  		childSetEnabled(XML_BTN_DELETE, has_selected);  	} diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h index 1b2e35ca46..3f757e482e 100644 --- a/indra/newview/llpanelpicks.h +++ b/indra/newview/llpanelpicks.h @@ -97,6 +97,7 @@ private:  	void onClickMap();  	void onPlusMenuItemClicked(const LLSD& param); +	bool isActionEnabled(const LLSD& userdata) const;  	void onListCommit(const LLFlatListView* f_list);  	void onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab); diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 5cc9c1951b..4f539f404d 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -127,7 +127,11 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :  	mScrollState = SCROLL_NONE;  	mPanelHandle.bind(this); +	 +	mInactiveTimeout = gSavedSettings.getF32("MediaControlTimeout"); +	mControlFadeTime = gSavedSettings.getF32("MediaControlFadeTime");  } +  LLPanelPrimMediaControls::~LLPanelPrimMediaControls()  {  } @@ -172,6 +176,7 @@ BOOL LLPanelPrimMediaControls::postBuild()  	LLStringUtil::convertToF32(getString("zoom_near_padding"), mZoomNearPadding);  	LLStringUtil::convertToF32(getString("zoom_medium_padding"), mZoomMediumPadding);  	LLStringUtil::convertToF32(getString("zoom_far_padding"), mZoomFarPadding); +	LLStringUtil::convertToS32(getString("top_world_view_avoid_zone"), mTopWorldViewAvoidZone);  	// These are currently removed...but getChild creates a "dummy" widget.  	// This class handles them missing. @@ -207,11 +212,9 @@ BOOL LLPanelPrimMediaControls::postBuild()  	}  	mMediaAddress->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this )); -	mInactiveTimeout = gSavedSettings.getF32("MediaControlTimeout"); -	mControlFadeTime = gSavedSettings.getF32("MediaControlFadeTime"); - +	  	mCurrentZoom = ZOOM_NONE; -	// clicks on HUD buttons do not remove keyboard focus from media +	// clicks on buttons do not remove keyboard focus from media  	setIsChrome(TRUE);  	return TRUE;  } @@ -373,8 +376,8 @@ void LLPanelPrimMediaControls::updateShape()  			mVolumeUpCtrl->setVisible(has_focus);  			mVolumeDownCtrl->setVisible(has_focus);  			mVolumeCtrl->setEnabled(has_focus); -			mVolumeSliderCtrl->setEnabled(has_focus && mVolumeSliderVisible > 0); -			mVolumeSliderCtrl->setVisible(has_focus && mVolumeSliderVisible > 0); +			mVolumeSliderCtrl->setEnabled(has_focus && shouldVolumeSliderBeVisible()); +			mVolumeSliderCtrl->setVisible(has_focus && shouldVolumeSliderBeVisible());  			mWhitelistIcon->setVisible(false);  			mSecureLockIcon->setVisible(false); @@ -627,36 +630,45 @@ void LLPanelPrimMediaControls::updateShape()  			update_min_max(min, max, LLVector3(screen_vert.v));  		} +		// convert screenspace bbox to pixels (in screen coords) +		LLRect window_rect = gViewerWindow->getWorldViewRectScaled();  		LLCoordGL screen_min; -		screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (min.mV[VX] + 1.f) * 0.5f); -		screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (min.mV[VY] + 1.f) * 0.5f); +		screen_min.mX = llround((F32)window_rect.getWidth() * (min.mV[VX] + 1.f) * 0.5f); +		screen_min.mY = llround((F32)window_rect.getHeight() * (min.mV[VY] + 1.f) * 0.5f);  		LLCoordGL screen_max; -		screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (max.mV[VX] + 1.f) * 0.5f); -		screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (max.mV[VY] + 1.f) * 0.5f); +		screen_max.mX = llround((F32)window_rect.getWidth() * (max.mV[VX] + 1.f) * 0.5f); +		screen_max.mY = llround((F32)window_rect.getHeight() * (max.mV[VY] + 1.f) * 0.5f); -		// grow panel so that screenspace bounding box fits inside "media_region" element of HUD -		LLRect media_controls_rect; -		S32 volume_slider_height = mVolumeSliderCtrl->getRect().getHeight() - /*fudge*/ 2; -		getParent()->screenRectToLocal(LLRect(screen_min.mX, screen_max.mY, screen_max.mX, screen_min.mY), &media_controls_rect); -		media_controls_rect.mLeft -= mMediaRegion->getRect().mLeft; -		media_controls_rect.mBottom -= mMediaRegion->getRect().mBottom - volume_slider_height; -		media_controls_rect.mTop += getRect().getHeight() - mMediaRegion->getRect().mTop; -		media_controls_rect.mRight += getRect().getWidth() - mMediaRegion->getRect().mRight; +		// grow panel so that screenspace bounding box fits inside "media_region" element of panel +		LLRect media_panel_rect; +		// Get the height of the controls (less the volume slider) +		S32 controls_height = mMediaControlsStack->getRect().getHeight() - mVolumeSliderCtrl->getRect().getHeight(); +		getParent()->screenRectToLocal(LLRect(screen_min.mX, screen_max.mY, screen_max.mX, screen_min.mY), &media_panel_rect); +		media_panel_rect.mTop += controls_height; -		// keep all parts of HUD on-screen -		LLRect window_rect = getParent()->getLocalRect(); -		media_controls_rect.intersectWith(window_rect); +		// keep all parts of panel on-screen +		// Area of the top of the world view to avoid putting the controls +		window_rect.mTop -= mTopWorldViewAvoidZone; +		// Don't include "spacing" bookends on left & right of the media controls +		window_rect.mLeft -= mLeftBookend->getRect().getWidth(); +		window_rect.mRight += mRightBookend->getRect().getWidth(); +		// Don't include the volume slider +		window_rect.mBottom -= mVolumeSliderCtrl->getRect().getHeight(); +		media_panel_rect.intersectWith(window_rect);  		// clamp to minimum size, keeping rect inside window -		S32 centerX = media_controls_rect.getCenterX(); -		S32 centerY = media_controls_rect.getCenterY(); +		S32 centerX = media_panel_rect.getCenterX(); +		S32 centerY = media_panel_rect.getCenterY(); +		// Shrink screen rect by min width and height, to ensure containment  		window_rect.stretch(-mMinWidth/2, -mMinHeight/2);  		window_rect.clampPointToRect(centerX, centerY); -		media_controls_rect.setCenterAndSize(centerX, centerY, -											 llmax(mMinWidth, media_controls_rect.getWidth()), llmax(mMinHeight, media_controls_rect.getHeight())); +		media_panel_rect.setCenterAndSize(centerX, centerY,  +										  llmax(mMinWidth, media_panel_rect.getWidth()), +										  llmax(mMinHeight, media_panel_rect.getHeight())); -		setShape(media_controls_rect, true); +		// Finally set the size of the panel +		setShape(media_panel_rect, true);  		// Test mouse position to see if the cursor is stationary  		LLCoordWindow cursor_pos_window; @@ -699,13 +711,13 @@ void LLPanelPrimMediaControls::updateShape()  /*virtual*/  void LLPanelPrimMediaControls::draw()  { -	F32 alpha = 1.f; +	F32 alpha = getDrawContext().mAlpha;  	if(mFadeTimer.getStarted())  	{  		F32 time = mFadeTimer.getElapsedTimeF32(); -		alpha = llmax(lerp(1.0, 0.0, time / mControlFadeTime), 0.0f); +		alpha *= llmax(lerp(1.0, 0.0, time / mControlFadeTime), 0.0f); -		if(mFadeTimer.getElapsedTimeF32() >= mControlFadeTime) +		if(time >= mControlFadeTime)  		{  			if(mClearFaceOnFade)  			{ @@ -726,27 +738,30 @@ void LLPanelPrimMediaControls::draw()  	// Build rect for icon area in coord system of this panel  	// Assumes layout_stack is a direct child of this panel  	mMediaControlsStack->updateLayout(); -	LLRect icon_area = mMediaControlsStack->getRect(); - +	 +	// adjust for layout stack spacing +	S32 space = mMediaControlsStack->getPanelSpacing() + 1; +	LLRect controls_bg_area = mMediaControlsStack->getRect(); +	 +	controls_bg_area.mTop += space; +	  	// adjust to ignore space from volume slider -	icon_area.mTop -= mVolumeSliderCtrl->getRect().getHeight(); +	controls_bg_area.mBottom += mVolumeSliderCtrl->getRect().getHeight();  	// adjust to ignore space from left bookend padding -	icon_area.mLeft += mLeftBookend->getRect().getWidth(); +	controls_bg_area.mLeft += mLeftBookend->getRect().getWidth() - space;  	// ignore space from right bookend padding -	icon_area.mRight -= mRightBookend->getRect().getWidth(); +	controls_bg_area.mRight -= mRightBookend->getRect().getWidth() - space;  	// draw control background UI image -	mBackgroundImage->draw( icon_area, UI_VERTEX_COLOR % alpha); +	mBackgroundImage->draw( controls_bg_area, UI_VERTEX_COLOR % alpha);  	// draw volume slider background UI image  	if (mVolumeSliderCtrl->getVisible())  	{ -		LLRect volume_slider_rect = mVolumeSliderCtrl->getRect(); -		// For some reason the rect is not in the right place (??) -		// This translates the bg to under the slider -		volume_slider_rect.translate(mVolumeSliderCtrl->getParent()->getRect().mLeft, icon_area.getHeight()); +		LLRect volume_slider_rect; +		screenRectToLocal(mVolumeSliderCtrl->calcScreenRect(), &volume_slider_rect);  		mVolumeSliderBackgroundImage->draw(volume_slider_rect, UI_VERTEX_COLOR % alpha);  	} @@ -1259,6 +1274,11 @@ void LLPanelPrimMediaControls::onToggleMute()  		{  			media_impl->setVolume(0.0);  		} +		else if (mVolumeSliderCtrl->getValueF32() == 0.0) +		{ +			media_impl->setVolume(1.0); +			mVolumeSliderCtrl->setValue(1.0); +		}  		else   		{  			media_impl->setVolume(mVolumeSliderCtrl->getValueF32()); @@ -1271,8 +1291,12 @@ void LLPanelPrimMediaControls::showVolumeSlider()  	mVolumeSliderVisible++;  } -  void LLPanelPrimMediaControls::hideVolumeSlider()  {  	mVolumeSliderVisible--;  } + +bool LLPanelPrimMediaControls::shouldVolumeSliderBeVisible() +{ +	return mVolumeSliderVisible > 0; +} diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h index d899ee4473..419f033628 100644 --- a/indra/newview/llpanelprimmediacontrols.h +++ b/indra/newview/llpanelprimmediacontrols.h @@ -111,6 +111,7 @@ private:  	void onToggleMute();  	void showVolumeSlider();  	void hideVolumeSlider(); +	bool shouldVolumeSliderBeVisible();  	static void onScrollUp(void* user_data);  	static void onScrollUpHeld(void* user_data); @@ -171,6 +172,7 @@ private:  	F32 mZoomNearPadding;  	F32 mZoomMediumPadding;  	F32 mZoomFarPadding; +	S32 mTopWorldViewAvoidZone;  	LLUICtrl *mMediaPanelScroll;  	LLButton *mScrollUpCtrl; diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 245f694ac6..65a3d9d41b 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -1045,4 +1045,11 @@ void LLTeleportHistoryPanel::onAccordionExpand(LLUICtrl* ctrl, const LLSD& param  	bool expanded = param.asBoolean();  	// Save accordion tab state to restore it in refresh()  	setAccordionCollapsedByUser(ctrl, !expanded); + +	// Reset selection upon accordion being collapsed +	// to disable "Teleport" and "Map" buttons for hidden item. +	if (!expanded && mLastSelectedFlatlList) +	{ +		mLastSelectedFlatlList->resetSelection(); +	}  } diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 30b0075c4b..e2ce534c4f 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -198,7 +198,7 @@ void LLSidepanelAppearance::onFilterEdit(const std::string& search_string)  void LLSidepanelAppearance::onOpenOutfitButtonClicked()  { -	const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getCurrentOutfitLink(); +	const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getBaseOutfitLink();  	if (!outfit_link)  		return;  	if (!outfit_link->getIsLinkType()) @@ -313,7 +313,7 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)  {  	if (name == "")  	{ -		const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getCurrentOutfitLink(); +		const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getBaseOutfitLink();  		if (outfit_link)  		{  			const LLViewerInventoryCategory *cat = outfit_link->getLinkedCategory(); diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index a46ca1f8ac..44cf82540a 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -349,7 +349,6 @@ LLIMWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&  	}  	// Initialize chiclet. -	mChiclet->setRect(LLRect(5, 28, 30, 3)); // *HACK: workaround for (EXT-3599)  	mChiclet->setChicletSizeChangedCallback(boost::bind(&LLIMWellWindow::RowPanel::onChicletSizeChanged, this, mChiclet, _2));  	mChiclet->enableCounterControl(true);  	mChiclet->setCounter(chicletCounter); @@ -410,6 +409,11 @@ BOOL LLIMWellWindow::RowPanel::handleMouseDown(S32 x, S32 y, MASK mask)  	return LLPanel::handleMouseDown(x, y, mask);  } +// virtual +BOOL LLIMWellWindow::RowPanel::handleRightMouseDown(S32 x, S32 y, MASK mask) +{ +	return mChiclet->handleRightMouseDown(x, y, mask); +}  /************************************************************************/  /*         ObjectRowPanel implementation                                */  /************************************************************************/ @@ -553,6 +557,12 @@ BOOL LLIMWellWindow::ObjectRowPanel::handleMouseDown(S32 x, S32 y, MASK mask)  	return LLPanel::handleMouseDown(x, y, mask);  } +// virtual +BOOL LLIMWellWindow::ObjectRowPanel::handleRightMouseDown(S32 x, S32 y, MASK mask) +{ +	return mChiclet->handleRightMouseDown(x, y, mask); +} +  /************************************************************************/  /*         LLNotificationWellWindow implementation                      */  /************************************************************************/ diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h index 833e4dd504..ded3abcbf4 100644 --- a/indra/newview/llsyswellwindow.h +++ b/indra/newview/llsyswellwindow.h @@ -217,6 +217,8 @@ private:  		void onMouseEnter(S32 x, S32 y, MASK mask);  		void onMouseLeave(S32 x, S32 y, MASK mask);  		BOOL handleMouseDown(S32 x, S32 y, MASK mask); +		BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); +  	private:  		static const S32 CHICLET_HPAD = 10;  		void onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param); @@ -245,6 +247,8 @@ private:  		/*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);  		/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);  		/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); +		/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); +  	private:  		void onClosePanel();  		static EObjectType getObjectType(const LLNotificationPtr& notification); diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index 96d1624cd4..110d158e2d 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -266,6 +266,8 @@ void LLToast::onMouseEnter(S32 x, S32 y, MASK mask)  {  	mOnToastHoverSignal(this, MOUSE_ENTER); +	setBackgroundOpaque(TRUE); +  	//toasts fading is management by Screen Channel  	sendChildToFront(mHideBtn); diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index b1d09eccba..5f66e6b409 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -101,16 +101,13 @@ BOOL LLToolPie::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktyp  BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)  {  	//left mouse down always picks transparent -	gViewerWindow->pickAsync(x, y, mask, leftMouseCallback, TRUE); +	mPick = gViewerWindow->pickImmediate(x, y, TRUE); +	mPick.mKeyMask = mask;  	mGrabMouseButtonDown = TRUE; -	return TRUE; -} +	 +	pickLeftMouseDownCallback(); -// static -void LLToolPie::leftMouseCallback(const LLPickInfo& pick_info) -{ -	LLToolPie::getInstance()->mPick = pick_info; -	LLToolPie::getInstance()->pickLeftMouseDownCallback(); +	return TRUE;  }  // Spawn context menus on right mouse down so you can drag over and select @@ -118,8 +115,13 @@ void LLToolPie::leftMouseCallback(const LLPickInfo& pick_info)  BOOL LLToolPie::handleRightMouseDown(S32 x, S32 y, MASK mask)  {  	// don't pick transparent so users can't "pay" transparent objects -	gViewerWindow->pickAsync(x, y, mask, rightMouseCallback, FALSE); +	mPick = gViewerWindow->pickImmediate(x, y, FALSE); +	mPick.mKeyMask = mask; +  	// claim not handled so UI focus stays same +	 +	pickRightMouseDownCallback(); +	  	return FALSE;  } @@ -134,13 +136,6 @@ BOOL LLToolPie::handleScrollWheel(S32 x, S32 y, S32 clicks)  	return LLViewerMediaFocus::getInstance()->handleScrollWheel(x, y, clicks);  } -// static -void LLToolPie::rightMouseCallback(const LLPickInfo& pick_info) -{ -	LLToolPie::getInstance()->mPick = pick_info; -	LLToolPie::getInstance()->pickRightMouseDownCallback(); -} -  // True if you selected an object.  BOOL LLToolPie::pickLeftMouseDownCallback()  { diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h index 3660c68552..5f0e28fa95 100644 --- a/indra/newview/lltoolpie.h +++ b/indra/newview/lltoolpie.h @@ -71,9 +71,6 @@ public:  	LLObjectSelection*	getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; }  	void 				resetSelection(); -	static void			leftMouseCallback(const LLPickInfo& pick_info); -	static void			rightMouseCallback(const LLPickInfo& pick_info); -  	static void			selectionPropertiesReceived();  	static void			showAvatarInspector(const LLUUID& avatar_id); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index bf96472e7e..6e11788e0a 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -987,7 +987,7 @@ void LLViewerMediaImpl::emitEvent(LLPluginClassMedia* plugin, LLViewerMediaObser  bool LLViewerMediaImpl::initializeMedia(const std::string& mime_type)  {  	bool mimeTypeChanged = (mMimeType != mime_type); -	bool pluginChanged = (LLMIMETypes::implType(mMimeType) != LLMIMETypes::implType(mime_type)); +	bool pluginChanged = (LLMIMETypes::implType(mCurrentMimeType) != LLMIMETypes::implType(mime_type));  	if(!mMediaSource || pluginChanged)  	{ @@ -1127,6 +1127,9 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type)  	// If we got here, we want to ignore previous init failures.  	mMediaSourceFailed = false; +	// Save the MIME type that really caused the plugin to load +	mCurrentMimeType = mMimeType; +  	LLPluginClassMedia* media_source = newSourceFromMediaType(mMimeType, this, mMediaWidth, mMediaHeight);  	if (media_source) @@ -1563,6 +1566,7 @@ void LLViewerMediaImpl::unload()  	mMediaURL.clear();  	mMimeType.clear();  	mCurrentMediaURL.clear(); +	mCurrentMimeType.clear();  }  ////////////////////////////////////////////////////////////////////////////////////////// @@ -2123,7 +2127,7 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla  			// TODO: may want a different message for this case?  			LLSD args; -			args["PLUGIN"] = LLMIMETypes::implType(mMimeType); +			args["PLUGIN"] = LLMIMETypes::implType(mCurrentMimeType);  			LLNotificationsUtil::add("MediaPluginFailed", args);  		}  		break; @@ -2137,7 +2141,7 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla  			resetPreviousMediaState();  			LLSD args; -			args["PLUGIN"] = LLMIMETypes::implType(mMimeType); +			args["PLUGIN"] = LLMIMETypes::implType(mCurrentMimeType);  			// SJB: This is getting called every frame if the plugin fails to load, continuously respawining the alert!  			//LLNotificationsUtil::add("MediaPluginFailed", args);  		} @@ -2537,76 +2541,3 @@ void LLViewerMediaImpl::setTextureID(LLUUID id)  	}  } - -////////////////////////////////////////////////////////////////////////////////////////// -//static -void LLViewerMedia::toggleMusicPlay(void*) -{ -// FIXME: This probably doesn't belong here -#if 0 -	if (mMusicState != PLAYING) -	{ -		mMusicState = PLAYING; // desired state -		if (gAudiop) -		{ -			LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); -			if ( parcel ) -			{ -				gAudiop->startInternetStream(parcel->getMusicURL()); -			} -		} -	} -	else -	{ -		mMusicState = STOPPED; // desired state -		if (gAudiop) -		{ -			gAudiop->stopInternetStream(); -		} -	} -#endif -} - -////////////////////////////////////////////////////////////////////////////////////////// -//static -void LLViewerMedia::toggleMediaPlay(void*) -{ -// FIXME: This probably doesn't belong here -#if 0 -	if (LLViewerMedia::isMediaPaused()) -	{ -		LLViewerParcelMedia::start(); -	} -	else if(LLViewerMedia::isMediaPlaying()) -	{ -		LLViewerParcelMedia::pause(); -	} -	else -	{ -		LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); -		if (parcel) -		{ -			LLViewerParcelMedia::play(parcel); -		} -	} -#endif -} - -////////////////////////////////////////////////////////////////////////////////////////// -//static -void LLViewerMedia::mediaStop(void*) -{ -// FIXME: This probably doesn't belong here -#if 0 -	LLViewerParcelMedia::stop(); -#endif -} - -////////////////////////////////////////////////////////////////////////////////////////// -//static  -bool LLViewerMedia::isMusicPlaying() -{	 -// FIXME: This probably doesn't belong here -// FIXME: make this work -	return false;	 -} diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 28fb379960..5e4dd8ff30 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -99,14 +99,10 @@ class LLViewerMedia  		static void setVolume(F32 volume);  		static void updateMedia(void* dummy_arg = NULL); -		static bool isMusicPlaying();  		static void initClass();  		static void cleanupClass(); -		static void toggleMusicPlay(void*); -		static void toggleMediaPlay(void*); -		static void mediaStop(void*);  		static F32 getVolume();	  		static void muteListChanged();  		static void setInWorldMediaDisabled(bool disabled); @@ -187,6 +183,7 @@ public:  	std::string getMediaURL() const { return mMediaURL; }  	std::string getCurrentMediaURL();  	std::string getHomeURL() { return mHomeURL; } +	std::string getMediaEntryURL() { return mMediaEntryURL; }      void setHomeURL(const std::string& home_url) { mHomeURL = home_url; };  	void clearCache();  	std::string getMimeType() { return mMimeType; } @@ -323,6 +320,7 @@ public:  	std::string mHomeURL;  	std::string mMimeType;  	std::string mCurrentMediaURL;	// The most current media url from the plugin (via the "location changed" or "navigate complete" events). +	std::string mCurrentMimeType;	// The MIME type that caused the currently loaded plugin to be loaded.  	S32 mLastMouseX;	// save the last mouse coord we get, so when we lose capture we can simulate a mouseup at that point.  	S32 mLastMouseY;  	S32 mMediaWidth; diff --git a/indra/newview/llviewermedia_streamingaudio.cpp b/indra/newview/llviewermedia_streamingaudio.cpp index e9293ac5a4..67b051e536 100644 --- a/indra/newview/llviewermedia_streamingaudio.cpp +++ b/indra/newview/llviewermedia_streamingaudio.cpp @@ -62,7 +62,7 @@ void LLStreamingAudio_MediaPlugins::start(const std::string& url)  	if (!mMediaPlugin) // lazy-init the underlying media plugin  	{  		mMediaPlugin = initializeMedia("audio/mpeg"); // assumes that whatever media implementation supports mp3 also supports vorbis. -		llinfos << "steaming audio mMediaPlugin is now " << mMediaPlugin << llendl; +		llinfos << "streaming audio mMediaPlugin is now " << mMediaPlugin << llendl;  	}  	if(!mMediaPlugin) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 15855f154d..5445a79137 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -2466,7 +2466,7 @@ class LLViewJoystickFlycam : public view_listener_t  class LLViewCheckJoystickFlycam : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) -		{ +	{  		bool new_value = LLViewerJoystick::getInstance()->getOverrideCamera();  		return new_value;  	} @@ -3704,6 +3704,7 @@ void reset_view_final( BOOL proceed )  	}  	gAgent.resetView(TRUE, TRUE); +	gAgent.setLookAt(LOOKAT_TARGET_CLEAR);  }  class LLViewLookAtLastChatter : public view_listener_t diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 6f9e551649..3362142807 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2644,9 +2644,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  			LLNotificationsUI::LLNotificationManager::instance().onChat(  					chat, LLNotificationsUI::NT_NEARBYCHAT); -            // adding temporarily so that communications window chat bar  -            // works until the new chat window is ready -			chat.mText = from_name + ": " + chat.mText;  			LLFloaterChat::addChat(chat, FALSE, FALSE);  		}  		else diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index 90a7ee98b9..0f7903a7a5 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -34,6 +34,7 @@  #include "llviewerparcelmedia.h"  #include "llagent.h" +#include "llaudioengine.h"  #include "llviewercontrol.h"  #include "llviewermedia.h"  #include "llviewerregion.h" @@ -109,7 +110,9 @@ void LLViewerParcelMedia::update(LLParcel* parcel)  			std::string mediaCurrentUrl = std::string( parcel->getMediaCurrentURL());  			// First use warning -			if(	! mediaUrl.empty() && gWarningSettings.getBOOL("FirstStreamingVideo") ) +			if( (!mediaUrl.empty() || +			     !parcel->getMusicURL().empty()) +			    && gWarningSettings.getBOOL("FirstStreamingMedia") )  			{  				LLNotificationsUtil::add("ParcelCanPlayMedia", LLSD(), LLSD(),  					boost::bind(callback_play_media, _1, _2, parcel)); @@ -182,7 +185,7 @@ void LLViewerParcelMedia::play(LLParcel* parcel)  	if (!parcel) return; -	if (!gSavedSettings.getBOOL("AudioSteamingMedia") || !gSavedSettings.getBOOL("AudioStreamingVideo")) +	if (!gSavedSettings.getBOOL("AudioStreamingMedia") || !gSavedSettings.getBOOL("AudioStreamingVideo"))  		return;  	std::string media_url = parcel->getMediaURL(); @@ -593,16 +596,28 @@ bool callback_play_media(const LLSD& notification, const LLSD& response, LLParce  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0)  	{ +		// user has elected to automatically play media. +		gSavedSettings.setBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING, TRUE);  		gSavedSettings.setBOOL("AudioStreamingVideo", TRUE); -		if(!gSavedSettings.getBOOL("AudioSteamingMedia"))  -			gSavedSettings.setBOOL("AudioSteamingMedia", TRUE); +		gSavedSettings.setBOOL("AudioStreamingMusic", TRUE); +		if(!gSavedSettings.getBOOL("AudioStreamingMedia"))  +			gSavedSettings.setBOOL("AudioStreamingMedia", TRUE); +		// play media right now, if available  		LLViewerParcelMedia::play(parcel); +		// play music right now, if available +		if (parcel) +		{ +			std::string music_url = parcel->getMusicURL(); +			if (gAudiop && !music_url.empty()) +				gAudiop->startInternetStream(music_url); +		}  	}  	else  	{  		gSavedSettings.setBOOL("AudioStreamingVideo", FALSE); +		gSavedSettings.setBOOL("AudioStreamingMusic", FALSE);  	} -	gWarningSettings.setBOOL("FirstStreamingVideo", FALSE); +	gWarningSettings.setBOOL("FirstStreamingMedia", FALSE);  	return false;  } diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index be68a2ef42..5a5c4e7480 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -44,6 +44,7 @@  #include "llparcel.h"  #include "llsecondlifeurls.h"  #include "message.h" +#include "llfloaterreg.h"  // Viewer includes  #include "llagent.h" @@ -52,6 +53,7 @@  #include "llfirstuse.h"  #include "llfloaterbuyland.h"  #include "llfloatergroups.h" +#include "llfloaternearbymedia.h"  #include "llfloatersellland.h"  #include "llfloatertools.h"  #include "llparcelselection.h" @@ -1735,7 +1737,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use  					}  					else if (!gAudiop->getInternetStreamURL().empty())  					{ -						llinfos << "Stopping parcel music" << llendl; +						llinfos << "Stopping parcel music (parcel stream URL is empty)" << llendl;  						gAudiop->startInternetStream(LLStringUtil::null);  					}  				} @@ -1754,15 +1756,19 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use  void optionally_start_music(const std::string& music_url)  { -	if (gSavedSettings.getBOOL("AudioStreamingMusic") && gSavedSettings.getBOOL("AudioSteamingMedia")) -	{ -		// Make the user click the start button on the overlay bar. JC -		//		llinfos << "Starting parcel music " << music_url << llendl; - -		// now only play music when you enter a new parcel if the control is in PLAY state -		// changed as part of SL-4878 -		if ( gOverlayBar && gOverlayBar->musicPlaying()) +	if (gSavedSettings.getBOOL("AudioStreamingMusic") && +	    gSavedSettings.getBOOL("AudioStreamingMedia")) +	{ +		// only play music when you enter a new parcel if the UI control for this +		// was not *explicitly* stopped by the user. (part of SL-4878) +		LLFloaterNearbyMedia *nearby_media_floater = LLFloaterReg::findTypedInstance<LLFloaterNearbyMedia>("nearby_media"); +		if ((nearby_media_floater && +		     nearby_media_floater->getParcelAudioAutoStart()) || +		    // or they have expressed no opinion in the UI, but have autoplay on... +		    (!nearby_media_floater && +		     gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING)))  		{ +			llinfos << "Starting parcel music " << music_url << llendl;  			gAudiop->startInternetStream(music_url);  		}  	} diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index b1ad01f54f..f825eaa8ab 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -2767,7 +2767,7 @@ void LLViewerMediaTexture::updateClass()  #if 0  	//force to play media. -	gSavedSettings.setBOOL("AudioSteamingMedia", true) ; +	gSavedSettings.setBOOL("AudioStreamingMedia", true) ;  	gSavedSettings.setBOOL("AudioStreamingVideo", true) ;  #endif diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index 18cdd23ed9..917d69fe16 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -278,10 +278,14 @@ void LLVoiceChannel::deactivate()  	if (callStarted())  	{  		setState(STATE_HUNG_UP); -		// mute the microphone if required when returning to the proximal channel -		if (gSavedSettings.getBOOL("AutoDisengageMic") && sCurrentVoiceChannel == this) +		 +		//Default mic is OFF when leaving voice calls +		if (gSavedSettings.getBOOL("AutoDisengageMic") &&  +			sCurrentVoiceChannel == this && +			gVoiceClient->getUserPTTState())  		{  			gSavedSettings.setBOOL("PTTCurrentlyEnabled", true); +			gVoiceClient->inputUserControlState(true);  		}  	} @@ -498,6 +502,13 @@ void LLVoiceChannelGroup::activate()  				LLRecentPeople::instance().add(buddy_id);  		}  #endif + +		//Mic default state is OFF on initiating/joining Ad-Hoc/Group calls +		if (gVoiceClient->getUserPTTState() && gVoiceClient->getPTTIsToggle()) +		{ +			gVoiceClient->inputUserControlState(true); +		} +		  	}  } @@ -811,6 +822,12 @@ void LLVoiceChannelP2P::activate()  		// Add the party to the list of people with which we've recently interacted.  		LLRecentPeople::instance().add(mOtherUserID); + +		//Default mic is ON on initiating/joining P2P calls +		if (!gVoiceClient->getUserPTTState() && gVoiceClient->getPTTIsToggle()) +		{ +			gVoiceClient->inputUserControlState(true); +		}  	}  } diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index c2d26a1971..423c46e14c 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -4445,7 +4445,7 @@ void LLVoiceClient::participantUpdatedEvent(  			participant->mVolume = volume; -			// *HACH: mantipov: added while working on EXT-3544 +			// *HACK: mantipov: added while working on EXT-3544  			/*  			Sometimes LLVoiceClient::participantUpdatedEvent callback is called BEFORE   			LLViewerChatterBoxSessionAgentListUpdates::post() sometimes AFTER. @@ -4462,7 +4462,9 @@ void LLVoiceClient::participantUpdatedEvent(  			in LLCallFloater::draw()  			*/  			LLVoiceChannel* voice_cnl = LLVoiceChannel::getCurrentVoiceChannel(); -			if (voice_cnl) + +			// ignore session ID of local chat +			if (voice_cnl && voice_cnl->getSessionID().notNull())  			{  				LLSpeakerMgr* speaker_manager = LLIMModel::getInstance()->getSpeakerManager(voice_cnl->getSessionID());  				if (speaker_manager) @@ -5883,6 +5885,10 @@ void LLVoiceClient::setPTTIsToggle(bool PTTIsToggle)  	mPTTIsToggle = PTTIsToggle;  } +bool LLVoiceClient::getPTTIsToggle() +{ +	return mPTTIsToggle; +}  void LLVoiceClient::setPTTKey(std::string &key)  { diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index 347fae6156..724179847d 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -193,6 +193,7 @@ static	void updatePosition(void);  		static bool voiceEnabled();  		void setUsePTT(bool usePTT);  		void setPTTIsToggle(bool PTTIsToggle); +		bool getPTTIsToggle();  		void setPTTKey(std::string &key);  		void setEarLocation(S32 loc);  		void setVoiceVolume(F32 volume); diff --git a/indra/newview/skins/default/xui/en/favorites_bar_button.xml b/indra/newview/skins/default/xui/en/favorites_bar_button.xml index 90105f92fd..dcf9847adb 100644 --- a/indra/newview/skins/default/xui/en/favorites_bar_button.xml +++ b/indra/newview/skins/default/xui/en/favorites_bar_button.xml @@ -23,8 +23,6 @@   pad_left="11"   pad_right="7"   tab_stop="false" - pad_right="10" - pad_left="10"    top="0"   use_ellipses="true"   width="140" /> 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 57e92cdeec..243b63db00 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -14,8 +14,8 @@   visible="true"   width="360"   can_resize="true" - min_width="360" - min_height="350"> + min_width="250" + min_height="190">    <layout_stack    follows="all"    height="320" diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml index 1fa613468f..a4ef807f06 100644 --- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml @@ -30,7 +30,7 @@      </string>      <string       name="no_one_near"> -        No one near +        No one near has voice enabled      </string>      <string       name="max_visible_items"> diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml index 2f2964c42b..a666b8a427 100644 --- a/indra/newview/skins/default/xui/en/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml @@ -65,7 +65,7 @@      <slider       follows="top|left"       height="23" -     increment="0.05" +     increment="0.01"       left="1"       max_val="0.95"       min_val="0.05" diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml index 01df208850..dde92f23b6 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml @@ -30,6 +30,8 @@     label="Call"     enabled="true"     name="call"> +    <menu_item_call.on_click +     function="InspectAvatar.Call"/>    </menu_item_call>    <menu_item_call     label="Teleport" diff --git a/indra/newview/skins/default/xui/en/menu_picks_plus.xml b/indra/newview/skins/default/xui/en/menu_picks_plus.xml index 3065239615..f3b207e36c 100644 --- a/indra/newview/skins/default/xui/en/menu_picks_plus.xml +++ b/indra/newview/skins/default/xui/en/menu_picks_plus.xml @@ -11,6 +11,9 @@          <menu_item_call.on_click            function="Picks.Plus.Action"            userdata="new_pick" /> +        <menu_item_call.on_enable +         function="Picks.Plus.Enable" +         userdata="new_pick" />          </menu_item_call>      <menu_item_call        name="create_classified"  diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 95a7374e7b..6d5f0bedb0 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -5087,6 +5087,14 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you [O    <notification     icon="notify.tga" +   name="TeleportOfferSent" +   type="offer"> +	Teleport offer sent to [TO_NAME] +  </notification> + + +  <notification +   icon="notify.tga"     name="GotoURL"     type="notify">  [MESSAGE] diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml index f3a2297151..6c54532a3a 100644 --- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml @@ -5,56 +5,94 @@   height="215"   name="panel_im_control_panel"   width="180"> -    <avatar_list -     color="DkGray2" +    <layout_stack +     mouse_opaque="false" +     border_size="0" +     clip="false"       follows="all" -     height="130" -     ignore_online_status="true" +     height="215"       layout="topleft"       left="3" -     name="speakers_list" -     opaque="false" -     show_info_btn="false" -     show_profile_btn="false" -     show_speaking_indicator="false" -     top="10" -     width="180" /> -    <panel -     background_visible="true" -     bg_alpha_color="DkGray2" -     border="false" -     bottom="1" -     follows="left|right|bottom" -     height="70" -     left="0" -     left_pad="0" -     name="panel_call_buttons" -     top_pad="0" -     width="180"> -        <button -         bottom="10" -         follows="all" -         height="20" -         label="Call" -         left_delta="10" -         name="call_btn" -         width="160" /> -        <button -         bottom="40" -         follows="all" -         height="20" -         label="Leave Call" -         name="end_call_btn" -         visible="false" -          /> -        <button -         follows="all" -         bottom="10" -         height="20" -         label="Voice Controls" -         name="voice_ctrls_btn" -         use_ellipses="true"  -         visible="false" -          /> -    </panel> +     name="vertical_stack" +     orientation="vertical" +     top="0" +     width="177"> +        <layout_panel +         auto_resize="true" +         follows="top|left" +         height="130" +         layout="topleft" +         min_height="0" +         mouse_opaque="false" +         width="180" +         top="0" +         name="speakers_list_panel" +         user_resize="false"> +            <avatar_list +             color="DkGray2" +             follows="all" +             height="130" +             ignore_online_status="true" +             layout="topleft" +             name="speakers_list" +             opaque="false" +             show_info_btn="false" +             show_profile_btn="false" +             show_speaking_indicator="false" +             width="180" /> +        </layout_panel> +        <layout_panel +         auto_resize="false" +         follows="top|left|right" +         height="25" +         layout="topleft" +         min_height="25" +         width="160" +         name="call_btn_panel" +         user_resize="false" +         visible="false"> +            <button +             follows="all" +             height="20" +             label="Call" +             name="call_btn" +             width="160" +             top="5" /> +        </layout_panel> +        <layout_panel +         auto_resize="false" +         follows="top|left|right" +         height="25" +         layout="topleft" +         min_height="25" +         width="160" +         name="end_call_btn_panel" +         user_resize="false" +         visible="false"> +            <button +             follows="all" +             height="20" +             label="Leave Call" +             name="end_call_btn" +             top="5"/> +        </layout_panel> +        <layout_panel +         auto_resize="false" +         follows="top|left|right" +         height="25" +         layout="topleft" +         min_height="25" +         width="160" +         name="voice_ctrls_btn_panel" +         user_resize="false" +         visible="false"> +            <button +             follows="all" +             height="20" +             label="Voice Controls" +             name="voice_ctrls_btn" +             top="5" +             use_ellipses="true" /> +        </layout_panel> +    </layout_stack>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml index 86b30ebfce..4073ef158b 100644 --- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml @@ -5,66 +5,110 @@   height="238"   name="panel_im_control_panel"   width="180"> -    <avatar_list -     color="DkGray2" +    <layout_stack +     mouse_opaque="false" +     border_size="0" +     clip="false"       follows="all" -     height="100" -     ignore_online_status="true" +     height="238"       layout="topleft" -     left="3" -     name="speakers_list" -     opaque="false" -     show_info_btn="false" -     show_profile_btn="false" -     show_speaking_indicator="false" -     top="10" -     width="180" /> -    <button -     bottom_pad="0" -     follows="left|right|bottom" -     height="23" -     label="Group Profile" -     left_delta="10" -     name="group_info_btn" -     use_ellipses="true"  -     width="160" /> -    <panel -     background_visible="true" -     bg_alpha_color="DkGray2" -     border="false" -     follows="left|right|bottom" -     height="70" -     left="0" -     left_pad="0" -     name="panel_call_buttons" -     top_pad="0" -     width="180"> -        <button -         bottom="10" -         follows="all" -         height="23" -         label="Call Group" -         left_delta="10" -         name="call_btn" -         use_ellipses="true"  -         width="160" /> -        <button -         bottom="40" -         follows="all" -         height="23" -         label="Leave Call" -         name="end_call_btn" -         use_ellipses="true"  -         visible="false" -          /> -        <button -         bottom="10" -         follows="all" -         height="23" -         label="Open Voice Controls" -         name="voice_ctrls_btn" -         use_ellipses="true"  -         visible="false" -          /> -    </panel> +     left="5" +     name="vertical_stack" +     orientation="vertical" +     top="0" +     width="175"> +        <layout_panel +         auto_resize="true" +         follows="top|left" +         height="100" +         layout="topleft" +         min_height="0" +         mouse_opaque="false" +         width="180" +         top="0" +         name="speakers_list_panel" +         user_resize="false"> +            <avatar_list +             color="DkGray2" +             follows="all" +             height="100" +             ignore_online_status="true" +             layout="topleft" +             name="speakers_list" +             opaque="false" +             show_info_btn="false" +             show_profile_btn="false" +             show_speaking_indicator="false" +             width="180" /> +        </layout_panel> +        <layout_panel +         auto_resize="false" +         follows="top|left|right" +         height="28" +         layout="topleft" +         min_height="28" +         width="160" +         name="group_info_btn_panel" +         user_resize="false"> +            <button +             follows="left|right|bottom" +             height="23" +             label="Group Profile" +             name="group_info_btn" +             use_ellipses="true" +             top="5" +             width="160" /> +        </layout_panel> +        <layout_panel +         auto_resize="false" +         follows="top|left|right" +         height="28" +         layout="topleft" +         min_height="28" +         width="160" +         name="call_btn_panel" +         user_resize="false"> +            <button +             follows="all" +             height="23" +             label="Call Group" +             name="call_btn" +             use_ellipses="true"  +             width="160" /> +        </layout_panel> +        <layout_panel +         auto_resize="false" +         follows="top|left|right" +         height="28" +         layout="topleft" +         min_height="28" +         width="160" +         name="end_call_btn_panel" +         user_resize="false" +         visible="false"> +            <button +             follows="all" +             height="23" +             label="Leave Call" +             name="end_call_btn" +             use_ellipses="true" /> +        </layout_panel> +        <layout_panel +         auto_resize="false" +         follows="top|left|right" +         height="28" +         layout="topleft" +         min_height="28" +         width="160" +         name="voice_ctrls_btn_panel" +         user_resize="false" +         visible="false"> +            <button +             follows="all" +             height="23" +             label="Open Voice Controls" +             name="voice_ctrls_btn" +             use_ellipses="true" /> +        </layout_panel> +    </layout_stack>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml index 30e652befd..2e3d5a7320 100644 --- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml @@ -6,84 +6,161 @@   width="110">      <avatar_icon       follows="left|top" -     height="100" +     height="105"       left_delta="5"       name="avatar_icon"       top="-5" -     width="100"/> +     width="105"/>      <text       follows="top|left|right"       font="SansSerifLarge" -     height="22" +     height="19"       layout="topleft"       name="avatar_name"       use_ellipses="true"       value="Unknown" -     width="100" /> -    <button -     follows="left|top|right" -     height="20" -     label="Profile" -     name="view_profile_btn" -     width="100" /> -    <button -     follows="left|top|right" -     height="20" -     label="Add Friend" -     name="add_friend_btn" -     width="100" /> -    <button -     follows="left|top|right" -     height="20" -     label="Teleport" -     name="teleport_btn" -     width="100" /> -   <button -     follows="left|top|right" -     height="20" -     label="Share" -     name="share_btn" -     width="100" /> -     <!--Removing pay button to save space - will update spec - verified by Erica/Steve --> - <!--   <button -     follows="left|top|right" -     height="20" -     label="Pay" -     name="pay_btn" -     width="100" />--> -    <panel -     background_visible="true" -     bg_alpha_color="DkGray2" -     border="false" -     top_pad="10" -     follows="left|bottom|right" -     height="70" -     left="1" -     name="panel_call_buttons" -     width="109"> -        <button -         bottom="10" -         follows="left|top|right" -         height="20" -         label="Call" -         left_delta="5" -         name="call_btn" -         width="100" /> -        <button -         bottom="35" -         follows="left|top|right" +     width="110" /> +    <layout_stack +     mouse_opaque="false" +     border_size="0" +     clip="false" +     follows="all" +     height="168" +     layout="topleft" +     left="5" +     name="button_stack" +     orientation="vertical" +     top_pad="0" +     width="105"> +        <layout_panel +         mouse_opaque="false" +         auto_resize="true" +         follows="top|left" +         height="0" +         layout="topleft" +         left="2" +         min_height="0" +         width="100" +         top="0" +         name="spacer" +         user_resize="false" /> +        <layout_panel +         auto_resize="false" +         follows="top|left|right"           height="20" -         label="Leave Call" -         name="end_call_btn" -         visible="false" -         width="100" /> +         layout="topleft" +         min_height="20" +         width="100" +         name="view_profile_btn_panel" +         user_resize="false"> +            <button +             follows="left|top|right" +             height="20" +             label="Profile" +             name="view_profile_btn" +             top="0" +             width="100" /> +        </layout_panel> +        <layout_panel +         auto_resize="false" +         follows="top|left|right" +         height="25" +         layout="topleft" +         min_height="25" +         width="100" +         name="add_friend_btn_panel" +         user_resize="false"> +            <button +             follows="left|top|right" +             height="20" +             label="Add Friend" +             name="add_friend_btn" +             top="5" +             width="100" /> +        </layout_panel> +        <layout_panel +         auto_resize="false" +         follows="top|left|right" +         height="25" +         layout="topleft" +         min_height="25" +         width="100" +         name="teleport_btn_panel" +         user_resize="false">          <button -         bottom="10" -         follows="left|top|right" -         height="20" -         label="Voice Controls" -         name="voice_ctrls_btn" -         visible="false" -         width="100" /> -    </panel> +             auto_resize="false" +             follows="left|top|right" +             height="20" +             label="Teleport" +             name="teleport_btn" +             width="100" /> +        </layout_panel> +        <layout_panel +         auto_resize="false" +         follows="top|left|right" +         height="25" +         layout="topleft" +         min_height="25" +         width="100" +         name="share_btn_panel" +         user_resize="false"> +           <button +             auto_resize="true" +             follows="left|top|right" +             height="20" +             label="Share" +             name="share_btn" +             width="100" /> +        </layout_panel> +        <layout_panel +         auto_resize="false" +         follows="top|left|right" +         height="25" +         layout="topleft" +         min_height="25" +         width="100" +         name="call_btn_panel" +         user_resize="false"> +            <button +             follows="left|top|right" +             height="20" +             label="Call" +             name="call_btn" +             width="100" /> +        </layout_panel> +        <layout_panel +         auto_resize="false" +         follows="top|left|right" +         height="25" +         layout="topleft" +         min_height="25" +         width="100" +         name="end_call_btn_panel" +         user_resize="false" +         visible="false"> +            <button +             follows="left|top|right" +             height="20" +             label="Leave Call" +             name="end_call_btn" +             width="100" /> +        </layout_panel> +        <layout_panel +         auto_resize="false" +         follows="top|left|right" +         height="25" +         layout="topleft" +         min_height="25" +         width="100" +         name="voice_ctrls_btn_panel" +         user_resize="false" +         visible="false"> +            <button +             follows="left|top|right" +             height="20" +             label="Voice Controls" +             name="voice_ctrls_btn" +             width="100" /> +        </layout_panel> +    </layout_stack>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml index ccd754ac5e..7204e57479 100644 --- a/indra/newview/skins/default/xui/en/panel_instant_message.xml +++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml @@ -21,6 +21,7 @@       label="im_header"       layout="topleft"       left="5" +     mouse_opaque="false"       name="im_header"       top="5"       width="295"> @@ -30,7 +31,7 @@           image_name="Generic_Person"           layout="topleft"           left="3" -         mouse_opaque="true" +         mouse_opaque="false"           name="avatar_icon"           top="3"           width="18" /> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml index d6d8e9562b..7e512f9594 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -21,19 +21,6 @@       tab_position="top"       halign="center"       width="313"> -      <inventory_panel -        label="MY OUTFITS" -        help_topic="my_outfits_tab" -	    allow_multi_select="true" -	    follows="all" -	    border="false" -	    left="0" -        top="0" -        height="500" -        width="290" - 		mouse_opaque="true" - 	    name="outfitslist_accordionpanel" - 		start_folder="My Outfits" />            <inventory_panel          label="WEARING"          help_topic="now_wearing_tab" @@ -46,6 +33,19 @@          mouse_opaque="true"          name="cof_accordionpanel"          start_folder="Current Outfit" /> +         <inventory_panel +           label="MY OUTFITS" +           help_topic="my_outfits_tab" +           allow_multi_select="true" +           follows="all" +           border="false" +           left="0" +           top="0" +           height="500" +           width="290" +           mouse_opaque="true" +           name="outfitslist_accordionpanel" +           start_folder="My Outfits" />      </tab_container>  	<panel  	  background_visible="true" diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml index 677d0de243..4cef1f9c60 100644 --- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml @@ -1,54 +1,99 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel  	follows="left|right|top|bottom" -	name="MediaControls" +	name="MediaControlsPanel"  	background_visible="false"  	height="200"  	layout="topleft"  	help_topic="prim_media_controls"  	mouse_opaque="false" +	min_width="300"  	width="800">    <string name="control_background_image_name">Inspector_Background</string>    <string name="skip_step">0.2</string> -  <string name="min_width">400</string> -  <string name="min_height">120</string> +  <string name="min_width">300</string> +  <string name="min_height">75</string>    <string name="zoom_near_padding">1.0</string>    <string name="zoom_medium_padding">1.25</string>    <string name="zoom_far_padding">1.5</string> -  <panel -	  name="media_region" -	  height="100" -	  follows="left|right|top|bottom" +  <string name="top_world_view_avoid_zone">50</string> +  <layout_stack +	  name="progress_indicator_area" +	  follows="left|right|top" +	  height="8"  	  layout="topleft" -	  mouse_opaque="false" -	  top="0" /> +	  animate="false" +	  left="0" +	  orientation="horizontal" +	  top="22"> +	<!-- outer layout_panels center the inner one --> +	<layout_panel +		width="0" +		name="left_bookend_bottom" +		mouse_opaque="false" +		layout="topleft" +		user_resize="false" /> +	<panel +		name="media_progress_indicator" +		mouse_opaque="false" +		follows="left|right|top" +		height="8" +		layout="topleft" +		left="0" +		top="0" +		auto_resize="false" +		user_resize="false" +		min_width="100" +		width="200"> +	  <progress_bar +		  name="media_progress_bar" +		  color_bg="1 1 1 1" +		  color_bar="1 1 1 0.96" +		  follows="left|right|top" +		  height="8" +		  layout="topleft" +		  top="0" +		  left="0" +		  tool_tip="Media is Loading"/> +	</panel> +	<layout_panel +		name="right_bookend_bottom" +		width="0" +		mouse_opaque="false" +		layout="topleft" +		user_resize="false" /> +  </layout_stack>    <layout_stack  	  name="media_controls" -	  follows="left|right" +	  follows="left|right|top"  	  animate="false"  	  height="75"  	  layout="topleft" +	  top="0"  	  left="0" +	  border_size="1"  	  mouse_opaque="false" -	  orientation="horizontal" -	  top="100"> +	  orientation="horizontal">  	<!-- outer layout_panels center the inner one -->  	<layout_panel  		name="left_bookend" +		top="0"  		width="0" -	  mouse_opaque="false" +		mouse_opaque="false"  		layout="topleft"  		user_resize="false" />  	<layout_panel  		name="back" +		top="0"  		auto_resize="false"  		user_resize="false"  		layout="topleft" -	  mouse_opaque="false" +		mouse_opaque="false"  		min_width="22" -		width="22" -		top="4"> +		width="22">  	  <button +		  name="back_btn" +		  follows="top"  		  image_overlay="Arrow_Left_Off"  		  image_disabled="PushButton_Disabled"  		  image_disabled_selected="PushButton_Disabled" @@ -56,12 +101,12 @@  		  image_unselected="PushButton_Off"  		  hover_glow_amount="0.15"  		  auto_resize="false" -		  height="22"  		  layout="topleft"  		  tool_tip="Navigate back" -		  width="22" +		  top="0"  		  left="0" -		  top_delta="4"> +		  width="22" +		  height="22">  		<button.commit_callback  			function="MediaCtrl.Back" />  	  </button> @@ -71,22 +116,24 @@  		auto_resize="false"  		user_resize="false"  		layout="topleft" -		top="10"  		min_width="22" +		top="0" +		height="22"  		width="22">  	  <button +		  follows="top"  		  image_overlay="Arrow_Right_Off"  		  image_disabled="PushButton_Disabled"  		  image_disabled_selected="PushButton_Disabled"  		  image_selected="PushButton_Selected"  		  image_unselected="PushButton_Off"  		  hover_glow_amount="0.15" +		  top="0"  		  height="22" -		  layout="topleft" -		  tool_tip="Navigate forward" -		  top_delta="0"  		  min_width="22" -		  width="22"> +		  width="22" +		  layout="topleft" +		  tool_tip="Navigate forward">  		<button.commit_callback  			function="MediaCtrl.Forward" />  	  </button> @@ -96,10 +143,12 @@  		auto_resize="false"  		user_resize="false"  		layout="topleft" -		top="-2" +		top="0" +		height="22"  		min_width="22"  		width="22">  	  <button +		  follows="top"  		  image_disabled="PushButton_Disabled"  		  image_disabled_selected="PushButton_Disabled"  		  image_overlay="Home_Off" @@ -108,6 +157,7 @@  		  hover_glow_amount="0.15"  		  layout="topleft"  		  tool_tip="Home page" +		  top="0"  		  height="22"  		  min_width="22"  		  width="22"> @@ -120,19 +170,22 @@  		auto_resize="false"  		user_resize="false"  		layout="topleft" -		top="2" +		top="0" +		height="22"  		min_width="22"  		width="22">  	  <button +		  follows="top"  		  image_overlay="Stop_Off"  		  image_disabled="PushButton_Disabled"  		  image_disabled_selected="PushButton_Disabled"  		  image_selected="PushButton_Selected"  		  image_unselected="PushButton_Off"  		  hover_glow_amount="0.15" -		  height="22"  		  layout="topleft"  		  tool_tip="Stop media" +		  top="0" +		  height="22"  		  min_width="22"  		  width="22">  		<button.commit_callback @@ -144,11 +197,12 @@  		auto_resize="false"  		user_resize="false"  		layout="topleft" -		top="6" +		top="0" +		height="22"  		min_width="22"  		width="22">  	  <button -		  height="22" +		  follows="top"  		  image_overlay="Refresh_Off"  		  image_disabled="PushButton_Disabled"  		  image_disabled_selected="PushButton_Disabled" @@ -157,6 +211,8 @@  		  hover_glow_amount="0.15"  		  layout="topleft"  		  tool_tip="Reload" +		  top="0" +		  height="22"  		  min_width="22"  		  width="22">  		<button.commit_callback @@ -168,11 +224,12 @@  		auto_resize="false"  		user_resize="false"  		layout="topleft" -		top="10" +		top="0" +		height="22"  		min_width="22"  		width="22">  	  <button -		  height="22" +		  follows="top"  		  image_overlay="StopReload_Off"  		  image_disabled="PushButton_Disabled"  		  image_disabled_selected="PushButton_Disabled" @@ -181,6 +238,8 @@  		  hover_glow_amount="0.15"  		  layout="topleft"  		  tool_tip = "Stop loading" +		  top="0" +		  height="22"  		  min_width="22"  		  width="22">  		<button.commit_callback @@ -192,10 +251,12 @@  		auto_resize="false"  		user_resize="false"  		layout="topleft" -		top="14" +		top="0" +		height="22"  		min_width="22"  		width="24">  	  <button +		  follows="top"  		  image_overlay="Play_Off"  		  image_disabled="PushButton_Disabled"  		  image_disabled_selected="PushButton_Disabled" @@ -205,7 +266,7 @@  		  layout="topleft"  		  tool_tip = "Play media"  		  left_delta="2" -		  top="4" +		  top="0"  		  height="22"  		  min_width="22"  		  width="22"> @@ -218,10 +279,11 @@  		auto_resize="false"  		user_resize="false"  		layout="topleft" -		top="18" +		top="0"  		min_width="22"  		width="24">  	  <button +		  follows="top"  		  image_overlay="Pause_Off"  		  image_disabled="PushButton_Disabled"  		  image_disabled_selected="PushButton_Disabled" @@ -229,10 +291,10 @@  		  image_unselected="PushButton_Off"  		  hover_glow_amount="0.15"  		  layout="topleft" +		  top="0"  		  height="22"  		  width="22"  		  left_delta="-1" -		  top="4"  		  tool_tip = "Pause media">  		<button.commit_callback  			function="MediaCtrl.Pause" /> @@ -246,11 +308,12 @@  		height="24"  		follows="left|right|bottom"  		layout="topleft" +		top="0"  		width="190"  		min_width="90">  	  <line_editor   		  name="media_address_url" -		  follows="left|right"  +		  follows="top|left|right"   		  height="22"  		  top="0"  		  tool_tip="Media URL" @@ -261,17 +324,18 @@  	  <layout_stack  		  name="media_address_url_icons"  		  animate="false" -		  follows="right" +		  follows="top|right"  		  height="20"  		  width="38" -		  right="-2" -		  top="-1" -     	mouse_opaque="false" +		  top="0" +		  right="-1" +		  border_size="0" +		  mouse_opaque="false"  		  orientation="horizontal">  		<layout_panel  			layout="topleft"  			width="16" -     	mouse_opaque="false" +			mouse_opaque="false"  			auto_resize="false"  			user_resize="false">  		  <icon @@ -287,7 +351,7 @@  		<layout_panel  			layout="topleft"  			width="16" -     	mouse_opaque="false" +			mouse_opaque="false"  			auto_resize="false"  			user_resize="false">  		  <icon @@ -305,16 +369,17 @@  		name="media_play_position"  		auto_resize="true"  		user_resize="false" -		follows="left|right|top|bottom" +		follows="left|right"  		layout="topleft" -		height="16"		 +		top="0" +		height="22"  		min_width="100"  		width="200">  	  <slider_bar  		  name="media_play_slider"  		  follows="left|right|top" -		  height="20" -		  bottom="88" +		  top="0" +		  height="22"  		  increment="0.01"  		  initial_value="0.5"  		  layout="topleft" @@ -330,9 +395,11 @@  		auto_resize="false"  		user_resize="false"  		layout="topleft" +		top="0"  		min_width="22"  		width="22">  	  <button +		  follows="top"  		  image_overlay="SkipBackward_Off"  		  image_disabled="PushButton_Disabled"  		  image_disabled_selected="PushButton_Disabled" @@ -343,7 +410,7 @@  		  height="22"  		  layout="topleft"  		  tool_tip="Step back" -		  top="-14" +		  top="0"  		  width="22"  		  left="0">  		<button.commit_callback @@ -355,9 +422,11 @@  		auto_resize="false"  		user_resize="false"  		layout="topleft" +		top="0"  		min_width="22"  		width="22">  	  <button +		  follows="top"  		  image_overlay="SkipForward_Off"  		  image_disabled="PushButton_Disabled"  		  image_disabled_selected="PushButton_Disabled" @@ -367,7 +436,7 @@  		  height="22"  		  layout="topleft"  		  tool_tip="Step forward" -		  top="-14" +		  top="0"  		  min_width="22"  		  width="22">  		<button.commit_callback @@ -379,26 +448,28 @@  		auto_resize="false"  		user_resize="false"  		layout="topleft" -		top="-50" +		top="0"  		height="72"  		min_width="22"  		width="22">  	  <!-- Note: this is not quite right either...the mute button is not the -->  	  <!-- same as the others because it cannot have the "image_overlay" be  -->  	  <!-- two different images.  --> +	  <!-- Note also: the button and the slider must overlap! -->  	  <button +		  follows="top"  		  image_disabled="PushButton_Disabled"  		  image_disabled_selected="PushButton_Disabled"  		  image_selected="AudioMute_Off"  		  image_unselected="Audio_Off"  		  hover_glow_amount="0.15"  		  name="media_mute_button" -		  height="22"  		  is_toggle="true"  		  layout="topleft"  		  scale_image="false"   		  tool_tip="Mute This Media" -		  top="118" +		  top="0" +		  height="20"  		  min_width="22"  		  width="22" >  		<button.commit_callback @@ -411,7 +482,7 @@  	  <slider  		  orientation="vertical"  		  left="0" -		  top="-2" +		  top="16"  		  height="50"  		  layout="topleft"  		  increment="0.01" @@ -428,35 +499,24 @@  			function="MediaCtrl.HideVolumeSlider" />  	  </slider>  	</layout_panel> -	<panel -		height="28" -		layout="topleft" -		auto_resize="false" -		min_width="3" -		width="3"> -	  <icon -		  height="26" -		  image_name="media_panel_divider.png" -		  layout="topleft" -		  top="0" -		  min_width="3" -		  width="3" /> -	</panel>  	<layout_panel  		name="zoom_frame"  		auto_resize="false"  		user_resize="false"  		layout="topleft" +		top="0"  		height="28"  		min_width="22"  		width="22">  	  <button +		  follows="top"  		  image_overlay="Zoom_Off"  		  image_disabled="PushButton_Disabled"  		  image_disabled_selected="PushButton_Disabled"  		  image_selected="PushButton_Selected"  		  image_unselected="PushButton_Off"  		  hover_glow_amount="0.15" +		  top="0"  		  height="22"  		  layout="topleft"  		  tool_tip="Zoom into media" @@ -471,15 +531,18 @@  		auto_resize="false"  		user_resize="false"  		layout="topleft" +		top="0"  		min_width="21"  		width="21" >  	  <button +		  follows="top"  		  image_overlay="UnZoom_Off"  		  image_disabled="PushButton_Disabled"  		  image_disabled_selected="PushButton_Disabled"  		  image_selected="PushButton_Selected"  		  image_unselected="PushButton_Off"  		  hover_glow_amount="0.15" +		  top="0"  		  height="22"  		  layout="topleft"  		  tool_tip ="Zoom Back" @@ -494,9 +557,11 @@  		auto_resize="false"  		user_resize="false"  		layout="topleft" +		top="0"  		min_width="22"  		width="22">  	  <button +		  follows="top"  		  image_overlay="ExternalBrowser_Off"  		  image_disabled="PushButton_Disabled"  		  image_disabled_selected="PushButton_Disabled" @@ -506,7 +571,7 @@  		  height="22"  		  layout="topleft"  		  tool_tip = "Open URL in browser" -		  top_delta="-4" +		  top="0"  		  min_width="24"  		  width="24" >  		<button.commit_callback @@ -516,46 +581,16 @@  	<!-- bookend panel -->  	<layout_panel  		name="right_bookend" -		width="0" -		layout="topleft" -		user_resize="false" /> -  </layout_stack> -  <layout_stack -	  follows="left|right|bottom" -	  height="20" -	  layout="topleft" -	  animate="false" -	  left="0" -	  orientation="horizontal" -	  top="170"> -	<!-- outer layout_panels center the inner one --> -	<layout_panel -		width="0" -		layout="topleft" -		user_resize="false" /> -	<panel -		name="media_progress_indicator" -		height="20" -		layout="topleft" -		left="0"  		top="0" -		auto_resize="false" -		user_resize="false" -		min_width="100" -		width="200"> -	  <progress_bar -		  name="media_progress_bar" -		  color_bar="1 1 1 0.96" -		  follows="left|right|top" -		  top="5" -		  height="8" -		  layout="topleft" -		  left="0" -		  tool_tip="Media is Loading"/> -	</panel> -	<layout_panel  		width="0"  		layout="topleft"  		user_resize="false" />    </layout_stack> +  <panel +	  name="media_region" +	  height="100" +	  follows="left|right|top|bottom" +	  layout="topleft" +	  mouse_opaque="false" +	  top="30" />  </panel> | 
