diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2018-07-16 17:27:29 +0000 | 
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2018-07-16 17:27:29 +0000 | 
| commit | 24648780469ca704a7bafaafa4f10dcda268d89a (patch) | |
| tree | 974ef0ae9f5f47538f96cb5924b8168e4bd57218 | |
| parent | bb6e8372f4c7e0c80d49727a6f509e49a22083ee (diff) | |
| parent | 1e883c5b3936abd8791a7a0350bd2ddac1f72161 (diff) | |
Merged in andreykproductengine/maint-neko2 (pull request #656)
MAINT-8844 Fixed selection inconsistancies (inworld manipulation vs tool floater)
Approved-by: Simon Linden <simon@lindenlab.com>
Approved-by: Maxim Nikolenko <maximnproductengine@lindenlab.com>
Approved-by: Andrey Lihatskiy <andreylproductengine@lindenlab.com>
| -rw-r--r-- | indra/newview/llpanelobject.cpp | 18 | ||||
| -rw-r--r-- | indra/newview/llselectmgr.cpp | 33 | ||||
| -rw-r--r-- | indra/newview/llselectmgr.h | 5 | ||||
| -rw-r--r-- | indra/newview/llviewerwindow.cpp | 33 | 
4 files changed, 54 insertions, 35 deletions
| diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index 25cfb598e7..3665910c63 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -341,21 +341,17 @@ void LLPanelObject::getState( )  		return;  	} -	// 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() && ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()) && (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() || !gSavedSettings.getBOOL("EditLinkedParts")); -  	S32 selected_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();  	BOOL single_volume = (LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ))  						 && (selected_count == 1); -	if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() > 1) -	{ -		enable_move = FALSE; -		enable_scale = FALSE; -		enable_rotate = FALSE; -	} +	bool enable_move; +	bool enable_modify; + +	LLSelectMgr::getInstance()->selectGetEditMoveLinksetPermissions(enable_move, enable_modify); + +	BOOL enable_scale = enable_modify; +	BOOL enable_rotate = enable_move; // already accounts for a case of children, which needs permModify() as well  	LLVector3 vec;  	if (enable_move) diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index ddae109030..f3cac0abdf 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -3676,6 +3676,39 @@ void LLSelectMgr::selectForceDelete()  		SEND_ONLY_ROOTS);  } +BOOL LLSelectMgr::selectGetEditMoveLinksetPermissions(bool &move, bool &modify) +{ +    move = true; +    modify = true; +    bool selecting_linked_set = !gSavedSettings.getBOOL("EditLinkedParts"); + +    for (LLObjectSelection::iterator iter = getSelection()->begin(); +        iter != getSelection()->end(); iter++) +    { +        LLSelectNode* nodep = *iter; +        if (!nodep->mValid) +        { +            move = false; +            modify = false; +            return FALSE; +        } + +        LLViewerObject* object = nodep->getObject(); +        LLViewerObject *root_object = (object == NULL) ? NULL : object->getRootEdit(); +        bool this_object_movable = false; +        if (object->permMove() && !object->isPermanentEnforced() && +            ((root_object == NULL) || !root_object->isPermanentEnforced()) && +            (object->permModify() || selecting_linked_set)) +        { +            this_object_movable = true; +        } +        move = move && this_object_movable; +        modify = modify && object->permModify(); +    } + +    return TRUE; +} +  void LLSelectMgr::selectGetAggregateSaleInfo(U32 &num_for_sale,  											 BOOL &is_for_sale_mixed,   											 BOOL &is_sale_price_mixed, diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index e965dd80d5..87ac899325 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -675,6 +675,11 @@ public:  	// returns TRUE if all the nodes are valid. Accumulates  	// permissions in the parameter.  	BOOL selectGetPermissions(LLPermissions& perm); + +	// returns TRUE if all the nodes are valid. Depends onto "edit linked" state +	// Children in linksets are a bit special - they require not only move permission +	// but also modify if "edit linked" is set, since you move them relative to parent +	BOOL selectGetEditMoveLinksetPermissions(bool &move, bool &modify);  	// Get a bunch of useful sale information for the object(s) selected.  	// "_mixed" is true if not all objects have the same setting. diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index cef19c9c2d..01ec703fe6 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -3826,37 +3826,22 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,  			{  				if( !LLSelectMgr::getInstance()->getSelection()->isEmpty() )  				{ -					BOOL moveable_object_selected = FALSE; -					BOOL all_selected_objects_move = TRUE; -					BOOL all_selected_objects_modify = TRUE; -					BOOL selecting_linked_set = !gSavedSettings.getBOOL("EditLinkedParts"); - -					for (LLObjectSelection::iterator iter = LLSelectMgr::getInstance()->getSelection()->begin(); -						 iter != LLSelectMgr::getInstance()->getSelection()->end(); iter++) -					{ -						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() && -							((root_object == NULL) || !root_object->isPermanentEnforced()) && -							(object->permModify() || selecting_linked_set)) -						{ -							moveable_object_selected = TRUE; -							this_object_movable = TRUE; -						} -						all_selected_objects_move = all_selected_objects_move && this_object_movable; -						all_selected_objects_modify = all_selected_objects_modify && object->permModify(); -					} +					bool all_selected_objects_move; +					bool all_selected_objects_modify; +					// Note: This might be costly to do on each frame and when a lot of objects are selected +					// we might be better off with some kind of memory for selection and/or states, consider +					// optimizing, perhaps even some kind of selection generation at level of LLSelectMgr to +					// make whole viewer benefit. +					LLSelectMgr::getInstance()->selectGetEditMoveLinksetPermissions(all_selected_objects_move, all_selected_objects_modify);  					BOOL draw_handles = TRUE; -					if (tool == LLToolCompTranslate::getInstance() && (!moveable_object_selected || !all_selected_objects_move)) +					if (tool == LLToolCompTranslate::getInstance() && !all_selected_objects_move)  					{  						draw_handles = FALSE;  					} -					if (tool == LLToolCompRotate::getInstance() && (!moveable_object_selected || !all_selected_objects_move)) +					if (tool == LLToolCompRotate::getInstance() && !all_selected_objects_move)  					{  						draw_handles = FALSE;  					} | 
