diff options
94 files changed, 886 insertions, 608 deletions
diff --git a/doc/contributions.txt b/doc/contributions.txt index 3f33763ce0..5667b69c28 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -323,6 +323,8 @@ Khyota Wulluf  	VWR-8885  	VWR-9256  	VWR-9966 +Kitty Barnett +	VWR-19699  Kunnis Basiat  	VWR-82  	VWR-102 diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index ad8f8632a2..8071c8aa2d 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -249,7 +249,7 @@ public:  	/////////////////////////////////////////////////////////////////////////////////////////  	// Static Utility functions that operate on std::strings -	static std::basic_string<T> null; +	static const std::basic_string<T> null;  	typedef std::map<LLFormatMapString, LLFormatMapString> format_map_t;  	LL_COMMON_API static void getTokens(const std::basic_string<T>& instr, std::vector<std::basic_string<T> >& tokens, const std::basic_string<T>& delims); @@ -371,7 +371,7 @@ private:  	LL_COMMON_API static size_type getSubstitution(const std::basic_string<T>& instr, size_type& start, std::vector<std::basic_string<T> >& tokens);  }; -template<class T> std::basic_string<T> LLStringUtilBase<T>::null; +template<class T> const std::basic_string<T> LLStringUtilBase<T>::null;  template<class T> std::string LLStringUtilBase<T>::sLocale;  typedef LLStringUtilBase<char> LLStringUtil; diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp index 8e0245c451..6bf1347514 100644 --- a/indra/llui/llaccordionctrl.cpp +++ b/indra/llui/llaccordionctrl.cpp @@ -66,8 +66,12 @@ LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params)   , mAutoScrolling( false )   , mAutoScrollRate( 0.f )   , mSelectedTab( NULL ) + , mTabComparator( NULL ) + , mNoVisibleTabsHelpText(NULL)  { -  mSingleExpansion = params.single_expansion; +	initNoTabsWidget(params.empty_accordion_text); + +	mSingleExpansion = params.single_expansion;  	if(mFitParent && !mSingleExpansion)  	{  		llinfos << "fit_parent works best when combined with single_expansion" << llendl; @@ -78,7 +82,10 @@ LLAccordionCtrl::LLAccordionCtrl() : LLPanel()   , mAutoScrolling( false )   , mAutoScrollRate( 0.f )   , mSelectedTab( NULL ) + , mNoVisibleTabsHelpText(NULL)  { +	initNoTabsWidget(LLTextBox::Params()); +  	mSingleExpansion = false;  	mFitParent = false;  	LLUICtrlFactory::getInstance()->buildPanel(this, "accordion_parent.xml");	 @@ -168,6 +175,8 @@ BOOL LLAccordionCtrl::postBuild()  		}  	} +	updateNoTabsHelpTextVisibility(); +  	return TRUE;  } @@ -187,8 +196,15 @@ void LLAccordionCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)  	rcLocal.mRight = rcLocal.mLeft + width;  	rcLocal.mTop = rcLocal.mBottom + height; +	// get textbox a chance to reshape its content +	mNoVisibleTabsHelpText->reshape(width, height, called_from_parent); +  	setRect(rcLocal); +	// assume that help text is always fit accordion. +	// necessary text paddings can be set via h_pad and v_pad +	mNoVisibleTabsHelpText->setRect(getLocalRect()); +  	arrange();  } @@ -359,6 +375,31 @@ void LLAccordionCtrl::removeCollapsibleCtrl(LLView* view)  	}  } +void	LLAccordionCtrl::initNoTabsWidget(const LLTextBox::Params& tb_params) +{ +	LLTextBox::Params tp = tb_params; +	tp.rect(getLocalRect()); +	mNoVisibleTabsOrigString = tp.initial_value().asString(); +	mNoVisibleTabsHelpText = LLUICtrlFactory::create<LLTextBox>(tp, this); +} + +void	LLAccordionCtrl::updateNoTabsHelpTextVisibility() +{ +	bool visible_exists = false; +	std::vector<LLAccordionCtrlTab*>::const_iterator it = mAccordionTabs.begin(); +	const std::vector<LLAccordionCtrlTab*>::const_iterator it_end = mAccordionTabs.end(); +	for (; it != it_end; ++it) +	{ +		if ((*it)->getVisible()) +		{ +			visible_exists = true; +			break; +		} +	} + +	mNoVisibleTabsHelpText->setVisible(!visible_exists); +} +  void	LLAccordionCtrl::arrangeSinge()  {  	S32 panel_left = BORDER_MARGIN;	  // Margin from left side of Splitter @@ -737,6 +778,20 @@ S32	LLAccordionCtrl::notifyParent(const LLSD& info)  		}  		return 1;  	} +	else if (info.has("child_visibility_change")) +	{ +		BOOL new_visibility = info["child_visibility_change"]; +		if (new_visibility) +		{ +			// there is at least one visible tab +			mNoVisibleTabsHelpText->setVisible(FALSE); +		} +		else +		{ +			// it could be the latest visible tab, check all of them +			updateNoTabsHelpTextVisibility(); +		} +	}  	return LLPanel::notifyParent(info);  }  void	LLAccordionCtrl::reset		() @@ -745,6 +800,28 @@ void	LLAccordionCtrl::reset		()  		mScrollbar->setDocPos(0);  } +void LLAccordionCtrl::sort() +{ +	if (!mTabComparator) +	{ +		llwarns << "No comparator specified for sorting accordion tabs." << llendl; +		return; +	} + +	std::sort(mAccordionTabs.begin(), mAccordionTabs.end(), LLComparatorAdaptor(*mTabComparator)); +	arrange(); +} + +void	LLAccordionCtrl::setFilterSubString(const std::string& filter_string) +{ +	LLStringUtil::format_map_t args; +	args["[SEARCH_TERM]"] = LLURI::escape(filter_string); +	std::string text = mNoVisibleTabsOrigString; +	LLStringUtil::format(text, args); + +	mNoVisibleTabsHelpText->setValue(text); +} +  S32 LLAccordionCtrl::calcExpandedTabHeight(S32 tab_index /* = 0 */, S32 available_height /* = 0 */)  {  	if(tab_index < 0) diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h index a029201c90..fc6f2d896c 100644 --- a/indra/llui/llaccordionctrl.h +++ b/indra/llui/llaccordionctrl.h @@ -34,6 +34,7 @@  #define LL_ACCORDIONCTRL_H  #include "llpanel.h" +#include "lltextbox.h"  #include "llscrollbar.h"  #include <vector> @@ -56,6 +57,19 @@ private:  public: +	/** +	 * Abstract comparator for accordion tabs. +	 */ +	class LLTabComparator +	{ +	public: +		LLTabComparator() {}; +		virtual ~LLTabComparator() {}; + +		/** Returns true if tab1 < tab2, false otherwise */ +		virtual bool compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const = 0; +	}; +  	struct Params   		: public LLInitParam::Block<Params, LLPanel::Params>  	{ @@ -64,10 +78,12 @@ public:  								accordion tabs are responsible for scrolling their content.  								*NOTE fit_parent works best when combined with single_expansion.  								Accordion view should implement getRequiredRect() and provide valid height*/ +		Optional<LLTextBox::Params>	empty_accordion_text;  		Params()  			: single_expansion("single_expansion",false)  			, fit_parent("fit_parent", false) +			, empty_accordion_text("empty_accordion_text")  		{};  	}; @@ -105,7 +121,18 @@ public:  	void	reset		(); +	void	setComparator(const LLTabComparator* comp) { mTabComparator = comp; } +	void	sort(); + +	/** +	 * Sets filter substring as a search_term for help text when there are no any visible tabs. +	 */ +	void	setFilterSubString(const std::string& filter_string); +  private: +	void	initNoTabsWidget(const LLTextBox::Params& tb_params); +	void	updateNoTabsHelpTextVisibility(); +  	void	arrangeSinge();  	void	arrangeMultiple(); @@ -123,6 +150,21 @@ private:  	BOOL	autoScroll				(S32 x, S32 y); +	/** +	 * An adaptor for LLTabComparator +	 */ +	struct LLComparatorAdaptor +	{ +		LLComparatorAdaptor(const LLTabComparator& comparator) : mComparator(comparator) {}; + +		bool operator()(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) +		{ +			return mComparator.compare(tab1, tab2); +		} + +		const LLTabComparator& mComparator; +	}; +  private:  	LLRect			mInnerRect;  	LLScrollbar*	mScrollbar; @@ -130,7 +172,11 @@ private:  	bool			mFitParent;  	bool			mAutoScrolling;  	F32				mAutoScrollRate; -	LLAccordionCtrlTab* mSelectedTab; +	LLTextBox*		mNoVisibleTabsHelpText; +	std::string		mNoVisibleTabsOrigString; + +	LLAccordionCtrlTab*		mSelectedTab; +	const LLTabComparator*	mTabComparator;  }; diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index 83e67980a3..1bc8086a27 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -409,6 +409,13 @@ void LLAccordionCtrlTab::changeOpenClose(bool is_open)  	}  } +void LLAccordionCtrlTab::handleVisibilityChange(BOOL new_visibility) +{ +	LLUICtrl::handleVisibilityChange(new_visibility); + +	notifyParent(LLSD().with("child_visibility_change", new_visibility)); +} +  BOOL LLAccordionCtrlTab::handleMouseDown(S32 x, S32 y, MASK mask)  {  	if(mCollapsible && mHeaderVisible && mCanOpenClose) @@ -466,7 +473,7 @@ void LLAccordionCtrlTab::setAccordionView(LLView* panel)  	addChild(panel,0);  } -std::string LLAccordionCtrlTab::getTitle() +std::string LLAccordionCtrlTab::getTitle() const  {  	LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);  	if (header) diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h index 83a9024a74..82e0234bfc 100644 --- a/indra/llui/llaccordionctrltab.h +++ b/indra/llui/llaccordionctrltab.h @@ -115,7 +115,7 @@ public:  	void		setAccordionView(LLView* panel);  	LLView*		getAccordionView() { return mContainerPanel; }; -	std::string getTitle(); +	std::string getTitle() const;  	// Set text and highlight substring in LLAccordionCtrlTabHeader  	void setTitle(const std::string& title, const std::string& hl = LLStringUtil::null); @@ -154,6 +154,11 @@ public:  	// Call reshape after changing size  	virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); +	/** +	 * Raises notifyParent event with "child_visibility_change" = new_visibility +	 */ +	void handleVisibilityChange(BOOL new_visibility); +  	// Changes expand/collapse state and triggers expand/collapse callbacks  	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 55dbf50fd7..d86709c448 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1101,7 +1101,7 @@ S32 LLTextBase::getLeftOffset(S32 width)  	case LLFontGL::LEFT:  		return mHPad;  	case LLFontGL::HCENTER: -		return mHPad + (mVisibleTextRect.getWidth() - width - mHPad) / 2; +		return mHPad + llmax(0, (mVisibleTextRect.getWidth() - width - mHPad) / 2);  	case LLFontGL::RIGHT:  		return mVisibleTextRect.getWidth() - width;  	default: @@ -1207,11 +1207,6 @@ void LLTextBase::reflow()  			// grow line height as necessary based on reported height of this segment  			line_height = llmax(line_height, segment_height);  			remaining_pixels -= segment_width; -			if (remaining_pixels < 0) -			{ -				// getNumChars() and getDimensions() should return consistent results -				remaining_pixels = 0; -			}  			seg_offset += character_count; @@ -1893,7 +1888,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,  {  	// Figure out which line we're nearest to.  	LLRect visible_region = getVisibleDocumentRect(); - +	  	// binary search for line that starts before local_y  	line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), local_y - mVisibleTextRect.mBottom + visible_region.mBottom, compare_bottom()); @@ -1903,7 +1898,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,  	}  	S32 pos = getLength(); -	S32 start_x = mVisibleTextRect.mLeft + line_iter->mRect.mLeft; +	S32 start_x = mVisibleTextRect.mLeft + line_iter->mRect.mLeft - visible_region.mLeft;  	segment_set_t::iterator line_seg_iter;  	S32 line_seg_offset; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 7dbe650625..3b1c49edd3 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -306,6 +306,7 @@ set(viewer_SOURCE_FILES      llnotificationstorage.cpp      llnotificationtiphandler.cpp      lloutfitslist.cpp +    lloutfitobserver.cpp      lloutputmonitorctrl.cpp      llpanelavatar.cpp      llpanelavatartag.cpp @@ -822,6 +823,7 @@ set(viewer_HEADER_FILES      llnotificationmanager.h      llnotificationstorage.h      lloutfitslist.h +    lloutfitobserver.h      lloutputmonitorctrl.h      llpanelavatar.h      llpanelavatartag.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index e1c799b66a..b4d33f3123 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3862,7 +3862,7 @@        <key>Type</key>        <string>Boolean</string>        <key>Value</key> -      <integer>0</integer> +      <integer>1</integer>      </map>      <key>InBandwidth</key>      <map> diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index e6f363028a..a899926938 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -656,15 +656,37 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up  {  	if (item_id_to_wear.isNull()) return false; -	//only the item from a user's inventory is allowed -	if (!gInventory.isObjectDescendentOf(item_id_to_wear, gInventory.getRootFolderID())) return false; -  	LLViewerInventoryItem* item_to_wear = gInventory.getItem(item_id_to_wear);  	if (!item_to_wear) return false; +	if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getLibraryRootFolderID())) +	{ +		LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(replace); +		copy_inventory_item(gAgent.getID(), item_to_wear->getPermissions().getOwner(), item_to_wear->getUUID(), LLUUID::null, std::string(),cb); +		return false; +	}  +	else if (!gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getRootFolderID())) +	{ +		return false; // not in library and not in agent's inventory +	} +	else if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH))) +	{ +		LLNotificationsUtil::add("CannotWearTrash"); +		return false; +	} +  	switch (item_to_wear->getType())  	{  	case LLAssetType::AT_CLOTHING: +		if (gAgentWearables.areWearablesLoaded()) +		{ +			S32 wearable_count = gAgentWearables.getWearableCount(item_to_wear->getWearableType()); +			if ((replace && wearable_count != 0) || +				(wearable_count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE) ) +			{ +				removeCOFItemLinks(gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), wearable_count-1), false); +			} +		}   	case LLAssetType::AT_BODYPART:  		// Don't wear anything until initial wearables are loaded, can  		// destroy clothing items. @@ -676,7 +698,7 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up  		// Remove the existing wearables of the same type.  		// Remove existing body parts anyway because we must not be able to wear e.g. two skins. -		if (replace || item_to_wear->getType() == LLAssetType::AT_BODYPART) +		if (item_to_wear->getType() == LLAssetType::AT_BODYPART)  		{  			removeCOFLinksOfType(item_to_wear->getWearableType(), false);  		} @@ -1559,6 +1581,7 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update  								  item_array,  								  LLInventoryModel::EXCLUDE_TRASH);  	bool linked_already = false; +	U32 count = 0;  	for (S32 i=0; i<item_array.count(); i++)  	{  		// Are these links to the same object? @@ -1576,15 +1599,21 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update  		}  		// Are these links to different items of the same body part  		// type? If so, new item will replace old. -		// TODO: MULTI-WEARABLE: check for wearable limit for clothing types -		else if (is_body_part && (vitem->isWearableType()) && (vitem->getWearableType() == wearable_type)) +		else if ((vitem->isWearableType()) && (vitem->getWearableType() == wearable_type))  		{ -			if (inv_item->getIsLinkType()  && (vitem->getWearableType() == wearable_type)) +			++count; +			if (is_body_part && inv_item->getIsLinkType()  && (vitem->getWearableType() == wearable_type))  			{  				gInventory.purgeObject(inv_item->getUUID());  			} +			else if (count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE) +			{ +				// MULTI-WEARABLES: make sure we don't go over MAX_CLOTHING_PER_TYPE +				gInventory.purgeObject(inv_item->getUUID()); +			}  		}  	} +  	if (linked_already)  	{  		if (do_update) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 7a3eddf7a6..41f5fe64a1 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -203,7 +203,9 @@ LLBottomTray::~LLBottomTray()  	// override effect of save_visibility=true.  	// this attribute is necessary to button.initial_callback=Button.SetFloaterToggle works properly:  	//		i.g when floater changes its visibility - button changes its toggle state. +	getChild<LLUICtrl>("build_btn")->setControlValue(false);  	getChild<LLUICtrl>("search_btn")->setControlValue(false); +	getChild<LLUICtrl>("world_map_btn")->setControlValue(false);  }  // *TODO Vadim: why void* ? diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index 7ac3d14c72..916d53da3c 100644 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -387,13 +387,7 @@ LLPanelClothingListItem* LLCOFWearables::buildClothingListItem(LLViewerInventory  	item_panel->childSetAction("btn_edit", mCOFCallbacks.mEditWearable);  	//turning on gray separator line for the last item in the items group of the same wearable type -	if (last) -	{ -		LLRect rect = item_panel->getRect(); -		item_panel->reshape(rect.getWidth(), rect.getHeight() + -		item_panel->getChild<LLView>("wearable_type_separator_icon")->getRect().getHeight()); -		item_panel->childSetVisible("wearable_type_separator_icon", true); -	} +	item_panel->childSetVisible("wearable_type_separator_icon", last);  	return item_panel;  } @@ -427,7 +421,7 @@ LLPanelDeletableWearableListItem* LLCOFWearables::buildAttachemntListItem(LLView  	llassert(item);  	if (!item) return NULL; -	LLPanelDeletableWearableListItem* item_panel = LLPanelDeletableWearableListItem::create(item); +	LLPanelAttachmentListItem* item_panel = LLPanelAttachmentListItem::create(item);  	if (!item_panel) return NULL;  	//setting callbacks diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 3aa9d75bc0..967f38bfd2 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -60,8 +60,14 @@  #include "llinventorymodel.h"  #include "llrootview.h"  #include "llspeakers.h" +#include "llsidetray.h" +static const S32 RECT_PADDING_NOT_INIT = -1; +static const S32 RECT_PADDING_NEED_RECALC = -2; + +S32 LLIMFloater::sAllowedRectRightPadding = RECT_PADDING_NOT_INIT; +  LLIMFloater::LLIMFloater(const LLUUID& session_id)    : LLTransientDockableFloater(NULL, true, session_id),  	mControlPanel(NULL), @@ -444,19 +450,44 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)  	return floater;  } +//static +bool LLIMFloater::resetAllowedRectPadding(const LLSD& newvalue) +{ +	//reset allowed rect right padding if "SidebarCameraMovement" option  +	//or sidebar state changed +	sAllowedRectRightPadding = RECT_PADDING_NEED_RECALC ; +	return true; +} +  void LLIMFloater::getAllowedRect(LLRect& rect)  { +	if (sAllowedRectRightPadding == RECT_PADDING_NOT_INIT) //wasn't initialized +	{ +		gSavedSettings.getControl("SidebarCameraMovement")->getSignal()->connect(boost::bind(&LLIMFloater::resetAllowedRectPadding, _2)); + +		LLSideTray*	side_bar = LLSideTray::getInstance(); +		side_bar->getCollapseSignal().connect(boost::bind(&LLIMFloater::resetAllowedRectPadding, _2)); +		sAllowedRectRightPadding = RECT_PADDING_NEED_RECALC; +	} +  	rect = gViewerWindow->getWorldViewRectScaled(); -	static S32 right_padding = 0; -	if (right_padding == 0) +	if (sAllowedRectRightPadding == RECT_PADDING_NEED_RECALC) //recalc allowed rect right padding  	{  		LLPanel* side_bar_tabs =  				gViewerWindow->getRootView()->getChild<LLPanel> (  						"side_bar_tabs"); -		right_padding = side_bar_tabs->getRect().getWidth(); +		sAllowedRectRightPadding = side_bar_tabs->getRect().getWidth();  		LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs); + +		if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE) +		{ +			LLSideTray*	side_bar = LLSideTray::getInstance(); + +			if (side_bar->getVisible() && !side_bar->getCollapsed()) +				sAllowedRectRightPadding += side_bar->getRect().getWidth(); +		}  	} -	rect.mRight -= right_padding; +	rect.mRight -= sAllowedRectRightPadding;  }  void LLIMFloater::setDocked(bool docked, bool pop_on_undock) diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h index fef178e3a2..f1e68a2b3d 100644 --- a/indra/newview/llimfloater.h +++ b/indra/newview/llimfloater.h @@ -155,6 +155,10 @@ private:  	static void closeHiddenIMToasts(); +	static bool resetAllowedRectPadding(const LLSD& newvalue); +	//need to keep this static for performance issues +	static S32 sAllowedRectRightPadding; +  	static void confirmLeaveCallCallback(const LLSD& notification, const LLSD& response);  	LLPanelChatControlPanel* mControlPanel; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 0e63c21e16..3a9c5ba698 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -103,7 +103,6 @@ void dec_busy_count()  }  // Function declarations -void wear_add_inventory_item_on_avatar(LLInventoryItem* item);  void remove_inventory_category_from_avatar(LLInventoryCategory* category);  void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id);  bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*); @@ -4277,33 +4276,6 @@ LLWearableBridge::LLWearableBridge(LLInventoryPanel* inventory,  	mInvType = inv_type;  } -// *NOTE: hack to get from avatar inventory to avatar -void wear_inventory_item_on_avatar( LLInventoryItem* item ) -{ -	if(item) -	{ -		lldebugs << "wear_inventory_item_on_avatar( " << item->getName() -				 << " )" << llendl; - -		LLAppearanceMgr::getInstance()->wearItemOnAvatar(item->getUUID(), true, false); -	} -} - -void wear_add_inventory_item_on_avatar( LLInventoryItem* item ) -{ -	if(item) -	{ -		lldebugs << "wear_add_inventory_item_on_avatar( " << item->getName() -				 << " )" << llendl; - -		LLWearableList::instance().getAsset(item->getAssetUUID(), -											item->getName(), -											item->getType(), -											LLWearableBridge::onWearAddOnAvatarArrived, -											new LLUUID(item->getUUID())); -	} -} -  void remove_inventory_category_from_avatar( LLInventoryCategory* category )  {  	if(!category) return; @@ -4619,21 +4591,7 @@ void LLWearableBridge::wearOnAvatar()  	LLViewerInventoryItem* item = getItem();  	if(item)  	{ -		if(!isAgentInventory()) -		{ -			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); -			copy_inventory_item( -				gAgent.getID(), -				item->getPermissions().getOwner(), -				item->getUUID(), -				LLUUID::null, -				std::string(), -				cb); -		} -		else -		{ -			wear_inventory_item_on_avatar(item); -		} +		LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, true);  	}  } @@ -4650,21 +4608,7 @@ void LLWearableBridge::wearAddOnAvatar()  	LLViewerInventoryItem* item = getItem();  	if(item)  	{ -		if(!isAgentInventory()) -		{ -			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); -			copy_inventory_item( -				gAgent.getID(), -				item->getPermissions().getOwner(), -				item->getUUID(), -				LLUUID::null, -				std::string(), -				cb); -		} -		else -		{ -			wear_add_inventory_item_on_avatar(item); -		} +		LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, false);  	}  } @@ -5189,41 +5133,7 @@ class LLWearableBridgeAction: public LLInvFVBridgeAction  public:  	virtual void doIt()  	{ -		if(isItemInTrash()) -		{ -			LLNotificationsUtil::add("CannotWearTrash"); -		} -		else if(isAgentInventory()) -		{ -			if(!get_is_item_worn(mUUID)) -			{ -				wearOnAvatar(); -			} -		} -		else -		{ -			// must be in the inventory library. copy it to our inventory -			// and put it on right away. -			LLViewerInventoryItem* item = getItem(); -			if(item && item->isFinished()) -			{ -				LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); -				copy_inventory_item( -					gAgent.getID(), -					item->getPermissions().getOwner(), -					item->getUUID(), -					LLUUID::null, -					std::string(), -					cb); -			} -			else if(item) -			{ -				// *TODO: We should fetch the item details, and then do -				// the operation above. -				LLNotificationsUtil::add("CannotWearInfoNotComplete"); -			} -		} -		LLInvFVBridgeAction::doIt(); +		wearOnAvatar();  	}  	virtual ~LLWearableBridgeAction(){}  protected: @@ -5262,21 +5172,7 @@ void LLWearableBridgeAction::wearOnAvatar()  	LLViewerInventoryItem* item = getItem();  	if(item)  	{ -		if(!isAgentInventory()) -		{ -			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); -			copy_inventory_item( -				gAgent.getID(), -				item->getPermissions().getOwner(), -				item->getUUID(), -				LLUUID::null, -				std::string(), -				cb); -		} -		else -		{ -			wear_inventory_item_on_avatar(item); -		} +		LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, true);  	}  } diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 310fd7fb1d..a342a2da14 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -591,8 +591,6 @@ public:  		U32 flags = 0x00) const;  }; -void wear_inventory_item_on_avatar(LLInventoryItem* item); -  void rez_attachment(LLViewerInventoryItem* item,   					LLViewerJointAttachment* attachment); diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h index 0dd6f53be7..2c60d38cb5 100644 --- a/indra/newview/llinventoryitemslist.h +++ b/indra/newview/llinventoryitemslist.h @@ -177,7 +177,10 @@ protected:  	void setIconImage(const LLUIImagePtr& image);  	/** Set item title - inventory item name usually */ -	void setTitle(const std::string& title, const std::string& highlit_text); +	virtual void setTitle(const std::string& title, const std::string& highlit_text); + + +	LLViewerInventoryItem* mItem;  	// force not showing link icon on item's icon  	bool mForceNoLinksOnIcons; @@ -196,7 +199,6 @@ private:  	/** reshape remaining widgets */  	void reshapeMiddleWidgets(); -	LLViewerInventoryItem* mItem;  	LLIconCtrl*		mIconCtrl;  	LLTextBox*		mTitleCtrl; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 2e1c5238d3..6fc5804a48 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -35,6 +35,7 @@  #include "llagent.h"  #include "llagentwearables.h" +#include "llappearancemgr.h"  #include "llinventorypanel.h"  #include "llinventorybridge.h"  #include "llinventoryfunctions.h" @@ -2561,7 +2562,7 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)  		{  			LLViewerInventoryItem* wearable_item;  			wearable_item = gInventory.getItem(wearable_ids[i]); -			wear_inventory_item_on_avatar(wearable_item); +			LLAppearanceMgr::instance().wearItemOnAvatar(wearable_item->getUUID(), true, true);  		}  	} diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index d605d4430e..d09f729943 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -72,7 +72,7 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)  // public  void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos, -								 BOOL enabled, std::string& suffix) +								 BOOL enabled, const std::string& suffix)  {  	//llinfos << "LLNameListCtrl::addNameItem " << agent_id << llendl; @@ -268,7 +268,7 @@ LLScrollListItem* LLNameListCtrl::addElement(const LLSD& element, EAddPosition p  LLScrollListItem* LLNameListCtrl::addNameItemRow(  	const LLNameListCtrl::NameItem& name_item,  	EAddPosition pos, -	std::string& suffix) +	const std::string& suffix)  {  	LLUUID id = name_item.value().asUUID();  	LLNameListItem* item = NULL; diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index 1c26ee5db4..ee71db7540 100644 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -90,11 +90,11 @@ public:  	// Add a user to the list by name.  It will be added, the name   	// requested from the cache, and updated as necessary.  	void addNameItem(const LLUUID& agent_id, EAddPosition pos = ADD_BOTTOM, -					 BOOL enabled = TRUE, std::string& suffix = LLStringUtil::null); +					 BOOL enabled = TRUE, const std::string& suffix = LLStringUtil::null);  	void addNameItem(NameItem& item, EAddPosition pos = ADD_BOTTOM);  	/*virtual*/ LLScrollListItem* addElement(const LLSD& element, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL); -	LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, std::string& suffix = LLStringUtil::null); +	LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, const std::string& suffix = LLStringUtil::null);  	// Add a user to the list by name.  It will be added, the name   	// requested from the cache, and updated as necessary. diff --git a/indra/newview/lloutfitobserver.cpp b/indra/newview/lloutfitobserver.cpp new file mode 100644 index 0000000000..848b595613 --- /dev/null +++ b/indra/newview/lloutfitobserver.cpp @@ -0,0 +1,125 @@ +/** + * @file lloutfitobserver.cpp + * @brief Outfit observer facade. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llappearancemgr.h" +#include "lloutfitobserver.h" +#include "llinventorymodel.h" +#include "llviewerinventory.h" + +LLOutfitObserver::LLOutfitObserver() : +	mCOFLastVersion(LLViewerInventoryCategory::VERSION_UNKNOWN) +{ +	gInventory.addObserver(this); +} + +LLOutfitObserver::~LLOutfitObserver() +{ +	if (gInventory.containsObserver(this)) +	{ +		gInventory.removeObserver(this); +	} +} + +void LLOutfitObserver::changed(U32 mask) +{ +	if (!gInventory.isInventoryUsable()) +		return; + +	bool panel_updated = checkCOF(); + +	if (!panel_updated) +	{ +		checkBaseOutfit(); +	} +} + +// static +S32 LLOutfitObserver::getCategoryVersion(const LLUUID& cat_id) +{ +	LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); +	if (!cat) +		return LLViewerInventoryCategory::VERSION_UNKNOWN; + +	return cat->getVersion(); +} + +bool LLOutfitObserver::checkCOF() +{ +	LLUUID cof = LLAppearanceMgr::getInstance()->getCOF(); +	if (cof.isNull()) +		return false; + +	S32 cof_version = getCategoryVersion(cof); + +	if (cof_version == mCOFLastVersion) +		return false; + +	mCOFLastVersion = cof_version; + +	LLAppearanceMgr::getInstance()->updateIsDirty(); +	mCOFChanged(); + +	return true; +} + +void LLOutfitObserver::checkBaseOutfit() +{ +	LLUUID baseoutfit_id = +			LLAppearanceMgr::getInstance()->getBaseOutfitUUID(); + +	if (baseoutfit_id == mBaseOutfitId) +	{ +		if (baseoutfit_id.isNull()) +			return; + +		const S32 baseoutfit_ver = getCategoryVersion(baseoutfit_id); + +		if (baseoutfit_ver == mBaseOutfitLastVersion) +			return; +	} +	else +	{ +		mBaseOutfitId = baseoutfit_id; +		mBOFReplaced(); + +		if (baseoutfit_id.isNull()) +			return; + +		mBaseOutfitLastVersion = getCategoryVersion(mBaseOutfitId); +	} + +	LLAppearanceMgr& app_mgr = LLAppearanceMgr::instance(); +	app_mgr.updateIsDirty(); +	mBOFChanged(); +} diff --git a/indra/newview/lloutfitobserver.h b/indra/newview/lloutfitobserver.h new file mode 100644 index 0000000000..4cb40ead15 --- /dev/null +++ b/indra/newview/lloutfitobserver.h @@ -0,0 +1,82 @@ +/** + * @file lloutfitobserver.h + * @brief Outfit observer facade. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_OUTFITOBSERVER_H +#define LL_OUTFITOBSERVER_H + +#include "llsingleton.h" + +/** + * Outfit observer facade that provides simple possibility to subscribe on + * BOF(base outfit) replaced, BOF changed, COF(current outfit) changed events. + */ +class LLOutfitObserver: public LLInventoryObserver, public LLSingleton<LLOutfitObserver> +{ +public: +	virtual ~LLOutfitObserver(); + +	friend class LLSingleton<LLOutfitObserver>; + +	virtual void changed(U32 mask); + +	typedef boost::signals2::signal<void (void)> signal_t; + +	void addBOFReplacedCallback(const signal_t::slot_type& cb) { mBOFReplaced.connect(cb); } + +	void addBOFChangedCallback(const signal_t::slot_type& cb) { mBOFChanged.connect(cb); } + +	void addCOFChangedCallback(const signal_t::slot_type& cb) { mCOFChanged.connect(cb); } + +protected: +	LLOutfitObserver(); + +	/** Get a version of an inventory category specified by its UUID */ +	static S32 getCategoryVersion(const LLUUID& cat_id); + +	bool checkCOF(); + +	void checkBaseOutfit(); + +	//last version number of a COF category +	S32 mCOFLastVersion; + +	LLUUID mBaseOutfitId; + +	S32 mBaseOutfitLastVersion; + +private: +	signal_t mBOFReplaced; +	signal_t mBOFChanged; +	signal_t mCOFChanged; +}; + +#endif /* LL_OUTFITOBSERVER_H */ diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 77db280487..e20b2e26be 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -53,6 +53,20 @@  static bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y); +static const LLOutfitTabNameComparator OUTFIT_TAB_NAME_COMPARATOR; + +/*virtual*/ +bool LLOutfitTabNameComparator::compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const +{ +	std::string name1 = tab1->getTitle(); +	std::string name2 = tab2->getTitle(); + +	LLStringUtil::toUpper(name1); +	LLStringUtil::toUpper(name2); + +	return name1 < name2; +} +  //////////////////////////////////////////////////////////////////////////  class OutfitContextMenu : public LLListContextMenu @@ -158,6 +172,7 @@ LLOutfitsList::~LLOutfitsList()  BOOL LLOutfitsList::postBuild()  {  	mAccordion = getChild<LLAccordionCtrl>("outfits_accordion"); +	mAccordion->setComparator(&OUTFIT_TAB_NAME_COMPARATOR);  	return TRUE;  } @@ -328,7 +343,7 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)  		updateOutfitTab(*items_iter);  	} -	mAccordion->arrange(); +	mAccordion->sort();  }  void LLOutfitsList::onSelectionChange(LLUICtrl* ctrl) @@ -500,6 +515,8 @@ void LLOutfitsList::onFilteredWearableItemsListRefresh(LLUICtrl* ctrl)  void LLOutfitsList::applyFilter(const std::string& new_filter_substring)  { +	mAccordion->setFilterSubString(new_filter_substring); +  	for (outfits_map_t::iterator  			 iter = mOutfitsMap.begin(),  			 iter_end = mOutfitsMap.end(); diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h index 44f6ec908b..bb516446d2 100644 --- a/indra/newview/lloutfitslist.h +++ b/indra/newview/lloutfitslist.h @@ -32,18 +32,34 @@  #ifndef LL_LLOUTFITSLIST_H  #define LL_LLOUTFITSLIST_H +#include "llaccordionctrl.h"  #include "llpanel.h"  // newview  #include "llinventorymodel.h"  #include "llinventoryobserver.h" -class LLAccordionCtrl;  class LLAccordionCtrlTab;  class LLWearableItemsList;  class LLListContextMenu;  /** + * @class LLOutfitTabNameComparator + * + * Comparator of outfit tabs. + */ +class LLOutfitTabNameComparator : public LLAccordionCtrl::LLTabComparator +{ +	LOG_CLASS(LLOutfitTabNameComparator); + +public: +	LLOutfitTabNameComparator() {}; +	virtual ~LLOutfitTabNameComparator() {}; + +	/*virtual*/ bool compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const; +}; + +/**   * @class LLOutfitsList   *   * A list of agents's outfits from "My Outfits" inventory category diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index 8d0e3d4647..a1a9300ec2 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -51,6 +51,7 @@  #include "llagentwearables.h"  #include "llscrollingpanelparam.h"  #include "llradiogroup.h" +#include "llnotificationsutil.h"  #include "llcolorswatch.h"  #include "lltexturectrl.h" @@ -624,6 +625,7 @@ BOOL LLPanelEditWearable::postBuild()  	mDescTitle = getChild<LLTextBox>("description_text");  	getChild<LLRadioGroup>("sex_radio")->setCommitCallback(boost::bind(&LLPanelEditWearable::onCommitSexChange, this)); +	getChild<LLButton>("save_as_button")->setCommitCallback(boost::bind(&LLPanelEditWearable::onSaveAsButtonClicked, this));  	// The following panels will be shown/hidden based on what wearable we're editing  	// body parts @@ -744,6 +746,28 @@ void LLPanelEditWearable::onRevertButtonClicked(void* userdata)  	panel->revertChanges();  } +void LLPanelEditWearable::onSaveAsButtonClicked() +{ +	LLSD args; +	args["DESC"] = mTextEditor->getText(); + +	LLNotificationsUtil::add("SaveWearableAs", args, LLSD(), boost::bind(&LLPanelEditWearable::saveAsCallback, this, _1, _2)); +} + +void LLPanelEditWearable::saveAsCallback(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if (0 == option) +	{ +		std::string wearable_name = response["message"].asString(); +		LLStringUtil::trim(wearable_name); +		if( !wearable_name.empty() ) +		{ +			mTextEditor->setText(wearable_name); +			saveChanges(); +		} +	} +}  void LLPanelEditWearable::onCommitSexChange()  { @@ -991,8 +1015,14 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show)  			// storage for ordered list of visual params  			value_map_t sorted_params;  			getSortedParams(sorted_params, edit_group); -	 -			buildParamList(panel_list, sorted_params, tab); + +			LLJoint* jointp = gAgentAvatarp->getJoint( subpart_entry->mTargetJoint ); +			if (!jointp) +			{ +				jointp = gAgentAvatarp->getJoint("mHead"); +			} + +			buildParamList(panel_list, sorted_params, tab, jointp);  			updateScrollingPanelUI();  		} @@ -1229,7 +1259,7 @@ void LLPanelEditWearable::getSortedParams(value_map_t &sorted_params, const std:  	}  } -void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab) +void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab, LLJoint* jointp)  {  	// sorted_params is sorted according to magnitude of effect from  	// least to greatest.  Adding to the front of the child list @@ -1243,7 +1273,7 @@ void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value  		{  			LLPanel::Params p;  			p.name("LLScrollingPanelParam"); -			LLScrollingPanelParam* panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable()); +			LLScrollingPanelParam* panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable(), jointp);  			height = panel_list->addPanel( panel_param );  		}  	} diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h index 6b376fe3d9..54f729fa7a 100644 --- a/indra/newview/llpaneleditwearable.h +++ b/indra/newview/llpaneleditwearable.h @@ -48,6 +48,7 @@ class LLViewerVisualParam;  class LLVisualParamHint;  class LLViewerJointMesh;  class LLAccordionCtrlTab; +class LLJoint;  class LLPanelEditWearable : public LLPanel  { @@ -72,6 +73,8 @@ public:  	static void			onRevertButtonClicked(void* userdata);  	void				onCommitSexChange(); +	void				onSaveAsButtonClicked(); +	void				saveAsCallback(const LLSD& notification, const LLSD& response);  private: @@ -81,7 +84,7 @@ private:  	void				updateScrollingPanelUI();  	LLPanel*			getPanel(LLWearableType::EType type);  	void				getSortedParams(value_map_t &sorted_params, const std::string &edit_group); -	void				buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab); +	void				buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab, LLJoint* jointp);  	// update bottom bar buttons ("Save", "Revert", etc)  	void				updateVerbs(); diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 4982e98f8e..ea7410502d 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -39,6 +39,7 @@  #include "llagentcamera.h"  #include "llagentwearables.h"  #include "llappearancemgr.h" +#include "lloutfitobserver.h"  #include "llcofwearables.h"  #include "llfilteredwearablelist.h"  #include "llinventory.h" @@ -143,100 +144,6 @@ private:  	}  }; -class LLCOFObserver : public LLInventoryObserver -{ -public: -	LLCOFObserver(LLPanelOutfitEdit *panel) : mPanel(panel),  -		mCOFLastVersion(LLViewerInventoryCategory::VERSION_UNKNOWN) -	{ -		gInventory.addObserver(this); -	} - -	virtual ~LLCOFObserver() -	{ -		if (gInventory.containsObserver(this)) -		{ -			gInventory.removeObserver(this); -		} -	} -	 -	virtual void changed(U32 mask) -	{ -		if (!gInventory.isInventoryUsable()) return; -	 -		bool panel_updated = checkCOF(); - -		if (!panel_updated) -		{ -			checkBaseOutfit(); -		} -	} - -protected: - -	/** Get a version of an inventory category specified by its UUID */ -	static S32 getCategoryVersion(const LLUUID& cat_id) -	{ -		LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); -		if (!cat) return LLViewerInventoryCategory::VERSION_UNKNOWN; - -		return cat->getVersion(); -	} - -	bool checkCOF() -	{ -		LLUUID cof = LLAppearanceMgr::getInstance()->getCOF(); -		if (cof.isNull()) return false; - -		S32 cof_version = getCategoryVersion(cof); - -		if (cof_version == mCOFLastVersion) return false; -		 -		mCOFLastVersion = cof_version; - -		mPanel->update(); - -		return true; -	} - -	void checkBaseOutfit() -	{ -		LLUUID baseoutfit_id = LLAppearanceMgr::getInstance()->getBaseOutfitUUID(); - -		if (baseoutfit_id == mBaseOutfitId) -		{ -			if (baseoutfit_id.isNull()) return; - -			const S32 baseoutfit_ver = getCategoryVersion(baseoutfit_id); - -			if (baseoutfit_ver == mBaseOutfitLastVersion) return; -		} -		else -		{ -			mBaseOutfitId = baseoutfit_id; -			mPanel->updateCurrentOutfitName(); - -			if (baseoutfit_id.isNull()) return; - -			mBaseOutfitLastVersion = getCategoryVersion(mBaseOutfitId); -		} - -		mPanel->updateVerbs(); -	} -	 - - - -	LLPanelOutfitEdit *mPanel; - -	//last version number of a COF category -	S32 mCOFLastVersion; - -	LLUUID  mBaseOutfitId; - -	S32 mBaseOutfitLastVersion; -}; -  class LLCOFDragAndDropObserver : public LLInventoryAddItemByAssetObserver  {  public: @@ -277,7 +184,6 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()  	mSearchFilter(NULL),  	mCOFWearables(NULL),  	mInventoryItemsPanel(NULL), -	mCOFObserver(NULL),  	mGearMenu(NULL),  	mCOFDragAndDropObserver(NULL),  	mInitialized(false), @@ -288,7 +194,11 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()  	mSavedFolderState = new LLSaveFolderState();  	mSavedFolderState->setApply(FALSE); -	mCOFObserver = new LLCOFObserver(this); + +	LLOutfitObserver& observer = LLOutfitObserver::instance(); +	observer.addBOFReplacedCallback(boost::bind(&LLPanelOutfitEdit::updateCurrentOutfitName, this)); +	observer.addBOFChangedCallback(boost::bind(&LLPanelOutfitEdit::updateVerbs, this)); +	observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitEdit::update, this));  	mLookItemTypes.reserve(NUM_LOOK_ITEM_TYPES);  	for (U32 i = 0; i < NUM_LOOK_ITEM_TYPES; i++) @@ -303,7 +213,6 @@ LLPanelOutfitEdit::~LLPanelOutfitEdit()  {  	delete mSavedFolderState; -	delete mCOFObserver;  	delete mCOFDragAndDropObserver;  	delete mWearableListMaskCollector; @@ -756,9 +665,6 @@ void LLPanelOutfitEdit::updateCurrentOutfitName()  //private  void LLPanelOutfitEdit::updateVerbs()  { -	//*TODO implement better handling of COF dirtiness -	LLAppearanceMgr::getInstance()->updateIsDirty(); -  	bool outfit_is_dirty = LLAppearanceMgr::getInstance()->isOutfitDirty();  	bool has_baseoutfit = LLAppearanceMgr::getInstance()->getBaseOutfitUUID().notNull(); diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 802386c573..24ecf75c18 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -49,7 +49,7 @@ class LLButton;  class LLCOFWearables;  class LLTextBox;  class LLInventoryCategory; -class LLCOFObserver; +class LLOutfitObserver;  class LLCOFDragAndDropObserver;  class LLInventoryPanel;  class LLSaveFolderState; @@ -153,7 +153,6 @@ private:  	LLInventoryItemsList* 			mWearableItemsList;  	LLPanel*						mWearableItemsPanel; -	LLCOFObserver*	mCOFObserver;  	LLCOFDragAndDropObserver* mCOFDragAndDropObserver;  	std::vector<LLLookItemType> mLookItemTypes; diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index 5f67f3d989..8836672f91 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -50,6 +50,7 @@  #include "lllineeditor.h"  #include "llmodaldialog.h"  #include "llnotificationsutil.h" +#include "lloutfitobserver.h"  #include "lloutfitslist.h"  #include "llsaveoutfitcombobtn.h"  #include "llsidepanelappearance.h" @@ -204,6 +205,10 @@ LLPanelOutfitsInventory::LLPanelOutfitsInventory() :  	mSavedFolderState = new LLSaveFolderState();  	mSavedFolderState->setApply(FALSE);  	gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoaded, this)); + +	LLOutfitObserver& observer = LLOutfitObserver::instance(); +	observer.addBOFChangedCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this)); +	observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this));  }  LLPanelOutfitsInventory::~LLPanelOutfitsInventory() @@ -522,7 +527,7 @@ void LLPanelOutfitsInventory::updateListCommands()  	mListCommands->childSetEnabled("trash_btn", trash_enabled);  	mListCommands->childSetEnabled("wear_btn", wear_enabled);  	mListCommands->childSetVisible("wear_btn", wear_enabled); -	mSaveComboBtn->setSaveBtnEnabled(make_outfit_enabled); +	mSaveComboBtn->setMenuItemEnabled("save_outfit", make_outfit_enabled);  }  void LLPanelOutfitsInventory::showGearMenu() @@ -665,7 +670,7 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)  	}  	if (command_name == "make_outfit")  	{ -		return TRUE; +		return LLAppearanceMgr::getInstance()->isOutfitDirty();  	}  	if (command_name == "edit" ||  @@ -789,6 +794,7 @@ void LLPanelOutfitsInventory::onWearablesLoaded()  	setWearablesLoading(false);  } +// static  LLSidepanelAppearance* LLPanelOutfitsInventory::getAppearanceSP()  {  	static LLSidepanelAppearance* panel_appearance = diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index aff7839bcc..d58ae554b0 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -75,7 +75,7 @@ public:  	void setParent(LLSidepanelAppearance *parent);  	LLFolderView* getRootFolder(); -	LLSidepanelAppearance* getAppearanceSP(); +	static LLSidepanelAppearance* getAppearanceSP();  	static LLPanelOutfitsInventory* findInstance(); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 0a4af00f78..f16d1d8fda 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -1450,6 +1450,8 @@ void LLPanelPeople::showFriendsAccordionsIfNeeded()  		LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");  		accordion->arrange(); +		// *TODO: new empty_accordion_text attribute was implemented in accordion (EXT-7368). +		// this code should be refactored to use it  		// keep help text in a synchronization with accordions visibility.  		updateFriendListHelpText();  	} diff --git a/indra/newview/llsaveoutfitcombobtn.cpp b/indra/newview/llsaveoutfitcombobtn.cpp index b9b577084b..9518b0cbb3 100644 --- a/indra/newview/llsaveoutfitcombobtn.cpp +++ b/indra/newview/llsaveoutfitcombobtn.cpp @@ -34,6 +34,7 @@  #include "llappearancemgr.h"  #include "llpaneloutfitsinventory.h" +#include "llsidepanelappearance.h"  #include "llsaveoutfitcombobtn.h"  #include "llviewermenu.h" diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp index 242af6981c..6f5238f0a1 100644 --- a/indra/newview/llscrollingpanelparam.cpp +++ b/indra/newview/llscrollingpanelparam.cpp @@ -56,7 +56,7 @@ const S32 LLScrollingPanelParam::PARAM_HINT_HEIGHT = 128;  S32 LLScrollingPanelParam::sUpdateDelayFrames = 0;  LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_params, -											  LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable ) +											  LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp )  	: LLScrollingPanel( panel_params ),  	  mParam(param),  	  mAllowModify(allow_modify), @@ -73,9 +73,9 @@ LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_param  	F32 min_weight = param->getMinWeight();  	F32 max_weight = param->getMaxWeight(); -	mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), wearable,  min_weight); +	mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), wearable,  min_weight, jointp);  	pos_x = getChild<LLViewBorder>("right_border")->getRect().mLeft + left_border->getBorderWidth(); -	mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), wearable, max_weight ); +	mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), wearable, max_weight, jointp );  	mHintMin->setAllowsUpdates( FALSE );  	mHintMax->setAllowsUpdates( FALSE ); diff --git a/indra/newview/llscrollingpanelparam.h b/indra/newview/llscrollingpanelparam.h index fe4ce07166..3cdfd188a8 100644 --- a/indra/newview/llscrollingpanelparam.h +++ b/indra/newview/llscrollingpanelparam.h @@ -42,12 +42,13 @@ class LLViewerVisualParam;  class LLWearable;  class LLVisualParamHint;  class LLViewerVisualParam; +class LLJoint;  class LLScrollingPanelParam : public LLScrollingPanel  {  public:  	LLScrollingPanelParam( const LLPanel::Params& panel_params, -						   LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable ); +						   LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp );  	virtual ~LLScrollingPanelParam();  	virtual void		draw(); diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index b66789448f..e23643da0b 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -42,6 +42,7 @@  #include "llfloaterreg.h"  #include "llfloaterworldmap.h"  #include "llfoldervieweventlistener.h" +#include "lloutfitobserver.h"  #include "llpaneleditwearable.h"  #include "llpaneloutfitsinventory.h"  #include "llsidetray.h" @@ -73,26 +74,6 @@ private:  	LLSidepanelAppearance *mPanel;  }; -class LLWatchForOutfitRenameObserver : public LLInventoryObserver -{ -public: -	LLWatchForOutfitRenameObserver(LLSidepanelAppearance *panel) : -		mPanel(panel) -	{} -	virtual void changed(U32 mask); -	 -private: -	LLSidepanelAppearance *mPanel; -}; - -void LLWatchForOutfitRenameObserver::changed(U32 mask) -{ -	if (mask & LABEL) -	{ -		mPanel->refreshCurrentOutfitName(); -	} -} -  LLSidepanelAppearance::LLSidepanelAppearance() :  	LLPanel(),  	mFilterSubString(LLStringUtil::null), @@ -101,12 +82,13 @@ LLSidepanelAppearance::LLSidepanelAppearance() :  	mCurrOutfitPanel(NULL),  	mOpened(false)  { +	LLOutfitObserver& outfit_observer =  LLOutfitObserver::instance(); +	outfit_observer.addBOFChangedCallback(boost::bind(&LLSidepanelAppearance::refreshCurrentOutfitName, this, "")); +	outfit_observer.addCOFChangedCallback(boost::bind(&LLSidepanelAppearance::refreshCurrentOutfitName, this, ""));  }  LLSidepanelAppearance::~LLSidepanelAppearance()  { -	gInventory.removeObserver(mOutfitRenameWatcher); -	delete mOutfitRenameWatcher;  }  // virtual @@ -160,8 +142,6 @@ BOOL LLSidepanelAppearance::postBuild()  	mCurrOutfitPanel = getChild<LLPanel>("panel_currentlook"); -	mOutfitRenameWatcher = new LLWatchForOutfitRenameObserver(this); -	gInventory.addObserver(mOutfitRenameWatcher);  	setVisibleCallback(boost::bind(&LLSidepanelAppearance::onVisibilityChange,this,_2)); @@ -209,7 +189,7 @@ void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility)  	{  		if ((mOutfitEdit && mOutfitEdit->getVisible()) || (mEditWearable && mEditWearable->getVisible()))  		{ -			if (!gAgentCamera.cameraCustomizeAvatar()) +			if (!gAgentCamera.cameraCustomizeAvatar() && gSavedSettings.getBOOL("AppearanceCameraMovement"))  			{  				gAgentCamera.changeCameraToCustomizeAvatar();  			} @@ -217,9 +197,10 @@ void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility)  	}  	else  	{ -		if (gAgentCamera.cameraCustomizeAvatar()) +		if (gAgentCamera.cameraCustomizeAvatar() && gSavedSettings.getBOOL("AppearanceCameraMovement"))  		{  			gAgentCamera.changeCameraToDefault(); +			gAgentCamera.resetView();  		}  	}  } @@ -345,6 +326,7 @@ void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible, BOOL disable_cam  	else if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") )  	{  		gAgentCamera.changeCameraToDefault(); +		gAgentCamera.resetView();  	}  } @@ -384,6 +366,7 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we  		if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") )  		{  			gAgentCamera.changeCameraToDefault(); +			gAgentCamera.resetView();  		}  	}  } diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h index 30022ae375..812d6362ef 100644 --- a/indra/newview/llsidepanelappearance.h +++ b/indra/newview/llsidepanelappearance.h @@ -40,7 +40,6 @@  class LLFilterEditor;  class LLCurrentlyWornFetchObserver; -class LLWatchForOutfitRenameObserver;  class LLPanelEditWearable;  class LLWearable;  class LLPanelOutfitsInventory; @@ -97,9 +96,6 @@ private:  	// Used to make sure the user's inventory is in memory.  	LLCurrentlyWornFetchObserver* mFetchWorn; -	// Used to update title when currently worn outfit gets renamed. -	LLWatchForOutfitRenameObserver* mOutfitRenameWatcher; -  	// Search string for filtering landmarks and teleport  	// history locations  	std::string					mFilterSubString; diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 3c97f01887..9406f80b75 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -469,6 +469,9 @@ void LLSideTray::reflectCollapseChange()  	}  	gFloaterView->refresh(); +	 +	LLSD new_value = mCollapsed; +	mCollapseSignal(this,new_value);  }  void LLSideTray::arrange() diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index e8fdee9430..e176ff5aff 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -159,6 +159,8 @@ public:  	void		updateSidetrayVisibility(); +	commit_signal_t& getCollapseSignal() { return mCollapseSignal; } +  protected:  	LLSideTrayTab* getTab		(const std::string& name); @@ -187,6 +189,8 @@ private:  	child_vector_t					mTabs;  	LLSideTrayTab*					mActiveTab;	 +	commit_signal_t					mCollapseSignal; +  	LLButton*						mCollapseButton;  	bool							mCollapsed; diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 5628205dd4..ac419d8dc7 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -394,18 +394,21 @@ void LLStatusBar::setBalance(S32 balance)  {  	std::string money_str = LLResMgr::getInstance()->getMonetaryString( balance ); -	LLButton* btn_buy_currency = getChild<LLButton>("buycurrency"); +	LLTextBox* balance_box = getChild<LLTextBox>("balance");  	LLStringUtil::format_map_t string_args;  	string_args["[AMT]"] = llformat("%s", money_str.c_str());  	std::string label_str = getString("buycurrencylabel", string_args); -	btn_buy_currency->setLabel(label_str); +	balance_box->setValue(label_str); -	// Resize the balance button so that the label fits it, and the button expands to the left. -	// *TODO: LLButton should have an option where to expand. +	// Resize the L$ balance background to be wide enough for your balance plus the buy button  	{ -		S32 saved_right = btn_buy_currency->getRect().mRight; -		btn_buy_currency->autoResize(); -		btn_buy_currency->translate(saved_right - btn_buy_currency->getRect().mRight, 0); +		const S32 HPAD = 24; +		LLRect balance_rect = balance_box->getTextBoundingRect(); +		LLRect buy_rect = getChildView("buyL")->getRect(); +		LLView* balance_bg_view = getChildView("balance_bg"); +		LLRect balance_bg_rect = balance_bg_view->getRect(); +		balance_bg_rect.mLeft = balance_bg_rect.mRight - (buy_rect.getWidth() + balance_rect.getWidth() + HPAD); +		balance_bg_view->setShape(balance_bg_rect);  	}  	if (mBalance && (fabs((F32)(mBalance - balance)) > gSavedSettings.getF32("UISndMoneyChangeThreshold"))) diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index cf3bce2ec1..74b7f123d8 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -753,17 +753,22 @@ bool LLTextureFetchWorker::doWork(S32 param)  			if (region)  			{ -				std::string http_url = region->getCapability("GetTexture"); +				std::string http_url = region->getHttpUrl() ;  				if (!http_url.empty())  				{  					mUrl = http_url + "/?texture_id=" + mID.asString().c_str();  					mWriteToCacheState = CAN_WRITE ; //because this texture has a fixed texture id.  				} +				else +				{ +					mCanUseHTTP = false ; +				}  			}  			else  			{  				// This will happen if not logged in or if a region deoes not have HTTP Texture enabled  				//llwarns << "Region not found for host: " << mHost << llendl; +				mCanUseHTTP = false;  			}  		}  		if (mCanUseHTTP && !mUrl.empty()) diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index bc77ac5fd1..c862c02b82 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1878,24 +1878,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem(  				LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");  				return ACCEPT_NO;  			} - -			if (mSource == SOURCE_LIBRARY) -			{ -				// create item based on that one, and put it on if that -				// was a success. -				LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); -				copy_inventory_item( -					gAgent.getID(), -					item->getPermissions().getOwner(), -					item->getUUID(), -					LLUUID::null, -					std::string(), -					cb); -			} -			else -			{ -				wear_inventory_item_on_avatar( item ); -			} +			LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(),true, !(mask & MASK_CONTROL));  		}  		return ACCEPT_YES_MULTI;  	} diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp index c1dc1de5e5..8996157258 100644 --- a/indra/newview/lltoolmorph.cpp +++ b/indra/newview/lltoolmorph.cpp @@ -79,7 +79,8 @@ LLVisualParamHint::LLVisualParamHint(  	LLViewerJointMesh *mesh,   	LLViewerVisualParam *param,  	LLWearable *wearable, -	F32 param_weight) +	F32 param_weight, +	LLJoint* jointp)  	:  	LLViewerDynamicTexture(width, height, 3, LLViewerDynamicTexture::ORDER_MIDDLE, TRUE ),  	mNeedsUpdate( TRUE ), @@ -91,12 +92,12 @@ LLVisualParamHint::LLVisualParamHint(  	mAllowsUpdates( TRUE ),  	mDelayFrames( 0 ),  	mRect( pos_x, pos_y + height, pos_x + width, pos_y ), -	mLastParamWeight(0.f) +	mLastParamWeight(0.f), +	mCamTargetJoint(jointp)  {  	LLVisualParamHint::sInstances.insert( this );  	mBackgroundp = LLUI::getUIImage("avatar_thumb_bkgrnd.j2c"); -  	llassert(width != 0);  	llassert(height != 0);  } @@ -196,21 +197,6 @@ BOOL LLVisualParamHint::render()  	mNeedsUpdate = FALSE;  	mIsVisible = TRUE; -	LLViewerJointMesh* cam_target_joint = NULL; -	const std::string& cam_target_mesh_name = mVisualParam->getCameraTargetName(); -	if( !cam_target_mesh_name.empty() ) -	{ -		cam_target_joint = (LLViewerJointMesh*)gAgentAvatarp->getJoint( cam_target_mesh_name ); -	} -	if( !cam_target_joint ) -	{ -		cam_target_joint = (LLViewerJointMesh*)gMorphView->getCameraTargetJoint(); -	} -	if( !cam_target_joint ) -	{ -		cam_target_joint = (LLViewerJointMesh*)gAgentAvatarp->getJoint("mHead"); -	} -  	LLQuaternion avatar_rotation;  	LLJoint* root_joint = gAgentAvatarp->getRootJoint();  	if( root_joint ) @@ -218,7 +204,7 @@ BOOL LLVisualParamHint::render()  		avatar_rotation = root_joint->getWorldRotation();  	} -	LLVector3 target_joint_pos = cam_target_joint->getWorldPosition(); +	LLVector3 target_joint_pos = mCamTargetJoint->getWorldPosition();  	LLVector3 target_offset( 0, 0, mVisualParam->getCameraElevation() );  	LLVector3 target_pos = target_joint_pos + (target_offset * avatar_rotation); @@ -234,9 +220,9 @@ BOOL LLVisualParamHint::render()  	LLViewerCamera::getInstance()->setAspect((F32)mFullWidth / (F32)mFullHeight);  	LLViewerCamera::getInstance()->setOriginAndLookAt( -		camera_pos,		// camera -		LLVector3(0.f, 0.f, 1.f),						// up -		target_pos );	// point of interest +		camera_pos,			// camera +		LLVector3::z_axis,	// up +		target_pos );		// point of interest  	LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE); diff --git a/indra/newview/lltoolmorph.h b/indra/newview/lltoolmorph.h index 3bffefaa55..cbab5e765f 100644 --- a/indra/newview/lltoolmorph.h +++ b/indra/newview/lltoolmorph.h @@ -47,6 +47,7 @@  class LLViewerJointMesh;  class LLPolyMesh;  class LLViewerObject; +class LLJoint;  //-----------------------------------------------------------------------------  // LLVisualParamHint @@ -63,7 +64,8 @@ public:  		LLViewerJointMesh *mesh,   		LLViewerVisualParam *param,  		LLWearable *wearable, -		F32 param_weight);	 +		F32 param_weight,  +		LLJoint* jointp);	  	/*virtual*/ S8 getType() const ; @@ -96,6 +98,7 @@ protected:  	S32						mDelayFrames;		// updates are blocked for this many frames  	LLRect					mRect;  	F32						mLastParamWeight; +	LLJoint*				mCamTargetJoint;	// joint to target with preview camera  	LLUIImagePtr mBackgroundp; diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index d745356dcd..face7124c2 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -875,7 +875,7 @@ void WearOnAvatarCallback::fire(const LLUUID& inv_item)  	LLViewerInventoryItem *item = gInventory.getItem(inv_item);  	if (item)  	{ -		wear_inventory_item_on_avatar(item); +		LLAppearanceMgr::instance().wearItemOnAvatar(inv_item, true, mReplace);  	}  } diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 8ab7c9710d..d0d3ad693e 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -243,7 +243,13 @@ public:  class WearOnAvatarCallback : public LLInventoryCallback  { +public: +	WearOnAvatarCallback(bool do_replace = false) : mReplace(do_replace) {} +	  	void fire(const LLUUID& inv_item); + +protected: +	bool mReplace;  };  class ModifiedCOFCallback : public LLInventoryCallback diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index eaf489cf3d..caa868dca8 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -7531,10 +7531,13 @@ class LLEditTakeOff : public view_listener_t  		else  		{  			LLWearableType::EType type = LLWearableType::typeNameToType(clothing); -			if (type >= LLWearableType::WT_SHAPE && type < LLWearableType::WT_COUNT) +			if (type >= LLWearableType::WT_SHAPE  +				&& type < LLWearableType::WT_COUNT +				&& (gAgentWearables.getWearableCount(type) > 0))  			{ -				// MULTI-WEARABLES -				LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(gAgentWearables.getWearableInventoryItem(type,0)); +				// MULTI-WEARABLES: assuming user wanted to remove top shirt. +				U32 wearable_index = gAgentWearables.getWearableCount(type) - 1; +				LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(gAgentWearables.getWearableInventoryItem(type,wearable_index));  				LLWearableBridge::removeItemFromAvatar(item);  			} diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index c48668df9a..da240cedbb 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -216,6 +216,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,  	mColoName("unknown"),  	mProductSKU("unknown"),  	mProductName("unknown"), +	mHttpUrl(""),  	mCacheLoaded(FALSE),  	mCacheEntriesCount(0),  	mCacheID(), @@ -1555,6 +1556,10 @@ void LLViewerRegion::setCapability(const std::string& name, const std::string& u  	else  	{  		mCapabilities[name] = url; +		if(name == "GetTexture") +		{ +			mHttpUrl = url ; +		}  	}  } diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 5c4d5a61fd..a9e7ef771c 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -291,6 +291,7 @@ public:  	friend std::ostream& operator<<(std::ostream &s, const LLViewerRegion ®ion);      /// implements LLCapabilityProvider      virtual std::string getDescription() const; +	std::string getHttpUrl() const { return mHttpUrl ;}  	LLSpatialPartition* getSpatialPartition(U32 type);  public: @@ -383,6 +384,7 @@ private:  	std::string mColoName;  	std::string mProductSKU;  	std::string mProductName; +	std::string mHttpUrl ;  	// Maps local ids to cache entries. diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index d8a9ce9374..7e779986df 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1447,8 +1447,14 @@ void LLViewerFetchedTexture::setKnownDrawSize(S32 width, S32 height)  //virtual  void LLViewerFetchedTexture::processTextureStats()  { -	if(mFullyLoaded)//already loaded +	if(mFullyLoaded)  	{ +		if(mDesiredDiscardLevel <= mMinDesiredDiscardLevel)//already loaded +		{ +			return ; +		} +		mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ; +		mFullyLoaded = FALSE ;  		return ;  	} @@ -1482,6 +1488,7 @@ void LLViewerFetchedTexture::processTextureStats()  			mDesiredDiscardLevel = (S8)llmin(log((F32)mFullWidth / mKnownDrawWidth) / log_2,   					                             log((F32)mFullHeight / mKnownDrawHeight) / log_2) ;  			mDesiredDiscardLevel = 	llclamp(mDesiredDiscardLevel, (S8)0, (S8)getMaxDiscardLevel()) ; +			mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ;  		}  		mKnownDrawSizeChanged = FALSE ; @@ -1514,7 +1521,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  	}  	if(mFullyLoaded && !mForceToSaveRawImage)//already loaded for static texture  	{ -		return -4.0f ; //alreay fetched +		return -1.0f ; //alreay fetched  	}  	S32 cur_discard = getCurrentDiscardLevelForFetching(); @@ -1528,16 +1535,16 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  	}  	else if(mDesiredDiscardLevel >= cur_discard && cur_discard > -1)  	{ -		priority = -1.0f ; +		priority = -2.0f ;  	}  	else if(mCachedRawDiscardLevel > -1 && mDesiredDiscardLevel >= mCachedRawDiscardLevel)  	{ -		priority = -1.0f; +		priority = -3.0f;  	}  	else if (mDesiredDiscardLevel > getMaxDiscardLevel())  	{  		// Don't decode anything we don't need -		priority = -1.0f; +		priority = -4.0f;  	}  	else if ((mBoostLevel == LLViewerTexture::BOOST_UI || mBoostLevel == LLViewerTexture::BOOST_ICON) && !have_all_data)  	{ @@ -1551,9 +1558,14 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  			// Always want high boosted images  			priority = 1.f;  		} +		else if(mForceToSaveRawImage) +		{ +			//force to fetch the raw image. +			priority = 1.f; +		}  		else  		{ -			priority = -1.f; //stop fetching +			priority = -5.f; //stop fetching  		}  	}  	else if (cur_discard < 0) @@ -1569,7 +1581,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  	else if ((mMinDiscardLevel > 0) && (cur_discard <= mMinDiscardLevel))  	{  		// larger mips are corrupted -		priority = -3.0f; +		priority = -6.0f;  	}  	else  	{ @@ -2052,10 +2064,13 @@ bool LLViewerFetchedTexture::doLoadedCallbacks()  	bool run_raw_callbacks = false;  	bool need_readback = false; +	mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1;  	for(callback_list_t::iterator iter = mLoadedCallbackList.begin();  		iter != mLoadedCallbackList.end(); )  	{  		LLLoadedCallbackEntry *entryp = *iter++; +		mMinDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel, (S8)entryp->mDesiredDiscard) ; +  		if (entryp->mNeedsImageRaw)  		{  			if (mNeedsAux) @@ -2187,6 +2202,7 @@ bool LLViewerFetchedTexture::doLoadedCallbacks()  	if (mLoadedCallbackList.empty())  	{  		gTextureList.mCallbackList.erase(this); +		mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1;  	}  	// Done with any raw image data at this point (will be re-created if we still have callbacks) diff --git a/indra/newview/llviewervisualparam.cpp b/indra/newview/llviewervisualparam.cpp index 422e530dc6..1dc09a64ac 100644 --- a/indra/newview/llviewervisualparam.cpp +++ b/indra/newview/llviewervisualparam.cpp @@ -99,8 +99,6 @@ BOOL LLViewerVisualParamInfo::parseXml(LLXmlTreeNode *node)  	node->getFastAttributeF32( camera_angle_string, mCamAngle );	// in degrees  	static LLStdStringHandle camera_elevation_string = LLXmlTree::addAttributeString("camera_elevation");  	node->getFastAttributeF32( camera_elevation_string, mCamElevation ); -	static LLStdStringHandle camera_target_string = LLXmlTree::addAttributeString("camera_target"); -	node->getFastAttributeString( camera_target_string, mCamTargetName );  	mCamAngle += 180; diff --git a/indra/newview/llviewervisualparam.h b/indra/newview/llviewervisualparam.h index 1a3975eb99..f38c01fa6c 100644 --- a/indra/newview/llviewervisualparam.h +++ b/indra/newview/llviewervisualparam.h @@ -60,7 +60,6 @@ protected:  	F32			mCamDist;  	F32			mCamAngle;		// degrees  	F32			mCamElevation; -	std::string	mCamTargetName;  	F32			mEditGroupDisplayOrder;  	BOOL		mShowSimple;	// show edit controls when in "simple ui" mode?  	F32			mSimpleMin;		// when in simple UI, apply this minimum, range 0.f to 100.f @@ -104,7 +103,6 @@ public:  	F32					getCameraDistance()	const	{ return getInfo()->mCamDist; }   	F32					getCameraAngle() const		{ return getInfo()->mCamAngle; }  // degrees  	F32					getCameraElevation() const	{ return getInfo()->mCamElevation; }  -	const std::string&	getCameraTargetName() const { return getInfo()->mCamTargetName; }  	BOOL				getShowSimple() const		{ return getInfo()->mShowSimple; }  	F32					getSimpleMin() const		{ return getInfo()->mSimpleMin; } diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 4a04ec22c4..2722646eff 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1977,37 +1977,47 @@ BOOL LLVOAvatarSelf::canGrabBakedTexture(EBakedTextureIndex baked_index) const  		 ++iter)  	{  		const ETextureIndex t_index = (*iter); -		lldebugs << "Checking index " << (U32) t_index << llendl; -		// MULTI-WEARABLE: old method. replace. -		const LLUUID& texture_id = getTEImage( t_index )->getID(); -		if (texture_id != IMG_DEFAULT_AVATAR) -		{ -			// Search inventory for this texture. -			LLViewerInventoryCategory::cat_array_t cats; -			LLViewerInventoryItem::item_array_t items; -			LLAssetIDMatches asset_id_matches(texture_id); -			gInventory.collectDescendentsIf(LLUUID::null, -											cats, -											items, -											LLInventoryModel::INCLUDE_TRASH, -											asset_id_matches); - -			BOOL can_grab = FALSE; -			lldebugs << "item count for asset " << texture_id << ": " << items.count() << llendl; -			if (items.count()) +		LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(t_index); +		U32 count = gAgentWearables.getWearableCount(wearable_type); +		lldebugs << "Checking index " << (U32) t_index << " count: " << count << llendl; +		 +		for (U32 wearable_index = 0; wearable_index < count; ++wearable_index) +		{ +			LLWearable *wearable = gAgentWearables.getWearable(wearable_type, wearable_index); +			if (wearable)  			{ -				// search for full permissions version -				for (S32 i = 0; i < items.count(); i++) +				const LLLocalTextureObject *texture = wearable->getLocalTextureObject((S32)t_index); +				const LLUUID& texture_id = texture->getID(); +				if (texture_id != IMG_DEFAULT_AVATAR)  				{ -					LLViewerInventoryItem* itemp = items[i]; -                                        if (itemp->getIsFullPerm()) +					// Search inventory for this texture. +					LLViewerInventoryCategory::cat_array_t cats; +					LLViewerInventoryItem::item_array_t items; +					LLAssetIDMatches asset_id_matches(texture_id); +					gInventory.collectDescendentsIf(LLUUID::null, +													cats, +													items, +													LLInventoryModel::INCLUDE_TRASH, +													asset_id_matches); + +					BOOL can_grab = FALSE; +					lldebugs << "item count for asset " << texture_id << ": " << items.count() << llendl; +					if (items.count())  					{ -						can_grab = TRUE; -						break; +						// search for full permissions version +						for (S32 i = 0; i < items.count(); i++) +						{ +							LLViewerInventoryItem* itemp = items[i]; +												if (itemp->getIsFullPerm()) +							{ +								can_grab = TRUE; +								break; +							} +						}  					} +					if (!can_grab) return FALSE;  				}  			} -			if (!can_grab) return FALSE;  		}  	} diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index 9e9b46473e..121e691710 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -656,7 +656,7 @@ void LLWearable::writeToAvatar()  				image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te);  			}  			LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE ); -			// MULTI-WEARABLE: replace hard-coded 0 +			// MULTI-WEARABLE: assume index 0 will be used when writing to avatar. TODO: eliminate the need for this.  			gAgentAvatarp->setLocalTextureTE(te, image, 0);  		}  	} diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index ba1d0b727d..6c410cf7a5 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -42,6 +42,7 @@  #include "llmenugl.h" // for LLContextMenu  #include "lltransutil.h"  #include "llviewerattachmenu.h" +#include "llvoavatarself.h"  class LLFindOutfitItems : public LLInventoryCollectFunctor  { @@ -258,6 +259,31 @@ BOOL LLPanelDeletableWearableListItem::postBuild()  } +// static +LLPanelAttachmentListItem* LLPanelAttachmentListItem::create(LLViewerInventoryItem* item) +{ +	LLPanelAttachmentListItem* list_item = NULL; +	if(item) +	{ +		list_item = new LLPanelAttachmentListItem(item); +		list_item->init(); +	} +	return list_item; +} + +void LLPanelAttachmentListItem::setTitle(const std::string& title, const std::string& highlit_text) +{ +	std::string title_joint = title; + +	if (mItem && isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(mItem->getLinkedUUID())) +	{ +		std::string joint = LLTrans::getString(gAgentAvatarp->getAttachedPointName(mItem->getLinkedUUID())); +		title_joint = title + " (" + joint + ")"; +	} + +	LLPanelDeletableWearableListItem::setTitle(title_joint, highlit_text); +} +  //////////////////////////////////////////////////////////////////////////  //////////////////////////////////////////////////////////////////////////  ////////////////////////////////////////////////////////////////////////// @@ -508,11 +534,13 @@ LLContextMenu* LLWearableItemsList::ContextMenu::createMenu()  	const uuid_vec_t& ids = mUUIDs;		// selected items IDs  	LLUUID selected_id = ids.front();	// ID of the first selected item -	functor_t wear = boost::bind(&LLAppearanceMgr::wearItemOnAvatar, LLAppearanceMgr::getInstance(), _1, true, false); +	functor_t wear = boost::bind(&LLAppearanceMgr::wearItemOnAvatar, LLAppearanceMgr::getInstance(), _1, true, true); +	functor_t add = boost::bind(&LLAppearanceMgr::wearItemOnAvatar, LLAppearanceMgr::getInstance(), _1, true, false);  	functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1);  	// Register handlers common for all wearable types.  	registrar.add("Wearable.Wear", boost::bind(handleMultiple, wear, ids)); +	registrar.add("Wearable.Add", boost::bind(handleMultiple, add, ids));  	registrar.add("Wearable.Edit", boost::bind(handleMultiple, LLAgentWearables::editWearable, ids));  	registrar.add("Wearable.CreateNew", boost::bind(createNewWearable, selected_id));  	registrar.add("Wearable.ShowOriginal", boost::bind(show_item_original, selected_id)); diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index 2fdb8f0ab8..f03336186c 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -116,6 +116,21 @@ protected:  	/*virtual*/ void init();  }; +/** Outfit list item for an attachment */ +class LLPanelAttachmentListItem : public LLPanelDeletableWearableListItem +{ +	LOG_CLASS(LLPanelAttachmentListItem); +public: +	static LLPanelAttachmentListItem* create(LLViewerInventoryItem* item); +	virtual ~LLPanelAttachmentListItem() {}; + +	/** Set item title. Joint name is added to the title in parenthesis */ +	/*virtual*/ void setTitle(const std::string& title, const std::string& highlit_text); + +protected: +	LLPanelAttachmentListItem(LLViewerInventoryItem* item) : LLPanelDeletableWearableListItem(item) {}; +}; +  /**   * @class LLPanelClothingListItem   * diff --git a/indra/newview/skins/default/textures/map_infohub.tga b/indra/newview/skins/default/textures/map_infohub.tga Binary files differindex 545b8e532c..d0134fa5fe 100644 --- a/indra/newview/skins/default/textures/map_infohub.tga +++ b/indra/newview/skins/default/textures/map_infohub.tga diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index cee5f5cbca..85ccf0f564 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -669,7 +669,7 @@ with the same filename but different name    <texture name="Progress_11" file_name="icons/Progress_11.png" preload="true" />    <texture name="Progress_12" file_name="icons/Progress_12.png" preload="true" /> -  <texture name="bevel_background" file_name="widgets/bevel_background.png" preload="true" scale.left="12" scale.top="15" scale.right="120" scale.bottom="2"/> +  <texture name="bevel_background" file_name="widgets/bevel_background.png" preload="true" scale.left="12" scale.top="15" scale.right="108" scale.bottom="2"/>    <texture name="buy_off" file_name="widgets/buy_off.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>    <texture name="buy_over" file_name="widgets/buy_over.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>    <texture name="buy_press" file_name="widgets/buy_press.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/> diff --git a/indra/newview/skins/default/textures/widgets/buy_off.png b/indra/newview/skins/default/textures/widgets/buy_off.png Binary files differindex 961ad071d4..ee5979046f 100644 --- a/indra/newview/skins/default/textures/widgets/buy_off.png +++ b/indra/newview/skins/default/textures/widgets/buy_off.png diff --git a/indra/newview/skins/default/textures/widgets/buy_over.png b/indra/newview/skins/default/textures/widgets/buy_over.png Binary files differindex 0be19f8a31..93adb68c86 100644 --- a/indra/newview/skins/default/textures/widgets/buy_over.png +++ b/indra/newview/skins/default/textures/widgets/buy_over.png diff --git a/indra/newview/skins/default/textures/widgets/buy_press.png b/indra/newview/skins/default/textures/widgets/buy_press.png Binary files differindex d6f587464d..3f442d6eaa 100644 --- a/indra/newview/skins/default/textures/widgets/buy_press.png +++ b/indra/newview/skins/default/textures/widgets/buy_press.png diff --git a/indra/newview/skins/default/xui/da/floater_buy_land.xml b/indra/newview/skins/default/xui/da/floater_buy_land.xml index 970491b41f..f6ee78fa6d 100644 --- a/indra/newview/skins/default/xui/da/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/da/floater_buy_land.xml @@ -126,9 +126,6 @@ gennemført.  	<floater.string name="no_parcel_selected">  		(intet parcel er valgt)  	</floater.string> -	<floater.string name="icon_PG" value="Parcel_PG_Dark"/> -	<floater.string name="icon_M" value="Parcel_M_Dark"/> -	<floater.string name="icon_R" value="Parcel_R_Dark"/>  	<text name="region_name_label">  		Region:  	</text> diff --git a/indra/newview/skins/default/xui/de/floater_buy_land.xml b/indra/newview/skins/default/xui/de/floater_buy_land.xml index 5708a3f80a..5369155cf9 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_land.xml @@ -124,9 +124,6 @@ unterstützt [AMOUNT2] Objekte  	<floater.string name="no_parcel_selected">  		(keine Parzelle ausgewählt)  	</floater.string> -	<floater.string name="icon_PG" value="Parcel_PG_Dark"/> -	<floater.string name="icon_M" value="Parcel_M_Dark"/> -	<floater.string name="icon_R" value="Parcel_R_Dark"/>  	<text name="region_name_label">  		Region:  	</text> diff --git a/indra/newview/skins/default/xui/de/panel_landmark_info.xml b/indra/newview/skins/default/xui/de/panel_landmark_info.xml index 9cef7b6d35..10cf34c170 100644 --- a/indra/newview/skins/default/xui/de/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/de/panel_landmark_info.xml @@ -18,9 +18,6 @@  	<string name="acquired_date">  		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</string> -	<string name="icon_PG" value="parcel_drk_PG"/> -	<string name="icon_M" value="parcel_drk_M"/> -	<string name="icon_R" value="parcel_drk_R"/>  	<button name="back_btn" tool_tip="Hinten"/>  	<text name="title" value="Ortsprofil"/>  	<scroll_container name="place_scroll"> diff --git a/indra/newview/skins/default/xui/de/panel_place_profile.xml b/indra/newview/skins/default/xui/de/panel_place_profile.xml index ed1421aa60..9d1a582b7c 100644 --- a/indra/newview/skins/default/xui/de/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/de/panel_place_profile.xml @@ -41,21 +41,6 @@  	<string name="acquired_date">  		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</string> -	<string name="icon_PG" value="parcel_drk_PG"/> -	<string name="icon_M" value="parcel_drk_M"/> -	<string name="icon_R" value="parcel_drk_R"/> -	<string name="icon_Voice" value="parcel_drk_Voice"/> -	<string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/> -	<string name="icon_Fly" value="parcel_drk_Fly"/> -	<string name="icon_FlyNo" value="parcel_drk_FlyNo"/> -	<string name="icon_Push" value="parcel_drk_Push"/> -	<string name="icon_PushNo" value="parcel_drk_PushNo"/> -	<string name="icon_Build" value="parcel_drk_Build"/> -	<string name="icon_BuildNo" value="parcel_drk_BuildNo"/> -	<string name="icon_Scripts" value="parcel_drk_Scripts"/> -	<string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/> -	<string name="icon_Damage" value="parcel_drk_Damage"/> -	<string name="icon_DamageNo" value="parcel_drk_DamageNo"/>  	<button name="back_btn" tool_tip="Hinten"/>  	<text name="title" value="Ortsprofil"/>  	<scroll_container name="place_scroll"> diff --git a/indra/newview/skins/default/xui/en/floater_buy_land.xml b/indra/newview/skins/default/xui/en/floater_buy_land.xml index df44b61632..acaa508792 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_land.xml @@ -174,12 +174,15 @@ supports [AMOUNT2] objects      </floater.string>      <floater.string       name="icon_PG" +     translate="false"       value="Parcel_PG_Dark"/>      <floater.string       name="icon_M" +     translate="false"       value="Parcel_M_Dark"/>      <floater.string       name="icon_R" +     translate="false"       value="Parcel_R_Dark"/>      <text       type="string" diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index 11459ad0e6..221457ac1f 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -662,6 +662,14 @@           parameter="wear" />      </menu_item_call>      <menu_item_call +     label="Add" +     layout="topleft" +     name="Wearable Add"> +        <menu_item_call.on_click +         function="Inventory.DoToSelected" +         parameter="wear_add" /> +    </menu_item_call> +    <menu_item_call       label="Take Off"       layout="topleft"       name="Take Off"> diff --git a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml index e645702f93..fa5ca60a19 100644 --- a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml +++ b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml @@ -9,6 +9,13 @@           function="Wearable.Wear" />      </menu_item_call>      <menu_item_call +     label="Add" +     layout="topleft" +     name="wear_add"> +        <on_click +         function="Wearable.Add" /> +    </menu_item_call> +    <menu_item_call       label="Take Off / Detach"       layout="topleft"       name="take_off_or_detach"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 5ead756d20..9af358eff3 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -2069,6 +2069,29 @@ Would you be my friend?    </notification>    <notification + icon="alertmodal.tga" + label="Save Wearable" + name="SaveWearableAs" + type="alertmodal"> +    Save item to my inventory as: +    <form name="form"> +      <input name="message" type="text"> +        [DESC] (new) +      </input> +      <button +       default="true" +       index="0" +       name="Offer" +       text="OK"/> +      <button +       index="1" +       name="Cancel" +       text="Cancel"/> +    </form> +  </notification> + + +  <notification     icon="alertmodal.tga"     label="Rename Outfit"     name="RenameOutfit" diff --git a/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml index a0bbc8f2ee..4e5f594ffe 100644 --- a/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel   follows="top|right|left" - height="25" + height="23"   layout="topleft"   left="0"   name="wearable_item" @@ -45,7 +45,7 @@       use_ellipses="true"       name="item_name"       text_color="white" -     top="4" +     top="5"       value="..."       width="359" />      <panel @@ -74,10 +74,10 @@       name="btn_edit_panel"       layout="topleft"       follows="top|right" -     top="0" +     top="1"       left_pad="3" -     height="24" -     width="27" +     height="23" +     width="26"       tab_stop="false">           <button             name="btn_edit" @@ -86,8 +86,8 @@            image_overlay="Edit_Wrench"            top="0"            left="0" -          height="24" -          width="24" +          height="23" +          width="23"            tab_stop="false" />        </panel>      <icon @@ -97,7 +97,7 @@       layout="bottomleft"       left="0"       name="wearable_type_separator_icon" -     top="3" +     top="0"       visible="true"       width="380"/>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml index e41141f6bd..5d81aebbd5 100644 --- a/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml @@ -33,7 +33,7 @@       follows="top|left"       image_unselected="Toast_CloseBtn"       image_selected="Toast_CloseBtn" -     top="2" +     top="3"       left="0"       height="18"       width="18" @@ -56,7 +56,7 @@       use_ellipses="true"       name="item_name"       text_color="white" -     top="4" +     top="5"       value="..."       width="359" />      <button  @@ -64,20 +64,20 @@       layout="topleft"       follows="top|right"       image_overlay="UpArrow_Off" -     top="0" +     top="1"       left="0" -     height="24" -     width="24" +     height="23" +     width="23"       tab_stop="false" />      <button        name="btn_move_down"       layout="topleft"       follows="top|right"       image_overlay="DownArrow_Off" -     top="0" +     top="1"       left_pad="3" -     height="24" -     width="24" +     height="23" +     width="23"       tab_stop="false" />      <panel       background_visible="false" @@ -107,18 +107,18 @@       follows="top|right"       top="0"       left_pad="3" -     height="24" -     width="27" +     height="23" +     width="26"       tab_stop="false">          <button            name="btn_edit"           layout="topleft"           follows="top|right"           image_overlay="Edit_Wrench" -         top="0" +         top="1"           left="0" -         height="24" -         width="24" +         height="23" +         width="23"           tab_stop="false" />        </panel>      <icon diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml index 5f34c24bca..d36c2a4e6f 100644 --- a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml +++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml @@ -11,7 +11,7 @@      <accordion       fit_parent="true"       follows="all" -     height="200" +     height="198"       layout="topleft"       left="0"       single_expansion="true" @@ -28,6 +28,7 @@               allow_select="true"               follows="all"               height="10" +             item_pad="2"               layout="topleft"               left="0"               multi_select="true" @@ -43,6 +44,7 @@               allow_select="true"               follows="all"               height="10" +             item_pad="2"               layout="topleft"               left="0"               multi_select="true" @@ -58,6 +60,7 @@               allow_select="true"               follows="all"               height="10" +             item_pad="2"               layout="topleft"               left="0"               multi_select="true" diff --git a/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml index b006d125ee..45031859f1 100644 --- a/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel   follows="top|right|left" - height="25" + height="23"   layout="topleft"   left="0"   name="deletable_wearable_item" @@ -33,7 +33,7 @@       follows="top|left"       image_unselected="Toast_CloseBtn"       image_selected="Toast_CloseBtn" -     top="2" +     top="3"       left="0"       height="18"       width="18" @@ -56,7 +56,7 @@       use_ellipses="true"       name="item_name"       text_color="white" -     top="4" +     top="5"       value="..."       width="359" />      <icon @@ -66,7 +66,7 @@       layout="bottomleft"       left="0"       name="wearable_type_separator_icon" -     top="3" +     top="0"       visible="true"       width="380"/>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml index 6c43635d49..20652df918 100644 --- a/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel   follows="top|right|left" - height="25" + height="23"   layout="topleft"   left="0"   name="dummy_clothing_item" @@ -56,8 +56,8 @@       image_overlay="AddItem_Off"       top="0"       left="0" -     height="24" -     width="24" +     height="23" +     width="23"       tab_stop="false" />      <icon       follows="left|right|top" @@ -66,7 +66,7 @@       layout="bottomleft"       left="0"       name="wearable_type_separator_icon" -     top="3" +     top="0"       visible="true"       width="380"/>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml index 67ff71cef1..8604f42e75 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml @@ -235,7 +235,7 @@ left="0"  	 </panel>  	 <panel  		 follows="all" -		 height="408" +		 height="433"  		 layout="topleft"  		 left="0"  		 name="edit_subpanel_container" @@ -246,7 +246,7 @@ left="0"  		 <panel  			 filename="panel_edit_shape.xml"  			 follows="all" -			 height="408" +			 height="433"  			 layout="topleft"  			 left="0"  			 name="edit_shape_panel" @@ -256,7 +256,7 @@ left="0"  		 <panel  			 filename="panel_edit_skin.xml"  			 follows="all" -			 height="400" +			 height="425"  			 layout="topleft"  			 left="0"  			 name="edit_skin_panel" @@ -266,7 +266,7 @@ left="0"  		 <panel  			 filename="panel_edit_hair.xml"  			 follows="all" -			 height="400" +			 height="425"  			 layout="topleft"  			 left="0"  			 name="edit_hair_panel" @@ -276,7 +276,7 @@ left="0"  		 <panel  			 filename="panel_edit_eyes.xml"  			 follows="all" -			 height="400" +			 height="425"  			 layout="topleft"  			 left="0"  			 name="edit_eyes_panel" @@ -286,7 +286,7 @@ left="0"  		 <panel  			 filename="panel_edit_shirt.xml"  			 follows="all" -			 height="400" +			 height="425"  			 layout="topleft"  			 left="0"  			 name="edit_shirt_panel" @@ -296,7 +296,7 @@ left="0"  		 <panel  			 filename="panel_edit_pants.xml"  			 follows="all" -			 height="400" +			 height="425"  			 layout="topleft"  			 left="0"  			 name="edit_pants_panel" @@ -306,7 +306,7 @@ left="0"  		 <panel  			 filename="panel_edit_shoes.xml"  			 follows="all" -			 height="400" +			 height="425"  			 layout="topleft"  			 left="0"  			 name="edit_shoes_panel" @@ -316,7 +316,7 @@ left="0"  		 <panel  			 filename="panel_edit_socks.xml"  			 follows="all" -			 height="400" +			 height="425"  			 layout="topleft"  			 left="0"  			 name="edit_socks_panel" @@ -326,7 +326,7 @@ left="0"  		 <panel  			 filename="panel_edit_jacket.xml"  			 follows="all" -			 height="400" +			 height="425"  			 layout="topleft"  			 left="0"  			 name="edit_jacket_panel" @@ -336,7 +336,7 @@ left="0"  		 <panel  			 filename="panel_edit_skirt.xml"  			 follows="all" -			 height="400" +			 height="425"  			 layout="topleft"  			 left="0"  			 name="edit_skirt_panel" @@ -346,7 +346,7 @@ left="0"  		 <panel  			 filename="panel_edit_gloves.xml"  			 follows="all" -			 height="400" +			 height="425"  			 layout="topleft"  			 left="0"  			 name="edit_gloves_panel" @@ -356,7 +356,7 @@ left="0"  		 <panel  			 filename="panel_edit_undershirt.xml"  			 follows="all" -			 height="400" +			 height="425"  			 layout="topleft"  			 left="0"  			 name="edit_undershirt_panel" @@ -366,7 +366,7 @@ left="0"  		 <panel  			 filename="panel_edit_underpants.xml"  			 follows="all" -			 height="400" +			 height="425"  			 layout="topleft"  			 left="0"  			 name="edit_underpants_panel" @@ -376,7 +376,7 @@ left="0"  		 <panel  			 filename="panel_edit_alpha.xml"  			 follows="all" -			 height="400" +			 height="425"  			 layout="topleft"  			 left="0"  			 name="edit_alpha_panel" @@ -386,7 +386,7 @@ left="0"  		 <panel  			 filename="panel_edit_tattoo.xml"  			 follows="all" -			 height="400" +			 height="425"  			 layout="topleft"  			 left="0"  			 name="edit_tattoo_panel" @@ -394,65 +394,7 @@ left="0"  			 visible="false"  			 width="333" />  	 </panel> -     <panel -        follows="bottom|left|right" -        height="25" -        label="gear_buttom_panel" -        layout="topleft" -        left="0" -        name="gear_buttom_panel" -        top_pad="0" -        width="333"> -        <button -            follows="bottom|left" -            tool_tip="Options" -            height="25" -            image_hover_unselected="Toolbar_Left_Over" -            image_disabled="OptionsMenu_Disabled" -            image_overlay="OptionsMenu_Off" -            image_selected="Toolbar_Left_Selected" -            image_unselected="Toolbar_Left_Off" -            layout="topleft" -            left="10" -            name="friends_viewsort_btn" -            top="0" -            width="31" /> -        <button -            follows="bottom|left" -            height="25" -            image_hover_unselected="Toolbar_Middle_Over" -            image_overlay="AddItem_Off" -            image_selected="Toolbar_Middle_Selected" -            image_unselected="Toolbar_Middle_Off" -            image_disabled="AddItem_Disabled" -            layout="topleft" -            left_pad="1" -            name="add_btn" -            tool_tip="TODO" -            width="31" /> -        <icon -            follows="bottom|left|right" -            height="25" -            image_name="Toolbar_Middle_Off" -            layout="topleft" -            left_pad="1" -            name="dummy_right_icon" -            width="218" > -        </icon> -        <button -            follows="bottom|right" -            height="25" -            image_hover_unselected="Toolbar_Right_Over" -            image_overlay="TrashItem_Off" -            image_selected="Toolbar_Right_Selected" -            image_unselected="Toolbar_Right_Off" -            image_disabled="TrashItem_Disabled" -            layout="topleft" -            left_pad="1" -            name="del_btn" -            tool_tip="TODO" -            width="31" /> -     </panel> +  	 <panel  		 follows="bottom|left|right"  		 height="23" diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml index 25674a1a39..bb73360e0b 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -46,12 +46,15 @@      <!-- Texture names for rating icons -->      <string       name="icon_PG" +     translate="false"       value="Parcel_PG_Dark" />      <string       name="icon_M" +     translate="false"       value="Parcel_M_Dark" />      <string       name="icon_R" +     translate="false"       value="Parcel_R_Dark" />      <button       follows="top|right" diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml index 769f9b7bbf..40f60d50fb 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -256,15 +256,14 @@ It is calculated as border_size + 2*UIResizeBarOverlap  		             background_image="TextField_Search_Off"  		             enabled="true"  		             follows="left|right|top" -		             font="SansSerif" -		             label="Filter" +		             label="Filter Inventory Wearables"  		             layout="topleft"  		             left="5"  		             width="290"  		             height="25"  		             name="look_item_filter" +		             search_button_visible="true"  		             text_color="black" -		             text_pad_left="25"  		             visible="true"/>                  </layout_panel> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml index 5cf94c25d7..5c9ae51a48 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml @@ -14,6 +14,7 @@       background_visible="true"       bg_alpha_color="DkGray2"       bg_opaque_color="DkGray2" +     empty_accordion_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]."       follows="all"       height="400"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index 57ac79686d..59f1f6d638 100644 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -2,7 +2,7 @@  <panel   background_visible="true"   follows="all" - height="570" + height="610"   layout="topleft"   left="0"   min_height="350" @@ -95,48 +95,63 @@      <!-- Texture names for parcel permissions icons -->      <string       name="icon_PG" +     translate="false"       value="Parcel_PG_Dark" />      <string       name="icon_M" +     translate="false"       value="Parcel_M_Dark" />      <string       name="icon_R" +     translate="false"       value="Parcel_R_Dark" />      <string       name="icon_Voice" +     translate="false"       value="Parcel_Voice_Dark" />      <string       name="icon_VoiceNo" +     translate="false"       value="Parcel_VoiceNo_Dark" />      <string       name="icon_Fly" +     translate="false"       value="Parcel_Fly_Dark" />      <string       name="icon_FlyNo" +     translate="false"       value="Parcel_FlyNo_Dark" />      <string       name="icon_Push" +     translate="false"       value="Parcel_Push_Dark" />      <string       name="icon_PushNo" +     translate="false"       value="Parcel_PushNo_Dark" />      <string       name="icon_Build" +     translate="false"       value="Parcel_Build_Dark" />      <string       name="icon_BuildNo" +     translate="false"       value="Parcel_BuildNo_Dark" />      <string       name="icon_Scripts" +     translate="false"       value="Parcel_Scripts_Dark" />      <string       name="icon_ScriptsNo" +     translate="false"       value="Parcel_ScriptsNo_Dark" />      <string       name="icon_Damage" +     translate="false"       value="Parcel_Damage_Dark" />      <string       name="icon_DamageNo" +     translate="false"       value="Parcel_DamageNo_Dark" />      <button       follows="top|right" @@ -166,7 +181,7 @@      <scroll_container       color="DkGray2"       follows="all" -     height="532" +     height="572"       layout="topleft"       left="9"       name="place_scroll" @@ -176,7 +191,7 @@          <panel           bg_alpha_color="DkGray2"           follows="left|top|right" -         height="540" +         height="580"           layout="topleft"           left="0"           min_height="300" @@ -322,21 +337,22 @@              <accordion               fit_parent="true"               follows="all" -             height="223" +             height="268"               layout="topleft"               single_expansion="true"               left="0"               name="advanced_info_accordion" -             top_pad="10" +             top_pad="5"               width="313">                  <accordion_tab -                 height="170" +                 fit_panel="false" +                 height="175"                   layout="topleft"                   name="parcel_characteristics_tab"                   title="Parcel">                      <panel                       follows="all" -                     height="160" +                     height="175"                       layout="topleft"                       left="0"                       name="parcel_characteristics_panel" @@ -533,8 +549,8 @@                           name="about_land_btn"                           right="-5"                           tab_stop="false" -                         top="138" -                         width="90"> +                         top_pad="2" +                         width="140">                              <click_callback                               function="Floater.Show"                               parameter="about_land" /> @@ -543,7 +559,8 @@                  </accordion_tab>                  <accordion_tab                   expanded="false" -                 height="150" +                 fit_panel="false" +                 height="125"                   layout="topleft"                   name="region_information_tab"                   title="Region"> @@ -662,7 +679,8 @@                           name="region_info_btn"                           right="-5"                           tab_stop="false" -                         width="105"> +                         top_pad="2" +                         width="180">                              <click_callback                               function="Floater.Show"                               parameter="region_info" /> @@ -671,13 +689,14 @@                  </accordion_tab>                  <accordion_tab                   expanded="false" -                 height="190" +                 fit_panel="false" +                 height="180"                   layout="topleft"                   name="estate_information_tab"                   title="Estate">                      <panel                       follows="all" -                     height="189" +                     height="180"                       layout="topleft"                       left="0"                       name="estate_information_panel" @@ -760,13 +779,14 @@                  </accordion_tab>                  <accordion_tab                   expanded="false" -                 height="320" +                 fit_panel="false" +                 height="290"                   layout="topleft"                   name="sales_tab"                   title="For Sale">                      <panel                       follows="all" -                     height="300" +                     height="290"                       layout="topleft"                       left="0"                       name="sales_panel" diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 008aa1acc0..43513e1ab6 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -41,32 +41,35 @@       name="buycurrencylabel">          L$ [AMT]      </panel.string> -    <button +  <panel +    height="18" +    left="-315" +    width="95" +    top="1" +    follows="right|top"  +    name="balance_bg"  +    bg_visible="true" +    background_opaque="true"  +    bg_opaque_image="bevel_background"> +    <text       auto_resize="true"       halign="center" -	 enabled="false"       font="SansSerifSmall" -     follows="right|top" -     image_overlay="" -     image_selected="bevel_background" -     image_unselected="bevel_background" -     image_pressed="bevel_background" +     follows="all"       height="18" -     right="-275" -     label_shadow="false" -     name="buycurrency" -     label_color_disabled="ButtonLabelColor" -     image_color_disabled="White" +     left="0"  +     name="balance"       tool_tip="My Balance" -     pad_left="12" -     pad_right="12"  +     v_pad="4"       top="0" +     wrap="false"  +     value="L$20"        width="40" />      <button       auto_resize="true"       halign="center"       font="SansSerifSmall" -     follows="right|top" +     follows="right|top|bottom"       image_hover_unselected="buy_over"       image_unselected="buy_off"       image_pressed="buy_press" @@ -81,6 +84,7 @@       tool_tip="Click to buy more L$"       top="0"       width="55" /> +  </panel>      <text       type="string"       font="SansSerifSmall" diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml index 3d7b0b7edc..ae08a13793 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml @@ -111,6 +111,7 @@ width="333">     label="Filter Outfits"     max_length="300"     name="Filter" +   search_button_visible="true"     top_pad="10"     width="303" />     <panel diff --git a/indra/newview/skins/default/xui/en/widgets/accordion.xml b/indra/newview/skins/default/xui/en/widgets/accordion.xml new file mode 100644 index 0000000000..b817ba56ca --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/accordion.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<accordion + height="100" + name="accordion" + width="200"> +    <empty_accordion_text +     follows="all" +     height="100" +     h_pad="10" +     name="no_visible_items_msg" +     value="There are no visible content here." +     v_pad="15" +     width="200" +     wrap="true "/> +</accordion> diff --git a/indra/newview/skins/default/xui/en/widgets/color_swatch.xml b/indra/newview/skins/default/xui/en/widgets/color_swatch.xml index dfd301a770..48b987d7e8 100644 --- a/indra/newview/skins/default/xui/en/widgets/color_swatch.xml +++ b/indra/newview/skins/default/xui/en/widgets/color_swatch.xml @@ -4,5 +4,6 @@                name="color_swatch">    <color_swatch.caption_text name="caption"                               halign="center" -                             follows="left|right|bottom"/> +                             follows="left|right|bottom" +                             v_pad="2"/>  </color_swatch> diff --git a/indra/newview/skins/default/xui/en/widgets/texture_picker.xml b/indra/newview/skins/default/xui/en/widgets/texture_picker.xml index 33c3475eb2..757f0f49d1 100644 --- a/indra/newview/skins/default/xui/en/widgets/texture_picker.xml +++ b/indra/newview/skins/default/xui/en/widgets/texture_picker.xml @@ -3,7 +3,8 @@    <multiselect_text font="SansSerifSmall"/>    <caption_text text="Multiple"                   halign="center"  -                font="SansSerifSmall"/> +                font="SansSerifSmall" +                v_pad="2"/>    <border bevel_style="in"/>  </texture_picker> diff --git a/indra/newview/skins/default/xui/es/floater_buy_land.xml b/indra/newview/skins/default/xui/es/floater_buy_land.xml index a40f65d5d0..74243a4d06 100644 --- a/indra/newview/skins/default/xui/es/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/es/floater_buy_land.xml @@ -126,9 +126,6 @@ para cubrir esta parcela.  	<floater.string name="no_parcel_selected">  		(No se ha seleccionado una parcela)  	</floater.string> -	<floater.string name="icon_PG" value="Parcel_PG_Dark"/> -	<floater.string name="icon_M" value="Parcel_M_Dark"/> -	<floater.string name="icon_R" value="Parcel_R_Dark"/>  	<text name="region_name_label">  		Región:  	</text> diff --git a/indra/newview/skins/default/xui/fr/floater_buy_land.xml b/indra/newview/skins/default/xui/fr/floater_buy_land.xml index 7c9a31a4c3..b7f8f36f81 100644 --- a/indra/newview/skins/default/xui/fr/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_buy_land.xml @@ -124,9 +124,6 @@ prend en charge [AMOUNT2] objets  	<floater.string name="no_parcel_selected">  		(aucune parcelle sélectionnée)  	</floater.string> -	<floater.string name="icon_PG" value="Parcel_PG_Dark"/> -	<floater.string name="icon_M" value="Parcel_M_Dark"/> -	<floater.string name="icon_R" value="Parcel_R_Dark"/>  	<text name="region_name_label">  		Région :  	</text> diff --git a/indra/newview/skins/default/xui/fr/panel_landmark_info.xml b/indra/newview/skins/default/xui/fr/panel_landmark_info.xml index 4001616034..bd29bd676c 100644 --- a/indra/newview/skins/default/xui/fr/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/fr/panel_landmark_info.xml @@ -18,9 +18,6 @@  	<string name="acquired_date">  		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</string> -	<string name="icon_PG" value="parcel_drk_PG"/> -	<string name="icon_M" value="parcel_drk_M"/> -	<string name="icon_R" value="parcel_drk_R"/>  	<button name="back_btn" tool_tip="Précédent"/>  	<text name="title" value="Profil du lieu"/>  	<scroll_container name="place_scroll"> diff --git a/indra/newview/skins/default/xui/fr/panel_place_profile.xml b/indra/newview/skins/default/xui/fr/panel_place_profile.xml index 598e94166e..731e045019 100644 --- a/indra/newview/skins/default/xui/fr/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/fr/panel_place_profile.xml @@ -41,21 +41,6 @@  	<string name="acquired_date">  		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</string> -	<string name="icon_PG" value="parcel_drk_PG"/> -	<string name="icon_M" value="parcel_drk_M"/> -	<string name="icon_R" value="parcel_drk_R"/> -	<string name="icon_Voice" value="parcel_drk_Voice"/> -	<string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/> -	<string name="icon_Fly" value="parcel_drk_Fly"/> -	<string name="icon_FlyNo" value="parcel_drk_FlyNo"/> -	<string name="icon_Push" value="parcel_drk_Push"/> -	<string name="icon_PushNo" value="parcel_drk_PushNo"/> -	<string name="icon_Build" value="parcel_drk_Build"/> -	<string name="icon_BuildNo" value="parcel_drk_BuildNo"/> -	<string name="icon_Scripts" value="parcel_drk_Scripts"/> -	<string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/> -	<string name="icon_Damage" value="parcel_drk_Damage"/> -	<string name="icon_DamageNo" value="parcel_drk_DamageNo"/>  	<button name="back_btn" tool_tip="Précédent"/>  	<text name="title" value="Profil du lieu"/>  	<scroll_container name="place_scroll"> diff --git a/indra/newview/skins/default/xui/it/floater_buy_land.xml b/indra/newview/skins/default/xui/it/floater_buy_land.xml index 2e78168209..f3b30f7048 100644 --- a/indra/newview/skins/default/xui/it/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/it/floater_buy_land.xml @@ -124,9 +124,6 @@ consente [AMOUNT2] oggetti  	<floater.string name="no_parcel_selected">  		(nessun terreno selezionato)  	</floater.string> -	<floater.string name="icon_PG" value="Parcel_PG_Dark"/> -	<floater.string name="icon_M" value="Parcel_M_Dark"/> -	<floater.string name="icon_R" value="Parcel_R_Dark"/>  	<text name="region_name_label">  		Regione:  	</text> diff --git a/indra/newview/skins/default/xui/ja/floater_buy_land.xml b/indra/newview/skins/default/xui/ja/floater_buy_land.xml index a274e25326..34f9d38de1 100644 --- a/indra/newview/skins/default/xui/ja/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/ja/floater_buy_land.xml @@ -124,9 +124,6 @@  	<floater.string name="no_parcel_selected">  		(区画が選定されていません)  	</floater.string> -	<floater.string name="icon_PG" value="Parcel_PG_Dark"/> -	<floater.string name="icon_M" value="Parcel_M_Dark"/> -	<floater.string name="icon_R" value="Parcel_R_Dark"/>  	<text name="region_name_label">  		地域:  	</text> diff --git a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml index 87477c2651..7fca66f90f 100644 --- a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml @@ -18,9 +18,6 @@  	<string name="acquired_date">  		[year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]  	</string> -	<string name="icon_PG" value="parcel_drk_PG"/> -	<string name="icon_M" value="parcel_drk_M"/> -	<string name="icon_R" value="parcel_drk_R"/>  	<button name="back_btn" tool_tip="戻る"/>  	<text name="title" value="場所のプロフィール"/>  	<scroll_container name="place_scroll"> diff --git a/indra/newview/skins/default/xui/ja/panel_place_profile.xml b/indra/newview/skins/default/xui/ja/panel_place_profile.xml index 9de04f0d6a..b897e1d748 100644 --- a/indra/newview/skins/default/xui/ja/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/ja/panel_place_profile.xml @@ -41,21 +41,6 @@  	<string name="acquired_date">  		[year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]  	</string> -	<string name="icon_PG" value="parcel_drk_PG"/> -	<string name="icon_M" value="parcel_drk_M"/> -	<string name="icon_R" value="parcel_drk_R"/> -	<string name="icon_Voice" value="parcel_drk_Voice"/> -	<string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/> -	<string name="icon_Fly" value="parcel_drk_Fly"/> -	<string name="icon_FlyNo" value="parcel_drk_FlyNo"/> -	<string name="icon_Push" value="parcel_drk_Push"/> -	<string name="icon_PushNo" value="parcel_drk_PushNo"/> -	<string name="icon_Build" value="parcel_drk_Build"/> -	<string name="icon_BuildNo" value="parcel_drk_BuildNo"/> -	<string name="icon_Scripts" value="parcel_drk_Scripts"/> -	<string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/> -	<string name="icon_Damage" value="parcel_drk_Damage"/> -	<string name="icon_DamageNo" value="parcel_drk_DamageNo"/>  	<button name="back_btn" tool_tip="戻る"/>  	<text name="title" value="場所のプロフィール"/>  	<scroll_container name="place_scroll"> diff --git a/indra/newview/skins/default/xui/pl/floater_buy_land.xml b/indra/newview/skins/default/xui/pl/floater_buy_land.xml index 3d01129d9b..7b4f459b4e 100644 --- a/indra/newview/skins/default/xui/pl/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_land.xml @@ -125,9 +125,6 @@ używanie Posiadłości żeby sfinalizować ten zakup.  	<floater.string name="no_parcel_selected">  		(Posiadłość nie została wybrana)  	</floater.string> -	<floater.string name="icon_PG" value="Parcel_PG_Dark"/> -	<floater.string name="icon_M" value="Parcel_M_Dark"/> -	<floater.string name="icon_R" value="Parcel_R_Dark"/>  	<text name="region_name_label">  		Region:  	</text> diff --git a/indra/newview/skins/default/xui/pt/floater_buy_land.xml b/indra/newview/skins/default/xui/pt/floater_buy_land.xml index 73b483acf2..5c5ee3b7a0 100644 --- a/indra/newview/skins/default/xui/pt/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/pt/floater_buy_land.xml @@ -124,9 +124,6 @@ contribuídas para cobrir este lote antes da aquisição se completar.  	<floater.string name="no_parcel_selected">  		(nenhum lote selecionado)  	</floater.string> -	<floater.string name="icon_PG" value="Parcel_PG_Dark"/> -	<floater.string name="icon_M" value="Parcel_M_Dark"/> -	<floater.string name="icon_R" value="Parcel_R_Dark"/>  	<text name="region_name_label">  		Região:  	</text> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index c887097575..8c089c0b79 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -355,7 +355,6 @@ class WindowsManifest(ViewerManifest):                  self.path("qtwebkitd4.dll")                  self.path("qtxmlpatternsd4.dll")                  self.path("ssleay32.dll") -                self.path("winmm.dll")                  # For WebKit/Qt plugin runtimes (image format plugins)                  if self.prefix(src="imageformats", dst="imageformats"):  | 
