diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llfloatertools.cpp | 16 | ||||
| -rw-r--r-- | indra/newview/llfloatertools.h | 2 | ||||
| -rw-r--r-- | indra/newview/llselectmgr.cpp | 98 | ||||
| -rw-r--r-- | indra/newview/llselectmgr.h | 11 | ||||
| -rw-r--r-- | indra/newview/llviewermenu.cpp | 112 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_tools.xml | 53 | 
6 files changed, 168 insertions, 124 deletions
| diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 370bf05bf7..364fbad193 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -220,6 +220,8 @@ BOOL	LLFloaterTools::postBuild()  	mRadioGroupEdit		= getChild<LLRadioGroup>("edit_radio_group");  	mBtnGridOptions		= getChild<LLButton>("Options...");  	mTitleMedia			= getChild<LLMediaCtrl>("title_media"); +	mBtnLink			= getChild<LLButton>("link_btn"); +	mBtnUnlink			= getChild<LLButton>("unlink_btn");  	mCheckSelectIndividual	= getChild<LLCheckBoxCtrl>("checkbox edit linked parts");	  	getChild<LLUICtrl>("checkbox edit linked parts")->setValue((BOOL)gSavedSettings.getBOOL("EditLinkedParts")); @@ -315,6 +317,9 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)  	mBtnRotateReset(NULL),  	mBtnRotateRight(NULL), +	mBtnLink(NULL), +	mBtnUnlink(NULL), +  	mBtnDelete(NULL),  	mBtnDuplicate(NULL),  	mBtnDuplicateInPlace(NULL), @@ -341,7 +346,7 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)  	mNeedMediaTitle(TRUE)  {  	gFloaterTools = this; -	 +  	setAutoFocus(FALSE);  	mFactoryMap["General"] = LLCallbackMap(createPanelPermissions, this);//LLPanelPermissions  	mFactoryMap["Object"] = LLCallbackMap(createPanelObject, this);//LLPanelObject @@ -366,6 +371,9 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)  	mCommitCallbackRegistrar.add("BuildTool.DeleteMedia",		boost::bind(&LLFloaterTools::onClickBtnDeleteMedia,this));  	mCommitCallbackRegistrar.add("BuildTool.EditMedia",			boost::bind(&LLFloaterTools::onClickBtnEditMedia,this)); +	mCommitCallbackRegistrar.add("BuildTool.LinkObjects",		boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance())); +	mCommitCallbackRegistrar.add("BuildTool.UnlinkObjects",		boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance())); +  }  LLFloaterTools::~LLFloaterTools() @@ -566,6 +574,12 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)  	bool linked_parts = gSavedSettings.getBOOL("EditLinkedParts");  	getChildView("RenderingCost")->setVisible( !linked_parts && (edit_visible || focus_visible || move_visible) && sShowObjectCost); +	mBtnLink->setVisible(edit_visible); +	mBtnUnlink->setVisible(edit_visible); + +	mBtnLink->setEnabled(LLSelectMgr::instance().enableLinkObjects()); +	mBtnUnlink->setEnabled(LLSelectMgr::instance().enableUnlinkObjects()); +  	if (mCheckSelectIndividual)  	{  		mCheckSelectIndividual->setVisible(edit_visible); diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index 87c3d2ab47..fd81a75397 100644 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -135,6 +135,8 @@ public:  	LLRadioGroup*	mRadioGroupEdit;  	LLCheckBoxCtrl	*mCheckSelectIndividual; +	LLButton*		mBtnLink; +	LLButton*		mBtnUnlink;  	LLCheckBoxCtrl*	mCheckSnapToGrid;  	LLButton*		mBtnGridOptions; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index da891d1c51..50bc0b4a98 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -65,6 +65,7 @@  #include "llinventorymodel.h"  #include "llmenugl.h"  #include "llmutelist.h" +#include "llnotificationsutil.h"  #include "llsidepaneltaskinfo.h"  #include "llslurl.h"  #include "llstatusbar.h" @@ -562,6 +563,103 @@ BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id)  	return object_found;  } +bool LLSelectMgr::linkObjects() +{ +	if (!LLSelectMgr::getInstance()->selectGetAllRootsValid()) +	{ +		LLNotificationsUtil::add("UnableToLinkWhileDownloading"); +		return true; +	} + +	S32 object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount(); +	if (object_count > MAX_CHILDREN_PER_TASK + 1) +	{ +		LLSD args; +		args["COUNT"] = llformat("%d", object_count); +		int max = MAX_CHILDREN_PER_TASK+1; +		args["MAX"] = llformat("%d", max); +		LLNotificationsUtil::add("UnableToLinkObjects", args); +		return true; +	} + +	if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() < 2) +	{ +		LLNotificationsUtil::add("CannotLinkIncompleteSet"); +		return true; +	} + +	if (!LLSelectMgr::getInstance()->selectGetRootsModify()) +	{ +		LLNotificationsUtil::add("CannotLinkModify"); +		return true; +	} + +	LLUUID owner_id; +	std::string owner_name; +	if (!LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name)) +	{ +		// we don't actually care if you're the owner, but novices are +		// the most likely to be stumped by this one, so offer the +		// easiest and most likely solution. +		LLNotificationsUtil::add("CannotLinkDifferentOwners"); +		return true; +	} + +	LLSelectMgr::getInstance()->sendLink(); + +	return true; +} + +bool LLSelectMgr::unlinkObjects() +{ +	LLSelectMgr::getInstance()->sendDelink(); +	return true; +} + +// in order to link, all objects must have the same owner, and the +// agent must have the ability to modify all of the objects. However, +// we're not answering that question with this method. The question +// we're answering is: does the user have a reasonable expectation +// that a link operation should work? If so, return true, false +// otherwise. this allows the handle_link method to more finely check +// the selection and give an error message when the uer has a +// reasonable expectation for the link to work, but it will fail. +bool LLSelectMgr::enableLinkObjects() +{ +	bool new_value = false; +	// check if there are at least 2 objects selected, and that the +	// user can modify at least one of the selected objects. + +	// in component mode, can't link +	if (!gSavedSettings.getBOOL("EditLinkedParts")) +	{ +		if(LLSelectMgr::getInstance()->selectGetAllRootsValid() && LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() >= 2) +		{ +			struct f : public LLSelectedObjectFunctor +			{ +				virtual bool apply(LLViewerObject* object) +				{ +					return object->permModify(); +				} +			} func; +			const bool firstonly = true; +			new_value = LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, firstonly); +		} +	} +	return new_value; +} + +bool LLSelectMgr::enableUnlinkObjects() +{ +	LLViewerObject* first_editable_object = LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject(); + +	bool new_value = LLSelectMgr::getInstance()->selectGetAllRootsValid() && +		first_editable_object && +		!first_editable_object->isAttachment(); + +	return new_value; +} +  void LLSelectMgr::deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_sim, BOOL include_entire_object)  {  	// bail if nothing selected or if object wasn't selected in the first place diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 65a9a493f6..cb387f5c3c 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -440,6 +440,17 @@ public:  	BOOL removeObjectFromSelections(const LLUUID &id);  	//////////////////////////////////////////////////////////////// +	// Selection editing +	//////////////////////////////////////////////////////////////// +	bool linkObjects(); + +	bool unlinkObjects(); + +	bool enableLinkObjects(); + +	bool enableUnlinkObjects(); + +	////////////////////////////////////////////////////////////////  	// Selection accessors  	////////////////////////////////////////////////////////////////  	LLObjectSelectionHandle	getSelection() { return mSelectedObjects; } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 7cc04e0338..0a76f8e716 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -4781,110 +4781,6 @@ class LLToolsSelectNextPart : public view_listener_t  	}  }; -// in order to link, all objects must have the same owner, and the -// agent must have the ability to modify all of the objects. However, -// we're not answering that question with this method. The question -// we're answering is: does the user have a reasonable expectation -// that a link operation should work? If so, return true, false -// otherwise. this allows the handle_link method to more finely check -// the selection and give an error message when the uer has a -// reasonable expectation for the link to work, but it will fail. -class LLToolsEnableLink : public view_listener_t -{ -	bool handleEvent(const LLSD& userdata) -	{ -		bool new_value = false; -		// check if there are at least 2 objects selected, and that the -		// user can modify at least one of the selected objects. - -		// in component mode, can't link -		if (!gSavedSettings.getBOOL("EditLinkedParts")) -		{ -			if(LLSelectMgr::getInstance()->selectGetAllRootsValid() && LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() >= 2) -			{ -				struct f : public LLSelectedObjectFunctor -				{ -					virtual bool apply(LLViewerObject* object) -					{ -						return object->permModify(); -					} -				} func; -				const bool firstonly = true; -				new_value = LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, firstonly); -			} -		} -		return new_value; -	} -}; - -class LLToolsLink : public view_listener_t -{ -	bool handleEvent(const LLSD& userdata) -	{ -		if(!LLSelectMgr::getInstance()->selectGetAllRootsValid()) -		{ -			LLNotificationsUtil::add("UnableToLinkWhileDownloading"); -			return true; -		} - -		S32 object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount(); -		if (object_count > MAX_CHILDREN_PER_TASK + 1) -		{ -			LLSD args; -			args["COUNT"] = llformat("%d", object_count); -			int max = MAX_CHILDREN_PER_TASK+1; -			args["MAX"] = llformat("%d", max); -			LLNotificationsUtil::add("UnableToLinkObjects", args); -			return true; -		} - -		if(LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() < 2) -		{ -			LLNotificationsUtil::add("CannotLinkIncompleteSet"); -			return true; -		} -		if(!LLSelectMgr::getInstance()->selectGetRootsModify()) -		{ -			LLNotificationsUtil::add("CannotLinkModify"); -			return true; -		} -		LLUUID owner_id; -		std::string owner_name; -		if(!LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name)) -		{ -			// we don't actually care if you're the owner, but novices are -			// the most likely to be stumped by this one, so offer the -			// easiest and most likely solution. -			LLNotificationsUtil::add("CannotLinkDifferentOwners"); -			return true; -		} -		LLSelectMgr::getInstance()->sendLink(); -		return true; -	} -}; - -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() && -			first_editable_object && -			!first_editable_object->isAttachment(); -		return new_value; -	} -}; - -class LLToolsUnlink : public view_listener_t -{ -	bool handleEvent(const LLSD& userdata) -	{ -		LLSelectMgr::getInstance()->sendDelink(); -		return true; -	} -}; - -  class LLToolsStopAllAnimations : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -7902,8 +7798,8 @@ void initialize_menus()  	view_listener_t::addMenu(new LLToolsSnapObjectXY(), "Tools.SnapObjectXY");  	view_listener_t::addMenu(new LLToolsUseSelectionForGrid(), "Tools.UseSelectionForGrid");  	view_listener_t::addMenu(new LLToolsSelectNextPart(), "Tools.SelectNextPart"); -	view_listener_t::addMenu(new LLToolsLink(), "Tools.Link"); -	view_listener_t::addMenu(new LLToolsUnlink(), "Tools.Unlink"); +	commit.add("Tools.Link", boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance())); +	commit.add("Tools.Unlink", boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance()));  	view_listener_t::addMenu(new LLToolsStopAllAnimations(), "Tools.StopAllAnimations");  	view_listener_t::addMenu(new LLToolsReleaseKeys(), "Tools.ReleaseKeys");  	view_listener_t::addMenu(new LLToolsEnableReleaseKeys(), "Tools.EnableReleaseKeys");	 @@ -7916,8 +7812,8 @@ void initialize_menus()  	view_listener_t::addMenu(new LLToolsEnableToolNotPie(), "Tools.EnableToolNotPie");  	view_listener_t::addMenu(new LLToolsEnableSelectNextPart(), "Tools.EnableSelectNextPart"); -	view_listener_t::addMenu(new LLToolsEnableLink(), "Tools.EnableLink"); -	view_listener_t::addMenu(new LLToolsEnableUnlink(), "Tools.EnableUnlink"); +	enable.add("Tools.EnableLink", boost::bind(&LLSelectMgr::enableLinkObjects, LLSelectMgr::getInstance())); +	enable.add("Tools.EnableUnlink", boost::bind(&LLSelectMgr::enableUnlinkObjects, LLSelectMgr::getInstance()));  	view_listener_t::addMenu(new LLToolsEnableBuyOrTake(), "Tools.EnableBuyOrTake");  	enable.add("Tools.EnableTakeCopy", boost::bind(&enable_object_take_copy));  	enable.add("Tools.VisibleBuyObject", boost::bind(&tools_visible_buy_object)); diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index b16124cb7e..d00b2319de 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -248,30 +248,53 @@  			function="BuildTool.commitRadioEdit"/>      </radio_group>      <check_box -     left="10" +     left="5"       follows="left|top"       height="28"  	 control_name="EditLinkedParts"       label="Edit linked"       layout="topleft"       name="checkbox edit linked parts" -     top_pad="2"> +     top_pad="-10">  		  <check_box.commit_callback  			function="BuildTool.selectComponent"/>  	</check_box> -   <text -   text_color="LtGray_50" -   follows="top|left" -   halign="left" -   left="13" -   name="RenderingCost" -   tool_tip="Shows the rendering cost calculated for this object" -   top_pad="0" -   type="string" -   width="100"> -   þ: [COUNT] -   </text> +   <button +     follows="left|top" +     height="23" +     label="Link" +     top_pad="2" +     layout="topleft" +     left="5" +     name="link_btn" +     width="50"> +	  <button.commit_callback +	     function="BuildTool.LinkObjects"/> +    </button> +    <button +     follows="left|top" +     height="23" +     label="Unlink" +     layout="topleft" +     left_pad="2" +     name="unlink_btn" +     width="50"> +	  <button.commit_callback +	     function="BuildTool.UnlinkObjects"/> +    </button> +    <text +	   text_color="LtGray_50" +	   follows="top|left" +	   halign="left" +	   left_pad="3" +	   name="RenderingCost" +	   tool_tip="Shows the rendering cost calculated for this object" +	   top_delta="11" +	   type="string" +	   width="100"> +	   þ: [COUNT] +	   </text>  	<check_box       control_name="ScaleUniform"       height="19" @@ -299,7 +322,7 @@       layout="topleft"       left="143"       name="checkbox stretch textures" -     top_pad="7" +     top_pad="-6"       width="134" />     <check_box       control_name="SnapEnabled" | 
