diff options
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 2 | ||||
| -rw-r--r-- | indra/newview/llfloaterland.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llpaneleditwearable.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llpanelface.cpp | 78 | ||||
| -rw-r--r-- | indra/newview/llpanelface.h | 9 | ||||
| -rw-r--r-- | indra/newview/llpanellandmedia.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llpanelobject.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llselectmgr.cpp | 57 | ||||
| -rw-r--r-- | indra/newview/llselectmgr.h | 9 | ||||
| -rw-r--r-- | indra/newview/lltexturectrl.cpp | 68 | ||||
| -rw-r--r-- | indra/newview/lltexturectrl.h | 12 | ||||
| -rw-r--r-- | indra/newview/lltooldraganddrop.h | 14 | ||||
| -rw-r--r-- | indra/newview/llviewerobject.cpp | 34 | ||||
| -rw-r--r-- | indra/newview/llviewerobject.h | 4 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_texture_ctrl.xml | 12 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/notifications.xml | 12 | 
16 files changed, 254 insertions, 61 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 8cb456b4fd..01683e58a1 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -148,7 +148,7 @@        <key>Value</key>        <integer>1</integer>      </map> -    <key>ApplyTextureImmediately</key> +    <key>TextureLivePreview</key>      <map>        <key>Comment</key>        <string>Preview selections in texture picker immediately</string> diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 95da8ff948..64684cef99 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -1901,6 +1901,7 @@ BOOL LLPanelLandOptions::postBuild()  		mSnapshotCtrl->setCommitCallback( onCommitAny, this );  		mSnapshotCtrl->setAllowNoTexture ( TRUE );  		mSnapshotCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); +		mSnapshotCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);  		mSnapshotCtrl->setNonImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);  	}  	else diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index 03404e816b..d58d6d536c 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -574,6 +574,7 @@ static void init_texture_ctrl(LLPanelEditWearable* self, LLPanel* panel, const L                  texture_ctrl->setAllowNoTexture(entry->mAllowNoTexture);                  // Don't allow (no copy) or (notransfer) textures to be selected.                  texture_ctrl->setImmediateFilterPermMask(PERM_NONE); +                texture_ctrl->setDnDFilterPermMask(PERM_NONE);                  texture_ctrl->setNonImmediateFilterPermMask(PERM_NONE);          }  } diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 7301b305b2..3e29805446 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -38,6 +38,7 @@  #include "llfontgl.h"  // project includes +#include "llagentdata.h"  #include "llbutton.h"  #include "llcheckboxctrl.h"  #include "llcolorswatch.h" @@ -46,6 +47,7 @@  #include "llface.h"  #include "lllineeditor.h"  #include "llmediaentry.h" +#include "llnotificationsutil.h"  #include "llresmgr.h"  #include "llselectmgr.h"  #include "llspinctrl.h" @@ -104,27 +106,11 @@ BOOL	LLPanelFace::postBuild()  		mTextureCtrl->setOnCancelCallback( boost::bind(&LLPanelFace::onCancelTexture, this, _2) );  		mTextureCtrl->setOnSelectCallback( boost::bind(&LLPanelFace::onSelectTexture, this, _2) );  		mTextureCtrl->setDragCallback(boost::bind(&LLPanelFace::onDragTexture, this, _2)); +		mTextureCtrl->setOnTextureSelectedCallback(boost::bind(&LLPanelFace::onTextureSelectionChanged, this, _1));  		mTextureCtrl->setFollowsTop();  		mTextureCtrl->setFollowsLeft(); -		// Don't allow (no copy) or (no transfer) textures to be selected during immediate mode -		mTextureCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); -		// Allow any texture to be used during non-immediate mode. -		mTextureCtrl->setNonImmediateFilterPermMask(PERM_NONE); -		LLAggregatePermissions texture_perms; -		if (LLSelectMgr::getInstance()->selectGetAggregateTexturePermissions(texture_perms)) -		{ -			BOOL can_copy =  -				texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_EMPTY ||  -				texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_ALL; -			BOOL can_transfer =  -				texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_EMPTY ||  -				texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_ALL; -			mTextureCtrl->setCanApplyImmediately(can_copy && can_transfer); -		} -		else -		{ -			mTextureCtrl->setCanApplyImmediately(FALSE); -		} +		mTextureCtrl->setImmediateFilterPermMask(PERM_NONE); +		mTextureCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);  	}  	mColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch"); @@ -595,28 +581,6 @@ void LLPanelFace::getState()  		} -		LLAggregatePermissions texture_perms; -		if(texture_ctrl) -		{ -// 			texture_ctrl->setValid( editable ); -		 -			if (LLSelectMgr::getInstance()->selectGetAggregateTexturePermissions(texture_perms)) -			{ -				BOOL can_copy =  -					texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_EMPTY ||  -					texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_ALL; -				BOOL can_transfer =  -					texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_EMPTY ||  -					texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_ALL; -				texture_ctrl->setCanApplyImmediately(can_copy && can_transfer); -			} -			else -			{ -				texture_ctrl->setCanApplyImmediately(FALSE); -			} -		} - -  		// planar align  		bool align_planar = false;  		bool identical_planar_aligned = false; @@ -1190,3 +1154,35 @@ void LLPanelFace::onCommitPlanarAlign(LLUICtrl* ctrl, void* userdata)  	self->sendTextureInfo();  } +void LLPanelFace::onTextureSelectionChanged(LLInventoryItem* itemp) +{ +	LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("texture control"); +	if (texture_ctrl) +	{ +		LLUUID obj_owner_id; +		std::string obj_owner_name; +		LLSelectMgr::instance().selectGetOwner(obj_owner_id, obj_owner_name); + +		LLSaleInfo sale_info; +		LLSelectMgr::instance().selectGetSaleInfo(sale_info); + +		bool can_copy = itemp->getPermissions().allowCopyBy(gAgentID); // do we have perm to copy this texture? +		bool can_transfer = itemp->getPermissions().allowOperationBy(PERM_TRANSFER, gAgentID); // do we have perm to transfer this texture? +		bool is_object_owner = gAgentID == obj_owner_id; // does object for which we are going to apply texture belong to the agent? +		bool not_for_sale = !sale_info.isForSale(); // is object for which we are going to apply texture not for sale? + +		if (can_copy && can_transfer) +		{ +			texture_ctrl->setCanApply(true, true); +			return; +		} + +		// if texture has (no-transfer) attribute it can be applied only for object which we own and is not for sale +		texture_ctrl->setCanApply(false, can_transfer ? true : is_object_owner && not_for_sale); + +		if (gSavedSettings.getBOOL("TextureLivePreview")) +		{ +			LLNotificationsUtil::add("LivePreviewUnavailable"); +		} +	} +} diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index 42be9b257f..3b5a9b1398 100644 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -91,6 +91,15 @@ protected:  	static void		onClickAutoFix(void*);  	static F32      valueGlow(LLViewerObject* object, S32 face); +private: + +	/* +	 * Checks whether the selected texture from the LLFloaterTexturePicker can be applied to the currently selected object. +	 * If agent selects texture which is not allowed to be applied for the currently selected object, +	 * all controls of the floater texture picker which allow to apply the texture will be disabled. +	 */ +	void onTextureSelectionChanged(LLInventoryItem* itemp); +  };  #endif diff --git a/indra/newview/llpanellandmedia.cpp b/indra/newview/llpanellandmedia.cpp index b3adfac8a2..26cd3ff1c1 100644 --- a/indra/newview/llpanellandmedia.cpp +++ b/indra/newview/llpanellandmedia.cpp @@ -85,6 +85,7 @@ BOOL LLPanelLandMedia::postBuild()  	mMediaTextureCtrl->setCommitCallback( onCommitAny, this );  	mMediaTextureCtrl->setAllowNoTexture ( TRUE );  	mMediaTextureCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); +	mMediaTextureCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);  	mMediaTextureCtrl->setNonImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);  	mMediaAutoScaleCheck = getChild<LLCheckBoxCtrl>("media_auto_scale"); diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index 1f77e7a602..7dfe529b73 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -245,6 +245,7 @@ BOOL	LLPanelObject::postBuild()  		mCtrlSculptTexture->setDropCallback( boost::bind(&LLPanelObject::onDropSculpt, this, _2 ));  		// Don't allow (no copy) or (no transfer) textures to be selected during immediate mode  		mCtrlSculptTexture->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); +		mCtrlSculptTexture->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);  		// Allow any texture to be used during non-immediate mode.  		mCtrlSculptTexture->setNonImmediateFilterPermMask(PERM_NONE);  		LLAggregatePermissions texture_perms; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index c69dcfad81..a55565909f 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -1508,6 +1508,49 @@ struct LLSelectMgrSendFunctor : public LLSelectedObjectFunctor  	}  }; +void LLObjectSelection::applyNoCopyTextureToTEs(LLViewerInventoryItem* item) +{ +	if (!item) +	{ +		return; +	} +	LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture(item->getAssetUUID()); + +	for (iterator iter = begin(); iter != end(); ++iter) +	{ +		LLSelectNode* node = *iter; +		LLViewerObject* object = (*iter)->getObject(); +		if (!object) +		{ +			continue; +		} + +		S32 num_tes = llmin((S32)object->getNumTEs(), (S32)object->getNumFaces()); +		bool texture_copied = false; +		for (S32 te = 0; te < num_tes; ++te) +		{ +			if (node->isTESelected(te)) +			{ +				//(no-copy) textures must be moved to the object's inventory only once +				// without making any copies +				if (!texture_copied) +				{ +					LLToolDragAndDrop::handleDropTextureProtections(object, item, LLToolDragAndDrop::SOURCE_AGENT, LLUUID::null); +					texture_copied = true; +				} + +				// apply texture for the selected faces +				LLViewerStats::getInstance()->incStat(LLViewerStats::ST_EDIT_TEXTURE_COUNT ); +				object->setTEImage(te, image); +				dialog_refresh_all(); + +				// send the update to the simulator +				object->sendTEUpdate(); +			} +		} +	} +} +  //-----------------------------------------------------------------------------  // selectionSetImage()  //----------------------------------------------------------------------------- @@ -1559,8 +1602,18 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)  			}  			return true;  		} -	} setfunc(item, imageid); -	getSelection()->applyToTEs(&setfunc); +	}; + +	if (item && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID())) +	{ +		getSelection()->applyNoCopyTextureToTEs(item); +	} +	else +	{ +		f setfunc(item, imageid); +		getSelection()->applyToTEs(&setfunc); +	} +  	struct g : public LLSelectedObjectFunctor  	{ diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 87ada5ac6b..94606b9fba 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -307,6 +307,15 @@ public:  	bool applyToRootNodes(LLSelectedNodeFunctor* func, bool firstonly = false);  	bool applyToNodes(LLSelectedNodeFunctor* func, bool firstonly = false); +	/* +	 * Used to apply (no-copy) textures to the selected object or +	 * selected face/faces of the object. +	 * This method moves (no-copy) texture to the object's inventory +	 * and doesn't make copy of the texture for each face. +	 * Then this only texture is used for all selected faces. +	 */ +	void applyNoCopyTextureToTEs(LLViewerInventoryItem* item); +  	ESelectType getSelectType() const { return mSelectType; }  private: diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 19a944e88e..fc477fa13b 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -92,6 +92,7 @@ public:  		LLTextureCtrl* owner,  		const std::string& label,  		PermissionMask immediate_filter_perm_mask, +		PermissionMask dnd_filter_perm_mask,  		PermissionMask non_immediate_filter_perm_mask,  		BOOL can_apply_immediately,  		LLUIImagePtr fallback_image_name); @@ -129,6 +130,9 @@ public:  	void onFilterEdit(const std::string& search_string ); +	void setCanApply(bool can_preview, bool can_apply); +	void setTextureSelectedCallback(texture_selected_callback cb) {mTextureSelectedCallback = cb;} +  	static void		onBtnSetToDefault( void* userdata );  	static void		onBtnSelect( void* userdata );  	static void		onBtnCancel( void* userdata ); @@ -164,6 +168,7 @@ protected:  	LLFilterEditor*		mFilterEdit;  	LLInventoryPanel*	mInventoryPanel;  	PermissionMask		mImmediateFilterPermMask; +	PermissionMask		mDnDFilterPermMask;  	PermissionMask		mNonImmediateFilterPermMask;  	BOOL				mCanApplyImmediately;  	BOOL				mNoCopyTextureSelected; @@ -171,12 +176,18 @@ protected:  	LLSaveFolderState	mSavedFolderState;  	BOOL				mSelectedItemPinned; + +private: +	bool mCanApply; +	bool mCanPreview; +	texture_selected_callback mTextureSelectedCallback;  };  LLFloaterTexturePicker::LLFloaterTexturePicker(	  	LLTextureCtrl* owner,  	const std::string& label,  	PermissionMask immediate_filter_perm_mask, +	PermissionMask dnd_filter_perm_mask,  	PermissionMask non_immediate_filter_perm_mask,  	BOOL can_apply_immediately,  	LLUIImagePtr fallback_image) @@ -192,9 +203,12 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(  	mActive( TRUE ),  	mFilterEdit(NULL),  	mImmediateFilterPermMask(immediate_filter_perm_mask), +	mDnDFilterPermMask(dnd_filter_perm_mask),  	mNonImmediateFilterPermMask(non_immediate_filter_perm_mask),  	mContextConeOpacity(0.f), -	mSelectedItemPinned( FALSE ) +	mSelectedItemPinned( FALSE ), +	mCanApply(true), +	mCanPreview(true)  {  	buildFromFile("floater_texture_ctrl.xml");  	mCanApplyImmediately = can_apply_immediately; @@ -306,7 +320,7 @@ BOOL LLFloaterTexturePicker::handleDragAndDrop(  		if (xfer) item_perm_mask |= PERM_TRANSFER;  		//PermissionMask filter_perm_mask = getFilterPermMask();  Commented out due to no-copy texture loss. -		PermissionMask filter_perm_mask = mImmediateFilterPermMask; +		PermissionMask filter_perm_mask = mDnDFilterPermMask;  		if ( (item_perm_mask & filter_perm_mask) == filter_perm_mask )  		{  			if (drop) @@ -440,7 +454,7 @@ BOOL LLFloaterTexturePicker::postBuild()  	mNoCopyTextureSelected = FALSE; -	getChild<LLUICtrl>("apply_immediate_check")->setValue(gSavedSettings.getBOOL("ApplyTextureImmediately")); +	getChild<LLUICtrl>("apply_immediate_check")->setValue(gSavedSettings.getBOOL("TextureLivePreview"));  	childSetCommitCallback("apply_immediate_check", onApplyImmediateCheck, this);  	if (!mCanApplyImmediately) @@ -523,7 +537,7 @@ void LLFloaterTexturePicker::draw()  	// if we're inactive, gray out "apply immediate" checkbox  	getChildView("show_folders_check")->setEnabled(mActive && mCanApplyImmediately && !mNoCopyTextureSelected); -	getChildView("Select")->setEnabled(mActive); +	getChildView("Select")->setEnabled(mActive && mCanApply);  	getChildView("Pipette")->setEnabled(mActive);  	getChild<LLUICtrl>("Pipette")->setValue(LLToolMgr::getInstance()->getCurrentTool() == LLToolPipette::getInstance()); @@ -682,8 +696,7 @@ PermissionMask LLFloaterTexturePicker::getFilterPermMask()  void LLFloaterTexturePicker::commitIfImmediateSet()  { -	bool apply_immediate = getChild<LLUICtrl>("apply_immediate_check")->getValue().asBoolean(); -	if (!mNoCopyTextureSelected && apply_immediate && mOwner) +	if (!mNoCopyTextureSelected && mOwner && mCanApply)  	{  		mOwner->onFloaterCommit(LLTextureCtrl::TEXTURE_CHANGE);  	} @@ -693,6 +706,7 @@ void LLFloaterTexturePicker::commitIfImmediateSet()  void LLFloaterTexturePicker::onBtnSetToDefault(void* userdata)  {  	LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata; +	self->setCanApply(true, true);  	if (self->mOwner)  	{  		self->setImageID( self->mOwner->getDefaultImageAssetID() ); @@ -704,6 +718,7 @@ void LLFloaterTexturePicker::onBtnSetToDefault(void* userdata)  void LLFloaterTexturePicker::onBtnWhite(void* userdata)  {  	LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata; +	self->setCanApply(true, true);  	self->setImageID( self->mWhiteImageAssetID );  	self->commitIfImmediateSet();  } @@ -776,13 +791,14 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem  		mNoCopyTextureSelected = FALSE;  		if (itemp)  		{ +			mTextureSelectedCallback(itemp);  			if (!itemp->getPermissions().allowCopyBy(gAgent.getID()))  			{  				mNoCopyTextureSelected = TRUE;  			}  			mImageAssetID = itemp->getAssetUUID();  			mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here? -			if (user_action) +			if (user_action && mCanPreview)  			{  				// only commit intentional selections, not implicit ones  				commitIfImmediateSet(); @@ -813,7 +829,7 @@ void LLFloaterTexturePicker::onApplyImmediateCheck(LLUICtrl* ctrl, void *user_da  	LLFloaterTexturePicker* picker = (LLFloaterTexturePicker*)user_data;  	LLCheckBoxCtrl* check_box = (LLCheckBoxCtrl*)ctrl; -	gSavedSettings.setBOOL("ApplyTextureImmediately", check_box->get()); +	gSavedSettings.setBOOL("TextureLivePreview", check_box->get());  	picker->updateFilterPermMask();  	picker->commitIfImmediateSet(); @@ -824,6 +840,16 @@ void LLFloaterTexturePicker::updateFilterPermMask()  	//mInventoryPanel->setFilterPermMask( getFilterPermMask() );  Commented out due to no-copy texture loss.  } +void LLFloaterTexturePicker::setCanApply(bool can_preview, bool can_apply) +{ +	getChildRef<LLUICtrl>("Select").setEnabled(can_apply); +	getChildRef<LLUICtrl>("preview_disabled").setVisible(!can_preview); +	getChildRef<LLUICtrl>("apply_immediate_check").setVisible(can_preview); + +	mCanApply = can_apply; +	mCanPreview = can_preview ? gSavedSettings.getBOOL("TextureLivePreview") : false; +} +  void LLFloaterTexturePicker::onFilterEdit(const std::string& search_string )  {  	std::string upper_case_search_string = search_string; @@ -974,6 +1000,15 @@ void LLTextureCtrl::setCanApplyImmediately(BOOL b)  	}  } +void LLTextureCtrl::setCanApply(bool can_preview, bool can_apply) +{ +	LLFloaterTexturePicker* floaterp = dynamic_cast<LLFloaterTexturePicker*>(mFloaterHandle.get()); +	if( floaterp ) +	{ +		floaterp->setCanApply(can_preview, can_apply); +	} +} +  void LLTextureCtrl::setVisible( BOOL visible )   {  	if( !visible ) @@ -1054,12 +1089,19 @@ void LLTextureCtrl::showPicker(BOOL take_focus)  			this,  			mLabel,  			mImmediateFilterPermMask, +			mDnDFilterPermMask,  			mNonImmediateFilterPermMask,  			mCanApplyImmediately,  			mFallbackImage);  		mFloaterHandle = floaterp->getHandle(); +		LLFloaterTexturePicker* texture_floaterp = dynamic_cast<LLFloaterTexturePicker*>(floaterp); +		if (texture_floaterp && mOnTextureSelectedCallback) +		{ +			texture_floaterp->setTextureSelectedCallback(mOnTextureSelectedCallback); +		} +  		LLFloater* root_floater = gFloaterView->getParentFloater(this);  		if (root_floater)  			root_floater->addDependentFloater(floaterp); @@ -1174,6 +1216,16 @@ void LLTextureCtrl::onFloaterCommit(ETexturePickOp op)  	}  } +void LLTextureCtrl::setOnTextureSelectedCallback(texture_selected_callback cb) +{ +	mOnTextureSelectedCallback = cb; +	LLFloaterTexturePicker* floaterp = dynamic_cast<LLFloaterTexturePicker*>(mFloaterHandle.get()); +	if (floaterp) +	{ +		floaterp->setTextureSelectedCallback(cb); +	} +} +  void	LLTextureCtrl::setImageAssetName(const std::string& name)  {  	LLPointer<LLUIImage> imagep = LLUI::getUIImage(name); diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h index b1312d641f..932b96fff1 100644 --- a/indra/newview/lltexturectrl.h +++ b/indra/newview/lltexturectrl.h @@ -43,6 +43,7 @@ class LLViewerFetchedTexture;  // used for setting drag & drop callbacks.  typedef boost::function<BOOL (LLUICtrl*, LLInventoryItem*)> drag_n_drop_callback; +typedef boost::function<void (LLInventoryItem*)> texture_selected_callback;  ////////////////////////////////////////////////////////////////////////////////////////// @@ -147,8 +148,12 @@ public:  	void			setCaption(const std::string& caption);  	void			setCanApplyImmediately(BOOL b); +	void			setCanApply(bool can_preview, bool can_apply); +  	void			setImmediateFilterPermMask(PermissionMask mask)  					{ mImmediateFilterPermMask = mask; } +	void			setDnDFilterPermMask(PermissionMask mask) +						{ mDnDFilterPermMask = mask; }  	void			setNonImmediateFilterPermMask(PermissionMask mask)  					{ mNonImmediateFilterPermMask = mask; }  	PermissionMask	getImmediateFilterPermMask() { return mImmediateFilterPermMask; } @@ -172,6 +177,11 @@ public:  	void setOnSelectCallback(commit_callback_t cb)	{ mOnSelectCallback = cb; } +	/* +	 * callback for changing texture selection in inventory list of texture floater +	 */ +	void setOnTextureSelectedCallback(texture_selected_callback cb); +  	void setShowLoadingPlaceholder(BOOL showLoadingPlaceholder);  	LLViewerFetchedTexture* getTexture() { return mTexturep; } @@ -185,6 +195,7 @@ private:  	drag_n_drop_callback	 	mDropCallback;  	commit_callback_t		 	mOnCancelCallback;  	commit_callback_t		 	mOnSelectCallback; +	texture_selected_callback	mOnTextureSelectedCallback;  	LLPointer<LLViewerFetchedTexture> mTexturep;  	LLUIColor				 	mBorderColor;  	LLUUID					 	mImageItemID; @@ -198,6 +209,7 @@ private:  	std::string				 	mLabel;  	BOOL					 	mAllowNoTexture; // If true, the user can select "none" as an option  	PermissionMask			 	mImmediateFilterPermMask; +	PermissionMask				mDnDFilterPermMask;  	PermissionMask			 	mNonImmediateFilterPermMask;  	BOOL					 	mCanApplyImmediately;  	BOOL					 	mCommitOnSelection; diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h index 245c2a23e6..41aee484db 100644 --- a/indra/newview/lltooldraganddrop.h +++ b/indra/newview/lltooldraganddrop.h @@ -93,6 +93,13 @@ public:  	static S32 getOperationId() { return sOperationId; } +	// deal with permissions of object, etc. returns TRUE if drop can +	// proceed, otherwise FALSE. +	static BOOL handleDropTextureProtections(LLViewerObject* hit_obj, +						 LLInventoryItem* item, +						 LLToolDragAndDrop::ESource source, +						 const LLUUID& src_id); +  protected:  	enum EDropTarget  	{ @@ -219,13 +226,6 @@ protected:  	// inventory items to determine if a drop would be ok.  	static EAcceptance willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item); -	// deal with permissions of object, etc. returns TRUE if drop can -	// proceed, otherwise FALSE. -	static BOOL handleDropTextureProtections(LLViewerObject* hit_obj, -						 LLInventoryItem* item, -						 LLToolDragAndDrop::ESource source, -						 const LLUUID& src_id); -  public:  	// helper functions  	static BOOL isInventoryDropAcceptable(LLViewerObject* obj, LLInventoryItem* item) { return (ACCEPT_YES_COPY_SINGLE <= willObjectAcceptInventory(obj, item)); } diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 1aa541793f..7be7d6f97f 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2793,6 +2793,23 @@ void LLViewerObject::processTaskInvFile(void** user_data, S32 error_code, LLExtS  	   (object = gObjectList.findObject(ft->mTaskID)))  	{  		object->loadTaskInvFile(ft->mFilename); + +		LLInventoryObject::object_list_t::iterator it = object->mInventory->begin(); +		LLInventoryObject::object_list_t::iterator end = object->mInventory->end(); +		std::list<LLUUID>& pending_lst = object->mPendingInventoryItemsIDs; + +		for (; it != end && pending_lst.size(); ++it) +		{ +			LLViewerInventoryItem* item = dynamic_cast<LLViewerInventoryItem*>(it->get()); +			if(item && item->getType() != LLAssetType::AT_CATEGORY) +			{ +				std::list<LLUUID>::iterator id_it = std::find(pending_lst.begin(), pending_lst.begin(), item->getAssetUUID()); +				if (id_it != pending_lst.end()) +				{ +					pending_lst.erase(id_it); +				} +			} +		}  	}  	else  	{ @@ -2905,7 +2922,22 @@ void LLViewerObject::updateInventory(  	bool is_new)  {  	LLMemType mt(LLMemType::MTYPE_OBJECT); -	 + +	std::list<LLUUID>::iterator begin = mPendingInventoryItemsIDs.begin(); +	std::list<LLUUID>::iterator end = mPendingInventoryItemsIDs.end(); + +	bool is_fetching = std::find(begin, end, item->getAssetUUID()) != end; +	bool is_fetched = getInventoryItemByAsset(item->getAssetUUID()) != NULL; + +	if (is_fetched || is_fetching) +	{ +		return; +	} +	else +	{ +		mPendingInventoryItemsIDs.push_back(item->getAssetUUID()); +	} +  	// This slices the object into what we're concerned about on the  	// viewer. The simulator will take the permissions and transfer  	// ownership. diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index c8152e1539..dc102b666f 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -684,6 +684,10 @@ protected:  	F32				mAppAngle;	// Apparent visual arc in degrees  	F32				mPixelArea; // Apparent area in pixels +	// IDs of of all items in the object's content which are added to the object's content, +	// but not updated on the server yet. After item was updated, its ID will be removed from this list. +	std::list<LLUUID> mPendingInventoryItemsIDs; +  	// This is the object's inventory from the viewer's perspective.  	LLInventoryObject::object_list_t* mInventory;  	class LLInventoryCallbackInfo diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml index cad7d72ed7..b0e6d36446 100644 --- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml @@ -92,12 +92,22 @@       follows="left|bottom"       height="20"       initial_value="true" -     label="Apply now" +     label="Live Preview"       layout="topleft"       left="4"       name="apply_immediate_check"       top="262"       width="120" /> +   <text +     follows="left|bottom" +     height="20" +     layout="topleft" +     left="8" +     name="preview_disabled" +     top="266" +     value="Preview Disabled" +     visible="false" +     width="120" />      <filter_editor       follows="left|top|right"       height="23" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 2e6c42e542..6c295f0344 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -7200,6 +7200,18 @@ You locally updated a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME]    <notification     icon="alertmodal.tga" +   name="LivePreviewUnavailable" +   type="alert"> +    +We cannot display a preview of this texture because it is no-copy and/or no-transfer. +  <usetemplate +    ignoretext="Warn me that Live Preview mode is not available for no-copy and/or no-transfer textures" +    name="okignore" +    yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga"     name="ConfirmLeaveCall"     type="alert">  Are you sure you want to leave this call?  | 
