diff options
| author | Todd Stinson <stinson@lindenlab.com> | 2012-03-30 15:42:43 -0700 | 
|---|---|---|
| committer | Todd Stinson <stinson@lindenlab.com> | 2012-03-30 15:42:43 -0700 | 
| commit | c1a5d6a36b925728d98c37522ed7ae53e3a87155 (patch) | |
| tree | f6bb8cff46ade72e57e0a03a5381234db0befc9c | |
| parent | fcda925072c51de749e6b35b3863f29d8be3eaa6 (diff) | |
PATH-450: Disabling the movement and shape manipulation widgets when editing an item in a linked set.
| -rw-r--r-- | indra/newview/llmaniprotate.cpp | 24 | ||||
| -rw-r--r-- | indra/newview/llmanipscale.cpp | 30 | ||||
| -rw-r--r-- | indra/newview/llmaniptranslate.cpp | 9 | ||||
| -rw-r--r-- | indra/newview/llpanelobject.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llpanelvolume.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llselectmgr.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/llviewerwindow.cpp | 5 | 
7 files changed, 64 insertions, 20 deletions
| diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index 7ac347e66a..826e8d560a 100644 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -479,9 +479,12 @@ BOOL LLManipRotate::handleMouseUp(S32 x, S32 y, MASK mask)  		{  			LLSelectNode* selectNode = *iter;  			LLViewerObject* object = selectNode->getObject(); +			LLViewerObject* root_object = (object == NULL) ? NULL : object->getRootEdit();  			// have permission to move and object is root of selection or individually selected -			if (object->permMove() && !object->isPermanentEnforced() && (object->isRootEdit() || selectNode->mIndividualSelection)) +			if (object->permMove() && !object->isPermanentEnforced() && +				((root_object == NULL) || !root_object->isPermanentEnforced()) && +				(object->isRootEdit() || selectNode->mIndividualSelection))  			{  				object->mUnselectedChildrenPositions.clear() ;  			} @@ -567,9 +570,12 @@ void LLManipRotate::drag( S32 x, S32 y )  	{  		LLSelectNode* selectNode = *iter;  		LLViewerObject* object = selectNode->getObject(); +		LLViewerObject* root_object = (object == NULL) ? NULL : object->getRootEdit();  		// have permission to move and object is root of selection or individually selected -		if (object->permMove() && !object->isPermanentEnforced() && (object->isRootEdit() || selectNode->mIndividualSelection)) +		if (object->permMove() && !object->isPermanentEnforced() && +			((root_object == NULL) || !root_object->isPermanentEnforced()) && +			(object->isRootEdit() || selectNode->mIndividualSelection))  		{  			if (!object->isRootEdit())  			{ @@ -621,9 +627,11 @@ void LLManipRotate::drag( S32 x, S32 y )  	{  		LLSelectNode* selectNode = *iter;  		LLViewerObject* object = selectNode->getObject(); +		LLViewerObject* root_object = (object == NULL) ? NULL : object->getRootEdit();  		// to avoid cumulative position changes we calculate the objects new position using its saved position -		if (object && object->permMove() && !object->isPermanentEnforced()) +		if (object && object->permMove() && !object->isPermanentEnforced() && +			((root_object == NULL) || !root_object->isPermanentEnforced()))  		{  			LLVector3 center   = gAgent.getPosAgentFromGlobal( mRotationCenter ); @@ -704,7 +712,10 @@ void LLManipRotate::drag( S32 x, S32 y )  	{  		LLSelectNode* selectNode = *iter;  		LLViewerObject*cur = selectNode->getObject(); -		if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() && !cur->isAvatar()) +		LLViewerObject *root_object = (cur == NULL) ? NULL : cur->getRootEdit(); +		if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() && +			((root_object == NULL) || !root_object->isPermanentEnforced()) && +			!cur->isAvatar())  		{  			selectNode->mLastRotation = cur->getRotation();  			selectNode->mLastPositionLocal = cur->getPosition(); @@ -1871,7 +1882,10 @@ BOOL LLManipRotate::canAffectSelection()  		{  			virtual bool apply(LLViewerObject* objectp)  			{ -				return objectp->permMove() && !objectp->isPermanentEnforced() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts")); +				LLViewerObject *root_object = (objectp == NULL) ? NULL : objectp->getRootEdit(); +				return objectp->permMove() && !objectp->isPermanentEnforced() && +					((root_object == NULL) || !root_object->isPermanentEnforced()) && +					(objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));  			}  		} func;  		can_rotate = mObjectSelection->applyToObjects(&func); diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index 160ba40433..bc6a94d61f 100644 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -826,7 +826,10 @@ void LLManipScale::drag( S32 x, S32 y )  	{  		LLSelectNode* selectNode = *iter;  		LLViewerObject*cur = selectNode->getObject(); -		if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() && !cur->isAvatar()) +		LLViewerObject *root_object = (cur == NULL) ? NULL : cur->getRootEdit(); +		if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() && +			((root_object == NULL) || root_object->isPermanentEnforced()) && +			!cur->isAvatar())  		{  			selectNode->mLastScale = cur->getScale();  			selectNode->mLastPositionLocal = cur->getPosition(); @@ -973,7 +976,10 @@ void LLManipScale::dragCorner( S32 x, S32 y )  	{  		LLSelectNode* selectNode = *iter;  		LLViewerObject* cur = selectNode->getObject(); -		if(  cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() && !cur->isAvatar() ) +		LLViewerObject *root_object = (cur == NULL) ? NULL : cur->getRootEdit(); +		if(  cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() && +			((root_object == NULL) || !root_object->isPermanentEnforced()) && +			!cur->isAvatar() )  		{  			const LLVector3& scale = selectNode->mSavedScale; @@ -995,7 +1001,10 @@ void LLManipScale::dragCorner( S32 x, S32 y )  	{  		LLSelectNode* selectNode = *iter;  		LLViewerObject* cur = selectNode->getObject(); -		if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() && !cur->isAvatar() && cur->isRootEdit() ) +		LLViewerObject *root_object = (cur == NULL) ? NULL : cur->getRootEdit(); +		if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() && +			((root_object == NULL) && !root_object->isPermanentEnforced()) && +			!cur->isAvatar() && cur->isRootEdit() )  		{  			const LLVector3& scale = selectNode->mSavedScale;  			cur->setScale( scale_factor * scale ); @@ -1043,7 +1052,10 @@ void LLManipScale::dragCorner( S32 x, S32 y )  	{  		LLSelectNode* selectNode = *iter;  		LLViewerObject*cur = selectNode->getObject(); -		if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() && !cur->isAvatar() && !cur->isRootEdit() ) +		LLViewerObject *root_object = (cur == NULL) ? NULL : cur->getRootEdit(); +		if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() && +			((root_object == NULL) || !root_object->isPermanentEnforced()) && +			!cur->isAvatar() && !cur->isRootEdit() )  		{  			const LLVector3& scale = selectNode->mSavedScale;  			cur->setScale( scale_factor * scale, FALSE ); @@ -1251,7 +1263,10 @@ void LLManipScale::stretchFace( const LLVector3& drag_start_agent, const LLVecto  	{  		LLSelectNode* selectNode = *iter;  		LLViewerObject*cur = selectNode->getObject(); -		if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() && !cur->isAvatar() ) +		LLViewerObject *root_object = (cur == NULL) ? NULL : cur->getRootEdit(); +		if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() && +			((root_object == NULL) || !root_object->isPermanentEnforced()) && +			!cur->isAvatar() )  		{  			LLBBox cur_bbox			= cur->getBoundingBoxAgent();  			LLVector3 start_local	= cur_bbox.agentToLocal( drag_start_agent ); @@ -2057,7 +2072,10 @@ BOOL LLManipScale::canAffectSelection()  		{  			virtual bool apply(LLViewerObject* objectp)  			{ -				return objectp->permModify() && objectp->permMove() && !objectp->isPermanentEnforced() && !objectp->isSeat(); +				LLViewerObject *root_object = (objectp == NULL) ? NULL : objectp->getRootEdit(); +				return objectp->permModify() && objectp->permMove() && !objectp->isPermanentEnforced() && +					((root_object == NULL) || !root_object->isPermanentEnforced()) && +					!objectp->isSeat();  			}  		} func;  		can_scale = mObjectSelection->applyToObjects(&func); diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index e6ccfc0af5..7a35562f86 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -687,7 +687,9 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)  			}  		} -		if (object->permMove() && !object->isPermanentEnforced()) +		LLViewerObject* root_object = (object == NULL) ? NULL : object->getRootEdit(); +		if (object->permMove() && !object->isPermanentEnforced() && +			((root_object == NULL) || !root_object->isPermanentEnforced()))  		{  			// handle attachments in local space  			if (object->isAttachment() && object->mDrawable.notNull()) @@ -2281,7 +2283,10 @@ BOOL LLManipTranslate::canAffectSelection()  		{  			virtual bool apply(LLViewerObject* objectp)  			{ -				return objectp->permMove() && !objectp->isPermanentEnforced() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts")); +				LLViewerObject *root_object = (objectp == NULL) ? NULL : objectp->getRootEdit(); +				return objectp->permMove() && !objectp->isPermanentEnforced() && +					((root_object == NULL) || !root_object->isPermanentEnforced()) && +					(objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));  			}  		} func;  		can_move = mObjectSelection->applyToObjects(&func); diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index 028ca82fed..d0c60c3e62 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -350,9 +350,9 @@ void LLPanelObject::getState( )  	}  	// can move or rotate only linked group with move permissions, or sub-object with move and modify perms -	BOOL enable_move	= objectp->permMove() && !objectp->isPermanentEnforced() && !objectp->isAttachment() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts")); -	BOOL enable_scale	= objectp->permMove() && !objectp->isPermanentEnforced() && objectp->permModify(); -	BOOL enable_rotate	= objectp->permMove() && !objectp->isPermanentEnforced() && ( (objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts")); +	BOOL enable_move	= objectp->permMove() && !objectp->isPermanentEnforced() && ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()) && !objectp->isAttachment() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts")); +	BOOL enable_scale	= objectp->permMove() && !objectp->isPermanentEnforced() && ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()) && objectp->permModify(); +	BOOL enable_rotate	= objectp->permMove() && !objectp->isPermanentEnforced() && ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()) && ( (objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts"));  	S32 selected_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();  	BOOL single_volume = (LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME )) diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index 80dc2c0013..58c38387c3 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -495,7 +495,7 @@ void LLPanelVolume::getState( )  	mComboPhysicsShapeType->add(getString("Convex Hull"), LLSD(2));	  	mComboPhysicsShapeType->setValue(LLSD(objectp->getPhysicsShapeType())); -	mComboPhysicsShapeType->setEnabled(editable && !objectp->isPermanentEnforced()); +	mComboPhysicsShapeType->setEnabled(editable && !objectp->isPermanentEnforced() && ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()));  	mObject = objectp;  	mRootObject = root_objectp; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 44a0b3adc4..49c568039c 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -644,7 +644,9 @@ bool LLSelectMgr::enableLinkObjects()  			{  				virtual bool apply(LLViewerObject* object)  				{ -					return object->permModify() && !object->isPermanentEnforced(); +					LLViewerObject *root_object = (object == NULL) ? NULL : object->getRootEdit(); +					return object->permModify() && !object->isPermanentEnforced() && +						((root_object == NULL) || !root_object->isPermanentEnforced());  				}  			} func;  			const bool firstonly = true; @@ -657,10 +659,12 @@ bool LLSelectMgr::enableLinkObjects()  bool LLSelectMgr::enableUnlinkObjects()  {  	LLViewerObject* first_editable_object = LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject(); +	LLViewerObject *root_object = (first_editable_object == NULL) ? NULL : first_editable_object->getRootEdit();  	bool new_value = LLSelectMgr::getInstance()->selectGetAllRootsValid() &&  		first_editable_object && -		!first_editable_object->isAttachment() && !first_editable_object->isPermanentEnforced(); +		!first_editable_object->isAttachment() && !first_editable_object->isPermanentEnforced() && +		((root_object == NULL) || !root_object->isPermanentEnforced());  	return new_value;  } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 49e07a1fe3..3b41cdcdff 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -3529,8 +3529,11 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,  					{  						LLSelectNode* nodep = *iter;  						LLViewerObject* object = nodep->getObject(); +						LLViewerObject *root_object = (object == NULL) ? NULL : object->getRootEdit();  						BOOL this_object_movable = FALSE; -						if (object->permMove() && !object->isPermanentEnforced() && (object->permModify() || selecting_linked_set)) +						if (object->permMove() && !object->isPermanentEnforced() && +							((root_object == NULL) || !root_object->isPermanentEnforced()) && +							(object->permModify() || selecting_linked_set))  						{  							moveable_object_selected = TRUE;  							this_object_movable = TRUE; | 
