diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llselectmgr.cpp | 91 | ||||
| -rw-r--r-- | indra/newview/llselectmgr.h | 19 | ||||
| -rw-r--r-- | indra/newview/llviewermenu.cpp | 10 | 
3 files changed, 104 insertions, 16 deletions
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 3df6f25917..b726e841f8 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -152,6 +152,53 @@ struct LLDeRezInfo  // Imports  // +//----------------------------------------------------------------------------- +// ~LLSelectionCallbackData() +//----------------------------------------------------------------------------- + +LLSelectionCallbackData::LLSelectionCallbackData() +{ +    LLSelectMgr *instance = LLSelectMgr::getInstance(); +    LLObjectSelectionHandle selection = instance->getSelection(); +    if (!selection->getNumNodes()) +    { +        return; +    } +    mSelectedObjects = new LLObjectSelection(); + +    for (LLObjectSelection::iterator iter = selection->begin(); +        iter != selection->end();) +    { +        LLObjectSelection::iterator curiter = iter++; + +        LLSelectNode *nodep = *curiter; +        LLViewerObject* objectp = nodep->getObject(); + +        if (!objectp) +        { +            mSelectedObjects->mSelectType = SELECT_TYPE_WORLD; +        } +        else +        { +            LLSelectNode* new_nodep = new LLSelectNode(*nodep); +            mSelectedObjects->addNode(new_nodep); + +            if (objectp->isHUDAttachment()) +            { +                mSelectedObjects->mSelectType = SELECT_TYPE_HUD; +            } +            else if (objectp->isAttachment()) +            { +                mSelectedObjects->mSelectType = SELECT_TYPE_ATTACHMENT; +            } +            else +            { +                mSelectedObjects->mSelectType = SELECT_TYPE_WORLD; +            } +        } +    } +} +  //  // Functions @@ -4472,9 +4519,19 @@ void LLSelectMgr::selectionSetObjectSaleInfo(const LLSaleInfo& sale_info)  void LLSelectMgr::sendAttach(U8 attachment_point, bool replace)  { -	LLViewerObject* attach_object = mSelectedObjects->getFirstRootObject(); +    sendAttach(mSelectedObjects, attachment_point, replace); +} -	if (!attach_object || !isAgentAvatarValid() || mSelectedObjects->mSelectType != SELECT_TYPE_WORLD) +void LLSelectMgr::sendAttach(LLObjectSelectionHandle selection_handle, U8 attachment_point, bool replace) +{ +	if (selection_handle.isNull()) +	{ +		return; +	} + +	LLViewerObject* attach_object = selection_handle->getFirstRootObject(); + +	if (!attach_object || !isAgentAvatarValid() || selection_handle->mSelectType != SELECT_TYPE_WORLD)  	{  		return;  	} @@ -4492,6 +4549,7 @@ void LLSelectMgr::sendAttach(U8 attachment_point, bool replace)  		}  		sendListToRegions( +			selection_handle,  			"ObjectAttach",  			packAgentIDAndSessionAndAttachment,   			packObjectIDAndRotation,  @@ -4503,6 +4561,7 @@ void LLSelectMgr::sendAttach(U8 attachment_point, bool replace)  			// After "ObjectAttach" server will unsubscribe us from properties updates  			// so either deselect objects or resend selection after attach packet reaches server  			// In case of build_mode LLPanelObjectInventory::refresh() will deal with selection +			// Still unsubscribe even in case selection_handle is not current selection  			deselectAll();  		}  	} @@ -5044,7 +5103,17 @@ void LLSelectMgr::packPermissions(LLSelectNode* node, void *user_data)  void LLSelectMgr::sendListToRegions(const std::string& message_name,  									void (*pack_header)(void *user_data),   									void (*pack_body)(LLSelectNode* node, void *user_data),  -                                    void (*log_func)(LLSelectNode* node, void *user_data),  +									void (*log_func)(LLSelectNode* node, void *user_data),  +									void *user_data, +									ESendType send_type) +{ +    sendListToRegions(mSelectedObjects, message_name, pack_header, pack_body, log_func, user_data, send_type); +} +void LLSelectMgr::sendListToRegions(LLObjectSelectionHandle selected_handle, +									const std::string& message_name, +									void (*pack_header)(void *user_data),  +									void (*pack_body)(LLSelectNode* node, void *user_data),  +									void (*log_func)(LLSelectNode* node, void *user_data),   									void *user_data,  									ESendType send_type)  { @@ -5070,7 +5139,7 @@ void LLSelectMgr::sendListToRegions(const std::string& message_name,  			return true;  		}  	} func; -	getSelection()->applyToNodes(&func);	 +	selected_handle->applyToNodes(&func);  	std::queue<LLSelectNode*> nodes_to_send; @@ -5113,25 +5182,25 @@ void LLSelectMgr::sendListToRegions(const std::string& message_name,  	{  	  case SEND_ONLY_ROOTS:  		  if(message_name == "ObjectBuy") -			getSelection()->applyToRootNodes(&pushroots); +			selected_handle->applyToRootNodes(&pushroots);  		  else -			getSelection()->applyToRootNodes(&pushall); +			selected_handle->applyToRootNodes(&pushall);  		break;  	  case SEND_INDIVIDUALS: -		getSelection()->applyToNodes(&pushall); +		selected_handle->applyToNodes(&pushall);  		break;  	  case SEND_ROOTS_FIRST:  		// first roots... -		getSelection()->applyToNodes(&pushroots); +		selected_handle->applyToNodes(&pushroots);  		// then children... -		getSelection()->applyToNodes(&pushnonroots); +		selected_handle->applyToNodes(&pushnonroots);  		break;  	  case SEND_CHILDREN_FIRST:  		// first children... -		getSelection()->applyToNodes(&pushnonroots); +		selected_handle->applyToNodes(&pushnonroots);  		// then roots... -		getSelection()->applyToNodes(&pushroots); +		selected_handle->applyToNodes(&pushroots);  		break;  	default: diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 3e8bfdb00e..3bed484b58 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -239,6 +239,7 @@ class LLObjectSelection : public LLRefCount  {  	friend class LLSelectMgr;  	friend class LLSafeHandle<LLObjectSelection>; +	friend class LLSelectionCallbackData;  protected:  	~LLObjectSelection(); @@ -396,6 +397,16 @@ extern template class LLSelectMgr* LLSingleton<class LLSelectMgr>::getInstance()  // For use with getFirstTest()  struct LLSelectGetFirstTest; +// temporary storage, Ex: to attach objects after autopilot +class LLSelectionCallbackData +{ +public: +    LLSelectionCallbackData(); +    LLObjectSelectionHandle	getSelection() { return mSelectedObjects; } +private: +    LLObjectSelectionHandle					mSelectedObjects; +}; +  class LLSelectMgr : public LLEditMenuHandler, public LLSingleton<LLSelectMgr>  {  	LLSINGLETON(LLSelectMgr); @@ -740,6 +751,7 @@ public:  	// canceled  	void sendBuy(const LLUUID& buyer_id, const LLUUID& category_id, const LLSaleInfo sale_info);  	void sendAttach(U8 attachment_point, bool replace); +	void sendAttach(LLObjectSelectionHandle selection_handle, U8 attachment_point, bool replace);  	void sendDetach();  	void sendDropAttachment();  	void sendLink(); @@ -787,6 +799,13 @@ private:  							void (*log_func)(LLSelectNode* node, void *user_data),   							void *user_data,  							ESendType send_type); +	void sendListToRegions(	LLObjectSelectionHandle selected_handle, +							const std::string& message_name, +							void (*pack_header)(void *user_data), +							void (*pack_body)(LLSelectNode* node, void *user_data), +							void (*log_func)(LLSelectNode* node, void *user_data), +							void *user_data, +							ESendType send_type);  	static void packAgentID(	void *); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 52b2c631fa..1566736f17 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -6672,10 +6672,10 @@ private:  	static void onNearAttachObject(BOOL success, void *user_data);  	void confirmReplaceAttachment(S32 option, LLViewerJointAttachment* attachment_point); - -	struct CallbackData +	class CallbackData : public LLSelectionCallbackData  	{ -		CallbackData(LLViewerJointAttachment* point, bool replace) : mAttachmentPoint(point), mReplace(replace) {} +	public: +		CallbackData(LLViewerJointAttachment* point, bool replace) : LLSelectionCallbackData(), mAttachmentPoint(point), mReplace(replace) {}  		LLViewerJointAttachment*	mAttachmentPoint;  		bool						mReplace; @@ -6716,8 +6716,8 @@ void LLObjectAttachToAvatar::onNearAttachObject(BOOL success, void *user_data)  			// interpret 0 as "default location"  			attachment_id = 0;  		} -		LLSelectMgr::getInstance()->sendAttach(attachment_id, cb_data->mReplace); -	}		 +		LLSelectMgr::getInstance()->sendAttach(cb_data->getSelection(), attachment_id, cb_data->mReplace); +	}  	LLObjectAttachToAvatar::setObjectSelection(NULL);  	delete cb_data;  | 
