diff options
| author | simon <none@none> | 2014-03-19 11:41:42 -0700 | 
|---|---|---|
| committer | simon <none@none> | 2014-03-19 11:41:42 -0700 | 
| commit | 00a325ccb90b1c6800ec78e1211b5097d9c27a58 (patch) | |
| tree | 8b58fbd99d5bce117cf8dad5181b5690af4bd34f | |
| parent | 09d1c27d4f78c78d949b6a3d896d6f58df2dfc06 (diff) | |
| parent | 1ab9f19f82a84a109cf429998f423986268801f6 (diff) | |
Pull in viewer-lion to lock down next release
142 files changed, 1847 insertions, 1865 deletions
| diff --git a/indra/llcommon/llinitparam.h b/indra/llcommon/llinitparam.h index 03ab0fb67f..4bad0062a7 100755 --- a/indra/llcommon/llinitparam.h +++ b/indra/llcommon/llinitparam.h @@ -497,25 +497,25 @@ namespace LLInitParam  		virtual ~Parser();  		template <typename T> bool readValue(T& param, typename boost::disable_if<boost::is_enum<T> >::type* dummy = 0) -			{ +		{  			parser_read_func_map_t::iterator found_it = mParserReadFuncs->find(&typeid(T));  			if (found_it != mParserReadFuncs->end()) -				{ +			{  				return found_it->second(*this, (void*)¶m); -				} -			 -				return false;  			} -			 + +			return false; +		} +  		template <typename T> bool readValue(T& param, typename boost::enable_if<boost::is_enum<T> >::type* dummy = 0) -			{ +		{  			parser_read_func_map_t::iterator found_it = mParserReadFuncs->find(&typeid(T));  			if (found_it != mParserReadFuncs->end()) -				{ +			{  				return found_it->second(*this, (void*)¶m); -				} +			}  			else -		{ +			{  				found_it = mParserReadFuncs->find(&typeid(S32));  				if (found_it != mParserReadFuncs->end())  				{ @@ -523,20 +523,20 @@ namespace LLInitParam  					bool parsed = found_it->second(*this, (void*)&int_value);  					param = (T)int_value;  					return parsed; -					}  				} -				return false;  			} +			return false; +		}  		template <typename T> bool writeValue(const T& param, name_stack_t& name_stack) -			{ +		{  			parser_write_func_map_t::iterator found_it = mParserWriteFuncs->find(&typeid(T));  			if (found_it != mParserWriteFuncs->end()) -				{ +			{  				return found_it->second(*this, (const void*)¶m, name_stack); -				} -				return false;  			} +			return false; +		}  		// dispatch inspection to registered inspection functions, for each parameter in a param block  		template <typename T> bool inspectValue(name_stack_t& name_stack, S32 min_count, S32 max_count, const possible_values_t* possible_values) diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h index b93f89d674..5abd9a0d06 100755 --- a/indra/llmath/llmath.h +++ b/indra/llmath/llmath.h @@ -72,6 +72,7 @@ const F32	F_E			= 2.71828182845904523536f;  const F32	F_SQRT2		= 1.4142135623730950488016887242097f;  const F32	F_SQRT3		= 1.73205080756888288657986402541f;  const F32	OO_SQRT2	= 0.7071067811865475244008443621049f; +const F32	OO_SQRT3	= 0.577350269189625764509f;  const F32	DEG_TO_RAD	= 0.017453292519943295769236907684886f;  const F32	RAD_TO_DEG	= 57.295779513082320876798154814105f;  const F32	F_APPROXIMATELY_ZERO = 0.00001f; diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h index 7348904c61..f7d5f14ba3 100755 --- a/indra/llmath/lloctree.h +++ b/indra/llmath/lloctree.h @@ -36,6 +36,8 @@  extern U32 gOctreeMaxCapacity; +extern float gOctreeMinSize; +  /*#define LL_OCTREE_PARANOIA_CHECK 0  #if LL_DARWIN  #define LL_OCTREE_MAX_CAPACITY 32 @@ -106,6 +108,7 @@ public:  	:	mParent((oct_node*)parent),   		mOctant(octant)   	{  +		llassert(size[0] >= gOctreeMinSize*0.5f);  		//always keep a NULL terminated list to avoid out of bounds exceptions in debug builds  		mData.push_back(NULL);  		mDataEnd = &mData[0]; @@ -213,7 +216,7 @@ public:  		F32 size = mSize[0];  		F32 p_size = size * 2.f; -		return (radius <= 0.001f && size <= 0.001f) || +		return (radius <= gOctreeMinSize && size <= gOctreeMinSize) ||  				(radius <= p_size && radius > size);  	} @@ -319,7 +322,7 @@ public:  		//is it here?  		if (isInside(data->getPositionGroup()))  		{ -			if ((getElementCount() < gOctreeMaxCapacity && contains(data->getBinRadius()) || +			if (((getElementCount() < gOctreeMaxCapacity || getSize()[0] <= gOctreeMinSize) && contains(data->getBinRadius()) ||  				(data->getBinRadius() > getSize()[0] &&	parent && parent->getElementCount() >= gOctreeMaxCapacity)))   			{ //it belongs here  				mData.push_back(NULL); @@ -356,8 +359,9 @@ public:  				LLVector4a val;  				val.setSub(center, getCenter());  				val.setAbs(val); -								 -				S32 lt = val.lessThan(LLVector4a::getEpsilon()).getGatheredBits() & 0x7; +				LLVector4a min_diff(gOctreeMinSize); + +				S32 lt = val.lessThan(min_diff).getGatheredBits() & 0x7;  				if( lt == 0x7 )  				{ @@ -389,6 +393,7 @@ public:  				}  #endif +				llassert(size[0] >= gOctreeMinSize*0.5f);  				//make the new kid  				child = new LLOctreeNode<T>(center, size, this);  				addChild(child); @@ -796,6 +801,8 @@ public:  				this->setSize(size2);  				this->updateMinMax(); +				llassert(size[0] >= gOctreeMinSize); +  				//copy our children to a new branch  				LLOctreeNode<T>* newnode = new LLOctreeNode<T>(center, size, this); diff --git a/indra/llmath/v3dmath.h b/indra/llmath/v3dmath.h index 578dcdc8ea..cab4c93a9f 100755 --- a/indra/llmath/v3dmath.h +++ b/indra/llmath/v3dmath.h @@ -101,25 +101,25 @@ class LLVector3d  		F64 operator[](int idx) const { return mdV[idx]; }  		F64 &operator[](int idx) { return mdV[idx]; } -		friend LLVector3d operator+(const LLVector3d &a, const LLVector3d &b);	// Return vector a + b -		friend LLVector3d operator-(const LLVector3d &a, const LLVector3d &b);	// Return vector a minus b -		friend F64 operator*(const LLVector3d &a, const LLVector3d &b);		// Return a dot b -		friend LLVector3d operator%(const LLVector3d &a, const LLVector3d &b);	// Return a cross b -		friend LLVector3d operator*(const LLVector3d &a, const F64 k);				// Return a times scaler k -		friend LLVector3d operator/(const LLVector3d &a, const F64 k);				// Return a divided by scaler k -		friend LLVector3d operator*(const F64 k, const LLVector3d &a);				// Return a times scaler k -		friend bool operator==(const LLVector3d &a, const LLVector3d &b);		// Return a == b -		friend bool operator!=(const LLVector3d &a, const LLVector3d &b);		// Return a != b - -		friend const LLVector3d& operator+=(LLVector3d &a, const LLVector3d &b);	// Return vector a + b -		friend const LLVector3d& operator-=(LLVector3d &a, const LLVector3d &b);	// Return vector a minus b -		friend const LLVector3d& operator%=(LLVector3d &a, const LLVector3d &b);	// Return a cross b -		friend const LLVector3d& operator*=(LLVector3d &a, const F64 k);				// Return a times scaler k -		friend const LLVector3d& operator/=(LLVector3d &a, const F64 k);				// Return a divided by scaler k - -		friend LLVector3d operator-(const LLVector3d &a);					// Return vector -a - -		friend std::ostream&	 operator<<(std::ostream& s, const LLVector3d &a);		// Stream a +		friend LLVector3d operator+(const LLVector3d& a, const LLVector3d& b);	// Return vector a + b +		friend LLVector3d operator-(const LLVector3d& a, const LLVector3d& b);	// Return vector a minus b +		friend F64 operator*(const LLVector3d& a, const LLVector3d& b);		// Return a dot b +		friend LLVector3d operator%(const LLVector3d& a, const LLVector3d& b);	// Return a cross b +		friend LLVector3d operator*(const LLVector3d& a, const F64 k);				// Return a times scaler k +		friend LLVector3d operator/(const LLVector3d& a, const F64 k);				// Return a divided by scaler k +		friend LLVector3d operator*(const F64 k, const LLVector3d& a);				// Return a times scaler k +		friend bool operator==(const LLVector3d& a, const LLVector3d& b);		// Return a == b +		friend bool operator!=(const LLVector3d& a, const LLVector3d& b);		// Return a != b + +		friend const LLVector3d& operator+=(LLVector3d& a, const LLVector3d& b);	// Return vector a + b +		friend const LLVector3d& operator-=(LLVector3d& a, const LLVector3d& b);	// Return vector a minus b +		friend const LLVector3d& operator%=(LLVector3d& a, const LLVector3d& b);	// Return a cross b +		friend const LLVector3d& operator*=(LLVector3d& a, const F64 k);				// Return a times scaler k +		friend const LLVector3d& operator/=(LLVector3d& a, const F64 k);				// Return a divided by scaler k + +		friend LLVector3d operator-(const LLVector3d& a);					// Return vector -a + +		friend std::ostream&	 operator<<(std::ostream& s, const LLVector3d& a);		// Stream a  		static BOOL parseVector3d(const std::string& buf, LLVector3d* value); @@ -298,59 +298,59 @@ inline F64	LLVector3d::lengthSquared(void) const  	return mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2];  } -inline LLVector3d operator+(const LLVector3d &a, const LLVector3d &b) +inline LLVector3d operator+(const LLVector3d& a, const LLVector3d& b)  {  	LLVector3d c(a);  	return c += b;  } -inline LLVector3d operator-(const LLVector3d &a, const LLVector3d &b) +inline LLVector3d operator-(const LLVector3d& a, const LLVector3d& b)  {  	LLVector3d c(a);  	return c -= b;  } -inline F64  operator*(const LLVector3d &a, const LLVector3d &b) +inline F64  operator*(const LLVector3d& a, const LLVector3d& b)  {  	return (a.mdV[0]*b.mdV[0] + a.mdV[1]*b.mdV[1] + a.mdV[2]*b.mdV[2]);  } -inline LLVector3d operator%(const LLVector3d &a, const LLVector3d &b) +inline LLVector3d operator%(const LLVector3d& a, const LLVector3d& b)  {  	return LLVector3d( a.mdV[1]*b.mdV[2] - b.mdV[1]*a.mdV[2], a.mdV[2]*b.mdV[0] - b.mdV[2]*a.mdV[0], a.mdV[0]*b.mdV[1] - b.mdV[0]*a.mdV[1] );  } -inline LLVector3d operator/(const LLVector3d &a, const F64 k) +inline LLVector3d operator/(const LLVector3d& a, const F64 k)  {  	F64 t = 1.f / k;  	return LLVector3d( a.mdV[0] * t, a.mdV[1] * t, a.mdV[2] * t );  } -inline LLVector3d operator*(const LLVector3d &a, const F64 k) +inline LLVector3d operator*(const LLVector3d& a, const F64 k)  {  	return LLVector3d( a.mdV[0] * k, a.mdV[1] * k, a.mdV[2] * k );  } -inline LLVector3d operator*(F64 k, const LLVector3d &a) +inline LLVector3d operator*(F64 k, const LLVector3d& a)  {  	return LLVector3d( a.mdV[0] * k, a.mdV[1] * k, a.mdV[2] * k );  } -inline bool operator==(const LLVector3d &a, const LLVector3d &b) +inline bool operator==(const LLVector3d& a, const LLVector3d& b)  {  	return (  (a.mdV[0] == b.mdV[0])  			&&(a.mdV[1] == b.mdV[1])  			&&(a.mdV[2] == b.mdV[2]));  } -inline bool operator!=(const LLVector3d &a, const LLVector3d &b) +inline bool operator!=(const LLVector3d& a, const LLVector3d& b)  {  	return (  (a.mdV[0] != b.mdV[0])  			||(a.mdV[1] != b.mdV[1])  			||(a.mdV[2] != b.mdV[2]));  } -inline const LLVector3d& operator+=(LLVector3d &a, const LLVector3d &b) +inline const LLVector3d& operator+=(LLVector3d& a, const LLVector3d& b)  {  	a.mdV[0] += b.mdV[0];  	a.mdV[1] += b.mdV[1]; @@ -358,7 +358,7 @@ inline const LLVector3d& operator+=(LLVector3d &a, const LLVector3d &b)  	return a;  } -inline const LLVector3d& operator-=(LLVector3d &a, const LLVector3d &b) +inline const LLVector3d& operator-=(LLVector3d& a, const LLVector3d& b)  {  	a.mdV[0] -= b.mdV[0];  	a.mdV[1] -= b.mdV[1]; @@ -366,14 +366,14 @@ inline const LLVector3d& operator-=(LLVector3d &a, const LLVector3d &b)  	return a;  } -inline const LLVector3d& operator%=(LLVector3d &a, const LLVector3d &b) +inline const LLVector3d& operator%=(LLVector3d& a, const LLVector3d& b)  {  	LLVector3d ret( a.mdV[1]*b.mdV[2] - b.mdV[1]*a.mdV[2], a.mdV[2]*b.mdV[0] - b.mdV[2]*a.mdV[0], a.mdV[0]*b.mdV[1] - b.mdV[0]*a.mdV[1]);  	a = ret;  	return a;  } -inline const LLVector3d& operator*=(LLVector3d &a, const F64 k) +inline const LLVector3d& operator*=(LLVector3d& a, const F64 k)  {  	a.mdV[0] *= k;  	a.mdV[1] *= k; @@ -381,7 +381,7 @@ inline const LLVector3d& operator*=(LLVector3d &a, const F64 k)  	return a;  } -inline const LLVector3d& operator/=(LLVector3d &a, const F64 k) +inline const LLVector3d& operator/=(LLVector3d& a, const F64 k)  {  	F64 t = 1.f / k;  	a.mdV[0] *= t; @@ -390,12 +390,12 @@ inline const LLVector3d& operator/=(LLVector3d &a, const F64 k)  	return a;  } -inline LLVector3d operator-(const LLVector3d &a) +inline LLVector3d operator-(const LLVector3d& a)  {  	return LLVector3d( -a.mdV[0], -a.mdV[1], -a.mdV[2] );  } -inline F64	dist_vec(const LLVector3d &a, const LLVector3d &b) +inline F64	dist_vec(const LLVector3d& a, const LLVector3d& b)  {  	F64 x = a.mdV[0] - b.mdV[0];  	F64 y = a.mdV[1] - b.mdV[1]; @@ -403,7 +403,7 @@ inline F64	dist_vec(const LLVector3d &a, const LLVector3d &b)  	return (F32) sqrt( x*x + y*y + z*z );  } -inline F64	dist_vec_squared(const LLVector3d &a, const LLVector3d &b) +inline F64	dist_vec_squared(const LLVector3d& a, const LLVector3d& b)  {  	F64 x = a.mdV[0] - b.mdV[0];  	F64 y = a.mdV[1] - b.mdV[1]; @@ -411,14 +411,14 @@ inline F64	dist_vec_squared(const LLVector3d &a, const LLVector3d &b)  	return x*x + y*y + z*z;  } -inline F64	dist_vec_squared2D(const LLVector3d &a, const LLVector3d &b) +inline F64	dist_vec_squared2D(const LLVector3d& a, const LLVector3d& b)  {  	F64 x = a.mdV[0] - b.mdV[0];  	F64 y = a.mdV[1] - b.mdV[1];  	return x*x + y*y;  } -inline LLVector3d lerp(const LLVector3d &a, const LLVector3d &b, const F64 u) +inline LLVector3d lerp(const LLVector3d& a, const LLVector3d& b, const F64 u)  {  	return LLVector3d(  		a.mdV[VX] + (b.mdV[VX] - a.mdV[VX]) * u, @@ -450,7 +450,7 @@ inline F64 angle_between(const LLVector3d& a, const LLVector3d& b)  	return angle;  } -inline BOOL are_parallel(const LLVector3d &a, const LLVector3d &b, const F64 epsilon) +inline BOOL are_parallel(const LLVector3d& a, const LLVector3d& b, const F64 epsilon)  {  	LLVector3d an = a;  	LLVector3d bn = b; @@ -465,11 +465,22 @@ inline BOOL are_parallel(const LLVector3d &a, const LLVector3d &b, const F64 eps  } -inline LLVector3d projected_vec(const LLVector3d &a, const LLVector3d &b) +inline LLVector3d projected_vec(const LLVector3d& a, const LLVector3d& b)  {  	LLVector3d project_axis = b;  	project_axis.normalize();  	return project_axis * (a * project_axis);  } +inline LLVector3d inverse_projected_vec(const LLVector3d& a, const LLVector3d& b) +{ +	LLVector3d normalized_a = a; +	normalized_a.normalize(); +	LLVector3d normalized_b = b; +	F64 b_length = normalized_b.normalize(); + +	F64 dot_product = normalized_a * normalized_b; +	return normalized_a * (b_length / dot_product); +} +  #endif // LL_V3DMATH_H diff --git a/indra/llmath/v3math.h b/indra/llmath/v3math.h index 0432aeba4c..c807a30f7b 100755 --- a/indra/llmath/v3math.h +++ b/indra/llmath/v3math.h @@ -159,6 +159,9 @@ F32	dist_vec(const LLVector3 &a, const LLVector3 &b);		// Returns distance betwe  F32	dist_vec_squared(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b  F32	dist_vec_squared2D(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b ignoring Z component  LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b +// Returns a vector in direction of a, such that when projected onto b, gives you the same value as b +// in other words: projected_vec(inverse_projected_vec(a, b), b) == b; +LLVector3 inverse_projected_vec(const LLVector3 &a, const LLVector3 &b);   LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b (same as projected_vec)  LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b); // Returns component of vector a not parallel to vector b (same as projected_vec)  LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u); // Returns a vector that is a linear interpolation between a and b @@ -495,6 +498,18 @@ inline LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b)  	return project_axis * (a * project_axis);  } +inline LLVector3 inverse_projected_vec(const LLVector3& a, const LLVector3& b) +{ +	LLVector3 normalized_a = a; +	normalized_a.normalize(); +	LLVector3 normalized_b = b; +	F32 b_length = normalized_b.normalize(); + +	F32 dot_product = normalized_a * normalized_b; +	//NB: if a _|_ b, then returns an infinite vector +	return normalized_a * (b_length / dot_product); +} +  inline LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b)  {  	return projected_vec(a, b); diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h index 1cf940918b..40d7b04a90 100755 --- a/indra/llmessage/llregionflags.h +++ b/indra/llmessage/llregionflags.h @@ -76,6 +76,8 @@ const U64 REGION_FLAGS_DENY_ANONYMOUS			= (1 << 23);  const U64 REGION_FLAGS_ALLOW_PARCEL_CHANGES		= (1 << 26); +const U64 REGION_FLAGS_BLOCK_FLYOVER = (1 << 27); +  const U64 REGION_FLAGS_ALLOW_VOICE = (1 << 28);  const U64 REGION_FLAGS_BLOCK_PARCEL_SEARCH = (1 << 29); diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index 34e0483a83..f82004395b 100755 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -170,6 +170,11 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa  		return LLModel::BAD_ELEMENT;  	} +	if (!pos_source) +	{ +		llwarns << "Unable to process mesh without position data; invalid model;  invalid model." << llendl; +		return LLModel::BAD_ELEMENT; +	}  	domPRef p = tri->getP();  	domListOfUInts& idx = p->getValue(); @@ -179,19 +184,22 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa  	domListOfFloats& tc = tc_source ? tc_source->getFloat_array()->getValue() : dummy ;  	domListOfFloats& n = norm_source ? norm_source->getFloat_array()->getValue() : dummy ; -	if (pos_source) -	{ -		face.mExtents[0].set(v[0], v[1], v[2]); -		face.mExtents[1].set(v[0], v[1], v[2]); -	} -	  	LLVolumeFace::VertexMapData::PointMap point_map; -	 +		  	U32 index_count  = idx.getCount();  	U32 vertex_count = pos_source  ? v.getCount()  : 0;  	U32 tc_count     = tc_source   ? tc.getCount() : 0;  	U32 norm_count   = norm_source ? n.getCount()  : 0; +	if (vertex_count == 0) +	{ +		llwarns << "Unable to process mesh with empty position array; invalid model." << llendl; +		return LLModel::BAD_ELEMENT; +	} + +	face.mExtents[0].set(v[0], v[1], v[2]); +	face.mExtents[1].set(v[0], v[1], v[2]); +	  	for (U32 i = 0; i < index_count; i += idx_stride)  	{  		LLVolumeFace::VertexData cv; diff --git a/indra/llui/llchatentry.cpp b/indra/llui/llchatentry.cpp index c04b70eb64..dac001afab 100755 --- a/indra/llui/llchatentry.cpp +++ b/indra/llui/llchatentry.cpp @@ -51,6 +51,7 @@ LLChatEntry::LLChatEntry(const Params& p)  	mCurrentHistoryLine = mLineHistory.begin();  	mAutoIndent = false; +	keepSelectionOnReturn(true);  }  LLChatEntry::~LLChatEntry() @@ -179,15 +180,6 @@ BOOL LLChatEntry::handleSpecialKey(const KEY key, const MASK mask)  {  	BOOL handled = FALSE; -    // In the case of a chat entry, pressing RETURN when something is selected -    // should NOT erase the selection (unlike a notecard, for example) -    if (key == KEY_RETURN) -    { -        endOfDoc(); -        startSelection(); -        endSelection(); -    } -  	LLTextEditor::handleSpecialKey(key, mask);  	switch(key) diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index f32a52e6c6..c9ea0c0e1b 100755 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -629,6 +629,8 @@ bool LLFolderView::startDrag()  void LLFolderView::commitRename( const LLSD& data )  {  	finishRenamingItem(); +	arrange( NULL, NULL ); +  }  void LLFolderView::draw() @@ -1125,18 +1127,18 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )  		if((mSelectedItems.size() > 0) && mScrollContainer)  		{  			LLFolderViewItem* last_selected = getCurSelectedItem(); +			BOOL shift_select = mask & MASK_SHIFT; +			// don't shift select down to children of folders (they are implicitly selected through parent) +			LLFolderViewItem* next = last_selected->getNextOpenNode(!shift_select); -			if (!mKeyboardSelection) +			if (!mKeyboardSelection || (!shift_select && (!next || next == last_selected)))  			{  				setSelection(last_selected, FALSE, TRUE);  				mKeyboardSelection = TRUE;  			} -			LLFolderViewItem* next = NULL; -			if (mask & MASK_SHIFT) +			if (shift_select)  			{ -				// don't shift select down to children of folders (they are implicitly selected through parent) -				next = last_selected->getNextOpenNode(FALSE);  				if (next)  				{  					if (next->isSelected()) @@ -1153,7 +1155,6 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )  			}  			else  			{ -				next = last_selected->getNextOpenNode();  				if( next )  				{  					if (next == last_selected) @@ -1189,18 +1190,18 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )  		if((mSelectedItems.size() > 0) && mScrollContainer)  		{  			LLFolderViewItem* last_selected = mSelectedItems.back(); +			BOOL shift_select = mask & MASK_SHIFT; +			// don't shift select down to children of folders (they are implicitly selected through parent) +			LLFolderViewItem* prev = last_selected->getPreviousOpenNode(!shift_select); -			if (!mKeyboardSelection) +			if (!mKeyboardSelection || (!shift_select && prev == this))  			{  				setSelection(last_selected, FALSE, TRUE);  				mKeyboardSelection = TRUE;  			} -			LLFolderViewItem* prev = NULL; -			if (mask & MASK_SHIFT) +			if (shift_select)  			{ -				// don't shift select down to children of folders (they are implicitly selected through parent) -				prev = last_selected->getPreviousOpenNode(FALSE);  				if (prev)  				{  					if (prev->isSelected()) @@ -1217,7 +1218,6 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )  			}  			else  			{ -				prev = last_selected->getPreviousOpenNode();  				if( prev )  				{  					if (prev == this) @@ -1599,19 +1599,21 @@ void LLFolderView::update()  	// until that inventory is loaded up.  	LLFastTimer t2(FTM_INVENTORY); -	if (getFolderViewModel()->getFilter().isModified() && getFolderViewModel()->getFilter().isNotDefault()) +	LLFolderViewFilter& filter_object = getFolderViewModel()->getFilter(); + +	if (filter_object.isModified() && filter_object.isNotDefault())  	{  		mNeedsAutoSelect = TRUE;  	}  	// Filter to determine visibility before arranging -	filter(getFolderViewModel()->getFilter()); +	filter(filter_object);  	// Clear the modified setting on the filter only if the filter finished after running the filter process  	// Note: if the filter count has timed out, that means the filter halted before completing the entire set of items -    if (getFolderViewModel()->getFilter().isModified() && (!getFolderViewModel()->getFilter().isTimedOut())) +    if (filter_object.isModified() && (!filter_object.isTimedOut()))  	{ -		getFolderViewModel()->getFilter().clearModified(); +		filter_object.clearModified();  	}  	// automatically show matching items, and select first one if we had a selection @@ -1630,7 +1632,7 @@ void LLFolderView::update()  		// Open filtered folders for folder views with mAutoSelectOverride=TRUE.  		// Used by LLPlacesFolderView. -		if (getFolderViewModel()->getFilter().showAllResults()) +		if (filter_object.showAllResults())  		{  			// these are named variables to get around gcc not binding non-const references to rvalues  			// and functor application is inherently non-const to allow for stateful functors diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h index 11fccdace4..c28660819f 100755 --- a/indra/llui/llfolderview.h +++ b/indra/llui/llfolderview.h @@ -236,7 +236,7 @@ public:  	virtual S32	notify(const LLSD& info) ;  	bool useLabelSuffix() { return mUseLabelSuffix; } -	void updateMenu(); +	virtual void updateMenu();  private:  	void updateMenuOptions(LLMenuGL* menu); diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h index b1bcc8bbb4..a909d13f97 100755 --- a/indra/llui/llfolderviewmodel.h +++ b/indra/llui/llfolderviewmodel.h @@ -386,27 +386,36 @@ template <typename SORT_TYPE, typename ITEM_TYPE, typename FOLDER_TYPE, typename  class LLFolderViewModel : public LLFolderViewModelCommon  {  public: -	LLFolderViewModel(){} -	virtual ~LLFolderViewModel() {} -  	typedef SORT_TYPE		SortType;  	typedef ITEM_TYPE		ItemType;  	typedef FOLDER_TYPE		FolderType;  	typedef FILTER_TYPE		FilterType; -	virtual SortType& getSorter()					 { return mSorter; } -	virtual const SortType& getSorter() const 		 { return mSorter; } -	virtual void setSorter(const SortType& sorter) 	 { mSorter = sorter; requestSortAll(); } +	LLFolderViewModel(SortType* sorter, FilterType* filter)  +	:	mSorter(sorter), +		mFilter(filter) +	{} -	virtual FilterType& getFilter() 				 { return mFilter; } -	virtual const FilterType& getFilter() const		 { return mFilter; } -	virtual void setFilter(const FilterType& filter) { mFilter = filter; } +	virtual ~LLFolderViewModel()  +	{ +		delete mSorter; +		mSorter = NULL; +		delete mFilter; +		mFilter = NULL; +	} + +	virtual SortType& getSorter()					 { return *mSorter; } +	virtual const SortType& getSorter() const 		 { return *mSorter; } +	virtual void setSorter(const SortType& sorter) 	 { mSorter = new SortType(sorter); requestSortAll(); } + +	virtual FilterType& getFilter() 				 { return *mFilter; } +	virtual const FilterType& getFilter() const		 { return *mFilter; } +	virtual void setFilter(const FilterType& filter) { mFilter = new FilterType(filter); }  	// By default, we assume the content is available. If a network fetch mechanism is implemented for the model,  	// this method needs to be overloaded and return the relevant fetch status.  	virtual bool contentsReady()					{ return true; } -  	struct ViewModelCompare  	{  		ViewModelCompare(const SortType& sorter) @@ -438,8 +447,8 @@ public:  	}  protected: -	SortType		mSorter; -	FilterType		mFilter; +	SortType*		mSorter; +	FilterType*		mFilter;  };  #endif // LLFOLDERVIEWMODEL_H diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 02c81c0744..6c4d031907 100755 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -264,7 +264,8 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :  	mContextMenu(NULL),  	mShowContextMenu(p.show_context_menu),  	mEnableTooltipPaste(p.enable_tooltip_paste), -	mPassDelete(FALSE) +	mPassDelete(FALSE), +	mKeepSelectionOnReturn(false)  {  	mSourceID.generate(); @@ -1664,7 +1665,7 @@ BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask)  	case KEY_RETURN:  		if (mask == MASK_NONE)  		{ -			if( hasSelection() ) +			if( hasSelection() && !mKeepSelectionOnReturn )  			{  				deleteSelection(FALSE);  			} @@ -2338,7 +2339,8 @@ void LLTextEditor::autoIndent()  	S32 i;  	LLWString text = getWText(); -	while( ' ' == text[line_start] ) +	S32 offset = getLineOffsetFromDocIndex(mCursorPos); +	while(( ' ' == text[line_start] ) && (space_count < offset))  	{  		space_count++;  		line_start++; diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index d3b7bc0eb7..02a76d2f8a 100755 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -295,6 +295,7 @@ protected:  	/*virtual*/ void	updateSegments();  	void				updateLinkSegments(); +	void				keepSelectionOnReturn(bool keep) { mKeepSelectionOnReturn = keep; }  private:  	// @@ -338,6 +339,7 @@ private:  	bool			mParseOnTheFly;  	bool			mEnableTooltipPaste;  	bool			mPassDelete; +	bool			mKeepSelectionOnReturn;	// disabling of removing selected text after pressing of Enter  	LLUUID			mSourceID; diff --git a/indra/llwindow/llopenglview-objc.h b/indra/llwindow/llopenglview-objc.h index 1e0e47cd02..f1fab3b2c6 100644 --- a/indra/llwindow/llopenglview-objc.h +++ b/indra/llwindow/llopenglview-objc.h @@ -42,6 +42,7 @@  	unsigned int mMarkedTextLength;      bool mMarkedTextAllowed;      bool mSimulatedRightClick; +    bool mOldResize;  }  - (id) initWithSamples:(NSUInteger)samples;  - (id) initWithSamples:(NSUInteger)samples andVsync:(BOOL)vsync; @@ -49,6 +50,8 @@  - (void)commitCurrentPreedit; +- (void) setOldResize:(bool)oldresize; +  // rebuildContext  // Destroys and recreates a context with the view's internal format set via setPixelFormat;  // Use this in event of needing to rebuild a context for whatever reason, without needing to assign a new pixel format. diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index b393a3796d..017ea3769c 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -94,8 +94,11 @@ attributedStringInfo getSegments(NSAttributedString *str)  // Force a high quality update after live resizing  - (void) viewDidEndLiveResize  { -    NSSize size = [self frame].size; -    callResize(size.width, size.height); +    if (mOldResize)  //Maint-3135 +    { +        NSSize size = [self frame].size; +        callResize(size.width, size.height); +    }  }  - (unsigned long)getVramSize @@ -124,10 +127,18 @@ attributedStringInfo getSegments(NSAttributedString *str)  											   object:[self window]];  } +- (void)setOldResize:(bool)oldresize +{ +    mOldResize = oldresize; +} +  - (void)windowResized:(NSNotification *)notification;  { -	//NSSize size = [self frame].size; -	//callResize(size.width, size.height); +    if (!mOldResize)  //Maint-3288 +    { +        NSSize size = [self frame].size; +        callResize(size.width, size.height); +    }  }  - (void)dealloc @@ -204,6 +215,8 @@ attributedStringInfo getSegments(NSAttributedString *str)  		[glContext setValues:(const GLint*)0 forParameter:NSOpenGLCPSwapInterval];  	} +    mOldResize = false; +      	return self;  } diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index 78186004b8..50ea614634 100755 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -123,7 +123,7 @@ public:  	virtual void swapBuffers() = 0;  	virtual void bringToFront() = 0;  	virtual void focusClient() { };		// this may not have meaning or be required on other platforms, therefore, it's not abstract -	 +	virtual void setOldResize(bool oldresize) { };  	// handy coordinate space conversion routines  	// NB: screen to window and vice verse won't work on width/height coordinate pairs,  	// as the conversion must take into account left AND right border widths, etc. diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h index 81b25601a9..d64525fbdd 100755 --- a/indra/llwindow/llwindowmacosx-objc.h +++ b/indra/llwindow/llwindowmacosx-objc.h @@ -74,6 +74,7 @@ void showNSCursor();  void hideNSCursorTillMove(bool hide);  void requestUserAttention();  long showAlert(std::string title, std::string text, int type); +void setResizeMode(bool oldresize, void* glview);  NSWindowRef createNSWindow(int x, int y, int width, int height); diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm index 0768d0352e..1a21bf8430 100755 --- a/indra/llwindow/llwindowmacosx-objc.mm +++ b/indra/llwindow/llwindowmacosx-objc.mm @@ -91,7 +91,7 @@ const unsigned short *copyFromPBoard()  		NSArray *objToPaste = [pboard readObjectsForClasses:classArray options:[NSDictionary dictionary]];  		str = [objToPaste objectAtIndex:0];  	} -	unichar* temp = (unichar*)calloc([str length], sizeof(unichar)); +	unichar* temp = (unichar*)calloc([str length]+1, sizeof(unichar));  	[str getCharacters:temp];  	[pool release];  	return temp; @@ -222,6 +222,11 @@ GLViewRef createOpenGLView(NSWindowRef window, unsigned int samples, bool vsync)  	return glview;  } +void setResizeMode(bool oldresize, void* glview) +{ +    [(LLOpenGLView *)glview setOldResize:oldresize]; +} +  void glSwapBuffers(void* context)  {  	[(NSOpenGLContext*)context flushBuffer]; diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index 6a6b39e674..825fd05c5f 100755 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -152,7 +152,10 @@ protected:  	BOOL	resetDisplayResolution();  	BOOL	shouldPostQuit() { return mPostQuit; } - +     +    //Satisfy MAINT-3135 and MAINT-3288 with a flag. +    /*virtual */ void setOldResize(bool oldresize) {setResizeMode(oldresize, mGLView); } +   protected:  	// diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 30f5526500..5106da09b2 100755 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -85,6 +85,18 @@ void show_window_creation_error(const std::string& title)  	LL_WARNS("Window") << title << LL_ENDL;  } +HGLRC SafeCreateContext(HDC hdc) +{ +	__try  +	{ +		return wglCreateContext(hdc); +	} +	__except(EXCEPTION_EXECUTE_HANDLER) +	{  +		return NULL; +	} +} +  //static  BOOL LLWindowWin32::sIsClassRegistered = FALSE; @@ -1166,14 +1178,15 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  		return FALSE;  	} -	if (!(mhRC = wglCreateContext(mhDC))) + +	if (!(mhRC = SafeCreateContext(mhDC)))  	{  		close();  		OSMessageBox(mCallbacks->translateString("MBGLContextErr"),  			mCallbacks->translateString("MBError"), OSMB_OK);  		return FALSE;  	} - +		  	if (!wglMakeCurrent(mhDC, mhRC))  	{  		close(); @@ -1831,6 +1844,10 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  	// This helps prevent avatar walking after maximizing the window by double-clicking the title bar.  	static bool sHandleLeftMouseUp = true; +	// Ignore the double click received right after activating app. +	// This is to avoid triggering double click teleport after returning focus (see MAINT-3786). +	static bool sHandleDoubleClick = true; +  	LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLong(h_wnd, GWL_USERDATA); @@ -1958,6 +1975,11 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  					}  				} +				if (!activating) +				{ +					sHandleDoubleClick = false; +				} +  				window_imp->mCallbacks->handleActivateApp(window_imp, activating);  				break; @@ -2182,6 +2204,7 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  				window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_NCLBUTTONDOWN");  				// A click in a non-client area, e.g. title bar or window border.  				sHandleLeftMouseUp = false; +				sHandleDoubleClick = true;  			}  			break; @@ -2226,6 +2249,13 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  		//case WM_RBUTTONDBLCLK:  			{  				window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_LBUTTONDBLCLK"); + +				if (!sHandleDoubleClick) +				{ +					sHandleDoubleClick = true; +					break; +				} +  				// Because we move the cursor position in the app, we need to query  				// to find out where the cursor at the time the event is handled.  				// If we don't do this, many clicks could get buffered up, and if the diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l index 88dfc2e9f3..05db551227 100755 --- a/indra/lscript/lscript_compile/indra.l +++ b/indra/lscript/lscript_compile/indra.l @@ -648,7 +648,8 @@ int yyerror(const char *fmt, ...);  "REGION_FLAG_SANDBOX"		{ count(); yylval.ival = REGION_FLAGS_SANDBOX; return(INTEGER_CONSTANT); }  "REGION_FLAG_DISABLE_COLLISIONS"		{ count(); yylval.ival = REGION_FLAGS_SKIP_COLLISIONS; return(INTEGER_CONSTANT); }  "REGION_FLAG_DISABLE_PHYSICS"		{ count(); yylval.ival = REGION_FLAGS_SKIP_PHYSICS; return(INTEGER_CONSTANT); } -"REGION_FLAG_BLOCK_FLY"		{ count(); yylval.ival = REGION_FLAGS_BLOCK_FLY; return(INTEGER_CONSTANT); } +"REGION_FLAG_BLOCK_FLY"			{ count(); yylval.ival = REGION_FLAGS_BLOCK_FLY; return(INTEGER_CONSTANT); } +"REGION_FLAG_BLOCK_FLYOVER"		{ count(); yylval.ival = REGION_FLAGS_BLOCK_FLYOVER; return(INTEGER_CONSTANT); }  "REGION_FLAG_ALLOW_DIRECT_TELEPORT"		{ count(); yylval.ival = REGION_FLAGS_ALLOW_DIRECT_TELEPORT; return(INTEGER_CONSTANT); }  "REGION_FLAG_RESTRICT_PUSHOBJECT"		{ count(); yylval.ival = REGION_FLAGS_RESTRICT_PUSHOBJECT; return(INTEGER_CONSTANT); } diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 17e340d136..c4886d5b73 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -660,7 +660,6 @@ set(viewer_SOURCE_FILES      llwearablelist.cpp      llweb.cpp      llwebprofile.cpp -    llwebsharing.cpp      llwind.cpp      llwindowlistener.cpp      llwlanimator.cpp @@ -1240,7 +1239,6 @@ set(viewer_HEADER_FILES      llwearablelist.h      llweb.h      llwebprofile.h -    llwebsharing.h      llwind.h      llwindowlistener.h      llwlanimator.h diff --git a/indra/newview/SecondLife.nib b/indra/newview/SecondLife.nibBinary files differ index 8b99b5a770..c4ddca50dc 100644 --- a/indra/newview/SecondLife.nib +++ b/indra/newview/SecondLife.nib diff --git a/indra/newview/SecondLife.xib b/indra/newview/SecondLife.xib index 370df6bf5f..ef25c648a7 100644 --- a/indra/newview/SecondLife.xib +++ b/indra/newview/SecondLife.xib @@ -120,7 +120,7 @@  								</object>  								<object class="NSMenuItem" id="755159360">  									<reference key="NSMenu" ref="110575045"/> -									<string key="NSTitle">Hide NewApplication</string> +									<string key="NSTitle">Hide Second Life</string>  									<string key="NSKeyEquiv">h</string>  									<int key="NSKeyEquivModMask">1048576</int>  									<int key="NSMnemonicLoc">2147483647</int> diff --git a/indra/newview/app_settings/keys.xml b/indra/newview/app_settings/keys.xml index 6e3673e7d9..a8037fec05 100755 --- a/indra/newview/app_settings/keys.xml +++ b/indra/newview/app_settings/keys.xml @@ -293,11 +293,24 @@      <!--these are for passing controls when sitting on vehicles-->      <binding key="A" mask="SHIFT" command="slide_left"/>      <binding key="D" mask="SHIFT" command="slide_right"/> +    <binding key="W" mask="SHIFT" command="move_forward_sitting"/> +	<binding key="S" mask="SHIFT" command="move_backward_sitting"/> +	<binding key="E" mask="SHIFT" command="spin_over_sitting"/> +	<binding key="C" mask="SHIFT" command="spin_under_sitting"/> +      <binding key="LEFT" mask="SHIFT" command="slide_left"/>      <binding key="RIGHT" mask="SHIFT" command="slide_right"/> +    <binding key="UP" mask="SHIFT" command="move_forward_sitting"/> +	<binding key="DOWN" mask="SHIFT" command="move_backward_sitting"/> +	<binding key="PGUP" mask="SHIFT" command="spin_over_sitting"/> +	<binding key="PGDN" mask="SHIFT" command="spin_under_sitting"/>      <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>      <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/> +    <binding key="PAD_UP" mask="SHIFT" command="move_forward_sitting"/> +	<binding key="PAD_DOWN" mask="SHIFT" command="move_backward_sitting"/> +	<binding key="PAD_PGUP" mask="SHIFT" command="spin_over_sitting"/> +	<binding key="PAD_PGDN" mask="SHIFT" command="spin_under_sitting"/>       <binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>      <binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/> diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini index ad843bca14..17c70ef1c5 100755 --- a/indra/newview/app_settings/keywords.ini +++ b/indra/newview/app_settings/keywords.ini @@ -526,6 +526,7 @@ REGION_FLAG_SANDBOX					Used with llGetRegionFlags to find if a region is a sand  REGION_FLAG_DISABLE_COLLISIONS		Used with llGetRegionFlags to find if a region has disabled collisions  REGION_FLAG_DISABLE_PHYSICS			Used with llGetRegionFlags to find if a region has disabled physics  REGION_FLAG_BLOCK_FLY				Used with llGetRegionFlags to find if a region blocks flying +REGION_FLAG_BLOCK_FLYOVER			Used with llGetRegionFlags to find if a region enforces higher altitude parcel access rules  REGION_FLAG_ALLOW_DIRECT_TELEPORT	Used with llGetRegionFlags to find if a region allows direct teleports  REGION_FLAG_RESTRICT_PUSHOBJECT		Used with llGetRegionFlags to find if a region restricts llPushObject() calls diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index d39bf6c3c2..dfbf6b0156 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -7982,6 +7982,18 @@      <integer>128</integer>    </map> +  <key>OctreeMinimumNodeSize</key> +  <map> +    <key>Comment</key> +    <string>Minimum size of any octree node</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>F32</string> +    <key>Value</key> +    <real>0.01</real> +  </map> +    <key>OctreeStaticObjectSizeFactor</key>    <map>      <key>Comment</key> @@ -11333,28 +11345,6 @@        <key>Value</key>        <integer>75</integer>      </map> -    <key>SnapshotSharingEnabled</key> -    <map> -      <key>Comment</key> -      <string>Enable uploading of snapshots to a web service.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>SnapshotConfigURL</key> -    <map> -      <key>Comment</key> -      <string>URL to fetch Snapshot Sharing configuration data from.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://photos.apps.staging.avatarsunited.com/viewer_config</string> -    </map>      <key>SpeedTest</key>      <map>        <key>Comment</key> @@ -14969,7 +14959,6 @@      <key>Value</key>      <integer>0</integer>    </map> -    <key>VersionChannelName</key>      <map>        <key>Comment</key> diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt index 8efc4ee87d..badbe486b9 100755 --- a/indra/newview/gpu_table.txt +++ b/indra/newview/gpu_table.txt @@ -327,7 +327,8 @@ Intel HD Graphics 4600					.*Intel.*HD Graphics 46.*							3	1	0	4.2  Intel HD Graphics 4000					.*Intel.*HD Graphics 4.*							3	1	1	4.2  Intel Intel Iris Pro Graphics 5200		.*Intel.*Iris Pro Graphics 52.*						4	1	0	4  Intel Intel Iris Graphics 5100			.*Intel.*Iris Graphics 51.*							4	1	0	4 -Intel Intel Iris OpenGL Engine			.*Intel.*Iris (Pro )*OpenGL.*							4	1	0	4 +Intel Intel Iris OpenGL Engine			.*Intel.*Iris OpenGL.*							4	1	0	4 +Intel Intel Iris Pro OpenGL Engine			.*Intel.*Iris Pro OpenGL.*							5	1	0	4  Intel HD Graphics 5000					.*Intel.*HD Graphics 5.*							4	1	0	4  Intel HD Graphics						.*Intel.*HD Graphics.*								2	1	1	4  Intel Mobile 4 Series					.*Intel.*Mobile.* 4 Series.*						0	1	1	2.1 diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index c4f503ef4e..4ece83d85a 100755 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -122,24 +122,8 @@ Var DO_UNINSTALL_V2     ; If non-null, path to a previous Viewer 2 installation  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  Function .onInstSuccess
      Push $R0	# Option value, unused
 -
 -    StrCmp $SKIP_DIALOGS "true" label_launch 
 -
 -    ${GetOptions} $COMMANDLINE "/AUTOSTART" $R0
 -    # If parameter was there (no error) just launch
 -    # Otherwise ask
 -    IfErrors label_ask_launch label_launch
 -    
 -label_ask_launch:
 -    # Don't launch by default when silent
 -    IfSilent label_no_launch
 -	MessageBox MB_YESNO $(InstSuccesssQuestion) \
 -        IDYES label_launch IDNO label_no_launch
 -        
 -label_launch:
  	# Assumes SetOutPath $INSTDIR
  	Exec '"$INSTDIR\$INSTEXE" $SHORTCUT_LANG_PARAM'
 -label_no_launch:
  	Pop $R0
  FunctionEnd
 diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 7a93a95ebf..0582916362 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -850,12 +850,9 @@ boost::signals2::connection LLAgent::addParcelChangedCallback(parcel_changed_cal  //-----------------------------------------------------------------------------  void LLAgent::setRegion(LLViewerRegion *regionp)  { -	bool notifyRegionChange; -	  	llassert(regionp);  	if (mRegionp != regionp)  	{ -		notifyRegionChange = true;  		std::string ip = regionp->getHost().getString();  		LL_INFOS("AgentLocation") << "Moving agent into region: " << regionp->getName() @@ -908,10 +905,7 @@ void LLAgent::setRegion(LLViewerRegion *regionp)  		// Pass new region along to metrics components that care about this level of detail.  		LLAppViewer::metricsUpdateRegion(regionp->getHandle());  	} -	else -	{ -		notifyRegionChange = false; -	} +  	mRegionp = regionp;  	// TODO - most of what follows probably should be moved into callbacks @@ -947,11 +941,8 @@ void LLAgent::setRegion(LLViewerRegion *regionp)  		mRegionp->setCapabilitiesReceivedCallback(boost::bind(&LLAgent::handleServerBakeRegionTransition,this,_1));  	} -	if (notifyRegionChange) -	{ -		LL_DEBUGS("AgentLocation") << "Calling RegionChanged callbacks" << LL_ENDL; -		mRegionChangedSignal(); -	} +	LL_DEBUGS("AgentLocation") << "Calling RegionChanged callbacks" << LL_ENDL; +	mRegionChangedSignal();  } diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index e3c89f1a5f..d4fdf8fd49 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3190,6 +3190,14 @@ bool LLAppViewer::initWindow()  	LLNotificationsUI::LLNotificationManager::getInstance(); +     +#ifdef LL_DARWIN +    //Satisfy both MAINT-3135 (OSX 10.6 and earlier) MAINT-3288 (OSX 10.7 and later) +   if (getOSInfo().mMajorVer == 10 && getOSInfo().mMinorVer < 7) +		if ( getOSInfo().mMinorVer == 6 && getOSInfo().mBuild < 8 ) +       		gViewerWindow->getWindow()->setOldResize(true); +#endif +      	if (gSavedSettings.getBOOL("WindowMaximized"))  	{  		gViewerWindow->getWindow()->maximize(); diff --git a/indra/newview/llcolorswatch.h b/indra/newview/llcolorswatch.h index 5bdd1712d2..b3b6cfe32d 100755 --- a/indra/newview/llcolorswatch.h +++ b/indra/newview/llcolorswatch.h @@ -59,6 +59,7 @@ public:  		Optional<LLUIImage*>			alpha_background_image;  		Optional<commit_callback_t> 	cancel_callback;  		Optional<commit_callback_t> 	select_callback; +		Optional<commit_callback_t>		preview_callback;  		Optional<LLUIColor>				border_color;  		Optional<S32>					label_width;  		Optional<S32>					label_height; @@ -87,6 +88,7 @@ public:  	void			setCanApplyImmediately(BOOL apply) { mCanApplyImmediately = apply; }  	void			setOnCancelCallback(commit_callback_t cb) { mOnCancelCallback = cb; }  	void			setOnSelectCallback(commit_callback_t cb) { mOnSelectCallback = cb; } +	void			setPreviewCallback(commit_callback_t cb) { mPreviewCallback = cb; }  	void			setFallbackImageName(const std::string& name) { mFallbackImageName = name; }  	void			showPicker(BOOL take_focus); @@ -112,6 +114,7 @@ protected:  	BOOL			mCanApplyImmediately;  	commit_callback_t mOnCancelCallback;  	commit_callback_t mOnSelectCallback; +	commit_callback_t mPreviewCallback;  	S32             mLabelWidth;  	S32             mLabelHeight; diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h index d8cdcdfc97..dc74506c53 100644 --- a/indra/newview/llconversationmodel.h +++ b/indra/newview/llconversationmodel.h @@ -291,6 +291,9 @@ class LLConversationViewModel  {  public:  	typedef LLFolderViewModel<LLConversationSort, LLConversationItem, LLConversationItem, LLConversationFilter> base_t; +	LLConversationViewModel()  +	:	base_t(new LLConversationSort(), new LLConversationFilter()) +	{}  	void sort(LLFolderViewFolder* folder);  	bool contentsReady() { return true; }	// *TODO : we need to check that participants names are available somewhat diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 6b4c5cfca1..79a81cedda 100755 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -155,7 +155,7 @@ void LLStandardBumpmap::addstandard()  			LLViewerTextureManager::getFetchedTexture(LLUUID(bump_image_id));	  		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setBoostLevel(LLGLTexture::LOCAL) ;  		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setLoadedCallback(LLBumpImageList::onSourceStandardLoaded, 0, TRUE, FALSE, NULL, NULL ); -		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->forceToSaveRawImage(0) ; +		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->forceToSaveRawImage(0, 30.f) ;  		LLStandardBumpmap::sStandardBumpmapCount++;  	} diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 16eacc9392..057acf69b9 100755 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -570,6 +570,7 @@ std::vector<std::string>* LLFilePicker::navOpenFilterProc(ELoadFilter filter) //              allowedv->push_back("lsl");              allowedv->push_back("dic");              allowedv->push_back("xcu"); +            allowedv->push_back("gif");          case FFLOAD_IMAGE:              allowedv->push_back("jpg");              allowedv->push_back("jpeg"); @@ -661,7 +662,7 @@ bool	LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& filena  		case FFSAVE_TGAPNG:  			type = "PNG";  			creator = "prvw"; -			extension = "png"; +			extension = "png,tga";  			break;  		case FFSAVE_BMP:  			type = "BMPf"; @@ -779,7 +780,7 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)  	if(filter == FFLOAD_ALL)	// allow application bundles etc. to be traversed; important for DEV-16869, but generally useful  	{ -        mPickOptions &= F_NAV_SUPPORT; +        mPickOptions |= F_NAV_SUPPORT;  	}  	if (blocking) diff --git a/indra/newview/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm index 13757904e3..1438e4dc0a 100644 --- a/indra/newview/llfilepicker_mac.mm +++ b/indra/newview/llfilepicker_mac.mm @@ -107,7 +107,7 @@ std::string* doSaveDialog(const std::string* file,      NSSavePanel *panel = [NSSavePanel savePanel];       NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]]; -    NSArray *fileType = [[NSArray alloc] initWithObjects:extensionns,nil]; +    NSArray *fileType = [extensionns componentsSeparatedByString:@","];      //[panel setMessage:@"Save Image File"];       [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index c0afb72cff..1b0e73409b 100755 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -795,7 +795,7 @@ bool LLFloaterAvatarPicker::isSelectBtnEnabled()  {  	bool ret_val = visibleItemsSelected(); -	if ( ret_val && mOkButtonValidateSignal.num_slots() ) +	if ( ret_val )  	{  		std::string acvtive_panel_name;  		LLScrollListCtrl* list =  NULL; @@ -826,7 +826,7 @@ bool LLFloaterAvatarPicker::isSelectBtnEnabled()  			getSelectedAvatarData(list, avatar_ids, avatar_names);  			if (avatar_ids.size() >= 1)   			{ -				ret_val = mOkButtonValidateSignal(avatar_ids); +				ret_val = mOkButtonValidateSignal.num_slots()?mOkButtonValidateSignal(avatar_ids):true;  			}  			else  			{ diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp index a03425649f..7ba7660f19 100755 --- a/indra/newview/llfloatercolorpicker.cpp +++ b/indra/newview/llfloatercolorpicker.cpp @@ -347,6 +347,11 @@ void LLFloaterColorPicker::setCurRgb ( F32 curRIn, F32 curGIn, F32 curBIn )  	curG = curGIn;  	curB = curBIn; +	if (mApplyImmediateCheck->get()) +	{ +		LLColorSwatchCtrl::onColorChanged ( getSwatch (), LLColorSwatchCtrl::COLOR_CHANGE ); +	} +  	// update corresponding HSL values and  	LLColor3(curRIn, curGIn, curBIn).calcHSL(&curH, &curS, &curL); @@ -374,6 +379,11 @@ void LLFloaterColorPicker::setCurHsl ( F32 curHIn, F32 curSIn, F32 curLIn )  	// update corresponding RGB values and  	hslToRgb ( curH, curS, curL, curR, curG, curB ); + +	if (mApplyImmediateCheck->get()) +	{ +		LLColorSwatchCtrl::onColorChanged ( getSwatch (), LLColorSwatchCtrl::COLOR_CHANGE ); +	}  }  ////////////////////////////////////////////////////////////////////////////// @@ -463,10 +473,6 @@ void LLFloaterColorPicker::onImmediateCheck( LLUICtrl* ctrl, void* data)  void LLFloaterColorPicker::onColorSelect( const LLTextureEntry& te )  {  	setCurRgb(te.getColor().mV[VRED], te.getColor().mV[VGREEN], te.getColor().mV[VBLUE]); -	if (mApplyImmediateCheck->get()) -	{ -		LLColorSwatchCtrl::onColorChanged ( getSwatch (), LLColorSwatchCtrl::COLOR_CHANGE ); -	}  }  void LLFloaterColorPicker::onMouseCaptureLost() diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp index a303c2c6b3..a358b7c10b 100755 --- a/indra/newview/llfloaterconversationpreview.cpp +++ b/indra/newview/llfloaterconversationpreview.cpp @@ -32,6 +32,7 @@  #include "llfloaterimnearbychat.h"  #include "llspinctrl.h"  #include "lltrans.h" +#include "llnotificationsutil.h"  const std::string LL_FCP_COMPLETE_NAME("complete_name");  const std::string LL_FCP_ACCOUNT_NAME("user_name"); @@ -45,14 +46,20 @@ LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_i  	mAccountName(session_id[LL_FCP_ACCOUNT_NAME]),  	mCompleteName(session_id[LL_FCP_COMPLETE_NAME]),  	mMutex(NULL), -	mShowHistory(false) +	mShowHistory(false), +	mMessages(NULL), +	mHistoryThreadsBusy(false), +	mOpened(false) +{ +} + +LLFloaterConversationPreview::~LLFloaterConversationPreview()  {  }  BOOL LLFloaterConversationPreview::postBuild()  {  	mChatHistory = getChild<LLChatHistory>("chat_history"); -	LLLoadHistoryThread::setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2));  	const LLConversation* conv = LLConversationLog::instance().getConversation(mSessionID);  	std::string name; @@ -79,31 +86,21 @@ BOOL LLFloaterConversationPreview::postBuild()  	std::string title = getString("Title", args);  	setTitle(title); -	LLSD load_params; -	load_params["load_all_history"] = true; -	load_params["cut_off_todays_date"] = false; - - -	LLSD loading; -	loading[LL_IM_TEXT] = LLTrans::getString("loading_chat_logs"); -	mMessages.push_back(loading); -	mPageSpinner = getChild<LLSpinCtrl>("history_page_spin"); -	mPageSpinner->setCommitCallback(boost::bind(&LLFloaterConversationPreview::onMoreHistoryBtnClick, this)); -	mPageSpinner->setMinValue(1); -	mPageSpinner->set(1); -	mPageSpinner->setEnabled(false); -	LLLogChat::startChatHistoryThread(file, load_params);  	return LLFloater::postBuild();  } -void LLFloaterConversationPreview::setPages(std::list<LLSD>& messages,const std::string& file_name) +void LLFloaterConversationPreview::setPages(std::list<LLSD>* messages, const std::string& file_name)  { -	if(file_name == mChatHistoryFileName) +	if(file_name == mChatHistoryFileName && messages)  	{  		// additional protection to avoid changes of mMessages in setPages()  		LLMutexLock lock(&mMutex); +		if (mMessages) +		{ +			delete mMessages; // Clean up temporary message list with "Loading..." text +		}  		mMessages = messages; -		mCurrentPage = (mMessages.size() ? (mMessages.size() - 1) / mPageSize : 0); +		mCurrentPage = (mMessages->size() ? (mMessages->size() - 1) / mPageSize : 0);  		mPageSpinner->setEnabled(true);  		mPageSpinner->setMaxValue(mCurrentPage+1); @@ -113,6 +110,11 @@ void LLFloaterConversationPreview::setPages(std::list<LLSD>& messages,const std:  		getChild<LLTextBox>("page_num_label")->setValue(total_page_num);  		mShowHistory = true;  	} +	LLLoadHistoryThread* loadThread = LLLogChat::getLoadHistoryThread(mSessionID); +	if (loadThread) +	{ +		loadThread->removeLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2)); +	}  }  void LLFloaterConversationPreview::draw() @@ -127,24 +129,82 @@ void LLFloaterConversationPreview::draw()  void LLFloaterConversationPreview::onOpen(const LLSD& key)  { +	if (mOpened) +	{ +		return; +	} +	mOpened = true; +	if (!LLLogChat::historyThreadsFinished(mSessionID)) +	{ +		LLNotificationsUtil::add("ChatHistoryIsBusyAlert"); +		mHistoryThreadsBusy = true; +		closeFloater(); +		return; +	} +	LLSD load_params; +	load_params["load_all_history"] = true; +	load_params["cut_off_todays_date"] = false; + +	// The temporary message list with "Loading..." text +	// Will be deleted upon loading completion in setPages() method +	mMessages = new std::list<LLSD>(); + + +	LLSD loading; +	loading[LL_IM_TEXT] = LLTrans::getString("loading_chat_logs"); +	mMessages->push_back(loading); +	mPageSpinner = getChild<LLSpinCtrl>("history_page_spin"); +	mPageSpinner->setCommitCallback(boost::bind(&LLFloaterConversationPreview::onMoreHistoryBtnClick, this)); +	mPageSpinner->setMinValue(1); +	mPageSpinner->set(1); +	mPageSpinner->setEnabled(false); + +	// The actual message list to load from file +	// Will be deleted in a separate thread LLDeleteHistoryThread not to freeze UI +	// LLDeleteHistoryThread is started in destructor +	std::list<LLSD>* messages = new std::list<LLSD>(); + +	LLLogChat::cleanupHistoryThreads(); +	 +	LLLoadHistoryThread* loadThread = new LLLoadHistoryThread(mChatHistoryFileName, messages, load_params); +	loadThread->setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2)); +	loadThread->start(); +	LLLogChat::addLoadHistoryThread(mSessionID, loadThread); + +	LLDeleteHistoryThread* deleteThread = new LLDeleteHistoryThread(messages, loadThread); +	LLLogChat::addDeleteHistoryThread(mSessionID, deleteThread); +  	mShowHistory = true;  } +void LLFloaterConversationPreview::onClose(bool app_quitting) +{ +	mOpened = false; +	if (!mHistoryThreadsBusy) +	{ +		LLDeleteHistoryThread* deleteThread = LLLogChat::getDeleteHistoryThread(mSessionID); +		if (deleteThread) +		{ +			deleteThread->start(); +		} +	} +} +  void LLFloaterConversationPreview::showHistory()  {  	// additional protection to avoid changes of mMessages in setPages  	LLMutexLock lock(&mMutex); -	if (!mMessages.size() || mCurrentPage * mPageSize >= mMessages.size()) +	if(mMessages == NULL || !mMessages->size() || mCurrentPage * mPageSize >= mMessages->size())  	{  		return;  	}  	mChatHistory->clear();  	std::ostringstream message; -	std::list<LLSD>::const_iterator iter = mMessages.begin(); +	std::list<LLSD>::const_iterator iter = mMessages->begin();  	std::advance(iter, mCurrentPage * mPageSize); -	for (int msg_num = 0; iter != mMessages.end() && msg_num < mPageSize; ++iter, ++msg_num) +	for (int msg_num = 0; iter != mMessages->end() && msg_num < mPageSize; ++iter, ++msg_num)  	{  		LLSD msg = *iter; diff --git a/indra/newview/llfloaterconversationpreview.h b/indra/newview/llfloaterconversationpreview.h index b0488f4ff1..a8dbbc9ffe 100755 --- a/indra/newview/llfloaterconversationpreview.h +++ b/indra/newview/llfloaterconversationpreview.h @@ -39,13 +39,14 @@ class LLFloaterConversationPreview : public LLFloater  public:  	LLFloaterConversationPreview(const LLSD& session_id); -	virtual ~LLFloaterConversationPreview(){}; +	virtual ~LLFloaterConversationPreview();  	virtual BOOL postBuild(); -	void setPages(std::list<LLSD>& messages,const std::string& file_name); +	void setPages(std::list<LLSD>* messages,const std::string& file_name);  	virtual void draw();  	virtual void onOpen(const LLSD& key); +	virtual void onClose(bool app_quitting);  private:  	void onMoreHistoryBtnClick(); @@ -58,11 +59,13 @@ private:  	int				mCurrentPage;  	int				mPageSize; -	std::list<LLSD> mMessages; +	std::list<LLSD>*	mMessages;  	std::string		mAccountName;  	std::string		mCompleteName; -	std::string     mChatHistoryFileName; +	std::string		mChatHistoryFileName;  	bool			mShowHistory; +	bool			mHistoryThreadsBusy; +	bool			mOpened;  };  #endif /* LLFLOATERCONVERSATIONPREVIEW_H_ */ diff --git a/indra/newview/llfloaterhardwaresettings.cpp b/indra/newview/llfloaterhardwaresettings.cpp index 792a2a5d25..6923308ce9 100755 --- a/indra/newview/llfloaterhardwaresettings.cpp +++ b/indra/newview/llfloaterhardwaresettings.cpp @@ -87,15 +87,30 @@ void LLFloaterHardwareSettings::refresh()  	refreshEnabledState();  } +void LLFloaterHardwareSettings::onSetVRAM() +{ +	S32 vram = childGetValue("GraphicsCardTextureMemory").asInteger(); + +	//give the texture system plenty of leeway to avoid swapping +	vram /= 3; + +	gSavedSettings.setS32("TextureMemory", vram); +} +  void LLFloaterHardwareSettings::refreshEnabledState()  {      F32 mem_multiplier = gSavedSettings.getF32("RenderTextureMemoryMultiple");  	S32 min_tex_mem = LLViewerTextureList::getMinVideoRamSetting(); -	S32 max_tex_mem = LLViewerTextureList::getMaxVideoRamSetting(false, mem_multiplier); +	S32 max_tex_mem = LLViewerTextureList::getMaxVideoRamSetting(true, mem_multiplier);  	getChild<LLSliderCtrl>("GraphicsCardTextureMemory")->setMinValue(min_tex_mem);  	getChild<LLSliderCtrl>("GraphicsCardTextureMemory")->setMaxValue(max_tex_mem); +	S32 vram = gSavedSettings.getS32("TextureMemory"); +	vram = vram*3; + +	getChild<LLSliderCtrl>("GraphicsCardTextureMemory")->setValue(vram); +	getChild<LLSliderCtrl>("GraphicsCardTextureMemory")->setCommitCallback(boost::bind(&LLFloaterHardwareSettings::onSetVRAM, this));  	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderVBOEnable") ||  		!gGLManager.mHasVertexBufferObject)  	{ diff --git a/indra/newview/llfloaterhardwaresettings.h b/indra/newview/llfloaterhardwaresettings.h index 626771b1d2..63d86d5667 100755 --- a/indra/newview/llfloaterhardwaresettings.h +++ b/indra/newview/llfloaterhardwaresettings.h @@ -64,6 +64,8 @@ public:  	/// don't apply the changed values  	void cancel(); +	void onSetVRAM(); +  	/// refresh the enabled values  	void refreshEnabledState(); diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 566f9bc9cc..bb4b9d2d40 100755 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -1318,7 +1318,12 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v  	// Extract the single select info  	bool is_single_select = (uuids.size() == 1);  	const LLUUID& single_id = uuids.front(); -	 + +	if ("can_chat_history" == item && is_single_select) +	{ +		return LLLogChat::isTranscriptExist(uuids.front(),false); +	} +  	// Handle options that are applicable to all including the user agent      if ("can_view_profile" == item)      { diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp index 84921849d0..d94dd85bce 100755 --- a/indra/newview/llfloaterimsession.cpp +++ b/indra/newview/llfloaterimsession.cpp @@ -714,7 +714,7 @@ void LLFloaterIMSession::setVisible(BOOL visible)  	if (visible && isInVisibleChain())  	{  		sIMFloaterShowedSignal(mSessionID); -         +        updateMessages();  	}  } diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index b16ef6dd79..d79eee6be3 100755 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2336,7 +2336,7 @@ BOOL LLPanelLandAccess::postBuild()  	childSetCommitCallback("public_access", onCommitPublicAccess, this);  	childSetCommitCallback("limit_payment", onCommitAny, this);  	childSetCommitCallback("limit_age_verified", onCommitAny, this); -	childSetCommitCallback("GroupCheck", onCommitAny, this); +	childSetCommitCallback("GroupCheck", onCommitGroupCheck, this);  	childSetCommitCallback("PassCheck", onCommitAny, this);  	childSetCommitCallback("pass_combo", onCommitAny, this);  	childSetCommitCallback("PriceSpin", onCommitAny, this); @@ -2501,11 +2501,11 @@ void LLPanelLandAccess::refresh()  		}  		BOOL use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST); -		getChild<LLUICtrl>("PassCheck")->setValue(use_pass ); +		getChild<LLUICtrl>("PassCheck")->setValue(use_pass);  		LLCtrlSelectionInterface* passcombo = childGetSelectionInterface("pass_combo");  		if (passcombo)  		{ -			if (public_access || !use_pass || !use_group) +			if (public_access || !use_pass)  			{  				passcombo->selectByValue("anyone");  			} @@ -2598,12 +2598,11 @@ void LLPanelLandAccess::refresh_ui()  			getChildView("limit_age_verified")->setEnabled(FALSE); -			BOOL group_access = getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean();  			BOOL sell_passes = getChild<LLUICtrl>("PassCheck")->getValue().asBoolean();  			getChildView("PassCheck")->setEnabled(can_manage_allowed);  			if (sell_passes)  			{ -				getChildView("pass_combo")->setEnabled(group_access && can_manage_allowed); +				getChildView("pass_combo")->setEnabled(can_manage_allowed);  				getChildView("PriceSpin")->setEnabled(can_manage_allowed);  				getChildView("HoursSpin")->setEnabled(can_manage_allowed);  			} @@ -2662,6 +2661,32 @@ void LLPanelLandAccess::onCommitPublicAccess(LLUICtrl *ctrl, void *userdata)  	onCommitAny(ctrl, userdata);  } +void LLPanelLandAccess::onCommitGroupCheck(LLUICtrl *ctrl, void *userdata) +{ +	LLPanelLandAccess *self = (LLPanelLandAccess *)userdata; +	LLParcel* parcel = self->mParcel->getParcel(); +	if (!parcel) +	{ +		return; +	} + +	BOOL use_pass_list = !self->getChild<LLUICtrl>("public_access")->getValue().asBoolean(); +	BOOL use_access_group = self->getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean(); +	LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo"); +	if (passcombo) +	{ +		if (use_access_group && use_pass_list) +		{ +			if (passcombo->getSelectedValue().asString() == "group") +			{ +				passcombo->selectByValue("anyone"); +			} +		} +	} + +	onCommitAny(ctrl, userdata); +} +  // static  void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)  { @@ -2699,14 +2724,14 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)  	{  		use_access_list = TRUE;  		use_pass_list = self->getChild<LLUICtrl>("PassCheck")->getValue().asBoolean(); -		if (use_access_group && use_pass_list) +		LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo"); +		if (passcombo)  		{ -			LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo"); -			if (passcombo) +			if (use_access_group && use_pass_list)  			{  				if (passcombo->getSelectedValue().asString() == "group")  				{ -					use_access_list = FALSE; +					use_access_group = FALSE;  				}  			}  		} diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h index 4f1c10274a..95612fcb4a 100755 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -366,6 +366,7 @@ public:  	static void onCommitPublicAccess(LLUICtrl* ctrl, void *userdata);  	static void onCommitAny(LLUICtrl* ctrl, void *userdata); +	static void onCommitGroupCheck(LLUICtrl* ctrl, void *userdata);  	static void onClickRemoveAccess(void*);  	static void onClickRemoveBanned(void*); diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 73c0963a1d..cc0f246d1b 100755 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -366,6 +366,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)  	panel->getChild<LLUICtrl>("block_terraform_check")->setValue((region_flags & REGION_FLAGS_BLOCK_TERRAFORM) ? TRUE : FALSE );  	panel->getChild<LLUICtrl>("block_fly_check")->setValue((region_flags & REGION_FLAGS_BLOCK_FLY) ? TRUE : FALSE ); +	panel->getChild<LLUICtrl>("block_fly_over_check")->setValue((region_flags & REGION_FLAGS_BLOCK_FLYOVER) ? TRUE : FALSE );  	panel->getChild<LLUICtrl>("allow_damage_check")->setValue((region_flags & REGION_FLAGS_ALLOW_DAMAGE) ? TRUE : FALSE );  	panel->getChild<LLUICtrl>("restrict_pushobject")->setValue((region_flags & REGION_FLAGS_RESTRICT_PUSHOBJECT) ? TRUE : FALSE );  	panel->getChild<LLUICtrl>("allow_land_resell_check")->setValue((region_flags & REGION_FLAGS_BLOCK_LAND_RESELL) ? FALSE : TRUE ); @@ -635,6 +636,7 @@ BOOL LLPanelRegionGeneralInfo::postBuild()  	// Enable the "Apply" button if something is changed. JC  	initCtrl("block_terraform_check");  	initCtrl("block_fly_check"); +	initCtrl("block_fly_over_check");  	initCtrl("allow_damage_check");  	initCtrl("allow_land_resell_check");  	initCtrl("allow_parcel_changes_check"); @@ -816,6 +818,7 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()  	{  		body["block_terraform"] = getChild<LLUICtrl>("block_terraform_check")->getValue();  		body["block_fly"] = getChild<LLUICtrl>("block_fly_check")->getValue(); +		body["block_fly_over"] = getChild<LLUICtrl>("block_fly_over_check")->getValue();  		body["allow_damage"] = getChild<LLUICtrl>("allow_damage_check")->getValue();  		body["allow_land_resell"] = getChild<LLUICtrl>("allow_land_resell_check")->getValue();  		body["agent_limit"] = getChild<LLUICtrl>("agent_limit_spin")->getValue(); @@ -891,6 +894,7 @@ BOOL LLPanelRegionDebugInfo::postBuild()  	childSetAction("top_scripts_btn", onClickTopScripts, this);  	childSetAction("restart_btn", onClickRestart, this);  	childSetAction("cancel_restart_btn", onClickCancelRestart, this); +	childSetAction("region_debug_console_btn", onClickDebugConsole, this);  	return TRUE;  } @@ -912,6 +916,7 @@ bool LLPanelRegionDebugInfo::refreshFromRegion(LLViewerRegion* region)  	getChildView("top_scripts_btn")->setEnabled(allow_modify);  	getChildView("restart_btn")->setEnabled(allow_modify);  	getChildView("cancel_restart_btn")->setEnabled(allow_modify); +	getChildView("region_debug_console_btn")->setEnabled(allow_modify);  	return LLPanelRegionInfo::refreshFromRegion(region);  } @@ -1074,6 +1079,11 @@ void LLPanelRegionDebugInfo::onClickCancelRestart(void* data)  	self->sendEstateOwnerMessage(gMessageSystem, "restart", invoice, strings);  } +// static +void LLPanelRegionDebugInfo::onClickDebugConsole(void* data) +{ +	LLFloaterReg::showInstance("region_debug_console"); +}  BOOL LLPanelRegionTerrainInfo::validateTextureSizes()  { diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index f0499f1903..bf174f3700 100755 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -209,6 +209,7 @@ protected:  	static void onClickRestart(void* data);  	bool callbackRestart(const LLSD& notification, const LLSD& response);  	static void onClickCancelRestart(void* data); +	static void onClickDebugConsole(void* data);  private:  	LLUUID mTargetAvatar; diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index ea385d7baf..d9835292a1 100755 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -44,7 +44,6 @@  #include "lltoolfocus.h"  #include "lltoolmgr.h"  #include "llwebprofile.h" -#include "llwebsharing.h"  ///----------------------------------------------------------------------------  /// Local function declarations, constants, enums, and typedefs @@ -360,10 +359,6 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)  	ESnapshotFormat shot_format = (ESnapshotFormat)gSavedSettings.getS32("SnapshotFormat");  	LLViewerWindow::ESnapshotType layer_type = getLayerType(floater); -#if 0 -	floater->getChildView("share_to_web")->setVisible( gSavedSettings.getBOOL("SnapshotSharingEnabled")); -#endif -  	floater->getChild<LLComboBox>("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat"));  	enableAspectRatioCheckbox(floater, !floater->impl.mAspectRatioCheckOff);  	setAspectRatioCheckboxValue(floater, gSavedSettings.getBOOL("KeepAspectForSnapshot")); @@ -1032,12 +1027,6 @@ LLFloaterSnapshot::~LLFloaterSnapshot()  BOOL LLFloaterSnapshot::postBuild()  { -	// Kick start Web Sharing, to fetch its config data if it needs to. -	if (gSavedSettings.getBOOL("SnapshotSharingEnabled")) -	{ -		LLWebSharing::instance().init(); -	} -  	mRefreshBtn = getChild<LLUICtrl>("new_snapshot_btn");  	childSetAction("new_snapshot_btn", Impl::onClickNewSnapshot, this);  	mRefreshLabel = getChild<LLUICtrl>("refresh_lbl"); @@ -1263,7 +1252,7 @@ S32 LLFloaterSnapshot::notify(const LLSD& info)  //static   void LLFloaterSnapshot::update()  { -	LLFloaterSnapshot* inst = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* inst = findInstance();  	LLFloaterSocial* floater_social  = LLFloaterReg::findTypedInstance<LLFloaterSocial>("social");   	if (!inst && !floater_social) @@ -1291,12 +1280,18 @@ LLFloaterSnapshot* LLFloaterSnapshot::getInstance()  }  // static +LLFloaterSnapshot* LLFloaterSnapshot::findInstance() +{ +	return LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +} + +// static  void LLFloaterSnapshot::saveTexture()  {  	lldebugs << "saveTexture" << llendl;  	// FIXME: duplicated code -	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* instance = findInstance();  	if (!instance)  	{  		llassert(instance != NULL); @@ -1317,7 +1312,7 @@ BOOL LLFloaterSnapshot::saveLocal()  {  	lldebugs << "saveLocal" << llendl;  	// FIXME: duplicated code -	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* instance = findInstance();  	if (!instance)  	{  		llassert(instance != NULL); @@ -1337,7 +1332,7 @@ BOOL LLFloaterSnapshot::saveLocal()  void LLFloaterSnapshot::preUpdate()  {  	// FIXME: duplicated code -	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* instance = findInstance();  	if (instance)  	{  		// Disable the send/post/save buttons until snapshot is ready. @@ -1352,7 +1347,7 @@ void LLFloaterSnapshot::preUpdate()  void LLFloaterSnapshot::postUpdate()  {  	// FIXME: duplicated code -	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* instance = findInstance();  	if (instance)  	{  		// Enable the send/post/save buttons. @@ -1373,7 +1368,7 @@ void LLFloaterSnapshot::postUpdate()  // static  void LLFloaterSnapshot::postSave()  { -	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* instance = findInstance();  	if (!instance)  	{  		llassert(instance != NULL); @@ -1399,7 +1394,7 @@ LLPointer<LLImageFormatted> LLFloaterSnapshot::getImageData()  {  	// FIXME: May not work for textures. -	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* instance = findInstance();  	if (!instance)  	{  		llassert(instance != NULL); @@ -1426,7 +1421,7 @@ LLPointer<LLImageFormatted> LLFloaterSnapshot::getImageData()  // static  const LLVector3d& LLFloaterSnapshot::getPosTakenGlobal()  { -	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* instance = findInstance();  	if (!instance)  	{  		llassert(instance != NULL); @@ -1446,7 +1441,7 @@ const LLVector3d& LLFloaterSnapshot::getPosTakenGlobal()  // static  void LLFloaterSnapshot::setAgentEmail(const std::string& email)  { -	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* instance = findInstance();  	if (instance)  	{  		LLSideTrayPanelContainer* panel_container = instance->getChild<LLSideTrayPanelContainer>("panel_container"); diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index 82af8c7a9d..c757bf21c2 100755 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -56,6 +56,7 @@ public:  	// TODO: create a snapshot model instead  	static LLFloaterSnapshot* getInstance(); +	static LLFloaterSnapshot* findInstance();  	static void saveTexture();  	static BOOL saveLocal();  	static void preUpdate(); diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 7b25291da7..802544089c 100755 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -1069,9 +1069,9 @@ void LLFloaterTools::setGridMode(S32 mode)  void LLFloaterTools::onClickGridOptions()  { -	LLFloaterReg::showInstance("build_options"); -	// RN: this makes grid options dependent on build tools window -	//floaterp->addDependentFloater(LLFloaterBuildOptions::getInstance(), FALSE); +	LLFloater* floaterp = LLFloaterReg::showInstance("build_options"); +	// position floater next to build tools, not over +	floaterp->setRect(gFloaterView->findNeighboringPosition(this, floaterp));  }  // static diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp index 68dbb5ae33..3e9051967c 100755 --- a/indra/newview/llfloaterwebcontent.cpp +++ b/indra/newview/llfloaterwebcontent.cpp @@ -70,8 +70,7 @@ LLFloaterWebContent::LLFloaterWebContent( const Params& params )  	mShowPageTitle(params.show_page_title),      mAllowNavigation(true),      mCurrentURL(""), -    mDisplayURL(""), -    mSecureURL(false) +    mDisplayURL("")  {  	mCommitCallbackRegistrar.add( "WebContent.Back", boost::bind( &LLFloaterWebContent::onClickBack, this ));  	mCommitCallbackRegistrar.add( "WebContent.Forward", boost::bind( &LLFloaterWebContent::onClickForward, this )); @@ -315,9 +314,6 @@ void LLFloaterWebContent::draw()  	mBtnBack->setEnabled( mWebBrowser->canNavigateBack() && mAllowNavigation);  	mBtnForward->setEnabled( mWebBrowser->canNavigateForward() && mAllowNavigation); -    // Show/hide the lock icon -    mSecureLockIcon->setVisible(mSecureURL && !mAddressCombo->hasFocus()); -  	LLFloater::draw();  } @@ -362,8 +358,6 @@ void LLFloaterWebContent::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent  		// we populate the status bar with URLs as they change so clear it now we're done  		const std::string end_str = "";  		mStatusBarText->setText( end_str ); -			mAddressCombo->setLeftTextPadding(22); -			mAddressCombo->setLeftTextPadding(2);  	}  	else if(event == MEDIA_EVENT_CLOSE_REQUEST)  	{ @@ -430,10 +424,10 @@ void LLFloaterWebContent::set_current_url(const std::string& url)  		static const std::string secure_prefix = std::string("https://");  		std::string prefix = mCurrentURL.substr(0, secure_prefix.length());  		LLStringUtil::toLower(prefix); -        mSecureURL = (prefix == secure_prefix); -         -        // Hack : we move the text a bit to make space for the lock icon in the secure URL case -		mDisplayURL = (mSecureURL ? "      " + mCurrentURL : mCurrentURL); +        bool secure_url = (prefix == secure_prefix); +		mSecureLockIcon->setVisible(secure_url); +		mAddressCombo->setLeftTextPadding(secure_url ? 22 : 2); +		mDisplayURL = mCurrentURL;          // Clean up browsing list (prevent dupes) and add/select the new URL to it          mAddressCombo->remove(mCurrentURL); diff --git a/indra/newview/llfloaterwebcontent.h b/indra/newview/llfloaterwebcontent.h index f22940cd07..2206784e37 100755 --- a/indra/newview/llfloaterwebcontent.h +++ b/indra/newview/llfloaterwebcontent.h @@ -112,7 +112,6 @@ protected:  	std::string		mUUID;  	bool			mShowPageTitle;      bool            mAllowNavigation; -    bool            mSecureURL;     // true when the current url is prefixed "https://"  };  #endif  // LL_LLFLOATERWEBCONTENT_H diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h index 9dcfdfa185..8772185ad0 100755 --- a/indra/newview/llfolderviewmodelinventory.h +++ b/indra/newview/llfolderviewmodelinventory.h @@ -105,6 +105,10 @@ class LLFolderViewModelInventory  public:  	typedef LLFolderViewModel<LLInventorySort,   LLFolderViewModelItemInventory, LLFolderViewModelItemInventory,   LLInventoryFilter> base_t; +	LLFolderViewModelInventory(const std::string& name) +	:	base_t(new LLInventorySort(), new LLInventoryFilter(LLInventoryFilter::Params().name(name))) +	{} +  	void setTaskID(const LLUUID& id) {mTaskID = id;}  	void sort(LLFolderViewFolder* folder); diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index b56c34573d..2ae13b1b2f 100755 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -1339,6 +1339,7 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)  {  	S32 in_len = in_str.length(); +	//return whole trigger, if received text equals to it  	item_map_t::iterator it;  	for (it = mActive.begin(); it != mActive.end(); ++it)  	{ @@ -1346,7 +1347,24 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)  		if (gesture)  		{  			const std::string& trigger = gesture->getTrigger(); -			 +			if (!LLStringUtil::compareInsensitive(in_str, trigger)) +			{ +				*out_str = trigger; +				return TRUE; +			} +		} +	} + +	//return common chars, if more than one trigger matches the prefix +	std::string rest_of_match = ""; +	std::string buf = ""; +	for (it = mActive.begin(); it != mActive.end(); ++it) +	{ +		LLMultiGesture* gesture = (*it).second; +		if (gesture) +		{ +			const std::string& trigger = gesture->getTrigger(); +  			if (in_len > (S32)trigger.length())  			{  				// too short, bail out @@ -1357,11 +1375,49 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)  			LLStringUtil::truncate(trigger_trunc, in_len);  			if (!LLStringUtil::compareInsensitive(in_str, trigger_trunc))  			{ -				*out_str = trigger; -				return TRUE; +				if (rest_of_match.compare("") == 0) +				{ +					rest_of_match = trigger.substr(in_str.size()); +				} +				std::string cur_rest_of_match = trigger.substr(in_str.size()); +				buf = ""; +				S32 i=0; + +				while (i<rest_of_match.length() && i<cur_rest_of_match.length()) +				{ +					if (rest_of_match[i]==cur_rest_of_match[i]) +				    { +						buf.push_back(rest_of_match[i]); +				    } +				    else +				    { +				    	if(i==0) +				    	{ +				    		rest_of_match = ""; +				    	} +				    	break; +				    } +					i++; +				} +				if (rest_of_match.compare("") == 0) +				{ +					return FALSE; +				} +				if (buf.compare("") != 0) +				{ +					rest_of_match = buf; +				} +  			}  		}  	} + +	if (rest_of_match.compare("") != 0) +	{ +		*out_str = in_str+rest_of_match; +		return TRUE; +	} +  	return FALSE;  } diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp index 72bea8db10..0dd84b6073 100755 --- a/indra/newview/llgiveinventory.cpp +++ b/indra/newview/llgiveinventory.cpp @@ -139,7 +139,7 @@ bool LLGiveInventory::isInventoryGiveAcceptable(const LLInventoryItem* item)  			BOOL copyable = false;  			if (item->getPermissions().allowCopyBy(gAgentID)) copyable = true; -			if (!copyable && get_is_item_worn(item->getUUID())) +			if (!copyable || get_is_item_worn(item->getUUID()))  			{  				acceptable = false;  			} diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index c4c1827266..cf550e5eff 100755 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -624,7 +624,8 @@ void LLViewerParcelMgr::renderCollisionSegments(U8* segments, BOOL use_pass, LLV  	LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);  	LLGLDisable cull(GL_CULL_FACE); -	if (mCollisionBanned == BA_BANNED) +	if (mCollisionBanned == BA_BANNED || +		regionp->getRegionFlag(REGION_FLAGS_BLOCK_FLYOVER))  	{  		collision_height = BAN_HEIGHT;  	} diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 7ea08539f9..9c0b486cc5 100755 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -609,6 +609,11 @@ void LLGroupMgrGroupData::recalcAgentPowers(const LLUUID& agent_id)  	}  } +bool LLGroupMgrGroupData::isSingleMemberNotOwner() +{ +	return mMembers.size() == 1 && !mMembers.begin()->second->isOwner(); +} +  bool packRoleUpdateMessageBlock(LLMessageSystem* msg,   								const LLUUID& group_id,  								const LLUUID& role_id,  diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h index d8c1ab7ef5..1750551395 100755 --- a/indra/newview/llgroupmgr.h +++ b/indra/newview/llgroupmgr.h @@ -232,6 +232,8 @@ public:  	BOOL isRoleDataComplete() { return mRoleDataComplete; }  	BOOL isRoleMemberDataComplete() { return mRoleMemberDataComplete; }  	BOOL isGroupPropertiesDataComplete() { return mGroupPropertiesDataComplete; } +	 +	bool isSingleMemberNotOwner();  	F32 getAccessTime() const { return mAccessTime; }  	void setAccessed(); diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 44943d8722..101b16b027 100755 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -4708,6 +4708,10 @@ public:  	virtual void changed(U32 mask)  	{  		mBridgep->refreshFolderViewItem(); +		if (mask & LLFriendObserver::ONLINE) +		{ +			mBridgep->checkSearchBySuffixChanges(); +		}  	}  protected:  	LLCallingCardBridge* mBridgep; @@ -4742,6 +4746,44 @@ void LLCallingCardBridge::refreshFolderViewItem()  	}  } +void LLCallingCardBridge::checkSearchBySuffixChanges() +{ +	if (!mDisplayName.empty()) +	{ +		// changes in mDisplayName are processed by rename function and here it will be always same +		// suffixes are also of fixed length, and we are processing change of one at a time, +		// so it should be safe to use length (note: mSearchableName is capitalized) +		S32 old_length = mSearchableName.length(); +		S32 new_length = mDisplayName.length() + getLabelSuffix().length(); +		if (old_length == new_length) +		{ +			return; +		} +		mSearchableName.assign(mDisplayName); +		mSearchableName.append(getLabelSuffix()); +		LLStringUtil::toUpper(mSearchableName); +		if (new_length<old_length) +		{ +			LLInventoryFilter* filter = getInventoryFilter(); +			if (filter && mPassedFilter && mSearchableName.find(filter->getFilterSubString()) == std::string::npos) +			{ +				// string no longer contains substring  +				// we either have to update all parents manually or restart filter. +				// dirtyFilter will not work here due to obsolete descendants' generations  +				getInventoryFilter()->setModified(LLFolderViewFilter::FILTER_MORE_RESTRICTIVE); +			} +		} +		else +		{ +			if (getInventoryFilter()) +			{ +				// mSearchableName became longer, we gained additional suffix and need to repeat filter check. +				dirtyFilter(); +			} +		} +	} +} +  // virtual  void LLCallingCardBridge::performAction(LLInventoryModel* model, std::string action)  { diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index bc875e8f37..b29235260b 100755 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -419,6 +419,7 @@ public:  							void* cargo_data,  							std::string& tooltip_msg);  	void refreshFolderViewItem(); +	void checkSearchBySuffixChanges();  protected:  	LLCallingCardObserver* mObserver;  }; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index e5b9e11d48..ed217718c1 100755 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -146,7 +146,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :  	mShowItemLinkOverlays(p.show_item_link_overlays),  	mShowEmptyMessage(p.show_empty_message),  	mViewsInitialized(false), -	mInvFVBridgeBuilder(NULL) +	mInvFVBridgeBuilder(NULL), +	mInventoryViewModel(p.name)  {  	mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER; @@ -528,6 +529,14 @@ void LLInventoryPanel::modelChanged(U32 mask)  							// Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.  							view_item->addToFolder(new_parent);  							addItemID(viewmodel_item->getUUID(), view_item); +							if (mInventory) +							{ +								const LLUUID trash_id = mInventory->findCategoryUUIDForType(LLFolderType::FT_TRASH); +								if (trash_id != model_item->getParentUUID() && (mask & LLInventoryObserver::INTERNAL) && new_parent->isOpen()) +								{ +									setSelection(item_id, FALSE); +								} +							}  						}  						else   						{ diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 90b169ecd3..d0ecf80706 100755 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -206,7 +206,11 @@ private:  };  LLLogChat::save_history_signal_t * LLLogChat::sSaveHistorySignal = NULL; -LLLoadHistoryThread::load_end_signal_t * LLLoadHistoryThread::mLoadEndSignal = NULL; + +std::map<LLUUID,LLLoadHistoryThread *> LLLogChat::sLoadHistoryThreads; +std::map<LLUUID,LLDeleteHistoryThread *> LLLogChat::sDeleteHistoryThreads; +LLMutex* LLLogChat::sHistoryThreadsMutex = NULL; +  //static  std::string LLLogChat::makeLogFileName(std::string filename) @@ -337,83 +341,179 @@ void LLLogChat::saveHistory(const std::string& filename,  void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params)  {  	if (file_name.empty()) -				{ -					LL_WARNS("LLLogChat::loadChatHistory") << "Session name is Empty!" << LL_ENDL; -					return ; -				} +	{ +		LL_WARNS("LLLogChat::loadChatHistory") << "Session name is Empty!" << LL_ENDL; +		return ; +	} -				bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false; +	bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false; -				LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/ -				if (!fptr) -				{ -					fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/ -					if (!fptr) -					{ -						return;						//No previous conversation with this name. -					} -				} +	LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/ +	if (!fptr) +	{ +		fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/ +		if (!fptr) +		{ +			return;						//No previous conversation with this name. +		} +	} -				char buffer[LOG_RECALL_SIZE];		/*Flawfinder: ignore*/ -				char *bptr; -				S32 len; -				bool firstline = TRUE; - -				if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1  , SEEK_END)) -				{	//We need to load the whole historyFile or it's smaller than recall size, so get it all. -					firstline = FALSE; -					if (fseek(fptr, 0, SEEK_SET)) -					{ -						fclose(fptr); -						return; -					} -				} -			while (fgets(buffer, LOG_RECALL_SIZE, fptr)  && !feof(fptr)) -				{ -					len = strlen(buffer) - 1;		/*Flawfinder: ignore*/ -					for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--)	*bptr='\0'; - -					if (firstline) -					{ -						firstline = FALSE; -						continue; -					} - -					std::string line(buffer); - -					//updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message -					if (' ' == line[0]) -					{ -						line.erase(0, MULTI_LINE_PREFIX.length()); -						append_to_last_message(messages, '\n' + line); -					} -					else if (0 == len && ('\n' == line[0] || '\r' == line[0])) -					{ -						//to support old format's multilined messages with new lines used to divide paragraphs -						append_to_last_message(messages, line); -					} -					else -					{ -						LLSD item; -						if (!LLChatLogParser::parse(line, item, load_params)) -						{ -							item[LL_IM_TEXT] = line; -						} -						messages.push_back(item); -					} -				} -				fclose(fptr); +	char buffer[LOG_RECALL_SIZE];		/*Flawfinder: ignore*/ +	char *bptr; +	S32 len; +	bool firstline = TRUE; + +	if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1  , SEEK_END)) +	{	//We need to load the whole historyFile or it's smaller than recall size, so get it all. +		firstline = FALSE; +		if (fseek(fptr, 0, SEEK_SET)) +		{ +			fclose(fptr); +			return; +		} +	} +	while (fgets(buffer, LOG_RECALL_SIZE, fptr)  && !feof(fptr)) +	{ +		len = strlen(buffer) - 1;		/*Flawfinder: ignore*/ +		for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--)	*bptr='\0'; + +		if (firstline) +		{ +			firstline = FALSE; +			continue; +		} +		std::string line(buffer); +		//updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message +		if (' ' == line[0]) +		{ +			line.erase(0, MULTI_LINE_PREFIX.length()); +			append_to_last_message(messages, '\n' + line); +		} +		else if (0 == len && ('\n' == line[0] || '\r' == line[0])) +		{ +			//to support old format's multilined messages with new lines used to divide paragraphs +			append_to_last_message(messages, line); +		} +		else +		{ +			LLSD item; +			if (!LLChatLogParser::parse(line, item, load_params)) +			{ +				item[LL_IM_TEXT] = line; +			} +			messages.push_back(item); +		} +	} +	fclose(fptr);  } -void LLLogChat::startChatHistoryThread(const std::string& file_name, const LLSD& load_params) +// static +bool LLLogChat::historyThreadsFinished(LLUUID session_id)  { +	LLMutexLock lock(historyThreadsMutex()); +	bool finished = true; +	std::map<LLUUID,LLLoadHistoryThread *>::iterator it = sLoadHistoryThreads.find(session_id); +	if (it != sLoadHistoryThreads.end()) +	{ +		finished = it->second->isFinished(); +	} +	if (!finished) +	{ +		return false; +	} +	std::map<LLUUID,LLDeleteHistoryThread *>::iterator dit = sDeleteHistoryThreads.find(session_id); +	if (dit != sDeleteHistoryThreads.end()) +	{ +		finished = finished && dit->second->isFinished(); +	} +	return finished; +} -	LLLoadHistoryThread* mThread = new LLLoadHistoryThread(); -	mThread->start(); -	mThread->setHistoryParams(file_name, load_params); +// static +LLLoadHistoryThread* LLLogChat::getLoadHistoryThread(LLUUID session_id) +{ +	LLMutexLock lock(historyThreadsMutex()); +	std::map<LLUUID,LLLoadHistoryThread *>::iterator it = sLoadHistoryThreads.find(session_id); +	if (it != sLoadHistoryThreads.end()) +	{ +		return it->second; +	} +	return NULL; +} + +// static +LLDeleteHistoryThread* LLLogChat::getDeleteHistoryThread(LLUUID session_id) +{ +	LLMutexLock lock(historyThreadsMutex()); +	std::map<LLUUID,LLDeleteHistoryThread *>::iterator it = sDeleteHistoryThreads.find(session_id); +	if (it != sDeleteHistoryThreads.end()) +	{ +		return it->second; +	} +	return NULL; +} + +// static +bool LLLogChat::addLoadHistoryThread(LLUUID& session_id, LLLoadHistoryThread* lthread) +{ +	LLMutexLock lock(historyThreadsMutex()); +	std::map<LLUUID,LLLoadHistoryThread *>::const_iterator it = sLoadHistoryThreads.find(session_id); +	if (it != sLoadHistoryThreads.end()) +	{ +		return false; +	} +	sLoadHistoryThreads[session_id] = lthread; +	return true;  } + +// static +bool LLLogChat::addDeleteHistoryThread(LLUUID& session_id, LLDeleteHistoryThread* dthread) +{ +	LLMutexLock lock(historyThreadsMutex()); +	std::map<LLUUID,LLDeleteHistoryThread *>::const_iterator it = sDeleteHistoryThreads.find(session_id); +	if (it != sDeleteHistoryThreads.end()) +	{ +		return false; +	} +	sDeleteHistoryThreads[session_id] = dthread; +	return true; +} + +// static +void LLLogChat::cleanupHistoryThreads() +{ +	LLMutexLock lock(historyThreadsMutex()); +	std::vector<LLUUID> uuids; +	std::map<LLUUID,LLLoadHistoryThread *>::iterator lit = sLoadHistoryThreads.begin(); +	for (; lit != sLoadHistoryThreads.end(); lit++) +	{ +		if (lit->second->isFinished() && sDeleteHistoryThreads[lit->first]->isFinished()) +		{ +			delete lit->second; +			delete sDeleteHistoryThreads[lit->first]; +			uuids.push_back(lit->first); +		} +	} +	std::vector<LLUUID>::iterator uuid_it = uuids.begin(); +	for ( ;uuid_it != uuids.end(); uuid_it++) +	{ +		sLoadHistoryThreads.erase(*uuid_it); +		sDeleteHistoryThreads.erase(*uuid_it); +	} +} + +//static +LLMutex* LLLogChat::historyThreadsMutex() +{ +	if (sHistoryThreadsMutex == NULL) +	{ +		sHistoryThreadsMutex = new LLMutex(NULL); +	} +	return sHistoryThreadsMutex; +} +  // static  std::string LLLogChat::oldLogFileName(std::string filename)  { @@ -475,7 +575,7 @@ void LLLogChat::findTranscriptFiles(std::string pattern, std::vector<std::string  				//Add Nearby chat history to the list of transcriptions  				list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename));  				LLFile::close(filep); -				return; +				continue;  			}  			char buffer[LOG_RECALL_SIZE]; @@ -845,115 +945,188 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params  	return true;  //parsed name and message text, maybe have a timestamp too  } +LLDeleteHistoryThread::LLDeleteHistoryThread(std::list<LLSD>* messages, LLLoadHistoryThread* loadThread) +	: LLActionThread("delete chat history"), +	mMessages(messages), +	mLoadThread(loadThread) +{ +} +LLDeleteHistoryThread::~LLDeleteHistoryThread() +{ +} -	LLLoadHistoryThread::LLLoadHistoryThread() : LLThread("load chat history") - 	{ -		mNewLoad = false; +void LLDeleteHistoryThread::run() +{ +	if (mLoadThread != NULL) +	{ +		mLoadThread->waitFinished();  	} - -	void LLLoadHistoryThread::run() +	if (NULL != mMessages)  	{ -		while (!LLApp::isQuitting()) -			{ -			    if(mNewLoad) -				{ -					loadHistory(mFileName,mMessages,mLoadParams); -					shutdown(); -				} -			} +		delete mMessages;  	} -	void LLLoadHistoryThread::setHistoryParams(const std::string& file_name, const LLSD& load_params) +	mMessages = NULL; +	setFinished(); +} + +LLActionThread::LLActionThread(const std::string& name) +	: LLThread(name), +	mMutex(NULL), +	mRunCondition(NULL), +	mFinished(false) +{ +} + +LLActionThread::~LLActionThread() +{ +} + +void LLActionThread::waitFinished() +{ +	mMutex.lock(); +	if (!mFinished)  	{ -		mFileName = file_name; -		mLoadParams = load_params; -		mNewLoad = true; +		mMutex.unlock(); +		mRunCondition.wait();  	} -	void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params) +	else  	{ +		mMutex.unlock();	 +	} +} -		if (file_name.empty()) -			{ -			LL_WARNS("LLLogChat::loadHistory") << "Session name is Empty!" << LL_ENDL; -				return ; -			} +void LLActionThread::setFinished() +{ +	mMutex.lock(); +	mFinished = true; +	mMutex.unlock(); +	mRunCondition.signal(); +} -			bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false; +LLLoadHistoryThread::LLLoadHistoryThread(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params) +	: LLActionThread("load chat history"), +	mMessages(messages), +	mFileName(file_name), +	mLoadParams(load_params), +	mNewLoad(true), +	mLoadEndSignal(NULL) +{ +} -			LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/ -			if (!fptr) -			{ -				fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/ -				if (!fptr) -				{ -					mNewLoad = false; -					(*mLoadEndSignal)(messages, file_name); -					return;						//No previous conversation with this name. -				} -			} +LLLoadHistoryThread::~LLLoadHistoryThread() +{ +} -			char buffer[LOG_RECALL_SIZE];		/*Flawfinder: ignore*/ -			char *bptr; -			S32 len; -			bool firstline = TRUE; +void LLLoadHistoryThread::run() +{ +	if(mNewLoad) +	{ +		loadHistory(mFileName, mMessages, mLoadParams); +		int count = mMessages->size(); +		llinfos << "mMessages->size(): " << count << llendl; +		setFinished(); +	} +} -			if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1  , SEEK_END)) -			{	//We need to load the whole historyFile or it's smaller than recall size, so get it all. -				firstline = FALSE; -				if (fseek(fptr, 0, SEEK_SET)) -				{ -					fclose(fptr); -					mNewLoad = false; -					(*mLoadEndSignal)(messages, file_name); -					return; -				} -			} -		while (fgets(buffer, LOG_RECALL_SIZE, fptr)  && !feof(fptr)) -			{ -				len = strlen(buffer) - 1;		/*Flawfinder: ignore*/ -				for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--)	*bptr='\0'; +void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params) +{ +	if (file_name.empty()) +	{ +		LL_WARNS("LLLogChat::loadHistory") << "Session name is Empty!" << LL_ENDL; +		return ; +	} -				if (firstline) -				{ -					firstline = FALSE; -					continue; -				} +	bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false; +	LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/ -				std::string line(buffer); +	if (!fptr) +	{ +		fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/ +		if (!fptr) +		{ +			mNewLoad = false; +			(*mLoadEndSignal)(messages, file_name); +			return;						//No previous conversation with this name. +		} +	} -				//updated 1.23 plaint text log format requires a space added before subsequent lines in a multilined message -				if (' ' == line[0]) -				{ -					line.erase(0, MULTI_LINE_PREFIX.length()); -					append_to_last_message(messages, '\n' + line); -				} -				else if (0 == len && ('\n' == line[0] || '\r' == line[0])) -				{ -					//to support old format's multilined messages with new lines used to divide paragraphs -					append_to_last_message(messages, line); -				} -				else -				{ -					LLSD item; -					if (!LLChatLogParser::parse(line, item, load_params)) -					{ -						item[LL_IM_TEXT] = line; -					} -					messages.push_back(item); -				} -			} +	char buffer[LOG_RECALL_SIZE];		/*Flawfinder: ignore*/ + +	char *bptr; +	S32 len; +	bool firstline = TRUE; + +	if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1  , SEEK_END)) +	{	//We need to load the whole historyFile or it's smaller than recall size, so get it all. +		firstline = FALSE; +		if (fseek(fptr, 0, SEEK_SET)) +		{  			fclose(fptr);  			mNewLoad = false;  			(*mLoadEndSignal)(messages, file_name); +			return; +		}  	} -	//static -	boost::signals2::connection LLLoadHistoryThread::setLoadEndSignal(const load_end_signal_t::slot_type& cb) + +	while (fgets(buffer, LOG_RECALL_SIZE, fptr)  && !feof(fptr))  	{ -		if (NULL == mLoadEndSignal) +		len = strlen(buffer) - 1;		/*Flawfinder: ignore*/ + +		for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--)	*bptr='\0'; + + +		if (firstline)  		{ -			mLoadEndSignal = new load_end_signal_t(); +			firstline = FALSE; +			continue;  		} +		std::string line(buffer); -		return mLoadEndSignal->connect(cb); +		//updated 1.23 plaint text log format requires a space added before subsequent lines in a multilined message +		if (' ' == line[0]) +		{ +			line.erase(0, MULTI_LINE_PREFIX.length()); +			append_to_last_message(*messages, '\n' + line); +		} +		else if (0 == len && ('\n' == line[0] || '\r' == line[0])) +		{ +			//to support old format's multilined messages with new lines used to divide paragraphs +			append_to_last_message(*messages, line); +		} +		else +		{ +			LLSD item; +			if (!LLChatLogParser::parse(line, item, load_params)) +			{ +				item[LL_IM_TEXT] = line; +			} +			messages->push_back(item); +		}  	} + +	fclose(fptr); +	mNewLoad = false; +	(*mLoadEndSignal)(messages, file_name); +} +	 +boost::signals2::connection LLLoadHistoryThread::setLoadEndSignal(const load_end_signal_t::slot_type& cb) +{ +	if (NULL == mLoadEndSignal) +	{ +		mLoadEndSignal = new load_end_signal_t(); +	} + +	return mLoadEndSignal->connect(cb); +} + +void LLLoadHistoryThread::removeLoadEndSignal(const load_end_signal_t::slot_type& cb) +{ +	if (NULL != mLoadEndSignal) +	{ +		mLoadEndSignal->disconnect_all_slots(); +		delete mLoadEndSignal; +	} +	mLoadEndSignal = NULL; +} diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h index acee99afa2..81f75ef626 100755 --- a/indra/newview/lllogchat.h +++ b/indra/newview/lllogchat.h @@ -28,23 +28,54 @@  #define LL_LLLOGCHAT_H  class LLChat; -class LLLoadHistoryThread : public LLThread + +class LLActionThread : public LLThread  { +public: +	LLActionThread(const std::string& name); +	~LLActionThread(); + +	void waitFinished(); +	bool isFinished() { return mFinished; } +protected: +	void setFinished();  private: -	std::string mFileName; -	std::list<LLSD> mMessages; +	bool mFinished; +	LLMutex	mMutex; +	LLCondition mRunCondition; +}; + +class LLLoadHistoryThread : public LLActionThread +{ +private: +	const std::string& mFileName; +	std::list<LLSD>* mMessages;  	LLSD mLoadParams;  	bool mNewLoad;  public: -	LLLoadHistoryThread(); - -	void setHistoryParams(const std::string& file_name, const LLSD& load_params); -	virtual void loadHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params); +	LLLoadHistoryThread(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params); +	~LLLoadHistoryThread(); +	//void setHistoryParams(const std::string& file_name, const LLSD& load_params); +	virtual void loadHistory(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params);      virtual void run(); -   typedef boost::signals2::signal<void (std::list<LLSD>& messages,const std::string& file_name)> load_end_signal_t; -   static load_end_signal_t * mLoadEndSignal; -   static boost::signals2::connection setLoadEndSignal(const load_end_signal_t::slot_type& cb); +	typedef boost::signals2::signal<void (std::list<LLSD>* messages,const std::string& file_name)> load_end_signal_t; +	load_end_signal_t * mLoadEndSignal; +	boost::signals2::connection setLoadEndSignal(const load_end_signal_t::slot_type& cb); +	void removeLoadEndSignal(const load_end_signal_t::slot_type& cb); +}; + +class LLDeleteHistoryThread : public LLActionThread +{ +private: +	std::list<LLSD>* mMessages; +	LLLoadHistoryThread* mLoadThread; +public: +	LLDeleteHistoryThread(std::list<LLSD>* messages, LLLoadHistoryThread* loadThread); +	~LLDeleteHistoryThread(); + +	virtual void run(); +	static void deleteHistory();  };  class LLLogChat @@ -73,7 +104,6 @@ public:  	static void getListOfTranscriptBackupFiles(std::vector<std::string>& list_of_transcriptions);  	static void loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params = LLSD()); -	static void startChatHistoryThread(const std::string& file_name, const LLSD& load_params);  	typedef boost::signals2::signal<void ()> save_history_signal_t;  	static boost::signals2::connection setSaveHistorySignal(const save_history_signal_t::slot_type& cb); @@ -90,9 +120,21 @@ public:  	static bool isTranscriptExist(const LLUUID& avatar_id, bool is_group=false);  	static bool isNearbyTranscriptExist(); +	static bool historyThreadsFinished(LLUUID session_id); +	static LLLoadHistoryThread* getLoadHistoryThread(LLUUID session_id); +	static LLDeleteHistoryThread* getDeleteHistoryThread(LLUUID session_id); +	static bool addLoadHistoryThread(LLUUID& session_id, LLLoadHistoryThread* lthread); +	static bool addDeleteHistoryThread(LLUUID& session_id, LLDeleteHistoryThread* dthread); +	static void cleanupHistoryThreads(); +  private:  	static std::string cleanFileName(std::string filename);  	static save_history_signal_t * sSaveHistorySignal; + +	static std::map<LLUUID,LLLoadHistoryThread *> sLoadHistoryThreads; +	static std::map<LLUUID,LLDeleteHistoryThread *> sDeleteHistoryThreads; +	static LLMutex* sHistoryThreadsMutex; +	static LLMutex* historyThreadsMutex();  };  /** diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index ae0884ac5d..cca8b905f3 100755 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -66,9 +66,8 @@ const F32 SNAP_GUIDE_SCREEN_OFFSET = 0.05f;  const F32 SNAP_GUIDE_SCREEN_LENGTH = 0.7f;  const F32 SELECTED_MANIPULATOR_SCALE = 1.2f;  const F32 MANIPULATOR_SCALE_HALF_LIFE = 0.07f; -const S32 NUM_MANIPULATORS = 14; -const LLManip::EManipPart MANIPULATOR_IDS[NUM_MANIPULATORS] =  +const LLManip::EManipPart MANIPULATOR_IDS[LLManipScale::NUM_MANIPULATORS] =   {  	LLManip::LL_CORNER_NNN,  	LLManip::LL_CORNER_NNP, @@ -143,18 +142,16 @@ inline void LLManipScale::conditionalHighlight( U32 part, const LLColor4* highli  	LLColor4 default_highlight( 1.f, 1.f, 1.f, 1.f );  	LLColor4 default_normal( 0.7f, 0.7f, 0.7f, 0.6f );  	LLColor4 invisible(0.f, 0.f, 0.f, 0.f); -	F32 manipulator_scale = 1.f;  	for (S32 i = 0; i < NUM_MANIPULATORS; i++)  	{  		if((U32)MANIPULATOR_IDS[i] == part)  		{ -			manipulator_scale = mManipulatorScales[i]; +			mScaledBoxHandleSize = mManipulatorScales[i] * mBoxHandleSize[i];  			break;  		}  	} -	mScaledBoxHandleSize = mBoxHandleSize * manipulator_scale;  	if (mManipPart != (S32)LL_NO_PART && mManipPart != (S32)part)  	{  		gGL.color4fv( invisible.mV ); @@ -181,7 +178,6 @@ void LLManipScale::handleSelect()  LLManipScale::LLManipScale( LLToolComposite* composite )  	:   	LLManip( std::string("Scale"), composite ), -	mBoxHandleSize( 1.f ),  	mScaledBoxHandleSize( 1.f ),  	mLastMouseX( -1 ),  	mLastMouseY( -1 ), @@ -190,21 +186,22 @@ LLManipScale::LLManipScale( LLToolComposite* composite )  	mScaleSnapUnit1(1.f),  	mScaleSnapUnit2(1.f),  	mSnapRegimeOffset(0.f), +	mTickPixelSpacing1(0.f), +	mTickPixelSpacing2(0.f),  	mSnapGuideLength(0.f),  	mInSnapRegime(FALSE), -	mScaleSnapValue(0.f) +	mScaleSnappedValue(0.f)  {  -	mManipulatorScales = new F32[NUM_MANIPULATORS];  	for (S32 i = 0; i < NUM_MANIPULATORS; i++)  	{  		mManipulatorScales[i] = 1.f; +		mBoxHandleSize[i]     = 1.f;  	}  }  LLManipScale::~LLManipScale()  {  	for_each(mProjectedManipulators.begin(), mProjectedManipulators.end(), DeletePointer()); -	delete[] mManipulatorScales;  }  void LLManipScale::render() @@ -214,6 +211,7 @@ void LLManipScale::render()  	LLGLDepthTest gls_depth(GL_TRUE);  	LLGLEnable gl_blend(GL_BLEND);  	LLGLEnable gls_alpha_test(GL_ALPHA_TEST); +	LLBBox bbox = LLSelectMgr::getInstance()->getBBoxOfSelection();  	if( canAffectSelection() )  	{ @@ -235,42 +233,48 @@ void LLManipScale::render()  		if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)  		{ -			mBoxHandleSize = BOX_HANDLE_BASE_SIZE * BOX_HANDLE_BASE_FACTOR / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels(); -			mBoxHandleSize /= gAgentCamera.mHUDCurZoom; +			for (S32 i = 0; i < NUM_MANIPULATORS; i++) +			{ +				mBoxHandleSize[i] = BOX_HANDLE_BASE_SIZE * BOX_HANDLE_BASE_FACTOR / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels(); +				mBoxHandleSize[i] /= gAgentCamera.mHUDCurZoom; +			}  		}  		else  		{ -			F32 range_squared = dist_vec_squared(gAgentCamera.getCameraPositionAgent(), center_agent); -			F32 range_from_agent_squared = dist_vec_squared(gAgent.getPositionAgent(), center_agent); - -			// Don't draw manip if object too far away -			if (gSavedSettings.getBOOL("LimitSelectDistance")) +			for (S32 i = 0; i < NUM_MANIPULATORS; i++)  			{ -				F32 max_select_distance = gSavedSettings.getF32("MaxSelectDistance"); -				if (range_from_agent_squared > max_select_distance * max_select_distance) +				LLVector3 manipulator_pos = bbox.localToAgent(unitVectorToLocalBBoxExtent(partToUnitVector(MANIPULATOR_IDS[i]), bbox)); +				F32 range_squared = dist_vec_squared(gAgentCamera.getCameraPositionAgent(), manipulator_pos); +				F32 range_from_agent_squared = dist_vec_squared(gAgent.getPositionAgent(), manipulator_pos); + +				// Don't draw manip if object too far away +				if (gSavedSettings.getBOOL("LimitSelectDistance"))  				{ -					return; +					F32 max_select_distance = gSavedSettings.getF32("MaxSelectDistance"); +					if (range_from_agent_squared > max_select_distance * max_select_distance) +					{ +						return; +					}  				} -			} -			if (range_squared > 0.001f * 0.001f) -			{ -				// range != zero -				F32 fraction_of_fov = BOX_HANDLE_BASE_SIZE / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels(); -				F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView();  // radians -				mBoxHandleSize = (F32) sqrtf(range_squared) * tan(apparent_angle) * BOX_HANDLE_BASE_FACTOR; -			} -			else -			{ -				// range == zero -				mBoxHandleSize = BOX_HANDLE_BASE_FACTOR; +				if (range_squared > 0.001f * 0.001f) +				{ +					// range != zero +					F32 fraction_of_fov = BOX_HANDLE_BASE_SIZE / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels(); +					F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView();  // radians +					mBoxHandleSize[i] = (F32) sqrtf(range_squared) * tan(apparent_angle) * BOX_HANDLE_BASE_FACTOR; +				} +				else +				{ +					// range == zero +					mBoxHandleSize[i] = BOX_HANDLE_BASE_FACTOR; +				}  			}  		}  		////////////////////////////////////////////////////////////////////////  		// Draw bounding box -		LLBBox bbox = LLSelectMgr::getInstance()->getBBoxOfSelection();  		LLVector3 pos_agent = bbox.getPositionAgent();  		LLQuaternion rot = bbox.getRotation(); @@ -556,29 +560,29 @@ void LLManipScale::renderFaces( const LLBBox& bbox )  		return;  	} -    // This is a flattened representation of the box as render here -    //                                       . -    //              (+++)        (++-)      /|\t -    //                +------------+         | (texture coordinates) -    //                |            |         | -    //                |     1      |        (*) --->s -    //                |    +X      |    +	// This is a flattened representation of the box as render here +	//                                       . +	//              (+++)        (++-)      /|\t +	//                +------------+         | (texture coordinates) +	//                |            |         | +	//                |     1      |        (*) --->s +	//                |    +X      |     	//                |            | -    // (+++)     (+-+)|            |(+--)     (++-)        (+++) -    //   +------------+------------+------------+------------+ -    //   |0          3|3          7|7          4|4          0| -    //   |     0      |     4      |     5      |     2	     | -    //   |    +Z      |    -Y      |    -Z      |    +Y      | -    //   |	          |            |            |            | -    //   |1          2|2          6|6          5|5          1| -    //   +------------+------------+------------+------------+ -    // (-++)     (--+)|            |(---)     (-+-)        (-++) -    //                |     3      | -    //                |    -X      | -    //                |            | -    //                |            | -    //                +------------+ -    //              (-++)        (-+-) +	// (+++)     (+-+)|            |(+--)     (++-)        (+++) +	//   +------------+------------+------------+------------+ +	//   |0          3|3          7|7          4|4          0| +	//   |     0      |     4      |     5      |     2	     | +	//   |    +Z      |    -Y      |    -Z      |    +Y      | +	//   |	          |            |            |            | +	//   |1          2|2          6|6          5|5          1| +	//   +------------+------------+------------+------------+ +	// (-++)     (--+)|            |(---)     (-+-)        (-++) +	//                |     3      | +	//                |    -X      | +	//                |            | +	//                |            | +	//                +------------+ +	//              (-++)        (-+-)  	LLColor4 highlight_color( 1.f, 1.f, 1.f, 0.5f);  	LLColor4 normal_color(	1.f, 1.f, 1.f, 0.3f); @@ -677,32 +681,32 @@ void LLManipScale::renderFaces( const LLBBox& bbox )  			{  			  case 0:  				conditionalHighlight( LL_FACE_POSZ, &z_highlight_color, &z_normal_color ); -				renderAxisHandle( ctr, LLVector3( ctr.mV[VX], ctr.mV[VY], max.mV[VZ] ) ); +				renderAxisHandle( LL_FACE_POSZ, ctr, LLVector3( ctr.mV[VX], ctr.mV[VY], max.mV[VZ] ) );  				break;  			  case 1:  				conditionalHighlight( LL_FACE_POSX, &x_highlight_color, &x_normal_color ); -				renderAxisHandle( ctr, LLVector3( max.mV[VX], ctr.mV[VY], ctr.mV[VZ] ) ); +				renderAxisHandle( LL_FACE_POSX, ctr, LLVector3( max.mV[VX], ctr.mV[VY], ctr.mV[VZ] ) );  				break;  			  case 2:  				conditionalHighlight( LL_FACE_POSY, &y_highlight_color, &y_normal_color ); -				renderAxisHandle( ctr, LLVector3( ctr.mV[VX], max.mV[VY], ctr.mV[VZ] ) ); +				renderAxisHandle( LL_FACE_POSY, ctr, LLVector3( ctr.mV[VX], max.mV[VY], ctr.mV[VZ] ) );  				break;  			  case 3:  				conditionalHighlight( LL_FACE_NEGX, &x_highlight_color, &x_normal_color ); -				renderAxisHandle( ctr, LLVector3( min.mV[VX], ctr.mV[VY], ctr.mV[VZ] ) ); +				renderAxisHandle( LL_FACE_NEGX, ctr, LLVector3( min.mV[VX], ctr.mV[VY], ctr.mV[VZ] ) );  				break;  			  case 4:  				conditionalHighlight( LL_FACE_NEGY, &y_highlight_color, &y_normal_color ); -				renderAxisHandle( ctr, LLVector3( ctr.mV[VX], min.mV[VY], ctr.mV[VZ] ) ); +				renderAxisHandle( LL_FACE_NEGY, ctr, LLVector3( ctr.mV[VX], min.mV[VY], ctr.mV[VZ] ) );  				break;  			  case 5:  				conditionalHighlight( LL_FACE_NEGZ, &z_highlight_color, &z_normal_color ); -				renderAxisHandle( ctr, LLVector3( ctr.mV[VX], ctr.mV[VY], min.mV[VZ] ) ); +				renderAxisHandle( LL_FACE_NEGZ, ctr, LLVector3( ctr.mV[VX], ctr.mV[VY], min.mV[VZ] ) );  				break;  			}  		} @@ -712,10 +716,10 @@ void LLManipScale::renderFaces( const LLBBox& bbox )  void LLManipScale::renderEdges( const LLBBox& bbox )  {  	LLVector3 extent = bbox.getExtentLocal(); -	F32 edge_width = mBoxHandleSize * .6f;  	for( U32 part = LL_EDGE_MIN; part <= LL_EDGE_MAX; part++ )  	{ +		F32 edge_width = mBoxHandleSize[part] * .6f;  		LLVector3 direction = edgeToUnitVector( part );  		LLVector3 center_to_edge = unitVectorToLocalBBoxExtent( direction, bbox ); @@ -776,14 +780,14 @@ void LLManipScale::renderBoxHandle( F32 x, F32 y, F32 z )  } -void LLManipScale::renderAxisHandle( const LLVector3& start, const LLVector3& end ) +void LLManipScale::renderAxisHandle( U32 part, const LLVector3& start, const LLVector3& end )  {  	if( getShowAxes() )  	{  		// Draws a single "jacks" style handle: a long, retangular box from start to end.  		LLVector3 offset_start = end - start;  		offset_start.normVec(); -		offset_start = start + mBoxHandleSize * offset_start; +		offset_start = start + mBoxHandleSize[part] * offset_start;  		LLVector3 delta = end - offset_start;  		LLVector3 pos = offset_start + 0.5f * delta; @@ -792,9 +796,9 @@ void LLManipScale::renderAxisHandle( const LLVector3& start, const LLVector3& en  		{  			gGL.translatef( pos.mV[VX], pos.mV[VY], pos.mV[VZ] );  			gGL.scalef(  -				mBoxHandleSize + llabs(delta.mV[VX]), -				mBoxHandleSize + llabs(delta.mV[VY]), -				mBoxHandleSize + llabs(delta.mV[VZ])); +				mBoxHandleSize[part] + llabs(delta.mV[VX]), +				mBoxHandleSize[part] + llabs(delta.mV[VY]), +				mBoxHandleSize[part] + llabs(delta.mV[VZ]));  			gBox.render();  		}  		gGL.popMatrix(); @@ -837,127 +841,90 @@ void LLManipScale::drag( S32 x, S32 y )  	}	  	LLSelectMgr::getInstance()->updateSelectionCenter(); -    gAgentCamera.clearFocusObject(); +	gAgentCamera.clearFocusObject();  }  // Scale around the   void LLManipScale::dragCorner( S32 x, S32 y )  { -	LLBBox bbox	= LLSelectMgr::getInstance()->getBBoxOfSelection(); -  	// Suppress scale if mouse hasn't moved.  	if (x == mLastMouseX && y == mLastMouseY)  	{ -	//	sendUpdates(TRUE,TRUE,TRUE);  		return;  	} -  	mLastMouseX = x;  	mLastMouseY = y; -	LLVector3d drag_start_point_global	= mDragStartPointGlobal; -	LLVector3d drag_start_center_global = mDragStartCenterGlobal; -	LLVector3 drag_start_point_agent = gAgent.getPosAgentFromGlobal(drag_start_point_global); -	LLVector3 drag_start_center_agent = gAgent.getPosAgentFromGlobal(drag_start_center_global); +	LLVector3 drag_start_point_agent = gAgent.getPosAgentFromGlobal(mDragStartPointGlobal); +	LLVector3 drag_start_center_agent = gAgent.getPosAgentFromGlobal(mDragStartCenterGlobal);  	LLVector3d drag_start_dir_d; -	drag_start_dir_d.setVec(drag_start_point_global - drag_start_center_global); -	LLVector3 drag_start_dir_f; -	drag_start_dir_f.setVec(drag_start_dir_d); +	drag_start_dir_d.setVec(mDragStartPointGlobal - mDragStartCenterGlobal);  	F32 s = 0;  	F32 t = 0; -  	nearestPointOnLineFromMouse(x, y,  -						drag_start_center_agent, -						drag_start_point_agent, -						s, t ); - -	F32 drag_start_dist = dist_vec(drag_start_point_agent, drag_start_center_agent); +								drag_start_center_agent, +								drag_start_point_agent, +								s, t );  	if( s <= 0 )  // we only care about intersections in front of the camera  	{  		return;  	} +	mDragPointGlobal = lerp(mDragStartCenterGlobal, mDragStartPointGlobal, t); -	LLVector3d drag_point_global = drag_start_center_global + t * drag_start_dir_d; - -	F32 scale_factor = t; - -	BOOL uniform = LLManipScale::getUniform(); - -	if( !uniform ) -	{ -		scale_factor = 0.5f + (scale_factor * 0.5f); -	} +	LLBBox bbox	     = LLSelectMgr::getInstance()->getBBoxOfSelection(); +	F32 scale_factor = 1.f; +	F32 max_scale    = partToMaxScale(mManipPart, bbox); +	F32 min_scale    = partToMinScale(mManipPart, bbox); +	BOOL uniform     = LLManipScale::getUniform();  	// check for snapping -	LLVector3 drag_center_agent = gAgent.getPosAgentFromGlobal(drag_point_global);  	LLVector3 mouse_on_plane1; -	getMousePointOnPlaneAgent(mouse_on_plane1, x, y, drag_center_agent, mScalePlaneNormal1); -	LLVector3 mouse_on_plane2; -	getMousePointOnPlaneAgent(mouse_on_plane2, x, y, drag_center_agent, mScalePlaneNormal2); -	LLVector3 mouse_dir_1 = mouse_on_plane1 - mScaleCenter; -	LLVector3 mouse_dir_2 = mouse_on_plane2 - mScaleCenter; -	LLVector3 mouse_to_scale_line_1 = mouse_dir_1 - projected_vec(mouse_dir_1, mScaleDir); -	LLVector3 mouse_to_scale_line_2 = mouse_dir_2 - projected_vec(mouse_dir_2, mScaleDir); -	LLVector3 mouse_to_scale_line_dir_1 = mouse_to_scale_line_1; -	mouse_to_scale_line_dir_1.normVec(); -	if (mouse_to_scale_line_dir_1 * mSnapGuideDir1 < 0.f) -	{ -		// need to keep sign of mouse offset wrt to snap guide direction -		mouse_to_scale_line_dir_1 *= -1.f; -	} -	LLVector3 mouse_to_scale_line_dir_2 = mouse_to_scale_line_2; -	mouse_to_scale_line_dir_2.normVec(); -	if (mouse_to_scale_line_dir_2 * mSnapGuideDir2 < 0.f) -	{ -		// need to keep sign of mouse offset wrt to snap guide direction -		mouse_to_scale_line_dir_2 *= -1.f; -	} +	getMousePointOnPlaneAgent(mouse_on_plane1, x, y, mScaleCenter, mScalePlaneNormal1); +	mouse_on_plane1 -= mScaleCenter; -	F32 snap_dir_dot_mouse_offset1 = mSnapGuideDir1 * mouse_to_scale_line_dir_1; -	F32 snap_dir_dot_mouse_offset2 = mSnapGuideDir2 * mouse_to_scale_line_dir_2; - -	F32 dist_from_scale_line_1 = mouse_to_scale_line_1 * mouse_to_scale_line_dir_1;  -	F32 dist_from_scale_line_2 = mouse_to_scale_line_2 * mouse_to_scale_line_dir_2; +	LLVector3 mouse_on_plane2; +	getMousePointOnPlaneAgent(mouse_on_plane2, x, y, mScaleCenter, mScalePlaneNormal2); +	mouse_on_plane2 -= mScaleCenter; -	F32 max_scale = partToMaxScale(mManipPart, bbox); -	F32 min_scale = partToMinScale(mManipPart, bbox); +	LLVector3 projected_drag_pos1 = inverse_projected_vec(mScaleDir, orthogonal_component(mouse_on_plane1, mSnapGuideDir1)); +	LLVector3 projected_drag_pos2 = inverse_projected_vec(mScaleDir, orthogonal_component(mouse_on_plane2, mSnapGuideDir2));  	BOOL snap_enabled = gSavedSettings.getBOOL("SnapEnabled"); -	if (snap_enabled && dist_from_scale_line_1 > mSnapRegimeOffset * snap_dir_dot_mouse_offset1) +	if (snap_enabled && (mouse_on_plane1 - projected_drag_pos1) * mSnapGuideDir1 > mSnapRegimeOffset)  	{ -		mInSnapRegime = TRUE; -		LLVector3 projected_drag_pos = mouse_on_plane1 - (dist_from_scale_line_1 / snap_dir_dot_mouse_offset1) * mSnapGuideDir1; -		F32 drag_dist = (projected_drag_pos - mScaleCenter) * mScaleDir; +		F32 drag_dist = projected_drag_pos1.length(); -		F32 cur_subdivisions = llclamp(getSubdivisionLevel(projected_drag_pos, mScaleDir, mScaleSnapUnit1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); +		F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + projected_drag_pos1, mScaleDir, mScaleSnapUnit1, mTickPixelSpacing1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);  		F32 snap_dist = mScaleSnapUnit1 / (2.f * cur_subdivisions);  		F32 relative_snap_dist = fmodf(drag_dist + snap_dist, mScaleSnapUnit1 / cur_subdivisions); -		mScaleSnapValue = llclamp((drag_dist - (relative_snap_dist - snap_dist)), min_scale, max_scale); +		mScaleSnappedValue = llclamp((drag_dist - (relative_snap_dist - snap_dist)), min_scale, max_scale); +		scale_factor  =  mScaleSnappedValue / dist_vec(drag_start_point_agent, drag_start_center_agent); +		mScaleSnappedValue /= mScaleSnapUnit1 * 2.f; +		mInSnapRegime = TRUE; -		scale_factor = mScaleSnapValue / drag_start_dist; -		if( !uniform ) +		if (!uniform)  		{  			scale_factor *= 0.5f;  		}  	} -	else if (snap_enabled && dist_from_scale_line_2 > mSnapRegimeOffset * snap_dir_dot_mouse_offset2) +	else if (snap_enabled && (mouse_on_plane2 - projected_drag_pos2) * mSnapGuideDir2 > mSnapRegimeOffset )  	{ -		mInSnapRegime = TRUE; -		LLVector3 projected_drag_pos = mouse_on_plane2 - (dist_from_scale_line_2 / snap_dir_dot_mouse_offset2) * mSnapGuideDir2; -		F32 drag_dist = (projected_drag_pos - mScaleCenter) * mScaleDir; +		F32 drag_dist = projected_drag_pos2.length(); -		F32 cur_subdivisions = llclamp(getSubdivisionLevel(projected_drag_pos, mScaleDir, mScaleSnapUnit2), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); +		F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + projected_drag_pos2, mScaleDir, mScaleSnapUnit2, mTickPixelSpacing2), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);  		F32 snap_dist = mScaleSnapUnit2 / (2.f * cur_subdivisions);  		F32 relative_snap_dist = fmodf(drag_dist + snap_dist, mScaleSnapUnit2 / cur_subdivisions); -		mScaleSnapValue = llclamp((drag_dist - (relative_snap_dist - snap_dist)), min_scale, max_scale); +		mScaleSnappedValue = llclamp((drag_dist - (relative_snap_dist - snap_dist)), min_scale, max_scale); +		scale_factor = mScaleSnappedValue / dist_vec(drag_start_point_agent, drag_start_center_agent); +		mScaleSnappedValue /= mScaleSnapUnit2 * 2.f; +		mInSnapRegime = TRUE; -		scale_factor = mScaleSnapValue / drag_start_dist; -		if( !uniform ) +		if (!uniform)  		{  			scale_factor *= 0.5f;  		} @@ -965,8 +932,14 @@ void LLManipScale::dragCorner( S32 x, S32 y )  	else   	{  		mInSnapRegime = FALSE; +		scale_factor = t; +		if (!uniform) +		{ +			scale_factor = 0.5f + (scale_factor * 0.5f); +		}  	} +  	F32 max_scale_factor = get_default_max_prim_scale() / MIN_PRIM_SCALE;  	F32 min_scale_factor = MIN_PRIM_SCALE / get_default_max_prim_scale(); @@ -1068,10 +1041,6 @@ void LLManipScale::dragCorner( S32 x, S32 y )  			rebuild(cur);  		}  	} - -	 - -	mDragPointGlobal = drag_point_global;  } @@ -1141,16 +1110,16 @@ void LLManipScale::dragFace( S32 x, S32 y )  	{  		mInSnapRegime = TRUE; - 		if (dist_along_scale_line > max_drag_dist) +		if (dist_along_scale_line > max_drag_dist)  		{ -			mScaleSnapValue = max_drag_dist; +			mScaleSnappedValue = max_drag_dist;  			LLVector3 clamp_point = mScaleCenter + max_drag_dist * mScaleDir;  			drag_delta.setVec(clamp_point - drag_start_point_agent);  		}  		else if (dist_along_scale_line < min_drag_dist)  		{ -			mScaleSnapValue = min_drag_dist; +			mScaleSnappedValue = min_drag_dist;  			LLVector3 clamp_point = mScaleCenter + min_drag_dist * mScaleDir;  			drag_delta.setVec(clamp_point - drag_start_point_agent); @@ -1158,7 +1127,7 @@ void LLManipScale::dragFace( S32 x, S32 y )  		else  		{  			F32 drag_dist = scale_center_to_mouse * mScaleDir; -			F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + mScaleDir * drag_dist, mScaleDir, mScaleSnapUnit1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); +			F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + mScaleDir * drag_dist, mScaleDir, mScaleSnapUnit1, mTickPixelSpacing1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);  			F32 snap_dist = mScaleSnapUnit1 / (2.f * cur_subdivisions);  			F32 relative_snap_dist = fmodf(drag_dist + snap_dist, mScaleSnapUnit1 / cur_subdivisions);  			relative_snap_dist -= snap_dist; @@ -1172,7 +1141,7 @@ void LLManipScale::dragFace( S32 x, S32 y )  										 drag_dist - max_drag_dist,  										 drag_dist - min_drag_dist); -			mScaleSnapValue = drag_dist - relative_snap_dist; +			mScaleSnappedValue = drag_dist - relative_snap_dist;  			if (llabs(relative_snap_dist) < snap_dist)  			{ @@ -1376,8 +1345,10 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)  	LLQuaternion grid_rotation;  	LLSelectMgr::getInstance()->getGrid(grid_origin, grid_rotation, grid_scale); +	bool uniform = getUniform(); +  	LLVector3 box_corner_agent = bbox.localToAgent(unitVectorToLocalBBoxExtent( partToUnitVector( mManipPart ), bbox )); -	mScaleCenter = getUniform() ? bbox.getCenterAgent() : bbox.localToAgent(unitVectorToLocalBBoxExtent( -1.f * partToUnitVector( mManipPart ), bbox )); +	mScaleCenter = uniform ? bbox.getCenterAgent() : bbox.localToAgent(unitVectorToLocalBBoxExtent( -1.f * partToUnitVector( mManipPart ), bbox ));  	mScaleDir = box_corner_agent - mScaleCenter;  	mScaleDir.normVec(); @@ -1388,7 +1359,7 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)  	}  	else  	{ -		F32 object_distance = dist_vec(mScaleCenter, LLViewerCamera::getInstance()->getOrigin()); +		F32 object_distance = dist_vec(box_corner_agent, LLViewerCamera::getInstance()->getOrigin());  		mSnapRegimeOffset = (SNAP_GUIDE_SCREEN_OFFSET * gViewerWindow->getWorldViewWidthRaw() * object_distance) / LLViewerCamera::getInstance()->getPixelMeterRatio();  	}  	LLVector3 cam_at_axis; @@ -1412,14 +1383,13 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)  	if( (LL_FACE_MIN <= (S32)mManipPart) && ((S32)mManipPart <= LL_FACE_MAX) )  	{ -		LLVector3 object_scale = bbox.getMaxLocal(); -		object_scale.scaleVec(off_axis_dir * ~bbox.getRotation()); -		object_scale.abs(); -		if (object_scale.mV[VX] > object_scale.mV[VY] && object_scale.mV[VX] > object_scale.mV[VZ]) +		LLVector3 bbox_relative_cam_dir = off_axis_dir * ~bbox.getRotation(); +		bbox_relative_cam_dir.abs(); +		if (bbox_relative_cam_dir.mV[VX] > bbox_relative_cam_dir.mV[VY] && bbox_relative_cam_dir.mV[VX] > bbox_relative_cam_dir.mV[VZ])  		{  			mSnapGuideDir1 = LLVector3::x_axis * bbox.getRotation();  		} -		else if (object_scale.mV[VY] > object_scale.mV[VZ]) +		else if (bbox_relative_cam_dir.mV[VY] > bbox_relative_cam_dir.mV[VZ])  		{  			mSnapGuideDir1 = LLVector3::y_axis * bbox.getRotation();  		} @@ -1438,7 +1408,6 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)  	}  	else if( (LL_CORNER_MIN <= (S32)mManipPart) && ((S32)mManipPart <= LL_CORNER_MAX) )  	{ -		LLVector3 local_scale_dir = partToUnitVector( mManipPart );  		LLVector3 local_camera_dir;  		if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)  		{ @@ -1446,74 +1415,133 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)  		}  		else  		{ -			local_camera_dir = (LLViewerCamera::getInstance()->getOrigin() - bbox.getCenterAgent()) * ~bbox.getRotation(); +			local_camera_dir = (LLViewerCamera::getInstance()->getOrigin() - box_corner_agent) * ~bbox.getRotation();  			local_camera_dir.normVec();  		} -		local_scale_dir -= projected_vec(local_scale_dir, local_camera_dir); -		local_scale_dir.normVec(); -		LLVector3 x_axis_proj_camera = LLVector3::x_axis - projected_vec(LLVector3::x_axis, local_camera_dir); -		x_axis_proj_camera.normVec(); -		LLVector3 y_axis_proj_camera = LLVector3::y_axis - projected_vec(LLVector3::y_axis, local_camera_dir); -		y_axis_proj_camera.normVec(); -		LLVector3 z_axis_proj_camera = LLVector3::z_axis - projected_vec(LLVector3::z_axis, local_camera_dir); -		z_axis_proj_camera.normVec(); -		F32 x_axis_proj = llabs(local_scale_dir * x_axis_proj_camera); -		F32 y_axis_proj = llabs(local_scale_dir * y_axis_proj_camera); -		F32 z_axis_proj = llabs(local_scale_dir * z_axis_proj_camera); - -		if (x_axis_proj > y_axis_proj && x_axis_proj > z_axis_proj) -		{ -			mSnapGuideDir1 = LLVector3::y_axis; -			mScaleSnapUnit2 = grid_scale.mV[VY]; -			mSnapGuideDir2 = LLVector3::z_axis; -			mScaleSnapUnit1 = grid_scale.mV[VZ]; -		} -		else if (y_axis_proj > z_axis_proj) -		{ -			mSnapGuideDir1 = LLVector3::x_axis; -			mScaleSnapUnit2 = grid_scale.mV[VX]; -			mSnapGuideDir2 = LLVector3::z_axis; -			mScaleSnapUnit1 = grid_scale.mV[VZ]; -		} -		else -		{ -			mSnapGuideDir1 = LLVector3::x_axis; -			mScaleSnapUnit2 = grid_scale.mV[VX]; -			mSnapGuideDir2 = LLVector3::y_axis; -			mScaleSnapUnit1 = grid_scale.mV[VY]; -		} -		LLVector3 snap_guide_flip(1.f, 1.f, 1.f); +		LLVector3 axis_flip;  		switch (mManipPart)  		{  		case LL_CORNER_NNN: +			axis_flip.setVec(1.f, 1.f, 1.f);  			break;  		case LL_CORNER_NNP: -			snap_guide_flip.setVec(1.f, 1.f, -1.f); +			axis_flip.setVec(1.f, 1.f, -1.f);  			break;  		case LL_CORNER_NPN: -			snap_guide_flip.setVec(1.f, -1.f, 1.f); +			axis_flip.setVec(1.f, -1.f, 1.f);  			break;  		case LL_CORNER_NPP: -			snap_guide_flip.setVec(1.f, -1.f, -1.f); +			axis_flip.setVec(1.f, -1.f, -1.f);  			break;  		case LL_CORNER_PNN: -			snap_guide_flip.setVec(-1.f, 1.f, 1.f); +			axis_flip.setVec(-1.f, 1.f, 1.f);  			break;  		case LL_CORNER_PNP: -			snap_guide_flip.setVec(-1.f, 1.f, -1.f); +			axis_flip.setVec(-1.f, 1.f, -1.f);  			break;  		case LL_CORNER_PPN: -			snap_guide_flip.setVec(-1.f, -1.f, 1.f); +			axis_flip.setVec(-1.f, -1.f, 1.f);  			break;  		case LL_CORNER_PPP: -			snap_guide_flip.setVec(-1.f, -1.f, -1.f); +			axis_flip.setVec(-1.f, -1.f, -1.f);  			break;  		default:  			break;  		} -		mSnapGuideDir1.scaleVec(snap_guide_flip); -		mSnapGuideDir2.scaleVec(snap_guide_flip); + +		// account for which side of the object the camera is located and negate appropriate axes +		local_camera_dir.scaleVec(axis_flip); + +		// normalize to object scale +		LLVector3 bbox_extent = bbox.getExtentLocal(); +		local_camera_dir.scaleVec(LLVector3(1.f / bbox_extent.mV[VX], 1.f / bbox_extent.mV[VY], 1.f / bbox_extent.mV[VZ])); + +		S32 scale_face = -1; + +		if ((local_camera_dir.mV[VX] > 0.f) == (local_camera_dir.mV[VY] > 0.f)) +		{ +			if ((local_camera_dir.mV[VZ] > 0.f) == (local_camera_dir.mV[VY] > 0.f)) +			{ +				LLVector3 local_camera_dir_abs = local_camera_dir; +				local_camera_dir_abs.abs(); +				// all neighboring faces of bbox are pointing towards camera or away from camera +				// use largest magnitude face for snap guides +				if (local_camera_dir_abs.mV[VX] > local_camera_dir_abs.mV[VY]) +				{ +					if (local_camera_dir_abs.mV[VX] > local_camera_dir_abs.mV[VZ]) +					{ +						scale_face = VX; +					} +					else +					{ +						scale_face = VZ; +					} +				} +				else // y > x +				{ +					if (local_camera_dir_abs.mV[VY] > local_camera_dir_abs.mV[VZ]) +					{ +						scale_face = VY; +					} +					else +					{ +						scale_face = VZ; +					} +				} +			} +			else +			{ +				// z axis facing opposite direction from x and y relative to camera, use x and y for snap guides +				scale_face = VZ; +			} +		} +		else // x and y axes are facing in opposite directions relative to camera +		{ +			if ((local_camera_dir.mV[VZ] > 0.f) == (local_camera_dir.mV[VY] > 0.f)) +			{ +				// x axis facing opposite direction from y and z relative to camera, use y and z for snap guides +				scale_face = VX; +			} +			else +			{ +				// y axis facing opposite direction from x and z relative to camera, use x and z for snap guides +				scale_face = VY; +			} +		} + +		switch(scale_face) +		{ +		case VX: +			// x axis face being scaled, use y and z for snap guides +			mSnapGuideDir1 = LLVector3::y_axis.scaledVec(axis_flip); +			mScaleSnapUnit1 = grid_scale.mV[VZ]; +			mSnapGuideDir2 = LLVector3::z_axis.scaledVec(axis_flip); +			mScaleSnapUnit2 = grid_scale.mV[VY];			 +			break; +		case VY: +			// y axis facing being scaled, use x and z for snap guides +			mSnapGuideDir1 = LLVector3::x_axis.scaledVec(axis_flip); +			mScaleSnapUnit1 = grid_scale.mV[VZ]; +			mSnapGuideDir2 = LLVector3::z_axis.scaledVec(axis_flip); +			mScaleSnapUnit2 = grid_scale.mV[VX]; +			break; +		case VZ: +			// z axis facing being scaled, use x and y for snap guides +			mSnapGuideDir1 = LLVector3::x_axis.scaledVec(axis_flip); +			mScaleSnapUnit1 = grid_scale.mV[VY]; +			mSnapGuideDir2 = LLVector3::y_axis.scaledVec(axis_flip); +			mScaleSnapUnit2 = grid_scale.mV[VX]; +			break; +		default: +			mSnapGuideDir1.zeroVec(); +			mScaleSnapUnit1 = 0.f; + +			mSnapGuideDir2.zeroVec(); +			mScaleSnapUnit2 = 0.f; +			break; +		} +  		mSnapGuideDir1.rotVec(bbox.getRotation());  		mSnapGuideDir2.rotVec(bbox.getRotation());  		mSnapDir1 = -1.f * mSnapGuideDir2; @@ -1528,6 +1556,15 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)  	mScaleSnapUnit1 = mScaleSnapUnit1 / (mSnapDir1 * mScaleDir);  	mScaleSnapUnit2 = mScaleSnapUnit2 / (mSnapDir2 * mScaleDir); + +	mTickPixelSpacing1 = llround((F32)MIN_DIVISION_PIXEL_WIDTH / (mScaleDir % mSnapGuideDir1).length()); +	mTickPixelSpacing2 = llround((F32)MIN_DIVISION_PIXEL_WIDTH / (mScaleDir % mSnapGuideDir2).length()); + +	if (uniform) +	{ +		mScaleSnapUnit1 *= 0.5f; +		mScaleSnapUnit2 *= 0.5f; +	}  }  void LLManipScale::renderSnapGuides(const LLBBox& bbox) @@ -1551,9 +1588,9 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  		LLColor4 tick_color = setupSnapGuideRenderPass(pass);  		gGL.begin(LLRender::LINES); -		LLVector3 line_mid = mScaleCenter + (mScaleSnapValue * mScaleDir) + (mSnapGuideDir1 * mSnapRegimeOffset); -		LLVector3 line_start = line_mid - (mScaleDir * (llmin(mScaleSnapValue, mSnapGuideLength * 0.5f))); -		LLVector3 line_end = line_mid + (mScaleDir * llmin(max_point_on_scale_line - mScaleSnapValue, mSnapGuideLength * 0.5f)); +		LLVector3 line_mid = mScaleCenter + (mScaleSnappedValue * mScaleDir) + (mSnapGuideDir1 * mSnapRegimeOffset); +		LLVector3 line_start = line_mid - (mScaleDir * (llmin(mScaleSnappedValue, mSnapGuideLength * 0.5f))); +		LLVector3 line_end = line_mid + (mScaleDir * llmin(max_point_on_scale_line - mScaleSnappedValue, mSnapGuideLength * 0.5f));  		gGL.color4f(tick_color.mV[VRED], tick_color.mV[VGREEN], tick_color.mV[VBLUE], tick_color.mV[VALPHA] * 0.1f);  		gGL.vertex3fv(line_start.mV); @@ -1563,9 +1600,9 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  		gGL.color4f(tick_color.mV[VRED], tick_color.mV[VGREEN], tick_color.mV[VBLUE], tick_color.mV[VALPHA] * 0.1f);  		gGL.vertex3fv(line_end.mV); -		line_mid = mScaleCenter + (mScaleSnapValue * mScaleDir) + (mSnapGuideDir2 * mSnapRegimeOffset); -		line_start = line_mid - (mScaleDir * (llmin(mScaleSnapValue, mSnapGuideLength * 0.5f))); -		line_end = line_mid + (mScaleDir * llmin(max_point_on_scale_line - mScaleSnapValue, mSnapGuideLength * 0.5f)); +		line_mid = mScaleCenter + (mScaleSnappedValue * mScaleDir) + (mSnapGuideDir2 * mSnapRegimeOffset); +		line_start = line_mid - (mScaleDir * (llmin(mScaleSnappedValue, mSnapGuideLength * 0.5f))); +		line_end = line_mid + (mScaleDir * llmin(max_point_on_scale_line - mScaleSnappedValue, mSnapGuideLength * 0.5f));  		gGL.vertex3fv(line_start.mV);  		gGL.color4fv(tick_color.mV);  		gGL.vertex3fv(line_mid.mV); @@ -1580,6 +1617,8 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  		F32 dist_grid_axis = (drag_point - mScaleCenter) * mScaleDir;  		// find distance to nearest smallest grid unit +		F32 grid_multiple1 = llfloor(llmax(0.f, dist_grid_axis) / (mScaleSnapUnit1 / max_subdivisions)); +		F32 grid_multiple2 = llfloor(llmax(0.f, dist_grid_axis) / (mScaleSnapUnit2 / max_subdivisions));  		F32 grid_offset1 = fmodf(dist_grid_axis, mScaleSnapUnit1 / max_subdivisions);  		F32 grid_offset2 = fmodf(dist_grid_axis, mScaleSnapUnit2 / max_subdivisions); @@ -1602,7 +1641,8 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  		{  			// draw snap guide line  			gGL.begin(LLRender::LINES); -			LLVector3 snap_line_center = mScaleCenter + (mScaleSnapValue * mScaleDir); +			//LLVector3 snap_line_center = mScaleCenter + (mScaleSnappedValue * mScaleDir); +			LLVector3 snap_line_center = bbox.localToAgent(unitVectorToLocalBBoxExtent( partToUnitVector( mManipPart ), bbox ));  			LLVector3 snap_line_start = snap_line_center + (mSnapGuideDir1 * mSnapRegimeOffset);  			LLVector3 snap_line_end = snap_line_center + (mSnapGuideDir2 * mSnapRegimeOffset); @@ -1625,15 +1665,15 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  				arrow_dir = snap_line_start - snap_line_center;  				arrow_dir.normVec(); -				gGL.vertex3fv((snap_line_start + arrow_dir * mBoxHandleSize).mV); -				gGL.vertex3fv((snap_line_start + arrow_span * mBoxHandleSize).mV); -				gGL.vertex3fv((snap_line_start - arrow_span * mBoxHandleSize).mV); +				gGL.vertex3fv((snap_line_start + arrow_dir * mSnapRegimeOffset * 0.1f).mV); +				gGL.vertex3fv((snap_line_start + arrow_span * mSnapRegimeOffset * 0.1f).mV); +				gGL.vertex3fv((snap_line_start - arrow_span * mSnapRegimeOffset * 0.1f).mV);  				arrow_dir = snap_line_end - snap_line_center;  				arrow_dir.normVec(); -				gGL.vertex3fv((snap_line_end + arrow_dir * mBoxHandleSize).mV); -				gGL.vertex3fv((snap_line_end + arrow_span * mBoxHandleSize).mV); -				gGL.vertex3fv((snap_line_end - arrow_span * mBoxHandleSize).mV); +				gGL.vertex3fv((snap_line_end + arrow_dir * mSnapRegimeOffset * 0.1f).mV); +				gGL.vertex3fv((snap_line_end + arrow_span * mSnapRegimeOffset * 0.1f).mV); +				gGL.vertex3fv((snap_line_end - arrow_span * mSnapRegimeOffset * 0.1f).mV);  			}  			gGL.end();  		} @@ -1655,9 +1695,9 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  			for (S32 i = start_tick; i <= stop_tick; i++)  			{  				F32 alpha = (1.f - (1.f *  ((F32)llabs(i) / (F32)num_ticks_per_side1))); -				LLVector3 tick_pos = drag_point + (mScaleDir * (mScaleSnapUnit1 / max_subdivisions * (F32)i - grid_offset1)); +				LLVector3 tick_pos = mScaleCenter + (mScaleDir * (grid_multiple1 + i) * (mScaleSnapUnit1 / max_subdivisions)); -				F32 cur_subdivisions = llclamp(getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); +				F32 cur_subdivisions = llclamp(getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit1, mTickPixelSpacing1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);  				if (fmodf((F32)(i + sub_div_offset_1), (max_subdivisions / cur_subdivisions)) != 0.f)  				{ @@ -1688,9 +1728,9 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  			for (S32 i = start_tick; i <= stop_tick; i++)  			{  				F32 alpha = (1.f - (1.f *  ((F32)llabs(i) / (F32)num_ticks_per_side2))); -				LLVector3 tick_pos = drag_point + (mScaleDir * (mScaleSnapUnit2 / max_subdivisions * (F32)i - grid_offset2)); - -				F32 cur_subdivisions = llclamp(getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit2), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); +				LLVector3 tick_pos = mScaleCenter + (mScaleDir * (grid_multiple2 + i) * (mScaleSnapUnit2 / max_subdivisions)); +				 +				F32 cur_subdivisions = llclamp(getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit2, mTickPixelSpacing2), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);  				if (fmodf((F32)(i + sub_div_offset_2), (max_subdivisions / cur_subdivisions)) != 0.f)  				{ @@ -1728,7 +1768,9 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  		{  			F32 tick_scale = 1.f;  			F32 alpha = grid_alpha * (1.f - (0.5f *  ((F32)llabs(i) / (F32)num_ticks_per_side1))); -			LLVector3 tick_pos = drag_point + (mScaleDir * (mScaleSnapUnit1 / max_subdivisions * (F32)i - grid_offset1)); +			F32 distance = (drag_point - mScaleCenter) * mScaleDir; +			(void) distance; +			LLVector3 tick_pos = mScaleCenter + (mScaleDir * (grid_multiple1 + i) * (mScaleSnapUnit1 / max_subdivisions));  			for (F32 division_level = max_subdivisions; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)  			{ @@ -1743,31 +1785,26 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  			{  				LLVector3 text_origin = tick_pos +   					(mSnapGuideDir1 * mSnapRegimeOffset * (1.f + tick_scale)); - +				  				EGridMode grid_mode = LLSelectMgr::getInstance()->getGridMode(); -				F32 tick_val; +				F32 tick_value;  				if (grid_mode == GRID_MODE_WORLD)  				{ -					tick_val = (tick_pos - mScaleCenter) * mScaleDir / (mScaleSnapUnit1 / grid_resolution); +					tick_value = (grid_multiple1 + i) / (max_subdivisions / grid_resolution);  				}  				else  				{ -					tick_val = (tick_pos - mScaleCenter) * mScaleDir / (mScaleSnapUnit1 * 2.f); -				} - -				if (getUniform()) -				{ -					tick_val *= 2.f; +					tick_value = (grid_multiple1 + i) / (2.f * max_subdivisions);  				}  				F32 text_highlight = 0.8f; -				if (is_approx_equal(tick_val, mScaleSnapValue) && mInSnapRegime) +				if (is_approx_equal(tick_value, mScaleSnappedValue) && mInSnapRegime)  				{  					text_highlight = 1.f;  				} -				renderTickValue(text_origin, tick_val, grid_mode == GRID_MODE_WORLD ? std::string("m") : std::string("x"), LLColor4(text_highlight, text_highlight, text_highlight, alpha)); +				renderTickValue(text_origin, tick_value, grid_mode == GRID_MODE_WORLD ? std::string("m") : std::string("x"), LLColor4(text_highlight, text_highlight, text_highlight, alpha));  			}  		} @@ -1780,7 +1817,7 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  			{  				F32 tick_scale = 1.f;  				F32 alpha = grid_alpha * (1.f - (0.5f *  ((F32)llabs(i) / (F32)num_ticks_per_side2))); -				LLVector3 tick_pos = drag_point + (mScaleDir * (mScaleSnapUnit2 / max_subdivisions * (F32)i - grid_offset2)); +				LLVector3 tick_pos = mScaleCenter + (mScaleDir * (grid_multiple2 + i) * (mScaleSnapUnit2 / max_subdivisions));  				for (F32 division_level = max_subdivisions; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)  				{ @@ -1797,29 +1834,24 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)  						(mSnapGuideDir2 * mSnapRegimeOffset * (1.f + tick_scale));  					EGridMode grid_mode = LLSelectMgr::getInstance()->getGridMode(); -					F32 tick_val; +					F32 tick_value;  					if (grid_mode == GRID_MODE_WORLD)  					{ -						tick_val = (tick_pos - mScaleCenter) * mScaleDir / (mScaleSnapUnit2 / grid_resolution); +						tick_value = (grid_multiple2 + i) / (max_subdivisions / grid_resolution);  					}  					else  					{ -						tick_val = (tick_pos - mScaleCenter) * mScaleDir / (mScaleSnapUnit2 * 2.f); -					} - -					if (getUniform()) -					{ -						tick_val *= 2.f; +						tick_value = (grid_multiple2 + i) / (2.f * max_subdivisions);  					}  					F32 text_highlight = 0.8f; -					if (is_approx_equal(tick_val, mScaleSnapValue) && mInSnapRegime) +					if (is_approx_equal(tick_value, mScaleSnappedValue) && mInSnapRegime)  					{  						text_highlight = 1.f;  					} -					renderTickValue(text_origin, tick_val, grid_mode == GRID_MODE_WORLD ? std::string("m") : std::string("x"), LLColor4(text_highlight, text_highlight, text_highlight, alpha)); +					renderTickValue(text_origin, tick_value, grid_mode == GRID_MODE_WORLD ? std::string("m") : std::string("x"), LLColor4(text_highlight, text_highlight, text_highlight, alpha));  				}  			}  		} @@ -1914,28 +1946,28 @@ LLVector3 LLManipScale::cornerToUnitVector( S32 part ) const  	switch(part)  	{  		case LL_CORNER_NNN: -			vec.setVec(-F_SQRT3, -F_SQRT3, -F_SQRT3); +			vec.setVec(-OO_SQRT3, -OO_SQRT3, -OO_SQRT3);  			break;  		case LL_CORNER_NNP:		 -			vec.setVec(-F_SQRT3, -F_SQRT3, F_SQRT3); +			vec.setVec(-OO_SQRT3, -OO_SQRT3, OO_SQRT3);  			break;  		case LL_CORNER_NPN: -			vec.setVec(-F_SQRT3, F_SQRT3, -F_SQRT3); +			vec.setVec(-OO_SQRT3, OO_SQRT3, -OO_SQRT3);  			break;  		case LL_CORNER_NPP: -			vec.setVec(-F_SQRT3, F_SQRT3, F_SQRT3); +			vec.setVec(-OO_SQRT3, OO_SQRT3, OO_SQRT3);  			break;  		case LL_CORNER_PNN: -			vec.setVec(F_SQRT3, -F_SQRT3, -F_SQRT3); +			vec.setVec(OO_SQRT3, -OO_SQRT3, -OO_SQRT3);  			break;  		case LL_CORNER_PNP: -			vec.setVec(F_SQRT3, -F_SQRT3, F_SQRT3); +			vec.setVec(OO_SQRT3, -OO_SQRT3, OO_SQRT3);  			break;  		case LL_CORNER_PPN: -			vec.setVec(F_SQRT3, F_SQRT3, -F_SQRT3); +			vec.setVec(OO_SQRT3, OO_SQRT3, -OO_SQRT3);  			break;  		case LL_CORNER_PPP: -			vec.setVec(F_SQRT3, F_SQRT3, F_SQRT3); +			vec.setVec(OO_SQRT3, OO_SQRT3, OO_SQRT3);  			break;  		default:  			vec.clearVec(); diff --git a/indra/newview/llmanipscale.h b/indra/newview/llmanipscale.h index 5cb8898fd0..079fda76ce 100755 --- a/indra/newview/llmanipscale.h +++ b/indra/newview/llmanipscale.h @@ -64,7 +64,7 @@ public:  		ManipulatorHandle(LLVector3 pos, EManipPart id, EScaleManipulatorType type):mPosition(pos), mManipID(id), mType(type){}  	}; - +	static const S32 NUM_MANIPULATORS = 14;  	LLManipScale( LLToolComposite* composite );  	~LLManipScale(); @@ -91,7 +91,7 @@ private:  	void			renderFaces( const LLBBox& local_bbox );  	void			renderEdges( const LLBBox& local_bbox );  	void			renderBoxHandle( F32 x, F32 y, F32 z ); -	void			renderAxisHandle( const LLVector3& start, const LLVector3& end ); +	void			renderAxisHandle( U32 part, const LLVector3& start, const LLVector3& end );  	void			renderGuidelinesPart( const LLBBox& local_bbox );  	void			renderSnapGuides( const LLBBox& local_bbox ); @@ -135,7 +135,6 @@ private:  	}; -	F32				mBoxHandleSize;		// The size of the handles at the corners of the bounding box  	F32				mScaledBoxHandleSize; // handle size after scaling for selection feedback  	LLVector3d		mDragStartPointGlobal;  	LLVector3d		mDragStartCenterGlobal;	// The center of the bounding box of all selected objects at time of drag start @@ -157,12 +156,15 @@ private:  	LLVector3		mSnapDir1;  	LLVector3		mSnapDir2;  	F32				mSnapRegimeOffset; +	F32				mTickPixelSpacing1, +					mTickPixelSpacing2;  	F32				mSnapGuideLength;  	LLVector3		mScaleCenter;  	LLVector3		mScaleDir; -	F32				mScaleSnapValue; +	F32				mScaleSnappedValue;  	BOOL			mInSnapRegime; -	F32*			mManipulatorScales; +	F32				mManipulatorScales[NUM_MANIPULATORS]; +	F32				mBoxHandleSize[NUM_MANIPULATORS];		// The size of the handles at the corners of the bounding box  };  #endif  // LL_MANIPSCALE_H diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index 06bf294417..4830a4b875 100755 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -1247,7 +1247,7 @@ void LLManipTranslate::renderSnapGuides()  		// find distance to nearest smallest grid unit  		F32 offset_nearest_grid_unit = fmodf(dist_grid_axis, smallest_grid_unit_scale);  		// how many smallest grid units are we away from largest grid scale? -		S32 sub_div_offset = llround(fmod(dist_grid_axis - offset_nearest_grid_unit, getMinGridScale() / sGridMinSubdivisionLevel) / smallest_grid_unit_scale); +		S32 sub_div_offset = llround(fmodf(dist_grid_axis - offset_nearest_grid_unit, getMinGridScale() / sGridMinSubdivisionLevel) / smallest_grid_unit_scale);  		S32 num_ticks_per_side = llmax(1, llfloor(0.5f * guide_size_meters / smallest_grid_unit_scale));  		LLGLDepthTest gls_depth(GL_FALSE); diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index 180c1d6ab5..c872a15af7 100755 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -49,6 +49,7 @@  #include "llpanelgroupnotices.h"  #include "llpanelgroupgeneral.h" +#include "llpanelgrouproles.h"  #include "llaccordionctrltab.h"  #include "llaccordionctrl.h" @@ -275,6 +276,7 @@ void LLPanelGroup::onBtnApply(void* user_data)  {  	LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data);  	self->apply(); +	self->refreshData();  }  void LLPanelGroup::onBtnGroupCallClicked(void* user_data) @@ -495,6 +497,22 @@ bool LLPanelGroup::apply(LLPanelGroupTab* tab)  	{  		//we skip refreshing group after ew manually apply changes since its very annoying  		//for those who are editing group + +		LLPanelGroupRoles * roles_tab = dynamic_cast<LLPanelGroupRoles*>(tab); +		if (roles_tab) +		{ +			LLGroupMgr* gmgrp = LLGroupMgr::getInstance(); +			LLGroupMgrGroupData* gdatap = gmgrp->getGroupData(roles_tab->getGroupID()); + +			// allow refresh only for one specific case: +			// there is only one member in group and it is not owner +			// it's a wrong situation and need refresh panels from server +			if (gdatap && gdatap->isSingleMemberNotOwner()) +			{ +				return true; +			} +		} +  		mSkipRefresh = TRUE;  		return true;  	} diff --git a/indra/newview/llpanelland.cpp b/indra/newview/llpanelland.cpp index 5321ebc777..1946b9c523 100755 --- a/indra/newview/llpanelland.cpp +++ b/indra/newview/llpanelland.cpp @@ -145,7 +145,7 @@ void LLPanelLandInfo::refresh()  						&& ((gAgent.getID() == auth_buyer_id)  							|| (auth_buyer_id.isNull()))); -		if (is_public) +		if (is_public && !LLViewerParcelMgr::getInstance()->getParcelSelection()->getMultipleOwners())  		{  			getChildView("button buy land")->setEnabled(TRUE);  		} diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 88400e4ef2..1d3b583192 100755 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -716,6 +716,11 @@ void LLLandmarksPanel::updateListCommands()  	mListCommands->getChildView(TRASH_BUTTON_NAME)->setEnabled(trash_enabled);  } +void LLLandmarksPanel::updateMenuVisibility(LLUICtrl* menu) +{ +	onMenuVisibilityChange(menu, LLSD().with("visibility", true)); +} +  void LLLandmarksPanel::onActionsButtonClick()  {  	LLToggleableMenu* menu = mGearFolderMenu; @@ -1258,6 +1263,7 @@ bool LLLandmarksPanel::handleDragAndDropToTrash(BOOL drop, EDragAndDropType carg  		break;  	} +	updateVerbs();  	return true;  } diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index 8fae0f0b67..80310d1524 100755 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -80,6 +80,8 @@ public:  	LLPlacesInventoryPanel* getLibraryInventoryPanel() { return mLibraryInventoryPanel; } +	void updateMenuVisibility(LLUICtrl* menu); +  protected:  	/**  	 * @return true - if current selected panel is not null and selected item is a landmark diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index d7130820ab..6c9616511f 100755 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -1491,7 +1491,8 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par  	mFolders(NULL),  	mHaveInventory(FALSE),  	mIsInventoryEmpty(TRUE), -	mInventoryNeedsUpdate(FALSE) +	mInventoryNeedsUpdate(FALSE), +	mInventoryViewModel(p.name)  {  	// Setup context menu callbacks  	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelObjectInventory::doToSelected, this, _2)); @@ -2010,3 +2011,46 @@ void LLPanelObjectInventory::clearItemIDs()  	mItemMap.clear();  } +BOOL LLPanelObjectInventory::handleKeyHere( KEY key, MASK mask ) +{ +	BOOL handled = FALSE; +	switch (key) +	{ +	case KEY_DELETE: +	case KEY_BACKSPACE: +		// Delete selected items if delete or backspace key hit on the inventory panel +		// Note: on Mac laptop keyboards, backspace and delete are one and the same +		if (isSelectionRemovable() && mask == MASK_NONE) +		{ +			LLInventoryAction::doToSelected(&gInventory, mFolders, "delete"); +			handled = TRUE; +		} +		break; +	} +	return handled; +} + +BOOL LLPanelObjectInventory::isSelectionRemovable() +{ +	if (!mFolders || !mFolders->getRoot()) +	{ +		return FALSE; +	} +	std::set<LLFolderViewItem*> selection_set = mFolders->getRoot()->getSelectionList(); +	if (selection_set.empty()) +	{ +		return FALSE; +	} +	for (std::set<LLFolderViewItem*>::iterator iter = selection_set.begin(); +		iter != selection_set.end(); +		++iter) +	{ +		LLFolderViewItem *item = *iter; +		const LLFolderViewModelItemInventory *listener = dynamic_cast<const LLFolderViewModelItemInventory*>(item->getViewModelItem()); +		if (!listener || !listener->isItemRemovable() || listener->isItemInTrash()) +		{ +			return FALSE; +		} +	} +	return TRUE; +} diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h index f497c695b3..9559f7e886 100755 --- a/indra/newview/llpanelobjectinventory.h +++ b/indra/newview/llpanelobjectinventory.h @@ -94,6 +94,9 @@ protected:  	void removeItemID(const LLUUID& id);  	void clearItemIDs(); +	BOOL			handleKeyHere( KEY key, MASK mask ); +	BOOL			isSelectionRemovable(); +  private:  	std::map<LLUUID, LLFolderViewItem*> mItemMap; diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index 14b5d9af47..3b8acdca90 100755 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -129,6 +129,7 @@ BOOL LLPanelPlaceProfile::postBuild()  	mEstateNameText = getChild<LLTextBox>("estate_name");  	mEstateRatingText = getChild<LLTextBox>("estate_rating"); +	mEstateRatingIcon = getChild<LLIconCtrl>("estate_rating_icon");  	mEstateOwnerText = getChild<LLTextBox>("estate_owner");  	mCovenantText = getChild<LLTextEditor>("covenant"); @@ -201,6 +202,7 @@ void LLPanelPlaceProfile::resetLocation()  	mEstateNameText->setValue(loading);  	mEstateRatingText->setValue(loading); +	mEstateRatingIcon->setValue(loading);  	mEstateOwnerText->setValue(loading);  	mCovenantText->setValue(loading); @@ -348,6 +350,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,  		mParcelRatingIcon->setValue(icon_m);  		mRegionRatingIcon->setValue(icon_m); +		mEstateRatingIcon->setValue(icon_m);  		break;  	case SIM_ACCESS_ADULT: @@ -355,6 +358,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,  		mParcelRatingIcon->setValue(icon_r);  		mRegionRatingIcon->setValue(icon_r); +		mEstateRatingIcon->setValue(icon_r);  		break;  	default: @@ -362,6 +366,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,  		mParcelRatingIcon->setValue(icon_pg);  		mRegionRatingIcon->setValue(icon_pg); +		mEstateRatingIcon->setValue(icon_pg);  	}  	std::string rating = LLViewerRegion::accessToString(sim_access); diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h index f4c6145881..ff24938b9c 100755 --- a/indra/newview/llpanelplaceprofile.h +++ b/indra/newview/llpanelplaceprofile.h @@ -103,6 +103,7 @@ private:  	LLTextBox*			mEstateNameText;  	LLTextBox*			mEstateRatingText; +	LLIconCtrl*			mEstateRatingIcon;  	LLTextBox*			mEstateOwnerText;  	LLTextEditor*		mCovenantText; diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 9c380f63bd..be9b095644 100755 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -45,6 +45,7 @@  #include "llviewermenu.h"  #include "lllandmarkactions.h"  #include "llclipboard.h" +#include "lltrans.h"  // Maximum number of items that can be added to a list in one pass.  // Used to limit time spent for items list update per frame. @@ -55,7 +56,8 @@ static const std::string COLLAPSED_BY_USER = "collapsed_by_user";  class LLTeleportHistoryFlatItem : public LLPanel  {  public: -	LLTeleportHistoryFlatItem(S32 index, LLTeleportHistoryPanel::ContextMenu *context_menu, const std::string ®ion_name, const std::string &hl); +	LLTeleportHistoryFlatItem(S32 index, LLTeleportHistoryPanel::ContextMenu *context_menu, const std::string ®ion_name, +										 	 LLDate date, const std::string &hl);  	virtual ~LLTeleportHistoryFlatItem();  	virtual BOOL postBuild(); @@ -66,8 +68,11 @@ public:  	void setIndex(S32 index) { mIndex = index; }  	const std::string& getRegionName() { return mRegionName;}  	void setRegionName(const std::string& name); +	void setDate(LLDate date);  	void setHighlightedText(const std::string& text);  	void updateTitle(); +	void updateTimestamp(); +	std::string getTimestamp();  	/*virtual*/ void setValue(const LLSD& value); @@ -84,12 +89,14 @@ private:  	LLButton* mProfileBtn;  	LLTextBox* mTitle; +	LLTextBox* mTimeTextBox;  	LLTeleportHistoryPanel::ContextMenu *mContextMenu;  	S32 mIndex;  	std::string mRegionName;  	std::string mHighlight; +	LLDate 		mDate;  	LLRootHandle<LLTeleportHistoryFlatItem> mItemHandle;  }; @@ -121,11 +128,13 @@ private:  ////////////////////////////////////////////////////////////////////////////////  //////////////////////////////////////////////////////////////////////////////// -LLTeleportHistoryFlatItem::LLTeleportHistoryFlatItem(S32 index, LLTeleportHistoryPanel::ContextMenu *context_menu, const std::string ®ion_name, const std::string &hl) +LLTeleportHistoryFlatItem::LLTeleportHistoryFlatItem(S32 index, LLTeleportHistoryPanel::ContextMenu *context_menu, const std::string ®ion_name, +																LLDate date, const std::string &hl)  :	LLPanel(),  	mIndex(index),  	mContextMenu(context_menu),  	mRegionName(region_name), +	mDate(date),  	mHighlight(hl)  {  	buildFromFile( "panel_teleport_history_item.xml"); @@ -140,11 +149,14 @@ BOOL LLTeleportHistoryFlatItem::postBuild()  {  	mTitle = getChild<LLTextBox>("region"); +	mTimeTextBox = getChild<LLTextBox>("timestamp"); +  	mProfileBtn = getChild<LLButton>("profile_btn");  	mProfileBtn->setClickedCallback(boost::bind(&LLTeleportHistoryFlatItem::onProfileBtnClick, this));  	updateTitle(); +	updateTimestamp();  	return true;  } @@ -179,6 +191,38 @@ void LLTeleportHistoryFlatItem::setRegionName(const std::string& name)  	mRegionName = name;  } +void LLTeleportHistoryFlatItem::setDate(LLDate date) +{ +	mDate = date; +} + +std::string LLTeleportHistoryFlatItem::getTimestamp() +{ +	const LLDate &date = mDate; +	std::string timestamp = ""; + +	LLDate now = LLDate::now(); +	S32 now_year, now_month, now_day, now_hour, now_min, now_sec; +	now.split(&now_year, &now_month, &now_day, &now_hour, &now_min, &now_sec); + +	const S32 seconds_in_day = 24 * 60 * 60; +	S32 seconds_today = now_hour * 60 * 60 + now_min * 60 + now_sec; +	S32 time_diff = (S32) now.secondsSinceEpoch() - (S32) date.secondsSinceEpoch(); + +	// Only show timestamp for today and yesterday +	if(time_diff < seconds_today + seconds_in_day) +	{ +		timestamp = "[" + LLTrans::getString("TimeHour12")+"]:[" +						+ LLTrans::getString("TimeMin")+"] ["+ LLTrans::getString("TimeAMPM")+"]"; +		LLSD substitution; +		substitution["datetime"] = (S32) date.secondsSinceEpoch(); +		LLStringUtil::format(timestamp, substitution); +	} + +	return timestamp; + +} +  void LLTeleportHistoryFlatItem::updateTitle()  {  	static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", LLColor4U(255, 255, 255)); @@ -190,6 +234,17 @@ void LLTeleportHistoryFlatItem::updateTitle()  		mHighlight);  } +void LLTeleportHistoryFlatItem::updateTimestamp() +{ +	static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", LLColor4U(255, 255, 255)); + +	LLTextUtil::textboxSetHighlightedVal( +		mTimeTextBox, +		LLStyle::Params().color(sFgColor), +		getTimestamp(), +		mHighlight); +} +  void LLTeleportHistoryFlatItem::onMouseEnter(S32 x, S32 y, MASK mask)  {  	getChildView("hovered_icon")->setVisible( true); @@ -248,9 +303,11 @@ LLTeleportHistoryFlatItemStorage::getFlatItemForPersistentItem (  		{  			item->setIndex(cur_item_index);  			item->setRegionName(persistent_item.mTitle); +			item->setDate(persistent_item.mDate);  			item->setHighlightedText(hl);  			item->setVisible(TRUE);  			item->updateTitle(); +			item->updateTimestamp();  		}  		else  		{ @@ -264,6 +321,7 @@ LLTeleportHistoryFlatItemStorage::getFlatItemForPersistentItem (  		item = new LLTeleportHistoryFlatItem(cur_item_index,  											 context_menu,  											 persistent_item.mTitle, +											 persistent_item.mDate,  											 hl);  		mItems.push_back(item->getItemHandle());  	} diff --git a/indra/newview/llplacesfolderview.cpp b/indra/newview/llplacesfolderview.cpp index 3caa93ae71..1cb013adc6 100755 --- a/indra/newview/llplacesfolderview.cpp +++ b/indra/newview/llplacesfolderview.cpp @@ -31,6 +31,7 @@  #include "llplacesinventorypanel.h"  #include "llpanellandmarks.h" +#include "llmenugl.h"  LLPlacesFolderView::LLPlacesFolderView(const LLFolderView::Params& p)      : LLFolderView(p) @@ -67,6 +68,16 @@ BOOL LLPlacesFolderView::handleRightMouseDown(S32 x, S32 y, MASK mask)      return LLFolderView::handleRightMouseDown(x, y, mask);  } +void LLPlacesFolderView::updateMenu() +{ +	LLFolderView::updateMenu(); +	LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get(); +	if (menu && menu->getVisible()) +	{ +		mParentLandmarksPanel->updateMenuVisibility(menu); +	} +} +  void LLPlacesFolderView::setupMenuHandle(LLInventoryType::EType asset_type, LLHandle<LLView> menu_handle)  {      mMenuHandlesByInventoryType[asset_type] = menu_handle; diff --git a/indra/newview/llplacesfolderview.h b/indra/newview/llplacesfolderview.h index 8c5be39b5e..65fe76007a 100755 --- a/indra/newview/llplacesfolderview.h +++ b/indra/newview/llplacesfolderview.h @@ -51,6 +51,8 @@ public:  	 */  	/*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask ); +	/*virtual*/ void updateMenu(); +  	void setupMenuHandle(LLInventoryType::EType asset_type, LLHandle<LLView> menu_handle);  	void setParentLandmarksPanel(LLLandmarksPanel* panel) diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp index 04934b13f1..2caf186b70 100755 --- a/indra/newview/llpreview.cpp +++ b/indra/newview/llpreview.cpp @@ -91,6 +91,7 @@ void LLPreview::setObjectID(const LLUUID& object_id)  	{  		loadAsset();  	} +	refreshFromItem();  }  void LLPreview::setItem( LLInventoryItem* item ) @@ -100,6 +101,7 @@ void LLPreview::setItem( LLInventoryItem* item )  	{  		loadAsset();  	} +	refreshFromItem();  }  const LLInventoryItem *LLPreview::getItem() const diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index e533be7f24..18bbf110f7 100755 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -192,11 +192,11 @@ public:  private:  	LLScriptEdCore* mEditorCore; -  	static LLFloaterScriptSearch*	sInstance;  protected:  	LLLineEditor*			mSearchBox; +	LLLineEditor*			mReplaceBox;          void onSearchBoxCommit();  }; @@ -205,6 +205,7 @@ LLFloaterScriptSearch* LLFloaterScriptSearch::sInstance = NULL;  LLFloaterScriptSearch::LLFloaterScriptSearch(LLScriptEdCore* editor_core)  :	LLFloater(LLSD()),  	mSearchBox(NULL), +	mReplaceBox(NULL),  	mEditorCore(editor_core)  {  	buildFromFile("floater_script_search.xml"); @@ -227,6 +228,7 @@ LLFloaterScriptSearch::LLFloaterScriptSearch(LLScriptEdCore* editor_core)  BOOL LLFloaterScriptSearch::postBuild()  { +	mReplaceBox = getChild<LLLineEditor>("replace_text");  	mSearchBox = getChild<LLLineEditor>("search_text");  	mSearchBox->setCommitCallback(boost::bind(&LLFloaterScriptSearch::onSearchBoxCommit, this));  	mSearchBox->setCommitOnFocusLost(FALSE); @@ -242,8 +244,12 @@ BOOL LLFloaterScriptSearch::postBuild()  //static   void LLFloaterScriptSearch::show(LLScriptEdCore* editor_core)  { +	LLSD::String search_text; +	LLSD::String replace_text;  	if (sInstance && sInstance->mEditorCore && sInstance->mEditorCore != editor_core)  	{ +		search_text=sInstance->mSearchBox->getValue().asString(); +		replace_text=sInstance->mReplaceBox->getValue().asString();  		sInstance->closeFloater();  		delete sInstance;  	} @@ -252,6 +258,8 @@ void LLFloaterScriptSearch::show(LLScriptEdCore* editor_core)  	{  		// sInstance will be assigned in the constructor.  		new LLFloaterScriptSearch(editor_core); +		sInstance->mSearchBox->setValue(search_text); +		sInstance->mReplaceBox->setValue(replace_text);  	}  	sInstance->openFloater(); @@ -272,7 +280,7 @@ void LLFloaterScriptSearch::onBtnSearch(void *userdata)  void LLFloaterScriptSearch::handleBtnSearch()  {  	LLCheckBoxCtrl* caseChk = getChild<LLCheckBoxCtrl>("case_text"); -	mEditorCore->mEditor->selectNext(getChild<LLUICtrl>("search_text")->getValue().asString(), caseChk->get()); +	mEditorCore->mEditor->selectNext(mSearchBox->getValue().asString(), caseChk->get());  }  // static  @@ -285,7 +293,7 @@ void LLFloaterScriptSearch::onBtnReplace(void *userdata)  void LLFloaterScriptSearch::handleBtnReplace()  {  	LLCheckBoxCtrl* caseChk = getChild<LLCheckBoxCtrl>("case_text"); -	mEditorCore->mEditor->replaceText(getChild<LLUICtrl>("search_text")->getValue().asString(), getChild<LLUICtrl>("replace_text")->getValue().asString(), caseChk->get()); +	mEditorCore->mEditor->replaceText(mSearchBox->getValue().asString(), mReplaceBox->getValue().asString(), caseChk->get());  }  // static  @@ -298,7 +306,7 @@ void LLFloaterScriptSearch::onBtnReplaceAll(void *userdata)  void LLFloaterScriptSearch::handleBtnReplaceAll()  {  	LLCheckBoxCtrl* caseChk = getChild<LLCheckBoxCtrl>("case_text"); -	mEditorCore->mEditor->replaceTextAll(getChild<LLUICtrl>("search_text")->getValue().asString(), getChild<LLUICtrl>("replace_text")->getValue().asString(), caseChk->get()); +	mEditorCore->mEditor->replaceTextAll(mSearchBox->getValue().asString(), mReplaceBox->getValue().asString(), caseChk->get());  }  bool LLFloaterScriptSearch::hasAccelerators() const @@ -329,7 +337,7 @@ void LLFloaterScriptSearch::onSearchBoxCommit()  	if (mEditorCore && mEditorCore->mEditor)  	{  		LLCheckBoxCtrl* caseChk = getChild<LLCheckBoxCtrl>("case_text"); -		mEditorCore->mEditor->selectNext(getChild<LLUICtrl>("search_text")->getValue().asString(), caseChk->get()); +		mEditorCore->mEditor->selectNext(mSearchBox->getValue().asString(), caseChk->get());  	}  } @@ -518,6 +526,10 @@ void LLScriptEdCore::initMenu()  	menuItem->setClickCallback(boost::bind(&LLTextEditor::selectAll, mEditor));  	menuItem->setEnableCallback(boost::bind(&LLTextEditor::canSelectAll, mEditor)); +	menuItem = getChild<LLMenuItemCallGL>("Deselect"); +	menuItem->setClickCallback(boost::bind(&LLTextEditor::deselect, mEditor)); +	menuItem->setEnableCallback(boost::bind(&LLTextEditor::canDeselect, mEditor)); +  	menuItem = getChild<LLMenuItemCallGL>("Search / Replace...");  	menuItem->setClickCallback(boost::bind(&LLFloaterScriptSearch::show, this)); @@ -1867,7 +1879,7 @@ void LLLiveLSLEditor::loadAsset()  			mIsModifiable = item && gAgent.allowOperation(PERM_MODIFY,   										item->getPermissions(),  				   						GP_OBJECT_MANIPULATE); -			 +  			// This is commented out, because we don't completely  			// handle script exports yet.  			/* diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp index 33d2d015ad..39ec6def91 100755 --- a/indra/newview/llpreviewsound.cpp +++ b/indra/newview/llpreviewsound.cpp @@ -94,6 +94,6 @@ void LLPreviewSound::auditionSound( void *userdata )  	if(item && gAudiop)  	{  		LLVector3d lpos_global = gAgent.getPositionGlobal(); -		gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_UI, lpos_global); +		gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_SFX, lpos_global);  	}  } diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 1ed48a978f..5c41c5ad97 100755 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -127,9 +127,28 @@ BOOL LLPreviewTexture::postBuild()  			getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);  		}  	} + +	// Fill in ratios list with common aspect ratio values +	mRatiosList.clear(); +	mRatiosList.push_back(LLTrans::getString("Unconstrained")); +	mRatiosList.push_back("1:1"); +	mRatiosList.push_back("4:3"); +	mRatiosList.push_back("10:7"); +	mRatiosList.push_back("3:2"); +	mRatiosList.push_back("16:10"); +	mRatiosList.push_back("16:9"); +	mRatiosList.push_back("2:1"); -	childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this); +	// Now fill combo box with provided list  	LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio"); +	combo->removeall(); + +	for (std::vector<std::string>::const_iterator it = mRatiosList.begin(); it != mRatiosList.end(); ++it) +	{ +		combo->add(*it); +	} + +	childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this);  	combo->setCurrentByIndex(0);  	return LLPreview::postBuild(); @@ -414,6 +433,13 @@ void LLPreviewTexture::updateDimensions()  	{  		return;  	} + +	if (mAssetStatus != PREVIEW_ASSET_LOADED) +	{ +		mAssetStatus = PREVIEW_ASSET_LOADED; +		// Asset has been fully loaded, adjust aspect ratio +		adjustAspectRatio(); +	}  	// Update the width/height display every time  	getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]",  llformat("%d", mImage->getFullWidth())); @@ -501,6 +527,46 @@ LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus()  	return mAssetStatus;  } +void LLPreviewTexture::adjustAspectRatio() +{ +	S32 w = mImage->getFullWidth(); +    S32 h = mImage->getFullHeight(); + +	// Determine aspect ratio of the image +	S32 tmp; +    while (h != 0) +    { +        tmp = w % h; +        w = h; +        h = tmp; +    } +	S32 divisor = w; +	S32 num = mImage->getFullWidth() / divisor; +	S32 denom = mImage->getFullHeight() / divisor; + +	if (setAspectRatio(num, denom)) +	{ +		// Select corresponding ratio entry in the combo list +		LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio"); +		if (combo) +		{ +			std::ostringstream ratio; +			ratio << num << ":" << denom; +			std::vector<std::string>::const_iterator found = std::find(mRatiosList.begin(), mRatiosList.end(), ratio.str()); +			if (found == mRatiosList.end()) +			{ +				combo->setCurrentByIndex(0); +			} +			else +			{ +				combo->setCurrentByIndex(found - mRatiosList.begin()); +			} +		} +	} + +	mUpdateDimensions = TRUE; +} +  void LLPreviewTexture::updateImageID()  {  	const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem()); diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h index cd16bacde2..97e74706cc 100755 --- a/indra/newview/llpreviewtexture.h +++ b/indra/newview/llpreviewtexture.h @@ -70,6 +70,7 @@ protected:  	/* virtual */ BOOL	postBuild();  	bool				setAspectRatio(const F32 width, const F32 height);  	static void			onAspectRatioCommit(LLUICtrl*,void* userdata); +	void				adjustAspectRatio();  private:  	void				updateImageID(); // set what image is being uploaded. @@ -95,5 +96,6 @@ private:  	F32 mAspectRatio;	  	LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;  +	std::vector<std::string>		mRatiosList;  };  #endif  // LL_LLPREVIEWTEXTURE_H diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 2e91ceee2e..1ce691f696 100755 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -710,13 +710,13 @@ void LLSidepanelInventory::clearSelections(bool clearMain, bool clearInbox)  		if (inv_panel)  		{ -			inv_panel->clearSelection(); +			inv_panel->getRootFolder()->clearSelection();  		}  	}  	if (clearInbox && mInboxEnabled && (mInventoryPanelInbox != NULL))  	{ -		mInventoryPanelInbox->clearSelection(); +		mInventoryPanelInbox->getRootFolder()->clearSelection();  	}  	updateVerbs(); diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index 7532ebfc57..ea8225a3ac 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -50,7 +50,6 @@  #include "llviewerstats.h"  #include "llvfile.h"  #include "llvfs.h" -#include "llwebsharing.h"  #include "llwindow.h"  #include "llworld.h" @@ -845,30 +844,3 @@ BOOL LLSnapshotLivePreview::saveLocal()  	}  	return success;  } - -void LLSnapshotLivePreview::saveWeb() -{ -	// *FIX: Will break if the window closes because of CloseSnapshotOnKeep! -	// Needs to pass on ownership of the image. -	LLImageJPEG* jpg = dynamic_cast<LLImageJPEG*>(mFormattedImage.get()); -	if(!jpg) -	{ -		llwarns << "Formatted image not a JPEG" << llendl; -		return; -	} - -	LLSD metadata; -	metadata["description"] = getChild<LLLineEditor>("description")->getText(); - -	LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(gAgentCamera.getCameraPositionGlobal(), -		boost::bind(&LLSnapshotLivePreview::regionNameCallback, this, jpg, metadata, _1, _2, _3, _4)); - -	gViewerWindow->playSnapshotAnimAndSound(); -} - -void LLSnapshotLivePreview::regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z) -{ -	metadata["slurl"] = LLSLURL(name, LLVector3d(x, y, z)).getSLURLString(); - -	LLWebSharing::instance().shareSnapshot(snapshot, metadata); -} diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h index fe3d257b02..0f09ef214a 100644 --- a/indra/newview/llsnapshotlivepreview.h +++ b/indra/newview/llsnapshotlivepreview.h @@ -96,7 +96,6 @@ public:  	void setSnapshotQuality(S32 quality);  	void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; }  	void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f); -	void saveWeb();  	void saveTexture();  	BOOL saveLocal(); @@ -113,9 +112,6 @@ public:  	// Returns TRUE when snapshot generated, FALSE otherwise.  	static BOOL onIdle( void* snapshot_preview ); -	// callback for region name resolve -	void regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z); -  private:  	LLColor4					mColor;  	LLPointer<LLViewerTexture>	mViewerImage[2]; //used to represent the scene when the frame is frozen. diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 2c83f6d0b7..69ba51b10a 100755 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -78,6 +78,7 @@ U32 LLSpatialGroup::sNodeCount = 0;  std::set<GLuint> LLSpatialGroup::sPendingQueries;  U32 gOctreeMaxCapacity; +F32 gOctreeMinSize;  BOOL LLSpatialGroup::sNoDelete = FALSE; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index d5f8a1e46e..a5fdb72f9b 100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -2822,6 +2822,7 @@ void LLStartUp::initNameCache()  	// capabilities for display name lookup  	LLAvatarNameCache::initClass(false,gSavedSettings.getBOOL("UsePeopleAPI"));  	LLAvatarNameCache::setUseDisplayNames(gSavedSettings.getBOOL("UseDisplayNames")); +	LLAvatarNameCache::setUseUsernames(gSavedSettings.getBOOL("NameTagShowUsernames"));  }  void LLStartUp::cleanupNameCache() diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index ea837c9127..99e41cf39a 100755 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -242,7 +242,7 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id)  		LLUUID item_id = findItemID(mImageAssetID, FALSE);  		if (item_id.isNull())  		{ -			mInventoryPanel->clearSelection(); +			mInventoryPanel->getRootFolder()->clearSelection();  		}  		else  		{ diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 1a137f7129..ece30d2d0a 100755 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1584,13 +1584,22 @@ static void give_inventory_cb(const LLSD& notification, const LLSD& response)  	const LLUUID& session_id = payload["session_id"];  	const LLUUID& agent_id = payload["agent_id"];  	LLViewerInventoryItem * inv_item =  gInventory.getItem(payload["item_id"]); -	if (NULL == inv_item) +	LLViewerInventoryCategory * inv_cat =  gInventory.getCategory(payload["item_id"]); +	if (NULL == inv_item && NULL == inv_cat)  	{ -		llassert(NULL != inv_item); +		llassert( FALSE );  		return;  	} - -	if (LLGiveInventory::doGiveInventoryItem(agent_id, inv_item, session_id)) +	bool successfully_shared; +	if (inv_item) +	{ +		successfully_shared = LLGiveInventory::doGiveInventoryItem(agent_id, inv_item, session_id); +	} +	else +	{ +		successfully_shared = LLGiveInventory::doGiveInventoryCategory(agent_id, inv_cat, session_id); +	} +	if (successfully_shared)  	{  		if ("avatarpicker" == payload["d&d_dest"].asString())  		{ @@ -1600,8 +1609,8 @@ static void give_inventory_cb(const LLSD& notification, const LLSD& response)  	}  } -static void show_item_sharing_confirmation(const std::string name, -					   LLViewerInventoryItem* inv_item, +static void show_object_sharing_confirmation(const std::string name, +					   LLInventoryObject* inv_item,  					   const LLSD& dest,  					   const LLUUID& dest_agent,  					   const LLUUID& session_id = LLUUID::null) @@ -1611,7 +1620,6 @@ static void show_item_sharing_confirmation(const std::string name,  		llassert(NULL != inv_item);  		return;  	} -  	LLSD substitutions;  	substitutions["RESIDENTS"] = name;  	substitutions["ITEMS"] = inv_item->getName(); @@ -1625,15 +1633,15 @@ static void show_item_sharing_confirmation(const std::string name,  static void get_name_cb(const LLUUID& id,  						const std::string& full_name, -						LLViewerInventoryItem* inv_item, +						LLInventoryObject* inv_obj,  						const LLSD& dest,  						const LLUUID& dest_agent)  { -	show_item_sharing_confirmation(full_name, -								   inv_item, -								   dest, -								   id, -								   LLUUID::null); +	show_object_sharing_confirmation(full_name, +								     inv_obj, +								     dest, +						  		     id, +								     LLUUID::null);  }  // function used as drag-and-drop handler for simple agent give inventory requests @@ -1659,10 +1667,11 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_  	case DAD_GESTURE:  	case DAD_CALLINGCARD:  	case DAD_MESH: +	case DAD_CATEGORY:  	{ -		LLViewerInventoryItem* inv_item = (LLViewerInventoryItem*)cargo_data; -		if(gInventory.getItem(inv_item->getUUID()) -			&& LLGiveInventory::isInventoryGiveAcceptable(inv_item)) +		LLInventoryObject* inv_obj = (LLInventoryObject*)cargo_data; +		if(gInventory.getCategory(inv_obj->getUUID()) || (gInventory.getItem(inv_obj->getUUID()) +			&& LLGiveInventory::isInventoryGiveAcceptable(dynamic_cast<LLInventoryItem*>(inv_obj))))  		{  			// *TODO: get multiple object transfers working  			*accept = ACCEPT_YES_COPY_SINGLE; @@ -1679,40 +1688,18 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_  					// Otherwise set up a callback to show the dialog when the name arrives.  					if (gCacheName->getFullName(dest_agent, fullname))  					{ -						show_item_sharing_confirmation(fullname, inv_item, dest, dest_agent, LLUUID::null); +						show_object_sharing_confirmation(fullname, inv_obj, dest, dest_agent, LLUUID::null);  					}  					else  					{ -						gCacheName->get(dest_agent, false, boost::bind(&get_name_cb, _1, _2, inv_item, dest, dest_agent)); +						gCacheName->get(dest_agent, false, boost::bind(&get_name_cb, _1, _2, inv_obj, dest, dest_agent));  					}  					return true;  				}  				// If an IM session with destination agent is found item offer will be logged in this session. -				show_item_sharing_confirmation(session->mName, inv_item, dest, dest_agent, session_id); -			} -		} -		else -		{ -			// It's not in the user's inventory (it's probably -			// in an object's contents), so disallow dragging -			// it here.  You can't give something you don't -			// yet have. -			*accept = ACCEPT_NO; -		} -		break; -	} -	case DAD_CATEGORY: -	{ -		LLViewerInventoryCategory* inv_cat = (LLViewerInventoryCategory*)cargo_data; -		if( gInventory.getCategory( inv_cat->getUUID() ) ) -		{ -			// *TODO: get multiple object transfers working -			*accept = ACCEPT_YES_COPY_SINGLE; -			if(drop) -			{ -				LLGiveInventory::doGiveInventoryCategory(dest_agent, inv_cat, session_id); +				show_object_sharing_confirmation(session->mName, inv_obj, dest, dest_agent, session_id);  			}  		}  		else diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 1c362c18e0..a09a2739e8 100755 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -1671,17 +1671,7 @@ BOOL LLToolPie::handleRightClickPick()  			{  				name = node->mName;  			} -			std::string mute_msg; -			if (LLMuteList::getInstance()->isMuted(object->getID(), name)) -			{ -				mute_msg = LLTrans::getString("UnmuteObject"); -			} -			else -			{ -				mute_msg = LLTrans::getString("MuteObject2"); -			} -			 -			gMenuHolder->getChild<LLUICtrl>("Object Mute")->setValue(mute_msg); +  			gMenuObject->show(x, y);  			showVisualContextMenuEffect(); diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 744ec4de2b..002a337e04 100755 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -368,6 +368,7 @@ static bool handleRepartition(const LLSD&)  	if (gPipeline.isInit())  	{  		gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity"); +		gOctreeMinSize = gSavedSettings.getF32("OctreeMinimumNodeSize");  		gObjectList.repartitionObjects();  	}  	return true; diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 21fb8d519b..2c132740fe 100755 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -67,7 +67,6 @@  #include "llvoavatarself.h"  #include "llvovolume.h"  #include "llwebprofile.h" -#include "llwebsharing.h"	// For LLWebSharing::setOpenIDCookie(), *TODO: find a better way to do this!  #include "llwindow.h"  #include "llvieweraudio.h" @@ -1426,9 +1425,6 @@ void LLViewerMedia::setOpenIDCookie()  		getCookieStore()->setCookiesFromHost(sOpenIDCookie, authority.substr(host_start, host_end - host_start)); -		// *HACK: Doing this here is nasty, find a better way. -		LLWebSharing::instance().setOpenIDCookie(sOpenIDCookie); -  		// Do a web profile get so we can store the cookie   		LLSD headers = LLSD::emptyMap();  		headers["Accept"] = "*/*"; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index c7c8da27f3..ab9551ad17 100755 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -7825,7 +7825,7 @@ void handle_report_bug(const LLSD& param)  	replace["[ENVIRONMENT]"] = LLURI::escape(LLAppViewer::instance()->getViewerInfoString());  	LLSLURL location_url;  	LLAgentUI::buildSLURL(location_url); -	replace["[LOCATION]"] = location_url.getSLURLString(); +	replace["[LOCATION]"] = LLURI::escape(location_url.getSLURLString());  	LLUIString file_bug_url = gSavedSettings.getString("ReportBugURL");  	file_bug_url.setArgs(replace); @@ -8235,6 +8235,45 @@ class LLWorldEnvSettings : public view_listener_t  	}  }; +class LLWorldEnableEnvSettings : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		bool result = false; +		std::string tod = userdata.asString(); + +		if (tod == "region") +		{ +			return LLEnvManagerNew::instance().getUseRegionSettings(); +		} + +		if (LLEnvManagerNew::instance().getUseFixedSky()) +		{ +			if (tod == "sunrise") +			{ +				result = (LLEnvManagerNew::instance().getSkyPresetName() == "Sunrise"); +			} +			else if (tod == "noon") +			{ +				result = (LLEnvManagerNew::instance().getSkyPresetName() == "Midday"); +			} +			else if (tod == "sunset") +			{ +				result = (LLEnvManagerNew::instance().getSkyPresetName() == "Sunset"); +			} +			else if (tod == "midnight") +			{ +				result = (LLEnvManagerNew::instance().getSkyPresetName() == "Midnight"); +			} +			else +			{ +				llwarns << "Unknown item" << llendl; +			} +		} +		return result; +	} +}; +  class LLWorldEnvPreset : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -8573,6 +8612,7 @@ void initialize_menus()  	view_listener_t::addMenu(new LLWorldCheckAlwaysRun(), "World.CheckAlwaysRun");  	view_listener_t::addMenu(new LLWorldEnvSettings(), "World.EnvSettings"); +	view_listener_t::addMenu(new LLWorldEnableEnvSettings(), "World.EnableEnvSettings");  	view_listener_t::addMenu(new LLWorldEnvPreset(), "World.EnvPreset");  	view_listener_t::addMenu(new LLWorldEnableEnvPreset(), "World.EnableEnvPreset");  	view_listener_t::addMenu(new LLWorldPostProcess(), "World.PostProcess"); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index be78603e2d..4c95dcd6a2 100755 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -494,7 +494,9 @@ class LLFileEnableCloseAllWindows : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		bool open_children = gFloaterView->allChildrenClosed() && !LLFloaterSnapshot::getInstance()->isInVisibleChain(); +		LLFloaterSnapshot* floater_snapshot = LLFloaterSnapshot::findInstance(); +		bool is_floater_snapshot_opened = floater_snapshot && floater_snapshot->isInVisibleChain(); +		bool open_children = gFloaterView->allChildrenClosed() && !is_floater_snapshot_opened;  		return !open_children;  	}  }; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 160f924f3f..624f62e37e 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3527,6 +3527,12 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  	}  	else  	{ +		// make sure that we don't have an empty or all-whitespace name +		LLStringUtil::trim(from_name); +		if (from_name.empty()) +		{ +			from_name = LLTrans::getString("Unnamed"); +		}  		chat.mFromName = from_name;  	} diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 8f8bfa23c1..a8716985cb 100755 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -115,7 +115,7 @@ public:  	void setAllowSetHome(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_SET_HOME, b); }  	void setResetHomeOnTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_RESET_HOME_ON_TELEPORT, b); }  	void setSunFixed(BOOL b) { setRegionFlag(REGION_FLAGS_SUN_FIXED, b); } -	void setBlockFly(BOOL b) { setRegionFlag(REGION_FLAGS_BLOCK_FLY, b); } +	//void setBlockFly(BOOL b) { setRegionFlag(REGION_FLAGS_BLOCK_FLY, b); }		Never used  	void setAllowDirectTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT, b); } diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 10101a4b9b..78db136427 100755 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -40,7 +40,7 @@  #include <list>  #define MIN_VIDEO_RAM_IN_MEGA_BYTES    32 -#define MAX_VIDEO_RAM_IN_MEGA_BYTES    512 // 512MB max for performance reasons. +#define MAX_VIDEO_RAM_IN_MEGA_BYTES    4096  class LLImageGL ;  class LLImageRaw; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 783d1f2202..26f32941bf 100755 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1270,7 +1270,7 @@ S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended, float mem_m  		//  - it's going to be swapping constantly regardless  		S32 max_vram = gGLManager.mVRAM; -		if(gGLManager.mIsATI) +		if(!get_recommended && gGLManager.mIsATI)  		{  			//shrink the availabe vram for ATI cards because some of them do not handel texture swapping well.  			max_vram = (S32)(max_vram * 0.75f);   @@ -1285,15 +1285,15 @@ S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended, float mem_m  	{  		if (!get_recommended)  		{ -			max_texmem = 512; +			max_texmem = 2048;  		}  		else if (gSavedSettings.getBOOL("NoHardwareProbe")) //did not do hardware detection at startup  		{ -			max_texmem = 512; +			max_texmem = 2048;  		}  		else  		{ -			max_texmem = 128; +			max_texmem = 512;  		}  		llwarns << "VRAM amount not detected, defaulting to " << max_texmem << " MB" << llendl; @@ -1301,10 +1301,7 @@ S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended, float mem_m  	S32 system_ram = (S32)BYTES_TO_MEGA_BYTES(gSysMemory.getPhysicalMemoryClamped()); // In MB  	//llinfos << "*** DETECTED " << system_ram << " MB of system memory." << llendl; -	if (get_recommended) -		max_texmem = llmin(max_texmem, (S32)(system_ram/2)); -	else -		max_texmem = llmin(max_texmem, (S32)(system_ram)); +	max_texmem = llmin(max_texmem, (S32)(system_ram));      // limit the texture memory to a multiple of the default if we've found some cards to behave poorly otherwise  	max_texmem = llmin(max_texmem, (S32) (mem_multiplier * (F32) max_texmem)); @@ -1334,7 +1331,7 @@ void LLViewerTextureList::updateMaxResidentTexMem(S32 mem)  	mem = llclamp(mem, getMinVideoRamSetting(), getMaxVideoRamSetting(false, mem_multiplier));  	if (mem != cur_mem)  	{ -		gSavedSettings.setS32("TextureMemory", mem); +		gSavedSettings.setS32("TextureMemory", mem/3);  		return; //listener will re-enter this function  	} diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 3193a2955b..be4af23d07 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1059,7 +1059,7 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window,  LLCoordGL pos, MASK  	// *HACK: this should be rolled into the composite tool logic, not  	// hardcoded at the top level. -	if (CAMERA_MODE_CUSTOMIZE_AVATAR != gAgentCamera.getCameraMode() && LLToolMgr::getInstance()->getCurrentTool() != LLToolPie::getInstance()) +	if (CAMERA_MODE_CUSTOMIZE_AVATAR != gAgentCamera.getCameraMode() && LLToolMgr::getInstance()->getCurrentTool() != LLToolPie::getInstance() && gAgent.isInitialized())  	{  		// If the current tool didn't process the click, we should show  		// the pie menu.  This can be done by passing the event to the pie diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index c233221e5f..3d41e248de 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1288,9 +1288,9 @@ BOOL LLVOVolume::calcLOD()  	if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_LOD_INFO) &&  		mDrawable->getFace(0))  	{ -		//setDebugText(llformat("%.2f:%.2f, %d", debug_distance, radius, cur_detail)); +		//setDebugText(llformat("%.2f:%.2f, %d", mDrawable->mDistanceWRTCamera, radius, cur_detail)); -		//setDebugText(llformat("%d", mDrawable->getFace(0)->getTextureIndex())); +		setDebugText(llformat("%d", mDrawable->getFace(0)->getTextureIndex()));  	}  	if (cur_detail != mLOD) diff --git a/indra/newview/llwebsharing.cpp b/indra/newview/llwebsharing.cpp deleted file mode 100755 index 3a80051b9b..0000000000 --- a/indra/newview/llwebsharing.cpp +++ /dev/null @@ -1,603 +0,0 @@ -/**  - * @file llwebsharing.cpp - * @author Aimee - * @brief Web Snapshot Sharing - * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llwebsharing.h" - -#include "llagentui.h" -#include "llbufferstream.h" -#include "llhttpclient.h" -#include "llhttpstatuscodes.h" -#include "llsdserialize.h" -#include "llsdutil.h" -#include "llurl.h" -#include "llviewercontrol.h" - -#include <boost/regex.hpp> -#include <boost/algorithm/string/replace.hpp> - - - -/////////////////////////////////////////////////////////////////////////////// -// -class LLWebSharingConfigResponder : public LLHTTPClient::Responder -{ -	LOG_CLASS(LLWebSharingConfigResponder); -public: -	/// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response. -	virtual void completedRaw(U32 status, const std::string& reason, -							  const LLChannelDescriptors& channels, -							  const LLIOPipe::buffer_ptr_t& buffer) -	{ -		LLSD content; -		LLBufferStream istr(channels, buffer.get()); -		LLPointer<LLSDParser> parser = new LLSDNotationParser(); - -		if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE) -		{ -			LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL; -		} -		else -		{ -			completed(status, reason, content); -		} -	} - -	virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) -	{ -		LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL; -	} - -	virtual void result(const LLSD& content) -	{ -		LLWebSharing::instance().receiveConfig(content); -	} -}; - - - -/////////////////////////////////////////////////////////////////////////////// -// -class LLWebSharingOpenIDAuthResponder : public LLHTTPClient::Responder -{ -	LOG_CLASS(LLWebSharingOpenIDAuthResponder); -public: -	/* virtual */ void completedHeader(U32 status, const std::string& reason, const LLSD& content) -	{ -		completed(status, reason, content); -	} - -	/* virtual */ void completedRaw(U32 status, const std::string& reason, -									const LLChannelDescriptors& channels, -									const LLIOPipe::buffer_ptr_t& buffer) -	{ -		/// Left empty to override the default LLSD parsing behaviour. -	} - -	virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) -	{ -		if (HTTP_UNAUTHORIZED == status) -		{ -			LL_WARNS("WebSharing") << "AU account not authenticated." << LL_ENDL; -			// *TODO: No account found on AU, so start the account creation process here. -		} -		else -		{ -			LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL; -			LLWebSharing::instance().retryOpenIDAuth(); -		} - -	} - -	virtual void result(const LLSD& content) -	{ -		if (content.has("set-cookie")) -		{ -			// OpenID request succeeded and returned a session cookie. -			LLWebSharing::instance().receiveSessionCookie(content["set-cookie"].asString()); -		} -	} -}; - - - -/////////////////////////////////////////////////////////////////////////////// -// -class LLWebSharingSecurityTokenResponder : public LLHTTPClient::Responder -{ -	LOG_CLASS(LLWebSharingSecurityTokenResponder); -public: -	/// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response. -	virtual void completedRaw(U32 status, const std::string& reason, -							  const LLChannelDescriptors& channels, -							  const LLIOPipe::buffer_ptr_t& buffer) -	{ -		LLSD content; -		LLBufferStream istr(channels, buffer.get()); -		LLPointer<LLSDParser> parser = new LLSDNotationParser(); - -		if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE) -		{ -			LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL; -			LLWebSharing::instance().retryOpenIDAuth(); -		} -		else -		{ -			completed(status, reason, content); -		} -	} - -	virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) -	{ -		LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL; -		LLWebSharing::instance().retryOpenIDAuth(); -	} - -	virtual void result(const LLSD& content) -	{ -		if (content[0].has("st") && content[0].has("expires")) -		{ -			const std::string& token   = content[0]["st"].asString(); -			const std::string& expires = content[0]["expires"].asString(); -			if (LLWebSharing::instance().receiveSecurityToken(token, expires)) -			{ -				// Sucessfully received a valid security token. -				return; -			} -		} -		else -		{ -			LL_WARNS("WebSharing") << "No security token received." << LL_ENDL; -		} - -		LLWebSharing::instance().retryOpenIDAuth(); -	} -}; - - - -/////////////////////////////////////////////////////////////////////////////// -// -class LLWebSharingUploadResponder : public LLHTTPClient::Responder -{ -	LOG_CLASS(LLWebSharingUploadResponder); -public: -	/// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response. -	virtual void completedRaw(U32 status, const std::string& reason, -							  const LLChannelDescriptors& channels, -							  const LLIOPipe::buffer_ptr_t& buffer) -	{ -/* -		 // Dump the body, for debugging. - -		 LLBufferStream istr1(channels, buffer.get()); -		 std::ostringstream ostr; -		 std::string body; - -		 while (istr1.good()) -		 { -			char buf[1024]; -			istr1.read(buf, sizeof(buf)); -			body.append(buf, istr1.gcount()); -		 } -		 LL_DEBUGS("WebSharing") << body << LL_ENDL; -*/ -		LLSD content; -		LLBufferStream istr(channels, buffer.get()); -		LLPointer<LLSDParser> parser = new LLSDNotationParser(); - -		if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE) -		{ -			LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL; -		} -		else -		{ -			completed(status, reason, content); -		} -	} - -	virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) -	{ -		LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL; -	} - -	virtual void result(const LLSD& content) -	{ -		if (content[0].has("result") && content[0].has("id") && -			content[0]["id"].asString() == "newMediaItem") -		{ -			// *TODO: Upload successful, continue from here to post metadata and create AU activity. -		} -		else -		{ -			LL_WARNS("WebSharing") << "Error [" << content[0]["code"].asString() -								   << "]: " << content[0]["message"].asString() << LL_ENDL; -		} -	} -}; - - - -/////////////////////////////////////////////////////////////////////////////// -// -LLWebSharing::LLWebSharing() -:	mConfig(), -	mSecurityToken(LLSD::emptyMap()), -	mEnabled(false), -	mRetries(0), -	mImage(NULL), -	mMetadata(LLSD::emptyMap()) -{ -} - -void LLWebSharing::init() -{ -	if (!mEnabled) -	{ -		sendConfigRequest(); -	} -} - -bool LLWebSharing::shareSnapshot(LLImageJPEG* snapshot, LLSD& metadata) -{ -	LL_INFOS("WebSharing") << metadata << LL_ENDL; - -	if (mImage) -	{ -		// *TODO: Handle this possibility properly, queue them up? -		LL_WARNS("WebSharing") << "Snapshot upload already in progress." << LL_ENDL; -		return false; -	} - -	mImage = snapshot; -	mMetadata = metadata; - -	// *TODO: Check whether we have a valid security token already and re-use it. -	sendOpenIDAuthRequest(); -	return true; -} - -bool LLWebSharing::setOpenIDCookie(const std::string& cookie) -{ -	LL_DEBUGS("WebSharing") << "Setting OpenID cookie " << cookie << LL_ENDL; -	mOpenIDCookie = cookie; -	return validateConfig(); -} - -bool LLWebSharing::receiveConfig(const LLSD& config) -{ -	LL_DEBUGS("WebSharing") << "Received config data: " << config << LL_ENDL; -	mConfig = config; -	return validateConfig(); -} - -bool LLWebSharing::receiveSessionCookie(const std::string& cookie) -{ -	LL_DEBUGS("WebSharing") << "Received AU session cookie: " << cookie << LL_ENDL; -	mSessionCookie = cookie; - -	// Fetch a security token using the new session cookie. -	LLWebSharing::instance().sendSecurityTokenRequest(); - -	return (!mSessionCookie.empty()); -} - -bool LLWebSharing::receiveSecurityToken(const std::string& token, const std::string& expires) -{ -	mSecurityToken["st"] = token; -	mSecurityToken["expires"] = LLDate(expires); - -	if (!securityTokenIsValid(mSecurityToken)) -	{ -		LL_WARNS("WebSharing") << "Invalid security token received: \"" << token << "\" Expires: " << expires << LL_ENDL; -		return false; -	} - -	LL_DEBUGS("WebSharing") << "Received security token: \"" << token << "\" Expires: " << expires << LL_ENDL; -	mRetries = 0; - -	// Continue the upload process now that we have a security token. -	sendUploadRequest(); - -	return true; -} - -void LLWebSharing::sendConfigRequest() -{ -	std::string config_url = gSavedSettings.getString("SnapshotConfigURL"); -	LL_DEBUGS("WebSharing") << "Requesting Snapshot Sharing config data from: " << config_url << LL_ENDL; - -	LLSD headers = LLSD::emptyMap(); -	headers["Accept"] = "application/json"; - -	LLHTTPClient::get(config_url, new LLWebSharingConfigResponder(), headers); -} - -void LLWebSharing::sendOpenIDAuthRequest() -{ -	std::string auth_url = mConfig["openIdAuthUrl"]; -	LL_DEBUGS("WebSharing") << "Starting OpenID Auth: " << auth_url << LL_ENDL; - -	LLSD headers = LLSD::emptyMap(); -	headers["Cookie"] = mOpenIDCookie; -	headers["Accept"] = "*/*"; - -	// Send request, successful login will trigger fetching a security token. -	LLHTTPClient::get(auth_url, new LLWebSharingOpenIDAuthResponder(), headers); -} - -bool LLWebSharing::retryOpenIDAuth() -{ -	if (mRetries++ >= MAX_AUTH_RETRIES) -	{ -		LL_WARNS("WebSharing") << "Exceeded maximum number of authorization attempts, aborting." << LL_ENDL; -		mRetries = 0; -		return false; -	} - -	LL_WARNS("WebSharing") << "Authorization failed, retrying (" << mRetries << "/" << MAX_AUTH_RETRIES << ")" << LL_ENDL; -	sendOpenIDAuthRequest(); -	return true; -} - -void LLWebSharing::sendSecurityTokenRequest() -{ -	std::string token_url = mConfig["securityTokenUrl"]; -	LL_DEBUGS("WebSharing") << "Fetching security token from: " << token_url << LL_ENDL; - -	LLSD headers = LLSD::emptyMap(); -	headers["Cookie"] = mSessionCookie; - -	headers["Accept"] = "application/json"; -	headers["Content-Type"] = "application/json"; - -	std::ostringstream body; -	body << "{ \"gadgets\": [{ \"url\":\"" -		 << mConfig["gadgetSpecUrl"].asString() -		 << "\" }] }"; - -	// postRaw() takes ownership of the buffer and releases it later. -	size_t size = body.str().size(); -	U8 *data = new U8[size]; -	memcpy(data, body.str().data(), size); - -	// Send request, receiving a valid token will trigger snapshot upload. -	LLHTTPClient::postRaw(token_url, data, size, new LLWebSharingSecurityTokenResponder(), headers); -} - -void LLWebSharing::sendUploadRequest() -{ -	LLUriTemplate upload_template(mConfig["openSocialRpcUrlTemplate"].asString()); -	std::string upload_url(upload_template.buildURI(mSecurityToken)); - -	LL_DEBUGS("WebSharing") << "Posting upload to: " << upload_url << LL_ENDL; - -	static const std::string BOUNDARY("------------abcdef012345xyZ"); - -	LLSD headers = LLSD::emptyMap(); -	headers["Cookie"] = mSessionCookie; - -	headers["Accept"] = "application/json"; -	headers["Content-Type"] = "multipart/form-data; boundary=" + BOUNDARY; - -	std::ostringstream body; -	body << "--" << BOUNDARY << "\r\n" -		 << "Content-Disposition: form-data; name=\"request\"\r\n\r\n" -		 << "[{" -		 <<	  "\"method\":\"mediaItems.create\"," -		 <<	  "\"params\": {" -		 <<	    "\"userId\":[\"@me\"]," -		 <<	    "\"groupId\":\"@self\"," -		 <<	    "\"mediaItem\": {" -		 <<	      "\"mimeType\":\"image/jpeg\"," -		 <<	      "\"type\":\"image\"," -		 <<       "\"url\":\"@field:image1\"" -		 <<	    "}" -		 <<	  "}," -		 <<	  "\"id\":\"newMediaItem\"" -		 <<	"}]" -		 <<	"--" << BOUNDARY << "\r\n" -		 <<	"Content-Disposition: form-data; name=\"image1\"\r\n\r\n"; - -	// Insert the image data. -	// *FIX: Treating this as a string will probably screw it up ... -	U8* image_data = mImage->getData(); -	for (S32 i = 0; i < mImage->getDataSize(); ++i) -	{ -		body << image_data[i]; -	} - -	body <<	"\r\n--" << BOUNDARY << "--\r\n"; - -	// postRaw() takes ownership of the buffer and releases it later. -	size_t size = body.str().size(); -	U8 *data = new U8[size]; -	memcpy(data, body.str().data(), size); - -	// Send request, successful upload will trigger posting metadata. -	LLHTTPClient::postRaw(upload_url, data, size, new LLWebSharingUploadResponder(), headers); -} - -bool LLWebSharing::validateConfig() -{ -	// Check the OpenID Cookie has been set. -	if (mOpenIDCookie.empty()) -	{ -		mEnabled = false; -		return mEnabled; -	} - -	if (!mConfig.isMap()) -	{ -		mEnabled = false; -		return mEnabled; -	} - -	// Template to match the received config against. -	LLSD required(LLSD::emptyMap()); -	required["gadgetSpecUrl"] = ""; -	required["loginTokenUrl"] = ""; -	required["openIdAuthUrl"] = ""; -	required["photoPageUrlTemplate"] = ""; -	required["openSocialRpcUrlTemplate"] = ""; -	required["securityTokenUrl"] = ""; -	required["tokenBasedLoginUrlTemplate"] = ""; -	required["viewerIdUrl"] = ""; - -	std::string mismatch(llsd_matches(required, mConfig)); -	if (!mismatch.empty()) -	{ -		LL_WARNS("WebSharing") << "Malformed config data response: " << mismatch << LL_ENDL; -		mEnabled = false; -		return mEnabled; -	} - -	mEnabled = true; -	return mEnabled; -} - -// static -bool LLWebSharing::securityTokenIsValid(LLSD& token) -{ -	return (token.has("st") && -			token.has("expires") && -			(token["st"].asString() != "") && -			(token["expires"].asDate() > LLDate::now())); -} - - - -/////////////////////////////////////////////////////////////////////////////// -// -LLUriTemplate::LLUriTemplate(const std::string& uri_template) -	: -	mTemplate(uri_template) -{ -} - -std::string LLUriTemplate::buildURI(const LLSD& vars) -{ -	// *TODO: Separate parsing the template from building the URI. -	// Parsing only needs to happen on construction/assignnment. - -	static const std::string VAR_NAME_REGEX("[[:alpha:]][[:alnum:]\\._-]*"); -	// Capture var name with and without surrounding {} -	static const std::string VAR_REGEX("\\{(" + VAR_NAME_REGEX + ")\\}"); -	// Capture delimiter and comma separated list of var names. -	static const std::string JOIN_REGEX("\\{-join\\|(&)\\|(" + VAR_NAME_REGEX + "(?:," + VAR_NAME_REGEX + ")*)\\}"); - -	std::string uri = mTemplate; -	boost::smatch results; - -	// Validate and expand join operators : {-join|&|var1,var2,...} - -	boost::regex join_regex(JOIN_REGEX); - -	while (boost::regex_search(uri, results, join_regex)) -	{ -		// Extract the list of var names from the results. -		std::string delim = results[1].str(); -		std::string var_list = results[2].str(); - -		// Expand the list of vars into a query string with their values -		std::string query = expandJoin(delim, var_list, vars); - -		// Substitute the query string into the template. -		uri = boost::regex_replace(uri, join_regex, query, boost::format_first_only); -	} - -	// Expand vars : {var1} - -	boost::regex var_regex(VAR_REGEX); - -	std::set<std::string> var_names; -	std::string::const_iterator start = uri.begin(); -	std::string::const_iterator end = uri.end(); - -	// Extract the var names used. -	while (boost::regex_search(start, end, results, var_regex)) -	{ -		var_names.insert(results[1].str()); -		start = results[0].second; -	} - -	// Replace each var with its value. -	for (std::set<std::string>::const_iterator it = var_names.begin(); it != var_names.end(); ++it) -	{ -		std::string var = *it; -		if (vars.has(var)) -		{ -			boost::replace_all(uri, "{" + var + "}", vars[var].asString()); -		} -	} - -	return uri; -} - -std::string LLUriTemplate::expandJoin(const std::string& delim, const std::string& var_list, const LLSD& vars) -{ -	std::ostringstream query; - -	typedef boost::tokenizer<boost::char_separator<char> > tokenizer; -	boost::char_separator<char> sep(","); -	tokenizer var_names(var_list, sep); -	tokenizer::const_iterator it = var_names.begin(); - -	// First var does not need a delimiter -	if (it != var_names.end()) -	{ -		const std::string& name = *it; -		if (vars.has(name)) -		{ -			// URL encode the value before appending the name=value pair. -			query << name << "=" << escapeURL(vars[name].asString()); -		} -	} - -	for (++it; it != var_names.end(); ++it) -	{ -		const std::string& name = *it; -		if (vars.has(name)) -		{ -			// URL encode the value before appending the name=value pair. -			query << delim << name << "=" << escapeURL(vars[name].asString()); -		} -	} - -	return query.str(); -} - -// static -std::string LLUriTemplate::escapeURL(const std::string& unescaped) -{ -	char* escaped = curl_escape(unescaped.c_str(), unescaped.size()); -	std::string result = escaped; -	curl_free(escaped); -	return result; -} - diff --git a/indra/newview/llwebsharing.h b/indra/newview/llwebsharing.h deleted file mode 100755 index ad9c99c224..0000000000 --- a/indra/newview/llwebsharing.h +++ /dev/null @@ -1,224 +0,0 @@ -/**  - * @file llwebsharing.h - * @author Aimee - * @brief Web Snapshot Sharing - * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#ifndef LL_LLWEBSHARING_H -#define LL_LLWEBSHARING_H - -#include "llimagejpeg.h" -#include "llsingleton.h" - - - -/** - * @class LLWebSharing - * - * Manages authentication to, and interaction with, a web service allowing the - * upload of snapshot images taken within the viewer, using OpenID and the - * OpenSocial APIs. - * http://www.opensocial.org/Technical-Resources/opensocial-spec-v09/RPC-Protocol.html - */ -class LLWebSharing : public LLSingleton<LLWebSharing> -{ -	LOG_CLASS(LLWebSharing); -public: -	/* -	 * Performs initial setup, by requesting config data from the web service if -	 * it has not already been received. -	 */ -	void init(); - -	/* -	 * @return true if both the OpenID cookie and config data have been received. -	 */ -	bool enabled() const { return mEnabled; }; - -	/* -	 * Sets the OpenID cookie to use for login to the web service. -	 * -	 * @param cookie a string containing the OpenID cookie. -	 * -	 * @return true if both the OpenID cookie and config data have been received. -	 */ -	bool setOpenIDCookie(const std::string& cookie); - -	/* -	 * Receive config data used to connect to the web service. -	 * -	 * @param config an LLSD map of URL templates for the web service end-points. -	 * -	 * @return true if both the OpenID cookie and config data have been received. -	 * -	 * @see sendConfigRequest() -	 */ -	bool receiveConfig(const LLSD& config); - -	/* -	 * Receive the session cookie from the web service, which is the result of -	 * the OpenID login process. -	 * -	 * @see sendOpenIDAuthRequest() -	 */ -	bool receiveSessionCookie(const std::string& cookie); - -	/* -	 * Receive a security token for the upload service. -	 * -	 * @see sendSecurityTokenRequest() -	 */ -	bool receiveSecurityToken(const std::string& token, const std::string& expires); - -	/* -	 * Restarts the authentication process if the maximum number of retries has -	 * not been exceeded. -	 * -	 * @return true if retrying, false if LLWebSharing::MAX_AUTH_RETRIES has been exceeded. -	 */ -	bool retryOpenIDAuth(); - -	/* -	 * Post a snapshot to the upload service. -	 * -	 * @return true if accepted for upload, false if already uploading another image. -	 */ -	bool shareSnapshot(LLImageJPEG* snapshot, LLSD& metadata); - -private: -	static const S32 MAX_AUTH_RETRIES = 4; - -	friend class LLSingleton<LLWebSharing>; - -	LLWebSharing(); -	~LLWebSharing() {}; - -	/* -	 * Request a map of URLs and URL templates to the web service end-points. -	 * -	 * @see receiveConfig() -	 */ -	void sendConfigRequest(); - -	/* -	 * Initiate the OpenID login process. -	 * -	 * @see receiveSessionCookie() -	 */ -	void sendOpenIDAuthRequest(); - -	/* -	 * Request a security token for the upload service. -	 * -	 * @see receiveSecurityToken() -	 */ -	void sendSecurityTokenRequest(); - -	/* -	 * Request a security token for the upload service. -	 * -	 * @see receiveSecurityToken() -	 */ -	void sendUploadRequest(); - -	/* -	 * Checks all necessary config information has been received, and sets mEnabled. -	 * -	 * @return true if both the OpenID cookie and config data have been received. -	 */ -	bool validateConfig(); - -	/* -	 * Checks the security token is present and has not expired. -	 * -	 * @param token an LLSD map containing the token string and the time it expires. -	 * -	 * @return true if the token is not empty and has not expired. -	 */ -	static bool securityTokenIsValid(LLSD& token); - -	std::string mOpenIDCookie; -	std::string mSessionCookie; -	LLSD mSecurityToken; - -	LLSD mConfig; -	bool mEnabled; - -	LLPointer<LLImageJPEG> mImage; -	LLSD mMetadata; - -	S32 mRetries; -}; - -/** - * @class LLUriTemplate - * - * @brief Builds complete URIs, given URI template and a map of keys and values - *        to use for substition. - *        Note: This is only a partial implementation of a draft standard required - *        by the web API used by LLWebSharing. - *        See: http://tools.ietf.org/html/draft-gregorio-uritemplate-03 - * - * @see LLWebSharing - */ -class LLUriTemplate -{ -	LOG_CLASS(LLUriTemplate); -public: -	LLUriTemplate(const std::string& uri_template); -	~LLUriTemplate() {}; - -	/* -	 * Builds a complete URI from the template. -	 * -	 * @param vars an LLSD map of keys and values for substitution. -	 * -	 * @return a string containing the complete URI. -	 */ -	std::string buildURI(const LLSD& vars); - -private: -	/* -	 * Builds a URL query string. -	 * -	 * @param delim    a string containing the separator to use between name=value pairs. -	 * @param var_list a string containing a comma separated list of variable names. -	 * @param vars     an LLSD map of keys and values for substitution. -	 * -	 * @return a URL query string. -	 */ -	std::string expandJoin(const std::string& delim, const std::string& var_list, const LLSD& vars); - -	/* -	 * URL escape the given string. -	 * LLWeb::escapeURL() only does a partial escape, so this uses curl_escape() instead. -	 */ -	static std::string escapeURL(const std::string& unescaped); - -	std::string mTemplate; -}; - - - -#endif // LL_LLWEBSHARING_H diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 5da8a78b1b..ab6e5cc353 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -498,6 +498,7 @@ void LLPipeline::init()  	refreshCachedSettings();  	gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity"); +	gOctreeMinSize = gSavedSettings.getF32("OctreeMinimumNodeSize");  	sDynamicLOD = gSavedSettings.getBOOL("RenderDynamicLOD");  	sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");  	sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips"); diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 94c187e21a..20686eafd4 100755 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -242,7 +242,7 @@ with the same filename but different name    <texture name="Icon_Dock_Foreground" file_name="windows/Icon_Dock_Foreground.png" preload="true" />    <texture name="Icon_Dock_Press" file_name="windows/Icon_Dock_Press.png" preload="true" /> -  <texture name="Icon_For_Sale" file_name="icons/Icon_For_sale.png" preload="false" /> +  <texture name="Icon_For_Sale" file_name="icons/Icon_For_Sale.png" preload="false" />    <texture name="Icon_Gear_Background" file_name="windows/Icon_Gear_Background.png" preload="false" />    <texture name="Icon_Gear_Foreground" file_name="windows/Icon_Gear_Foreground.png" preload="false" /> @@ -343,8 +343,8 @@ with the same filename but different name    <texture name="ModelImport_Status_Warning" file_name="lag_status_warning.tga" preload="false"/>    <texture name="ModelImport_Status_Error" file_name="red_x.png" preload="false"/> -  <texture name="MouseLook_View_Off" file_name="bottomtray/MouseLook_view_off.png" preload="false" /> -  <texture name="MouseLook_View_On" file_name="bottomtray/MouseLook_view_on.png" preload="false" /> +  <texture name="MouseLook_View_Off" file_name="bottomtray/Mouselook_View_Off.png" preload="false" /> +  <texture name="MouseLook_View_On" file_name="bottomtray/Mouselook_View_On.png" preload="false" />    <texture name="Move_Fly_Off" file_name="bottomtray/Move_Fly_Off.png" preload="false" />    <texture name="Move_Run_Off" file_name="bottomtray/Move_Run_Off.png" preload="false" /> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml index 0df330b016..6d48180707 100755 --- a/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml @@ -7,7 +7,7 @@  	<text name="cache_size_label_l">  		(Lokationer, billeder, web, søge historik)  	</text> -	<check_box label="Vis dig selv i søgeresultater" name="online_searchresults"/> +	<check_box label="Vis min profil info i søgeresultater" name="online_searchresults"/>  	<check_box label="Kun venner og grupper ved jeg er online" name="online_visibility"/>  	<check_box label="Kun venner og grupper kan sende besked til mig" name="voice_call_friends_only_check"/>  	<check_box label="Slå mikrofon fra når opkald slutter" name="auto_disengage_mic_check"/> diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index 11d100eeff..74d160dfae 100755 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -1172,7 +1172,8 @@ Prøv venligst om lidt igen.  	<string name="InventoryNoTexture">  		Du har ikke en kopi af denne tekstur i din beholdning  	</string> -	<string name="no_transfer" value=" (ikke overdragbar)"/> +  <string name="Unconstrained">Ikke låst</string> +  <string name="no_transfer" value=" (ikke overdragbar)"/>  	<string name="no_modify" value=" (ikke redigere)"/>  	<string name="no_copy" value=" (ikke kopiere)"/>  	<string name="worn" value=" (båret)"/> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml index e21bed6bb5..afde50b981 100755 --- a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml @@ -7,7 +7,7 @@  	<text name="cache_size_label_l">  		(Standorte, Bilder, Web, Suchverlauf)  	</text> -	<check_box label="In Suchergebnissen anzeigen" name="online_searchresults"/> +	<check_box label="Zeigen Sie mein Profil Informationen in Suchergebnisse" name="online_searchresults"/>  	<check_box label="Nur Freunde und Gruppen wissen, dass ich online bin" name="online_visibility"/>  	<check_box label="Nur Freunde und Gruppen können mich anrufen oder mir eine IM schicken" name="voice_call_friends_only_check"/>  	<check_box label="Mikrofon ausschalten, wenn Anrufe beendet werden" name="auto_disengage_mic_check"/> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index 4268b95370..082febd709 100755 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -1267,7 +1267,8 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.  	<string name="InventoryNoTexture">  		Sie haben keine Kopie dieser Textur in Ihrem Inventar.  	</string> -	<string name="InventoryInboxNoItems"> +  <string name="Unconstrained">keines</string> +  <string name="InventoryInboxNoItems">  		Einkäufe aus dem Marktplatz erscheinen hier. Sie können diese dann zur Verwendung in Ihr Inventar ziehen.  	</string>  	<string name="MarketplaceURL"> diff --git a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml index 9deb0d2030..05594c2d86 100755 --- a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml @@ -155,13 +155,12 @@       tool_tip="Compresses textures in video memory, allowing for higher resolution textures to be loaded at the cost of some color quality."       width="315" />      <slider -     control_name="TextureMemory"       decimal_digits="0"       follows="left|top"       height="20"       increment="16"       initial_value="32" -     label="Texture Memory (MB):" +     label="Video Memory (MB):"       label_width="195"       layout="topleft"       left="10" diff --git a/indra/newview/skins/default/xui/en/floater_places.xml b/indra/newview/skins/default/xui/en/floater_places.xml index b241e265a9..31dd6d2c64 100755 --- a/indra/newview/skins/default/xui/en/floater_places.xml +++ b/indra/newview/skins/default/xui/en/floater_places.xml @@ -2,6 +2,7 @@  <floater    positioning="cascading" +  default_tab_group="1"    legacy_header_height="18"    can_resize="true"    height="588" @@ -16,6 +17,7 @@    width="333">      <panel        top="18" +      tab_group="1"        class="panel_places"        name="main_panel"        filename="panel_places.xml" diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml index 137e278ddc..e1e7e1c8c8 100755 --- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml @@ -79,30 +79,6 @@       width="108"       name="combo_aspect_ratio"       tool_tip="Preview at a fixed aspect ratio"> -    	<combo_item name="Unconstrained" value="Unconstrained"> -    		Unconstrained -    	</combo_item> -   	<combo_item name="1:1" value="1:1" tool_tip="Group insignia or Real World profile"> -		1:1 -	</combo_item> -	<combo_item name="4:3" value="4:3" tool_tip="[SECOND_LIFE] profile"> -		4:3 -	</combo_item> -	<combo_item name="10:7" value="10:7" tool_tip="Classifieds and search listings, landmarks"> -		10:7 -	</combo_item> -	<combo_item name="3:2" value="3:2" tool_tip="About land"> -		3:2 -	</combo_item> -	<combo_item name="16:10" value="16:10"> -		16:10 -	</combo_item> -	<combo_item name="16:9" value="16:9" tool_tip="Profile picks"> -		16:9 -	</combo_item> -	<combo_item name="2:1" value="2:1"> -		2:1 -	</combo_item>  	</combo_box>      <button       follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml index 9561f67941..24f95950d8 100755 --- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml @@ -203,47 +203,15 @@          <combo_box.item           label="Age > Age play"           name="Age__Age_play" -         value="31" /> +         value="31" />                 <combo_box.item -         label="Age > Adult Resident on Teen Second Life" -         name="Age__Adult_resident_on_Teen_Second_Life" -         value="32" /> -        <combo_box.item -         label="Age > Underage Resident outside of Teen Second Life" -         name="Age__Underage_resident_outside_of_Teen_Second_Life" -         value="33" /> -        <combo_box.item -         label="Assault > Combat sandbox / unsafe area" -         name="Assault__Combat_sandbox___unsafe_area" -         value="34" /> -        <combo_box.item -         label="Assault > Safe area" +         label="Assault > Shooting, pushing, or shoving another Resident in a Safe Area"           name="Assault__Safe_area" -         value="35" /> -        <combo_box.item -         label="Assault > Weapons testing sandbox" -         name="Assault__Weapons_testing_sandbox" -         value="36" /> -        <combo_box.item -         label="Commerce > Failure to deliver product or service" -         name="Commerce__Failure_to_deliver_product_or_service" -         value="38" /> +         value="35" />                  <combo_box.item           label="Disclosure > Real world information"           name="Disclosure__Real_world_information" -         value="39" /> -        <combo_box.item -         label="Disclosure > Remotely monitoring chat" -         name="Disclosure__Remotely_monitoring chat" -         value="40" /> -        <combo_box.item -         label="Disclosure > Second Life information/chat/IMs" -         name="Disclosure__Second_Life_information_chat_IMs" -         value="41" /> -        <combo_box.item -         label="Disturbing the peace > Unfair use of region resources" -         name="Disturbing_the_peace__Unfair_use_of_region_resources" -         value="42" /> +         value="39" />               <combo_box.item           label="Disturbing the peace > Excessive scripted objects"           name="Disturbing_the_peace__Excessive_scripted_objects" @@ -255,51 +223,15 @@          <combo_box.item           label="Disturbing the peace > Repetitive spam"           name="Disturbing_the_peace__Repetitive_spam" -         value="45" /> -        <combo_box.item -         label="Disturbing the peace > Unwanted advert spam" -         name="Disturbing_the_peace__Unwanted_advert_spam" -         value="46" /> -        <combo_box.item -         label="Fraud > L$" -         name="Fraud__L$" -         value="47" /> -        <combo_box.item -         label="Fraud > Land" -         name="Fraud__Land" -         value="48" /> -        <combo_box.item -         label="Fraud > Pyramid scheme or chain letter" -         name="Fraud__Pyramid_scheme_or_chain_letter" -         value="49" /> +         value="45" />                  <combo_box.item -         label="Fraud > US$" +         label="Fraud > L$ or USD $"           name="Fraud__US$" -         value="50" /> +         value="50" />                 <combo_box.item -         label="Harassment > Advert farms / visual spam" -         name="Harassment__Advert_farms___visual_spam" -         value="51" /> -        <combo_box.item -         label="Harassment > Defaming individuals or groups" -         name="Harassment__Defaming_individuals_or_groups" -         value="52" /> -        <combo_box.item -         label="Harassment > Impeding movement" -         name="Harassment__Impeding_movement" -         value="53" /> -        <combo_box.item -         label="Harassment > Sexual harassment" -         name="Harassment__Sexual_harassment" -         value="54" /> -        <combo_box.item -         label="Harassment > Solicting/inciting others to violate ToS" +         label="Harassment > Targeted behavior intended to disrupt"           name="Harassment__Solicting_inciting_others_to_violate_ToS" -         value="55" /> -        <combo_box.item -         label="Harassment > Verbal abuse" -         name="Harassment__Verbal_abuse" -         value="56" /> +         value="55" />                 <combo_box.item           label="Indecency > Broadly offensive content or conduct"           name="Indecency__Broadly_offensive_content_or_conduct" @@ -309,49 +241,21 @@           name="Indecency__Inappropriate_avatar_name"           value="59" />          <combo_box.item -         label="Indecency > Inappropriate content or conduct in a PG region" +         label="Indecency > Inappropriate content for conduct for Region Rating"           name="Indecency__Mature_content_in_PG_region" -         value="60" /> -        <combo_box.item -         label="Indecency > Inappropriate content or conduct in a Moderate region" -         name="Indecency__Inappropriate_content_in_Mature_region" -         value="69" /> -        <combo_box.item -         label="Intellectual property infringement > Content Removal" -         name="Intellectual_property_infringement_Content_Removal" -         value="66" /> -        <combo_box.item -         label="Intellectual property infringement > CopyBot or Permissions Exploit" -         name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" -         value="37" /> +         value="60" />                 <combo_box.item           label="Intolerance"           name="Intolerance" -         value="61" /> -        <combo_box.item -         label="Land > Abuse of sandbox resources" -         name="Land__Abuse_of_sandbox_resources" -         value="62" /> +         value="61" />                  <combo_box.item -         label="Land > Encroachment > Objects/textures" +         label="Land > Encroachment > Objects or textures"           name="Land__Encroachment__Objects_textures" -         value="63" /> +         value="63" />                  <combo_box.item -         label="Land > Encroachment > Particles" -         name="Land__Encroachment__Particles" -         value="64" /> -        <combo_box.item -         label="Land > Encroachment > Trees/plants" -         name="Land__Encroachment__Trees_plants" -         value="65" /> -        <combo_box.item -         label="Wagering/gambling" +         label="Wagering or Gambling"           name="Wagering_gambling" -         value="67" /> -        <combo_box.item -         label="Other" -         name="Other" -         value="68" /> +         value="67" />             </combo_box>      <text       type="string" diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 8b9733df17..3c28233875 100755 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -150,7 +150,7 @@  	     parameter="Land" />  	</button>      <text -     height="30" +     height="20"       word_wrap="true"       use_ellipses="true"       type="string" @@ -294,24 +294,14 @@      <check_box       control_name="ScaleUniform"       height="19" -     label="" +     label="Stretch Both Sides"       layout="topleft"       left="143"       name="checkbox uniform"       top="48" -     width="20" /> -    <text -     height="19" -     label="Stretch Both Sides" -     left_delta="20" -     name="checkbox uniform label" -     top_delta="2" -     width="120" -     layout="topleft" -     follows="top|left" -     wrap="true"> -     	Stretch Both Sides -    </text> +     label_text.wrap="true" +     label_text.width="100" +     width="134" />      <check_box       control_name="ScaleStretchTextures"       height="19" diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index 52c4fb1613..e91eea04d1 100755 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -35,14 +35,72 @@       tear_off="true"       name="Help">          <menu_item_call -         label="[SECOND_LIFE] Help" -         name="Second Life Help" +         label="How to..." +         name="How To"           shortcut="F1">              <menu_item_call.on_click -             function="ShowHelp" -             parameter="f1_help" /> +             function="Help.ToggleHowTo" +             parameter="" />          </menu_item_call> -        <menu_item_separator /> +        <menu_item_call +           label="Quickstart" +           name="Quickstart"> +            <menu_item_call.on_click +            function="Advanced.ShowURL" +            parameter="http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Quickstart/ta-p/1087919"/> +        </menu_item_call> +		<menu_item_separator/> +        <menu_item_call +             label="Knowledge Base" +             name="Knowledge Base"> +             <menu_item_call.on_click +                 function="Advanced.ShowURL" +            parameter="http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-User-s-Guide/ta-p/1244857"/> +        </menu_item_call> +        <menu_item_call +             label="Wiki" +             name="Wiki"> +             <menu_item_call.on_click +                 function="Advanced.ShowURL" +                 parameter="http://wiki.secondlife.com"/> +        </menu_item_call> +        <menu_item_call +             label="Community Forums" +             name="Community Forums"> +             <menu_item_call.on_click +                 function="Advanced.ShowURL" +                 parameter="http://community.secondlife.com/t5/Forums/ct-p/Forums"/> +        </menu_item_call>          +        <menu_item_call +             label="Support portal" +             name="Support portal"> +             <menu_item_call.on_click +                 function="Advanced.ShowURL" +                 parameter="https://support.secondlife.com/"/>          +        </menu_item_call> +        <menu_item_separator/> +        <menu_item_call +             label="[SECOND_LIFE] News" +             name="Second Life News"> +             <menu_item_call.on_click +                 function="Advanced.ShowURL" +                 parameter="http://community.secondlife.com/t5/Featured-News/bg-p/blog_feature_news"/>   +        </menu_item_call> +        <menu_item_call +             label="[SECOND_LIFE] Blogs" +             name="Second Life Blogs"> +             <menu_item_call.on_click +                 function="Advanced.ShowURL" +                 parameter="http://community.secondlife.com/t5/Blogs/ct-p/Blogs"/> +        </menu_item_call> +        <menu_item_separator/>        +        <menu_item_call +             label="Report Bug" +             name="Report Bug"> +                <menu_item_call.on_click +                 function="Advanced.ReportBug"/> +            </menu_item_call> +        <menu_item_separator/>          <menu_item_call           label="About [APP_NAME]"           name="About Second Life"> diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml index 52ab7da515..5c98a98d3d 100755 --- a/indra/newview/skins/default/xui/en/menu_object.xml +++ b/indra/newview/skins/default/xui/en/menu_object.xml @@ -130,17 +130,24 @@            function="Object.ReportAbuse" />        <menu_item_call.on_enable            function="Object.EnableReportAbuse" /> -    </menu_item_call> +    </menu_item_call>         <menu_item_call -        enabled="false" -        label="Block" -        name="Object Mute"> -      <menu_item_call.on_click +   		  label="Block"         +          name="Object Mute"> +        <menu_item_call.on_click            function="Object.Mute" /> -      <menu_item_call.on_enable +        <menu_item_call.on_visible            function="Object.EnableMute" />      </menu_item_call>      <menu_item_call +          label="Unblock"    +          name="Object Unmute"> +        <menu_item_call.on_click +          function="Object.Mute" /> +        <menu_item_call.on_visible +          function="Object.EnableUnmute" /> +    </menu_item_call> +    <menu_item_call          enabled="false"          label="Return"          name="Return..."> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 7e8d2aaf9a..d91b4243b2 100755 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -606,44 +606,59 @@           label="Sun"           name="Sun"           tear_off="true"> -            <menu_item_call +            <menu_item_check               label="Sunrise"               name="Sunrise"> -                <menu_item_call.on_click +                <menu_item_check.on_click                   function="World.EnvSettings"                   parameter="sunrise" /> -            </menu_item_call> -            <menu_item_call +                <menu_item_check.on_check +                 function="World.EnableEnvSettings"  +                 parameter="sunrise" /> +            </menu_item_check> +            <menu_item_check               label="Midday"               name="Noon"               shortcut="control|shift|Y"> -                <menu_item_call.on_click +                <menu_item_check.on_click                   function="World.EnvSettings"                   parameter="noon" /> -            </menu_item_call> -            <menu_item_call +                <menu_item_check.on_check +                 function="World.EnableEnvSettings"  +                 parameter="noon" /> +            </menu_item_check> +            <menu_item_check               label="Sunset"               name="Sunset"               shortcut="control|shift|N"> -                <menu_item_call.on_click +                <menu_item_check.on_click                   function="World.EnvSettings"                   parameter="sunset" /> -            </menu_item_call> -            <menu_item_call +                <menu_item_check.on_check +                 function="World.EnableEnvSettings"  +                 parameter="sunset" /> +            </menu_item_check> +            <menu_item_check               label="Midnight"               name="Midnight"> -                <menu_item_call.on_click +                <menu_item_check.on_click                   function="World.EnvSettings"                   parameter="midnight" /> -            </menu_item_call> +                <menu_item_check.on_check +                 function="World.EnableEnvSettings"  +                 parameter="midnight" /> +            </menu_item_check>              <menu_item_separator/> -            <menu_item_call +            <menu_item_check               label="Use Region Settings"               name="Use Region Settings"> -                <menu_item_call.on_click +                <menu_item_check.on_click                   function="World.EnvSettings"                   parameter="region" /> -            </menu_item_call> +                <menu_item_check.on_check +                 function="World.EnableEnvSettings"  +                 parameter="region" /> +            </menu_item_check>          </menu> @@ -1542,7 +1557,8 @@              <menu_item_check               label="Highlight Transparent"               name="Highlight Transparent" -             shortcut="control|alt|T"> +             shortcut="control|alt|T" +             use_mac_ctrl="true">                  <menu_item_check.on_check                   function="View.CheckHighlightTransparent" />                  <menu_item_check.on_click @@ -3136,18 +3152,6 @@                  <menu_item_call.on_click                   function="Advanced.PrintAgentInfo" />              </menu_item_call> -            <menu_item_check -             label="Region Debug Console" -             name="Region Debug Console" -             shortcut="control|shift|`" -             use_mac_ctrl="true"> -                <menu_item_check.on_check -                 function="Floater.Visible" -                 parameter="region_debug_console" /> -                <menu_item_check.on_click -                 function="Floater.Toggle" -                 parameter="region_debug_console" /> -            </menu_item_check>              <menu_item_separator />              <menu_item_check diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index c97af4e9ef..ce34c3f7a1 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -7634,7 +7634,7 @@ Are you sure you want to share the following items:  With the following Residents: -[RESIDENTS] +<nolink>[RESIDENTS]</nolink>    <tag>confirm</tag>  	<usetemplate       name="okcancelbuttons" @@ -7654,7 +7654,7 @@ Are you sure you want to share the following items:  With the following Residents: -[RESIDENTS] +<nolink>[RESIDENTS]</nolink>    <tag>confirm</tag>  	<usetemplate       name="okcancelbuttons" @@ -10224,4 +10224,14 @@ Cannot create large prims that intersect other players.  Please re-try when othe       yestext="OK"/>    </notification> +  <notification +   icon="alert.tga" +   name="ChatHistoryIsBusyAlert" +   type="alertmodal"> +   Chat history file is busy with previous operation. Please try again in a few minutes or choose chat with another person. +    <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> +    </notifications> diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index 308acf0c0c..30239d6d01 100755 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -220,7 +220,7 @@              <layout_stack               border_size="0"               clip="false" -             follows="left|top|right" +             follows="left|top"               height="50"               layout="topleft"               mouse_opaque="false" @@ -251,10 +251,10 @@                  </layout_panel>                  <layout_panel                   follows="left|right" -                 height="60" +                 height="50"                   layout="topleft"                   min_height="50" -                 min_width="60" +                 min_width="50"                   mouse_opaque="false"                   name="for_sale_panel"                   top="0" @@ -264,7 +264,7 @@                       height="50"                       image_name="ForSale_Badge"                       layout="topleft" -                     left="10" +                     left="0"                       name="icon_for_sale"                       top="0"                       width="50" /> @@ -762,11 +762,19 @@                           top_pad="5"                           value="Rating:"                           width="80" /> +                        <icon +                         follows="top|left" +                         height="16" +                         image_name="Parcel_PG_Dark" +                         layout="topleft" +                         left_pad="0" +                         name="estate_rating_icon" +                         width="18" />                          <text                           follows="left|top|right"                           height="15"                           layout="topleft" -                         left_pad="0" +                         left_pad="10"                           name="estate_rating"                           top_delta="0"                           width="187" /> diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index f169dbb702..7d171490e8 100755 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -27,6 +27,7 @@ background_visible="true"       label="Filter My Places"       max_length_chars="300"       name="Filter" +     tab_group="1"       top="3"       width="303" />      <tab_container @@ -39,7 +40,7 @@ background_visible="true"       tab_min_width="80"       tab_max_width="157"       tab_height="30" -     tab_group="1" +     tab_group="2"       tab_position="top"       top_pad="10"       width="315" /> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index 78743d26bb..d7ffb73dda 100755 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -47,7 +47,7 @@    <check_box        height="16"        enabled="false" -      label="Show me in Search results" +      label="Show my profile info in Search results"        layout="topleft"        left="30"        name="online_searchresults" diff --git a/indra/newview/skins/default/xui/en/panel_region_debug.xml b/indra/newview/skins/default/xui/en/panel_region_debug.xml index 81b2281adb..fea5f1b19f 100755 --- a/indra/newview/skins/default/xui/en/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/en/panel_region_debug.xml @@ -201,4 +201,14 @@       tool_tip="Cancel region restart"       top_delta="0"       width="150" /> +    <button +     follows="left|top" +     height="20" +     label="Region Debug Console" +     layout="topleft" +     left="10" +     name="region_debug_console_btn" +     tool_tip="Open Region Debug Console" +     top_pad="5" +     width="150" />  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml index 44c84e69a1..489d286e67 100755 --- a/indra/newview/skins/default/xui/en/panel_region_general.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general.xml @@ -94,11 +94,20 @@       width="80" />      <check_box       height="20" +     label="Block Parcel Fly Over" +     layout="topleft" +     left="10" +     name="block_fly_over_check" +     tool_tip="Extend access checks upwards to prevent flying over a parcel" +     top="110" +     width="90" /> +  <check_box +     height="20"       label="Allow Damage"       layout="topleft"       left="10"       name="allow_damage_check" -     top="110" +     top="130"       width="80" />      <check_box       height="20" @@ -106,7 +115,7 @@       layout="topleft"       left="10"       name="restrict_pushobject" -     top="130" +     top="150"       width="80" />      <check_box       height="20" @@ -114,7 +123,7 @@       layout="topleft"       left="10"       name="allow_land_resell_check" -     top="150" +     top="170"       width="80" />      <check_box       height="20" @@ -122,7 +131,7 @@       layout="topleft"       left="10"       name="allow_parcel_changes_check" -     top="170" +     top="190"       width="80" />      <check_box       height="20" @@ -131,7 +140,7 @@       left="10"       name="block_parcel_search_check"       tool_tip="Let people see this region and its parcels in search results" -     top="190" +     top="210"       width="80" />  	<spinner       decimal_digits="0" @@ -145,7 +154,7 @@       max_val="100"       min_val="1"       name="agent_limit_spin" -     top="240" +     top="260"       width="170" />      <spinner       follows="left|top" @@ -158,7 +167,7 @@       max_val="10"       min_val="1"       name="object_bonus_spin" -     top="260" +     top="280"       width="170" />      <text       follows="left|top" @@ -167,7 +176,7 @@       layout="topleft"       left="10"       name="access_text" -     top="290" +     top="310"       width="100">          Rating:      </text> @@ -224,7 +233,7 @@       layout="topleft"       left="108"       name="apply_btn" -     top="320" +     top="340"       width="100"/>       <button       follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml index c5b0be0616..26cac06648 100755 --- a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml +++ b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml @@ -47,7 +47,20 @@       text_color="White"       top="4"       value="..." -     width="330" /> +     width="290" /> +    <text +     follows="right" +     height="20" +     layout="topleft" +     left_pad="5" +     right="-20" +     parse_urls="false" +     use_ellipses="true" +     name="timestamp" +     text_color="White" +     top="4" +     value="..." +     width="45" />      <button       follows="right"       height="20" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 67f75fe1d2..f0ff6d5b88 100755 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2257,6 +2257,7 @@ Drag folders to this area and click "Send to Marketplace" to list them for sale  	<string name="Marketplace Error Internal Import">Error: There was a problem with this item.  Try again later.</string>  	<string name="Open landmarks">Open landmarks</string> +  <string name="Unconstrained">Unconstrained</string>  	<!-- use value="" because they have preceding spaces -->  	<string name="no_transfer" value=" (no transfer)" /> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml index c162130af6..fe312e3587 100755 --- a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml @@ -7,7 +7,7 @@  	<text name="cache_size_label_l">  		(Localizaciones, imágenes, web, historial de búsqueda)  	</text> -	<check_box label="Mostrarme en los resultados de la búsqueda" name="online_searchresults"/> +	<check_box label="Mostrarme información de perfil en los resultados de la búsqueda" name="online_searchresults"/>  	<check_box label="Sólo saben si estoy conectado mis amigos y grupos" name="online_visibility"/>  	<check_box label="Sólo pueden llamarme o mandarme un MI mis amigos y grupos" name="voice_call_friends_only_check"/>  	<check_box label="Desconectar el micrófono cuando finalicen las llamadas" name="auto_disengage_mic_check"/> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 484511a08b..2b91c542ad 100755 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -1252,7 +1252,8 @@ Intenta iniciar sesión de nuevo en unos instantes.  	<string name="InventoryInboxNoItems">  		Aquí aparecerán algunos de los objetos que recibas, como los regalos Premium. Después puedes arrastrarlos a tu inventario.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Sin restricciones</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml index cf1a374da6..a89676d119 100755 --- a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml @@ -7,13 +7,13 @@  	<text name="cache_size_label_l">  		(endroits, images, web, historique des recherches)  	</text> -	<check_box label="M'afficher dans les résultats de recherche" name="online_searchresults"/> +	<check_box label="Afficher mon profil d'infos dans les résultats de recherche" name="online_searchresults"/>  	<check_box label="Seuls mes amis et groupes voient quand je suis en ligne" name="online_visibility"/>  	<check_box label="Seuls mes amis et groupes peuvent m'appeler ou m'envoyer un IM" name="voice_call_friends_only_check"/>  	<check_box label="Fermer le micro à la fin d'un appel" name="auto_disengage_mic_check"/>  	<check_box label="Afficher mes repères favoris à la connexion (liste déroulante Lieu de départ)" name="favorites_on_login_check"/>  	<text name="Logs:"> -		Journaux de chat : +		Journaux de chat :  	</text>  	<check_box label="Sauvegarder les chats près de moi sur mon ordinateur" name="log_nearby_chat"/>  	<check_box label="Sauvegarder les IM sur mon ordinateur" name="log_instant_messages"/> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 78d846ff4f..b8721420cb 100755 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -1270,7 +1270,8 @@ Veuillez réessayer de vous connecter dans une minute.  	<string name="InventoryInboxNoItems">  		Les achats que vous avez effectués sur la Place du marché s'affichent ici. Vous pouvez alors les faire glisser vers votre inventaire afin de les utiliser.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Sans contraintes</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml index 41e7a59139..241ed8f162 100755 --- a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml @@ -7,7 +7,7 @@  	<text name="cache_size_label_l">  		(Luoghi, immagini, web, cronologia ricerche)  	</text> -	<check_box label="Mostrami nei risultati della ricerca" name="online_searchresults"/> +	<check_box label="Mostra il mio profilo info nei risultati di ricerca" name="online_searchresults"/>  	<check_box label="Solo amici e gruppi mi vedono online" name="online_visibility"/>  	<check_box label="Solo amici e gruppi possono chiamarmi o mandarmi IM" name="voice_call_friends_only_check"/>  	<check_box label="Spegnere il microfono alla chiusura delle chiamate" name="auto_disengage_mic_check"/> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 60ed2b0929..86d7f75b83 100755 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -1261,7 +1261,8 @@ Prova ad accedere nuovamente tra un minuto.  	<string name="InventoryInboxNoItems">  		Gli acquissti dal mercato verranno mostrati qui. Potrai quindi trascinarli nel tuo inventario per usarli.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Libero</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml index 420bbed572..3787f390e4 100755 --- a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml @@ -7,7 +7,7 @@  	<text name="cache_size_label_l">  		(位置、画像、web、検索履歴)  	</text> -	<check_box label="検索結果に表示" name="online_searchresults"/> +	<check_box label="検索結果に自分のプロフィール情報を表示する" name="online_searchresults"/>  	<check_box label="私のオンライン状態を確認できるのは、フレンドとグループだけ" name="online_visibility"/>  	<check_box label="フレンドとグループ以外からはコールと IM を受信しない" name="voice_call_friends_only_check"/>  	<check_box label="コールが終了したら自動的にマイクのスイッチを切る" name="auto_disengage_mic_check"/> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index a0f45e5a55..36966d6825 100755 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -1270,7 +1270,8 @@ support@secondlife.com にお問い合わせください。  	<string name="InventoryInboxNoItems">  		マーケットプレイスで購入した商品はここに表示されます。その後、アイテムをインベントリにドラッグすれば、それらのアイテムを使用できます。  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">非拘束</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml index 5af2fed142..30b64bc977 100755 --- a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml @@ -7,7 +7,7 @@  	<text name="cache_size_label_l">  		(Miejsca, obrazy, przeglądarka internetowa, wyszukiwarka historii)  	</text> -	<check_box label="Pokaż mój profil w wynikach wyszukiwarki" name="online_searchresults"/> +	<check_box label="Pokaż mój informacje profilu w wynikach wyszukiwania" name="online_searchresults"/>  	<check_box label="Mój status online jest dostępny tylko dla znajomych i grup do których należę" name="online_visibility"/>  	<check_box label="Możliwość wysyłania wiadomości prywatnej (IM) oraz rozmowy głosowej tylko dla 
znajomych i grup do których należę" name="voice_call_friends_only_check" top_pad="15"/>  	<check_box label="Wyłącz mikrofon po zakończeniu rozmowy głosowej" name="auto_disengage_mic_check"/> diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index f6dec8536b..f86e393646 100755 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -1035,6 +1035,7 @@  	<string name="InventoryNoTexture">  		Nie posiadasz kopii tej tekstury w Twojej Szafie.  	</string> +  <string name="Unconstrained">Swobodny</string>  	<string name="no_transfer" value=" (brak oddawania)"/>  	<string name="no_modify" value=" (brak modyfikowania)"/>  	<string name="no_copy" value=" (brak kopiowania)"/> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml index d7fb585e35..8ca05c948a 100755 --- a/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml @@ -7,7 +7,7 @@  	<text name="cache_size_label_l">  		(Locações, imagens, web, histórico de busca)  	</text> -	<check_box label="Mostrar nos resultados de busca" name="online_searchresults"/> +	<check_box label="Mostrar meu perfil info em resultados de busca" name="online_searchresults"/>  	<check_box label="Apenas amigos e grupos sabem que estou online" name="online_visibility"/>  	<check_box label="Apenas amigos e grupos podem me chamar ou enviar MI" name="voice_call_friends_only_check"/>  	<check_box label="Desligar o microfone quando terminar chamadas" name="auto_disengage_mic_check"/> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 2eb4c0a02e..8436452228 100755 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -1216,7 +1216,8 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para  	<string name="InventoryInboxNoItems">  		Suas compras do Marketplace aparecerão aqui. Depois, você poderá arrastá-las para seu inventário para usá-las.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Sem limites</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml index 20bb839eed..ed6bed439c 100755 --- a/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml @@ -7,7 +7,7 @@  	<text name="cache_size_label_l">  		(Места, картинки, страницы, журнал поиска)  	</text> -	<check_box label="Показывать меня в результатах поиска" name="online_searchresults"/> +	<check_box label="Показывать информацию моего профиля в результатах поиска" name="online_searchresults"/>  	<check_box label="Только друзья и группы видят, когда я на связи" name="online_visibility"/>  	<check_box label="Только друзья и группы могут звонить мне и отправлять IM" name="voice_call_friends_only_check"/>  	<check_box label="Отключать микрофон по окончании разговора" name="auto_disengage_mic_check"/> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index 0f71edcee0..8faf834f8f 100755 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -1267,7 +1267,8 @@ support@secondlife.com.  	<string name="InventoryInboxNoItems">  		Здесь будут показаны ваши покупки из торгового центра. Их можно будет перетащить в ваш инвентарь для использования.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Без ограничения</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml index 9111594979..285670a6ac 100755 --- a/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml @@ -7,7 +7,7 @@  	<text name="cache_size_label_l">  		(Konumlar, görüntüler, web, arama geçmişi)  	</text> -	<check_box label="Arama sonuçlarında beni göster" name="online_searchresults"/> +	<check_box label="Arama sonuçlarında profil bilgilerini göster" name="online_searchresults"/>  	<check_box label="Çevrimiçi olduğumu sadece arkadaşlar ve gruplar bilsin" name="online_visibility"/>  	<check_box label="Sadece arkadaşlar ve gruplar beni arasın veya Aİ göndersin" name="voice_call_friends_only_check"/>  	<check_box label="Aramaları sonlandırırken mikrofonu kapat" name="auto_disengage_mic_check"/> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index c4b1530b2b..31c5d2d310 100755 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -1267,7 +1267,8 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.  	<string name="InventoryInboxNoItems">  		Pazaryerinda satın aldıklarınız burada görünecektir. Bunları kullanmak için envanterinize sürükleyebilirsiniz.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Kısıtsız</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml index 07fdfd87e3..d768cacb94 100755 --- a/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml @@ -7,7 +7,7 @@  	<text name="cache_size_label_l">  		(位置、圖像、網頁、搜尋的歷史紀錄)  	</text> -	<check_box label="將我顯示在搜尋的結果中" name="online_searchresults"/> +	<check_box label="顯示在搜索結果我的個人資料信息" name="online_searchresults"/>  	<check_box label="只有我的朋友和群組知道我上線" name="online_visibility"/>  	<check_box label="只有我的朋友和群組可以 IM 或與我通話。" name="voice_call_friends_only_check"/>  	<check_box label="當通話結束時關閉麥克風" name="auto_disengage_mic_check"/> | 
