diff options
| author | Eli Linden <eli@lindenlab.com> | 2010-03-03 12:10:00 -0800 | 
|---|---|---|
| committer | Eli Linden <eli@lindenlab.com> | 2010-03-03 12:10:00 -0800 | 
| commit | e47d107e2f7c4793f0685aa37749629f7d91aef0 (patch) | |
| tree | 740e36a63f6576bdf5c180ca8b59796ae5f1cf49 | |
| parent | ece36d5df8d0a7fb4c71ec50a0bac49a5c6fbacb (diff) | |
| parent | 2ecc98cb2f11b03224990d498d20cff8bcfb0716 (diff) | |
Merge
56 files changed, 1015 insertions, 418 deletions
| diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp index aa69dfe0cc..2ed1082f56 100644 --- a/indra/llui/llaccordionctrl.cpp +++ b/indra/llui/llaccordionctrl.cpp @@ -103,13 +103,6 @@ void LLAccordionCtrl::draw()  	LLLocalClipRect clip(local_rect);  	LLPanel::draw(); -	/* -	S32 width = getRect().getWidth(); -	S32 height = getRect().getHeight(); - -	gl_rect_2d(0, 0 , width - 1 ,height - 1,LLColor4::green,true); -	gl_line_2d(0, 0 , width - 1 ,height - 1,LLColor4::black); -	*/  } @@ -125,7 +118,6 @@ BOOL LLAccordionCtrl::postBuild()  		scrollbar_size,  		getRect().getHeight() - 1); -  	LLScrollbar::Params sbparams;  	sbparams.name("scrollable vertical");  	sbparams.rect(scroll_rect); diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index daa9e08f14..1067c3f1d5 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -33,8 +33,9 @@  #include "linden_common.h"  #include "lluictrl.h" - +#include "llscrollbar.h"  #include "llaccordionctrltab.h" +#include "lllocalcliprect.h"  #include "lltextbox.h" @@ -46,6 +47,8 @@ static const S32 HEADER_HEIGHT = 20;  static const S32 HEADER_IMAGE_LEFT_OFFSET = 5;  static const S32 HEADER_TEXT_LEFT_OFFSET = 30;  static const F32 AUTO_OPEN_TIME = 1.f; +static const S32 VERTICAL_MULTIPLE = 16; +static const S32 PARENT_BORDER_MARGIN = 5;  static LLDefaultChildRegistry::Register<LLAccordionCtrlTab> t1("accordion_tab"); @@ -277,6 +280,7 @@ LLAccordionCtrlTab::Params::Params()  	,header_image_pressed("header_image_pressed")  	,header_image_focused("header_image_focused")  	,header_text_color("header_text_color") +	,fit_panel("fit_panel",true)  {  	mouse_opaque(false);  } @@ -293,6 +297,9 @@ LLAccordionCtrlTab::LLAccordionCtrlTab(const LLAccordionCtrlTab::Params&p)  	,mPaddingTop(p.padding_top)  	,mPaddingBottom(p.padding_bottom)  	,mCanOpenClose(true) +	,mFitPanel(p.fit_panel) +	,mContainerPanel(NULL) +	,mScrollbar(NULL)  {  	mStoredOpenCloseState = false;  	mWasStateStored = false; @@ -321,54 +328,42 @@ void LLAccordionCtrlTab::setDisplayChildren(bool display)  		mExpandedHeight : HEADER_HEIGHT);  	setRect(rect); -	for(child_list_const_iter_t it = getChildList()->begin(); -		getChildList()->end() != it; ++it) -	{ -		LLView* child = *it; -		if(DD_HEADER_NAME == child->getName()) -			continue; +	if(mContainerPanel) +		mContainerPanel->setVisible(getDisplayChildren()); -		child->setVisible(getDisplayChildren()); +	if(mDisplayChildren) +	{ +		adjustContainerPanel();  	} +	else +	{ +		if(mScrollbar) +			mScrollbar->setVisible(false); +	} +  }  void LLAccordionCtrlTab::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)  {  	LLRect headerRect; -	LLUICtrl::reshape(width, height, TRUE); -  	headerRect.setLeftTopAndSize(  		0,height,width,HEADER_HEIGHT);  	mHeader->setRect(headerRect);  	mHeader->reshape(headerRect.getWidth(), headerRect.getHeight()); -	for(child_list_const_iter_t it = getChildList()->begin();  -		getChildList()->end() != it; ++it) -	{ -		LLView* child = *it; -		if(DD_HEADER_NAME == child->getName()) -			continue; -		if(!child->getVisible()) -			continue; - -		LLRect childRect = child->getRect(); -		S32 childWidth = width - getPaddingLeft() - getPaddingRight(); -		S32 childHeight = height - getHeaderHeight() - getPaddingTop() - getPaddingBottom(); +	if(!mDisplayChildren) +		return; -		child->reshape(childWidth,childHeight); -		 -		childRect.setLeftTopAndSize( -			getPaddingLeft(), -			childHeight + getPaddingBottom(), -			childWidth,  -			childHeight); +	LLRect childRect; -		child->setRect(childRect); -		 -		break;//suppose that there is only one panel -	} +	childRect.setLeftTopAndSize( +		getPaddingLeft(), +		height - getHeaderHeight() - getPaddingTop(), +		width - getPaddingLeft() - getPaddingRight(),  +		height - getHeaderHeight() - getPaddingTop() - getPaddingBottom() ); +	adjustContainerPanel(childRect);  }  void LLAccordionCtrlTab::changeOpenClose(bool is_open) @@ -439,7 +434,7 @@ void LLAccordionCtrlTab::setAccordionView(LLView* panel)  } -LLView*	LLAccordionCtrlTab::getAccordionView() +LLView*	LLAccordionCtrlTab::findContainerView()  {  	for(child_list_const_iter_t it = getChildList()->begin();   		getChildList()->end() != it; ++it) @@ -474,6 +469,43 @@ void LLAccordionCtrlTab::setHeaderVisible(bool value)  BOOL LLAccordionCtrlTab::postBuild()  {  	mHeader->setVisible(mHeaderVisible); +	 +	static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0); + +	LLRect scroll_rect; +	scroll_rect.setOriginAndSize(  +		getRect().getWidth() - scrollbar_size, +		1, +		scrollbar_size, +		getRect().getHeight() - 1); + +	mContainerPanel = findContainerView(); + +	if(!mFitPanel) +	{ +		LLScrollbar::Params sbparams; +		sbparams.name("scrollable vertical"); +		sbparams.rect(scroll_rect); +		sbparams.orientation(LLScrollbar::VERTICAL); +		sbparams.doc_size(getRect().getHeight()); +		sbparams.doc_pos(0); +		sbparams.page_size(getRect().getHeight()); +		sbparams.step_size(VERTICAL_MULTIPLE); +		sbparams.follows.flags(FOLLOWS_RIGHT | FOLLOWS_TOP | FOLLOWS_BOTTOM); +		sbparams.change_callback(boost::bind(&LLAccordionCtrlTab::onScrollPosChangeCallback, this, _1, _2)); + + +		mScrollbar = LLUICtrlFactory::create<LLScrollbar> (sbparams); +		LLView::addChild( mScrollbar ); +		mScrollbar->setFollowsRight(); +		mScrollbar->setFollowsTop(); +		mScrollbar->setFollowsBottom(); + +		mScrollbar->setVisible(false); +	} + +	mContainerPanel->setVisible(mDisplayChildren); +  	return LLUICtrl::postBuild();  }  bool	LLAccordionCtrlTab::notifyChildren	(const LLSD& info) @@ -562,6 +594,12 @@ BOOL LLAccordionCtrlTab::handleKey(KEY key, MASK mask, BOOL called_from_parent)  	if( !header->hasFocus() )  		return LLUICtrl::handleKey(key, mask, called_from_parent); +	if ( (key == KEY_RETURN )&& mask == MASK_NONE) +	{ +		changeOpenClose(getDisplayChildren()); +		return TRUE; +	} +  	if ( (key == KEY_ADD || key == KEY_RIGHT)&& mask == MASK_NONE)  	{  		if(getDisplayChildren() == false) @@ -622,6 +660,7 @@ void    LLAccordionCtrlTab::storeOpenCloseState()  	mStoredOpenCloseState = getDisplayChildren();  	mWasStateStored = true;  } +  void   LLAccordionCtrlTab::restoreOpenCloseState()  {  	if(!mWasStateStored) @@ -632,3 +671,195 @@ void   LLAccordionCtrlTab::restoreOpenCloseState()  	}  	mWasStateStored = false;  } + +void LLAccordionCtrlTab::adjustContainerPanel	() +{ +	S32 width = getRect().getWidth(); +	S32 height = getRect().getHeight(); + +	LLRect child_rect; +	child_rect.setLeftTopAndSize( +		getPaddingLeft(), +		height - getHeaderHeight() - getPaddingTop(), +		width - getPaddingLeft() - getPaddingRight(),  +		height - getHeaderHeight() - getPaddingTop() - getPaddingBottom() ); + +	adjustContainerPanel(child_rect); +} + +void LLAccordionCtrlTab::adjustContainerPanel(const LLRect& child_rect) +{ +	if(!mContainerPanel) +		return;  + +	if(!mFitPanel) +	{ +		show_hide_scrollbar(child_rect); +		updateLayout(child_rect); +	} +	else +	{ +		mContainerPanel->reshape(child_rect.getWidth(),child_rect.getHeight()); +		mContainerPanel->setRect(child_rect); +	} +} + +S32 LLAccordionCtrlTab::getChildViewHeight() +{ +	if(!mContainerPanel) +		return 0; +	return mContainerPanel->getRect().getHeight(); +} + +void LLAccordionCtrlTab::show_hide_scrollbar(const LLRect& child_rect) +{ +	if(getChildViewHeight() > child_rect.getHeight() ) +		showScrollbar(child_rect); +	else +		hideScrollbar(child_rect); +} +void LLAccordionCtrlTab::showScrollbar(const LLRect& child_rect) +{ +	if(!mContainerPanel || !mScrollbar) +		return; +	bool was_visible = mScrollbar->getVisible(); +	mScrollbar->setVisible(true); +	 +	static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0); + +	{ +		ctrlSetLeftTopAndSize(mScrollbar,child_rect.getWidth()-scrollbar_size,  +			child_rect.getHeight()-PARENT_BORDER_MARGIN,  +			scrollbar_size,  +			child_rect.getHeight()-2*PARENT_BORDER_MARGIN); +	} + +	LLRect orig_rect = mContainerPanel->getRect(); + +	mScrollbar->setPageSize(child_rect.getHeight()); +	mScrollbar->setDocParams(orig_rect.getHeight(),mScrollbar->getDocPos()); +	 +	if(was_visible) +	{ +		S32 scroll_pos = llmin(mScrollbar->getDocPos(), orig_rect.getHeight() - child_rect.getHeight() - 1); +		mScrollbar->setDocPos(scroll_pos); +	} +	else//shrink child panel +	{ +		updateLayout(child_rect); +	} +	 +} + +void	LLAccordionCtrlTab::hideScrollbar( const LLRect& child_rect ) +{ +	if(!mContainerPanel || !mScrollbar) +		return; + +	if(mScrollbar->getVisible() == false) +		return; +	mScrollbar->setVisible(false); +	mScrollbar->setDocPos(0); + +	//shrink child panel +	updateLayout(child_rect); +} + +void	LLAccordionCtrlTab::onScrollPosChangeCallback(S32, LLScrollbar*) +{ +	LLRect child_rect; + +	S32 width = getRect().getWidth(); +	S32 height = getRect().getHeight(); + +	child_rect.setLeftTopAndSize( +		getPaddingLeft(), +		height - getHeaderHeight() - getPaddingTop(), +		width - getPaddingLeft() - getPaddingRight(),  +		height - getHeaderHeight() - getPaddingTop() - getPaddingBottom() ); + +	updateLayout(child_rect); +} + +void LLAccordionCtrlTab::drawChild(const LLRect& root_rect,LLView* child) +{ +	if (child && child->getVisible() && child->getRect().isValid()) +	{ +		LLRect screen_rect; +		localRectToScreen(child->getRect(),&screen_rect); +		 +		if ( root_rect.overlaps(screen_rect)  && LLUI::sDirtyRect.overlaps(screen_rect)) +		{ +			glMatrixMode(GL_MODELVIEW); +			LLUI::pushMatrix(); +			{ +				LLUI::translate((F32)child->getRect().mLeft, (F32)child->getRect().mBottom, 0.f); +				child->draw(); + +			} +			LLUI::popMatrix(); +		} +	} +} + +void LLAccordionCtrlTab::draw() +{ +	if(mFitPanel) +		LLUICtrl::draw(); +	else +	{ +		LLRect root_rect = getRootView()->getRect(); +		drawChild(root_rect,mHeader); +		drawChild(root_rect,mScrollbar ); +		{ +			LLRect child_rect; + +			S32 width = getRect().getWidth(); +			S32 height = getRect().getHeight(); + +			child_rect.setLeftTopAndSize( +				getPaddingLeft(), +				height - getHeaderHeight() - getPaddingTop(), +				width - getPaddingLeft() - getPaddingRight(),  +				height - getHeaderHeight() - getPaddingTop() - getPaddingBottom() ); + +			LLLocalClipRect clip(child_rect); +			drawChild(root_rect,mContainerPanel); +		} +		 + +		gGL.getTexUnit(0)->disable(); +	} +} + +void	LLAccordionCtrlTab::updateLayout	( const LLRect& child_rect ) +{ +	LLView*	child = getAccordionView(); +	if(!mContainerPanel) +		return; + +	S32 panel_top = child_rect.getHeight(); +	S32 panel_width = child_rect.getWidth(); + +	static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0); +	if(mScrollbar->getVisible() != false) +	{ +		panel_top+=mScrollbar->getDocPos(); +		panel_width-=scrollbar_size; +	} + +	//set sizes for first panels and dragbars +	LLRect panel_rect = child->getRect(); +	ctrlSetLeftTopAndSize(mContainerPanel,child_rect.mLeft,panel_top,panel_width,panel_rect.getHeight()); +} +void LLAccordionCtrlTab::ctrlSetLeftTopAndSize(LLView* panel, S32 left, S32 top, S32 width, S32 height) +{ +	if(!panel) +		return; +	LLRect panel_rect = panel->getRect(); +	panel_rect.setLeftTopAndSize( left, top, width, height); +	panel->reshape( width, height, 1); +	panel->setRect(panel_rect); +} + + diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h index 2e0260ab16..462ccc6d53 100644 --- a/indra/llui/llaccordionctrltab.h +++ b/indra/llui/llaccordionctrltab.h @@ -41,6 +41,7 @@ class LLUICtrlFactory;  class LLUIImage;  class LLButton;  class LLTextBox; +class LLScrollbar; @@ -84,6 +85,8 @@ public:  		Optional<bool>			header_visible; +		Optional<bool>			fit_panel; +  		Optional<S32>			padding_left;  		Optional<S32>			padding_right;  		Optional<S32>			padding_top; @@ -107,7 +110,7 @@ public:  	//set LLAccordionCtrlTab panel  	void		setAccordionView(LLView* panel); -	LLView*		getAccordionView(); +	LLView*		getAccordionView() { return mContainerPanel; };  	bool getCollapsible() {return mCollapsible;}; @@ -123,6 +126,8 @@ public:  	S32 notify(const LLSD& info);  	bool notifyChildren(const LLSD& info); +	void draw(); +  	void    storeOpenCloseState		();  	void    restoreOpenCloseState	(); @@ -164,9 +169,26 @@ public:  	void showAndFocusHeader(); -private: +	void setFitPanel( bool fit ) { mFitPanel = true; } -	 +protected: +	void adjustContainerPanel	(const LLRect& child_rect); +	void adjustContainerPanel	(); +	S32	 getChildViewHeight		(); + +	void onScrollPosChangeCallback(S32, LLScrollbar*); + +	void show_hide_scrollbar	(const LLRect& child_rect); +	void showScrollbar			(const LLRect& child_rect); +	void hideScrollbar			(const LLRect& child_rect); + +	void updateLayout			( const LLRect& child_rect ); +	void ctrlSetLeftTopAndSize	(LLView* panel, S32 left, S32 top, S32 width, S32 height); + +	void drawChild(const LLRect& root_rect,LLView* child); + +	LLView* findContainerView	(); +private:  	class LLAccordionCtrlTabHeader;  	LLAccordionCtrlTabHeader* mHeader; //Header @@ -176,6 +198,7 @@ private:  	bool mHeaderVisible;  	bool mCanOpenClose; +	bool mFitPanel;  	S32	mPaddingLeft;  	S32	mPaddingRight; @@ -185,6 +208,8 @@ private:  	bool mStoredOpenCloseState;  	bool mWasStateStored; +	LLScrollbar*	mScrollbar; +	LLView*			mContainerPanel;  	LLUIColor mDropdownBGColor;  }; diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index b6d73cda3c..e91d753a39 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -1554,7 +1554,12 @@ void LLFloater::onClickClose( LLFloater* self )  {  	if (!self)  		return; -	self->closeFloater(false); +	self->onClickCloseBtn(); +} + +void	LLFloater::onClickCloseBtn() +{ +	closeFloater(false);  } diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 19e8288807..c1e8813f87 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -307,6 +307,8 @@ protected:  	void			destroy() { die(); } // Don't call this directly.  You probably want to call closeFloater() +	virtual	void	onClickCloseBtn(); +  private:  	void			setForeground(BOOL b);	// called only by floaterview  	void			cleanupHandles(); // remove handles to dead floaters @@ -346,6 +348,7 @@ protected:  	LLResizeBar*	mResizeBar[4];  	LLResizeHandle*	mResizeHandle[4]; +	LLButton*		mButtons[BUTTON_COUNT];  private:  	LLRect			mExpandedRect; @@ -379,7 +382,6 @@ private:  	handle_set_t	mDependents;  	bool			mButtonsEnabled[BUTTON_COUNT]; -	LLButton*		mButtons[BUTTON_COUNT];  	F32				mButtonScale;  	BOOL			mAutoFocus;  	LLHandle<LLFloater> mSnappedTo; diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp index 3cc92baa8d..d17be8b94a 100644 --- a/indra/llui/llscrolllistcell.cpp +++ b/indra/llui/llscrolllistcell.cpp @@ -185,6 +185,8 @@ LLScrollListText::LLScrollListText(const LLScrollListCell::Params& p)  {  	sCount++; +	mTextWidth = getWidth(); +  	// initialize rounded rect image  	if (!mRoundedRectImage)  	{ @@ -340,7 +342,7 @@ void LLScrollListText::draw(const LLColor4& color, const LLColor4& highlight_col  					0,  					LLFontGL::NO_SHADOW,  					string_chars,  -					getWidth(), +					getTextWidth(),  					&right_x,   					TRUE);  } diff --git a/indra/llui/llscrolllistcell.h b/indra/llui/llscrolllistcell.h index 5fecf5aade..b1c8901fc4 100644 --- a/indra/llui/llscrolllistcell.h +++ b/indra/llui/llscrolllistcell.h @@ -151,11 +151,16 @@ public:  	/*virtual*/ const std::string &	getToolTip() const;  	/*virtual*/ BOOL	needsToolTip() const; +	S32				getTextWidth() const { return mTextWidth;} +	void			setTextWidth(S32 value) { mTextWidth = value;}  +	virtual void	setWidth(S32 width) { LLScrollListCell::setWidth(width); mTextWidth = width; } +  	void			setText(const LLStringExplicit& text);  	void			setFontStyle(const U8 font_style);  private:  	LLUIString		mText; +	S32				mTextWidth;  	const LLFontGL*	mFont;  	LLColor4		mColor;  	U8				mUseColor; diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index e819c5fdea..ebdc82115f 100644 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -219,7 +219,10 @@ public:  	void			deselectAllItems(BOOL no_commit_on_change = FALSE);	// by default, go ahead and commit on selection change  	void			clearHighlightedItems(); -	void			mouseOverHighlightNthItem( S32 index ); +	 +	virtual void	mouseOverHighlightNthItem( S32 index ); + +	S32				getHighlightedItemInx() const { return mHighlightedItem; }   	void			setDoubleClickCallback( callback_t cb ) { mOnDoubleClickCallback = cb; }  	void			setMaximumSelectCallback( callback_t cb) { mOnMaximumSelectCallback = cb; } diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 30fc7babae..1dcfb4e296 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -2061,5 +2061,12 @@ void LLTabContainer::commitHoveredButton(S32 x, S32 y)  				tuple->mButton->onCommit();  			}  		} +		/** +		 * EXT - 4572 (Click and hold the left mouse button doesn't let you browse tabbed IM floater) +		 * +		 * During hovering mouse(with left mouse button hold) over tabs, a newly just activated corresponding +		 * to the tab(that is hovered in the given instant of time) panel may caught mouse capture. +		 */ +		gFocusMgr.setMouseCapture(this);  	}  } diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 11ac103b3a..7b55282ee5 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -119,9 +119,9 @@ protected:  	void importedFolderDone(void);  	void contentsDone(void);  	enum ELibraryOutfitFetchStep mCurrFetchStep; -	typedef std::vector< std::pair< LLUUID, std::string > > cloth_folder_vec_t; -	cloth_folder_vec_t mLibraryClothingFolders; -	cloth_folder_vec_t mImportedClothingFolders; +	typedef std::vector<LLUUID> clothing_folder_vec_t; +	clothing_folder_vec_t mLibraryClothingFolders; +	clothing_folder_vec_t mImportedClothingFolders;  	bool mOutfitsPopulated;  	LLUUID mClothingID;  	LLUUID mLibraryClothingID; @@ -2240,7 +2240,7 @@ void LLAgentWearables::updateServer()  void LLAgentWearables::populateMyOutfitsFolder(void)  {	 -	llinfos << "starting outfit populate" << llendl; +	llinfos << "starting outfit population" << llendl;  	LLLibraryOutfitsFetch* outfits = new LLLibraryOutfitsFetch(); @@ -2312,17 +2312,28 @@ void LLLibraryOutfitsFetch::folderDone(void)  	LLInventoryModel::item_array_t wearable_array;  	gInventory.collectDescendents(mMyOutfitsID, cat_array, wearable_array,   								  LLInventoryModel::EXCLUDE_TRASH); -	  	// Early out if we already have items in My Outfits.  	if (cat_array.count() > 0 || wearable_array.count() > 0)  	{  		mOutfitsPopulated = true;  		return;  	} -	 +  	mClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);  	mLibraryClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true); -	 + +	// If Library->Clothing->Initial Outfits exists, use that. +	LLNameCategoryCollector matchFolderFunctor("Initial Outfits"); +	gInventory.collectDescendentsIf(mLibraryClothingID, +									cat_array, wearable_array,  +									LLInventoryModel::EXCLUDE_TRASH, +									matchFolderFunctor); +	if (cat_array.count() > 0) +	{ +		const LLViewerInventoryCategory *cat = cat_array.get(0); +		mLibraryClothingID = cat->getUUID(); +	} +  	mCompleteFolders.clear();  	// Get the complete information on the items in the inventory. @@ -2353,31 +2364,28 @@ void LLLibraryOutfitsFetch::outfitsDone(void)  	{  		const LLViewerInventoryCategory *cat = iter->get(); -		// Get the names and id's of every outfit in the library, except for ruth and other "misc" outfits. -		if (cat->getName() != "More Outfits" && cat->getName() != "Ruth") +		// Get the names and id's of every outfit in the library, skip "Ruth" +		// because it's a low quality legacy outfit +		if (cat->getName() != "Ruth")  		{  			// Get the name of every outfit in the library   			folders.push_back(cat->getUUID()); -			mLibraryClothingFolders.push_back(std::make_pair(cat->getUUID(), cat->getName())); +			mLibraryClothingFolders.push_back(cat->getUUID());  		}  	} -	 -	// Collect the contents of your Inventory Clothing folder  	cat_array.clear();  	wearable_array.clear(); -	gInventory.collectDescendents(mClothingID, cat_array, wearable_array,  -								  LLInventoryModel::EXCLUDE_TRASH);  	// Check if you already have an "Imported Library Clothing" folder -	for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin(); -		 iter != cat_array.end(); -		 ++iter) +	LLNameCategoryCollector matchFolderFunctor(mImportedClothingName); +	gInventory.collectDescendentsIf(mClothingID,  +									cat_array, wearable_array,  +									LLInventoryModel::EXCLUDE_TRASH, +									matchFolderFunctor); +	if (cat_array.size() > 0)  	{ -		const LLViewerInventoryCategory *cat = iter->get(); -		if (cat->getName() == mImportedClothingName) -		{ -			mImportedClothingID = cat->getUUID(); -		} +		const LLViewerInventoryCategory *cat = cat_array.get(0); +		mImportedClothingID = cat->getUUID();  	}  	mCompleteFolders.clear(); @@ -2415,31 +2423,59 @@ private:  	LLLibraryOutfitsFetch * mLibraryOutfitsFetcher;  }; +// Copy the clothing folders from the library into the imported clothing folder  void LLLibraryOutfitsFetch::libraryDone(void)  { -	// Copy the clothing folders from the library into the imported clothing folder if necessary. -	if (mImportedClothingID == LLUUID::null) +	if (mImportedClothingID != LLUUID::null)  	{ -		gInventory.removeObserver(this); -		LLPointer<LLInventoryCallback> copy_waiter = new LLLibraryOutfitsCopyDone(this); -		mImportedClothingID = gInventory.createNewCategory(mClothingID, -														   LLFolderType::FT_NONE, -														   mImportedClothingName); +		// Skip straight to fetching the contents of the imported folder +		importedFolderFetch(); +		return; +	} + +	// Remove observer; next autopopulation step will be triggered externally by LLLibraryOutfitsCopyDone. +	gInventory.removeObserver(this); +	 +	LLPointer<LLInventoryCallback> copy_waiter = new LLLibraryOutfitsCopyDone(this); +	mImportedClothingID = gInventory.createNewCategory(mClothingID, +													   LLFolderType::FT_NONE, +													   mImportedClothingName); +	// Copy each folder from library into clothing unless it already exists. +	for (clothing_folder_vec_t::const_iterator iter = mLibraryClothingFolders.begin(); +		 iter != mLibraryClothingFolders.end(); +		 ++iter) +	{ +		const LLUUID& src_folder_id = (*iter); // Library clothing folder ID +		const LLViewerInventoryCategory *cat = gInventory.getCategory(src_folder_id); +		if (!cat) +		{ +			llwarns << "Library folder import for uuid:" << src_folder_id << " failed to find folder." << llendl; +			continue; +		} -		for (cloth_folder_vec_t::const_iterator iter = mLibraryClothingFolders.begin(); -			 iter != mLibraryClothingFolders.end(); -			 ++iter) +		if (!LLAppearanceManager::getInstance()->getCanMakeFolderIntoOutfit(src_folder_id))  		{ -			LLUUID folder_id = gInventory.createNewCategory(mImportedClothingID, -															LLFolderType::FT_NONE, -															iter->second); -			LLAppearanceManager::getInstance()->shallowCopyCategoryContents(iter->first, folder_id, copy_waiter); +			llinfos << "Skipping non-outfit folder name:" << cat->getName() << llendl; +			continue;  		} -	} -	else -	{ -		// Skip straight to fetching the contents of the imported folder -		importedFolderFetch(); +		 +		// Don't copy the category if it already exists. +		LLNameCategoryCollector matchFolderFunctor(cat->getName()); +		LLInventoryModel::cat_array_t cat_array; +		LLInventoryModel::item_array_t wearable_array; +		gInventory.collectDescendentsIf(mImportedClothingID,  +										cat_array, wearable_array,  +										LLInventoryModel::EXCLUDE_TRASH, +										matchFolderFunctor); +		if (cat_array.size() > 0) +		{ +			continue; +		} + +		LLUUID dst_folder_id = gInventory.createNewCategory(mImportedClothingID, +															LLFolderType::FT_NONE, +															cat->getName()); +		LLAppearanceManager::getInstance()->shallowCopyCategoryContents(src_folder_id, dst_folder_id, copy_waiter);  	}  } @@ -2476,7 +2512,7 @@ void LLLibraryOutfitsFetch::importedFolderDone(void)  		// Get the name of every imported outfit  		folders.push_back(cat->getUUID()); -		mImportedClothingFolders.push_back(std::make_pair(cat->getUUID(), cat->getName())); +		mImportedClothingFolders.push_back(cat->getUUID());  	}  	mCompleteFolders.clear(); @@ -2492,17 +2528,25 @@ void LLLibraryOutfitsFetch::contentsDone(void)  	LLInventoryModel::cat_array_t cat_array;  	LLInventoryModel::item_array_t wearable_array; -	for (cloth_folder_vec_t::const_iterator folder_iter = mImportedClothingFolders.begin(); +	for (clothing_folder_vec_t::const_iterator folder_iter = mImportedClothingFolders.begin();  		 folder_iter != mImportedClothingFolders.end();  		 ++folder_iter)  	{ +		const LLUUID &folder_id = (*folder_iter); +		const LLViewerInventoryCategory *cat = gInventory.getCategory(folder_id); +		if (!cat) +		{ +			llwarns << "Library folder import for uuid:" << folder_id << " failed to find folder." << llendl; +			continue; +		} +		  		// First, make a folder in the My Outfits directory. -		LLUUID new_outfit_folder_id = gInventory.createNewCategory(mMyOutfitsID, LLFolderType::FT_OUTFIT, folder_iter->second); +		LLUUID new_outfit_folder_id = gInventory.createNewCategory(mMyOutfitsID, LLFolderType::FT_OUTFIT, cat->getName());  		cat_array.clear();  		wearable_array.clear();  		// Collect the contents of each imported clothing folder, so we can create new outfit links for it -		gInventory.collectDescendents(folder_iter->first, cat_array, wearable_array,  +		gInventory.collectDescendents(folder_id, cat_array, wearable_array,   									  LLInventoryModel::EXCLUDE_TRASH);  		for (LLInventoryModel::item_array_t::const_iterator wearable_iter = wearable_array.begin(); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 5c21be8c32..f08d8decfe 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -807,47 +807,91 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID  void LLAppearanceManager::shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id,  													  LLPointer<LLInventoryCallback> cb)  { -	LLInventoryModel::cat_array_t cats; -	LLInventoryModel::item_array_t items; -	gInventory.collectDescendents(src_id, cats, items, -								  LLInventoryModel::EXCLUDE_TRASH); -	for (S32 i = 0; i < items.count(); ++i) -	{ -		const LLViewerInventoryItem* item = items.get(i).get(); -		if (item->getActualType() == LLAssetType::AT_LINK) -		{ -			link_inventory_item(gAgent.getID(), -								item->getLinkedUUID(), -								dst_id, -								item->getName(), -								LLAssetType::AT_LINK, cb); -		} -		else if (item->getActualType() == LLAssetType::AT_LINK_FOLDER) +	LLInventoryModel::cat_array_t* cats; +	LLInventoryModel::item_array_t* items; +	gInventory.getDirectDescendentsOf(src_id, cats, items); +	for (LLInventoryModel::item_array_t::const_iterator iter = items->begin(); +		 iter != items->end(); +		 ++iter) +	{ +		const LLViewerInventoryItem* item = (*iter); +		switch (item->getActualType())  		{ -			LLViewerInventoryCategory *catp = item->getLinkedCategory(); -			// Skip copying outfit links. -			if (catp && catp->getPreferredType() != LLFolderType::FT_OUTFIT) +			case LLAssetType::AT_LINK:  			{  				link_inventory_item(gAgent.getID(),  									item->getLinkedUUID(),  									dst_id,  									item->getName(), -									LLAssetType::AT_LINK_FOLDER, cb); +									LLAssetType::AT_LINK, cb); +				break; +			} +			case LLAssetType::AT_LINK_FOLDER: +			{ +				LLViewerInventoryCategory *catp = item->getLinkedCategory(); +				// Skip copying outfit links. +				if (catp && catp->getPreferredType() != LLFolderType::FT_OUTFIT) +				{ +					link_inventory_item(gAgent.getID(), +										item->getLinkedUUID(), +										dst_id, +										item->getName(), +										LLAssetType::AT_LINK_FOLDER, cb); +				} +				break;  			} +			case LLAssetType::AT_CLOTHING: +			case LLAssetType::AT_OBJECT: +			case LLAssetType::AT_BODYPART: +			case LLAssetType::AT_GESTURE: +			{ +				copy_inventory_item(gAgent.getID(), +									item->getPermissions().getOwner(), +									item->getUUID(), +									dst_id, +									item->getName(), +									cb); +				break; +			} +			default: +				// Ignore non-outfit asset types +				break;  		} -		else +	} +} + +BOOL LLAppearanceManager::getCanMakeFolderIntoOutfit(const LLUUID& folder_id) +{ +	// These are the wearable items that are required for considering this +	// folder as containing a complete outfit. +	U32 required_wearables = 0; +	required_wearables |= 1LL << WT_SHAPE; +	required_wearables |= 1LL << WT_SKIN; +	required_wearables |= 1LL << WT_HAIR; +	required_wearables |= 1LL << WT_EYES; + +	// These are the wearables that the folder actually contains. +	U32 folder_wearables = 0; +	LLInventoryModel::cat_array_t* cats; +	LLInventoryModel::item_array_t* items; +	gInventory.getDirectDescendentsOf(folder_id, cats, items); +	for (LLInventoryModel::item_array_t::const_iterator iter = items->begin(); +		 iter != items->end(); +		 ++iter) +	{ +		const LLViewerInventoryItem* item = (*iter); +		if (item->isWearableType())  		{ -			copy_inventory_item( -				gAgent.getID(), -				item->getPermissions().getOwner(), -				item->getUUID(), -				dst_id, -				item->getName(), -				cb); +			const EWearableType wearable_type = item->getWearableType(); +			folder_wearables |= 1LL << wearable_type;  		}  	} + +	// If the folder contains the required wearables, return TRUE. +	return ((required_wearables & folder_wearables) == required_wearables);  } +  void LLAppearanceManager::purgeBaseOutfitLink(const LLUUID& category)  {  	LLInventoryModel::cat_array_t cats; diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index e7e2f33520..9d6cd34ad7 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -60,6 +60,9 @@ public:  	void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,  							 LLPointer<LLInventoryCallback> cb); +	// Return whether this folder contains minimal contents suitable for making a full outfit. +	BOOL getCanMakeFolderIntoOutfit(const LLUUID& folder_id); +  	// Copy all items in a category.  	void shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id,  									 LLPointer<LLInventoryCallback> cb); diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 50d8672083..45c540b3a3 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -183,6 +183,15 @@ void LLAvatarList::sortByName()  	sort();  } +void LLAvatarList::setDirty(bool val /*= true*/, bool force_refresh /*= false*/) +{ +	mDirty = val; +	if(mDirty && force_refresh) +	{ +		refresh(); +	} +} +  //////////////////////////////////////////////////////////////////////////  // PROTECTED SECTION  ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 0e4215e91a..00c72f1f9d 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -73,7 +73,7 @@ public:  	virtual void clear();  	void setNameFilter(const std::string& filter); -	void setDirty(bool val = true)						{ mDirty = val; } +	void setDirty(bool val = true, bool force_refresh = false);  	uuid_vector_t& getIDs() 							{ return mIDs; }  	bool contains(const LLUUID& id); diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp index 169a963d0d..f113cc49d4 100644 --- a/indra/newview/lldebugview.cpp +++ b/indra/newview/lldebugview.cpp @@ -81,11 +81,13 @@ void LLDebugView::init()  	r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f),     									 (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f)); +	  	mFastTimerView = new LLFastTimerView(r);  	mFastTimerView->setFollowsTop();  	mFastTimerView->setFollowsLeft();  	mFastTimerView->setVisible(FALSE);			// start invisible  	addChild(mFastTimerView); +	mFastTimerView->setRect(rect);  	r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f),   									 (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f)); diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 4fa97e789b..8bc3b5a75f 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -44,6 +44,7 @@  #include "llfontgl.h"  #include "llsdserialize.h"  #include "lltooltip.h" +#include "llbutton.h"  #include "llappviewer.h"  #include "llviewertexturelist.h" @@ -99,6 +100,8 @@ LLFastTimerView::LLFastTimerView(const LLRect& rect)  	FTV_NUM_TIMERS = LLFastTimer::NamedTimer::instanceCount();  	mPrintStats = -1;	  	mAverageCyclesPerTimer = 0; +	setCanMinimize(false); +	setCanClose(true);  } @@ -139,6 +142,18 @@ LLFastTimer::NamedTimer* LLFastTimerView::getLegendID(S32 y)  BOOL LLFastTimerView::handleMouseDown(S32 x, S32 y, MASK mask)  { + +	{ +		S32 local_x = x - mButtons[BUTTON_CLOSE]->getRect().mLeft; +		S32 local_y = y - mButtons[BUTTON_CLOSE]->getRect().mBottom; +		if(mButtons[BUTTON_CLOSE]->getVisible() +			&&  mButtons[BUTTON_CLOSE]->pointInView(local_x, local_y)  ) +		{ +			return LLFloater::handleMouseDown(x, y, mask);; +		} +	} +	 +  	if (x < mBarRect.mLeft)   	{  		LLFastTimer::NamedTimer* idp = getLegendID(y); @@ -188,6 +203,15 @@ BOOL LLFastTimerView::handleMouseDown(S32 x, S32 y, MASK mask)  BOOL LLFastTimerView::handleMouseUp(S32 x, S32 y, MASK mask)  { +	{ +		S32 local_x = x - mButtons[BUTTON_CLOSE]->getRect().mLeft; +		S32 local_y = y - mButtons[BUTTON_CLOSE]->getRect().mBottom; +		if(mButtons[BUTTON_CLOSE]->getVisible() +			&&  mButtons[BUTTON_CLOSE]->pointInView(local_x, local_y)  ) +		{ +			return LLFloater::handleMouseUp(x, y, mask);; +		} +	}  	return FALSE;  } @@ -1191,5 +1215,8 @@ void LLFastTimerView::doAnalysis(std::string baseline, std::string target, std::  		return ;  	}  } - +void	LLFastTimerView::onClickCloseBtn() +{ +	setVisible(false); +} diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h index f5c8f23818..ac06990913 100644 --- a/indra/newview/llfasttimerview.h +++ b/indra/newview/llfasttimerview.h @@ -63,7 +63,9 @@ public:  	LLFastTimer::NamedTimer* getLegendID(S32 y);  	F64 getTime(const std::string& name); -	 + +protected: +	virtual	void	onClickCloseBtn();  private:	  	typedef std::vector<std::vector<S32> > bar_positions_t;  	bar_positions_t mBarStart; diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 23f19a38a6..f7fd7bb472 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -179,6 +179,7 @@ LLFolderView::LLFolderView(const Params& p)  	mSourceID(p.task_id),  	mRenameItem( NULL ),  	mNeedsScroll( FALSE ), +	mEnableScroll( true ),  	mPinningSelectedItem(FALSE),  	mNeedsAutoSelect( FALSE ),  	mAutoSelectOverride(FALSE), @@ -1913,7 +1914,7 @@ void LLFolderView::deleteAllChildren()  void LLFolderView::scrollToShowSelection()  { -	if (mSelectedItems.size()) +	if (mEnableScroll && mSelectedItems.size())  	{  		mNeedsScroll = TRUE;  	} diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index faf6a9cf23..38255b3cea 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -269,6 +269,7 @@ public:  	void dumpSelectionInformation();  	virtual S32	notify(const LLSD& info) ; +	void setEnableScroll(bool enable_scroll) { mEnableScroll = enable_scroll; }  private:  	void updateRenamerPosition(); @@ -300,6 +301,7 @@ protected:  	LLLineEditor*					mRenamer;  	BOOL							mNeedsScroll; +	bool							mEnableScroll;  	BOOL							mPinningSelectedItem;  	LLRect							mScrollConstraintRect;  	BOOL							mNeedsAutoSelect; diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index ac060cef15..18f81fe506 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -44,24 +44,28 @@  // Constants; -static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "InvFolder Friends"; -static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "InvFolder All"; +static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "Friends"; +static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "All";  // helper functions -// NOTE: Usage of LLTrans::getString(); in next two functions to set localized -// folders' names is caused by a hack in the LLFolderViewItem::refreshFromListener() -// method for protected asset types. -// So, localized names will be got from the strings with "InvFolder LABEL_NAME" -// in the strings.xml +// NOTE: For now Friends & All folders are created as protected folders of the LLFolderType::FT_CALLINGCARD type. +// So, their names will be processed in the LLFolderViewItem::refreshFromListener() to be localized +// using "InvFolder LABEL_NAME" as LLTrans::findString argument. + +// We must use in this file their hard-coded names to ensure found them on different locales. EXT-5829. +// These hard-coded names will be stored in InventoryItems but shown localized in FolderViewItems + +// If hack in the LLFolderViewItem::refreshFromListener() to localize protected folder is removed +// or these folders are not protected these names should be localized in another place/way.  inline const std::string get_friend_folder_name()  { -	return LLTrans::getString(INVENTORY_STRING_FRIENDS_SUBFOLDER); +	return INVENTORY_STRING_FRIENDS_SUBFOLDER;  }  inline const std::string get_friend_all_subfolder_name()  { -	return LLTrans::getString(INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER); +	return INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER;  }  void move_from_to_arrays(LLInventoryModel::cat_array_t& from, LLInventoryModel::cat_array_t& to) @@ -350,9 +354,9 @@ const LLUUID& LLFriendCardsManager::findFriendAllSubfolderUUIDImpl() const  	return findChildFolderUUID(friendFolderUUID, friendAllSubfolderName);  } -const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const +const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& nonLocalizedName) const  { -	LLNameCategoryCollector matchFolderFunctor(localizedName); +	LLNameCategoryCollector matchFolderFunctor(nonLocalizedName);  	return get_folder_uuid(parentFolderUUID, matchFolderFunctor);  } diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h index b94d5ec2c0..1cda52c1d7 100644 --- a/indra/newview/llfriendcard.h +++ b/indra/newview/llfriendcard.h @@ -120,7 +120,7 @@ private:  		return (mBuddyIDSet.end() != mBuddyIDSet.find(avatarID));  	} -	const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const; +	const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& nonLocalizedName) const;  	const LLUUID& findFriendFolderUUIDImpl() const;  	const LLUUID& findFriendAllSubfolderUUIDImpl() const;  	const LLUUID& findFriendCardInventoryUUIDImpl(const LLUUID& avatarID); diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index d518318b0e..9eb11a6ac4 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -96,8 +96,29 @@ void LLIMFloaterContainer::addFloater(LLFloater* floaterp,  	LLUUID session_id = floaterp->getKey(); -	floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id)); -	mSessions[session_id] = floaterp; +	LLIconCtrl* icon = 0; + +	if(gAgent.isInGroup(session_id, TRUE)) +	{ +		LLGroupIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLGroupIconCtrl>(); +		icon_params.group_id = session_id; +		icon = LLUICtrlFactory::instance().createWidget<LLGroupIconCtrl>(icon_params); + +		mSessions[session_id] = floaterp; +		floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id)); +	} +	else +	{ +		LLUUID avatar_id = LLIMModel::getInstance()->getOtherParticipantID(session_id); + +		LLAvatarIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLAvatarIconCtrl>(); +		icon_params.avatar_id = avatar_id; +		icon = LLUICtrlFactory::instance().createWidget<LLAvatarIconCtrl>(icon_params); + +		mSessions[session_id] = floaterp; +		floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id)); +	} +	mTabContainer->setTabImage(floaterp, icon);  }  void LLIMFloaterContainer::onCloseFloater(LLUUID& id) @@ -134,6 +155,8 @@ void LLIMFloaterContainer::setMinimized(BOOL b)  	if (isMinimized() == b) return;  	LLMultiFloater::setMinimized(b); +	// Hide minimized floater (see EXT-5315) +	setVisible(!b);  	if (isMinimized()) return; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 048ed10886..8097985ade 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -681,6 +681,21 @@ BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  	return handled;  } +// virtual +void LLInventoryPanel::onMouseEnter(S32 x, S32 y, MASK mask) +{ +	LLPanel::onMouseEnter(x, y, mask); +	// don't auto-scroll a list when cursor is over Inventory. See EXT-3981. +	mFolders->setEnableScroll(false); +} + +// virtual +void LLInventoryPanel::onMouseLeave(S32 x, S32 y, MASK mask) +{ +	LLPanel::onMouseLeave(x, y, mask); +	mFolders->setEnableScroll(true); +} +  void LLInventoryPanel::onFocusLost()  {  	// inventory no longer handles cut/copy/paste/delete diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index f312b588b9..37b03dbd7d 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -122,6 +122,10 @@ public:  								   void* cargo_data,  								   EAcceptance* accept,  								   std::string& tooltip_msg); + +	void onMouseEnter(S32 x, S32 y, MASK mask); +	void onMouseLeave(S32 x, S32 y, MASK mask); +  	// LLUICtrl methods  	 /*virtual*/ void onFocusLost();  	 /*virtual*/ void onFocusReceived(); diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index 114fef8712..883d4cdf4b 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -47,6 +47,8 @@  static LLDefaultChildRegistry::Register<LLNameListCtrl> r("name_list"); +static const S32 info_icon_size = 16; +  void LLNameListCtrl::NameTypeNames::declareValues()  {  	declare("INDIVIDUAL", LLNameListCtrl::INDIVIDUAL); @@ -138,6 +140,29 @@ void LLNameListCtrl::showInspector(const LLUUID& avatar_id, bool is_group)  		LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", avatar_id));  } +void	LLNameListCtrl::mouseOverHighlightNthItem( S32 target_index ) +{ +	if (getHighlightedItemInx()!= target_index) +	{ +		if(getHighlightedItemInx()!=-1) +		{ +			LLScrollListItem* item = getItemList()[getHighlightedItemInx()]; +			LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex)); +			if(cell) +				cell->setTextWidth(cell->getTextWidth() + info_icon_size); +		} +		if(target_index != -1) +		{ +			LLScrollListItem* item = getItemList()[target_index]; +			LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex)); +			if(cell) +				cell->setTextWidth(cell->getTextWidth() - info_icon_size); +		} +	} + +	LLScrollListCtrl::mouseOverHighlightNthItem(target_index); +} +  //virtual  BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)  { @@ -164,7 +189,7 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)  				// Spawn at right side of cell  				LLPointer<LLUIImage> icon = LLUI::getUIImage("Info_Small"); -				LLCoordGL pos( sticky_rect.mRight - 16, sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight())/2 ); +				LLCoordGL pos( sticky_rect.mRight - info_icon_size, sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight())/2 );  				// Should we show a group or an avatar inspector?  				bool is_group = hit_item->getValue()["is_group"].asBoolean(); diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index 23b1cb6897..1c26ee5db4 100644 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -120,6 +120,8 @@ public:  	void setAllowCallingCardDrop(BOOL b) { mAllowCallingCardDrop = b; }  	/*virtual*/ void updateColumns(); + +	/*virtual*/ void	mouseOverHighlightNthItem( S32 index );  private:  	void showInspector(const LLUUID& avatar_id, bool is_group); diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index 836331b44b..7cf27d9141 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -1290,18 +1290,11 @@ void LLPanelClassifiedInfo::resetData()  void LLPanelClassifiedInfo::resetControls()  { -	if(getAvatarId() == gAgent.getID()) -	{ -		childSetEnabled("edit_btn", TRUE); -		childSetVisible("edit_btn", TRUE); -		childSetVisible("auto_renew", TRUE); -	} -	else -	{ -		childSetEnabled("edit_btn", FALSE); -		childSetVisible("edit_btn", FALSE); -		childSetVisible("auto_renew", FALSE); -	} +	bool is_self = getAvatarId() == gAgent.getID(); + +	childSetEnabled("edit_btn", is_self); +	childSetVisible("edit_btn", is_self); +	childSetVisible("price_layout_panel", is_self);  }  void LLPanelClassifiedInfo::setClassifiedName(const std::string& name) diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp index c02f154dc8..a73c25a979 100644 --- a/indra/newview/llpanelnearbymedia.cpp +++ b/indra/newview/llpanelnearbymedia.cpp @@ -549,11 +549,10 @@ void LLPanelNearByMedia::refreshParcelItems()  	MediaClass choice = (MediaClass)choice_llsd.asInteger();  	// Only show "special parcel items" if "All" or "Within" filter  	// (and if media is "enabled") -	bool should_include = gSavedSettings.getBOOL("AudioStreamingMedia") && -						  (choice == MEDIA_CLASS_ALL || choice == MEDIA_CLASS_WITHIN_PARCEL); +	bool should_include = (choice == MEDIA_CLASS_ALL || choice == MEDIA_CLASS_WITHIN_PARCEL);  	// First Parcel Media: add or remove it as necessary -	if (should_include && LLViewerMedia::hasParcelMedia()) +	if (gSavedSettings.getBOOL("AudioStreamingMedia") &&should_include && LLViewerMedia::hasParcelMedia())  	{  		// Yes, there is parcel media.  		if (NULL == mParcelMediaItem) @@ -716,11 +715,14 @@ void LLPanelNearByMedia::refreshList()  		}  	}  	}	 -	mDisableAllCtrl->setEnabled(gSavedSettings.getBOOL("AudioStreamingMedia") && +	mDisableAllCtrl->setEnabled((gSavedSettings.getBOOL("AudioStreamingMusic") ||  +		                         gSavedSettings.getBOOL("AudioStreamingMedia")) &&  								(LLViewerMedia::isAnyMediaShowing() ||   								 LLViewerMedia::isParcelMediaPlaying() ||  								 LLViewerMedia::isParcelAudioPlaying())); -	mEnableAllCtrl->setEnabled(gSavedSettings.getBOOL("AudioStreamingMedia") && + +	mEnableAllCtrl->setEnabled( (gSavedSettings.getBOOL("AudioStreamingMusic") || +								gSavedSettings.getBOOL("AudioStreamingMedia")) &&  							   (disabled_count > 0 ||  								// parcel media (if we have it, and it isn't playing, enable "start")  								(LLViewerMedia::hasParcelMedia() && ! LLViewerMedia::isParcelMediaPlaying()) || @@ -979,20 +981,13 @@ void LLPanelNearByMedia::onMoreLess()  void LLPanelNearByMedia::updateControls()  { -	if (! gSavedSettings.getBOOL("AudioStreamingMedia")) -	{ -		// Just show disabled controls -		showDisabledControls(); -		return; -	} -	  	LLUUID selected_media_id = mMediaList->getValue().asUUID();  	if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID)  	{  		if (!LLViewerMedia::hasParcelAudio() || !gSavedSettings.getBOOL("AudioStreamingMusic"))  		{ -			// Shouldn't happen, but do this anyway +			// disable controls if audio streaming music is disabled from preference  			showDisabledControls();  		}  		else { @@ -1005,9 +1000,9 @@ void LLPanelNearByMedia::updateControls()  	}  	else if (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID)  	{ -		if (!LLViewerMedia::hasParcelMedia()) +		if (!LLViewerMedia::hasParcelMedia() || !gSavedSettings.getBOOL("AudioStreamingMedia"))  		{ -			// Shouldn't happen, but do this anyway +			// disable controls if audio streaming media is disabled from preference  			showDisabledControls();  		}  		else { @@ -1034,7 +1029,7 @@ void LLPanelNearByMedia::updateControls()  	else {  		LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(selected_media_id); -		if (NULL == impl) +		if (NULL == impl || !gSavedSettings.getBOOL("AudioStreamingMedia"))  		{  			showDisabledControls();  		} diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index d2a518a06a..93a6a7803a 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -683,9 +683,15 @@ void LLPanelPeople::updateFriendList()  			online_friendsp.push_back(buddy_id);  	} -	mOnlineFriendList->setDirty(); -	mAllFriendList->setDirty(); - +	/* +	 * Avatarlists  will be hidden by showFriendsAccordionsIfNeeded(), if they do not have items. +	 * But avatarlist can be updated only if it is visible @see LLAvatarList::draw();    +	 * So we need to do force update of lists to avoid inconsistency of data and view of avatarlist.  +	 */ +	mOnlineFriendList->setDirty(true, !mOnlineFriendList->filterHasMatches());// do force update if list do NOT have items +	mAllFriendList->setDirty(true, !mAllFriendList->filterHasMatches()); +	//update trash and other buttons according to a selected item +	updateButtons();  	showFriendsAccordionsIfNeeded();  } @@ -1434,9 +1440,8 @@ void LLPanelPeople::onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param  	{  		showAccordion("tab_all", param.asInteger());  	} +	updateButtons(); -	LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion"); -	accordion->arrange();  }  void LLPanelPeople::setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed) diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index 0630981d7e..6ebe55e362 100644 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -100,6 +100,8 @@ BOOL LLSidepanelTaskInfo::postBuild()  	mPayBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onPayButtonClicked, this));  	mBuyBtn = getChild<LLButton>("buy_btn");  	mBuyBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onBuyButtonClicked, this)); +	mDetailsBtn = getChild<LLButton>("details_btn"); +	mDetailsBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onDetailsButtonClicked, this));  	mLabelGroupName = getChild<LLNameBox>("Group Name Proxy"); @@ -1122,6 +1124,15 @@ void LLSidepanelTaskInfo::updateVerbs()  	//mEditBtn->setEnabled(obj && obj->permModify());  	*/ +	LLSafeHandle<LLObjectSelection> object_selection = LLSelectMgr::getInstance()->getSelection(); +	const BOOL multi_select = (object_selection->getNumNodes() > 1); + +	mOpenBtn->setVisible(!multi_select); +	mPayBtn->setVisible(!multi_select); +	mBuyBtn->setVisible(!multi_select); +	mDetailsBtn->setVisible(multi_select); +	mDetailsBtn->setEnabled(multi_select); +  	mOpenBtn->setEnabled(enable_object_open());  	mPayBtn->setEnabled(enable_pay_object());  	mBuyBtn->setEnabled(enable_buy_object()); @@ -1145,6 +1156,11 @@ void LLSidepanelTaskInfo::onBuyButtonClicked()  	doClickAction(CLICK_ACTION_BUY);  } +void LLSidepanelTaskInfo::onDetailsButtonClicked() +{ +	LLFloaterReg::showInstance("inspect", LLSD()); +} +  // virtual  void LLSidepanelTaskInfo::save()  { diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h index cf36c20767..e41627435f 100644 --- a/indra/newview/llsidepaneltaskinfo.h +++ b/indra/newview/llsidepaneltaskinfo.h @@ -109,10 +109,12 @@ protected:  	void 						onOpenButtonClicked();  	void 						onPayButtonClicked();  	void 						onBuyButtonClicked(); +	void 						onDetailsButtonClicked();  private:  	LLButton*					mOpenBtn;  	LLButton*					mPayBtn;  	LLButton*					mBuyBtn; +	LLButton*					mDetailsBtn;  protected:  	LLViewerObject*				getObject(); diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 732c23982b..9fb496c214 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -360,12 +360,14 @@ void LLStatusBar::refresh()  	// Disable media toggle if there's no media, parcel media, and no parcel audio  	// (or if media is disabled) -	mMediaToggle->setEnabled(gSavedSettings.getBOOL("AudioStreamingMedia") &&  -							 (LLViewerMedia::hasInWorldMedia() || LLViewerMedia::hasParcelMedia() || LLViewerMedia::hasParcelAudio())); +	bool button_enabled = (gSavedSettings.getBOOL("AudioStreamingMusic")||gSavedSettings.getBOOL("AudioStreamingMedia")) &&  +						  (LLViewerMedia::hasInWorldMedia() || LLViewerMedia::hasParcelMedia() || LLViewerMedia::hasParcelAudio()); +	mMediaToggle->setEnabled(button_enabled);  	// Note the "sense" of the toggle is opposite whether media is playing or not -	mMediaToggle->setValue(! (LLViewerMedia::isAnyMediaShowing() ||  +	bool any_media_playing = (LLViewerMedia::isAnyMediaShowing() ||   							  LLViewerMedia::isParcelMediaPlaying() || -							  LLViewerMedia::isParcelAudioPlaying())); +							  LLViewerMedia::isParcelAudioPlaying()); +	mMediaToggle->setValue(!any_media_playing);  }  void LLStatusBar::setVisibleForMouselook(bool visible) diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 86336e353c..344c4c469b 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -851,7 +851,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg)  			}  		}  		// update the audio stream here as well -		if(!inworld_media_enabled || !inworld_audio_enabled) +		if( !inworld_audio_enabled)  		{  			if(LLViewerMedia::isParcelAudioPlaying() && gAudiop && LLViewerMedia::hasParcelAudio())  			{ diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index ae31c9732c..361f4e2326 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3115,8 +3115,12 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)  		{  			// Chat the "back" SLURL. (DEV-4907) +			LLSD substitution = LLSD().with("[T_SLURL]", gAgent.getTeleportSourceSLURL()); +			std::string completed_from = LLAgent::sTeleportProgressMessages["completed_from"]; +			LLStringUtil::format(completed_from, substitution); +  			LLSD args; -			args["MESSAGE"] = "Teleport completed from " + gAgent.getTeleportSourceSLURL(); +			args["MESSAGE"] = completed_from;  			LLNotificationsUtil::add("SystemMessageTip", args);  			// Set the new position diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index f1ec489a20..30f2d2c41b 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -695,22 +695,15 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window,  LLCoordGL pos, MASK  	{  		S32 local_x, local_y;  		top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); -		if (down) +		if (top_ctrl->pointInView(local_x, local_y))  		{ -			if (top_ctrl->pointInView(local_x, local_y)) -			{ -				return top_ctrl->handleAnyMouseClick(local_x, local_y, mask, clicktype, down)	; -			} -			else -			{ -				gFocusMgr.setTopCtrl(NULL); -			} +			return top_ctrl->handleAnyMouseClick(local_x, local_y, mask, clicktype, down)	;  		}  		else  		{ -			if (top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleMouseUp(local_x, local_y, mask)) +			if (down)  			{ -				return TRUE; +				gFocusMgr.setTopCtrl(NULL);  			}  		}  	} diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 131c6ac1a1..acd12099cd 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1723,7 +1723,7 @@ BOOL LLVOAvatarSelf::canGrabLocalTexture(ETextureIndex type, U32 index) const  		return FALSE;  	} -	if (gAgent.isGodlike()) +	if (gAgent.isGodlikeWithoutAdminMenuFakery())  		return TRUE;  	// Check permissions of textures that show up in the diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index c617dacec5..d45d6155dd 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -344,7 +344,7 @@       value="0.92 0.92 1 0.78" />      <color       name="GridlineColor" -     reference="Red" /> +     reference="White" />      <color       name="GridlineShadowColor"       value="0 0 0 0.31" /> @@ -359,7 +359,7 @@       reference="White"/>      <color       name="GroupNotifyDimmedTextColor" -     reference="LtGray" /> +     reference="DkGray" />      <color       name="GroupOverTierColor"       value="0.43 0.06 0.06 1" /> diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 58ea7cec9c..29c6ae8009 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -46,7 +46,7 @@           top="0">              <panel.string               name="new users only"> -                New users only +                New Residents only              </panel.string>              <panel.string               name="anyone"> 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 98508e5113..125b080519 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_land.xml @@ -64,7 +64,7 @@ Try selecting a smaller area.      </floater.string>      <floater.string       name="not_owned_by_you"> -        Land owned by another user is selected.  +        Land owned by another Resident is selected.   Try selecting a smaller area.      </floater.string>      <floater.string diff --git a/indra/newview/skins/default/xui/en/floater_god_tools.xml b/indra/newview/skins/default/xui/en/floater_god_tools.xml index 0fac6cd5f1..36ef6beb59 100644 --- a/indra/newview/skins/default/xui/en/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_god_tools.xml @@ -31,8 +31,8 @@              <button               follows="left|top"               height="20" -             label="Kick all users" -             label_selected="Kick all users" +             label="Kick all Residents" +             label_selected="Kick all Residents"               layout="topleft"               left="10"               name="Kick all users" diff --git a/indra/newview/skins/default/xui/en/floater_im.xml b/indra/newview/skins/default/xui/en/floater_im.xml index a21242ffe1..55efe83820 100644 --- a/indra/newview/skins/default/xui/en/floater_im.xml +++ b/indra/newview/skins/default/xui/en/floater_im.xml @@ -14,7 +14,7 @@   width="419">      <multi_floater.string       name="only_user_message"> -        You are the only user in this session. +        You are the only Resident in this session.      </multi_floater.string>      <multi_floater.string       name="offline_message"> @@ -54,7 +54,7 @@      </multi_floater.string>      <multi_floater.string       name="add_session_event"> -        Unable to add users to chat session with [RECIPIENT]. +        Unable to add Residents to chat session with [RECIPIENT].      </multi_floater.string>      <multi_floater.string       name="message_session_event"> diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml index 0f098bbb52..65a05f3ec5 100644 --- a/indra/newview/skins/default/xui/en/floater_im_container.xml +++ b/indra/newview/skins/default/xui/en/floater_im_container.xml @@ -22,7 +22,9 @@       tab_width="64"       tab_max_width = "134"       tab_height="16" -     halign="center" +     use_custom_icon_ctrl="true" +     tab_icon_ctrl_pad="2" +     halign="left"       use_ellipses="true"       top="0"       width="390" /> diff --git a/indra/newview/skins/default/xui/en/floater_inspect.xml b/indra/newview/skins/default/xui/en/floater_inspect.xml index 3f7642fafe..bea35e5fc1 100644 --- a/indra/newview/skins/default/xui/en/floater_inspect.xml +++ b/indra/newview/skins/default/xui/en/floater_inspect.xml @@ -16,7 +16,7 @@          [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]      </floater.string>      <scroll_list -     bottom="270" +     bottom="268"       column_padding="0"       draw_heading="true"       follows="top|right|left|bottom" @@ -47,23 +47,23 @@      </scroll_list>      <button       follows="left|bottom" -     height="20" +     height="23"       label="See Owner Profile..."       layout="topleft" -     left_delta="0" +     left_delta="-1"       name="button owner"       tool_tip="See profile of the highlighted object's owner" -     top_pad="5" +     top_pad="4"       width="150">  		<button.commit_callback  		function="Inspect.OwnerProfile" />  	</button>      <button       follows="left|bottom" -     height="20" +     height="23"       label="See Creator Profile..."       layout="topleft" -     left_pad="10" +     left_pad="5"       name="button creator"       tool_tip="See profile of the highlighted object's original creator"       top_delta="0" diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 1ab3dda52c..01548dd820 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -105,9 +105,11 @@       width="100">          <flyout_button.item           label="Save" +         name="save_item"           value="save" />          <flyout_button.item           label="Save As..." +         name="saveas_item"           value="save as" />      </flyout_button>          <button diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 936f4a3fab..4264b86a72 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -2848,11 +2848,11 @@ Leave Group?     icon="alert.tga"     name="ConfirmKick"     type="alert"> -Do you REALLY want to kick all users off the grid? +Do you REALLY want to kick all Residents off the grid?      <usetemplate       name="okcancelbuttons"       notext="Cancel" -     yestext="Kick All Users"/> +     yestext="Kick All Residents"/>    </notification>    <notification @@ -2952,7 +2952,7 @@ You have reached your maximum number of groups. Please leave some group before j     icon="alert.tga"     name="KickUser"     type="alert"> -Kick this user with what message? +Kick this Resident with what message?      <form name="form">        <input name="message" type="text">  An administrator has logged you off. @@ -2994,7 +2994,7 @@ An administrator has logged you off.     icon="alert.tga"     name="FreezeUser"     type="alert"> -Freeze this user with what message? +Freeze this Resident with what message?      <form name="form">        <input name="message" type="text">  You have been frozen. You cannot move or chat. An administrator will contact you via instant message (IM). @@ -3015,7 +3015,7 @@ You have been frozen. You cannot move or chat. An administrator will contact you     icon="alert.tga"     name="UnFreezeUser"     type="alert"> -Unfreeze this user with what message? +Unfreeze this Resident with what message?      <form name="form">        <input name="message" type="text">  You are no longer frozen. @@ -3057,7 +3057,7 @@ Join me in [REGION]     icon="alertmodal.tga"     name="OfferTeleportFromGod"     type="alertmodal"> -God summon user to your location? +God summon Resident to your location?      <form name="form">        <input name="message" type="text">  Join me in [REGION] @@ -3137,7 +3137,7 @@ Type a short announcement which will be sent to everyone currently in your estat     type="alert">  You are about to change a Linden owned estate (mainland, teen grid, orientation, etc.). -This is EXTREMELY DANGEROUS because it can fundamentally affect the user experience.  On the mainland, it will change thousands of regions and make the spaceserver hiccup. +This is EXTREMELY DANGEROUS because it can fundamentally affect the Resident experience.  On the mainland, it will change thousands of regions and make the spaceserver hiccup.  Proceed?      <usetemplate @@ -5383,7 +5383,7 @@ Grant this request?     icon="notify.tga"     name="ScriptToast"     type="notify"> -    [FIRST] [LAST]'s '[TITLE]' is requesting user input. +    [FIRST] [LAST]'s '[TITLE]' is requesting Resident input.      <form name="form">        <button         index="0" diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml index 903a9689f1..a8c72e03bd 100644 --- a/indra/newview/skins/default/xui/en/panel_classified_info.xml +++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml @@ -51,11 +51,11 @@       follows="all"       height="502"       layout="topleft" -     left="9" +     left="10"       top_pad="10"       name="profile_scroll"       reserve_scroll_corner="false" -     width="310"> +     width="312">      <panel       name="scroll_content_panel"       follows="left|top" @@ -63,18 +63,18 @@       layout="topleft"       top="0"       background_visible="false" -     height="500" +     height="610"       left="0"       width="285">          <texture_picker           enabled="false"           follows="left|top|right"           height="197" +         width="272"           layout="topleft"           left="11"           name="classified_snapshot" -         top="10" -         width="286" /> +         top="10" />          <text_editor           allow_scroll="false"           bg_visible="false" @@ -93,6 +93,17 @@           v_pad="0"           value="[name]"           use_ellipses="true" /> +        <text +         follows="left|top" +         font.style="BOLD" +         height="10" +         layout="topleft" +         left="10" +         name="classified_location_label" +         text_color="white" +         top_pad="10" +         value="Location:" +         width="250" />          <text_editor           allow_scroll="false"           bg_visible="false" @@ -103,10 +114,22 @@           left="10"           name="classified_location"           read_only="true" +         top_pad="5"           width="290"           word_wrap="true"           v_pad="0"           value="[loading...]" /> +        <text +         follows="left|top" +         font.style="BOLD" +         height="10" +         layout="topleft" +         left="10" +         name="content_type_label" +         text_color="white" +         top_pad="10" +         value="Content Type:" +         width="250" />          <text_editor           allow_scroll="false"           bg_visible="false" @@ -118,9 +141,20 @@           name="content_type"           read_only="true"           width="290" -         top_pad="5" +         top_pad="15"           v_pad="0"           value="[content type]" /> +        <text +         follows="left|top" +         font.style="BOLD" +         height="10" +         layout="topleft" +         left="10" +         name="category_label" +         text_color="white" +         top_pad="10" +         value="Category:" +         width="250" />          <text_editor           allow_html="true"           allow_scroll="false" @@ -136,6 +170,17 @@           top_pad="5"           v_pad="0"           value="[category]" /> +        <text +         follows="left|top" +         font.style="BOLD" +         height="10" +         layout="topleft" +         left="10" +         name="price_for_listing_label" +         text_color="white" +         top_pad="10" +         value="Price for listing:" +         width="250" />          <text_editor           allow_scroll="false"           bg_visible="false" @@ -150,33 +195,80 @@           top_pad="5"           tool_tip="Price for listing."           v_pad="0" +         value="[price]"           width="105" /> +        <layout_stack +         animate="false" +         name="descr_stack" +         layout="topleft" +         follows="top|left" +         orientation="vertical" +         left="10" +         top_pad="5" +         width="290" +         height="250"> +         <layout_panel +          auto_resize="false" +          name="price_layout_panel" +          layout="topleft" +          follows="top|left" +          left="0" +          top="0" +          width="290" +          height="26" +          user_resize="false">          <check_box           enabled="false"           height="16"           label="Auto renew each week"           layout="topleft" -         left="10" +         follows="top|left" +         left="0"           name="auto_renew" -         top_pad="5" +         top="0"           v_pad="0"           width="290" /> +         </layout_panel> +         <layout_panel +          name="descr_layout_panel" +          layout="topleft" +          follows="top|left" +          left="0" +          top="0" +          width="290" +          height="215" +          user_resize="false"> +        <text +         auto_resize="false" +         follows="left|top" +         font.style="BOLD" +         height="10" +         layout="topleft" +         left="0" +         name="classified_desc_label" +         text_color="white" +         top="0" +         value="Description:" +         width="250" />          <text_editor           allow_html="true" -         allow_scroll="false" +         allow_scroll="true"           bg_visible="false"           follows="left|top|right"           h_pad="0"           height="200"           layout="topleft" -         left="10" +         left="0"           max_length="1023"           name="classified_desc"           read_only="true" +         top_pad="5"           width="290"           v_pad="0"           value="[description]"           word_wrap="true" /> +         </layout_panel> +        </layout_stack>      </panel>      </scroll_container>      <panel diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml index 66d5389d9b..6cc6c51fe0 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml @@ -42,16 +42,16 @@          Edit Classified      </text>     <scroll_container -     color="DkGray2" -     follows="all" -     height="502" -     layout="topleft" -     left="8" -     top_pad="10" -     name="profile_scroll" -     reserve_scroll_corner="false" -     opaque="true" -     width="312"> +    color="DkGray2" +    follows="all" +    height="502" +    layout="topleft" +    left="8" +    top_pad="10" +    name="profile_scroll" +    reserve_scroll_corner="false" +    opaque="true" +    width="312">      <panel       name="scroll_content_panel"       follows="left|top" @@ -59,17 +59,17 @@       layout="topleft"       top="0"       background_visible="false" -     height="610" +     height="690"       left="0"       width="285"> -    <texture_picker -     follows="left|top|right" -     height="197" -     width="272" -     layout="topleft" -     top="10" -     left="11" -     name="classified_snapshot" /> +      <texture_picker +       follows="left|top|right" +       height="197" +       width="272" +       layout="topleft" +       top="10" +       left="11" +       name="classified_snapshot" />            <icon             height="197"             image_name="spacer24.tga" @@ -153,7 +153,7 @@           type="string"           length="1"           follows="left|top" -         height="50" +         height="30"           layout="topleft"           left="10"           name="classified_location" @@ -172,6 +172,17 @@           top_pad="5"           name="set_to_curr_location_btn"           width="156" /> +        <text +         follows="left|top" +         font.style="BOLD" +         height="10" +         layout="topleft" +         left="10" +         name="category_label" +         text_color="white" +         top_pad="15" +         value="Category:" +         width="250" />          <combo_box           follows="left|top"            height="23"  @@ -180,6 +191,17 @@           name="category"            top_pad="5"           width="156" /> +        <text +         follows="left|top" +         font.style="BOLD" +         height="10" +         layout="topleft" +         left="10" +         name="content_type_label" +         text_color="white" +         top_pad="15" +         value="Content type:" +         width="250" />          <combo_box            allow_text_entry="false"            follows="left|top"  @@ -199,6 +221,17 @@             General Content           </combo_item>          </combo_box> +        <text +         follows="left|top" +         font.style="BOLD" +         height="10" +         layout="topleft" +         left="10" +         name="price_for_listing_label" +         text_color="white" +         top_pad="15" +         value="Price for listing:" +         width="250" />          <spinner           decimal_digits="0"           follows="left|top" @@ -223,9 +256,9 @@           layout="topleft"           left="10"           name="auto_renew" -         top_pad="5" +         top_pad="15"           width="250" /> -    </panel> +     </panel>      </scroll_container>      <panel       follows="left|right|bottom" diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index 4e57b428bd..5147bb72d0 100644 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -100,17 +100,8 @@ background_visible="true"              expanded="true"              layout="topleft"              name="group_general_tab" -            title="General"> -               <scroll_container -                 color="DkGray2" -                 follows="all" -                 layout="topleft" -                 left="0" -                 name="profile_scroll" -                 opaque="true" -                 height="604" -                 width="304" -                 top="0"> +            title="General" +            fit_panel="false">                     <panel                        border="false"                        class="panel_group_general" @@ -121,24 +112,13 @@ background_visible="true"                        help_topic="group_general_tab"                        name="group_general_tab_panel"                        top="0" /> -			   </scroll_container>           </accordion_tab>           <accordion_tab              expanded="false"              layout="topleft"              name="group_roles_tab" -            title="Roles"> -               <scroll_container -                 color="DkGray2" -                 follows="all" -                 layout="topleft" -                 left="0" -                 name="profile_scroll" -                 opaque="true" -                 height="680" -                 width="304" -                 top="0"> - +            title="Roles" +            fit_panel="false">                  <panel                     border="false"                     class="panel_group_roles" @@ -148,24 +128,13 @@ background_visible="true"                     left="0"                     name="group_roles_tab_panel"                     top="0" /> -                </scroll_container>           </accordion_tab>           <accordion_tab              expanded="false"              layout="topleft"              name="group_notices_tab" -            title="Notices"> -               <scroll_container -                 color="DkGray2" -                 follows="all" -                 layout="topleft" -                 left="0" -                 name="profile_scroll" -                 opaque="true" -                 height="530" -                 width="304" -                 top="0"> - +            title="Notices" +            fit_panel="false">                  <panel                      border="false"                      class="panel_group_notices" @@ -176,24 +145,13 @@ background_visible="true"                      help_topic="group_notices_tab"                      name="group_notices_tab_panel"                      top="0" /> -               </scroll_container>           </accordion_tab>           <accordion_tab               expanded="false"               layout="topleft"               name="group_land_tab" -             title="Land/Assets"> -               <scroll_container -                 color="DkGray2" -                 follows="all" -                 layout="topleft" -                 left="0" -                 name="profile_scroll" -                 opaque="true" -                 height="500" -                 width="304" -                 top="0"> - +             title="Land/Assets" +             fit_panel="false">                   <panel  					 border="false"                       class="panel_group_land_money" @@ -203,7 +161,6 @@ background_visible="true"                       left="0"                       name="group_land_tab_panel"                       top="0" /> -               </scroll_container>           </accordion_tab>           </accordion>     </layout_panel> diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 540e17e413..0c57b99b68 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -222,7 +222,7 @@               top="10"               width="293"               wrap="true"> -                To add friends try [secondlife:///app/search/people global search] or use right-click on a user to add them as a friend. +                To add friends try [secondlife:///app/search/people global search] or use right-click on a Resident to add them as a friend.  If you're looking for people to hang out with, [secondlife:///app/worldmap try the Map].               </text>          </panel> diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml index d336e18011..3913b6d709 100644 --- a/indra/newview/skins/default/xui/en/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml @@ -59,7 +59,7 @@       left_delta="0"       name="owner_text"       top_pad="2" -     width="180"> +     width="80">          Estate owner:      </text>      <text @@ -198,7 +198,7 @@      <button       follows="left|top"       height="23" -     label="Kick User from Estate..." +     label="Kick Resident from Estate..."       layout="topleft"       left="50"       name="kick_user_from_estate_btn" diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml index c06e67a4bb..1bbe9d80c0 100644 --- a/indra/newview/skins/default/xui/en/panel_region_general.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general.xml @@ -205,7 +205,7 @@      <button       follows="left|top"       height="20" -     label="Teleport Home One User..." +     label="Teleport Home One Resident..."       layout="topleft"       left="10"       name="kick_btn" @@ -214,7 +214,7 @@      <button       follows="left|top"       height="20" -     label="Teleport Home All Users..." +     label="Teleport Home All Residents..."       layout="topleft"       left_delta="0"       name="kick_all_btn" diff --git a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml index 525c5aa8e7..ffa1a257d5 100644 --- a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml @@ -203,7 +203,7 @@     <button       follows="left|top"       height="20" -     label="Teleport Home One User..." +     label="Teleport Home One Resident..."       layout="topleft"       left="10"       name="kick_btn" @@ -212,7 +212,7 @@      <button       follows="left|top"       height="20" -     label="Teleport Home All Users..." +     label="Teleport Home All Residents..."       layout="topleft"       left_delta="0"       name="kick_all_btn" diff --git a/indra/newview/skins/default/xui/en/panel_region_texture.xml b/indra/newview/skins/default/xui/en/panel_region_texture.xml index 04dbf73be9..5d910ea659 100644 --- a/indra/newview/skins/default/xui/en/panel_region_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_region_texture.xml @@ -148,103 +148,33 @@       name="height_text_lbl6"       top="185"       width="100"> -        Southwest -    </text> -    <text -     follows="left|top" -     height="20" -     layout="topleft" -     left_pad="10" -     name="height_text_lbl7" -     top_delta="0" -     width="100">          Northwest      </text> -   <spinner -    follows="left|top" -    height="20" -    increment="0.5" -    label="Low" -    label_width="37" -    layout="topleft" -    left="10" -    max_val="500" -    min_val="-500" -    name="height_start_spin_0" -    top_delta="15" -    width="100" /> -  <spinner -   follows="left|top" -   height="20" -   increment="0.5" -   label="Low" -   label_width="37" -   layout="topleft" -   left_pad="10" -   max_val="500" -   min_val="-500" -   name="height_start_spin_1" -   top_delta="0" -   width="100" /> -  <spinner -   follows="left|top" -   height="20" -   increment="0.5" -   label="High" -   label_width="37" -   layout="topleft" -   left="10" -   max_val="500" -   min_val="-500" -   name="height_range_spin_0" -   top_delta="20" -   width="100" /> -  <spinner -   follows="left|top" -   height="20" -   increment="0.5" -   label="High" -   label_width="37" -   layout="topleft" -   left_pad="10" -   max_val="500" -   min_val="-500" -   name="height_range_spin_1" -   top_delta="0" -   width="100" /> -    <text -     follows="left|top" -     height="20" -     layout="topleft" -     left="51" -     name="height_text_lbl8" -     top_pad="10" -     width="100"> -        Southeast -    </text>      <text       follows="left|top"       height="20"       layout="topleft"       left_pad="10" -     name="height_text_lbl9" +     name="height_text_lbl7"       top_delta="0"       width="100">          Northeast      </text> -      <spinner -       follows="left|top" -       height="20" -       increment="0.5" -       label="Low" -       label_width="37" -       layout="topleft" -       left="10" -       max_val="500" -       min_val="-500" -       name="height_start_spin_2" -       top_delta="15" -       width="100" /> +<!--  northwest low--> +     <spinner +      follows="left|top" +      height="20" +      increment="0.5" +      label="Low" +      label_width="37" +      layout="topleft" +      left="10" +      max_val="500" +      min_val="-500" +      name="height_start_spin_1" +      top_delta="15" +      width="100" />   +<!--    northeast low-->        <spinner         follows="left|top"         height="20" @@ -258,20 +188,22 @@         name="height_start_spin_3"         top_delta="0"         width="100" /> -      <spinner -       follows="left|top" -       height="20" -       increment="0.5" -       label="High" -       label_width="37" -       layout="topleft" -       left="10" -       max_val="500" -       min_val="-500" -       name="height_range_spin_2" -       top_delta="20" -       width="100" /> -      <spinner +<!--  northwest high--> +     <spinner +      follows="left|top" +      height="20" +      increment="0.5" +      label="High" +      label_width="37" +      layout="topleft" +      left="10" +      max_val="500" +      min_val="-500" +      name="height_range_spin_1" +      top_delta="20" +      width="100" /> +<!--  northeast high--> +    <spinner         follows="left|top"         height="20"         increment="0.5" @@ -284,18 +216,94 @@         name="height_range_spin_3"         top_delta="0"         width="100" /> -      <text -       follows="left|top" -       height="20" -       layout="topleft" -       left="10" -       name="height_text_lbl10" -       top_delta="30" -       width="400" -       word_wrap="true"> -        These values represent the blend range for the textures above. -      </text> -      <text +    <text +     follows="left|top" +     height="20" +     layout="topleft" +     left="51" +     name="height_text_lbl8" +     top_pad="10" +     width="100"> +        Southwest +    </text> +    <text +     follows="left|top" +     height="20" +     layout="topleft" +     left_pad="10" +     name="height_text_lbl9" +     top_delta="0" +     width="100"> +        Southeast +    </text> +<!--  southwest low--> +    <spinner +     follows="left|top" +     height="20" +     increment="0.5" +     label="Low" +     label_width="37" +     layout="topleft" +     left="10" +     max_val="500" +     min_val="-500" +     name="height_start_spin_0" +     top_delta="15" +     width="100" /> +<!--  southeast low--> +    <spinner +     follows="left|top" +     height="20" +     increment="0.5" +     label="Low" +     label_width="37" +     layout="topleft" +     left_pad="10" +     max_val="500" +     min_val="-500" +     name="height_start_spin_2" +     top_delta="0" +     width="100" /> +<!--southwest high--> +    <spinner +     follows="left|top" +     height="20" +     increment="0.5" +     label="High" +     label_width="37" +     layout="topleft" +     left="10" +     max_val="500" +     min_val="-500" +     name="height_range_spin_0" +     top_delta="20" +     width="100" /> +<!--  southeast high--> +    <spinner +     follows="left|top" +     height="20" +     increment="0.5" +     label="High" +     label_width="37" +     layout="topleft" +     left_pad="10" +     max_val="500" +     min_val="-500" +     name="height_range_spin_2" +     top_delta="0" +     width="100" /> +    <text +     follows="left|top" +     height="20" +     layout="topleft" +     left="10" +     name="height_text_lbl10" +     top_delta="30" +     width="400" +     word_wrap="true"> +      These values represent the blend range for the textures above. +    </text> +    <text         follows="left|top"         height="20"         layout="topleft" diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml index d2c9e56bc3..6588663bac 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -549,5 +549,16 @@  		     name="buy_btn"  		     top="0"  		     width="100" /> +        <button +		     follows="bottom|left" +		     height="23" +		     label="Details" +		     layout="topleft" +		     left="5" +		     name="details_btn" +		     top="0" +		     width="100" +			 visible="false" /> +  	</panel>  </panel> diff --git a/indra/newview/skins/default/xui/en/teleport_strings.xml b/indra/newview/skins/default/xui/en/teleport_strings.xml index e8f6b1319a..bae821d3b5 100644 --- a/indra/newview/skins/default/xui/en/teleport_strings.xml +++ b/indra/newview/skins/default/xui/en/teleport_strings.xml @@ -61,6 +61,9 @@ Try again in a moment.  		<message name="completing">  			Completing teleport.  		</message> +		<message name="completed_from"> +			Teleport completed from [T_SLURL] +		</message>  		<message name="resolving">  			Resolving destination.  		</message> diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml index 63f08a4250..413ca1d1ef 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml @@ -24,7 +24,7 @@       follows="left|top|bottom"       height="20"       left="2" -     mouse_opaque="true" +     mouse_opaque="false"       name="adhoc_icon"       width="21" />      <chiclet_im_adhoc.unread_notifications | 
