diff options
| author | Rick Pasetto <rick@lindenlab.com> | 2010-02-09 09:49:57 -0800 | 
|---|---|---|
| committer | Rick Pasetto <rick@lindenlab.com> | 2010-02-09 09:49:57 -0800 | 
| commit | 8fdb199707979916d4d3c23cd19fec9fed411aba (patch) | |
| tree | 2113aae65de6635ff5a6189ae908186b398c61e8 | |
| parent | c9b27bec33d601330afe854d0322d22fce9da76a (diff) | |
| parent | 67afc668648f8c9fe9e39a9dbe280a15b60d75a4 (diff) | |
Automated merge with ssh://rick@hg.lindenlab.com/viewer/viewer-2-0
| -rw-r--r-- | indra/llui/lldockcontrol.cpp | 41 | ||||
| -rw-r--r-- | indra/llui/lldockcontrol.h | 5 | ||||
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 33 | ||||
| -rw-r--r-- | indra/newview/llstatusbar.cpp | 72 | ||||
| -rw-r--r-- | indra/newview/llviewermedia.cpp | 148 | ||||
| -rw-r--r-- | indra/newview/llviewermedia.h | 33 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_status_bar.xml | 23 | 
7 files changed, 299 insertions, 56 deletions
| diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp index d836a5f4cd..f91c07184d 100644 --- a/indra/llui/lldockcontrol.cpp +++ b/indra/llui/lldockcontrol.cpp @@ -162,7 +162,9 @@ bool LLDockControl::isDockVisible()  			{  			case LEFT: // to keep compiler happy  				break; +			case BOTTOM:  			case TOP: +			{  				// check is dock inside parent rect  				LLRect dockParentRect =  						mDockWidget->getParent()->calcScreenRect(); @@ -173,6 +175,9 @@ bool LLDockControl::isDockVisible()  				}  				break;  			} +			default: +				break; +			}  		}  	} @@ -255,6 +260,42 @@ void LLDockControl::moveDockable()  		mDockTongueY = dockRect.mTop;  		break; +	case BOTTOM: +		x = dockRect.getCenterX() - dockableRect.getWidth() / 2; +		y = dockRect.mBottom; +		// unique docking used with dock tongue, so add tongue height o the Y coordinate +		if (use_tongue) +		{ +			y -= mDockTongue->getHeight(); +		} + +		// check is dockable inside root view rect +		if (x < rootRect.mLeft) +		{ +			x = rootRect.mLeft; +		} +		if (x + dockableRect.getWidth() > rootRect.mRight) +		{ +			x = rootRect.mRight - dockableRect.getWidth(); +		} + +		// calculate dock tongue position +		dockParentRect = mDockWidget->getParent()->calcScreenRect(); +		if (dockRect.getCenterX() < dockParentRect.mLeft) +		{ +			mDockTongueX = dockParentRect.mLeft - mDockTongue->getWidth() / 2; +		} +		else if (dockRect.getCenterX() > dockParentRect.mRight) +		{ +			mDockTongueX = dockParentRect.mRight - mDockTongue->getWidth() / 2;; +		} +		else +		{ +			mDockTongueX = dockRect.getCenterX() - mDockTongue->getWidth() / 2; +		} +		mDockTongueY = dockRect.mTop + mDockTongue->getHeight(); + +		break;  	}  	// move dockable diff --git a/indra/llui/lldockcontrol.h b/indra/llui/lldockcontrol.h index 550955c4c5..a5caf68001 100644 --- a/indra/llui/lldockcontrol.h +++ b/indra/llui/lldockcontrol.h @@ -47,8 +47,9 @@ class LLDockControl  public:  	enum DocAt  	{ -		TOP -		,LEFT +		TOP, +		LEFT, +		BOTTOM  	};  public: diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index db4e0b5afd..40ac49597d 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -4578,6 +4578,39 @@      <key>Value</key>      <integer>0</integer>    </map> +  <key>MediaShowOnOthers</key> +  <map> +    <key>Comment</key> +    <string>Whether or not to show media on other avatars</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>1</integer> +  </map> +  <key>MediaShowOutsideParcel</key> +  <map> +    <key>Comment</key> +    <string>Whether or not to show media from outside the current parcel</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>0</integer> +  </map> +  <key>MediaShowWithinParcel</key> +  <map> +    <key>Comment</key> +    <string>Whether or not to show media within the current parcel</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>1</integer> +  </map>    <key>MemoryLogFrequency</key>          <map>          <key>Comment</key> diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index bff32af228..a2648e4c3a 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -130,7 +130,6 @@ LLStatusBar::LLStatusBar(const LLRect& rect)  	// status bar can possible overlay menus?  	setMouseOpaque(FALSE); -	setIsChrome(TRUE);  	// size of day of the weeks and year  	sDays.reserve(7); @@ -140,9 +139,39 @@ LLStatusBar::LLStatusBar(const LLRect& rect)  	mHealthTimer = new LLFrameTimer();  	LLUICtrlFactory::getInstance()->buildPanel(this,"panel_status_bar.xml"); +} -	// status bar can never get a tab -	setFocusRoot(FALSE); +LLStatusBar::~LLStatusBar() +{ +	delete mBalanceTimer; +	mBalanceTimer = NULL; + +	delete mHealthTimer; +	mHealthTimer = NULL; + +	// LLView destructor cleans up children +} + +//----------------------------------------------------------------------- +// Overrides +//----------------------------------------------------------------------- + +// virtual +void LLStatusBar::draw() +{ +	refresh(); +	LLPanel::draw(); +} + +BOOL LLStatusBar::handleRightMouseDown(S32 x, S32 y, MASK mask) +{ +	show_navbar_context_menu(this,x,y); +	return TRUE; +} + +BOOL LLStatusBar::postBuild() +{ +	gMenuBarView->setRightMouseDownCallback(boost::bind(&show_navbar_context_menu, _1, _2, _3));  	// build date necessary data (must do after panel built)  	setupDate(); @@ -158,7 +187,9 @@ LLStatusBar::LLStatusBar(const LLRect& rect)  	mBtnVolume = getChild<LLButton>( "volume_btn" );  	mBtnVolume->setClickedCallback( onClickVolume, this );  	mBtnVolume->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterVolume, this)); -	mBtnVolume->setIsChrome(TRUE); + +	LLButton* media_toggle = getChild<LLButton>("media_toggle_btn"); +	media_toggle->setMouseEnterCallback(boost::bind(&LLFloaterReg::showInstance, "nearby_media", LLSD(), true));  	gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2)); @@ -218,39 +249,6 @@ LLStatusBar::LLStatusBar(const LLRect& rect)  	mPanelVolumePulldown->setShape(volume_pulldown_rect);  	mPanelVolumePulldown->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT);  	mPanelVolumePulldown->setVisible(FALSE); -} - -LLStatusBar::~LLStatusBar() -{ -	delete mBalanceTimer; -	mBalanceTimer = NULL; - -	delete mHealthTimer; -	mHealthTimer = NULL; - -	// LLView destructor cleans up children -} - -//----------------------------------------------------------------------- -// Overrides -//----------------------------------------------------------------------- - -// virtual -void LLStatusBar::draw() -{ -	refresh(); -	LLPanel::draw(); -} - -BOOL LLStatusBar::handleRightMouseDown(S32 x, S32 y, MASK mask) -{ -	show_navbar_context_menu(this,x,y); -	return TRUE; -} - -BOOL LLStatusBar::postBuild() -{ -	gMenuBarView->setRightMouseDownCallback(boost::bind(&show_navbar_context_menu, _1, _2, _3));  	return TRUE;  } diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 0e133f8729..e77106bb2c 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -50,6 +50,9 @@  #include "llcallbacklist.h"  #include "llparcel.h"  #include "llaudioengine.h"  // for gAudiop +#include "llvoavatar.h" +#include "llvoavatarself.h" +#include "llviewerregion.h"  #include "llevent.h"		// LLSimpleListener  #include "llnotificationsutil.h" @@ -63,6 +66,10 @@  #include <boost/signals2.hpp>  /*static*/ const char* LLViewerMedia::AUTO_PLAY_MEDIA_SETTING = "ParcelMediaAutoPlayEnable"; +/*static*/ const char* LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING = "MediaShowOnOthers"; +/*static*/ const char* LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING = "MediaShowWithinParcel"; +/*static*/ const char* LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING = "MediaShowOutsideParcel"; +  // Move this to its own file. @@ -366,8 +373,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s  			// The current media URL is not empty.  			// If (the media was already loaded OR the media was set to autoplay) AND this update didn't come from this agent,  			// do a navigate. -			bool auto_play = (media_impl->mMediaAutoPlay && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING)); -			 +			bool auto_play = media_impl->isAutoPlayable();			  			if((was_loaded || auto_play) && !update_from_self)  			{  				needs_navigate = url_changed; @@ -391,7 +397,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s  		media_impl->mMediaAutoPlay = media_entry->getAutoPlay();  		media_impl->mMediaEntryURL = media_entry->getCurrentURL(); -		if(media_impl->mMediaAutoPlay && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING)) +		if(media_impl->isAutoPlayable())  		{  			needs_navigate = true;  		} @@ -818,7 +824,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg)  			impl_count_total++;  		} -		 +  		// Overrides if the window is minimized or we lost focus (taking care  		// not to accidentally "raise" the priority either)  		if (!gViewerWindow->getActive() /* viewer window minimized? */  @@ -840,7 +846,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg)  				new_priority = LLPluginClassMedia::PRIORITY_UNLOADED;  			}  		} -		 +					  		pimpl->setPriority(new_priority);  		if(pimpl->getUsedInUI()) @@ -907,6 +913,8 @@ void LLViewerMedia::cleanupClass()  	gIdleCallbacks.deleteFunction(LLViewerMedia::updateMedia, NULL);  } +		// XXX TODO: what to do about other AUTO_PLAY settings? +		// XXX TODO: what to do about other AUTO_PLAY settings?  //////////////////////////////////////////////////////////////////////////////////////////  // LLViewerMediaImpl  ////////////////////////////////////////////////////////////////////////////////////////// @@ -2057,6 +2065,21 @@ void LLViewerMediaImpl::scaleMouse(S32 *mouse_x, S32 *mouse_y)  #endif  } + + +////////////////////////////////////////////////////////////////////////////////////////// +bool LLViewerMediaImpl::isMediaTimeBased() +{ +	bool result = false; +	 +	if(mMediaSource) +	{ +		result = mMediaSource->pluginSupportsMediaTime(); +	} +	 +	return result; +} +  //////////////////////////////////////////////////////////////////////////////////////////  bool LLViewerMediaImpl::isMediaPlaying()  { @@ -2118,7 +2141,7 @@ void LLViewerMediaImpl::setDisabled(bool disabled)  		else  		{  			// We just (re)enabled this media.  Do a navigate if auto-play is in order. -			if(mMediaAutoPlay && gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING)) +			if(isAutoPlayable())  			{  				navigateTo(mMediaEntryURL, "", true, true);  			} @@ -2145,6 +2168,12 @@ bool LLViewerMediaImpl::isForcedUnloaded() const  		}  	} +	// If this media's class is not supposed to be shown, unload +	if (!shouldShowBasedOnClass()) +	{ +		return true; +	} +	  	return false;  } @@ -2630,3 +2659,110 @@ void LLViewerMediaImpl::setTextureID(LLUUID id)  	}  } +////////////////////////////////////////////////////////////////////////////////////////// +// +bool LLViewerMediaImpl::isAutoPlayable() const +{ +	return (mMediaAutoPlay && gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING)); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// +bool LLViewerMediaImpl::shouldShowBasedOnClass() const +{ +	// If this is parcel media or in the UI, return true always +	if (getUsedInUI() || isParcelMedia()) return true; +	 +	bool attached_to_another_avatar = isAttachedToAnotherAvatar(); +	bool inside_parcel = isInAgentParcel(); +	 +	//	llinfos << " hasFocus = " << hasFocus() << +	//	" others = " << (attached_to_another_avatar && gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING)) << +	//	" within = " << (inside_parcel && gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING)) << +	//	" outside = " << (!inside_parcel && gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING)) << llendl; +	 +	// If it has focus, we should show it +	if (hasFocus()) +		return true; +	 +	// If it is attached to an avatar and the pref is off, we shouldn't show it +	if (attached_to_another_avatar) +		return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING); +	 +	if (inside_parcel) +		return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING); +	else  +		return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// +bool LLViewerMediaImpl::isAttachedToAnotherAvatar() const +{ +	bool result = false; +	 +	std::list< LLVOVolume* >::const_iterator iter = mObjectList.begin(); +	std::list< LLVOVolume* >::const_iterator end = mObjectList.end(); +	for ( ; iter != end; iter++) +	{ +		if (isObjectAttachedToAnotherAvatar(*iter)) +		{ +			result = true; +			break; +		} +	} +	return result; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// +//static +bool LLViewerMediaImpl::isObjectAttachedToAnotherAvatar(LLVOVolume *obj) +{ +	bool result = false; +	LLXform *xform = obj; +	// Walk up parent chain +	while (NULL != xform) +	{ +		LLViewerObject *object = dynamic_cast<LLViewerObject*> (xform); +		if (NULL != object) +		{ +			LLVOAvatar *avatar = object->asAvatar(); +			if (NULL != avatar && avatar != gAgent.getAvatarObject()) +			{ +				result = true; +				break; +			} +		} +		xform = xform->getParent(); +	} +	return result; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// +bool LLViewerMediaImpl::isInAgentParcel() const +{ +	bool result = false; +	 +	std::list< LLVOVolume* >::const_iterator iter = mObjectList.begin(); +	std::list< LLVOVolume* >::const_iterator end = mObjectList.end(); +	for ( ; iter != end; iter++) +	{ +		LLVOVolume *object = *iter; +		if (LLViewerMediaImpl::isObjectInAgentParcel(object)) +		{ +			result = true; +			break; +		} +	} +	return result; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// +// static +bool LLViewerMediaImpl::isObjectInAgentParcel(LLVOVolume *obj) +{ +	return (LLViewerParcelMgr::getInstance()->inAgentParcel(obj->getPositionGlobal())); +} diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index daad70f14f..b6aaca8cfa 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -48,7 +48,7 @@ class LLViewerMediaImpl;  class LLUUID;  class LLViewerMediaTexture;  class LLMediaEntry; -class LLVOVolume ; +class LLVOVolume;  class LLMimeDiscoveryResponder;  typedef LLPointer<LLViewerMediaImpl> viewer_media_t; @@ -76,7 +76,10 @@ class LLViewerMedia  	public:  		// String to get/set media autoplay in gSavedSettings -		static const char *AUTO_PLAY_MEDIA_SETTING; +		static const char* AUTO_PLAY_MEDIA_SETTING; +		static const char* SHOW_MEDIA_ON_OTHERS_SETTING; +		static const char* SHOW_MEDIA_WITHIN_PARCEL_SETTING; +		static const char* SHOW_MEDIA_OUTSIDE_PARCEL_SETTING;  		typedef std::vector<LLViewerMediaImpl*> impl_list; @@ -199,14 +202,16 @@ public:  	void updateImagesMediaStreams();  	LLUUID getMediaTextureID() const; -	void suspendUpdates(bool suspend) { mSuspendUpdates = suspend; }; +	void suspendUpdates(bool suspend) { mSuspendUpdates = suspend; }  	void setVisible(bool visible); -	bool getVisible() const { return mVisible; }; +	bool getVisible() const { return mVisible; } +	bool isVisible() const { return mVisible; } +	bool isMediaTimeBased();  	bool isMediaPlaying();  	bool isMediaPaused();  	bool hasMedia() const; -	bool isMediaFailed() const { return mMediaSourceFailed; }; +	bool isMediaFailed() const { return mMediaSourceFailed; }  	void setMediaFailed(bool val) { mMediaSourceFailed = val; }  	void resetPreviousMediaState(); @@ -222,10 +227,10 @@ public:  	// returns true if this instance could be playable based on autoplay setting, current load state, etc.  	bool isPlayable() const; -	void setIsParcelMedia(bool is_parcel_media) { mIsParcelMedia = is_parcel_media; }; -	bool isParcelMedia() const { return mIsParcelMedia; }; +	void setIsParcelMedia(bool is_parcel_media) { mIsParcelMedia = is_parcel_media; } +	bool isParcelMedia() const { return mIsParcelMedia; } -	ECursorType getLastSetCursor() { return mLastSetCursor; }; +	ECursorType getLastSetCursor() { return mLastSetCursor; }  	// utility function to create a ready-to-use media instance from a desired media type.  	static LLPluginClassMedia* newSourceFromMediaType(std::string media_type, LLPluginClassMediaOwner *owner /* may be NULL */, S32 default_width, S32 default_height); @@ -326,6 +331,18 @@ public:  	void cancelMimeTypeProbe(); +	// Is this media attached to an avatar *not* self +	bool isAttachedToAnotherAvatar() const; +	 +	// Is this media in the agent's parcel? +	bool isInAgentParcel() const; + +private: +	bool isAutoPlayable() const; +	bool shouldShowBasedOnClass() const; +	static bool isObjectAttachedToAnotherAvatar(LLVOVolume *obj); +	static bool isObjectInAgentParcel(LLVOVolume *obj); +	  private:  	// a single media url with some data and an impl.  	LLPluginClassMedia* mMediaSource; diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 5754f67045..77eb9f2a75 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -3,6 +3,7 @@   background_opaque="true"   background_visible="true"   bg_opaque_color="MouseGray" + chrome="true"    follows="top|right"   height="19"   layout="topleft" @@ -10,6 +11,7 @@   mouse_opaque="false"   name="status"   top="19" + tab_stop="false"    width="1000">      <panel.string       name="StatBarDaysOfWeek"> @@ -73,7 +75,7 @@       pad_bottom="2"       tool_tip="Click to buy more L$"       top="2" -     width="71" /> +     width="45" />      <text       type="string"       font="SansSerifSmall" @@ -86,17 +88,32 @@       left_pad="0"       name="TimeText"       tool_tip="Current time (Pacific)" -     width="89"> +     width="80">          24:00 AM PST      </text>      <button       follows="right|top"       height="15" +     image_selected="button_anim_play.tga" +     image_unselected="button_anim_pause.tga" +     image_pressed="button_anim_pause_selected.tga" +     image_pressed_selected="button_anim_play_selected.tga" +     is_toggle="true" +     left_pad="15" +     top="2" +     name="media_toggle_btn" +     tool_tip="Click to toggle media" +     width="16" > +    </button> + +    <button +     follows="right|top" +     height="15"       image_selected="AudioMute_Off"       image_pressed="Audio_Press"       image_unselected="Audio_Off"       is_toggle="true" -     left_pad="18" +     left_pad="5"       top="2"       name="volume_btn"       tool_tip="Global Volume Control" | 
