diff options
Diffstat (limited to 'indra/newview')
60 files changed, 1467 insertions, 302 deletions
| diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index cd7c002096..b74530e49a 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -161,6 +161,7 @@ set(viewer_SOURCE_FILES      llfloatercustomize.cpp      llfloaterdaycycle.cpp      llfloaterenvsettings.cpp +    llfloaterevent.cpp      llfloaterfonttest.cpp      llfloatergesture.cpp      llfloatergodtools.cpp @@ -300,7 +301,6 @@ set(viewer_SOURCE_FILES      llpanelclassified.cpp      llpanelcontents.cpp      llpaneleditwearable.cpp -    llpanelevent.cpp      llpanelface.cpp      llpanelgroup.cpp      llpanelgroupgeneral.cpp @@ -661,6 +661,7 @@ set(viewer_HEADER_FILES      llfloatercustomize.h      llfloaterdaycycle.h      llfloaterenvsettings.h +    llfloaterevent.h      llfloaterfonttest.h      llfloatergesture.h      llfloatergodtools.h @@ -795,7 +796,6 @@ set(viewer_HEADER_FILES      llpanelclassified.h      llpanelcontents.h      llpaneleditwearable.h -    llpanelevent.h      llpanelface.h      llpanelgroup.h      llpanelgroupgeneral.h diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 59f61dfdfb..3675be16e9 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -5027,9 +5027,9 @@ void LLAgent::buildFullnameAndTitle(std::string& name) const  	}  } -BOOL LLAgent::isInGroup(const LLUUID& group_id) const +BOOL LLAgent::isInGroup(const LLUUID& group_id, BOOL ignore_god_mode /* FALSE */) const  { -	if (isGodlike()) +	if (!ignore_god_mode && isGodlike())  		return true;  	S32 count = mGroups.count(); diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index beede7fbe3..1573fd7131 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -982,7 +982,7 @@ private:  	//--------------------------------------------------------------------  public:  	// Checks against all groups in the entire agent group list. -	BOOL 			isInGroup(const LLUUID& group_id) const; +	BOOL 			isInGroup(const LLUUID& group_id, BOOL ingnore_God_mod = FALSE) const;  protected:  	// Only used for building titles.  	BOOL			isGroupMember() const 		{ return !mGroupID.isNull(); }  diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 6078620e87..68ee9cd612 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -299,6 +299,10 @@ void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& i  	{  		gAgentWearables.makeNewOutfitDone(mType, mIndex);  	} +	if (mTodo & CALL_WEARITEM) +	{ +		LLAppearanceManager::instance().addCOFItemLink(inv_item, true); +	}  }  void LLAgentWearables::addWearabletoAgentInventoryDone(const S32 type, @@ -510,7 +514,7 @@ void LLAgentWearables::saveWearableAs(const EWearableType type,  			type,  			index,  			new_wearable, -			addWearableToAgentInventoryCallback::CALL_UPDATE); +			addWearableToAgentInventoryCallback::CALL_WEARITEM);  	LLUUID category_id;  	if (save_in_lost_and_found)  	{ @@ -1601,31 +1605,32 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it  		LLWearable* new_wearable = wearables[i];  		LLPointer<LLInventoryItem> new_item = items[i]; -		const EWearableType type = new_wearable->getType(); -		wearables_to_remove[type] = FALSE; - -		// MULTI_WEARABLE: using 0th -		LLWearable* old_wearable = getWearable(type, 0); -		if (old_wearable) +		llassert(new_wearable); +		if (new_wearable)  		{ -			const LLUUID& old_item_id = getWearableItemID(type, 0); -			if ((old_wearable->getAssetID() == new_wearable->getAssetID()) && -				(old_item_id == new_item->getUUID())) -			{ -				lldebugs << "No change to wearable asset and item: " << LLWearableDictionary::getInstance()->getWearableEntry(type) << llendl; -				continue; -			} +			const EWearableType type = new_wearable->getType(); +			wearables_to_remove[type] = FALSE; -			// Assumes existing wearables are not dirty. -			if (old_wearable->isDirty()) +			// MULTI_WEARABLE: using 0th +			LLWearable* old_wearable = getWearable(type, 0); +			if (old_wearable)  			{ -				llassert(0); -				continue; +				const LLUUID& old_item_id = getWearableItemID(type, 0); +				if ((old_wearable->getAssetID() == new_wearable->getAssetID()) && +				    (old_item_id == new_item->getUUID())) +				{ +					lldebugs << "No change to wearable asset and item: " << LLWearableDictionary::getInstance()->getWearableEntry(type) << llendl; +					continue; +				} +				 +				// Assumes existing wearables are not dirty. +				if (old_wearable->isDirty()) +				{ +					llassert(0); +					continue; +				}  			} -		} -		if (new_wearable) -		{  			new_wearable->setItemID(new_item->getUUID());  			setWearable(type,0,new_wearable);  		} @@ -2147,6 +2152,8 @@ void LLAgentWearables::updateServer()  void LLAgentWearables::populateMyOutfitsFolder(void)  {	 +	llinfos << "starting outfit populate" << llendl; +  	LLLibraryOutfitsFetch* outfits = new LLLibraryOutfitsFetch();  	// Get the complete information on the items in the inventory and  diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index b4f58674af..858540a5f5 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -244,7 +244,8 @@ private:  			CALL_UPDATE = 1,  			CALL_RECOVERDONE = 2,  			CALL_CREATESTANDARDDONE = 4, -			CALL_MAKENEWOUTFITDONE = 8 +			CALL_MAKENEWOUTFITDONE = 8, +			CALL_WEARITEM = 16  		};  		// MULTI-WEARABLE: index is an EWearableType - more confusing usage. diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 018e9a92a0..eb4a47664b 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -113,6 +113,8 @@ public:  protected:  	~LLWearInventoryCategoryCallback()  	{ +		llinfos << "done all inventory callbacks" << llendl; +		  		// Is the destructor called by ordinary dereference, or because the app's shutting down?  		// If the inventory callback manager goes away, we're shutting down, no longer want the callback.  		if( LLInventoryCallbackManager::is_instantiated() ) @@ -150,12 +152,15 @@ protected:  void LLOutfitObserver::done()  { +	llinfos << "done 2nd stage fetch" << llendl;  	gInventory.removeObserver(this);  	doOnIdle(boost::bind(&LLOutfitObserver::doWearCategory,this));  }  void LLOutfitObserver::doWearCategory()  { +	llinfos << "starting" << llendl; +	  	// We now have an outfit ready to be copied to agent inventory. Do  	// it, and wear that outfit normally.  	if(mCopyItems) @@ -244,6 +249,8 @@ void LLOutfitFetch::done()  	// What we do here is get the complete information on the items in  	// the library, and set up an observer that will wait for that to  	// happen. +	llinfos << "done first stage fetch" << llendl; +	  	LLInventoryModel::cat_array_t cat_array;  	LLInventoryModel::item_array_t item_array;  	gInventory.collectDescendents(mCompleteFolders.front(), @@ -304,6 +311,8 @@ public:  	virtual ~LLUpdateAppearanceOnDestroy()  	{ +		llinfos << "done update appearance on destroy" << llendl; +  		if (!LLApp::isExiting())  		{  			LLAppearanceManager::instance().updateAppearanceFromCOF(); @@ -312,6 +321,7 @@ public:  	/* virtual */ void fire(const LLUUID& inv_item)  	{ +		llinfos << "callback fired" << llendl;  		mFireCount++;  	}  private: @@ -708,6 +718,8 @@ void LLAppearanceManager::linkAll(const LLUUID& category,  void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)  { +	llinfos << "starting" << llendl; +  	const LLUUID cof = getCOF();  	// Deactivate currently active gestures in the COF, if replacing outfit @@ -765,6 +777,7 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)  	gInventory.notifyObservers();  	// Create links to new COF contents. +	llinfos << "creating LLUpdateAppearanceOnDestroy" << llendl;  	LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;  	linkAll(cof, body_items, link_waiter); @@ -777,6 +790,7 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)  	{  		createBaseOutfitLink(category, link_waiter);  	} +	llinfos << "waiting for LLUpdateAppearanceOnDestroy" << llendl;  }  void LLAppearanceManager::updatePanelOutfitName(const std::string& name) @@ -848,6 +862,8 @@ void LLAppearanceManager::updateAppearanceFromCOF()  {  	// update dirty flag to see if the state of the COF matches  	// the saved outfit stored as a folder link +	llinfos << "starting" << llendl; +  	updateIsDirty();  	dumpCat(getCOF(),"COF, start"); @@ -978,8 +994,9 @@ void LLAppearanceManager::wearInventoryCategory(LLInventoryCategory* category, b  {  	if(!category) return; -	lldebugs << "wearInventoryCategory( " << category->getName() +	llinfos << "wearInventoryCategory( " << category->getName()  			 << " )" << llendl; +  	// What we do here is get the complete information on the items in  	// the inventory, and set up an observer that will wait for that to  	// happen. @@ -1008,7 +1025,8 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca  	// this up front to avoid having to deal with the case of multiple  	// wearables being dirty.  	if(!category) return; -	lldebugs << "wearInventoryCategoryOnAvatar( " << category->getName() + +	llinfos << "wearInventoryCategoryOnAvatar( " << category->getName()  			 << " )" << llendl;  	if( gFloaterCustomize ) @@ -1285,6 +1303,23 @@ void LLAppearanceManager::updateIsDirty()  	}  } +void LLAppearanceManager::onFirstFullyVisible() +{ +	// If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account) +	// then auto-populate outfits from the library into the My Outfits folder. + +	llinfos << "avatar fully visible" << llendl; + +	static bool check_populate_my_outfits = true; +	if (check_populate_my_outfits &&  +		(LLInventoryModel::getIsFirstTimeInViewer2()  +		 || gSavedSettings.getBOOL("MyOutfitsAutofill"))) +	{ +		gAgentWearables.populateMyOutfitsFolder(); +	} +	check_populate_my_outfits = false; +} +  //#define DUMP_CAT_VERBOSE  void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg) diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 5fdff45735..28b51ee0f6 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -113,6 +113,9 @@ public:  	// should only be necessary to do on initial login.  	void updateIsDirty(); +	// Called when self avatar is first fully visible. +	void onFirstFullyVisible(); +	  protected:  	LLAppearanceManager();  	~LLAppearanceManager(); diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index 0aaaa8e705..76e058a1c3 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -304,7 +304,9 @@ void LLCallFloater::updateSession()  	updateAgentModeratorState();  	//show floater for voice calls & only in CONNECTED to voice channel state -	if (!is_local_chat && LLVoiceChannel::STATE_CONNECTED == voice_channel->getState()) +	if (!is_local_chat && +	    voice_channel && +	    LLVoiceChannel::STATE_CONNECTED == voice_channel->getState())  	{  		LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);  		bool show_me = !(im_floater && im_floater->getVisible()); @@ -333,6 +335,7 @@ void LLCallFloater::refreshParticipantList()  	{  		mParticipants = new LLParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT);  		mParticipants->setValidateSpeakerCallback(boost::bind(&LLCallFloater::validateSpeaker, this, _1)); +		mParticipants->setSortOrder(LLParticipantList::E_SORT_BY_RECENT_SPEAKERS);  		if (LLLocalSpeakerMgr::getInstance() == mSpeakerManager)  		{ diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index 996139fccc..c3bda26aac 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -63,6 +63,7 @@  #include "llviewerobjectlist.h"  #include "llviewerwindow.h"  #include "llvoavatar.h" +#include "llavataractions.h"  ///----------------------------------------------------------------------------  /// Local function declarations, constants, enums, and typedefs @@ -711,7 +712,21 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)  		if(notify)  		{  			// Popup a notify box with online status of this agent -			LLNotificationPtr notification = LLNotificationsUtil::add(online ? "FriendOnline" : "FriendOffline", args); +			LLNotificationPtr notification; + +			if (online) +			{ +				notification = +					LLNotificationsUtil::add("FriendOnline", +											 args, +											 LLSD().with("respond_on_mousedown", TRUE), +											 boost::bind(&LLAvatarActions::startIM, agent_id)); +			} +			else +			{ +				notification = +					LLNotificationsUtil::add("FriendOffline", args); +			}  			// If there's an open IM session with this agent, send a notification there too.  			LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, agent_id); diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 7a5d8be84a..9368d9cb7c 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -259,7 +259,9 @@ public:  		mSessionID = chat.mSessionID;  		mSourceType = chat.mSourceType;  		gCacheName->get(mAvatarID, FALSE, boost::bind(&LLChatHistoryHeader::nameUpdatedCallback, this, _1, _2, _3, _4)); -		if(chat.mFromID.isNull()) + +		//*TODO overly defensive thing, source type should be maintained out there +		if(chat.mFromID.isNull() || chat.mFromName == SYSTEM_FROM)  		{  			mSourceType = CHAT_SOURCE_SYSTEM;  		} @@ -269,17 +271,13 @@ public:  		userName->setReadOnlyColor(style_params.readonly_color());  		userName->setColor(style_params.color()); -		if(!chat.mFromName.empty()) -		{ -			userName->setValue(chat.mFromName); -			mFrom = chat.mFromName; -		} -		else +		userName->setValue(chat.mFromName); +		if (chat.mFromName.empty() || CHAT_SOURCE_SYSTEM == mSourceType)  		{ -			std::string SL = LLTrans::getString("SECOND_LIFE"); -			userName->setValue(SL); +			userName->setValue(LLTrans::getString("SECOND_LIFE"));  		} +  		mMinUserNameWidth = style_params.font()->getWidth(userName->getWText().c_str()) + PADDING;  		setTimeField(chat); @@ -289,20 +287,17 @@ public:  		if(mSourceType != CHAT_SOURCE_AGENT)  			icon->setDrawTooltip(false); -		if(!chat.mFromID.isNull()) +		switch (mSourceType)  		{ -			if(mSourceType != CHAT_SOURCE_AGENT) -				icon->setValue(LLSD("OBJECT_Icon")); -			else +			case CHAT_SOURCE_AGENT:  				icon->setValue(chat.mFromID); - -			 -		} -		else if (userName->getValue().asString()==LLTrans::getString("SECOND_LIFE")) -		{ -			icon->setValue(LLSD("SL_Logo")); +				break; +			case CHAT_SOURCE_OBJECT: +				icon->setValue(LLSD("OBJECT_Icon")); +				break; +			case CHAT_SOURCE_SYSTEM: +				icon->setValue(LLSD("SL_Logo"));  		} -  	}  	/*virtual*/ void draw() diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index b006ae3420..ba17c5970e 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -1228,12 +1228,15 @@ T* LLChicletPanel::findChiclet(const LLUUID& im_session_id)  	{  		LLChiclet* chiclet = *it; +		llassert(chiclet); +		if (!chiclet) continue;  		if(chiclet->getSessionId() == im_session_id)  		{  			T* result = dynamic_cast<T*>(chiclet); -			if(!result && chiclet) +			if(!result)  			{  				llwarns << "Found chiclet but of wrong type " << llendl; +				continue;  			}  			return result;  		} diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index c0a3eb1316..80acc71a41 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -182,6 +182,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)  	mAtlasInfop = NULL ;  	mUsingAtlas  = FALSE ; +	mHasMedia = FALSE ;  } @@ -1348,11 +1349,12 @@ const F32 LEAST_IMPORTANCE_FOR_LARGE_IMAGE = 0.3f ;  F32 LLFace::getTextureVirtualSize()  {  	F32 radius; -	F32 cos_angle_to_view_dir; -	mPixelArea = calcPixelArea(cos_angle_to_view_dir, radius); +	F32 cos_angle_to_view_dir;	 +	BOOL in_frustum = calcPixelArea(cos_angle_to_view_dir, radius); -	if (mPixelArea < 0.0001f) +	if (mPixelArea < 0.0001f || !in_frustum)  	{ +		setVirtualSize(0.f) ;  		return 0.f;  	} @@ -1389,30 +1391,36 @@ F32 LLFace::getTextureVirtualSize()  		}  	} +	setVirtualSize(face_area) ; +  	return face_area;  } -F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) +BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)  {  	//get area of circle around face  	LLVector3 center = getPositionAgent();  	LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f;	  	LLViewerCamera* camera = LLViewerCamera::getInstance(); -	//if has media, check if the face is out of the view frustum. -	BOOL has_media = hasMedia() ; -	if(has_media && !camera->AABBInFrustum(center, size))  -	{ -		mImportanceToCamera = 0.f ; -		return 0.f ; -	} -  	F32 size_squared = size.lengthSquared() ;  	LLVector3 lookAt = center - camera->getOrigin(); -	F32 dist = lookAt.normVec() ; -	cos_angle_to_view_dir = lookAt * camera->getXAxis() ;	 -	if(has_media) +	F32 dist = lookAt.normVec() ;	 + +	//get area of circle around node +	F32 app_angle = atanf(fsqrtf(size_squared) / dist); +	radius = app_angle*LLDrawable::sCurPixelAngle; +	mPixelArea = radius*radius * 3.14159f; +	cos_angle_to_view_dir = lookAt * camera->getXAxis() ; + +	//if has media, check if the face is out of the view frustum.	 +	if(hasMedia())  	{ +		if(!camera->AABBInFrustum(center, size))  +		{ +			mImportanceToCamera = 0.f ; +			return false ; +		}  		if(cos_angle_to_view_dir > camera->getCosHalfFov()) //the center is within the view frustum  		{  			cos_angle_to_view_dir = 1.0f ; @@ -1426,11 +1434,6 @@ F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)  		}  	} -	//get area of circle around node -	F32 app_angle = atanf(fsqrtf(size_squared) / dist); -	radius = app_angle*LLDrawable::sCurPixelAngle; -	F32 face_area = radius*radius * 3.14159f; -  	if(dist < mBoundingSphereRadius) //camera is very close  	{  		cos_angle_to_view_dir = 1.0f ; @@ -1441,7 +1444,7 @@ F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)  		mImportanceToCamera = LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist) ;  	} -	return face_area ; +	return true ;  }  //the projection of the face partially overlaps with the screen diff --git a/indra/newview/llface.h b/indra/newview/llface.h index bf658dc00c..67dd97e6f7 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -211,7 +211,7 @@ public:  private:	  	F32         adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius ); -	F32         calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ; +	BOOL        calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ;  public:  	static F32  calcImportanceToCamera(F32 to_view_dir, F32 dist); diff --git a/indra/newview/llfloaterevent.cpp b/indra/newview/llfloaterevent.cpp new file mode 100644 index 0000000000..64efa10ef9 --- /dev/null +++ b/indra/newview/llfloaterevent.cpp @@ -0,0 +1,324 @@ +/**  + * @file llfloaterevent.cpp + * @brief Display for events in the finder + * + * $LicenseInfo:firstyear=2004&license=viewergpl$ + *  + * Copyright (c) 2004-2009, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloaterevent.h" + +#include "message.h" +#include "llnotificationsutil.h" +#include "llui.h" + +#include "llagent.h" +#include "llviewerwindow.h" +#include "llbutton.h" +#include "llcachename.h" +#include "llcommandhandler.h"	// secondlife:///app/chat/ support +#include "lleventflags.h" +#include "lleventnotifier.h" +#include "llexpandabletextbox.h" +#include "llfloater.h" +#include "llfloaterreg.h" +#include "llfloaterworldmap.h" +#include "llinventorymodel.h" +#include "llsecondlifeurls.h" +#include "llslurl.h" +#include "lltextbox.h" +#include "lltexteditor.h" +#include "lluiconstants.h" +#include "llviewercontrol.h" +#include "llweb.h" +#include "llworldmap.h" +#include "lluictrlfactory.h" +#include "lltrans.h" + + +class LLEventHandler : public LLCommandHandler +{ +public: +	// requires trusted browser to trigger +	LLEventHandler() : LLCommandHandler("event", UNTRUSTED_THROTTLE) { } +	bool handle(const LLSD& params, const LLSD& query_map, +				LLMediaCtrl* web) +	{ +		if (params.size() < 1) +		{ +			return false; +		} +		 +		LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event"); +		if (floater) +		{ +			floater->setEventID(params[0].asInteger()); +			LLFloaterReg::showTypedInstance<LLFloaterEvent>("event"); +			return true; +		} + +		return false; +	} +}; +LLEventHandler gEventHandler; + +LLFloaterEvent::LLFloaterEvent(const LLSD& key) +	: LLFloater(key), + +	  mEventID(0) +{ +} + + +LLFloaterEvent::~LLFloaterEvent() +{ +} + + +BOOL LLFloaterEvent::postBuild() +{ +	mTBName = getChild<LLTextBox>("event_name"); + +	mTBCategory = getChild<LLTextBox>("event_category"); +	 +	mTBDate = getChild<LLTextBox>("event_date"); + +	mTBDuration = getChild<LLTextBox>("event_duration"); + +	mTBDesc = getChild<LLExpandableTextBox>("event_desc"); +	mTBDesc->setEnabled(FALSE); + +	mTBRunBy = getChild<LLTextBox>("event_runby"); +	mTBLocation = getChild<LLTextBox>("event_location"); +	mTBCover = getChild<LLTextBox>("event_cover"); + +	mTeleportBtn = getChild<LLButton>( "teleport_btn"); +	mTeleportBtn->setClickedCallback(onClickTeleport, this); + +	mMapBtn = getChild<LLButton>( "map_btn"); +	mMapBtn->setClickedCallback(onClickMap, this); + +	mNotifyBtn = getChild<LLButton>( "notify_btn"); +	mNotifyBtn->setClickedCallback(onClickNotify, this); + +	mCreateEventBtn = getChild<LLButton>( "create_event_btn"); +	mCreateEventBtn->setClickedCallback(onClickCreateEvent, this); + +	mGodDeleteEventBtn = getChild<LLButton>( "god_delete_event_btn"); +	mGodDeleteEventBtn->setClickedCallback(boost::bind(&LLFloaterEvent::onClickDeleteEvent, this)); + +	return TRUE; +} + +void LLFloaterEvent::setEventID(const U32 event_id) +{ +	mEventID = event_id; +	// Should reset all of the panel state here +	resetInfo(); + +	if (event_id != 0) +	{ +		sendEventInfoRequest(); +	} +} + +void LLFloaterEvent::onClickDeleteEvent() +{ +	LLMessageSystem* msg = gMessageSystem; + +	msg->newMessageFast(_PREHASH_EventGodDelete); +	msg->nextBlockFast(_PREHASH_AgentData); +	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + +	msg->nextBlockFast(_PREHASH_EventData); +	msg->addU32Fast(_PREHASH_EventID, mEventID); + +	gAgent.sendReliableMessage(); +} + +void LLFloaterEvent::sendEventInfoRequest() +{ +	LLMessageSystem *msg = gMessageSystem; + +	msg->newMessageFast(_PREHASH_EventInfoRequest); +	msg->nextBlockFast(_PREHASH_AgentData); +	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); +	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); +	msg->nextBlockFast(_PREHASH_EventData); +	msg->addU32Fast(_PREHASH_EventID, mEventID); +	gAgent.sendReliableMessage(); +} + +//static  +void LLFloaterEvent::processEventInfoReply(LLMessageSystem *msg, void **) +{ +	// extract the agent id +	LLUUID agent_id; +	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); + +	LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event"); +	 +	if(floater) +	{ +		floater->mEventInfo.unpack(msg); +		floater->mTBName->setText(floater->mEventInfo.mName); +		floater->mTBCategory->setText(floater->mEventInfo.mCategoryStr); +		floater->mTBDate->setText(floater->mEventInfo.mTimeStr); +		floater->mTBDesc->setText(floater->mEventInfo.mDesc); +		floater->mTBRunBy->setText(LLSLURL::buildCommand("agent", floater->mEventInfo.mRunByID, "inspect")); + +		floater->mTBDuration->setText(llformat("%d:%.2d", floater->mEventInfo.mDuration / 60, floater->mEventInfo.mDuration % 60)); + +		if (!floater->mEventInfo.mHasCover) +		{ +			floater->mTBCover->setText(floater->getString("none")); +		} +		else +		{ +			floater->mTBCover->setText(llformat("%d", floater->mEventInfo.mCover)); +		} + +		F32 global_x = (F32)floater->mEventInfo.mPosGlobal.mdV[VX]; +		F32 global_y = (F32)floater->mEventInfo.mPosGlobal.mdV[VY]; + +		S32 region_x = llround(global_x) % REGION_WIDTH_UNITS; +		S32 region_y = llround(global_y) % REGION_WIDTH_UNITS; +		S32 region_z = llround((F32)floater->mEventInfo.mPosGlobal.mdV[VZ]); + +		std::string desc = floater->mEventInfo.mSimName + llformat(" (%d, %d, %d)", region_x, region_y, region_z); +		floater->mTBLocation->setText(desc); + +		if (floater->mEventInfo.mEventFlags & EVENT_FLAG_MATURE) +		{ +			floater->childSetVisible("event_mature_yes", TRUE); +			floater->childSetVisible("event_mature_no", FALSE); +		} +		else +		{ +			floater->childSetVisible("event_mature_yes", FALSE); +			floater->childSetVisible("event_mature_no", TRUE); +		} + +		if (floater->mEventInfo.mUnixTime < time_corrected()) +		{ +			floater->mNotifyBtn->setEnabled(FALSE); +		} +		else +		{ +			floater->mNotifyBtn->setEnabled(TRUE); +		} + +		if (gEventNotifier.hasNotification(floater->mEventInfo.mID)) +		{ +			floater->mNotifyBtn->setLabel(floater->getString("dont_notify")); +		} +		else +		{ +			floater->mNotifyBtn->setLabel(floater->getString("notify")); +		} +	 +		floater->mMapBtn->setEnabled(TRUE); +		floater->mTeleportBtn->setEnabled(TRUE); +	} +} + + +void LLFloaterEvent::draw() +{ +	mGodDeleteEventBtn->setVisible(gAgent.isGodlike()); + +	LLPanel::draw(); +} + +void LLFloaterEvent::resetInfo() +{ +	mTBName->setText(LLStringUtil::null); +	mTBCategory->setText(LLStringUtil::null); +	mTBDate->setText(LLStringUtil::null); +	mTBDesc->setText(LLStringUtil::null); +	mTBDuration->setText(LLStringUtil::null); +	mTBCover->setText(LLStringUtil::null); +	mTBLocation->setText(LLStringUtil::null); +	mTBRunBy->setText(LLStringUtil::null); +	mNotifyBtn->setEnabled(FALSE); +	mMapBtn->setEnabled(FALSE); +	mTeleportBtn->setEnabled(FALSE); +} + +// static +void LLFloaterEvent::onClickTeleport(void* data) +{ +	LLFloaterEvent* self = (LLFloaterEvent*)data; +	LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); +	if (!self->mEventInfo.mPosGlobal.isExactlyZero()&&worldmap_instance) +	{ +		gAgent.teleportViaLocation(self->mEventInfo.mPosGlobal); +		worldmap_instance->trackLocation(self->mEventInfo.mPosGlobal); +	} +} + + +// static +void LLFloaterEvent::onClickMap(void* data) +{ +	LLFloaterEvent* self = (LLFloaterEvent*)data; +	LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); + +	if (!self->mEventInfo.mPosGlobal.isExactlyZero()&&worldmap_instance) +	{ +		worldmap_instance->trackLocation(self->mEventInfo.mPosGlobal); +		LLFloaterReg::showInstance("world_map", "center"); +	} +} + + +// static +void LLFloaterEvent::onClickCreateEvent(void* data) +{ +	LLNotificationsUtil::add("PromptGoToEventsPage");//, LLSD(), LLSD(), callbackCreateEventWebPage);  +} + + +// static +void LLFloaterEvent::onClickNotify(void *data) +{ +	LLFloaterEvent* self = (LLFloaterEvent*)data; + +	if (!gEventNotifier.hasNotification(self->mEventID)) +	{ +		gEventNotifier.add(self->mEventInfo); +		self->mNotifyBtn->setLabel(self->getString("dont_notify")); +	} +	else +	{ +		gEventNotifier.remove(self->mEventInfo.mID); +		self->mNotifyBtn->setLabel(self->getString("notify")); +	} +} diff --git a/indra/newview/llfloaterevent.h b/indra/newview/llfloaterevent.h new file mode 100644 index 0000000000..54aaaf6a0f --- /dev/null +++ b/indra/newview/llfloaterevent.h @@ -0,0 +1,96 @@ +/**  + * @file llfloaterevent.h + * @brief Display for events in the finder + * + * $LicenseInfo:firstyear=2004&license=viewergpl$ + *  + * Copyright (c) 2004-2009, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLFLOATEREVENT_H +#define LL_LLFLOATEREVENT_H + +#include "llfloater.h" +#include "lleventinfo.h" +#include "lluuid.h" +#include "v3dmath.h" + +class LLTextBox; +class LLTextEditor; +class LLButton; +class LLExpandableTextBox; +class LLMessageSystem; + +class LLFloaterEvent : public LLFloater +{ +public: +	LLFloaterEvent(const LLSD& key); +	/*virtual*/ ~LLFloaterEvent(); + +	/*virtual*/ BOOL postBuild(); +	/*virtual*/ void draw(); + +	void setEventID(const U32 event_id); +	void sendEventInfoRequest(); + +	static void processEventInfoReply(LLMessageSystem *msg, void **); + +	U32 getEventID() { return mEventID; } + +protected: +	void resetInfo(); + +	static void onClickTeleport(void*); +	static void onClickMap(void*); +	//static void onClickLandmark(void*); +	static void onClickCreateEvent(void*); +	static void onClickNotify(void*); +	void onClickDeleteEvent(); + +//	static bool callbackCreateEventWebPage(const LLSD& notification, const LLSD& response); + +protected: +	U32				mEventID; +	LLEventInfo		mEventInfo; + +	LLTextBox*		mTBName; +	LLTextBox*		mTBCategory; +	LLTextBox*		mTBDate; +	LLTextBox*		mTBDuration; +	LLExpandableTextBox*	mTBDesc; + +	LLTextBox*		mTBRunBy; +	LLTextBox*		mTBLocation; +	LLTextBox*		mTBCover; + +	LLButton*		mTeleportBtn; +	LLButton*		mMapBtn; +	LLButton*		mCreateEventBtn; +	LLButton*		mGodDeleteEventBtn; +	LLButton*		mNotifyBtn; +}; + +#endif // LL_LLFLOATEREVENT_H diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index 90617a337a..9c1ac2631d 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -203,12 +203,12 @@ BOOL LLFloaterGesture::postBuild()  	gInventory.addObserver(this);  	fetchDescendents(folders); -	buildGestureList(); -	 -	mGestureList->setFocus(TRUE); -  	if (mGestureList)  	{ +		buildGestureList(); +	 +		mGestureList->setFocus(TRUE); +  		const BOOL ascending = TRUE;  		mGestureList->sortByColumn(std::string("name"), ascending);  		mGestureList->selectFirstItem(); @@ -223,10 +223,10 @@ BOOL LLFloaterGesture::postBuild()  void LLFloaterGesture::refreshAll()  { -	buildGestureList(); -  	if (!mGestureList) return; +	buildGestureList(); +  	if (mSelectedID.isNull())  	{  		mGestureList->selectFirstItem(); diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp index c930e99bad..8ab050beaa 100644 --- a/indra/newview/llfloatertopobjects.cpp +++ b/indra/newview/llfloatertopobjects.cpp @@ -283,8 +283,13 @@ void LLFloaterTopObjects::updateSelectionInfo()  	std::string object_id_string = object_id.asString();  	childSetValue("id_editor", LLSD(object_id_string)); -	childSetValue("object_name_editor", list->getFirstSelected()->getColumn(1)->getValue().asString()); -	childSetValue("owner_name_editor", list->getFirstSelected()->getColumn(2)->getValue().asString()); +	LLScrollListItem* sli = list->getFirstSelected(); +	llassert(sli); +	if (sli) +	{ +		childSetValue("object_name_editor", sli->getColumn(1)->getValue().asString()); +		childSetValue("owner_name_editor", sli->getColumn(2)->getValue().asString()); +	}  }  // static diff --git a/indra/newview/llfloaterwater.cpp b/indra/newview/llfloaterwater.cpp index 66a1f6701f..1bbee2625c 100644 --- a/indra/newview/llfloaterwater.cpp +++ b/indra/newview/llfloaterwater.cpp @@ -574,12 +574,10 @@ bool LLFloaterWater::deleteAlertCallback(const LLSD& notification, const LLSD& r  		LLComboBox* combo_box = getChild<LLComboBox>("WaterPresetsCombo");  		LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");  		LLComboBox* key_combo = NULL; -		LLMultiSliderCtrl* mult_sldr = NULL;  		if (day_cycle)   		{  			key_combo = day_cycle->getChild<LLComboBox>("WaterKeyPresets"); -			mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WaterDayCycleKeys");  		}  		std::string name = combo_box->getSelectedValue().asString(); diff --git a/indra/newview/llfloaterwindlight.cpp b/indra/newview/llfloaterwindlight.cpp index ea6fda7303..c1b15c578c 100644 --- a/indra/newview/llfloaterwindlight.cpp +++ b/indra/newview/llfloaterwindlight.cpp @@ -749,12 +749,10 @@ bool LLFloaterWindLight::deleteAlertCallback(const LLSD& notification, const LLS  		LLComboBox* combo_box = getChild<LLComboBox>("WLPresetsCombo");  		LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");  		LLComboBox* key_combo = NULL; -		LLMultiSliderCtrl* mult_sldr = NULL;  		if (day_cycle)   		{  			key_combo = day_cycle->getChild<LLComboBox>("WLKeyPresets"); -			mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WLDayCycleKeys");  		}  		std::string name(combo_box->getSelectedValue().asString()); diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 3946224c0c..76607e4874 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -1855,10 +1855,9 @@ EInventorySortGroup LLFolderViewFolder::getSortGroup() const  		return SG_TRASH_FOLDER;  	} -	// Folders that can't be moved are 'system' folders.   	if( mListener )  	{ -		if( !(mListener->isItemMovable()) ) +		if(LLFolderType::lookupIsProtectedType(mListener->getPreferredType()))  		{  			return SG_SYSTEM_FOLDER;  		} diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 53cdfcc9b2..94b540a7e1 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -271,6 +271,7 @@ BOOL LLIMFloater::postBuild()  	mInputEditor->setCommitOnFocusLost( FALSE );  	mInputEditor->setRevertOnEsc( FALSE );  	mInputEditor->setReplaceNewlinesWithSpaces( FALSE ); +	mInputEditor->setPassDelete( TRUE );  	std::string session_name(LLIMModel::instance().getName(mSessionID)); diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index 7162386d08..49521b5987 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -93,7 +93,7 @@ void LLIMFloaterContainer::addFloater(LLFloater* floaterp,  	LLIconCtrl* icon = 0; -	if(gAgent.isInGroup(session_id)) +	if(gAgent.isInGroup(session_id, TRUE))  	{  		LLGroupIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLGroupIconCtrl>();  		icon_params.group_id = session_id; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index da95eaefca..ec2be0e8e9 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2434,7 +2434,10 @@ void LLFolderBridge::pasteFromClipboard()  					//we have to update inventory locally too  					LLViewerInventoryItem* viitem = dynamic_cast<LLViewerInventoryItem*>(item);  					llassert(viitem); -					changeItemParent(model, viitem, parent_id, FALSE); +					if (viitem) +					{ +						changeItemParent(model, viitem, parent_id, FALSE); +					}  				}  				else  				{ @@ -5093,12 +5096,18 @@ void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type,  //static  void LLInvFVBridgeAction::doAction(const LLUUID& uuid, LLInventoryModel* model)  { -	LLAssetType::EType asset_type = model->getItem(uuid)->getType(); -	LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); -	if(action) +	llassert(model); +	LLViewerInventoryItem* item = model->getItem(uuid); +	llassert(item); +	if (item)  	{ -		action->doIt(); -		delete action; +		LLAssetType::EType asset_type = item->getType(); +		LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); +		if(action) +		{ +			action->doIt(); +			delete action; +		}  	}  } diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 7ec976604a..326f2a5577 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1937,23 +1937,26 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item)  {  	//llinfos << "LLInventoryModel::addItem()" << llendl; -	// This can happen if assettype enums from llassettype.h ever change. -	// For example, there is a known backwards compatibility issue in some viewer prototypes prior to when  -	// the AT_LINK enum changed from 23 to 24. -	if ((item->getType() == LLAssetType::AT_NONE) -		|| LLAssetType::lookup(item->getType()) == LLAssetType::badLookup()) -	{ -		llwarns << "Got bad asset type for item [ name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ], ignoring." << llendl; -		return; -	} +	llassert(item);  	if(item)  	{ +		// This can happen if assettype enums from llassettype.h ever change. +		// For example, there is a known backwards compatibility issue in some viewer prototypes prior to when  +		// the AT_LINK enum changed from 23 to 24. +		if ((item->getType() == LLAssetType::AT_NONE) +		    || LLAssetType::lookup(item->getType()) == LLAssetType::badLookup()) +		{ +			llwarns << "Got bad asset type for item [ name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ], ignoring." << llendl; +			return; +		} +  		// This condition means that we tried to add a link without the baseobj being in memory.  		// The item will show up as a broken link.  		if (item->getIsBrokenLink())  		{  			llinfos << "Adding broken link [ name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " )  parent: " << item->getParentUUID() << llendl;  		} +  		mItemMap[item->getUUID()] = item;  	}  } diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp index 52de8355e9..60e41b64ac 100644 --- a/indra/newview/llnotificationalerthandler.cpp +++ b/indra/newview/llnotificationalerthandler.cpp @@ -36,6 +36,7 @@  #include "llnotificationhandler.h"  #include "llnotifications.h" +#include "llprogressview.h"  #include "lltoastnotifypanel.h"  #include "llviewercontrol.h"  #include "llviewerwindow.h" @@ -116,6 +117,11 @@ bool LLAlertHandler::processNotification(const LLSD& notify)  		p.is_modal = mIsModal;  		p.on_delete_toast = boost::bind(&LLAlertHandler::onDeleteToast, this, _1); +		// Show alert in middle of progress view (during teleport) (EXT-1093) +		LLProgressView* progress = gViewerWindow->getProgressView(); +		LLRect rc = progress && progress->getVisible() ? progress->getRect() : gViewerWindow->getWorldViewRectScaled(); +		mChannel->updatePositionAndSize(rc, rc); +  		LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);  		if(channel)  			channel->addToast(p); diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 8c5208678e..b50c6442e1 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -265,10 +265,13 @@ void LLPanelFace::sendAlpha()  void LLPanelFace::sendGlow()  { -	LLSpinCtrl*	mCtrlGlow = getChild<LLSpinCtrl>("glow"); -	F32 glow = mCtrlGlow->get(); - -	LLSelectMgr::getInstance()->selectionSetGlow( glow ); +	LLSpinCtrl* mCtrlGlow = getChild<LLSpinCtrl>("glow"); +	llassert(mCtrlGlow); +	if (mCtrlGlow) +	{ +		F32 glow = mCtrlGlow->get(); +		LLSelectMgr::getInstance()->selectionSetGlow( glow ); +	}  }  struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor @@ -286,6 +289,9 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor  		LLCheckBoxCtrl*	checkFlipScaleS = mPanel->getChild<LLCheckBoxCtrl>("checkbox flip s");  		LLCheckBoxCtrl*	checkFlipScaleT = mPanel->getChild<LLCheckBoxCtrl>("checkbox flip t");  		LLComboBox*		comboTexGen = mPanel->getChild<LLComboBox>("combobox texgen"); +		llassert(comboTexGen); +		llassert(object); +  		if (ctrlTexScaleS)  		{  			valid = !ctrlTexScaleS->getTentative() || !checkFlipScaleS->getTentative(); @@ -296,7 +302,8 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor  				{  					value = -value;  				} -				if (comboTexGen->getCurrentIndex() == 1) +				if (comboTexGen && +				    comboTexGen->getCurrentIndex() == 1)  				{  					value *= 0.5f;  				} @@ -314,7 +321,8 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor  				{  					value = -value;  				} -				if (comboTexGen->getCurrentIndex() == 1) +				if (comboTexGen && +				    comboTexGen->getCurrentIndex() == 1)  				{  					value *= 0.5f;  				} diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index 06a682c905..05261a65de 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -36,6 +36,7 @@  #include "llagent.h"  #include "llfloateravatarpicker.h"  #include "llbutton.h" +#include "llcallingcard.h"  #include "llcombobox.h"  #include "llgroupactions.h"  #include "llgroupmgr.h" @@ -405,16 +406,13 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)  	{  		LLUUID agent_id = agent_ids[i];  		LLViewerObject* dest = gObjectList.findObject(agent_id); +		std::string fullname;  		if(dest && dest->isAvatar())  		{ -			std::string fullname; -			LLSD args;  			LLNameValue* nvfirst = dest->getNVPair("FirstName");  			LLNameValue* nvlast = dest->getNVPair("LastName");  			if(nvfirst && nvlast)  			{ -				args["FIRST"] = std::string(nvfirst->getString()); -				args["LAST"] = std::string(nvlast->getString());  				fullname = std::string(nvfirst->getString()) + " " + std::string(nvlast->getString());  			}  			if (!fullname.empty()) @@ -427,10 +425,44 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)  				names.push_back("(Unknown)");  			}  		} +		else +		{ +			//looks like user try to invite offline friend +			//for offline avatar_id gObjectList.findObject() will return null +			//so we need to do this additional search in avatar tracker, see EXT-4732 +			if (LLAvatarTracker::instance().isBuddy(agent_id)) +			{ +				if (!gCacheName->getFullName(agent_id, fullname)) +				{ +					// actually it should happen, just in case +					gCacheName->get(LLUUID(agent_id), false, boost::bind( +							&LLPanelGroupInvite::addUserCallback, this, _1, _2, +							_3)); +					// for this special case! +					//when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence +					// removed id will be added in callback +					agent_ids.erase(agent_ids.begin() + i); +				} +				else +				{ +					names.push_back(fullname); +				} +			} +		}  	}  	mImplementation->addUsers(names, agent_ids);  } +void LLPanelGroupInvite::addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name) +{ +	std::vector<std::string> names; +	std::vector<LLUUID> agent_ids; +	std::string full_name = first_name + " " + last_name; +	agent_ids.push_back(id); +	names.push_back(first_name + " " + last_name); + +	mImplementation->addUsers(names, agent_ids); +}  void LLPanelGroupInvite::draw()  {  	LLPanel::draw(); diff --git a/indra/newview/llpanelgroupinvite.h b/indra/newview/llpanelgroupinvite.h index 37135b488a..b095dd2395 100644 --- a/indra/newview/llpanelgroupinvite.h +++ b/indra/newview/llpanelgroupinvite.h @@ -43,6 +43,10 @@ public:  	~LLPanelGroupInvite();  	void addUsers(std::vector<LLUUID>& agent_ids); +	/** +	 * this callback is being used to add a user whose fullname isn't been loaded before invoking of addUsers(). +	 */   +	void addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name);  	void clear();  	void update(); diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index cd6c727b5c..56d52ccc65 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -376,21 +376,31 @@ void LLPanelLandmarkInfo::createLandmark(const LLUUID& folder_id)  // static  std::string LLPanelLandmarkInfo::getFullFolderName(const LLViewerInventoryCategory* cat)  { -	std::string name = cat->getName(); +	std::string name;  	LLUUID parent_id; -	// translate category name, if it's right below the root -	// FIXME: it can throw notification about non existent string in strings.xml -	if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID()) +	llassert(cat); +	if (cat)  	{ -		LLTrans::findString(name, "InvFolder " + name); -	} +		name = cat->getName(); -	// we don't want "My Inventory" to appear in the name -	while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID()) -	{ -		cat = gInventory.getCategory(parent_id); -		name = cat->getName() + "/" + name; +		// translate category name, if it's right below the root +		// FIXME: it can throw notification about non existent string in strings.xml +		if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID()) +		{ +			LLTrans::findString(name, "InvFolder " + name); +		} + +		// we don't want "My Inventory" to appear in the name +		while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID()) +		{ +			cat = gInventory.getCategory(parent_id); +			llassert(cat); +			if (cat) +			{ +				name = cat->getName() + "/" + name; +			} +		}  	}  	return name; diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index f1cb6e87a3..40ea75ea7a 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -111,25 +111,76 @@ void LLCheckFolderState::doFolder(LLFolderViewFolder* folder)  	}  } +// Functor searching and opening a folder specified by UUID +// in a folder view tree. +class LLOpenFolderByID : public LLFolderViewFunctor +{ +public: +	LLOpenFolderByID(const LLUUID& folder_id) +	:	mFolderID(folder_id) +	,	mIsFolderOpen(false) +	{} +	virtual ~LLOpenFolderByID() {} +	/*virtual*/ void doFolder(LLFolderViewFolder* folder); +	/*virtual*/ void doItem(LLFolderViewItem* item) {} + +	bool isFolderOpen() { return mIsFolderOpen; } + +private: +	bool	mIsFolderOpen; +	LLUUID	mFolderID; +}; + +// virtual +void LLOpenFolderByID::doFolder(LLFolderViewFolder* folder) +{ +	if (folder->getListener() && folder->getListener()->getUUID() == mFolderID) +	{ +		if (!folder->isOpen()) +		{ +			folder->setOpen(TRUE); +			mIsFolderOpen = true; +		} +	} +} +  /**   * Bridge to support knowing when the inventory has changed to update Landmarks tab   * ShowFolderState filter setting to show all folders when the filter string is empty and   * empty folder message when Landmarks inventory category has no children. + * Ensures that "Landmarks" folder in the Library is open on strart up.   */  class LLLandmarksPanelObserver : public LLInventoryObserver  {  public: -	LLLandmarksPanelObserver(LLLandmarksPanel* lp) : mLP(lp) {} +	LLLandmarksPanelObserver(LLLandmarksPanel* lp) +	:	mLP(lp), +	 	mIsLibraryLandmarksOpen(false) +	{}  	virtual ~LLLandmarksPanelObserver() {}  	/*virtual*/ void changed(U32 mask);  private:  	LLLandmarksPanel* mLP; +	bool mIsLibraryLandmarksOpen;  };  void LLLandmarksPanelObserver::changed(U32 mask)  {  	mLP->updateShowFolderState(); + +	LLPlacesInventoryPanel* library = mLP->getLibraryInventoryPanel(); +	if (!mIsLibraryLandmarksOpen && library) +	{ +		// Search for "Landmarks" folder in the Library and open it once on start up. See EXT-4827. +		const LLUUID &landmarks_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false, true); +		if (landmarks_cat.notNull()) +		{ +			LLOpenFolderByID opener(landmarks_cat); +			library->getRootFolder()->applyFunctorRecursively(opener); +			mIsLibraryLandmarksOpen = opener.isFolderOpen(); +		} +	}  }  LLLandmarksPanel::LLLandmarksPanel() diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index cbbd10ac26..6358bd6f23 100644 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -78,6 +78,8 @@ public:  	 */  	void setItemSelected(const LLUUID& obj_id, BOOL take_keyboard_focus); +	LLPlacesInventoryPanel* getLibraryInventoryPanel() { return mLibraryInventoryPanel; } +  protected:  	/**  	 * @return true - if current selected panel is not null and selected item is a landmark diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index a81ec61263..d452ef2228 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -67,6 +67,7 @@ LLUUID notification_id_to_object_id(const LLUUID& notification_id)  LLScriptFloater::LLScriptFloater(const LLSD& key)  : LLDockableFloater(NULL, true, key)  , mScriptForm(NULL) +, mSaveFloaterPosition(false)  {  	setMouseDownCallback(boost::bind(&LLScriptFloater::onMouseDown, this));  	setOverlapsScreenChannel(true); @@ -105,27 +106,29 @@ LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id)  	LLScriptFloater* floater = LLFloaterReg::getTypedInstance<LLScriptFloater>("script_floater", notification_id);  	floater->setNotificationId(notification_id);  	floater->createForm(notification_id); -	LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, TRUE); -	if (floater->getDockControl() == NULL) +	if(LLScriptFloaterManager::OBJ_SCRIPT == LLScriptFloaterManager::getObjectType(notification_id))  	{ -		LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(notification_id); -		if (chiclet == NULL) -		{ -			llerror("Dock chiclet for LLScriptFloater doesn't exist", 0); -		} -		else -		{ -			LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet); -		} - -		floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(), -			LLDockControl::TOP,  boost::bind(&LLScriptFloater::getAllowedRect, floater, _1))); +		floater->setSavePosition(true); +		floater->restorePosition(); +	} +	else +	{ +		floater->dockToChiclet(true);  	} +	LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, TRUE); +  	return floater;  } +void LLScriptFloater::setNotificationId(const LLUUID& id) +{ +	mNotificationId = id; +	// Lets save object id now while notification exists +	mObjectId = notification_id_to_object_id(id); +} +  void LLScriptFloater::getAllowedRect(LLRect& rect)  {  	rect = gViewerWindow->getWorldViewRectRaw(); @@ -162,6 +165,8 @@ void LLScriptFloater::createForm(const LLUUID& notification_id)  void LLScriptFloater::onClose(bool app_quitting)  { +	savePosition(); +  	if(getNotificationId().notNull())  	{  		LLScriptFloaterManager::getInstance()->onRemoveNotification(getNotificationId()); @@ -172,6 +177,8 @@ void LLScriptFloater::setDocked(bool docked, bool pop_on_undock /* = true */)  {  	LLDockableFloater::setDocked(docked, pop_on_undock); +	savePosition(); +  	hideToastsIfNeeded();  } @@ -208,6 +215,33 @@ void LLScriptFloater::onMouseDown()  	}  } +void LLScriptFloater::savePosition() +{ +	if(getSavePosition() && mObjectId.notNull()) +	{ +		LLScriptFloaterManager::FloaterPositionInfo fpi = {getRect(), isDocked()}; +		LLScriptFloaterManager::getInstance()->saveFloaterPosition(mObjectId, fpi); +	} +} + +void LLScriptFloater::restorePosition() +{ +	LLScriptFloaterManager::FloaterPositionInfo fpi; +	if(LLScriptFloaterManager::getInstance()->getFloaterPosition(mObjectId, fpi)) +	{ +		dockToChiclet(fpi.mDockState); +		if(!fpi.mDockState) +		{ +			// Un-docked floater is opened in 0,0, now move it to saved position +			translate(fpi.mRect.mLeft - getRect().mLeft, fpi.mRect.mTop - getRect().mTop); +		} +	} +	else +	{ +		dockToChiclet(true); +	} +} +  void LLScriptFloater::onFocusLost()  {  	if(getNotificationId().notNull()) @@ -225,6 +259,33 @@ void LLScriptFloater::onFocusReceived()  	}  } +void LLScriptFloater::dockToChiclet(bool dock) +{ +	if (getDockControl() == NULL) +	{ +		LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId()); +		if (chiclet == NULL) +		{ +			llwarns << "Dock chiclet for LLScriptFloater doesn't exist" << llendl; +			return; +		} +		else +		{ +			LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet); +		} + +		// Stop saving position while we dock floater +		bool save = getSavePosition(); +		setSavePosition(false); + +		setDockControl(new LLDockControl(chiclet, this, getDockTongue(), +			LLDockControl::TOP,  boost::bind(&LLScriptFloater::getAllowedRect, this, _1)), dock); + +		// Restore saving +		setSavePosition(save); +	} +} +  void LLScriptFloater::hideToastsIfNeeded()  {  	using namespace LLNotificationsUI; @@ -326,6 +387,7 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)  	LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);  	if(floater)  	{ +		floater->savePosition();  		floater->setNotificationId(LLUUID::null);  		floater->closeFloater();  	} @@ -445,4 +507,27 @@ LLScriptFloaterManager::script_notification_map_t::const_iterator LLScriptFloate  	return mNotifications.end();  } +void LLScriptFloaterManager::saveFloaterPosition(const LLUUID& object_id, const FloaterPositionInfo& fpi) +{ +	if(object_id.notNull()) +	{ +		LLScriptFloaterManager::getInstance()->mFloaterPositions[object_id] = fpi; +	} +	else +	{ +		llwarns << "Invalid object id" << llendl; +	} +} + +bool LLScriptFloaterManager::getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi) +{ +	floater_position_map_t::const_iterator it = mFloaterPositions.find(object_id); +	if(LLScriptFloaterManager::getInstance()->mFloaterPositions.end() != it) +	{ +		fpi = it->second; +		return true; +	} +	return false; +} +  // EOF diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h index f7efff83f9..ec3ec4b540 100644 --- a/indra/newview/llscriptfloater.h +++ b/indra/newview/llscriptfloater.h @@ -84,16 +84,21 @@ public:  	static std::string getObjectName(const LLUUID& notification_id); -	/** -	* Callback for notification toast buttons. -	*/ -	static void onToastButtonClick(const LLSD¬ification, const LLSD&response); -  	typedef boost::signals2::signal<void(const LLSD&)> object_signal_t;  	boost::signals2::connection addNewObjectCallback(const object_signal_t::slot_type& cb) { return mNewObjectSignal.connect(cb); }  	boost::signals2::connection addToggleObjectFloaterCallback(const object_signal_t::slot_type& cb) { return mToggleFloaterSignal.connect(cb); } +	struct FloaterPositionInfo +	{ +		LLRect mRect; +		bool mDockState; +	}; + +	void saveFloaterPosition(const LLUUID& object_id, const FloaterPositionInfo& fpi); + +	bool getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi); +  protected:  	typedef std::map<std::string, EObjectType> object_type_map; @@ -111,6 +116,11 @@ private:  	object_signal_t mNewObjectSignal;  	object_signal_t mToggleFloaterSignal; + +	// <object_id, floater position> +	typedef std::map<LLUUID, FloaterPositionInfo> floater_position_map_t; + +	floater_position_map_t mFloaterPositions;  };  /** @@ -141,7 +151,7 @@ public:  	const LLUUID& getNotificationId() { return mNotificationId; } -	void setNotificationId(const LLUUID& id) { mNotificationId = id; } +	void setNotificationId(const LLUUID& id);  	/**  	 * Close notification if script floater is closed. @@ -158,6 +168,14 @@ public:  	 */  	/*virtual*/ void setVisible(BOOL visible); +	bool getSavePosition() { return mSaveFloaterPosition; } + +	void setSavePosition(bool save) { mSaveFloaterPosition = save; } + +	void savePosition(); + +	void restorePosition(); +  protected:  	/** @@ -181,9 +199,13 @@ protected:  	/*virtual*/ void onFocusReceived(); +	void dockToChiclet(bool dock); +  private:  	LLToastNotifyPanel* mScriptForm;  	LLUUID mNotificationId; +	LLUUID mObjectId; +	bool mSaveFloaterPosition;  };  #endif //LL_SCRIPTFLOATER_H diff --git a/indra/newview/llsearchcombobox.cpp b/indra/newview/llsearchcombobox.cpp index 93a70b6471..a130878176 100644 --- a/indra/newview/llsearchcombobox.cpp +++ b/indra/newview/llsearchcombobox.cpp @@ -78,6 +78,7 @@ LLSearchComboBox::LLSearchComboBox(const Params&p)  	button_params.click_callback.function(boost::bind(&LLSearchComboBox::onSelectionCommit, this));  	mSearchButton = LLUICtrlFactory::create<LLButton>(button_params);  	mTextEntry->addChild(mSearchButton); +	mTextEntry->setPassDelete(TRUE);  	setButtonVisible(p.dropdown_button_visible);  	mTextEntry->setCommitCallback(boost::bind(&LLComboBox::onTextCommit, this, _2)); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index d1b91df6e9..136989166f 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -123,7 +123,7 @@  #include "llmutelist.h"  #include "llpanelavatar.h"  #include "llavatarpropertiesprocessor.h" -#include "llpanelevent.h" +#include "llfloaterevent.h"  #include "llpanelclassified.h"  #include "llpanelpick.h"  #include "llpanelplace.h" @@ -1891,17 +1891,6 @@ bool idle_startup()  			}  		} -		// If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account) -		// then auto-populate outfits from the library into the My Outfits folder. -		static bool check_populate_my_outfits = true; -		if (check_populate_my_outfits &&  -			(LLInventoryModel::getIsFirstTimeInViewer2()  -			 || gSavedSettings.getBOOL("MyOutfitsAutofill"))) -		{ -			gAgentWearables.populateMyOutfitsFolder(); -		} -		check_populate_my_outfits = false; -  		return TRUE;  	} @@ -2484,7 +2473,7 @@ void register_viewer_callbacks(LLMessageSystem* msg)  	msg->setHandlerFunc("MapBlockReply", LLWorldMapMessage::processMapBlockReply);  	msg->setHandlerFunc("MapItemReply", LLWorldMapMessage::processMapItemReply); -	msg->setHandlerFunc("EventInfoReply", LLPanelEvent::processEventInfoReply); +	msg->setHandlerFunc("EventInfoReply", LLFloaterEvent::processEventInfoReply);  	msg->setHandlerFunc("PickInfoReply", &LLAvatarPropertiesProcessor::processPickInfoReply);  //	msg->setHandlerFunc("ClassifiedInfoReply", LLPanelClassified::processClassifiedInfoReply);  	msg->setHandlerFunc("ClassifiedInfoReply", LLAvatarPropertiesProcessor::processClassifiedInfoReply); @@ -2544,6 +2533,8 @@ bool callback_choose_gender(const LLSD& notification, const LLSD& response)  void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,  								   const std::string& gender_name )  { +	llinfos << "starting" << llendl; +  	// Not going through the processAgentInitialWearables path, so need to set this here.  	LLAppearanceManager::instance().setAttachmentInvLinkEnable(true);  	// Initiate creation of COF, since we're also bypassing that. diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 4a61130785..6c35464a51 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -982,7 +982,12 @@ bool LLTextureFetchWorker::doWork(S32 param)  		}  		if (mLoadedDiscard < 0)  		{ -			llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl; +			//llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl; + +			//abort, don't decode +			mState = DONE; +			setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); +			return true;  		}  		setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it  		mRawImage = NULL; @@ -1510,8 +1515,8 @@ bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, con  		unlockQueue() ;  		worker->lockWorkMutex(); -	worker->mActiveCount++; -	worker->mNeedsAux = needs_aux; +		worker->mActiveCount++; +		worker->mNeedsAux = needs_aux;  		worker->unlockWorkMutex();  	} diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 4d741456c4..980b51337f 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -294,6 +294,15 @@ void LLToastNotifyPanel::adjustPanelForTipNotice()  	mControlPanel->setVisible(FALSE);  	reshape(getRect().getWidth(), mInfoPanel->getRect().getHeight()); + +	if (mNotification->getPayload().has("respond_on_mousedown") +		&& mNotification->getPayload()["respond_on_mousedown"] ) +	{ +		mInfoPanel->setMouseDownCallback( +			boost::bind(&LLNotification::respond, +						mNotification, +						mNotification->getResponseTemplate())); +	}  }  // static diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 29114c33c5..eb070fb3ef 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -55,6 +55,7 @@  #include "llfloaterbump.h"  #include "llfloatercamera.h"  #include "llfloaterdaycycle.h" +#include "llfloaterevent.h"  #include "llfloatersearch.h"  #include "llfloaterenvsettings.h"  #include "llfloaterfonttest.h" @@ -160,6 +161,8 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("env_settings", "floater_env_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEnvSettings>);  	LLFloaterReg::add("env_water", "floater_water.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWater>);  	LLFloaterReg::add("env_windlight", "floater_windlight_options.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWindLight>); + +	LLFloaterReg::add("event", "floater_event.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEvent>);  	LLFloaterReg::add("font_test", "floater_font_test.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFontTest>); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 3001992630..b69eaa4853 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -649,6 +649,8 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const  void LLViewerInventoryCategory::determineFolderType()  { +	/* Do NOT uncomment this code.  This is for future 2.1 support of ensembles. +	llassert(FALSE);  	LLFolderType::EType original_type = getPreferredType();  	if (LLFolderType::lookupIsProtectedType(original_type))  		return; @@ -692,6 +694,8 @@ void LLViewerInventoryCategory::determineFolderType()  	{  		changeType(LLFolderType::FT_NONE);  	} +	llassert(FALSE); +	*/  }  void LLViewerInventoryCategory::changeType(LLFolderType::EType new_folder_type) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index af89df448d..8c61ba7558 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -2555,7 +2555,7 @@ void handle_object_inspect()  		key["task"] = "task";  		LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);  	} - +	  	/*  	// Old floater properties  	LLFloaterReg::showInstance("inspect", LLSD()); @@ -4842,9 +4842,10 @@ class LLToolsEnableUnlink : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ +		LLViewerObject* first_editable_object = LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject();  		bool new_value = LLSelectMgr::getInstance()->selectGetAllRootsValid() && -			LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject() && -			!LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject()->isAttachment(); +			first_editable_object && +			!first_editable_object->isAttachment();  		return new_value;  	}  }; @@ -5599,6 +5600,19 @@ void handle_buy_currency()  	LLFloaterBuyCurrency::buyCurrency();  } +class LLFloaterVisible : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		std::string floater_name = userdata.asString(); +		bool new_value = false; +		{ +			new_value = LLFloaterReg::instanceVisible(floater_name); +		} +		return new_value; +	} +}; +  class LLShowHelp : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -8030,6 +8044,7 @@ void initialize_menus()  	enable.add("EnableEdit", boost::bind(&enable_object_edit));  	enable.add("VisibleBuild", boost::bind(&enable_object_build)); +	view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible");  	view_listener_t::addMenu(new LLShowSidetrayPanel(), "ShowSidetrayPanel");  	view_listener_t::addMenu(new LLSidetrayPanelVisible(), "SidetrayPanelVisible");  	view_listener_t::addMenu(new LLSomethingSelected(), "SomethingSelected"); diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h index ace5c5038e..2858081dc9 100644 --- a/indra/newview/llviewerobjectlist.h +++ b/indra/newview/llviewerobjectlist.h @@ -233,6 +233,10 @@ public:  extern LLViewerObjectList gObjectList;  // Inlines +/** + * Note: + * it will return NULL for offline avatar_id  + */  inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id)  {  	std::map<LLUUID, LLPointer<LLViewerObject> >::iterator iter = mUUIDObjectMap.find(id); diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 984f003411..28998d409e 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -496,7 +496,9 @@ void LLViewerTexture::init(bool firstinit)  	mAdditionalDecodePriority = 0.f ;	  	mParcelMedia = NULL ;  	mNumFaces = 0 ; +	mNumVolumes = 0;  	mFaceList.clear() ; +	mVolumeList.clear();  }  //virtual  @@ -508,7 +510,7 @@ S8 LLViewerTexture::getType() const  void LLViewerTexture::cleanup()  {  	mFaceList.clear() ; -	 +	mVolumeList.clear();  	if(mGLTexturep)  	{  		mGLTexturep->cleanup(); @@ -661,6 +663,42 @@ S32 LLViewerTexture::getNumFaces() const  	return mNumFaces ;  } + +//virtual +void LLViewerTexture::addVolume(LLVOVolume* volumep)  +{ +	if( mNumVolumes >= mVolumeList.size()) +	{ +		mVolumeList.resize(2 * mNumVolumes + 1) ;		 +	} +	mVolumeList[mNumVolumes] = volumep ; +	volumep->setIndexInTex(mNumVolumes) ; +	mNumVolumes++ ; +	mLastVolumeListUpdateTimer.reset() ; +} + +//virtual +void LLViewerTexture::removeVolume(LLVOVolume* volumep)  +{ +	if(mNumVolumes > 1) +	{ +		S32 index = volumep->getIndexInTex() ;  +		mVolumeList[index] = mVolumeList[--mNumVolumes] ; +		mVolumeList[index]->setIndexInTex(index) ; +	} +	else  +	{ +		mVolumeList.clear() ; +		mNumVolumes = 0 ; +	} +	mLastVolumeListUpdateTimer.reset() ; +} + +S32 LLViewerTexture::getNumVolumes() const +{ +	return mNumVolumes ; +} +  void LLViewerTexture::reorganizeFaceList()  {  	static const F32 MAX_WAIT_TIME = 20.f; // seconds @@ -680,6 +718,27 @@ void LLViewerTexture::reorganizeFaceList()  	mFaceList.erase(mFaceList.begin() + mNumFaces, mFaceList.end());  } +void LLViewerTexture::reorganizeVolumeList() +{ +	static const F32 MAX_WAIT_TIME = 20.f; // seconds +	static const U32 MAX_EXTRA_BUFFER_SIZE = 4 ; + +	if(mNumVolumes + MAX_EXTRA_BUFFER_SIZE > mVolumeList.size()) +	{ +		return ; +	} + +	if(mLastVolumeListUpdateTimer.getElapsedTimeF32() < MAX_WAIT_TIME) +	{ +		return ; +	} + +	mLastVolumeListUpdateTimer.reset() ; +	mVolumeList.erase(mVolumeList.begin() + mNumVolumes, mVolumeList.end()); +} + + +  //virtual  void LLViewerTexture::switchToCachedImage()  { @@ -1519,12 +1578,12 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  		}  		else if (!isJustBound() && mCachedRawImageReady)  		{ -			if(mBoostLevel < BOOST_HIGH) -			{ -				// We haven't rendered this in a while, de-prioritize it -				desired_discard += 2; -			} -			else +			//if(mBoostLevel < BOOST_HIGH) +			//{ +			//	// We haven't rendered this in a while, de-prioritize it +			//	desired_discard += 2; +			//} +			//else  			{  				// We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is  				desired_discard = cur_discard; @@ -1610,6 +1669,7 @@ void LLViewerFetchedTexture::updateVirtualSize()  	}  	mNeedsResetMaxVirtualSize = TRUE ;  	reorganizeFaceList() ; +	reorganizeVolumeList();  }  bool LLViewerFetchedTexture::updateFetch() @@ -2250,13 +2310,13 @@ void LLViewerFetchedTexture::destroyRawImage()  	if (mRawImage.notNull())   	{ -		sRawCount--; -		setCachedRawImage() ; +		sRawCount--;		  		if(mForceToSaveRawImage)  		{  			saveRawImage() ;  		}		 +		setCachedRawImage() ;  	}  	mRawImage = NULL; @@ -2342,17 +2402,12 @@ void LLViewerFetchedTexture::setCachedRawImage()  			{  				--i ;  			} -			//if(mForSculpt) -			//{ -			//	mRawImage->scaleDownWithoutBlending(w >> i, h >> i) ; -			//} -			//else -			{ -				mRawImage->scale(w >> i, h >> i) ; -			} +			 +			mRawImage->scale(w >> i, h >> i) ;  		}  		mCachedRawImage = mRawImage ; -		mCachedRawDiscardLevel = mRawDiscardLevel + i ;			 +		mRawDiscardLevel += i ; +		mCachedRawDiscardLevel = mRawDiscardLevel ;			  	}  } @@ -2422,7 +2477,7 @@ BOOL LLViewerFetchedTexture::hasSavedRawImage() const  F32 LLViewerFetchedTexture::getElapsedLastReferencedSavedRawImageTime() const  {  -	return mLastReferencedSavedRawImageTime - sCurrentTime ; +	return sCurrentTime - mLastReferencedSavedRawImageTime ;  }  //----------------------------------------------------------------------------------------------  //atlasing @@ -2699,7 +2754,7 @@ void LLViewerLODTexture::processTextureStats()  		}  		else  		{ -			if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 1.0f) +			if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 0.3f)  			{  				//if is a big image and not being used recently, nor close to the view point, do not load hi-res data.  				mMaxVirtualSize = llmin(mMaxVirtualSize, (F32)LLViewerTexture::sMinLargeImageSize) ; @@ -2885,12 +2940,11 @@ LLViewerMediaTexture::~LLViewerMediaTexture()  void LLViewerMediaTexture::reinit(BOOL usemipmaps /* = TRUE */)  { -	mGLTexturep = NULL ; -	init(false); +	llassert(mGLTexturep.notNull()) ; +  	mUseMipMaps = usemipmaps ;  	getLastReferencedTimer()->reset() ; - -	generateGLTexture() ; +	mGLTexturep->setUseMipMaps(mUseMipMaps) ;  	mGLTexturep->setNeedsAlphaAndPickMask(FALSE) ;  } @@ -3270,6 +3324,7 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()  	mNeedsResetMaxVirtualSize = TRUE ;  	reorganizeFaceList() ; +	reorganizeVolumeList();  	return mMaxVirtualSize ;  } diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 79d9c4e7bb..85f03b5839 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -134,7 +134,9 @@ public:  	static S32 getIndexFromCategory(S32 category) ;  	static S32 getCategoryFromIndex(S32 index) ; -	typedef std::vector<LLFace*> ll_face_list_t ; +	typedef std::vector<LLFace*> ll_face_list_t; +	typedef std::vector<LLVOVolume*> ll_volume_list_t; +  protected:  	virtual ~LLViewerTexture(); @@ -178,6 +180,11 @@ public:  	S32 getNumFaces() const;  	const ll_face_list_t* getFaceList() const {return &mFaceList;} +	virtual void addVolume(LLVOVolume* volumep); +	virtual void removeVolume(LLVOVolume* volumep); +	S32 getNumVolumes() const; +	const ll_volume_list_t* getVolumeList() const { return &mVolumeList; } +  	void generateGLTexture() ;  	void destroyGLTexture() ; @@ -242,7 +249,7 @@ protected:  	void cleanup() ;  	void init(bool firstinit) ;	  	void reorganizeFaceList() ; - +	void reorganizeVolumeList() ;  private:  	//note: do not make this function public.  	/*virtual*/ LLImageGL* getGLTexture() const ; @@ -269,6 +276,10 @@ protected:  	U32               mNumFaces ;  	LLFrameTimer      mLastFaceListUpdateTimer ; +	ll_volume_list_t  mVolumeList; +	U32					mNumVolumes; +	LLFrameTimer	  mLastVolumeListUpdateTimer; +  	//do not use LLPointer here.  	LLViewerMediaTexture* mParcelMedia ; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index b76a2e150f..1dcc7389cb 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -852,56 +852,71 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi  					LLVOVolume *obj = dynamic_cast<LLVOVolume*>(static_cast<LLViewerObject*>(pick_info.getObject())); -					if (obj && obj->permModify() && !obj->getRegion()->getCapability("ObjectMedia").empty()) +					if (obj && !obj->getRegion()->getCapability("ObjectMedia").empty())  					{  						LLTextureEntry *te = obj->getTE(object_face);  						if (te)  						{  							if (drop)  							{ -								if (! te->hasMedia()) +								// object does NOT have media already +								if ( ! te->hasMedia() )  								{ -									// Create new media entry -									LLSD media_data; -									// XXX Should we really do Home URL too? -									media_data[LLMediaEntry::HOME_URL_KEY] = url; -									media_data[LLMediaEntry::CURRENT_URL_KEY] = url; -									media_data[LLMediaEntry::AUTO_PLAY_KEY] = true; -									obj->syncMediaData(object_face, media_data, true, true); -									// XXX This shouldn't be necessary, should it ?!? -									if (obj->getMediaImpl(object_face)) -										obj->getMediaImpl(object_face)->navigateReload(); -									obj->sendMediaDataUpdate(); -								 -									result = LLWindowCallbacks::DND_COPY; -								} -								else { -									// Check the whitelist -									if (te->getMediaData()->checkCandidateUrl(url)) +									// we are allowed to modify the object +									if ( obj->permModify() )  									{ -										// just navigate to the URL +										// Create new media entry +										LLSD media_data; +										// XXX Should we really do Home URL too? +										media_data[LLMediaEntry::HOME_URL_KEY] = url; +										media_data[LLMediaEntry::CURRENT_URL_KEY] = url; +										media_data[LLMediaEntry::AUTO_PLAY_KEY] = true; +										obj->syncMediaData(object_face, media_data, true, true); +										// XXX This shouldn't be necessary, should it ?!?  										if (obj->getMediaImpl(object_face)) +											obj->getMediaImpl(object_face)->navigateReload(); +										obj->sendMediaDataUpdate(); + +										result = LLWindowCallbacks::DND_COPY; +									} +								} +								else  +								// object HAS media already +								{ +									// URL passes the whitelist +									if (te->getMediaData()->checkCandidateUrl( url ) ) +									{ +										// we are allowed to modify the object or we have navigate permissions +										// NOTE: Design states you you can change the URL if you have media  +										//       navigate permissions even if you do not have prim modify rights +										if ( obj->permModify() || obj->hasMediaPermission( te->getMediaData(), LLVOVolume::MEDIA_PERM_INTERACT ) )  										{ -											obj->getMediaImpl(object_face)->navigateTo(url); +											// just navigate to the URL +											if (obj->getMediaImpl(object_face)) +											{ +												obj->getMediaImpl(object_face)->navigateTo(url); +											} +											else  +											{ +												// This is very strange.  Navigation should +												// happen via the Impl, but we don't have one. +												// This sends it to the server, which /should/ +												// trigger us getting it.  Hopefully. +												LLSD media_data; +												media_data[LLMediaEntry::CURRENT_URL_KEY] = url; +												obj->syncMediaData(object_face, media_data, true, true); +												obj->sendMediaDataUpdate(); +											} +											result = LLWindowCallbacks::DND_LINK;  										} -										else { -											// This is very strange.  Navigation should -											// happen via the Impl, but we don't have one. -											// This sends it to the server, which /should/ -											// trigger us getting it.  Hopefully. -											LLSD media_data; -											media_data[LLMediaEntry::CURRENT_URL_KEY] = url; -											obj->syncMediaData(object_face, media_data, true, true); -											obj->sendMediaDataUpdate(); -										} -										result = LLWindowCallbacks::DND_LINK;  									}  								}  								LLSelectMgr::getInstance()->unhighlightObjectOnly(mDragHoveredObject);  								mDragHoveredObject = NULL;  							} -							else { +							else  +							{  								// Check the whitelist, if there's media (otherwise just show it)  								if (te->getMediaData() == NULL || te->getMediaData()->checkCandidateUrl(url))  								{ diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 698b6be98b..7a6a48d1b3 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2538,6 +2538,17 @@ void LLVOAvatar::idleUpdateLoadingEffect()  	// update visibility when avatar is partially loaded  	if (updateIsFullyLoaded()) // changed?  	{ +		if (isFullyLoaded() && isSelf()) +		{ +			llinfos << "self isFullyLoaded" << llendl; + +			static bool first_fully_visible = true; +			if (first_fully_visible) +			{ +				first_fully_visible = false; +				LLAppearanceManager::instance().onFirstFullyVisible(); +			} +		}  		if (isFullyLoaded())  		{  			deleteParticleSource(); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index bfe38c14ba..9fbcd1d32a 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -192,6 +192,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re  	mMediaImplList.resize(getNumTEs());  	mLastFetchedMediaVersion = -1; +	mIndexInTex = 0;  }  LLVOVolume::~LLVOVolume() @@ -226,6 +227,11 @@ void LLVOVolume::markDead()  		{  			removeMediaImpl(i);  		} + +		if (mSculptTexture.notNull()) +		{ +			mSculptTexture->removeVolume(this); +		}  	}  	LLViewerObject::markDead(); @@ -679,6 +685,7 @@ void LLVOVolume::updateTextureVirtualSize()  			vsize = area;  			imagep->setBoostLevel(LLViewerTexture::BOOST_HUD);   			face->setPixelArea(area); // treat as full screen +			face->setVirtualSize(vsize);  		}  		else  		{ @@ -695,8 +702,7 @@ void LLVOVolume::updateTextureVirtualSize()  				gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD, FALSE);  			}  		} -		 -		face->setVirtualSize(vsize); +				  		if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))  		{  			if (vsize < min_vsize) min_vsize = vsize; @@ -725,7 +731,9 @@ void LLVOVolume::updateTextureVirtualSize()  	{  		LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);  		LLUUID id =  sculpt_params->getSculptTexture();  -		mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +		 +		updateSculptTexture(); +		  		if (mSculptTexture.notNull())  		{  			mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(), @@ -914,35 +922,53 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail  		{  			mVolumeImpl->onSetVolume(volume_params, detail);  		} -		 +	 +		updateSculptTexture(); +  		if (isSculpted())  		{ -			mSculptTexture = LLViewerTextureManager::getFetchedTexture(volume_params.getSculptID(), TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +			updateSculptTexture(); +  			if (mSculptTexture.notNull())  			{ -				//ignore sculpt GL usage since bao fixed this in a separate branch -				if (!gGLActive) -				{ -					gGLActive = TRUE; -					sculpt(); -					gGLActive = FALSE; -				} -				else -				{ -					sculpt(); -				} +				sculpt();  			}  		} -		else -		{ -			mSculptTexture = NULL; -		}  		return TRUE;  	}  	return FALSE;  } +void LLVOVolume::updateSculptTexture() +{ +	LLPointer<LLViewerFetchedTexture> old_sculpt = mSculptTexture; + +	if (isSculpted()) +	{ +		LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); +		LLUUID id =  sculpt_params->getSculptTexture();  +		mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +	} +	else +	{ +		mSculptTexture = NULL; +	} + +	if (mSculptTexture != old_sculpt) +	{ +		if (old_sculpt.notNull()) +		{ +			old_sculpt->removeVolume(this); +		} +		if (mSculptTexture.notNull()) +		{ +			mSculptTexture->addVolume(this); +		} +	} +	 +} +  // sculpt replaces generate() for sculpted surfaces  void LLVOVolume::sculpt()  {	 @@ -1006,6 +1032,17 @@ void LLVOVolume::sculpt()  			}  		}  		getVolume()->sculpt(sculpt_width, sculpt_height, sculpt_components, sculpt_data, discard_level); + +		//notify rebuild any other VOVolumes that reference this sculpty volume +		for (S32 i = 0; i < mSculptTexture->getNumVolumes(); ++i) +		{ +			LLVOVolume* volume = (*(mSculptTexture->getVolumeList()))[i]; +			if (volume != this && volume->getVolume() == getVolume()) +			{ +				gPipeline.markRebuild(volume->mDrawable, LLDrawable::REBUILD_GEOMETRY, FALSE); +				volume->mSculptChanged = TRUE; +			} +		}  	}  } @@ -3457,7 +3494,8 @@ static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM("Volume Geometry");  void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)  {  	llpushcallstacks ; -	if (group->isState(LLSpatialGroup::MESH_DIRTY) && !group->isState(LLSpatialGroup::GEOM_DIRTY)) +	llassert(group); +	if (group && group->isState(LLSpatialGroup::MESH_DIRTY) && !group->isState(LLSpatialGroup::GEOM_DIRTY))  	{  		LLFastTimer tm(FTM_VOLUME_GEOM);  		S32 num_mapped_veretx_buffer = LLVertexBuffer::sMappedCount ; @@ -3511,9 +3549,9 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)  		}  		// don't forget alpha -		if(	group != NULL &&  -			!group->mVertexBuffer.isNull() &&  -			group->mVertexBuffer->isLocked()) +		if(group != NULL &&  +		   !group->mVertexBuffer.isNull() &&  +		   group->mVertexBuffer->isLocked())  		{  			group->mVertexBuffer->setBuffer(0);  		} @@ -3539,7 +3577,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)  		group->clearState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO);  	} -	if (group->isState(LLSpatialGroup::NEW_DRAWINFO)) +	if (group && group->isState(LLSpatialGroup::NEW_DRAWINFO))  	{  		llerrs << "WTF?" << llendl;  	} diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index a287d34402..a8bb597f93 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -179,8 +179,10 @@ public:  	/*virtual*/ BOOL 	setMaterial(const U8 material);  				void	setTexture(const S32 face); - +				S32     getIndexInTex() const {return mIndexInTex ;}  	/*virtual*/ BOOL	setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume = false); +				void	updateSculptTexture(); +				void    setIndexInTex(S32 index) { mIndexInTex = index ;}  				void	sculpt();  				void	updateRelativeXform();  	/*virtual*/ BOOL	updateGeometry(LLDrawable *drawable); @@ -303,7 +305,7 @@ private:  	LLPointer<LLViewerFetchedTexture> mLightTexture;  	media_list_t mMediaImplList;  	S32			mLastFetchedMediaVersion; // as fetched from the server, starts as -1 -	 +	S32 mIndexInTex;  	// statics  public:  	static F32 sLODSlopDistanceFactor;// Changing this to zero, effectively disables the LOD transition slop  diff --git a/indra/newview/skins/default/textures/icons/Inv_Shoe.png b/indra/newview/skins/default/textures/icons/Inv_Shoe.pngBinary files differ index 51e1c7bbb7..1f52b0a6b6 100644 --- a/indra/newview/skins/default/textures/icons/Inv_Shoe.png +++ b/indra/newview/skins/default/textures/icons/Inv_Shoe.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 18d1779702..0065d824d2 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -633,8 +633,8 @@ with the same filename but different name    <texture name="Unread_Msg" file_name="bottomtray/Unread_Msg.png" preload="false" />    <texture name="Unread_IM" file_name="bottomtray/Unread_IM.png" preload="false" /> -  <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png"  preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> -  <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> +    <texture name="Volume_Background" file_name="windows/Volume_Background.png" preload="false" +           scale.left="6" scale.top="33" scale.right="63" scale.bottom="10" />    <texture name="VoicePTT_Lvl1" file_name="bottomtray/VoicePTT_Lvl1.png" preload="false" />    <texture name="VoicePTT_Lvl2" file_name="bottomtray/VoicePTT_Lvl2.png" preload="false" /> @@ -642,6 +642,9 @@ with the same filename but different name    <texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" />    <texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" /> +  <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png"  preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> +  <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> +    <texture name="WebBasedMediaBackground" file_name="windows/WebBasedMediaBackground.png" preload="false" />    <texture name="Widget_DownArrow" file_name="icons/Widget_DownArrow.png" preload="true" /> diff --git a/indra/newview/skins/default/textures/windows/Volume_Background.png b/indra/newview/skins/default/textures/windows/Volume_Background.pngBinary files differ new file mode 100644 index 0000000000..43aaa441f5 --- /dev/null +++ b/indra/newview/skins/default/textures/windows/Volume_Background.png diff --git a/indra/newview/skins/default/xui/en/floater_event.xml b/indra/newview/skins/default/xui/en/floater_event.xml new file mode 100644 index 0000000000..9ce0c9c86d --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_event.xml @@ -0,0 +1,243 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + follows="all" + height="350" + label="Event" + layout="topleft" + name="Event" + width="330"> +  <floater.string +   name="none"> +    none +  </floater.string> +  <floater.string +   name="notify"> +    Notify +  </floater.string> +  <floater.string +   name="dont_notify"> +    Don't Notify +  </floater.string> +  <layout_stack +    name="layout" +    orientation="vertical" +    follows="all" +    layout="topleft" +    left="0" +    top="0" +    height="350" +    width="330" +    border_size="0"> +    <layout_panel +       name="profile_stack" +       follows="all" +       layout="topleft" +       top="0" +       left="0" +       height="305" +       width="330"> +      <text +       follows="top|left|right" +       font="SansSerifLarge" +       text_color="white" +       height="17" +       layout="topleft" +       left="10" +       name="event_name" +       top="5" +       use_ellipses="true" +       width="310"> +        Nameless Event...of Doom! De doom! Doom doom. +      </text> +      <text +        type="string" +        length="1" +        follows="top|left" +        height="13" +        text_color="LtGray_50" +        layout="topleft" +        left="25" +        name="event_category" +        width="300"> +        (no category) +      </text> + +      <text +       type="string" +       length="1" +       follows="top|left" +       layout="topleft" +       left="10" +       top_pad="7" +       name="event_runby_label" +       width="310"> +        Run by: +      </text> +      <text +        follows="left|top" +        height="20" +        initial_value="(retrieving)" +        layout="topleft" +        left="10" +        link="true" +        name="event_runby" +        top_pad="2" +        use_ellipses="true" +        width="310" /> +      <text +     type="string" +     length="1" +     left="10" +     height="17" +     font="SansSerifMedium" +    text_color="EmphasisColor" +     top_pad="5" +     follows="top|left" +     layout="topleft" +     name="event_date" +     width="310"> +        10/10/2010 +      </text> +      <text +       type="string" +       height="14" +       length="1" +       left="10" +       follows="top|left" +       layout="topleft" +       name="event_duration" +       width="310"> +        1 hour +      </text> +      <text +       font="SansSerifMedium" +       text_color="EmphasisColor" +        type="string" +        follows="left|top" +        height="16" +        layout="topleft" +       left="10" +       name="event_cover" +        visible="true" +        width="310"> +        Free +      </text> +      <text +       type="string" +       length="1" +       follows="top|left" +       layout="topleft" +       left="10" +       top_pad="5" +       name="event_location_label"> +        Location: +      </text> +      <text +       type="string" +       length="1" +       height="20" +       left="10" +       follows="top|left" +       layout="topleft" +       name="event_location" +       use_ellipses="true" +       value="SampleParcel, Name Long (145, 228, 26)" +        width="310" /> +      <icon +   follows="top|left" +   height="16" +   image_name="Parcel_PG_Dark" +   layout="topleft" +   left="10" +   name="rating_icon" +   width="18" /> +      <text +       follows="left|top" +       height="16" +       layout="topleft" +       left_pad="12" +       name="rating_label" +       top_delta="3" +       value="Rating:" +       width="60" /> +      <text +       follows="left|right|top" +       height="16" +       layout="topleft" +       left_pad="0" +       name="rating_value" +       top_delta="0" +       value="unknown" +       width="200" /> +      <expandable_text +               follows="left|top|right" +               height="106" +               layout="topleft" +               left="6" +               name="event_desc" +               width="313" /> +    </layout_panel> +    <layout_panel +               follows="left|right" +               height="24" +               layout="topleft" +               mouse_opaque="false" +               name="button_panel" +               top="0" +               left="0" +               user_resize="false"> +      <button +       follows="left|top" +           height="18" +           image_selected="AddItem_Press" +           image_unselected="AddItem_Off" +           image_disabled="AddItem_Disabled" +           layout="topleft" +           left="6" +       name="create_event_btn" +           picture_style="true" +           tool_tip="Create Event" +           width="18" /> +      <button +       follows="left|top" +           height="18" +           image_selected="MinusItem_Press" +           image_unselected="MinusItem_Off" +           image_disabled="MinusItem_Disabled" +           layout="topleft" +           visible="false"  +           left="6" +           top_pad="-7"  +          name="god_delete_event_btn" +           picture_style="true" +           tool_tip="Delete Event" +           width="18" /> +      <button +   follows="left|top" +   height="23" +   label="Notify Me" +   layout="topleft" +   left_pad="3" +   top_delta="-12" +   name="notify_btn" +   width="100" /> +      <button +       follows="left|top" +       height="23" +       label="Teleport" +       layout="topleft" +       left_pad="5" +       name="teleport_btn" +       width="100" /> +      <button +       follows="left|top" +       height="23" +       label="Map" +       layout="topleft" +       left_pad="5" +       name="map_btn" +       width="85" /> +    </layout_panel> +  </layout_stack> +  </floater> + diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 95ce6d6ff4..07a366da7f 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -55,34 +55,42 @@          </menu_item_call>          <menu_item_check           label="My Inventory" -         layout="topleft"           name="Inventory" -         shortcut="control|I"> +         layout="topleft" +         shortcut="control|shift|I" +		 visible="false">              <menu_item_check.on_check -             function="SidetrayPanelVisible" -             parameter="sidepanel_inventory" /> +             function="Floater.Visible" +             parameter="inventory" />              <menu_item_check.on_click -             function="ShowSidetrayPanel" -             parameter="sidepanel_inventory" /> +             function="Floater.Toggle" +             parameter="inventory" />          </menu_item_check> -        <menu_item_call -         label="Show Inventory in Side Tray" +        <menu_item_check +         label="My Inventory"           name="ShowSidetrayInventory" +         layout="topleft"           shortcut="control|I" -         visible="false"> -            <menu_item_call.on_click +		 visible="true"> +            <menu_item_check.on_check +             function="SidetrayPanelVisible" +             parameter="sidepanel_inventory" /> +            <menu_item_check.on_click               function="ShowSidetrayPanel"               parameter="sidepanel_inventory" /> -        </menu_item_call> -        <menu_item_call +        </menu_item_check> +        <menu_item_check           label="My Gestures"           layout="topleft"           name="Gestures"           shortcut="control|G"> -            <menu_item_call.on_click +            <menu_item_check.on_check +             function="Floater.Visible" +             parameter="gestures" /> +            <menu_item_check.on_click               function="Floater.Toggle"               parameter="gestures" /> -        </menu_item_call> +        </menu_item_check>          <menu           label="My Status"           layout="topleft" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 51f0f6839c..0fbd860648 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -19,7 +19,7 @@        <button         default="true"         index="0" -       name="OK" +       name="OK_okbutton"         text="$yestext"/>      </form>    </template> @@ -29,7 +29,7 @@        <button         default="true"         index="0" -       name="OK" +       name="OK_okignore"         text="$yestext"/>        <ignore text="$ignoretext"/>      </form> @@ -40,11 +40,11 @@        <button         default="true"         index="0" -       name="OK" +       name="OK_okcancelbuttons"         text="$yestext"/>        <button         index="1" -       name="Cancel" +       name="Cancel_okcancelbuttons"         text="$notext"/>      </form>    </template> @@ -54,11 +54,11 @@        <button         default="true"         index="0" -       name="OK" +       name="OK_okcancelignore"         text="$yestext"/>        <button         index="1" -       name="Cancel" +       name="Cancel_okcancelignore"         text="$notext"/>        <ignore text="$ignoretext"/>      </form> @@ -69,7 +69,7 @@        <button         default="true"         index="0" -       name="OK" +       name="OK_okhelpbuttons"         text="$yestext"/>        <button         index="1" @@ -91,7 +91,7 @@         text="$notext"/>        <button         index="2" -       name="Cancel" +       name="Cancel_yesnocancelbuttons"         text="$canceltext"/>      </form>    </template> diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index 1f16aea2ef..5f46ad7860 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -159,7 +159,6 @@ Maximum 200 per group daily           left_pad="3"           max_length="511"           name="create_message" -         text_type="ascii"           top_delta="0"           width="220"           word_wrap="true" /> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index 433dfc17fe..2e81139ef2 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -9,13 +9,22 @@   name="chat"   top="1"   width="517"> -    <radio_group +  <text +   follows="left|top" +   layout="topleft" +   left="30" +   height="12" +   width="120" +   top="10"> +    Font size: +  </text> +  <radio_group       height="30"       layout="topleft" -     left="30" -	 control_name="ChatFontSize" +     left="40" +	   control_name="ChatFontSize"       name="chat_font_size" -     top="10" +     top_pad="0"       width="440">          <radio_item           height="16" @@ -45,12 +54,24 @@           top_delta="0"           width="125" />      </radio_group> + +    <text +      follows="left|top" +      layout="topleft" +      left="30" +      height="12" +      top_pad="10"  +      width="120" +      > +    Font colors: +    </text>   +        <color_swatch       can_apply_immediately="true"       follows="left|top"       height="47"       layout="topleft" -     left="30" +     left="40"       name="user"       top_pad="10"       width="44" > @@ -79,7 +100,7 @@       follows="left|top"       height="47"       layout="topleft" -     left="180" +     left="190"       name="agent"       top_pad="-17"       width="44" > @@ -110,7 +131,7 @@       height="47"       label_width="60"       layout="topleft" -     left="350" +     left="360"       name="im"       top_pad="-17"       width="44"> @@ -141,7 +162,7 @@       height="47"       label_width="44"       layout="topleft" -     left="30" +     left="40"       name="system"       top_pad="40"       width="44" > @@ -171,7 +192,7 @@       follows="left|top"       height="47"       layout="topleft" -     left="180" +     left="190"       name="script_error"       top_pad="-17"       width="44"> @@ -201,7 +222,7 @@       follows="left|top"       height="47"       layout="topleft" -     left="350" +     left="360"       name="objects"       top_pad="-17"       width="44" > @@ -231,7 +252,7 @@       follows="left|top"       height="47"       layout="topleft" -     left="30" +     left="40"       name="owner"       top_pad="40"       width="44" > @@ -261,7 +282,7 @@       follows="left|top"       height="47"       layout="topleft" -     left="180" +     left="190"       name="links"       top_pad="-17"       width="44" > @@ -314,6 +335,8 @@       top_pad="5"       width="400" />      <text +     follows="left|top" +     layout="topleft"       left="30"       height="20"       width="120" @@ -321,17 +344,20 @@       Show IMs in:      </text>      <text -	 left_pad="6" -	 height="20" -	 width="100" -	 text_color="White_25" -	 > +     follows="left|top" +     layout="topleft" +     top_delta="0"  +     left="120"  +  	 height="20" +	   width="100" +     text_color="White_25" +	  >        (requires restart)        </text>      <radio_group       height="30"       layout="topleft" -     left="30" +     left="40"       control_name="ChatWindow"       name="chat_window"       top_pad="0" diff --git a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml index 60d4a7e00b..55ab95bfe9 100644 --- a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml +++ b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml @@ -4,7 +4,7 @@   background_visible="false"   border_visible="false"   border="false" - chrome="true"  + chrome="true"   follows="bottom"   height="150"   layout="topleft" @@ -13,7 +13,7 @@    <!-- floater background image -->    <icon     height="150" -   image_name="Inspector_Background" +   image_name="Volume_Background"     layout="topleft"     left="0"     name="normal_background" diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml index 1228f6be3d..0720621f0b 100644 --- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml @@ -16,6 +16,6 @@  	  image_unselected="Search"  	  image_selected="Search" />    <clear_button label="" -   image_unselected="Icon_Close_Foreground" -   image_selected="Icon_Close_Press" /> +   image_unselected="Icon_Close_Toast" +   image_selected="Icon_Close_Toast" />  </filter_editor> diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml index 1616e4c3f7..a9a760b3a4 100644 --- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml @@ -15,7 +15,11 @@      height="13"   	  image_unselected="Search"  	  image_selected="Search" /> -  <clear_button  +  <clear_button +   bottom="4" +   height="16"     image_unselected="Icon_Close_Foreground" -   image_selected="Icon_Close_Press" /> +   image_selected="Icon_Close_Press" +   pad_right="4" +   width="16" />  </search_editor> diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp index f7ac5361c5..ef93586c6e 100644 --- a/indra/newview/tests/lllogininstance_test.cpp +++ b/indra/newview/tests/lllogininstance_test.cpp @@ -2,7 +2,7 @@   * @file   lllogininstance_test.cpp   * @brief  Test for lllogininstance.cpp.   *  - * $LicenseInfo:firstyear=2008&license=internal$ + * $LicenseInfo:firstyear=2008&license=viewergpl$   * Copyright (c) 2008, Linden Research, Inc.   * $/LicenseInfo$   */ diff --git a/indra/newview/tests/llxmlrpclistener_test.cpp b/indra/newview/tests/llxmlrpclistener_test.cpp index c94ba0a3e8..c2c7e963b9 100644 --- a/indra/newview/tests/llxmlrpclistener_test.cpp +++ b/indra/newview/tests/llxmlrpclistener_test.cpp @@ -4,7 +4,7 @@   * @date   2009-03-20   * @brief  Test for llxmlrpclistener.   *  - * $LicenseInfo:firstyear=2009&license=internal$ + * $LicenseInfo:firstyear=2009&license=viewergpl$   * Copyright (c) 2009, Linden Research, Inc.   * $/LicenseInfo$   */ | 
