diff options
56 files changed, 396 insertions, 212 deletions
| diff --git a/doc/contributions.txt b/doc/contributions.txt index 46286f99c1..0fb6110adb 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -213,6 +213,7 @@ Ansariel Hiller  	STORM-2141  	MAINT-6953  	MAINT-7028 +	MAINT-7059  Aralara Rajal  Arare Chantilly  	CHUIBUG-191 diff --git a/indra/llmessage/llavatarname.cpp b/indra/llmessage/llavatarname.cpp index d2115ee499..2e8886fb51 100644 --- a/indra/llmessage/llavatarname.cpp +++ b/indra/llmessage/llavatarname.cpp @@ -166,10 +166,10 @@ void LLAvatarName::setExpires(F64 expires)  	mExpires = LLFrameTimer::getTotalSeconds() + expires;  } -std::string LLAvatarName::getCompleteName(bool use_parentheses) const +std::string LLAvatarName::getCompleteName(bool use_parentheses, bool force_use_display_name) const  {  	std::string name; -	if (sUseDisplayNames) +	if (sUseDisplayNames || force_use_display_name)  	{  		if (mUsername.empty() || mIsDisplayNameDefault)  		{ @@ -215,9 +215,9 @@ std::string LLAvatarName::getLegacyName() const  	return name;  } -std::string LLAvatarName::getDisplayName() const +std::string LLAvatarName::getDisplayName(bool force_use_display_name) const  { -	if (sUseDisplayNames) +	if (sUseDisplayNames || force_use_display_name)  	{  		return mDisplayName;  	} diff --git a/indra/llmessage/llavatarname.h b/indra/llmessage/llavatarname.h index 192f43f07c..80b54cded9 100644 --- a/indra/llmessage/llavatarname.h +++ b/indra/llmessage/llavatarname.h @@ -65,7 +65,7 @@ public:  	// For normal names, returns "James Linden (james.linden)"  	// When display names are disabled returns just "James Linden" -	std::string getCompleteName(bool use_parentheses = true) const; +	std::string getCompleteName(bool use_parentheses = true, bool force_use_display_name = false) const;  	// Returns "James Linden" or "bobsmith123 Resident" for backwards  	// compatibility with systems like voice and muting @@ -75,7 +75,7 @@ public:  	// "José Sanchez" or "James Linden", UTF-8 encoded Unicode  	// Takes the display name preference into account. This is truly the name that should   	// be used for all UI where an avatar name has to be used unless we truly want something else (rare) -	std::string getDisplayName() const; +	std::string getDisplayName(bool force_use_display_name = false) const;  	// Returns "James Linden" or "bobsmith123 Resident"  	// Used where we explicitely prefer or need a non UTF-8 legacy (ASCII) name diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 848367f8a8..8425774d46 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -1736,6 +1736,7 @@ LLMenuGL::LLMenuGL(const LLMenuGL::Params& p)  	mJumpKey(p.jump_key),  	mCreateJumpKeys(p.create_jump_keys),  	mNeedsArrange(FALSE), +	mAlwaysShowMenu(FALSE),  	mResetScrollPositionOnShow(true),  	mShortcutPad(p.shortcut_pad)  { @@ -3223,20 +3224,23 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)  	menu->setVisible( TRUE ); -	//Do not show menu if all menu items are disabled -	BOOL item_enabled = false; -	for (LLView::child_list_t::const_iterator itor = menu->getChildList()->begin(); -			 itor != menu->getChildList()->end(); -			 ++itor) +	if(!menu->getAlwaysShowMenu())  	{ -		LLView *menu_item = (*itor); -		item_enabled = item_enabled || menu_item->getEnabled(); -	} +		//Do not show menu if all menu items are disabled +		BOOL item_enabled = false; +		for (LLView::child_list_t::const_iterator itor = menu->getChildList()->begin(); +				itor != menu->getChildList()->end(); +				++itor) +		{ +			LLView *menu_item = (*itor); +			item_enabled = item_enabled || menu_item->getEnabled(); +		} -	if(!item_enabled) -	{ -		menu->setVisible( FALSE ); -		return; +		if(!item_enabled) +		{ +			menu->setVisible( FALSE ); +			return; +		}  	}  	// Save click point for detecting cursor moves before mouse-up. diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index c7f7f6848c..69f7d21513 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -531,6 +531,9 @@ public:  	void resetScrollPositionOnShow(bool reset_scroll_pos) { mResetScrollPositionOnShow = reset_scroll_pos; }  	bool isScrollPositionOnShowReset() { return mResetScrollPositionOnShow; } +	void setAlwaysShowMenu(BOOL show) { mAlwaysShowMenu = show; } +	BOOL getAlwaysShowMenu() { return mAlwaysShowMenu; } +  	// add a context menu branch  	BOOL appendContextSubMenu(LLMenuGL *menu); @@ -572,6 +575,8 @@ private:  	static LLColor4 sDefaultBackgroundColor;  	static BOOL		sKeyboardMode; +	BOOL			mAlwaysShowMenu; +  	LLUIColor		mBackgroundColor;  	BOOL			mBgVisible;  	LLHandle<LLView> mParentMenuItem; diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp index 8cf72928ff..2c7e7ab13d 100644 --- a/indra/llui/llradiogroup.cpp +++ b/indra/llui/llradiogroup.cpp @@ -54,6 +54,7 @@ public:  	/*virtual*/ void setValue(const LLSD& value);  	/*virtual*/ BOOL postBuild(); +	/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);  	LLSD getPayload() { return mPayload; } @@ -224,6 +225,22 @@ BOOL LLRadioGroup::setSelectedIndex(S32 index, BOOL from_event)  	return TRUE;  } +void LLRadioGroup::focusSelectedRadioBtn() +{ +    if (mSelectedIndex >= 0) +    { +        LLRadioCtrl* radio_item = mRadioButtons[mSelectedIndex]; +        if (radio_item->hasTabStop() && radio_item->getEnabled()) +        { +            radio_item->focusFirstItem(FALSE, FALSE); +        } +    } +    else if (mRadioButtons[0]->hasTabStop() || hasTabStop()) +    { +        focusFirstItem(FALSE, FALSE); +    } +} +  BOOL LLRadioGroup::handleKeyHere(KEY key, MASK mask)  {  	BOOL handled = FALSE; @@ -283,19 +300,6 @@ BOOL LLRadioGroup::handleKeyHere(KEY key, MASK mask)  	return handled;  } -BOOL LLRadioGroup::handleMouseDown(S32 x, S32 y, MASK mask) -{ -	// grab focus preemptively, before child button takes mousecapture -	//  -	if (hasTabStop()) -	{ -		focusFirstItem(FALSE, FALSE); -	} - -	return LLUICtrl::handleMouseDown(x, y, mask); -} - -  // Handle one button being clicked.  All child buttons must have this  // function as their callback function. @@ -466,6 +470,29 @@ BOOL LLRadioCtrl::postBuild()  	return TRUE;  } +BOOL LLRadioCtrl::handleMouseDown(S32 x, S32 y, MASK mask) +{ +    // Grab focus preemptively, before button takes mousecapture +    if (hasTabStop() && getEnabled()) +    { +        focusFirstItem(FALSE, FALSE); +    } +    else +    { +        // Only currently selected item in group has tab stop as result it is +        // unclear how focus should behave on click, just let the group handle +        // focus and LLRadioGroup::onClickButton() will set correct state later +        // if needed +        LLRadioGroup* parent = (LLRadioGroup*)getParent(); +        if (parent) +        { +            parent->focusSelectedRadioBtn(); +        } +    } + +    return LLCheckBoxCtrl::handleMouseDown(x, y, mask); +} +  LLRadioCtrl::~LLRadioCtrl()  {  } diff --git a/indra/llui/llradiogroup.h b/indra/llui/llradiogroup.h index 8bd5698538..dcb2f43bfe 100644 --- a/indra/llui/llradiogroup.h +++ b/indra/llui/llradiogroup.h @@ -66,8 +66,6 @@ public:  	virtual BOOL postBuild(); -	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); -	  	virtual BOOL handleKeyHere(KEY key, MASK mask);  	void setIndexEnabled(S32 index, BOOL enabled); @@ -75,6 +73,8 @@ public:  	S32 getSelectedIndex() const { return mSelectedIndex; }  	// set the index value programatically  	BOOL setSelectedIndex(S32 index, BOOL from_event = FALSE); +	// foxus child by index if it can get focus +	void focusSelectedRadioBtn();  	// Accept and retrieve strings of the radio group control names  	virtual void	setValue(const LLSD& value ); diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index db8fdc46b7..1190c5bb94 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -648,7 +648,7 @@ bool LLScrollListCtrl::updateColumnWidths()  		S32 new_width = 0;  		if (column->mRelWidth >= 0)  		{ -			new_width = (S32)ll_round(column->mRelWidth*mItemListRect.getWidth()); +			new_width = (S32)ll_round(column->mRelWidth * (mItemListRect.getWidth() - mTotalStaticColumnWidth - mTotalColumnPadding));  		}  		else if (column->mDynamicWidth)  		{ @@ -2680,7 +2680,7 @@ void LLScrollListCtrl::addColumn(const LLScrollListColumn::Params& column_params  			}  			if (new_column->mRelWidth >= 0)  			{ -				new_column->setWidth((S32)ll_round(new_column->mRelWidth*mItemListRect.getWidth())); +				new_column->setWidth((S32)ll_round(new_column->mRelWidth * (mItemListRect.getWidth() - mTotalStaticColumnWidth - mTotalColumnPadding)));  			}  			else if(new_column->mDynamicWidth)  			{ diff --git a/indra/llui/llspellcheck.cpp b/indra/llui/llspellcheck.cpp index 0db4281059..5a52600337 100644 --- a/indra/llui/llspellcheck.cpp +++ b/indra/llui/llspellcheck.cpp @@ -161,6 +161,7 @@ void LLSpellChecker::refreshDictionaryMap()  	}  	// Load user installed dictionary information +	user_filename = user_path + DICT_FILE_USER;  	llifstream custom_file(user_filename.c_str(), std::ios::binary);  	if (custom_file.is_open())  	{ diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 701a06a085..1b2f09cff5 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -210,6 +210,7 @@ LLTabContainer::Params::Params()  	label_pad_left("label_pad_left"),  	tab_position("tab_position"),  	hide_tabs("hide_tabs", false), +	hide_scroll_arrows("hide_scroll_arrows", false),  	tab_padding_right("tab_padding_right"),  	first_tab("first_tab"),  	middle_tab("middle_tab"), @@ -240,6 +241,7 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p)  	mPrevArrowBtn(NULL),  	mNextArrowBtn(NULL),  	mIsVertical( p.tab_position == LEFT ), +	mHideScrollArrows(p.hide_scroll_arrows),  	// Horizontal Specific  	mJumpPrevArrowBtn(NULL),  	mJumpNextArrowBtn(NULL), @@ -409,7 +411,7 @@ void LLTabContainer::draw()  	setScrollPosPixels((S32)lerp((F32)getScrollPosPixels(), (F32)target_pixel_scroll, LLSmoothInterpolation::getInterpolant(0.08f))); -	BOOL has_scroll_arrows = !getTabsHidden() && ((mMaxScrollPos > 0) || (mScrollPosPixels > 0)); +	BOOL has_scroll_arrows = !mHideScrollArrows && !getTabsHidden() && ((mMaxScrollPos > 0) || (mScrollPosPixels > 0));  	if (!mIsVertical)  	{  		mJumpPrevArrowBtn->setVisible( has_scroll_arrows ); @@ -517,7 +519,7 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask )  {  	static LLUICachedControl<S32> tabcntrv_pad ("UITabCntrvPad", 0);  	BOOL handled = FALSE; -	BOOL has_scroll_arrows = (getMaxScrollPos() > 0) && !getTabsHidden(); +	BOOL has_scroll_arrows = !mHideScrollArrows && (getMaxScrollPos() > 0) && !getTabsHidden();  	if (has_scroll_arrows)  	{ @@ -591,7 +593,7 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask )  BOOL LLTabContainer::handleHover( S32 x, S32 y, MASK mask )  {  	BOOL handled = FALSE; -	BOOL has_scroll_arrows = (getMaxScrollPos() > 0) && !getTabsHidden(); +	BOOL has_scroll_arrows = !mHideScrollArrows && (getMaxScrollPos() > 0) && !getTabsHidden();  	if (has_scroll_arrows)  	{ @@ -633,7 +635,7 @@ BOOL LLTabContainer::handleHover( S32 x, S32 y, MASK mask )  BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask )  {  	BOOL handled = FALSE; -	BOOL has_scroll_arrows = (getMaxScrollPos() > 0)  && !getTabsHidden(); +	BOOL has_scroll_arrows = !mHideScrollArrows && (getMaxScrollPos() > 0)  && !getTabsHidden();  	S32 local_x = x - getRect().mLeft;  	S32 local_y = y - getRect().mBottom; @@ -701,7 +703,7 @@ BOOL LLTabContainer::handleToolTip( S32 x, S32 y, MASK mask)  	{  		LLTabTuple* firsttuple = getTab(0); -		BOOL has_scroll_arrows = (getMaxScrollPos() > 0); +		BOOL has_scroll_arrows = !mHideScrollArrows && (getMaxScrollPos() > 0);  		LLRect clip;  		if (mIsVertical)  		{ @@ -826,7 +828,7 @@ BOOL LLTabContainer::handleKeyHere(KEY key, MASK mask)  // virtual  BOOL LLTabContainer::handleDragAndDrop(S32 x, S32 y, MASK mask,	BOOL drop,	EDragAndDropType type, void* cargo_data, EAcceptance *accept, std::string	&tooltip)  { -	BOOL has_scroll_arrows = (getMaxScrollPos() > 0); +	BOOL has_scroll_arrows = !mHideScrollArrows && (getMaxScrollPos() > 0);  	if(mOpenTabsOnDragAndDrop && !getTabsHidden())  	{ @@ -1543,7 +1545,7 @@ BOOL LLTabContainer::setTab(S32 which)  						is_visible = FALSE;  					}  				} -				else if (getMaxScrollPos() > 0) +				else if (!mHideScrollArrows && getMaxScrollPos() > 0)  				{  					if( i < getScrollPos() )  					{ diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h index 057809dc42..4a5f08f5d3 100644 --- a/indra/llui/lltabcontainer.h +++ b/indra/llui/lltabcontainer.h @@ -83,6 +83,7 @@ public:  											label_pad_left;  		Optional<bool>						hide_tabs; +		Optional<bool>						hide_scroll_arrows;  		Optional<S32>						tab_padding_right;  		Optional<TabParams>					first_tab, @@ -262,6 +263,7 @@ private:  	S32								mCurrentTabIdx;  	BOOL							mTabsHidden; +	BOOL							mHideScrollArrows;  	BOOL							mScrolled;  	LLFrameTimer					mScrollTimer; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 20be739286..88a5c3a587 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1522,6 +1522,7 @@ void LLTextBase::reflow()  		}  		S32 line_height = 0; +		S32 seg_line_offset = line_count;  		while(seg_iter != mSegments.end())  		{ @@ -1534,7 +1535,8 @@ void LLTextBase::reflow()  			S32 character_count = segment->getNumChars(getWordWrap() ? llmax(0, remaining_pixels) : S32_MAX,  														seg_offset,   														cur_index - line_start_index,  -														S32_MAX); +														S32_MAX, +														line_count - seg_line_offset);  			S32 segment_width, segment_height;  			bool force_newline = segment->getDimensions(seg_offset, character_count, segment_width, segment_height); @@ -1597,6 +1599,7 @@ void LLTextBase::reflow()  				}  				++seg_iter;  				seg_offset = 0; +				seg_line_offset = force_newline ? line_count + 1 : line_count;  			}  			if (force_newline)   			{ @@ -3065,7 +3068,7 @@ LLTextSegment::~LLTextSegment()  bool LLTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const { width = 0; height = 0; return false;}  S32	LLTextSegment::getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const { return 0; } -S32	LLTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const { return 0; } +S32	LLTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const { return 0; }  void LLTextSegment::updateLayout(const LLTextBase& editor) {}  F32	LLTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect) { return draw_rect.mLeft; }  bool LLTextSegment::canEdit() const { return false; } @@ -3335,7 +3338,7 @@ S32	LLNormalTextSegment::getOffset(S32 segment_local_x_coord, S32 start_offset,  											   round);  } -S32	LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const +S32	LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const  {  	const LLWString &text = getWText(); @@ -3352,7 +3355,7 @@ S32	LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin  	// if no character yet displayed on this line, don't require word wrapping since  	// we can just move to the next line, otherwise insist on it so we make forward progress -	LLFontGL::EWordWrapStyle word_wrap_style = (line_offset == 0)  +	LLFontGL::EWordWrapStyle word_wrap_style = (line_offset == 0)  		? LLFontGL::WORD_BOUNDARY_IF_POSSIBLE   		: LLFontGL::ONLY_WORD_BOUNDARIES; @@ -3490,12 +3493,26 @@ LLInlineViewSegment::~LLInlineViewSegment()  bool LLInlineViewSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const  { -	if (first_char == 0 && num_chars == 0)  +	if (first_char == 0 && num_chars == 0)  	{ -		// we didn't fit on a line, the widget will fall on the next line -		// so dimensions here are 0 +		// We didn't fit on a line or were forced to new string +		// the widget will fall on the next line, so width here is 0  		width = 0; -		height = 0; + +		if (mForceNewLine) +		{ +			// Chat, string can't be smaller then font height even if it is empty +			LLStyleSP s(new LLStyle(LLStyle::Params().visible(true))); +			height = s->getFont()->getLineHeight(); + +			return true; // new line +		} +		else +		{ +			// height from previous segment in same string will be used, word-wrap +			height = 0; +		} +  	}  	else  	{ @@ -3506,13 +3523,16 @@ bool LLInlineViewSegment::getDimensions(S32 first_char, S32 num_chars, S32& widt  	return false;  } -S32	LLInlineViewSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const +S32	LLInlineViewSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const  {  	// if putting a widget anywhere but at the beginning of a line  	// and the widget doesn't fit or mForceNewLine is true  	// then return 0 chars for that line, and all characters for the next -	if (line_offset != 0  -		&& (mForceNewLine || num_pixels < mView->getRect().getWidth()))  +	if (mForceNewLine && line_ind == 0) +	{ +		return 0; +	} +	else if (line_offset != 0 && num_pixels < mView->getRect().getWidth())  	{  		return 0;  	} @@ -3565,7 +3585,7 @@ bool LLLineBreakTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& w  	return true;  } -S32	LLLineBreakTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const +S32	LLLineBreakTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const  {  	return 1;  } @@ -3601,7 +3621,7 @@ bool LLImageTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width  	return false;  } -S32	 LLImageTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const +S32	 LLImageTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const  {  	LLUIImagePtr image = mStyle->getImage(); diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 3d3a6ca869..c7b6203445 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -64,7 +64,19 @@ public:  	virtual bool				getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const;  	virtual S32					getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const; -	virtual S32					getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const; + +	/** +	* Get number of chars that fit into free part of current line. +	* +	* @param num_pixels - maximum width of rect +	* @param segment_offset - symbol in segment we start processing line from +	* @param line_offset - symbol in line after which segment starts +	* @param max_chars - limit of symbols that will fit in current line +	* @param line_ind - index of not word-wrapped string inside segment for multi-line segments. +	* Two string separated by word-wrap will have same index. +	* @return number of chars that will fit into current line +	*/ +	virtual S32					getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const;  	virtual void				updateLayout(const class LLTextBase& editor);  	virtual F32					draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);  	virtual bool				canEdit() const; @@ -116,7 +128,7 @@ public:  	/*virtual*/ bool				getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const;  	/*virtual*/ S32					getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const; -	/*virtual*/ S32					getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const; +	/*virtual*/ S32					getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const;  	/*virtual*/ F32					draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);  	/*virtual*/ bool				canEdit() const { return true; }  	/*virtual*/ const LLColor4&		getColor() const					{ return mStyle->getColor(); } @@ -201,7 +213,7 @@ public:  	LLInlineViewSegment(const Params& p, S32 start, S32 end);  	~LLInlineViewSegment();  	/*virtual*/ bool		getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const; -	/*virtual*/ S32			getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const; +	/*virtual*/ S32			getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const;  	/*virtual*/ void		updateLayout(const class LLTextBase& editor);  	/*virtual*/ F32			draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);  	/*virtual*/ bool		canEdit() const { return false; } @@ -225,7 +237,7 @@ public:  	LLLineBreakTextSegment(S32 pos);  	~LLLineBreakTextSegment();  	bool		getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const; -	S32			getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const; +	S32			getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const;  	F32			draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);  private: @@ -238,7 +250,7 @@ public:  	LLImageTextSegment(LLStyleConstSP style,S32 pos,class LLTextBase& editor);  	~LLImageTextSegment();  	bool		getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const; -	S32			getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const; +	S32			getNumChars(S32 num_pixels, S32 segment_offset, S32 char_offset, S32 max_chars, S32 line_ind) const;  	F32			draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);  	/*virtual*/ BOOL	handleToolTip(S32 x, S32 y, MASK mask); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index b5a31f5118..05b7a4a9e9 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -764,7 +764,7 @@ LLUrlEntryAgentCompleteName::LLUrlEntryAgentCompleteName()  std::string LLUrlEntryAgentCompleteName::getName(const LLAvatarName& avatar_name)  { -	return avatar_name.getCompleteName(); +	return avatar_name.getCompleteName(true, true);  }  // @@ -780,7 +780,7 @@ LLUrlEntryAgentDisplayName::LLUrlEntryAgentDisplayName()  std::string LLUrlEntryAgentDisplayName::getName(const LLAvatarName& avatar_name)  { -	return avatar_name.getDisplayName(); +	return avatar_name.getDisplayName(true);  }  // diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 9f37c3487e..717deba8c7 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1608,18 +1608,6 @@      <real>60.0</real>    </map> -  <key>CameraAspectRatio</key> -  <map> -    <key>Comment</key> -    <string>Camera aspect ratio for DoF effect</string> -    <key>Persist</key> -    <integer>1</integer> -    <key>Type</key> -    <string>F32</string> -    <key>Value</key> -    <real>1.5</real> -  </map> -    <key>CertStore</key>      <map>        <key>Comment</key> @@ -5388,7 +5376,7 @@      <key>LeftClickShowMenu</key>      <map>        <key>Comment</key> -      <string>Left click opens pie menu (FALSE = left click touches or grabs object)</string> +      <string>Unused obsolete setting</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -11824,6 +11812,17 @@        <key>Value</key>        <integer>75</integer>      </map> +    <key>AbuseReportScreenshotDelay</key> +    <map> +      <key>Comment</key> +      <string>Time delay before taking screenshot to avoid UI artifacts.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.3</real> +    </map>      <key>SpeedTest</key>      <map>        <key>Comment</key> @@ -14744,6 +14743,7 @@  	      <string>snapshot</string>  	      <string>postcard</string>  	      <string>mini_map</string> +	      <string>beacons</string>        </array>      </map>      <key>LandmarksSortedByDate</key> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index cfb09d329b..7d0d39e22a 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -2050,7 +2050,10 @@ void LLAgent::endAnimationUpdateUI()  			{  				skip_list.insert(LLFloaterReg::findInstance("mini_map"));  			} - +			if (LLFloaterReg::findInstance("beacons")) +			{ +				skip_list.insert(LLFloaterReg::findInstance("beacons")); +			}  			LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");  			LLFloaterIMContainer::floater_list_t conversations;  			im_box->getDetachedConversationFloaters(conversations); @@ -2172,6 +2175,7 @@ void LLAgent::endAnimationUpdateUI()  #else // Use this for now  		LLFloaterView::skip_list_t skip_list;  		skip_list.insert(LLFloaterReg::findInstance("mini_map")); +		skip_list.insert(LLFloaterReg::findInstance("beacons"));  		gFloaterView->pushVisibleAll(FALSE, skip_list);  #endif diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index fc4be98fbd..046e829070 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1227,11 +1227,12 @@ void LLWearableHoldingPattern::onWearableAssetFetch(LLViewerWearable *wearable)  		return;  	} +	U32 use_count = 0;  	for (LLWearableHoldingPattern::found_list_t::iterator iter = getFoundList().begin(); -		 iter != getFoundList().end(); ++iter) +		iter != getFoundList().end(); ++iter)  	{  		LLFoundData& data = *iter; -		if(wearable->getAssetID() == data.mAssetID) +		if (wearable->getAssetID() == data.mAssetID)  		{  			// Failing this means inventory or asset server are corrupted in a way we don't handle.  			if ((data.mWearableType >= LLWearableType::WT_COUNT) || (wearable->getType() != data.mWearableType)) @@ -1240,9 +1241,45 @@ void LLWearableHoldingPattern::onWearableAssetFetch(LLViewerWearable *wearable)  				break;  			} -			data.mWearable = wearable; +			if (use_count == 0) +			{ +				data.mWearable = wearable; +				use_count++; +			} +			else if (wearable->getPermissions().allowModifyBy(gAgent.getID())) +			{ +				// We can't edit and do some other interactions with same asset twice, copy it +				LLViewerWearable* new_wearable = LLWearableList::instance().createCopy(wearable, wearable->getName()); +				data.mWearable = new_wearable; +				data.mAssetID = new_wearable->getAssetID(); + +				LLViewerInventoryItem* item = gInventory.getItem(data.mItemID); +				if (item) +				{ +					// Update existing inventory item +					item->setAssetUUID(new_wearable->getAssetID()); +					item->setTransactionID(new_wearable->getTransactionID()); +					gInventory.updateItem(item, LLInventoryObserver::INTERNAL); +					item->updateServer(FALSE); +				} +				use_count++; +			} +			else +			{ +				// Note: technically a bug, LLViewerWearable can identify only one item id at a time, +				// yet we are tying it to multiple items here. +				// LLViewerWearable need to support more then one item. +				LL_WARNS() << "Same LLViewerWearable is used by multiple items! " << wearable->getAssetID() << LL_ENDL; +				data.mWearable = wearable; +			}  		}  	} + +	if (use_count > 1) +	{ +		LL_WARNS() << "Copying wearable, multiple asset id uses! " << wearable->getAssetID() << LL_ENDL; +		gInventory.notifyObservers(); +	}  }  static void onWearableAssetFetch(LLViewerWearable* wearable, void* data) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index d0c7d0b72e..038a8e3ff3 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1235,7 +1235,8 @@ bool LLAppViewer::init()          boost::bind(&LLControlGroup::getU32, boost::ref(gSavedSettings), _1),          boost::bind(&LLControlGroup::declareU32, boost::ref(gSavedSettings), _1, _2, _3, LLControlVariable::PERSIST_ALWAYS)); -	showReleaseNotesIfRequired(); +	// TODO: consider moving proxy initialization here or LLCopocedureManager after proxy initialization, may be implement +	// some other protection to make sure we don't use network before initializng proxy  	/*----------------------------------------------------------------------*/  	// nat 2016-06-29 moved the following here from the former mainLoop(). @@ -5869,21 +5870,6 @@ void LLAppViewer::launchUpdater()  	// LLAppViewer::instance()->forceQuit();  } -/** -* Check if user is running a new version of the viewer. -* Display the Release Notes if it's not overriden by the "UpdaterShowReleaseNotes" setting. -*/ -void LLAppViewer::showReleaseNotesIfRequired() -{ -	if (LLVersionInfo::getChannelAndVersion() != gLastRunVersion -		&& gSavedSettings.getBOOL("UpdaterShowReleaseNotes") -		&& !gSavedSettings.getBOOL("FirstLoginThisInstall")) -	{ -		LLSD info(getViewerInfo()); -		LLWeb::loadURLInternal(info["VIEWER_RELEASE_NOTES_URL"]); -	} -} -  //virtual  void LLAppViewer::setMasterSystemAudioMute(bool mute)  { diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 948d316009..7bb3c32c51 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -255,8 +255,6 @@ private:      void sendLogoutRequest();      void disconnectViewer(); -	void showReleaseNotesIfRequired(); -	  	// *FIX: the app viewer class should be some sort of singleton, no?  	// Perhaps its child class is the singleton and this should be an abstract base.  	static LLAppViewer* sInstance;  diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index f0331f20d8..314b859cea 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -63,10 +63,10 @@ public:  	{   		return start_offset;  	} -	/*virtual*/ S32		getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const  +	/*virtual*/ S32		getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const  	{   		// require full line to ourselves -		if (line_offset == 0)  +		if (line_offset == 0)  		{  			// print all our text  			return getEnd() - getStart();  diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 7039e48e74..7007c58b3c 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -1505,15 +1505,21 @@ bool LLFloaterIMContainer::checkContextMenuItem(const std::string& item, uuid_ve  bool LLFloaterIMContainer::visibleContextMenuItem(const LLSD& userdata)  { +	const LLConversationItem *conversation_item = getCurSelectedViewModelItem(); +	if(!conversation_item) +	{ +		return false; +	} +  	const std::string& item = userdata.asString();  	if ("show_mute" == item)  	{ -		return !isMuted(getCurSelectedViewModelItem()->getUUID()); +		return !isMuted(conversation_item->getUUID());  	}  	else if ("show_unmute" == item)  	{ -		return isMuted(getCurSelectedViewModelItem()->getUUID()); +		return isMuted(conversation_item->getUUID());  	}  	return true; diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 7f952d4dd4..a340cd1143 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2029,7 +2029,6 @@ void LLPanelLandOptions::refresh()  	else  	{  		// something selected, hooray! -		LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion();  		// Display options  		BOOL can_change_options = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_OPTIONS); @@ -2045,9 +2044,8 @@ void LLPanelLandOptions::refresh()  		mCheckGroupObjectEntry	->set( parcel->getAllowGroupObjectEntry() ||  parcel->getAllowAllObjectEntry());  		mCheckGroupObjectEntry	->setEnabled( can_change_options && !parcel->getAllowAllObjectEntry() ); -		BOOL region_damage = regionp ? regionp->getAllowDamage() : FALSE;  		mCheckSafe			->set( !parcel->getAllowDamage() ); -		mCheckSafe			->setEnabled( can_change_options && region_damage ); +		mCheckSafe			->setEnabled( can_change_options );  		mCheckFly			->set( parcel->getAllowFly() );  		mCheckFly			->setEnabled( can_change_options ); @@ -2127,6 +2125,7 @@ void LLPanelLandOptions::refresh()  			// they can see the checkbox, but its disposition depends on the   			// state of the region +			LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion();  			if (regionp)  			{  				if (regionp->getSimAccess() == SIM_ACCESS_PG) @@ -2448,6 +2447,7 @@ void LLPanelLandAccess::refresh()  			mListAccess->deleteAllItems();  			S32 count = parcel->mAccessList.size();  			getChild<LLUICtrl>("AllowedText")->setTextArg("[COUNT]", llformat("%d",count)); +			getChild<LLUICtrl>("AllowedText")->setTextArg("[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));  			getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",count));  			getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",PARCEL_MAX_ACCESS_LIST)); @@ -2495,6 +2495,7 @@ void LLPanelLandAccess::refresh()  			mListBanned->deleteAllItems();  			S32 count = parcel->mBanList.size();  			getChild<LLUICtrl>("BanCheck")->setTextArg("[COUNT]", llformat("%d",count)); +			getChild<LLUICtrl>("BanCheck")->setTextArg("[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));  			getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",count));  			getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",PARCEL_MAX_ACCESS_LIST)); diff --git a/indra/newview/llfloaterpathfindingobjects.cpp b/indra/newview/llfloaterpathfindingobjects.cpp index f6ff83eaf4..5cf16f3ad6 100644 --- a/indra/newview/llfloaterpathfindingobjects.cpp +++ b/indra/newview/llfloaterpathfindingobjects.cpp @@ -329,7 +329,7 @@ void LLFloaterPathfindingObjects::handleUpdateObjectList(LLPathfindingManager::r  	}  } -void LLFloaterPathfindingObjects::rebuildObjectsScrollList() +void LLFloaterPathfindingObjects::rebuildObjectsScrollList(bool update_if_needed)  {  	if (!mHasObjectsToBeSelected)  	{ @@ -355,7 +355,14 @@ void LLFloaterPathfindingObjects::rebuildObjectsScrollList()  	{  		buildObjectsScrollList(mObjectList); -		mObjectsScrollList->selectMultiple(mObjectsToBeSelected); +		if(mObjectsScrollList->selectMultiple(mObjectsToBeSelected) == 0) +		{ +			if(update_if_needed && mRefreshListButton->getEnabled()) +			{ +				requestGetObjects(); +				return; +			} +		}  		if (mHasObjectsToBeSelected)  		{  			mObjectsScrollList->scrollToShowSelected(); @@ -484,7 +491,7 @@ void LLFloaterPathfindingObjects::showFloaterWithSelectionObjects()  	}  	else  	{ -		rebuildObjectsScrollList(); +		rebuildObjectsScrollList(true);  		if (isMinimized())  		{  			setMinimized(FALSE); diff --git a/indra/newview/llfloaterpathfindingobjects.h b/indra/newview/llfloaterpathfindingobjects.h index 4024e15fd6..752f741959 100644 --- a/indra/newview/llfloaterpathfindingobjects.h +++ b/indra/newview/llfloaterpathfindingobjects.h @@ -80,7 +80,7 @@ protected:  	void                               handleNewObjectList(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::ERequestStatus pRequestStatus, LLPathfindingObjectListPtr pObjectList);  	void                               handleUpdateObjectList(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::ERequestStatus pRequestStatus, LLPathfindingObjectListPtr pObjectList); -	void                               rebuildObjectsScrollList(); +	void                               rebuildObjectsScrollList(bool update_if_needed = false);  	virtual void                       buildObjectsScrollList(const LLPathfindingObjectListPtr pObjectListPtr);  	void                               addObjectToScrollList(const LLPathfindingObjectPtr pObjectPr, const LLSD &pScrollListItemData); diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 275554540e..515c2b0c4b 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -35,6 +35,7 @@  #include "llassetstorage.h"  #include "llavatarnamecache.h"  #include "llcachename.h" +#include "llcallbacklist.h"  #include "llcheckboxctrl.h"  #include "llfontgl.h"  #include "llimagebmp.h" @@ -211,7 +212,7 @@ BOOL LLFloaterReporter::postBuild()  	// grab the user's name  	std::string reporter = LLSLURL("agent", gAgent.getID(), "inspect").getSLURLString();  	getChild<LLUICtrl>("reporter_field")->setValue(reporter); -	 +  	center();  	return TRUE; @@ -837,8 +838,9 @@ void LLFloaterReporter::takeScreenshot(bool use_prev_screenshot)  	}  } -void LLFloaterReporter::onOpen(const LLSD& key) +void LLFloaterReporter::takeNewSnapshot()  { +	childSetEnabled("send_btn", true);  	mImageRaw = new LLImageRaw;  	const S32 IMAGE_WIDTH = 1024;  	const S32 IMAGE_HEIGHT = 768; @@ -867,10 +869,18 @@ void LLFloaterReporter::onOpen(const LLSD& key)  			}  		}  	} -  	takeScreenshot();  } + +void LLFloaterReporter::onOpen(const LLSD& key) +{ +	childSetEnabled("send_btn", false); +	//Time delay to avoid UI artifacts. MAINT-7067 +	doAfterInterval(boost::bind(&LLFloaterReporter::takeNewSnapshot,this), gSavedSettings.getF32("AbuseReportScreenshotDelay")); + +} +  void LLFloaterReporter::onLoadScreenshotDialog(const LLSD& notification, const LLSD& response)  {  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h index e5232268c0..decc01be98 100644 --- a/indra/newview/llfloaterreporter.h +++ b/indra/newview/llfloaterreporter.h @@ -107,6 +107,8 @@ public:  	void onLoadScreenshotDialog(const LLSD& notification, const LLSD& response); +	void takeNewSnapshot(); +  private:  	static void show(const LLUUID& object_id, const std::string& avatar_name = LLStringUtil::null, const LLUUID& experience_id = LLUUID::null); diff --git a/indra/newview/llfloaterscriptdebug.cpp b/indra/newview/llfloaterscriptdebug.cpp index 6c17f62c1e..5f4bc9d301 100644 --- a/indra/newview/llfloaterscriptdebug.cpp +++ b/indra/newview/llfloaterscriptdebug.cpp @@ -34,6 +34,7 @@  #include "llrect.h"  #include "llerror.h"  #include "llstring.h" +#include "llvoavatarself.h"  #include "message.h"  // project include @@ -105,7 +106,14 @@ void LLFloaterScriptDebug::addScriptLine(const std::string &utf8mesg, const std:  	if (objectp)  	{ -		objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", FTT_LOCAL_FILE, TRUE, LLGLTexture::BOOST_UI)); +		if(objectp->isHUDAttachment()) +		{ +			((LLViewerObject*)gAgentAvatarp)->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", FTT_LOCAL_FILE, TRUE, LLGLTexture::BOOST_UI)); +		} +		else +		{ +			objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", FTT_LOCAL_FILE, TRUE, LLGLTexture::BOOST_UI)); +		}  		floater_label = llformat("%s(%.0f, %.0f, %.0f)",  						user_name.c_str(),  						objectp->getPositionRegion().mV[VX], diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index c67feb8158..c0bd9b1c23 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -546,7 +546,7 @@ void LLFloaterWorldMap::trackAvatar( const LLUUID& avatar_id, const std::string&  		// convenience.  		if(gAgent.isGodlike())  		{ -			getChild<LLUICtrl>("spin z")->setValue(LLSD(200.f)); +			getChild<LLUICtrl>("teleport_coordinate_z")->setValue(LLSD(200.f));  		}  		// Don't re-request info if we already have it or we won't have it in time to teleport  		if (mTrackedStatus != LLTracker::TRACKING_AVATAR || name != mTrackedAvatarName) @@ -1375,7 +1375,7 @@ void LLFloaterWorldMap::teleport()  		&& av_tracker.haveTrackingInfo() )  	{  		pos_global = av_tracker.getGlobalPos(); -		pos_global.mdV[VZ] = getChild<LLUICtrl>("spin z")->getValue(); +		pos_global.mdV[VZ] = getChild<LLUICtrl>("teleport_coordinate_z")->getValue();  	}  	else if ( LLTracker::TRACKING_LANDMARK == tracking_status)  	{ diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 2405c3a1a3..5b797a3f25 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -2703,7 +2703,7 @@ void LLIMMgr::addMessage(  		// Logically it would make more sense to reject the session sooner, in another area of the  		// code, but the session has to be established inside the server before it can be left. -		if (LLMuteList::getInstance()->isMuted(other_participant_id) && !from_linden) +		if (LLMuteList::getInstance()->isMuted(other_participant_id, LLMute::flagTextChat) && !from_linden)  		{  			LL_WARNS() << "Leaving IM session from initiating muted resident " << from << LL_ENDL;  			if(!gIMMgr->leaveSession(new_session_id)) diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index e995c138b4..1433ea36bf 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -40,6 +40,7 @@  #include "llinventorybridge.h"  #include "llviewerfoldertype.h"  #include "llradiogroup.h" +#include "llstartup.h"  // linden library includes  #include "llclipboard.h" @@ -132,8 +133,10 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const  	}  	// when applying a filter, matching folders get their contents downloaded first +	// but make sure we are not interfering with pre-download  	if (isNotDefault() -		&& !gInventory.isCategoryComplete(folder_id)) +		&& !gInventory.isCategoryComplete(folder_id) +		&& LLStartUp::getStartupState() > STATE_WEARABLES_WAIT)  	{  		LLInventoryModelBackgroundFetch::instance().start(folder_id);  	} @@ -307,7 +310,11 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent  			if (is_hidden_if_empty)  			{  				// Force the fetching of those folders so they are hidden if they really are empty... -				gInventory.fetchDescendentsOf(object_id); +				// But don't interfere with startup download +				if (LLStartUp::getStartupState() > STATE_WEARABLES_WAIT) +				{ +					gInventory.fetchDescendentsOf(object_id); +				}  				LLInventoryModel::cat_array_t* cat_array = NULL;  				LLInventoryModel::item_array_t* item_array = NULL; diff --git a/indra/newview/llloginhandler.cpp b/indra/newview/llloginhandler.cpp index 39f3c0f113..eca34c0d4d 100644 --- a/indra/newview/llloginhandler.cpp +++ b/indra/newview/llloginhandler.cpp @@ -168,7 +168,6 @@ LLPointer<LLCredential> LLLoginHandler::loadSavedUserLoginInfo()  		authenticator["algorithm"] = "md5";  		authenticator["secret"] = md5pass;  		// yuck, we'll fix this with mani's changes. -		gSavedSettings.setBOOL("AutoLogin", TRUE);  		return gSecAPIHandler->createCredential(LLGridManager::getInstance()->getGrid(),   													   identifier, authenticator);  	} diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 5d43c38612..ed942fc7fc 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -304,7 +304,11 @@ BOOL LLPanelPlaces::postBuild()  	enable_registrar.add("Places.OverflowMenu.Enable",  boost::bind(&LLPanelPlaces::onOverflowMenuItemEnable, this, _2));  	mPlaceMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_place.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); -	if (!mPlaceMenu) +	if (mPlaceMenu) +	{ +		mPlaceMenu->setAlwaysShowMenu(TRUE); +	} +	else  	{  		LL_WARNS() << "Error loading Place menu" << LL_ENDL;  	} @@ -1006,7 +1010,7 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)  			 mPlaceInfoType == LANDMARK_TAB_INFO_TYPE)  	{  		mLandmarkInfo->setVisible(visible); - +		mPlaceProfile->setVisible(FALSE);  		if (visible)  		{  			mLandmarkInfo->resetLocation(); @@ -1014,8 +1018,6 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)  			LLRect rect = getRect();  			LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom);  			mLandmarkInfo->reshape(new_rect.getWidth(), new_rect.getHeight()); - -			mPlaceProfile->setVisible(FALSE);  		}  		else  		{ diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 0bcd8a9e63..5f413fc3c0 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -566,11 +566,16 @@ void LLPanelPrimMediaControls::updateShape()  			}  		} -		// MAINT-1392 If this is a HUD always set it visible, but hide each control if user has no perms. -		// When setting it invisible it won't receive any mouse messages anymore +		// Web plugins and HUD may have media controls invisible for user, but still need scroll mouse events. +		// LLView checks for visibleEnabledAndContains() and won't pass events to invisible panel, so instead +		// of hiding whole panel hide each control instead (if user has no perms). +		// Note: It might be beneficial to keep panel visible for all plugins to make behavior consistent, but  +		// for now limiting change to cases that need events. -		if( !is_hud ) +		if (!is_hud && (!media_plugin || media_plugin->pluginSupportsMediaTime())) +		{  			setVisible(enabled); +		}  		else  		{  			if( !hasPermsControl ) diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index a32ed258f8..3e95811bb8 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -421,6 +421,7 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLViewerWearab  	{  		// Save changes if closing.  		mEditWearable->saveChanges(); +		mEditWearable->setWearable(NULL);  		LLAppearanceMgr::getInstance()->updateIsDirty();  		if (change_state)  		{ diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 1bb3d65e05..5459ddc439 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -256,6 +256,7 @@ boost::scoped_ptr<LLViewerStats::PhaseMap> LLStartUp::sPhases(new LLViewerStats:  void login_show();  void login_callback(S32 option, void* userdata); +void show_release_notes_if_required();  void show_first_run_dialog();  bool first_run_dialog_callback(const LLSD& notification, const LLSD& response);  void set_startup_status(const F32 frac, const std::string& string, const std::string& msg); @@ -682,10 +683,17 @@ bool idle_startup()  		}  		else if (gSavedSettings.getBOOL("AutoLogin"))    		{ +			// Log into last account  			gRememberPassword = TRUE;  			gSavedSettings.setBOOL("RememberPassword", TRUE);                                                        			show_connect_box = false;    			  		} +		else if (gSavedSettings.getLLSD("UserLoginInfo").size() == 3) +		{ +			// Console provided login&password +			gRememberPassword = gSavedSettings.getBOOL("RememberPassword"); +			show_connect_box = false; +		}  		else   		{  			gRememberPassword = gSavedSettings.getBOOL("RememberPassword"); @@ -709,6 +717,7 @@ bool idle_startup()  		set_startup_status(0.03f, msg.c_str(), gAgent.mMOTD.c_str());  		display_startup();  		// LLViewerMedia::initBrowser(); +		show_release_notes_if_required();  		LLStartUp::setStartupState( STATE_LOGIN_SHOW );  		return FALSE;  	} @@ -2247,6 +2256,22 @@ void login_callback(S32 option, void *userdata)  	}  } +/** +* Check if user is running a new version of the viewer. +* Display the Release Notes if it's not overriden by the "UpdaterShowReleaseNotes" setting. +*/ +void show_release_notes_if_required() +{ +    if (LLVersionInfo::getChannelAndVersion() != gLastRunVersion +        && LLVersionInfo::getChannel() != "Second Life Test" // don't show Release Notes for the test builds +        && gSavedSettings.getBOOL("UpdaterShowReleaseNotes") +        && !gSavedSettings.getBOOL("FirstLoginThisInstall")) +    { +        LLSD info(LLAppViewer::instance()->getViewerInfo()); +        LLWeb::loadURLInternal(info["VIEWER_RELEASE_NOTES_URL"]); +    } +} +  void show_first_run_dialog()  {  	LLNotificationsUtil::add("FirstRun", LLSD(), LLSD(), first_run_dialog_callback); diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index e17651dc91..e79ce55854 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -338,56 +338,41 @@ BOOL LLToolPie::handleLeftClickPick()  	// If left-click never selects or spawns a menu  	// Eat the event. -	if (!gSavedSettings.getBOOL("LeftClickShowMenu")) + +	// mouse already released +	if (!mMouseButtonDown)  	{ -		// mouse already released -		if (!mMouseButtonDown) -		{ -			return true; -		} +		return true; +	} -		while( object && object->isAttachment() && !object->flagHandleTouch()) +	while (object && object->isAttachment() && !object->flagHandleTouch()) +	{ +		// don't pick avatar through hud attachment +		if (object->isHUDAttachment())  		{ -			// don't pick avatar through hud attachment -			if (object->isHUDAttachment()) -			{ -				break; -			} -			object = (LLViewerObject*)object->getParent(); +			break;  		} -		if (object && object == gAgentAvatarp && !gSavedSettings.getBOOL("ClickToWalk")) -		{ -			// we left clicked on avatar, switch to focus mode -			mMouseButtonDown = false; -			LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance()); -			gViewerWindow->hideCursor(); -			LLToolCamera::getInstance()->setMouseCapture(TRUE); -			LLToolCamera::getInstance()->pickCallback(mPick); -			gAgentCamera.setFocusOnAvatar(TRUE, TRUE); +		object = (LLViewerObject*)object->getParent(); +	} +	if (object && object == gAgentAvatarp && !gSavedSettings.getBOOL("ClickToWalk")) +	{ +		// we left clicked on avatar, switch to focus mode +		mMouseButtonDown = false; +		LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance()); +		gViewerWindow->hideCursor(); +		LLToolCamera::getInstance()->setMouseCapture(TRUE); +		LLToolCamera::getInstance()->pickCallback(mPick); +		gAgentCamera.setFocusOnAvatar(TRUE, TRUE); -			return TRUE; -		} +		return TRUE; +	}  	//////////  	//	// Could be first left-click on nothing  	//	LLFirstUse::useLeftClickNoHit();  	///////// -		 -		// Eat the event -		return LLTool::handleMouseDown(x, y, mask); -	} - -	if (gAgent.leftButtonGrabbed()) -	{ -		// if the left button is grabbed, don't put up the pie menu -		return LLTool::handleMouseDown(x, y, mask); -	} - -	// Can't ignore children here. -	LLToolSelect::handleObjectSelection(mPick, FALSE, TRUE); -	// Spawn pie menu -	LLTool::handleRightMouseDown(x, y, mask); -	return TRUE; +	// Eat the event +	return LLTool::handleMouseDown(x, y, mask);  }  BOOL LLToolPie::useClickAction(MASK mask,  diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index db71849659..7c1921b143 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -507,7 +507,7 @@ bool handleVelocityInterpolate(const LLSD& newvalue)  bool handleForceShowGrid(const LLSD& newvalue)  { -	LLPanelLogin::updateServer( ); +	LLPanelLogin::updateLocationSelectorsVisibility();  	return true;  } diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index dddfb6745e..2a126c9f01 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -706,7 +706,7 @@ bool LLViewerParcelMgr::allowAgentScripts(const LLViewerRegion* region, const LL  bool LLViewerParcelMgr::allowAgentDamage(const LLViewerRegion* region, const LLParcel* parcel) const  {  	return (region && region->getAllowDamage()) -		&& (parcel && parcel->getAllowDamage()); +		|| (parcel && parcel->getAllowDamage());  }  BOOL LLViewerParcelMgr::isOwnedAt(const LLVector3d& pos_global) const diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 09cdfe1309..9e09971ced 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -191,7 +191,7 @@ public:  		return false;  	} -	/*virtual*/ S32				getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const  +	/*virtual*/ S32				getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const  	{  		// always draw at beginning of line  		if (line_offset == 0) @@ -1105,10 +1105,6 @@ BOOL LLViewerTextEditor::openEmbeddedItem(LLPointer<LLInventoryItem> item, llwch  			openEmbeddedSound( item, wc );  			return TRUE; -		case LLAssetType::AT_NOTECARD: -			openEmbeddedNotecard( item, wc ); -			return TRUE; -  		case LLAssetType::AT_LANDMARK:  			openEmbeddedLandmark( item, wc );  			return TRUE; @@ -1117,6 +1113,7 @@ BOOL LLViewerTextEditor::openEmbeddedItem(LLPointer<LLInventoryItem> item, llwch  			openEmbeddedCallingcard( item, wc );  			return TRUE; +		case LLAssetType::AT_NOTECARD:  		case LLAssetType::AT_LSL_TEXT:  		case LLAssetType::AT_CLOTHING:  		case LLAssetType::AT_OBJECT: @@ -1182,11 +1179,6 @@ void LLViewerTextEditor::openEmbeddedLandmark( LLPointer<LLInventoryItem> item_p  	}  } -void LLViewerTextEditor::openEmbeddedNotecard( LLInventoryItem* item, llwchar wc ) -{ -	copyInventory(item, gInventoryCallbacks.registerCB(mInventoryCallback)); -} -  void LLViewerTextEditor::openEmbeddedCallingcard( LLInventoryItem* item, llwchar wc )  {  	if(item && !item->getCreatorUUID().isNull()) diff --git a/indra/newview/llviewertexteditor.h b/indra/newview/llviewertexteditor.h index 477119d4f2..33cfca4f90 100644 --- a/indra/newview/llviewertexteditor.h +++ b/indra/newview/llviewertexteditor.h @@ -105,7 +105,6 @@ private:  	void			openEmbeddedTexture( LLInventoryItem* item, llwchar wc );  	void			openEmbeddedSound( LLInventoryItem* item, llwchar wc );  	void			openEmbeddedLandmark( LLPointer<LLInventoryItem> item_ptr, llwchar wc ); -	void			openEmbeddedNotecard( LLInventoryItem* item, llwchar wc);  	void			openEmbeddedCallingcard( LLInventoryItem* item, llwchar wc);  	void			showCopyToInvDialog( LLInventoryItem* item, llwchar wc );  	void			showUnsavedAlertDialog( LLInventoryItem* item ); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 657babd92c..098996147f 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -81,6 +81,8 @@  const F32 FORCE_SIMPLE_RENDER_AREA = 512.f;  const F32 FORCE_CULL_AREA = 8.f; +const F32 MIN_RENDER_COMPLEXITY = 0.f; +const F32 MAX_RENDER_COMPLEXITY = 1.0e6f;  U32 JOINT_COUNT_REQUIRED_FOR_FULLRIG = 1;  BOOL gAnimateTextures = TRUE; @@ -3615,6 +3617,8 @@ U32 LLVOVolume::getRenderCost(texture_cost_t &textures) const  		shame += media_faces * ARC_MEDIA_FACE_COST;  	} +	shame = llclamp(shame, MIN_RENDER_COMPLEXITY, MAX_RENDER_COMPLEXITY); +  	if (shame > mRenderComplexity_current)  	{  		mRenderComplexity_current = (S32)shame; diff --git a/indra/newview/llwlanimator.cpp b/indra/newview/llwlanimator.cpp index 2142885767..c8879e73eb 100644 --- a/indra/newview/llwlanimator.cpp +++ b/indra/newview/llwlanimator.cpp @@ -155,17 +155,28 @@ F64 LLWLAnimator::getDayTime()  		// we're not solving the non-linear equation that determines sun phase  		// we're just linearly interpolating between the major points -		if (phase <= 5.0 / 4.0) { + +		if (phase <= 5.0 / 4.0) +		{ +			// mDayTime from 0.33 to 0.75 (6:00 to 21:00)  			mDayTime = (1.0 / 3.0) * phase + (1.0 / 3.0);  		} +		else if (phase > 7.0 / 4.0) +		{ +			// maximum value for phase is 2 +			// mDayTime from 0.25 to 0.33 (3:00 to 6:00) +			mDayTime = (1.0 / 3.0) - (1.0 / 3.0) * (2 - phase); +		}  		else  		{ +			// phase == 3/2 is where day restarts (24:00) +			// mDayTime from 0.75 to 0.999 and 0 to 0.25 (21:00 to 03:00)  			mDayTime = phase - (1.0 / 2.0); -		} -		if(mDayTime > 1) -		{ -			mDayTime--; +			if(mDayTime > 1) +			{ +				mDayTime--; +			}  		}  		return mDayTime; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 890839e6e6..19487c3230 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7773,12 +7773,10 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)  			F32 fov = LLViewerCamera::getInstance()->getView();  			const F32 default_fov = CameraFieldOfView * F_PI/180.f; -			//const F32 default_aspect_ratio = gSavedSettings.getF32("CameraAspectRatio");  			//F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight();  			F32 dv = 2.f*default_focal_length * tanf(default_fov/2.f); -			//F32 dh = 2.f*default_focal_length * tanf(default_fov*default_aspect_ratio/2.f);  			F32 focal_length = dv/(2*tanf(fov/2.f)); 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 8391bacf51..a137770e26 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -2014,7 +2014,7 @@ Only large parcels can be listed in search.               name="AllowedText"               top="0"               width="230"> -                Allowed Residents ([COUNT]) +                Allowed Residents ([COUNT], max [MAX])              </text>              <name_list               column_padding="0" @@ -2063,7 +2063,7 @@ Only large parcels can be listed in search.               name="BanCheck"               top="0"               width="200"> -                Banned Residents ([COUNT]) +                Banned Residents ([COUNT], max [MAX])              </text>              <name_list               column_padding="0" diff --git a/indra/newview/skins/default/xui/en/floater_inspect.xml b/indra/newview/skins/default/xui/en/floater_inspect.xml index bea35e5fc1..ae46736ddf 100644 --- a/indra/newview/skins/default/xui/en/floater_inspect.xml +++ b/indra/newview/skins/default/xui/en/floater_inspect.xml @@ -27,15 +27,15 @@       tool_tip="Select an object from this list to highlight it in-world"       top="20">          <scroll_list.columns -         dynamic_width="true" +         relative_width="0.32"           label="Object Name"           name="object_name" />          <scroll_list.columns -         dynamic_width="true" +         relative_width="0.34"           label="Owner Name"           name="owner_name" />          <scroll_list.columns -         dynamic_width="true" +         relative_width="0.34"           label="Creator Name"           name="creator_name" />          <scroll_list.columns diff --git a/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml index 52d03cc432..00d70556b4 100644 --- a/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml +++ b/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml @@ -290,7 +290,7 @@        layout="topleft"        left="0"        height="67" -      width="1010"> +      width="1070">      <text          name="linksets_actions_label"          height="13" diff --git a/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml b/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml index b53698a9f2..62cce3a1e3 100644 --- a/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml +++ b/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml @@ -7,6 +7,7 @@           save_rect="true"           save_visibility="true"           title="SCENE LOAD STATISTICS" +         min_width="250"           width="400">      <scroll_container follows="top|left|bottom|right"                        bottom="400" diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml index be9b93837a..e4f735740b 100644 --- a/indra/newview/skins/default/xui/en/floater_stats.xml +++ b/indra/newview/skins/default/xui/en/floater_stats.xml @@ -8,6 +8,7 @@           save_rect="true"           save_visibility="true"           title="STATISTICS" +         min_width="250"           width="270">    <scroll_container follows="all"                      height="380" diff --git a/indra/newview/skins/default/xui/en/menu_gesture_gear.xml b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml index b08d21e8f4..c1458977ca 100644 --- a/indra/newview/skins/default/xui/en/menu_gesture_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml @@ -5,8 +5,7 @@   name="menu_gesture_gear"   visible="false">      <menu_item_call -     font="SansSerifBold" -     label="Add/Remove from Favorites" +     label="Activate/Deactivate selected gesture"       layout="topleft"       name="activate">          <on_click diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index a39ee5fddd..8cd0c415f4 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -20,6 +20,18 @@               function="Floater.Toggle"               parameter="preferences" />          </menu_item_call> +        <menu_item_check +         label="Show Grid Picker" +         name="Show Grid Picker" +         visible="false"  +         shortcut="control|shift|G"> +        <on_check +         function="CheckControl" +         parameter="ForceShowGrid" /> +        <on_click +         function="ToggleControl" +         parameter="ForceShowGrid" /> +        </menu_item_check>          <menu_item_separator />          <menu_item_call           label="Exit [APP_NAME]" @@ -287,18 +299,6 @@             parameter="4" />          </menu_item_check>        </menu> -     <menu_item_check -        label="Show Grid Picker" -        name="Show Grid Picker" -        visible="false"  -        shortcut="control|shift|G"> -        <on_check -         function="CheckControl" -         parameter="ForceShowGrid" /> -        <on_click -         function="ToggleControl" -         parameter="ForceShowGrid" /> -      </menu_item_check>        <menu_item_call          label="Show Notifications Console"          name="Show Notifications Console" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index f911c2da7b..7c128d1523 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -447,6 +447,13 @@               function="Floater.Toggle"               parameter="mini_map" />          </menu_item_check> +        <menu_item_call +             label="Events" +             name="Events"> +            <menu_item_call.on_click +             function="Advanced.ShowURL" +             parameter="http://events.secondlife.com"/> +        </menu_item_call>          <menu_item_check          label="Search..."          name="Search" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 512deed054..58869ec602 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4031,7 +4031,7 @@ An update was downloaded. It will be installed during restart.   icon="alertmodal.tga"   name="UpdateCheckError"   type="alertmodal"> -An error occured while checking for update. +An error occurred while checking for update.  Please try again later.      <tag>confirm</tag>      <usetemplate diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml index ff0714adbb..eeb930485e 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -26,10 +26,11 @@       layout="topleft"       left="5"       name="appearance_tabs" -     tab_min_width="150" +     tab_min_width="100"       tab_height="30"       tab_position="top"       halign="center" +     hide_scroll_arrows="true"       top="8"       width="315">           <panel diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 88ad8bbf7b..b75f631799 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3815,7 +3815,7 @@ Abuse Report</string>    <string name="Male - Laugh">Male - Laugh</string>    <string name="Male - Repulsed">Male - Repulsed</string>    <string name="Male - Shrug">Male - Shrug</string> -  <string name="Male - Stick tougue out">Male - Stick tougue out</string> +  <string name="Male - Stick tougue out">Male - Stick tongue out</string>    <string name="Male - Wow">Male - Wow</string>    <string name="Female - Chuckle">Female - Chuckle</string> @@ -3834,7 +3834,7 @@ Abuse Report</string>    <string name="Female - Please">Female - Please</string>    <string name="Female - Repulsed">Female - Repulsed</string>    <string name="Female - Shrug">Female - Shrug</string> -  <string name="Female - Stick tougue out">Female - Stick tougue out</string> +  <string name="Female - Stick tougue out">Female - Stick tongue out</string>    <string name="Female - Wow">Female - Wow</string>    <string name="/bow">/bow</string> diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml index 61ec046649..674be59753 100644 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -133,7 +133,7 @@      name="damage_text"  	width="35"  	height="18" -	top="17" +	top="18"      follows="right|top"  	halign="right"  	font="SansSerifSmall" diff --git a/scripts/content_tools/anim_tool.py b/scripts/content_tools/anim_tool.py index 9b795f45fd..77bf731ae6 100644 --- a/scripts/content_tools/anim_tool.py +++ b/scripts/content_tools/anim_tool.py @@ -406,8 +406,13 @@ class Anim(object):      def delete_joint(self, name):          j = self.find_joint(name)          if j: +            if args.verbose: +                print "removing joint", name              anim.joints.remove(j)              anim.num_joints = len(self.joints) +        else: +            if args.verbose: +                print "joint not found to remove", name      def summary(self):          nj = len(self.joints) @@ -500,9 +505,9 @@ def resolve_joints(names, skel_tree, lad_tree):          for elt in all_elts:              if elt.get("name") is None:                  continue -            print elt.get("name"),"hud",elt.get("hud") +            #print elt.get("name"),"hud",elt.get("hud")              if args.no_hud and elt.get("hud"): -                print "skipping hud joint", elt.get("name") +                #print "skipping hud joint", elt.get("name")                  continue              if elt.get("name") in names or elt.tag in names:                  matches.append(elt.get("name")) @@ -532,6 +537,8 @@ if __name__ == "__main__":      parser.add_argument("--lad", help="name of the avatar_lad file", default= os.path.join(path_to_skel,"avatar_lad.xml"))      parser.add_argument("--set_version", nargs=2, type=int, help="set version and sub-version to specified values")      parser.add_argument("--no_hud", help="omit hud joints from list of attachments", action="store_true") +    parser.add_argument("--base_priority", help="set base priority", type=int) +    parser.add_argument("--joint_priority", help="set joint priority for all joints", type=int)      parser.add_argument("infilename", help="name of a .anim file to input")      parser.add_argument("outfilename", nargs="?", help="name of a .anim file to output")      args = parser.parse_args() @@ -591,6 +598,13 @@ if __name__ == "__main__":          if args.set_version:              anim.version = args.set_version[0]              anim.sub_version = args.set_version[1] +        if args.base_priority is not None: +            print "set base priority",args.base_priority +            anim.base_priority = args.base_priority +        if args.joint_priority is not None: +            print "set joint priority",args.joint_priority +            for joint in anim.joints: +                joint.joint_priority = args.joint_priority          if args.dump:              anim.dump(args.dump)          if args.summary: | 
