diff options
24 files changed, 370 insertions, 233 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 578f8fd4f0..6fa839235a 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -5834,17 +5834,6 @@        <key>Value</key>        <integer>35</integer>      </map> -    <key>RenderAvatarInvisible</key> -    <map> -      <key>Comment</key> -      <string>Set your avatar as Invisible</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map>      <key>RenderAvatarVP</key>      <map>        <key>Comment</key> @@ -7792,6 +7781,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>ShowDebugAppearanceEditor</key> +    <map> +      <key>Comment</key> +      <string>Show debugging appearance editor</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowEmptyFoldersWhenSearching</key>      <map>        <key>Comment</key> @@ -7890,7 +7890,18 @@        <string>Boolean</string>        <key>Value</key>        <integer>1</integer>    -    </map>     +    </map> +    <key>ShowObjectRenderingCost</key>                 +    <map> +      <key>Comment</key> +      <string>Show the object rendering cost  in  build tools</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer>    +    </map>              <key>ShowNavbarFavoritesPanel</key>          <map>        <key>Comment</key> diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 7fb71d4d4f..babef5b63d 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -93,7 +93,7 @@  // Globals  LLFloaterTools *gFloaterTools = NULL; - +bool LLFloaterTools::sShowObjectCost = true;  const std::string PANEL_NAMES[LLFloaterTools::PANEL_COUNT] =  { @@ -286,6 +286,8 @@ BOOL	LLFloaterTools::postBuild()  	mStatusText["grab"] = getString("status_grab");  	mStatusText["place"] = getString("status_place");  	mStatusText["selectland"] = getString("status_selectland"); + +	sShowObjectCost = gSavedSettings.getBOOL("ShowObjectRenderingCost");  	return TRUE;  } @@ -425,16 +427,19 @@ void LLFloaterTools::refresh()  	childSetTextArg("prim_count", "[COUNT]", prim_count_string);  	// calculate selection rendering cost -	std::string prim_cost_string; -	LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost()); -	childSetTextArg("RenderingCost", "[COUNT]", prim_cost_string); +	if (sShowObjectCost) +	{ +		std::string prim_cost_string; +		LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost()); +		childSetTextArg("RenderingCost", "[COUNT]", prim_cost_string); +	}  	// disable the object and prim counts if nothing selected  	bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty();  	childSetEnabled("obj_count", have_selection);  	childSetEnabled("prim_count", have_selection); -	childSetEnabled("RenderingCost", have_selection); +	childSetEnabled("RenderingCost", have_selection && sShowObjectCost);  	// Refresh child tabs  	mPanelPermissions->refresh(); @@ -566,7 +571,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)  	mBtnEdit	->setToggleState( edit_visible );  	mRadioGroupEdit->setVisible( edit_visible );  	bool linked_parts = gSavedSettings.getBOOL("EditLinkedParts"); -	childSetVisible("RenderingCost", !linked_parts && (edit_visible || focus_visible || move_visible)); +	childSetVisible("RenderingCost", !linked_parts && (edit_visible || focus_visible || move_visible) && sShowObjectCost);  	if (mCheckSelectIndividual)  	{ diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index 05a88a31d3..85aeb9f523 100644 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -196,6 +196,9 @@ private:  protected:  	LLSD				mMediaSettings; + +public: +	static bool		sShowObjectCost;  }; diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index db6998b267..98fae1c2a0 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -749,6 +749,12 @@ void LLFolderView::sanitizeSelection()  				}  			}  		} + +		// Don't allow invisible items (such as root folders) to be selected. +		if (item->getDontShowInHierarchy()) +		{ +			items_to_remove.push_back(item); +		}  	}  	std::vector<LLFolderViewItem*>::iterator item_it; diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 8a13964708..9ae0c9100a 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -199,7 +199,9 @@ LLFolderViewItem* LLFolderViewItem::getPreviousOpenNode(BOOL include_children)  	}  	LLFolderViewItem* itemp = mParentFolder->getPreviousFromChild( this, include_children ); -	while(itemp && !itemp->getVisible()) + +	// Skip over items that are invisible or are hidden from the UI. +	while(itemp && (!itemp->getVisible() || itemp->getDontShowInHierarchy()))  	{  		LLFolderViewItem* next_itemp = itemp->mParentFolder->getPreviousFromChild( itemp, include_children );  		if (itemp == next_itemp)  diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 35ae4dee8e..3fc2cbecbe 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -190,12 +190,7 @@ BOOL LLInvFVBridge::isItemRemovable()  	{  		return TRUE;  	} -	if (gAgentWearables.isWearingItem(mUUID)) -	{ -		return FALSE; -	} -	const LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); -	if (avatar && avatar->isWearingAttachment(mUUID)) +	if (get_is_item_worn(mUUID))  	{  		return FALSE;  	} @@ -506,41 +501,6 @@ void hide_context_entries(LLMenuGL& menu,  	}  } -bool isWornLink(LLUUID link_id) -{ -	LLViewerInventoryItem *link = gInventory.getItem(link_id); -	if (!link) -		return false; -	LLViewerInventoryItem *item = link->getLinkedItem(); -	if (!item) -		return false; -	 -	switch(item->getType()) -	{ -	case LLAssetType::AT_OBJECT: -	{ -		LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject(); -		if(my_avatar && my_avatar->isWearingAttachment(item->getUUID())) -			return true; -	} -	break; - -	case LLAssetType::AT_BODYPART: -	case LLAssetType::AT_CLOTHING: -		if(gAgentWearables.isWearingItem(item->getUUID())) -			return true; -		break; - -	case LLAssetType::AT_GESTURE: -		if (LLGestureManager::instance().isGestureActive(item->getUUID())) -			return true; -		break; -	default: -		break; -	} -	return false; -} -  // Helper for commonly-used entries  void LLInvFVBridge::getClipboardEntries(bool show_asset_id,  										std::vector<std::string> &items, @@ -552,7 +512,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,  	if (is_sidepanel)  	{  		// Sidepanel includes restricted menu. -		if (obj && obj->getIsLinkType() && !isWornLink(mUUID)) +		if (obj && obj->getIsLinkType() && !get_is_item_worn(mUUID))  		{  			items.push_back(std::string("Remove Link"));  		} @@ -606,15 +566,18 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,  		disabled_items.push_back(std::string("Paste"));  	} -	items.push_back(std::string("Paste As Link")); -	if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0) +	if (gAgent.isGodlike())  	{ -		disabled_items.push_back(std::string("Paste As Link")); +		items.push_back(std::string("Paste As Link")); +		if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0) +		{ +			disabled_items.push_back(std::string("Paste As Link")); +		}  	}  	items.push_back(std::string("Paste Separator")); -	if (obj && obj->getIsLinkType() && !isWornLink(mUUID)) +	if (obj && obj->getIsLinkType() && !get_is_item_worn(mUUID))  	{  		items.push_back(std::string("Remove Link"));  	} @@ -1196,7 +1159,7 @@ LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const  {  	U8 font = LLFontGL::NORMAL; -	if( gAgentWearables.isWearingItem( mUUID ) ) +	if (get_is_item_worn(mUUID))  	{  		// llinfos << "BOLD" << llendl;  		font |= LLFontGL::BOLD; @@ -1339,29 +1302,33 @@ BOOL LLItemBridge::isItemCopyable() const  	LLViewerInventoryItem* item = getItem();  	if (item)  	{ -		// can't copy worn objects. DEV-15183 -		LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); -		if( !avatarp ) +		// Can't copy worn objects. DEV-15183 +		if(get_is_item_worn(mUUID))  		{  			return FALSE;  		} -		if(avatarp->isWearingAttachment(mUUID)) +		// You can never copy a link. +		if (item->getIsLinkType())  		{  			return FALSE;  		} -		// All items can be copied, not all can be pasted. -		// The only time an item can't be copied is if it's a link -		// return (item->getPermissions().allowCopyBy(gAgent.getID())); -		if (item->getIsLinkType()) +		if (gAgent.isGodlike())  		{ -			return FALSE; +			// All items can be copied in god mode since you can +			// at least paste-as-link the item, though you  +			// still may not be able paste the item. +			return TRUE; +		} +		else +		{ +			return (item->getPermissions().allowCopyBy(gAgent.getID()));  		} -		return TRUE;  	}  	return FALSE;  } +  BOOL LLItemBridge::copyToClipboard() const  {  	if(isItemCopyable()) @@ -1472,10 +1439,7 @@ BOOL LLFolderBridge::isItemRemovable()  		return FALSE;  	} -	// Allow protected types to be removed, but issue a warning. -	// Restrict to god mode so users don't inadvertently mess up their inventory. -	if(LLFolderType::lookupIsProtectedType(category->getPreferredType()) && -	   !gAgent.isGodlike()) +	if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))  	{  		return FALSE;  	} @@ -1681,23 +1645,10 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  					for( i = 0; i < descendent_items.count(); i++ )  					{  						LLInventoryItem* item = descendent_items[i]; -						if( (item->getType() == LLAssetType::AT_CLOTHING) || -							(item->getType() == LLAssetType::AT_BODYPART) ) -						{ -							if( gAgentWearables.isWearingItem( item->getUUID() ) ) -							{ -								is_movable = FALSE;  // It's generally movable, but not into the trash! -								break; -							} -						} -						else -						if( item->getType() == LLAssetType::AT_OBJECT ) +						if (get_is_item_worn(item->getUUID()))  						{ -							if( avatar->isWearingAttachment( item->getUUID() ) ) -							{ -								is_movable = FALSE;  // It's generally movable, but not into the trash! -								break; -							} +							is_movable = FALSE; +							break; // It's generally movable, but not into the trash!  						}  					}  				} @@ -2187,6 +2138,12 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model  		restoreItem();  		return;  	} +#ifndef LL_RELEASE_FOR_DOWNLOAD +	else if ("delete_system_folder" == action) +	{ +		removeSystemFolder(); +	} +#endif  }  void LLFolderBridge::openItem() @@ -2310,13 +2267,27 @@ BOOL LLFolderBridge::removeItem()  	LLNotification::Params params("ConfirmDeleteProtectedCategory");  	params.payload(payload).substitutions(args).functor.function(boost::bind(&LLFolderBridge::removeItemResponse, this, _1, _2)); -	if (LLFolderType::lookupIsProtectedType(cat->getPreferredType())) +	LLNotifications::instance().forceResponse(params, 0); +	return TRUE; +} + + +BOOL LLFolderBridge::removeSystemFolder() +{ +	const LLViewerInventoryCategory *cat = getCategory(); +	if (!LLFolderType::lookupIsProtectedType(cat->getPreferredType()))  	{ -		LLNotifications::instance().add(params); +		return FALSE;  	} -	else + +	LLSD payload; +	LLSD args; +	args["FOLDERNAME"] = cat->getName(); + +	LLNotification::Params params("ConfirmDeleteProtectedCategory"); +	params.payload(payload).substitutions(args).functor.function(boost::bind(&LLFolderBridge::removeItemResponse, this, _1, _2));  	{ -		LLNotifications::instance().forceResponse(params, 0); +		LLNotifications::instance().add(params);  	}  	return TRUE;  } @@ -2485,6 +2456,13 @@ void LLFolderBridge::folderOptionsMenu()  		}  	} +#ifndef LL_RELEASE_FOR_DOWNLOAD +	if (LLFolderType::lookupIsProtectedType(type)) +	{ +		mItems.push_back(std::string("Delete System Folder")); +	} +#endif +  	// wearables related functionality for folders.  	//is_wearable  	LLFindWearables is_wearable; @@ -2512,7 +2490,10 @@ void LLFolderBridge::folderOptionsMenu()  			mItems.push_back(std::string("Wear As Ensemble"));  		}  		mItems.push_back(std::string("Remove From Outfit")); - +		if (!areAnyContentsWorn(model)) +		{ +			disabled_items.push_back(std::string("Remove From Outfit")); +		}  		mItems.push_back(std::string("Outfit Separator"));  	}  	hide_context_entries(*mMenu, mItems, disabled_items); @@ -2534,6 +2515,35 @@ BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInv  	return ((item_array.count() > 0) ? TRUE : FALSE );  } +class LLFindWorn : public LLInventoryCollectFunctor +{ +public: +	LLFindWorn() {} +	virtual ~LLFindWorn() {} +	virtual bool operator()(LLInventoryCategory* cat, +							LLInventoryItem* item) +	{ +		if (item && get_is_item_worn(item->getUUID())) +		{ +			return TRUE; +		} +		return FALSE; +	} +}; + +BOOL LLFolderBridge::areAnyContentsWorn(LLInventoryModel* model) const +{ +	LLInventoryModel::cat_array_t cat_array; +	LLInventoryModel::item_array_t item_array; +	LLFindWorn is_worn; +	model->collectDescendentsIf(mUUID, +								cat_array, +								item_array, +								LLInventoryModel::EXCLUDE_TRASH, +								is_worn); +	return (item_array.size() > 0); +} +  // Flags unused  void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  { @@ -2656,6 +2666,13 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		mItems.push_back(std::string("--no options--"));  		mDisabledItems.push_back(std::string("--no options--"));  	} + +	// Preemptively disable system folder removal if more than one item selected. +	if ((flags & FIRST_SELECTED_ITEM) == 0) +	{ +		mDisabledItems.push_back(std::string("Delete System Folder")); +	} +	  	hide_context_entries(menu, mItems, mDisabledItems);  } @@ -2998,19 +3015,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  		if(is_movable && move_is_into_trash)  		{ -			switch(inv_item->getType()) -			{ -			case LLAssetType::AT_CLOTHING: -			case LLAssetType::AT_BODYPART: -				is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID()); -				break; - -			case LLAssetType::AT_OBJECT: -				is_movable = !avatar->isWearingAttachment(inv_item->getUUID()); -				break; -			default: -				break; -			} +			is_movable = inv_item->getIsLinkType() || !get_is_item_worn(inv_item->getUUID());  		}  		if ( is_movable ) @@ -4080,8 +4085,7 @@ LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const  {  	U8 font = LLFontGL::NORMAL; -	LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); -	if( avatar && avatar->isWearingAttachment( mUUID ) ) +	if(get_is_item_worn( mUUID ) )  	{  		font |= LLFontGL::BOLD;  	} @@ -4097,9 +4101,9 @@ LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const  std::string LLObjectBridge::getLabelSuffix() const  { -	LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); -	if( avatar && avatar->isWearingAttachment( mUUID ) ) +	if (get_is_item_worn(mUUID))  	{ +		LLVOAvatarSelf* avatar = gAgent.getAvatarObject();  		std::string attachment_point_name = avatar->getAttachedPointName(mUUID);  		// e.g. "(worn on ...)" / "(attached to ...)" @@ -4224,12 +4228,11 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  				return;  			} -			if( avatarp->isWearingAttachment( mUUID ) ) +			if( get_is_item_worn( mUUID ) )  			{  				items.push_back(std::string("Detach From Yourself"));  			} -			else -			if( !isInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing()) +			else if (!isInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing())  			{  				items.push_back(std::string("Attach Separator"));  				items.push_back(std::string("Object Wear")); @@ -4455,7 +4458,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_  				if (gAgent.isTeen() && item->isWearableType() &&  					(item->getWearableType() == WT_UNDERPANTS || item->getWearableType() == WT_UNDERSHIRT))  					continue; -				if( gAgentWearables.isWearingItem (item->getLinkedUUID()) ) +				if (get_is_item_worn(item->getUUID()))  				{  					LLWearableList::instance().getAsset(item->getAssetUUID(),  														item->getName(), @@ -4471,18 +4474,21 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_  			for(i = 0; i  < obj_count; ++i)  			{  				LLViewerInventoryItem *obj_item = obj_item_array.get(i); -				gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); -				gMessageSystem->nextBlockFast(_PREHASH_ObjectData ); -				gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); -				gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item->getLinkedUUID() ); - -				gMessageSystem->sendReliable( gAgent.getRegion()->getHost() ); - -				// this object might have been selected, so let the selection manager know it's gone now -				LLViewerObject *found_obj = gObjectList.findObject( obj_item->getLinkedUUID()); -				if (found_obj) +				if (get_is_item_worn(obj_item->getUUID()))  				{ -					LLSelectMgr::getInstance()->remove(found_obj); +					gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); +					gMessageSystem->nextBlockFast(_PREHASH_ObjectData ); +					gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); +					gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item->getLinkedUUID() ); +					 +					gMessageSystem->sendReliable( gAgent.getRegion()->getHost() ); +					 +					// this object might have been selected, so let the selection manager know it's gone now +					LLViewerObject *found_obj = gObjectList.findObject( obj_item->getLinkedUUID()); +					if (found_obj) +					{ +						LLSelectMgr::getInstance()->remove(found_obj); +					}  				}  			}  		} @@ -4492,7 +4498,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_  			for(i = 0; i  < gest_count; ++i)  			{  				LLViewerInventoryItem *gest_item = gest_item_array.get(i); -				if ( LLGestureManager::instance().isGestureActive( gest_item->getLinkedUUID()) ) +				if (get_is_item_worn(gest_item->getUUID()))  				{  					LLGestureManager::instance().deactivateGesture( gest_item->getLinkedUUID() );  					gInventory.updateItem( gest_item ); @@ -4506,7 +4512,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_  BOOL LLWearableBridge::renameItem(const std::string& new_name)  { -	if( gAgentWearables.isWearingItem( mUUID ) ) +	if (get_is_item_worn(mUUID))  	{  		gAgentWearables.setWearableName( mUUID, new_name );  	} @@ -4515,7 +4521,7 @@ BOOL LLWearableBridge::renameItem(const std::string& new_name)  std::string LLWearableBridge::getLabelSuffix() const  { -	if( gAgentWearables.isWearingItem( mUUID ) ) +	if (get_is_item_worn(mUUID))  	{  		// e.g. "(worn)"   		return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn"); @@ -4549,7 +4555,7 @@ void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* mod  	}  	else if (isRemoveAction(action))  	{ -		if(gAgentWearables.isWearingItem(mUUID)) +		if (get_is_item_worn(mUUID))  		{  			LLViewerInventoryItem* item = getItem();  			if (item) @@ -4580,7 +4586,7 @@ void LLWearableBridge::openItem()  	}  	else if(isAgentInventory())  	{ -		if( !gAgentWearables.isWearingItem( mUUID ) ) +		if( !get_is_item_worn( mUUID ) )  		{  			wearOnAvatar();  		} @@ -4680,7 +4686,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  				case LLAssetType::AT_CLOTHING:  					items.push_back(std::string("Take Off"));  				case LLAssetType::AT_BODYPART: -					if (gAgentWearables.isWearingItem(item->getUUID())) +					if (get_is_item_worn(item->getUUID()))  					{  						disabled_items.push_back(std::string("Wearable Wear"));  						disabled_items.push_back(std::string("Wearable Add")); @@ -4711,7 +4717,7 @@ BOOL LLWearableBridge::canWearOnAvatar(void* user_data)  		LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem();  		if(!item || !item->isComplete()) return FALSE;  	} -	return (!gAgentWearables.isWearingItem(self->mUUID)); +	return (!get_is_item_worn(self->mUUID));  }  // Called from menus @@ -4843,7 +4849,7 @@ BOOL LLWearableBridge::canEditOnAvatar(void* user_data)  	LLWearableBridge* self = (LLWearableBridge*)user_data;  	if(!self) return FALSE; -	return (gAgentWearables.isWearingItem(self->mUUID)); +	return (get_is_item_worn(self->mUUID));  }  // static @@ -4880,7 +4886,7 @@ BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data)  	LLWearableBridge* self = (LLWearableBridge*)user_data;  	if( self && (LLAssetType::AT_BODYPART != self->mAssetType) )  	{ -		return gAgentWearables.isWearingItem( self->mUUID ); +		return get_is_item_worn( self->mUUID );  	}  	return FALSE;  } @@ -4890,7 +4896,7 @@ void LLWearableBridge::onRemoveFromAvatar(void* user_data)  {  	LLWearableBridge* self = (LLWearableBridge*)user_data;  	if(!self) return; -	if(gAgentWearables.isWearingItem(self->mUUID)) +	if(get_is_item_worn(self->mUUID))  	{  		LLViewerInventoryItem* item = self->getItem();  		if (item) @@ -4913,7 +4919,7 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,  	const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID);  	if(wearable)  	{ -		if( gAgentWearables.isWearingItem( item_id ) ) +		if( get_is_item_worn( item_id ) )  		{  			EWearableType type = wearable->getType(); @@ -5123,8 +5129,9 @@ void	LLAnimationBridgeAction::doIt()  //virtual  void	LLObjectBridgeAction::doIt()  { +	/*  	LLFloaterReg::showInstance("properties", mUUID); - +	*/  	LLInvFVBridgeAction::doIt();  } @@ -5196,7 +5203,7 @@ void LLWearableBridgeAction::doIt()  	}  	else if(isAgentInventory())  	{ -		if(!gAgentWearables.isWearingItem(mUUID)) +		if(!get_is_item_worn(mUUID))  		{  			wearOnAvatar();  		} diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 117e32c6be..4d83e9b684 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -292,7 +292,9 @@ public:  	static LLUIImagePtr getIcon(LLFolderType::EType preferred_type);  	virtual BOOL renameItem(const std::string& new_name); +  	virtual BOOL removeItem(); +	BOOL removeSystemFolder();  	bool removeItemResponse(const LLSD& notification, const LLSD& response);  	virtual void pasteFromClipboard(); @@ -339,6 +341,7 @@ protected:  	static void createNewEyes(void* user_data);  	BOOL checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& typeToCheck); +	BOOL areAnyContentsWorn(LLInventoryModel* model) const;  	void modifyOutfit(BOOL append);  	void determineFolderType(); diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 75218e98e0..8f4136c01f 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -338,3 +338,33 @@ LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,  	const std::string& icon_name = get_item_icon_name(asset_type, inventory_type, attachment_point, item_is_multi );  	return LLUI::getUIImage(icon_name);  } + +BOOL get_is_item_worn(const LLUUID& id) +{ +	const LLViewerInventoryItem* item = gInventory.getItem(id); +	if (!item) +		return FALSE; +	 +	switch(item->getType()) +	{ +		case LLAssetType::AT_OBJECT: +		{ +			const LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject(); +			if(my_avatar && my_avatar->isWearingAttachment(item->getLinkedUUID())) +				return TRUE; +			break; +		} +		case LLAssetType::AT_BODYPART: +		case LLAssetType::AT_CLOTHING: +			if(gAgentWearables.isWearingItem(item->getLinkedUUID())) +				return TRUE; +			break; +		case LLAssetType::AT_GESTURE: +			if (LLGestureManager::instance().isGestureActive(item->getLinkedUUID())) +				return TRUE; +			break; +		default: +			break; +	} +	return FALSE; +} diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index 9916a2351c..968db84819 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -41,7 +41,9 @@  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  //  // This is a collection of miscellaneous functions and classes -// that don't fit cleanly into any other class header. +// that don't fit cleanly into any other class header.  Eventually, +// we should figure out where to put these functions so that we can +// get rid of this generic file.  //  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -98,14 +100,17 @@ public:  };  const std::string& get_item_icon_name(LLAssetType::EType asset_type, -							 LLInventoryType::EType inventory_type, -							 U32 attachment_point,  -							 BOOL item_is_multi ); +									  LLInventoryType::EType inventory_type, +									  U32 attachment_point,  +									  BOOL item_is_multi );  LLUIImagePtr get_item_icon(LLAssetType::EType asset_type, -							 LLInventoryType::EType inventory_type, -							 U32 attachment_point,  -							 BOOL item_is_multi ); +						   LLInventoryType::EType inventory_type, +						   U32 attachment_point,  +						   BOOL item_is_multi ); + +// Is this item or its baseitem is worn, attached, etc... +BOOL get_is_item_worn(const LLUUID& id);  #endif // LL_LLINVENTORYFUNCTIONS_H diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index c0da8f3daa..961d3dec8b 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -400,6 +400,7 @@ void LLPanelMainInventory::onClearSearch()  		mActivePanel->getRootFolder()->applyFunctorRecursively(opener);  		mActivePanel->getRootFolder()->scrollToShowSelection();  	} +	mFilterSubString = "";  }  void LLPanelMainInventory::onFilterEdit(const std::string& search_string ) @@ -417,6 +418,7 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )  	std::string uppercase_search_string = search_string;  	LLStringUtil::toUpper(uppercase_search_string); +	mFilterSubString = uppercase_search_string;  	if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty())  	{  			// current filter and new filter empty, do nothing @@ -431,7 +433,7 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )  	}  	// set new filter string -	mActivePanel->setFilterSubString(uppercase_search_string); +	mActivePanel->setFilterSubString(mFilterSubString);  } @@ -484,6 +486,7 @@ void LLPanelMainInventory::onFilterSelected()  	{  		return;  	} +	setFilterSubString(mFilterSubString);  	LLInventoryFilter* filter = mActivePanel->getFilter();  	LLFloaterInventoryFinder *finder = getFinder();  	if (finder) @@ -542,7 +545,7 @@ void LLPanelMainInventory::draw()  {  	if (mActivePanel && mFilterEditor)  	{ -		mFilterEditor->setText(mActivePanel->getFilterSubString()); +		mFilterEditor->setText(mFilterSubString);  	}	  	LLPanel::draw();  } @@ -1016,9 +1019,11 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)  		}  		const LLUUID& item_id = current_item->getListener()->getUUID();  		const std::string &item_name = current_item->getListener()->getName(); +		mFilterSubString = item_name;  		LLInventoryFilter *filter = mActivePanel->getFilter();  		filter->setFilterSubString(item_name);  		mFilterEditor->setText(item_name); +  		mFilterEditor->setFocus(TRUE);  		filter->setFilterUUID(item_id);  		filter->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index 920de2665c..69f8a14583 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -123,6 +123,7 @@ private:  	LLInventoryPanel*			mActivePanel;  	LLSaveFolderState*			mSavedFolderState;  	std::string					mFilterText; +	std::string					mFilterSubString;  	////////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index 5b36a5406a..f9777147b7 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -56,7 +56,10 @@  #include "llmenugl.h"  #include "llviewermenu.h" +#include "llviewercontrol.h" +  static LLRegisterPanelClassWrapper<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory"); +bool LLPanelOutfitsInventory::sShowDebugEditor = false;  LLPanelOutfitsInventory::LLPanelOutfitsInventory() :  	mActivePanel(NULL), @@ -74,7 +77,7 @@ LLPanelOutfitsInventory::~LLPanelOutfitsInventory()  // virtual  BOOL LLPanelOutfitsInventory::postBuild()  { -	 +	sShowDebugEditor = gSavedSettings.getBOOL("ShowDebugAppearanceEditor");  	initTabPanels();  	initListCommandsHandlers();  	return TRUE; @@ -86,6 +89,11 @@ void LLPanelOutfitsInventory::updateVerbs()  	{  		mParent->updateVerbs();  	} + +	if (mListCommands) +	{ +		mListCommands->childSetVisible("look_edit_btn",sShowDebugEditor); +	}  }  void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent) @@ -96,6 +104,7 @@ void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent)  // virtual  void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)  { +	mFilterSubString = string;  	if (string == "")  	{  		mActivePanel->setFilterSubString(LLStringUtil::null); @@ -177,7 +186,6 @@ void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewIte  void LLPanelOutfitsInventory::onSelectorButtonClicked()  { -	/*  	  LLFolderViewItem* cur_item = getRootFolder()->getCurSelectedItem();  	  LLFolderViewEventListener* listenerp = cur_item->getListener(); @@ -189,7 +197,6 @@ void LLPanelOutfitsInventory::onSelectorButtonClicked()  	  LLSideTray::getInstance()->showPanel("sidepanel_appearance", key);  	  }  -	*/  }  LLFolderViewEventListener *LLPanelOutfitsInventory::getCorrectListenerForAction() @@ -233,9 +240,11 @@ void LLPanelOutfitsInventory::initListCommandsHandlers()  	mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::onGearButtonClick, this));  	mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this)); -	mListCommands->childSetAction("add_btn", boost::bind(&LLPanelOutfitsInventory::onAddButtonClick, this)); +	mListCommands->childSetAction("make_outfit_btn", boost::bind(&LLPanelOutfitsInventory::onAddButtonClick, this));  	mListCommands->childSetAction("wear_btn", boost::bind(&LLPanelOutfitsInventory::onWearButtonClick, this)); -	 + +	mListCommands->childSetAction("look_edit_btn", boost::bind(&LLPanelOutfitsInventory::onSelectorButtonClicked, this)); +  	LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");  	trash_btn->setDragAndDropHandler(boost::bind(&LLPanelOutfitsInventory::handleDragAndDropToTrash, this  				   ,       _4 // BOOL drop @@ -433,6 +442,9 @@ void LLPanelOutfitsInventory::initTabPanels()  		LLInventoryPanel *panel = (*iter);  		panel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onTabSelectionChange, this, panel, _1, _2));  	} + +	mAppearanceTabs = getChild<LLTabContainer>("appearance_tabs"); +	mAppearanceTabs->setCommitCallback(boost::bind(&LLPanelOutfitsInventory::onTabChange, this));  }  void LLPanelOutfitsInventory::onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action) @@ -457,6 +469,19 @@ void LLPanelOutfitsInventory::onTabSelectionChange(LLInventoryPanel* tab_panel,  	onSelectionChange(items, user_action);  } +void LLPanelOutfitsInventory::onTabChange() +{ +	mActivePanel = (LLInventoryPanel*)childGetVisibleTab("appearance_tabs"); +	if (!mActivePanel) +	{ +		return; +	} +	mActivePanel->setFilterSubString(mFilterSubString); + +	bool is_my_outfits = (mActivePanel->getName() == "outfitslist_accordionpanel"); +	mListCommands->childSetEnabled("make_outfit_btn", is_my_outfits); +} +  LLInventoryPanel* LLPanelOutfitsInventory::getActivePanel()  {  	return mActivePanel; diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index 9b6b483e3b..1e084750a0 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -44,6 +44,7 @@ class LLSaveFolderState;  class LLButton;  class LLMenuGL;  class LLSidepanelAppearance; +class LLTabContainer;  class LLPanelOutfitsInventory : public LLPanel  { @@ -76,7 +77,8 @@ protected:  private:  	LLSidepanelAppearance*      mParent;  	LLSaveFolderState*			mSavedFolderState; - +	LLTabContainer*				mAppearanceTabs; +	std::string 				mFilterSubString;  public:  	////////////////////////////////////////////////////////////////////////////////// @@ -87,6 +89,7 @@ public:  protected:  	void 				initTabPanels();  	void 				onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action); +	void 				onTabChange();  private:  	LLInventoryPanel* 	mActivePanel; @@ -117,6 +120,9 @@ private:  	LLMenuGL*					mMenuAdd;  	// List Commands                                                              //  	//////////////////////////////////////////////////////////////////////////////// +	/// +public: +	static bool sShowDebugEditor;  };  #endif //LL_LLPANELOUTFITSINVENTORY_H diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 6e99d5a5f0..60a095506b 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -2277,6 +2277,26 @@ BOOL LLSelectMgr::selectGetAllValid()  	return TRUE;  } +//----------------------------------------------------------------------------- +// selectGetAllValidAndObjectsFound() - return TRUE if selections are +// valid and objects are found. +// +// For EXT-3114 - same as selectGetModify() without the modify check. +//----------------------------------------------------------------------------- +BOOL LLSelectMgr::selectGetAllValidAndObjectsFound() +{ +	for (LLObjectSelection::iterator iter = getSelection()->begin(); +		 iter != getSelection()->end(); iter++ ) +	{ +		LLSelectNode* node = *iter; +		LLViewerObject* object = node->getObject(); +		if( !object || !node->mValid ) +		{ +			return FALSE; +		} +	} +	return TRUE; +}  //-----------------------------------------------------------------------------  // selectGetModify() - return TRUE if current agent can modify all diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 6641be335a..f8ecfd0674 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -535,6 +535,7 @@ public:  	// Returns TRUE if the viewer has information on all selected objects  	BOOL selectGetAllRootsValid();  	BOOL selectGetAllValid(); +	BOOL selectGetAllValidAndObjectsFound();  	// returns TRUE if you can modify all selected objects.   	BOOL selectGetRootsModify(); diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index f3db0ab170..57434bd1e4 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -72,6 +72,8 @@  #include "llrender.h"  #include "llbottomtray.h"  #include "llnavigationbar.h" +#include "llfloatertools.h" +#include "llpaneloutfitsinventory.h"  #ifdef TOGGLE_HACKED_GODLIKE_VIEWER  BOOL 				gHackGodmode = FALSE; @@ -119,12 +121,6 @@ static bool handleSetShaderChanged(const LLSD& newvalue)  	return true;  } -static bool handleSetSelfInvisible( const LLSD& newvalue) -{ -	LLVOAvatarSelf::onChangeSelfInvisible( newvalue.asBoolean() ); -	return true; -} -  static bool handleReleaseGLBufferChanged(const LLSD& newvalue)  {  	if (gPipeline.isInit()) @@ -525,6 +521,18 @@ bool toggle_show_favorites_panel(const LLSD& newvalue)  	return true;  } +bool toggle_show_appearance_editor(const LLSD& newvalue) +{ +	LLPanelOutfitsInventory::sShowDebugEditor = newvalue.asBoolean(); +	return true; +} + +bool toggle_show_object_render_cost(const LLSD& newvalue) +{ +	LLFloaterTools::sShowObjectCost = newvalue.asBoolean(); +	return true; +} +  ////////////////////////////////////////////////////////////////////////////  void settings_setup_listeners() @@ -545,7 +553,6 @@ void settings_setup_listeners()  	gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));  	gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));  	gSavedSettings.getControl("RenderAvatarMaxVisible")->getSignal()->connect(boost::bind(&handleAvatarMaxVisibleChanged, _2)); -	gSavedSettings.getControl("RenderAvatarInvisible")->getSignal()->connect(boost::bind(&handleSetSelfInvisible, _2));  	gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2));  	gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2));  	gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _2)); @@ -668,6 +675,8 @@ void settings_setup_listeners()  	gSavedSettings.getControl("ShowSnapshotButton")->getSignal()->connect(boost::bind(&toggle_show_snapshot_button, _2));  	gSavedSettings.getControl("ShowNavbarNavigationPanel")->getSignal()->connect(boost::bind(&toggle_show_navigation_panel, _2));  	gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2)); +	gSavedSettings.getControl("ShowDebugAppearanceEditor")->getSignal()->connect(boost::bind(&toggle_show_appearance_editor, _2)); +	gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2));  }  #if TEST_CACHED_CONTROL diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index dfa775c292..f1ae573c32 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -633,6 +633,20 @@ class LLAdvancedCheckHUDInfo : public view_listener_t  	}  }; + +////////////// +// FLYING   // +////////////// + +class LLAdvancedAgentFlyingInfo : public view_listener_t +{ +	bool handleEvent(const LLSD&) +	{ +		return gAgent.getFlying(); +	} +}; + +  ///////////////////////  // CLEAR GROUP CACHE //  /////////////////////// @@ -2640,7 +2654,7 @@ bool enable_object_edit()  		enable = LLViewerParcelMgr::getInstance()->allowAgentBuild()  			|| LLSelectMgr::getInstance()->getSelection()->isAttachment();  	}  -	else if (LLSelectMgr::getInstance()->selectGetModify()) +	else if (LLSelectMgr::getInstance()->selectGetAllValidAndObjectsFound())  	{  		enable = true;  	} @@ -7703,6 +7717,9 @@ void initialize_menus()  	// Advanced Other Settings	  	view_listener_t::addMenu(new LLAdvancedClearGroupCache(), "Advanced.ClearGroupCache"); +	// Advanced > Shortcuts +	view_listener_t::addMenu(new LLAdvancedAgentFlyingInfo(), "Agent.getFlying"); +	  	// Advanced > Render > Types  	view_listener_t::addMenu(new LLAdvancedToggleRenderType(), "Advanced.ToggleRenderType");  	view_listener_t::addMenu(new LLAdvancedCheckRenderType(), "Advanced.CheckRenderType"); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 48794bbc1a..6bad8843fd 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -40,12 +40,12 @@  #include "llfloaterreg.h"  #include "llfloaterbuycurrency.h"  #include "llfloatersnapshot.h" -#include "llimage.h"
 -#include "llimagebmp.h"
 -#include "llimagepng.h"
 -#include "llimagej2c.h"
 -#include "llimagejpeg.h"
 -#include "llimagetga.h"
 +#include "llimage.h" +#include "llimagebmp.h" +#include "llimagepng.h" +#include "llimagej2c.h" +#include "llimagejpeg.h" +#include "llimagetga.h"  #include "llinventorymodel.h"	// gInventory  #include "llresourcedata.h"  #include "llfloaterperms.h" diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index b4c45c23d4..ecd6b05ded 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -2021,43 +2021,6 @@ void LLVOAvatarSelf::onCustomizeEnd()  	}  } -// static -void LLVOAvatarSelf::onChangeSelfInvisible(BOOL newvalue) -{ -	LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); -	if (avatarp) -	{ -		if (newvalue) -		{ -			// we have just requested to set the avatar's baked textures to invisible -			avatarp->setInvisible(TRUE); -		} -		else -		{ -			avatarp->setInvisible(FALSE); -		} -	} -} - -void LLVOAvatarSelf::setInvisible(BOOL newvalue) -{ -	if (newvalue) -	{ -		setCompositeUpdatesEnabled(FALSE); -		for (U32 i = 0; i < mBakedTextureDatas.size(); i++ ) -		{ -			setNewBakedTexture(mBakedTextureDatas[i].mTextureIndex, IMG_INVISIBLE); -		} -		gAgent.sendAgentSetAppearance(); -	} -	else -	{ -		setCompositeUpdatesEnabled(TRUE); -		invalidateAll(); -		gAgent.sendAgentSetAppearance(); -	} -} -  // HACK: this will null out the avatar's local texture IDs before the TE message is sent  //       to ensure local texture IDs are not sent to other clients in the area.  //       this is a short-term solution. The long term solution will be to not set the texture diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index c7bd4eaadc..dc70996f0b 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -308,8 +308,6 @@ public:  	// Visibility  	//--------------------------------------------------------------------  public: -	static void		onChangeSelfInvisible(BOOL newvalue); -	void			setInvisible(BOOL newvalue);  	bool			sendAppearanceMessage(LLMessageSystem *mesgsys) const;  /**                    Appearance diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index 0405b9d28b..b789bd3650 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -356,7 +356,7 @@ BOOL LLWearable::importFile( LLFILE* file )  	if( num_parameters != mVisualParamIndexMap.size() )  	{ -		llwarns << "Wearable parameter mismatch. Reading in " << num_parameters << " from file, but created " << mVisualParamIndexMap.size() << " from avatar parameters. " << llendl; +		llwarns << "Wearable parameter mismatch. Reading in " << num_parameters << " from file, but created " << mVisualParamIndexMap.size() << " from avatar parameters. type: " <<  mType << llendl;  	}  	// parameters diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index 0f400777b8..d29dfa7034 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -471,6 +471,14 @@           function="Inventory.DoToSelected"           parameter="delete" />      </menu_item_call> +    <menu_item_call +     label="Delete System Folder" +     layout="topleft" +     name="Delete System Folder"> +        <menu_item_call.on_click +         function="Inventory.DoToSelected" +         parameter="delete_system_folder" /> +    </menu_item_call>      <menu_item_separator       layout="topleft" />      <menu_item_separator diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml index ab73f135b9..5c99022f35 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -69,18 +69,7 @@  		  name="options_gear_btn"  		  top="6"  		  width="18" /> -		 <button -		  follows="bottom|left" -		  height="18" -		  image_selected="AddItem_Press" -		  image_unselected="AddItem_Off" -		  image_disabled="AddItem_Disabled" -		  layout="topleft" -		  left_pad="5" -		  name="add_btn" -		  tool_tip="Add new item" -		  width="18" /> -		 <dnd_button +         <dnd_button  		  follows="bottom|left"  		  height="18"  		  image_selected="TrashItem_Press" @@ -92,13 +81,34 @@  		  top="6"  		  width="18" />  	 <button -	  follows="top|left" -		height="23" -		label="Wear" +	  follows="bottom|left" +		height="23"  +		label="Edit Look"   		layout="topleft" -		name="wear_btn" -		right="-5" -		top_pad="0" +        left="10" +		name="look_edit_btn" +        top="26" +        visible="false"   		width="90" /> +     <button +      follows="bottom|left" +      height="23"  +      label="Make Outfit"  +      layout="topleft" +      name="make_outfit_btn" +      tool_tip="Save appearance as an outfit" +       top="26" +      right="-110" +      width="90" /> +     <button +      follows="bottom|right"  +      height="23"  +      label="Wear" +      layout="topleft" +      name="wear_btn" +      right="-10" +       top="26" +      tool_tip="Wear selected outfit" +      width="90" />  	 </panel>  </panel> diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml index 27f19d44fa..7f4b4aef82 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml @@ -107,6 +107,7 @@ left="0"     layout="topleft"     left="0"     name="panel_look_info" +   top="35"     visible="false" />     <panel     class="panel_edit_wearable" @@ -115,6 +116,7 @@ left="0"     layout="topleft"     left="0"     name="panel_edit_wearable" +   top="35"     visible="false" />  </panel> | 
