diff options
180 files changed, 3739 insertions, 1930 deletions
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index db5495091e..b159092592 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -35,13 +35,13 @@ if (WINDOWS)    # Don't build DLLs.    set(BUILD_SHARED_LIBS OFF) -  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd" +  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /MP"        CACHE STRING "C++ compiler debug options" FORCE)    set(CMAKE_CXX_FLAGS_RELWITHDEBINFO  -      "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD" +      "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD /MP"        CACHE STRING "C++ compiler release-with-debug options" FORCE)    set(CMAKE_CXX_FLAGS_RELEASE -      "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD" +      "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD /MP"        CACHE STRING "C++ compiler release options" FORCE)    set(CMAKE_CXX_STANDARD_LIBRARIES "") diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp index e68672d46f..528a7bb4a5 100644 --- a/indra/llcharacter/llcharacter.cpp +++ b/indra/llcharacter/llcharacter.cpp @@ -273,13 +273,13 @@ void LLCharacter::removeAnimationData(std::string name)  //-----------------------------------------------------------------------------  // setVisualParamWeight()  //----------------------------------------------------------------------------- -BOOL LLCharacter::setVisualParamWeight(LLVisualParam* which_param, F32 weight, BOOL set_by_user) +BOOL LLCharacter::setVisualParamWeight(LLVisualParam* which_param, F32 weight, BOOL upload_bake)  {  	S32 index = which_param->getID();  	visual_param_index_map_t::iterator index_iter = mVisualParamIndexMap.find(index);  	if (index_iter != mVisualParamIndexMap.end())  	{ -		index_iter->second->setWeight(weight, set_by_user); +		index_iter->second->setWeight(weight, upload_bake);  		return TRUE;  	}  	return FALSE; @@ -288,7 +288,7 @@ BOOL LLCharacter::setVisualParamWeight(LLVisualParam* which_param, F32 weight, B  //-----------------------------------------------------------------------------  // setVisualParamWeight()  //----------------------------------------------------------------------------- -BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user) +BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake)  {  	std::string tname(param_name);  	LLStringUtil::toLower(tname); @@ -296,7 +296,7 @@ BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL  	visual_param_name_map_t::iterator name_iter = mVisualParamNameMap.find(tableptr);  	if (name_iter != mVisualParamNameMap.end())  	{ -		name_iter->second->setWeight(weight, set_by_user); +		name_iter->second->setWeight(weight, upload_bake);  		return TRUE;  	}  	llwarns << "LLCharacter::setVisualParamWeight() Invalid visual parameter: " << param_name << llendl; @@ -306,12 +306,12 @@ BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL  //-----------------------------------------------------------------------------  // setVisualParamWeight()  //----------------------------------------------------------------------------- -BOOL LLCharacter::setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user) +BOOL LLCharacter::setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake)  {  	visual_param_index_map_t::iterator index_iter = mVisualParamIndexMap.find(index);  	if (index_iter != mVisualParamIndexMap.end())  	{ -		index_iter->second->setWeight(weight, set_by_user); +		index_iter->second->setWeight(weight, upload_bake);  		return TRUE;  	}  	llwarns << "LLCharacter::setVisualParamWeight() Invalid visual parameter index: " << index << llendl; diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h index cb44a32e8a..27e2a51c62 100644 --- a/indra/llcharacter/llcharacter.h +++ b/indra/llcharacter/llcharacter.h @@ -203,9 +203,9 @@ public:  	void addVisualParam(LLVisualParam *param);  	void addSharedVisualParam(LLVisualParam *param); -	virtual BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL set_by_user = FALSE ); -	virtual BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user = FALSE ); -	virtual BOOL setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user = FALSE ); +	virtual BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE ); +	virtual BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake = FALSE ); +	virtual BOOL setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake = FALSE );  	// get visual param weight by param or name  	F32 getVisualParamWeight(LLVisualParam *distortion); diff --git a/indra/llcharacter/llvisualparam.cpp b/indra/llcharacter/llvisualparam.cpp index 6232c7588b..297322fe58 100644 --- a/indra/llcharacter/llvisualparam.cpp +++ b/indra/llcharacter/llvisualparam.cpp @@ -225,7 +225,7 @@ BOOL LLVisualParam::parseData(LLXmlTreeNode *node)  //-----------------------------------------------------------------------------  // setWeight()  //----------------------------------------------------------------------------- -void LLVisualParam::setWeight(F32 weight, BOOL set_by_user) +void LLVisualParam::setWeight(F32 weight, BOOL upload_bake)  {  	if (mIsAnimating)  	{ @@ -243,19 +243,19 @@ void LLVisualParam::setWeight(F32 weight, BOOL set_by_user)  	if (mNext)  	{ -		mNext->setWeight(weight, set_by_user); +		mNext->setWeight(weight, upload_bake);  	}  }  //-----------------------------------------------------------------------------  // setAnimationTarget()  //----------------------------------------------------------------------------- -void LLVisualParam::setAnimationTarget(F32 target_value, BOOL set_by_user) +void LLVisualParam::setAnimationTarget(F32 target_value, BOOL upload_bake)  {  	// don't animate dummy parameters  	if (mIsDummy)  	{ -		setWeight(target_value, set_by_user); +		setWeight(target_value, upload_bake);  		return;  	} @@ -274,7 +274,7 @@ void LLVisualParam::setAnimationTarget(F32 target_value, BOOL set_by_user)  	if (mNext)  	{ -		mNext->setAnimationTarget(target_value, set_by_user); +		mNext->setAnimationTarget(target_value, upload_bake);  	}  } @@ -291,24 +291,24 @@ void LLVisualParam::setNextParam( LLVisualParam *next )  //-----------------------------------------------------------------------------  // animate()  //----------------------------------------------------------------------------- -void LLVisualParam::animate( F32 delta, BOOL set_by_user ) +void LLVisualParam::animate( F32 delta, BOOL upload_bake )  {  	if (mIsAnimating)  	{  		F32 new_weight = ((mTargetWeight - mCurWeight) * delta) + mCurWeight; -		setWeight(new_weight, set_by_user); +		setWeight(new_weight, upload_bake);  	}  }  //-----------------------------------------------------------------------------  // stopAnimating()  //----------------------------------------------------------------------------- -void LLVisualParam::stopAnimating(BOOL set_by_user) +void LLVisualParam::stopAnimating(BOOL upload_bake)  {   	if (mIsAnimating && getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)  	{  		mIsAnimating = FALSE;  -		setWeight(mTargetWeight, set_by_user); +		setWeight(mTargetWeight, upload_bake);  	}  } diff --git a/indra/llcharacter/llvisualparam.h b/indra/llcharacter/llvisualparam.h index eec56d7844..12b45e6ebe 100644 --- a/indra/llcharacter/llvisualparam.h +++ b/indra/llcharacter/llvisualparam.h @@ -113,10 +113,10 @@ public:  	//virtual BOOL			parseData( LLXmlTreeNode *node ) = 0;  	virtual void			apply( ESex avatar_sex ) = 0;  	//  Default functions -	virtual void			setWeight(F32 weight, BOOL set_by_user); -	virtual void			setAnimationTarget( F32 target_value, BOOL set_by_user ); -	virtual void			animate(F32 delta, BOOL set_by_user); -	virtual void			stopAnimating(BOOL set_by_user); +	virtual void			setWeight(F32 weight, BOOL upload_bake); +	virtual void			setAnimationTarget( F32 target_value, BOOL upload_bake ); +	virtual void			animate(F32 delta, BOOL upload_bake); +	virtual void			stopAnimating(BOOL upload_bake);  	virtual BOOL			linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params);  	virtual void			resetDrivenParams(); diff --git a/indra/llcommon/lleventapi.h b/indra/llcommon/lleventapi.h index b45be6802b..96d1b03be8 100644 --- a/indra/llcommon/lleventapi.h +++ b/indra/llcommon/lleventapi.h @@ -23,7 +23,7 @@   * from LLDispatchListener -- it also gives us event API introspection.   * Deriving from LLInstanceTracker lets us enumerate instances.   */ -class LLEventAPI: public LLDispatchListener, +class LL_COMMON_API LLEventAPI: public LLDispatchListener,                    public LLInstanceTracker<LLEventAPI, std::string>  {      typedef LLDispatchListener lbase; diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h index 48244480b1..bb3301df9f 100644 --- a/indra/llcommon/llpreprocessor.h +++ b/indra/llcommon/llpreprocessor.h @@ -122,6 +122,7 @@  #pragma warning( 3      :  4264 )	// "'virtual_function' : no override available for virtual member function from base 'class'; function is hidden"  #pragma warning( 3       : 4265 )	// "class has virtual functions, but destructor is not virtual"  #pragma warning( 3      :  4266 )	// 'function' : no override available for virtual member function from base 'type'; function is hidden +#pragma warning (disable : 4180)	// qualifier applied to function type has no meaning; ignored  #pragma warning( disable : 4284 )	// silly MS warning deep inside their <map> include file  #pragma warning( disable : 4503 )	// 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation.  #pragma warning( disable : 4800 )	// 'BOOL' : forcing value to bool 'true' or 'false' (performance warning) diff --git a/indra/llcommon/tests/lltreeiterators_test.cpp b/indra/llcommon/tests/lltreeiterators_test.cpp index d6d9f68110..31c70b4daa 100644 --- a/indra/llcommon/tests/lltreeiterators_test.cpp +++ b/indra/llcommon/tests/lltreeiterators_test.cpp @@ -35,9 +35,6 @@  // Precompiled header  #include "linden_common.h" -#if LL_WINDOWS -#pragma warning (disable : 4180) // qualifier applied to function type has no meaning; ignored -#endif  // STL headers  // std headers diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index d9520b3bf6..f0df3bcf90 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -61,8 +61,11 @@ BOOL LLRenderTarget::sUseFBO = FALSE;  LLRenderTarget::LLRenderTarget() :  	mResX(0),  	mResY(0), +	mViewportWidth(0), +	mViewportHeight(0),  	mTex(0),  	mFBO(0), +	mColorFmt(0),  	mDepth(0),  	mStencil(0),  	mUseDepth(FALSE), @@ -86,13 +89,31 @@ void LLRenderTarget::setSampleBuffer(LLMultisampleBuffer* buffer)  void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOOL stencil, LLTexUnit::eTextureType usage, BOOL use_fbo)  { +	// only reallocate if something changed +	if (mResX == resx +		&& mResY == resy +		&& mUseDepth == depth +		&& mStencil == stencil +		&& mUsage == usage +		&& (mFBO != 0) == ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject) +		&& mColorFmt == color_fmt) +	{ +		// nothing to do +		return; +	} +		  	stop_glerror();  	mResX = resx;  	mResY = resy; +	// default viewport to entire texture +	mViewportWidth = mResX; +	mViewportHeight = mResY;  	mStencil = stencil;  	mUsage = usage;  	mUseDepth = depth; +	mFBO = 0; +	mColorFmt = color_fmt;  	release(); @@ -312,7 +333,7 @@ void LLRenderTarget::bindTarget()  		}  	} -	glViewport(0, 0, mResX, mResY); +	glViewport(0, 0, mViewportWidth, mViewportHeight);  	sBoundTarget = this;  } @@ -515,12 +536,18 @@ BOOL LLRenderTarget::isComplete() const  	return (!mTex.empty() || mDepth) ? TRUE : FALSE;  } +void LLRenderTarget::setViewport(U32 width, U32 height) +{ +	mViewportWidth = llmin(width, mResX); +	mViewportHeight = llmin(height, mResY); +} +  void LLRenderTarget::getViewport(S32* viewport)  {  	viewport[0] = 0;  	viewport[1] = 0; -	viewport[2] = mResX; -	viewport[3] = mResY; +	viewport[2] = mViewportWidth; +	viewport[3] = mViewportHeight;  }  //================================================== @@ -581,7 +608,7 @@ void LLMultisampleBuffer::bindTarget(LLRenderTarget* ref)  	check_framebuffer_status(); -	glViewport(0, 0, mResX, mResY); +	glViewport(0, 0, mViewportWidth, mViewportHeight);  	sBoundTarget = this;  } @@ -593,13 +620,30 @@ void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth  void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOOL stencil,  LLTexUnit::eTextureType usage, BOOL use_fbo, U32 samples )  { +	if (mResX == resx +		&& mResY == resy +		&& mUseDepth == depth +		&& mStencil == stencil +		&& mUsage == usage +		&& (mFBO != 0) == ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject) +		&& mColorFmt == color_fmt +		&& mSamples == samples) +	{ +		// nothing to do +		return; +	} +  	stop_glerror();  	mResX = resx;  	mResY = resy; +	mViewportWidth = mResX; +	mViewportHeight = mResY;  	mUsage = usage;  	mUseDepth = depth;  	mStencil = stencil; +	mFBO = 0; +	mColorFmt = color_fmt;  	releaseSampleBuffer(); diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h index b7ebfc8f7f..125747424c 100644 --- a/indra/llrender/llrendertarget.h +++ b/indra/llrender/llrendertarget.h @@ -107,6 +107,9 @@ public:  	//uses scissor rect if in copy-to-texture mode  	void clear(U32 mask = 0xFFFFFFFF); +	// override default viewport to a smaller size +	void setViewport(U32 width, U32 height); +  	//get applied viewport  	void getViewport(S32* viewport); @@ -150,12 +153,16 @@ protected:  	friend class LLMultisampleBuffer;  	U32 mResX;  	U32 mResY; +	U32 mViewportWidth; +	U32 mViewportHeight;  	std::vector<U32> mTex;  	U32 mFBO; +	U32 mColorFmt;  	U32 mDepth;  	BOOL mStencil;  	BOOL mUseDepth;  	BOOL mRenderDepth; +  	LLTexUnit::eTextureType mUsage;  	U32 mSamples;  	LLMultisampleBuffer* mSampleBuffer; diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp index 35a854267a..045505af5b 100644 --- a/indra/llui/lldockcontrol.cpp +++ b/indra/llui/lldockcontrol.cpp @@ -256,7 +256,6 @@ void LLDockControl::on()  {  	 if (isDockVisible())  	{ -		mDockableFloater->setCanDrag(false);  		mEnabled = true;  		mRecalculateDocablePosition = true;  	} @@ -264,7 +263,6 @@ void LLDockControl::on()  void LLDockControl::off()  { -	mDockableFloater->setCanDrag(true);  	mEnabled = false;  } diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index f2cdad8854..2a0dcaf333 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -1888,41 +1888,50 @@ void LLFloaterView::reshapeFloater(S32 width, S32 height, BOOL called_from_paren  			// dependents use same follow flags as their "dependee"  			continue;  		} -		LLRect r = floaterp->getRect(); - -		// Compute absolute distance from each edge of screen -		S32 left_offset = llabs(r.mLeft - 0); -		S32 right_offset = llabs(old_width - r.mRight); - -		S32 top_offset = llabs(old_height - r.mTop); -		S32 bottom_offset = llabs(r.mBottom - 0);  		// Make if follow the edge it is closest to  		U32 follow_flags = 0x0; -		if (left_offset < right_offset) +		if (floaterp->isMinimized())  		{ -			follow_flags |= FOLLOWS_LEFT; +			follow_flags |= (FOLLOWS_LEFT | FOLLOWS_TOP);  		}  		else  		{ -			follow_flags |= FOLLOWS_RIGHT; -		} +			LLRect r = floaterp->getRect(); -		// "No vertical adjustment" usually means that the bottom of the view -		// has been pushed up or down.  Hence we want the floaters to follow -		// the top. -		if (!adjust_vertical) -		{ -			follow_flags |= FOLLOWS_TOP; -		} -		else if (top_offset < bottom_offset) -		{ -			follow_flags |= FOLLOWS_TOP; -		} -		else -		{ -			follow_flags |= FOLLOWS_BOTTOM; +			// Compute absolute distance from each edge of screen +			S32 left_offset = llabs(r.mLeft - 0); +			S32 right_offset = llabs(old_width - r.mRight); + +			S32 top_offset = llabs(old_height - r.mTop); +			S32 bottom_offset = llabs(r.mBottom - 0); + + +			if (left_offset < right_offset) +			{ +				follow_flags |= FOLLOWS_LEFT; +			} +			else +			{ +				follow_flags |= FOLLOWS_RIGHT; +			} + +			// "No vertical adjustment" usually means that the bottom of the view +			// has been pushed up or down.  Hence we want the floaters to follow +			// the top. +			if (!adjust_vertical) +			{ +				follow_flags |= FOLLOWS_TOP; +			} +			else if (top_offset < bottom_offset) +			{ +				follow_flags |= FOLLOWS_TOP; +			} +			else +			{ +				follow_flags |= FOLLOWS_BOTTOM; +			}  		}  		floaterp->setFollows(follow_flags); @@ -2172,16 +2181,16 @@ void LLFloaterView::getMinimizePosition(S32 *left, S32 *bottom)  	const LLFloater::Params& default_params = LLFloater::getDefaultParams();  	S32 floater_header_size = default_params.header_height;  	static LLUICachedControl<S32> minimized_width ("UIMinimizedWidth", 0); -	S32 col = 0;  	LLRect snap_rect_local = getLocalSnapRect(); -	for(S32 row = snap_rect_local.mBottom; -		row < snap_rect_local.getHeight() - floater_header_size; -		row += floater_header_size ) //loop rows -	{ -		for(col = snap_rect_local.mLeft; -			col < snap_rect_local.getWidth() - minimized_width; -			col += minimized_width) +	for(S32 col = snap_rect_local.mLeft; +		col < snap_rect_local.getWidth() - minimized_width; +		col += minimized_width) +	{	 +		for(S32 row = snap_rect_local.mTop - floater_header_size; +		row > floater_header_size; +		row -= floater_header_size ) //loop rows  		{ +  			bool foundGap = TRUE;  			for(child_list_const_iter_t child_it = getChildList()->begin();  				child_it != getChildList()->end(); diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index 07c0f3ce84..89c4656297 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -512,6 +512,8 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu  			// add children using dimensions from referenced xml for consistent layout  			setShape(params.rect);  			LLUICtrlFactory::createChildren(this, referenced_xml, child_registry_t::instance()); + +			setXMLFilename(xml_filename);  		}  		// ask LLUICtrlFactory for filename, since xml_filename might be empty diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp index a7c268758a..544352176a 100644 --- a/indra/llui/llscrolllistcell.cpp +++ b/indra/llui/llscrolllistcell.cpp @@ -71,7 +71,8 @@ LLScrollListCell* LLScrollListCell::create(const LLScrollListCell::Params& cell_  LLScrollListCell::LLScrollListCell(const LLScrollListCell::Params& p) -:	mWidth(p.width) +:	mWidth(p.width),  +	mToolTip(p.tool_tip)  {}  // virtual @@ -204,13 +205,28 @@ BOOL LLScrollListText::isText() const  	return TRUE;  } +// virtual +const std::string &LLScrollListText::getToolTip() const +{ +	// If base class has a tooltip, return that +	if (! LLScrollListCell::getToolTip().empty()) +		return LLScrollListCell::getToolTip(); +	 +	// ...otherwise, return the value itself as the tooltip +	return mText.getString(); +} + +// virtual  BOOL LLScrollListText::needsToolTip() const  { -	// show tooltips for truncated text +	// If base class has a tooltip, return that +	if (LLScrollListCell::needsToolTip()) +		return LLScrollListCell::needsToolTip(); +	 +	// ...otherwise, show tooltips for truncated text  	return mFont->getWidth(mText.getString()) > getWidth();  } -  //virtual   BOOL LLScrollListText::getVisible() const  { diff --git a/indra/llui/llscrolllistcell.h b/indra/llui/llscrolllistcell.h index 758623f121..5fecf5aade 100644 --- a/indra/llui/llscrolllistcell.h +++ b/indra/llui/llscrolllistcell.h @@ -66,6 +66,7 @@ public:  		Optional<void*>				userdata;  		Optional<LLSD>				value; +		Optional<std::string>		tool_tip;  		Optional<const LLFontGL*>	font;  		Optional<LLColor4>			font_color; @@ -80,6 +81,7 @@ public:  			enabled("enabled", true),  			visible("visible", true),  			value("value"), +			tool_tip("tool_tip", ""),  			font("font", LLFontGL::getFontSansSerifSmall()),  			font_color("font_color", LLColor4::black),  			color("color", LLColor4::white), @@ -101,11 +103,13 @@ public:  	virtual S32				getHeight() const { return 0; }  	virtual const LLSD		getValue() const;  	virtual void			setValue(const LLSD& value) { } +	virtual const std::string &getToolTip() const { return mToolTip; } +	virtual void			setToolTip(const std::string &str) { mToolTip = str; }  	virtual BOOL			getVisible() const { return TRUE; }  	virtual void			setWidth(S32 width) { mWidth = width; }  	virtual void			highlightText(S32 offset, S32 num_chars) {}  	virtual BOOL			isText() const { return FALSE; } -	virtual BOOL			needsToolTip() const { return FALSE; } +	virtual BOOL			needsToolTip() const { return ! mToolTip.empty(); }  	virtual void			setColor(const LLColor4&) {}  	virtual void			onCommit() {}; @@ -114,6 +118,7 @@ public:  private:  	S32 mWidth; +	std::string mToolTip;  };  class LLScrollListSpacer : public LLScrollListCell @@ -143,6 +148,7 @@ public:  	/*virtual*/ void	setColor(const LLColor4&);  	/*virtual*/ BOOL	isText() const; +	/*virtual*/ const std::string &	getToolTip() const;  	/*virtual*/ BOOL	needsToolTip() const;  	void			setText(const LLStringExplicit& text); diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 1c2c02e1cc..a53a30b501 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -1565,7 +1565,7 @@ BOOL LLScrollListCtrl::handleToolTip(S32 x, S32 y, MASK mask)  			// display tooltip exactly over original cell, in same font  			LLToolTipMgr::instance().show(LLToolTip::Params() -										.message(hit_cell->getValue().asString()) +										.message(hit_cell->getToolTip())  										.font(LLFontGL::getFontSansSerifSmall())  										.pos(LLCoordGL(sticky_rect.mLeft - 5, sticky_rect.mTop + 6))  										.delay_time(0.2f) diff --git a/indra/llui/llslider.cpp b/indra/llui/llslider.cpp index f86776384a..da2fc7c68b 100644 --- a/indra/llui/llslider.cpp +++ b/indra/llui/llslider.cpp @@ -47,14 +47,17 @@ static LLDefaultChildRegistry::Register<LLSlider> r1("slider_bar");  // have ambigious template lookup problem  LLSlider::Params::Params() -:	track_color("track_color"), +:	orientation ("orientation", std::string ("horizontal")), +	track_color("track_color"),  	thumb_outline_color("thumb_outline_color"),  	thumb_center_color("thumb_center_color"),  	thumb_image("thumb_image"),  	thumb_image_pressed("thumb_image_pressed"),  	thumb_image_disabled("thumb_image_disabled"), -	track_image("track_image"), -	track_highlight_image("track_highlight_image"), +	track_image_horizontal("track_image_horizontal"), +	track_image_vertical("track_image_vertical"), +	track_highlight_horizontal_image("track_highlight_horizontal_image"), +	track_highlight_vertical_image("track_highlight_vertical_image"),  	mouse_down_callback("mouse_down_callback"),  	mouse_up_callback("mouse_up_callback")  { @@ -64,14 +67,17 @@ LLSlider::Params::Params()  LLSlider::LLSlider(const LLSlider::Params& p)  :	LLF32UICtrl(p),  	mMouseOffset( 0 ), +	mOrientation ((p.orientation() == "horizontal") ? HORIZONTAL : VERTICAL),  	mTrackColor(p.track_color()),  	mThumbOutlineColor(p.thumb_outline_color()),  	mThumbCenterColor(p.thumb_center_color()),  	mThumbImage(p.thumb_image),  	mThumbImagePressed(p.thumb_image_pressed),  	mThumbImageDisabled(p.thumb_image_disabled), -	mTrackImage(p.track_image), -	mTrackHighlightImage(p.track_highlight_image) +	mTrackImageHorizontal(p.track_image_horizontal), +	mTrackImageVertical(p.track_image_vertical), +	mTrackHighlightHorizontalImage(p.track_highlight_horizontal_image), +	mTrackHighlightVerticalImage(p.track_highlight_vertical_image)  {      mViewModel->setValue(p.initial_value);  	updateThumbRect(); @@ -111,14 +117,29 @@ void LLSlider::updateThumbRect()  	S32 thumb_width = mThumbImage ? mThumbImage->getWidth() : DEFAULT_THUMB_SIZE;  	S32 thumb_height = mThumbImage ? mThumbImage->getHeight() : DEFAULT_THUMB_SIZE; -	S32 left_edge = (thumb_width / 2); -	S32 right_edge = getRect().getWidth() - (thumb_width / 2); - -	S32 x = left_edge + S32( t * (right_edge - left_edge) ); -	mThumbRect.mLeft = x - (thumb_width / 2); -	mThumbRect.mRight = mThumbRect.mLeft + thumb_width; -	mThumbRect.mBottom = getLocalRect().getCenterY() - (thumb_height / 2); -	mThumbRect.mTop = mThumbRect.mBottom + thumb_height; + +	if ( mOrientation == HORIZONTAL ) +	{ +		S32 left_edge = (thumb_width / 2); +		S32 right_edge = getRect().getWidth() - (thumb_width / 2); + +		S32 x = left_edge + S32( t * (right_edge - left_edge) ); +		mThumbRect.mLeft = x - (thumb_width / 2); +		mThumbRect.mRight = mThumbRect.mLeft + thumb_width; +		mThumbRect.mBottom = getLocalRect().getCenterY() - (thumb_height / 2); +		mThumbRect.mTop = mThumbRect.mBottom + thumb_height; +	} +	else +	{ +		S32 top_edge = (thumb_height / 2); +		S32 bottom_edge = getRect().getHeight() - (thumb_height / 2); + +		S32 y = top_edge + S32( t * (bottom_edge - top_edge) ); +		mThumbRect.mLeft = getLocalRect().getCenterX() - (thumb_width / 2); +		mThumbRect.mRight = mThumbRect.mLeft + thumb_width; +		mThumbRect.mBottom = y  - (thumb_height / 2); +		mThumbRect.mTop = mThumbRect.mBottom + thumb_height; +	}  } @@ -138,18 +159,32 @@ BOOL LLSlider::handleHover(S32 x, S32 y, MASK mask)  {  	if( hasMouseCapture() )  	{ -		S32 thumb_half_width = mThumbImage->getWidth()/2; -		S32 left_edge = thumb_half_width; -		S32 right_edge = getRect().getWidth() - (thumb_half_width); +		if ( mOrientation == HORIZONTAL ) +		{ +			S32 thumb_half_width = mThumbImage->getWidth()/2; +			S32 left_edge = thumb_half_width; +			S32 right_edge = getRect().getWidth() - (thumb_half_width); -		x += mMouseOffset; -		x = llclamp( x, left_edge, right_edge ); +			x += mMouseOffset; +			x = llclamp( x, left_edge, right_edge ); -		F32 t = F32(x - left_edge) / (right_edge - left_edge); -		setValueAndCommit(t * (mMaxValue - mMinValue) + mMinValue ); +			F32 t = F32(x - left_edge) / (right_edge - left_edge); +			setValueAndCommit(t * (mMaxValue - mMinValue) + mMinValue ); +		} +		else // mOrientation == VERTICAL +		{ +			S32 thumb_half_height = mThumbImage->getHeight()/2; +			S32 top_edge = thumb_half_height; +			S32 bottom_edge = getRect().getHeight() - (thumb_half_height); + +			y += mMouseOffset; +			y = llclamp(y, top_edge, bottom_edge); +			F32 t = F32(y - top_edge) / (bottom_edge - top_edge); +			setValueAndCommit(t * (mMaxValue - mMinValue) + mMinValue ); +		}  		getWindow()->setCursor(UI_CURSOR_ARROW); -		lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active)" << llendl;		 +		lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active)" << llendl;  	}  	else  	{ @@ -198,7 +233,9 @@ BOOL LLSlider::handleMouseDown(S32 x, S32 y, MASK mask)  		// Find the offset of the actual mouse location from the center of the thumb.  		if (mThumbRect.pointInRect(x,y))  		{ -			mMouseOffset = (mThumbRect.mLeft + mThumbImage->getWidth()/2) - x; +			mMouseOffset = (mOrientation == HORIZONTAL) +				? (mThumbRect.mLeft + mThumbImage->getWidth()/2) - x +				: (mThumbRect.mBottom + mThumbImage->getHeight()/2) - y;  		}  		else  		{ @@ -220,15 +257,12 @@ BOOL LLSlider::handleKeyHere(KEY key, MASK mask)  	BOOL handled = FALSE;  	switch(key)  	{ -	case KEY_UP:  	case KEY_DOWN: -		// eat up and down keys to be consistent -		handled = TRUE; -		break;  	case KEY_LEFT:  		setValueAndCommit(getValueF32() - getIncrement());  		handled = TRUE;  		break; +	case KEY_UP:  	case KEY_RIGHT:  		setValueAndCommit(getValueF32() + getIncrement());  		handled = TRUE; @@ -239,6 +273,17 @@ BOOL LLSlider::handleKeyHere(KEY key, MASK mask)  	return handled;  } +BOOL LLSlider::handleScrollWheel(S32 x, S32 y, S32 clicks) +{ +	if ( mOrientation == VERTICAL ) +	{ +		F32 new_val = getValueF32() - clicks * getIncrement(); +		setValueAndCommit(new_val); +		return TRUE; +	} +	return LLF32UICtrl::handleScrollWheel(x,y,clicks); +} +  void LLSlider::draw()  {  	F32 alpha = getDrawContext().mAlpha; @@ -252,13 +297,36 @@ void LLSlider::draw()  	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);  	// Track -	LLRect track_rect(mThumbImage->getWidth() / 2,  -						getLocalRect().getCenterY() + (mTrackImage->getHeight() / 2),  -						getRect().getWidth() - mThumbImage->getWidth() / 2,  -						getLocalRect().getCenterY() - (mTrackImage->getHeight() / 2) ); -	LLRect highlight_rect(track_rect.mLeft, track_rect.mTop, mThumbRect.getCenterX(), track_rect.mBottom); -	mTrackImage->draw(track_rect, LLColor4::white % alpha); -	mTrackHighlightImage->draw(highlight_rect, LLColor4::white % alpha); +	LLPointer<LLUIImage>& trackImage = ( mOrientation == HORIZONTAL ) +		? mTrackImageHorizontal +		: mTrackImageVertical; + +	LLPointer<LLUIImage>& trackHighlightImage = ( mOrientation == HORIZONTAL ) +		? mTrackHighlightHorizontalImage +		: mTrackHighlightVerticalImage; + +	LLRect track_rect; +	LLRect highlight_rect; + +	if ( mOrientation == HORIZONTAL ) +	{ +		track_rect.set(mThumbImage->getWidth() / 2, +					   getLocalRect().getCenterY() + (trackImage->getHeight() / 2),  +					   getRect().getWidth() - mThumbImage->getWidth() / 2, +					   getLocalRect().getCenterY() - (trackImage->getHeight() / 2) ); +		highlight_rect.set(track_rect.mLeft, track_rect.mTop, mThumbRect.getCenterX(), track_rect.mBottom); +	} +	else +	{ +		track_rect.set(getLocalRect().getCenterX() - (trackImage->getWidth() / 2), +					   getRect().getHeight(), +					   getLocalRect().getCenterX() + (trackImage->getWidth() / 2), +					   0); +		highlight_rect.set(track_rect.mLeft, track_rect.mTop, track_rect.mRight, track_rect.mBottom); +	} + +	trackImage->draw(track_rect, LLColor4::white % alpha); +	trackHighlightImage->draw(highlight_rect, LLColor4::white % alpha);  	// Thumb  	if (hasFocus()) diff --git a/indra/llui/llslider.h b/indra/llui/llslider.h index e2a94e4d8c..6ab0ed7922 100644 --- a/indra/llui/llslider.h +++ b/indra/llui/llslider.h @@ -39,8 +39,12 @@  class LLSlider : public LLF32UICtrl  {  public: +	enum ORIENTATION { HORIZONTAL, VERTICAL }; +  	struct Params : public LLInitParam::Block<Params, LLF32UICtrl::Params>  	{ +		Optional<std::string> orientation; +  		Optional<LLUIColor>	track_color,  							thumb_outline_color,  							thumb_center_color; @@ -48,8 +52,10 @@ public:  		Optional<LLUIImage*>	thumb_image,  								thumb_image_pressed,  								thumb_image_disabled, -								track_image, -								track_highlight_image; +								track_image_horizontal, +								track_image_vertical, +								track_highlight_horizontal_image, +								track_highlight_vertical_image;  		Optional<CommitCallbackParam>	mouse_down_callback,  										mouse_up_callback; @@ -77,6 +83,7 @@ public:  	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);  	virtual BOOL	handleMouseDown(S32 x, S32 y, MASK mask);  	virtual BOOL	handleKeyHere(KEY key, MASK mask); +	virtual BOOL	handleScrollWheel(S32 x, S32 y, S32 clicks);  	virtual void	draw();  private: @@ -90,10 +97,14 @@ private:  	LLPointer<LLUIImage>	mThumbImage;  	LLPointer<LLUIImage>	mThumbImagePressed;  	LLPointer<LLUIImage>	mThumbImageDisabled; -	LLPointer<LLUIImage>	mTrackImage; -	LLPointer<LLUIImage>	mTrackHighlightImage; +	LLPointer<LLUIImage>	mTrackImageHorizontal; +	LLPointer<LLUIImage>	mTrackImageVertical; +	LLPointer<LLUIImage>	mTrackHighlightHorizontalImage; +	LLPointer<LLUIImage>	mTrackHighlightVerticalImage; + +	const ORIENTATION	mOrientation; -	LLRect			mThumbRect; +	LLRect		mThumbRect;  	LLUIColor	mTrackColor;  	LLUIColor	mThumbOutlineColor;  	LLUIColor	mThumbCenterColor; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 8d36c9c616..7b1aaac35c 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -994,6 +994,12 @@ void LLTextBase::setColor( const LLColor4& c )  	mFgColor = c;  } +//virtual  +void LLTextBase::setReadOnlyColor(const LLColor4 &c) +{ +	mReadOnlyFgColor = c; +} +  //virtual  void LLTextBase::setValue(const LLSD& value )  { @@ -1445,7 +1451,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)  	}  } -void LLTextBase::setText(const LLStringExplicit &utf8str) +void LLTextBase::setText(const LLStringExplicit &utf8str ,const LLStyle::Params& input_params)  {  	// clear out the existing text and segments  	getViewModel()->setDisplay(LLWStringUtil::null); @@ -1460,7 +1466,7 @@ void LLTextBase::setText(const LLStringExplicit &utf8str)  	std::string text(utf8str);  	LLStringUtil::removeCRLF(text); -	appendText(text, false); +	appendText(text, false, input_params);  	onValueChange(0, getLength());  } @@ -2369,7 +2375,9 @@ bool LLNormalTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& widt  	height = mFontHeight;  	width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars); -	return num_chars >= 1 && text[mStart + num_chars - 1] == '\n'; +	// if last character is a newline, then return true, forcing line break +	llwchar last_char = text[mStart + first_char + num_chars - 1]; +	return num_chars >= 1 && last_char == '\n';  }  S32	LLNormalTextSegment::getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 8cae8fde22..70d78c77cd 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -118,6 +118,8 @@ public:  	// LLUICtrl interface  	/*virtual*/ BOOL		acceptsTextInput() const { return !mReadOnly; }  	/*virtual*/ void		setColor( const LLColor4& c ); +	virtual     void 		setReadOnlyColor(const LLColor4 &c); +  	/*virtual*/ void		setValue(const LLSD& value );  	/*virtual*/ LLTextViewModel* getViewModel() const; @@ -135,7 +137,7 @@ public:  	// Text accessors  	// TODO: add optional style parameter -	virtual void			setText(const LLStringExplicit &utf8str); // uses default style +	virtual void			setText(const LLStringExplicit &utf8str , const LLStyle::Params& input_params = LLStyle::Params()); // uses default style  	virtual std::string		getText() const;  	// wide-char versions diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp index 00f1d833a3..4c4123cf45 100644 --- a/indra/llui/lltextbox.cpp +++ b/indra/llui/lltextbox.cpp @@ -112,12 +112,12 @@ BOOL LLTextBox::handleHover(S32 x, S32 y, MASK mask)  	return handled;  } -void LLTextBox::setText(const LLStringExplicit& text) +void LLTextBox::setText(const LLStringExplicit& text , const LLStyle::Params& input_params )  {  	// does string argument insertion  	mText.assign(text); -	LLTextBase::setText(mText.getString()); +	LLTextBase::setText(mText.getString(), input_params );  }  void LLTextBox::setClickedCallback( boost::function<void (void*)> cb, void* userdata /*= NULL */ ) diff --git a/indra/llui/lltextbox.h b/indra/llui/lltextbox.h index 73f8a7c299..01b4bfa5ed 100644 --- a/indra/llui/lltextbox.h +++ b/indra/llui/lltextbox.h @@ -58,7 +58,7 @@ public:  	/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);  	/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); -	/*virtual*/ void setText( const LLStringExplicit& text ); +	/*virtual*/ void setText( const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params() );  	void			setRightAlign()							{ mHAlign = LLFontGL::RIGHT; }  	void			setHAlign( LLFontGL::HAlign align )		{ mHAlign = align; } diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index d136c6b49d..224f066968 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -311,12 +311,12 @@ LLTextEditor::~LLTextEditor()  // LLTextEditor  // Public methods -void LLTextEditor::setText(const LLStringExplicit &utf8str) +void LLTextEditor::setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params)  {  	blockUndo();  	deselect(); -	LLTextBase::setText(utf8str); +	LLTextBase::setText(utf8str, input_params);  	resetDirty();  } diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index 10fc94dedc..fb014b86bf 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -168,7 +168,7 @@ public:  	void			appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo);  	// Non-undoable -	void			setText(const LLStringExplicit &utf8str); +	void			setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params = LLStyle::Params());  	// Removes text from the end of document diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp index 984a534da6..bb85177811 100644 --- a/indra/llui/lltooltip.cpp +++ b/indra/llui/lltooltip.cpp @@ -172,7 +172,6 @@ LLToolTip::Params::Params()  LLToolTip::LLToolTip(const LLToolTip::Params& p)  :	LLPanel(p), -	mMaxWidth(p.max_width),  	mHasClickCallback(p.click_callback.isProvided()),  	mPadding(p.padding),  	mTextBox(NULL), @@ -181,11 +180,9 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)  	mHomePageButton(NULL)  {  	LLTextBox::Params params; -	params.initial_value = "tip_text";  	params.name = params.initial_value().asString();  	// bake textbox padding into initial rect  	params.rect = LLRect (mPadding, mPadding + 1, mPadding + 1, mPadding); -	params.follows.flags = FOLLOWS_ALL;  	params.h_pad = 0;  	params.v_pad = 0;  	params.mouse_opaque = false; @@ -210,7 +207,6 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)  		TOOLTIP_ICON_SIZE = (imagep ? imagep->getWidth() : 16);  		icon_rect.setOriginAndSize(mPadding, mPadding, TOOLTIP_ICON_SIZE, TOOLTIP_ICON_SIZE);  		icon_params.rect = icon_rect; -		//icon_params.follows.flags = FOLLOWS_LEFT | FOLLOWS_BOTTOM;  		icon_params.image_unselected(imagep);  		icon_params.image_selected(imagep); @@ -281,15 +277,30 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)  	}  } -void LLToolTip::setValue(const LLSD& value) +void LLToolTip::initFromParams(const LLToolTip::Params& p)  { +	LLPanel::initFromParams(p); + +	// do this *after* we've had our size set in LLPanel::initFromParams();  	const S32 REALLY_LARGE_HEIGHT = 10000; -	reshape(mMaxWidth, REALLY_LARGE_HEIGHT); +	mTextBox->reshape(p.max_width, REALLY_LARGE_HEIGHT); -	mTextBox->setValue(value); +	if (p.styled_message.isProvided()) +	{ +		for (LLInitParam::ParamIterator<LLToolTip::StyledText>::const_iterator text_it = p.styled_message().begin(); +			text_it != p.styled_message().end(); +			++text_it) +		{ +			mTextBox->appendText(text_it->text(), false, text_it->style); +		} +	} +	else +	{ +		mTextBox->setText(p.message()); +	}  	LLRect text_contents_rect = mTextBox->getContentsRect(); -	S32 text_width = llmin(mMaxWidth, text_contents_rect.getWidth()); +	S32 text_width = llmin(p.max_width(), text_contents_rect.getWidth());  	S32 text_height = text_contents_rect.getHeight();  	mTextBox->reshape(text_width, text_height); @@ -300,7 +311,7 @@ void LLToolTip::setValue(const LLSD& value)  	tooltip_rect.mBottom = 0;  	tooltip_rect.mLeft = 0; -	setRect(tooltip_rect); +	setShape(tooltip_rect);  }  void LLToolTip::setVisible(BOOL visible) @@ -411,9 +422,8 @@ void LLToolTipMgr::createToolTip(const LLToolTip::Params& params)  	}  	tooltip_params.rect = LLRect (0, 1, 1, 0); -  	mToolTip = LLUICtrlFactory::create<LLToolTip> (tooltip_params); -	mToolTip->setValue(params.message()); +  	gToolTipView->addChild(mToolTip);  	if (params.pos.isProvided()) diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h index 774ca507c1..8c8fdf0a4c 100644 --- a/indra/llui/lltooltip.h +++ b/indra/llui/lltooltip.h @@ -37,6 +37,7 @@  #include "llsingleton.h"  #include "llinitparam.h"  #include "llpanel.h" +#include "llstyle.h"  //  // Classes @@ -65,11 +66,19 @@ public:  class LLToolTip : public LLPanel  {  public: + +	struct StyledText : public LLInitParam::Block<StyledText> +	{ +		Mandatory<std::string>		text; +		Optional<LLStyle::Params>	style; +	}; +  	struct Params : public LLInitParam::Block<Params, LLPanel::Params>   	{  		typedef boost::function<void(void)> click_callback_t; -		Mandatory<std::string>		message; +		Optional<std::string>		message; +		Multiple<StyledText>		styled_message;  		Optional<LLCoordGL>			pos;  		Optional<F32>				delay_time, @@ -85,8 +94,8 @@ public:  		Optional<click_callback_t>	click_callback,  									click_playmedia_callback,  									click_homepage_callback; -		Optional<S32>				max_width; -		Optional<S32>				padding; +		Optional<S32>				max_width, +									padding;  		Optional<bool>				wrap;  		Params(); @@ -94,7 +103,6 @@ public:  	/*virtual*/ void draw();  	/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);  	/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask); -	/*virtual*/ void setValue(const LLSD& value);  	/*virtual*/ void setVisible(BOOL visible);  	bool isFading(); @@ -102,6 +110,7 @@ public:  	bool hasClickCallback();  	LLToolTip(const Params& p); +	void initFromParams(const LLToolTip::Params& params);  private:  	class LLTextBox*	mTextBox; @@ -111,7 +120,6 @@ private:  	LLFrameTimer	mFadeTimer;  	LLFrameTimer	mVisibleTimer; -	S32				mMaxWidth;  	bool			mHasClickCallback;  	S32				mPadding;	// pixels  }; diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp index f1e3000547..9be33483d0 100644 --- a/indra/llui/lluicolortable.cpp +++ b/indra/llui/lluicolortable.cpp @@ -192,19 +192,27 @@ void LLUIColorTable::clear()  LLUIColor LLUIColorTable::getColor(const std::string& name, const LLColor4& default_color) const  {  	string_color_map_t::const_iterator iter = mUserSetColors.find(name); +	  	if(iter != mUserSetColors.end())  	{  		return LLUIColor(&iter->second);  	}  	iter = mLoadedColors.find(name); -	return (iter != mLoadedColors.end() ? LLUIColor(&iter->second) : LLUIColor(default_color)); +	 +	if(iter != mLoadedColors.end()) +	{ +		return LLUIColor(&iter->second); +	} +	 +	return  LLUIColor(default_color);  }  // update user color, loaded colors are parsed on initialization  void LLUIColorTable::setColor(const std::string& name, const LLColor4& color)  {  	setColor(name, color, mUserSetColors); +	setColor(name, color, mLoadedColors);  }  bool LLUIColorTable::loadFromSettings() diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp index adfbb41feb..1c1450d7e9 100644 --- a/indra/llui/lluictrlfactory.cpp +++ b/indra/llui/lluictrlfactory.cpp @@ -433,8 +433,8 @@ void LLUICtrlFactory::registerWidget(const std::type_info* widget_type, const st  	LLWidgetNameRegistry ::instance().defaultRegistrar().add(param_block_type, tag);  	// associate widget type with factory function  	LLDefaultWidgetRegistry::instance().defaultRegistrar().add(widget_type, creator_func); -	LLWidgetTypeRegistry::instance().defaultRegistrar().add(tag, widget_type);  	//FIXME: comment this in when working on schema generation +	//LLWidgetTypeRegistry::instance().defaultRegistrar().add(tag, widget_type);  	//LLDefaultParamBlockRegistry::instance().defaultRegistrar().add(widget_type, &getEmptyParamBlock<T>);  } diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index dae4b512d1..219fae84be 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -512,50 +512,6 @@ std::string LLUrlEntryTeleport::getLocation(const std::string &url) const  	return ::getStringAfterToken(url, "app/teleport/");  } -/// -/// LLUrlEntryObjectIM Describes a Second Life object instant msg Url, e.g., -/// secondlife:///app/objectim/<sessionid> -/// -LLUrlEntryObjectIM::LLUrlEntryObjectIM() -{ -	mPattern = boost::regex("secondlife:///app/objectim/[\\da-f-]+\\??\\S*", -							boost::regex::perl|boost::regex::icase); -	mMenuName = "menu_url_objectim.xml"; -	mTooltip = LLTrans::getString("TooltipObjectIMUrl"); -} - -std::string LLUrlEntryObjectIM::getLabel(const std::string &url, const LLUrlLabelCallback &cb) -{ -	LLURI uri(url); -	LLSD params = uri.queryMap(); -	if (params.has("name")) -	{ -		// look for a ?name=<obj-name> param in the url -		// and use that as the label if present. -		std::string name = params.get("name"); -		LLStringUtil::trim(name); -		if (name.empty()) -		{ -			name = LLTrans::getString("Unnamed"); -		} -		return name; -	} - -	return unescapeUrl(url); -} - -std::string LLUrlEntryObjectIM::getLocation(const std::string &url) const -{ -	LLURI uri(url); -	LLSD params = uri.queryMap(); -	if (params.has("slurl")) -	{ -		return params.get("slurl"); -	} - -	return ""; -} -  //  // LLUrlEntrySL Describes a generic SLURL, e.g., a Url that starts  // with secondlife:// (used as a catch-all for cases not matched above) diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 4507572b1e..7970b48eb5 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -209,18 +209,6 @@ public:  };  /// -/// LLUrlEntryObjectIM Describes a Second Life object instant msg Url, e.g., -/// secondlife:///app/objectim/<sessionid>?name=Foo -/// -class LLUrlEntryObjectIM : public LLUrlEntryBase -{ -public: -	LLUrlEntryObjectIM(); -	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); -	/*virtual*/ std::string getLocation(const std::string &url) const; -}; - -///  /// LLUrlEntrySL Describes a generic SLURL, e.g., a Url that starts  /// with secondlife:// (used as a catch-all for cases not matched above)  /// diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 60275b60bc..a6922b019b 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -52,7 +52,6 @@ LLUrlRegistry::LLUrlRegistry()  	registerUrl(new LLUrlEntryParcel());  	registerUrl(new LLUrlEntryTeleport());  	registerUrl(new LLUrlEntryWorldMap()); -	registerUrl(new LLUrlEntryObjectIM());  	registerUrl(new LLUrlEntryPlace());  	registerUrl(new LLUrlEntrySL());  	registerUrl(new LLUrlEntrySLLabel()); diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 13c381edae..4adef84cd3 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -246,11 +246,13 @@ set(viewer_SOURCE_FILES      llinspectavatar.cpp      llinspectgroup.cpp      llinspectobject.cpp +    llinspectremoteobject.cpp      llinventorybridge.cpp      llinventoryclipboard.cpp      llinventoryfilter.cpp      llinventoryfunctions.cpp      llinventorymodel.cpp +    llinventoryobserver.cpp      llinventorypanel.cpp      llinventorysubtreepanel.cpp      lljoystickbutton.cpp @@ -445,6 +447,7 @@ set(viewer_SOURCE_FILES      llviewerassettype.cpp      llvieweraudio.cpp      llviewercamera.cpp +	llviewerchat.cpp      llviewercontrol.cpp      llviewercontrollistener.cpp      llviewerdisplay.cpp @@ -741,11 +744,13 @@ set(viewer_HEADER_FILES      llinspectavatar.h      llinspectgroup.h      llinspectobject.h +    llinspectremoteobject.h      llinventorybridge.h      llinventoryclipboard.h      llinventoryfilter.h      llinventoryfunctions.h      llinventorymodel.h +    llinventoryobserver.h      llinventorypanel.h      llinventorysubtreepanel.h      lljoystickbutton.h @@ -942,6 +947,7 @@ set(viewer_HEADER_FILES      llvieweraudio.h      llviewerbuild.h      llviewercamera.h +	llviewerchat.h      llviewercontrol.h      llviewercontrollistener.h      llviewerdisplay.h @@ -1379,7 +1385,7 @@ if (WINDOWS)                ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln                --workingdir                ${VIEWER_BINARY_NAME} -              "./${CMAKE_CFG_INTDIR}" +              "${CMAKE_CURRENT_SOURCE_DIR}"              COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging."              )      endif (NOT UNATTENDED) diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml index d7bb64ce8a..ec80d2d014 100644 --- a/indra/newview/app_settings/logcontrol.xml +++ b/indra/newview/app_settings/logcontrol.xml @@ -34,6 +34,7 @@  						</array>  					<key>classes</key>  						<array> +							<string>LLBottomTray</string>  						</array>  					<key>files</key>  						<array> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 15c9499bbc..8ad52784d3 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3563,7 +3563,7 @@        <key>Type</key>        <string>S32</string>        <key>Value</key> -      <integer>400</integer> +      <integer>305</integer>      </map>      <key>HelpUseLocal</key>      <map> @@ -4259,7 +4259,29 @@        <key>Value</key>        <integer>0</integer>      </map> -    <key>LogMessages</key> +  <key>LoginSRVTimeout</key> +  <map> +    <key>Comment</key> +    <string>Duration in seconds of the login SRV request timeout</string> +    <key>Persist</key> +    <integer>0</integer> +    <key>Type</key> +    <string>F32</string> +    <key>Value</key> +    <real>10.0</real> +  </map> +  <key>LoginSRVPump</key> +  <map> +    <key>Comment</key> +    <string>Name of the message pump that handles SRV request</string> +    <key>Persist</key> +    <integer>0</integer> +    <key>Type</key> +    <string>String</string> +    <key>Value</key> +    <string>LLAres</string> +  </map> +  <key>LogMessages</key>      <map>        <key>Comment</key>        <string>Log network traffic</string> @@ -4895,7 +4917,7 @@        <key>Type</key>        <string>S32</string>        <key>Value</key> -      <integer>350</integer> +      <integer>305</integer>      </map>      <key>NotificationToastLifeTime</key>      <map> @@ -5501,7 +5523,7 @@        <key>Type</key>        <string>Boolean</string>        <key>Value</key> -      <integer>0</integer> +      <integer>1</integer>      </map>      <key>QAMode</key>      <map> diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index 3209654498..f84102e1fb 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -118,7 +118,7 @@ if [ -n "$LL_TCMALLOC" ]; then      fi  fi -export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"`pwd`"/app_settings/mozilla-runtime-linux-i686:"${LD_LIBRARY_PATH}"' +export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"${LD_LIBRARY_PATH}"'  export SL_CMD='$LL_WRAPPER bin/do-not-directly-run-secondlife-bin'  export SL_OPT="`cat etc/gridargs.dat` $@" diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index d2c8558f0b..ca1688ad1f 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3080,10 +3080,6 @@ void LLAgent::updateCamera()  		mOrbitLeftKey > 0.f,	// right  		mOrbitDownKey > 0.f);	// bottom -		camera_floater->mZoom->setToggleState(  -		mOrbitInKey > 0.f,		// top -		mOrbitOutKey > 0.f);	// bottom -  		camera_floater->mTrack->setToggleState(  		mPanLeftKey > 0.f,		// left  		mPanUpKey > 0.f,		// top diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp index 3da6a4e3f4..b3ed7c353e 100644 --- a/indra/newview/llagentlistener.cpp +++ b/indra/newview/llagentlistener.cpp @@ -48,7 +48,7 @@ void LLAgentListener::requestTeleport(LLSD const & event_data) const  		params.append(event_data["y"]);  		params.append(event_data["z"]);  		LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, true); -		// *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "objectim", "parcel", "login", login_refresh", "balance", "chat" +		// *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "parcel", "login", login_refresh", "balance", "chat"  		// should we just compose LLCommandHandler and LLDispatchListener?  	}  	else diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 3fc1055acd..9b4986247f 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -887,9 +887,8 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs  			lldebugs << "       " << LLWearableDictionary::getTypeLabel(type) << llendl;  		} -		// What we do here is get the complete information on the items in -		// the inventory, and set up an observer that will wait for that to -		// happen. +		// Get the complete information on the items in the inventory and set up an observer +		// that will trigger when the complete information is fetched.  		LLInventoryFetchDescendentsObserver::folder_ref_t folders;  		folders.push_back(current_outfit_id);  		outfit->fetchDescendents(folders); @@ -1985,14 +1984,14 @@ bool LLAgentWearables::canWearableBeRemoved(const LLWearable* wearable) const  	return !(((type == WT_SHAPE) || (type == WT_SKIN) || (type == WT_HAIR) || (type == WT_EYES))  			 && (getWearableCount(type) <= 1) );		    } -void LLAgentWearables::animateAllWearableParams(F32 delta, BOOL set_by_user) +void LLAgentWearables::animateAllWearableParams(F32 delta, BOOL upload_bake)  {  	for( S32 type = 0; type < WT_COUNT; ++type )  	{  		for (S32 count = 0; count < (S32)getWearableCount((EWearableType)type); ++count)  		{  			LLWearable *wearable = getWearable((EWearableType)type,count); -			wearable->animateParams(delta, set_by_user); +			wearable->animateParams(delta, upload_bake);  		}  	}  } @@ -2023,6 +2022,8 @@ void LLInitialWearablesFetch::done()  	else  	{  		processWearablesMessage(); +		// Create links for attachments that may have arrived before the COF existed. +		LLAppearanceManager::linkRegisteredAttachments();  	}  	delete this;  } diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index 317f4a7e4f..9017c25fc6 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -80,7 +80,7 @@ public:  	// Note: False for shape, skin, eyes, and hair, unless you have MORE than 1.  	bool			canWearableBeRemoved(const LLWearable* wearable) const; -	void			animateAllWearableParams(F32 delta, BOOL set_by_user); +	void			animateAllWearableParams(F32 delta, BOOL upload_bake);  	//--------------------------------------------------------------------  	// Accessors diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index d14de1c301..0901289dac 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1123,6 +1123,7 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )  	{  		if (do_update)  			LLAppearanceManager::updateAppearanceFromCOF(); +		return;  	}  	else  	{ @@ -1134,6 +1135,7 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )  							 LLAssetType::AT_LINK,  							 cb);  	} +	return;  }  /* static */ @@ -1281,3 +1283,22 @@ void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id)  		   //llinfos << "no link changes, inv link not enabled" << llendl;  	   }  } + +/* static */ +void LLAppearanceManager::linkRegisteredAttachments() +{ +	for (std::set<LLUUID>::iterator it = sRegisteredAttachments.begin(); +		 it != sRegisteredAttachments.end(); +		 ++it) +	{ +		LLUUID item_id = *it; +		LLViewerInventoryItem *item = gInventory.getItem(item_id); +		if (item) +		{ +			wearItem(item, false); +			gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); +			gInventory.notifyObservers(); +		} +	} +	sRegisteredAttachments.clear(); +} diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 56f54dfc23..7dea16b6cf 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -71,6 +71,7 @@ public:  	static void unregisterAttachment(const LLUUID& item_id);  	static void registerAttachment(const LLUUID& item_id);  	static void setAttachmentInvLinkEnable(bool val); +	static void linkRegisteredAttachments();  private:  	static void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type); diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 4456e0aa74..ee4a9df15f 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -54,6 +54,7 @@  #include "llmutelist.h"  #include "llrecentpeople.h"  #include "llsidetray.h" +#include "lltrans.h"  #include "llviewerobjectlist.h"  #include "llviewermessage.h"	// for handle_lure  #include "llviewerregion.h" @@ -191,7 +192,7 @@ void LLAvatarActions::startIM(const LLUUID& id)  // static  void LLAvatarActions::startCall(const LLUUID& id)  { -	if (id.isNull() || isCalling(id)) +	if (id.isNull())  	{  		return;  	} diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp index 46902006a6..327d80ba34 100644 --- a/indra/newview/llavatariconctrl.cpp +++ b/indra/newview/llavatariconctrl.cpp @@ -143,7 +143,8 @@ void LLAvatarIconIDCache::remove	(const LLUUID& avatar_id)  LLAvatarIconCtrl::Params::Params()  :	avatar_id("avatar_id"), -	draw_tooltip("draw_tooltip", true) +	draw_tooltip("draw_tooltip", true), +	default_icon_name("default_icon_name")  {  	name = "avatar_icon";  } @@ -151,7 +152,8 @@ LLAvatarIconCtrl::Params::Params()  LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)  :	LLIconCtrl(p), -	mDrawTooltip(p.draw_tooltip) +	mDrawTooltip(p.draw_tooltip), +	mDefaultIconName(p.default_icon_name)  {  	mPriority = LLViewerFetchedTexture::BOOST_ICON; @@ -193,7 +195,7 @@ LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)  	}  	else  	{ -		LLIconCtrl::setValue("default_profile_picture.j2c"); +		LLIconCtrl::setValue(mDefaultIconName);  	}  } @@ -260,7 +262,7 @@ bool LLAvatarIconCtrl::updateFromCache()  	}  	else  	{ -		LLIconCtrl::setValue("default_profile_picture.j2c"); +		LLIconCtrl::setValue(mDefaultIconName);  	}  	return true; diff --git a/indra/newview/llavatariconctrl.h b/indra/newview/llavatariconctrl.h index 5eb830df4b..38616b7852 100644 --- a/indra/newview/llavatariconctrl.h +++ b/indra/newview/llavatariconctrl.h @@ -74,6 +74,7 @@ public:  	{  		Optional <LLUUID> avatar_id;  		Optional <bool> draw_tooltip; +		Optional <std::string> default_icon_name;  		Params();  	}; @@ -106,7 +107,7 @@ protected:  	std::string			mFirstName;  	std::string			mLastName;  	bool				mDrawTooltip; - +	std::string			mDefaultIconName;  	bool updateFromCache();  }; diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 7df278d887..c670a65bcc 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -311,3 +311,18 @@ void LLAvatarListItem::onNameCache(const std::string& first_name, const std::str  	mAvatarName->setValue(name);  	mAvatarName->setToolTip(name);  } + +void LLAvatarListItem::reshapeAvatarName() +{ +	S32 width_delta = 0; +	width_delta += mShowProfileBtn ? mProfileBtnWidth : 0; +	width_delta += mSpeakingIndicator->getVisible() ? mSpeakingIndicatorWidth : 0; +	width_delta += mAvatarIcon->getVisible() ? mIconWidth : 0; +	width_delta += mShowInfoBtn ? mInfoBtnWidth : 0; +	width_delta += mLastInteractionTime->getVisible() ? mLastInteractionTime->getRect().getWidth() : 0; + +	S32 height = mAvatarName->getRect().getHeight(); +	S32 width  = getRect().getWidth() - width_delta; + +	mAvatarName->reshape(width, height); +} diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index d379797a46..9d48101a44 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -82,6 +82,8 @@ public:  	void setContextMenu(ContextMenu* menu) { mContextMenu = menu; } +	void reshapeAvatarName(); +  private:  	typedef enum e_online_status { diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 832694873f..8d57c68cf2 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -40,6 +40,7 @@  #include "llimfloater.h" // for LLIMFloater  #include "lllayoutstack.h"  #include "llnearbychatbar.h" +#include "llspeakbutton.h"  #include "llsplitbutton.h"  #include "llsyswellwindow.h"  #include "llfloatercamera.h" @@ -50,6 +51,8 @@ LLBottomTray::LLBottomTray(const LLSD&)  	mSpeakBtn(NULL),  	mNearbyChatBar(NULL),  	mToolbarStack(NULL) +,	mMovementButton(NULL) +// Add more members  {  	mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL); @@ -72,6 +75,8 @@ LLBottomTray::LLBottomTray(const LLSD&)  	//destroyed LLBottomTray requires some subsystems that are long gone  	//LLUI::getRootView()->addChild(this); +	initStateProcessedObjectMap(); +  	// Necessary for focus movement among child controls  	setFocusRoot(TRUE);  } @@ -181,6 +186,28 @@ void LLBottomTray::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID&  	}  } +// virtual +void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, bool proximal) +{ +	// Time it takes to connect to voice channel might be pretty long, +	// so don't expect user login or STATUS_VOICE_ENABLED to be followed by STATUS_JOINED. +	BOOL enable = FALSE; + +	switch (status) +	{ +	// Do not add STATUS_VOICE_ENABLED because voice chat is  +	// inactive until STATUS_JOINED +	case STATUS_JOINED: +		enable = TRUE; +		break; +	default: +		enable = FALSE; +		break; +	} + +	mSpeakBtn->setEnabled(enable); +} +  //virtual  void LLBottomTray::onFocusLost()  { @@ -234,30 +261,31 @@ void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask)  void LLBottomTray::showGestureButton(BOOL visible)  { -	mGesturePanel->setVisible(visible); +	showTrayButton(RS_BUTTON_GESTURES, visible);  }  void LLBottomTray::showMoveButton(BOOL visible)  { -	mMovementPanel->setVisible(visible); +	showTrayButton(RS_BUTTON_MOVEMENT, visible);  }  void LLBottomTray::showCameraButton(BOOL visible)  { -	mCamPanel->setVisible(visible); +	showTrayButton(RS_BUTTON_CAMERA, visible);  }  void LLBottomTray::showSnapshotButton(BOOL visible)  { -	mSnapshotPanel->setVisible(visible); +	showTrayButton(RS_BUTTON_SNAPSHOT, visible);  }  namespace  { -	const std::string& PANEL_CHICLET_NAME = "chiclet_list_panel"; -	const std::string& PANEL_CHATBAR_NAME = "chat_bar"; -	const std::string& PANEL_MOVEMENT_NAME = "movement_panel"; -	const std::string& PANEL_CAMERA_NAME = "cam_panel"; +	const std::string& PANEL_CHICLET_NAME	= "chiclet_list_panel"; +	const std::string& PANEL_CHATBAR_NAME	= "chat_bar"; +	const std::string& PANEL_MOVEMENT_NAME	= "movement_panel"; +	const std::string& PANEL_CAMERA_NAME	= "cam_panel"; +	const std::string& PANEL_GESTURE_NAME	= "gesture_panel";  }  BOOL LLBottomTray::postBuild() @@ -275,6 +303,19 @@ BOOL LLBottomTray::postBuild()  	mSnapshotPanel = getChild<LLPanel>("snapshot_panel");  	setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4)); +	mSpeakBtn = getChild<LLSpeakButton>("talk"); + +	// Speak button should be initially disabled because +	// it takes some time between logging in to world and connecting to voice channel. +	mSpeakBtn->setEnabled(FALSE); + +	// Localization tool doesn't understand custom buttons like <talk_button> +	mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") ); +	mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") ); + +	// Registering Chat Bar to receive Voice client status change notifications. +	gVoiceClient->addObserver(this); +  	if (mChicletPanel && mToolbarStack && mNearbyChatBar)  	{  		verifyChildControlsSizes(); @@ -283,159 +324,381 @@ BOOL LLBottomTray::postBuild()  	return TRUE;  } +void LLBottomTray::log(LLView* panel, const std::string& descr) +{ +	if (NULL == panel) return; +	LLView* layout = panel->getParent(); +	lldebugs << descr << ": " +		<< "panel: " << panel->getName() +		<< ", rect: " << panel->getRect() +  +  +		<< "layout: " << layout->getName() +		<< ", rect: " << layout->getRect() +		<< llendl +		;  +} +  void LLBottomTray::verifyChildControlsSizes()  {  	LLRect rect = mChicletPanel->getRect(); +	/*  	if (rect.getWidth() < mChicletPanel->getMinWidth())  	{ +		llwarns << "QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ: chiclet panel less then min" << llendl;  		mChicletPanel->reshape(mChicletPanel->getMinWidth(), rect.getHeight());  	} - +*/  	rect = mNearbyChatBar->getRect(); +/*  	if (rect.getWidth() < mNearbyChatBar->getMinWidth())  	{ +		llwarns << "WWWWWWWWWWWWWWWWWWWWWWWWWWWWW: near chat panel less then min" << llendl;  		mNearbyChatBar->reshape(mNearbyChatBar->getMinWidth(), rect.getHeight());  	} -	else if (rect.getWidth() > mNearbyChatBar->getMaxWidth()) +	else  +*/ +		if (rect.getWidth() > mNearbyChatBar->getMaxWidth())  	{ +		llerrs << "WWWWWWWWWWWWWWWWWWWWWWWWWWWWW: near chat panel more then max width" << llendl; +  		rect.setLeftTopAndSize(rect.mLeft, rect.mTop, mNearbyChatBar->getMaxWidth(), rect.getHeight());  		mNearbyChatBar->reshape(mNearbyChatBar->getMaxWidth(), rect.getHeight());  		mNearbyChatBar->setRect(rect);  	}  } - +#define __FEATURE_EXT_991  void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)  { +	lldebugs << "****************************************" << llendl; + +	S32 current_width = getRect().getWidth(); +	lldebugs << "Reshaping: "  +		<< ", width: " << width +		<< ", height: " << height +		<< ", called_from_parent: " << called_from_parent +		<< ", cur width: " << current_width +		<< ", cur height: " << getRect().getHeight() +		<< llendl; + +	if (mNearbyChatBar)			log(mNearbyChatBar, "before"); +	if (mChicletPanel)			log(mChicletPanel, "before");  	if (mChicletPanel && mToolbarStack && mNearbyChatBar)  	{ -#ifdef __FEATURE_EXT_991__ -		BOOL shrink = width < getRect().getWidth(); -		const S32 MIN_RENDERED_CHARS = 3; -#endif +		mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE); + 		verifyChildControlsSizes(); + 		updateResizeState(width, current_width); +	} -		verifyChildControlsSizes(); -		updateResizeState(width, height); +	LLPanel::reshape(width, height, called_from_parent); -		switch (mResizeState) -		{ -		case STATE_CHICLET_PANEL: -			mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE); -			mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE); -			mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, FALSE); -			mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE); +	if (mNearbyChatBar)			log(mNearbyChatBar, "after"); +	if (mChicletPanel)			log(mChicletPanel, "after"); +} -			break; -		case STATE_CHATBAR_INPUT: -			mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, TRUE); +void LLBottomTray::updateResizeState(S32 new_width, S32 cur_width) +{ +	mResizeState = RS_NORESIZE; -			mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, FALSE); -			mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, FALSE); -			mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE); +	S32 delta_width = new_width - cur_width; +//	if (delta_width == 0) return; +	bool shrink = new_width < cur_width; -			break; +	const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); +	const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); -#ifdef __FEATURE_EXT_991__ +	const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth(); +	const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth(); +	const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth(); -		case STATE_BUTTONS: -			mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, TRUE); -			mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, TRUE); +	lldebugs << "chatbar_panel_width: " << chatbar_panel_width +		<< ", chatbar_panel_min_width: " << chatbar_panel_min_width +		<< ", chatbar_panel_max_width: " << chatbar_panel_max_width +		<< ", chiclet_panel_width: " << chiclet_panel_width +		<< ", chiclet_panel_min_width: " << chiclet_panel_min_width +		<< llendl; -			mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, FALSE); -			mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE); +	// bottom tray is narrowed +	if (shrink) +	{ +		processWidthDecreased(delta_width); +	} +	// bottom tray is widen +	else +	{ +		processWidthIncreased(delta_width); +	} -			if (shrink) -			{ +	lldebugs << "New resize state: " << mResizeState << llendl; +} -				if (mSnapshotPanel->getVisible()) -				{ -					showSnapshotButton(FALSE); -				} +void LLBottomTray::processWidthDecreased(S32 delta_width) +{ +	bool still_should_be_processed = true; -				if (mCamPanel->getVisible() && mCamButton->getLastDrawCharsCount() < MIN_RENDERED_CHARS) -				{ -					showCameraButton(FALSE); -				} +	const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); +	const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); -				if (mMovementPanel->getVisible() && mMovementButton->getLastDrawCharsCount() < MIN_RENDERED_CHARS) -				{ -					showMoveButton(FALSE); -				} +	if (chiclet_panel_width > chiclet_panel_min_width) +	{ +		// we have some space to decrease chiclet panel +		S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width; +		mResizeState |= RS_CHICLET_PANEL; -			} -			else -			{ -				showMoveButton(TRUE); -				mMovementPanel->draw(); - -				if (mMovementButton->getLastDrawCharsCount() >= MIN_RENDERED_CHARS) -				{ -					showMoveButton(TRUE); -				} -				else -				{ -					showMoveButton(FALSE); -				} -			} -			break; -#endif +		S32 delta_panel = llmin(-delta_width, panel_delta_min); -		default: -			break; -		} -	} +		lldebugs << "delta_width: " << delta_width +			<< ", panel_delta_min: " << panel_delta_min +			<< ", delta_panel: " << delta_panel +			<< llendl; -	LLPanel::reshape(width, height, called_from_parent); -} +		// is chiclet panel width enough to process resizing? +		delta_width += panel_delta_min; -void LLBottomTray::updateResizeState(S32 width, S32 height) -{ -	mResizeState = STATE_BUTTONS; +		still_should_be_processed = delta_width < 0; -	const S32 chiclet_panel_width = mChicletPanel->getRect().getWidth(); -	const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); +		mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - delta_panel, mChicletPanel->getParent()->getRect().getHeight()); +		log(mChicletPanel, "after processing panel decreasing via chiclet panel"); + +		lldebugs << "RS_CHICLET_PANEL"  +			<< ", delta_width: " << delta_width +			<< llendl; +	}  	const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();  	const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth(); -	const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth(); +	if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width) +	{ +		// we have some space to decrease chatbar panel +		S32 panel_delta_min = chatbar_panel_width - chatbar_panel_min_width; +		mResizeState |= RS_CHATBAR_INPUT; -	// bottom tray is narrowed -	if (width < getRect().getWidth()) +		S32 delta_panel = llmin(-delta_width, panel_delta_min); + +		// is chatbar panel width enough to process resizing? +		delta_width += panel_delta_min; + + +		still_should_be_processed = delta_width < 0; + +		mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mNearbyChatBar->getRect().getHeight()); + +		lldebugs << "RS_CHATBAR_INPUT" +			<< ", delta_panel: " << delta_panel +			<< ", delta_width: " << delta_width +			<< llendl; + +		log(mChicletPanel, "after nearby was processed"); + +	} + +	S32 buttons_freed_width = 0; +	if (still_should_be_processed)  	{ -		if (chiclet_panel_width > chiclet_panel_min_width) +		processHideButton(RS_BUTTON_SNAPSHOT, &delta_width, &buttons_freed_width); + +		if (delta_width < 0)  		{ -			mResizeState = STATE_CHICLET_PANEL; +			processHideButton(RS_BUTTON_CAMERA, &delta_width, &buttons_freed_width);  		} -		else if (chatbar_panel_width > chatbar_panel_min_width) + +		if (delta_width < 0)  		{ -			mResizeState = STATE_CHATBAR_INPUT; +			processHideButton(RS_BUTTON_MOVEMENT, &delta_width, &buttons_freed_width);  		} -		else + +		if (delta_width < 0) +		{ +			processHideButton(RS_BUTTON_GESTURES, &delta_width, &buttons_freed_width); +		} + +		if (delta_width < 0)  		{ -			mResizeState = STATE_BUTTONS; +			llwarns << "WARNING: there is no enough room for bottom tray, resizing still should be processed" << llendl; +		} + +		if (buttons_freed_width > 0) +		{ +			log(mNearbyChatBar, "before applying compensative width"); +			mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() + buttons_freed_width, mNearbyChatBar->getRect().getHeight() ); +			log(mNearbyChatBar, "after applying compensative width"); +			lldebugs << buttons_freed_width << llendl;  		}  	} -	// bottom tray is widen -	else +} + +void LLBottomTray::processWidthIncreased(S32 delta_width) +{ +	const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); +	const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); + +	const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth(); +	const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth(); +	const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth(); + +	const S32 chatbar_available_shrink_width = chatbar_panel_width - chatbar_panel_min_width; +	const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width; + +	// how many room we have to show hidden buttons +	S32 available_width = delta_width + chatbar_available_shrink_width + available_width_chiclet; +	S32 buttons_required_width = 0; //How many room will take shown buttons + +	if (available_width > 0) +	{ +		lldebugs << "Trying to process: RS_BUTTON_GESTURES" << llendl; +		processShowButton(RS_BUTTON_GESTURES, &available_width, &buttons_required_width); +	} + +	if (available_width > 0)  	{ -#ifdef __FEATURE_EXT_991__ -		if (!mMovementPanel->getVisible()) +		lldebugs << "Trying to process: RS_BUTTON_MOVEMENT" << llendl; +		processShowButton(RS_BUTTON_MOVEMENT, &available_width, &buttons_required_width); +	} + +	if (available_width > 0) +	{ +		lldebugs << "Trying to process: RS_BUTTON_CAMERA" << llendl; +		processShowButton(RS_BUTTON_CAMERA, &available_width, &buttons_required_width); +	} + +	if (available_width > 0) +	{ +		lldebugs << "Trying to process: RS_BUTTON_SNAPSHOT" << llendl; +		processShowButton(RS_BUTTON_SNAPSHOT, &available_width, &buttons_required_width); +	} + +	// if we have to show some buttons but whidth increasing is not enough... +	if (buttons_required_width > 0 && delta_width < buttons_required_width) +	{ +		// ... let's shrink nearby chat & chiclet panels +		S32 required_to_process_width = buttons_required_width; + +		// 1. use delta width of resizing +		required_to_process_width -= delta_width; + +		// 2. use width available via decreasing of nearby chat panel +		S32 chatbar_shrink_width = required_to_process_width; +		if (chatbar_available_shrink_width < chatbar_shrink_width)  		{ -			mResizeState = STATE_BUTTONS; +			chatbar_shrink_width = chatbar_available_shrink_width;  		} -		else -#endif -		if (chatbar_panel_width < chatbar_panel_max_width) + +		log(mNearbyChatBar, "increase width: before applying compensative width"); +		mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - chatbar_shrink_width, mNearbyChatBar->getRect().getHeight() ); +		if (mNearbyChatBar)			log(mNearbyChatBar, "after applying compensative width"); +		lldebugs << chatbar_shrink_width << llendl; + +		// 3. use width available via decreasing of chiclet panel +		required_to_process_width -= chatbar_shrink_width; + +		if (required_to_process_width > 0)  		{ -			mResizeState = STATE_CHATBAR_INPUT; +			mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_to_process_width, mChicletPanel->getParent()->getRect().getHeight()); +			log(mChicletPanel, "after applying compensative width for chiclets: "); +			lldebugs << required_to_process_width << llendl;  		} -		else + +	} + +	// shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels +	delta_width -= buttons_required_width; + +	// how many space can nearby chatbar take? +	S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth(); +	if (delta_width > 0 && chatbar_panel_width_ < chatbar_panel_max_width) +	{ +		mResizeState |= RS_CHATBAR_INPUT; +		S32 delta_panel_max = chatbar_panel_max_width - chatbar_panel_width_; +		S32 delta_panel = llmin(delta_width, delta_panel_max); +		delta_width -= delta_panel_max; +		mNearbyChatBar->reshape(chatbar_panel_width_ + delta_panel, mNearbyChatBar->getRect().getHeight()); +	} +} + +bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width) +{ +	LLPanel* panel = mStateProcessedObjectMap[shown_object_type]; +	if (NULL == panel) +	{ +		lldebugs << "There is no object to process for state: " << shown_object_type << llendl; +		return false; +	} +	bool can_be_shown = canButtonBeShown(panel); +	if (can_be_shown) +	{ +		//validate if we have enough room to show this button +		const S32 required_width = panel->getRect().getWidth(); +		can_be_shown = *available_width >= required_width; +		if (can_be_shown)  		{ -			mResizeState = STATE_CHICLET_PANEL; +			*available_width -= required_width; +			*buttons_required_width += required_width; + +			showTrayButton(shown_object_type, true); + +			lldebugs << "processing object type: " << shown_object_type +				<< ", buttons_required_width: " << *buttons_required_width +				<< llendl;  		}  	} +	return can_be_shown; +} + +void LLBottomTray::processHideButton(EResizeState shown_object_type, S32* required_width, S32* buttons_freed_width) +{ +	LLPanel* panel = mStateProcessedObjectMap[shown_object_type]; +	if (NULL == panel) +	{ +		lldebugs << "There is no object to process for state: " << shown_object_type << llendl; +		return; +	} + +	if (panel->getVisible()) +	{ +		*required_width += panel->getRect().getWidth(); +		if (*required_width > 0) +		{ +			*buttons_freed_width += *required_width; +		} + +		showTrayButton(shown_object_type, false); + +		lldebugs << "processing object type: " << shown_object_type +			<< ", buttons_freed_width: " << *buttons_freed_width +			<< llendl; +	} +} + +bool LLBottomTray::canButtonBeShown(LLPanel* panel) const +{ +	bool can_be_shown = !panel->getVisible(); +	if (can_be_shown) +	{ +		// *TODO: mantipov: synchronize with situation when button was hidden via context menu; +	} +	return can_be_shown; +} + +void LLBottomTray::initStateProcessedObjectMap() +{ +	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, mGesturePanel)); +	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, mMovementPanel)); +	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, mCamPanel)); +	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, mSnapshotPanel)); +} + +void LLBottomTray::showTrayButton(EResizeState shown_object_type, bool visible) +{ +	LLPanel* panel = mStateProcessedObjectMap[shown_object_type]; +	if (NULL == panel) +	{ +		lldebugs << "There is no object to show for state: " << shown_object_type << llendl; +		return; +	} -	// TODO: finish implementation +	panel->setVisible(visible);  } +//EOF diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 02588a1975..3847168ae1 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -33,7 +33,7 @@  #ifndef LL_LLBOTTOMPANEL_H  #define LL_LLBOTTOMPANEL_H -#include <llmenugl.h> +#include "llmenugl.h"  #include "llpanel.h"  #include "llimview.h" @@ -51,7 +51,9 @@ class LLBottomTray  	: public LLSingleton<LLBottomTray>  	, public LLPanel  	, public LLIMSessionObserver +	, public LLVoiceClientStatusObserver  { +	LOG_CLASS(LLBottomTray);  	friend class LLSingleton<LLBottomTray>;  public:  	~LLBottomTray(); @@ -74,6 +76,10 @@ public:  	virtual void onFocusLost();  	virtual void setVisible(BOOL visible); +	// Implements LLVoiceClientStatusObserver::onChange() to enable the speak +	// button when voice is available +	/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal); +  	void showBottomTrayContextMenu(S32 x, S32 y, MASK mask);  	void showGestureButton(BOOL visible); @@ -82,18 +88,34 @@ public:  	void showSnapshotButton(BOOL visible);  private: - -	enum EResizeState +	typedef enum e_resize_status_type  	{ -		STATE_CHICLET_PANEL = 1, -		STATE_CHATBAR_INPUT, -		STATE_BUTTONS -	}; - -	void updateResizeState(S32 width, S32 height); +		  RS_NORESIZE			= 0x0000 +		, RS_CHICLET_PANEL		= 0x0001 +		, RS_CHATBAR_INPUT		= 0x0002 +		, RS_BUTTON_SNAPSHOT	= 0x0004 +		, RS_BUTTON_CAMERA		= 0x0008 +		, RS_BUTTON_MOVEMENT	= 0x0010 +		, RS_BUTTON_GESTURES	= 0x0020 +		, RS_BUTTON_SPEAK		= 0x0040 +		, RS_RESIZABLE_BUTTONS			= /*RS_BUTTON_SNAPSHOT | */RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES +	}EResizeState; + +	void updateResizeState(S32 new_width, S32 cur_width);  	void verifyChildControlsSizes(); - -	EResizeState mResizeState; +	void processWidthDecreased(S32 delta_width); +	void processWidthIncreased(S32 delta_width); +	void log(LLView* panel, const std::string& descr); +	bool processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width); +	void processHideButton(EResizeState shown_object_type, S32* required_width, S32* buttons_freed_width); +	bool canButtonBeShown(LLPanel* panel) const; +	void initStateProcessedObjectMap(); +	void showTrayButton(EResizeState shown_object_type, bool visible); + +	MASK mResizeState; + +	typedef std::map<EResizeState, LLPanel*> state_object_map_t; +	state_object_map_t mStateProcessedObjectMap;  protected: diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 2ccd6b7d35..0070e654ee 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -47,7 +47,6 @@  #include "llmutelist.h"  static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history"); -static const std::string MESSAGE_USERNAME_DATE_SEPARATOR(" ----- ");  std::string formatCurrentTime()  { @@ -132,7 +131,7 @@ public:  		menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_object_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  		mPopupMenuHandleObject = menu->getHandle(); -		setMouseDownCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4)); +		setDoubleClickCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4));  		return LLPanel::postBuild();  	} @@ -168,14 +167,22 @@ public:  	void onHeaderPanelClick(S32 x, S32 y, MASK mask)  	{ -		LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mAvatarID)); +		if (mSourceType == CHAT_SOURCE_OBJECT) +		{ +			LLFloaterReg::showInstance("inspect_object", LLSD().insert("object_id", mAvatarID)); +		} +		else if (mSourceType == CHAT_SOURCE_AGENT) +		{ +			LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mAvatarID)); +		} +		//if chat source is system, you may add "else" here to define behaviour.  	}  	const LLUUID&		getAvatarId () const { return mAvatarID;}  	const std::string&	getFirstName() const { return mFirstName; }  	const std::string&	getLastName	() const { return mLastName; } -	void setup(const LLChat& chat)  +	void setup(const LLChat& chat,const LLStyle::Params& style_params)   	{  		mAvatarID = chat.mFromID;  		mSourceType = chat.mSourceType; @@ -185,8 +192,11 @@ public:  			mSourceType = CHAT_SOURCE_SYSTEM;  		} -  		LLTextBox* userName = getChild<LLTextBox>("user_name"); + +		LLUIColor color = style_params.color; +		userName->setReadOnlyColor(color); +		userName->setColor(color);  		if(!chat.mFromName.empty())  		{ @@ -198,6 +208,7 @@ public:  			std::string SL = LLTrans::getString("SECOND_LIFE");  			userName->setValue(SL);  		} +  		LLTextBox* timeBox = getChild<LLTextBox>("time_box");  		timeBox->setValue(formatCurrentTime()); @@ -323,39 +334,50 @@ LLView* LLChatHistory::getSeparator()  	return separator;  } -LLView* LLChatHistory::getHeader(const LLChat& chat) +LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style_params)  {  	LLChatHistoryHeader* header = LLChatHistoryHeader::createInstance(mMessageHeaderFilename); -	header->setup(chat); +	header->setup(chat,style_params);  	return header;  } -void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params) +void LLChatHistory::appendWidgetMessage(const LLChat& chat)  {  	LLView* view = NULL; -	std::string view_text; +	std::string view_text = "\n[" + formatCurrentTime() + "] " + chat.mFromName + ": "; +  	LLInlineViewSegment::Params p;  	p.force_newline = true;  	p.left_pad = mLeftWidgetPad;  	p.right_pad = mRightWidgetPad; +	 +	LLColor4 txt_color = LLUIColorTable::instance().getColor("White"); +	LLViewerChat::getChatColor(chat,txt_color); +	LLFontGL* fontp = LLViewerChat::getChatFont(); +	 +	LLStyle::Params style_params; +	style_params.color(txt_color); +	style_params.readonly_color(txt_color); +	style_params.font(fontp); + +	  	if (mLastFromName == chat.mFromName)  	{  		view = getSeparator(); -		view_text = "\n";  		p.top_pad = mTopSeparatorPad;  		p.bottom_pad = mBottomSeparatorPad;  	}  	else  	{ -		view = getHeader(chat); -		view_text = chat.mFromName + MESSAGE_USERNAME_DATE_SEPARATOR + formatCurrentTime() + '\n'; +		view = getHeader(chat,style_params);  		if (getText().size() == 0)  			p.top_pad = 0;  		else  			p.top_pad = mTopHeaderPad;  		p.bottom_pad = mBottomHeaderPad; +		  	}  	p.view = view; @@ -370,10 +392,8 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& sty  	appendWidget(p, view_text, false);  	//Append the text message -	std::string message = chat.mText + '\n'; -	appendText(message, FALSE, style_params); +	appendText(chat.mText, FALSE, style_params);  	mLastFromName = chat.mFromName;  	blockUndo(); -	setCursorAndScrollToEnd();  } diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h index 3789ebff4e..f689a225fe 100644 --- a/indra/newview/llchathistory.h +++ b/indra/newview/llchathistory.h @@ -34,7 +34,7 @@  #define LLCHATHISTORY_H_  #include "lltexteditor.h" -#include "llchat.h" +#include "llviewerchat.h"  //Chat log widget allowing addition of a message as a widget   class LLChatHistory : public LLTextEditor @@ -94,11 +94,9 @@ class LLChatHistory : public LLTextEditor  		LLView* getSeparator();  		/**  		 * Builds a message header. -		 * @param from owner of a message. -		 * @param time time of a message.  		 * @return pointer to LLView header object.  		 */ -		LLView* getHeader(const LLChat& chat); +		LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params);  	public:  		~LLChatHistory(); @@ -111,7 +109,7 @@ class LLChatHistory : public LLTextEditor  		 * @param time time of a message.  		 * @param message message itself.  		 */ -		void appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params); +		void appendWidgetMessage(const LLChat& chat);  	private:  		std::string mLastFromName; diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index 63b9fd8e66..d2e3247250 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -120,10 +120,10 @@ std::string LLNearbyChatToastPanel::appendTime() -void	LLNearbyChatToastPanel::addText		(const std::string& message) +void	LLNearbyChatToastPanel::addText	(const std::string& message , const LLStyle::Params& input_params)  {  	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); -	msg_text->addText(message); +	msg_text->addText(message , input_params);  	mMessages.push_back(message);  } @@ -134,9 +134,34 @@ void LLNearbyChatToastPanel::init(LLSD& notification)  	mText = notification["message"].asString();		// UTF-8 line of text  	mFromName = notification["from"].asString();	// agent or object name  	mFromID = notification["from_id"].asUUID();		// agent id or object id +	  	int sType = notification["source"].asInteger();      mSourceType = (EChatSourceType)sType; - +	 +	std::string color_name = notification["text_color"].asString(); +	 +	mTextColor = LLUIColorTable::instance().getColor(color_name); +	mTextColor.mV[VALPHA] =notification["color_alpha"].asReal(); +	 +	S32 font_size = notification["font_size"].asInteger(); +	switch(font_size) +	{ +		case 0: +			mFont = LLFontGL::getFontSansSerifSmall(); +			break; +		default: +		case 1: +			mFont = LLFontGL::getFontSansSerif(); +			break; +		case 2: +			mFont = LLFontGL::getFontSansSerifBig(); +			break; +	} +	 +	LLStyle::Params style_params; +	style_params.color(mTextColor); +	style_params.font(mFont); +	  	std::string str_sender;  	if(gAgentID != mFromID) @@ -144,13 +169,13 @@ void LLNearbyChatToastPanel::init(LLSD& notification)  	else  		str_sender = LLTrans::getString("You");; -	caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender); +	caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender , style_params); -	caption->getChild<LLTextBox>("msg_time", false)->setText(appendTime()); +	caption->getChild<LLTextBox>("msg_time", false)->setText(appendTime() , style_params );  	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); -	msg_text->setText(mText); +	msg_text->setText(mText, style_params);  	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");  	if(mSourceType != CHAT_SOURCE_AGENT) @@ -171,7 +196,15 @@ void	LLNearbyChatToastPanel::setMessage	(const LLChat& chat_msg)  	notification["from_id"] = chat_msg.mFromID;  	notification["time"] = chat_msg.mTime;  	notification["source"] = (S32)chat_msg.mSourceType; - +	 +	std::string r_color_name="White"; +	F32 r_color_alpha = 1.0f;  +	LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha); +	 +	notification["text_color"] = r_color_name; +	notification["color_alpha"] = r_color_alpha; +	 +	notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;  	init(notification);  } @@ -201,11 +234,17 @@ void	LLNearbyChatToastPanel::setWidth(S32 width)  	text_box->reshape(width - msg_left_offset - msg_right_offset,100/*its not magic number, we just need any number*/);  	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); +	 +	LLStyle::Params style_params; +	style_params.color(mTextColor); +	style_params.font(mFont); +	 +	  	if(mText.length()) -		msg_text->setText(mText); +		msg_text->setText(mText, style_params);  	for(size_t i=0;i<mMessages.size();++i) -		msg_text->addText(mMessages[i]); +		msg_text->addText(mMessages[i] , style_params);  	setRect(LLRect(getRect().mLeft, getRect().mTop, getRect().mLeft + width	, getRect().mBottom));  	snapToMessageHeight	(); diff --git a/indra/newview/llchatitemscontainerctrl.h b/indra/newview/llchatitemscontainerctrl.h index 8fb045b6d9..a65bfedd09 100644 --- a/indra/newview/llchatitemscontainerctrl.h +++ b/indra/newview/llchatitemscontainerctrl.h @@ -36,7 +36,7 @@  #include "llpanel.h"  #include "llscrollbar.h"  #include "string" -#include "llchat.h" +#include "llviewerchat.h"  #include "lltoastpanel.h"  typedef enum e_show_item_header @@ -59,7 +59,7 @@ public:  	const LLUUID& getFromID() const { return mFromID;} -	void	addText		(const std::string& message); +	void	addText		(const std::string& message ,  const LLStyle::Params& input_params = LLStyle::Params());  	void	setMessage	(const LLChat& msg);  	void	setWidth		(S32 width);  	void	snapToMessageHeight	(); @@ -89,6 +89,8 @@ private:  	std::string		mFromName;	// agent or object name  	LLUUID			mFromID;	// agent id or object id  	EChatSourceType	mSourceType; +	LLColor4        mTextColor; +	LLFontGL*       mFont;  	std::vector<std::string> mMessages; diff --git a/indra/newview/llchatmsgbox.cpp b/indra/newview/llchatmsgbox.cpp index 12626e3b43..bb0ec2db27 100644 --- a/indra/newview/llchatmsgbox.cpp +++ b/indra/newview/llchatmsgbox.cpp @@ -84,7 +84,7 @@ LLChatMsgBox::LLChatMsgBox(const Params& p) :  	mBlockSpacing(p.block_spacing)  {} -void LLChatMsgBox::addText( const LLStringExplicit& text ) +void LLChatMsgBox::addText( const LLStringExplicit& text , const LLStyle::Params& input_params )  {  	S32 length = getLength();  	// if there is existing text, add a separator @@ -94,5 +94,5 @@ void LLChatMsgBox::addText( const LLStringExplicit& text )  		insertSegment(new ChatSeparator(length - 1, length - 1));  	}  	// prepend newline only if there is some existing text -	appendText(text, length > 0); +	appendText(text, length > 0, input_params);  } diff --git a/indra/newview/llchatmsgbox.h b/indra/newview/llchatmsgbox.h index df29db58c3..9e16616729 100644 --- a/indra/newview/llchatmsgbox.h +++ b/indra/newview/llchatmsgbox.h @@ -61,7 +61,7 @@ protected:  	friend class LLUICtrlFactory;  public: -	void				addText(const LLStringExplicit &text); +	void				addText(const LLStringExplicit &text, const LLStyle::Params& input_params = LLStyle::Params());  private:  	S32					mBlockSpacing; diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 6e0654e157..fd86192650 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -54,10 +54,12 @@ static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel");  static LLDefaultChildRegistry::Register<LLNotificationChiclet> t2("chiclet_notification");  static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t3("chiclet_im_p2p");  static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t4("chiclet_im_group"); +static LLDefaultChildRegistry::Register<LLAdHocChiclet> t5("chiclet_im_adhoc");  static const LLRect CHICLET_RECT(0, 25, 25, 0); -static const LLRect CHICLET_ICON_RECT(0, 24, 24, 0); +static const LLRect CHICLET_ICON_RECT(0, 22, 22, 0);  static const LLRect VOICE_INDICATOR_RECT(25, 25, 45, 0); +static const S32	OVERLAY_ICON_SHIFT = 2;	// used for shifting of an overlay icon for new massages in a chiclet  // static  const S32 LLChicletPanel::s_scroll_ratio = 10; @@ -103,6 +105,7 @@ LLNotificationChiclet::LLNotificationChiclet(const Params& p)  	// connect counter handlers to the signals  	connectCounterUpdatersToSignal("notify");  	connectCounterUpdatersToSignal("groupnotify"); +	connectCounterUpdatersToSignal("offer");  }  LLNotificationChiclet::~LLNotificationChiclet() @@ -216,13 +219,15 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)  	icon_params.visible = false;  	icon_params.image = LLUI::getUIImage(p.new_messages_icon_name);  	mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(icon_params); +	addChild(mNewMessagesIcon); +  	// adjust size and position of an icon  	LLRect chiclet_rect = p.rect; -	LLRect overlay_icon_rect = LLRect(chiclet_rect.getWidth()/2, chiclet_rect.mTop, chiclet_rect.mRight, chiclet_rect.getHeight()/2);  -	// shift an icon a little bit to the right and up corner of a chiclet -	overlay_icon_rect.translate(overlay_icon_rect.getWidth()/5, overlay_icon_rect.getHeight()/5); +	LLRect overlay_icon_rect = LLRect(chiclet_rect.getWidth()/2, chiclet_rect.getHeight(), chiclet_rect.getWidth(), chiclet_rect.getHeight()/2);   	mNewMessagesIcon->setRect(overlay_icon_rect); -	addChild(mNewMessagesIcon); +	 +	// shift an icon a little bit to the right and up corner of a chiclet +	overlay_icon_rect.translate(OVERLAY_ICON_SHIFT, OVERLAY_ICON_SHIFT);  	setShowCounter(false);  } @@ -422,7 +427,6 @@ void LLIMP2PChiclet::updateMenuItems()  	bool is_friend = LLAvatarActions::isFriend(getOtherParticipantId());  	mPopupMenu->getChild<LLUICtrl>("Add Friend")->setEnabled(!is_friend); -	mPopupMenu->getChild<LLUICtrl>("Remove Friend")->setEnabled(is_friend);  }  BOOL LLIMP2PChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) @@ -601,6 +605,9 @@ BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)  LLIMGroupChiclet::Params::Params()  : group_icon("group_icon") +, unread_notifications("unread_notifications") +, speaker("speaker") +, show_speaker("show_speaker")  {  	rect(CHICLET_RECT); @@ -790,11 +797,13 @@ LLChicletPanel::Params::Params()  	chiclet_padding = 3;  	scrolling_offset = 40; +/*  	if (!min_width.isProvided())  	{  		// min_width = 4 chiclets + 3 paddings -		min_width = 179 + 3*chiclet_padding; +		min_width = 180 + 3*chiclet_padding;  	} +*/  };  LLChicletPanel::LLChicletPanel(const Params&p) @@ -808,6 +817,7 @@ LLChicletPanel::LLChicletPanel(const Params&p)  , mShowControls(true)  {  	LLPanel::Params panel_params; +	panel_params.follows.flags(FOLLOWS_LEFT | FOLLOWS_RIGHT);  	mScrollArea = LLUICtrlFactory::create<LLPanel>(panel_params,this);  	// important for Show/Hide Camera and Move controls menu in bottom tray to work properly @@ -826,8 +836,13 @@ LLChicletPanel::~LLChicletPanel()  void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){  	LLUUID session_id = data["session_id"].asUUID(); -	S32 unread = data["num_unread"].asInteger(); +	LLUUID from_id = data["from_id"].asUUID(); +	const std::string from = data["from"].asString(); + +	//we do not show balloon (indicator of new messages) for system messages and our own messages +	if (from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from) return; +	S32 unread = data["num_unread"].asInteger();  	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);  	if (im_floater && im_floater->getVisible())  	{ @@ -876,19 +891,34 @@ BOOL LLChicletPanel::postBuild()  void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id)  { -	for(chiclet_list_t::iterator it = mChicletList.begin(); it != mChicletList.end(); ++it) +	static LLUUID s_previous_active_voice_session_id; + +	std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(session_id); + +	for(std::list<LLChiclet *>::iterator it = chiclets.begin(); it != chiclets.end(); ++it)  	{  		LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);  		if(chiclet)  		{ -			if(chiclet->getSessionId() == session_id) +			chiclet->setShowSpeaker(true); +		} +	} + +	if(!s_previous_active_voice_session_id.isNull() && s_previous_active_voice_session_id != session_id) +	{ +		chiclets = LLIMChiclet::sFindChicletsSignal(s_previous_active_voice_session_id); + +		for(std::list<LLChiclet *>::iterator it = chiclets.begin(); it != chiclets.end(); ++it) +		{ +			LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it); +			if(chiclet)  			{ -				chiclet->setShowSpeaker(true); -				continue; +				chiclet->setShowSpeaker(false);  			} -			chiclet->setShowSpeaker(false); -		} +		}		  	} + +	s_previous_active_voice_session_id = session_id;  }  S32 LLChicletPanel::calcChickletPanleWidth() @@ -1058,7 +1088,7 @@ void LLChicletPanel::reshape(S32 width, S32 height, BOOL called_from_parent )  		width, scroll_button_rect.mBottom));  	mScrollArea->setRect(LLRect(scroll_button_rect.getWidth() + SCROLL_BUTTON_PAD,  		height, width - scroll_button_rect.getWidth() - SCROLL_BUTTON_PAD, 0)); -	mShowControls = width > mMinWidth; +	mShowControls = width >= mMinWidth;  	mScrollArea->setVisible(mShowControls);  	trimChiclets(); diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index e7afd7f08e..eab4a282f5 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -107,6 +107,7 @@ public:  		{  			draw_tooltip(FALSE);  			mouse_opaque(FALSE); +			default_icon_name("Generic_Person");  		};  	}; @@ -128,7 +129,7 @@ public:  		Optional<std::string> default_icon;  		Params() -		 : default_icon("default_icon", "default_land_picture.j2c") +		 : default_icon("default_icon", "Generic_Group")  		{  		};  	}; diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp index 45f4b4fbd0..3961afe9af 100644 --- a/indra/newview/lldriverparam.cpp +++ b/indra/newview/lldriverparam.cpp @@ -242,7 +242,7 @@ BOOL LLDriverParam::parseData(LLXmlTreeNode* node)  }  #endif -void LLDriverParam::setWeight(F32 weight, BOOL set_by_user) +void LLDriverParam::setWeight(F32 weight, BOOL upload_bake)  {  	F32 min_weight = getMinWeight();  	F32 max_weight = getMaxWeight(); @@ -301,7 +301,7 @@ void LLDriverParam::setWeight(F32 weight, BOOL set_by_user)  					driven_weight = driven_min;  				} -				setDrivenWeight(driven,driven_weight,set_by_user); +				setDrivenWeight(driven,driven_weight,upload_bake);  				continue;  			}  			else  @@ -325,13 +325,13 @@ void LLDriverParam::setWeight(F32 weight, BOOL set_by_user)  					driven_weight = driven_min;  				} -				setDrivenWeight(driven,driven_weight,set_by_user); +				setDrivenWeight(driven,driven_weight,upload_bake);  				continue;  			}  		}  		driven_weight = getDrivenWeight(driven, mCurWeight); -		setDrivenWeight(driven,driven_weight,set_by_user); +		setDrivenWeight(driven,driven_weight,upload_bake);  	}  } @@ -455,9 +455,9 @@ const LLVector3*	LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_  //-----------------------------------------------------------------------------  // setAnimationTarget()  //----------------------------------------------------------------------------- -void LLDriverParam::setAnimationTarget( F32 target_value, BOOL set_by_user ) +void LLDriverParam::setAnimationTarget( F32 target_value, BOOL upload_bake )  { -	LLVisualParam::setAnimationTarget(target_value, set_by_user); +	LLVisualParam::setAnimationTarget(target_value, upload_bake);  	for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )  	{ @@ -466,16 +466,16 @@ void LLDriverParam::setAnimationTarget( F32 target_value, BOOL set_by_user )  		// this isn't normally necessary, as driver params handle interpolation of their driven params  		// but texture params need to know to assume their final value at beginning of interpolation -		driven->mParam->setAnimationTarget(driven_weight, set_by_user); +		driven->mParam->setAnimationTarget(driven_weight, upload_bake);  	}  }  //-----------------------------------------------------------------------------  // stopAnimating()  //----------------------------------------------------------------------------- -void LLDriverParam::stopAnimating(BOOL set_by_user) +void LLDriverParam::stopAnimating(BOOL upload_bake)  { -	LLVisualParam::stopAnimating(set_by_user); +	LLVisualParam::stopAnimating(upload_bake);  	for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )  	{ @@ -585,7 +585,7 @@ F32 LLDriverParam::getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight  	return driven_weight;  } -void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool set_by_user) +void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake)  {  	LLVOAvatarSelf *avatar_self = gAgent.getAvatarObject();  	if(mWearablep &&  @@ -593,10 +593,10 @@ void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bo  	   mWearablep->isOnTop())  	{  		// call setWeight through LLVOAvatarSelf so other wearables can be updated with the correct values -		avatar_self->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, set_by_user ); +		avatar_self->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, upload_bake );  	}  	else  	{ -		driven->mParam->setWeight( driven_weight, set_by_user ); +		driven->mParam->setWeight( driven_weight, upload_bake );  	}  } diff --git a/indra/newview/lldriverparam.h b/indra/newview/lldriverparam.h index 069e71a2cb..4e2daf5ba7 100644 --- a/indra/newview/lldriverparam.h +++ b/indra/newview/lldriverparam.h @@ -99,9 +99,9 @@ public:  	// LLVisualParam Virtual functions  	///*virtual*/ BOOL				parseData(LLXmlTreeNode* node);  	/*virtual*/ void				apply( ESex sex ) {} // apply is called separately for each driven param. -	/*virtual*/ void				setWeight(F32 weight, BOOL set_by_user); -	/*virtual*/ void				setAnimationTarget( F32 target_value, BOOL set_by_user ); -	/*virtual*/ void				stopAnimating(BOOL set_by_user); +	/*virtual*/ void				setWeight(F32 weight, BOOL upload_bake); +	/*virtual*/ void				setAnimationTarget( F32 target_value, BOOL upload_bake ); +	/*virtual*/ void				stopAnimating(BOOL upload_bake);  	/*virtual*/ BOOL				linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params);  	/*virtual*/ void				resetDrivenParams(); @@ -114,7 +114,7 @@ public:  	/*virtual*/ const LLVector3*	getNextDistortion(U32 *index, LLPolyMesh **poly_mesh);  protected:  	F32 getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight); -	void setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool set_by_user); +	void setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake);  	LLVector3	mDefaultVec; // temp holder diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index 424d635321..6d7da107ac 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -129,12 +129,12 @@ void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL calle  	}  } -void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text) +void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,const LLStyle::Params& input_params)  {  	// LLTextBox::setText will obliterate the expander segment, so make sure  	// we generate it again by clearing mExpanderVisible  	mExpanderVisible = false; -	LLTextBox::setText(text); +	LLTextBox::setText(text, input_params);  	// text contents have changed, segments are cleared out  	// so hide the expander and determine if we need it diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h index 3fe646c29c..7c989cfa50 100644 --- a/indra/newview/llexpandabletextbox.h +++ b/indra/newview/llexpandabletextbox.h @@ -60,7 +60,7 @@ protected:  		// adds or removes "More" link as needed  		/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); -		/*virtual*/ void setText(const LLStringExplicit& text); +		/*virtual*/ void setText(const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params());  		/**  		 * Returns difference between text box height and text height. diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index d1317f7c36..92e958b32d 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -40,10 +40,12 @@  // Viewer includes  #include "lljoystickbutton.h"  #include "llviewercontrol.h" +#include "llviewercamera.h"  #include "llbottomtray.h"  #include "llagent.h"  #include "lltoolmgr.h"  #include "lltoolfocus.h" +#include "llslider.h"  // Constants  const F32 CAMERA_BUTTON_DELAY = 0.0f; @@ -54,6 +56,93 @@ const F32 CAMERA_BUTTON_DELAY = 0.0f;  #define PRESETS "camera_presets"  #define CONTROLS "controls" +// Zoom the camera in and out +class LLPanelCameraZoom +:	public LLPanel +{ +	LOG_CLASS(LLPanelCameraZoom); +public: +	LLPanelCameraZoom(); + +	/* virtual */ BOOL	postBuild(); +	/* virtual */ void	onOpen(const LLSD& key); + +protected: +	void	onZoomPlusHeldDown(); +	void	onZoomMinusHeldDown(); +	void	onSliderValueChanged(); + +private: +	F32			mSavedSliderVal; +	LLButton*	mPlusBtn; +	LLButton*	mMinusBtn; +	LLSlider*	mSlider; +}; + +static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camera_zoom_panel"); + +//------------------------------------------------------------------------------- +// LLPanelCameraZoom +//------------------------------------------------------------------------------- + +LLPanelCameraZoom::LLPanelCameraZoom() +:	mPlusBtn( NULL ), +	mMinusBtn( NULL ), +	mSlider( NULL ), +	mSavedSliderVal(0.f) +{ +	mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this)); +	mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this)); +	mCommitCallbackRegistrar.add("Slider.value_changed", boost::bind(&LLPanelCameraZoom::onSliderValueChanged, this)); +} + +BOOL LLPanelCameraZoom::postBuild() +{ +	mPlusBtn  = getChild <LLButton> ("zoom_plus_btn"); +	mMinusBtn = getChild <LLButton> ("zoom_minus_btn"); +	mSlider   = getChild <LLSlider> ("zoom_slider"); +	mSlider->setMinValue(.0f); +	mSlider->setMaxValue(8.f); +	return LLPanel::postBuild(); +} + +void LLPanelCameraZoom::onOpen(const LLSD& key) +{ +	LLVector3d to_focus = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()) - gAgent.calcFocusPositionTargetGlobal(); +	mSavedSliderVal = 8.f - (F32)to_focus.magVec(); // maximum minus current +	mSlider->setValue( mSavedSliderVal ); +} + +void LLPanelCameraZoom::onZoomPlusHeldDown() +{ +	F32 val = mSlider->getValueF32(); +	F32 inc = mSlider->getIncrement(); +	mSlider->setValue(val - inc); +	// commit only if value changed +	if (val != mSlider->getValueF32()) +		mSlider->onCommit(); +} + +void LLPanelCameraZoom::onZoomMinusHeldDown() +{ +	F32 val = mSlider->getValueF32(); +	F32 inc = mSlider->getIncrement(); +	mSlider->setValue(val + inc); +	// commit only if value changed +	if (val != mSlider->getValueF32()) +		mSlider->onCommit(); +} + +void  LLPanelCameraZoom::onSliderValueChanged() +{ +	F32 val	 = mSlider->getValueF32(); +	F32 rate = val - mSavedSliderVal; + +	gAgent.unlockView(); +	gAgent.cameraOrbitIn(rate); + +	mSavedSliderVal = val; +}  //  // Member functions @@ -125,6 +214,7 @@ void LLFloaterCamera::onOpen(const LLSD& key)  		anchor_panel, this,  		getDockTongue(), LLDockControl::TOP)); +	mZoom->onOpen(key);  }  void LLFloaterCamera::onClose(bool app_quitting) @@ -147,7 +237,7 @@ BOOL LLFloaterCamera::postBuild()  	setIsChrome(TRUE);  	mRotate = getChild<LLJoystickCameraRotate>(ORBIT); -	mZoom = getChild<LLJoystickCameraZoom>(ZOOM); +	mZoom = getChild<LLPanelCameraZoom>(ZOOM);  	mTrack = getChild<LLJoystickCameraTrack>(PAN);  	assignButton2Mode(CAMERA_CTRL_MODE_ORBIT,			"orbit_btn"); diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h index 583f279e62..4873a34e00 100644 --- a/indra/newview/llfloatercamera.h +++ b/indra/newview/llfloatercamera.h @@ -39,6 +39,7 @@ class LLJoystickCameraRotate;  class LLJoystickCameraZoom;  class LLJoystickCameraTrack;  class LLFloaterReg; +class LLPanelCameraZoom;  enum ECameraControlMode  { @@ -74,7 +75,7 @@ public:  	virtual void onClose(bool app_quitting);  	LLJoystickCameraRotate* mRotate; -	LLJoystickCameraZoom*	mZoom; +	LLPanelCameraZoom*	mZoom;  	LLJoystickCameraTrack*	mTrack;  private: diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index ca2cdffcf8..e2df2ffdf7 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -124,9 +124,19 @@ void LLFloaterSearch::search(const LLSD &key)  	url += "&p=" + search_token.asString();  	// also append the user's preferred maturity (can be changed via prefs) -	std::string maturity = "pg"; -	if (gAgent.prefersMature()) maturity += ",mature"; -	if (gAgent.prefersAdult()) maturity += ",adult"; +	std::string maturity; +	if (gAgent.prefersAdult()) +	{ +		maturity = "42";  // PG,Mature,Adult +	} +	else if (gAgent.prefersMature()) +	{ +		maturity = "21";  // PG,Mature +	} +	else +	{ +		maturity = "13";  // PG +	}  	url += "&r=" + maturity;  	// and load the URL in the web view diff --git a/indra/newview/llfloatertestinspectors.cpp b/indra/newview/llfloatertestinspectors.cpp index 8af011c17a..09996b0b92 100644 --- a/indra/newview/llfloatertestinspectors.cpp +++ b/indra/newview/llfloatertestinspectors.cpp @@ -53,6 +53,9 @@ LLFloaterTestInspectors::~LLFloaterTestInspectors()  BOOL LLFloaterTestInspectors::postBuild()  { +	// Test the dummy widget construction code +	getChild<LLUICtrl>("intentionally-not-found")->setEnabled(true); +  //	getChild<LLUICtrl>("avatar_2d_btn")->setCommitCallback(  //		boost::bind(&LLFloaterTestInspectors::onClickAvatar2D, this));  	getChild<LLUICtrl>("avatar_3d_btn")->setCommitCallback( diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 6fdaefd21a..5db35d5f70 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -388,7 +388,9 @@ BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* roo  // makes sure that this view and it's children are the right size.  S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)  { -	mIndentation = mParentFolder ? mParentFolder->getIndentation() + LEFT_INDENTATION : 0; +	mIndentation = getParentFolder() && getParentFolder()->getParentFolder()  +		? mParentFolder->getIndentation() + LEFT_INDENTATION  +		: 0;  	if (mLabelWidthDirty)  	{  		mLabelWidth = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + getLabelFontForStyle(mLabelStyle)->getWidth(mSearchableLabel);  diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index 62a4b9a187..7c429fc76e 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -110,7 +110,7 @@ public:  	// layout constants  	static const S32 LEFT_PAD = 5; -	static const S32 LEFT_INDENTATION = 13; +	static const S32 LEFT_INDENTATION = 8;  	static const S32 ICON_PAD = 2;  	static const S32 ICON_WIDTH = 16;  	static const S32 TEXT_PAD = 1; diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 5a2331aa06..0f32d0b313 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -211,6 +211,7 @@ BOOL LLIMFloater::postBuild()  	}  	mControlPanel->setSessionId(mSessionID); +	mControlPanel->setVisible(gSavedSettings.getBOOL("IMShowControlPanel"));  	LLButton* slide_left = getChild<LLButton>("slide_left_btn");  	slide_left->setVisible(mControlPanel->getVisible()); @@ -356,8 +357,6 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)  				LLDockControl::TOP,  boost::bind(&LLIMFloater::getAllowedRect, floater, _1)));  	} -	floater->childSetVisible("panel_im_control_panel", gSavedSettings.getBOOL("IMShowControlPanel")); -  	return floater;  } @@ -463,7 +462,7 @@ void LLIMFloater::updateMessages()  	if (messages.size())  	{ -		LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor"); +//		LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor");  		std::ostringstream message;  		std::list<LLSD>::const_reverse_iterator iter = messages.rbegin(); @@ -476,14 +475,12 @@ void LLIMFloater::updateMessages()  			LLUUID from_id = msg["from_id"].asUUID();  			std::string from = from_id != gAgentID ? msg["from"].asString() : LLTrans::getString("You");  			std::string message = msg["message"].asString(); -			LLStyle::Params style_params; -			style_params.color(chat_color); -			LLChat chat(message); +			LLChat chat;  			chat.mFromID = from_id;  			chat.mFromName = from; -			mChatHistory->appendWidgetMessage(chat, style_params); +			mChatHistory->appendWidgetMessage(chat);  			mLastMessageIndex = msg["index"].asInteger();  		} @@ -499,7 +496,7 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void*  	LLIMModel::LLIMSession* im_session =  		LLIMModel::instance().findIMSession(self->mSessionID);  	//TODO: While disabled lllineeditor can receive focus we need to check if it is enabled (EK) -	if( im_session && im_session->mTextIMPossible && !self->mInputEditor->getEnabled()) +	if( im_session && im_session->mTextIMPossible && self->mInputEditor->getEnabled())  	{  		//in disconnected state IM input editor should be disabled  		self->mInputEditor->setEnabled(!gDisconnected); diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index 0b8b5935f8..87b801d73b 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -848,8 +848,11 @@ void LLFloaterIMPanel::processSessionUpdate(const LLSD& session_update)  		} -		//update the speakers dropdown too -		mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated); +		//update the speakers dropdown too, if it's available +		if (mSpeakerPanel) +		{ +			mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated); +		}  	}  } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 14f94d5a88..ee785e7ecb 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -46,6 +46,7 @@  #include "llagent.h"  #include "llavatariconctrl.h" +#include "llbottomtray.h"  #include "llcallingcard.h"  #include "llchat.h"  #include "llresmgr.h" @@ -73,6 +74,7 @@  #include "llvoicechannel.h"  #include "lltrans.h"  #include "llrecentpeople.h" +#include "llsyswellwindow.h"  #include "llfirstuse.h"  #include "llagentui.h" @@ -439,8 +441,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co  	addToHistory(session_id, from, from_id, utf8_text);  	if (log2file) logToFile(session_id, from, from_id, utf8_text); -	//we do not count system messages -	if (from_id.notNull()) session->mNumUnread++; +	session->mNumUnread++;  	// notify listeners  	LLSD arg; @@ -651,22 +652,10 @@ void LLIMModel::sendMessage(const std::string& utf8_text,  		//local echo for the legacy communicate panel  		std::string history_echo; -		std::string utf8_copy = utf8_text;  		LLAgentUI::buildFullname(history_echo); -		// Look for IRC-style emotes here. +		history_echo += ": " + utf8_text; -		std::string prefix = utf8_copy.substr(0, 4); -		if (prefix == "/me " || prefix == "/me'") -		{ -			utf8_copy.replace(0,3,""); -		} -		else -		{ -			history_echo += ": "; -		} -		history_echo += utf8_copy; -		  		LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(im_session_id);  		if (floater) floater->addHistoryLine(history_echo, LLUIColorTable::instance().getColor("IMChatColor"), true, gAgent.getID()); @@ -1100,16 +1089,90 @@ LLIMMgr::onConfirmForceCloseError(  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLOutgoingCallDialog +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +LLOutgoingCallDialog::LLOutgoingCallDialog(const LLSD& payload) : +	LLDockableFloater(NULL, false, payload), +	mPayload(payload) +{ +} + +void LLOutgoingCallDialog::getAllowedRect(LLRect& rect) +{ +	rect = gViewerWindow->getWorldViewRectRaw(); +} + +void LLOutgoingCallDialog::onOpen(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()); +	} +	else +	{ +		childSetTextArg("leaving", "[CURRENT_CHAT]", getString("localchat")); +	} + +	std::string callee_name = mPayload["session_name"].asString(); +	if (callee_name == "anonymous") +	{ +		callee_name = getString("anonymous"); +	} +	 +	setTitle(callee_name); + +	LLSD callee_id = mPayload["other_user_id"]; +	childSetTextArg("calling", "[CALLEE_NAME]", callee_name); +	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon"); +	icon->setValue(callee_id); + +	// dock the dialog to the sys well, where other sys messages appear +	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(), +					 this, getDockTongue(), LLDockControl::TOP, +					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1))); +} + + +//static +void LLOutgoingCallDialog::onCancel(void* user_data) +{ +	LLOutgoingCallDialog* self = (LLOutgoingCallDialog*)user_data; + +	if (!gIMMgr) +		return; + +	LLUUID session_id = self->mPayload["session_id"].asUUID(); +	gIMMgr->endCall(session_id); +	 +	self->closeFloater(); +} + + +BOOL LLOutgoingCallDialog::postBuild() +{ +	BOOL success = LLDockableFloater::postBuild(); + +	childSetAction("Cancel", onCancel, this); + +	return success; +} + + + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  // Class LLIncomingCallDialog  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  LLIncomingCallDialog::LLIncomingCallDialog(const LLSD& payload) : -	LLModalDialog(payload), +	LLDockableFloater(NULL, false, payload),  	mPayload(payload)  {  }  BOOL LLIncomingCallDialog::postBuild()  { +	LLDockableFloater::postBuild(); +  	LLSD caller_id = mPayload["caller_id"];  	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger(); @@ -1128,6 +1191,11 @@ BOOL LLIncomingCallDialog::postBuild()  		call_type = getString("VoiceInviteAdHoc");  	} +	// check to see if this is an Avaline call +	LLUUID session_id = mPayload["session_id"].asUUID(); +	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
 +	childSetVisible("Start IM", is_avatar); // no IM for avaline +  	LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name");  	caller_name_widget->setValue(caller_name + " " + call_type);  	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon"); @@ -1141,6 +1209,30 @@ BOOL LLIncomingCallDialog::postBuild()  	return TRUE;  } +void LLIncomingCallDialog::getAllowedRect(LLRect& rect) +{ +	rect = gViewerWindow->getWorldViewRectRaw(); +} + +void LLIncomingCallDialog::onOpen(const LLSD& key) +{ +	// tell the user which voice channel they would be leaving +	LLVoiceChannel *voice = LLVoiceChannel::getCurrentVoiceChannel(); +	if (voice && !voice->getSessionName().empty()) +	{ +		childSetTextArg("question", "[CURRENT_CHAT]", voice->getSessionName()); +	} +	else +	{ +		childSetTextArg("question", "[CURRENT_CHAT]", getString("localchat")); +	} + +	// dock the dialog to the sys well, where other sys messages appear +	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(), +									 this, getDockTongue(), LLDockControl::TOP, +									 boost::bind(&LLIncomingCallDialog::getAllowedRect, this, _1))); +} +  //static  void LLIncomingCallDialog::onAccept(void* user_data)  { @@ -2347,15 +2439,6 @@ public:  			BOOL is_linden = LLMuteList::getInstance()->isLinden(name);  			std::string separator_string(": "); -			int message_offset=0; - -			//Handle IRC styled /me messages. -			std::string prefix = message.substr(0, 4); -			if (prefix == "/me " || prefix == "/me'") -			{ -				separator_string = ""; -				message_offset = 3; -			}  			chat.mMuted = is_muted && !is_linden;  			chat.mFromID = from_id; @@ -2372,7 +2455,7 @@ public:  			{  				saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());  			} -			std::string buffer = saved + message.substr(message_offset); +			std::string buffer = saved + message;  			BOOL is_this_agent = FALSE;  			if(from_id == gAgentID) @@ -2391,7 +2474,7 @@ public:  				ll_vector3_from_sd(message_params["position"]),  				true); -			chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset); +			chat.mText = std::string("IM: ") + name + separator_string + saved + message;  			LLFloaterChat::addChat(chat, TRUE, is_this_agent);  			//K now we want to accept the invitation diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index c566b111ca..62a54bc081 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -34,9 +34,11 @@  #define LL_LLIMVIEW_H  #include "lldarray.h" +#include "lldockablefloater.h"  #include "llspeakers.h" //for LLIMSpeakerMgr  #include "llimpanel.h" //for voice channels  #include "llmodaldialog.h" +#include "lldockablefloater.h"  #include "llinstantmessage.h"  #include "lluuid.h"  #include "llmultifloater.h" @@ -401,12 +403,13 @@ private:  	LLSD mPendingAgentListUpdates;  }; -class LLIncomingCallDialog : public LLModalDialog +class LLIncomingCallDialog : public LLDockableFloater  {  public:  	LLIncomingCallDialog(const LLSD& payload);  	/*virtual*/ BOOL postBuild(); +	/*virtual*/ void onOpen(const LLSD& key);  	static void onAccept(void* user_data);  	static void onReject(void* user_data); @@ -414,6 +417,23 @@ public:  private:  	void processCallResponse(S32 response); +	void getAllowedRect(LLRect& rect); + +	LLSD mPayload; +}; + +class LLOutgoingCallDialog : public LLDockableFloater +{ +public: +	LLOutgoingCallDialog(const LLSD& payload); + +	/*virtual*/ BOOL postBuild(); +	/*virtual*/ void onOpen(const LLSD& key); + +	static void onCancel(void* user_data); + +private: +	void getAllowedRect(LLRect& rect);  	LLSD mPayload;  }; diff --git a/indra/newview/llinspectgroup.cpp b/indra/newview/llinspectgroup.cpp index c78bcd6afe..7fd7b69021 100644 --- a/indra/newview/llinspectgroup.cpp +++ b/indra/newview/llinspectgroup.cpp @@ -216,7 +216,8 @@ void LLInspectGroup::requestUpdate()  	getChild<LLUICtrl>("group_details")->setValue("");  	getChild<LLUICtrl>("group_cost")->setValue("");  	// Must have a visible button so the inspector can take focus -	getChild<LLUICtrl>("leave_btn")->setVisible(true); +	getChild<LLUICtrl>("view_profile_btn")->setVisible(true); +	getChild<LLUICtrl>("leave_btn")->setVisible(false);  	getChild<LLUICtrl>("join_btn")->setVisible(false);  	// Make a new request for properties diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp new file mode 100644 index 0000000000..e4d2eec242 --- /dev/null +++ b/indra/newview/llinspectremoteobject.cpp @@ -0,0 +1,200 @@ +/**  + * @file llinspectremoteobject.cpp + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + *  + * Copyright (c) 2009, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llinspectremoteobject.h" +#include "llinspect.h" +#include "llslurl.h" +#include "llmutelist.h" +#include "llurlaction.h" +#include "llpanelblockedlist.h" +#include "llfloaterreg.h" +#include "llui.h" +#include "lluictrl.h" + +class LLViewerObject; + +////////////////////////////////////////////////////////////////////////////// +// LLInspectRemoteObject +////////////////////////////////////////////////////////////////////////////// + +// Remote Object Inspector, a small information window used to +// display information about potentially-remote objects. Used +// to display details about objects sending messages to the user. +class LLInspectRemoteObject : public LLInspect +{ +	friend class LLFloaterReg; +	 +public: +	LLInspectRemoteObject(const LLSD& object_id); +	virtual ~LLInspectRemoteObject() {}; + +	/*virtual*/ BOOL postBuild(void); +	/*virtual*/ void onOpen(const LLSD& avatar_id); + +	void onClickMap(); +	void onClickBlock(); +	void onClickClose(); +	 +private: +	void update(); +	static void nameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data); +	 +private: +	LLUUID		 mObjectID; +	LLUUID		 mOwnerID; +	std::string  mOwner; +	std::string  mSLurl; +	std::string  mName; +	bool         mGroupOwned; +}; + +LLInspectRemoteObject::LLInspectRemoteObject(const LLSD& sd) : +	LLInspect(LLSD()), +	mObjectID(NULL), +	mOwnerID(NULL), +	mOwner(""), +	mSLurl(""), +	mName(""), +	mGroupOwned(false) +{ +} + +/*virtual*/ +BOOL LLInspectRemoteObject::postBuild(void) +{ +	// hook up the inspector's buttons +	getChild<LLUICtrl>("map_btn")->setCommitCallback( +		boost::bind(&LLInspectRemoteObject::onClickMap, this)); +	getChild<LLUICtrl>("block_btn")->setCommitCallback( +		boost::bind(&LLInspectRemoteObject::onClickBlock, this)); +	getChild<LLUICtrl>("close_btn")->setCommitCallback( +		boost::bind(&LLInspectRemoteObject::onClickClose, this)); + +	return TRUE; +} + +/*virtual*/ +void LLInspectRemoteObject::onOpen(const LLSD& data) +{ +	// Start animation +	LLInspect::onOpen(data); + +	// Extract appropriate object information from input LLSD +	// (Eventually, it might be nice to query server for details +	// rather than require caller to pass in the information.) +	mObjectID   = data["object_id"].asUUID(); +	mName       = data["name"].asString(); +	mOwnerID    = data["owner_id"].asUUID(); +	mGroupOwned = data["group_owned"].asBoolean(); +	mSLurl      = data["slurl"].asString(); + +	// work out the owner's name +	mOwner = ""; +	if (gCacheName) +	{ +		gCacheName->get(mOwnerID, mGroupOwned, nameCallback, this); +	} + +	// update the inspector with the current object state +	update(); + +	// Position the inspector relative to the mouse cursor +	LLUI::positionViewNearMouse(this); +} + +void LLInspectRemoteObject::onClickMap() +{ +	std::string url = "secondlife://" + mSLurl; +	LLUrlAction::showLocationOnMap(url); +	closeFloater(); +} + +void LLInspectRemoteObject::onClickBlock() +{ +	LLMute::EType mute_type = mGroupOwned ? LLMute::GROUP : LLMute::AGENT; +	LLMute mute(mOwnerID, mOwner, mute_type); +	LLMuteList::getInstance()->add(mute); +	LLPanelBlockedList::showPanelAndSelect(mute.mID); +	closeFloater(); +} + +void LLInspectRemoteObject::onClickClose() +{ +	closeFloater(); +} + +//static  +void LLInspectRemoteObject::nameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data) +{ +	LLInspectRemoteObject *self = (LLInspectRemoteObject*)data; +	self->mOwner = first; +	if (!last.empty()) +	{ +		self->mOwner += " " + last; +	} +	self->update(); +} + +void LLInspectRemoteObject::update() +{ +	// show the object name as the inspector's title +	getChild<LLUICtrl>("object_name")->setValue(mName); + +	// show the object's owner - click it to show profile +	std::string owner = mOwner; +	if (! mOwnerID.isNull()) +	{ +		if (mGroupOwned) +		{ +			owner = LLSLURL::buildCommand("group", mOwnerID, "about"); +		} +		else +		{ +			owner = LLSLURL::buildCommand("agent", mOwnerID, "about"); +		} +	} +	getChild<LLUICtrl>("object_owner")->setValue(owner); + +	// display the object's SLurl - click it to teleport +	std::string url = "secondlife:///app/teleport/" + mSLurl; +	getChild<LLUICtrl>("object_slurl")->setValue(url); +} + +////////////////////////////////////////////////////////////////////////////// +// LLInspectRemoteObjectUtil +////////////////////////////////////////////////////////////////////////////// +void LLInspectRemoteObjectUtil::registerFloater() +{ +	LLFloaterReg::add("inspect_remote_object", "inspect_remote_object.xml", +					  &LLFloaterReg::build<LLInspectRemoteObject>); +} diff --git a/indra/newview/llinspectremoteobject.h b/indra/newview/llinspectremoteobject.h new file mode 100644 index 0000000000..e756f1caf4 --- /dev/null +++ b/indra/newview/llinspectremoteobject.h @@ -0,0 +1,40 @@ +/**  + * @file llinspectremoteobject.h + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + *  + * Copyright (c) 2009, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LLINSPECTREMOTEOBJECT_H +#define LLINSPECTREMOTEOBJECT_H + +namespace LLInspectRemoteObjectUtil +{ +	void registerFloater(); +} + +#endif diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index e7d7eb19d0..4b0d524906 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -176,6 +176,7 @@ LLInventoryModel::LLInventoryModel()  	mRootFolderID(),  	mLibraryRootFolderID(),  	mLibraryOwnerID(), +	mIsNotifyObservers(FALSE),  	mIsAgentInvUsable(false)  {  } @@ -537,7 +538,10 @@ void LLInventoryModel::updateLinkedItems(const LLUUID& object_id)  						 item_array,  						 LLInventoryModel::INCLUDE_TRASH,  						 is_linked_item_match); - +	if (cat_array.empty() && item_array.empty()) +	{ +		return; +	}  	for (LLInventoryModel::cat_array_t::iterator cat_iter = cat_array.begin();  		 cat_iter != cat_array.end();  		 cat_iter++) @@ -639,6 +643,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)  		new_item = old_item;  		LLUUID old_parent_id = old_item->getParentUUID();  		LLUUID new_parent_id = item->getParentUUID(); +			  		if(old_parent_id != new_parent_id)  		{  			// need to update the parent-child tree @@ -1133,6 +1138,15 @@ BOOL LLInventoryModel::containsObserver(LLInventoryObserver* observer) const  // The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328]  void LLInventoryModel::notifyObservers(const std::string service_name)  { +	if (mIsNotifyObservers) +	{ +		// Within notifyObservers, something called notifyObservers +		// again.  This type of recursion is unsafe because it causes items to be  +		// processed twice, and this can easily lead to infinite loops. +		llwarns << "Call was made to notifyObservers within notifyObservers!" << llendl; +		return; +	} +	mIsNotifyObservers = TRUE;  	for (observer_list_t::iterator iter = mObservers.begin();  		 iter != mObservers.end(); )  	{ @@ -1154,12 +1168,21 @@ void LLInventoryModel::notifyObservers(const std::string service_name)  	mModifyMask = LLInventoryObserver::NONE;  	mChangedItemIDs.clear(); +	mIsNotifyObservers = FALSE;  }  // store flag for change  // and id of object change applies to  void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent)   {  +	if (mIsNotifyObservers) +	{ +		// Something marked an item for change within a call to notifyObservers +		// (which is in the process of processing the list of items marked for change). +		// This means the change may fail to be processed. +		llwarns << "Adding changed mask within notify observers!  Change will likely be lost." << llendl; +	} +	  	mModifyMask |= mask;   	if (referent.notNull())  	{ @@ -1833,13 +1856,13 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item)  {  	//llinfos << "LLInventoryModel::addItem()" << llendl; -	 -	// This can happen if assettype enums change.  This can be a backwards compatibility issue  -	// in some viewer prototypes prior to when the AT_LINK enum changed from 23 to 24. +	// This can happen if assettype enums from llassettype.h ever change. +	// For example, there is a known backwards compatibility issue in some viewer prototypes prior to when  +	// the AT_LINK enum changed from 23 to 24.  	if ((item->getType() == LLAssetType::AT_NONE)  		|| LLAssetType::lookup(item->getType()) == LLAssetType::badLookup())  	{ -		llwarns << "Got bad asset type for item ( name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ), ignoring." << llendl; +		llwarns << "Got bad asset type for item [ name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ], ignoring." << llendl;  		return;  	}  	if(item) @@ -1848,7 +1871,7 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item)  		// The item will show up as a broken link.  		if (item->getIsBrokenLink())  		{ -			llinfos << "Adding broken link ( name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " )  parent: " << item->getParentUUID() << llendl; +			llinfos << "Adding broken link [ name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " )  parent: " << item->getParentUUID() << llendl;  		}  		mItemMap[item->getUUID()] = item;  	} @@ -2176,7 +2199,7 @@ bool LLInventoryModel::loadSkeleton(  			// Add all the items loaded which are parented to a  			// category with a correctly cached parent -			count = items.count(); +			S32 bad_link_count = 0;  			cat_map_t::iterator unparented = mCategoryMap.end();  			for(item_array_t::const_iterator item_iter = items.begin();  				item_iter != items.end(); @@ -2193,7 +2216,11 @@ bool LLInventoryModel::loadSkeleton(  						// This can happen if the linked object's baseobj is removed from the cache but the linked object is still in the cache.  						if (item->getIsBrokenLink())  						{ -							llinfos << "Attempted to add cached link item without baseobj present ( name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ).  Ignoring and invalidating " << cat->getName() << " . " << llendl; +							bad_link_count++; +							lldebugs << "Attempted to add cached link item without baseobj present ( name: " +									 << item->getName() << " itemID: " << item->getUUID() +									 << " assetID: " << item->getAssetUUID() +									 << " ).  Ignoring and invalidating " << cat->getName() << " . " << llendl;  							invalid_categories.insert(cit->second);  							continue;  						} @@ -2203,6 +2230,12 @@ bool LLInventoryModel::loadSkeleton(  					}  				}  			} +			if (bad_link_count > 0) +			{ +				llinfos << "Attempted to add " << bad_link_count +						<< " cached link items without baseobj present. " +						<< "The corresponding categories were invalidated." << llendl; +			}  		}  		else  		{ @@ -3307,6 +3340,12 @@ void LLInventoryModel::processInventoryDescendents(LLMessageSystem* msg,void**)  	for(i = 0; i < count; ++i)  	{  		titem->unpackMessage(msg, _PREHASH_ItemData, i); +		// If the item has already been added (e.g. from link prefetch), then it doesn't need to be re-added. +		if (gInventory.getItem(titem->getUUID())) +		{ +			llinfos << "Skipping prefetched item [ Name: " << titem->getName() << " | Type: " << titem->getActualType() << " | ItemUUID: " << titem->getUUID() << " ] " << llendl; +			continue; +		}  		gInventory.updateItem(titem);  	} @@ -3682,513 +3721,6 @@ bool LLNameCategoryCollector::operator()(  	return false;  } - - -///---------------------------------------------------------------------------- -/// Observers -///---------------------------------------------------------------------------- - -void LLInventoryCompletionObserver::changed(U32 mask) -{ -	// scan through the incomplete items and move or erase them as -	// appropriate. -	if(!mIncomplete.empty()) -	{ -		for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); ) -		{ -			LLViewerInventoryItem* item = gInventory.getItem(*it); -			if(!item) -			{ -				it = mIncomplete.erase(it); -				continue; -			} -			if(item->isComplete()) -			{ -				mComplete.push_back(*it); -				it = mIncomplete.erase(it); -				continue; -			} -			++it; -		} -		if(mIncomplete.empty()) -		{ -			done(); -		} -	} -} - -void LLInventoryCompletionObserver::watchItem(const LLUUID& id) -{ -	if(id.notNull()) -	{ -		mIncomplete.push_back(id); -	} -} - - -void LLInventoryFetchObserver::changed(U32 mask) -{ -	// scan through the incomplete items and move or erase them as -	// appropriate. -	if(!mIncomplete.empty()) -	{ -		for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); ) -		{ -			LLViewerInventoryItem* item = gInventory.getItem(*it); -			if(!item) -			{ -				// BUG: This can cause done() to get called prematurely below. -				// This happens with the LLGestureInventoryFetchObserver that -				// loads gestures at startup. JC -				it = mIncomplete.erase(it); -				continue; -			} -			if(item->isComplete()) -			{ -				mComplete.push_back(*it); -				it = mIncomplete.erase(it); -				continue; -			} -			++it; -		} -		if(mIncomplete.empty()) -		{ -			done(); -		} -	} -	//llinfos << "LLInventoryFetchObserver::changed() mComplete size " << mComplete.size() << llendl; -	//llinfos << "LLInventoryFetchObserver::changed() mIncomplete size " << mIncomplete.size() << llendl; -} - -bool LLInventoryFetchObserver::isEverythingComplete() const -{ -	return mIncomplete.empty(); -} - -void fetch_items_from_llsd(const LLSD& items_llsd) -{ -	if (!items_llsd.size()) return; -	LLSD body; -	body[0]["cap_name"] = "FetchInventory"; -	body[1]["cap_name"] = "FetchLib"; -	for (S32 i=0; i<items_llsd.size();i++) -	{ -		if (items_llsd[i]["owner_id"].asString() == gAgent.getID().asString()) -		{ -			body[0]["items"].append(items_llsd[i]); -			continue; -		} -		if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString()) -		{ -			body[1]["items"].append(items_llsd[i]); -			continue; -		} -	} -		 -	for (S32 i=0; i<body.size(); i++) -	{ -		if (0 >= body[i].size()) continue; -		std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString()); - -		if (!url.empty()) -		{ -			body[i]["agent_id"]	= gAgent.getID(); -			LLHTTPClient::post(url, body[i], new LLInventoryModel::fetchInventoryResponder(body[i])); -			break; -		} - -		LLMessageSystem* msg = gMessageSystem; -		BOOL start_new_message = TRUE; -		for (S32 j=0; j<body[i]["items"].size(); j++) -		{ -			LLSD item_entry = body[i]["items"][j]; -			if(start_new_message) -			{ -				start_new_message = FALSE; -				msg->newMessageFast(_PREHASH_FetchInventory); -				msg->nextBlockFast(_PREHASH_AgentData); -				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -			} -			msg->nextBlockFast(_PREHASH_InventoryData); -			msg->addUUIDFast(_PREHASH_OwnerID, item_entry["owner_id"].asUUID()); -			msg->addUUIDFast(_PREHASH_ItemID, item_entry["item_id"].asUUID()); -			if(msg->isSendFull(NULL)) -			{ -				start_new_message = TRUE; -				gAgent.sendReliableMessage(); -			} -		} -		if(!start_new_message) -		{ -			gAgent.sendReliableMessage(); -		} -	} -} - -void LLInventoryFetchObserver::fetchItems( -	const LLInventoryFetchObserver::item_ref_t& ids) -{ -	LLUUID owner_id; -	LLSD items_llsd; -	for(item_ref_t::const_iterator it = ids.begin(); it < ids.end(); ++it) -	{ -		LLViewerInventoryItem* item = gInventory.getItem(*it); -		if(item) -		{ -			if(item->isComplete()) -			{ -				// It's complete, so put it on the complete container. -				mComplete.push_back(*it); -				continue; -			} -			else -			{ -				owner_id = item->getPermissions().getOwner(); -			} -		} -		else -		{ -			// assume it's agent inventory. -			owner_id = gAgent.getID(); -		} -		 -		// It's incomplete, so put it on the incomplete container, and -		// pack this on the message. -		mIncomplete.push_back(*it); -		 -		// Prepare the data to fetch -		LLSD item_entry; -		item_entry["owner_id"] = owner_id; -		item_entry["item_id"] = (*it); -		items_llsd.append(item_entry); -	} -	fetch_items_from_llsd(items_llsd); -} - -// virtual -void LLInventoryFetchDescendentsObserver::changed(U32 mask) -{ -	for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();) -	{ -		LLViewerInventoryCategory* cat = gInventory.getCategory(*it); -		if(!cat) -		{ -			it = mIncompleteFolders.erase(it); -			continue; -		} -		if(isComplete(cat)) -		{ -			mCompleteFolders.push_back(*it); -			it = mIncompleteFolders.erase(it); -			continue; -		} -		++it; -	} -	if(mIncompleteFolders.empty()) -	{ -		done(); -	} -} - -void LLInventoryFetchDescendentsObserver::fetchDescendents( -	const folder_ref_t& ids) -{ -	for(folder_ref_t::const_iterator it = ids.begin(); it != ids.end(); ++it) -	{ -		LLViewerInventoryCategory* cat = gInventory.getCategory(*it); -		if(!cat) continue; -		if(!isComplete(cat)) -		{ -			cat->fetchDescendents();		//blindly fetch it without seeing if anything else is fetching it. -			mIncompleteFolders.push_back(*it);	//Add to list of things being downloaded for this observer. -		} -		else -		{ -			mCompleteFolders.push_back(*it); -		} -	} -} - -bool LLInventoryFetchDescendentsObserver::isEverythingComplete() const -{ -	return mIncompleteFolders.empty(); -} - -bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory* cat) -{ -	S32 version = cat->getVersion(); -	S32 descendents = cat->getDescendentCount(); -	if((LLViewerInventoryCategory::VERSION_UNKNOWN == version) -	   || (LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN == descendents)) -	{ -		return false; -	} -	// it might be complete - check known descendents against -	// currently available. -	LLInventoryModel::cat_array_t* cats; -	LLInventoryModel::item_array_t* items; -	gInventory.getDirectDescendentsOf(cat->getUUID(), cats, items); -	if(!cats || !items) -	{ -		// bit of a hack - pretend we're done if they are gone or -		// incomplete. should never know, but it would suck if this -		// kept tight looping because of a corrupt memory state. -		return true; -	} -	S32 known = cats->count() + items->count(); -	if(descendents == known) -	{ -		// hey - we're done. -		return true; -	} -	return false; -} - -void LLInventoryFetchComboObserver::changed(U32 mask) -{ -	if(!mIncompleteItems.empty()) -	{ -		for(item_ref_t::iterator it = mIncompleteItems.begin(); it < mIncompleteItems.end(); ) -		{ -			LLViewerInventoryItem* item = gInventory.getItem(*it); -			if(!item) -			{ -				it = mIncompleteItems.erase(it); -				continue; -			} -			if(item->isComplete()) -			{ -				mCompleteItems.push_back(*it); -				it = mIncompleteItems.erase(it); -				continue; -			} -			++it; -		} -	} -	if(!mIncompleteFolders.empty()) -	{ -		for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();) -		{ -			LLViewerInventoryCategory* cat = gInventory.getCategory(*it); -			if(!cat) -			{ -				it = mIncompleteFolders.erase(it); -				continue; -			} -			if(gInventory.isCategoryComplete(*it)) -			{ -				mCompleteFolders.push_back(*it); -				it = mIncompleteFolders.erase(it); -				continue; -			} -			++it; -		} -	} -	if(!mDone && mIncompleteItems.empty() && mIncompleteFolders.empty()) -	{ -		mDone = true; -		done(); -	} -} - -void LLInventoryFetchComboObserver::fetch( -	const folder_ref_t& folder_ids, -	const item_ref_t& item_ids) -{ -	lldebugs << "LLInventoryFetchComboObserver::fetch()" << llendl; -	for(folder_ref_t::const_iterator fit = folder_ids.begin(); fit != folder_ids.end(); ++fit) -	{ -		LLViewerInventoryCategory* cat = gInventory.getCategory(*fit); -		if(!cat) continue; -		if(!gInventory.isCategoryComplete(*fit)) -		{ -			cat->fetchDescendents(); -			lldebugs << "fetching folder " << *fit <<llendl; -			mIncompleteFolders.push_back(*fit); -		} -		else -		{ -			mCompleteFolders.push_back(*fit); -			lldebugs << "completing folder " << *fit <<llendl; -		} -	} - -	// Now for the items - we fetch everything which is not a direct -	// descendent of an incomplete folder because the item will show -	// up in an inventory descendents message soon enough so we do not -	// have to fetch it individually. -	LLSD items_llsd; -	LLUUID owner_id; -	for(item_ref_t::const_iterator iit = item_ids.begin(); iit != item_ids.end(); ++iit) -	{ -		LLViewerInventoryItem* item = gInventory.getItem(*iit); -		if(!item) -		{ -			lldebugs << "uanble to find item " << *iit << llendl; -			continue; -		} -		if(item->isComplete()) -		{ -			// It's complete, so put it on the complete container. -			mCompleteItems.push_back(*iit); -			lldebugs << "completing item " << *iit << llendl; -			continue; -		} -		else -		{ -			mIncompleteItems.push_back(*iit); -			owner_id = item->getPermissions().getOwner(); -		} -		if(std::find(mIncompleteFolders.begin(), mIncompleteFolders.end(), item->getParentUUID()) == mIncompleteFolders.end()) -		{ -			LLSD item_entry; -			item_entry["owner_id"] = owner_id; -			item_entry["item_id"] = (*iit); -			items_llsd.append(item_entry); -		} -		else -		{ -			lldebugs << "not worrying about " << *iit << llendl; -		} -	} -	fetch_items_from_llsd(items_llsd); -} - -void LLInventoryExistenceObserver::watchItem(const LLUUID& id) -{ -	if(id.notNull()) -	{ -		mMIA.push_back(id); -	} -} - -void LLInventoryExistenceObserver::changed(U32 mask) -{ -	// scan through the incomplete items and move or erase them as -	// appropriate. -	if(!mMIA.empty()) -	{ -		for(item_ref_t::iterator it = mMIA.begin(); it < mMIA.end(); ) -		{ -			LLViewerInventoryItem* item = gInventory.getItem(*it); -			if(!item) -			{ -				++it; -				continue; -			} -			mExist.push_back(*it); -			it = mMIA.erase(it); -		} -		if(mMIA.empty()) -		{ -			done(); -		} -	} -} - -void LLInventoryAddedObserver::changed(U32 mask) -{ -	if(!(mask & LLInventoryObserver::ADD)) -	{ -		return; -	} - -	// *HACK: If this was in response to a packet off -	// the network, figure out which item was updated. -	LLMessageSystem* msg = gMessageSystem; - -	std::string msg_name; -	if (mMessageName.empty()) -	{ -		msg_name = msg->getMessageName(); -	} -	else -	{ -		msg_name = mMessageName; -	} - -	if (msg_name.empty()) -	{ -		return; -	} -	 -	// We only want newly created inventory items. JC -	if ( msg_name != "UpdateCreateInventoryItem") -	{ -		return; -	} - -	LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; -	S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData); -	for(S32 i = 0; i < num_blocks; ++i) -	{ -		titem->unpackMessage(msg, _PREHASH_InventoryData, i); -		if (!(titem->getUUID().isNull())) -		{ -			//we don't do anything with null keys -			mAdded.push_back(titem->getUUID()); -		} -	} -	if (!mAdded.empty()) -	{ -		done(); -	} -} - -LLInventoryTransactionObserver::LLInventoryTransactionObserver( -	const LLTransactionID& transaction_id) : -	mTransactionID(transaction_id) -{ -} - -void LLInventoryTransactionObserver::changed(U32 mask) -{ -	if(mask & LLInventoryObserver::ADD) -	{ -		// This could be it - see if we are processing a bulk update -		LLMessageSystem* msg = gMessageSystem; -		if(msg->getMessageName() -		   && (0 == strcmp(msg->getMessageName(), "BulkUpdateInventory"))) -		{ -			// we have a match for the message - now check the -			// transaction id. -			LLUUID id; -			msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TransactionID, id); -			if(id == mTransactionID) -			{ -				// woo hoo, we found it -				folder_ref_t folders; -				item_ref_t items; -				S32 count; -				count = msg->getNumberOfBlocksFast(_PREHASH_FolderData); -				S32 i; -				for(i = 0; i < count; ++i) -				{ -					msg->getUUIDFast(_PREHASH_FolderData, _PREHASH_FolderID, id, i); -					if(id.notNull()) -					{ -						folders.push_back(id); -					} -				} -				count = msg->getNumberOfBlocksFast(_PREHASH_ItemData); -				for(i = 0; i < count; ++i) -				{ -					msg->getUUIDFast(_PREHASH_ItemData, _PREHASH_ItemID, id, i); -					if(id.notNull()) -					{ -						items.push_back(id); -					} -				} - -				// call the derived class the implements this method. -				done(folders, items); -			} -		} -	} -} - -  ///----------------------------------------------------------------------------  /// LLAssetIDMatches   ///---------------------------------------------------------------------------- diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index faf026887a..bd64591194 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -41,40 +41,27 @@  #include "lluuid.h"  #include "llpermissionsflags.h"  #include "llstring.h" -  #include <map>  #include <set>  #include <string>  #include <vector> -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryObserver -// -// This class is designed to be a simple abstract base class which can -// relay messages when the inventory changes. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ! REFACTOR ! Remove llinventoryobservers.h and have other files that need it explicitly  +// include llinventoryobservers.h instead of llinventorymodel.h .  This will reduce dependency on +// llinventorymodel.h. +#include "llinventoryobserver.h"  + +class LLInventoryObserver; +class LLInventoryObject; +class LLInventoryItem; +class LLInventoryCategory; +class LLViewerInventoryItem; +class LLViewerInventoryCategory; +class LLViewerInventoryItem; +class LLViewerInventoryCategory; +class LLMessageSystem; +class LLInventoryCollectFunctor; -class LLInventoryObserver -{ -public: -	// This enumeration is a way to refer to what changed in a more -	// human readable format. You can mask the value provided by -	// chaged() to see if the observer is interested in the change. -	enum  -	{ -		NONE = 0, -		LABEL = 1,			// name changed -		INTERNAL = 2,		// internal change, eg, asset uuid different -		ADD = 4,			// something added -		REMOVE = 8,			// something deleted -		STRUCTURE = 16,		// structural change, eg, item or folder moved -		CALLING_CARD = 32,	// online, grant status, cancel, etc change -		ALL = 0xffffffff -	}; -	virtual ~LLInventoryObserver() {}; -	virtual void changed(U32 mask) = 0; -	std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328] -};  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  // Class LLInventoryModel @@ -87,16 +74,6 @@ public:  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLInventoryObject; -class LLInventoryItem; -class LLInventoryCategory; -class LLViewerInventoryItem; -class LLViewerInventoryCategory; -class LLViewerInventoryItem; -class LLViewerInventoryCategory; -class LLMessageSystem; -class LLInventoryCollectFunctor; -  class LLInventoryModel  {  public: @@ -473,23 +450,12 @@ protected:  	cat_array_t* getUnlockedCatArray(const LLUUID& id);  	item_array_t* getUnlockedItemArray(const LLUUID& id); -protected: +private:  	// Variables used to track what has changed since the last notify.  	U32 mModifyMask;  	typedef std::set<LLUUID> changed_items_t;  	changed_items_t mChangedItemIDs; -	// Information for tracking the actual inventory. We index this -	// information in a lot of different ways so we can access -	// the inventory using several different identifiers. -	// mInventory member data is the 'master' list of inventory, and -	// mCategoryMap and mItemMap store uuid->object mappings.  -	typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t; -	typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t; -	//inv_map_t mInventory; -	cat_map_t mCategoryMap; -	item_map_t mItemMap; -  	std::map<LLUUID, bool> mCategoryLock;  	std::map<LLUUID, bool> mItemLock; @@ -525,6 +491,21 @@ protected:  	// This flag is used to handle an invalid inventory state.  	bool mIsAgentInvUsable; +private: +	// Information for tracking the actual inventory. We index this +	// information in a lot of different ways so we can access +	// the inventory using several different identifiers. +	// mInventory member data is the 'master' list of inventory, and +	// mCategoryMap and mItemMap store uuid->object mappings.  +	typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t; +	typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t; +	//inv_map_t mInventory; +	cat_map_t mCategoryMap; +	item_map_t mItemMap; + +	// Flag set when notifyObservers is being called, to look for bugs +	// where it's called recursively. +	BOOL mIsNotifyObservers;  public:  	// *NOTE: DEBUG functionality  	void dumpInventory() const; @@ -767,183 +748,5 @@ public:  							LLInventoryItem* item);  }; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryCompletionObserver -// -// Class which can be used as a base class for doing something when -// when all observed items are locally complete. This class implements -// the changed() method of LLInventoryObserver and declares a new -// method named done() which is called when all watched items have -// complete information in the inventory model. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLInventoryCompletionObserver : public LLInventoryObserver -{ -public: -	LLInventoryCompletionObserver() {} -	virtual void changed(U32 mask); - -	void watchItem(const LLUUID& id); - -protected: -	virtual void done() = 0; - -	typedef std::vector<LLUUID> item_ref_t; -	item_ref_t mComplete; -	item_ref_t mIncomplete; -}; - - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryFetchObserver -// -// This class is much like the LLInventoryCompletionObserver, except -// that it handles all the the fetching necessary. Override the done() -// method to do the thing you want. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLInventoryFetchObserver : public LLInventoryObserver -{ -public: -	LLInventoryFetchObserver() {} -	virtual void changed(U32 mask); - -	typedef std::vector<LLUUID> item_ref_t; - -	bool isEverythingComplete() const; -	void fetchItems(const item_ref_t& ids); -	virtual void done() = 0; - -protected: -	item_ref_t mComplete; -	item_ref_t mIncomplete; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryFetchDescendentsObserver -// -// This class is much like the LLInventoryCompletionObserver, except -// that it handles fetching based on category. Override the done() -// method to do the thing you want. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLInventoryFetchDescendentsObserver : public LLInventoryObserver -{ -public: -	LLInventoryFetchDescendentsObserver() {} -	virtual void changed(U32 mask); - -	typedef std::vector<LLUUID> folder_ref_t; -	void fetchDescendents(const folder_ref_t& ids); -	bool isEverythingComplete() const; -	virtual void done() = 0; - -protected: -	bool isComplete(LLViewerInventoryCategory* cat); -	folder_ref_t mIncompleteFolders; -	folder_ref_t mCompleteFolders; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryFetchComboObserver -// -// This class does an appropriate combination of fetch descendents and -// item fetches based on completion of categories and items. Much like -// the fetch and fetch descendents, this will call done() when everything -// has arrived. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLInventoryFetchComboObserver : public LLInventoryObserver -{ -public: -	LLInventoryFetchComboObserver() : mDone(false) {} -	virtual void changed(U32 mask); - -	typedef std::vector<LLUUID> folder_ref_t; -	typedef std::vector<LLUUID> item_ref_t; -	void fetch(const folder_ref_t& folder_ids, const item_ref_t& item_ids); - -	virtual void done() = 0; - -protected: -	bool mDone; -	folder_ref_t mCompleteFolders; -	folder_ref_t mIncompleteFolders; -	item_ref_t mCompleteItems; -	item_ref_t mIncompleteItems; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryExistenceObserver -// -// This class is used as a base class for doing somethign when all the -// observed item ids exist in the inventory somewhere. You can derive -// a class from this class and implement the done() method to do -// something useful. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLInventoryExistenceObserver : public LLInventoryObserver -{ -public: -	LLInventoryExistenceObserver() {} -	virtual void changed(U32 mask); - -	void watchItem(const LLUUID& id); - -protected: -	virtual void done() = 0; - -	typedef std::vector<LLUUID> item_ref_t; -	item_ref_t mExist; -	item_ref_t mMIA; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryAddedObserver -// -// This class is used as a base class for doing something when  -// a new item arrives in inventory. -// It does not watch for a certain UUID, rather it acts when anything is added -// Derive a class from this class and implement the done() method to do -// something useful. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLInventoryAddedObserver : public LLInventoryObserver -{ -public: -	LLInventoryAddedObserver() : mAdded() {} -	virtual void changed(U32 mask); - -protected: -	virtual void done() = 0; - -	typedef std::vector<LLUUID> item_ref_t; -	item_ref_t mAdded; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryTransactionObserver -// -// Class which can be used as a base class for doing something when an -// inventory transaction completes. -// -// *NOTE: This class is not quite complete. Avoid using unless you fix up it's -// functionality gaps. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLInventoryTransactionObserver : public LLInventoryObserver -{ -public: -	LLInventoryTransactionObserver(const LLTransactionID& transaction_id); -	virtual void changed(U32 mask); - -protected: -	typedef std::vector<LLUUID> folder_ref_t; -	typedef std::vector<LLUUID> item_ref_t; -	virtual void done(const folder_ref_t& folders, const item_ref_t& items) = 0; - -	LLTransactionID mTransactionID; -}; - -  #endif // LL_LLINVENTORYMODEL_H diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp new file mode 100644 index 0000000000..3ccf593d27 --- /dev/null +++ b/indra/newview/llinventoryobserver.cpp @@ -0,0 +1,564 @@ +/**  + * @file llinventoryobserver.cpp + * @brief Implementation of the inventory observers used to track agent inventory. + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + *  + * Copyright (c) 2002-2009, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llinventoryobserver.h" + +#include "llassetstorage.h" +#include "llcrc.h" +#include "lldir.h" +#include "llsys.h" +#include "llxfermanager.h" +#include "message.h" + +#include "llagent.h" +#include "llagentwearables.h" +#include "llfloater.h" +#include "llfocusmgr.h" +#include "llinventorybridge.h" +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" +#include "llviewermessage.h" +#include "llviewerwindow.h" +#include "llviewerregion.h" +#include "llappviewer.h" +#include "lldbstrings.h" +#include "llviewerstats.h" +#include "llmutelist.h" +#include "llnotifications.h" +#include "llcallbacklist.h" +#include "llpreview.h" +#include "llviewercontrol.h" +#include "llvoavatarself.h" +#include "llsdutil.h" +#include <deque> + +void LLInventoryCompletionObserver::changed(U32 mask) +{ +	// scan through the incomplete items and move or erase them as +	// appropriate. +	if(!mIncomplete.empty()) +	{ +		for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); ) +		{ +			LLViewerInventoryItem* item = gInventory.getItem(*it); +			if(!item) +			{ +				it = mIncomplete.erase(it); +				continue; +			} +			if(item->isComplete()) +			{ +				mComplete.push_back(*it); +				it = mIncomplete.erase(it); +				continue; +			} +			++it; +		} +		if(mIncomplete.empty()) +		{ +			done(); +		} +	} +} + +void LLInventoryCompletionObserver::watchItem(const LLUUID& id) +{ +	if(id.notNull()) +	{ +		mIncomplete.push_back(id); +	} +} + + +void LLInventoryFetchObserver::changed(U32 mask) +{ +	// scan through the incomplete items and move or erase them as +	// appropriate. +	if(!mIncomplete.empty()) +	{ +		for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); ) +		{ +			LLViewerInventoryItem* item = gInventory.getItem(*it); +			if(!item) +			{ +				// BUG: This can cause done() to get called prematurely below. +				// This happens with the LLGestureInventoryFetchObserver that +				// loads gestures at startup. JC +				it = mIncomplete.erase(it); +				continue; +			} +			if(item->isComplete()) +			{ +				mComplete.push_back(*it); +				it = mIncomplete.erase(it); +				continue; +			} +			++it; +		} +		if(mIncomplete.empty()) +		{ +			done(); +		} +	} +	//llinfos << "LLInventoryFetchObserver::changed() mComplete size " << mComplete.size() << llendl; +	//llinfos << "LLInventoryFetchObserver::changed() mIncomplete size " << mIncomplete.size() << llendl; +} + +bool LLInventoryFetchObserver::isEverythingComplete() const +{ +	return mIncomplete.empty(); +} + +void fetch_items_from_llsd(const LLSD& items_llsd) +{ +	if (!items_llsd.size()) return; +	LLSD body; +	body[0]["cap_name"] = "FetchInventory"; +	body[1]["cap_name"] = "FetchLib"; +	for (S32 i=0; i<items_llsd.size();i++) +	{ +		if (items_llsd[i]["owner_id"].asString() == gAgent.getID().asString()) +		{ +			body[0]["items"].append(items_llsd[i]); +			continue; +		} +		if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString()) +		{ +			body[1]["items"].append(items_llsd[i]); +			continue; +		} +	} +		 +	for (S32 i=0; i<body.size(); i++) +	{ +		if (0 >= body[i].size()) continue; +		std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString()); + +		if (!url.empty()) +		{ +			body[i]["agent_id"]	= gAgent.getID(); +			LLHTTPClient::post(url, body[i], new LLInventoryModel::fetchInventoryResponder(body[i])); +			break; +		} + +		LLMessageSystem* msg = gMessageSystem; +		BOOL start_new_message = TRUE; +		for (S32 j=0; j<body[i]["items"].size(); j++) +		{ +			LLSD item_entry = body[i]["items"][j]; +			if(start_new_message) +			{ +				start_new_message = FALSE; +				msg->newMessageFast(_PREHASH_FetchInventory); +				msg->nextBlockFast(_PREHASH_AgentData); +				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); +			} +			msg->nextBlockFast(_PREHASH_InventoryData); +			msg->addUUIDFast(_PREHASH_OwnerID, item_entry["owner_id"].asUUID()); +			msg->addUUIDFast(_PREHASH_ItemID, item_entry["item_id"].asUUID()); +			if(msg->isSendFull(NULL)) +			{ +				start_new_message = TRUE; +				gAgent.sendReliableMessage(); +			} +		} +		if(!start_new_message) +		{ +			gAgent.sendReliableMessage(); +		} +	} +} + +void LLInventoryFetchObserver::fetchItems( +	const LLInventoryFetchObserver::item_ref_t& ids) +{ +	LLUUID owner_id; +	LLSD items_llsd; +	for(item_ref_t::const_iterator it = ids.begin(); it < ids.end(); ++it) +	{ +		LLViewerInventoryItem* item = gInventory.getItem(*it); +		if(item) +		{ +			if(item->isComplete()) +			{ +				// It's complete, so put it on the complete container. +				mComplete.push_back(*it); +				continue; +			} +			else +			{ +				owner_id = item->getPermissions().getOwner(); +			} +		} +		else +		{ +			// assume it's agent inventory. +			owner_id = gAgent.getID(); +		} +		 +		// It's incomplete, so put it on the incomplete container, and +		// pack this on the message. +		mIncomplete.push_back(*it); +		 +		// Prepare the data to fetch +		LLSD item_entry; +		item_entry["owner_id"] = owner_id; +		item_entry["item_id"] = (*it); +		items_llsd.append(item_entry); +	} +	fetch_items_from_llsd(items_llsd); +} + +// virtual +void LLInventoryFetchDescendentsObserver::changed(U32 mask) +{ +	for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();) +	{ +		LLViewerInventoryCategory* cat = gInventory.getCategory(*it); +		if(!cat) +		{ +			it = mIncompleteFolders.erase(it); +			continue; +		} +		if(isComplete(cat)) +		{ +			mCompleteFolders.push_back(*it); +			it = mIncompleteFolders.erase(it); +			continue; +		} +		++it; +	} +	if(mIncompleteFolders.empty()) +	{ +		done(); +	} +} + +void LLInventoryFetchDescendentsObserver::fetchDescendents( +	const folder_ref_t& ids) +{ +	for(folder_ref_t::const_iterator it = ids.begin(); it != ids.end(); ++it) +	{ +		LLViewerInventoryCategory* cat = gInventory.getCategory(*it); +		if(!cat) continue; +		if(!isComplete(cat)) +		{ +			cat->fetchDescendents();		//blindly fetch it without seeing if anything else is fetching it. +			mIncompleteFolders.push_back(*it);	//Add to list of things being downloaded for this observer. +		} +		else +		{ +			mCompleteFolders.push_back(*it); +		} +	} +} + +bool LLInventoryFetchDescendentsObserver::isEverythingComplete() const +{ +	return mIncompleteFolders.empty(); +} + +bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory* cat) +{ +	S32 version = cat->getVersion(); +	S32 descendents = cat->getDescendentCount(); +	if((LLViewerInventoryCategory::VERSION_UNKNOWN == version) +	   || (LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN == descendents)) +	{ +		return false; +	} +	// it might be complete - check known descendents against +	// currently available. +	LLInventoryModel::cat_array_t* cats; +	LLInventoryModel::item_array_t* items; +	gInventory.getDirectDescendentsOf(cat->getUUID(), cats, items); +	if(!cats || !items) +	{ +		// bit of a hack - pretend we're done if they are gone or +		// incomplete. should never know, but it would suck if this +		// kept tight looping because of a corrupt memory state. +		return true; +	} +	S32 known = cats->count() + items->count(); +	if(descendents == known) +	{ +		// hey - we're done. +		return true; +	} +	return false; +} + +void LLInventoryFetchComboObserver::changed(U32 mask) +{ +	if(!mIncompleteItems.empty()) +	{ +		for(item_ref_t::iterator it = mIncompleteItems.begin(); it < mIncompleteItems.end(); ) +		{ +			LLViewerInventoryItem* item = gInventory.getItem(*it); +			if(!item) +			{ +				it = mIncompleteItems.erase(it); +				continue; +			} +			if(item->isComplete()) +			{ +				mCompleteItems.push_back(*it); +				it = mIncompleteItems.erase(it); +				continue; +			} +			++it; +		} +	} +	if(!mIncompleteFolders.empty()) +	{ +		for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();) +		{ +			LLViewerInventoryCategory* cat = gInventory.getCategory(*it); +			if(!cat) +			{ +				it = mIncompleteFolders.erase(it); +				continue; +			} +			if(gInventory.isCategoryComplete(*it)) +			{ +				mCompleteFolders.push_back(*it); +				it = mIncompleteFolders.erase(it); +				continue; +			} +			++it; +		} +	} +	if(!mDone && mIncompleteItems.empty() && mIncompleteFolders.empty()) +	{ +		mDone = true; +		done(); +	} +} + +void LLInventoryFetchComboObserver::fetch( +	const folder_ref_t& folder_ids, +	const item_ref_t& item_ids) +{ +	lldebugs << "LLInventoryFetchComboObserver::fetch()" << llendl; +	for(folder_ref_t::const_iterator fit = folder_ids.begin(); fit != folder_ids.end(); ++fit) +	{ +		LLViewerInventoryCategory* cat = gInventory.getCategory(*fit); +		if(!cat) continue; +		if(!gInventory.isCategoryComplete(*fit)) +		{ +			cat->fetchDescendents(); +			lldebugs << "fetching folder " << *fit <<llendl; +			mIncompleteFolders.push_back(*fit); +		} +		else +		{ +			mCompleteFolders.push_back(*fit); +			lldebugs << "completing folder " << *fit <<llendl; +		} +	} + +	// Now for the items - we fetch everything which is not a direct +	// descendent of an incomplete folder because the item will show +	// up in an inventory descendents message soon enough so we do not +	// have to fetch it individually. +	LLSD items_llsd; +	LLUUID owner_id; +	for(item_ref_t::const_iterator iit = item_ids.begin(); iit != item_ids.end(); ++iit) +	{ +		LLViewerInventoryItem* item = gInventory.getItem(*iit); +		if(!item) +		{ +			lldebugs << "uanble to find item " << *iit << llendl; +			continue; +		} +		if(item->isComplete()) +		{ +			// It's complete, so put it on the complete container. +			mCompleteItems.push_back(*iit); +			lldebugs << "completing item " << *iit << llendl; +			continue; +		} +		else +		{ +			mIncompleteItems.push_back(*iit); +			owner_id = item->getPermissions().getOwner(); +		} +		if(std::find(mIncompleteFolders.begin(), mIncompleteFolders.end(), item->getParentUUID()) == mIncompleteFolders.end()) +		{ +			LLSD item_entry; +			item_entry["owner_id"] = owner_id; +			item_entry["item_id"] = (*iit); +			items_llsd.append(item_entry); +		} +		else +		{ +			lldebugs << "not worrying about " << *iit << llendl; +		} +	} +	fetch_items_from_llsd(items_llsd); +} + +void LLInventoryExistenceObserver::watchItem(const LLUUID& id) +{ +	if(id.notNull()) +	{ +		mMIA.push_back(id); +	} +} + +void LLInventoryExistenceObserver::changed(U32 mask) +{ +	// scan through the incomplete items and move or erase them as +	// appropriate. +	if(!mMIA.empty()) +	{ +		for(item_ref_t::iterator it = mMIA.begin(); it < mMIA.end(); ) +		{ +			LLViewerInventoryItem* item = gInventory.getItem(*it); +			if(!item) +			{ +				++it; +				continue; +			} +			mExist.push_back(*it); +			it = mMIA.erase(it); +		} +		if(mMIA.empty()) +		{ +			done(); +		} +	} +} + +void LLInventoryAddedObserver::changed(U32 mask) +{ +	if(!(mask & LLInventoryObserver::ADD)) +	{ +		return; +	} + +	// *HACK: If this was in response to a packet off +	// the network, figure out which item was updated. +	LLMessageSystem* msg = gMessageSystem; + +	std::string msg_name; +	if (mMessageName.empty()) +	{ +		msg_name = msg->getMessageName(); +	} +	else +	{ +		msg_name = mMessageName; +	} + +	if (msg_name.empty()) +	{ +		return; +	} +	 +	// We only want newly created inventory items. JC +	if ( msg_name != "UpdateCreateInventoryItem") +	{ +		return; +	} + +	LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; +	S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData); +	for(S32 i = 0; i < num_blocks; ++i) +	{ +		titem->unpackMessage(msg, _PREHASH_InventoryData, i); +		if (!(titem->getUUID().isNull())) +		{ +			//we don't do anything with null keys +			mAdded.push_back(titem->getUUID()); +		} +	} +	if (!mAdded.empty()) +	{ +		done(); +	} +} + +LLInventoryTransactionObserver::LLInventoryTransactionObserver( +	const LLTransactionID& transaction_id) : +	mTransactionID(transaction_id) +{ +} + +void LLInventoryTransactionObserver::changed(U32 mask) +{ +	if(mask & LLInventoryObserver::ADD) +	{ +		// This could be it - see if we are processing a bulk update +		LLMessageSystem* msg = gMessageSystem; +		if(msg->getMessageName() +		   && (0 == strcmp(msg->getMessageName(), "BulkUpdateInventory"))) +		{ +			// we have a match for the message - now check the +			// transaction id. +			LLUUID id; +			msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TransactionID, id); +			if(id == mTransactionID) +			{ +				// woo hoo, we found it +				folder_ref_t folders; +				item_ref_t items; +				S32 count; +				count = msg->getNumberOfBlocksFast(_PREHASH_FolderData); +				S32 i; +				for(i = 0; i < count; ++i) +				{ +					msg->getUUIDFast(_PREHASH_FolderData, _PREHASH_FolderID, id, i); +					if(id.notNull()) +					{ +						folders.push_back(id); +					} +				} +				count = msg->getNumberOfBlocksFast(_PREHASH_ItemData); +				for(i = 0; i < count; ++i) +				{ +					msg->getUUIDFast(_PREHASH_ItemData, _PREHASH_ItemID, id, i); +					if(id.notNull()) +					{ +						items.push_back(id); +					} +				} + +				// call the derived class the implements this method. +				done(folders, items); +			} +		} +	} +} diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h new file mode 100644 index 0000000000..384e6292e8 --- /dev/null +++ b/indra/newview/llinventoryobserver.h @@ -0,0 +1,249 @@ +/**  + * @file llinventoryobserver.h + * @brief LLInventoryObserver class header file + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + *  + * Copyright (c) 2002-2009, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLINVENTORYOBSERVERS_H +#define LL_LLINVENTORYOBSERVERS_H + +#include "lluuid.h" +#include <string> +#include <vector> + +class LLViewerInventoryCategory; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryObserver +// +// This class is designed to be a simple abstract base class which can +// relay messages when the inventory changes. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLInventoryObserver +{ +public: +	// This enumeration is a way to refer to what changed in a more +	// human readable format. You can mask the value provided by +	// chaged() to see if the observer is interested in the change. +	enum  +	{ +		NONE = 0, +		LABEL = 1,			// name changed +		INTERNAL = 2,		// internal change, eg, asset uuid different +		ADD = 4,			// something added +		REMOVE = 8,			// something deleted +		STRUCTURE = 16,		// structural change, eg, item or folder moved +		CALLING_CARD = 32,	// online, grant status, cancel, etc change +		ALL = 0xffffffff +	}; +	virtual ~LLInventoryObserver() {}; +	virtual void changed(U32 mask) = 0; +	std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328] +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryCompletionObserver +// +// Class which can be used as a base class for doing something when +// when all observed items are locally complete. This class implements +// the changed() method of LLInventoryObserver and declares a new +// method named done() which is called when all watched items have +// complete information in the inventory model. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLInventoryCompletionObserver : public LLInventoryObserver +{ +public: +	LLInventoryCompletionObserver() {} +	virtual void changed(U32 mask); + +	void watchItem(const LLUUID& id); + +protected: +	virtual void done() = 0; + +	typedef std::vector<LLUUID> item_ref_t; +	item_ref_t mComplete; +	item_ref_t mIncomplete; +}; + + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryFetchObserver +// +// This class is much like the LLInventoryCompletionObserver, except +// that it handles all the the fetching necessary. Override the done() +// method to do the thing you want. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLInventoryFetchObserver : public LLInventoryObserver +{ +public: +	LLInventoryFetchObserver() {} +	virtual void changed(U32 mask); + +	typedef std::vector<LLUUID> item_ref_t; + +	bool isEverythingComplete() const; +	void fetchItems(const item_ref_t& ids); +	virtual void done() = 0; + +protected: +	item_ref_t mComplete; +	item_ref_t mIncomplete; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryFetchDescendentsObserver +// +// This class is much like the LLInventoryCompletionObserver, except +// that it handles fetching based on category. Override the done() +// method to do the thing you want. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLInventoryFetchDescendentsObserver : public LLInventoryObserver +{ +public: +	LLInventoryFetchDescendentsObserver() {} +	virtual void changed(U32 mask); + +	typedef std::vector<LLUUID> folder_ref_t; +	void fetchDescendents(const folder_ref_t& ids); +	bool isEverythingComplete() const; +	virtual void done() = 0; + +protected: +	bool isComplete(LLViewerInventoryCategory* cat); +	folder_ref_t mIncompleteFolders; +	folder_ref_t mCompleteFolders; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryFetchComboObserver +// +// This class does an appropriate combination of fetch descendents and +// item fetches based on completion of categories and items. Much like +// the fetch and fetch descendents, this will call done() when everything +// has arrived. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLInventoryFetchComboObserver : public LLInventoryObserver +{ +public: +	LLInventoryFetchComboObserver() : mDone(false) {} +	virtual void changed(U32 mask); + +	typedef std::vector<LLUUID> folder_ref_t; +	typedef std::vector<LLUUID> item_ref_t; +	void fetch(const folder_ref_t& folder_ids, const item_ref_t& item_ids); + +	virtual void done() = 0; + +protected: +	bool mDone; +	folder_ref_t mCompleteFolders; +	folder_ref_t mIncompleteFolders; +	item_ref_t mCompleteItems; +	item_ref_t mIncompleteItems; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryExistenceObserver +// +// This class is used as a base class for doing somethign when all the +// observed item ids exist in the inventory somewhere. You can derive +// a class from this class and implement the done() method to do +// something useful. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLInventoryExistenceObserver : public LLInventoryObserver +{ +public: +	LLInventoryExistenceObserver() {} +	virtual void changed(U32 mask); + +	void watchItem(const LLUUID& id); + +protected: +	virtual void done() = 0; + +	typedef std::vector<LLUUID> item_ref_t; +	item_ref_t mExist; +	item_ref_t mMIA; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryAddedObserver +// +// This class is used as a base class for doing something when  +// a new item arrives in inventory. +// It does not watch for a certain UUID, rather it acts when anything is added +// Derive a class from this class and implement the done() method to do +// something useful. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLInventoryAddedObserver : public LLInventoryObserver +{ +public: +	LLInventoryAddedObserver() : mAdded() {} +	virtual void changed(U32 mask); + +protected: +	virtual void done() = 0; + +	typedef std::vector<LLUUID> item_ref_t; +	item_ref_t mAdded; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryTransactionObserver +// +// Class which can be used as a base class for doing something when an +// inventory transaction completes. +// +// *NOTE: This class is not quite complete. Avoid using unless you fix up it's +// functionality gaps. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLInventoryTransactionObserver : public LLInventoryObserver +{ +public: +	LLInventoryTransactionObserver(const LLTransactionID& transaction_id); +	virtual void changed(U32 mask); + +protected: +	typedef std::vector<LLUUID> folder_ref_t; +	typedef std::vector<LLUUID> item_ref_t; +	virtual void done(const folder_ref_t& folders, const item_ref_t& items) = 0; + +	LLTransactionID mTransactionID; +}; + + +#endif // LL_LLINVENTORYOBSERVERS_H + diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 9a71e53441..97f90ac845 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -139,6 +139,7 @@ BOOL LLInventoryPanel::postBuild()  		p.name = getName();
  		p.rect = folder_rect;
  		p.parent_panel = this;
 +		p.tool_tip = p.name;
  		mFolders = LLUICtrlFactory::create<LLFolderView>(p);
  		mFolders->setAllowMultiSelect(mAllowMultiSelect);
  	}
 @@ -191,11 +192,9 @@ BOOL LLInventoryPanel::postBuild()  	{
  		rebuildViewsFor(mStartFolderID);
  		mHasInventoryConnection = true;
 +		defaultOpenInventory();
  	}
 -	// bit of a hack to make sure the inventory is open.
 -	mFolders->openFolder(preferred_type != LLFolderType::FT_NONE ? LLViewerFolderType::lookupNewCategoryName(preferred_type) : "My Inventory");
 -
  	if (mSortOrderSetting != INHERIT_SORT_ORDER)
  	{
  		setSortOrder(gSavedSettings.getU32(mSortOrderSetting));
 @@ -300,6 +299,7 @@ void LLInventoryPanel::modelChanged(U32 mask)  	{
  		rebuildViewsFor(mStartFolderID);
  		mHasInventoryConnection = true;
 +		defaultOpenInventory();
  		return;
  	}
 @@ -493,6 +493,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)  					p.icon = new_listener->getIcon();
  					p.root = mFolders;
  					p.listener = new_listener;
 +					p.tool_tip = p.name;
  					LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p);
  					folderp->setItemSortOrder(mFolders->getSortOrder());
 @@ -519,6 +520,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)  					params.root(mFolders);
  					params.listener(new_listener);
  					params.rect(LLRect (0, 0, 0, 0));
 +					params.tool_tip = params.name;
  					itemp = LLUICtrlFactory::create<LLFolderViewItem> (params);
  				}
  			}
 @@ -561,6 +563,25 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)  	}
  }
 +// bit of a hack to make sure the inventory is open.
 +void LLInventoryPanel::defaultOpenInventory()
 +{
 +	const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString);
 +	if (preferred_type != LLFolderType::FT_NONE)
 +	{
 +		const std::string& top_level_folder_name = LLViewerFolderType::lookupNewCategoryName(preferred_type);
 +		mFolders->openFolder(top_level_folder_name);
 +	}
 +	else
 +	{
 +		// Get the first child (it should be "My Inventory") and
 +		// open it up by name (just to make sure the first child is actually a folder).
 +		LLView* first_child = mFolders->getFirstChild();
 +		const std::string& first_child_name = first_child->getName();
 +		mFolders->openFolder(first_child_name);
 +	}
 +}
 +
  struct LLConfirmPurgeData
  {
  	LLUUID mID;
 diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 9f74fad5c1..e398c44105 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -165,7 +165,7 @@ protected:  	// Given the id and the parent, build all of the folder views.  	void rebuildViewsFor(const LLUUID& id);  	virtual void buildNewViews(const LLUUID& id); // made virtual to support derived classes. EXT-719 - +	void defaultOpenInventory(); // open the first level of inventory  protected:  	LLInventoryModel*			mInventory;  	LLInventoryObserver*		mInventoryObserver; diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index e5f347ddc4..955347bce2 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -182,6 +182,9 @@ void LLLoginInstance::constructAuthParams(const LLSD& credentials)  	mRequestData["method"] = "login_to_simulator";  	mRequestData["params"] = request_params;  	mRequestData["options"] = requested_options; + +	mRequestData["cfg_srv_timeout"] = gSavedSettings.getF32("LoginSRVTimeout"); +	mRequestData["cfg_srv_pump"] = gSavedSettings.getString("LoginSRVPump");  }  bool LLLoginInstance::handleLoginEvent(const LLSD& event) diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index ac806d7106..85db69174d 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -132,120 +132,31 @@ void    LLNearbyChat::applySavedVariables()  	}  } -LLColor4 nearbychat_get_text_color(const LLChat& chat) -{ -	LLColor4 text_color; - -	if(chat.mMuted) -	{ -		text_color.setVec(0.8f, 0.8f, 0.8f, 1.f); -	} -	else -	{ -		switch(chat.mSourceType) -		{ -		case CHAT_SOURCE_SYSTEM: -			text_color = LLUIColorTable::instance().getColor("SystemChatColor");  -			break; -		case CHAT_SOURCE_AGENT: -		    if (chat.mFromID.isNull()) -			{ -				text_color = LLUIColorTable::instance().getColor("SystemChatColor"); -			} -			else -			{ -				if(gAgentID == chat.mFromID) -				{ -					text_color = LLUIColorTable::instance().getColor("UserChatColor"); -				} -				else -				{ -					text_color = LLUIColorTable::instance().getColor("AgentChatColor"); -				} -			} -			break; -		case CHAT_SOURCE_OBJECT: -			if (chat.mChatType == CHAT_TYPE_DEBUG_MSG) -			{ -				text_color = LLUIColorTable::instance().getColor("ScriptErrorColor"); -			} -			else if ( chat.mChatType == CHAT_TYPE_OWNER ) -			{ -				text_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor"); -			} -			else -			{ -				text_color = LLUIColorTable::instance().getColor("ObjectChatColor"); -			} -			break; -		default: -			text_color.setToWhite(); -		} - -		if (!chat.mPosAgent.isExactlyZero()) -		{ -			LLVector3 pos_agent = gAgent.getPositionAgent(); -			F32 distance = dist_vec(pos_agent, chat.mPosAgent); -			if (distance > gAgent.getNearChatRadius()) -			{ -				// diminish far-off chat -				text_color.mV[VALPHA] = 0.8f; -			} -		} -	} - -	return text_color; -} - -void LLNearbyChat::add_timestamped_line(const LLChat& chat, const LLColor4& color) -{ -	S32 font_size = gSavedSettings.getS32("ChatFontSize"); - -	const LLFontGL* fontp = NULL; -	switch(font_size) -	{ -	case 0: -		fontp = LLFontGL::getFontSansSerifSmall(); -		break; -	default: -	case 1: -		fontp = LLFontGL::getFontSansSerif(); -		break; -	case 2: -		fontp = LLFontGL::getFontSansSerifBig(); -		break; -	} - -	LLStyle::Params style_params; -	style_params.color(color); -	style_params.font(fontp); -	LLUUID uuid = chat.mFromID; -	std::string from = chat.mFromName; -	std::string message = chat.mText; -	mChatHistory->appendWidgetMessage(chat, style_params); -} -  void	LLNearbyChat::addMessage(const LLChat& chat)  { -	LLColor4 color = nearbychat_get_text_color(chat); -	  	if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)  	{  		if(gSavedSettings.getBOOL("ShowScriptErrors") == FALSE)  			return;  		if (gSavedSettings.getS32("ShowScriptErrorsLocation")== 1)// show error in window //("ScriptErrorsAsChat"))  		{ + +			LLColor4 txt_color; + +			LLViewerChat::getChatColor(chat,txt_color); +			  			LLFloaterScriptDebug::addScriptLine(chat.mText,  												chat.mFromName,  -												color,  +												txt_color,   												chat.mFromID);  			return;  		}  	} -	// could flash the chat button in the status bar here. JC  	if (!chat.mMuted) -		add_timestamped_line(chat, color); +	{ +		mChatHistory->appendWidgetMessage(chat); +	}  }  void LLNearbyChat::onNearbySpeakers() diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index cb4654654a..3303c388af 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -35,7 +35,7 @@  #include "lldockablefloater.h"  #include "llscrollbar.h" -#include "llchat.h" +#include "llviewerchat.h"  class LLResizeBar;  class LLChatHistory; @@ -47,8 +47,7 @@ public:  	~LLNearbyChat();  	BOOL	postBuild			(); -	void	addMessage			(const LLChat& message); -	 +	void	addMessage			(const LLChat& message);	  	void	onNearbyChatContextMenuItemClicked(const LLSD& userdata);  	bool	onNearbyChatCheckContextMenuItem(const LLSD& userdata); @@ -64,7 +63,6 @@ private:  	void	getAllowedRect		(LLRect& rect);  	void	onNearbySpeakers	(); -	void	add_timestamped_line(const LLChat& chat, const LLColor4& color);  private: diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index d54545971b..94b8791147 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -36,7 +36,6 @@  #include "lltrans.h"  #include "llnearbychatbar.h" -#include "llspeakbutton.h"  #include "llbottomtray.h"  #include "llagent.h"  #include "llgesturemgr.h" @@ -234,14 +233,6 @@ BOOL LLNearbyChatBar::postBuild()  	mOutputMonitor = getChild<LLOutputMonitorCtrl>("chat_zone_indicator");  	mOutputMonitor->setVisible(FALSE); -	mSpeakBtn = getParent()->getChild<LLSpeakButton>("talk"); - -	// Speak button should be initially disabled because -	// it takes some time between logging in to world and connecting to voice channel. -	mSpeakBtn->setEnabled(FALSE); - -	// Registering Chat Bar to receive Voice client status change notifications. -	gVoiceClient->addObserver(this);  	return TRUE;  } @@ -260,6 +251,8 @@ bool LLNearbyChatBar::instanceExists()  void LLNearbyChatBar::draw()  { +// TODO: mantipov: remove +/*  	LLRect rect = getRect();  	S32 max_width = getMaxWidth(); @@ -269,6 +262,7 @@ void LLNearbyChatBar::draw()  		reshape(rect.getWidth(), rect.getHeight(), FALSE);  		setRect(rect);  	} +*/  	displaySpeakingIndicator();  	LLPanel::draw(); @@ -730,27 +724,6 @@ public:  	}  }; -void LLNearbyChatBar::onChange(EStatusType status, const std::string &channelURI, bool proximal) -{ -	// Time it takes to connect to voice channel might be pretty long, -	// so don't expect user login or STATUS_VOICE_ENABLED to be followed by STATUS_JOINED. -	BOOL enable = FALSE; - -	switch (status) -	{ -	// Do not add STATUS_VOICE_ENABLED because voice chat is  -	// inactive until STATUS_JOINED -	case STATUS_JOINED: -		enable = TRUE; -		break; -	default: -		enable = FALSE; -		break; -	} - -	mSpeakBtn->setEnabled(enable); -} -  // Creating the object registers with the dispatcher.  LLChatHandler gChatHandler; diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index 56ee706a97..224118e088 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -42,9 +42,6 @@  #include "llspeakers.h" -class LLSpeakButton; - -  class LLGestureComboBox  	: public LLComboBox  	, public LLGestureManagerObserver @@ -76,7 +73,6 @@ protected:  class LLNearbyChatBar  :	public LLPanel -,   public LLVoiceClientStatusObserver  {  public:  	// constructor for inline chat-bars (e.g. hosted in chat history window) @@ -105,11 +101,6 @@ public:  	S32 getMinWidth() const;  	S32 getMaxWidth() const; -	/** -	 * Implements LLVoiceClientStatusObserver::onChange() -	 */ -	/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal); -  protected:  	static BOOL matchChatTypeTrigger(const std::string& in_str, std::string* out_str);  	static void onChatBoxKeystroke(LLLineEditor* caller, void* userdata); @@ -127,7 +118,6 @@ protected:  	static S32 sLastSpecialChatChannel;  	LLLineEditor*		mChatBox; -	LLSpeakButton*		mSpeakBtn;  	LLOutputMonitorCtrl* mOutputMonitor;  	LLLocalSpeakerMgr*  mSpeakerMgr;  }; diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index e10c506f08..e6665a935e 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -223,7 +223,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)  void LLNearbyChatScreenChannel::arrangeToasts()  { -	if(m_active_toasts.size() == 0 || mIsHovering) +	if(m_active_toasts.size() == 0 || isHovering())  		return;  	hideToastsFromScreen(); @@ -351,7 +351,14 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg)  		notification["time"] = chat_msg.mTime;  		notification["source"] = (S32)chat_msg.mSourceType;  		notification["chat_type"] = (S32)chat_msg.mChatType; - +		 +		std::string r_color_name = "White"; +		F32 r_color_alpha = 1.0f;  +		LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha); +		 +		notification["text_color"] = r_color_name; +		notification["color_alpha"] = r_color_alpha; +		notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;  		channel->addNotification(notification);	  	} diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 4286582cdc..6145588df2 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -155,11 +155,9 @@ void LLNetMap::draw()  	F32 rotation = 0;  	{ -		LLGLEnable scissor(GL_SCISSOR_TEST); -		 +		LLLocalClipRect clip(getLocalRect());  		{  			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -			LLLocalClipRect clip(getLocalRect());  			glMatrixMode(GL_MODELVIEW); diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index 1bf7be1c4e..471dd28426 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -95,14 +95,9 @@ bool LLOfferHandler::processNotification(const LLSD& notify)  		LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, notification->getPayload()["from_id"]);  		if (!LLIMMgr::instance().hasSession(session_id))  		{ -			// create session with faked type to avoid creating chicklets  			session_id = LLIMMgr::instance().addSession(  					notification->getSubstitutions()["NAME"], IM_NOTHING_SPECIAL,  					notification->getPayload()["from_id"]); -			if (session_id != LLUUID::null) -			{ -				LLIMFloater::show(session_id); -			}  		}  		LLIMMgr::instance().addMessage(session_id, LLUUID(),  				notification->getSubstitutions()["NAME"], diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index 823c92a94e..60a27d5154 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -91,6 +91,7 @@ bool LLTipHandler::processNotification(const LLSD& notify)  		if(nearby_chat)  		{  			LLChat chat_msg(notification->getMessage()); +			chat_msg.mSourceType = CHAT_SOURCE_SYSTEM;  			nearby_chat->addMessage(chat_msg);  			// don't show toast if Nearby Chat is opened diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index 5679233844..67a2704501 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -1167,7 +1167,9 @@ LLPanelClassifiedInfo* LLPanelClassifiedInfo::create()  BOOL LLPanelClassifiedInfo::postBuild()  { -	childSetAction("back_btn", boost::bind(&LLPanelClassifiedInfo::onExit, this), NULL); +	childSetAction("back_btn", boost::bind(&LLPanelClassifiedInfo::onExit, this)); +	childSetAction("show_on_map_btn", boost::bind(&LLPanelClassifiedInfo::onMapClick, this)); +	childSetAction("teleport_btn", boost::bind(&LLPanelClassifiedInfo::onTeleportClick, this));  	return TRUE;  } @@ -1177,6 +1179,11 @@ void LLPanelClassifiedInfo::setExitCallback(const commit_callback_t& cb)  	getChild<LLButton>("back_btn")->setClickedCallback(cb);  } +void LLPanelClassifiedInfo::setEditClassifiedCallback(const commit_callback_t& cb) +{ +	getChild<LLButton>("edit_btn")->setClickedCallback(cb); +} +  void LLPanelClassifiedInfo::onOpen(const LLSD& key)  {  	LLUUID avatar_id = key["avatar_id"]; @@ -1216,6 +1223,7 @@ void LLPanelClassifiedInfo::processProperties(void* data, EAvatarProcessorType t  			setDescription(c_info->description);  			setSnapshotId(c_info->snapshot_id);  			setParcelId(c_info->parcel_id); +			setPosGlobal(c_info->pos_global);  			setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global));  			childSetValue("category", LLClassifiedInfo::sCategories[c_info->category]); @@ -1325,6 +1333,21 @@ std::string LLPanelClassifiedInfo::createLocationText(  	return location_text;  } +void LLPanelClassifiedInfo::onMapClick() +{ +	LLFloaterWorldMap::getInstance()->trackLocation(getPosGlobal()); +	LLFloaterReg::showInstance("world_map", "center"); +} + +void LLPanelClassifiedInfo::onTeleportClick() +{ +	if (!getPosGlobal().isExactlyZero()) +	{ +		gAgent.teleportViaLocation(getPosGlobal()); +		LLFloaterWorldMap::getInstance()->trackLocation(getPosGlobal()); +	} +} +  void LLPanelClassifiedInfo::onExit()  {  	LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this); diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h index 187bdbb37e..8b32495854 100644 --- a/indra/newview/llpanelclassified.h +++ b/indra/newview/llpanelclassified.h @@ -249,7 +249,9 @@ public:  	void setInfoLoaded(bool loaded) { mInfoLoaded = loaded; } -	virtual void setExitCallback(const commit_callback_t& cb); +	void setExitCallback(const commit_callback_t& cb); + +	void setEditClassifiedCallback(const commit_callback_t& cb);  protected: @@ -264,9 +266,8 @@ protected:  		const std::string& sim_name,   		const LLVector3d& pos_global); -	void onClickMap(); -	void onClickTeleport(); -	void onClickBack(); +	void onMapClick(); +	void onTeleportClick();  	void onExit();  private: diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 88aad4923d..7b5b232ad2 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -2383,12 +2383,8 @@ BOOL LLPanelGroupActionsSubTab::postBuildSubTab(LLView* root)  void LLPanelGroupActionsSubTab::activate()  {  	LLPanelGroupSubTab::activate(); -	lldebugs << "LLPanelGroupActionsSubTab::activate()" << llendl; -	mActionList->deselectAllItems(); -	mActionMembers->deleteAllItems(); -	mActionRoles->deleteAllItems(); -	mActionDescription->clear(); +	update(GC_ALL);  }  void LLPanelGroupActionsSubTab::deactivate() diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index 5a0c1164de..9cd949c9cc 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -174,14 +174,26 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)  	getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(mAvatarID); -	// Fetch the currect name -	gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4)); - -	// Disable profile button if participant is not realy SL avatar +	// Disable most profile buttons if the participant is +	// not really an SL avatar (e.g., an Avaline caller).  	LLIMModel::LLIMSession* im_session =  		im_model.findIMSession(session_id);  	if( im_session && !im_session->mOtherParticipantIsAvatar ) +	{  		childSetEnabled("view_profile_btn", FALSE); +		childSetEnabled("add_friend_btn", FALSE); + +		childSetEnabled("share_btn", FALSE); +		childSetEnabled("teleport_btn", FALSE); +		childSetEnabled("pay_btn", FALSE); + +        getChild<LLTextBox>("avatar_name")->setValue(im_session->mName);
 +	} +	else +	{ +		// If the participant is an avatar, fetch the currect name +		gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4)); +	}  }  void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group) diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 15a75cb930..e3b2ab77aa 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -204,11 +204,6 @@ void LLPanelMainInventory::initListCommandsHandlers()  	mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));
  	mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));
  	mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
 -	/*
 -	mListCommands->getChild<LLButton>("add_btn")->setHeldDownCallback(boost::bind(&LLPanelMainInventory::onAddButtonHeldDown, this));
 -	static const LLSD add_landmark_command("add_landmark");
 -	mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddAction, this, add_landmark_command));
 -	*/
  	LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
  	trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this
 diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index a5e9407a41..b1fbf789c6 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -1570,6 +1570,7 @@ void LLPanelObjectInventory::reset()  	p.name = "task inventory";  	p.task_id = getTaskUUID();  	p.parent_panel = this; +	p.tool_tip= p.name;  	mFolders = LLUICtrlFactory::create<LLFolderView>(p);  	// this ensures that we never say "searching..." or "no items found"  	mFolders->getFilter()->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS); @@ -1711,6 +1712,7 @@ void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root  		p.icon_open = LLUI::getUIImage("Inv_FolderOpen");  		p.root = mFolders;  		p.listener = bridge; +		p.tool_tip = p.name;  		new_folder = LLUICtrlFactory::create<LLFolderViewFolder>(p);  		new_folder->addToFolder(mFolders, mFolders);  		new_folder->toggleOpen(); @@ -1751,6 +1753,7 @@ void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* invento  				p.icon_open = LLUI::getUIImage("Inv_FolderOpen");  				p.root = mFolders;  				p.listener = bridge; +				p.tool_tip = p.name;  				view = LLUICtrlFactory::create<LLFolderViewFolder>(p);  				child_categories.put(new obj_folder_pair(obj,  														 (LLFolderViewFolder*)view)); @@ -1764,6 +1767,7 @@ void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* invento  				params.root(mFolders);  				params.listener(bridge);  				params.rect(LLRect()); +				params.tool_tip = params.name;  				view = LLUICtrlFactory::create<LLFolderViewItem> (params);  			}  			view->addToFolder(folder, mFolders); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 9ba94c8ca9..2bbb2b7153 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -1193,7 +1193,7 @@ void LLPanelPeople::onCallButtonClicked()  	if (selected_uuids.size() == 1)  	{  		// initiate a P2P voice chat with the selected user -		LLAvatarActions::startCall(selected_uuids[0]); +		LLAvatarActions::startCall(getCurrentItemID());  	}  	else if (selected_uuids.size() > 1)  	{ diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index c30658755a..6905c7e546 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -687,6 +687,10 @@ void LLPanelPicks::onPanelClassifiedSave(LLPanelClassifiedEdit* panel)  		c_item->setRightMouseUpCallback(boost::bind(&LLPanelPicks::onRightMouseUpItem, this, _1, _2, _3, _4));  		c_item->setMouseUpCallback(boost::bind(&LLPanelPicks::updateButtons, this));  		c_item->childSetAction("info_chevron", boost::bind(&LLPanelPicks::onClickInfo, this)); + +		// order does matter, showAccordion will invoke arrange for accordions. +		mClassifiedsAccTab->changeOpenClose(false); +		showAccordion("tab_classifieds", true);  	}  	else   	{ @@ -740,6 +744,7 @@ void LLPanelPicks::createClassifiedInfoPanel()  	{  		mPanelClassifiedInfo = LLPanelClassifiedInfo::create();  		mPanelClassifiedInfo->setExitCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedInfo)); +		mPanelClassifiedInfo->setEditClassifiedCallback(boost::bind(&LLPanelPicks::onPanelClassifiedEdit, this));  		mPanelClassifiedInfo->setVisible(FALSE);  	}  } diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 5c3c260549..24de2dcdfc 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -118,21 +118,33 @@ LLPanelPrimMediaControls::~LLPanelPrimMediaControls()  BOOL LLPanelPrimMediaControls::postBuild()  {  	LLButton* scroll_up_ctrl = getChild<LLButton>("scrollup"); -	scroll_up_ctrl->setClickedCallback(onScrollUp, this); -	scroll_up_ctrl->setHeldDownCallback(onScrollUpHeld, this); -	scroll_up_ctrl->setMouseUpCallback(onScrollStop, this); +	if (scroll_up_ctrl) +	{ +		scroll_up_ctrl->setClickedCallback(onScrollUp, this); +		scroll_up_ctrl->setHeldDownCallback(onScrollUpHeld, this); +		scroll_up_ctrl->setMouseUpCallback(onScrollStop, this); +	}  	LLButton* scroll_left_ctrl = getChild<LLButton>("scrollleft"); -	scroll_left_ctrl->setClickedCallback(onScrollLeft, this); -	scroll_left_ctrl->setHeldDownCallback(onScrollLeftHeld, this); -	scroll_left_ctrl->setMouseUpCallback(onScrollStop, this); +	if (scroll_left_ctrl) +	{ +		scroll_left_ctrl->setClickedCallback(onScrollLeft, this); +		scroll_left_ctrl->setHeldDownCallback(onScrollLeftHeld, this); +		scroll_left_ctrl->setMouseUpCallback(onScrollStop, this); +	}  	LLButton* scroll_right_ctrl = getChild<LLButton>("scrollright"); -	scroll_right_ctrl->setClickedCallback(onScrollRight, this); -	scroll_right_ctrl->setHeldDownCallback(onScrollRightHeld, this); -	scroll_right_ctrl->setMouseUpCallback(onScrollStop, this); +	if (scroll_right_ctrl) +	{ +		scroll_right_ctrl->setClickedCallback(onScrollRight, this); +		scroll_right_ctrl->setHeldDownCallback(onScrollRightHeld, this); +		scroll_right_ctrl->setMouseUpCallback(onScrollStop, this); +	}  	LLButton* scroll_down_ctrl = getChild<LLButton>("scrolldown"); -	scroll_down_ctrl->setClickedCallback(onScrollDown, this); -	scroll_down_ctrl->setHeldDownCallback(onScrollDownHeld, this); -	scroll_down_ctrl->setMouseUpCallback(onScrollStop, this); +	if (scroll_down_ctrl) +	{ +		scroll_down_ctrl->setClickedCallback(onScrollDown, this); +		scroll_down_ctrl->setHeldDownCallback(onScrollDownHeld, this); +		scroll_down_ctrl->setMouseUpCallback(onScrollStop, this); +	}  	LLUICtrl* media_address	= getChild<LLUICtrl>("media_address");  	media_address->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this )); @@ -326,11 +338,14 @@ void LLPanelPrimMediaControls::updateShape()  			whitelist_icon->setVisible(false);  			secure_lock_icon->setVisible(false); -			scroll_up_ctrl->setVisible(false); -			scroll_left_ctrl->setVisible(false); -			scroll_right_ctrl->setVisible(false); -			scroll_down_ctrl->setVisible(false); -			media_panel_scroll->setVisible(false); +			if (media_panel_scroll) +			{ +				media_panel_scroll->setVisible(false); +				scroll_up_ctrl->setVisible(false); +				scroll_left_ctrl->setVisible(false); +				scroll_right_ctrl->setVisible(false); +				scroll_down_ctrl->setVisible(false); +			}  			F32 volume = media_impl->getVolume();  			// movie's url changed @@ -422,12 +437,15 @@ void LLPanelPrimMediaControls::updateShape()  			volume_ctrl->setEnabled(FALSE);  			volume_up_ctrl->setEnabled(FALSE);  			volume_down_ctrl->setEnabled(FALSE); -				 -			scroll_up_ctrl->setVisible(has_focus); -			scroll_left_ctrl->setVisible(has_focus); -			scroll_right_ctrl->setVisible(has_focus); -			scroll_down_ctrl->setVisible(has_focus); -			media_panel_scroll->setVisible(has_focus); +			 +			if (media_panel_scroll) +			{ +				media_panel_scroll->setVisible(has_focus); +				scroll_up_ctrl->setVisible(has_focus); +				scroll_left_ctrl->setVisible(has_focus); +				scroll_right_ctrl->setVisible(has_focus); +				scroll_down_ctrl->setVisible(has_focus); +			}  			// TODO: get the secure lock bool from media plug in  			std::string prefix =  std::string("https://");  			std::string test_prefix = mCurrentURL.substr(0, prefix.length()); diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index f5367c0477..13bd059d45 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -130,6 +130,7 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)  				{  					name.erase(found, moderator_indicator_len);  					item->setName(name); +					item->reshapeAvatarName();  				}  			}  		} @@ -151,6 +152,7 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)  					name += " ";  					name += moderator_indicator;  					item->setName(name); +					item->reshapeAvatarName();  				}  			}  		} diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index b667fbf5fd..ed606d5457 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -63,7 +63,7 @@ LLScreenChannelBase::LLScreenChannelBase(const LLUUID& id) :  												,mCanStoreToasts(true)  												,mHiddenToastsNum(0)  												,mOverflowToastHidden(false) -												,mIsHovering(false) +												,mHoveredToast(NULL)  												,mControlHovering(false)  												,mShowToasts(true)  {	 @@ -216,8 +216,10 @@ void LLScreenChannel::deleteToast(LLToast* toast)  	// update channel's Hovering state  	// turning hovering off manually because onMouseLeave won't happen if a toast was closed using a keyboard -	if(toast->hasFocus()) -		setHovering(false); +	if(mHoveredToast == toast) +	{ +		mHoveredToast  = NULL; +	}  	// close the toast  	toast->closeFloater(); @@ -352,7 +354,7 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)  //--------------------------------------------------------------------------  void LLScreenChannel::redrawToasts()  { -	if(mToastList.size() == 0 || mIsHovering) +	if(mToastList.size() == 0 || isHovering())  		return;  	hideToastsFromScreen(); @@ -456,7 +458,6 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)  	mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::closeOverflowToastPanel, this));  	LLTextBox* text_box = mOverflowToastPanel->getChild<LLTextBox>("toast_text"); -	LLIconCtrl* icon = mOverflowToastPanel->getChild<LLIconCtrl>("icon");  	std::string	text = llformat(mOverflowFormatString.c_str(),mHiddenToastsNum);  	if(mHiddenToastsNum == 1)  	{ @@ -474,7 +475,6 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)  	text_box->setValue(text);  	text_box->setVisible(TRUE); -	icon->setVisible(TRUE);  	mOverflowToastPanel->setVisible(TRUE);  } @@ -532,7 +532,6 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)  	mStartUpToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onStartUpToastHide, this));  	LLTextBox* text_box = mStartUpToastPanel->getChild<LLTextBox>("toast_text"); -	LLIconCtrl* icon = mStartUpToastPanel->getChild<LLIconCtrl>("icon");  	std::string mStartUpFormatString; @@ -555,8 +554,6 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)  	text_box->setValue(text);  	text_box->setVisible(TRUE); -	icon->setVisible(TRUE); -  	addChild(mStartUpToastPanel);  	mStartUpToastPanel->setVisible(TRUE); @@ -654,7 +651,14 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)  	// we must check this to prevent incorrect setting for hovering in a channel  	std::map<LLToast*, bool>::iterator it_first, it_second;  	S32 stack_size = mToastEventStack.size(); -	mIsHovering = mouse_enter; +	if(mouse_enter) +	{ +		mHoveredToast = toast; +	} +	else +	{ +		mHoveredToast = NULL; +	}  	switch(stack_size)  	{ @@ -666,7 +670,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)  		if((*it_first).second && !mouse_enter && ((*it_first).first != toast) )  		{  			mToastEventStack.clear(); -			mIsHovering = true; +			mHoveredToast = toast;  		}  		else  		{ @@ -678,7 +682,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)  		LL_ERRS ("LLScreenChannel::onToastHover: stack size error " ) << stack_size << llendl;  	} -	if(!mIsHovering) +	if(!isHovering())  		redrawToasts();  } diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h index fd31690622..f39b94b89d 100644 --- a/indra/newview/llscreenchannel.h +++ b/indra/newview/llscreenchannel.h @@ -93,9 +93,10 @@ public:  	// Channel's behavior-functions  	// set whether a channel will control hovering inside itself or not  	virtual void setControlHovering(bool control) { mControlHovering = control; } -	// set Hovering flag for a channel -	virtual void setHovering(bool hovering) { mIsHovering = hovering; } + +	bool isHovering() { return mHoveredToast != NULL; } +  	void setCanStoreToasts(bool store) { mCanStoreToasts = store; }  	void setDisplayToastsAlways(bool display_toasts) { mDisplayToastsAlways = display_toasts; } @@ -117,7 +118,7 @@ public:  protected:  	// Channel's flags  	bool		mControlHovering; -	bool		mIsHovering; +	LLToast*		mHoveredToast;  	bool		mCanStoreToasts;  	bool		mDisplayToastsAlways;  	bool		mOverflowToastHidden; diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 3d0b4de88a..70dc04f575 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -101,6 +101,7 @@ LLSideTray* LLSideTray::getInstance()  	if (!sInstance)  	{  		sInstance = LLUICtrlFactory::createFromFile<LLSideTray>("panel_side_tray.xml",NULL, LLRootView::child_registry_t::instance()); +		sInstance->setXMLFilename("panel_side_tray.xml");  	}  	return sInstance; @@ -353,7 +354,8 @@ bool LLSideTray::selectTabByName	(const std::string& name)  	return true;  } -LLButton* LLSideTray::createButton	(const std::string& name,const std::string& image,LLUICtrl::commit_callback_t callback) +LLButton* LLSideTray::createButton	(const std::string& name,const std::string& image,const std::string& tooltip, +									 LLUICtrl::commit_callback_t callback)  {  	static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());	 @@ -374,6 +376,9 @@ LLButton* LLSideTray::createButton	(const std::string& name,const std::string& i  	LLButton* button = LLUICtrlFactory::create<LLButton> (bparams);  	button->setLabel(name);  	button->setClickedCallback(callback); + +	if(tooltip!="Home") +		button->setToolTip(tooltip);  	if(image.length())  	{ @@ -412,12 +417,12 @@ void	LLSideTray::createButtons	()  		// change if the home screen becomes its own tab.  		if (name == "sidebar_home")  		{ -			mCollapseButton = createButton("",sidebar_tab->mImage, +			mCollapseButton = createButton("",sidebar_tab->mImage,sidebar_tab->getTabTitle(),  				boost::bind(&LLSideTray::onToggleCollapse, this));  		}  		else  		{ -			LLButton* button = createButton("",sidebar_tab->mImage, +			LLButton* button = createButton("",sidebar_tab->mImage,sidebar_tab->getTabTitle(),  				boost::bind(&LLSideTray::onTabButtonClick, this, name));  			mTabButtons[name] = button;  		} diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 5bb17eedd5..8b30199c45 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -141,7 +141,8 @@ protected:  	LLSideTrayTab* getTab		(const std::string& name);  	void		createButtons	(); -	LLButton*	createButton	(const std::string& name,const std::string& image,LLUICtrl::commit_callback_t callback); +	LLButton*	createButton	(const std::string& name,const std::string& image,const std::string& tooltip, +									LLUICtrl::commit_callback_t callback);  	void		arrange			();  	void		reflectCollapseChange(); diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 8c5439d47e..6ca6734598 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -435,7 +435,7 @@ void LLSpatialGroup::clearDrawMap()  BOOL LLSpatialGroup::isRecentlyVisible() const  { -	return (LLDrawable::getCurrentFrame() - (S32)mVisible) < LLDrawable::getMinVisFrameRange() ; +	return (LLDrawable::getCurrentFrame() - mVisible[LLViewerCamera::sCurCameraID]) < LLDrawable::getMinVisFrameRange() ;  }  BOOL LLSpatialGroup::isVisible() const diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp index 57ea018f25..51d53b2674 100644 --- a/indra/newview/llspeakbutton.cpp +++ b/indra/newview/llspeakbutton.cpp @@ -133,6 +133,16 @@ LLSpeakButton::~LLSpeakButton()  	LLTransientFloaterMgr::getInstance()->removeControlView(mShowBtn);  } +void LLSpeakButton::setSpeakToolTip(const std::string& msg) +{ +	mSpeakBtn->setToolTip(msg); +} + +void LLSpeakButton::setShowToolTip(const std::string& msg) +{ +	mShowBtn->setToolTip(msg); +} +  void LLSpeakButton::onMouseDown_SpeakBtn()  {  	bool down = true; diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h index e213c562dd..02c8ab3890 100644 --- a/indra/newview/llspeakbutton.h +++ b/indra/newview/llspeakbutton.h @@ -62,6 +62,11 @@ public:  	/*virtual*/ ~LLSpeakButton();  	/*virtual*/ void draw(); +	// *HACK: Need to put tooltips in a translatable location, +	// the panel that contains this button. +	void setSpeakToolTip(const std::string& msg); +	void setShowToolTip(const std::string& msg); +  protected:  	friend class LLUICtrlFactory;  	LLSpeakButton(const Params& p); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 64dcd7b97f..2c59d62b4b 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -873,6 +873,9 @@ bool idle_startup()  		gViewerWindow->getWindow()->show();  		display_startup(); +		//DEV-10530.  do cleanup.  remove at some later date.  jan-2009 +		LLFloaterPreference::cleanupBadSetting(); +  		// DEV-16927.  The following code removes errant keystrokes that happen while the window is being   		// first made visible.  #ifdef _WIN32 @@ -1900,9 +1903,6 @@ bool idle_startup()          //DEV-17797.  get null folder.  Any items found here moved to Lost and Found          LLInventoryModel::findLostItems(); -		//DEV-10530.  do cleanup.  remove at some later date.  jan-2009 -		LLFloaterPreference::cleanupBadSetting(); -  		LLStartUp::setStartupState( STATE_PRECACHE );  		timeout.reset();  		return FALSE; diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index 4422c4b672..2fb6550107 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -501,14 +501,14 @@ LLSysWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&  	switch (im_chiclet_type)  	{  	case LLIMChiclet::TYPE_GROUP: +		mChiclet = getChild<LLIMGroupChiclet>("group_chiclet"); +		break;  	case LLIMChiclet::TYPE_AD_HOC: -		mChiclet = getChild<LLIMChiclet>("group_chiclet"); -		childSetVisible("p2p_chiclet", false); +		mChiclet = getChild<LLAdHocChiclet>("adhoc_chiclet");		  		break;  	case LLIMChiclet::TYPE_UNKNOWN: // assign mChiclet a non-null value anyway  	case LLIMChiclet::TYPE_IM: -		mChiclet = getChild<LLIMChiclet>("p2p_chiclet"); -		childSetVisible("group_chiclet", false); +		mChiclet = getChild<LLIMP2PChiclet>("p2p_chiclet");  		break;  	} @@ -517,6 +517,7 @@ LLSysWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&  	mChiclet->setSessionId(sessionId);  	mChiclet->setIMSessionName(name);  	mChiclet->setOtherParticipantId(otherParticipantId); +	mChiclet->setVisible(true);  	LLTextBox* contactName = getChild<LLTextBox>("contact_name");  	contactName->setValue(name); diff --git a/indra/newview/lltexglobalcolor.cpp b/indra/newview/lltexglobalcolor.cpp index 595b24ad47..d7840fb435 100644 --- a/indra/newview/lltexglobalcolor.cpp +++ b/indra/newview/lltexglobalcolor.cpp @@ -108,9 +108,9 @@ LLTexParamGlobalColor::LLTexParamGlobalColor(LLTexGlobalColor* tex_global_color)  	return new_param;  } -void LLTexParamGlobalColor::onGlobalColorChanged(bool set_by_user) +void LLTexParamGlobalColor::onGlobalColorChanged(bool upload_bake)  { -	mAvatar->onGlobalColorChanged(mTexGlobalColor, set_by_user); +	mAvatar->onGlobalColorChanged(mTexGlobalColor, upload_bake);  }  //----------------------------------------------------------------------------- diff --git a/indra/newview/lltexglobalcolor.h b/indra/newview/lltexglobalcolor.h index 1e6754133f..829a7d645b 100644 --- a/indra/newview/lltexglobalcolor.h +++ b/indra/newview/lltexglobalcolor.h @@ -80,7 +80,7 @@ public:  	LLTexParamGlobalColor(LLTexGlobalColor *tex_color);  	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const;  protected: -	/*virtual*/ void onGlobalColorChanged(bool set_by_user); +	/*virtual*/ void onGlobalColorChanged(bool upload_bake);  private:  	LLTexGlobalColor*		mTexGlobalColor;  }; diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index 5d682cad3c..25e0ca46e4 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -1834,7 +1834,7 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i)  		}  		if (layer)  		{ -			wearable->writeToAvatar(FALSE, FALSE); +			wearable->writeToAvatar();  			layer->setLTO(lto);  			success &= layer->render(x,y,width,height);  		} diff --git a/indra/newview/lltexlayerparams.cpp b/indra/newview/lltexlayerparams.cpp index b744722f4c..0c7e61d00e 100644 --- a/indra/newview/lltexlayerparams.cpp +++ b/indra/newview/lltexlayerparams.cpp @@ -160,7 +160,7 @@ BOOL LLTexLayerParamAlpha::getMultiplyBlend() const  	return ((LLTexLayerParamAlphaInfo *)getInfo())->mMultiplyBlend; 	  } -void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL set_by_user) +void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL upload_bake)  {  	if (mIsAnimating || mTexLayer == NULL)  	{ @@ -179,37 +179,37 @@ void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL set_by_user)  		{  			if (gAgent.cameraCustomizeAvatar())  			{ -				set_by_user = FALSE; +				upload_bake = FALSE;  			} -			mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), set_by_user); +			mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake);  			mTexLayer->invalidateMorphMasks();  		}  	}  } -void LLTexLayerParamAlpha::setAnimationTarget(F32 target_value, BOOL set_by_user) +void LLTexLayerParamAlpha::setAnimationTarget(F32 target_value, BOOL upload_bake)  {   	// do not animate dummy parameters  	if (mIsDummy)  	{ -		setWeight(target_value, set_by_user); +		setWeight(target_value, upload_bake);  		return;  	}  	mTargetWeight = target_value;  -	setWeight(target_value, set_by_user);  +	setWeight(target_value, upload_bake);   	mIsAnimating = TRUE;  	if (mNext)  	{ -		mNext->setAnimationTarget(target_value, set_by_user); +		mNext->setAnimationTarget(target_value, upload_bake);  	}  } -void LLTexLayerParamAlpha::animate(F32 delta, BOOL set_by_user) +void LLTexLayerParamAlpha::animate(F32 delta, BOOL upload_bake)  {  	if (mNext)  	{ -		mNext->animate(delta, set_by_user); +		mNext->animate(delta, upload_bake);  	}  } @@ -449,7 +449,7 @@ LLColor4 LLTexLayerParamColor::getNetColor() const  	}  } -void LLTexLayerParamColor::setWeight(F32 weight, BOOL set_by_user) +void LLTexLayerParamColor::setWeight(F32 weight, BOOL upload_bake)  {  	if (mIsAnimating)  	{ @@ -474,10 +474,10 @@ void LLTexLayerParamColor::setWeight(F32 weight, BOOL set_by_user)  		if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param.  		{ -			onGlobalColorChanged(set_by_user); +			onGlobalColorChanged(upload_bake);  			if (mTexLayer)  			{ -				mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), set_by_user); +				mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake);  			}  		} @@ -485,23 +485,23 @@ void LLTexLayerParamColor::setWeight(F32 weight, BOOL set_by_user)  	}  } -void LLTexLayerParamColor::setAnimationTarget(F32 target_value, BOOL set_by_user) +void LLTexLayerParamColor::setAnimationTarget(F32 target_value, BOOL upload_bake)  {   	// set value first then set interpolating flag to ignore further updates  	mTargetWeight = target_value;  -	setWeight(target_value, set_by_user); +	setWeight(target_value, upload_bake);  	mIsAnimating = TRUE;  	if (mNext)  	{ -		mNext->setAnimationTarget(target_value, set_by_user); +		mNext->setAnimationTarget(target_value, upload_bake);  	}  } -void LLTexLayerParamColor::animate(F32 delta, BOOL set_by_user) +void LLTexLayerParamColor::animate(F32 delta, BOOL upload_bake)  {  	if (mNext)  	{ -		mNext->animate(delta, set_by_user); +		mNext->animate(delta, upload_bake);  	}  } diff --git a/indra/newview/lltexlayerparams.h b/indra/newview/lltexlayerparams.h index 98365864f9..2b80dbdba4 100644 --- a/indra/newview/lltexlayerparams.h +++ b/indra/newview/lltexlayerparams.h @@ -66,9 +66,9 @@ public:  	// LLVisualParam Virtual functions  	///*virtual*/ BOOL		parseData(LLXmlTreeNode* node);  	/*virtual*/ void		apply( ESex avatar_sex ) {} -	/*virtual*/ void		setWeight(F32 weight, BOOL set_by_user); -	/*virtual*/ void		setAnimationTarget(F32 target_value, BOOL set_by_user);  -	/*virtual*/ void		animate(F32 delta, BOOL set_by_user); +	/*virtual*/ void		setWeight(F32 weight, BOOL upload_bake); +	/*virtual*/ void		setAnimationTarget(F32 target_value, BOOL upload_bake);  +	/*virtual*/ void		animate(F32 delta, BOOL upload_bake);  	// LLViewerVisualParam Virtual functions  	/*virtual*/ F32					getTotalDistortion()									{ return 1.f; } @@ -143,9 +143,9 @@ public:  	// LLVisualParam Virtual functions  	///*virtual*/ BOOL			parseData(LLXmlTreeNode* node);  	/*virtual*/ void			apply( ESex avatar_sex ) {} -	/*virtual*/ void			setWeight(F32 weight, BOOL set_by_user); -	/*virtual*/ void			setAnimationTarget(F32 target_value, BOOL set_by_user); -	/*virtual*/ void			animate(F32 delta, BOOL set_by_user); +	/*virtual*/ void			setWeight(F32 weight, BOOL upload_bake); +	/*virtual*/ void			setAnimationTarget(F32 target_value, BOOL upload_bake); +	/*virtual*/ void			animate(F32 delta, BOOL upload_bake);  	// LLViewerVisualParam Virtual functions @@ -159,7 +159,7 @@ public:  	// New functions  	LLColor4				getNetColor() const;  protected: -	virtual void onGlobalColorChanged(bool set_by_user) {} +	virtual void onGlobalColorChanged(bool upload_bake) {}  private:  	LLVector3				mAvgDistortionVec;  }; diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 6a4b967487..9be342c424 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -1541,23 +1541,24 @@ bool LLTextureCache::readComplete(handle_t handle, bool abort)  {  	lockWorkers();  	handle_map_t::iterator iter = mReaders.find(handle); -	llassert_always(iter != mReaders.end() || abort); -	LLTextureCacheWorker* worker = iter->second; -	if (!worker) -		return false; -	bool res = worker->complete(); -	if (res || abort) +	LLTextureCacheWorker* worker = NULL; +	bool complete = false; +	if (iter != mReaders.end())  	{ -		mReaders.erase(handle); +		worker = iter->second; +		complete = worker->complete(); +	} +	if (worker && (complete || abort)) +	{ +		mReaders.erase(iter);  		unlockWorkers();  		worker->scheduleDelete(); -		return true;  	}  	else  	{  		unlockWorkers(); -		return false;  	} +	return (complete || abort);  }  LLTextureCache::handle_t LLTextureCache::writeToCache(const LLUUID& id, U32 priority, diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp index c02fd7a5ef..9370e318cf 100644 --- a/indra/newview/lltoastimpanel.cpp +++ b/indra/newview/lltoastimpanel.cpp @@ -50,7 +50,19 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) :	LLToastPanel(p.notif  	mMessage = getChild<LLTextBox>("message");  	mReplyBtn = getChild<LLButton>("reply");	 -	mMessage->setValue(p.message); +	LLStyle::Params style_params; +	//Handle IRC styled /me messages. +	std::string prefix = p.message.substr(0, 4); +	if (prefix == "/me " || prefix == "/me'") +	{ +		mMessage->clear(); +		style_params.font.style= "ITALIC"; +		mMessage->appendText(p.from + " ", FALSE, style_params); +		style_params.font.style= "UNDERLINE"; +		mMessage->appendText(p.message.substr(3), FALSE, style_params); +	} +	else +		mMessage->setValue(p.message);  	mUserName->setValue(p.from);  	mTime->setValue(p.time);  	mSessionID = p.session_id; diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index a3daca6fa4..9e064d8135 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -364,9 +364,9 @@ bool LLURLDispatcher::dispatchRightClick(const std::string& url)  bool LLURLDispatcher::dispatchFromTextEditor(const std::string& url)  {  	// *NOTE: Text editors are considered sources of trusted URLs -	// in order to make objectim and avatar profile links in chat -	// history work.  While a malicious resident could chat an app -	// SLURL, the receiving resident will see it and must affirmatively +	// in order to make avatar profile links in chat history work. +	// While a malicious resident could chat an app SLURL, the +	// receiving resident will see it and must affirmatively  	// click on it.  	// *TODO: Make this trust model more refined.  JC  	const bool trusted_browser = true; diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp new file mode 100644 index 0000000000..d65a060bbc --- /dev/null +++ b/indra/newview/llviewerchat.cpp @@ -0,0 +1,203 @@ +/**  + * @file llviewerchat.cpp + * @brief Builds menus out of items. + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + *  + * Copyright (c) 2002-2009, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llviewerchat.h"  + +// newview includes +#include "llagent.h" 	// gAgent		 +#include "lluicolortable.h" +#include "llviewercontrol.h" // gSavedSettings + +// LLViewerChat + +//static  +void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color) +{ +	if(chat.mMuted) +	{ +		r_color= LLUIColorTable::instance().getColor("LtGray"); +	} +	else +	{ +		switch(chat.mSourceType) +		{ +			case CHAT_SOURCE_SYSTEM: +				r_color = LLUIColorTable::instance().getColor("SystemChatColor");  +				break; +			case CHAT_SOURCE_AGENT: +				if (chat.mFromID.isNull()) +				{ +					r_color = LLUIColorTable::instance().getColor("SystemChatColor"); +				} +				else +				{ +					if(gAgentID == chat.mFromID) +					{ +						r_color = LLUIColorTable::instance().getColor("UserChatColor"); +					} +					else +					{ +						r_color = LLUIColorTable::instance().getColor("AgentChatColor"); +					} +				} +				break; +			case CHAT_SOURCE_OBJECT: +				if (chat.mChatType == CHAT_TYPE_DEBUG_MSG) +				{ +					r_color = LLUIColorTable::instance().getColor("ScriptErrorColor"); +				} +				else if ( chat.mChatType == CHAT_TYPE_OWNER ) +				{ +					r_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor"); +				} +				else +				{ +					r_color = LLUIColorTable::instance().getColor("ObjectChatColor"); +				} +				break; +			default: +				r_color.setToWhite(); +		} +		 +		if (!chat.mPosAgent.isExactlyZero()) +		{ +			LLVector3 pos_agent = gAgent.getPositionAgent(); +			F32 distance = dist_vec(pos_agent, chat.mPosAgent); +			if (distance > gAgent.getNearChatRadius()) +			{ +				// diminish far-off chat +				r_color.mV[VALPHA] = 0.8f; +			} +		} +	} +} + + +//static  +void LLViewerChat::getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha) +{ +	if(chat.mMuted) +	{ +		r_color_name = "LtGray"; +	} +	else +	{ +		switch(chat.mSourceType) +		{ +			case CHAT_SOURCE_SYSTEM: +				r_color_name = "SystemChatColor"; +				break; +				 +			case CHAT_SOURCE_AGENT: +				if (chat.mFromID.isNull()) +				{ +					r_color_name = "SystemChatColor"; +				} +				else +				{ +					if(gAgentID == chat.mFromID) +					{ +						r_color_name = "UserChatColor"; +					} +					else +					{ +						r_color_name = "AgentChatColor"; +					} +				} +				break; +				 +			case CHAT_SOURCE_OBJECT: +				if (chat.mChatType == CHAT_TYPE_DEBUG_MSG) +				{ +					r_color_name = "ScriptErrorColor"; +				} +				else if ( chat.mChatType == CHAT_TYPE_OWNER ) +				{ +					r_color_name = "llOwnerSayChatColor"; +				} +				else +				{ +					r_color_name = "ObjectChatColor"; +				} +				break; +			default: +				r_color_name = "White"; +		} +		 +		if (!chat.mPosAgent.isExactlyZero()) +		{ +			LLVector3 pos_agent = gAgent.getPositionAgent(); +			F32 distance = dist_vec(pos_agent, chat.mPosAgent); +			if (distance > gAgent.getNearChatRadius()) +			{ +				// diminish far-off chat +				r_color_alpha = 0.8f;  +			} +			else +			{ +				r_color_alpha = 1.0f; +			} +		} +	} +	 +} + + +//static  +LLFontGL* LLViewerChat::getChatFont() +{ +	S32 font_size = gSavedSettings.getS32("ChatFontSize"); +	LLFontGL* fontp = NULL; +	switch(font_size) +	{ +		case 0: +			fontp = LLFontGL::getFontSansSerifSmall(); +			break; +		default: +		case 1: +			fontp = LLFontGL::getFontSansSerif(); +			break; +		case 2: +			fontp = LLFontGL::getFontSansSerifBig(); +			break; +	} +	 +	return fontp; +	 +} + +//static +S32 LLViewerChat::getChatFontSize() +{ +	return gSavedSettings.getS32("ChatFontSize"); +} diff --git a/indra/newview/llviewerchat.h b/indra/newview/llviewerchat.h new file mode 100644 index 0000000000..d8840d5dd2 --- /dev/null +++ b/indra/newview/llviewerchat.h @@ -0,0 +1,53 @@ +/**  + * @file llviewerchat.h + * @brief wrapper of LLChat in viewer + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + *  + * Copyright (c) 2002-2009, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLVIEWERCHAT_H +#define LL_LLVIEWERCHAT_H + +#include "llchat.h" +#include "llfontgl.h" +#include "v4color.h" + + +class LLViewerChat  +{ +public: +	static void getChatColor(const LLChat& chat, LLColor4& r_color); +	static void getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha); +	static LLFontGL* getChatFont(); +	static S32 getChatFontSize(); +	 + + +}; + +#endif diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index edbac69e1b..7772f613f0 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -112,6 +112,7 @@  #include "llinspectavatar.h"  #include "llinspectgroup.h"  #include "llinspectobject.h" +#include "llinspectremoteobject.h"  #include "llmediaremotectrl.h"  #include "llmoveview.h"  #include "llnearbychat.h" @@ -176,6 +177,7 @@ void LLViewerFloaterReg::registerFloaters()  	LLInspectAvatarUtil::registerFloater();  	LLInspectGroupUtil::registerFloater();  	LLInspectObjectUtil::registerFloater(); +	LLInspectRemoteObjectUtil::registerFloater();  	LLFloaterReg::add("lagmeter", "floater_lagmeter.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLagMeter>);  	LLFloaterReg::add("land_holdings", "floater_land_holdings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLandHoldings>); @@ -195,7 +197,7 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("notifications_console", "floater_notifications_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationConsole>);  	LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>); -	 +	LLFloaterReg::add("outgoing_call", "floater_outgoing_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutgoingCallDialog>);  	LLFloaterReg::add("parcel_info", "floater_preview_url.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterParcelInfo>);  	LLFloaterPayUtil::registerFloater(); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 493457704b..69d4da373e 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -135,9 +135,19 @@ public:  	LLMimeDiscoveryResponder( viewer_media_t media_impl)  		: mMediaImpl(media_impl),  		  mInitialized(false) -	{} - +	{ +		if(mMediaImpl->mMimeTypeProbe != NULL) +		{ +			llerrs << "impl already has an outstanding responder" << llendl; +		} +		 +		mMediaImpl->mMimeTypeProbe = this; +	} +	~LLMimeDiscoveryResponder() +	{ +		disconnectOwner(); +	}  	virtual void completedHeader(U32 status, const std::string& reason, const LLSD& content)  	{ @@ -149,23 +159,54 @@ public:  	virtual void error( U32 status, const std::string& reason )  	{ +		llwarns << "responder failed with status " << status << ", reason " << reason << llendl; +		if(mMediaImpl) +		{ +			mMediaImpl->mMediaSourceFailed = true; +		}  		// completeAny(status, "none/none");  	}  	void completeAny(U32 status, const std::string& mime_type)  	{ -		if(!mInitialized && ! mime_type.empty()) +		// the call to initializeMedia may disconnect the responder, which will clear mMediaImpl. +		// Make a local copy so we can call loadURI() afterwards. +		LLViewerMediaImpl *impl = mMediaImpl; +		 +		if(impl && !mInitialized && ! mime_type.empty())  		{ -			if(mMediaImpl->initializeMedia(mime_type)) +			if(impl->initializeMedia(mime_type))  			{  				mInitialized = true; -				mMediaImpl->loadURI(); +				impl->loadURI(); +				disconnectOwner();  			}  		}  	} +	 +	void cancelRequest() +	{ +		disconnectOwner(); +	} +	 +private: +	void disconnectOwner() +	{ +		if(mMediaImpl) +		{ +			if(mMediaImpl->mMimeTypeProbe != this) +			{ +				llerrs << "internal error: mMediaImpl->mMimeTypeProbe != this" << llendl; +			} -	public: -		viewer_media_t mMediaImpl; +			mMediaImpl->mMimeTypeProbe = NULL; +		} +		mMediaImpl = NULL; +	} +	 +	 +public: +		LLViewerMediaImpl *mMediaImpl;  		bool mInitialized;  };  static LLViewerMedia::impl_list sViewerMediaImplList; @@ -708,6 +749,7 @@ LLViewerMediaImpl::LLViewerMediaImpl(	  const LLUUID& texture_id,  	mIsDisabled(false),  	mIsParcelMedia(false),  	mProximity(-1), +	mMimeTypeProbe(NULL),  	mIsUpdated(false)  {  @@ -811,7 +853,9 @@ void LLViewerMediaImpl::destroyMediaSource()  	{  		oldImage->setPlaying(FALSE) ;  	} - +	 +	cancelMimeTypeProbe(); +	  	if(mMediaSource)  	{  		delete mMediaSource; @@ -1316,6 +1360,8 @@ void LLViewerMediaImpl::unload()  //////////////////////////////////////////////////////////////////////////////////////////  void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mime_type,  bool rediscover_type, bool server_request)  { +	cancelMimeTypeProbe(); +  	if(mMediaURL != url)  	{  		// Don't carry media play state across distinct URLs. @@ -1358,6 +1404,12 @@ void LLViewerMediaImpl::navigateInternal()  	// Helpful to have media urls in log file. Shouldn't be spammy.  	llinfos << "media id= " << mTextureId << " url=" << mMediaURL << " mime_type=" << mMimeType << llendl; +	if(mMimeTypeProbe != NULL) +	{ +		llwarns << "MIME type probe already in progress -- bailing out." << llendl; +		return; +	} +	  	if(mNavigateServerRequest)  	{  		setNavState(MEDIANAVSTATE_SERVER_SENT); @@ -1390,7 +1442,7 @@ void LLViewerMediaImpl::navigateInternal()  		if(scheme.empty() || "http" == scheme || "https" == scheme)  		{ -			LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this)); +			LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this), 10.0f);  		}  		else if("data" == scheme || "file" == scheme || "about" == scheme)  		{ @@ -1521,7 +1573,15 @@ void LLViewerMediaImpl::update()  {  	if(mMediaSource == NULL)  	{ -		if(mPriority != LLPluginClassMedia::PRIORITY_UNLOADED) +		if(mPriority == LLPluginClassMedia::PRIORITY_UNLOADED) +		{ +			// This media source should not be loaded. +		} +		else if(mMimeTypeProbe != NULL) +		{ +			// this media source is doing a MIME type probe -- don't try loading it again. +		} +		else  		{  			// This media may need to be loaded.  			if(sMediaCreateTimer.hasExpired()) @@ -2120,6 +2180,21 @@ void LLViewerMediaImpl::setNavState(EMediaNavState state)  	}  } +void LLViewerMediaImpl::cancelMimeTypeProbe() +{ +	if(mMimeTypeProbe != NULL) +	{ +		// There doesn't seem to be a way to actually cancel an outstanding request. +		// Simulate it by telling the LLMimeDiscoveryResponder not to write back any results. +		mMimeTypeProbe->cancelRequest(); +		 +		// The above should already have set mMimeTypeProbe to NULL. +		if(mMimeTypeProbe != NULL) +		{ +			llerrs << "internal error: mMimeTypeProbe is not NULL after cancelling request." << llendl; +		} +	} +}  void LLViewerMediaImpl::addObject(LLVOVolume* obj)   { diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 3f5f3ca746..719deb28bf 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -48,6 +48,7 @@ class LLUUID;  class LLViewerMediaTexture;  class LLMediaEntry;  class LLVOVolume ; +class LLMimeDiscoveryResponder;  typedef LLPointer<LLViewerMediaImpl> viewer_media_t;  /////////////////////////////////////////////////////////////////////////////// @@ -294,6 +295,7 @@ public:  	EMediaNavState getNavState() { return mMediaNavState; }  	void setNavState(EMediaNavState state); +	void cancelMimeTypeProbe();  public:  	// a single media url with some data and an impl.  	LLPluginClassMedia* mMediaSource; @@ -331,7 +333,8 @@ public:  	bool mIsDisabled;  	bool mIsParcelMedia;  	S32 mProximity; - +	LLMimeDiscoveryResponder *mMimeTypeProbe; +	  private:  	BOOL mIsUpdated ;  	std::list< LLVOVolume* > mObjectList ; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 976d89a5b7..728fb7c616 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -1879,7 +1879,9 @@ class LLAdvancedDebugAvatarTextures : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ +#ifndef LL_RELEASE_FOR_DOWNLOAD  		handle_debug_avatar_textures(NULL); +#endif  		return true;  	}  }; @@ -1893,7 +1895,9 @@ class LLAdvancedDumpAvatarLocalTextures : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ +#ifndef LL_RELEASE_FOR_DOWNLOAD  		handle_dump_avatar_local_textures(NULL); +#endif  		return true;  	}  }; @@ -7860,10 +7864,8 @@ void initialize_menus()  	view_listener_t::addMenu(new LLAdvancedCheckDebugCharacterVis(), "Advanced.CheckDebugCharacterVis");  	view_listener_t::addMenu(new LLAdvancedDumpAttachments(), "Advanced.DumpAttachments");  	view_listener_t::addMenu(new LLAdvancedRebakeTextures(), "Advanced.RebakeTextures"); -	#ifndef LL_RELEASE_FOR_DOWNLOAD  	view_listener_t::addMenu(new LLAdvancedDebugAvatarTextures(), "Advanced.DebugAvatarTextures");  	view_listener_t::addMenu(new LLAdvancedDumpAvatarLocalTextures(), "Advanced.DumpAvatarLocalTextures"); -	#endif  	// Advanced > Network  	view_listener_t::addMenu(new LLAdvancedEnableMessageLog(), "Advanced.EnableMessageLog");  	view_listener_t::addMenu(new LLAdvancedDisableMessageLog(), "Advanced.DisableMessageLog"); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index a90790c59a..1890e0bf1d 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -43,7 +43,7 @@  #include "llfloaterbump.h"  #include "llassetstorage.h"  #include "llcachename.h" -#include "llchat.h" +  #include "lldbstrings.h"  #include "lleconomy.h"  #include "llfilepicker.h" @@ -115,6 +115,7 @@  #include "llui.h"			// for make_ui_sound  #include "lluploaddialog.h"  #include "llviewercamera.h" +#include "llviewerchat.h"  #include "llviewergenericmessage.h"  #include "llviewerinventory.h"  #include "llviewermenu.h" @@ -1431,6 +1432,17 @@ bool goto_url_callback(const LLSD& notification, const LLSD& response)  }  static LLNotificationFunctorRegistration goto_url_callback_reg("GotoURL", goto_url_callback); +bool inspect_remote_object_callback(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotification::getSelectedOption(notification, response); +	if (0 == option) +	{ +		LLFloaterReg::showInstance("inspect_remote_object", notification["payload"]); +	} +	return false; +} +static LLNotificationFunctorRegistration inspect_remote_object_callback_reg("ServerObjectMessage", inspect_remote_object_callback); +  void process_improved_im(LLMessageSystem *msg, void **user_data)  {  	if (gNoRender) @@ -1498,15 +1510,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  	}  	std::string separator_string(": "); -	int message_offset = 0; - -		//Handle IRC styled /me messages. -	std::string prefix = message.substr(0, 4); -	if (prefix == "/me " || prefix == "/me'") -	{ -		separator_string = ""; -		message_offset = 3; -	}  	LLSD args;  	switch(dialog) @@ -1558,7 +1561,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			// now store incoming IM in chat history -			buffer = message.substr(message_offset); +			buffer = message;  			LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL; @@ -1576,7 +1579,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				true);  			// pretend this is chat generated by self, so it does not show up on screen -			chat.mText = std::string("IM: ") + name + separator_string + message.substr(message_offset); +			chat.mText = std::string("IM: ") + name + separator_string + message;  			LLFloaterChat::addChat( chat, TRUE, TRUE );  		}  		else if (from_id.isNull()) @@ -1596,7 +1599,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			// Treat like a system message and put in chat history.  			// Claim to be from a local agent so it doesn't go into  			// console. -			chat.mText = name + separator_string + message.substr(message_offset); +			chat.mText = name + separator_string + message;  			LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());  			if(nearby_chat) @@ -1612,7 +1615,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			{  				saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());  			} -			buffer = saved + message.substr(message_offset); +			buffer = saved + message;  			LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL; @@ -1634,7 +1637,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  					region_id,  					position,  					true); -				chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset); +				chat.mText = std::string("IM: ") + name + separator_string + saved + message;  				BOOL local_agent = FALSE;  				LLFloaterChat::addChat( chat, TRUE, local_agent ); @@ -1922,7 +1925,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  		{  			saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());  		} -		buffer = saved + message.substr(message_offset); +		buffer = saved + message;  		BOOL is_this_agent = FALSE;  		if(from_id == gAgentID)  		{ @@ -1940,7 +1943,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			position,  			true); -		chat.mText = std::string("IM: ") + name + separator_string +  saved + message.substr(message_offset); +		chat.mText = std::string("IM: ") + name + separator_string +  saved + message;  		LLFloaterChat::addChat(chat, TRUE, is_this_agent);  	}  	break; @@ -1952,9 +1955,23 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				return;  			} +			// Build a link to open the object IM info window. +			std::string location = ll_safe_string((char*)binary_bucket, binary_bucket_size-1); +  			LLSD substitutions; -			substitutions["MSG"] = message.substr(message_offset); -			LLNotifications::instance().add("ServerObjectMessage", substitutions); +			substitutions["NAME"] = name; +			substitutions["MSG"] = message; + +			LLSD payload; +			payload["object_id"] = session_id; +			payload["owner_id"] = from_id; +			payload["slurl"] = location; +			payload["name"] = name; +			if (from_group) +			{ +				payload["groupowned"] = "true"; +			} +			LLNotifications::instance().add("ServerObjectMessage", substitutions, payload);  		}  		break;  	case IM_FROM_TASK_AS_ALERT: @@ -1978,7 +1995,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  		else  		{  			// TODO: after LLTrans hits release, get "busy response" into translatable file -			buffer = llformat("%s (%s): %s", name.c_str(), "busy response", message.substr(message_offset).c_str()); +			buffer = llformat("%s (%s): %s", name.c_str(), "busy response", message.c_str());  			gIMMgr->addMessage(session_id, from_id, name, buffer);  		}  		break; @@ -2232,7 +2249,7 @@ void process_decline_callingcard(LLMessageSystem* msg, void**)  void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  { -	LLChat		chat; +	LLChat	chat;  	std::string		mesg;  	std::string		from_name;  	U8			source_temp; @@ -2832,7 +2849,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)  			// Chat the "back" SLURL. (DEV-4907)  			LLChat chat("Teleport completed from " + gAgent.getTeleportSourceSLURL());  			chat.mSourceType = CHAT_SOURCE_SYSTEM; - 			LLFloaterChat::addChatHistory(chat); + 		    LLFloaterChat::addChatHistory(chat);  			// Set the new position  			avatarp->setPositionAgent(agent_pos); @@ -4604,7 +4621,7 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp  		if (caution)  		{  			LLChat chat(notice.getString()); -			LLFloaterChat::addChat(chat, FALSE, FALSE); +	//		LLFloaterChat::addChat(chat, FALSE, FALSE);  		}  	}  } diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 9923c9ac74..85bc26c9c0 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -206,33 +206,31 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 wid  LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(  	                                               const LLUUID &image_id,											         												   BOOL usemipmaps, -												   S32 boost_priority, +												   LLViewerTexture::EBoostLevel boost_priority,  												   S8 texture_type,  												   LLGLint internal_format,  												   LLGLenum primary_format,  												   LLHost request_from_host)  { -	llassert_always(boost_priority >= LLViewerTexture::BOOST_NONE) ;  	return gTextureList.getImage(image_id, usemipmaps, boost_priority, texture_type, internal_format, primary_format, request_from_host) ;  }  LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromFile(  	                                               const std::string& filename,												     												   BOOL usemipmaps, -												   S32 boost_priority, +												   LLViewerTexture::EBoostLevel boost_priority,  												   S8 texture_type,  												   LLGLint internal_format,  												   LLGLenum primary_format,   												   const LLUUID& force_id)  { -	llassert_always(boost_priority >= LLViewerTexture::BOOST_NONE) ;  	return gTextureList.getImageFromFile(filename, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ;  }  //static   LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const std::string& url,									   									 BOOL usemipmaps, -									 S32 boost_priority, +									 LLViewerTexture::EBoostLevel boost_priority,  									 S8 texture_type,  									 LLGLint internal_format,  									 LLGLenum primary_format, @@ -1485,9 +1483,8 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  		if ( mBoostLevel > BOOST_HIGH)  		{  			priority += 10000000.f; -		} -		 -		if(mAdditionalDecodePriority > 0.0f) +		}		 +		else if(mAdditionalDecodePriority > 0.0f)  		{  			// 1-9  			S32 additional_priority = (S32)(1.0f + mAdditionalDecodePriority*8.0f + .5f); // round @@ -3147,8 +3144,7 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()  	if(mNeedsResetMaxVirtualSize)  	{ -		mMaxVirtualSize = 0.f ;//reset -		mNeedsResetMaxVirtualSize = FALSE ; +		addTextureStats(0.f, FALSE) ;//reset  	}  	if(mIsPlaying) //media is playing diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index bde87d1dd5..141979052d 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -107,12 +107,11 @@ public:  	enum EBoostLevel  	{ -		//skip 0 and 1 to avoid mistakenly mixing boost level with boolean numbers. -		BOOST_NONE 			= 2, -		BOOST_AVATAR_BAKED	= 3, -		BOOST_AVATAR		= 4, -		BOOST_CLOUDS		= 5, -		BOOST_SCULPTED      = 6, +		BOOST_NONE 			= 0, +		BOOST_AVATAR_BAKED	= 1, +		BOOST_AVATAR		= 2, +		BOOST_CLOUDS		= 3, +		BOOST_SCULPTED      = 4,  		BOOST_HIGH 			= 10,  		BOOST_TERRAIN		= 11, // has to be high priority for minimap / low detail @@ -668,7 +667,7 @@ public:  	static LLViewerFetchedTexture* getFetchedTexture(const LLUUID &image_id,									   									 BOOL usemipmap = TRUE, -									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation. +									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -677,7 +676,7 @@ public:  	static LLViewerFetchedTexture* getFetchedTextureFromFile(const std::string& filename,									   									 BOOL usemipmap = TRUE, -									 S32 boost_priority = LLViewerTexture::BOOST_NONE, +									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -686,7 +685,7 @@ public:  	static LLViewerFetchedTexture* getFetchedTextureFromUrl(const std::string& url,									   									 BOOL usemipmap = TRUE, -									 S32 boost_priority = LLViewerTexture::BOOST_NONE, +									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 081b7cc483..703a13976c 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -325,7 +325,7 @@ void LLViewerTextureList::restoreGL()  LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& filename,												     												   BOOL usemipmaps, -												   S32 boost_priority, +												   LLViewerTexture::EBoostLevel boost_priority,  												   S8 texture_type,  												   LLGLint internal_format,  												   LLGLenum primary_format,  @@ -345,7 +345,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string&  LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& url,  												   BOOL usemipmaps, -												   S32 boost_priority, +												   LLViewerTexture::EBoostLevel boost_priority,  												   S8 texture_type,  												   LLGLint internal_format,  												   LLGLenum primary_format,  @@ -411,7 +411,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string&  LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,											         												   BOOL usemipmaps, -												   S32 boost_priority, +												   LLViewerTexture::EBoostLevel boost_priority,  												   S8 texture_type,  												   LLGLint internal_format,  												   LLGLenum primary_format, @@ -441,7 +441,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,  //when this function is called, there is no such texture in the gTextureList with image_id.  LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,											         												   BOOL usemipmaps, -												   S32 boost_priority, +												   LLViewerTexture::EBoostLevel boost_priority,  												   S8 texture_type,  												   LLGLint internal_format,  												   LLGLenum primary_format, @@ -1346,7 +1346,7 @@ LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id, S32 priority)  	const BOOL use_mips = FALSE;  	const LLRect scale_rect = LLRect::null; -	return loadUIImageByID(image_id, use_mips, scale_rect, priority); +	return loadUIImageByID(image_id, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority);  }  LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priority) @@ -1360,21 +1360,27 @@ LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priori  	const BOOL use_mips = FALSE;  	const LLRect scale_rect = LLRect::null; -	return loadUIImageByName(image_name, image_name, use_mips, scale_rect, priority); +	return loadUIImageByName(image_name, image_name, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority);  }  LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename, -											  BOOL use_mips, const LLRect& scale_rect, S32 boost_priority ) +											  BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority )  { -	if (boost_priority == 0) boost_priority = LLViewerFetchedTexture::BOOST_UI; +	if (boost_priority == LLViewerTexture::BOOST_NONE) +	{ +		boost_priority = LLViewerTexture::BOOST_UI; +	}  	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, MIPMAP_NO, boost_priority);  	return loadUIImage(imagep, name, use_mips, scale_rect);  }  LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id, -											BOOL use_mips, const LLRect& scale_rect, S32 boost_priority) +											BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority)  { -	if (boost_priority == 0) boost_priority = LLViewerFetchedTexture::BOOST_UI; +	if (boost_priority == LLViewerTexture::BOOST_NONE) +	{ +		boost_priority = LLViewerTexture::BOOST_UI; +	}  	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, MIPMAP_NO, boost_priority);  	return loadUIImage(imagep, id.asString(), use_mips, scale_rect);  } diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index 3c9c81a689..028f8441ab 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -130,7 +130,7 @@ private:  	LLViewerFetchedTexture * getImage(const LLUUID &image_id,									   									 BOOL usemipmap = TRUE, -									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation. +									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -139,7 +139,7 @@ private:  	LLViewerFetchedTexture * getImageFromFile(const std::string& filename,									   									 BOOL usemipmap = TRUE, -									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation. +									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -148,7 +148,7 @@ private:  	LLViewerFetchedTexture* getImageFromUrl(const std::string& url,  									 BOOL usemipmap = TRUE, -									 BOOL level_immediate = FALSE,		// Get the requested level immediately upon creation. +									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -157,7 +157,7 @@ private:  	LLViewerFetchedTexture* createImage(const LLUUID &image_id,  									 BOOL usemipmap = TRUE, -									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation. +									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -228,9 +228,11 @@ public:  	static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );  private:  	LLUIImagePtr loadUIImageByName(const std::string& name, const std::string& filename, -								   BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, S32 boost_priority = 0); +		                           BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,  +		                           LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);  	LLUIImagePtr loadUIImageByID(const LLUUID& id, -								 BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, S32 boost_priority = 0); +								 BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,  +								 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);  	LLUIImagePtr loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index d69cc5999c..1054223dcf 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2302,13 +2302,13 @@ void LLViewerWindow::moveCursorToCenter()  // Hover handlers  // -void append_xui_tooltip(LLView* viewp, std::string& tool_tip_msg) +void append_xui_tooltip(LLView* viewp, LLToolTip::Params& params)  {  	if (viewp)   	{ -		if (!tool_tip_msg.empty()) +		if (!params.styled_message().empty())  		{ -			tool_tip_msg.append("\n---------\n"); +			params.styled_message.add().text("\n---------\n");   		}  		LLView::root_to_view_iterator_t end_tooltip_it = viewp->endRootToView();  		// NOTE: we skip "root" since it is assumed @@ -2318,15 +2318,16 @@ void append_xui_tooltip(LLView* viewp, std::string& tool_tip_msg)  		{  			LLView* viewp = *tooltip_it; -			tool_tip_msg.append(viewp->getName()); +			params.styled_message.add().text(viewp->getName()); +  			LLPanel* panelp = dynamic_cast<LLPanel*>(viewp);  			if (panelp && !panelp->getXMLFilename().empty())  			{ -				tool_tip_msg.append("("); -				tool_tip_msg.append(panelp->getXMLFilename()); -				tool_tip_msg.append(")"); +				params.styled_message.add() +					.text("(" + panelp->getXMLFilename() + ")") +					.style.color(LLColor4(0.7f, 0.7f, 1.f, 1.f));  			} -			tool_tip_msg.append("/"); +			params.styled_message.add().text("/");  		}  	}  } @@ -2567,6 +2568,8 @@ void LLViewerWindow::updateUI()  		if (gSavedSettings.getBOOL("DebugShowXUINames"))  		{ +			LLToolTip::Params params; +  			LLView* tooltip_view = mRootView;  			LLView::tree_iterator_t end_it = mRootView->endTreeDFS();  			for (LLView::tree_iterator_t it = mRootView->beginTreeDFS(); it != end_it; ++it) @@ -2599,20 +2602,20 @@ void LLViewerWindow::updateUI()  					// NOTE: this emulates visiting only the leaf nodes that meet our criteria  					if (!viewp->hasAncestor(tooltip_view))  					{ -						append_xui_tooltip(tooltip_view, tool_tip_msg); +						append_xui_tooltip(tooltip_view, params);  						screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect());  					}  					tooltip_view = viewp;  				}  			} -			append_xui_tooltip(tooltip_view, tool_tip_msg); +			append_xui_tooltip(tooltip_view, params);  			screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect()); -			LLToolTipMgr::instance().show(LLToolTip::Params() -				.message(tool_tip_msg) -				.sticky_rect(screen_sticky_rect) -				.max_width(400)); +			params.sticky_rect = screen_sticky_rect; +			params.max_width = 400; + +			LLToolTipMgr::instance().show(params);  		}  		// if there is a mouse captor, nothing else gets a tooltip  		else if (mouse_captor) diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 16bd74f798..62ac8adad0 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -647,7 +647,6 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,  	mWindFreq(0.f),  	mRipplePhase( 0.f ),  	mBelowWater(FALSE), -	mAppearanceAnimSetByUser(FALSE),  	mLastAppearanceBlendTime(0.f),  	mAppearanceAnimating(FALSE),  	mNameString(), @@ -2436,7 +2435,7 @@ void LLVOAvatar::idleUpdateAppearanceAnimation()  			{  				if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)  				{ -					param->stopAnimating(mAppearanceAnimSetByUser); +					param->stopAnimating(FALSE);  				}  			}  			updateVisualParams(); @@ -2459,7 +2458,7 @@ void LLVOAvatar::idleUpdateAppearanceAnimation()  				{  					if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)  					{ -						param->animate(morph_amt, mAppearanceAnimSetByUser); +						param->animate(morph_amt, FALSE);  					}  				}  			} @@ -5372,11 +5371,11 @@ void LLVOAvatar::updateShadowFaces()  //-----------------------------------------------------------------------------  // updateSexDependentLayerSets()  //----------------------------------------------------------------------------- -void LLVOAvatar::updateSexDependentLayerSets( BOOL set_by_user ) +void LLVOAvatar::updateSexDependentLayerSets( BOOL upload_bake )  { -	invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, set_by_user ); -	invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, set_by_user ); -	invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, set_by_user ); +	invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, upload_bake ); +	invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, upload_bake ); +	invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, upload_bake );  }  //----------------------------------------------------------------------------- @@ -5741,7 +5740,7 @@ LLColor4 LLVOAvatar::getGlobalColor( const std::string& color_name ) const  }  // virtual -void LLVOAvatar::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_user ) +void LLVOAvatar::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result )  {  } @@ -5754,18 +5753,18 @@ void LLVOAvatar::setCompositeUpdatesEnabled( BOOL b )  {  } -void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL set_by_user ) +void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake )  {  	if (global_color == mTexSkinColor)  	{ -		invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, set_by_user ); -		invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, set_by_user ); -		invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, set_by_user ); +		invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, upload_bake ); +		invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, upload_bake ); +		invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, upload_bake );  	}  	else if (global_color == mTexHairColor)  	{ -		invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, set_by_user ); -		invalidateComposite( mBakedTextureDatas[BAKED_HAIR].mTexLayerSet, set_by_user ); +		invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, upload_bake ); +		invalidateComposite( mBakedTextureDatas[BAKED_HAIR].mTexLayerSet, upload_bake );  		// ! BACKWARDS COMPATIBILITY !  		// Fix for dealing with avatars from viewers that don't bake hair. @@ -5781,7 +5780,7 @@ void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL  	else if (global_color == mTexEyeColor)  	{  //		llinfos << "invalidateComposite cause: onGlobalColorChanged( eyecolor )" << llendl;  -		invalidateComposite( mBakedTextureDatas[BAKED_EYES].mTexLayerSet,  set_by_user ); +		invalidateComposite( mBakedTextureDatas[BAKED_EYES].mTexLayerSet,  upload_bake );  	}  	updateMeshTextures();  } @@ -6239,14 +6238,14 @@ BOOL LLVOAvatar::teToColorParams( ETextureIndex te, U32 *param_name )  	return TRUE;  } -void LLVOAvatar::setClothesColor( ETextureIndex te, const LLColor4& new_color, BOOL set_by_user ) +void LLVOAvatar::setClothesColor( ETextureIndex te, const LLColor4& new_color, BOOL upload_bake )  {  	U32 param_name[3];  	if( teToColorParams( te, param_name ) )  	{ -		setVisualParamWeight( param_name[0], new_color.mV[VX], set_by_user ); -		setVisualParamWeight( param_name[1], new_color.mV[VY], set_by_user ); -		setVisualParamWeight( param_name[2], new_color.mV[VZ], set_by_user ); +		setVisualParamWeight( param_name[0], new_color.mV[VX], upload_bake ); +		setVisualParamWeight( param_name[1], new_color.mV[VY], upload_bake ); +		setVisualParamWeight( param_name[2], new_color.mV[VZ], upload_bake );  	}  } @@ -6592,7 +6591,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  		{  			if (interp_params)  			{ -				startAppearanceAnimation(FALSE, FALSE); +				startAppearanceAnimation();  			}  			updateVisualParams(); @@ -6977,11 +6976,10 @@ void LLVOAvatar::cullAvatarsByPixelArea()  	}  } -void LLVOAvatar::startAppearanceAnimation(BOOL set_by_user, BOOL play_sound) +void LLVOAvatar::startAppearanceAnimation()  {  	if(!mAppearanceAnimating)  	{ -		mAppearanceAnimSetByUser = set_by_user;  		mAppearanceAnimating = TRUE;  		mAppearanceMorphTimer.reset();  		mLastAppearanceBlendTime = 0.f; diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 173ad02808..2fd1a506a9 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -522,7 +522,7 @@ protected:  	// Composites  	//--------------------------------------------------------------------  public: -	virtual void	invalidateComposite(LLTexLayerSet* layerset, BOOL set_by_user); +	virtual void	invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result);  	virtual void	invalidateAll();  	virtual void	setCompositeUpdatesEnabled(BOOL b); @@ -558,7 +558,7 @@ private:  public:  	void 			updateMeshTextures(); -	void 			updateSexDependentLayerSets(BOOL set_by_user); +	void 			updateSexDependentLayerSets(BOOL upload_bake);  	void 			dirtyMesh(); // Dirty the avatar mesh  	void 			updateMeshData();  protected: @@ -591,7 +591,7 @@ protected:  public:  	void 			processAvatarAppearance(LLMessageSystem* mesgsys);  	void 			hideSkirt(); -	void			startAppearanceAnimation(BOOL set_by_user, BOOL play_sound); +	void			startAppearanceAnimation();  	//--------------------------------------------------------------------  	// Appearance morphing @@ -600,14 +600,13 @@ public:  	BOOL			mAppearanceAnimating;  private:  	LLFrameTimer	mAppearanceMorphTimer; -	BOOL			mAppearanceAnimSetByUser;  	F32				mLastAppearanceBlendTime;  	//--------------------------------------------------------------------  	// Clothing colors (convenience functions to access visual parameters)  	//--------------------------------------------------------------------  public: -	void			setClothesColor(LLVOAvatarDefines::ETextureIndex te, const LLColor4& new_color, BOOL set_by_user); +	void			setClothesColor(LLVOAvatarDefines::ETextureIndex te, const LLColor4& new_color, BOOL upload_bake);  	LLColor4		getClothesColor(LLVOAvatarDefines::ETextureIndex te);  	static BOOL			teToColorParams(LLVOAvatarDefines::ETextureIndex te, U32 *param_name); @@ -616,7 +615,7 @@ public:  	//--------------------------------------------------------------------  public:  	LLColor4		getGlobalColor(const std::string& color_name ) const; -	void			onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL set_by_user); +	void			onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake);  private:  	LLTexGlobalColor* mTexSkinColor;  	LLTexGlobalColor* mTexHairColor; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index a2203ba2ea..185274d40d 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -633,33 +633,33 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name)  	return LLVOAvatar::getJoint(name);  } -/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL set_by_user ) +/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake )  {  	if (!which_param)  	{  		return FALSE;  	}  	LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(which_param->getID()); -	return setParamWeight(param,weight,set_by_user); +	return setParamWeight(param,weight,upload_bake);  } -/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user ) +/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake )  {  	if (!param_name)  	{  		return FALSE;  	}  	LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(param_name); -	return setParamWeight(param,weight,set_by_user); +	return setParamWeight(param,weight,upload_bake);  } -/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user ) +/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake )  {  	LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(index); -	return setParamWeight(param,weight,set_by_user); +	return setParamWeight(param,weight,upload_bake);  } -BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL set_by_user ) +BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL upload_bake )  {  	if (!param)  	{ @@ -675,12 +675,12 @@ BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL  			LLWearable *wearable = gAgentWearables.getWearable(type,count);  			if (wearable)  			{ -				wearable->setVisualParamWeight(param->getID(), weight, set_by_user); +				wearable->setVisualParamWeight(param->getID(), weight, upload_bake);  			}  		}  	} -	return LLCharacter::setVisualParamWeight(param,weight,set_by_user); +	return LLCharacter::setVisualParamWeight(param,weight,upload_bake);  }  /*virtual*/  @@ -691,7 +691,7 @@ void LLVOAvatarSelf::updateVisualParams()  		LLWearable *wearable = gAgentWearables.getTopWearable((EWearableType)type);  		if (wearable)  		{ -			wearable->writeToAvatar(FALSE, FALSE); +			wearable->writeToAvatar();  		}  	} @@ -702,7 +702,7 @@ void LLVOAvatarSelf::updateVisualParams()  void LLVOAvatarSelf::idleUpdateAppearanceAnimation()  {  	// Animate all top-level wearable visual parameters -	gAgentWearables.animateAllWearableParams(calcMorphAmount(), mAppearanceAnimSetByUser); +	gAgentWearables.animateAllWearableParams(calcMorphAmount(), FALSE);  	// apply wearable visual params to avatar  	updateVisualParams(); @@ -737,8 +737,7 @@ void LLVOAvatarSelf::stopMotionFromSource(const LLUUID& source_id)  	}  } -// virtual -void LLVOAvatarSelf::setLocalTextureTE(U8 te, LLViewerTexture* image, BOOL set_by_user, U32 index) +void LLVOAvatarSelf::setLocalTextureTE(U8 te, LLViewerTexture* image, U32 index)  {  	if (te >= TEX_NUM_INDICES)  	{ @@ -1347,7 +1346,7 @@ bool LLVOAvatarSelf::hasPendingBakedUploads() const  	return false;  } -void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_user ) +void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result )  {  	if( !layerset || !layerset->getUpdatesEnabled() )  	{ @@ -1358,7 +1357,7 @@ void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_u  	layerset->requestUpdate();  	layerset->invalidateMorphMasks(); -	if( set_by_user ) +	if( upload_result )  	{  		llassert(isSelf()); @@ -1945,9 +1944,7 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**)  				if (layer_set)  				{  					llinfos << "TAT: rebake - matched entry " << (S32)index << llendl; -					// Apparently set_by_user == force upload -					BOOL set_by_user = TRUE; -					self->invalidateComposite(layer_set, set_by_user); +					self->invalidateComposite(layer_set, TRUE);  					found = TRUE;  					LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_REBAKES);  				} @@ -1983,8 +1980,7 @@ void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug)  				layer_set->cancelUpload();  			} -			BOOL set_by_user = TRUE; -			invalidateComposite(layer_set, set_by_user); +			invalidateComposite(layer_set, TRUE);  			LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_REBAKES);  		}  		else @@ -2047,7 +2043,6 @@ void LLVOAvatarSelf::onCustomizeEnd()  	if (avatarp)  	{  		avatarp->invalidateAll(); -		avatarp->requestLayerSetUploads();  	}  } @@ -2084,7 +2079,6 @@ void LLVOAvatarSelf::setInvisible(BOOL newvalue)  	{  		setCompositeUpdatesEnabled(TRUE);  		invalidateAll(); -		requestLayerSetUploads();  		gAgent.sendAgentSetAppearance();  	}  } diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 8a66422c44..6702f030fe 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -86,15 +86,15 @@ public:  	/*virtual*/ void 		requestStopMotion(LLMotion* motion);  	/*virtual*/ LLJoint*	getJoint(const std::string &name); -	/*virtual*/ BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL set_by_user = FALSE ); -	/*virtual*/ BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user = FALSE ); -	/*virtual*/ BOOL setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user = FALSE ); +	/*virtual*/ BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE ); +	/*virtual*/ BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake = FALSE ); +	/*virtual*/ BOOL setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake = FALSE );  	/*virtual*/ void updateVisualParams();  	/*virtual*/ void idleUpdateAppearanceAnimation();  private:  	// helper function. Passed in param is assumed to be in avatar's parameter list. -	BOOL setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL set_by_user = FALSE ); +	BOOL setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL upload_bake = FALSE );  /**                    Initialization @@ -186,7 +186,7 @@ public:  	BOOL				getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture** image_gl_pp, U32 index) const;  	LLViewerFetchedTexture*	getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, U32 index) const;  	const LLUUID&		getLocalTextureID(LLVOAvatarDefines::ETextureIndex type, U32 index) const; -	void				setLocalTextureTE(U8 te, LLViewerTexture* image, BOOL set_by_user, U32 index); +	void				setLocalTextureTE(U8 te, LLViewerTexture* image, U32 index);  	const LLUUID&		grabLocalTexture(LLVOAvatarDefines::ETextureIndex type, U32 index) const;  	BOOL				canGrabLocalTexture(LLVOAvatarDefines::ETextureIndex type, U32 index) const;  	/*virtual*/ void	setLocalTexture(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index); @@ -228,7 +228,7 @@ public:  	// Composites  	//--------------------------------------------------------------------  public: -	/* virtual */ void	invalidateComposite(LLTexLayerSet* layerset, BOOL set_by_user); +	/* virtual */ void	invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result);  	/* virtual */ void	invalidateAll();  	/* virtual */ void	setCompositeUpdatesEnabled(BOOL b); // only works for self  	void				setupComposites(); diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index 89649407ff..d93913b944 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -306,8 +306,10 @@ void LLVoiceChannel::activate()  		// activating the proximal channel between IM calls  		LLVoiceChannel* old_channel = sCurrentVoiceChannel;  		sCurrentVoiceChannel = this; +		mCallDialogPayload["old_channel_name"] = "";  		if (old_channel)  		{ +			mCallDialogPayload["old_channel_name"] = old_channel->getSessionName();  			old_channel->deactivate();  		}  	} @@ -870,6 +872,19 @@ void LLVoiceChannelP2P::setState(EState state)  {  	// HACK: Open/close the call window if needed.  	toggleCallWindowIfNeeded(state); +	 +	// *HACK: open outgoing call floater if needed, might be better done elsewhere. +	mCallDialogPayload["session_id"] = mSessionID; +	mCallDialogPayload["session_name"] = mSessionName; +	mCallDialogPayload["other_user_id"] = mOtherUserID; +	if (!mReceivedCall && state == STATE_RINGING) +	{ +		llinfos << "RINGINGGGGGGGG " << mSessionName << llendl; +		if (!mSessionName.empty()) +		{ +			LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE); +		} +	}  	// you only "answer" voice invites in p2p mode  	// so provide a special purpose message here diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h index 20b6157b48..639585de55 100644 --- a/indra/newview/llvoicechannel.h +++ b/indra/newview/llvoicechannel.h @@ -109,6 +109,7 @@ protected:  	EState		mState;  	std::string	mSessionName;  	LLSD mNotifyArgs; +	LLSD mCallDialogPayload;  	BOOL		mIgnoreNextSessionLeave;  	LLHandle<LLPanel> mLoginNotificationHandle; diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 39d4bb0c02..5fedfc943b 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -1598,7 +1598,7 @@ void LLVoiceClient::stateMachine()  				}  				else  				{ -					LL_WARNS("Voice") << "region doesn't have ParcelVoiceInfoRequest capability.  This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL; +					LL_WARNS_ONCE("Voice") << "region doesn't have ParcelVoiceInfoRequest capability.  This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL;  				}  			}  		} @@ -4273,7 +4273,7 @@ void LLVoiceClient::mediaStreamUpdatedEvent(  				if(incoming)  				{  					// Send the voice chat invite to the GUI layer -					// TODO: Question: Should we correlate with the mute list here? +					// *TODO: Question: Should we correlate with the mute list here?  					session->mIMSessionID = LLIMMgr::computeSessionID(IM_SESSION_P2P_INVITE, session->mCallerID);  					session->mVoiceInvitePending = true;  					if(session->mName.empty()) diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index 3185ee45bf..c5c97e7649 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -602,7 +602,7 @@ void LLWearable::setTexturesToDefaults()  }  // Updates the user's avatar's appearance -void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater ) +void LLWearable::writeToAvatar()  {  	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();  	llassert( avatar ); @@ -622,24 +622,10 @@ void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater  			S32 param_id = param->getID();  			F32 weight = getVisualParamWeight(param_id); -			// only animate with user-originated changes -			if (set_by_user) -			{ -				param->setAnimationTarget(weight, set_by_user); -			} -			else -			{ -				avatar->setVisualParamWeight( param_id, weight, set_by_user ); -			} +			avatar->setVisualParamWeight( param_id, weight, FALSE );  		}  	} -	// only interpolate with user-originated changes -	if (set_by_user) -	{ -		avatar->startAppearanceAnimation(TRUE, TRUE); -	} -  	// Pull texture entries  	for( S32 te = 0; te < TEX_NUM_INDICES; te++ )  	{ @@ -657,24 +643,17 @@ void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater  			}  			LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE );  			// MULTI-WEARABLE: replace hard-coded 0 -			avatar->setLocalTextureTE(te, image, set_by_user, 0); +			avatar->setLocalTextureTE(te, image, 0);  		}  	} - -	if( gFloaterCustomize && update_customize_floater ) -	{ -		gFloaterCustomize->setWearable(mType, 0); -		gFloaterCustomize->setCurrentWearableType( mType ); -	} -  	ESex new_sex = avatar->getSex();  	if( old_sex != new_sex )  	{ -		avatar->updateSexDependentLayerSets( set_by_user ); +		avatar->updateSexDependentLayerSets( FALSE );  	}	 -//	if( set_by_user ) +//	if( upload_bake )  //	{  //		gAgent.sendAgentSetAppearance();  //	} @@ -683,7 +662,7 @@ void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater  // Updates the user's avatar's appearance, replacing this wearables' parameters and textures with default values.  // static  -void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user ) +void LLWearable::removeFromAvatar( EWearableType type, BOOL upload_bake )  {  	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();  	llassert( avatar ); @@ -707,7 +686,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user )  		if( (((LLViewerVisualParam*)param)->getWearableType() == type) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )  		{  			S32 param_id = param->getID(); -			avatar->setVisualParamWeight( param_id, param->getDefaultWeight(), set_by_user ); +			avatar->setVisualParamWeight( param_id, param->getDefaultWeight(), upload_bake );  		}  	} @@ -719,7 +698,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user )  	avatar->updateVisualParams();  	avatar->wearableUpdated(type); -//	if( set_by_user ) +//	if( upload_bake )  //	{  //		gAgent.sendAgentSetAppearance();  //	} @@ -868,12 +847,12 @@ void LLWearable::setVisualParams()  } -void LLWearable::setVisualParamWeight(S32 param_index, F32 value, BOOL set_by_user) +void LLWearable::setVisualParamWeight(S32 param_index, F32 value, BOOL upload_bake)  {  	if( is_in_map(mVisualParamIndexMap, param_index ) )  	{  		LLVisualParam *wearable_param = mVisualParamIndexMap[param_index]; -		wearable_param->setWeight(value, set_by_user); +		wearable_param->setWeight(value, upload_bake);  	}  	else  	{ @@ -914,14 +893,14 @@ void LLWearable::getVisualParams(visual_param_vec_t &list)  	}  } -void LLWearable::animateParams(F32 delta, BOOL set_by_user) +void LLWearable::animateParams(F32 delta, BOOL upload_bake)  {  	for(visual_param_index_map_t::iterator iter = mVisualParamIndexMap.begin();  		 iter != mVisualParamIndexMap.end();  		 ++iter)  	{  		LLVisualParam *param = (LLVisualParam*) iter->second; -		param->animate(delta, set_by_user); +		param->animate(delta, upload_bake);  	}  } @@ -939,14 +918,14 @@ LLColor4 LLWearable::getClothesColor(S32 te) const  	return color;  } -void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL set_by_user ) +void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL upload_bake )  {  	U32 param_name[3];  	if( LLVOAvatar::teToColorParams( (LLVOAvatarDefines::ETextureIndex)te, param_name ) )  	{  		for( U8 index = 0; index < 3; index++ )  		{ -			setVisualParamWeight(param_name[index], new_color.mV[index], set_by_user); +			setVisualParamWeight(param_name[index], new_color.mV[index], upload_bake);  		}  	}  } diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h index 96631811c5..fd19a86406 100644 --- a/indra/newview/llwearable.h +++ b/indra/newview/llwearable.h @@ -89,9 +89,9 @@ public:  	BOOL				isDirty() const;  	BOOL				isOldVersion() const; -	void				writeToAvatar( BOOL set_by_user, BOOL update_customize_floater = TRUE ); -	void				removeFromAvatar( BOOL set_by_user )	{ LLWearable::removeFromAvatar( mType, set_by_user ); } -	static void			removeFromAvatar( EWearableType type, BOOL set_by_user );  +	void				writeToAvatar(); +	void				removeFromAvatar( BOOL upload_bake )	{ LLWearable::removeFromAvatar( mType, upload_bake ); } +	static void			removeFromAvatar( EWearableType type, BOOL upload_bake );   	BOOL				exportFile(LLFILE* file) const;  	BOOL				importFile(LLFILE* file); @@ -115,14 +115,14 @@ public:  	void				setLocalTextureObject(S32 index, LLLocalTextureObject *lto);  	void				addVisualParam(LLVisualParam *param);  	void				setVisualParams(); -	void 				setVisualParamWeight(S32 index, F32 value, BOOL set_by_user); +	void 				setVisualParamWeight(S32 index, F32 value, BOOL upload_bake);  	F32					getVisualParamWeight(S32 index) const;  	LLVisualParam*		getVisualParam(S32 index) const;  	void				getVisualParams(visual_param_vec_t &list); -	void				animateParams(F32 delta, BOOL set_by_user); +	void				animateParams(F32 delta, BOOL upload_bake);  	LLColor4			getClothesColor(S32 te) const; -	void 				setClothesColor( S32 te, const LLColor4& new_color, BOOL set_by_user ); +	void 				setClothesColor( S32 te, const LLColor4& new_color, BOOL upload_bake );  	void				revertValues(); diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp index 8d3165b98c..9897f40c4e 100644 --- a/indra/newview/llworldmipmap.cpp +++ b/indra/newview/llworldmipmap.cpp @@ -196,7 +196,7 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32  	// END DEBUG  	//LL_INFOS("World Map") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL; -	LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); +	LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);  	img->setBoostLevel(LLViewerTexture::BOOST_MAP);  	// Return the smart pointer diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 1129e9ffd1..507c726e02 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -512,16 +512,18 @@ void LLPipeline::resizeScreenTexture()  	LLFastTimer ft(FTM_RESIZE_SCREEN_TEXTURE);  	if (gPipeline.canUseVertexShaders() && assertInitialized())  	{ -		GLuint resX = gViewerWindow->getWorldViewWidthRaw(); -		GLuint resY = gViewerWindow->getWorldViewHeightRaw(); +		GLuint resX = gViewerWindow->getWindowWidthRaw(); +		GLuint resY = gViewerWindow->getWindowHeightRaw(); +		GLuint view_width = gViewerWindow->getWorldViewWidthRaw(); +		GLuint view_height = gViewerWindow->getWorldViewHeightRaw(); -		allocateScreenBuffer(resX,resY); +		allocateScreenBuffer(resX, resY, view_width, view_height);  		llinfos << "RESIZED SCREEN TEXTURE: " << resX << "x" << resY << llendl;  	}  } -void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) +void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U32 viewport_height)  {  	U32 samples = gSavedSettings.getU32("RenderFSAASamples"); @@ -542,18 +544,24 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		//allocate deferred rendering color buffers  		mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);  		mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); +		mDeferredScreen.setViewport(viewport_width, viewport_height); +		mDeferredDepth.setViewport(viewport_width, viewport_height);  		addDeferredAttachments(mDeferredScreen);  		mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		  		mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); +		mScreen.setViewport(viewport_width, viewport_height); +		mEdgeMap.setViewport(viewport_width, viewport_height);  		for (U32 i = 0; i < 3; i++)  		{  			mDeferredLight[i].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); +			mDeferredLight[i].setViewport(viewport_width, viewport_height);  		}  		for (U32 i = 0; i < 2; i++)  		{  			mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); +			mGIMapPost[i].setViewport(viewport_width, viewport_height);  		}  		F32 scale = gSavedSettings.getF32("RenderShadowResolutionScale"); @@ -561,6 +569,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		for (U32 i = 0; i < 4; i++)  		{  			mShadow[i].allocate(U32(resX*scale),U32(resY*scale), 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE); +			mShadow[i].setViewport(viewport_width, viewport_height);  		} @@ -570,6 +579,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		for (U32 i = 4; i < 6; i++)  		{  			mShadow[i].allocate(width, height, 0, TRUE, FALSE); +			mShadow[i].setViewport(viewport_width, viewport_height);  		} @@ -577,16 +587,19 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		width = nhpo2(resX)/2;  		height = nhpo2(resY)/2;  		mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE); +		mLuminanceMap.setViewport(viewport_width, viewport_height);  	}  	else  	{  		mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		 +		mScreen.setViewport(viewport_width, viewport_height);  	}  	if (gGLManager.mHasFramebufferMultisample && samples > 1)  	{  		mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples); +		mSampleBuffer.setViewport(viewport_width, viewport_height);  		mScreen.setSampleBuffer(&mSampleBuffer);  		if (LLPipeline::sRenderDeferred) @@ -698,8 +711,10 @@ void LLPipeline::createGLBuffers()  	stop_glerror(); -	GLuint resX = gViewerWindow->getWorldViewWidthRaw(); -	GLuint resY = gViewerWindow->getWorldViewHeightRaw(); +	GLuint resX = gViewerWindow->getWindowWidthRaw(); +	GLuint resY = gViewerWindow->getWindowHeightRaw(); +	GLuint viewport_width = gViewerWindow->getWorldViewWidthRaw(); +	GLuint viewport_height = gViewerWindow->getWorldViewHeightRaw();  	if (LLPipeline::sRenderGlow)  	{ //screen space glow buffers @@ -711,7 +726,7 @@ void LLPipeline::createGLBuffers()  			mGlow[i].allocate(512,glow_res,GL_RGBA,FALSE,FALSE);  		} -		allocateScreenBuffer(resX,resY); +		allocateScreenBuffer(resX,resY, viewport_width, viewport_height);  	}  	if (sRenderDeferred) diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index ce50a37405..9193e19bb1 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -111,7 +111,7 @@ public:  	void resizeScreenTexture();  	void releaseGLBuffers();  	void createGLBuffers(); -	void allocateScreenBuffer(U32 resX, U32 resY); +	void allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U32 viewport_height);  	void resetVertexBuffers(LLDrawable* drawable);  	void setUseVBO(BOOL use_vbo); diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 7e19a80c10..028a5844c6 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -513,7 +513,7 @@       reference="White" />      <color       name="ObjectChatColor" -     reference="LtGray" /> +     reference="0.7 0.8 0.9 1" />      <color       name="OverdrivenColor"       value="1 0 0 1" /> diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index e881665578..eea2dfb1a1 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -531,6 +531,8 @@    <texture name="Toolbar_Right_Off" file_name="containers/Toolbar_Right_Off.png" preload="false" />    <texture name="Toolbar_Right_Press" file_name="containers/Toolbar_Right_Press.png" preload="false" />    <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" /> +   +  <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="16" scale.right="100" scale.bottom="3" />    <texture name="TrashItem_Disabled" file_name="icons/TrashItem_Disabled.png" preload="false" />    <texture name="TrashItem_Off" file_name="icons/TrashItem_Off.png" preload="false" /> diff --git a/indra/newview/skins/default/textures/widgets/Tooltip.png b/indra/newview/skins/default/textures/widgets/Tooltip.png Binary files differnew file mode 100644 index 0000000000..f989ac9083 --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/Tooltip.png diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml index a0f9bb59fd..3a1499eaaa 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml @@ -16,7 +16,7 @@      </floater.string>      <floater.string       name="no_one_near"> -        No-one near +        No one near      </floater.string>      <floater.string       name="no_results"> diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml index 5c09bc3a02..2af451400e 100644 --- a/indra/newview/skins/default/xui/en/floater_camera.xml +++ b/indra/newview/skins/default/xui/en/floater_camera.xml @@ -49,22 +49,57 @@           top="22"           visible="false"           width="78" /> -         <!--TODO: replace with slider, + - images --> - <joystick_zoom -         follows="top|left" -         height="78" -         image_unselected="ScrollThumb_Vert" -         layout="topleft" -         left="7" -         minus_image="ScrollThumb_Vert" -         name="zoom" -         plus_image="ScrollThumb_Vert" -         quadrant="left" -         scale_image="false" -         sound_flags="3" -         tool_tip="Zoom camera toward focus" -         top="22" -         width="20" /> +         <!--TODO: replace + - images --> +         <panel +            border="false" +            class="camera_zoom_panel" +            height="94" +            layout="topleft" +            left="7" +            mouse_opaque="false" +            name="zoom" +            top="22" +            width="18"> +           <button +              follows="top|left" +              height="18" +              image_disabled="AddItem_Disabled" +              image_selected="AddItem_Press" +              image_unselected="AddItem_Off" +              layout="topleft" +              name="zoom_plus_btn" +              width="18"> +             <commit_callback +                function="Zoom.plus" /> +             <mouse_held_callback +                function="Zoom.plus" /> +           </button> +           <slider_bar +              height="48" +              layout="topleft" +              name="zoom_slider" +              orientation="vertical" +              tool_tip="Zoom camera toward focus" +              top_pad="0" +              width="18"> +             <commit_callback function="Slider.value_changed"/> +           </slider_bar> +           <button +              follows="top|left" +              height="18" +              image_disabled="AddItem_Disabled" +              image_selected="AddItem_Press" +              image_unselected="AddItem_Off" +              layout="topleft" +              name="zoom_minus_btn" +              top_pad="0" +              width="18"> +             <commit_callback +                function="Zoom.minus" /> +             <mouse_held_callback +                function="Zoom.minus" /> +           </button> +         </panel>           <joystick_rotate           follows="top|left"           height="78" @@ -80,7 +115,7 @@           tool_tip="Orbit camera around focus"           top="22"           width="78" /> -            <panel +         <panel           height="78"           layout="topleft"           left="36" diff --git a/indra/newview/skins/default/xui/en/floater_incoming_call.xml b/indra/newview/skins/default/xui/en/floater_incoming_call.xml index 16873df310..9c2898945b 100644 --- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml @@ -4,13 +4,17 @@   can_close="false"   can_minimize="false"   can_tear_off="false" - height="200" + height="125"   layout="topleft"   name="incoming call"   help_topic="incoming_call"   title="UNKNOWN PERSON IS CALLING" - width="240"> -     <floater.string + width="410"> +    <floater.string +     name="localchat"> +        Local Voice Chat +    </floater.string> +    <floater.string       name="anonymous">          anonymous      </floater.string> @@ -31,18 +35,26 @@       left_delta="19"       top="35"       width="36" /> -    <text_editor -     font="SansSerif" -     height="64" -     border_visible="false" +    <text +     font="SansSerifLarge" +     height="20"       layout="topleft"       left="77" -     max_length="2147483647"       name="caller name" -     read_only="true" -     top="21" -     width="163" +     top="27" +     width="315"       word_wrap="true" /> +    <text +     font="SansSerif" +     height="50" +     layout="topleft" +     left="77" +     name="question" +     top="52" +     width="315" +     word_wrap="true"> +     Do you want to leave [CURRENT_CHAT] and join this voice chat? +    </text>      <button       height="24"       label="Accept" @@ -57,16 +69,14 @@       label="Reject"       label_selected="Reject"       layout="topleft" -     left_delta="0"       name="Reject" -     top_pad="12" +     left_pad="10"       width="100" />      <button       height="24"       label="Start IM"       layout="topleft" -     left_delta="0"       name="Start IM" -     top_pad="12" +     left_pad="10"       width="100" />  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml index 30639f955f..b48c962413 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory.xml @@ -36,10 +36,10 @@  	 filename="panel_main_inventory.xml"  	 follows="all"  	 layout="topleft" +	 hide_top_panel="true"  	 left="0"  	 label="Inventory Panel"  	 name="Inventory Panel"  	 top="15" -	 width="467"> -</panel> +	 width="467" />  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_media_settings.xml b/indra/newview/skins/default/xui/en/floater_media_settings.xml index 68dd2001af..8122386fae 100644 --- a/indra/newview/skins/default/xui/en/floater_media_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_media_settings.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater   legacy_header_height="18" - bottom="-666"  + bottom="666"    can_close="true"    can_drag_on_left="false"    can_minimize="true" @@ -12,14 +12,14 @@   width="365"    height="535"    left="330"  - min_height="430"  - min_width="620" + min_height="535"  + min_width="365"   mouse_opaque="true"  - name="Media Settings"  + name="media_settings"    help_topic = "media_settings"   title="MEDIA SETTINGS">  	<button  -	 bottom="-525"  +	 bottom="525"   	 enabled="true"   	 follows="right|bottom"   	 font="SansSerif" @@ -61,7 +61,7 @@  	 scale_image="true"  	 width="90" />  	<tab_container  -	 bottom="-500"  +	 bottom="500"   	 enabled="true"   	 follows="left|top|right|bottom"   	 height="485" diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml new file mode 100644 index 0000000000..44956f7e52 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + can_close="false" + can_minimize="false" + can_tear_off="false" + height="125" + layout="topleft" + name="outgoing call" + help_topic="outgoing_call" + title="CALLING" + width="410"> +    <floater.string +     name="localchat"> +        Local Voice Chat +    </floater.string> +    <floater.string +     name="anonymous"> +        anonymous +    </floater.string> +    <floater.string +     name="VoiceInviteP2P"> +        is calling. +    </floater.string> +    <floater.string +     name="VoiceInviteAdHoc"> +        has joined a Voice Chat call with a conference chat. +    </floater.string> +    <avatar_icon +     enabled="false" +     follows="left|top" +     height="36" +     image_name="icon_avatar_online.tga" +     layout="topleft" +     left_delta="19" +     top="35" +     width="36" /> +    <text +     font="SansSerifLarge" +     height="20" +     layout="topleft" +     left="77" +     name="calling" +     top="27" +     width="315" +     word_wrap="true"> +Calling [CALLEE_NAME] +    </text> +    <text +     font="SansSerif" +     height="50" +     layout="topleft" +     left="77" +     name="leaving" +     top="52" +     width="315" +     word_wrap="true"> +Leaving [CURRENT_CHAT]. +    </text> +    <button +     height="24" +     label="Cancel" +     label_selected="Cancel" +     left="70" +     layout="topleft" +     name="Cancel" +     left_pad="10" +     width="100" /> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index b9cf456842..d9498586af 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -25,7 +25,7 @@          Done      </floater.string>      <layout_stack -     bottom="400" +     bottom="512"       follows="left|right|top|bottom"       layout="topleft"       left="10" @@ -54,7 +54,7 @@               layout="topleft"               left_delta="0"               name="status_text" -             top_pad="4" +             top_pad="5"               width="150" />          </layout_panel>      </layout_stack> diff --git a/indra/newview/skins/default/xui/en/floater_test_slider.xml b/indra/newview/skins/default/xui/en/floater_test_slider.xml index 57d8e686ce..86ff82e01f 100644 --- a/indra/newview/skins/default/xui/en/floater_test_slider.xml +++ b/indra/newview/skins/default/xui/en/floater_test_slider.xml @@ -57,6 +57,13 @@       width="200" />      <slider_bar       bottom="320" +     height="100" +     left="20" +     name="slider_bar_vertical" +     orientation="vertical" +     width="20" /> +    <slider_bar +     bottom="300"       height="20"       increment="1"       initial_value="2.0" @@ -64,6 +71,7 @@       layout="topleft"       max_val="5"       min_val="1" +     left_pad="20"       name="slider_bar"       width="300" />      <slider diff --git a/indra/newview/skins/default/xui/en/floater_test_widgets.xml b/indra/newview/skins/default/xui/en/floater_test_widgets.xml index 44dcb07526..a2055d8c52 100644 --- a/indra/newview/skins/default/xui/en/floater_test_widgets.xml +++ b/indra/newview/skins/default/xui/en/floater_test_widgets.xml @@ -385,6 +385,16 @@ line to actually fit         left="10"         width="250"          follows="top|left" +       font.name="Monospace" +       name="test_text10" +       tool_tip="text"> +        Monospace Button Flyout Checkbox +      </text> +      <text +       top_pad="10" +       left="10" +       width="250"  +       follows="top|left"         font.name="SansSerifSmall"         name="test_text10"         tool_tip="text"> diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index c33d7cf31d..b2f46bc433 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -262,6 +262,18 @@  		  <check_box.commit_callback  			function="BuildTool.selectComponent"/>  	</check_box> + +   <text +   text_color="LtGray_50" +   follows="top|left" +   halign="left" +   left="13" +   name="RenderingCost" +   top_pad="9" +   type="string" +   width="100"> +   þ: [COUNT] +   </text>  	<check_box       control_name="ScaleUniform"       height="19" @@ -325,7 +337,7 @@  	 <button.commit_callback  	     function="BuildTool.gridOptions"/>  	</button> -    <button +   <button       follows="left|top"       height="20"       image_disabled="Object_Cube" @@ -701,6 +713,7 @@  	     function="BuildTool.applyToSelection"/>      </button>      <text +    text_color="LtGray_50"       type="string"       length="1"       height="12" @@ -714,6 +727,7 @@          Objects: [COUNT]      </text>      <text +    text_color="LtGray_50"       type="string"       length="1"       follows="left|top" @@ -730,7 +744,7 @@       halign="center"       left="0"       name="Object Info Tabs" -     tab_max_width="55" +     tab_max_width="54"       tab_min_width="40"       tab_position="top"       tab_height="25" diff --git a/indra/newview/skins/default/xui/en/floater_tos.xml b/indra/newview/skins/default/xui/en/floater_tos.xml index 4e2cce1428..1adb824e2a 100644 --- a/indra/newview/skins/default/xui/en/floater_tos.xml +++ b/indra/newview/skins/default/xui/en/floater_tos.xml @@ -53,22 +53,6 @@          Please read the following Terms of Service carefully. To continue logging in to [SECOND_LIFE],  you must accept the agreement.      </text> -    <text_editor -     type="string" -     length="1" -     follows="left|top" -     font="SansSerif" -     height="283" -     layout="topleft" -     left_delta="0" -     max_length="65536" -     name="tos_text" -     top_pad="43" -     width="568" -     handle_edit_keys_directly="true"  -     word_wrap="true"> -        TOS_TEXT -    </text_editor>      <web_browser       follows="left|top"       height="340" @@ -76,6 +60,6 @@ you must accept the agreement.       left_delta="0"       name="tos_html"       start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E" -     top_delta="-27" +     top_delta="0"       width="568" />  </floater> diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml index e5e5007c56..f48af2f97e 100644 --- a/indra/newview/skins/default/xui/en/inspect_group.xml +++ b/indra/newview/skins/default/xui/en/inspect_group.xml @@ -31,7 +31,7 @@       use_ellipses="true"       width="240"       word_wrap="false"> -    Grumpity's Grumpy Group of Moose +    Grumpity's Grumpy Group of Moose    </text>    <text     follows="all" diff --git a/indra/newview/skins/default/xui/en/inspect_remote_object.xml b/indra/newview/skins/default/xui/en/inspect_remote_object.xml new file mode 100644 index 0000000000..07c684d904 --- /dev/null +++ b/indra/newview/skins/default/xui/en/inspect_remote_object.xml @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- +  Not can_close / no title to avoid window chrome +  Single instance - only have one at a time, recycle it each spawn +--> +<floater + legacy_header_height="18" + bevel_style="in" + bg_opaque_image="Inspector_Background"  + can_close="false" + can_minimize="false" + height="145" + layout="topleft" + name="inspect_remote_object" + single_instance="true" + sound_flags="0" + visible="true" + width="300"> +  <text +   follows="all" +   font="SansSerifLargeBold" +   height="16" +   left="8" +   name="object_name" +   text_color="White" +   top="5" +   use_ellipses="true" +   width="290"> +     Test Object Name That Is Really Long +  </text> +  <text +   follows="all" +   font="SansSerif" +   height="20" +   left="8" +   name="object_owner_label" +   width="55" +   top_pad="20"> +     Owner: +  </text> +  <text +   follows="top|left" +   font="SansSerif" +   height="20" +   left_pad="10" +   name="object_owner" +   use_ellipses="true" +   width="200" +   word_wrap="false"> +     Longavatarname Johnsonlongstonnammer +  </text> +  <text +   follows="top|left" +   font="SansSerif" +   height="20" +   left="8" +   name="object_slurl_label" +   top_pad="10" +   width="55"> +     Location: +  </text> +  <text +   follows="top|left" +   height="20" +   left_pad="10" +   name="object_slurl" +   width="240" +   use_ellipses="true" +   word_wrap="false"> +     http://slurl.com/Ahern/50/50/50 +  </text> +  <button +   follows="top|left" +   font="SansSerif" +   height="20" +   label="Map" +   left="10" +   name="map_btn" +   top="114" +   width="75" /> +  <button +   follows="top|left" +   font="SansSerif" +   height="20" +   label="Block" +   left_pad="5" +   name="block_btn" +   top_delta="0" +   width="75" /> +  <button +   follows="top|left" +   font="SansSerif" +   height="20" +   label="Close" +   right="-10" +   name="close_btn" +   top_delta="0" +   width="75" /> +</floater> diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index 08f7ee456e..9e35c95d45 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -51,6 +51,13 @@                 name="main_view"                 user_resize="true"                 width="500"> +          <view bottom="500" +                follows="all" +                height="500" +                left="0" +                mouse_opaque="false" +                name="world_view_rect" +                width="500"/>            <layout_stack border_size="0"                          bottom="500"                          follows="all" @@ -66,13 +73,6 @@                     mouse_opaque="false"                     name="hud container"                     width="500"> -              <view bottom="500" -                    follows="all" -                    height="500" -                    left="0" -                    mouse_opaque="false" -                    name="world_view_rect" -                    width="500"/>                <panel follows="right|top|bottom"                       height="500"                       mouse_opaque="false" diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index 5eb0560962..07940e18b6 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -185,6 +185,21 @@          <menu_item_call.on_click           function="Advanced.ShowSideTray" />        </menu_item_call> +        <menu_item_call +         label="Widget Test" +         name="Widget Test" +         shortcut="control|shift|T"> +            <menu_item_call.on_click +             function="ShowFloater" +             parameter="test_widgets" /> +        </menu_item_call> +        <menu_item_call +         label="Inspectors Test" +         name="Inspectors Test"> +            <menu_item_call.on_click +             function="ShowFloater" +             parameter="test_inspectors" /> +        </menu_item_call>        <menu_item_check           label="Reg In Client Test (restart)"           name="Reg In Client Test (restart)"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index ccd8bc569e..ff0cd7ffeb 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4696,7 +4696,12 @@ The objects on the selected parcel that are NOT owned by you have been returned     icon="notify.tga"     name="ServerObjectMessage"     type="notify"> +Message from [NAME]:  [MSG] +    <usetemplate +     name="okcancelbuttons" +     notext="OK" +     yestext="Inspect"/>    </notification>    <notification @@ -5013,6 +5018,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a     name="GodMessage"     type="notify">  [NAME] +  [MESSAGE]    </notification> diff --git a/indra/newview/skins/default/xui/en/panel_activeim_row.xml b/indra/newview/skins/default/xui/en/panel_activeim_row.xml index 8b815b0f71..5562ec8406 100644 --- a/indra/newview/skins/default/xui/en/panel_activeim_row.xml +++ b/indra/newview/skins/default/xui/en/panel_activeim_row.xml @@ -15,7 +15,16 @@  		top="3"  		left="5"  		height="25" -		width="25"> +		width="25" +    visible="false" +    speaker.name="speaker_p2p" +    speaker.width="20" +    speaker.height="25" +    speaker.left="25" +    speaker.top="25" +    speaker.auto_update="true" +    speaker.draw_border="false" +    speaker.visible="false">    </chiclet_im_p2p>    <chiclet_im_group  		name="group_chiclet" @@ -24,14 +33,41 @@  		top="3"  		left="5"  		height="25" -		width="25"> +		width="25" +    visible="false" +    speaker.name="speaker_grp" +    speaker.width="20" +    speaker.height="25" +    speaker.left="25" +    speaker.top="25" +    speaker.auto_update="true" +    speaker.draw_border="false" +    speaker.visible="false">    </chiclet_im_group> +  <chiclet_im_adhoc +		name="adhoc_chiclet" +		layout="topleft" +		follows="left" +		top="3" +		left="5" +		height="25" +		width="25" +    visible="false" +    speaker.name="speaker_hoc" +    speaker.width="20" +    speaker.height="25" +    speaker.left="25" +    speaker.top="25" +    speaker.auto_update="true" +    speaker.draw_border="false" +    speaker.visible="false"> +  </chiclet_im_adhoc>  	<text  		type="string"  		name="contact_name"  		layout="topleft"  		top="10" -		left_pad="0" +		left_pad="20"  		height="14"  		width="245"  		length="1" diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml index 0c42686531..2eaa3a94ee 100644 --- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml @@ -30,7 +30,7 @@      <avatar_icon       follows="top|left"       height="20" -     image_name="smile.png" +     default_icon_name="Generic_Person"       layout="topleft"       left="5"       mouse_opaque="true" diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index ca6d8334a2..3c16a439d9 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -13,6 +13,8 @@   chrome="true"   border_visible="false"   width="1000"> +  <string name="SpeakBtnToolTip">Turns microphone on/off</string> +  <string name="VoiceControlBtnToolTip">Shows/hides voice control panel</string>      <layout_stack       mouse_opaque="false"       border_size="0" @@ -45,7 +47,7 @@           min_height="23"           width="310"           top="0" -         min_width="310" +         min_width="192"           name="chat_bar"           user_resize="false"           filename="panel_nearby_chat_bar.xml" /> @@ -70,9 +72,7 @@             left="0"             name="talk"             top="3" -          width="100" -          speak_button.tool_tip="Turns microphone on/off" -          show_button.tool_tip="Shows/hides voice control panel" /> +          width="100" />          </layout_panel>          <icon              auto_resize="false" @@ -92,13 +92,13 @@           height="28"           layout="topleft"           min_height="28" -         width="80" +         width="82"           top_delta="0" -         min_width="76" +         min_width="82"           name="gesture_panel"           user_resize="false"> -         <button -           follows="right" +         <gesture_combo_box +          follows="left|right"            height="23"            label="Gesture"            layout="topleft" @@ -106,7 +106,7 @@            left="0"            top="3"           use_ellipses="true" -          width="80" +          width="82"            tool_tip="Shows/hides gestures"/>          </layout_panel>  		 <icon @@ -129,8 +129,9 @@           layout="topleft"           min_height="28"           name="movement_panel" +         user_resize="false"           width="80" -         min_width="76"> +         min_width="80">              <button               follows="left|right"               height="23" @@ -166,10 +167,10 @@           height="28"           layout="topleft"           min_height="28" -         min_width="76" +         min_width="80"           name="cam_panel" -         top_delta="-10" -         width="100"> +         user_resize="false" +         width="80">              <button               follows="left|right"               height="23" @@ -205,6 +206,7 @@           follows="left|right"           height="28"           layout="topleft" +         min_width="40"           name="snapshot_panel"           width="40">              <button @@ -231,15 +233,18 @@           top="0"           name="chiclet_list_panel"           width="189" -         min_width="189" +         min_width="180"           user_resize="false"           auto_resize="true"> +<!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same  +as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991-->              <chiclet_panel  	    mouse_opaque="false"               follows="left|right"               height="28"               layout="topleft"               left="0" +             min_width="180"               name="chiclet_list"               top="0"               chiclet_padding="3" @@ -313,9 +318,9 @@                 />                 <unread_notifications                 width="34" -               height="23" -               left="22" -               top="23" /> +               height="20" +               left="0" +               top="19" />  	    </chiclet_notification>          </layout_panel>         <icon diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml index 4f24c7a745..58a78a0ab8 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -8,7 +8,7 @@   left="0"   top="0"   name="general_tab" - width="303"> + width="310">      <panel.string       name="help_text">          The General tab contains general information about this group, a list of members, general Group Preferences and member options. @@ -32,7 +32,7 @@ Hover your mouse over the options for more help.       max_length="511"       name="charter"       top="5" -     width="303" +     width="305"       word_wrap="true">       Group Charter      </text_editor> @@ -43,10 +43,10 @@ Hover your mouse over the options for more help.       heading_height="16"       height="130"       layout="topleft" -     left_delta="0" +     left="5"       name="visible_members" -     top_pad="0" -     width="303"> +     top_pad="2" +     width="305">          <name_list.columns           label="Member"           name="name" @@ -64,7 +64,7 @@ Hover your mouse over the options for more help.           left_delta="0"           name="active_title_label"           top_pad="5" -         width="303"> +         width="300">              My Title          </text>          <combo_box @@ -75,7 +75,7 @@ Hover your mouse over the options for more help.           name="active_title"           tool_tip="Sets the title that appears in your avatar's name tag when this group is active."           top_pad="2" -         width="303" /> +         width="305" />          <check_box           height="16"           font="SansSerifSmall" @@ -85,7 +85,7 @@ Hover your mouse over the options for more help.           name="receive_notices"           tool_tip="Sets whether you want to receive Notices from this group.  Uncheck this box if this group is spamming you."           top_pad="5" -         width="303" /> +         width="300" />          <check_box           height="16"           label="Show in my profile" @@ -94,7 +94,7 @@ Hover your mouse over the options for more help.           name="list_groups_in_profile"           tool_tip="Sets whether you want to show this group in your profile"           top_pad="5" -         width="303" /> +         width="295" />          <panel           background_visible="true"           bevel_style="in" @@ -106,7 +106,7 @@ Hover your mouse over the options for more help.           left="5"           name="preferences_container"           top_pad="5" -         width="303"> +         width="305">          <check_box           follows="right|top"           height="16" diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index de1323d9cb..0082128ca4 100644 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -9,7 +9,7 @@ background_visible="true"   left="0"   top="20"   name="GroupInfo" - width="333"> + width="323">      <panel.string       name="default_needs_apply_text">          There are unsaved changes to the current tab @@ -117,28 +117,17 @@ background_visible="true"       width="120" />     <accordion               follows="all" -             height="425" +             height="405"               layout="topleft"               left="0"               name="groups_accordion"               top_pad="15" -             width="336"> +             width="323">               <accordion_tab                   expanded="true"                   layout="topleft"                   name="group_general_tab"                   title="General"> -         <scroll_container -         color="DkGray2" -         opaque="true" -         height="323" -         follows="all" -         layout="topleft" -         left="0" -         top="0" -         name="general_scroll" -         reserve_scroll_corner="false" -         width="333">              <panel              border="false"           class="panel_group_general"  @@ -146,27 +135,15 @@ background_visible="true"               layout="topleft"               left="0"               help_topic="group_general_tab" -         name="group_general_tab_panel" +             name="group_general_tab_panel"               top="0" -             width="303" /> -         </scroll_container> +             width="300" />           </accordion_tab>           <accordion_tab                   expanded="false"                   layout="topleft"                   name="group_roles_tab"                   title="Roles"> -               <scroll_container -                  color="DkGray2" -                  opaque="true" -                  height="323" -                  follows="all" -                  layout="topleft" -                  left="0" -                  top="0" -                  name="roles_scroll" -                  reserve_scroll_corner="false" -                  width="333">                   <panel                   border="false"           class="panel_group_roles" @@ -177,24 +154,12 @@ background_visible="true"           name="group_roles_tab_panel"                    top="0"               width="303" /> -         </scroll_container>           </accordion_tab>           <accordion_tab                   expanded="false"                   layout="topleft"                   name="group_notices_tab"                   title="Notices"> -            <scroll_container -                  color="DkGray2" -                  opaque="true" -                  height="323" -                  follows="all" -                  layout="topleft" -                  left="0" -                  top="0" -                  name="notices_scroll" -                  reserve_scroll_corner="false" -                  width="333">          <panel          border="false"           class="panel_group_notices" @@ -205,24 +170,12 @@ background_visible="true"           name="group_notices_tab_panel"           top="0"           width="303" /> -         </scroll_container>           </accordion_tab>          <accordion_tab                   expanded="false"                   layout="topleft"                   name="group_land_tab"                   title="Land/Assets"> -           <scroll_container -                  color="DkGray2" -                  opaque="true" -                  height="323" -                  follows="all" -                  layout="topleft" -                  left="0" -                  top="0" -                  name="land_scroll" -                  reserve_scroll_corner="false" -                  width="333">          <panel          border="false"           class="panel_group_land_money" @@ -232,8 +185,7 @@ background_visible="true"           help_topic="group_land_money_tab"           name="group_land_tab_panel"           top="0" -         width="313" /> -         </scroll_container> +         width="300" />           </accordion_tab>           </accordion>     <button diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml index 0c6f81f8fd..2c649642c3 100644 --- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml @@ -5,10 +5,10 @@   height="510"   label="Land & L$"   layout="topleft" - left="1" + left="0"   name="land_money_tab"   top="0" - width="313"> + width="310">      <panel.string       name="help_text">          Parcels owned by a group are listed along with contribution details. A warning appears until the Total Land in Use is less than or = to the Total Contribution. @@ -47,10 +47,10 @@       heading_height="20"       height="150"       layout="topleft" -     left="0" +     left="2"       name="group_parcel_list"       top_pad="0" -     width="313"> +     width="305">          <scroll_list.columns           label="Parcel"           name="name" @@ -79,7 +79,7 @@       label_selected="Map"       layout="topleft"       name="map_button" -     right="-10" +     right="-5"       top_pad="5"       width="95"       enabled="false" /> @@ -185,7 +185,9 @@       layout="topleft"       left_pad="3"       name="your_contribution_units" -     top_delta="2"> +     top_delta="2" +     width="40" +      >          m²      </text>       <text @@ -210,17 +212,17 @@       visible="false"       width="16" />      <text -      follows="left|top" +     follows="left|top"       type="string"       word_wrap="true"       font="SansSerifSmall"       height="35"       layout="topleft" -     left_pad="0" +     left_pad="5"       name="group_over_limit_text"       text_color="EmphasisColor"       top_delta="0" -     width="290"> +     width="260">          Group members must contribute more land credits to support land in use      </text>      <text @@ -241,7 +243,7 @@       height="200"       halign="center"       layout="topleft" -     left="10" +     left="5"       name="group_money_tab_container"       tab_position="top"       tab_height="20" @@ -268,7 +270,7 @@               left="0"               max_length="4096"               name="group_money_planning_text" -             top="0" +             top="2"               width="300"               word_wrap="true">                  Loading... @@ -293,7 +295,7 @@               left="0"               max_length="4096"               name="group_money_details_text" -             top="0" +             top="2"               width="300"               word_wrap="true">                  Loading... @@ -305,8 +307,8 @@  	     layout="topleft"  	     name="earlier_details_button"  	     tool_tip="Back" -	     top_pad="3" -             right="-35" +	     top_pad="5" +             right="-45"  	     width="31" />               <button  	     follows="left|top" @@ -327,7 +329,7 @@           left_delta="0"           help_topic="group_money_sales_tab"           name="group_money_sales_tab" -         top_delta="-1" +         top="5"           width="300">              <text_editor               type="string" @@ -337,7 +339,7 @@               left="0"               max_length="4096"               name="group_money_sales_text" -             top="0" +             top="2"               width="300"               word_wrap="true">                  Loading... @@ -349,8 +351,8 @@  	     layout="topleft"  	     name="earlier_sales_button"  	     tool_tip="Back" -	     top_pad="3" -             right="-35" +	     top_pad="5" +         right="-45"  	     width="31" />               <button  	     follows="left|top" @@ -358,7 +360,7 @@  	     image_overlay="Arrow_Right_Off"  	     layout="topleft"  	     left_pad="10" -             name="later_sales_button" +         name="later_sales_button"  	     tool_tip="Next"  	     width="31" />          </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index 24a4005a45..e56db6414f 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -7,7 +7,7 @@   left="0"   name="notices_tab"   top="0" - width="313"> + width="310">      <panel.string       name="help_text">          Notices are a quick way to communicate across a  @@ -27,7 +27,7 @@ the General tab.       word_wrap="true"       height="30"       layout="topleft" -     left="10" +     left="5"       name="lbl2"       top="5"       width="300"> @@ -41,10 +41,10 @@ Groups are limited to 200 notices/group daily       heading_height="16"       height="125"       layout="topleft" -     left="0" +     left="2"       name="notice_list"       top_pad="0" -     width="303"> +     width="305">          <scroll_list.columns           label=""           name="icon" @@ -81,10 +81,10 @@ Groups are limited to 200 notices/group daily         image_disabled="AddItem_Disabled"         layout="topleft"         label="Create a new notice" -       left="15" +       left="5"         name="create_new_notice"         tool_tip="Create a new notice" -     top_delta="-5" +     top_delta="0"         width="18" />       <button       follows="top|left" @@ -93,7 +93,7 @@ Groups are limited to 200 notices/group daily       layout="topleft"       name="refresh_notices"       right="-5" -     top_delta="5" +     top_delta="0"       width="23" />      <panel       follows="left|top" @@ -219,7 +219,7 @@ Groups are limited to 200 notices/group daily           label_selected="Send Notice"           layout="topleft"           right="-10" -         top_pad="20" +         top_pad="10"           name="send_notice"           width="100" />        <group_drop_target diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index 4129d7b448..604fb81c8e 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -7,7 +7,7 @@   left="0"   top="0"   name="roles_tab" - width="313"> + width="310">      <panel.string       name="default_needs_apply_text">          There are unsaved changes to the current tab @@ -28,9 +28,9 @@       name="roles_tab_container"       tab_position="top"       tab_height="20" -     tab_min_width="96" +     tab_min_width="75"       top="3" -     width="303"> +     width="300">          <panel           border="false"           height="220" @@ -51,23 +51,13 @@ clicking on their names.           <filter_editor           layout="topleft"           top="10" -         left="4" +         left="5"           width="280"           height="20"           follows="left|top|right"           max_length="250"           label="Filter Members"           name="filter_input" /> -          <!--  <button -             enabled="false" -             font="SansSerifSmall" -             height="20" -             label="Show All" -             layout="topleft" -             left_pad="-90" -             name="show_all_button" -             top_delta="-6" -             width="80" />-->              <name_list               column_padding="0"               draw_heading="true" @@ -111,14 +101,6 @@ clicking on their names.               right="-5"               name="member_eject"               width="100" /> -             <!--What is this?--> -            <icon -             height="16" -             image_name="Inv_FolderClosed" -             layout="topleft" -             name="power_folder_icon" -             visible="false" -             width="16" />          </panel>          <panel           border="false" @@ -156,7 +138,7 @@ including the Everyone and Owner Roles.           <filter_editor           layout="topleft"           top="10" -         left="4" +         left="5"           width="280"           height="20"           follows="left|top|right" @@ -179,12 +161,12 @@ including the Everyone and Owner Roles.               draw_stripes="false"               follows="left|top"               heading_height="20" -             height="150" +             height="160"               layout="topleft"               search_column="1"               left="0"               name="role_list" -             top_pad="4" +             top_pad="2"               width="300">                  <scroll_list.columns                   label="Role" @@ -238,24 +220,13 @@ things in this group. There's a broad variety of Abilities.           <filter_editor           layout="topleft"           top="10" -         left="4" +         left="5"           width="280"           height="20"           follows="left|top|right"           max_length="250"           label="Filter Abilities"           name="filter_input" /> -            <!-- -            <button -             enabled="false" -             font="SansSerifSmall" -             height="20" -             label="Show All" -             layout="topleft" -             left_pad="0" -             name="show_all_button" -             top_delta="0" -             width="80" /> -->              <scroll_list               column_padding="0"               draw_stripes="false" @@ -267,14 +238,14 @@ things in this group. There's a broad variety of Abilities.               name="action_list"               search_column="1"               tool_tip="Select an Ability to view more details" -             top_pad="6" +             top_pad="2"               width="300">                  <scroll_list.columns                   label=""                   name="icon"                   width="16" />                  <scroll_list.columns -                 label="" +                 label="Action"                   name="action"                   width="247" />              </scroll_list> @@ -293,9 +264,9 @@ things in this group. There's a broad variety of Abilities.       follows="left|top"       left="10"       name="members_footer" -     top_pad="10" +     top="245"       top_delta="0" -     width="300"> +     width="290">          <text           type="string"           height="16" @@ -304,7 +275,7 @@ things in this group. There's a broad variety of Abilities.           left="0"           name="static"           top_pad="5" -         width="295"> +         width="285">              Assigned Roles          </text>          <scroll_list @@ -315,7 +286,7 @@ things in this group. There's a broad variety of Abilities.           left="0"           name="member_assigned_roles"           top_pad="0" -         width="295"> +         width="285">              <scroll_list.columns               label=""               name="checkbox" @@ -323,7 +294,7 @@ things in this group. There's a broad variety of Abilities.              <scroll_list.columns               label=""               name="role" -             width="265" /> +             width="255" />          </scroll_list>                   <text           type="string" @@ -333,7 +304,7 @@ things in this group. There's a broad variety of Abilities.           left="0"           name="static2"           top_pad="5" -         width="295"> +         width="285">              Allowed Abilities          </text>           <scroll_list @@ -345,7 +316,7 @@ things in this group. There's a broad variety of Abilities.           search_column="2"           tool_tip="For details of each allowed ability see the abilities tab"           top_pad="0" -         width="295"> +         width="285">              <scroll_list.columns               label=""               name="icon" @@ -353,7 +324,7 @@ things in this group. There's a broad variety of Abilities.              <scroll_list.columns               label=""               name="action" -             width="275" /> +             width="265" />          </scroll_list>      </panel>      <panel @@ -364,7 +335,7 @@ things in this group. There's a broad variety of Abilities.       top_delta="0"       top="245"       visible="false" -     width="300"> +     width="290">          <text           type="string"           height="16" @@ -386,7 +357,7 @@ things in this group. There's a broad variety of Abilities.           max_length="295"           name="role_name"           top_pad="0" -         width="295"> +         width="290">              Employees          </line_editor>          <text @@ -395,7 +366,7 @@ things in this group. There's a broad variety of Abilities.           layout="topleft"           name="static3"           top_pad="5" -         width="295"> +         width="290">              Title          </text>          <line_editor @@ -408,7 +379,7 @@ things in this group. There's a broad variety of Abilities.           max_length="295"           name="role_title"           top_pad="0" -         width="295"> +         width="290">            (waiting)          </line_editor>                  <text @@ -442,7 +413,7 @@ things in this group. There's a broad variety of Abilities.           left="0"           name="static4"           top_pad="5" -         width="295"> +         width="290">              Assigned Roles          </text>          <name_list @@ -452,7 +423,7 @@ things in this group. There's a broad variety of Abilities.           left="0"           name="role_assigned_members"           top_pad="0" -         width="295" /> +         width="290" />          <check_box           height="15"           label="Reveal members" @@ -469,7 +440,7 @@ things in this group. There's a broad variety of Abilities.           left="0"           name="static5"           top_pad="5" -         width="295"> +         width="290">              Allowed Abilities          </text>          <scroll_list @@ -504,7 +475,7 @@ things in this group. There's a broad variety of Abilities.       top_delta="0"       top="245"       visible="false" -     width="300"> +     width="290">          <text           type="string"           height="16" @@ -550,7 +521,7 @@ things in this group. There's a broad variety of Abilities.           layout="topleft"           name="static3"           top_pad="5" -         width="295"> +         width="290">              Members with this ability          </text>          <name_list @@ -558,6 +529,6 @@ things in this group. There's a broad variety of Abilities.           layout="topleft"           name="action_members"           top_pad="0" -         width="295" /> +         width="290" />      </panel>  </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 26d8304551..be56866119 100644 --- a/indra/newview/skins/default/xui/en/panel_instant_message.xml +++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml @@ -79,7 +79,7 @@       text_color="white"       top="33"       use_ellipses="true" -     value="MESSAGE" +     value=""       width="285"       word_wrap="true"       max_length="350" /> diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml index a12797d96b..a77094e942 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml @@ -9,7 +9,7 @@   top="21"   width="310">      <string name="min_width"> -        310 +        192      </string>      <string name="max_width">          320 @@ -27,7 +27,7 @@       name="chat_box"       tool_tip="Press Enter to say, Ctrl+Enter to shout"       top="0" -     width="250" /> +     width="279" />      <output_monitor       auto_update="true"       follows="right" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 15fdd73bdc..9fac7d34f7 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -16,7 +16,7 @@ background_visible="true"       value="No people" />      <string       name="no_one_near" -     value="No-one near" /> +     value="No one near" />      <string       name="no_friends_online"       value="No friends online" /> diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml index dbe76e553b..9cfbed432a 100644 --- a/indra/newview/skins/default/xui/en/panel_picks.xml +++ b/indra/newview/skins/default/xui/en/panel_picks.xml @@ -22,6 +22,7 @@    left="0"    name="accordion"    top="0" +  single_expansion="true"    width="313">      <accordion_tab       can_resize="false" @@ -46,7 +47,7 @@       layout="topleft"       height="235"       name="tab_classifieds" -     title="Classified" +     title="Classifieds"       visible="false">              <flat_list_view               color="DkGray2" diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml index a9874f4553..a419a02d75 100644 --- a/indra/newview/skins/default/xui/en/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml @@ -94,7 +94,7 @@    <sidetray_tab      name="sidebar_me"      help_topic="sidebar_me" -    tab_title="Me" +    tab_title="My Profile"      description="Edit your public profile and Picks."      image="TabIcon_Me_Off"      image_selected="TabIcon_Me_Selected" @@ -112,7 +112,7 @@    <sidetray_tab      name="sidebar_appearance"      help_topic="sidebar_appearance" -    tab_title="Appearance" +    tab_title="My Appearance"      description="Change your appearance and current look."      image="TabIcon_Appearance_Off"      image_selected="TabIcon_Appearance_Selected" @@ -131,7 +131,7 @@    <sidetray_tab      name="sidebar_inventory"      help_topic="sidebar_inventory" -    tab_title="Inventory" +    tab_title="My Inventory"      description="Browse your inventory."      image="TabIcon_Things_Off"      image_selected="TabIcon_Things_Selected" diff --git a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml index 9636e32187..566fc95230 100644 --- a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml +++ b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml @@ -227,7 +227,7 @@           right="-10"           top="10"           width="20" -         image_name="TabIcon_Inventory_Selected"/> +         image_name="TabIcon_Things_Selected"/>          <text           follows="all"           height="90" diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml index 7f7777586c..f16329f8d7 100644 --- a/indra/newview/skins/default/xui/en/panel_toast.xml +++ b/indra/newview/skins/default/xui/en/panel_toast.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <!-- All our XML is utf-8 encoded. --> -<!-- All this does is establish the position of the "close" button on the toast. --> +<!-- Don't remove floater's height! It is needed for Overflow and Start-Up toasts!-->  <floater   legacy_header_height="18" @@ -9,6 +9,7 @@  	title=""    visible="false"    layout="topleft" +  height="40"   	width="305"    left="0"    top="0" @@ -26,36 +27,21 @@    drop_shadow_visible = "false"    border = "false"    > - -  <!-- +  <!-- Don't remove this wiget! It is needed for Overflow and Start-Up toasts!-->    <text     visible="false"     follows="left|top|right|bottom"     font="SansSerifBold" -   height="40" +   height="20"     layout="topleft" -   left="60" +   left="20"     name="toast_text"     word_wrap="true"     text_color="white" -   top="20" -   width="290"> +   top="5"  +   width="260">      Toast text;    </text> -  <icon -    top="20" -    left="10" -    width="32" -    height="32" -    follows="top|left" -    layout="topleft" -    visible="false" -    color="1 1 1 1" -    enabled="true" -    image_name="notify_tip_icon.tga" -    mouse_opaque="true" -    name="icon" -  />-->    <button      layout="topleft"      top="-6" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index b0a406a277..761c17cfd2 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2850,7 +2850,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  	<string name="IM_to_label">To</string>  	<string name="IM_moderator_label">(Moderator)</string> -    <string name="ringing-im">      Joining Voice Chat...    </string> @@ -2864,7 +2863,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].      Connecting...    </string>    <string name="conference-title"> -    Friends Conference +    Ad-hoc Conference    </string>    <string name="inventory_item_offered-im">      Inventory item offered diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml new file mode 100644 index 0000000000..a35e2c3663 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> + +<avatar_icon default_icon_name="Generic_Person_Large"> +</avatar_icon> diff --git a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml index bc1ca339a2..706c89f5ed 100644 --- a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml +++ b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml @@ -4,6 +4,8 @@              thumb_center_color="SliderThumbCenterColor"              thumb_image="SliderThumb_Off"              thumb_image_pressed="SliderThumb_Press" -            thumb_image_disabled="SliderThumb_Disabled"  -            track_image="SliderTrack_Horiz" -            track_highlight_image="SliderTrack_Horiz" /> +            thumb_image_disabled="SliderThumb_Disabled" +            track_image_horizontal="SliderTrack_Horiz" +            track_image_vertical="SliderTrack_Vert" +            track_highlight_horizontal_image="SliderTrack_Horiz" +            track_highlight_vertical_image="SliderTrack_Vert" /> diff --git a/indra/newview/skins/default/xui/en/widgets/ui_ctrl.xml b/indra/newview/skins/default/xui/en/widgets/ui_ctrl.xml new file mode 100644 index 0000000000..2f72ad65a1 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/ui_ctrl.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- Global settings for all widgets ("UI Controls") --> +<ui_ctrl +  font="SansSerif" +  />  diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp index d31a81e128..7b28a3b72c 100644 --- a/indra/newview/tests/lllogininstance_test.cpp +++ b/indra/newview/tests/lllogininstance_test.cpp @@ -76,6 +76,7 @@ LLControlGroup::LLControlGroup(const std::string& name) :  LLControlGroup::~LLControlGroup() {}  void LLControlGroup::setBOOL(const std::string& name, BOOL val) {}  BOOL LLControlGroup::getBOOL(const std::string& name) { return FALSE; } +F32 LLControlGroup::getF32(const std::string& name) { return 0.0f; }  U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only) { return 1; }  void LLControlGroup::setString(const std::string& name, const std::string& val) {}  std::string LLControlGroup::getString(const std::string& name) { return "test_string"; } diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp index 7a30315b9a..b14c59ab9a 100644 --- a/indra/viewer_components/login/lllogin.cpp +++ b/indra/viewer_components/login/lllogin.cpp @@ -70,7 +70,7 @@ public:  	LLEventPump& getEventPump() { return mPump; }  private: -	void sendProgressEvent(const std::string& state, const std::string& change, +	LLSD getProgressEventLLSD(const std::string& state, const std::string& change,  						   const LLSD& data = LLSD())  	{  		LLSD status_data; @@ -87,7 +87,13 @@ private:  		{  			status_data["data"] = data;  		} +		return status_data; +	} +	void sendProgressEvent(const std::string& state, const std::string& change, +						   const LLSD& data = LLSD()) +	{ +		LLSD status_data = getProgressEventLLSD(state, change, data);  		mPump.post(status_data);  	} @@ -140,15 +146,28 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential          // Request SRV record.          LL_INFOS("LLLogin") << "Requesting SRV record from " << uri << LL_ENDL; -        // *NOTE:Mani - Completely arbitrary timeout value for SRV request. -        filter.errorAfter(5, "SRV Request timed out!"); +        // *NOTE:Mani - Completely arbitrary default timeout value for SRV request. +		F32 seconds_to_timeout = 5.0f; +		if(credentials.has("cfg_srv_timeout")) +		{ +			seconds_to_timeout = credentials["cfg_srv_timeout"].asReal(); +		} + +		filter.eventAfter(seconds_to_timeout,  +			getProgressEventLLSD("offline", "fail.login")); + +		std::string srv_pump_name = "LLAres"; +		if(credentials.has("cfg_srv_pump")) +		{ +			srv_pump_name = credentials["cfg_srv_pump"].asString(); +		} -        // Make request +		// Make request          LLSD request;          request["op"] = "rewriteURI";          request["uri"] = uri;          request["reply"] = replyPump.getName(); -        rewrittenURIs = postAndWait(self, request, "LLAres", filter); +        rewrittenURIs = postAndWait(self, request, srv_pump_name, filter);      } // we no longer need the filter      LLEventPump& xmlrpcPump(LLEventPumps::instance().obtain("LLXMLRPCTransaction")); diff --git a/indra/viewer_components/login/tests/lllogin_test.cpp b/indra/viewer_components/login/tests/lllogin_test.cpp index a8ae2883d5..99ea796ad0 100644 --- a/indra/viewer_components/login/tests/lllogin_test.cpp +++ b/indra/viewer_components/login/tests/lllogin_test.cpp @@ -47,6 +47,7 @@ public:  	bool call(const LLSD& event)  	{  		mDebug(STRINGIZE("LoginListener called!: " << event)); +		  		mLastEvent = event;  		return false;  	} @@ -414,4 +415,42 @@ namespace tut  		ensure_equals("Failed to offline", listener.lastEvent()["state"].asString(), "offline");  	} + +/* +    template<> template<> +    void llviewerlogin_object::test<5>() +    { +        DEBUG; +		// Test SRV request timeout. +		set_test_name("LLLogin SRV timeout testing"); + +		// Testing normal login procedure. +		LLEventStream llaresPump("LLAres"); // Dummy LLAres pump. + +		// LLAresListener dummyLLAres("dummy_llares"); +		// dummyLLAres.listenTo(llaresPump); + +		LLLogin login; +		LoginListener listener("test_ear"); +		listener.listenTo(login.getEventPump()); + +		LLSD credentials; +		credentials["first"] = "these"; +		credentials["last"] = "don't"; +		credentials["passwd"] = "matter"; +		credentials["cfg_srv_timeout"] = 0.0f; + +		login.connect("login.bar.com", credentials); + +		ensure_equals("SRV State", listener.lastEvent()["change"].asString(), "srvrequest");  + +		// Get the mainloop eventpump, which needs a pinging in order to drive the  +		// SRV timeout. +		LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop")); +		LLSD frame_event; +		mainloop.post(frame_event); + +		ensure_equals("SRV Failure", listener.lastEvent()["change"].asString(), "fail.login");  +	} +*/  }  | 
