diff options
191 files changed, 2525 insertions, 1326 deletions
| diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp index f0b44f97d2..7f747c2eca 100644 --- a/indra/llaudio/llaudiodecodemgr.cpp +++ b/indra/llaudio/llaudiodecodemgr.cpp @@ -215,7 +215,7 @@ BOOL LLVorbisDecodeState::initDecode()  		return(FALSE);  	} -	S32 sample_count = ov_pcm_total(&mVF, -1); +	S32 sample_count = (S32)ov_pcm_total(&mVF, -1);  	size_t size_guess = (size_t)sample_count;  	vorbis_info* vi = ov_info(&mVF, -1);  	size_guess *= (vi? vi->channels : 1); diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h index a47ee7ca7c..28b69e1973 100644 --- a/indra/llaudio/llaudioengine.h +++ b/indra/llaudio/llaudioengine.h @@ -37,6 +37,7 @@  #include "lluuid.h"  #include "llframetimer.h"  #include "llassettype.h" +#include "llextendedstatus.h"  #include "lllistener.h" diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp index f3cf950afa..2a0df26384 100644 --- a/indra/llcharacter/llbvhloader.cpp +++ b/indra/llcharacter/llbvhloader.cpp @@ -1570,7 +1570,7 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)  		constraint_it++)  		{  			U8 byte = constraint_it->mChainLength; -			dp.packU8(byte, "chain_lenght"); +			dp.packU8(byte, "chain_length");  			byte = constraint_it->mConstraintType;  			dp.packU8(byte, "constraint_type"); diff --git a/indra/llcommon/linden_common.h b/indra/llcommon/linden_common.h index bdcc98e402..5cfcdab41c 100644 --- a/indra/llcommon/linden_common.h +++ b/indra/llcommon/linden_common.h @@ -52,34 +52,11 @@  #include <ctime>  #include <iosfwd> -// Work around Microsoft compiler warnings in STL headers -#ifdef LL_WINDOWS -#pragma warning (disable : 4702) // unreachable code -#pragma warning (disable : 4244) // conversion from time_t to S32 -#endif	//	LL_WINDOWS - -// *TODO: Eliminate these, most library .cpp files don't need them. -// Add them to llviewerprecompiledheaders.h if necessary. -#include <list> -#include <map> -#include <vector> -#include <string> - -#ifdef LL_WINDOWS -// Reenable warnings we disabled above -#pragma warning (3 : 4702) // unreachable code, we like level 3, not 4 -// moved msvc warnings to llpreprocessor.h  *TODO - delete this comment after merge conflicts are unlikely -brad -#endif	//	LL_WINDOWS -  // Linden only libs in alpha-order other than stdtypes.h  // *NOTE: Please keep includes here to a minimum, see above.  #include "stdtypes.h"  #include "lldefs.h"  #include "llerror.h" -#include "llextendedstatus.h" -// Don't do this, adds 15K lines of header code to every library file. -//#include "llfasttimer.h"  #include "llfile.h" -#include "llformat.h"  #endif diff --git a/indra/llcommon/llavatarname.cpp b/indra/llcommon/llavatarname.cpp index ba3dd6d6b4..3206843bf4 100644 --- a/indra/llcommon/llavatarname.cpp +++ b/indra/llcommon/llavatarname.cpp @@ -106,6 +106,11 @@ std::string LLAvatarName::getCompleteName() const  std::string LLAvatarName::getLegacyName() const  { +	if (mLegacyFirstName.empty() && mLegacyLastName.empty()) // display names disabled? +	{ +		return mDisplayName; +	} +  	std::string name;  	name.reserve( mLegacyFirstName.size() + 1 + mLegacyLastName.size() );  	name = mLegacyFirstName; diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp index db1ea4792b..0855180dcd 100644 --- a/indra/llcommon/llevents.cpp +++ b/indra/llcommon/llevents.cpp @@ -430,13 +430,13 @@ LLBoundListener LLEventPump::listen_impl(const std::string& name, const LLEventL      {          // The new node isn't last. Place it between the previous node and          // the successor. -        newNode = (myprev + mydmi->second)/2.0; +        newNode = (myprev + mydmi->second)/2.f;      }      else      {          // The new node is last. Bump myprev up to the next integer, add          // 1.0 and use that. -        newNode = std::ceil(myprev) + 1.0; +        newNode = std::ceil(myprev) + 1.f;      }      // Now that newNode has a value that places it appropriately in mSignal,      // connect it. diff --git a/indra/llcommon/llmd5.cpp b/indra/llcommon/llmd5.cpp index 75fde8e5ba..1409c55d1c 100644 --- a/indra/llcommon/llmd5.cpp +++ b/indra/llcommon/llmd5.cpp @@ -175,7 +175,7 @@ void LLMD5::update(std::istream& stream){    while (stream.good()){      stream.read( (char*)buffer, BLOCK_LEN); 	/* Flawfinder: ignore */		// note that return value of read is unusable. -    len=stream.gcount(); +    len=(int)stream.gcount();      update(buffer, len);    } diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h index 31d5f3d2c7..7fdb537ab5 100644 --- a/indra/llcommon/llpreprocessor.h +++ b/indra/llcommon/llpreprocessor.h @@ -132,7 +132,7 @@  #pragma warning( 3       : 4265 )	// "class has virtual functions, but destructor is not virtual"  #pragma warning( 3      :  4266 )	// 'function' : no override available for virtual member function from base 'type'; function is hidden  #pragma warning (disable : 4180)	// qualifier applied to function type has no meaning; ignored -#pragma warning( disable : 4284 )	// silly MS warning deep inside their <map> include file +//#pragma warning( disable : 4284 )	// silly MS warning deep inside their <map> include file  #pragma warning( disable : 4503 )	// 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation.  #pragma warning( disable : 4800 )	// 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)  #pragma warning( disable : 4996 )	// warning: deprecated @@ -152,6 +152,7 @@  #pragma warning (disable : 4251) // member needs to have dll-interface to be used by clients of class  #pragma warning (disable : 4275) // non dll-interface class used as base for dll-interface class  #pragma warning (disable : 4018) // '<' : signed/unsigned mismatch	 +  #endif	//	LL_MSVC  #if LL_WINDOWS diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp index bf62600514..b419101b7e 100644 --- a/indra/llcommon/llsdserialize.cpp +++ b/indra/llcommon/llsdserialize.cpp @@ -110,7 +110,7 @@ bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, S32 max_bytes)  	if (!strncasecmp(LEGACY_NON_HEADER, hdr_buf, strlen(LEGACY_NON_HEADER))) /* Flawfinder: ignore */  	{  		legacy_no_header = true; -		inbuf = str.gcount(); +		inbuf = (int)str.gcount();  	}  	else  	{ @@ -343,7 +343,7 @@ std::istream& LLSDParser::get(  	char delim) const  {  	istr.get(s, n, delim); -	if(mCheckLimits) mMaxBytesLeft -= istr.gcount(); +	if(mCheckLimits) mMaxBytesLeft -= (int)istr.gcount();  	return istr;  } @@ -353,7 +353,7 @@ std::istream& LLSDParser::get(  		char delim) const		  {  	istr.get(sb, delim); -	if(mCheckLimits) mMaxBytesLeft -= istr.gcount(); +	if(mCheckLimits) mMaxBytesLeft -= (int)istr.gcount();  	return istr;  } @@ -377,7 +377,7 @@ std::istream& LLSDParser::read(  	std::streamsize n) const  {  	istr.read(s, n); -	if(mCheckLimits) mMaxBytesLeft -= istr.gcount(); +	if(mCheckLimits) mMaxBytesLeft -= (int)istr.gcount();  	return istr;  } @@ -789,7 +789,7 @@ bool LLSDNotationParser::parseBinary(std::istream& istr, LLSD& data) const  		if(len)  		{  			value.resize(len); -			account(fullread(istr, (char *)&value[0], len)); +			account((int)fullread(istr, (char *)&value[0], len));  		}  		c = get(istr); // strip off the trailing double-quote  		data = value; @@ -1069,7 +1069,7 @@ S32 LLSDBinaryParser::doParse(std::istream& istr, LLSD& data) const  			if(size > 0)  			{  				value.resize(size); -				account(fullread(istr, (char*)&value[0], size)); +				account((int)fullread(istr, (char*)&value[0], size));  			}  			data = value;  		} @@ -1200,7 +1200,7 @@ bool LLSDBinaryParser::parseString(  	if(size)  	{  		buf.resize(size); -		account(fullread(istr, &buf[0], size)); +		account((int)fullread(istr, &buf[0], size));  		value.assign(buf.begin(), buf.end());  	}  	return true; @@ -1642,7 +1642,7 @@ int deserialize_string_raw(  	const S32 BUF_LEN = 20;  	char buf[BUF_LEN];		/* Flawfinder: ignore */  	istr.get(buf, BUF_LEN - 1, ')'); -	count += istr.gcount(); +	count += (int)istr.gcount();  	int c = istr.get();  	c = istr.get();  	count += 2; @@ -1657,7 +1657,7 @@ int deserialize_string_raw(  		if(len)  		{  			buf.resize(len); -			count += fullread(istr, (char *)&buf[0], len); +			count += (int)fullread(istr, (char *)&buf[0], len);  			value.assign(buf.begin(), buf.end());  		}  		c = istr.get(); diff --git a/indra/llcommon/llsdserialize_xml.cpp b/indra/llcommon/llsdserialize_xml.cpp index be9db53906..34b3dbb99a 100644 --- a/indra/llcommon/llsdserialize_xml.cpp +++ b/indra/llcommon/llsdserialize_xml.cpp @@ -464,7 +464,7 @@ S32 LLSDXMLParser::Impl::parseLines(std::istream& input, LLSD& data)  			}  		} -		status = XML_ParseBuffer(mParser, num_read, false); +		status = XML_ParseBuffer(mParser, (int)num_read, false);  		if (status == XML_STATUS_ERROR)  		{  			break; diff --git a/indra/llcommon/llsdutil.h b/indra/llcommon/llsdutil.h index 65c7297cbf..532d3f9341 100644 --- a/indra/llcommon/llsdutil.h +++ b/indra/llcommon/llsdutil.h @@ -308,7 +308,7 @@ class LLSDParam<T>                              \  {                                               \  public:                                         \      LLSDParam(const LLSD& value):               \ -        _value(value.AS())                      \ +        _value((T)value.AS())                      \      {}                                          \                                                  \      operator T() const { return _value; }       \ diff --git a/indra/llcommon/llstat.cpp b/indra/llcommon/llstat.cpp index b2c495d093..057257057f 100644 --- a/indra/llcommon/llstat.cpp +++ b/indra/llcommon/llstat.cpp @@ -593,7 +593,7 @@ void LLStatTime::stop()  {      if ( LLStatAccum::SCALE_PER_FRAME == scale )      { -        return mTotalTimeInFrame; +        return (F32)mTotalTimeInFrame;      }      else      { diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp index 38054b636e..9ebc6de7f4 100644 --- a/indra/llcommon/lltimer.cpp +++ b/indra/llcommon/lltimer.cpp @@ -83,7 +83,7 @@ U32 micro_sleep(U64 us, U32 max_yields)  {      // max_yields is unused; just fiddle with it to avoid warnings.      max_yields = 0; -    ms_sleep(us / 1000); +	ms_sleep((U32)(us / 1000));      return 0;  }  #elif LL_LINUX || LL_SOLARIS || LL_DARWIN diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp index 3461aa3e6c..d6dcde4b9f 100644 --- a/indra/llcrashlogger/llcrashlogger.cpp +++ b/indra/llcrashlogger/llcrashlogger.cpp @@ -250,7 +250,7 @@ void LLCrashLogger::gatherFiles()  		if(minidump_stream.is_open())  		{  			minidump_stream.seekg(0, std::ios::end); -			size_t length = minidump_stream.tellg(); +			size_t length = (size_t)minidump_stream.tellg();  			minidump_stream.seekg(0, std::ios::beg);  			LLSD::Binary data; diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index cc8cb66d73..8241746a74 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -501,10 +501,10 @@ void LLImageCompressionTester::outputTestRecord(LLSD *sd)  	F32 decompressionRate = 0.0f;  	F32 compressionRate   = 0.0f; -	F32 totalkBInDecompression  = (F32)(mTotalBytesInDecompression)  / 1000.0; -	F32 totalkBOutDecompression = (F32)(mTotalBytesOutDecompression) / 1000.0; -	F32 totalkBInCompression    = (F32)(mTotalBytesInCompression)    / 1000.0; -	F32 totalkBOutCompression   = (F32)(mTotalBytesOutCompression)   / 1000.0; +	F32 totalkBInDecompression  = (F32)(mTotalBytesInDecompression)  / 1000.f; +	F32 totalkBOutDecompression = (F32)(mTotalBytesOutDecompression) / 1000.f; +	F32 totalkBInCompression    = (F32)(mTotalBytesInCompression)    / 1000.f; +	F32 totalkBOutCompression   = (F32)(mTotalBytesOutCompression)   / 1000.f;  	if (!is_approx_zero(mTotalTimeDecompression))  	{ diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp index 76760aa414..fbf23bc3f0 100644 --- a/indra/llinventory/llinventory.cpp +++ b/indra/llinventory/llinventory.cpp @@ -405,7 +405,7 @@ U32 LLInventoryItem::getCRC32() const  	//lldebugs << "7 crc: " << std::hex << crc << std::dec << llendl;  	crc += mSaleInfo.getCRC32();  	//lldebugs << "8 crc: " << std::hex << crc << std::dec << llendl; -	crc += mCreationDate; +	crc += (U32)mCreationDate;  	//lldebugs << "9 crc: " << std::hex << crc << std::dec << llendl;  	return crc;  } @@ -521,7 +521,7 @@ void LLInventoryItem::packMessage(LLMessageSystem* msg) const  	mSaleInfo.packMessage(msg);  	msg->addStringFast(_PREHASH_Name, mName);  	msg->addStringFast(_PREHASH_Description, mDescription); -	msg->addS32Fast(_PREHASH_CreationDate, mCreationDate); +	msg->addS32Fast(_PREHASH_CreationDate, (S32)mCreationDate);  	U32 crc = getCRC32();  	msg->addU32Fast(_PREHASH_CRC, crc);  } diff --git a/indra/llmath/llcalcparser.h b/indra/llmath/llcalcparser.h index bd9c8c2519..e0ad270266 100644 --- a/indra/llmath/llcalcparser.h +++ b/indra/llmath/llcalcparser.h @@ -174,7 +174,7 @@ private:  	F32 _log(const F32& a) const { return log(a); }  	F32 _exp(const F32& a) const { return exp(a); }  	F32 _fabs(const F32& a) const { return fabs(a); } -	F32 _floor(const F32& a) const { return llfloor(a); } +	F32 _floor(const F32& a) const { return (F32)llfloor(a); }  	F32 _ceil(const F32& a) const { return llceil(a); }  	F32 _atan2(const F32& a,const F32& b) const { return atan2(a,b); } diff --git a/indra/llmath/llcoord.h b/indra/llmath/llcoord.h index 706ad92787..1f617e649e 100644 --- a/indra/llmath/llcoord.h +++ b/indra/llmath/llcoord.h @@ -26,80 +26,80 @@  #ifndef LL_LLCOORD_H  #define LL_LLCOORD_H +struct LLCoordCommon +{ +	LLCoordCommon(S32 x, S32 y) : mX(x), mY(y) {} +	LLCoordCommon() : mX(0), mY(0) {} +	S32 mX; +	S32 mY; +}; +  // A two-dimensional pixel value -class LLCoord +template<typename COORD_FRAME> +class LLCoord : protected COORD_FRAME  {  public: -	S32		mX; -	S32		mY; +	typedef LLCoord<COORD_FRAME> self_t; +	typename COORD_FRAME::value_t	mX; +	typename COORD_FRAME::value_t	mY;  	LLCoord():	mX(0), mY(0)  	{}  	LLCoord(S32 x, S32 y): mX(x), mY(y)  	{} -	virtual ~LLCoord() -	{} -	virtual void set(S32 x, S32 y)		{ mX = x; mY = y; } -}; +	LLCoord(const LLCoordCommon& other) +	{ +		COORD_FRAME::convertFromCommon(other); +	} +	LLCoordCommon convert() const +	{ +		return COORD_FRAME::convertToCommon(); +	} -// GL coordinates start in the client region of a window, -// with left, bottom = 0, 0 -class LLCoordGL : public LLCoord -{ -public: -	LLCoordGL() : LLCoord() -	{} -	LLCoordGL(S32 x, S32 y) : LLCoord(x, y) -	{} -	bool operator==(const LLCoordGL& other) const { return mX == other.mX && mY == other.mY; } -	bool operator!=(const LLCoordGL& other) const { return !(*this == other); } -}; +	void set(S32 x, S32 y) { mX = x; mY = y;} +	bool operator==(const self_t& other) const { return mX == other.mX && mY == other.mY; } +	bool operator!=(const self_t& other) const { return !(*this == other); } -//bool operator ==(const LLCoordGL& a, const LLCoordGL& b); +}; -// Window coords include things like window borders, -// menu regions, etc. -class LLCoordWindow : public LLCoord +struct LL_COORD_TYPE_GL   { -public: -	LLCoordWindow() : LLCoord() -	{} -	LLCoordWindow(S32 x, S32 y) : LLCoord(x, y) -	{} -	bool operator==(const LLCoordWindow& other) const { return mX == other.mX && mY == other.mY; } -	bool operator!=(const LLCoordWindow& other) const { return !(*this == other); } -}; +	typedef S32 value_t; +	LLCoordCommon convertToCommon() const +	{ +		const LLCoord<LL_COORD_TYPE_GL>& self = static_cast<const LLCoord<LL_COORD_TYPE_GL>&>(*this); +		return LLCoordCommon(self.mX, self.mY); +	} + +	void convertFromCommon(const LLCoordCommon& from) +	{ +		LLCoord<LL_COORD_TYPE_GL>& self = static_cast<LLCoord<LL_COORD_TYPE_GL>&>(*this); +		self.mX = from.mX; +		self.mY = from.mY; +	} +}; -// Screen coords start at left, top = 0, 0 -class LLCoordScreen : public LLCoord +struct LL_COORD_TYPE_WINDOW   { -public: -	LLCoordScreen() : LLCoord() -	{} -	LLCoordScreen(S32 x, S32 y) : LLCoord(x, y) -	{} -	bool operator==(const LLCoordScreen& other) const { return mX == other.mX && mY == other.mY; } -	bool operator!=(const LLCoordScreen& other) const { return !(*this == other); } +	typedef S32 value_t; + +	LLCoordCommon convertToCommon() const; +	void convertFromCommon(const LLCoordCommon& from);  }; -class LLCoordFont : public LLCoord +struct LL_COORD_TYPE_SCREEN   { -public: -	F32 mZ; -	 -	LLCoordFont() : LLCoord(), mZ(0.f) -	{} -	LLCoordFont(S32 x, S32 y, F32 z = 0) : LLCoord(x,y), mZ(z) -	{} -	 -	void set(S32 x, S32 y) { LLCoord::set(x,y); mZ = 0.f; } -	void set(S32 x, S32 y, F32 z) { mX = x; mY = y; mZ = z; } -	bool operator==(const LLCoordFont& other) const { return mX == other.mX && mY == other.mY; } -	bool operator!=(const LLCoordFont& other) const { return !(*this == other); } +	typedef S32 value_t; + +	LLCoordCommon convertToCommon() const; +	void convertFromCommon(const LLCoordCommon& from);  }; -	 + +typedef LLCoord<LL_COORD_TYPE_GL> LLCoordGL; +typedef LLCoord<LL_COORD_TYPE_WINDOW> LLCoordWindow; +typedef LLCoord<LL_COORD_TYPE_SCREEN> LLCoordScreen;  #endif diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 761fc171c4..cc9744756f 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -2904,7 +2904,7 @@ F32 LLVolume::sculptGetSurfaceArea()  			// compute the area of the quad by taking the length of the cross product of the two triangles  			LLVector3 cross1 = (p1 - p2) % (p1 - p3);  			LLVector3 cross2 = (p4 - p2) % (p4 - p3); -			area += (cross1.magVec() + cross2.magVec()) / 2.0; +			area += (cross1.magVec() + cross2.magVec()) / 2.f;  		}  	} @@ -5890,7 +5890,7 @@ F32 find_vertex_score(LLVCacheVertexData& data)  	}  	//bonus points for having low valence -	F32 valence_boost = powf(data.mActiveTriangles, -FindVertexScore_ValenceBoostPower); +	F32 valence_boost = powf((F32)data.mActiveTriangles, -FindVertexScore_ValenceBoostPower);  	score += FindVertexScore_ValenceBoostScale * valence_boost;  	return score; diff --git a/indra/llmath/m4math.cpp b/indra/llmath/m4math.cpp index bad4deb4de..6a1b4143cf 100644 --- a/indra/llmath/m4math.cpp +++ b/indra/llmath/m4math.cpp @@ -858,25 +858,25 @@ LLSD LLMatrix4::getValue() const  void LLMatrix4::setValue(const LLSD& data)   { -	mMatrix[0][0] = data[0].asReal(); -	mMatrix[0][1] = data[1].asReal(); -	mMatrix[0][2] = data[2].asReal(); -	mMatrix[0][3] = data[3].asReal(); - -	mMatrix[1][0] = data[4].asReal(); -	mMatrix[1][1] = data[5].asReal(); -	mMatrix[1][2] = data[6].asReal(); -	mMatrix[1][3] = data[7].asReal(); - -	mMatrix[2][0] = data[8].asReal(); -	mMatrix[2][1] = data[9].asReal(); -	mMatrix[2][2] = data[10].asReal(); -	mMatrix[2][3] = data[11].asReal(); - -	mMatrix[3][0] = data[12].asReal(); -	mMatrix[3][1] = data[13].asReal(); -	mMatrix[3][2] = data[14].asReal(); -	mMatrix[3][3] = data[15].asReal(); +	mMatrix[0][0] = (F32)data[0].asReal(); +	mMatrix[0][1] = (F32)data[1].asReal(); +	mMatrix[0][2] = (F32)data[2].asReal(); +	mMatrix[0][3] = (F32)data[3].asReal(); + +	mMatrix[1][0] = (F32)data[4].asReal(); +	mMatrix[1][1] = (F32)data[5].asReal(); +	mMatrix[1][2] = (F32)data[6].asReal(); +	mMatrix[1][3] = (F32)data[7].asReal(); + +	mMatrix[2][0] = (F32)data[8].asReal(); +	mMatrix[2][1] = (F32)data[9].asReal(); +	mMatrix[2][2] = (F32)data[10].asReal(); +	mMatrix[2][3] = (F32)data[11].asReal(); + +	mMatrix[3][0] = (F32)data[12].asReal(); +	mMatrix[3][1] = (F32)data[13].asReal(); +	mMatrix[3][2] = (F32)data[14].asReal(); +	mMatrix[3][3] = (F32)data[15].asReal();  } diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index 3bcaffc275..b93d429feb 100644 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -271,10 +271,10 @@ void LLCurl::Easy::releaseEasyHandle(CURL* handle)  		if(sFreeHandles.size() < MAX_NUM_FREE_HANDLES)  		{ -			sFreeHandles.insert(handle); -		} -		else -		{ +		sFreeHandles.insert(handle); +	} +	else +	{  			LLCurl::deleteEasyHandle(handle) ;  		}  	} @@ -453,9 +453,9 @@ size_t curlReadCallback(char* data, size_t size, size_t nmemb, void* user_data)  	LLCurl::Easy* easy = (LLCurl::Easy*)user_data;  	S32 n = size * nmemb; -	S32 startpos = easy->getInput().tellg(); +	S32 startpos = (S32)easy->getInput().tellg();  	easy->getInput().seekg(0, std::ios::end); -	S32 endpos = easy->getInput().tellg(); +	S32 endpos = (S32)easy->getInput().tellg();  	easy->getInput().seekg(startpos, std::ios::beg);  	S32 maxn = endpos - startpos;  	n = llmin(n, maxn); @@ -560,16 +560,16 @@ LLCurl::Multi::Multi(F32 idle_time_out)  	}  	//llassert_always(mCurlMultiHandle);	 -	 +  	if(mCurlMultiHandle)  	{ -		if(LLCurl::getCurlThread()->getThreaded()) -		{ -			mMutexp = new LLMutex(NULL) ; -			mDeletionMutexp = new LLMutex(NULL) ; -			mEasyMutexp = new LLMutex(NULL) ; -		} -		LLCurl::getCurlThread()->addMulti(this) ; +	if(LLCurl::getCurlThread()->getThreaded()) +	{ +		mMutexp = new LLMutex(NULL) ; +		mDeletionMutexp = new LLMutex(NULL) ; +		mEasyMutexp = new LLMutex(NULL) ; +	} +	LLCurl::getCurlThread()->addMulti(this) ;  		mIdleTimeOut = idle_time_out ;  		if(mIdleTimeOut < LLCurl::sCurlRequestTimeOut) @@ -577,8 +577,8 @@ LLCurl::Multi::Multi(F32 idle_time_out)  			mIdleTimeOut = LLCurl::sCurlRequestTimeOut ;  		} -		++gCurlMultiCount; -	} +	++gCurlMultiCount; +}  }  LLCurl::Multi::~Multi() @@ -617,7 +617,7 @@ void LLCurl::Multi::cleanup()  	mDeletionMutexp = NULL ;  	delete mEasyMutexp ;  	mEasyMutexp = NULL ; -	 +  	mQueued = 0 ;  	mState = STATE_COMPLETED; @@ -738,7 +738,7 @@ bool LLCurl::Multi::doPerform()  		}  		mQueued = q;	 -		setState(STATE_COMPLETED) ;		 +		setState(STATE_COMPLETED) ;  		mIdleTimer.reset() ;  	}  	else if(mIdleTimer.getElapsedTimeF32() > mIdleTimeOut) //idle for too long, remove it. @@ -911,8 +911,8 @@ bool LLCurlThread::CurlRequest::processRequest()  		if(!completed)  		{ -			setPriority(LLQueuedThread::PRIORITY_LOW) ; -		} +		setPriority(LLQueuedThread::PRIORITY_LOW) ; +	}  	}  	return completed ; @@ -922,7 +922,7 @@ void LLCurlThread::CurlRequest::finishRequest(bool completed)  {  	if(mMulti->isDead())  	{ -		mCurlThread->deleteMulti(mMulti) ; +	mCurlThread->deleteMulti(mMulti) ;  	}  	else  	{ @@ -968,8 +968,8 @@ void LLCurlThread::killMulti(LLCurl::Multi* multi)  	if(multi->isValid())  	{ -		multi->markDead() ; -	} +	multi->markDead() ; +}  	else  	{  		deleteMulti(multi) ; @@ -1033,7 +1033,7 @@ void LLCurlRequest::addMulti()  		mActiveRequestCount = 0 ;  		return;  	} - +	  	mMultiSet.insert(multi);  	mActiveMulti = multi;  	mActiveRequestCount = 0; @@ -1229,15 +1229,15 @@ LLCurlEasyRequest::LLCurlEasyRequest()  	if(mMulti->isValid())  	{ -		mEasy = mMulti->allocEasy(); -		if (mEasy) -		{ -			mEasy->setErrorBuffer(); -			mEasy->setCA(); -			// Set proxy settings if configured to do so. -			LLProxy::getInstance()->applyProxySettings(mEasy); -		} +	mEasy = mMulti->allocEasy(); +	if (mEasy) +	{ +		mEasy->setErrorBuffer(); +		mEasy->setCA(); +		// Set proxy settings if configured to do so. +		LLProxy::getInstance()->applyProxySettings(mEasy);  	} +}  	else  	{  		LLCurl::getCurlThread()->killMulti(mMulti) ; diff --git a/indra/llmessage/llhttpclient.cpp b/indra/llmessage/llhttpclient.cpp index 231cb7ca8f..0c325a68aa 100644 --- a/indra/llmessage/llhttpclient.cpp +++ b/indra/llmessage/llhttpclient.cpp @@ -158,7 +158,7 @@ namespace  			if(fstream.is_open())  			{  				fstream.seekg(0, std::ios::end); -				U32 fileSize = fstream.tellg(); +				U32 fileSize = (U32)fstream.tellg();  				fstream.seekg(0, std::ios::beg);  				std::vector<char> fileBuffer(fileSize);  				fstream.read(&fileBuffer[0], fileSize); diff --git a/indra/llmessage/llmime.cpp b/indra/llmessage/llmime.cpp index 943a734927..9d9c4ebd68 100644 --- a/indra/llmessage/llmime.cpp +++ b/indra/llmessage/llmime.cpp @@ -388,7 +388,7 @@ bool LLMimeParser::Impl::parseHeaders(  		// not to read past limit when we get() the newline.  		S32 max_get = llmin((S32)LINE_BUFFER_LENGTH, limit - mScanCount - 1);  		istr.getline(mBuffer, max_get, '\r'); -		mScanCount += istr.gcount(); +		mScanCount += (S32)istr.gcount();  		int c = istr.get();  		if(EOF == c)  		{ @@ -496,7 +496,7 @@ void LLMimeParser::Impl::scanPastSeparator(  		// past limit when we get() the newline.  		S32 max_get = llmin((S32)LINE_BUFFER_LENGTH, limit - mScanCount - 1);  		istr.getline(mBuffer, max_get, '\r'); -		mScanCount += istr.gcount(); +		mScanCount += (S32)istr.gcount();  		if(istr.gcount() >= LINE_BUFFER_LENGTH - 1)  		{  			// that's way too long to be a separator, so ignore it. diff --git a/indra/llmessage/llsdmessage.cpp b/indra/llmessage/llsdmessage.cpp index 9148c9dd15..1c93c12d99 100644 --- a/indra/llmessage/llsdmessage.cpp +++ b/indra/llmessage/llsdmessage.cpp @@ -88,7 +88,7 @@ bool LLSDMessage::httpListener(const LLSD& request)                                                         request,                                                         url, "POST", reply, error),                         LLSD(),      // headers -                       timeout); +                       (F32)timeout);      return false;  } diff --git a/indra/llmessage/llsdmessagebuilder.cpp b/indra/llmessage/llsdmessagebuilder.cpp index 2698a271ee..615221e0ad 100644 --- a/indra/llmessage/llsdmessagebuilder.cpp +++ b/indra/llmessage/llsdmessagebuilder.cpp @@ -317,7 +317,7 @@ void LLSDMessageBuilder::copyFromMessageData(const LLMsgData& data)  			// S64 not supported in LLSD so we just truncate it  			case MVT_S64: -				addS32(varname, *(S64*)mvci.getData()); +				addS32(varname, (S32)*(S64*)mvci.getData());  				break;  			case MVT_F32: diff --git a/indra/llmessage/llxfer.h b/indra/llmessage/llxfer.h index 989e8b2cab..f9348eb11f 100644 --- a/indra/llmessage/llxfer.h +++ b/indra/llmessage/llxfer.h @@ -29,6 +29,7 @@  #include "message.h"  #include "lltimer.h" +#include "llextendedstatus.h"  const S32 LL_XFER_LARGE_PAYLOAD = 7680; diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp index d0b0e178b8..6a425cfe98 100644 --- a/indra/llmessage/message.cpp +++ b/indra/llmessage/message.cpp @@ -3147,7 +3147,7 @@ bool LLMessageSystem::generateDigestForWindowAndUUIDs(char* digest, const S32 wi  		LL_ERRS("Messaging") << "Trying to generate complex digest on a machine without a shared secret!" << llendl;  	} -	U32 now = time(NULL); +	U32 now = (U32)time(NULL);  	now /= window; @@ -3167,7 +3167,7 @@ bool LLMessageSystem::isMatchingDigestForWindowAndUUIDs(const char* digest, cons  	}  	char our_digest[MD5HEX_STR_SIZE];	/* Flawfinder: ignore */ -	U32 now = time(NULL); +	U32 now = (U32)time(NULL);  	now /= window; @@ -3213,7 +3213,7 @@ bool LLMessageSystem::generateDigestForWindow(char* digest, const S32 window) co  		LL_ERRS("Messaging") << "Trying to generate simple digest on a machine without a shared secret!" << llendl;  	} -	U32 now = time(NULL); +	U32 now = (U32)time(NULL);  	now /= window; diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 82e8227ffe..fccbf37a8d 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -56,8 +56,9 @@ std::string LLFontGL::sAppDir;  LLColor4 LLFontGL::sShadowColor(0.f, 0.f, 0.f, 1.f);  LLFontRegistry* LLFontGL::sFontRegistry = NULL; -LLCoordFont LLFontGL::sCurOrigin; -std::vector<LLCoordFont> LLFontGL::sOriginStack; +LLCoordGL LLFontGL::sCurOrigin; +F32 LLFontGL::sCurDepth; +std::vector<std::pair<LLCoordGL, F32> > LLFontGL::sOriginStack;  const F32 EXT_X_BEARING = 1.f;  const F32 EXT_Y_BEARING = 0.f; @@ -68,20 +69,6 @@ const F32 PIXEL_CORRECTION_DISTANCE = 0.01f;  const F32 PAD_UVY = 0.5f; // half of vertical padding between glyphs in the glyph texture  const F32 DROP_SHADOW_SOFT_STRENGTH = 0.3f; -static F32 llfont_round_x(F32 x) -{ -	//return llfloor((x-LLFontGL::sCurOrigin.mX)/LLFontGL::sScaleX+0.5f)*LLFontGL::sScaleX+LLFontGL::sCurOrigin.mX; -	//return llfloor(x/LLFontGL::sScaleX+0.5f)*LLFontGL::sScaleY; -	return x; -} - -static F32 llfont_round_y(F32 y) -{ -	//return llfloor((y-LLFontGL::sCurOrigin.mY)/LLFontGL::sScaleY+0.5f)*LLFontGL::sScaleY+LLFontGL::sCurOrigin.mY; -	//return llfloor(y+0.5f); -	return y; -} -  LLFontGL::LLFontGL()  {  } @@ -115,23 +102,23 @@ static LLFastTimer::DeclareTimer FTM_RENDER_FONTS("Fonts");  S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, const LLRect& rect, const LLColor4 &color, HAlign halign, VAlign valign, U8 style,   					 ShadowType shadow, S32 max_chars, F32* right_x, BOOL use_ellipses) const  { -	F32 x = rect.mLeft; +	F32 x = (F32)rect.mLeft;  	F32 y = 0.f;  	switch(valign)  	{  	case TOP: -		y = rect.mTop; +		y = (F32)rect.mTop;  		break;  	case VCENTER: -		y = rect.getCenterY(); +		y = (F32)rect.getCenterY();  		break;  	case BASELINE:  	case BOTTOM: -		y = rect.mBottom; +		y = (F32)rect.mBottom;  		break;  	default: -		y = rect.mBottom; +		y = (F32)rect.mBottom;  		break;  	}  	return render(wstr, begin_offset, x, y, color, halign, valign, style, shadow, max_chars, rect.getWidth(), right_x, use_ellipses); @@ -177,21 +164,11 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  	gGL.loadUIIdentity(); -	//gGL.translateUI(floorf(sCurOrigin.mX*sScaleX), floorf(sCurOrigin.mY*sScaleY), sCurOrigin.mZ); - -	// this code snaps the text origin to a pixel grid to start with -	//F32 pixel_offset_x = llround((F32)sCurOrigin.mX) - (sCurOrigin.mX); -	//F32 pixel_offset_y = llround((F32)sCurOrigin.mY) - (sCurOrigin.mY); -	//gGL.translateUI(-pixel_offset_x, -pixel_offset_y, 0.f); -  	LLVector2 origin(floorf(sCurOrigin.mX*sScaleX), floorf(sCurOrigin.mY*sScaleY)); -	// snap the text origin to a pixel grid to start with -	origin.mV[VX] -= llround((F32)sCurOrigin.mX) - (sCurOrigin.mX); -	origin.mV[VY] -= llround((F32)sCurOrigin.mY) - (sCurOrigin.mY); -	// Depth translation, so that floating text appears 'inworld' -	// and is correclty occluded. -	gGL.translatef(0.f,0.f,sCurOrigin.mZ); +	// Depth translation, so that floating text appears 'in-world' +	// and is correctly occluded. +	gGL.translatef(0.f,0.f,sCurDepth);  	S32 chars_drawn = 0;  	S32 i; @@ -215,16 +192,17 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  	cur_y = ((F32)y * sScaleY) + origin.mV[VY];  	// Offset y by vertical alignment. +	// use unscaled font metrics here  	switch (valign)  	{  	case TOP: -		cur_y -= mFontFreetype->getAscenderHeight(); +		cur_y -= llceil(mFontFreetype->getAscenderHeight());  		break;  	case BOTTOM: -		cur_y += mFontFreetype->getDescenderHeight(); +		cur_y += llceil(mFontFreetype->getDescenderHeight());  		break;  	case VCENTER: -		cur_y -= (mFontFreetype->getAscenderHeight() - mFontFreetype->getDescenderHeight()) / 2.f; +		cur_y -= llceil((llceil(mFontFreetype->getAscenderHeight()) - llceil(mFontFreetype->getDescenderHeight())) / 2.f);  		break;  	case BASELINE:  		// Baseline, do nothing. @@ -250,7 +228,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  	cur_render_y = cur_y;  	cur_render_x = cur_x; -	F32 start_x = llround(cur_x); +	F32 start_x = (F32)llround(cur_x);  	const LLFontBitmapCache* font_bitmap_cache = mFontFreetype->getFontBitmapCache(); @@ -334,10 +312,10 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  				(fgi->mXBitmapOffset + fgi->mWidth) * inv_width,  				(fgi->mYBitmapOffset - PAD_UVY) * inv_height);  		// snap glyph origin to whole screen pixel -		LLRectf screen_rect(llround(cur_render_x + (F32)fgi->mXBearing), -				    llround(cur_render_y + (F32)fgi->mYBearing), -				    llround(cur_render_x + (F32)fgi->mXBearing) + (F32)fgi->mWidth, -				    llround(cur_render_y + (F32)fgi->mYBearing) - (F32)fgi->mHeight); +		LLRectf screen_rect((F32)llround(cur_render_x + (F32)fgi->mXBearing), +				    (F32)llround(cur_render_y + (F32)fgi->mYBearing), +				    (F32)llround(cur_render_x + (F32)fgi->mXBearing) + (F32)fgi->mWidth, +				    (F32)llround(cur_render_y + (F32)fgi->mYBearing) - (F32)fgi->mHeight);  		if (glyph_count >= GLYPH_BATCH_SIZE)  		{ @@ -390,12 +368,12 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  	//FIXME: add underline as glyph?  	if (style_to_add & UNDERLINE)  	{ -		F32 descender = mFontFreetype->getDescenderHeight(); +		F32 descender = (F32)llfloor(mFontFreetype->getDescenderHeight());  		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);  		gGL.begin(LLRender::LINES); -		gGL.vertex2f(start_x, cur_y - (descender)); -		gGL.vertex2f(cur_x, cur_y - (descender)); +		gGL.vertex2f(start_x, cur_y - descender); +		gGL.vertex2f(cur_x, cur_y - descender);  		gGL.end();  	} @@ -444,19 +422,9 @@ S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y  }  // font metrics - override for LLFontFreetype that returns units of virtual pixels -F32 LLFontGL::getLineHeight() const +S32 LLFontGL::getLineHeight() const  {  -	return (F32)llround(mFontFreetype->getLineHeight() / sScaleY);  -} - -F32 LLFontGL::getAscenderHeight() const -{  -	return (F32)llround(mFontFreetype->getAscenderHeight() / sScaleY);  -} - -F32 LLFontGL::getDescenderHeight() const -{  -	return (F32)llround(mFontFreetype->getDescenderHeight() / sScaleY);  +	return llceil(mFontFreetype->getAscenderHeight() / sScaleY) + llceil(mFontFreetype->getDescenderHeight() / sScaleY);  }  S32 LLFontGL::getWidth(const std::string& utf8text) const @@ -645,7 +613,7 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch  		}  		// Round after kerning. -		cur_x = llround(cur_x); +		cur_x = (F32)llround(cur_x);  		drawn_x = cur_x;  	} @@ -716,7 +684,7 @@ S32	LLFontGL::firstDrawableChar(const llwchar* wchars, F32 max_pixels, S32 text_  		}  		// Round after kerning. -		total_width = llround(total_width); +		total_width = (F32)llround(total_width);  	}  	if (drawable_chars == 0) @@ -799,7 +767,7 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t  		// Round after kerning. -		cur_x = llround(cur_x); +		cur_x = (F32)llround(cur_x);  	}  	return llmin(max_chars, pos - begin_offset); @@ -1146,22 +1114,22 @@ void LLFontGL::renderQuad(LLVector3* vertex_out, LLVector2* uv_out, LLColor4U* c  {  	S32 index = 0; -	vertex_out[index] = LLVector3(llfont_round_x(screen_rect.mRight), llfont_round_y(screen_rect.mTop), 0.f); +	vertex_out[index] = LLVector3(screen_rect.mRight, screen_rect.mTop, 0.f);  	uv_out[index] = LLVector2(uv_rect.mRight, uv_rect.mTop);  	colors_out[index] = color;  	index++; -	vertex_out[index] = LLVector3(llfont_round_x(screen_rect.mLeft), llfont_round_y(screen_rect.mTop), 0.f); +	vertex_out[index] = LLVector3(screen_rect.mLeft, screen_rect.mTop, 0.f);  	uv_out[index] = LLVector2(uv_rect.mLeft, uv_rect.mTop);  	colors_out[index] = color;  	index++; -	vertex_out[index] = LLVector3(llfont_round_x(screen_rect.mLeft), llfont_round_y(screen_rect.mBottom), 0.f); +	vertex_out[index] = LLVector3(screen_rect.mLeft, screen_rect.mBottom, 0.f);  	uv_out[index] = LLVector2(uv_rect.mLeft, uv_rect.mBottom);  	colors_out[index] = color;  	index++; -	vertex_out[index] = LLVector3(llfont_round_x(screen_rect.mRight), llfont_round_y(screen_rect.mBottom), 0.f); +	vertex_out[index] = LLVector3(screen_rect.mRight, screen_rect.mBottom, 0.f);  	uv_out[index] = LLVector2(uv_rect.mRight, uv_rect.mBottom);  	colors_out[index] = color;  } diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index dc8d848ed2..74bdbb43e7 100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -115,9 +115,7 @@ public:  	S32 renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style = NORMAL, ShadowType shadow = NO_SHADOW) const;  	// font metrics - override for LLFontFreetype that returns units of virtual pixels -	F32 getLineHeight() const; -	F32 getAscenderHeight() const; -	F32 getDescenderHeight() const; +	S32 getLineHeight() const;  	S32 getWidth(const std::string& utf8text) const;  	S32 getWidth(const llwchar* wchars) const; @@ -188,8 +186,9 @@ public:  	static std::string getFontPathLocal();  	static std::string getFontPathSystem(); -	static LLCoordFont sCurOrigin; -	static std::vector<LLCoordFont> sOriginStack; +	static LLCoordGL sCurOrigin; +	static F32			sCurDepth; +	static std::vector<std::pair<LLCoordGL, F32> > sOriginStack;  	static LLColor4 sShadowColor; diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index 7a5f9f9fd6..c025cd7939 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -976,7 +976,7 @@ void LLAccordionCtrlTab::drawChild(const LLRect& root_rect,LLView* child)  			gGL.matrixMode(LLRender::MM_MODELVIEW);  			LLUI::pushMatrix();  			{ -				LLUI::translate((F32)child->getRect().mLeft, (F32)child->getRect().mBottom, 0.f); +				LLUI::translate((F32)child->getRect().mLeft, (F32)child->getRect().mBottom);  				child->draw();  			} diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index f0d92d597a..705fe16559 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -908,9 +908,9 @@ void LLButton::draw()  		// Not sure if it is really needed. Probably S32_MAX should be always passed as max_chars.  		mLastDrawCharsCount = mGLFont->render(label, 0,  			(F32)x, -			(F32)(mBottomVPad + y_offset), +			(F32)(getRect().getHeight() / 2 + mBottomVPad),  			label_color % alpha, -			mHAlign, LLFontGL::BOTTOM, +			mHAlign, LLFontGL::VCENTER,  			LLFontGL::NORMAL,  			mDropShadowedText ? LLFontGL::DROP_SHADOW_SOFT : LLFontGL::NO_SHADOW,  			S32_MAX, text_width, diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index 89d8842393..806d2ef3f6 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -613,7 +613,7 @@ void LLComboBox::showList()  	}  	mList->setOrigin(rect.mLeft, rect.mBottom);  	mList->reshape(rect.getWidth(), rect.getHeight()); -	mList->translateIntoRect(root_view_local, FALSE); +	mList->translateIntoRect(root_view_local);  	// Make sure we didn't go off bottom of screen  	S32 x, y; diff --git a/indra/llui/lldraghandle.cpp b/indra/llui/lldraghandle.cpp index 42e6c3c786..5f69c6af31 100644 --- a/indra/llui/lldraghandle.cpp +++ b/indra/llui/lldraghandle.cpp @@ -244,7 +244,7 @@ void LLDragHandleTop::reshapeTitleBox()  	const LLFontGL* font = LLFontGL::getFontSansSerif();  	S32 title_width = getRect().getWidth();  	title_width -= LEFT_PAD + 2 * BORDER_PAD + getButtonsRect().getWidth(); -	S32 title_height = llround(font->getLineHeight()); +	S32 title_height = font->getLineHeight();  	LLRect title_rect;  	title_rect.setLeftTopAndSize(   		LEFT_PAD,  diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 33548151fd..22b20969fc 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -270,6 +270,7 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)  	mMinimizeSignal(NULL)  //	mNotificationContext(NULL)  { +	mPosition.setFloater(*this);  //	mNotificationContext = new LLFloaterNotificationContext(getHandle());  	// Clicks stop here. @@ -925,7 +926,7 @@ void LLFloater::applyPositioning(LLFloater* other)  			setOrigin(mSpecifiedLeft, mSpecifiedBottom);  			const LLRect& snap_rect = gFloaterView->getSnapRect();  			translate(snap_rect.mLeft, snap_rect.mBottom); -			translateIntoRect(snap_rect, FALSE); +			translateIntoRect(snap_rect);  		}  		break; @@ -949,7 +950,7 @@ void LLFloater::applyPositioning(LLFloater* other)  			setOrigin(horizontal_offset, vertical_offset - rect_height);  			translate(snap_rect.mLeft, snap_rect.mBottom); -			translateIntoRect(snap_rect, FALSE); +			translateIntoRect(snap_rect);  		}  		break; @@ -1681,6 +1682,8 @@ LLFloater* LLFloater::getClosableFloaterFromFocus()  	{  		if (it->hasFocus())  		{ +			LLFloater& floater = *it; +			focused_floater = &floater;  			break;  		}  	} @@ -1800,7 +1803,7 @@ void LLFloater::draw()  				const LLFontGL* font = LLFontGL::getFontSansSerif();  				LLRect r = getRect(); -				gl_rect_2d_offset_local(0, r.getHeight(), r.getWidth(), r.getHeight() - (S32)font->getLineHeight() - 1,  +				gl_rect_2d_offset_local(0, r.getHeight(), r.getWidth(), r.getHeight() - font->getLineHeight() - 1,   					titlebar_focus_color % alpha, 0, TRUE);  			}  		} @@ -2641,6 +2644,8 @@ void LLFloaterView::refresh()  	}  } +const S32 FLOATER_MIN_VISIBLE_PIXELS = 16; +  void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_outside)  {  	if (floater->getParent() != this) @@ -2694,7 +2699,7 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out  	}  	// move window fully onscreen -	if (floater->translateIntoRect( getSnapRect(), allow_partial_outside )) +	if (floater->translateIntoRect( getSnapRect(), allow_partial_outside ? FLOATER_MIN_VISIBLE_PIXELS : S32_MAX ))  	{  		floater->clearSnapTarget();  	} @@ -3269,3 +3274,112 @@ void LLFloater::stackWith(LLFloater& other)  	setShape(next_rect);  } +LLCoordFloater::LLCoordFloater(F32 x, F32 y, LLFloater& floater) +:	coord_t((S32)x, (S32)y) +{ +	mFloater = floater.getHandle(); +} + + +LLCoordFloater::LLCoordFloater(const LLCoordCommon& other, LLFloater& floater) +{ +	mFloater = floater.getHandle(); +	convertFromCommon(other); +} + +LLCoordFloater& LLCoordFloater::operator=(const LLCoordFloater& other) +{ +	mFloater = other.mFloater; +	coord_t::operator =(other); +	return *this; +} + +void LLCoordFloater::setFloater(LLFloater& floater) +{ +	mFloater = floater.getHandle(); +} + +bool LLCoordFloater::operator==(const LLCoordFloater& other) const  +{  +	return mX == other.mX && mY == other.mY && mFloater == other.mFloater;  +} + +LLCoordCommon LL_COORD_FLOATER::convertToCommon() const +{ +	const LLCoordFloater& self = static_cast<const LLCoordFloater&>(*this); + +	LLRect snap_rect = gFloaterView->getSnapRect(); +	LLFloater* floaterp = mFloater.get(); +	S32 floater_width = floaterp ? floaterp->getRect().getWidth() : 0; +	S32 floater_height = floaterp ? floaterp->getRect().getHeight() : 0; +	LLCoordCommon out; +	if (self.mX < -0.5f) +	{ +		out.mX = llround(rescale(self.mX, -1.f, -0.5f, snap_rect.mLeft - (floater_width - FLOATER_MIN_VISIBLE_PIXELS), snap_rect.mLeft)); +	} +	else if (self.mX > 0.5f) +	{ +		out.mX = llround(rescale(self.mX, 0.5f, 1.f, snap_rect.mRight - floater_width, snap_rect.mRight - FLOATER_MIN_VISIBLE_PIXELS)); +	} +	else +	{ +		out.mX = llround(rescale(self.mX, -0.5f, 0.5f, snap_rect.mLeft, snap_rect.mRight - floater_width)); +	} + +	if (self.mY < -0.5f) +	{ +		out.mY = llround(rescale(self.mY, -1.f, -0.5f, snap_rect.mBottom - (floater_height - FLOATER_MIN_VISIBLE_PIXELS), snap_rect.mBottom)); +	} +	else if (self.mY > 0.5f) +	{ +		out.mY = llround(rescale(self.mY, 0.5f, 1.f, snap_rect.mTop - floater_height, snap_rect.mTop - FLOATER_MIN_VISIBLE_PIXELS)); +	} +	else +	{ +		out.mY = llround(rescale(self.mY, -0.5f, 0.5f, snap_rect.mBottom, snap_rect.mTop - floater_height)); +	} + +	// return center point instead of lower left +	out.mX += floater_width / 2; +	out.mY += floater_height / 2; + +	return out; +} + +void LL_COORD_FLOATER::convertFromCommon(const LLCoordCommon& from) +{ +	LLCoordFloater& self = static_cast<LLCoordFloater&>(*this); +	LLRect snap_rect = gFloaterView->getSnapRect(); +	LLFloater* floaterp = mFloater.get(); +	S32 floater_width = floaterp ? floaterp->getRect().getWidth() : 0; +	S32 floater_height = floaterp ? floaterp->getRect().getHeight() : 0; + +	S32 from_x = from.mX - floater_width / 2; +	S32 from_y = from.mY - floater_height / 2; + +	if (from_x < snap_rect.mLeft) +	{ +		self.mX = rescale(from_x, snap_rect.mLeft - (floater_width - FLOATER_MIN_VISIBLE_PIXELS), snap_rect.mLeft, -1.f, -0.5f); +	} +	else if (from_x + floater_width > snap_rect.mRight) +	{ +		self.mX = rescale(from_x, snap_rect.mRight - floater_width, snap_rect.mRight - FLOATER_MIN_VISIBLE_PIXELS, 0.5f, 1.f); +	} +	else +	{ +		self.mX = rescale(from_x, snap_rect.mLeft, snap_rect.mRight - floater_width, -0.5f, 0.5f); +	} + +	if (from_y < snap_rect.mBottom) +	{ +		self.mY = rescale(from_y, snap_rect.mBottom - (floater_height - FLOATER_MIN_VISIBLE_PIXELS), snap_rect.mBottom, -1.f, -0.5f); +	} +	else if (from_y + floater_height > snap_rect.mTop) +	{ +		self.mY = rescale(from_y, snap_rect.mTop - floater_height, snap_rect.mTop - FLOATER_MIN_VISIBLE_PIXELS, 0.5f, 1.f); +	} +	else +	{ +		self.mY = rescale(from_y, snap_rect.mBottom, snap_rect.mTop - floater_height, -0.5f, 0.5f); +	} +} diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 59b35d206f..a7cc9ae961 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -82,6 +82,37 @@ namespace LLInitParam  	};  } +struct LL_COORD_FLOATER +{ +	typedef F32 value_t; + +	LLCoordCommon convertToCommon() const; +	void convertFromCommon(const LLCoordCommon& from); +protected: +	LLHandle<LLFloater> mFloater; +}; + +struct LLCoordFloater : LLCoord<LL_COORD_FLOATER> +{ +	typedef LLCoord<LL_COORD_FLOATER> coord_t; + +	LLCoordFloater() {} +	LLCoordFloater(F32 x, F32 y, LLFloater& floater); +	LLCoordFloater(const LLCoordCommon& other, LLFloater& floater); + +	LLCoordFloater& operator=(const LLCoordCommon& other) +	{ +		convertFromCommon(other); +		return *this; +	} + +	LLCoordFloater& operator=(const LLCoordFloater& other); + +	bool operator==(const LLCoordFloater& other) const; +	bool operator!=(const LLCoordFloater& other) const { return !(*this == other); } + +	void setFloater(LLFloater& floater); +};  class LLFloater : public LLPanel, public LLInstanceTracker<LLFloater>  { @@ -184,7 +215,7 @@ public:  	bool initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::string& filename, LLXMLNodePtr output_node = NULL);  	/*virtual*/ void handleReshape(const LLRect& new_rect, bool by_user = false); -	/*virtual*/ BOOL canSnapTo(const LLView* other_view); +	/*virtual*/ BOOL canSnapTo(const LLView* other_view);   	/*virtual*/ void setSnappedTo(const LLView* snap_view);  	/*virtual*/ void setFocus( BOOL b );  	/*virtual*/ void setIsChrome(BOOL is_chrome); @@ -425,6 +456,7 @@ private:  	LLFloaterEnums::EOpenPositioning	mOpenPositioning;  	S32									mSpecifiedLeft;  	S32									mSpecifiedBottom; +	LLCoordFloater	mPosition;  	S32				mMinWidth;  	S32				mMinHeight; diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 2f1c2a47c9..ae262f794e 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -36,7 +36,7 @@  #include "llcriticaldamp.h"  #include "boost/foreach.hpp" -static const F32 MIN_FRACTIONAL_SIZE = 0.0001f; +static const F32 MIN_FRACTIONAL_SIZE = 0.0f;  static const F32 MAX_FRACTIONAL_SIZE = 1.f;  static LLDefaultChildRegistry::Register<LLLayoutStack> register_layout_stack("layout_stack"); @@ -129,6 +129,12 @@ void LLLayoutPanel::setOrientation( LLLayoutStack::ELayoutOrientation orientatio  		? getRect().getWidth()  		: getRect().getHeight())); +	if (mAutoResize == FALSE  +		&& mUserResize == TRUE  +		&& mMinDim == -1 ) +	{ +		setMinDim(layout_dim); +	}  	mTargetDim = llmax(layout_dim, getMinDim());  } @@ -306,7 +312,6 @@ void LLLayoutStack::updateLayout()  	bool animation_in_progress = animatePanels();  	F32 total_visible_fraction = 0.f; -	F32 total_open_fraction = 0.f;  	S32 space_to_distribute = (mOrientation == HORIZONTAL)  							? getRect().getWidth()  							: getRect().getHeight(); @@ -318,20 +323,17 @@ void LLLayoutStack::updateLayout()  		if (panelp->mAutoResize)  		{  			panelp->mTargetDim = panelp->getRelevantMinDim(); -			if (!panelp->mCollapsed && panelp->getVisible()) -			{ -				total_open_fraction += panelp->mFractionalSize; -			}  		}  		space_to_distribute -= panelp->getVisibleDim() + llround((F32)mPanelSpacing * panelp->getVisibleAmount()); -		total_visible_fraction += panelp->mFractionalSize; +		total_visible_fraction += panelp->mFractionalSize * panelp->getAutoResizeFactor();  	} -	llassert(total_visible_fraction < 1.01f); +	llassert(total_visible_fraction < 1.05f);  	// don't need spacing after last panel  	space_to_distribute += panelp ? llround((F32)mPanelSpacing * panelp->getVisibleAmount()) : 0; +	S32 remaining_space = space_to_distribute;  	F32 fraction_distributed = 0.f;  	if (space_to_distribute > 0 && total_visible_fraction > 0.f)  	{	// give space proportionally to visible auto resize panels @@ -343,26 +345,23 @@ void LLLayoutStack::updateLayout()  				S32 delta = llround((F32)space_to_distribute * fraction_to_distribute);  				fraction_distributed += fraction_to_distribute;  				panelp->mTargetDim += delta; +				remaining_space -= delta;  			}  		}  	} -	if (fraction_distributed < total_visible_fraction) -	{	// distribute any left over pixels to non-collapsed, visible panels -		F32 fraction_left = total_visible_fraction - fraction_distributed; -		S32 space_left = llround((F32)space_to_distribute * (fraction_left / total_visible_fraction)); +	// distribute any left over pixels to non-collapsed, visible panels +	BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) +	{ +		if (remaining_space == 0) break; -		BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) +		if (panelp->mAutoResize  +			&& !panelp->mCollapsed  +			&& panelp->getVisible())  		{ -			if (panelp->mAutoResize  -				&& !panelp->mCollapsed  -				&& panelp->getVisible()) -			{ -				S32 space_for_panel = llmax(0, llround((F32)space_left * (panelp->mFractionalSize / total_open_fraction))); -				panelp->mTargetDim += space_for_panel; -				space_left -= space_for_panel; -				total_open_fraction -= panelp->mFractionalSize; -			} +			S32 space_for_panel = remaining_space > 0 ? 1 : -1; +			panelp->mTargetDim += space_for_panel; +			remaining_space -= space_for_panel;  		}  	} @@ -494,33 +493,46 @@ void LLLayoutStack::updateClass()  void LLLayoutStack::updateFractionalSizes()  { -	F32 total_resizable_dim = 0; -	S32 num_auto_resize_panels = 0; +	F32 total_resizable_dim = 0.f;  	BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)  	{  		if (panelp->mAutoResize)  		{  			total_resizable_dim += llmax(0, panelp->getLayoutDim() - panelp->getRelevantMinDim()); -			num_auto_resize_panels++;  		}  	} -	F32 total_fractional_size = 0.f; -	  	BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)  	{  		if (panelp->mAutoResize)  		{  			F32 panel_resizable_dim = llmax(MIN_FRACTIONAL_SIZE, (F32)(panelp->getLayoutDim() - panelp->getRelevantMinDim()));  			panelp->mFractionalSize = panel_resizable_dim > 0.f  -										? llclamp(panel_resizable_dim / total_resizable_dim, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE) -										: MIN_FRACTIONAL_SIZE; -			total_fractional_size += panelp->mFractionalSize; +				? llclamp(panel_resizable_dim / total_resizable_dim, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE) +				: MIN_FRACTIONAL_SIZE;  			llassert(!llisnan(panelp->mFractionalSize));  		}  	} +	normalizeFractionalSizes(); +} + + +void LLLayoutStack::normalizeFractionalSizes() +{ +	S32 num_auto_resize_panels = 0; +	F32 total_fractional_size = 0.f; +	 +	BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) +	{ +		if (panelp->mAutoResize) +		{ +			total_fractional_size += panelp->mFractionalSize; +			num_auto_resize_panels++; +		} +	} +  	if (total_fractional_size == 0.f)  	{ // equal distribution  		BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) @@ -632,7 +644,7 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  	F32 total_visible_fraction = 0.f;  	F32 delta_auto_resize_headroom = 0.f; -	F32 total_auto_resize_headroom = 0.f; +	F32 original_auto_resize_headroom = 0.f;  	LLLayoutPanel* other_resize_panel = NULL;  	LLLayoutPanel* following_panel = NULL; @@ -641,8 +653,11 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  	{  		if (panelp->mAutoResize)  		{ -			total_auto_resize_headroom += (F32)(panelp->mTargetDim - panelp->getRelevantMinDim()); -			total_visible_fraction += panelp->mFractionalSize * panelp->getAutoResizeFactor(); +			original_auto_resize_headroom += (F32)(panelp->mTargetDim - panelp->getRelevantMinDim()); +			if (panelp->getVisible() && !panelp->mCollapsed) +			{ +				total_visible_fraction += panelp->mFractionalSize; +			}  		}  		if (panelp == resized_panel) @@ -656,18 +671,25 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  		}  	} -	if (resized_panel->mAutoResize == FALSE) + +	if (resized_panel->mAutoResize)  	{ -		delta_auto_resize_headroom += -delta_dim; +		if (!other_resize_panel || !other_resize_panel->mAutoResize) +		{ +			delta_auto_resize_headroom += delta_dim;	 +		}  	} -	if (other_resize_panel && other_resize_panel->mAutoResize == FALSE) +	else   	{ -		delta_auto_resize_headroom += delta_dim; +		if (!other_resize_panel || other_resize_panel->mAutoResize) +		{ +			delta_auto_resize_headroom -= delta_dim; +		}  	}  	F32 fraction_given_up = 0.f;  	F32 fraction_remaining = 1.f; -	F32 updated_auto_resize_headroom = total_auto_resize_headroom + delta_auto_resize_headroom; +	F32 updated_auto_resize_headroom = original_auto_resize_headroom + delta_auto_resize_headroom;  	enum  	{ @@ -691,14 +713,15 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  		case BEFORE_RESIZED_PANEL:  			if (panelp->mAutoResize)  			{	// freeze current size as fraction of overall auto_resize space -				F32 fractional_adjustment_factor = total_auto_resize_headroom / updated_auto_resize_headroom; +				F32 fractional_adjustment_factor = updated_auto_resize_headroom == 0.f +													? 1.f +													: original_auto_resize_headroom / updated_auto_resize_headroom;  				F32 new_fractional_size = llclamp(panelp->mFractionalSize * fractional_adjustment_factor,  													MIN_FRACTIONAL_SIZE,  													MAX_FRACTIONAL_SIZE); -				F32 fraction_delta = (new_fractional_size - panelp->mFractionalSize); -				fraction_given_up -= fraction_delta; +				fraction_given_up -= new_fractional_size - panelp->mFractionalSize;  				fraction_remaining -= panelp->mFractionalSize; -				panelp->mFractionalSize += fraction_delta; +				panelp->mFractionalSize = new_fractional_size;  				llassert(!llisnan(panelp->mFractionalSize));  			}  			else @@ -711,7 +734,7 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  			{	// freeze new size as fraction  				F32 new_fractional_size = (updated_auto_resize_headroom == 0.f)  					? MAX_FRACTIONAL_SIZE -					: llclamp((F32)(new_dim - panelp->getRelevantMinDim()) / updated_auto_resize_headroom, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE); +					: llclamp(total_visible_fraction * (F32)(new_dim - panelp->getRelevantMinDim()) / updated_auto_resize_headroom, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE);  				fraction_given_up -= new_fractional_size - panelp->mFractionalSize;  				fraction_remaining -= panelp->mFractionalSize;  				panelp->mFractionalSize = new_fractional_size; @@ -720,7 +743,6 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  			else  			{	// freeze new size as original size  				panelp->mTargetDim = new_dim; -				fraction_remaining -= fraction_given_up;  			}  			which_panel = NEXT_PANEL;  			break; @@ -728,14 +750,14 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  			if (panelp->mAutoResize)  			{  				fraction_remaining -= panelp->mFractionalSize; -				if (fraction_given_up != 0.f) +				if (resized_panel->mAutoResize)  				{  					panelp->mFractionalSize = llclamp(panelp->mFractionalSize + fraction_given_up, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE);  					fraction_given_up = 0.f;  				}  				else  				{ -					F32 new_fractional_size = llclamp((F32)(panelp->mTargetDim - panelp->getRelevantMinDim() + delta_auto_resize_headroom)  +					F32 new_fractional_size = llclamp(total_visible_fraction * (F32)(panelp->mTargetDim - panelp->getRelevantMinDim() + delta_auto_resize_headroom)   														/ updated_auto_resize_headroom,  													MIN_FRACTIONAL_SIZE,  													MAX_FRACTIONAL_SIZE); @@ -750,7 +772,7 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  			which_panel = AFTER_RESIZED_PANEL;  			break;  		case AFTER_RESIZED_PANEL: -			if (panelp->mAutoResize) +			if (panelp->mAutoResize && fraction_given_up != 0.f)  			{  				panelp->mFractionalSize = llclamp(panelp->mFractionalSize + (panelp->mFractionalSize / fraction_remaining) * fraction_given_up,  												MIN_FRACTIONAL_SIZE, @@ -760,6 +782,8 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  			break;  		}  	} +	updateLayout(); +	normalizeFractionalSizes();  }  void LLLayoutStack::reshape(S32 width, S32 height, BOOL called_from_parent) diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index efe93f6def..d32caec5f9 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -72,7 +72,7 @@ public:  	/*virtual*/ void draw();  	/*virtual*/ void removeChild(LLView*);  	/*virtual*/ BOOL postBuild(); -	/*virtual*/ bool addChild(LLView* child, S32 tab_group = 0); +	/*virtual*/ bool addChild(LLView* child, S32 tab_groupdatefractuiona = 0);  	/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); @@ -112,6 +112,7 @@ private:  	LLLayoutPanel* findEmbeddedPanel(LLPanel* panelp) const;  	LLLayoutPanel* findEmbeddedPanelByName(const std::string& name) const;  	void updateFractionalSizes(); +	void normalizeFractionalSizes();  	void updatePanelRect( LLLayoutPanel* param1, const LLRect& new_rect );  	S32 mPanelSpacing; @@ -154,10 +155,10 @@ public:  	void setVisible(BOOL visible);  	S32 getLayoutDim() const; -	S32 getMinDim() const { return (mMinDim >= 0 || mAutoResize) ? llmax(0, mMinDim) : getLayoutDim(); } +	S32 getMinDim() const { return llmax(0, mMinDim); }  	void setMinDim(S32 value) { mMinDim = value; } -	S32 getExpandedMinDim() const { return mExpandedMinDim >= 0 ? mExpandedMinDim : mMinDim; } +	S32 getExpandedMinDim() const { return mExpandedMinDim >= 0 ? mExpandedMinDim : getMinDim(); }  	void setExpandedMinDim(S32 value) { mExpandedMinDim = value; }  	S32 getRelevantMinDim() const diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 06dfc90d83..7e84814c51 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -1630,7 +1630,7 @@ void LLLineEditor::draw()  	LLRect background( 0, getRect().getHeight(), getRect().getWidth(), 0 );  	background.stretch( -mBorderThickness ); -	S32 lineeditor_v_pad = llround((background.getHeight() - mGLFont->getLineHeight())/2); +	S32 lineeditor_v_pad = (background.getHeight() - mGLFont->getLineHeight()) / 2;  	drawBackground(); diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 95ecbb1c94..ff6928ffda 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -317,7 +317,7 @@ void LLMenuItemGL::setJumpKey(KEY key)  // virtual   U32 LLMenuItemGL::getNominalHeight( void ) const   {  -	return llround(mFont->getLineHeight()) + MENU_ITEM_PADDING;  +	return mFont->getLineHeight() + MENU_ITEM_PADDING;  }  //virtual @@ -508,19 +508,19 @@ void LLMenuItemGL::draw( void )  	{  		if( !mDrawBoolLabel.empty() )  		{ -			mFont->render( mDrawBoolLabel.getWString(), 0, (F32)LEFT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color, +			mFont->render( mDrawBoolLabel.getWString(), 0, (F32)LEFT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f), color,  						   LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );  		} -		mFont->render( mLabel.getWString(), 0, (F32)LEFT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color, +		mFont->render( mLabel.getWString(), 0, (F32)LEFT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f), color,  					   LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );  		if( !mDrawAccelLabel.empty() )  		{ -			mFont->render( mDrawAccelLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color, +			mFont->render( mDrawAccelLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f), color,  						   LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );  		}  		if( !mDrawBranchLabel.empty() )  		{ -			mFont->render( mDrawBranchLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color, +			mFont->render( mDrawBranchLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f), color,  						   LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );  		}  	} @@ -1966,7 +1966,7 @@ void LLMenuGL::arrange( void )  		// *FIX: create the item first and then ask for its dimensions?  		S32 spillover_item_width = PLAIN_PAD_PIXELS + LLFontGL::getFontSansSerif()->getWidth( std::string("More") ); // *TODO: Translate -		S32 spillover_item_height = llround(LLFontGL::getFontSansSerif()->getLineHeight()) + MENU_ITEM_PADDING; +		S32 spillover_item_height = LLFontGL::getFontSansSerif()->getLineHeight() + MENU_ITEM_PADDING;  		// Scrolling support  		item_list_t::iterator first_visible_item_iter; @@ -3082,7 +3082,7 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)  		mouse_y + MOUSE_CURSOR_PADDING,   		CURSOR_WIDTH + MOUSE_CURSOR_PADDING * 2,   		CURSOR_HEIGHT + MOUSE_CURSOR_PADDING * 2); -	menu->translateIntoRectWithExclusion( menu_region_rect, mouse_rect, FALSE ); +	menu->translateIntoRectWithExclusion( menu_region_rect, mouse_rect );  	menu->getParent()->sendChildToFront(menu);  } @@ -3425,7 +3425,7 @@ void LLMenuHolderGL::draw()  		LLUI::pushMatrix();  		{ -			LLUI::translate((F32)item_rect.mLeft, (F32)item_rect.mBottom, 0.f); +			LLUI::translate((F32)item_rect.mLeft, (F32)item_rect.mBottom);  			selecteditem->getMenu()->drawBackground(selecteditem, interpolant);  			selecteditem->draw();  		} diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index d232e27ef2..8aa548b974 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -1412,6 +1412,7 @@ void addPathIfExists(const std::string& new_path, std::vector<std::string>& path  bool LLNotifications::loadTemplates()  { +	llinfos << "Reading notifications template" << llendl;  	std::vector<std::string> search_paths;  	std::string skin_relative_path = gDirUtilp->getDirDelimiter() + LLUI::getSkinPath() + gDirUtilp->getDirDelimiter() + "notifications.xml"; @@ -1484,6 +1485,8 @@ bool LLNotifications::loadTemplates()  		mTemplates[notification.name] = LLNotificationTemplatePtr(new LLNotificationTemplate(notification));  	} +	llinfos << "...done" << llendl; +  	return true;  } diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp index ad4cc20d9a..20bed050ad 100644 --- a/indra/llui/llscrollcontainer.cpp +++ b/indra/llui/llscrollcontainer.cpp @@ -378,23 +378,21 @@ void LLScrollContainer::calcVisibleSize( S32 *visible_width, S32 *visible_height  	if (!mHideScrollbar)  	{ -		if( *visible_height < doc_height ) +		// Note: 1 pixel change can happen on final animation and should not trigger  +		// the display of sliders. +		if ((doc_height - *visible_height) > 1)  		{  			*show_v_scrollbar = TRUE;  			*visible_width -= scrollbar_size;  		} - -		if( *visible_width < doc_width ) +		if ((doc_width - *visible_width) > 1)  		{  			*show_h_scrollbar = TRUE;  			*visible_height -= scrollbar_size; - -			// Must retest now that visible_height has changed -			if( !*show_v_scrollbar && (*visible_height < doc_height) ) -			{ -				*show_v_scrollbar = TRUE; -				*visible_width -= scrollbar_size; -			} +			// Note: Do *not* recompute *show_v_scrollbar here because with +			// the (- scrollbar_size) we just did we will always add a vertical scrollbar +			// even if the height of the items is actually less than the visible size. +			// Fear not though: there's enough calcVisibleSize() calls to add a vertical slider later.  		}  	}  } diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp index 9d25c7180d..8000efad0e 100644 --- a/indra/llui/llscrolllistcell.cpp +++ b/indra/llui/llscrolllistcell.cpp @@ -232,7 +232,7 @@ BOOL LLScrollListText::getVisible() const  //virtual   S32 LLScrollListText::getHeight() const  { -	return llround(mFont->getLineHeight()); +	return mFont->getLineHeight();  } @@ -306,7 +306,7 @@ void LLScrollListText::draw(const LLColor4& color, const LLColor4& highlight_col  			break;  		}  		LLRect highlight_rect(left - 2,  -				llround(mFont->getLineHeight()) + 1,  +				mFont->getLineHeight() + 1,   				left + mFont->getWidth(mText.getString(), mHighlightOffset, mHighlightCount) + 1,   				1);  		mRoundedRectImage->draw(highlight_rect, highlight_color); @@ -329,7 +329,7 @@ void LLScrollListText::draw(const LLColor4& color, const LLColor4& highlight_col  		break;  	}  	mFont->render(mText.getWString(), 0,  -					start_x, 2.f, +					start_x, 0.f,  					display_color,  					mFontAlignment,  					LLFontGL::BOTTOM,  diff --git a/indra/llui/llscrolllistitem.cpp b/indra/llui/llscrolllistitem.cpp index d95752e31c..5a1e96ab03 100644 --- a/indra/llui/llscrolllistitem.cpp +++ b/indra/llui/llscrolllistitem.cpp @@ -138,7 +138,7 @@ void LLScrollListItem::draw(const LLRect& rect, const LLColor4& fg_color, const  		LLUI::pushMatrix();  		{ -			LLUI::translate((F32) cur_x, (F32) rect.mBottom, 0.0f); +			LLUI::translate((F32) cur_x, (F32) rect.mBottom);  			cell->draw( fg_color, highlight_color );  		} diff --git a/indra/llui/llscrolllistitem.h b/indra/llui/llscrolllistitem.h index 611df729b4..13655b5873 100644 --- a/indra/llui/llscrolllistitem.h +++ b/indra/llui/llscrolllistitem.h @@ -33,10 +33,10 @@  #include "v4color.h"  #include "llinitparam.h"  #include "llscrolllistcell.h" +#include "llcoord.h"  #include <vector> -class LLCoordGL;  class LLCheckBoxCtrl;  class LLResizeBar;  class LLScrollListCtrl; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 0040be45c7..7aeeae298f 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1192,7 +1192,10 @@ void LLTextBase::reflow()  		// shrink document to minimum size (visible portion of text widget)  		// to force inlined widgets with follows set to shrink -		mDocumentView->reshape(mVisibleTextRect.getWidth(), mDocumentView->getRect().getHeight()); +		if (mWordWrap) +		{ +			mDocumentView->reshape(mVisibleTextRect.getWidth(), mDocumentView->getRect().getHeight()); +		}  		S32 cur_top = 0; @@ -2157,7 +2160,7 @@ LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const  	{   		// return default height rect in upper left  		local_rect = content_window_rect; -		local_rect.mBottom = local_rect.mTop - (S32)(mDefaultFont->getLineHeight()); +		local_rect.mBottom = local_rect.mTop - mDefaultFont->getLineHeight();  		return local_rect;  	} @@ -2380,6 +2383,9 @@ S32 LLTextBase::getEditableIndex(S32 index, bool increasing_direction)  void LLTextBase::updateRects()  { +	LLRect old_text_rect = mVisibleTextRect; +	mVisibleTextRect = mScroller ? mScroller->getContentWindowRect() : getLocalRect(); +  	if (mLineInfoList.empty())   	{  		mTextBoundingRect = LLRect(0, mVPad, mHPad, 0); @@ -2395,10 +2401,24 @@ void LLTextBase::updateRects()  		}  		mTextBoundingRect.mTop += mVPad; -		// subtract a pixel off the bottom to deal with rounding errors in measuring font height -		mTextBoundingRect.mBottom -= 1; -		S32 delta_pos = -mTextBoundingRect.mBottom; +		S32 delta_pos = 0; +		 +		switch(mVAlign) +		{ +		case LLFontGL::TOP: +			delta_pos = llmax(mVisibleTextRect.getHeight() - mTextBoundingRect.mTop, -mTextBoundingRect.mBottom); +			break; +		case LLFontGL::VCENTER: +			delta_pos = (llmax(mVisibleTextRect.getHeight() - mTextBoundingRect.mTop, -mTextBoundingRect.mBottom) + (mVisibleTextRect.mBottom - mTextBoundingRect.mBottom)) / 2; +			break; +		case LLFontGL::BOTTOM: +			delta_pos = mVisibleTextRect.mBottom - mTextBoundingRect.mBottom; +			break; +		case LLFontGL::BASELINE: +			// do nothing +			break; +		}  		// move line segments to fit new document rect  		for (line_list_t::iterator it = mLineInfoList.begin(); it != mLineInfoList.end(); ++it)  		{ @@ -2408,8 +2428,9 @@ void LLTextBase::updateRects()  	}  	// update document container dimensions according to text contents -	LLRect doc_rect = mTextBoundingRect; +	LLRect doc_rect;  	// use old mVisibleTextRect constraint document to width of viewable region +	doc_rect.mBottom = llmin(mVisibleTextRect.mBottom,  mTextBoundingRect.mBottom);  	doc_rect.mLeft = 0;  	// allow horizontal scrolling? @@ -2419,11 +2440,22 @@ void LLTextBase::updateRects()  	doc_rect.mRight = mScroller   		? llmax(mVisibleTextRect.getWidth(), mTextBoundingRect.mRight)  		: mVisibleTextRect.getWidth(); +	doc_rect.mTop = llmax(mVisibleTextRect.mTop, mTextBoundingRect.mTop);  	if (!mScroller)  	{  		// push doc rect to top of text widget -		doc_rect.translate(0, mVisibleTextRect.getHeight() - doc_rect.mTop); +		switch(mVAlign) +		{ +		case LLFontGL::TOP: +			doc_rect.translate(0, mVisibleTextRect.getHeight() - doc_rect.mTop); +			break; +		case LLFontGL::VCENTER: +			doc_rect.translate(0, (mVisibleTextRect.getHeight() - doc_rect.mTop) / 2); +		case LLFontGL::BOTTOM: +		default: +			break; +		}  	}  	mDocumentView->setShape(doc_rect); @@ -2431,7 +2463,6 @@ void LLTextBase::updateRects()  	//update mVisibleTextRect *after* mDocumentView has been resized  	// so that scrollbars are added if document needs to scroll  	// since mVisibleTextRect does not include scrollbars -	LLRect old_text_rect = mVisibleTextRect;  	mVisibleTextRect = mScroller ? mScroller->getContentWindowRect() : getLocalRect();  	//FIXME: replace border with image?  	if (mBorderVisible) @@ -2444,9 +2475,27 @@ void LLTextBase::updateRects()  	}  	// update document container again, using new mVisibleTextRect (that has scrollbars enabled as needed) +	doc_rect.mBottom = llmin(mVisibleTextRect.mBottom,  mTextBoundingRect.mBottom); +	doc_rect.mLeft = 0;  	doc_rect.mRight = mScroller   		? llmax(mVisibleTextRect.getWidth(), mTextBoundingRect.mRight)  		: mVisibleTextRect.getWidth(); +	doc_rect.mTop = llmax(mVisibleTextRect.mTop, mTextBoundingRect.mTop); +	if (!mScroller) +	{ +		// push doc rect to top of text widget +		switch(mVAlign) +		{ +		case LLFontGL::TOP: +			doc_rect.translate(0, mVisibleTextRect.getHeight() - doc_rect.mTop); +			break; +		case LLFontGL::VCENTER: +			doc_rect.translate(0, (mVisibleTextRect.getHeight() - doc_rect.mTop) / 2); +		case LLFontGL::BOTTOM: +		default: +			break; +		} +	}  	mDocumentView->setShape(doc_rect);  } @@ -2560,8 +2609,7 @@ BOOL LLTextSegment::handleScrollWheel(S32 x, S32 y, S32 clicks) { return FALSE;  BOOL LLTextSegment::handleToolTip(S32 x, S32 y, MASK mask) { return FALSE; }  const std::string&	LLTextSegment::getName() const   { -	static std::string empty_string(""); -	return empty_string;  +	return LLStringUtil::null;  }  void LLTextSegment::onMouseCaptureLost() {}  void LLTextSegment::screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const {} @@ -2578,7 +2626,7 @@ LLNormalTextSegment::LLNormalTextSegment( LLStyleConstSP style, S32 start, S32 e  	mToken(NULL),  	mEditor(editor)  { -	mFontHeight = llceil(mStyle->getFont()->getLineHeight()); +	mFontHeight = mStyle->getFont()->getLineHeight();  	LLUIImagePtr image = mStyle->getImage();  	if (image.notNull()) @@ -2594,7 +2642,7 @@ LLNormalTextSegment::LLNormalTextSegment( const LLColor4& color, S32 start, S32  {  	mStyle = new LLStyle(LLStyle::Params().visible(is_visible).color(color)); -	mFontHeight = llceil(mStyle->getFont()->getLineHeight()); +	mFontHeight = mStyle->getFont()->getLineHeight();  }  LLNormalTextSegment::~LLNormalTextSegment() @@ -2962,11 +3010,11 @@ LLLineBreakTextSegment::LLLineBreakTextSegment(S32 pos):LLTextSegment(pos,pos+1)  {  	LLStyleSP s( new LLStyle(LLStyle::Params().visible(true))); -	mFontHeight = llceil(s->getFont()->getLineHeight()); +	mFontHeight = s->getFont()->getLineHeight();  }  LLLineBreakTextSegment::LLLineBreakTextSegment(LLStyleConstSP style,S32 pos):LLTextSegment(pos,pos+1)  { -	mFontHeight = llceil(style->getFont()->getLineHeight()); +	mFontHeight = style->getFont()->getLineHeight();  }  LLLineBreakTextSegment::~LLLineBreakTextSegment()  { @@ -3003,7 +3051,7 @@ static const S32 IMAGE_HPAD = 3;  bool LLImageTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const  {  	width = 0; -	height = llceil(mStyle->getFont()->getLineHeight());; +	height = mStyle->getFont()->getLineHeight();  	LLUIImagePtr image = mStyle->getImage();  	if( num_chars>0 && image.notNull()) diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 3a23ce1cac..3409b6817d 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1992,7 +1992,7 @@ void LLTextEditor::drawPreeditMarker()  		return;  	} -	const S32 line_height = llround( mDefaultFont->getLineHeight() ); +	const S32 line_height = mDefaultFont->getLineHeight();  	S32 line_start = getLineStart(cur_line);  	S32 line_y = mVisibleTextRect.mTop - line_height; @@ -2715,7 +2715,7 @@ BOOL LLTextEditor::getPreeditLocation(S32 query_offset, LLCoordGL *coord, LLRect      const LLWString textString(getWText());  	const llwchar * const text = textString.c_str(); -	const S32 line_height = llround(mDefaultFont->getLineHeight()); +	const S32 line_height = mDefaultFont->getLineHeight();  	if (coord)  	{ @@ -2818,7 +2818,7 @@ void LLTextEditor::markAsPreedit(S32 position, S32 length)  S32 LLTextEditor::getPreeditFontSize() const  { -	return llround(mDefaultFont->getLineHeight() * LLUI::sGLScaleFactor.mV[VY]); +	return llround((F32)mDefaultFont->getLineHeight() * LLUI::sGLScaleFactor.mV[VY]);  }  BOOL LLTextEditor::isDirty() const diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp index 9b31a6449d..81ea0ebf0c 100644 --- a/indra/llui/lltoolbar.cpp +++ b/indra/llui/lltoolbar.cpp @@ -827,7 +827,7 @@ void LLToolBar::draw()  	// rect may have shifted during layout  	LLUI::popMatrix();  	LLUI::pushMatrix(); -	LLUI::translate((F32)getRect().mLeft, (F32)getRect().mBottom, 0.f); +	LLUI::translate((F32)getRect().mLeft, (F32)getRect().mBottom);  	// Position the caret   	LLIconCtrl* caret = getChild<LLIconCtrl>("caret"); diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp index 23cdd9ad9a..f737d48abf 100644 --- a/indra/llui/lltooltip.cpp +++ b/indra/llui/lltooltip.cpp @@ -180,6 +180,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)  	params.font = p.font;  	params.use_ellipses = true;  	params.wrap = p.wrap; +	params.font_valign = LLFontGL::VCENTER;  	params.parse_urls = false; // disallow hyperlinks in tooltips, as they want to spawn their own explanatory tooltips  	mTextBox = LLUICtrlFactory::create<LLTextBox> (params);  	addChild(mTextBox); @@ -190,7 +191,6 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)  	{  		LLButton::Params icon_params;  		icon_params.name = "tooltip_info"; -		icon_params.label(""); // provid label but set to empty so name does not overwrite it -angela  		LLRect icon_rect;  		LLUIImage* imagep = p.image;  		TOOLTIP_ICON_SIZE = (imagep ? imagep->getWidth() : 16); @@ -291,6 +291,12 @@ void LLToolTip::initFromParams(const LLToolTip::Params& p)  	S32 text_width = llmin(p.max_width(), mTextBox->getTextPixelWidth());  	S32 text_height = mTextBox->getTextPixelHeight();  	mTextBox->reshape(text_width, text_height); +	if (mInfoButton) +	{ +		LLRect text_rect = mTextBox->getRect(); +		LLRect icon_rect = mInfoButton->getRect(); +		mTextBox->translate(0, icon_rect.getCenterY() - text_rect.getCenterY()); +	}  	// reshape tooltip panel to fit text box  	LLRect tooltip_rect = calcBoundingRect(); @@ -299,6 +305,8 @@ void LLToolTip::initFromParams(const LLToolTip::Params& p)  	tooltip_rect.mBottom = 0;  	tooltip_rect.mLeft = 0; +	mTextBox->reshape(mTextBox->getRect().getWidth(), llmax(mTextBox->getRect().getHeight(), tooltip_rect.getHeight() - 2 * mPadding)); +  	setShape(tooltip_rect);  } diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index a38d0a0b0b..b5e27616b7 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -1698,21 +1698,22 @@ void LLUI::translate(F32 x, F32 y, F32 z)  	gGL.translateUI(x,y,z);  	LLFontGL::sCurOrigin.mX += (S32) x;  	LLFontGL::sCurOrigin.mY += (S32) y; -	LLFontGL::sCurOrigin.mZ += z; +	LLFontGL::sCurDepth += z;  }  //static  void LLUI::pushMatrix()  {  	gGL.pushUIMatrix(); -	LLFontGL::sOriginStack.push_back(LLFontGL::sCurOrigin); +	LLFontGL::sOriginStack.push_back(std::make_pair(LLFontGL::sCurOrigin, LLFontGL::sCurDepth));  }  //static  void LLUI::popMatrix()  {  	gGL.popUIMatrix(); -	LLFontGL::sCurOrigin = *LLFontGL::sOriginStack.rbegin(); +	LLFontGL::sCurOrigin = LLFontGL::sOriginStack.back().first; +	LLFontGL::sCurDepth = LLFontGL::sOriginStack.back().second;  	LLFontGL::sOriginStack.pop_back();  } @@ -1722,7 +1723,7 @@ void LLUI::loadIdentity()  	gGL.loadUIIdentity();   	LLFontGL::sCurOrigin.mX = 0;  	LLFontGL::sCurOrigin.mY = 0; -	LLFontGL::sCurOrigin.mZ = 0; +	LLFontGL::sCurDepth = 0.f;  }  //static @@ -1745,10 +1746,7 @@ void LLUI::setMousePositionScreen(S32 x, S32 y)  	screen_x = llround((F32)x * sGLScaleFactor.mV[VX]);  	screen_y = llround((F32)y * sGLScaleFactor.mV[VY]); -	LLCoordWindow window_point; -	LLView::getWindow()->convertCoords(LLCoordGL(screen_x, screen_y), &window_point); - -	LLView::getWindow()->setCursorPosition(window_point); +	LLView::getWindow()->setCursorPosition(LLCoordGL(screen_x, screen_y).convert());  }  //static  @@ -1756,8 +1754,7 @@ void LLUI::getMousePositionScreen(S32 *x, S32 *y)  {  	LLCoordWindow cursor_pos_window;  	getWindow()->getCursorPosition(&cursor_pos_window); -	LLCoordGL cursor_pos_gl; -	getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl); +	LLCoordGL cursor_pos_gl(cursor_pos_window.convert());  	*x = llround((F32)cursor_pos_gl.mX / sGLScaleFactor.mV[VX]);  	*y = llround((F32)cursor_pos_gl.mY / sGLScaleFactor.mV[VX]);  } @@ -2062,7 +2059,7 @@ void LLUI::positionViewNearMouse(LLView* view, S32 spawn_x, S32 spawn_y)  	// Start at spawn position (using left/top)  	view->setOrigin( local_x, local_y - view->getRect().getHeight());  	// Make sure we're on-screen and not overlapping the mouse -	view->translateIntoRectWithExclusion( virtual_window_rect, mouse_rect, FALSE ); +	view->translateIntoRectWithExclusion( virtual_window_rect, mouse_rect );  }  LLView* LLUI::resolvePath(LLView* context, const std::string& path) diff --git a/indra/llui/lluistring.cpp b/indra/llui/lluistring.cpp index ac69d3bf85..c4e073ccdb 100644 --- a/indra/llui/lluistring.cpp +++ b/indra/llui/lluistring.cpp @@ -128,17 +128,13 @@ void LLUIString::updateResult() const  	}  	mResult = mOrig; -	// get the defailt args + local args -	if (!mArgs || mArgs->empty()) +	// get the default args + local args +	LLStringUtil::format_map_t combined_args = LLTrans::getDefaultArgs(); +	if (mArgs && !mArgs->empty())  	{ -		LLStringUtil::format(mResult, LLTrans::getDefaultArgs()); -	} -	else -	{ -		LLStringUtil::format_map_t combined_args = LLTrans::getDefaultArgs();  		combined_args.insert(mArgs->begin(), mArgs->end()); -		LLStringUtil::format(mResult, combined_args);  	} +	LLStringUtil::format(mResult, combined_args);  }  void LLUIString::updateWResult() const diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index e1ee0a5b14..421166dcd4 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -1106,7 +1106,7 @@ void LLView::drawChildren()  				{  					LLUI::pushMatrix();  					{ -						LLUI::translate((F32)viewp->getRect().mLeft, (F32)viewp->getRect().mBottom, 0.f); +						LLUI::translate((F32)viewp->getRect().mLeft, (F32)viewp->getRect().mBottom);  						// flag the fact we are in draw here, in case overridden draw() method attempts to remove this widget  						viewp->mInDraw = true;  						viewp->draw(); @@ -1159,7 +1159,7 @@ void LLView::drawDebugRect()  		if (getUseBoundingRect())  		{ -			LLUI::translate((F32)mBoundingRect.mLeft - (F32)mRect.mLeft, (F32)mBoundingRect.mBottom - (F32)mRect.mBottom, 0.f); +			LLUI::translate((F32)mBoundingRect.mLeft - (F32)mRect.mLeft, (F32)mBoundingRect.mBottom - (F32)mRect.mBottom);  		}  		LLRect debug_rect = getUseBoundingRect() ? mBoundingRect : mRect; @@ -1231,7 +1231,7 @@ void LLView::drawChild(LLView* childp, S32 x_offset, S32 y_offset, BOOL force_dr  			gGL.matrixMode(LLRender::MM_MODELVIEW);  			LLUI::pushMatrix();  			{ -				LLUI::translate((F32)childp->getRect().mLeft + x_offset, (F32)childp->getRect().mBottom + y_offset, 0.f); +				LLUI::translate((F32)childp->getRect().mLeft + x_offset, (F32)childp->getRect().mBottom + y_offset);  				childp->draw();  			}  			LLUI::popMatrix(); @@ -1300,7 +1300,10 @@ void LLView::reshape(S32 width, S32 height, BOOL called_from_parent)  			S32 delta_x = child_rect.mLeft - viewp->getRect().mLeft;  			S32 delta_y = child_rect.mBottom - viewp->getRect().mBottom;  			viewp->translate( delta_x, delta_y ); -			viewp->reshape(child_rect.getWidth(), child_rect.getHeight()); +			if (child_rect.getWidth() != viewp->getRect().getWidth() || child_rect.getHeight() != viewp->getRect().getHeight()) +			{ +				viewp->reshape(child_rect.getWidth(), child_rect.getHeight()); +			}  		}  	} @@ -1616,59 +1619,30 @@ LLView* LLView::findNextSibling(LLView* child)  } -LLCoordGL getNeededTranslation(const LLRect& input, const LLRect& constraint, BOOL allow_partial_outside) +LLCoordGL getNeededTranslation(const LLRect& input, const LLRect& constraint, S32 min_overlap_pixels)  {  	LLCoordGL delta; -	if (allow_partial_outside) -	{ -		const S32 KEEP_ONSCREEN_PIXELS = 16; +	const S32 KEEP_ONSCREEN_PIXELS_WIDTH = llmin(min_overlap_pixels, input.getWidth()); +	const S32 KEEP_ONSCREEN_PIXELS_HEIGHT = llmin(min_overlap_pixels, input.getHeight()); -		if( input.mRight - KEEP_ONSCREEN_PIXELS < constraint.mLeft ) -		{ -			delta.mX = constraint.mLeft - (input.mRight - KEEP_ONSCREEN_PIXELS); -		} -		else -		if( input.mLeft + KEEP_ONSCREEN_PIXELS > constraint.mRight ) -		{ -			delta.mX = constraint.mRight - (input.mLeft + KEEP_ONSCREEN_PIXELS); -		} +	if( input.mRight - KEEP_ONSCREEN_PIXELS_WIDTH < constraint.mLeft ) +	{ +		delta.mX = constraint.mLeft - (input.mRight - KEEP_ONSCREEN_PIXELS_WIDTH); +	} +	else if( input.mLeft + KEEP_ONSCREEN_PIXELS_WIDTH > constraint.mRight ) +	{ +		delta.mX = constraint.mRight - (input.mLeft + KEEP_ONSCREEN_PIXELS_WIDTH); +	} -		if( input.mTop > constraint.mTop ) -		{ -			delta.mY = constraint.mTop - input.mTop; -		} -		else -		if( input.mTop - KEEP_ONSCREEN_PIXELS < constraint.mBottom ) -		{ -			delta.mY = constraint.mBottom - (input.mTop - KEEP_ONSCREEN_PIXELS); -		} +	if( input.mTop > constraint.mTop ) +	{ +		delta.mY = constraint.mTop - input.mTop;  	}  	else +	if( input.mTop - KEEP_ONSCREEN_PIXELS_HEIGHT < constraint.mBottom )  	{ -		if( input.mLeft < constraint.mLeft ) -		{ -			delta.mX = constraint.mLeft - input.mLeft; -		} -		else -		if( input.mRight > constraint.mRight ) -		{ -			delta.mX = constraint.mRight - input.mRight; -			// compensate for left edge possible going off screen -			delta.mX += llmax( 0, input.getWidth() - constraint.getWidth() ); -		} - -		if( input.mTop > constraint.mTop ) -		{ -			delta.mY = constraint.mTop - input.mTop; -		} -		else -		if( input.mBottom < constraint.mBottom ) -		{ -			delta.mY = constraint.mBottom - input.mBottom; -			// compensate for top edge possible going off screen -			delta.mY -= llmax( 0, input.getHeight() - constraint.getHeight() ); -		} +		delta.mY = constraint.mBottom - (input.mTop - KEEP_ONSCREEN_PIXELS_HEIGHT);  	}  	return delta; @@ -1677,9 +1651,9 @@ LLCoordGL getNeededTranslation(const LLRect& input, const LLRect& constraint, BO  // Moves the view so that it is entirely inside of constraint.  // If the view will not fit because it's too big, aligns with the top and left.  // (Why top and left?  That's where the drag bars are for floaters.) -BOOL LLView::translateIntoRect(const LLRect& constraint, BOOL allow_partial_outside ) +BOOL LLView::translateIntoRect(const LLRect& constraint, S32 min_overlap_pixels)  { -	LLCoordGL translation = getNeededTranslation(getRect(), constraint, allow_partial_outside); +	LLCoordGL translation = getNeededTranslation(getRect(), constraint, min_overlap_pixels);  	if (translation.mX != 0 || translation.mY != 0)  	{ @@ -1691,9 +1665,9 @@ BOOL LLView::translateIntoRect(const LLRect& constraint, BOOL allow_partial_outs  // move this view into "inside" but not onto "exclude"  // NOTE: if this view is already contained in "inside", we ignore the "exclude" rect -BOOL LLView::translateIntoRectWithExclusion( const LLRect& inside, const LLRect& exclude, BOOL allow_partial_outside ) +BOOL LLView::translateIntoRectWithExclusion( const LLRect& inside, const LLRect& exclude, S32 min_overlap_pixels)  { -	LLCoordGL translation = getNeededTranslation(getRect(), inside, allow_partial_outside); +	LLCoordGL translation = getNeededTranslation(getRect(), inside, min_overlap_pixels);  	if (translation.mX != 0 || translation.mY != 0)  	{ diff --git a/indra/llui/llview.h b/indra/llui/llview.h index f1fac5f69c..fd19309a56 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -370,8 +370,8 @@ public:  	virtual void	reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);  	virtual void	translate( S32 x, S32 y );  	void			setOrigin( S32 x, S32 y )	{ mRect.translate( x - mRect.mLeft, y - mRect.mBottom ); } -	BOOL			translateIntoRect( const LLRect& constraint, BOOL allow_partial_outside ); -	BOOL			translateIntoRectWithExclusion( const LLRect& inside, const LLRect& exclude, BOOL allow_partial_outside ); +	BOOL			translateIntoRect( const LLRect& constraint, S32 min_overlap_pixels = S32_MAX); +	BOOL			translateIntoRectWithExclusion( const LLRect& inside, const LLRect& exclude, S32 min_overlap_pixels = S32_MAX);  	void			centerWithin(const LLRect& bounds);  	void	setShape(const LLRect& new_rect, bool by_user = false); diff --git a/indra/llvfs/lllfsthread.cpp b/indra/llvfs/lllfsthread.cpp index 3d3ed9f6d4..073b1af2a1 100644 --- a/indra/llvfs/lllfsthread.cpp +++ b/indra/llvfs/lllfsthread.cpp @@ -45,7 +45,7 @@ void LLLFSThread::initClass(bool local_is_threaded)  //static  S32 LLLFSThread::updateClass(U32 ms_elapsed)  { -	sLocal->update(ms_elapsed); +	sLocal->update((F32)ms_elapsed);  	return sLocal->getPending();  } diff --git a/indra/llvfs/llvfsthread.cpp b/indra/llvfs/llvfsthread.cpp index 254f8b55ba..a57e2b15ab 100644 --- a/indra/llvfs/llvfsthread.cpp +++ b/indra/llvfs/llvfsthread.cpp @@ -46,7 +46,7 @@ void LLVFSThread::initClass(bool local_is_threaded)  //static  S32 LLVFSThread::updateClass(U32 ms_elapsed)  { -	sLocal->update(ms_elapsed); +	sLocal->update((F32)ms_elapsed);  	return sLocal->getPending();  } diff --git a/indra/llwindow/lldragdropwin32.cpp b/indra/llwindow/lldragdropwin32.cpp index d4d444eb28..15acddd987 100644 --- a/indra/llwindow/lldragdropwin32.cpp +++ b/indra/llwindow/lldragdropwin32.cpp @@ -124,10 +124,9 @@ class LLDragDropWin32Target:  						ScreenToClient( mAppWindowHandle, &pt2 );  						LLCoordWindow cursor_coord_window( pt2.x, pt2.y ); -						window_imp->convertCoords(cursor_coord_window, &gl_coord);  						MASK mask = gKeyboard->currentMask(TRUE); -						LLWindowCallbacks::DragNDropResult result = window_imp->completeDragNDropRequest( gl_coord, mask,  +						LLWindowCallbacks::DragNDropResult result = window_imp->completeDragNDropRequest( cursor_coord_window.convert(), mask,   							LLWindowCallbacks::DNDA_START_TRACKING, mDropUrl );  						switch (result) @@ -180,10 +179,9 @@ class LLDragDropWin32Target:  					ScreenToClient( mAppWindowHandle, &pt2 );  					LLCoordWindow cursor_coord_window( pt2.x, pt2.y ); -					window_imp->convertCoords(cursor_coord_window, &gl_coord);  					MASK mask = gKeyboard->currentMask(TRUE); -					LLWindowCallbacks::DragNDropResult result = window_imp->completeDragNDropRequest( gl_coord, mask,  +					LLWindowCallbacks::DragNDropResult result = window_imp->completeDragNDropRequest( cursor_coord_window.convert(), mask,   						LLWindowCallbacks::DNDA_TRACK, mDropUrl );  					switch (result) @@ -237,15 +235,13 @@ class LLDragDropWin32Target:  				LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLong( mAppWindowHandle, GWL_USERDATA );  				if ( NULL != window_imp )  				{ -					LLCoordGL gl_coord( 0, 0 ); -  					POINT pt_client;  					pt_client.x = pt.x;  					pt_client.y = pt.y;  					ScreenToClient( mAppWindowHandle, &pt_client );  					LLCoordWindow cursor_coord_window( pt_client.x, pt_client.y ); -					window_imp->convertCoords(cursor_coord_window, &gl_coord); +					LLCoordGL gl_coord(cursor_coord_window.convert());  					llinfos << "### (Drop) URL is: " << mDropUrl << llendl;  					llinfos << "###        raw coords are: " << pt.x << " x " << pt.y << llendl;  					llinfos << "###	    client coords are: " << pt_client.x << " x " << pt_client.y << llendl; diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp index 2e9e31bfea..6834b34387 100644 --- a/indra/llwindow/llwindow.cpp +++ b/indra/llwindow/llwindow.cpp @@ -436,3 +436,42 @@ BOOL LLWindowManager::isWindowValid(LLWindow *window)  {  	return sWindowList.find(window) != sWindowList.end();  } + +//coordinate conversion utility funcs that forward to llwindow +LLCoordCommon LL_COORD_TYPE_WINDOW::convertToCommon() const +{ +	const LLCoordWindow& self = static_cast<const LLCoordWindow&>(*this); + +	LLWindow* windowp = &(*LLWindow::beginInstances()); +	LLCoordGL out; +	windowp->convertCoords(self, &out); +	return out.convert(); +} + +void LL_COORD_TYPE_WINDOW::convertFromCommon(const LLCoordCommon& from) +{ +	LLCoordWindow& self = static_cast<LLCoordWindow&>(*this); + +	LLWindow* windowp = &(*LLWindow::beginInstances()); +	LLCoordGL from_gl(from); +	windowp->convertCoords(from_gl, &self); +} + +LLCoordCommon LL_COORD_TYPE_SCREEN::convertToCommon() const +{ +	const LLCoordScreen& self = static_cast<const LLCoordScreen&>(*this); + +	LLWindow* windowp = &(*LLWindow::beginInstances()); +	LLCoordGL out; +	windowp->convertCoords(self, &out); +	return out.convert(); +} + +void LL_COORD_TYPE_SCREEN::convertFromCommon(const LLCoordCommon& from) +{ +	LLCoordScreen& self = static_cast<LLCoordScreen&>(*this); + +	LLWindow* windowp = &(*LLWindow::beginInstances()); +	LLCoordGL from_gl(from); +	windowp->convertCoords(from_gl, &self); +} diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index cab2d0a8fb..d2971581d2 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -39,7 +39,7 @@ class LLWindowCallbacks;  // Refer to llwindow_test in test/common/llwindow for usage example -class LLWindow +class LLWindow : public LLInstanceTracker<LLWindow>  {  public:  	struct LLWindowResolution diff --git a/indra/llwindow/llwindowcallbacks.cpp b/indra/llwindow/llwindowcallbacks.cpp index c2705bbf74..9712ae1d91 100644 --- a/indra/llwindow/llwindowcallbacks.cpp +++ b/indra/llwindow/llwindowcallbacks.cpp @@ -28,8 +28,6 @@  #include "llwindowcallbacks.h" -#include "llcoord.h" -  //  // LLWindowCallbacks  // diff --git a/indra/llwindow/llwindowcallbacks.h b/indra/llwindow/llwindowcallbacks.h index 8572b442f1..7da5959700 100644 --- a/indra/llwindow/llwindowcallbacks.h +++ b/indra/llwindow/llwindowcallbacks.h @@ -26,7 +26,7 @@  #ifndef LLWINDOWCALLBACKS_H  #define LLWINDOWCALLBACKS_H -class LLCoordGL; +#include "llcoord.h"  class LLWindow;  class LLWindowCallbacks diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 228fbefd19..ebc3203f14 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -1065,6 +1065,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  		return FALSE;  	} +	LL_INFOS("Window") << "Device context retrieved." << llendl ; +  	if (!(pixel_format = ChoosePixelFormat(mhDC, &pfd)))  	{  		close(); @@ -1073,6 +1075,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  		return FALSE;  	} +	LL_INFOS("Window") << "Pixel format chosen." << llendl ; +  	// Verify what pixel format we actually received.  	if (!DescribePixelFormat(mhDC, pixel_format, sizeof(PIXELFORMATDESCRIPTOR),  		&pfd)) @@ -1541,24 +1545,16 @@ void LLWindowWin32::moveWindow( const LLCoordScreen& position, const LLCoordScre  BOOL LLWindowWin32::setCursorPosition(const LLCoordWindow position)  { -	LLCoordScreen screen_pos; -  	mMousePositionModified = TRUE;  	if (!mWindowHandle)  	{  		return FALSE;  	} -	if (!convertCoords(position, &screen_pos)) -	{ -		return FALSE; -	}  	// Inform the application of the new mouse position (needed for per-frame  	// hover/picking to function). -	LLCoordGL gl_pos; -	convertCoords(position, &gl_pos); -	mCallbacks->handleMouseMove(this, gl_pos, (MASK)0); +	mCallbacks->handleMouseMove(this, position.convert(), (MASK)0);  	// DEV-18951 VWR-8524 Camera moves wildly when alt-clicking.  	// Because we have preemptively notified the application of the new @@ -1568,24 +1564,23 @@ BOOL LLWindowWin32::setCursorPosition(const LLCoordWindow position)  	while (PeekMessage(&msg, NULL, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE))  	{ } -	return SetCursorPos(screen_pos.mX, screen_pos.mY); +	LLCoordScreen screen_pos(position.convert()); +	return ::SetCursorPos(screen_pos.mX, screen_pos.mY);  }  BOOL LLWindowWin32::getCursorPosition(LLCoordWindow *position)  {  	POINT cursor_point; -	LLCoordScreen screen_pos; -	if (!mWindowHandle || -		!GetCursorPos(&cursor_point)) +	if (!mWindowHandle  +		|| !GetCursorPos(&cursor_point) +		|| !position)  	{  		return FALSE;  	} -	screen_pos.mX = cursor_point.x; -	screen_pos.mY = cursor_point.y; - -	return convertCoords(screen_pos, position); +	*position = LLCoordScreen(cursor_point.x, cursor_point.y).convert(); +	return TRUE;  }  void LLWindowWin32::hideCursor() @@ -2163,15 +2158,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  				// If we don't do this, many clicks could get buffered up, and if the  				// first click changes the cursor position, all subsequent clicks  				// will occur at the wrong location.  JC -				LLCoordWindow cursor_coord_window;  				if (window_imp->mMousePositionModified)  				{ +					LLCoordWindow cursor_coord_window;  					window_imp->getCursorPosition(&cursor_coord_window); -					window_imp->convertCoords(cursor_coord_window, &gl_coord); +					gl_coord = cursor_coord_window.convert();  				}  				else  				{ -					window_imp->convertCoords(window_coord, &gl_coord); +					gl_coord = window_coord.convert();  				}  				MASK mask = gKeyboard->currentMask(TRUE);  				// generate move event to update mouse coordinates @@ -2193,15 +2188,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  				// If we don't do this, many clicks could get buffered up, and if the  				// first click changes the cursor position, all subsequent clicks  				// will occur at the wrong location.  JC -				LLCoordWindow cursor_coord_window;  				if (window_imp->mMousePositionModified)  				{ +					LLCoordWindow cursor_coord_window;  					window_imp->getCursorPosition(&cursor_coord_window); -					window_imp->convertCoords(cursor_coord_window, &gl_coord); +					gl_coord = cursor_coord_window.convert();  				}  				else  				{ -					window_imp->convertCoords(window_coord, &gl_coord); +					gl_coord = window_coord.convert();  				}  				MASK mask = gKeyboard->currentMask(TRUE);  				// generate move event to update mouse coordinates @@ -2226,15 +2221,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  				// If we don't do this, many clicks could get buffered up, and if the  				// first click changes the cursor position, all subsequent clicks  				// will occur at the wrong location.  JC -				LLCoordWindow cursor_coord_window;  				if (window_imp->mMousePositionModified)  				{ +					LLCoordWindow cursor_coord_window;  					window_imp->getCursorPosition(&cursor_coord_window); -					window_imp->convertCoords(cursor_coord_window, &gl_coord); +					gl_coord = cursor_coord_window.convert();  				}  				else  				{ -					window_imp->convertCoords(window_coord, &gl_coord); +					gl_coord = window_coord.convert();  				}  				MASK mask = gKeyboard->currentMask(TRUE);  				// generate move event to update mouse coordinates @@ -2261,15 +2256,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  				// If we don't do this, many clicks could get buffered up, and if the  				// first click changes the cursor position, all subsequent clicks  				// will occur at the wrong location.  JC -				LLCoordWindow cursor_coord_window;  				if (window_imp->mMousePositionModified)  				{ +					LLCoordWindow cursor_coord_window;  					window_imp->getCursorPosition(&cursor_coord_window); -					window_imp->convertCoords(cursor_coord_window, &gl_coord); +					gl_coord = cursor_coord_window.convert();  				}  				else  				{ -					window_imp->convertCoords(window_coord, &gl_coord); +					gl_coord = window_coord.convert();  				}  				MASK mask = gKeyboard->currentMask(TRUE);  				// generate move event to update mouse coordinates @@ -2290,15 +2285,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  				// If we don't do this, many clicks could get buffered up, and if the  				// first click changes the cursor position, all subsequent clicks  				// will occur at the wrong location.  JC -				LLCoordWindow cursor_coord_window;  				if (window_imp->mMousePositionModified)  				{ +					LLCoordWindow cursor_coord_window;  					window_imp->getCursorPosition(&cursor_coord_window); -					window_imp->convertCoords(cursor_coord_window, &gl_coord); +					gl_coord = cursor_coord_window.convert();  				}  				else  				{ -					window_imp->convertCoords(window_coord, &gl_coord); +					gl_coord = window_coord.convert();  				}  				MASK mask = gKeyboard->currentMask(TRUE);  				// generate move event to update mouse coordinates @@ -2325,15 +2320,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  				// If we don't do this, many clicks could get buffered up, and if the  				// first click changes the cursor position, all subsequent clicks  				// will occur at the wrong location.  JC -				LLCoordWindow cursor_coord_window;  				if (window_imp->mMousePositionModified)  				{ +					LLCoordWindow cursor_coord_window;  					window_imp->getCursorPosition(&cursor_coord_window); -					window_imp->convertCoords(cursor_coord_window, &gl_coord); +					gl_coord = cursor_coord_window.convert();  				}  				else  				{ -					window_imp->convertCoords(window_coord, &gl_coord); +					gl_coord = window_coord.convert();  				}  				MASK mask = gKeyboard->currentMask(TRUE);  				// generate move event to update mouse coordinates @@ -2354,15 +2349,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  				// If we don't do this, many clicks could get buffered up, and if the  				// first click changes the cursor position, all subsequent clicks  				// will occur at the wrong location.  JC -				LLCoordWindow cursor_coord_window;  				if (window_imp->mMousePositionModified)  				{ +					LLCoordWindow cursor_coord_window;  					window_imp->getCursorPosition(&cursor_coord_window); -					window_imp->convertCoords(cursor_coord_window, &gl_coord); +					gl_coord = cursor_coord_window.convert();  				}  				else  				{ -					window_imp->convertCoords(window_coord, &gl_coord); +					gl_coord = window_coord.convert();  				}  				MASK mask = gKeyboard->currentMask(TRUE);  				// generate move event to update mouse coordinates @@ -2434,9 +2429,8 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  		case WM_MOUSEMOVE:  			{  				window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_MOUSEMOVE"); -				window_imp->convertCoords(window_coord, &gl_coord);  				MASK mask = gKeyboard->currentMask(TRUE); -				window_imp->mCallbacks->handleMouseMove(window_imp, gl_coord, mask); +				window_imp->mCallbacks->handleMouseMove(window_imp, window_coord.convert(), mask);  				return 0;  			} @@ -3324,7 +3318,7 @@ void LLWindowWin32::setLanguageTextInput( const LLCoordGL & position )  			LLWinImm::setCompositionWindow( himc, &ime_form ); -			sWinIMEWindowPosition.set( win_pos.mX, win_pos.mY ); +			sWinIMEWindowPosition = win_pos;  		}  		LLWinImm::releaseContext(mWindowHandle, himc); diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h index bf38a8b062..597031ec70 100644 --- a/indra/llxml/llcontrol.h +++ b/indra/llxml/llcontrol.h @@ -92,6 +92,8 @@ typedef enum e_control_type  class LLControlVariable : public LLRefCount  { +	LOG_CLASS(LLControlVariable); +  	friend class LLControlGroup;  public: @@ -180,6 +182,8 @@ T convert_from_llsd(const LLSD& sd, eControlType type, const std::string& contro  //const U32 STRING_CACHE_SIZE = 10000;  class LLControlGroup : public LLInstanceTracker<LLControlGroup, std::string>  { +	LOG_CLASS(LLControlGroup); +  protected:  	typedef std::map<std::string, LLControlVariablePtr > ctrl_name_table_t;  	ctrl_name_table_t mNameTable; diff --git a/indra/llxml/llxmlnode.cpp b/indra/llxml/llxmlnode.cpp index 2b4a0fc2a1..2ffb0d8503 100644 --- a/indra/llxml/llxmlnode.cpp +++ b/indra/llxml/llxmlnode.cpp @@ -631,13 +631,14 @@ bool LLXMLNode::updateNode(  	}  	//update all of node's children with updateNodes children that match name -	LLXMLNodePtr child; +	LLXMLNodePtr child = node->getFirstChild(); +	LLXMLNodePtr last_child = child;  	LLXMLNodePtr updateChild;  	for (updateChild = update_node->getFirstChild(); updateChild.notNull();   		 updateChild = updateChild->getNextSibling())  	{ -		for (child = node->getFirstChild(); child.notNull(); child = child->getNextSibling()) +		while(child.notNull())  		{  			std::string nodeName;  			std::string updateName; @@ -656,6 +657,22 @@ bool LLXMLNode::updateNode(  			if ((nodeName != "") && (updateName == nodeName))  			{  				updateNode(child, updateChild); +				last_child = child; +				child = child->getNextSibling(); +				if (child.isNull()) +				{ +					child = node->getFirstChild(); +				} +				break; +			} +			 +			child = child->getNextSibling(); +			if (child.isNull()) +			{ +				child = node->getFirstChild(); +			} +			if (child == last_child) +			{  				break;  			}  		} @@ -784,7 +801,7 @@ bool LLXMLNode::parseStream(  	while(str.good())  	{  		str.read((char*)buffer, BUFSIZE); -		int count = str.gcount(); +		int count = (int)str.gcount();  		if (XML_Parse(my_parser, (const char *)buffer, count, !str.good()) != XML_STATUS_OK)  		{ @@ -882,11 +899,8 @@ bool LLXMLNode::getLayeredXMLNode(LLXMLNodePtr& root,  	for (itor = paths.begin(), ++itor; itor != paths.end(); ++itor)  	{ -		std::string nodeName; -		std::string updateName; -  		std::string layer_filename = *itor; -		if(layer_filename.empty()) +		if(layer_filename.empty() || layer_filename == filename)  		{  			// no localized version of this file, that's ok, keep looking  			continue; @@ -898,6 +912,9 @@ bool LLXMLNode::getLayeredXMLNode(LLXMLNodePtr& root,  			return false;  		} +		std::string nodeName; +		std::string updateName; +  		updateRoot->getAttributeString("name", updateName);  		root->getAttributeString("name", nodeName); diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index ab20957760..4ab1d891a3 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -1253,15 +1253,16 @@ namespace LLInitParam  			return mValues.back();  		} -		void add(const value_t& item) +		self_t& add(const value_t& item)  		{  			param_value_t param_value;  			param_value.setValue(item);  			mValues.push_back(param_value);  			setProvided(); +			return *this;  		} -		void add(const typename name_value_lookup_t::name_t& name) +		self_t& add(const typename name_value_lookup_t::name_t& name)  		{  			value_t value; @@ -1271,6 +1272,8 @@ namespace LLInitParam  				add(value);  				mValues.back().setValueName(name);  			} + +			return *this;  		}  		// implicit conversion @@ -1441,13 +1444,14 @@ namespace LLInitParam  			return mValues.back();  		} -		void add(const value_t& item) +		self_t& add(const value_t& item)  		{  			mValues.push_back(item);  			setProvided(); +			return *this;  		} -		void add(const typename name_value_lookup_t::name_t& name) +		self_t& add(const typename name_value_lookup_t::name_t& name)  		{  			value_t value; @@ -1457,6 +1461,7 @@ namespace LLInitParam  				add(value);  				mValues.back().setValueName(name);  			} +			return *this;  		}  		// implicit conversion diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp index 999f754dcf..24328202cb 100644 --- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp +++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp @@ -705,7 +705,7 @@ private:  		// look up "Display Name" in meta data  		OSType meta_data_key = kQTMetaDataCommonKeyDisplayName;  		QTMetaDataItem item = kQTMetaDataItemUninitialized; -		result = QTMetaDataGetNextItem( media_data_ref, kQTMetaDataStorageFormatWildcard,  +		result = (OSErr)QTMetaDataGetNextItem( media_data_ref, kQTMetaDataStorageFormatWildcard,   										0, kQTMetaDataKeyFormatCommon,   										(const UInt8 *)&meta_data_key,   										sizeof( meta_data_key ), &item ); @@ -714,14 +714,14 @@ private:  		// find the size of the title  		ByteCount size; -		result = QTMetaDataGetItemValue( media_data_ref, item, NULL, 0, &size ); +		result = (OSErr)QTMetaDataGetItemValue( media_data_ref, item, NULL, 0, &size );  		if ( noErr != result || size <= 0 /*|| size > 1024  FIXME: arbitrary limit */ )   			return false;  		// allocate some space and grab it  		UInt8* item_data = new UInt8[ size + 1 ];  		memset( item_data, 0, ( size + 1 ) * sizeof( UInt8 ) ); -		result = QTMetaDataGetItemValue( media_data_ref, item, item_data, size, NULL ); +		result = (OSErr)QTMetaDataGetItemValue( media_data_ref, item, item_data, size, NULL );  		if ( noErr != result )   		{  			delete [] item_data; diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index 47f8dcd545..1812abd7d5 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -991,7 +991,7 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  		{  			if(message_name == "set_volume")  			{ -				F32 volume = message_in.getValueReal("volume"); +				F32 volume = (F32)message_in.getValueReal("volume");  				setVolume(volume);  			}  		} @@ -1057,9 +1057,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  				S32 height = message_in.getValueS32("height");  				S32 texture_width = message_in.getValueS32("texture_width");  				S32 texture_height = message_in.getValueS32("texture_height"); -				mBackgroundR = message_in.getValueReal("background_r"); -				mBackgroundG = message_in.getValueReal("background_g"); -				mBackgroundB = message_in.getValueReal("background_b"); +				mBackgroundR = (F32)message_in.getValueReal("background_r"); +				mBackgroundG = (F32)message_in.getValueReal("background_g"); +				mBackgroundB = (F32)message_in.getValueReal("background_b");  //				mBackgroundA = message_in.setValueReal("background_a");		// Ignore any alpha  				if(!name.empty()) @@ -1245,9 +1245,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  			if(message_name == "js_agent_location")  			{  #if LLQTWEBKIT_API_VERSION >= 9 -				F32 x = message_in.getValueReal("x"); -				F32 y = message_in.getValueReal("y"); -				F32 z = message_in.getValueReal("z"); +				F32 x = (F32)message_in.getValueReal("x"); +				F32 y = (F32)message_in.getValueReal("y"); +				F32 z = (F32)message_in.getValueReal("z");  				LLQtWebKit::getInstance()->setAgentLocation( x, y, z );  				LLQtWebKit::getInstance()->emitLocation();  #endif @@ -1256,9 +1256,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  			if(message_name == "js_agent_global_location")  			{  #if LLQTWEBKIT_API_VERSION >= 9 -				F32 x = message_in.getValueReal("x"); -				F32 y = message_in.getValueReal("y"); -				F32 z = message_in.getValueReal("z"); +				F32 x = (F32)message_in.getValueReal("x"); +				F32 y = (F32)message_in.getValueReal("y"); +				F32 z = (F32)message_in.getValueReal("z");  				LLQtWebKit::getInstance()->setAgentGlobalLocation( x, y, z );  				LLQtWebKit::getInstance()->emitLocation();  #endif @@ -1267,7 +1267,7 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  			if(message_name == "js_agent_orientation")  			{  #if LLQTWEBKIT_API_VERSION >= 9 -				F32 angle = message_in.getValueReal("angle"); +				F32 angle = (F32)message_in.getValueReal("angle");  				LLQtWebKit::getInstance()->setAgentOrientation( angle );  				LLQtWebKit::getInstance()->emitLocation();  #endif @@ -1323,7 +1323,7 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  			else if(message_name == "set_page_zoom_factor")  			{  #if LLQTWEBKIT_API_VERSION >= 15 -				F32 factor = message_in.getValueReal("factor"); +				F32 factor = (F32)message_in.getValueReal("factor");  				LLQtWebKit::getInstance()->setPageZoomFactor(factor);  #else  				llwarns << "Ignoring setPageZoomFactor message (llqtwebkit version is too old)." << llendl; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 37b23803f2..3c9bde34b7 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1345,7 +1345,9 @@ if (WINDOWS)          DXGUID_LIBRARY          ) +# see EXP-1765 - theory is opengl32.lib needs to be included before gdi32.lib (windows libs)      set(viewer_LIBRARIES +        opengl32          ${WINDOWS_LIBRARIES}          comdlg32          ${DINPUT_LIBRARY} @@ -1355,7 +1357,6 @@ if (WINDOWS)          odbccp32          ole32          oleaut32 -        opengl32          shell32          Vfw32          winspool diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 0e26013152..ee8c15752b 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -4282,6 +4282,17 @@          <key>Value</key>          <integer>0</integer>      </map> +    <key>InventoryInboxToggleState</key> +    <map> +        <key>Comment</key> +        <string>Stores the open/closed state of inventory Received items panel</string> +        <key>Persist</key> +        <integer>1</integer> +        <key>Type</key> +        <string>Boolean</string> +        <key>Value</key> +        <integer>0</integer> +    </map>  	<key>InventoryLinking</key>  	<map>  		<key>Comment</key> diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 09305a5b4d..dd02a74a38 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -817,7 +817,10 @@ void LLAgentWearables::popWearable(const LLWearableType::EType type, U32 index)  	if (wearable)  	{  		mWearableDatas[type].erase(mWearableDatas[type].begin() + index); +		if (isAgentAvatarValid()) +		{  		gAgentAvatarp->wearableUpdated(wearable->getType(), TRUE); +		}  		wearable->setLabelUpdated();  	}  } diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 647ace7ee3..6931b55c4c 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -30,7 +30,8 @@  #include "llmemtype.h" -#include "llwindowwin32.cpp" // *FIX: for setting gIconResource. +#include "llwindowwin32.h" // *FIX: for setting gIconResource. +#include "llgl.h"  #include "res/resource.h" // *FIX: for setting gIconResource.  #include <fcntl.h>		//_O_APPEND diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index e3217668c5..f2375bfa4f 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -188,7 +188,7 @@ void LLCallFloater::draw()  	// Need to resort the participant list if it's in sort by recent speaker order.  	if (mParticipants) -		mParticipants->updateRecentSpeakersOrder(); +		mParticipants->update();  	LLFloater::draw();  } @@ -333,6 +333,7 @@ void LLCallFloater::refreshParticipantList()  	if (!non_avatar_caller)  	{ +		llassert(mParticipants == NULL); // check for possible memory leak  		mParticipants = new LLParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT, false);  		mParticipants->setValidateSpeakerCallback(boost::bind(&LLCallFloater::validateSpeaker, this, _1));  		const U32 speaker_sort_order = gSavedSettings.getU32("SpeakerParticipantDefaultOrder"); diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index 2abfbf37ca..935dcb74b0 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -55,7 +55,7 @@ public:  		else  		{  			width = mEditor.getDocumentView()->getRect().getWidth() - mEditor.getHPad();  -			height = llceil(mStyle->getFont()->getLineHeight()); +			height = mStyle->getFont()->getLineHeight();  		}  		return true;  	} diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 233038daba..9664aa7dbe 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -149,7 +149,7 @@ BOOL LLFastTimerView::handleRightMouseDown(S32 x, S32 y, MASK mask)  LLFastTimer::NamedTimer* LLFastTimerView::getLegendID(S32 y)  { -	S32 idx = (getRect().getHeight() - y) / ((S32) LLFontGL::getFontMonospace()->getLineHeight()+2) - 5; +	S32 idx = (getRect().getHeight() - y) / (LLFontGL::getFontMonospace()->getLineHeight()+2) - 5;  	if (idx >= 0 && idx < (S32)ft_display_idx.size())  	{ @@ -552,7 +552,7 @@ void LLFastTimerView::draw()  	// update rectangle that includes timer bars  	mBarRect.mLeft = xleft;  	mBarRect.mRight = getRect().getWidth(); -	mBarRect.mTop = ytop - ((S32)LLFontGL::getFontMonospace()->getLineHeight() + 4); +	mBarRect.mTop = ytop - (LLFontGL::getFontMonospace()->getLineHeight() + 4);  	mBarRect.mBottom = margin + LINE_GRAPH_HEIGHT;  	y = ytop; @@ -846,7 +846,7 @@ void LLFastTimerView::draw()  				tdesc = llformat("%4.2f ms", ms);  			x = mGraphRect.mRight - LLFontGL::getFontMonospace()->getWidth(tdesc)-5; -			y = mGraphRect.mTop - ((S32)LLFontGL::getFontMonospace()->getLineHeight()); +			y = mGraphRect.mTop - LLFontGL::getFontMonospace()->getLineHeight();  			LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white,  										 LLFontGL::LEFT, LLFontGL::TOP); diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index f741b9b810..8986a694f9 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -1075,8 +1075,11 @@ void LLFilePicker::chooser_responder(GtkWidget *widget, gint response, gpointer  	}  	// set the default path for this usage context. -	picker->mContextToPathMap[picker->mCurContextName] = -		gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(widget)); +	const char* cur_folder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(widget)); +	if (cur_folder != NULL) +	{ +		picker->mContextToPathMap[picker->mCurContextName] = cur_folder; +	}  	gtk_widget_destroy(widget);  	gtk_main_quit(); diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index aa66fcf9b8..0290e7cdf0 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -63,6 +63,11 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(select_callback_t callback,  	// *TODO: Use a key to allow this not to be an effective singleton  	LLFloaterAvatarPicker* floater =   		LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker"); +	if (!floater) +	{ +		llwarns << "Cannot instantiate avatar picker" << llendl; +		return NULL; +	}  	floater->mSelectionCallback = callback;  	floater->setAllowMultiple(allow_multiple); diff --git a/indra/newview/llfloaterbuildoptions.cpp b/indra/newview/llfloaterbuildoptions.cpp index 86c1bf0534..1b65d8d683 100644 --- a/indra/newview/llfloaterbuildoptions.cpp +++ b/indra/newview/llfloaterbuildoptions.cpp @@ -41,13 +41,9 @@  // Methods  // -void commit_grid_mode(LLUICtrl *); -  LLFloaterBuildOptions::LLFloaterBuildOptions(const LLSD& key) -  : LLFloater(key), -    mComboGridMode(NULL) +  : LLFloater(key)  { -	mCommitCallbackRegistrar.add("GridOptions.gridMode", boost::bind(&commit_grid_mode,_1));  }  LLFloaterBuildOptions::~LLFloaterBuildOptions() @@ -55,45 +51,9 @@ LLFloaterBuildOptions::~LLFloaterBuildOptions()  BOOL LLFloaterBuildOptions::postBuild()  { -	mComboGridMode = getChild<LLComboBox>("combobox grid mode"); -  	return TRUE;  } -void LLFloaterBuildOptions::setGridMode(EGridMode mode) -{ -	mComboGridMode->setCurrentByIndex((S32)mode); -} - -void LLFloaterBuildOptions::updateGridMode() -{ -	if (mComboGridMode) -	{ -		S32 index = mComboGridMode->getCurrentIndex(); -		mComboGridMode->removeall(); - -		switch (mObjectSelection->getSelectType()) -		{ -		case SELECT_TYPE_HUD: -		  mComboGridMode->add(getString("grid_screen_text")); -		  mComboGridMode->add(getString("grid_local_text")); -		  break; -		case SELECT_TYPE_WORLD: -		  mComboGridMode->add(getString("grid_world_text")); -		  mComboGridMode->add(getString("grid_local_text")); -		  mComboGridMode->add(getString("grid_reference_text")); -		  break; -		case SELECT_TYPE_ATTACHMENT: -		  mComboGridMode->add(getString("grid_attachment_text")); -		  mComboGridMode->add(getString("grid_local_text")); -		  mComboGridMode->add(getString("grid_reference_text")); -		  break; -		} - -		mComboGridMode->setCurrentByIndex(index); -	} -} -  // virtual  void LLFloaterBuildOptions::onOpen(const LLSD& key)  { @@ -105,10 +65,3 @@ void LLFloaterBuildOptions::onClose(bool app_quitting)  {  	mObjectSelection = NULL;  } - -void commit_grid_mode(LLUICtrl *ctrl) -{ -	LLComboBox* combo = (LLComboBox*)ctrl; - -	LLSelectMgr::getInstance()->setGridMode((EGridMode)combo->getCurrentIndex()); -} diff --git a/indra/newview/llfloaterbuildoptions.h b/indra/newview/llfloaterbuildoptions.h index 7f3811bf1c..02c56cb6a9 100644 --- a/indra/newview/llfloaterbuildoptions.h +++ b/indra/newview/llfloaterbuildoptions.h @@ -35,7 +35,6 @@  #include "llfloater.h"  #include "llselectmgr.h" -class LLComboBox;  class LLObjectSelection;  typedef LLSafeHandle<LLObjectSelection> LLObjectSelectionHandle; @@ -44,23 +43,17 @@ class LLFloaterBuildOptions  	:	public LLFloater  {  public: -  	virtual BOOL postBuild();  	/*virtual*/ void onOpen(const LLSD& key);  	/*virtual*/	void onClose(bool app_quitting); -	void setGridMode(EGridMode mode); -	void updateGridMode(); -  private: -  	friend class LLFloaterReg;  	LLFloaterBuildOptions(const LLSD& key);  	~LLFloaterBuildOptions(); -	LLComboBox*	mComboGridMode;  	LLObjectSelectionHandle	mObjectSelection;  };  #endif diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp index ee8487b160..087b0007e1 100644 --- a/indra/newview/llfloaterbuy.cpp +++ b/indra/newview/llfloaterbuy.cpp @@ -239,8 +239,9 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj,  		// Compute icon for this item  		BOOL item_is_multi = FALSE; -		if ( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED  +		if (( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED  			|| inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS) +			&& !(inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK))  		{  			item_is_multi = TRUE;  		} diff --git a/indra/newview/llfloaterbvhpreview.h b/indra/newview/llfloaterbvhpreview.h index bae98c95d9..b81cc6e3a5 100644 --- a/indra/newview/llfloaterbvhpreview.h +++ b/indra/newview/llfloaterbvhpreview.h @@ -32,6 +32,7 @@  #include "lldynamictexture.h"  #include "llcharacter.h"  #include "llquaternion.h" +#include "llextendedstatus.h"  class LLVOAvatar;  class LLViewerJointMesh; diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp index 895e16adef..4f2a6ec1b7 100644 --- a/indra/newview/llfloatermediasettings.cpp +++ b/indra/newview/llfloatermediasettings.cpp @@ -312,3 +312,9 @@ bool LLFloaterMediaSettings::haveValuesChanged() const  	return values_changed;  } +bool LLFloaterMediaSettings::instanceExists() +{ +	return LLFloaterReg::findTypedInstance<LLFloaterMediaSettings>("media_settings"); +} + + diff --git a/indra/newview/llfloatermediasettings.h b/indra/newview/llfloatermediasettings.h index ecc55d2cbc..1d25530986 100644 --- a/indra/newview/llfloatermediasettings.h +++ b/indra/newview/llfloatermediasettings.h @@ -45,6 +45,7 @@ public:  	/*virtual*/ void onClose(bool app_quitting);  	static LLFloaterMediaSettings* getInstance(); +	static bool instanceExists();  	static void apply();  	static void initValues( const LLSD& media_settings , bool editable);  	static void clearValues( bool editable); diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index a333989e7e..173b0e538c 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -741,7 +741,8 @@ void LLFloaterPreference::onClose(bool app_quitting)  void LLFloaterPreference::onOpenHardwareSettings()  { -	LLFloaterReg::showInstance("prefs_hardware_settings"); +	LLFloater* floater = LLFloaterReg::showInstance("prefs_hardware_settings"); +	addDependentFloater(floater, FALSE);  }  // static   void LLFloaterPreference::onBtnOK() @@ -1800,7 +1801,46 @@ void LLPanelPreference::updateMediaAutoPlayCheckbox(LLUICtrl* ctrl)  	}  } +class LLPanelPreferencePrivacy : public LLPanelPreference +{ +public: +	LLPanelPreferencePrivacy() +	{ +		mAccountIndependentSettings.push_back("VoiceCallsFriendsOnly"); +		mAccountIndependentSettings.push_back("AutoDisengageMic"); +	} + +	/*virtual*/ void saveSettings() +	{ +		LLPanelPreference::saveSettings(); + +		// Don't save (=erase from the saved values map) per-account privacy settings +		// if we're not logged in, otherwise they will be reset to defaults on log off. +		if (LLStartUp::getStartupState() != STATE_STARTED) +		{ +			// Erase only common settings, assuming there are no color settings on Privacy page. +			for (control_values_map_t::iterator it = mSavedValues.begin(); it != mSavedValues.end(); ) +			{ +				const std::string setting = it->first->getName(); +				if (std::find(mAccountIndependentSettings.begin(), +					mAccountIndependentSettings.end(), setting) == mAccountIndependentSettings.end()) +				{ +					mSavedValues.erase(it++); +				} +				else +				{ +					++it; +				} +			} +		} +	} + +private: +	std::list<std::string> mAccountIndependentSettings; +}; +  static LLRegisterPanelClassWrapper<LLPanelPreferenceGraphics> t_pref_graph("panel_preference_graphics"); +static LLRegisterPanelClassWrapper<LLPanelPreferencePrivacy> t_pref_privacy("panel_preference_privacy");  BOOL LLPanelPreferenceGraphics::postBuild()  { diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 7ee3294478..ec5994e917 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -198,15 +198,17 @@ public:  	virtual void saveSettings();  	class Updater; + +protected: +	typedef std::map<LLControlVariable*, LLSD> control_values_map_t; +	control_values_map_t mSavedValues; +  private:  	//for "Only friends and groups can call or IM me"  	static void showFriendsOnlyWarning(LLUICtrl*, const LLSD&);  	//for "Show my Favorite Landmarks at Login"  	static void showFavoritesOnLoginWarning(LLUICtrl* checkbox, const LLSD& value); -	typedef std::map<LLControlVariable*, LLSD> control_values_map_t; -	control_values_map_t mSavedValues; -  	typedef std::map<std::string, LLColor4> string_color_map_t;  	string_color_map_t mSavedColors; diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index c402de66e8..ae45949b4a 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -33,6 +33,7 @@  #include "llfloater.h"  #include "llhost.h"  #include "llpanel.h" +#include "llextendedstatus.h"  #include "llenvmanager.h" // for LLEnvironmentSettings diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h index cd98f7be57..7d68431710 100644 --- a/indra/newview/llfloaterreporter.h +++ b/indra/newview/llfloaterreporter.h @@ -31,6 +31,7 @@  #include "llfloater.h"  #include "lluuid.h"  #include "v3math.h" +#include "llextendedstatus.h"  class LLAvatarName;  class LLMessageSystem; diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index be7a53491d..5385977d95 100644 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -59,7 +59,10 @@ LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_na  	LLView* view = findChildView(panel_name, true);  	if (!view) return NULL; -	openFloater(); +	if (!getVisible()) +	{ +		openFloater(); +	}  	LLPanel* panel = NULL; diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index bd5b5f4eb0..6978e6a430 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -36,6 +36,7 @@  #include "llagentcamera.h"  #include "llbutton.h"  #include "llcheckboxctrl.h" +#include "llcombobox.h"  #include "lldraghandle.h"  #include "llerror.h"  #include "llfloaterbuildoptions.h" @@ -103,6 +104,7 @@ const std::string PANEL_NAMES[LLFloaterTools::PANEL_COUNT] =  // Local prototypes +void commit_grid_mode(LLUICtrl *ctrl);  void commit_select_component(void *data);  void click_show_more(void*);  void click_popup_info(void*); @@ -252,6 +254,7 @@ BOOL	LLFloaterTools::postBuild()  	getChild<LLUICtrl>("checkbox uniform")->setValue((BOOL)gSavedSettings.getBOOL("ScaleUniform"));  	mCheckStretchTexture	= getChild<LLCheckBoxCtrl>("checkbox stretch textures");  	getChild<LLUICtrl>("checkbox stretch textures")->setValue((BOOL)gSavedSettings.getBOOL("ScaleStretchTextures")); +	mComboGridMode			= getChild<LLComboBox>("combobox grid mode");  	mCheckStretchUniformLabel = getChild<LLTextBox>("checkbox uniform label");  	// @@ -330,6 +333,7 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)  	mCheckSnapToGrid(NULL),  	mBtnGridOptions(NULL),  	mTitleMedia(NULL), +	mComboGridMode(NULL),  	mCheckStretchUniform(NULL),  	mCheckStretchTexture(NULL),  	mCheckStretchUniformLabel(NULL), @@ -386,6 +390,7 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)  	mCommitCallbackRegistrar.add("BuildTool.commitRadioMove",	boost::bind(&commit_radio_group_move,_1));  	mCommitCallbackRegistrar.add("BuildTool.commitRadioEdit",	boost::bind(&commit_radio_group_edit,_1)); +	mCommitCallbackRegistrar.add("BuildTool.gridMode",			boost::bind(&commit_grid_mode,_1));  	mCommitCallbackRegistrar.add("BuildTool.selectComponent",	boost::bind(&commit_select_component, this));  	mCommitCallbackRegistrar.add("BuildTool.gridOptions",		boost::bind(&LLFloaterTools::onClickGridOptions,this));  	mCommitCallbackRegistrar.add("BuildTool.applyToSelection",	boost::bind(&click_apply_to_selection, this)); @@ -687,6 +692,33 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)  		mRadioGroupEdit->setValue("radio select face");  	} +	if (mComboGridMode)  +	{ +		mComboGridMode->setVisible( edit_visible ); +		S32 index = mComboGridMode->getCurrentIndex(); +		mComboGridMode->removeall(); + +		switch (mObjectSelection->getSelectType()) +		{ +			case SELECT_TYPE_HUD: +				mComboGridMode->add(getString("grid_screen_text")); +				mComboGridMode->add(getString("grid_local_text")); +				break; +			case SELECT_TYPE_WORLD: +				mComboGridMode->add(getString("grid_world_text")); +				mComboGridMode->add(getString("grid_local_text")); +				mComboGridMode->add(getString("grid_reference_text")); +				break; +			case SELECT_TYPE_ATTACHMENT: +				mComboGridMode->add(getString("grid_attachment_text")); +				mComboGridMode->add(getString("grid_local_text")); +				mComboGridMode->add(getString("grid_reference_text")); +				break; +		} + +		mComboGridMode->setCurrentByIndex(index); +	} +  	// Snap to grid disabled for grab tool - very confusing  	if (mCheckSnapToGrid) mCheckSnapToGrid->setVisible( edit_visible /* || tool == LLToolGrab::getInstance() */ );  	if (mBtnGridOptions) mBtnGridOptions->setVisible( edit_visible /* || tool == LLToolGrab::getInstance() */ ); @@ -1037,6 +1069,13 @@ void LLFloaterTools::setObjectType( LLPCode pcode )  	gFocusMgr.setMouseCapture(NULL);  } +void commit_grid_mode(LLUICtrl *ctrl) +{ +	LLComboBox* combo = (LLComboBox*)ctrl; + +	LLSelectMgr::getInstance()->setGridMode((EGridMode)combo->getCurrentIndex()); +} +  void LLFloaterTools::onClickGridOptions()  { @@ -1144,7 +1183,7 @@ void LLFloaterTools::updateLandImpacts()  	childSetTextArg("remaining_capacity", "[CAPACITY_STRING]", remaining_capacity_str);  	// Update land impacts info in the weights floater -	LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::getTypedInstance<LLFloaterObjectWeights>("object_weights"); +	LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::findTypedInstance<LLFloaterObjectWeights>("object_weights");  	if(object_weights_floater)  	{  		object_weights_floater->updateLandImpacts(parcel); @@ -1234,6 +1273,7 @@ void LLFloaterTools::getMediaState()  		}  	} func; +	  	// check if all faces have media(or, all dont have media)  	LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue( &func, bool_has_media ); diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index 63ed9dc82b..7a19d093a4 100644 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -33,6 +33,7 @@  class LLButton;  class LLCheckBoxCtrl; +class LLComboBox;  class LLPanelPermissions;  class LLPanelObject;  class LLPanelVolume; @@ -140,6 +141,7 @@ public:  	LLCheckBoxCtrl*	mCheckSnapToGrid;  	LLButton*		mBtnGridOptions; +	LLComboBox*		mComboGridMode;  	LLCheckBoxCtrl*	mCheckStretchUniform;  	LLCheckBoxCtrl*	mCheckStretchTexture; diff --git a/indra/newview/llfloatertranslationsettings.cpp b/indra/newview/llfloatertranslationsettings.cpp index 428a02e9f0..1a17183efd 100644 --- a/indra/newview/llfloatertranslationsettings.cpp +++ b/indra/newview/llfloatertranslationsettings.cpp @@ -293,6 +293,6 @@ void LLFloaterTranslationSettings::onBtnOK()  	gSavedSettings.setString("TranslationService", getSelectedService());  	gSavedSettings.setString("BingTranslateAPIKey", getEnteredBingKey());  	gSavedSettings.setString("GoogleTranslateAPIKey", getEnteredGoogleKey()); -	LLNearbyChatBar::getInstance()->enableTranslationCheckbox(LLTranslate::isTranslationConfigured()); +	LLNearbyChatBar::getInstance()->showTranslationCheckbox(LLTranslate::isTranslationConfigured());  	closeFloater(false);  } diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index e0d7d67f7d..86001e4146 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -255,7 +255,7 @@ LLFolderView::LLFolderView(const Params& p)  	LLRect new_r = LLRect(rect.mLeft + ICON_PAD,  			      rect.mTop - TEXT_PAD,  			      rect.mRight, -			      rect.mTop - TEXT_PAD - llfloor(font->getLineHeight())); +			      rect.mTop - TEXT_PAD - font->getLineHeight());  	text_p.rect(new_r);  	text_p.name(std::string(p.name));  	text_p.font(font); @@ -388,7 +388,7 @@ void LLFolderView::setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse  static LLFastTimer::DeclareTimer FTM_ARRANGE("Arrange"); -// This view grows and shinks to enclose all of its children items and folders. +// This view grows and shrinks to enclose all of its children items and folders.  S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_generation )  {  	if (getListener()->getUUID().notNull()) @@ -414,7 +414,7 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen  		getRoot()->getFilter()->getShowFolderState();  	S32 total_width = LEFT_PAD; -	S32 running_height = mDebugFilters ? llceil(LLFontGL::getFontMonospace()->getLineHeight()) : 0; +	S32 running_height = mDebugFilters ? LLFontGL::getFontMonospace()->getLineHeight() : 0;  	S32 target_height = running_height;  	S32 parent_item_height = getRect().getHeight(); @@ -527,15 +527,15 @@ void LLFolderView::reshape(S32 width, S32 height, BOOL called_from_parent)  		LLView::reshape(width, height, called_from_parent);  		scroll_rect = mScrollContainer->getContentWindowRect();  	} -	width = llmax(mMinWidth, scroll_rect.getWidth()); +	width  = llmax(mMinWidth, scroll_rect.getWidth());  	height = llmax(mRunningHeight, scroll_rect.getHeight()); -	// restrict width with scroll container's width -	if (mUseEllipses) +	// Restrict width within scroll container's width +	if (mUseEllipses && mScrollContainer) +	{  		width = scroll_rect.getWidth(); - +	}  	LLView::reshape(width, height, called_from_parent); -  	mReshapeSignal(mSelectedItems, FALSE);  } @@ -912,7 +912,7 @@ void LLFolderView::draw()  	}  	else if (mShowEmptyMessage)  	{ -		if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration()) +		if (LLInventoryModelBackgroundFetch::instance().folderFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration())  		{  			mStatusText = LLTrans::getString("Searching");  		} @@ -1966,7 +1966,7 @@ void LLFolderView::scrollToShowSelection()  	// However we allow scrolling for folder views with mAutoSelectOverride  	// (used in Places SP) as an exception because the selection in them  	// is not reset during items filtering. See STORM-133. -	if ( (!LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() || mAutoSelectOverride) +	if ( (!LLInventoryModelBackgroundFetch::instance().folderFetchActive() || mAutoSelectOverride)  			&& mSelectedItems.size() )  	{  		mNeedsScroll = TRUE; @@ -1994,7 +1994,7 @@ void LLFolderView::scrollToShowItem(LLFolderViewItem* item, const LLRect& constr  		LLRect visible_doc_rect = mScrollContainer->getVisibleContentRect();  		S32 icon_height = mIcon.isNull() ? 0 : mIcon->getHeight();  -		S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight());  +		S32 label_height = getLabelFontForStyle(mLabelStyle)->getLineHeight();   		// when navigating with keyboard, only move top of opened folder on screen, otherwise show whole folder  		S32 max_height_to_show = item->isOpen() && mScrollContainer->hasFocus() ? (llmax( icon_height, label_height ) + ICON_PAD) : local_rect.getHeight();  diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 8d6114c887..afad27b4e0 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -410,8 +410,8 @@ BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* roo  } -// Finds width and height of this object and it's children.  Also -// makes sure that this view and it's children are the right size. +// Finds width and height of this object and its children.  Also +// makes sure that this view and its children are the right size.  S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)  {  	const Params& p = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>(); @@ -423,7 +423,7 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)  		: 0;  	if (mLabelWidthDirty)  	{ -		mLabelWidth = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + getLabelFontForStyle(mLabelStyle)->getWidth(mSearchableLabel);  +		mLabelWidth = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + getLabelFontForStyle(mLabelStyle)->getWidth(mLabel) + getLabelFontForStyle(mLabelStyle)->getWidth(mLabelSuffix) + TEXT_PAD_RIGHT;   		mLabelWidthDirty = false;  	} @@ -1045,7 +1045,7 @@ void LLFolderViewItem::draw()  	}  	if ((mIsLoading  		&&	mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime")) -			||	(LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() +			||	(LLInventoryModelBackgroundFetch::instance().folderFetchActive()  				&&	root_is_loading  				&&	mShowLoadStatus))  	{ diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index 2fc79f5765..4e8dc2da16 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -114,6 +114,7 @@ public:  	static const S32 ICON_PAD = 2;  	static const S32 ICON_WIDTH = 16;  	static const S32 TEXT_PAD = 1; +	static const S32 TEXT_PAD_RIGHT = 4;  	static const S32 ARROW_SIZE = 12;  	static const S32 MAX_FOLDER_ITEM_OVERLAP = 2;  	// animation parameters diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index bbf66ca750..129cddda45 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -123,6 +123,22 @@ BOOL LLGroupList::handleRightMouseDown(S32 x, S32 y, MASK mask)  	return handled;  } +// virtual +BOOL LLGroupList::handleDoubleClick(S32 x, S32 y, MASK mask) +{ +	BOOL handled = LLView::handleDoubleClick(x, y, mask); +	// Handle double click only for the selected item in the list, skip clicks on empty space. +	if (handled) +	{ +		if (mDoubleClickSignal) +		{ +			(*mDoubleClickSignal)(this, x, y, mask); +		} +	} + +	return handled; +} +  void LLGroupList::setNameFilter(const std::string& filter)  {  	std::string filter_upper = filter; diff --git a/indra/newview/llgrouplist.h b/indra/newview/llgrouplist.h index d7051db891..8abf14b3d0 100644 --- a/indra/newview/llgrouplist.h +++ b/indra/newview/llgrouplist.h @@ -51,6 +51,7 @@ public:  	virtual void draw(); // from LLView  	/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); // from LLView +	/*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask); // from LLView  	void setNameFilter(const std::string& filter);  	void toggleIcons(); diff --git a/indra/newview/llhudrender.cpp b/indra/newview/llhudrender.cpp index 122711a86d..dff310ecf9 100644 --- a/indra/newview/llhudrender.cpp +++ b/indra/newview/llhudrender.cpp @@ -138,7 +138,7 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,  	LLUI::translate((F32) winX*1.0f/LLFontGL::sScaleX, (F32) winY*1.0f/(LLFontGL::sScaleY), -(((F32) winZ*2.f)-1.f));  	F32 right_x; -	font.render(wstr, 0, 0, 0, color, LLFontGL::LEFT, LLFontGL::BASELINE, style, shadow, wstr.length(), 1000, &right_x); +	font.render(wstr, 0, 0, 1, color, LLFontGL::LEFT, LLFontGL::BASELINE, style, shadow, wstr.length(), 1000, &right_x);  	LLUI::popMatrix();  	gGL.popMatrix(); diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index 24a876c59a..579b6008ae 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -227,7 +227,7 @@ void LLHUDText::renderText()  			 segment_iter != mTextSegments.end(); ++segment_iter )  		{  			const LLFontGL* fontp = segment_iter->mFont; -			y_offset -= fontp->getLineHeight(); +			y_offset -= fontp->getLineHeight() - 1; // correction factor to match legacy font metrics  			U8 style = segment_iter->mStyle;  			LLFontGL::ShadowType shadow = LLFontGL::DROP_SHADOW; @@ -480,8 +480,6 @@ void LLHUDText::updateSize()  	F32 width = 0.f;  	S32 max_lines = getMaxLines(); -	//S32 lines = (max_lines < 0) ? (S32)mTextSegments.size() : llmin((S32)mTextSegments.size(), max_lines); -	//F32 height = (F32)mFontp->getLineHeight() * (lines + mLabelSegments.size());  	S32 start_segment;  	if (max_lines < 0) start_segment = 0; @@ -491,7 +489,7 @@ void LLHUDText::updateSize()  	while (iter != mTextSegments.end())  	{  		const LLFontGL* fontp = iter->mFont; -		height += fontp->getLineHeight(); +		height += fontp->getLineHeight() - 1; // correction factor to match legacy font metrics  		width = llmax(width, llmin(iter->getWidth(fontp), HUD_TEXT_MAX_WIDTH));  		++iter;  	} diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index f621475193..c4ea8c0d31 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -2980,6 +2980,17 @@ bool LLIMMgr::isVoiceCall(const LLUUID& session_id)  	return im_session->mStartedAsIMCall;  } +void LLIMMgr::addNotifiedNonFriendSessionID(const LLUUID& session_id) +{ +	mNotifiedNonFriendSessions.insert(session_id); +} + +bool LLIMMgr::isNonFriendSessionNotified(const LLUUID& session_id) +{ +	return mNotifiedNonFriendSessions.end() != mNotifiedNonFriendSessions.find(session_id); + +} +  void LLIMMgr::noteOfflineUsers(  	const LLUUID& session_id,  	const LLDynamicArray<LLUUID>& ids) diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index b1be26a169..f07a78e2f7 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -438,6 +438,10 @@ public:  	bool isVoiceCall(const LLUUID& session_id); +	void addNotifiedNonFriendSessionID(const LLUUID& session_id); + +	bool isNonFriendSessionNotified(const LLUUID& session_id); +  private:  	/** @@ -465,6 +469,14 @@ private:  	typedef std::list <LLIMSessionObserver *> session_observers_list_t;  	session_observers_list_t mSessionObservers; +	// EXP-901 +	// If "Only friends and groups can IM me" option is ON but the user got message from non-friend, +	// the user should be notified that to be able to see this message the option should be OFF. +	// This set stores session IDs in which user was notified. Need to store this IDs so that the user +	// be notified only one time per session with non-friend. +	typedef std::set<LLUUID> notified_non_friend_sessions_t; +	notified_non_friend_sessions_t mNotifiedNonFriendSessions; +  	LLSD mPendingInvitations;  	LLSD mPendingAgentListUpdates;  }; diff --git a/indra/newview/llinspecttoast.cpp b/indra/newview/llinspecttoast.cpp index d7b82667d1..f4fe5dec01 100644 --- a/indra/newview/llinspecttoast.cpp +++ b/indra/newview/llinspecttoast.cpp @@ -72,6 +72,8 @@ LLInspectToast::LLInspectToast(const LLSD& notification_id) :  LLInspectToast::~LLInspectToast()  {  	LLTransientFloaterMgr::getInstance()->removeControlView(this); + +	mConnection.disconnect();  }  // virtual diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 3b506d72dd..2de2b17373 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -113,6 +113,13 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response  bool confirm_attachment_rez(const LLSD& notification, const LLSD& response);  void teleport_via_landmark(const LLUUID& asset_id);  static BOOL can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit); +static bool check_category(LLInventoryModel* model, +						   const LLUUID& cat_id, +						   LLFolderView* active_folder_view, +						   LLInventoryFilter* filter); +static bool check_item(const LLUUID& item_id, +					   LLFolderView* active_folder_view, +					   LLInventoryFilter* filter);  // Helper functions @@ -148,7 +155,7 @@ LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory,  	mInvType(LLInventoryType::IT_NONE),  	mIsLink(FALSE)  { -	mInventoryPanel = inventory->getHandle(); +	mInventoryPanel = inventory->getInventoryPanelHandle();  	const LLInventoryObject* obj = getInventoryObject();  	mIsLink = obj && obj->getIsLinkType();  } @@ -798,7 +805,7 @@ LLInventoryObject* LLInvFVBridge::getInventoryObject() const  LLInventoryModel* LLInvFVBridge::getInventoryModel() const  { -	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +	LLInventoryPanel* panel = mInventoryPanel.get();  	return panel ? panel->getModel() : NULL;  } @@ -1324,8 +1331,8 @@ void LLItemBridge::selectItem()  	LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem());  	if(item && !item->isFinished())  	{ -		item->fetchFromServer(); -		//LLInventoryModelBackgroundFetch::instance().start(item->getUUID(), false); +		//item->fetchFromServer(); +		LLInventoryModelBackgroundFetch::instance().start(item->getUUID(), false);  	}  } @@ -1738,7 +1745,7 @@ BOOL LLFolderBridge::isItemRemovable() const  		return FALSE;  	} -	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +	LLInventoryPanel* panel = mInventoryPanel.get();  	LLFolderViewFolder* folderp = dynamic_cast<LLFolderViewFolder*>(panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL);  	if (folderp)  	{ @@ -1959,6 +1966,12 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  	if (!isAgentAvatarValid()) return FALSE;  	if (!isAgentInventory()) return FALSE; // cannot drag categories into library +	LLInventoryPanel* destination_panel = mInventoryPanel.get(); +	if (!destination_panel) return false; + +	LLInventoryFilter* filter = destination_panel->getFilter(); +	if (!filter) return false; +  	const LLUUID &cat_id = inv_cat->getUUID();  	const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);  	const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false); @@ -2096,7 +2109,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  							// NOTE: The cargo id's count is a total of categories AND items but we err on the side of  							//       prevention rather than letting too many folders into the hierarchy of the outbox,  							//       when we're dragging the item to a new parent -							dragged_folder_count += LLToolDragAndDrop::instance().getCargoIDsCount(); +							dragged_folder_count += LLToolDragAndDrop::instance().getCargoCount();  						}  					} @@ -2146,6 +2159,39 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  			}  		} +		if (is_movable) +		{ +			LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); +			is_movable = active_panel != NULL; + +			// For a folder to pass the filter all its descendants are required to pass. +			// We make this exception to allow reordering folders within an inventory panel, +			// which has a filter applied, like Recent tab for example. +			// There may be folders which are displayed because some of their descendants pass +			// the filter, but other don't, and thus remain hidden. Without this check, +			// such folders would not be allowed to be moved within a panel. +			if (destination_panel == active_panel) +			{ +				is_movable = true; +			} +			else +			{ +				LLFolderView* active_folder_view = NULL; + +				if (is_movable) +				{ +					active_folder_view = active_panel->getRootFolder(); +					is_movable = active_folder_view != NULL; +				} + +				if (is_movable) +				{ +					// Check whether the folder being dragged from active inventory panel +					// passes the filter of the destination panel. +					is_movable = check_category(model, cat_id, active_folder_view, filter); +				} +			} +		}  		//   		//-------------------------------------------------------------------------------- @@ -2240,7 +2286,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  		}  		else  		{ -			accept = move_inv_category_world_to_agent(cat_id, mUUID, drop); +			accept = move_inv_category_world_to_agent(cat_id, mUUID, drop, NULL, NULL, filter);  		}  	}  	else if (LLToolDragAndDrop::SOURCE_LIBRARY == source) @@ -2285,7 +2331,8 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,  									  const LLUUID& category_id,  									  BOOL drop,  									  void (*callback)(S32, void*), -									  void* user_data) +									  void* user_data, +									  LLInventoryFilter* filter)  {  	// Make sure the object exists. If we allowed dragging from  	// anonymous objects, it would be possible to bypass @@ -2309,7 +2356,7 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,  		return FALSE;  	} -	BOOL accept = TRUE; +	BOOL accept = FALSE;  	BOOL is_move = FALSE;  	// coming from a task. Need to figure out if the person can @@ -2318,9 +2365,16 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,  	LLInventoryObject::object_list_t::iterator end = inventory_objects.end();  	for ( ; it != end; ++it)  	{ +		LLInventoryItem* item = dynamic_cast<LLInventoryItem*>(it->get()); +		if (!item) +		{ +			llwarns << "Invalid inventory item for drop" << llendl; +			continue; +		} +  		// coming from a task. Need to figure out if the person can  		// move/copy this item. -		LLPermissions perm(((LLInventoryItem*)((LLInventoryObject*)(*it)))->getPermissions()); +		LLPermissions perm(item->getPermissions());  		if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())  			&& perm.allowTransferTo(gAgent.getID())))  //			|| gAgent.isGodlike()) @@ -2335,9 +2389,14 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,  			is_move = TRUE;  			accept = TRUE;  		} -		else + +		if (filter && accept) +		{ +			accept = filter->check(item); +		} + +		if (!accept)  		{ -			accept = FALSE;  			break;  		}  	} @@ -2820,18 +2879,62 @@ void LLFolderBridge::pasteFromClipboard()  	if(model && isClipboardPasteable())  	{  		const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false); +		const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false); +  		const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);  		const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); - -		const LLUUID parent_id(mUUID); +		const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);  		LLDynamicArray<LLUUID> objects;  		LLInventoryClipboard::instance().retrieve(objects); + +		if (move_is_into_outbox) +		{ +			LLFolderViewItem * outbox_itemp = mRoot->getItemByID(mUUID); + +			if (outbox_itemp) +			{ +				LLToolDragAndDrop::instance().setCargoCount(objects.size()); + +				BOOL can_list = TRUE; + +				for (LLDynamicArray<LLUUID>::const_iterator iter = objects.begin(); +					(iter != objects.end()) && (can_list == TRUE); +					++iter) +				{ +					const LLUUID& item_id = (*iter); +					LLInventoryItem *item = model->getItem(item_id); + +					if (item) +					{ +						MASK mask = 0x0; +						BOOL drop = FALSE; +						EDragAndDropType cargo_type = LLViewerAssetType::lookupDragAndDropType(item->getActualType()); +						void * cargo_data = (void *) item; +						std::string tooltip_msg; + +						can_list = outbox_itemp->getListener()->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg); +					} +				} + +				LLToolDragAndDrop::instance().resetCargoCount(); + +				if (can_list == FALSE) +				{ +					// Notify user of failure somehow -- play error sound?  modal dialog? +					return; +				} +			} +		} + +		const LLUUID parent_id(mUUID); +  		for (LLDynamicArray<LLUUID>::const_iterator iter = objects.begin();  			 iter != objects.end();  			 ++iter)  		{  			const LLUUID& item_id = (*iter); +  			LLInventoryItem *item = model->getItem(item_id);  			if (item)  			{ @@ -2874,8 +2977,17 @@ void LLFolderBridge::pasteLinkFromClipboard()  	if(model)  	{  		const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false); +		const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false); +  		const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);  		const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); +		const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id); + +		if (move_is_into_outbox) +		{ +			// Notify user of failure somehow -- play error sound?  modal dialog? +			return; +		}  		const LLUUID parent_id(mUUID); @@ -3290,7 +3402,7 @@ void LLFolderBridge::createNewCategory(void* user_data)  {  	LLFolderBridge* bridge = (LLFolderBridge*)user_data;  	if(!bridge) return; -	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(bridge->mInventoryPanel.get()); +	LLInventoryPanel* panel = bridge->mInventoryPanel.get();  	if (!panel) return;  	LLInventoryModel* model = panel->getModel();  	if(!model) return; @@ -3470,7 +3582,7 @@ void LLFolderBridge::dropToFavorites(LLInventoryItem* inv_item)  	// use callback to rearrange favorite landmarks after adding  	// to have new one placed before target (on which it was dropped). See EXT-4312.  	LLPointer<AddFavoriteLandmarkCallback> cb = new AddFavoriteLandmarkCallback(); -	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +	LLInventoryPanel* panel = mInventoryPanel.get();  	LLFolderViewItem* drag_over_item = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL;  	if (drag_over_item && drag_over_item->getListener())  	{ @@ -3520,6 +3632,12 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  	if (!isAgentInventory()) return FALSE; // cannot drag into library  	if (!isAgentAvatarValid()) return FALSE; +	LLInventoryPanel* destination_panel = mInventoryPanel.get(); +	if (!destination_panel) return false; + +	LLInventoryFilter* filter = destination_panel->getFilter(); +	if (!filter) return false; +  	const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);  	const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE, false);  	const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false); @@ -3529,7 +3647,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  	const BOOL move_is_into_favorites = (mUUID == favorites_id);  	const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);  	const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id); -	const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id); //(mUUID == outbox_id); +	const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);  	const BOOL move_is_from_outbox = model->isObjectDescendentOf(inv_item->getUUID(), outbox_id);  	LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); @@ -3608,7 +3726,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			{  				const LLViewerInventoryCategory * master_folder = model->getFirstDescendantOf(outbox_id, mUUID); -				int existing_item_count = LLToolDragAndDrop::instance().getCargoIDsCount(); +				int existing_item_count = LLToolDragAndDrop::instance().getCargoCount();  				if (master_folder != NULL)  				{ @@ -3628,6 +3746,21 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			}  		} +		LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); + +		// Check whether the item being dragged from active inventory panel +		// passes the filter of the destination panel. +		if (accept && active_panel) +		{ +			LLFolderView* active_folder_view = active_panel->getRootFolder(); +			if (!active_folder_view) return false; + +			LLFolderViewItem* fv_item = active_folder_view->getItemByID(inv_item->getUUID()); +			if (!fv_item) return false; + +			accept = filter->check(fv_item); +		} +  		if (accept && drop)  		{  			if (inv_item->getType() == LLAssetType::AT_GESTURE @@ -3637,15 +3770,10 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			}  			// If an item is being dragged between windows, unselect everything in the active window   			// so that we don't follow the selection to its new location (which is very annoying). -			LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); -			if (active_panel) -			{ -				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); -				if (active_panel && (panel != active_panel)) +			if (active_panel && (destination_panel != active_panel))  				{  					active_panel->unSelectAll();  				} -			}  			//--------------------------------------------------------------------------------  			// Destination folder logic @@ -3655,8 +3783,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			// (only reorder the item in Favorites folder)  			if ((mUUID == inv_item->getParentUUID()) && move_is_into_favorites)  			{ -				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); -				LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL; +				LLFolderViewItem* itemp = destination_panel->getRootFolder()->getDraggingOverItem();  				if (itemp)  				{  					LLUUID srcItemId = inv_item->getUUID(); @@ -3760,6 +3887,13 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			accept = FALSE;  		} +		// Check whether the item being dragged from in world +		// passes the filter of the destination panel. +		if (accept) +		{ +			accept = filter->check(inv_item); +		} +  		if (accept && drop)  		{  			LLMoveInv* move_inv = new LLMoveInv; @@ -3797,6 +3931,13 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			accept = !(move_is_into_current_outfit || move_is_into_outfit);  		} +		// Check whether the item being dragged from notecard +		// passes the filter of the destination panel. +		if (accept) +		{ +			accept = filter->check(inv_item); +		} +  		if (accept && drop)  		{  			copy_inventory_from_notecard(mUUID,  // Drop to the chosen destination folder @@ -3828,6 +3969,21 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  				accept = can_move_to_landmarks(inv_item);  			} +			LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); + +			// Check whether the item being dragged from the library +			// passes the filter of the destination panel. +			if (accept && active_panel) +			{ +				LLFolderView* active_folder_view = active_panel->getRootFolder(); +				if (!active_folder_view) return false; + +				LLFolderViewItem* fv_item = active_folder_view->getItemByID(inv_item->getUUID()); +				if (!fv_item) return false; + +				accept = filter->check(fv_item); +			} +  			if (accept && drop)  			{  				// FAVORITES folder @@ -3862,6 +4018,69 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  	return accept;  } +// static +bool check_category(LLInventoryModel* model, +					const LLUUID& cat_id, +					LLFolderView* active_folder_view, +					LLInventoryFilter* filter) +{ +	if (!model || !active_folder_view || !filter) +		return false; + +	if (!filter->checkFolder(cat_id)) +	{ +		return false; +	} + +	LLInventoryModel::cat_array_t descendent_categories; +	LLInventoryModel::item_array_t descendent_items; +	model->collectDescendents(cat_id, descendent_categories, descendent_items, TRUE); + +	S32 num_descendent_categories = descendent_categories.count(); +	S32 num_descendent_items = descendent_items.count(); + +	if (num_descendent_categories + num_descendent_items == 0) +	{ +		// Empty folder should be checked as any other folder view item. +		// If we are filtering by date the folder should not pass because +		// it doesn't have its own creation date. See LLInvFVBridge::getCreationDate(). +		return check_item(cat_id, active_folder_view, filter); +	} + +	for (S32 i = 0; i < num_descendent_categories; ++i) +	{ +		LLInventoryCategory* category = descendent_categories[i]; +		if(!check_category(model, category->getUUID(), active_folder_view, filter)) +		{ +			return false; +		} +	} + +	for (S32 i = 0; i < num_descendent_items; ++i) +	{ +		LLViewerInventoryItem* item = descendent_items[i]; +		if(!check_item(item->getUUID(), active_folder_view, filter)) +		{ +			return false; +		} +	} + +	return true; +} + +// static +bool check_item(const LLUUID& item_id, +				LLFolderView* active_folder_view, +				LLInventoryFilter* filter) +{ +	if (!active_folder_view || !filter) return false; + +	LLFolderViewItem* fv_item = active_folder_view->getItemByID(item_id); +	if (!fv_item) return false; + +	return filter->check(fv_item); +} +  // +=================================================+  // |        LLTextureBridge                          |  // +=================================================+ @@ -4184,7 +4403,7 @@ LLCallingCardBridge::~LLCallingCardBridge()  void LLCallingCardBridge::refreshFolderViewItem()  { -	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +	LLInventoryPanel* panel = mInventoryPanel.get();  	LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL;  	if (itemp)  	{ diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 871657a58a..3b4f845f54 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -35,6 +35,7 @@  #include "llviewercontrol.h"  #include "llwearable.h" +class LLInventoryFilter;  class LLInventoryPanel;  class LLInventoryModel;  class LLMenuGL; @@ -161,7 +162,7 @@ protected:  									 BOOL restamp);  	void removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch);  protected: -	LLHandle<LLPanel> mInventoryPanel; +	LLHandle<LLInventoryPanel> mInventoryPanel;  	LLFolderView* mRoot;  	const LLUUID mUUID;	// item id  	LLInventoryType::EType mInvType; @@ -645,7 +646,8 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,  									  const LLUUID& category_id,  									  BOOL drop,  									  void (*callback)(S32, void*) = NULL, -									  void* user_data = NULL); +									  void* user_data = NULL, +									  LLInventoryFilter* filter = NULL);  // Utility function to hide all entries except those in the list  // Can be called multiple times on the same menu (e.g. if multiple items diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index d54bce4619..5496c273f2 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -108,16 +108,48 @@ BOOL LLInventoryFilter::check(const LLFolderViewItem* item)  	return passed;  } -bool LLInventoryFilter::checkFolder(const LLFolderViewFolder* folder) +bool LLInventoryFilter::check(const LLInventoryItem* item)  { -	// we're showing all folders, overriding filter -	if (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS) +	mSubStringMatchOffset = mFilterSubString.size() ? item->getName().find(mFilterSubString) : std::string::npos; + +	const bool passed_filtertype = checkAgainstFilterType(item); +	const bool passed_permissions = checkAgainstPermissions(item); +	const bool passed = (passed_filtertype && +						 passed_permissions && +						 (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos)); + +	return passed; +} + +bool LLInventoryFilter::checkFolder(const LLFolderViewFolder* folder) const +{ +	if (!folder)  	{ -		return true; +		llwarns << "The filter can not be checked on an invalid folder." << llendl; +		llassert(false); // crash in development builds +		return false;  	}  	const LLFolderViewEventListener* listener = folder->getListener(); +	if (!listener) +	{ +		llwarns << "Folder view event listener not found." << llendl; +		llassert(false); // crash in development builds +		return false; +	} +  	const LLUUID folder_id = listener->getUUID(); + +	return checkFolder(folder_id); +} + +bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const +{ +	// we're showing all folders, overriding filter +	if (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS) +	{ +		return true; +	}  	if (mFilterOps.mFilterTypes & FILTERTYPE_CATEGORY)  	{ @@ -227,6 +259,56 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) con  	return TRUE;  } +bool LLInventoryFilter::checkAgainstFilterType(const LLInventoryItem* item) const +{ +	LLInventoryType::EType object_type = item->getInventoryType(); +	const LLUUID object_id = item->getUUID(); + +	const U32 filterTypes = mFilterOps.mFilterTypes; + +	//////////////////////////////////////////////////////////////////////////////// +	// FILTERTYPE_OBJECT +	// Pass if this item's type is of the correct filter type +	if (filterTypes & FILTERTYPE_OBJECT) +	{ +		// If it has no type, pass it, unless it's a link. +		if (object_type == LLInventoryType::IT_NONE) +		{ +			if (item && item->getIsLinkType()) +			{ +				return false; +			} +		} +		else if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0)) +		{ +			return false; +		} +	} + +	//////////////////////////////////////////////////////////////////////////////// +	// FILTERTYPE_UUID +	// Pass if this item is the target UUID or if it links to the target UUID +	if (filterTypes & FILTERTYPE_UUID) +	{ +		if (!item) return false; + +		if (item->getLinkedUUID() != mFilterOps.mFilterUUID) +			return false; +	} + +	//////////////////////////////////////////////////////////////////////////////// +	// FILTERTYPE_DATE +	// Pass if this item is within the date range. +	if (filterTypes & FILTERTYPE_DATE) +	{ +		// We don't get the updated item creation date for the task inventory or +		// a notecard embedded item. See LLTaskInvFVBridge::getCreationDate(). +		return false; +	} + +	return true; +} +  BOOL LLInventoryFilter::checkAgainstPermissions(const LLFolderViewItem* item) const  {  	const LLFolderViewEventListener* listener = item->getListener(); @@ -244,6 +326,17 @@ BOOL LLInventoryFilter::checkAgainstPermissions(const LLFolderViewItem* item) co  	return (perm & mFilterOps.mPermissions) == mFilterOps.mPermissions;  } +bool LLInventoryFilter::checkAgainstPermissions(const LLInventoryItem* item) const +{ +	if (!item) return false; + +	LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); +	PermissionMask perm = new_item->getPermissionMask(); +	new_item = NULL; + +	return (perm & mFilterOps.mPermissions) == mFilterOps.mPermissions; +} +  BOOL LLInventoryFilter::checkAgainstFilterLinks(const LLFolderViewItem* item) const  {  	const LLFolderViewEventListener* listener = item->getListener(); @@ -464,7 +557,9 @@ void LLInventoryFilter::setDateRange(time_t min_date, time_t max_date)  		mFilterOps.mMaxDate = llmax(mFilterOps.mMinDate, max_date);  		setModified();  	} -	mFilterOps.mFilterTypes |= FILTERTYPE_DATE; + +	areDateLimitsSet() ? mFilterOps.mFilterTypes |= FILTERTYPE_DATE +			: mFilterOps.mFilterTypes &= ~FILTERTYPE_DATE;  }  void LLInventoryFilter::setDateRangeLastLogoff(BOOL sl) @@ -476,10 +571,12 @@ void LLInventoryFilter::setDateRangeLastLogoff(BOOL sl)  	}  	if (!sl && isSinceLogoff())  	{ -		setDateRange(0, time_max()); +		setDateRange(time_min(), time_max());  		setModified();  	} -	mFilterOps.mFilterTypes |= FILTERTYPE_DATE; + +	areDateLimitsSet() ? mFilterOps.mFilterTypes |= FILTERTYPE_DATE +			: mFilterOps.mFilterTypes &= ~FILTERTYPE_DATE;  }  BOOL LLInventoryFilter::isSinceLogoff() const @@ -524,7 +621,9 @@ void LLInventoryFilter::setHoursAgo(U32 hours)  			setModified(FILTER_RESTART);  		}  	} -	mFilterOps.mFilterTypes |= FILTERTYPE_DATE; + +	areDateLimitsSet() ? mFilterOps.mFilterTypes |= FILTERTYPE_DATE +			: mFilterOps.mFilterTypes &= ~FILTERTYPE_DATE;  }  void LLInventoryFilter::setFilterLinks(U64 filter_links) @@ -804,7 +903,7 @@ const std::string& LLInventoryFilter::getFilterText()  		filtered_by_all_types = FALSE;  	} -	if (!LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() +	if (!LLInventoryModelBackgroundFetch::instance().folderFetchActive()  		&& filtered_by_type  		&& !filtered_by_all_types)  	{ @@ -974,3 +1073,10 @@ const std::string& LLInventoryFilter::getEmptyLookupMessage() const  	return mEmptyLookupMessage;  } + +bool LLInventoryFilter::areDateLimitsSet() +{ +	return     mFilterOps.mMinDate != time_min() +			|| mFilterOps.mMaxDate != time_max() +			|| mFilterOps.mHoursAgo != 0; +} diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index bba24ac652..6be2acfaa3 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -32,6 +32,7 @@  class LLFolderViewItem;  class LLFolderViewFolder; +class LLInventoryItem;  class LLInventoryFilter  { @@ -115,9 +116,13 @@ public:  	// + Execution And Results  	// +-------------------------------------------------------------------+  	BOOL 				check(const LLFolderViewItem* item); -	bool				checkFolder(const LLFolderViewFolder* folder); +	bool				check(const LLInventoryItem* item); +	bool				checkFolder(const LLFolderViewFolder* folder) const; +	bool				checkFolder(const LLUUID& folder_id) const;  	BOOL 				checkAgainstFilterType(const LLFolderViewItem* item) const; +	bool 				checkAgainstFilterType(const LLInventoryItem* item) const;  	BOOL 				checkAgainstPermissions(const LLFolderViewItem* item) const; +	bool 				checkAgainstPermissions(const LLInventoryItem* item) const;  	BOOL 				checkAgainstFilterLinks(const LLFolderViewItem* item) const;  	std::string::size_type getStringMatchOffset() const; @@ -175,6 +180,8 @@ public:  	void 				fromLLSD(LLSD& data);  private: +	bool				areDateLimitsSet(); +  	struct FilterOps  	{  		FilterOps(); diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index 91fdd67806..f4d0110b0f 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -43,6 +43,7 @@ const S32 MAX_FETCH_RETRIES = 10;  LLInventoryModelBackgroundFetch::LLInventoryModelBackgroundFetch() :  	mBackgroundFetchActive(FALSE), +	mFolderFetchActive(false),  	mAllFoldersFetched(FALSE),  	mRecursiveInventoryFetchStarted(FALSE),  	mRecursiveLibraryFetchStarted(FALSE), @@ -50,7 +51,7 @@ LLInventoryModelBackgroundFetch::LLInventoryModelBackgroundFetch() :  	mMinTimeBetweenFetches(0.3f),  	mMaxTimeBetweenFetches(10.f),  	mTimelyFetchPending(FALSE), -	mBulkFetchCount(0) +	mFetchCount(0)  {  } @@ -60,7 +61,7 @@ LLInventoryModelBackgroundFetch::~LLInventoryModelBackgroundFetch()  bool LLInventoryModelBackgroundFetch::isBulkFetchProcessingComplete() const  { -	return mFetchQueue.empty() && mBulkFetchCount<=0; +	return mFetchQueue.empty() && mFetchCount<=0;  }  bool LLInventoryModelBackgroundFetch::libraryFetchStarted() const @@ -98,19 +99,21 @@ bool LLInventoryModelBackgroundFetch::isEverythingFetched() const  	return mAllFoldersFetched;  } -BOOL LLInventoryModelBackgroundFetch::backgroundFetchActive() const +BOOL LLInventoryModelBackgroundFetch::folderFetchActive() const  { -	return mBackgroundFetchActive; +	return mFolderFetchActive;  } -void LLInventoryModelBackgroundFetch::start(const LLUUID& cat_id, BOOL recursive) +void LLInventoryModelBackgroundFetch::start(const LLUUID& id, BOOL recursive)  { -	if (!mAllFoldersFetched || cat_id.notNull()) -	{ -		LL_DEBUGS("InventoryFetch") << "Start fetching category: " << cat_id << ", recursive: " << recursive << LL_ENDL; +	LLViewerInventoryCategory* cat = gInventory.getCategory(id); +	if (cat || (id.isNull() && !isEverythingFetched())) +	{	// it's a folder, do a bulk fetch +		LL_DEBUGS("InventoryFetch") << "Start fetching category: " << id << ", recursive: " << recursive << LL_ENDL;  		mBackgroundFetchActive = TRUE; -		if (cat_id.isNull()) +		mFolderFetchActive = true; +		if (id.isNull())  		{  			if (!mRecursiveInventoryFetchStarted)  			{ @@ -128,41 +131,41 @@ void LLInventoryModelBackgroundFetch::start(const LLUUID& cat_id, BOOL recursive  		else  		{  			// Specific folder requests go to front of queue. -			if (mFetchQueue.empty() || mFetchQueue.front().mCatUUID != cat_id) +			if (mFetchQueue.empty() || mFetchQueue.front().mUUID != id)  			{ -				mFetchQueue.push_front(FetchQueueInfo(cat_id, recursive)); +				mFetchQueue.push_front(FetchQueueInfo(id, recursive));  				gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);  			} -			if (cat_id == gInventory.getLibraryRootFolderID()) +			if (id == gInventory.getLibraryRootFolderID())  			{  				mRecursiveLibraryFetchStarted |= recursive;  			} -			if (cat_id == gInventory.getRootFolderID()) +			if (id == gInventory.getRootFolderID())  			{  				mRecursiveInventoryFetchStarted |= recursive;  			}  		}  	} +	else if (LLViewerInventoryItem* itemp = gInventory.getItem(id)) +	{ +		if (!itemp->mIsComplete && (mFetchQueue.empty() || mFetchQueue.front().mUUID != id)) +		{ +			mBackgroundFetchActive = TRUE; + +			mFetchQueue.push_front(FetchQueueInfo(id, false, false)); +			gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); +		} +	}  }  void LLInventoryModelBackgroundFetch::findLostItems()  {  	mBackgroundFetchActive = TRUE; +	mFolderFetchActive = true;      mFetchQueue.push_back(FetchQueueInfo(LLUUID::null, TRUE));      gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);  } -void LLInventoryModelBackgroundFetch::stopBackgroundFetch() -{ -	if (mBackgroundFetchActive) -	{ -		mBackgroundFetchActive = FALSE; -		gIdleCallbacks.deleteFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); -		mBulkFetchCount=0; -		mMinTimeBetweenFetches=0.0f; -	} -} -  void LLInventoryModelBackgroundFetch::setAllFoldersFetched()  {  	if (mRecursiveInventoryFetchStarted && @@ -170,7 +173,7 @@ void LLInventoryModelBackgroundFetch::setAllFoldersFetched()  	{  		mAllFoldersFetched = TRUE;  	} -	stopBackgroundFetch(); +	mFolderFetchActive = false;  }  void LLInventoryModelBackgroundFetch::backgroundFetchCB(void *) @@ -183,10 +186,9 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()  	if (mBackgroundFetchActive && gAgent.getRegion())  	{  		// If we'll be using the capability, we'll be sending batches and the background thing isn't as important. -		std::string url = gAgent.getRegion()->getCapability("FetchInventoryDescendents2");    -		if (gSavedSettings.getBOOL("UseHTTPInventory") && !url.empty())  +		if (gSavedSettings.getBOOL("UseHTTPInventory"))   		{ -			bulkFetch(url); +			bulkFetch();  			return;  		} @@ -201,6 +203,9 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()  			llinfos << "Inventory fetch completed" << llendl;  			setAllFoldersFetched(); +			mBackgroundFetchActive = false; +			mFolderFetchActive = false; +  			return;  		} @@ -230,80 +235,114 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()  			}  			const FetchQueueInfo info = mFetchQueue.front(); -			LLViewerInventoryCategory* cat = gInventory.getCategory(info.mCatUUID); -			// Category has been deleted, remove from queue. -			if (!cat) +			if (info.mIsCategory)  			{ -				mFetchQueue.pop_front(); -				continue; -			} + +				LLViewerInventoryCategory* cat = gInventory.getCategory(info.mUUID); + +				// Category has been deleted, remove from queue. +				if (!cat) +				{ +					mFetchQueue.pop_front(); +					continue; +				} -			if (mFetchTimer.getElapsedTimeF32() > mMinTimeBetweenFetches &&  -				LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion()) -			{ -				// Category exists but has no children yet, fetch the descendants -				// for now, just request every time and rely on retry timer to throttle. -				if (cat->fetch()) +				if (mFetchTimer.getElapsedTimeF32() > mMinTimeBetweenFetches &&  +					LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())  				{ -					mFetchTimer.reset(); -					mTimelyFetchPending = TRUE; +					// Category exists but has no children yet, fetch the descendants +					// for now, just request every time and rely on retry timer to throttle. +					if (cat->fetch()) +					{ +						mFetchTimer.reset(); +						mTimelyFetchPending = TRUE; +					} +					else +					{ +						//  The catagory also tracks if it has expired and here it says it hasn't +						//  yet.  Get out of here because nothing is going to happen until we +						//  update the timers. +						break; +					}  				} -				else +				// Do I have all my children? +				else if (gInventory.isCategoryComplete(info.mUUID))  				{ -					//  The catagory also tracks if it has expired and here it says it hasn't -					//  yet.  Get out of here because nothing is going to happen until we -					//  update the timers. +					// Finished with this category, remove from queue. +					mFetchQueue.pop_front(); + +					// Add all children to queue. +					LLInventoryModel::cat_array_t* categories; +					LLInventoryModel::item_array_t* items; +					gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items); +					for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); +						 it != categories->end(); +						 ++it) +					{ +						mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(),info.mRecursive)); +					} + +					// We received a response in less than the fast time. +					if (mTimelyFetchPending && mFetchTimer.getElapsedTimeF32() < fast_fetch_time) +					{ +						// Shrink timeouts based on success. +						mMinTimeBetweenFetches = llmax(mMinTimeBetweenFetches * 0.8f, 0.3f); +						mMaxTimeBetweenFetches = llmax(mMaxTimeBetweenFetches * 0.8f, 10.f); +						lldebugs << "Inventory fetch times shrunk to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl; +					} + +					mTimelyFetchPending = FALSE; +					continue; +				} +				else if (mFetchTimer.getElapsedTimeF32() > mMaxTimeBetweenFetches) +				{ +					// Received first packet, but our num descendants does not match db's num descendants +					// so try again later. +					mFetchQueue.pop_front(); + +					if (mNumFetchRetries++ < MAX_FETCH_RETRIES) +					{ +						// push on back of queue +						mFetchQueue.push_back(info); +					} +					mTimelyFetchPending = FALSE; +					mFetchTimer.reset();  					break;  				} + +				// Not enough time has elapsed to do a new fetch +				break;  			} -			// Do I have all my children? -			else if (gInventory.isCategoryComplete(info.mCatUUID)) +			else  			{ -				// Finished with this category, remove from queue. -				mFetchQueue.pop_front(); +				LLViewerInventoryItem* itemp = gInventory.getItem(info.mUUID); -				// Add all children to queue. -				LLInventoryModel::cat_array_t* categories; -				LLInventoryModel::item_array_t* items; -				gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items); -				for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); -					 it != categories->end(); -					 ++it) +				mFetchQueue.pop_front(); +				if (!itemp)   				{ -					mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(),info.mRecursive)); +					continue;  				} -				// We received a response in less than the fast time. -				if (mTimelyFetchPending && mFetchTimer.getElapsedTimeF32() < fast_fetch_time) +				if (mFetchTimer.getElapsedTimeF32() > mMinTimeBetweenFetches)  				{ -					// Shrink timeouts based on success. -					mMinTimeBetweenFetches = llmax(mMinTimeBetweenFetches * 0.8f, 0.3f); -					mMaxTimeBetweenFetches = llmax(mMaxTimeBetweenFetches * 0.8f, 10.f); -					lldebugs << "Inventory fetch times shrunk to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl; +					itemp->fetchFromServer(); +					mFetchTimer.reset(); +					mTimelyFetchPending = TRUE;  				} - -				mTimelyFetchPending = FALSE; -				continue; -			} -			else if (mFetchTimer.getElapsedTimeF32() > mMaxTimeBetweenFetches) -			{ -				// Received first packet, but our num descendants does not match db's num descendants -				// so try again later. -				mFetchQueue.pop_front(); - -				if (mNumFetchRetries++ < MAX_FETCH_RETRIES) +				else if (itemp->mIsComplete) +				{ +					mTimelyFetchPending = FALSE; +				} +				else if (mFetchTimer.getElapsedTimeF32() > mMaxTimeBetweenFetches)  				{ -					// push on back of queue  					mFetchQueue.push_back(info); +					mFetchTimer.reset(); +					mTimelyFetchPending = FALSE;  				} -				mTimelyFetchPending = FALSE; -				mFetchTimer.reset(); +				// Not enough time has elapsed to do a new fetch  				break;  			} - -			// Not enough time has elapsed to do a new fetch -			break;  		}  		// @@ -313,15 +352,35 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()  	}  } -void LLInventoryModelBackgroundFetch::incrBulkFetch(S16 fetching)  +void LLInventoryModelBackgroundFetch::incrFetchCount(S16 fetching)   {   -	mBulkFetchCount += fetching;  -	if (mBulkFetchCount < 0) +	mFetchCount += fetching;  +	if (mFetchCount < 0)  	{ -		mBulkFetchCount = 0;  +		mFetchCount = 0;   	}  } +class LLInventoryModelFetchItemResponder : public LLInventoryModel::fetchInventoryResponder +{ +public: +	LLInventoryModelFetchItemResponder(const LLSD& request_sd) : LLInventoryModel::fetchInventoryResponder(request_sd) {}; +	void result(const LLSD& content);			 +	void error(U32 status, const std::string& reason); +}; + +void LLInventoryModelFetchItemResponder::result( const LLSD& content ) +{ +	LLInventoryModel::fetchInventoryResponder::result(content); +	LLInventoryModelBackgroundFetch::instance().incrFetchCount(-1); +} + +void LLInventoryModelFetchItemResponder::error( U32 status, const std::string& reason ) +{ +	LLInventoryModel::fetchInventoryResponder::error(status, reason); +	LLInventoryModelBackgroundFetch::instance().incrFetchCount(-1); +} +  class LLInventoryModelFetchDescendentsResponder: public LLHTTPClient::Responder  { @@ -458,7 +517,7 @@ void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content)  		}  	} -	fetcher->incrBulkFetch(-1); +	fetcher->incrFetchCount(-1);  	if (fetcher->isBulkFetchProcessingComplete())  	{ @@ -477,7 +536,7 @@ void LLInventoryModelFetchDescendentsResponder::error(U32 status, const std::str  	llinfos << "LLInventoryModelFetchDescendentsResponder::error "  		<< status << ": " << reason << llendl; -	fetcher->incrBulkFetch(-1); +	fetcher->incrFetchCount(-1);  	if (status==499) // timed out  	{ @@ -508,12 +567,13 @@ BOOL LLInventoryModelFetchDescendentsResponder::getIsRecursive(const LLUUID& cat  // Bundle up a bunch of requests to send all at once.  // static    -void LLInventoryModelBackgroundFetch::bulkFetch(std::string url) +void LLInventoryModelBackgroundFetch::bulkFetch()  {  	//Background fetch is called from gIdleCallbacks in a loop until background fetch is stopped.  	//If there are items in mFetchQueue, we want to check the time since the last bulkFetch was   	//sent.  If it exceeds our retry time, go ahead and fire off another batch.   -	//Stopbackgroundfetch will be run from the Responder instead of here.   +	LLViewerRegion* region = gAgent.getRegion(); +	if (!region) return;  	S16 max_concurrent_fetches=8;  	F32 new_min_time = 0.5f;			//HACK!  Clean this up when old code goes away entirely. @@ -523,12 +583,13 @@ void LLInventoryModelBackgroundFetch::bulkFetch(std::string url)  	}  	if (gDisconnected || -		(mBulkFetchCount > max_concurrent_fetches) || +		(mFetchCount > max_concurrent_fetches) ||  		(mFetchTimer.getElapsedTimeF32() < mMinTimeBetweenFetches))  	{  		return; // just bail if we are disconnected  	}	 +	U32 item_count=0;  	U32 folder_count=0;  	U32 max_batch_size=5; @@ -536,83 +597,159 @@ void LLInventoryModelBackgroundFetch::bulkFetch(std::string url)  	uuid_vec_t recursive_cats; -	LLSD body; -	LLSD body_lib; +	LLSD folder_request_body; +	LLSD folder_request_body_lib; +	LLSD item_request_body; +	LLSD item_request_body_lib; -	while (!(mFetchQueue.empty()) && (folder_count < max_batch_size)) +	while (!mFetchQueue.empty()  +			&& (item_count + folder_count) < max_batch_size)  	{  		const FetchQueueInfo& fetch_info = mFetchQueue.front(); -		const LLUUID &cat_id = fetch_info.mCatUUID; -        if (cat_id.isNull()) //DEV-17797 -        { -			LLSD folder_sd; -			folder_sd["folder_id"]		= LLUUID::null.asString(); -			folder_sd["owner_id"]		= gAgent.getID(); -			folder_sd["sort_order"]		= (LLSD::Integer)sort_order; -			folder_sd["fetch_folders"]	= (LLSD::Boolean)FALSE; -			folder_sd["fetch_items"]	= (LLSD::Boolean)TRUE; -			body["folders"].append(folder_sd); -            folder_count++; -        } -        else -        { -		    const LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); +		if (fetch_info.mIsCategory) +		{ +			const LLUUID &cat_id = fetch_info.mUUID; +			if (cat_id.isNull()) //DEV-17797 +			{ +				LLSD folder_sd; +				folder_sd["folder_id"]		= LLUUID::null.asString(); +				folder_sd["owner_id"]		= gAgent.getID(); +				folder_sd["sort_order"]		= (LLSD::Integer)sort_order; +				folder_sd["fetch_folders"]	= (LLSD::Boolean)FALSE; +				folder_sd["fetch_items"]	= (LLSD::Boolean)TRUE; +				folder_request_body["folders"].append(folder_sd); +				folder_count++; +			} +			else +			{ +				const LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); -		    if (cat) -		    { -			    if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion()) -			    { -				    LLSD folder_sd; -				    folder_sd["folder_id"]		= cat->getUUID(); -				    folder_sd["owner_id"]		= cat->getOwnerID(); -				    folder_sd["sort_order"]		= (LLSD::Integer)sort_order; -				    folder_sd["fetch_folders"]	= TRUE; //(LLSD::Boolean)sFullFetchStarted; -				    folder_sd["fetch_items"]	= (LLSD::Boolean)TRUE; -				     -				    if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID()) -					    body_lib["folders"].append(folder_sd); -				    else -					    body["folders"].append(folder_sd); -				    folder_count++; -			    } -				// May already have this folder, but append child folders to list. -			    if (fetch_info.mRecursive) -			    {	 -					LLInventoryModel::cat_array_t* categories; -					LLInventoryModel::item_array_t* items; -					gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items); -					for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); -						 it != categories->end(); -						 ++it) +				if (cat) +				{ +					if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())  					{ -						mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(), fetch_info.mRecursive)); -				    } -			    } -		    } -        } -		if (fetch_info.mRecursive) -			recursive_cats.push_back(cat_id); +						LLSD folder_sd; +						folder_sd["folder_id"]		= cat->getUUID(); +						folder_sd["owner_id"]		= cat->getOwnerID(); +						folder_sd["sort_order"]		= (LLSD::Integer)sort_order; +						folder_sd["fetch_folders"]	= TRUE; //(LLSD::Boolean)sFullFetchStarted; +						folder_sd["fetch_items"]	= (LLSD::Boolean)TRUE; +				     +						if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID()) +							folder_request_body_lib["folders"].append(folder_sd); +						else +							folder_request_body["folders"].append(folder_sd); +						folder_count++; +					} +					// May already have this folder, but append child folders to list. +					if (fetch_info.mRecursive) +					{	 +						LLInventoryModel::cat_array_t* categories; +						LLInventoryModel::item_array_t* items; +						gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items); +						for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); +							 it != categories->end(); +							 ++it) +						{ +							mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(), fetch_info.mRecursive)); +						} +					} +				} +			} +			if (fetch_info.mRecursive) +				recursive_cats.push_back(cat_id); +		} +		else +		{ +			LLViewerInventoryItem* itemp = gInventory.getItem(fetch_info.mUUID); +			if (itemp) +			{ +				LLSD item_sd; +				item_sd["owner_id"] = itemp->getPermissions().getOwner(); +				item_sd["item_id"] = itemp->getUUID(); +				if (itemp->getPermissions().getOwner() == gAgent.getID()) +				{ +					item_request_body.append(item_sd); +				} +				else +				{ +					item_request_body_lib.append(item_sd); +				} +				//itemp->fetchFromServer(); +				item_count++; +			} +		}  		mFetchQueue.pop_front();  	} -	if (folder_count > 0) +	if (item_count + folder_count > 0)  	{ -		mBulkFetchCount++; -		if (body["folders"].size()) +		if (folder_count)  		{ -			LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(body, recursive_cats); -			LLHTTPClient::post(url, body, fetcher, 300.0); +			std::string url = region->getCapability("FetchInventoryDescendents2");    +			mFetchCount++; +			if (folder_request_body["folders"].size()) +			{ +				LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(folder_request_body, recursive_cats); +				LLHTTPClient::post(url, folder_request_body, fetcher, 300.0); +			} +			if (folder_request_body_lib["folders"].size()) +			{ +				std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents2"); + +				LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(folder_request_body_lib, recursive_cats); +				LLHTTPClient::post(url_lib, folder_request_body_lib, fetcher, 300.0); +			}  		} -		if (body_lib["folders"].size()) +		if (item_count)  		{ -			std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents2"); -			 -			LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(body_lib, recursive_cats); -			LLHTTPClient::post(url_lib, body_lib, fetcher, 300.0); +			std::string url; + +			if (item_request_body.size()) +			{ +				mFetchCount++; +				url = region->getCapability("FetchInventory2"); +				if (!url.empty()) +				{ +					LLSD body; +					body["agent_id"]	= gAgent.getID(); +					body["items"] = item_request_body; + +					LLHTTPClient::post(url, body, new LLInventoryModelFetchItemResponder(body)); +				} +				//else +				//{ +				//	LLMessageSystem* msg = gMessageSystem; +				//	msg->newMessage("FetchInventory"); +				//	msg->nextBlock("AgentData"); +				//	msg->addUUID("AgentID", gAgent.getID()); +				//	msg->addUUID("SessionID", gAgent.getSessionID()); +				//	msg->nextBlock("InventoryData"); +				//	msg->addUUID("OwnerID", mPermissions.getOwner()); +				//	msg->addUUID("ItemID", mUUID); +				//	gAgent.sendReliableMessage(); +				//} +			} + +			if (item_request_body_lib.size()) +			{ +				mFetchCount++; + +				url = region->getCapability("FetchLib2"); +				if (!url.empty()) +				{ +					LLSD body; +					body["agent_id"]	= gAgent.getID(); +					body["items"] = item_request_body_lib; + +					LLHTTPClient::post(url, body, new LLInventoryModelFetchItemResponder(body)); +				} +			}  		}  		mFetchTimer.reset();  	} +  	else if (isBulkFetchProcessingComplete())  	{  		setAllFoldersFetched(); @@ -624,7 +761,7 @@ bool LLInventoryModelBackgroundFetch::fetchQueueContainsNoDescendentsOf(const LL  	for (fetch_queue_t::const_iterator it = mFetchQueue.begin();  		 it != mFetchQueue.end(); ++it)  	{ -		const LLUUID& fetch_id = (*it).mCatUUID; +		const LLUUID& fetch_id = (*it).mUUID;  		if (gInventory.isObjectDescendentOf(fetch_id, cat_id))  			return false;  	} diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h index c35c785ceb..9dfedddd6d 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.h +++ b/indra/newview/llinventorymodelbackgroundfetch.h @@ -48,7 +48,7 @@ public:  	// This gets triggered when performing a filter-search.  	void start(const LLUUID& cat_id = LLUUID::null, BOOL recursive = TRUE); -	BOOL backgroundFetchActive() const; +	BOOL folderFetchActive() const;  	bool isEverythingFetched() const; // completing the fetch once per session should be sufficient  	bool libraryFetchStarted() const; @@ -60,14 +60,13 @@ public:  	bool inventoryFetchInProgress() const;      void findLostItems();	 +	void incrFetchCount(S16 fetching);  protected: -	void incrBulkFetch(S16 fetching);  	bool isBulkFetchProcessingComplete() const; -	void bulkFetch(std::string url); +	void bulkFetch();  	void backgroundFetch();  	static void backgroundFetchCB(void*); // background fetch idle function -	void stopBackgroundFetch(); // stop fetch process  	void setAllFoldersFetched();  	bool fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id) const; @@ -77,7 +76,8 @@ private:  	BOOL mAllFoldersFetched;  	BOOL mBackgroundFetchActive; -	S16 mBulkFetchCount; +	bool mFolderFetchActive; +	S16 mFetchCount;  	BOOL mTimelyFetchPending;  	S32 mNumFetchRetries; @@ -87,11 +87,11 @@ private:  	struct FetchQueueInfo  	{ -		FetchQueueInfo(const LLUUID& id, BOOL recursive) : -			mCatUUID(id), mRecursive(recursive) -		{ -		} -		LLUUID mCatUUID; +		FetchQueueInfo(const LLUUID& id, BOOL recursive, bool is_category = true) : +			mUUID(id), mRecursive(recursive), mIsCategory(is_category) +		{} +		LLUUID mUUID; +		bool mIsCategory;  		BOOL mRecursive;  	};  	typedef std::deque<FetchQueueInfo> fetch_queue_t; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 382569fa3a..01a8ecfb5d 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -817,7 +817,7 @@ BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask)  	if(handled)  	{  		ECursorType cursor = getWindow()->getCursor(); -		if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() && cursor == UI_CURSOR_ARROW) +		if (LLInventoryModelBackgroundFetch::instance().folderFetchActive() && cursor == UI_CURSOR_ARROW)  		{  			// replace arrow cursor with arrow and hourglass cursor  			getWindow()->setCursor(UI_CURSOR_WORKING); diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 8279163762..7d805f6862 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -160,6 +160,8 @@ public:  	void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); +	LLHandle<LLInventoryPanel> getInventoryPanelHandle() const { return getDerivedHandle<LLInventoryPanel>(); } +  	// Callbacks  	void doToSelected(const LLSD& userdata);  	void doCreate(const LLSD& userdata); diff --git a/indra/newview/llmemoryview.cpp b/indra/newview/llmemoryview.cpp index 7e9c3c84a7..c0a323d6cb 100644 --- a/indra/newview/llmemoryview.cpp +++ b/indra/newview/llmemoryview.cpp @@ -220,7 +220,7 @@ void LLMemoryView::draw()  	S32 x, y;  	S32 margin = 10; -	S32 texth = (S32)LLFontGL::getFontMonospace()->getLineHeight(); +	S32 texth = LLFontGL::getFontMonospace()->getLineHeight();  	S32 xleft = margin;  	S32 ytop = height - margin; diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h index 04e1570081..7a70370fe3 100644 --- a/indra/newview/llmutelist.h +++ b/indra/newview/llmutelist.h @@ -29,6 +29,7 @@  #include "llstring.h"  #include "lluuid.h" +#include "llextendedstatus.h"  class LLViewerObject;  class LLMessageSystem; diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 4512c14b7a..b4224e30e6 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -124,7 +124,7 @@ BOOL LLNearbyChatBar::postBuild()  // virtual  void LLNearbyChatBar::onOpen(const LLSD& key)  { -	enableTranslationCheckbox(LLTranslate::isTranslationConfigured()); +	showTranslationCheckbox(LLTranslate::isTranslationConfigured());  }  bool LLNearbyChatBar::applyRectControl() @@ -170,9 +170,9 @@ void LLNearbyChatBar::showHistory()  	}  } -void LLNearbyChatBar::enableTranslationCheckbox(BOOL enable) +void LLNearbyChatBar::showTranslationCheckbox(BOOL show)  { -	getChild<LLUICtrl>("translate_chat_checkbox")->setEnabled(enable); +	getChild<LLUICtrl>("translate_chat_checkbox_lp")->setVisible(show);  }  void LLNearbyChatBar::draw() diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index baf12a06ea..8547cf0bce 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -61,7 +61,7 @@ public:  	static void sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate);  	void showHistory(); -	void enableTranslationCheckbox(BOOL enable); +	void showTranslationCheckbox(BOOL show);  	/*virtual*/void setMinimized(BOOL b);  protected: diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h index 20fcee0814..1f7e7d68c6 100644 --- a/indra/newview/llnetmap.h +++ b/indra/newview/llnetmap.h @@ -33,9 +33,9 @@  #include "v3dmath.h"  #include "v4color.h"  #include "llpointer.h" +#include "llcoord.h"  class LLColor4U; -class LLCoordGL;  class LLImageRaw;  class LLViewerTexture;  class LLFloaterMap; diff --git a/indra/newview/llnotificationmanager.cpp b/indra/newview/llnotificationmanager.cpp index 6105eff8ea..f792f53ac5 100644 --- a/indra/newview/llnotificationmanager.cpp +++ b/indra/newview/llnotificationmanager.cpp @@ -35,6 +35,7 @@  #include "llnotifications.h"  #include <boost/bind.hpp> +#include <boost/foreach.hpp>  using namespace LLNotificationsUI; @@ -48,6 +49,10 @@ LLNotificationManager::LLNotificationManager()  //--------------------------------------------------------------------------  LLNotificationManager::~LLNotificationManager()  { +	BOOST_FOREACH(listener_pair_t& pair, mChannelListeners) +	{ +		pair.second.disconnect(); +	}  }  //-------------------------------------------------------------------------- @@ -64,16 +69,16 @@ void LLNotificationManager::init()  	LLNotificationChannel::buildChannel("Browser", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "browser"));  	LLNotificationChannel::buildChannel("Outbox", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "outbox")); -	LLNotifications::instance().getChannel("Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); -	LLNotifications::instance().getChannel("NotificationTips")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); -	LLNotifications::instance().getChannel("Group Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); -	LLNotifications::instance().getChannel("Alerts")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); -	LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); -	LLNotifications::instance().getChannel("IM Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); -	LLNotifications::instance().getChannel("Offer")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); -	LLNotifications::instance().getChannel("Hints")->connectChanged(boost::bind(&LLHintHandler::processNotification, LLHintHandler::getInstance(), _1)); -	LLNotifications::instance().getChannel("Browser")->connectChanged(boost::bind(&LLBrowserNotification::processNotification, LLBrowserNotification::getInstance(), _1)); -	LLNotifications::instance().getChannel("Outbox")->connectChanged(boost::bind(&LLOutboxNotification::processNotification, LLOutboxNotification::getInstance(), _1)); +	mChannelListeners["Notifications"] = LLNotifications::instance().getChannel("Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); +	mChannelListeners["NotificationTips"] = LLNotifications::instance().getChannel("NotificationTips")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); +	mChannelListeners["Group Notifications"] = LLNotifications::instance().getChannel("Group Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); +	mChannelListeners["Alerts"] = LLNotifications::instance().getChannel("Alerts")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); +	mChannelListeners["AlertModal"] = LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); +	mChannelListeners["IM Notifications"] = LLNotifications::instance().getChannel("IM Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); +	mChannelListeners["Offer"] = LLNotifications::instance().getChannel("Offer")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); +	mChannelListeners["Hints"] = LLNotifications::instance().getChannel("Hints")->connectChanged(boost::bind(&LLHintHandler::processNotification, LLHintHandler::getInstance(), _1)); +	mChannelListeners["Browser"] = LLNotifications::instance().getChannel("Browser")->connectChanged(boost::bind(&LLBrowserNotification::processNotification, LLBrowserNotification::getInstance(), _1)); +	mChannelListeners["Outbox"] = LLNotifications::instance().getChannel("Outbox")->connectChanged(boost::bind(&LLOutboxNotification::processNotification, LLOutboxNotification::getInstance(), _1));  	mNotifyHandlers["notify"] = boost::shared_ptr<LLEventHandler>(new LLScriptHandler(NT_NOTIFY, LLSD()));  	mNotifyHandlers["notifytip"] =  boost::shared_ptr<LLEventHandler>(new LLTipHandler(NT_NOTIFY, LLSD())); @@ -92,6 +97,9 @@ bool LLNotificationManager::onNotification(const LLSD& notify)  {  	LLSysHandler* handle = NULL; +	if (LLNotifications::destroyed()) +		return false; +  	LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());  	if (!notification)  diff --git a/indra/newview/llnotificationmanager.h b/indra/newview/llnotificationmanager.h index 16e82e4cce..27b6ba1c71 100644 --- a/indra/newview/llnotificationmanager.h +++ b/indra/newview/llnotificationmanager.h @@ -28,6 +28,8 @@  #ifndef LL_LLNOTIFICATIONMANAGER_H  #define LL_LLNOTIFICATIONMANAGER_H +#include "llevents.h" +  #include "lluictrl.h"  #include "llnotificationhandler.h" @@ -47,6 +49,7 @@ class LLToast;  class LLNotificationManager : public LLSingleton<LLNotificationManager>  {  	typedef std::pair<std::string, LLEventHandler*> eventhandlers; +	typedef std::pair<const std::string, LLBoundListener> listener_pair_t;  public:	  	LLNotificationManager();	  	virtual ~LLNotificationManager(); @@ -70,6 +73,8 @@ private:  	//TODO (*)  	std::map<std::string, boost::shared_ptr<LLEventHandler> > mNotifyHandlers;  	// cruft std::map<std::string, LLChatHandler*> mChatHandlers; + +	std::map<std::string, LLBoundListener> mChannelListeners;  };  } diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index a4f6921f98..7301b305b2 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -875,8 +875,15 @@ void LLPanelFace::getState()  			{  				getChild<LLUICtrl>("TexScaleU")->setValue(2.0f * getChild<LLUICtrl>("TexScaleU")->getValue().asReal() );  				getChild<LLUICtrl>("TexScaleV")->setValue(2.0f * getChild<LLUICtrl>("TexScaleV")->getValue().asReal() ); -			} +				// EXP-1507 (change label based on the mapping mode) +				getChild<LLUICtrl>("rpt")->setValue(getString("string repeats per meter")); +			} +			else +			if (selected_texgen == 0)  // FIXME: should not be magic numbers +			{ +				getChild<LLUICtrl>("rpt")->setValue(getString("string repeats per face")); +			}  		}  		{ diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index fbe331c7ab..f825ee3215 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -749,7 +749,10 @@ LLPanelGroupMembersSubTab::LLPanelGroupMembersSubTab()  LLPanelGroupMembersSubTab::~LLPanelGroupMembersSubTab()  { -	gSavedSettings.setString("GroupMembersSortOrder", mMembersList->getSortColumnName()); +	if (mMembersList) +	{ +		gSavedSettings.setString("GroupMembersSortOrder", mMembersList->getSortColumnName()); +	}  }  BOOL LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root) diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index 0295ad151f..eda0749cdb 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -374,7 +374,7 @@ void LLPanelGroupControlPanel::draw()  {  	// Need to resort the participant list if it's in sort by recent speaker order.  	if (mParticipantList) -		mParticipantList->updateRecentSpeakersOrder(); +		mParticipantList->update();  	LLPanelChatControlPanel::draw();  } diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 058d1ad6bc..76aadcd913 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -216,6 +216,7 @@ void LLPanelLogin::addUsersWithFavoritesToUsername()  void LLPanelLogin::addFavoritesToStartLocation()  { +	// Clear the combo.  	LLComboBox* combo = getChild<LLComboBox>("start_location_combo");  	if (!combo) return;  	int num_items = combo->getItemCount(); @@ -223,6 +224,10 @@ void LLPanelLogin::addFavoritesToStartLocation()  	{  		combo->remove(i);  	} + +	// Load favorites into the combo. +	std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple(); +	std::string canonical_user_name = canonicalize_username(user_defined_name);  	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");  	LLSD fav_llsd;  	llifstream file; @@ -232,15 +237,18 @@ void LLPanelLogin::addFavoritesToStartLocation()  	for (LLSD::map_const_iterator iter = fav_llsd.beginMap();  		iter != fav_llsd.endMap(); ++iter)  	{ -		std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple(); -  		// The account name in stored_favorites.xml has Resident last name even if user has  		// a single word account name, so it can be compared case-insensitive with the  		// user defined "firstname lastname". -		S32 res = LLStringUtil::compareInsensitive(canonicalize_username(user_defined_name), iter->first); -		if (res != 0) continue; +		S32 res = LLStringUtil::compareInsensitive(canonical_user_name, iter->first); +		if (res != 0) +		{ +			lldebugs << "Skipping favorites for " << iter->first << llendl; +			continue; +		}  		combo->addSeparator(); +		lldebugs << "Loading favorites for " << iter->first << llendl;  		LLSD user_llsd = iter->second;  		for (LLSD::array_const_iterator iter1 = user_llsd.beginArray();  			iter1 != user_llsd.endArray(); ++iter1) diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 374afb90be..c3c62920d3 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -567,7 +567,7 @@ void LLPanelMainInventory::updateItemcountText()  	std::string text = ""; -	if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive()) +	if (LLInventoryModelBackgroundFetch::instance().folderFetchActive())  	{  		text = getString("ItemcountFetching", string_args);  	} diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 9c46f04abf..f1380e7a36 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -1162,8 +1162,13 @@ void LLPanelPeople::onAddFriendWizButtonClicked()  {  	// Show add friend wizard.  	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelPeople::onAvatarPicked, _1, _2), FALSE, TRUE); +	if (!picker) +	{ +		return; +	} +  	// Need to disable 'ok' button when friend occurs in selection -	if (picker)	picker->setOkBtnEnableCb(boost::bind(&LLPanelPeople::isItemsFreeOfFriends, this, _1)); +	picker->setOkBtnEnableCb(boost::bind(&LLPanelPeople::isItemsFreeOfFriends, this, _1));  	LLFloater* root_floater = gFloaterView->getParentFloater(this);  	if (root_floater)  	{ diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 39c0628cbe..76d38f067d 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -818,7 +818,7 @@ bool LLPanelPrimMediaControls::isMouseOver()  		LLCoordGL cursor_pos_gl;  		S32 x, y;  		getWindow()->getCursorPosition(&cursor_pos_window); -		getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl); +		cursor_pos_gl = cursor_pos_window.convert();  		if(mMediaControlsStack->getVisible())  		{ diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h index 66956181f2..eeb433e306 100644 --- a/indra/newview/llpanelprimmediacontrols.h +++ b/indra/newview/llpanelprimmediacontrols.h @@ -30,9 +30,9 @@  #include "llpanel.h"  #include "llviewermedia.h"  #include "llnotificationptr.h" +#include "llcoord.h"  class LLButton; -class LLCoordWindow;  class LLIconCtrl;  class LLLayoutStack;  class LLProgressBar; diff --git a/indra/newview/llpanelvoiceeffect.cpp b/indra/newview/llpanelvoiceeffect.cpp index 4bbfec8ab7..5fec6d967d 100644 --- a/indra/newview/llpanelvoiceeffect.cpp +++ b/indra/newview/llpanelvoiceeffect.cpp @@ -123,7 +123,6 @@ void LLPanelVoiceEffect::update(bool list_updated)  	if (mVoiceEffectCombo)  	{  		LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); -		llassert(effect_interface);  		if (!effect_interface) return;  		if (list_updated)  		{ diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 5c95e805ce..975a6c67d8 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -390,7 +390,10 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)  		{  			const LLPointer<LLSpeaker>& speakerp = *it; -			update_speaker_indicator(list, speakerp->mID, speakerp->mModeratorMutedVoice); +			if (speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY) +			{ +				update_speaker_indicator(list, speakerp->mID, speakerp->mModeratorMutedVoice); +			}  		}  	}  } @@ -466,12 +469,12 @@ void LLParticipantList::setValidateSpeakerCallback(validate_speaker_callback_t c  	mValidateSpeakerCallback = cb;  } -void LLParticipantList::updateRecentSpeakersOrder() +void LLParticipantList::update()  { +	mSpeakerMgr->update(true); +  	if (E_SORT_BY_RECENT_SPEAKERS == getSortOrder() && !isHovered())  	{ -		// Need to update speakers to sort list correctly -		mSpeakerMgr->update(true);  		// Resort avatar list  		sort();  	} @@ -760,6 +763,7 @@ void LLParticipantList::LLParticipantListMenu::toggleMute(const LLSD& userdata,  	LLPointer<LLSpeaker> speakerp = mParent.mSpeakerMgr->findSpeaker(speaker_id);  	if (speakerp.isNull())  	{ +		LL_WARNS("Speakers") << "Speaker " << speaker_id << " not found" << llendl;  		return;  	}  	LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(mParent.mAvatarList->getItemByValue(speaker_id)); diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index a001d29b67..53966c15fe 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -72,9 +72,9 @@ public:  	const EParticipantSortOrder getSortOrder() const;  	/** -	 * Refreshes the participant list if it's in sort by recent speaker order. +	 * Refreshes the participant list.  	 */ -	void updateRecentSpeakersOrder(); +	void update();  	/**  	 * Set a callback to be called before adding a speaker. Invalid speakers will not be added. diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp index 225ac6e224..fe4cc0f55f 100644 --- a/indra/newview/llplacesinventorybridge.cpp +++ b/indra/newview/llplacesinventorybridge.cpp @@ -89,7 +89,7 @@ void LLPlacesFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		std::vector<std::string> items;  		std::vector<std::string> disabled_items; -		LLInventoryPanel* inv_panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +		LLInventoryPanel* inv_panel = mInventoryPanel.get();  		bool is_open = false;  		if (inv_panel)  		{ @@ -137,7 +137,7 @@ void LLPlacesFolderBridge::performAction(LLInventoryModel* model, std::string ac  LLFolderViewFolder* LLPlacesFolderBridge::getFolder()  {  	LLFolderViewFolder* folder = NULL; -	LLInventoryPanel* inv_panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +	LLInventoryPanel* inv_panel = mInventoryPanel.get();  	if (inv_panel)  	{  		folder = dynamic_cast<LLFolderViewFolder*>(inv_panel->getRootFolder()->getItemByID(mUUID)); diff --git a/indra/newview/llpopupview.cpp b/indra/newview/llpopupview.cpp index 9fbb67a63a..08829c1184 100644 --- a/indra/newview/llpopupview.cpp +++ b/indra/newview/llpopupview.cpp @@ -83,7 +83,7 @@ void LLPopupView::draw()  			LLUI::pushMatrix();  			{ -				LLUI::translate( (F32) screen_x, (F32) screen_y, 0.f); +				LLUI::translate( (F32) screen_x, (F32) screen_y);  				popup->draw();  			}  			LLUI::popMatrix(); diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h index 896e17c3c3..759430c3a5 100644 --- a/indra/newview/llpreview.h +++ b/indra/newview/llpreview.h @@ -32,6 +32,7 @@  #include "llpointer.h"  #include "lluuid.h"  #include "llinventoryobserver.h" +#include "llextendedstatus.h"  #include <map>  class LLInventoryItem; diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 5301955964..d340b304ca 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -195,17 +195,18 @@ LLScreenChannel::~LLScreenChannel()  } -std::list<LLToast*> LLScreenChannel::findToasts(const Matcher& matcher) +std::list<const LLToast*> LLScreenChannel::findToasts(const Matcher& matcher)  { -	std::list<LLToast*> res; +	std::list<const LLToast*> res;  	// collect stored toasts  	for (std::vector<ToastElem>::iterator it = mStoredToastList.begin(); it  			!= mStoredToastList.end(); it++)  	{ -		if (matcher.matches(it->toast->getNotification())) +		const LLToast* toast = it->getToast(); +		if (toast && matcher.matches(toast->getNotification()))  		{ -			res.push_back(it->toast); +			res.push_back(toast);  		}  	} @@ -213,9 +214,10 @@ std::list<LLToast*> LLScreenChannel::findToasts(const Matcher& matcher)  	for (std::vector<ToastElem>::iterator it = mToastList.begin(); it  			!= mToastList.end(); it++)  	{ -		if (matcher.matches(it->toast->getNotification())) +		const LLToast* toast = it->getToast(); +		if (toast && matcher.matches(toast->getNotification()))  		{ -			res.push_back(it->toast); +			res.push_back(toast);  		}  	} @@ -260,15 +262,16 @@ void LLScreenChannel::addToast(const LLToast::Params& p)  		return;  	} -	ToastElem new_toast_elem(p); +	LLToast* toast = new LLToast(p); +	ToastElem new_toast_elem(toast->getHandle()); -	new_toast_elem.toast->setOnFadeCallback(boost::bind(&LLScreenChannel::onToastFade, this, _1)); -	new_toast_elem.toast->setOnToastDestroyedCallback(boost::bind(&LLScreenChannel::onToastDestroyed, this, _1)); +	toast->setOnFadeCallback(boost::bind(&LLScreenChannel::onToastFade, this, _1)); +	toast->setOnToastDestroyedCallback(boost::bind(&LLScreenChannel::onToastDestroyed, this, _1));  	if(mControlHovering)  	{ -		new_toast_elem.toast->setOnToastHoverCallback(boost::bind(&LLScreenChannel::onToastHover, this, _1, _2)); -		new_toast_elem.toast->setMouseEnterCallback(boost::bind(&LLScreenChannel::stopToastTimer, this, new_toast_elem.toast)); -		new_toast_elem.toast->setMouseLeaveCallback(boost::bind(&LLScreenChannel::startToastTimer, this, new_toast_elem.toast)); +		toast->setOnToastHoverCallback(boost::bind(&LLScreenChannel::onToastHover, this, _1, _2)); +		toast->setMouseEnterCallback(boost::bind(&LLScreenChannel::stopToastTimer, this, toast)); +		toast->setMouseLeaveCallback(boost::bind(&LLScreenChannel::startToastTimer, this, toast));  	}  	if(show_toast) @@ -340,13 +343,13 @@ void LLScreenChannel::onToastFade(LLToast* toast)  //--------------------------------------------------------------------------  void LLScreenChannel::deleteToast(LLToast* toast)  { -	if (toast->isDead()) +	if (!toast || toast->isDead())  	{  		return;  	}  	// send signal to observers about destroying of a toast -	toast->mOnDeleteToastSignal(toast); +	toast->closeToast();  	// update channel's Hovering state  	// turning hovering off manually because onMouseLeave won't happen if a toast was closed using a keyboard @@ -354,9 +357,6 @@ void LLScreenChannel::deleteToast(LLToast* toast)  	{  		mHoveredToast  = NULL;  	} - -	// close the toast -	toast->closeFloater();  }  //-------------------------------------------------------------------------- @@ -364,12 +364,16 @@ void LLScreenChannel::deleteToast(LLToast* toast)  void LLScreenChannel::storeToast(ToastElem& toast_elem)  {  	// do not store clones -	std::vector<ToastElem>::iterator it = find(mStoredToastList.begin(), mStoredToastList.end(), toast_elem.id); +	std::vector<ToastElem>::iterator it = find(mStoredToastList.begin(), mStoredToastList.end(), toast_elem.getID());  	if( it != mStoredToastList.end() )  		return; -	mStoredToastList.push_back(toast_elem); -	mOnStoreToast(toast_elem.toast->getPanel(), toast_elem.id); +	const LLToast* toast = toast_elem.getToast(); +	if (toast) +	{ +		mStoredToastList.push_back(toast_elem); +		mOnStoreToast(toast->getPanel(), toast->getNotificationID()); +	}  }  //-------------------------------------------------------------------------- @@ -382,9 +386,13 @@ void LLScreenChannel::loadStoredToastsToChannel()  	for(it = mStoredToastList.begin(); it != mStoredToastList.end(); ++it)  	{ -		(*it).toast->setIsHidden(false); -		(*it).toast->startTimer(); -		mToastList.push_back((*it)); +		LLToast* toast = it->getToast(); +		if (toast) +		{ +			toast->setIsHidden(false); +			toast->startTimer(); +			mToastList.push_back(*it); +		}  	}  	mStoredToastList.clear(); @@ -399,17 +407,19 @@ void LLScreenChannel::loadStoredToastByNotificationIDToChannel(LLUUID id)  	if( it == mStoredToastList.end() )  		return; -	LLToast* toast = (*it).toast; - -	if(toast->getVisible()) +	LLToast* toast = it->getToast(); +	if (toast)  	{ -		// toast is already in channel -		return; -	} +		if(toast->getVisible()) +		{ +			// toast is already in channel +			return; +		} -	toast->setIsHidden(false); -	toast->startTimer(); -	mToastList.push_back((*it)); +		toast->setIsHidden(false); +		toast->startTimer(); +		mToastList.push_back(*it); +	}  	redrawToasts();  } @@ -423,9 +433,19 @@ void LLScreenChannel::removeStoredToastByNotificationID(LLUUID id)  	if( it == mStoredToastList.end() )  		return; -	LLToast* toast = (*it).toast; -	mStoredToastList.erase(it); -	mRejectToastSignal(toast->getNotificationID()); +	const LLToast* toast = it->getToast(); +	if (toast) +	{ +		mRejectToastSignal(toast->getNotificationID()); +	} + +	// Call find() once more, because the mStoredToastList could have been changed +	// in mRejectToastSignal callback and the iterator could have become invalid. +	it = find(mStoredToastList.begin(), mStoredToastList.end(), id); +	if (it != mStoredToastList.end()) +	{ +		mStoredToastList.erase(it); +	}  }  //-------------------------------------------------------------------------- @@ -436,21 +456,22 @@ void LLScreenChannel::killToastByNotificationID(LLUUID id)  	if( it != mToastList.end())  	{ -		LLToast* toast = (*it).toast; +		LLToast* toast = it->getToast();  		// if it is a notification toast and notification is UnResponded - then respond on it  		// else - simply destroy a toast  		//  		// NOTE:	if a notification is unresponded this function will be called twice for the same toast.  		//			At first, the notification will be discarded, at second (it will be caused by discarding),  		//			the toast will be destroyed. -		if(toast->isNotificationValid()) +		if(toast && toast->isNotificationValid())  		{  			mRejectToastSignal(toast->getNotificationID());  		}  		else  		{ -			mToastList.erase(it); +  			deleteToast(toast); +			mToastList.erase(it);  			redrawToasts();  		}  		return; @@ -459,20 +480,31 @@ void LLScreenChannel::killToastByNotificationID(LLUUID id)  	// searching among stored toasts  	it = find(mStoredToastList.begin(), mStoredToastList.end(), id); -	if( it != mStoredToastList.end() ) +	if (it != mStoredToastList.end()) +	{ +		LLToast* toast = it->getToast(); +		if (toast) +		{ +			// send signal to a listener to let him perform some action on toast rejecting +			mRejectToastSignal(toast->getNotificationID()); +			deleteToast(toast); +		} +	} + +	// Call find() once more, because the mStoredToastList could have been changed +	// in mRejectToastSignal callback and the iterator could have become invalid. +	it = find(mStoredToastList.begin(), mStoredToastList.end(), id); +	if (it != mStoredToastList.end())  	{ -		LLToast* toast = (*it).toast;  		mStoredToastList.erase(it); -		// send signal to a listener to let him perform some action on toast rejecting -		mRejectToastSignal(toast->getNotificationID()); -		deleteToast(toast);  	} +  }  void LLScreenChannel::killMatchedToasts(const Matcher& matcher)  { -	std::list<LLToast*> to_delete = findToasts(matcher); -	for (std::list<LLToast*>::iterator it = to_delete.begin(); it +	std::list<const LLToast*> to_delete = findToasts(matcher); +	for (std::list<const LLToast*>::iterator it = to_delete.begin(); it  			!= to_delete.end(); it++)  	{  		killToastByNotificationID((*it)-> getNotificationID()); @@ -486,12 +518,15 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)  	if( it != mToastList.end() && panel)  	{ -		LLToast* toast = (*it).toast; -		LLPanel* old_panel = toast->getPanel(); -		toast->removeChild(old_panel); -		delete old_panel; -		toast->insertPanel(panel); -		toast->startTimer(); +		LLToast* toast = it->getToast(); +		if (toast) +		{ +			LLPanel* old_panel = toast->getPanel(); +			toast->removeChild(old_panel); +			delete old_panel; +			toast->insertPanel(panel); +			toast->startTimer(); +		}  		redrawToasts();  	}  } @@ -540,16 +575,29 @@ void LLScreenChannel::showToastsBottom()  	{  		if(it != mToastList.rbegin())  		{ -			LLToast* toast = (*(it-1)).toast; +			LLToast* toast = (it-1)->getToast(); +			if (!toast) +			{ +				llwarns << "Attempt to display a deleted toast." << llendl; +				return; +			} +  			bottom = toast->getRect().mTop - toast->getTopPad();  			toast_margin = gSavedSettings.getS32("ToastGap");  		} -		toast_rect = (*it).toast->getRect(); +		LLToast* toast = it->getToast(); +		if(!toast) +		{ +			llwarns << "Attempt to display a deleted toast." << llendl; +			return; +		} + +		toast_rect = toast->getRect();  		toast_rect.setOriginAndSize(getRect().mRight - toast_rect.getWidth(),  				bottom + toast_margin, toast_rect.getWidth(),  				toast_rect.getHeight()); -		(*it).toast->setRect(toast_rect); +		toast->setRect(toast_rect);  		if(floater && floater->overlapsScreenChannel())  		{ @@ -561,7 +609,7 @@ void LLScreenChannel::showToastsBottom()  				{  					shift += floater->getDockControl()->getTongueHeight();  				} -				(*it).toast->translate(0, shift); +				toast->translate(0, shift);  			}  			LLRect channel_rect = getChannelRect(); @@ -572,13 +620,13 @@ void LLScreenChannel::showToastsBottom()  			}  		} -		bool stop_showing_toasts = (*it).toast->getRect().mTop > getRect().mTop; +		bool stop_showing_toasts = toast->getRect().mTop > getRect().mTop;  		if(!stop_showing_toasts)  		{  			if( it != mToastList.rend()-1)  			{ -				S32 toast_top = (*it).toast->getRect().mTop + gSavedSettings.getS32("ToastGap"); +				S32 toast_top = toast->getRect().mTop + gSavedSettings.getS32("ToastGap");  				stop_showing_toasts = toast_top > getRect().mTop;  			}  		}  @@ -592,17 +640,17 @@ void LLScreenChannel::showToastsBottom()  		if(stop_showing_toasts)  			break; -		if( !(*it).toast->getVisible() ) +		if( !toast->getVisible() )  		{  			// HACK  			// EXT-2653: it is necessary to prevent overlapping for secondary showed toasts -			(*it).toast->setVisible(TRUE); +			toast->setVisible(TRUE);  		}		 -		if(!(*it).toast->hasFocus()) +		if(!toast->hasFocus())  		{  			// Fixing Z-order of toasts (EXT-4862)  			// Next toast will be positioned under this one. -			gFloaterView->sendChildToBack((*it).toast); +			gFloaterView->sendChildToBack(toast);  		}  	} @@ -612,7 +660,11 @@ void LLScreenChannel::showToastsBottom()  		mHiddenToastsNum = 0;  		for(; it != mToastList.rend(); it++)  		{ -			(*it).toast->hide(); +			LLToast* toast = it->getToast(); +			if (toast) +			{ +				toast->hide(); +			}  		}  	}  } @@ -620,17 +672,31 @@ void LLScreenChannel::showToastsBottom()  //--------------------------------------------------------------------------  void LLScreenChannel::showToastsCentre()  { -	LLRect	toast_rect;	 -	S32		bottom = (getRect().mTop - getRect().mBottom)/2 + mToastList[0].toast->getRect().getHeight()/2; +	LLToast* toast = mToastList[0].getToast(); +	if (!toast) +	{ +		llwarns << "Attempt to display a deleted toast." << llendl; +		return; +	} + +	LLRect	toast_rect; +	S32		bottom = (getRect().mTop - getRect().mBottom)/2 + toast->getRect().getHeight()/2;  	std::vector<ToastElem>::reverse_iterator it;  	for(it = mToastList.rbegin(); it != mToastList.rend(); ++it)  	{ -		toast_rect = (*it).toast->getRect(); +		LLToast* toast = it->getToast(); +		if (!toast) +		{ +			llwarns << "Attempt to display a deleted toast." << llendl; +			return; +		} + +		toast_rect = toast->getRect();  		toast_rect.setLeftTopAndSize(getRect().mLeft - toast_rect.getWidth() / 2, bottom + toast_rect.getHeight() / 2 + gSavedSettings.getS32("ToastGap"), toast_rect.getWidth() ,toast_rect.getHeight()); -		(*it).toast->setRect(toast_rect); +		toast->setRect(toast_rect); -		(*it).toast->setVisible(TRUE);	 +		toast->setVisible(TRUE);  	}  } @@ -652,16 +718,29 @@ void LLScreenChannel::showToastsTop()  	{  		if(it != mToastList.rbegin())  		{ -			LLToast* toast = (*(it-1)).toast; +			LLToast* toast = (it-1)->getToast(); +			if (!toast) +			{ +				llwarns << "Attempt to display a deleted toast." << llendl; +				return; +			} +  			top = toast->getRect().mBottom - toast->getTopPad();  			toast_margin = gSavedSettings.getS32("ToastGap");  		} -		toast_rect = (*it).toast->getRect(); +		LLToast* toast = it->getToast(); +		if (!toast) +		{ +			llwarns << "Attempt to display a deleted toast." << llendl; +			return; +		} + +		toast_rect = toast->getRect();  		toast_rect.setLeftTopAndSize(channel_rect.mRight - toast_rect.getWidth(),  			top, toast_rect.getWidth(),  			toast_rect.getHeight()); -		(*it).toast->setRect(toast_rect); +		toast->setRect(toast_rect);  		if(floater && floater->overlapsScreenChannel())  		{ @@ -673,7 +752,7 @@ void LLScreenChannel::showToastsTop()  				{  					shift -= floater->getDockControl()->getTongueHeight();  				} -				(*it).toast->translate(0, shift); +				toast->translate(0, shift);  			}  			LLRect channel_rect = getChannelRect(); @@ -684,13 +763,13 @@ void LLScreenChannel::showToastsTop()  			}  		} -		bool stop_showing_toasts = (*it).toast->getRect().mBottom < channel_rect.mBottom; +		bool stop_showing_toasts = toast->getRect().mBottom < channel_rect.mBottom;  		if(!stop_showing_toasts)  		{  			if( it != mToastList.rend()-1)  			{ -				S32 toast_bottom = (*it).toast->getRect().mBottom - gSavedSettings.getS32("ToastGap"); +				S32 toast_bottom = toast->getRect().mBottom - gSavedSettings.getS32("ToastGap");  				stop_showing_toasts = toast_bottom < channel_rect.mBottom;  			}  		}  @@ -704,29 +783,41 @@ void LLScreenChannel::showToastsTop()  		if(stop_showing_toasts)  			break; -		if( !(*it).toast->getVisible() ) +		if (!toast->getVisible())  		{  			// HACK  			// EXT-2653: it is necessary to prevent overlapping for secondary showed toasts -			(*it).toast->setVisible(TRUE); +			toast->setVisible(TRUE);  		}		 -		if(!(*it).toast->hasFocus()) +		if (!toast->hasFocus())  		{  			// Fixing Z-order of toasts (EXT-4862)  			// Next toast will be positioned under this one. -			gFloaterView->sendChildToBack((*it).toast); +			gFloaterView->sendChildToBack(toast);  		}  	}  	// Dismiss toasts we don't have space for (STORM-391). +	std::vector<LLToast*> toasts_to_hide;  	if(it != mToastList.rend())  	{  		mHiddenToastsNum = 0;  		for(; it != mToastList.rend(); it++)  		{ -			(*it).toast->hide(); +			LLToast* toast = it->getToast(); +			if (toast) +			{ +				toasts_to_hide.push_back(toast); +			}  		}  	} + +	for (std::vector<LLToast*>::iterator it = toasts_to_hide.begin(), end_it = toasts_to_hide.end(); +		it != end_it; +		++it) +	{ +		(*it)->hide(); +	}  }  //-------------------------------------------------------------------------- @@ -827,7 +918,17 @@ void LLNotificationsUI::LLScreenChannel::startToastTimer(LLToast* toast)  void LLScreenChannel::hideToastsFromScreen()  {  	for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end(); it++) -		(*it).toast->setVisible(FALSE); +	{ +		LLToast* toast = it->getToast(); +		if (toast) +		{ +			toast->setVisible(FALSE); +		} +		else +		{ +			llwarns << "Attempt to hide a deleted toast." << llendl; +		} +	}  }  //-------------------------------------------------------------------------- @@ -836,8 +937,15 @@ void LLScreenChannel::hideToast(const LLUUID& notification_id)  	std::vector<ToastElem>::iterator it = find(mToastList.begin(), mToastList.end(), notification_id);  	if(mToastList.end() != it)  	{ -		ToastElem te = *it; -		te.toast->hide(); +		LLToast* toast = it->getToast(); +		if (toast) +		{ +			toast->hide(); +		} +		else +		{ +			llwarns << "Attempt to hide a deleted toast." << llendl; +		}  	}  } @@ -845,24 +953,25 @@ void LLScreenChannel::closeHiddenToasts(const Matcher& matcher)  {  	// since we can't guarantee that close toast operation doesn't change mToastList  	// we collect matched toasts that should be closed into separate list -	std::list<ToastElem> toasts; +	std::list<LLToast*> toasts;  	for (std::vector<ToastElem>::iterator it = mToastList.begin(); it  			!= mToastList.end(); it++)  	{ -		LLToast * toast = it->toast; +		LLToast* toast = it->getToast();  		// add to list valid toast that match to provided matcher criteria  		if (toast != NULL && !toast->isDead() && toast->getNotification() != NULL  				&& !toast->getVisible() && matcher.matches(toast->getNotification()))  		{ -			toasts.push_back(*it); +			toasts.push_back(toast);  		}  	}  	// close collected toasts -	for (std::list<ToastElem>::iterator it = toasts.begin(); it +	for (std::list<LLToast*>::iterator it = toasts.begin(); it  			!= toasts.end(); it++)  	{ -		it->toast->closeFloater(); +		LLToast* toast = *it; +		toast->closeFloater();  	}  } @@ -872,7 +981,7 @@ void LLScreenChannel::removeToastsFromChannel()  	hideToastsFromScreen();  	for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end(); it++)  	{ -		deleteToast((*it).toast); +		deleteToast(it->getToast());  	}  	mToastList.clear();  } @@ -886,9 +995,10 @@ void LLScreenChannel::removeAndStoreAllStorableToasts()  	hideToastsFromScreen();  	for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end();)  	{ -		if((*it).toast->getCanBeStored()) +		LLToast* toast = it->getToast(); +		if(toast && toast->getCanBeStored())  		{ -			storeToast(*(it)); +			storeToast(*it);  			it = mToastList.erase(it);  		}  		else @@ -908,9 +1018,10 @@ void LLScreenChannel::removeToastsBySessionID(LLUUID id)  	hideToastsFromScreen();  	for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end();)  	{ -		if((*it).toast->getSessionID() == id) +		LLToast* toast = it->getToast(); +		if(toast && toast->getSessionID() == id)  		{ -			deleteToast((*it).toast); +			deleteToast(toast);  			it = mToastList.erase(it);  		}  		else @@ -968,5 +1079,5 @@ LLToast* LLScreenChannel::getToastByNotificationID(LLUUID id)  	if (it == mStoredToastList.end())  		return NULL; -	return it->toast; +	return it->getToast();  } diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h index c9f8855fe6..695b6cd44d 100644 --- a/indra/newview/llscreenchannel.h +++ b/indra/newview/llscreenchannel.h @@ -163,7 +163,7 @@ public:  		virtual bool matches(const LLNotificationPtr) const = 0;  	}; -	std::list<LLToast*> findToasts(const Matcher& matcher); +	std::list<const LLToast*> findToasts(const Matcher& matcher);  	// Channel's outfit-functions  	// update channel's size and position in the World View @@ -238,31 +238,39 @@ public:  	reject_tost_signal_t mRejectToastSignal; boost::signals2::connection setOnRejectToastCallback(reject_tost_callback_t cb) { return mRejectToastSignal.connect(cb); }  private: -	struct ToastElem +	class ToastElem  	{ -		LLUUID		id; -		LLToast*	toast; +	public: +		ToastElem(const LLHandle<LLToast>& toast) : mToast(toast) +		{ +		} -		ToastElem(LLToast::Params p) : id(p.notif_id) +		ToastElem(const ToastElem& toast_elem) : mToast(toast_elem.mToast)  		{ -			toast = new LLToast(p);  		} -		ToastElem(const ToastElem& toast_elem) +		LLToast* getToast() const  		{ -			id = toast_elem.id; -			toast = toast_elem.toast; +			return mToast.get(); +		} + +		LLUUID getID() const +		{ +			return mToast.isDead() ? LLUUID() : mToast.get()->getNotificationID();  		}  		bool operator == (const LLUUID &id_op) const  		{ -			return (id == id_op); +			return (getID() == id_op);  		}  		bool operator == (LLPanel* panel_op) const  		{ -			return (toast == panel_op); +			return (mToast.get() == panel_op);  		} + +	private: +		LLHandle<LLToast>	mToast;  	};  	// Channel's handlers diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp index 8d64c8c04f..30400a4c6a 100644 --- a/indra/newview/llsechandler_basic.cpp +++ b/indra/newview/llsechandler_basic.cpp @@ -1360,7 +1360,11 @@ void LLSecAPIBasicHandler::_writeProtectedData()  		// (even though this file isn't really secure.  Perhaps in the future  		// it may be, however.  		LLFile::remove(tmp_filename); -		throw LLProtectedDataException("Error writing Protected Data Store"); + +		// EXP-1825 crash in LLSecAPIBasicHandler::_writeProtectedData() +		// Decided throwing an exception here was overkill until we figure out why this happens +		//throw LLProtectedDataException("Error writing Protected Data Store"); +		llinfos << "LLProtectedDataException(Error writing Protected Data Store)" << llendl;  	}  	// move the temporary file to the specified file location. @@ -1369,7 +1373,11 @@ void LLSecAPIBasicHandler::_writeProtectedData()  	   (LLFile::rename(tmp_filename, mProtectedDataFilename)))  	{  		LLFile::remove(tmp_filename); -		throw LLProtectedDataException("Could not overwrite protected data store"); + +		// EXP-1825 crash in LLSecAPIBasicHandler::_writeProtectedData() +		// Decided throwing an exception here was overkill until we figure out why this happens +		//throw LLProtectedDataException("Could not overwrite protected data store"); +		llinfos << "LLProtectedDataException(Could not overwrite protected data store)" << llendl;  	}  } diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 038b18afbd..c8b67cc9ec 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -217,15 +217,17 @@ BOOL LLSidepanelInventory::postBuild()  	{  		LLLayoutStack* inv_stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME); -		// Collapse inbox panel -		inv_stack->collapsePanel(getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME), true); -		  		// Set up button states and callbacks  		LLButton * inbox_button = getChild<LLButton>(INBOX_BUTTON_NAME); -		inbox_button->setToggleState(false);  		inbox_button->setCommitCallback(boost::bind(&LLSidepanelInventory::onToggleInboxBtn, this)); +		// Get the previous inbox state from "InventoryInboxToggleState" setting. +		bool is_inbox_collapsed = !inbox_button->getToggleState(); + +		// Restore the collapsed inbox panel state +		inv_stack->collapsePanel(getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME), is_inbox_collapsed); +  		// Set the inbox visible based on debug settings (final setting comes from http request below)  		enableInbox(gSavedSettings.getBOOL("InventoryDisplayInbox")); diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index c588bd8fb4..07d2f1ad6f 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -272,6 +272,7 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin  		speakerp->mStatus = status;  		mSpeakers.insert(std::make_pair(speakerp->mID, speakerp));  		mSpeakersSorted.push_back(speakerp); +		LL_DEBUGS("Speakers") << "Added speaker " << id << llendl;  		fireEvent(new LLSpeakerListChangeEvent(this, speakerp->mID), "add");  	}  	else @@ -290,6 +291,10 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin  				speakerp->lookupName();  			}  		} +		else +		{ +			LL_WARNS("Speakers") << "Speaker " << id << " not found" << llendl; +		}  	}  	mSpeakerDelayRemover->unsetActionTimer(speakerp->mID); @@ -354,6 +359,7 @@ void LLSpeakerMgr::update(BOOL resort_ok)  			if (moderator_muted_voice != speakerp->mModeratorMutedVoice)  			{  				speakerp->mModeratorMutedVoice = moderator_muted_voice; +				LL_DEBUGS("Speakers") << (speakerp->mModeratorMutedVoice? "Muted" : "Umuted") << " speaker " << speaker_id<< llendl;  				speakerp->fireEvent(new LLSpeakerVoiceModerationEvent(speakerp));  			} @@ -484,6 +490,7 @@ bool LLSpeakerMgr::removeSpeaker(const LLUUID& speaker_id)  		}  	} +	LL_DEBUGS("Speakers") << "Removed speaker " << speaker_id << llendl;  	fireEvent(new LLSpeakerListChangeEvent(this, speaker_id), "remove");  	update(TRUE); @@ -595,7 +602,10 @@ void LLIMSpeakerMgr::setSpeakers(const LLSD& speakers)  					speaker_it->second["mutes"]["text"];  				// Fire event only if moderator changed  				if ( is_moderator != speakerp->mIsModerator ) +				{ +					LL_DEBUGS("Speakers") << "Speaker " << agent_id << (is_moderator ? "is now" : "no longer is") << " a moderator" << llendl;  					fireEvent(new LLSpeakerUpdateModeratorEvent(speakerp), "update_moderator"); +				}  			}  		}  	} @@ -665,7 +675,10 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)  					speakerp->mIsModerator = agent_info["is_moderator"];  					// Fire event only if moderator changed  					if ( is_moderator != speakerp->mIsModerator ) +					{ +						LL_DEBUGS("Speakers") << "Speaker " << agent_id << (is_moderator ? "is now" : "no longer is") << " a moderator" << llendl;  						fireEvent(new LLSpeakerUpdateModeratorEvent(speakerp), "update_moderator"); +					}  				}  				if (agent_info.has("mutes")) @@ -857,6 +870,7 @@ void LLActiveSpeakerMgr::updateSpeakerList()  	// always populate from active voice channel  	if (LLVoiceChannel::getCurrentVoiceChannel() != mVoiceChannel) //MA: seems this is always false  	{ +		LL_DEBUGS("Speakers") << "Removed all speakers" << llendl;  		fireEvent(new LLSpeakerListChangeEvent(this, LLUUID::null), "clear");  		mSpeakers.clear();  		mSpeakersSorted.clear(); diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h index 35f2ee7056..b9358cf37c 100644 --- a/indra/newview/llspeakers.h +++ b/indra/newview/llspeakers.h @@ -208,6 +208,8 @@ private:  class LLSpeakerMgr : public LLOldEvents::LLObservable  { +	LOG_CLASS(LLSpeakerMgr); +  public:  	LLSpeakerMgr(LLVoiceChannel* channelp);  	virtual ~LLSpeakerMgr(); @@ -271,6 +273,8 @@ protected:  class LLIMSpeakerMgr : public LLSpeakerMgr  { +	LOG_CLASS(LLIMSpeakerMgr); +  public:  	LLIMSpeakerMgr(LLVoiceChannel* channel); @@ -320,6 +324,8 @@ protected:  class LLActiveSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLActiveSpeakerMgr>  { +	LOG_CLASS(LLActiveSpeakerMgr); +  public:  	LLActiveSpeakerMgr();  protected: @@ -328,6 +334,7 @@ protected:  class LLLocalSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLLocalSpeakerMgr>  { +	LOG_CLASS(LLLocalSpeakerMgr);  public:  	LLLocalSpeakerMgr();  	~LLLocalSpeakerMgr (); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 3923b4510a..0ac8c1fe39 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -880,7 +880,6 @@ bool idle_startup()  		LLFile::mkdir(gDirUtilp->getLindenUserDir());  		// Set PerAccountSettingsFile to the default value. -		std::string per_account_settings_file = LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount");  		gSavedSettings.setString("PerAccountSettingsFile",  			gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,   				LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount"))); diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index ddedb1dcfb..19a944e88e 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -922,7 +922,7 @@ LLTextureCtrl::LLTextureCtrl(const LLTextureCtrl::Params& p)  	S32 image_top = getRect().getHeight();  	S32 image_bottom = BTN_HEIGHT_SMALL;  	S32 image_middle = (image_top + image_bottom) / 2; -	S32 line_height = llround(LLFontGL::getFontSansSerifSmall()->getLineHeight()); +	S32 line_height = LLFontGL::getFontSansSerifSmall()->getLineHeight();  	LLTextBox::Params tentative_label_p(p.multiselect_text);  	tentative_label_p.name("Multiple"); diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 1c89766b26..5b41a05f2a 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -386,7 +386,7 @@ public:  		Params()  		:	texture_view("texture_view")  		{ -			S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); +			S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();  			changeDefault(rect, LLRect(0,0,100,line_height * 4));  		}  	}; @@ -411,7 +411,7 @@ void LLAvatarTexBar::draw()  	LLVOAvatarSelf* avatarp = gAgentAvatarp;  	if (!avatarp) return; -	const S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); +	const S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();  	const S32 v_offset = 0;  	const S32 l_offset = 3; @@ -485,7 +485,7 @@ public:  		Params()  		:	texture_view("texture_view")  		{ -			S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); +			S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();  			changeDefault(rect, LLRect(0,0,100,line_height * 4));  		}  	}; @@ -512,7 +512,7 @@ void LLGLTexMemBar::draw()  	F32 discard_bias = LLViewerTexture::sDesiredDiscardBias;  	F32 cache_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getUsage()) ;  	F32 cache_max_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getMaxUsage()) ; -	S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); +	S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();  	S32 v_offset = (S32)((texture_bar_height + 2.2f) * mTextureView->mNumTextureBars + 2.0f);  	F32 total_texture_downloaded = (F32)gTotalTextureBytes / (1024 * 1024);  	F32 total_object_downloaded = (F32)gTotalObjectBytes / (1024 * 1024); @@ -1097,7 +1097,7 @@ void LLTextureSizeView::drawTextureSizeGraph()  {  	if(mTextureSizeBar.size() == 0)  	{ -		S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); +		S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();  		mTextureSizeBar.resize(LLImageGL::sTextureLoadedCounter.size()) ;  		mTextureSizeBarRect.set(700, line_height * 2 + 400, 700 + mTextureSizeBar.size() * mTextureSizeBarWidth, line_height * 2) ; @@ -1140,7 +1140,7 @@ F32 LLTextureSizeView::drawTextureSizeDistributionGraph()  		}  	} -	S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); +	S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();  	S32 left = mTextureSizeBarRect.mLeft ;  	S32 bottom = mTextureSizeBarRect.mBottom ;  	S32 right = mTextureSizeBarRect.mRight ; @@ -1222,7 +1222,7 @@ void LLTextureSizeView::drawTextureCategoryGraph()  {  	if(mTextureSizeBar.size() == 0)  	{ -		S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); +		S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();  		mTextureSizeBar.resize(LLViewerTexture::getTotalNumOfCategories()) ;  		mTextureSizeBarRect.set(700, line_height * 2 + 400, 700 + mTextureSizeBar.size() * mTextureSizeBarWidth, line_height * 2) ; @@ -1267,7 +1267,7 @@ F32 LLTextureSizeView::drawTextureCategoryDistributionGraph()  		}  	} -	S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); +	S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();  	S32 left = mTextureSizeBarRect.mLeft ;  	S32 bottom = mTextureSizeBarRect.mBottom ;  	S32 right = mTextureSizeBarRect.mRight ; diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index da691a2d0c..0eec7f0afd 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -180,11 +180,14 @@ LLToast::~LLToast()  //--------------------------------------------------------------------------  void LLToast::hide()  { -	setVisible(FALSE); -	setFading(false); -	mTimer->stop(); -	mIsHidden = true; -	mOnFadeSignal(this);  +	if (!mIsHidden) +	{ +		setVisible(FALSE); +		setFading(false); +		mTimer->stop(); +		mIsHidden = true; +		mOnFadeSignal(this);  +	}  }  void LLToast::onFocusLost() @@ -215,6 +218,13 @@ void LLToast::setFadingTime(S32 seconds)  	mToastFadingTime = seconds;  } +void LLToast::closeToast() +{ +	mOnDeleteToastSignal(this); + +	closeFloater(); +} +  S32 LLToast::getTopPad()  {  	if(mWrapperPanel) @@ -296,9 +306,7 @@ void LLToast::reshapeToPanel()  	if(!panel)  		return; -	LLRect panel_rect = panel->getRect(); - -	panel_rect.setLeftTopAndSize(0, panel_rect.getHeight(), panel_rect.getWidth(), panel_rect.getHeight()); +	LLRect panel_rect = panel->getLocalRect();  	panel->setShape(panel_rect);  	LLRect toast_rect = getRect(); diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h index 0b06728935..e1d99b1bcb 100644 --- a/indra/newview/lltoast.h +++ b/indra/newview/lltoast.h @@ -75,6 +75,7 @@ class LLToast : public LLModalDialog, public LLInstanceTracker<LLToast>  public:  	typedef boost::function<void (LLToast* toast)> toast_callback_t;  	typedef boost::signals2::signal<void (LLToast* toast)> toast_signal_t; +	typedef boost::signals2::signal<void (LLToast* toast, bool mouse_enter)> toast_hover_check_signal_t;  	struct Params : public LLInitParam::Block<Params>  	{ @@ -131,7 +132,7 @@ public:  	void reshapeToPanel();  	// get toast's panel -	LLPanel* getPanel() { return mPanel; } +	LLPanel* getPanel() const { return mPanel; }  	// enable/disable Toast's Hide button  	void setHideButtonEnabled(bool enabled);  	// @@ -155,6 +156,8 @@ public:  	void setFadingTime(S32 seconds); +	void closeToast(); +  	/**  	 * Returns padding between floater top and wrapper_panel top.  	 * This padding should be taken into account when positioning or reshaping toasts @@ -167,9 +170,9 @@ public:  	// get information whether the notification corresponding to the toast is valid or not  	bool isNotificationValid();  	// get toast's Notification ID -	const LLUUID getNotificationID() { return mNotificationID;} +	const LLUUID getNotificationID() const { return mNotificationID;}  	// get toast's Session ID -	const LLUUID getSessionID() { return mSessionID;} +	const LLUUID getSessionID() const { return mSessionID;}  	//  	void setCanFade(bool can_fade);  	// @@ -179,19 +182,12 @@ public:  	// set whether this toast considered as hidden or not  	void setIsHidden( bool is_toast_hidden ) { mIsHidden = is_toast_hidden; } -	const LLNotificationPtr& getNotification() { return mNotification;} +	const LLNotificationPtr& getNotification() const { return mNotification;}  	// Registers signals/callbacks for events -	toast_signal_t mOnFadeSignal; -	toast_signal_t mOnDeleteToastSignal; -	toast_signal_t mOnToastDestroyedSignal; -	boost::signals2::connection setOnFadeCallback(toast_callback_t cb) { return mOnFadeSignal.connect(cb); } -	boost::signals2::connection setOnToastDestroyedCallback(toast_callback_t cb) { return mOnToastDestroyedSignal.connect(cb); } - -	typedef boost::function<void (LLToast* toast, bool mouse_enter)> toast_hover_check_callback_t; -	typedef boost::signals2::signal<void (LLToast* toast, bool mouse_enter)> toast_hover_check_signal_t; -	toast_hover_check_signal_t mOnToastHoverSignal;	 -	boost::signals2::connection setOnToastHoverCallback(toast_hover_check_callback_t cb) { return mOnToastHoverSignal.connect(cb); } +	boost::signals2::connection setOnFadeCallback(const toast_signal_t::slot_type& cb) { return mOnFadeSignal.connect(cb); } +	boost::signals2::connection setOnToastDestroyedCallback(const toast_signal_t::slot_type& cb) { return mOnToastDestroyedSignal.connect(cb); } +	boost::signals2::connection setOnToastHoverCallback(const toast_hover_check_signal_t::slot_type& cb) { return mOnToastHoverSignal.connect(cb); }  	boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseEnterSignal.connect(cb); };  	boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseLeaveSignal.connect(cb); }; @@ -237,6 +233,11 @@ private:  	bool		mIsFading;  	bool		mIsHovered; +	toast_signal_t mOnFadeSignal; +	toast_signal_t mOnDeleteToastSignal; +	toast_signal_t mOnToastDestroyedSignal; +	toast_hover_check_signal_t mOnToastHoverSignal; +  	commit_signal_t mToastMouseEnterSignal;  	commit_signal_t mToastMouseLeaveSignal;  }; diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index 0f337825e9..9ba8431fde 100644 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -69,8 +69,22 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal  		mLabel(notification->getName()),  		mLineEditor(NULL)  { +	// EXP-1822 +	// save currently focused view, so that return focus to it +	// on destroying this toast. +	LLView* current_selection = dynamic_cast<LLView*>(gFocusMgr.getKeyboardFocus()); +	while(current_selection) +	{ +		if (current_selection->isFocusRoot()) +		{ +			mPreviouslyFocusedView = current_selection->getHandle(); +			break; +		} +		current_selection = current_selection->getParent(); +	} +  	const LLFontGL* font = LLFontGL::getFontSansSerif(); -	const S32 LINE_HEIGHT = llfloor(font->getLineHeight() + 0.99f); +	const S32 LINE_HEIGHT = font->getLineHeight();  	const S32 EDITOR_HEIGHT = 20;  	LLNotificationFormPtr form = mNotification->getForm(); @@ -365,7 +379,7 @@ bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::  	}  	const LLFontGL* font =  mCheck->getFont(); -	const S32 LINE_HEIGHT = llfloor(font->getLineHeight() + 0.99f); +	const S32 LINE_HEIGHT = font->getLineHeight();  	// Extend dialog for "check next time"  	S32 max_msg_width = LLToastPanel::getRect().getWidth() - 2 * HPAD; @@ -408,6 +422,13 @@ LLToastAlertPanel::~LLToastAlertPanel()  {  	LLTransientFloaterMgr::instance().removeControlView(  			LLTransientFloaterMgr::GLOBAL, this); + +	// EXP-1822 +	// return focus to the previously focused view +	if (mPreviouslyFocusedView.get()) +	{ +		mPreviouslyFocusedView.get()->setFocus(TRUE); +	}  }  BOOL LLToastAlertPanel::hasTitleBar() const diff --git a/indra/newview/lltoastalertpanel.h b/indra/newview/lltoastalertpanel.h index 7b157f19bb..d1be5e018e 100644 --- a/indra/newview/lltoastalertpanel.h +++ b/indra/newview/lltoastalertpanel.h @@ -113,6 +113,7 @@ private:  	LLFrameTimer	mDefaultBtnTimer;  	// For Dialogs that take a line as text as input:  	LLLineEditor* mLineEditor; +	LLHandle<LLView>	mPreviouslyFocusedView;  }; diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp index fc69157a40..d2a4ce8745 100644 --- a/indra/newview/lltoastpanel.cpp +++ b/indra/newview/lltoastpanel.cpp @@ -68,7 +68,7 @@ void LLToastPanel::snapToMessageHeight(LLTextBase* message, S32 maxLineCount)  	if (message->getVisible())  	{  		S32 heightDelta = 0; -		S32 maxTextHeight = (S32)(message->getDefaultFont()->getLineHeight() * maxLineCount); +		S32 maxTextHeight = message->getDefaultFont()->getLineHeight() * maxLineCount;  		LLRect messageRect = message->getRect();  		S32 oldTextHeight = messageRect.getHeight(); diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 8c32dfcb4d..c7ab934f9e 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -333,14 +333,15 @@ LLToolDragAndDrop::LLDragAndDropDictionary::LLDragAndDropDictionary()  };  LLToolDragAndDrop::LLToolDragAndDrop() -:	 LLTool(std::string("draganddrop"), NULL), -	 mDragStartX(0), -	 mDragStartY(0), -	 mSource(SOURCE_AGENT), -	 mCursor(UI_CURSOR_NO), -	 mLastAccept(ACCEPT_NO), -	 mDrop(FALSE), -	 mCurItemIndex(0) +:	LLTool(std::string("draganddrop"), NULL), +	mCargoCount(0), +	mDragStartX(0), +	mDragStartY(0), +	mSource(SOURCE_AGENT), +	mCursor(UI_CURSOR_NO), +	mLastAccept(ACCEPT_NO), +	mDrop(FALSE), +	mCurItemIndex(0)  {  } diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h index 188d36cd1b..245c2a23e6 100644 --- a/indra/newview/lltooldraganddrop.h +++ b/indra/newview/lltooldraganddrop.h @@ -86,8 +86,11 @@ public:  	EAcceptance getLastAccept() { return mLastAccept; }  	boost::signals2::connection setEndDragCallback( const enddrag_signal_t::slot_type& cb ) { return mEndDragSignal.connect(cb); } -	 -	uuid_vec_t::size_type getCargoIDsCount() const { return mCargoIDs.size(); } + +	void setCargoCount(U32 count) { mCargoCount = count; } +	void resetCargoCount() { mCargoCount = 0; } +	U32 getCargoCount() const { return (mCargoCount > 0) ? mCargoCount : mCargoIDs.size(); } +  	static S32 getOperationId() { return sOperationId; }  protected: @@ -118,6 +121,8 @@ protected:  protected: +	U32				mCargoCount; +  	S32				mDragStartX;  	S32				mDragStartY; diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp index c1cc9c7bc4..f3d8de1904 100755 --- a/indra/newview/lltranslate.cpp +++ b/indra/newview/lltranslate.cpp @@ -162,10 +162,10 @@ void LLBingTranslationHandler::getTranslateURL(  	const std::string &text) const  {  	url = std::string("http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=") -		+ getAPIKey() + "&text=" + LLURI::escape(text) + "&to=" + to_lang; +		+ getAPIKey() + "&text=" + LLURI::escape(text) + "&to=" + getAPILanguageCode(to_lang);  	if (!from_lang.empty())  	{ -		url += "&from=" + from_lang; +		url += "&from=" + getAPILanguageCode(from_lang);  	}  } @@ -236,6 +236,12 @@ std::string LLBingTranslationHandler::getAPIKey()  	return gSavedSettings.getString("BingTranslateAPIKey");  } +// static +std::string LLBingTranslationHandler::getAPILanguageCode(const std::string& lang) +{ +	return lang == "zh" ? "zh-CHT" : lang; // treat Chinese as Traditional Chinese +} +  LLTranslate::TranslationReceiver::TranslationReceiver(const std::string& from_lang, const std::string& to_lang)  :	mFromLang(from_lang)  ,	mToLang(to_lang) diff --git a/indra/newview/lltranslate.h b/indra/newview/lltranslate.h index 424bc14587..c58e1adb8c 100755 --- a/indra/newview/lltranslate.h +++ b/indra/newview/lltranslate.h @@ -157,6 +157,7 @@ public:  	/*virtual*/ bool isConfigured() const;  private:  	static std::string getAPIKey(); +	static std::string getAPILanguageCode(const std::string& lang);  };  /** diff --git a/indra/newview/lluploaddialog.cpp b/indra/newview/lluploaddialog.cpp index df7c5be0d6..e59064c074 100644 --- a/indra/newview/lluploaddialog.cpp +++ b/indra/newview/lluploaddialog.cpp @@ -115,7 +115,7 @@ void LLUploadDialog::setMessage( const std::string& msg)  		token = strtok( NULL, "\n" );  	} -	S32 line_height = S32( font->getLineHeight() + 0.99f ); +	S32 line_height = font->getLineHeight();  	S32 dialog_width = max_msg_width + 2 * HPAD;  	S32 dialog_height = line_height * msg_lines.size() + 2 * VPAD; diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h index cc3395115b..184033de42 100644 --- a/indra/newview/llviewercamera.h +++ b/indra/newview/llviewercamera.h @@ -32,8 +32,8 @@  #include "llstat.h"  #include "lltimer.h"  #include "m4math.h" +#include "llcoord.h" -class LLCoordGL;  class LLViewerObject;  // This rotation matrix moves the default OpenGL reference frame  diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 163581ea7f..45ca23cdfe 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -436,11 +436,6 @@ void LLViewerInventoryItem::fetchFromServer(void) const  			gAgent.sendReliableMessage();  		}  	} -	else -	{ -		// *FIX: this can be removed after a bit. -		llwarns << "request to fetch complete item" << llendl; -	}  }  // virtual @@ -1462,6 +1457,7 @@ const std::string& LLViewerInventoryItem::getName() const  class LLFavoritesOrderStorage : public LLSingleton<LLFavoritesOrderStorage>  	, public LLDestroyClass<LLFavoritesOrderStorage>  { +	LOG_CLASS(LLFavoritesOrderStorage);  public:  	/**  	 * Sets sort index for specified with LLUUID favorite landmark @@ -1620,10 +1616,18 @@ void LLFavoritesOrderStorage::load()  void LLFavoritesOrderStorage::saveFavoritesSLURLs()  {  	// Do not change the file if we are not logged in yet. -	if (!LLLoginInstance::getInstance()->authSuccess()) return; +	if (!LLLoginInstance::getInstance()->authSuccess()) +	{ +		llwarns << "Cannot save favorites: not logged in" << llendl; +		return; +	}  	std::string user_dir = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""); -	if (user_dir.empty()) return; +	if (user_dir.empty()) +	{ +		llwarns << "Cannot save favorites: empty user dir name" << llendl; +		return; +	}  	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");  	llifstream in_file; @@ -1649,13 +1653,19 @@ void LLFavoritesOrderStorage::saveFavoritesSLURLs()  		slurls_map_t::iterator slurl_iter = mSLURLs.find(value["asset_id"]);  		if (slurl_iter != mSLURLs.end())  		{ +			lldebugs << "Saving favorite: idx=" << (*it)->getSortField() << ", SLURL=" <<  slurl_iter->second << ", value=" << value << llendl;  			value["slurl"] = slurl_iter->second;  			user_llsd[(*it)->getSortField()] = value;  		} +		else +		{ +			llwarns << "Not saving favorite " << value["name"] << ": no matching SLURL" << llendl; +		}  	}  	LLAvatarName av_name;  	LLAvatarNameCache::get( gAgentID, &av_name ); +	lldebugs << "Saved favorites for " << av_name.getLegacyName() << llendl;  	fav_llsd[av_name.getLegacyName()] = user_llsd;  	llofstream file; @@ -1674,6 +1684,7 @@ void LLFavoritesOrderStorage::removeFavoritesRecordOfUser()  	LLAvatarName av_name;  	LLAvatarNameCache::get( gAgentID, &av_name ); +	lldebugs << "Removed favorites for " << av_name.getLegacyName() << llendl;  	if (fav_llsd.has(av_name.getLegacyName()))  	{  		fav_llsd.erase(av_name.getLegacyName()); @@ -1706,6 +1717,7 @@ void LLFavoritesOrderStorage::onLandmarkLoaded(const LLUUID& asset_id, LLLandmar  void LLFavoritesOrderStorage::storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl)  { +	lldebugs << "Saving landmark SLURL: " << slurl << llendl;  	mSLURLs[asset_id] = slurl;  } diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 046360e9e9..1eb4bedfaf 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -387,7 +387,6 @@ class LLViewerMediaMuteListObserver : public LLMuteListObserver  static LLViewerMediaMuteListObserver sViewerMediaMuteListObserver;  static bool sViewerMediaMuteListObserverInitialized = false; -static bool sInWorldMediaDisabled = false;  ////////////////////////////////////////////////////////////////////////////////////////// @@ -654,20 +653,6 @@ void LLViewerMedia::muteListChanged()  //////////////////////////////////////////////////////////////////////////////////////////  // static -void LLViewerMedia::setInWorldMediaDisabled(bool disabled) -{ -	sInWorldMediaDisabled = disabled; -} - -////////////////////////////////////////////////////////////////////////////////////////// -// static -bool LLViewerMedia::getInWorldMediaDisabled() -{ -	return sInWorldMediaDisabled; -} - -////////////////////////////////////////////////////////////////////////////////////////// -// static  bool LLViewerMedia::isInterestingEnough(const LLVOVolume *object, const F64 &object_interest)  {  	bool result = false; @@ -1568,7 +1553,6 @@ LLPluginClassMedia* LLViewerMedia::getSpareBrowserMediaSource()  bool LLViewerMedia::hasInWorldMedia()  { -	if (sInWorldMediaDisabled) return false;  	impl_list::iterator iter = sViewerMediaImplList.begin();  	impl_list::iterator end = sViewerMediaImplList.end();  	// This should be quick, because there should be very few non-in-world-media impls @@ -1901,7 +1885,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_  		}  	} -	LL_WARNS_ONCE("Plugin") << "plugin intialization failed for mime type: " << media_type << LL_ENDL; +	LL_WARNS_ONCE("Plugin") << "plugin initialization failed for mime type: " << media_type << LL_ENDL;  	LLSD args;  	args["MIME_TYPE"] = media_type;  	LLNotificationsUtil::add("NoPlugin", args); @@ -3107,15 +3091,6 @@ bool LLViewerMediaImpl::isForcedUnloaded() const  		return true;  	} -	if(sInWorldMediaDisabled) -	{ -		// When inworld media is disabled, all instances that aren't marked as "used in UI" will not be loaded. -		if(!mUsedInUI) -		{ -			return true; -		} -	} -	  	// If this media's class is not supposed to be shown, unload  	if (!shouldShowBasedOnClass())  	{ @@ -3783,12 +3758,22 @@ bool LLViewerMediaImpl::shouldShowBasedOnClass() const  	// If it is attached to an avatar and the pref is off, we shouldn't show it  	if (attached_to_another_avatar) -		return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING); -	 +	{ +		static LLCachedControl<bool> show_media_on_others(gSavedSettings, LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING); +		return show_media_on_others; +	}  	if (inside_parcel) -		return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING); +	{ +		static LLCachedControl<bool> show_media_within_parcel(gSavedSettings, LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING); + +		return show_media_within_parcel; +	}  	else  -		return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING); +	{ +		static LLCachedControl<bool> show_media_outside_parcel(gSavedSettings, LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING); + +		return show_media_outside_parcel; +	}  }  ////////////////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 15dcda59cf..fff5b3fc08 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -112,9 +112,6 @@ public:  	static F32 getVolume();	  	static void muteListChanged(); -	static void setInWorldMediaDisabled(bool disabled); -	static bool getInWorldMediaDisabled(); -	  	static bool isInterestingEnough(const LLVOVolume* object, const F64 &object_interest);  	// Returns the priority-sorted list of all media impls. diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 99540ccce9..12aed8f448 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -7281,12 +7281,6 @@ class LLToolsUseSelectionForGrid : public view_listener_t  		} func;  		LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func);  		LLSelectMgr::getInstance()->setGridMode(GRID_MODE_REF_OBJECT); - -		LLFloaterBuildOptions* build_options_floater = LLFloaterReg::getTypedInstance<LLFloaterBuildOptions>("build_options"); -		if (build_options_floater && build_options_floater->getVisible()) -		{ -			build_options_floater->setGridMode(GRID_MODE_REF_OBJECT); -		}  		return true;  	}  }; diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 95e3bc9b89..dc55247df2 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -534,8 +534,22 @@ class LLFileTakeSnapshotToDisk : public view_listener_t  									   FALSE))  		{  			gViewerWindow->playSnapshotAnimAndSound(); -			 -			LLPointer<LLImageFormatted> formatted = new LLImagePNG; +			LLPointer<LLImageFormatted> formatted; +			LLFloaterSnapshot::ESnapshotFormat fmt = (LLFloaterSnapshot::ESnapshotFormat) gSavedSettings.getS32("SnapshotFormat"); +			switch (fmt) +			{ +			case LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG: +				formatted = new LLImageJPEG(gSavedSettings.getS32("SnapshotQuality")); +				break; +			default: +				llwarns << "Unknown local snapshot format: " << fmt << llendl; +			case LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG: +				formatted = new LLImagePNG; +				break; +			case LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP: +				formatted = new LLImageBMP; +				break; +			}  			formatted->enableOverSize() ;  			formatted->encode(raw, 0);  			formatted->disableOverSize() ; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 2a584d6ed7..2917fee62e 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -135,6 +135,7 @@ extern BOOL gDebugClicks;  // function prototypes  bool check_offer_throttle(const std::string& from_name, bool check_only); +bool check_asset_previewable(const LLAssetType::EType asset_type);  static void process_money_balance_reply_extended(LLMessageSystem* msg);  //inventory offer throttle globals @@ -1147,7 +1148,18 @@ bool check_offer_throttle(const std::string& from_name, bool check_only)  		}  	}  } -  + +// Return "true" if we have a preview method for that asset type, "false" otherwise +bool check_asset_previewable(const LLAssetType::EType asset_type) +{ +	return	(asset_type == LLAssetType::AT_NOTECARD)  ||  +			(asset_type == LLAssetType::AT_LANDMARK)  || +			(asset_type == LLAssetType::AT_TEXTURE)   || +			(asset_type == LLAssetType::AT_ANIMATION) || +			(asset_type == LLAssetType::AT_SCRIPT)    || +			(asset_type == LLAssetType::AT_SOUND); +} +  void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_name)  {  	for (uuid_vec_t::const_iterator obj_iter = objects.begin(); @@ -1171,7 +1183,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam  		// Either an inventory item or a category.  		const LLInventoryItem* item = dynamic_cast<const LLInventoryItem*>(obj); -		if (item) +		if (item && check_asset_previewable(asset_type))  		{  			////////////////////////////////////////////////////////////////////////////////  			// Special handling for various types. @@ -1246,6 +1258,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam  						LLFloaterReg::showInstance("preview_sound", LLSD(obj_id), take_focus);  						break;  					default: +						LL_DEBUGS("Messaging") << "No preview method for previewable asset type : " << LLAssetType::lookupHumanReadable(asset_type)  << LL_ENDL;  						break;  				}  			} @@ -2360,8 +2373,15 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;  			bool mute_im = is_muted; -			if(accept_im_from_only_friend&&!is_friend) +			if (accept_im_from_only_friend && !is_friend)  			{ +				if (!gIMMgr->isNonFriendSessionNotified(session_id)) +				{ +					std::string message = LLTrans::getString("IM_unblock_only_groups_friends"); +					gIMMgr->addMessage(session_id, from_id, name, message); +					gIMMgr->addNotifiedNonFriendSessionID(session_id); +				} +  				mute_im = true;  			}  			if (!mute_im || is_linden)  diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h index d8acd99953..46bfb2dad0 100644 --- a/indra/newview/llviewermessage.h +++ b/indra/newview/llviewermessage.h @@ -35,6 +35,7 @@  #include "message.h"  #include "stdenums.h"  #include "llnotifications.h" +#include "llextendedstatus.h"  //  // Forward declarations diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index b41ed00f17..99102309a1 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -187,7 +187,7 @@ public:  		else  		{  			width = EMBEDDED_ITEM_LABEL_PADDING + mImage->getWidth() + mStyle->getFont()->getWidth(mLabel.c_str()); -			height = llmax(mImage->getHeight(), llceil(mStyle->getFont()->getLineHeight())); +			height = llmax(mImage->getHeight(), mStyle->getFont()->getLineHeight());  		}  		return false;  	} diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index e0653fec30..589714c25c 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -27,9 +27,6 @@  #include "llviewerprecompiledheaders.h"  #include "llviewerwindow.h" -#if LL_WINDOWS -#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally -#endif  // system library includes  #include <stdio.h> @@ -49,7 +46,6 @@  #include "llviewquery.h"  #include "llxmltree.h"  #include "llslurl.h" -//#include "llviewercamera.h"  #include "llrender.h"  #include "llvoiceclient.h"	// for push-to-talk button handling @@ -614,7 +610,7 @@ public:  				addText(xpos, ypos, llformat("%d/%d Mesh HTTP Requests/Retries", LLMeshRepository::sHTTPRequestCount,  					LLMeshRepository::sHTTPRetryCount));  				ypos += y_inc; - +				  				addText(xpos, ypos, llformat("%d/%d Mesh LOD Pending/Processing", LLMeshRepository::sLODPending, LLMeshRepository::sLODProcessing));  				ypos += y_inc; @@ -1540,14 +1536,14 @@ LLViewerWindow::LLViewerWindow(const Params& p)  	mResDirty(false),  	mStatesDirty(false),  	mCurrResolutionIndex(0), +	mProgressView(NULL) +{  	// gKeyboard is still NULL, so it doesn't do LLWindowListener any good to  	// pass its value right now. Instead, pass it a nullary function that  	// will, when we later need it, return the value of gKeyboard.  	// boost::lambda::var() constructs such a functor on the fly. -	mWindowListener(new LLWindowListener(this, boost::lambda::var(gKeyboard))), -	mViewerWindowListener(new LLViewerWindowListener(this)), -	mProgressView(NULL) -{ +	mWindowListener.reset(new LLWindowListener(this, boost::lambda::var(gKeyboard))); +	mViewerWindowListener.reset(new LLViewerWindowListener(this));  	LLNotificationChannel::buildChannel("VW_alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert"));  	LLNotificationChannel::buildChannel("VW_alertmodal", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alertmodal")); @@ -1973,12 +1969,12 @@ void LLViewerWindow::shutdownViews()  		gMorphView->setVisible(FALSE);  	}  	llinfos << "Global views cleaned." << llendl ; -	 +  	// DEV-40930: Clear sModalStack. Otherwise, any LLModalDialog left open  	// will crump with LL_ERRS.  	LLModalDialog::shutdownModals();  	llinfos << "LLModalDialog shut down." << llendl;  - +	  	// destroy the nav bar, not currently part of gViewerWindow  	// *TODO: Make LLNavigationBar part of gViewerWindow  	if (LLNavigationBar::instanceExists()) @@ -1986,17 +1982,17 @@ void LLViewerWindow::shutdownViews()  		delete LLNavigationBar::getInstance();  	}  	llinfos << "LLNavigationBar destroyed." << llendl ; -	 +  	// destroy menus after instantiating navbar above, as it needs  	// access to gMenuHolder  	cleanup_menus();  	llinfos << "menus destroyed." << llendl ; -	 +  	// Delete all child views.  	delete mRootView;  	mRootView = NULL;  	llinfos << "RootView deleted." << llendl ; -	 +  	// Automatically deleted as children of mRootView.  Fix the globals.  	gStatusBar = NULL;  	gIMMgr = NULL; @@ -2375,7 +2371,7 @@ void LLViewerWindow::draw()  			gGL.matrixMode(LLRender::MM_MODELVIEW);  			LLUI::pushMatrix(); -			LLUI::translate( (F32) screen_x, (F32) screen_y, 0.f); +			LLUI::translate( (F32) screen_x, (F32) screen_y);  			top_ctrl->draw();	  			LLUI::popMatrix();  		} @@ -3183,12 +3179,6 @@ void LLViewerWindow::updateLayout()  		//gMenuBarView->setItemVisible("BuildTools", gFloaterTools->getVisible());  	} -	LLFloaterBuildOptions* build_options_floater = LLFloaterReg::findTypedInstance<LLFloaterBuildOptions>("build_options"); -	if (build_options_floater && build_options_floater->getVisible()) -	{ -		build_options_floater->updateGridMode(); -	} -  	// Always update console  	if(gConsole)  	{ @@ -4106,14 +4096,11 @@ void LLViewerWindow::resetSnapshotLoc()  void LLViewerWindow::movieSize(S32 new_width, S32 new_height)  {  	LLCoordWindow size; +	LLCoordWindow new_size(new_width, new_height);  	gViewerWindow->getWindow()->getSize(&size); -	if ( size.mX != new_width -		|| size.mY != new_height) +	if ( size != new_size )  	{ -		LLCoordWindow new_size(new_width, new_height); -		LLCoordScreen screen_size; -		gViewerWindow->getWindow()->convertCoords(new_size, &screen_size); -		gViewerWindow->getWindow()->setSize(screen_size); +		gViewerWindow->getWindow()->setSize(new_size.convert());  	}  } diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index e525d6bad0..f063653cc5 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -366,9 +366,9 @@ BOOL LLVOAvatarSelf::buildMenus()  						item_params.label = sub_piemenu_name;  					}  					item_params.name =(item_params.label ); -					item_params.on_click.function_name = "Attachment.Detach"; +					item_params.on_click.function_name = "Attachment.DetachFromPoint";  					item_params.on_click.parameter = iter->first; -					item_params.on_enable.function_name = "Attachment.EnableDetach"; +					item_params.on_enable.function_name = "Attachment.PointFilled";  					item_params.on_enable.parameter = iter->first;  					LLMenuItemCallGL* item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params); diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index fc3ab1a0c0..a3ccf87cfc 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -516,7 +516,7 @@ void LLWorldMapView::draw()  					 TRUE,  					 "You are here",  					 "", -					 llround(LLFontGL::getFontSansSerifSmall()->getLineHeight())); // offset vertically by one line, to avoid overlap with target tracking +					 LLFontGL::getFontSansSerifSmall()->getLineHeight()); // offset vertically by one line, to avoid overlap with target tracking  	}  	// Draw the current agent viewing angle @@ -995,7 +995,7 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&  	const S32 TEXT_PADDING = DEFAULT_TRACKING_ARROW_SIZE + 2;  	S32 half_text_width = llfloor(font->getWidthF32(label) * 0.5f);  	text_x = llclamp(text_x, half_text_width + TEXT_PADDING, getRect().getWidth() - half_text_width - TEXT_PADDING); -	text_y = llclamp(text_y + vert_offset, TEXT_PADDING + vert_offset, getRect().getHeight() - llround(font->getLineHeight()) - TEXT_PADDING - vert_offset); +	text_y = llclamp(text_y + vert_offset, TEXT_PADDING + vert_offset, getRect().getHeight() - font->getLineHeight() - TEXT_PADDING - vert_offset);  	if (label != "")  	{ @@ -1008,7 +1008,7 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&  		if (tooltip != "")  		{ -			text_y -= (S32)font->getLineHeight(); +			text_y -= font->getLineHeight();  			font->renderUTF8(  				tooltip, 0, @@ -1214,7 +1214,7 @@ void LLWorldMapView::drawIconName(F32 x_pixels,  		LLFontGL::NORMAL,   		LLFontGL::DROP_SHADOW); -	text_y -= llround(LLFontGL::getFontSansSerif()->getLineHeight()); +	text_y -= LLFontGL::getFontSansSerif()->getLineHeight();  	// render text  	LLFontGL::getFontSansSerif()->renderUTF8(second_line, 0, diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml index 930bbaa8cb..d11373ce1d 100644 --- a/indra/newview/skins/default/xui/en/floater_aaa.xml +++ b/indra/newview/skins/default/xui/en/floater_aaa.xml @@ -1,6 +1,5 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - legacy_header_height="18"   can_minimize="false"   can_tear_off="false"   can_resize="true" @@ -16,67 +15,98 @@   save_dock_state="true"   save_visibility="true"   single_instance="true"  - width="320"> -  <string name="nudge_parabuild" translate="false">Nudge 1</string> -  <string name="test_the_vlt">This string CHANGE2 is extracted.</string> -  <string name="testing_eli">Just a test. changes.</string> -  <text_editor -   parse_urls="true" -   bg_readonly_color="ChatHistoryBgColor" -   bg_writeable_color="ChatHistoryBgColor"  -   border_visible="false" -   follows="all" -   font="SansSerif"  -	 left="1" -   top="20" -   layout="topleft" -	 height="260" -   name="chat_history" -   max_length="200000"  -   parse_highlights="true" -   text_color="ChatHistoryTextColor" -   text_readonly_color="ChatHistoryTextColor" -   translate="false" -   track_end="true"  -   wrap="true"  -   width="320"> -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    </text_editor> + width="650"> +  <text left="0" +        follows="left|top|bottom" +        top="5" +        clip_partial="true"         +        bottom="-5" +        width="100" +        valign="top"> +this +is +some +text +that +is +top +aligned</text> +  <text left_pad="5" +        follows="left|top|bottom" +        top="5" +        bottom="-5" +        clip_partial="true" +        width="100" +        valign="center"> +this +is +some +text +that +is +center +aligned</text> +  <text left_pad="5" +        follows="left|top|bottom" +        top="5" +        clip_partial="true"         +        bottom="-5" +        width="100" +        valign="bottom"> +this +is +some +text +that +is +bottom +aligned</text> +  <text_editor left_pad="5" +        follows="left|top|bottom" +        top="5" +        clip_partial="true" +        bottom="-5" +        width="100" +        valign="top"> +this +is +some +text +that +is +top +aligned +  </text_editor> +  <text_editor left_pad="5" +        follows="left|top|bottom" +        top="5" +        bottom="-5" +        clip_partial="true" +        width="100" +        valign="center"> +this +is +some +text +that +is +center +aligned +  </text_editor> +  <text_editor left_pad="5" +        follows="left|top|bottom" +        top="5" +        clip_partial="true" +        bottom="-5" +        width="100" +        valign="bottom"> +this +is +some +text +that +is +bottom +aligned +  </text_editor>  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 08f29dc01a..3a6c2678c1 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -192,12 +192,12 @@               type="string"               length="1"               follows="left|top" -             height="20" +             height="18"               layout="topleft"               left_pad="2"               valign="center"                name="ContentRatingText" -             top_delta="0" +             top_delta="-2"               width="250">                  Adult              </text> @@ -209,7 +209,7 @@               layout="topleft"               left="10"               name="Owner:" -             top_pad="1" +             top_pad="3"               width="100">                  Owner:              </text> @@ -736,7 +736,7 @@               height="16"               layout="topleft"               left_pad="10" -             top_delta="-3"  +             top_delta="-1"                mouse_opaque="false"               name="region_maturity_text"               valign="center"  @@ -1951,7 +1951,7 @@ Only large parcels can be listed in search.  			 name="access_estate_defined">  				(Defined by the Estate)  			</panel.string> -            <panel.string +      <panel.string               name="estate_override">                  One or more of these options is set at the estate level              </panel.string> @@ -2085,7 +2085,7 @@ Only large parcels can be listed in search.               column_padding="0"               follows="top|bottom"               heading_height="14" -             height="120" +             height="125"               layout="topleft"               left="0"               multi_select="true" @@ -2134,7 +2134,7 @@ Only large parcels can be listed in search.               column_padding="0"               follows="top|bottom"               heading_height="14" -             height="120" +             height="125"               layout="topleft"               left="0"               multi_select="true" diff --git a/indra/newview/skins/default/xui/en/floater_build_options.xml b/indra/newview/skins/default/xui/en/floater_build_options.xml index 35918e9705..38428b36fc 100644 --- a/indra/newview/skins/default/xui/en/floater_build_options.xml +++ b/indra/newview/skins/default/xui/en/floater_build_options.xml @@ -1,70 +1,13 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater   legacy_header_height="18" - height="198" + height="170"   layout="topleft"   name="build options floater"   help_topic="build_options_floater"   save_rect="true"   title="GRID OPTIONS"   width="264"> - 	<floater.string -     name="grid_screen_text"> -        Screen -    </floater.string> -    <floater.string -     name="grid_local_text"> -        Local -    </floater.string> -    <floater.string -     name="grid_world_text"> -        World -    </floater.string> -    <floater.string -     name="grid_reference_text"> -        Reference -    </floater.string> -    <floater.string -     name="grid_attachment_text"> -        Attachment -    </floater.string> -    <text -     type="string" -     length="1" -     follows="left|top" -     height="16" -     layout="topleft" -     left="10" -     tool_tip="Grid opacity" -     name="grid_mode_label" -     top_pad="30" -     width="123"> -        Mode -    </text> -    <combo_box -     height="23" -     layout="topleft" -     left_pad="9" -     follows="left|top" -     name="combobox grid mode" -     tool_tip="Choose the type of grid ruler for positioning the object" -     top_delta="-3" -     width="108"> -      <combo_box.item -       label="World grid" -       name="World" -       value="World" /> -      <combo_box.item -       label="Local grid" -       name="Local" -       value="Local" /> -      <combo_box.item -       label="Reference grid" -       name="Reference" -       value="Reference" /> -       <combo_box.commit_callback -      function="GridOptions.gridMode"/> -    </combo_box>      <spinner       control_name="GridResolution"       follows="left|top" @@ -77,7 +20,7 @@       max_val="5"       min_val="0.01"       name="GridResolution" -     top_pad="4" +     top_pad="30"       width="200" />      <spinner       control_name="GridDrawSize" diff --git a/indra/newview/skins/default/xui/en/floater_choose_group.xml b/indra/newview/skins/default/xui/en/floater_choose_group.xml index dc1ee5f24e..2cf6e682fd 100644 --- a/indra/newview/skins/default/xui/en/floater_choose_group.xml +++ b/indra/newview/skins/default/xui/en/floater_choose_group.xml @@ -20,7 +20,7 @@          Choose a group:      </text>      <scroll_list -     height="160" +     height="165"       layout="topleft"       left_delta="0"       name="group list" diff --git a/indra/newview/skins/default/xui/en/floater_fast_timers.xml b/indra/newview/skins/default/xui/en/floater_fast_timers.xml index 49aa8f3840..77adb5524e 100644 --- a/indra/newview/skins/default/xui/en/floater_fast_timers.xml +++ b/indra/newview/skins/default/xui/en/floater_fast_timers.xml @@ -22,7 +22,6 @@            top="5"            width="180"            height="40" -          pad_bottom="-5"            label="Pause"            font="SansSerifHuge"/>  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml index 6f387f4800..3d33d19de5 100644 --- a/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml +++ b/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml @@ -99,7 +99,7 @@              halign="center"              font="SansSerifMedium"              font_shadow="hard" -            valign="bottom"> +            valign="top">            Drag items here to create folders          </text>        </panel> @@ -114,8 +114,8 @@            height="20"            wrap="true"            halign="left" -          valign="bottom" -          font="SansSerif" /> +          valign="center" +          font="SansSerif"/>        <button            label="Send to Marketplace"            tool_tip="Push to my Marketplace Storefront" diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index eebc5ddc72..0e211551e6 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -117,18 +117,18 @@               name="lod_tab_border"               top_pad="0"               width="619" /> -            <text -             follows="left|top" -             height="18" -             initial_value="Source" -             layout="topleft" -             left="75" -             name="source" -             text_color="ModelUploaderLabels" -             top="15" -             valign="center" -             value="Source" -             width="335" /> +          <text +           follows="left|top" +           height="18" +           initial_value="Source" +           layout="topleft" +           left="75" +           name="source" +           text_color="ModelUploaderLabels" +           top="15" +           valign="center" +           value="Source" +           width="335"/>              <text               follows="left|top"               halign="right" @@ -163,7 +163,7 @@               name="high_label"               text_color="ModelUploaderLabels"               top_pad="10" -             valign="center" +             valign="top"               value="High"               width="65" />              <combo_box @@ -240,34 +240,34 @@              <text               follows="left|top"               halign="right" -             height="18" +             height="15"               initial_value="0"               layout="topleft"               left_pad="0"               name="high_triangles" -             valign="center" +             valign="top"               value="0"               width="65" />              <text               follows="left|top"               halign="right" -             height="18" +             height="15"               initial_value="0"               layout="topleft"               left_pad="0"               name="high_vertices" -             valign="center" +             valign="top"               value="0"               width="65" />              <text               follows="left|top"               halign="center" -             height="18" +             height="15"               initial_value=""               layout="topleft"               left_pad="0"               name="high_status" -             valign="center" +             valign="top"               value=""               width="65" />              <icon @@ -277,7 +277,7 @@               left_delta="20"               mouse_opaque="true"               name="status_icon_high" -             top_delta="0" +             top_delta="-2"               width="16" />              <text               follows="left|top" @@ -288,7 +288,7 @@               name="medium_label"               text_color="ModelUploaderLabels"               top_pad="15" -             valign="center" +             valign="top"               value="Medium"               width="65" />              <combo_box @@ -368,34 +368,34 @@              <text               follows="left|top"               halign="right" -             height="18" +             height="15"               initial_value="0"               layout="topleft"               left_pad="0"               name="medium_triangles" -             valign="center" +             valign="top"               value="0"               width="65" />              <text               follows="left|top"               halign="right" -             height="18" +             height="15"               initial_value="0"               layout="topleft"               left_pad="0"               name="medium_vertices" -             valign="center" +             valign="top"               value="0"               width="65" />              <text               follows="left|top"               halign="center" -             height="18" +             height="15"               initial_value=""               layout="topleft"               left_pad="0"               name="medium_status" -             valign="center" +             valign="top"               value=""               width="65" />              <icon @@ -405,7 +405,7 @@               left_delta="20"               mouse_opaque="true"               name="status_icon_medium" -             top_delta="0" +             top_delta="-2"               width="16" />              <text               follows="left|top" @@ -416,7 +416,7 @@               name="low_label"               text_color="ModelUploaderLabels"               top_pad="15" -             valign="center" +             valign="top"               value="Low"               width="65" />              <combo_box @@ -496,34 +496,34 @@              <text               follows="left|top"               halign="right" -             height="18" +             height="15"               initial_value="0"               layout="topleft"               left_pad="0"               name="low_triangles" -             valign="center" +             valign="top"               value="0"               width="65" />              <text               follows="left|top"               halign="right" -             height="18" +             height="15"               initial_value="0"               layout="topleft"               left_pad="0"               name="low_vertices" -             valign="center" +             valign="top"               value="0"               width="65" />              <text               follows="left|top"               halign="center" -             height="18" +             height="15"               initial_value=""               layout="topleft"               left_pad="0"               name="low_status" -             valign="center" +             valign="top"               value=""               width="65" />              <icon @@ -533,7 +533,7 @@               left_delta="20"               mouse_opaque="true"               name="status_icon_low" -             top_delta="0" +             top_delta="-2"               width="16" />              <text               follows="left|top" @@ -544,7 +544,7 @@               name="lowest_label"               text_color="ModelUploaderLabels"               top_pad="15" -             valign="center" +             valign="top"               value="Lowest"               width="65" />              <combo_box @@ -624,34 +624,34 @@              <text               follows="left|top"               halign="right" -             height="18" +             height="15"               initial_value="0"               layout="topleft"               left_pad="0"               name="lowest_triangles" -             valign="center" +             valign="top"               value="0"               width="65" />              <text               follows="left|top"               halign="right" -             height="18" +             height="15"               initial_value="0"               layout="topleft"               left_pad="0"               name="lowest_vertices" -             valign="center" +             valign="top"               value="0"               width="65" />              <text               follows="left|top"               halign="center" -             height="18" +             height="15"               initial_value=""               layout="topleft"               left_pad="0"               name="lowest_status" -             valign="center" +             valign="top"               value=""               width="65" />              <icon diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 402868bb97..b2662331b0 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -100,7 +100,7 @@           help_topic="preferences_colors_tab"           name="colors" />          <panel -		 class="panel_preference" +         class="panel_preference_privacy"           filename="panel_preferences_privacy.xml"           label="Privacy"           layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_test_layout_stacks.xml b/indra/newview/skins/default/xui/en/floater_test_layout_stacks.xml index f95f21e63a..a04050e7eb 100644 --- a/indra/newview/skins/default/xui/en/floater_test_layout_stacks.xml +++ b/indra/newview/skins/default/xui/en/floater_test_layout_stacks.xml @@ -32,6 +32,26 @@                    bg_alpha_color="blue"                    height="11"                    min_height="0" +                  visible="false" +                  background_visible="true"> +      <text follows="top|left|right" halign="center" text_color="white">flex</text> +    </layout_panel> +    <layout_panel name="flex" +                  auto_resize="true" +                  user_resize="true" +                  bg_alpha_color="blue" +                  height="11" +                  min_height="0" +                  visible="true" +                  background_visible="true"> +      <text follows="top|left|right" halign="center" text_color="white">flex</text> +    </layout_panel> +    <layout_panel name="flex" +                  auto_resize="true" +                  user_resize="true" +                  bg_alpha_color="blue" +                  height="11" +                  min_height="0"                    background_visible="true">        <text follows="top|left|right" halign="center" text_color="white">flex</text>      </layout_panel> diff --git a/indra/newview/skins/default/xui/en/floater_test_text_vertical_aligment.xml b/indra/newview/skins/default/xui/en/floater_test_text_vertical_aligment.xml new file mode 100644 index 0000000000..d11373ce1d --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_test_text_vertical_aligment.xml @@ -0,0 +1,112 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + can_minimize="false" + can_tear_off="false" + can_resize="true" + can_drag_on_left="false" + can_close="true" + can_dock="true" + bevel_style="in" + height="300" + layout="topleft" + name="Test Floater" + save_rect="true" + title="TEST FLOATER" + save_dock_state="true" + save_visibility="true" + single_instance="true"  + width="650"> +  <text left="0" +        follows="left|top|bottom" +        top="5" +        clip_partial="true"         +        bottom="-5" +        width="100" +        valign="top"> +this +is +some +text +that +is +top +aligned</text> +  <text left_pad="5" +        follows="left|top|bottom" +        top="5" +        bottom="-5" +        clip_partial="true" +        width="100" +        valign="center"> +this +is +some +text +that +is +center +aligned</text> +  <text left_pad="5" +        follows="left|top|bottom" +        top="5" +        clip_partial="true"         +        bottom="-5" +        width="100" +        valign="bottom"> +this +is +some +text +that +is +bottom +aligned</text> +  <text_editor left_pad="5" +        follows="left|top|bottom" +        top="5" +        clip_partial="true" +        bottom="-5" +        width="100" +        valign="top"> +this +is +some +text +that +is +top +aligned +  </text_editor> +  <text_editor left_pad="5" +        follows="left|top|bottom" +        top="5" +        bottom="-5" +        clip_partial="true" +        width="100" +        valign="center"> +this +is +some +text +that +is +center +aligned +  </text_editor> +  <text_editor left_pad="5" +        follows="left|top|bottom" +        top="5" +        clip_partial="true" +        bottom="-5" +        width="100" +        valign="bottom"> +this +is +some +text +that +is +bottom +aligned +  </text_editor> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_test_textbox.xml b/indra/newview/skins/default/xui/en/floater_test_textbox.xml index 2df9bb35fe..1d31fbd6dc 100644 --- a/indra/newview/skins/default/xui/en/floater_test_textbox.xml +++ b/indra/newview/skins/default/xui/en/floater_test_textbox.xml @@ -8,21 +8,7 @@   help_topic="floater_test_textbox"   translate="false"   width="800"> -    <text -     type="string" -     length="1" -     height="90" -     layout="topleft" -     left="10" -     top_pad="30" -     width="300"> -        First line of multiple lines -Second line of multiple lines -Third line of multiple lines -Fourth line of multiple lines -Fifth line of multiple lines -    </text> -  <text + <text      clip_partial="true"      top_pad="10"      left="10" diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index f9147ea650..2d63c94fe1 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -14,7 +14,27 @@   save_visibility="true"   sound_flags="0"   width="295"> -    <floater.string +  <floater.string +     name="grid_screen_text"> +    Screen +  </floater.string> +  <floater.string +   name="grid_local_text"> +    Local +  </floater.string> +  <floater.string +   name="grid_world_text"> +    World +  </floater.string> +  <floater.string +   name="grid_reference_text"> +    Reference +  </floater.string> +  <floater.string +   name="grid_attachment_text"> +    Attachment +  </floater.string> +  <floater.string       name="status_rotate">          Drag colored bands to rotate object      </floater.string> @@ -312,20 +332,48 @@       top_pad="0"       name="checkbox snap to grid"       width="134" /> -    <button -     left_pad="0" -     label="Options..." +    <combo_box +      height="20" +      layout="topleft" +      follows="left|top" +      name="combobox grid mode" +      tool_tip="Choose the type of grid ruler for positioning the object" +      top="83" +      left="195" +      top_pad="0" +      width="60"> +      <combo_box.item +      label="World" +      name="World" +      value="World" /> +      <combo_box.item +      label="Local" +      name="Local" +      value="Local" /> +      <combo_box.item +      label="Reference" +      name="Reference" +      value="Reference" /> +      <combo_box.commit_callback +      function="BuildTool.gridMode"/> +    </combo_box>   +   +  <button +     left="259" +     label="" +     image_selected="ForwardArrow_Press" +     image_unselected="ForwardArrow_Off"       layout="topleft"       follows="top|left"       name="Options..."       tool_tip="See more grid options"       top="83" -     right="-35" -     width="65" -     height="21" > +     width="25" +     height="20" >  	 <button.commit_callback  	     function="BuildTool.gridOptions"/>  	</button> +       <button       follows="left|top"       height="20" diff --git a/indra/newview/skins/default/xui/en/floater_toybox.xml b/indra/newview/skins/default/xui/en/floater_toybox.xml index 72e6187a14..fcaae9d172 100644 --- a/indra/newview/skins/default/xui/en/floater_toybox.xml +++ b/indra/newview/skins/default/xui/en/floater_toybox.xml @@ -18,7 +18,7 @@    <text      follows="left|top"      font="SansSerifMedium" -    valign="bottom" +    valign="top"      halign="left"      height="20"      layout="topleft" @@ -33,7 +33,7 @@    <text      follows="left|top"      font="SansSerifMedium" -    valign="bottom" +    valign="top"      halign="left"      height="20"      layout="topleft" diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml index 880dddce19..bfeb8fc470 100644 --- a/indra/newview/skins/default/xui/en/inspect_object.xml +++ b/indra/newview/skins/default/xui/en/inspect_object.xml @@ -90,6 +90,7 @@ L$30,000     follows="all"     font="SansSerifSmall"     height="13" +   clip="false"     name="object_media_url"     width="207"     left_pad="2" diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml index 2645d472f9..5c5c718bdf 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_header.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml @@ -23,7 +23,7 @@      <text        parse_urls="false"        allow_scroll="false" -      v_pad = "7" +      v_pad = "6"        read_only = "true"        follows="left|right"        font.style="BOLD" @@ -37,7 +37,7 @@        top="0"        translate="false"        use_ellipses="true" -      valign="bottom"  +      valign="top"         value="TestString PleaseIgnore" />    <text      allow_scroll="false" @@ -49,7 +49,7 @@      left_pad="5"      name="time_box"      right="-5" -    top="8" +    top="7"      value="23:30"      width="110" />  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_chat_item.xml b/indra/newview/skins/default/xui/en/panel_chat_item.xml index 6af1105400..1b97de2b05 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_item.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_item.xml @@ -16,13 +16,13 @@          top="3"          width="18" />  	<text_chat -      top="5" +      top="3"        left="30"        height="120"        text_color="white"        word_wrap="true"        mouse_opaque="true" -      valign="bottom" +      valign="top"        name="msg_text">  	</text_chat>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index a7178dc288..eea2606125 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -172,7 +172,7 @@ including the Everyone and Owner Roles.               draw_heading="true"               draw_stripes="false"               heading_height="23" -             height="130" +             height="132"               layout="topleft"               search_column="1"               left="0" diff --git a/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml b/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml index 383e637ace..413e22e444 100644 --- a/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml @@ -1,5 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <inbox_inventory_panel +    accepts_drag_and_drop="false"      name="inventory_inbox"      start_folder="Received Items"      follows="all" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml index d2088594dd..fd6e96b9a7 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -271,7 +271,7 @@                  <text_editor                   bg_readonly_color="DkGray2"                   follows="all" -                 height="70" +                 height="75"                   layout="topleft"                   left="0"                   max_length="127" @@ -288,7 +288,7 @@                   layout="topleft"                   left="0"                   name="folder_label" -                 top_pad="15" +                 top_pad="10"                   value="Landmark location:"                   width="290" />                  <combo_box diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index d6d8b2a83e..1c882bb099 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -80,7 +80,6 @@       top="16"       width="288" />      <recent_inventory_panel -     accepts_drag_and_drop="false"       bg_opaque_color="DkGray2"       bg_alpha_color="DkGray2"       background_visible="true" diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index 4bf420b79f..3edeb9aa36 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -70,7 +70,7 @@             layout="topleft"             auto_resize="true"             user_resize="true" -           min_width="480" +           min_width="410"             name="navigation_layout_panel"             width="480">  	        <panel @@ -148,15 +148,15 @@  	         layout="topleft"             auto_resize="true"             user_resize="true" -           min_width="315" +           min_width="185"             name="favorites_layout_panel" -           width="315"> +           width="320">             <icon               follows="top|left"               height="25"               image_name="ChatBarHandle"               layout="topleft" -             left="-318" +             left="-323"               name="resize_handle"               top="4"               width="5" /> @@ -171,16 +171,17 @@               name="favorite"               image_drag_indication="Accordion_ArrowOpened_Off"               tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!" -             width="311"> +             width="320">              <label               follows="left|top" -             height="15" +             height="13"               layout="topleft"               left="10"               name="favorites_bar_label"               text_color="LtGray"               tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!" -             top="12" +             top="13" +	     valign="bottom"               width="102">                Favorites Bar              </label> diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat.xml index d492f9bd68..d683116eb8 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_chat.xml @@ -1,35 +1,63 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel - height="300"   follows="all" + height="300" + help_topic="nearby_chat"   layout="topleft"   name="nearby_chat" - help_topic="nearby_chat"   width="320"> -            <check_box -             bottom_delta="36" -             control_name="TranslateChat" -             enabled="true" -             height="16" -             label="Translate chat" -             layout="topleft" -             left="5" -             name="translate_chat_checkbox" -             width="230" /> -  <chat_history -    parse_urls="true" -    bg_readonly_color="ChatHistoryBgColor" -    bg_writeable_color="ChatHistoryBgColor" -    follows="all" -    left="5" -    top_delta="17" -    layout="topleft" -    height="260" -    name="chat_history" -    parse_highlights="true" -    text_color="ChatHistoryTextColor" -    text_readonly_color="ChatHistoryTextColor" -    right_widget_pad="5" -    left_widget_pad="0" -    width="315" /> +  <layout_stack +   follows="all" +   height="295" +   layout="topleft" +   left="0" +   name="stack" +   top="5" +   orientation="vertical" +   width="320"> +    <layout_panel +     auto_resize="false" +     height="26" +     layout="topleft" +     left_delta="0" +     name="translate_chat_checkbox_lp" +     top_delta="0" +     visible="true" +     width="313"> +      <check_box +       top="10" +       control_name="TranslateChat" +       enabled="true" +       height="16" +       label="Translate chat" +       layout="topleft" +       left="5" +       name="translate_chat_checkbox" +       width="300" /> +    </layout_panel> +    <layout_panel +     auto_resize="true" +     height="277" +     left_delta="0" +     layout="topleft" +     name="chat_history_lp" +     width="318"> +      <chat_history +       bg_readonly_color="ChatHistoryBgColor" +       bg_writeable_color="ChatHistoryBgColor" +       follows="all" +       layout="topleft" +       left="5" +       left_widget_pad="0" +       height="272" +       name="chat_history" +       parse_highlights="true" +       parse_urls="true" +       right_widget_pad="5" +       text_color="ChatHistoryTextColor" +       text_readonly_color="ChatHistoryTextColor" +       top="0" +       width="313" /> +    </layout_panel> +  </layout_stack>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index 9827180aa7..24882988b0 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -331,7 +331,7 @@     </text>     <radio_group       control_name="LetterKeysFocusChatBar"  -     height="20" +     height="34"       layout="topleft"       left="35"       top_pad="0"  @@ -339,7 +339,7 @@          <radio_item           label="Starts local chat"           name="radio_start_chat" -         top_delta="20"  +         top="0"            layout="topleft"           height="16"            left="0"  @@ -364,7 +364,7 @@       layout="topleft"       left="30"       name="title_afk_text" -     top_pad="15"  +     top_pad="5"        width="190">      	Away timeout:      </text> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 1f92244eb9..b71586aab1 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -63,7 +63,7 @@        layout="topleft"        left_pad="0"        name="mute_chb_label" -      top_delta="0" +      top_delta="-1"        width="150"        wrap="true">        Mute when minimized diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index d453a970e7..22c1139cdb 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -67,7 +67,6 @@       label_shadow="true"       name="buyL"       pad_right="0" -     pad_bottom="2"       tool_tip="Click to buy more L$"       top="0"       width="80" /> @@ -87,7 +86,6 @@       left_pad="0"       label_shadow="true"       name="goShop" -     pad_bottom="2"       tool_tip="Open Second Life Marketplace"       top="0"       width="65" /> diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml index 29aa6d1039..ee790e8dd4 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml @@ -48,7 +48,7 @@                        height="300"                        width="330" />               </layout_panel> -			 <layout_panel +			    <layout_panel                   width="330"                   layout="topleft"                   auto_resize="true" @@ -73,6 +73,7 @@                       <string name="InboxLabelWithArg">Received items ([NUM])</string>                       <string name="InboxLabelNoArg">Received items</string>                       <button +                        control_name="InventoryInboxToggleState"                          label="Received items"  						font="SansSerifMedium"                          name="inbox_btn" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 208f4c2d32..9752652679 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3241,6 +3241,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  	<string name="IM_to_label">To</string>  	<string name="IM_moderator_label">(Moderator)</string>  	<string name="Saved_message">(Saved [LONG_TIMESTAMP])</string> +	<string name="IM_unblock_only_groups_friends">To see this message, you must uncheck 'Only friends and groups can call or IM me' in Preferences/Privacy.</string>  	<!-- voice calls -->  	<string name="answered_call">Your call has been answered</string> diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml index e2baba92a3..2b2c3faf91 100644 --- a/indra/newview/skins/default/xui/en/widgets/button.xml +++ b/indra/newview/skins/default/xui/en/widgets/button.xml @@ -21,7 +21,7 @@          font="SansSerifSmall"          hover_glow_amount="0.15"          halign="center" -        pad_bottom="3"  +        pad_bottom="1"          height="23"          scale_image="true"          handle_right_mouse="true" diff --git a/indra/newview/skins/default/xui/en/widgets/check_box.xml b/indra/newview/skins/default/xui/en/widgets/check_box.xml index cca64fad2a..8947024e45 100644 --- a/indra/newview/skins/default/xui/en/widgets/check_box.xml +++ b/indra/newview/skins/default/xui/en/widgets/check_box.xml @@ -10,7 +10,7 @@                          text_readonly_color="LabelDisabledColor"/>    <check_box.check_button name="CheckboxCtrl Button"                            left="2" -                          bottom="2" +                          bottom="1"                            width="13"                            height="13"                             commit_on_return="false" diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml index 3e2202b20f..0586119681 100644 --- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml +++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml @@ -11,7 +11,7 @@ label_pad_left - padding to the left of tab button labels                 halign="center"                 font="SansSerifSmall"                  tab_height="21" -               label_pad_bottom="2" +               label_pad_bottom="1"                 label_pad_left="4">    <!--    Possible additional attributes for tabs: diff --git a/indra/newview/tests/llworldmipmap_test.cpp b/indra/newview/tests/llworldmipmap_test.cpp index 4c0959d1a9..e7ef017760 100644 --- a/indra/newview/tests/llworldmipmap_test.cpp +++ b/indra/newview/tests/llworldmipmap_test.cpp @@ -100,9 +100,9 @@ namespace tut  	{  		S32 level = mMap->scaleToLevel(0.0);  		ensure("scaleToLevel() test 1 failed", level == LLWorldMipmap::MAP_LEVELS); -		level = mMap->scaleToLevel(LLWorldMipmap::MAP_TILE_SIZE); +		level = mMap->scaleToLevel((F32)LLWorldMipmap::MAP_TILE_SIZE);  		ensure("scaleToLevel() test 2 failed", level == 1); -		level = mMap->scaleToLevel(10 * LLWorldMipmap::MAP_TILE_SIZE); +		level = mMap->scaleToLevel(10.f * LLWorldMipmap::MAP_TILE_SIZE);  		ensure("scaleToLevel() test 3 failed", level == 1);  	}  	// Test 2 : globalToMipmap() diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 0931c4ec9b..9bf755c8f8 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -1047,9 +1047,13 @@ class Linux_i686Manifest(LinuxManifest):              self.path("libuuid.so.16")              self.path("libuuid.so.16.0.22")              self.path("libSDL-1.2.so.0.11.3") +            self.path("libSDL-1.2.so.0")              self.path("libdirectfb-1.4.so.5.0.4") +            self.path("libdirectfb-1.4.so.5")              self.path("libfusion-1.4.so.5.0.4") +            self.path("libfusion-1.4.so.5")              self.path("libdirect-1.4.so.5.0.4") +            self.path("libdirect-1.4.so.5")              self.path("libopenjpeg.so.1.4.0")              self.path("libopenjpeg.so.1")              self.path("libopenjpeg.so") diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp index 1888f191e2..2e18218667 100644 --- a/indra/viewer_components/updater/llupdaterservice.cpp +++ b/indra/viewer_components/updater/llupdaterservice.cpp @@ -447,7 +447,7 @@ void LLUpdaterServiceImpl::restartTimer(unsigned int seconds)  	LL_INFOS("UpdaterService") << "will check for update again in " <<   	seconds << " seconds" << LL_ENDL;   	mTimer.start(); -	mTimer.setTimerExpirySec(seconds); +	mTimer.setTimerExpirySec((F32)seconds);  	LLEventPumps::instance().obtain("mainloop").listen(  		sListenerName, boost::bind(&LLUpdaterServiceImpl::onMainLoop, this, _1));  } | 
