diff options
| author | Tofu Linden <tofu.linden@lindenlab.com> | 2010-08-10 14:02:21 +0100 | 
|---|---|---|
| committer | Tofu Linden <tofu.linden@lindenlab.com> | 2010-08-10 14:02:21 +0100 | 
| commit | 83f108503aa5a34bf24ef0a167d1b76ba3800a38 (patch) | |
| tree | 1e5227e803980b3df83a77e0d0c39623e0fa2069 | |
| parent | bd708f82bd3b87051e03a2794ce417ae6f432c08 (diff) | |
| parent | 2f2a0ad38aecc1e9118cb51b86de578d56853311 (diff) | |
merge from PE's viewer-trunk
| -rw-r--r-- | indra/llui/llaccordionctrl.h | 2 | ||||
| -rw-r--r-- | indra/llui/lltextbase.cpp | 5 | ||||
| -rw-r--r-- | indra/llui/llurlentry.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llchathistory.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/llinventorybridge.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/lloutfitslist.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llstylemap.cpp | 12 | ||||
| -rw-r--r-- | indra/newview/llviewermenu.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/llvoavatar.cpp | 9 | ||||
| -rw-r--r-- | indra/newview/llvoavatar.h | 1 | ||||
| -rw-r--r-- | indra/newview/llwearableitemslist.cpp | 56 | ||||
| -rw-r--r-- | indra/newview/llwearableitemslist.h | 2 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/outfit_accordion_tab.xml | 1 | 
13 files changed, 79 insertions, 30 deletions
| diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h index f26a380e5f..6fc9ca86a3 100644 --- a/indra/llui/llaccordionctrl.h +++ b/indra/llui/llaccordionctrl.h @@ -139,7 +139,7 @@ public:  	 */  	const LLAccordionCtrlTab* getExpandedTab() const; -	const LLAccordionCtrlTab* getSelectedTab() const { return mSelectedTab; } +	LLAccordionCtrlTab* getSelectedTab() const { return mSelectedTab; }  	bool getFitParent() const {return mFitParent;} diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index cde08c7b19..3792f18c97 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -2723,7 +2723,10 @@ LLOnHoverChangeableTextSegment::LLOnHoverChangeableTextSegment( LLStyleConstSP s  F32 LLOnHoverChangeableTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect)  {  	F32 result = LLNormalTextSegment::draw(start, end, selection_start, selection_end, draw_rect); -	mStyle = mNormalStyle; +	if (end == mEnd - mStart) +	{ +		mStyle = mNormalStyle; +	}  	return result;  } diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 17d211fb36..bf7b25910f 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -366,7 +366,7 @@ std::string LLUrlEntryAgent::getTooltip(const std::string &string) const  bool LLUrlEntryAgent::underlineOnHoverOnly(const std::string &string) const  {  	std::string url = getUrl(string); -	return LLStringUtil::endsWith(url, "/about"); +	return LLStringUtil::endsWith(url, "/about") || LLStringUtil::endsWith(url, "/inspect");  }  std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCallback &cb) diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 7c33923f04..7204e6c39c 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -699,8 +699,9 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL  			{  				LLStyle::Params link_params(style_params);  				link_params.overwriteFrom(LLStyleMap::instance().lookupAgent(chat.mFromID)); -				// Convert the name to a hotlink and add to message. -				mEditor->appendText(chat.mFromName + delimiter, false, link_params); +				// Add link to avatar's inspector and delimiter to message. +				mEditor->appendText(link_params.link_href, false, style_params); +				mEditor->appendText(delimiter, false, style_params);  			}  			else  			{ diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 7e710ce8e1..53622f7188 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -3989,6 +3989,11 @@ std::string LLObjectBridge::getLabelSuffix() const  {  	if (get_is_item_worn(mUUID))  	{ +		if (!isAgentAvatarValid()) +		{ +			return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn"); +		} +  		std::string attachment_point_name = gAgentAvatarp->getAttachedPointName(mUUID);  		// e.g. "(worn on ...)" / "(attached to ...)" diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index f921bca623..8422b97b3a 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -403,6 +403,12 @@ void LLOutfitsList::onOpen(const LLSD& /*info*/)  		mIsInitialized = true;  	} + +	LLAccordionCtrlTab* selected_tab = mAccordion->getSelectedTab(); +	if (!selected_tab) return; + +	// Pass focus to the selected outfit tab. +	selected_tab->showAndFocusHeader();  }  void LLOutfitsList::refreshList(const LLUUID& category_id) diff --git a/indra/newview/llstylemap.cpp b/indra/newview/llstylemap.cpp index 8fab3bb361..b3d7dddde8 100644 --- a/indra/newview/llstylemap.cpp +++ b/indra/newview/llstylemap.cpp @@ -46,20 +46,12 @@ const LLStyle::Params &LLStyleMap::lookupAgent(const LLUUID &source)  	if (mMap.find(source) == mMap.end())  	{  		LLStyle::Params style_params; -		if (source != LLUUID::null && source != gAgent.getID() ) +		if (source != LLUUID::null)  		{  			style_params.color.control = "HTMLLinkColor";  			style_params.readonly_color.control = "HTMLLinkColor"; -			style_params.link_href =  -					LLSLURL("agent", source, "inspect").getSLURLString(); +			style_params.link_href = LLSLURL("agent", source, "inspect").getSLURLString();  		} -		else -		{ -			// Make the resident's own name white and don't make the name clickable. -			style_params.color = LLColor4::white; -			style_params.readonly_color = LLColor4::white; -		} -  		mMap[source] = style_params;  	}  	return mMap[source]; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 92195f0a4d..a289a0eb7a 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -5950,7 +5950,8 @@ void LLObjectAttachToAvatar::confirmReplaceAttachment(S32 option, LLViewerJointA  			delta = delta * 0.5f;  			walkToSpot -= delta; -			CallbackData* user_data = new CallbackData(attachment_point, mReplace); // *TODO: leak if the callback isn't called? +			// The callback will be called even if avatar fails to get close enough to the object, so we won't get a memory leak. +			CallbackData* user_data = new CallbackData(attachment_point, mReplace);  			gAgent.startAutoPilotGlobal(gAgent.getPosGlobalFromAgent(walkToSpot), "Attach", NULL, onNearAttachObject, user_data, stop_distance);  			gAgentCamera.clearFocusObject();  		} diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 298ac28ca8..6392aad248 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -5642,6 +5642,15 @@ BOOL LLVOAvatar::canAttachMoreObjects() const  }  //----------------------------------------------------------------------------- +// canAttachMoreObjects() +// Returns true if we can attach <n> more objects. +//----------------------------------------------------------------------------- +BOOL LLVOAvatar::canAttachMoreObjects(U32 n) const +{ +	return (getNumAttachments() + n) <= MAX_AGENT_ATTACHMENTS; +} + +//-----------------------------------------------------------------------------  // lazyAttach()  //-----------------------------------------------------------------------------  void LLVOAvatar::lazyAttach() diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 5de08e8e27..3f603dda8b 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -687,6 +687,7 @@ public:  	void 				rebuildHUD();  	void 				resetHUDAttachments();  	BOOL				canAttachMoreObjects() const; +	BOOL				canAttachMoreObjects(U32 n) const;  protected:  	U32					getNumAttachments() const; // O(N), not O(1) diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 194213f880..e2a5489fcf 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -869,7 +869,7 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu  	setMenuItemVisible(menu, "wear_wear", 			n_already_worn == 0 && n_worn == 0 && can_be_worn);  	setMenuItemEnabled(menu, "wear_wear", 			n_already_worn == 0 && n_worn == 0);  	setMenuItemVisible(menu, "wear_add",			wear_add_visible); -	setMenuItemEnabled(menu, "wear_add",			n_items == 1 && canAddWearable(ids.front())); +	setMenuItemEnabled(menu, "wear_add",			canAddWearables(ids));  	setMenuItemVisible(menu, "wear_replace",		n_worn == 0 && n_already_worn != 0 && can_be_worn);  	//visible only when one item selected and this item is worn  	setMenuItemVisible(menu, "edit",				!standalone && mask & (MASK_CLOTHING|MASK_BODYPART) && n_worn == n_items && n_worn == 1); @@ -978,31 +978,61 @@ void LLWearableItemsList::ContextMenu::createNewWearable(const LLUUID& item_id)  	LLAgentWearables::createWearable(item->getWearableType(), true);  } -// Can we wear another wearable of the given item's wearable type? +// Returns true if all the given objects and clothes can be added.  // static -bool LLWearableItemsList::ContextMenu::canAddWearable(const LLUUID& item_id) +bool LLWearableItemsList::ContextMenu::canAddWearables(const uuid_vec_t& item_ids)  {  	// TODO: investigate wearables may not be loaded at this point EXT-8231 -	LLViewerInventoryItem* item = gInventory.getItem(item_id); -	if (!item) +	U32 n_objects = 0; +	boost::unordered_map<LLWearableType::EType, U32> clothes_by_type; + +	// Count given clothes (by wearable type) and objects. +	for (uuid_vec_t::const_iterator it = item_ids.begin(); it != item_ids.end(); ++it)  	{ -		return false; +		LLViewerInventoryItem* item = gInventory.getItem(*it); +		if (!item) +		{ +			return false; +		} + +		if (item->getType() == LLAssetType::AT_OBJECT) +		{ +			++n_objects; +		} +		else if (item->getType() == LLAssetType::AT_CLOTHING) +		{ +			++clothes_by_type[item->getWearableType()]; +		} +		else +		{ +			llwarns << "Unexpected wearable type" << llendl; +			return false; +		}  	} -	if (item->getType() == LLAssetType::AT_OBJECT) +	// Check whether we can add all the objects. +	if (!isAgentAvatarValid() || !gAgentAvatarp->canAttachMoreObjects(n_objects))  	{ -		// *TODO: is this the right check? -		return isAgentAvatarValid() && gAgentAvatarp->canAttachMoreObjects(); +		return false;  	} -	if (item->getType() != LLAssetType::AT_CLOTHING) +	// Check whether we can add all the clothes. +	boost::unordered_map<LLWearableType::EType, U32>::const_iterator m_it; +	for (m_it = clothes_by_type.begin(); m_it != clothes_by_type.end(); ++m_it)  	{ -		return false; +		LLWearableType::EType w_type	= m_it->first; +		U32 n_clothes					= m_it->second; + +		U32 wearable_count = gAgentWearables.getWearableCount(w_type); +		if ((wearable_count + n_clothes) > LLAgentWearables::MAX_CLOTHING_PER_TYPE) +		{ +			return false; +		} +  	} -	U32 wearable_count = gAgentWearables.getWearableCount(item->getWearableType()); -	return wearable_count < LLAgentWearables::MAX_CLOTHING_PER_TYPE; +	return true;  }  // EOF diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index 81f1cd1b40..d7970e0838 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -431,7 +431,7 @@ public:  		static void setMenuItemEnabled(LLContextMenu* menu, const std::string& name, bool val);  		static void updateMask(U32& mask, LLAssetType::EType at);  		static void createNewWearable(const LLUUID& item_id); -		static bool canAddWearable(const LLUUID& item_id); +		static bool canAddWearables(const uuid_vec_t& item_ids);  		LLWearableItemsList*	mParent;  	}; diff --git a/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml index 06bd1e9ff4..20ff492c0f 100644 --- a/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml +++ b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml @@ -9,6 +9,7 @@   layout="topleft"   name="Mockup Tab"   selection_enabled="true" + tab_stop="false"   title="Mockup Tab"   translate="false"   width="0"> | 
