diff options
43 files changed, 2585 insertions, 548 deletions
| diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 26802bbd1c..457c074ef1 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -552,6 +552,23 @@ void LLPluginClassMedia::loadURI(const std::string &uri)  	sendMessage(message);  } +const char* LLPluginClassMedia::priorityToString(EPriority priority) +{ +	const char* result = "UNKNOWN"; +	switch(priority) +	{ +		case PRIORITY_UNLOADED:		result = "unloaded";	break; +		case PRIORITY_STOPPED:		result = "stopped";		break; +		case PRIORITY_HIDDEN:		result = "hidden";		break; +		case PRIORITY_SLIDESHOW:	result = "slideshow";	break; +		case PRIORITY_LOW:			result = "low";			break; +		case PRIORITY_NORMAL:		result = "normal";		break; +		case PRIORITY_HIGH:			result = "high";		break; +	} +	 +	return result; +} +  void LLPluginClassMedia::setPriority(EPriority priority)  {  	if(mPriority != priority) @@ -560,35 +577,28 @@ void LLPluginClassMedia::setPriority(EPriority priority)  		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_priority"); -		std::string priority_string; +		std::string priority_string = priorityToString(priority);  		switch(priority)  		{  			case PRIORITY_UNLOADED:	 -				priority_string = "unloaded";	  				mSleepTime = 1.0f;  			break;  			case PRIORITY_STOPPED:	 -				priority_string = "stopped";	  				mSleepTime = 1.0f;  			break;  			case PRIORITY_HIDDEN:	 -				priority_string = "hidden";	  				mSleepTime = 1.0f;  			break;  			case PRIORITY_SLIDESHOW: -				priority_string = "slideshow";		  				mSleepTime = 1.0f;  			break;  			case PRIORITY_LOW:		 -				priority_string = "low";		  				mSleepTime = 1.0f / 50.0f;  			break;  			case PRIORITY_NORMAL:	 -				priority_string = "normal";	  				mSleepTime = 1.0f / 100.0f;  			break;  			case PRIORITY_HIGH:		 -				priority_string = "high";		  				mSleepTime = 1.0f / 100.0f;  			break;  		} @@ -794,6 +804,10 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  			{  				mStatus = LLPluginClassMediaOwner::MEDIA_PAUSED;  			} +			else if(status == "done") +			{ +				mStatus = LLPluginClassMediaOwner::MEDIA_DONE; +			}  			else  			{  				// empty string or any unknown string diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index 4f9763474e..90ecd1e073 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -150,6 +150,7 @@ public:  		PRIORITY_HIGH		// media has user focus and/or is taking up most of the screen  	}EPriority; +	static const char* priorityToString(EPriority priority);  	void setPriority(EPriority priority);  	void setLowPrioritySizeLimit(int size); diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h index 4690f09172..c798af29ca 100644 --- a/indra/llplugin/llpluginclassmediaowner.h +++ b/indra/llplugin/llpluginclassmediaowner.h @@ -70,7 +70,8 @@ public:  		MEDIA_ERROR,		// navigation/preroll failed  		MEDIA_PLAYING,		// playing (only for time-based media)  		MEDIA_PAUSED,		// paused (only for time-based media) -		 +		MEDIA_DONE			// finished playing (only for time-based media) +	  	} EMediaStatus;  	virtual ~LLPluginClassMediaOwner() {}; diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index e053477d58..75905d0927 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -1544,18 +1544,24 @@ void LLLineEditor::drawBackground()  		image = mBgImage;  	} +	F32 alpha = getDrawContext().mAlpha;  	// optionally draw programmatic border  	if (has_focus)  	{ +		LLColor4 tmp_color = gFocusMgr.getFocusColor(); +		tmp_color.setAlpha(alpha);  		image->drawBorder(0, 0, getRect().getWidth(), getRect().getHeight(), -						  gFocusMgr.getFocusColor(), +						  tmp_color,  						  gFocusMgr.getFocusFlashWidth());  	} -	image->draw(getLocalRect()); +	LLColor4 tmp_color = UI_VERTEX_COLOR; +	tmp_color.setAlpha(alpha); +	image->draw(getLocalRect(), tmp_color);  }  void LLLineEditor::draw()  { +	F32 alpha = getDrawContext().mAlpha;  	S32 text_len = mText.length();  	static LLUICachedControl<S32> lineeditor_cursor_thickness ("UILineEditorCursorThickness", 0);  	static LLUICachedControl<S32> lineeditor_v_pad ("UILineEditorVPad", 0); @@ -1608,8 +1614,10 @@ void LLLineEditor::draw()  	{  		text_color = mReadOnlyFgColor.get();  	} +	text_color.setAlpha(alpha);  	LLColor4 label_color = mTentativeFgColor.get(); - +	label_color.setAlpha(alpha); +	  	if (hasPreeditString())  	{  		// Draw preedit markers.  This needs to be before drawing letters. @@ -1632,7 +1640,7 @@ void LLLineEditor::draw()  						preedit_pixels_right - preedit_standout_gap - 1,  						background.mBottom + preedit_standout_position - preedit_standout_thickness,  						(text_color * preedit_standout_brightness  -						 + mPreeditBgColor * (1 - preedit_standout_brightness)).setAlpha(1.0f)); +						 + mPreeditBgColor * (1 - preedit_standout_brightness)).setAlpha(alpha/*1.0f*/));  				}  				else  				{ @@ -1641,7 +1649,7 @@ void LLLineEditor::draw()  						preedit_pixels_right - preedit_marker_gap - 1,  						background.mBottom + preedit_marker_position - preedit_marker_thickness,  						(text_color * preedit_marker_brightness -						 + mPreeditBgColor * (1 - preedit_marker_brightness)).setAlpha(1.0f)); +						 + mPreeditBgColor * (1 - preedit_marker_brightness)).setAlpha(alpha/*1.0f*/));  				}  			}  		} @@ -1684,15 +1692,17 @@ void LLLineEditor::draw()  		if( (rendered_pixels_right < (F32)mMaxHPixels) && (rendered_text < text_len) )  		{  			LLColor4 color = mHighlightColor; +			color.setAlpha(alpha);  			// selected middle  			S32 width = mGLFont->getWidth(mText.getWString().c_str(), mScrollHPos + rendered_text, select_right - mScrollHPos - rendered_text);  			width = llmin(width, mMaxHPixels - llround(rendered_pixels_right));  			gl_rect_2d(llround(rendered_pixels_right), cursor_top, llround(rendered_pixels_right)+width, cursor_bottom, color); +			LLColor4 tmp_color( 1.f - text_color.mV[0], 1.f - text_color.mV[1], 1.f - text_color.mV[2], alpha );  			rendered_text += mGLFont->render(   				mText, mScrollHPos + rendered_text,  				rendered_pixels_right, text_bottom, -				LLColor4( 1.f - text_color.mV[0], 1.f - text_color.mV[1], 1.f - text_color.mV[2], 1 ), +				tmp_color,  				LLFontGL::LEFT, LLFontGL::BOTTOM,  				0,  				LLFontGL::NO_SHADOW, @@ -1758,8 +1768,9 @@ void LLLineEditor::draw()  					cursor_right, cursor_bottom, text_color);  				if (LL_KIM_OVERWRITE == gKeyboard->getInsertMode() && !hasSelection())  				{ +					LLColor4 tmp_color( 1.f - text_color.mV[0], 1.f - text_color.mV[1], 1.f - text_color.mV[2], alpha );  					mGLFont->render(mText, getCursor(), (F32)(cursor_left + lineeditor_cursor_thickness / 2), text_bottom,  -						LLColor4( 1.f - text_color.mV[0], 1.f - text_color.mV[1], 1.f - text_color.mV[2], 1 ), +						tmp_color,  						LLFontGL::LEFT, LLFontGL::BOTTOM,  						0,  						LLFontGL::NO_SHADOW, diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 732c01614b..cde4c75518 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -44,6 +44,7 @@  #include "lluictrlfactory.h"  #include "llrender.h"  #include "llfloater.h" +#include "lltrans.h"  //---------------------------------------------------------------------------- @@ -153,6 +154,8 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p)  	mRightTabBtnOffset(p.tab_padding_right),  	mTotalTabWidth(0),  	mTabPosition(p.tab_position), +	mFontHalign(p.font_halign), +	mFont(p.font.isProvided() ? p.font() : (mIsVertical ? LLFontGL::getFontSansSerif() : LLFontGL::getFontSansSerifSmall())),  	mFirstTabParams(p.first_tab),  	mMiddleTabParams(p.middle_tab),  	mLastTabParams(p.last_tab) @@ -401,12 +404,6 @@ void LLTabContainer::draw()  					}  				}  			} -			LLUI::pushMatrix(); -			{ -				LLUI::translate((F32)tuple->mButton->getRect().mLeft, (F32)tuple->mButton->getRect().mBottom, 0.f); -				tuple->mButton->draw(); -			} -			LLUI::popMatrix();  			idx++;  		} @@ -641,12 +638,6 @@ BOOL LLTabContainer::handleToolTip( S32 x, S32 y, MASK mask)  				}  			}  		} - -		for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter) -		{ -			LLTabTuple* tuple = *iter; -			tuple->mButton->setVisible( FALSE ); -		}  	}  	return handled;  } @@ -836,8 +827,6 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)  		// already a child of mine  		return;  	} -	const LLFontGL* font = -		(mIsVertical ? LLFontGL::getFontSansSerif() : LLFontGL::getFontSansSerifSmall());  	// Store the original label for possible xml export.  	child->setLabel(label); @@ -847,7 +836,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)  	S32 button_width = mMinTabWidth;  	if (!mIsVertical)  	{ -		button_width = llclamp(font->getWidth(trimmed_label) + tab_padding, mMinTabWidth, mMaxTabWidth); +		button_width = llclamp(mFont->getWidth(trimmed_label) + tab_padding, mMinTabWidth, mMaxTabWidth);  	}  	// Tab panel @@ -934,7 +923,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)  		params.name(trimmed_label);  		params.rect(btn_rect);  		params.initial_value(trimmed_label); -		params.font(font); +		params.font(mFont);  		textbox = LLUICtrlFactory::create<LLTextBox> (params);  		LLButton::Params p; @@ -950,12 +939,12 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)  			p.rect(btn_rect);  			p.follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT);  			p.click_callback.function(boost::bind(&LLTabContainer::onTabBtn, this, _2, child)); -			p.font(font); +			p.font(mFont);  			p.label(trimmed_label);  			p.image_unselected(mMiddleTabParams.tab_left_image_unselected);  			p.image_selected(mMiddleTabParams.tab_left_image_selected);  			p.scale_image(true); -			p.font_halign = LLFontGL::LEFT; +			p.font_halign = mFontHalign;  			p.tab_stop(false);  			if (indent)  			{ @@ -965,18 +954,13 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)  		}  		else  		{ -			std::string tooltip = trimmed_label; -			tooltip += "\nAlt-Left arrow for previous tab"; -			tooltip += "\nAlt-Right arrow for next tab"; -  			LLButton::Params p;  			p.name(std::string(child->getName()) + " tab");  			p.rect(btn_rect);  			p.click_callback.function(boost::bind(&LLTabContainer::onTabBtn, this, _2, child)); -			p.font(font); +			p.font(mFont);  			p.label(trimmed_label);  			p.visible(false); -			p.tool_tip(tooltip);  			p.scale_image(true);  			p.image_unselected(tab_img);  			p.image_selected(tab_selected_img); @@ -984,7 +968,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)  			// Try to squeeze in a bit more text  			p.pad_left(4);  			p.pad_right(2); -			p.font_halign = LLFontGL::LEFT; +			p.font_halign = mFontHalign;  			p.follows.flags = FOLLOWS_LEFT;  			p.follows.flags = FOLLOWS_LEFT; @@ -1505,7 +1489,6 @@ void LLTabContainer::setTabImage(LLPanel* child, std::string image_name, const L  		if (!mIsVertical)  		{ -			const LLFontGL* fontp = LLFontGL::getFontSansSerifSmall();  			// remove current width from total tab strip width  			mTotalTabWidth -= tuple->mButton->getRect().getWidth(); @@ -1516,7 +1499,7 @@ void LLTabContainer::setTabImage(LLPanel* child, std::string image_name, const L  			tuple->mPadding = image_overlay_width;  			tuple->mButton->setRightHPad(6); -			tuple->mButton->reshape(llclamp(fontp->getWidth(tuple->mButton->getLabelSelected()) + tab_padding + tuple->mPadding, mMinTabWidth, mMaxTabWidth),  +			tuple->mButton->reshape(llclamp(mFont->getWidth(tuple->mButton->getLabelSelected()) + tab_padding + tuple->mPadding, mMinTabWidth, mMaxTabWidth),   									tuple->mButton->getRect().getHeight());  			// add back in button width to total tab strip width  			mTotalTabWidth += tuple->mButton->getRect().getWidth(); diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h index a81974cd42..be9c6c7d06 100644 --- a/indra/llui/lltabcontainer.h +++ b/indra/llui/lltabcontainer.h @@ -262,6 +262,9 @@ private:  	S32								mTabHeight;  	LLFrameTimer					mDragAndDropDelayTimer; +	 +	LLFontGL::HAlign                mFontHalign; +	const LLFontGL*					mFont;  	TabParams						mFirstTabParams;  	TabParams						mMiddleTabParams; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 0add3fb500..2b1d677ffb 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -419,9 +419,6 @@ void LLTextBase::drawCursor()  			return;  		} -		if (!mTextRect.contains(cursor_rect)) -			return; -  		// Draw the cursor  		// (Flash the cursor every half second starting a fixed time after the last keystroke)  		F32 elapsed = mCursorBlinkTimer.getElapsedTimeF32(); @@ -973,7 +970,7 @@ void LLTextBase::draw()  							: hasFocus()   								? mFocusBgColor.get()   								: mWriteableBgColor.get(); -		gl_rect_2d(mDocumentView->getRect(), bg_color, TRUE); +		gl_rect_2d(mTextRect, bg_color, TRUE);  	}  	// draw document view @@ -1034,13 +1031,13 @@ S32 LLTextBase::getLeftOffset(S32 width)  	switch (mHAlign)  	{  	case LLFontGL::LEFT: -		return 0; +		return mHPad;  	case LLFontGL::HCENTER: -		return (mTextRect.getWidth() - width) / 2; +		return mHPad + (mTextRect.getWidth() - width - mHPad) / 2;  	case LLFontGL::RIGHT:  		return mTextRect.getWidth() - width;  	default: -		return 0; +		return mHPad;  	}  } @@ -1048,8 +1045,6 @@ S32 LLTextBase::getLeftOffset(S32 width)  static LLFastTimer::DeclareTimer FTM_TEXT_REFLOW ("Text Reflow");  void LLTextBase::reflow(S32 start_index)  { -	if (!mReflowNeeded) return; -  	LLFastTimer ft(FTM_TEXT_REFLOW);  	updateSegments(); @@ -1078,7 +1073,7 @@ void LLTextBase::reflow(S32 start_index)  		segment_set_t::iterator seg_iter = mSegments.begin();  		S32 seg_offset = 0;  		S32 line_start_index = 0; -		const S32 text_width = mTextRect.getWidth();  // optionally reserve room for margin +		const S32 text_width = mTextRect.getWidth() - mHPad;  // reserve room for margin  		S32 remaining_pixels = text_width;  		LLWString text(getWText());  		S32 line_count = 0; @@ -2037,7 +2032,6 @@ void LLTextBase::updateRects()  	}  	else  	{ -  		mContentsRect = mLineInfoList.begin()->mRect;  		for (line_list_t::const_iterator line_iter = ++mLineInfoList.begin();  			line_iter != mLineInfoList.end(); @@ -2046,13 +2040,28 @@ void LLTextBase::updateRects()  			mContentsRect.unionWith(line_iter->mRect);  		} -		mContentsRect.mRight += mHPad; +		mContentsRect.mLeft = 0;  		mContentsRect.mTop += mVPad; -		// get around rounding errors when clipping text against rectangle -		mContentsRect.stretch(1); + +		S32 delta_pos = -mContentsRect.mBottom; +		// move line segments to fit new document rect +		for (line_list_t::iterator it = mLineInfoList.begin(); it != mLineInfoList.end(); ++it) +		{ +			it->mRect.translate(0, delta_pos); +		} +		mContentsRect.translate(0, delta_pos);  	} +	// update document container dimensions according to text contents +	LLRect doc_rect = mContentsRect; +	// use old mTextRect constraint document to width of viewable region +	doc_rect.mRight = doc_rect.mLeft + mTextRect.getWidth(); + +	mDocumentView->setShape(doc_rect); +	//update mTextRect *after* mDocumentView has been resized +	// so that scrollbars are added if document needs to scroll +	// since mTextRect does not include scrollbars  	LLRect old_text_rect = mTextRect;  	mTextRect = mScroller ? mScroller->getContentWindowRect() : getLocalRect();  	//FIXME: replace border with image? @@ -2060,43 +2069,14 @@ void LLTextBase::updateRects()  	{  		mTextRect.stretch(-1);  	} -	mTextRect.mLeft += mHPad; -	mTextRect.mTop -= mVPad;  	if (mTextRect != old_text_rect)  	{  		needsReflow();  	} -	// change document rect size too -	LLRect document_rect; -	if (mScroller) -	{ -		// document is size of scroller or size of text contents, whichever is larger -		document_rect.setOriginAndSize(0, 0,  -									mScroller->getContentWindowRect().getWidth(),  -									llmax(mScroller->getContentWindowRect().getHeight(), mContentsRect.getHeight())); -	} -	else -	{ -		// document size is just extents of reflowed text, reset to origin 0,0 -		document_rect.set(0,  -						getLocalRect().getHeight(),  -						getLocalRect().getWidth(),  -						llmin(0, getLocalRect().getHeight() - mContentsRect.getHeight())); -	} -	mDocumentView->setShape(document_rect); - -	// after making document big enough to hold all the text, move the text to fit in the document -	if (!mLineInfoList.empty()) -	{ -		S32 delta_pos = mDocumentView->getRect().getHeight() - mLineInfoList.begin()->mRect.mTop - mVPad; -		// move line segments to fit new document rect -		for (line_list_t::iterator it = mLineInfoList.begin(); it != mLineInfoList.end(); ++it) -		{ -			it->mRect.translate(0, delta_pos); -		} -		mContentsRect.translate(0, delta_pos); -	} +	// update document container again, using new mTextRect +	doc_rect.mRight = doc_rect.mLeft + mTextRect.getWidth(); +	mDocumentView->setShape(doc_rect);  } @@ -2398,7 +2378,6 @@ S32	LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin  	{  		if (text[last_char] == '\n')   		{ -			last_char++;  			break;  		}  	} @@ -2418,9 +2397,14 @@ S32	LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin  		// If at the beginning of a line, and a single character won't fit, draw it anyway  		num_chars = 1;  	} -	if (mStart + segment_offset + num_chars == mEditor.getLength()) + +	// include *either* the EOF or newline character in this run of text +	// but not both +	S32 last_char_in_run = mStart + segment_offset + num_chars; +	// check length first to avoid indexing off end of string +	if (last_char_in_run >= mEditor.getLength()  +		|| text[last_char_in_run] == '\n')  	{ -		// include terminating NULL  		num_chars++;  	}  	return num_chars; @@ -2442,12 +2426,14 @@ void LLNormalTextSegment::dump() const  // LLInlineViewSegment  // -LLInlineViewSegment::LLInlineViewSegment(LLView* view, S32 start, S32 end, bool force_new_line, S32 hpad, S32 vpad) +LLInlineViewSegment::LLInlineViewSegment(const Params& p, S32 start, S32 end)  :	LLTextSegment(start, end), -	mView(view), -	mForceNewLine(force_new_line), -	mHPad(hpad), // one sided padding (applied to left and right) -	mVPad(vpad) +	mView(p.view), +	mForceNewLine(p.force_newline), +	mLeftPad(p.left_pad), +	mRightPad(p.right_pad), +	mTopPad(p.top_pad), +	mBottomPad(p.bottom_pad)  {  }  @@ -2467,8 +2453,8 @@ void	LLInlineViewSegment::getDimensions(S32 first_char, S32 num_chars, S32& widt  	}  	else  	{ -		width = mHPad * 2 + mView->getRect().getWidth(); -		height = mVPad * 2 + mView->getRect().getHeight(); +		width = mLeftPad + mRightPad + mView->getRect().getWidth(); +		height = mBottomPad + mTopPad + mView->getRect().getHeight();  	}  } @@ -2491,14 +2477,14 @@ S32	LLInlineViewSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin  void LLInlineViewSegment::updateLayout(const LLTextBase& editor)  {  	LLRect start_rect = editor.getDocRectFromDocIndex(mStart); -	mView->setOrigin(start_rect.mLeft + mHPad, start_rect.mBottom + mVPad); +	mView->setOrigin(start_rect.mLeft + mLeftPad, start_rect.mBottom + mBottomPad);  }  F32	LLInlineViewSegment::draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect)  {  	// return padded width of widget  	// widget is actually drawn during mDocumentView's draw() -	return (F32)(draw_rect.mLeft + mView->getRect().getWidth() + mHPad * 2); +	return (F32)(draw_rect.mLeft + mView->getRect().getWidth() + mLeftPad + mRightPad);  }  void LLInlineViewSegment::unlinkFromDocument(LLTextBase* editor) diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index d0787f001e..14fd786127 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -459,7 +459,17 @@ public:  class LLInlineViewSegment : public LLTextSegment  {  public: -	LLInlineViewSegment(LLView* widget, S32 start, S32 end, bool force_new_line, S32 hpad = 0, S32 vpad = 0); +	struct Params : public LLInitParam::Block<Params> +	{ +		Mandatory<LLView*>		view; +		Optional<bool>			force_newline; +		Optional<S32>			left_pad, +								right_pad, +								bottom_pad, +								top_pad; +	}; + +	LLInlineViewSegment(const Params& p, S32 start, S32 end);  	~LLInlineViewSegment();  	/*virtual*/ void		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; @@ -470,8 +480,10 @@ public:  	/*virtual*/ void		linkToDocument(class LLTextBase* editor);  private: -	S32 mHPad; -	S32 mVPad; +	S32 mLeftPad; +	S32 mRightPad; +	S32 mTopPad; +	S32 mBottomPad;  	LLView* mView;  	bool	mForceNewLine;  }; diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 570ca4b998..f0238dba49 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -2307,7 +2307,7 @@ void LLTextEditor::insertText(const std::string &new_text)  	setEnabled( enabled );  } -void LLTextEditor::appendWidget(LLView* widget, const std::string &widget_text, bool allow_undo, bool force_new_line, S32 hpad, S32 vpad) +void LLTextEditor::appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo)  {  	// Save old state  	S32 selection_start = mSelectionStart; @@ -2321,12 +2321,9 @@ void LLTextEditor::appendWidget(LLView* widget, const std::string &widget_text,  	setCursorPos(old_length); -	LLWString widget_wide_text; +	LLWString widget_wide_text = utf8str_to_wstring(text); -	// Add carriage return if not first line -	widget_wide_text = utf8str_to_wstring(widget_text); - -	LLTextSegmentPtr segment = new LLInlineViewSegment(widget, old_length, old_length + widget_text.size(), force_new_line, hpad, vpad); +	LLTextSegmentPtr segment = new LLInlineViewSegment(params, old_length, old_length + widget_wide_text.size());  	insert(getLength(), widget_wide_text, FALSE, segment);  	needsReflow(); @@ -2349,7 +2346,7 @@ void LLTextEditor::appendWidget(LLView* widget, const std::string &widget_text,  		setCursorPos(cursor_pos);  	} -	if( !allow_undo ) +	if (!allow_undo)  	{  		blockUndo();  	} diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index 4847f4d117..10fc94dedc 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -166,7 +166,7 @@ public:  	// inserts text at cursor  	void			insertText(const std::string &text); -	void			appendWidget(LLView* widget, const std::string &widget_text, bool allow_undo, bool force_newline, S32 hpad, S32 vpad); +	void			appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo);  	// Non-undoable  	void			setText(const LLStringExplicit &utf8str); diff --git a/indra/media_plugins/base/media_plugin_base.cpp b/indra/media_plugins/base/media_plugin_base.cpp index 0b7092fad6..6acac07423 100644 --- a/indra/media_plugins/base/media_plugin_base.cpp +++ b/indra/media_plugins/base/media_plugin_base.cpp @@ -64,6 +64,7 @@ std::string MediaPluginBase::statusString()  		case STATUS_ERROR:		result = "error";		break;  		case STATUS_PLAYING:	result = "playing";		break;  		case STATUS_PAUSED:		result = "paused";		break; +		case STATUS_DONE:		result = "done";		break;  		default:  			// keep the empty string  		break; diff --git a/indra/media_plugins/base/media_plugin_base.h b/indra/media_plugins/base/media_plugin_base.h index 8f600cb8d6..f1e96335f9 100644 --- a/indra/media_plugins/base/media_plugin_base.h +++ b/indra/media_plugins/base/media_plugin_base.h @@ -56,6 +56,7 @@ protected:  		STATUS_ERROR,  		STATUS_PLAYING,  		STATUS_PAUSED, +		STATUS_DONE  	} EStatus;  	class SharedSegmentInfo diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp index c9ee1c8ac7..fb6d5b2905 100644 --- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp +++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp @@ -420,7 +420,7 @@ private:  	{
  		if ( mCommand == COMMAND_PLAY )
  		{
 -			if ( mStatus == STATUS_LOADED || mStatus == STATUS_PAUSED || mStatus == STATUS_PLAYING )
 +			if ( mStatus == STATUS_LOADED || mStatus == STATUS_PAUSED || mStatus == STATUS_PLAYING || mStatus == STATUS_DONE )
  			{
  				long state = GetMovieLoadState( mMovieHandle );
 @@ -446,7 +446,7 @@ private:  		else
  		if ( mCommand == COMMAND_STOP )
  		{
 -			if ( mStatus == STATUS_PLAYING || mStatus == STATUS_PAUSED )
 +			if ( mStatus == STATUS_PLAYING || mStatus == STATUS_PAUSED || mStatus == STATUS_DONE )
  			{
  				if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK )
  				{
 @@ -547,12 +547,12 @@ private:  		// see if title arrived and if so, update member variable with contents
  		checkTitle();
 -
 -		// special code for looping - need to rewind at the end of the movie
 -		if ( mIsLooping )
 +		
 +		// QT call to see if we are at the end - can't do with controller
 +		if ( IsMovieDone( mMovieHandle ) )
  		{
 -			// QT call to see if we are at the end - can't do with controller
 -			if ( IsMovieDone( mMovieHandle ) )
 +			// special code for looping - need to rewind at the end of the movie
 +			if ( mIsLooping )
  			{
  				// go back to start
  				rewind();
 @@ -565,8 +565,16 @@ private:  					// set the volume
  					MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
  				};
 -			};
 -		};
 +			}
 +			else
 +			{
 +				if(mStatus == STATUS_PLAYING)
 +				{
 +					setStatus(STATUS_DONE);
 +				}
 +			}
 +		}
 +
  	};
  	int getDataWidth() const
 diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 5210ff66ed..a7681e4a1d 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -63,13 +63,13 @@ include_directories(      )  set(viewer_SOURCE_FILES -    llaccordionctrltab.cpp      llaccordionctrl.cpp +    llaccordionctrltab.cpp      llagent.cpp -    llagentlistener.cpp      llagentaccess.cpp      llagentdata.cpp      llagentlanguage.cpp +    llagentlistener.cpp      llagentpicksinfo.cpp      llagentpilot.cpp      llagentui.cpp @@ -78,8 +78,8 @@ set(viewer_SOURCE_FILES      llappearancemgr.cpp      llappviewer.cpp      llappviewerlistener.cpp -    llassetuploadresponders.cpp      llassetuploadqueue.cpp +    llassetuploadresponders.cpp      llaudiosourcevo.cpp      llavataractions.cpp      llavatariconctrl.cpp @@ -95,8 +95,8 @@ set(viewer_SOURCE_FILES      llcaphttpsender.cpp      llchannelmanager.cpp      llchatbar.cpp -    llchatitemscontainerctrl.cpp      llchathistory.cpp +    llchatitemscontainerctrl.cpp      llchatmsgbox.cpp      llchiclet.cpp      llclassifiedinfo.cpp @@ -116,10 +116,10 @@ set(viewer_SOURCE_FILES      lldirpicker.cpp      lldndbutton.cpp      lldrawable.cpp +    lldrawpool.cpp      lldrawpoolalpha.cpp      lldrawpoolavatar.cpp      lldrawpoolbump.cpp -    lldrawpool.cpp      lldrawpoolground.cpp      lldrawpoolsimple.cpp      lldrawpoolsky.cpp @@ -151,8 +151,8 @@ set(viewer_SOURCE_FILES      llfloaterbuildoptions.cpp      llfloaterbulkpermission.cpp      llfloaterbump.cpp -    llfloaterbuycontents.cpp      llfloaterbuy.cpp +    llfloaterbuycontents.cpp      llfloaterbuycurrency.cpp      llfloaterbuyland.cpp      llfloatercall.cpp @@ -163,8 +163,8 @@ set(viewer_SOURCE_FILES      llfloatercustomize.cpp      llfloaterdaycycle.cpp      llfloaterenvsettings.cpp -    llfloaterfriends.cpp      llfloaterfonttest.cpp +    llfloaterfriends.cpp      llfloatergesture.cpp      llfloatergodtools.cpp      llfloatergroupinvite.cpp @@ -172,8 +172,6 @@ set(viewer_SOURCE_FILES      llfloaterhandler.cpp      llfloaterhardwaresettings.cpp      llfloaterhelpbrowser.cpp -    llfloatermediabrowser.cpp -    llfloatermediasettings.cpp      llfloaterhud.cpp      llfloaterimagepreview.cpp      llfloaterinspect.cpp @@ -183,6 +181,8 @@ set(viewer_SOURCE_FILES      llfloaterland.cpp      llfloaterlandholdings.cpp      llfloatermap.cpp +    llfloatermediabrowser.cpp +    llfloatermediasettings.cpp      llfloatermemleak.cpp      llfloaternamedesc.cpp      llfloaternotificationsconsole.cpp @@ -227,8 +227,8 @@ set(viewer_SOURCE_FILES      llgroupmgr.cpp      llgroupnotify.cpp      llhomelocationresponder.cpp -    llhudeffectbeam.cpp      llhudeffect.cpp +    llhudeffectbeam.cpp      llhudeffectlookat.cpp      llhudeffectpointat.cpp      llhudeffecttrail.cpp @@ -238,11 +238,11 @@ set(viewer_SOURCE_FILES      llhudrender.cpp      llhudtext.cpp      llhudview.cpp +    llimcontrolpanel.cpp      llimfloater.cpp      llimhandler.cpp      llimpanel.cpp      llimview.cpp -    llimcontrolpanel.cpp      llinspect.cpp      llinspectavatar.cpp      llinspectgroup.cpp @@ -260,7 +260,6 @@ set(viewer_SOURCE_FILES      lllocaltextureobject.cpp      lllocationhistory.cpp      lllocationinputctrl.cpp -    llurllineeditorctrl.cpp      lllogchat.cpp      llloginhandler.cpp      lllogininstance.cpp @@ -312,8 +311,8 @@ set(viewer_SOURCE_FILES      llpanelgrouplandmoney.cpp      llpanelgroupnotices.cpp      llpanelgrouproles.cpp -    llpanelinventory.cpp      llpanelimcontrolpanel.cpp +    llpanelinventory.cpp      llpanelland.cpp      llpanellandaudio.cpp      llpanellandmarks.cpp @@ -322,11 +321,10 @@ set(viewer_SOURCE_FILES      llpanellookinfo.cpp      llpanellooks.cpp      llpanelmedia.cpp -    llpanelmediahud.cpp -    llpanelmeprofile.cpp      llpanelmediasettingsgeneral.cpp -    llpanelmediasettingssecurity.cpp      llpanelmediasettingspermissions.cpp +    llpanelmediasettingssecurity.cpp +    llpanelmeprofile.cpp      llpanelobject.cpp      llpanelpeople.cpp      llpanelpeoplemenus.cpp @@ -335,11 +333,12 @@ set(viewer_SOURCE_FILES      llpanelpicks.cpp      llpanelplace.cpp      llpanelplaceinfo.cpp -    llpanelshower.cpp      llpanelplaces.cpp      llpanelplacestab.cpp +    llpanelprimmediacontrols.cpp      llpanelprofile.cpp      llpanelprofileview.cpp +    llpanelshower.cpp      llpanelteleporthistory.cpp      llpanelvolume.cpp      llparcelselection.cpp @@ -348,8 +347,8 @@ set(viewer_SOURCE_FILES      llplacesinventorybridge.cpp      llpolymesh.cpp      llpolymorph.cpp -    llpreviewanim.cpp      llpreview.cpp +    llpreviewanim.cpp      llpreviewgesture.cpp      llpreviewnotecard.cpp      llpreviewscript.cpp @@ -398,10 +397,10 @@ set(viewer_SOURCE_FILES      lltoastimpanel.cpp      lltoastnotifypanel.cpp      lltoastpanel.cpp +    lltool.cpp      lltoolbar.cpp      lltoolbrush.cpp      lltoolcomp.cpp -    lltool.cpp      lltooldraganddrop.cpp      lltoolface.cpp      lltoolfocus.cpp @@ -425,6 +424,7 @@ set(viewer_SOURCE_FILES      llurl.cpp      llurldispatcher.cpp      llurlhistory.cpp +    llurllineeditorctrl.cpp      llurlsimstring.cpp      llurlwhitelist.cpp      llvectorperfoptions.cpp @@ -441,18 +441,18 @@ set(viewer_SOURCE_FILES      llviewerhelp.cpp      llviewerhelputil.cpp      llviewerinventory.cpp -    llviewerjointattachment.cpp      llviewerjoint.cpp +    llviewerjointattachment.cpp      llviewerjointmesh.cpp -    llviewerjointmesh_sse2.cpp      llviewerjointmesh_sse.cpp +    llviewerjointmesh_sse2.cpp      llviewerjointmesh_vec.cpp      llviewerjoystick.cpp      llviewerkeyboard.cpp      llviewerlayer.cpp      llviewermedia.cpp -    llviewermediafocus.cpp      llviewermedia_streamingaudio.cpp +    llviewermediafocus.cpp      llviewermenu.cpp      llviewermenufile.cpp      llviewermessage.cpp @@ -487,9 +487,9 @@ set(viewer_SOURCE_FILES      llvoground.cpp      llvoicechannel.cpp      llvoiceclient.cpp +    llvoicecontrolpanel.cpp      llvoiceremotectrl.cpp      llvoicevisualizer.cpp -    llvoicecontrolpanel.cpp      llvoinventorylistener.cpp      llvopartgroup.cpp      llvosky.cpp @@ -540,25 +540,25 @@ endif (LINUX)  set(viewer_HEADER_FILES      CMakeLists.txt      ViewerInstall.cmake -    llaccordionctrltab.h      llaccordionctrl.h +    llaccordionctrltab.h      llagent.h -    llagentlistener.h      llagentaccess.h      llagentdata.h      llagentlanguage.h +    llagentlistener.h      llagentpicksinfo.h      llagentpilot.h      llagentui.h      llagentwearables.h      llanimstatelabels.h      llappearance.h +    llappearancemgr.h      llappviewer.h      llappviewerlistener.h -    llassetuploadresponders.h      llassetuploadqueue.h +    llassetuploadresponders.h      llaudiosourcevo.h -    llappearancemgr.h      llavataractions.h      llavatariconctrl.h      llavatarlist.h @@ -574,8 +574,8 @@ set(viewer_HEADER_FILES      llcaphttpsender.h      llchannelmanager.h      llchatbar.h -    llchatitemscontainerctrl.h      llchathistory.h +    llchatitemscontainerctrl.h      llchatmsgbox.h      llchiclet.h      llclassifiedinfo.h @@ -652,8 +652,6 @@ set(viewer_HEADER_FILES      llfloaterhandler.h      llfloaterhardwaresettings.h      llfloaterhelpbrowser.h -    llfloatermediabrowser.h -    llfloatermediasettings.h      llfloaterhud.h      llfloaterimagepreview.h      llfloaterinspect.h @@ -663,16 +661,18 @@ set(viewer_HEADER_FILES      llfloaterland.h      llfloaterlandholdings.h      llfloatermap.h +    llfloatermediabrowser.h +    llfloatermediasettings.h      llfloatermemleak.h      llfloaternamedesc.h      llfloaternotificationsconsole.h      llfloateropenobject.h      llfloaterparcel.h      llfloaterpay.h +    llfloaterperms.h      llfloaterpostcard.h      llfloaterpostprocess.h      llfloaterpreference.h -    llfloaterperms.h      llfloaterproperties.h      llfloaterregioninfo.h      llfloaterreporter.h @@ -718,12 +718,12 @@ set(viewer_HEADER_FILES      llhudrender.h      llhudtext.h      llhudview.h +    llimcontrolpanel.h      llimfloater.h      llimpanel.h      llimview.h -    llimcontrolpanel.h -    llinspectavatar.h      llinspect.h +    llinspectavatar.h      llinspectgroup.h      llinspectobject.h      llinventorybridge.h @@ -740,7 +740,6 @@ set(viewer_HEADER_FILES      lllocaltextureobject.h      lllocationhistory.h      lllocationinputctrl.h -    llurllineeditorctrl.h      lllogchat.h      llloginhandler.h      lllogininstance.h @@ -749,6 +748,7 @@ set(viewer_HEADER_FILES      llmanipscale.h      llmaniptranslate.h      llmapresponders.h +    llmediactrl.h      llmediadataclient.h      llmediaremotectrl.h      llmemoryview.h @@ -788,8 +788,8 @@ set(viewer_HEADER_FILES      llpanelgrouplandmoney.h      llpanelgroupnotices.h      llpanelgrouproles.h -    llpanelinventory.h      llpanelimcontrolpanel.h +    llpanelinventory.h      llpanelland.h      llpanellandaudio.h      llpanellandmarks.h @@ -798,11 +798,10 @@ set(viewer_HEADER_FILES      llpanellookinfo.h      llpanellooks.h      llpanelmedia.h -    llpanelmediahud.h -    llpanelmeprofile.h      llpanelmediasettingsgeneral.h -    llpanelmediasettingssecurity.h      llpanelmediasettingspermissions.h +    llpanelmediasettingssecurity.h +    llpanelmeprofile.h      llpanelobject.h      llpanelpeople.h      llpanelpeoplemenus.h @@ -811,11 +810,12 @@ set(viewer_HEADER_FILES      llpanelpicks.h      llpanelplace.h      llpanelplaceinfo.h -    llpanelshower.h      llpanelplaces.h      llpanelplacestab.h +    llpanelprimmediacontrols.h      llpanelprofile.h      llpanelprofileview.h +    llpanelshower.h      llpanelteleporthistory.h      llpanelvolume.h      llparcelselection.h @@ -838,9 +838,9 @@ set(viewer_HEADER_FILES      llremoteparcelrequest.h      llresourcedata.h      llrootview.h +    llsavedsettingsglue.h      llscreenchannel.h      llscrollingpanelparam.h -    llsavedsettingsglue.h      llsearchcombobox.h      llsearchhistory.h      llselectmgr.h @@ -905,6 +905,7 @@ set(viewer_HEADER_FILES      llurl.h      llurldispatcher.h      llurlhistory.h +    llurllineeditorctrl.h      llurlsimstring.h      llurlwhitelist.h      llvectorperfoptions.h @@ -928,8 +929,8 @@ set(viewer_HEADER_FILES      llviewerkeyboard.h      llviewerlayer.h      llviewermedia.h -    llviewermediaobserver.h      llviewermediafocus.h +    llviewermediaobserver.h      llviewermenu.h      llviewermenufile.h      llviewermessage.h @@ -965,9 +966,9 @@ set(viewer_HEADER_FILES      llvoground.h      llvoicechannel.h      llvoiceclient.h +    llvoicecontrolpanel.h      llvoiceremotectrl.h      llvoicevisualizer.h -    llvoicecontrolpanel.h      llvoinventorylistener.h      llvopartgroup.h      llvosky.h @@ -985,7 +986,6 @@ set(viewer_HEADER_FILES      llwearabledictionary.h      llwearablelist.h      llweb.h -    llmediactrl.h      llwind.h      llwindebug.h      llwlanimator.h diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index f3bfa37cea..c43ba27984 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -5589,6 +5589,13 @@      </layer>      <layer +       name="hair texture alpha layer" +       visibility_mask="TRUE"> +      <texture +         local_texture="hair_grain" /> +    </layer> + +    <layer         name="hair alpha"         visibility_mask="TRUE">        <texture diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 38e8985188..aaca568320 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -254,7 +254,7 @@ mMessageSeparatorFilename(p.message_separator),  mLeftTextPad(p.left_text_pad),  mRightTextPad(p.right_text_pad),  mLeftWidgetPad(p.left_widget_pad), -mRightWidgetPad(p.rigth_widget_pad) +mRightWidgetPad(p.right_widget_pad)  {  } @@ -308,12 +308,19 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& sty  	}  	//Prepare the rect for the view  	LLRect target_rect = getDocumentView()->getRect(); -	target_rect.mLeft += mLeftWidgetPad; +	// squeeze down the widget by subtracting padding off left and right +	target_rect.mLeft += mLeftWidgetPad + mHPad;  	target_rect.mRight -= mRightWidgetPad;  	view->reshape(target_rect.getWidth(), view->getRect().getHeight());  	view->setOrigin(target_rect.mLeft, view->getRect().mBottom); -	appendWidget(view, view_text, FALSE, TRUE, mLeftWidgetPad, 0); +	LLInlineViewSegment::Params p; +	p.view = view; +	p.force_newline = true; +	p.left_pad = mLeftWidgetPad; +	p.right_pad = mRightWidgetPad; + +	appendWidget(p, view_text, false);  	//Append the text message  	std::string message = chat.mText + '\n'; diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h index f13e974a9c..92dcfdd958 100644 --- a/indra/newview/llchathistory.h +++ b/indra/newview/llchathistory.h @@ -53,7 +53,7 @@ class LLChatHistory : public LLTextEditor  			//Widget left padding from the scroll rect  			Optional<S32>			left_widget_pad;  			//Widget right padding from the scroll rect -			Optional<S32>			rigth_widget_pad; +			Optional<S32>			right_widget_pad;  			Params()  			:	message_header("message_header"), @@ -61,7 +61,7 @@ class LLChatHistory : public LLTextEditor  				left_text_pad("left_text_pad"),  				right_text_pad("right_text_pad"),  				left_widget_pad("left_widget_pad"), -				rigth_widget_pad("rigth_widget_pad") +				right_widget_pad("right_widget_pad")  				{  				} diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 92ad28a105..63ea990d14 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -61,6 +61,9 @@  #include "lluri.h"
  #include "v3dmath.h"
  #include "llwindow.h"
 +#include "stringize.h"
 +#include "llsdutil_math.h"
 +#include "lleventdispatcher.h"
  #if LL_WINDOWS
  #include "lldxhardware.h"
 @@ -85,6 +88,10 @@ private:  public:
  	/*virtual*/ BOOL postBuild();
 +
 +	/// Obtain the data used to fill out the contents string. This is
 +	/// separated so that we can programmatically access the same info.
 +	static LLSD getInfo();
  	void onClickCopyToClipboard();
  };
 @@ -114,25 +121,117 @@ BOOL LLFloaterAbout::postBuild()  	getChild<LLUICtrl>("copy_btn")->setCommitCallback(
  		boost::bind(&LLFloaterAbout::onClickCopyToClipboard, this));
 -	// Version string
 -	std::string version = LLTrans::getString("APP_NAME")
 -		+ llformat(" %d.%d.%d (%d) %s %s (%s)\n",
 -				   LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD,
 -				   __DATE__, __TIME__,
 -				   gSavedSettings.getString("VersionChannelName").c_str());
 +#if LL_WINDOWS
 +	getWindow()->incBusyCount();
 +	getWindow()->setCursor(UI_CURSOR_ARROW);
 +#endif
 +	LLSD info(getInfo());
 +#if LL_WINDOWS
 +	getWindow()->decBusyCount();
 +	getWindow()->setCursor(UI_CURSOR_ARROW);
 +#endif
 -	std::string support;
 -	support.append(version);
 -	support.append("[" + get_viewer_release_notes_url() + " " +
 -				   LLTrans::getString("ReleaseNotes") + "]");
 -	support.append("\n\n");
 +	std::ostringstream support;
 -#if LL_MSVC
 -    support.append(llformat("Built with MSVC version %d\n\n", _MSC_VER));
 -#endif
 +	// Render the LLSD from getInfo() as a format_map_t
 +	LLStringUtil::format_map_t args;
 +	// For reasons I don't yet understand, [ReleaseNotes] is not part of the
 +	// default substitution strings whereas [APP_NAME] is. But it works to
 +	// simply copy it into these specific args.
 +	args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes");
 +	for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap());
 +		 ii != iend; ++ii)
 +	{
 +		if (! ii->second.isArray())
 +		{
 +			// Scalar value
 +			if (ii->second.isUndefined())
 +			{
 +				args[ii->first] = getString("none");
 +			}
 +			else
 +			{
 +				// don't forget to render value asString()
 +				args[ii->first] = ii->second.asString();
 +			}
 +		}
 +		else
 +		{
 +			// array value: build KEY_0, KEY_1 etc. entries
 +			for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n)
 +			{
 +				args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString();
 +			}
 +		}
 +	}
 +
 +	// Now build the various pieces
 +	support << getString("AboutHeader", args);
 +	if (info.has("COMPILER"))
 +	{
 +		support << "\n\n" << getString("AboutCompiler", args);
 +	}
 +	if (info.has("REGION"))
 +	{
 +		support << "\n\n" << getString("AboutPosition", args);
 +	}
 +	support << "\n\n" << getString("AboutSystem", args);
 +	if (info.has("GRAPHICS_DRIVER_VERSION"))
 +	{
 +		support << "\n\n" << getString("AboutDriver", args);
 +	}
 +	support << "\n\n" << getString("AboutLibs", args);
 +	if (info.has("PACKETS_IN"))
 +	{
 +		support << '\n' << getString("AboutTraffic", args);
 +	}
 -#if LL_GNUC
 -    support.append(llformat("Built with GCC version %d\n\n", GCC_VERSION));
 +	support_widget->appendText(support.str(), 
 +								FALSE, 
 +								LLStyle::Params()
 +									.color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor")));
 +	support_widget->blockUndo();
 +
 +	// Fix views
 +	support_widget->setCursorPos(0);
 +	support_widget->setEnabled(FALSE);
 +
 +	credits_widget->setCursorPos(0);
 +	credits_widget->setEnabled(FALSE);
 +
 +	return TRUE;
 +}
 +
 +// static
 +LLSD LLFloaterAbout::getInfo()
 +{
 +	// The point of having one method build an LLSD info block and the other
 +	// construct the user-visible About string is to ensure that the same info
 +	// is available to a getInfo() caller as to the user opening
 +	// LLFloaterAbout.
 +	LLSD info;
 +	LLSD version;
 +	version.append(LL_VERSION_MAJOR);
 +	version.append(LL_VERSION_MINOR);
 +	version.append(LL_VERSION_PATCH);
 +	version.append(LL_VERSION_BUILD);
 +	info["VIEWER_VERSION"] = version;
 +	info["VIEWER_VERSION_STR"] = STRINGIZE(version[0].asInteger() << '.' <<
 +										   version[1].asInteger() << '.' <<
 +										   version[2].asInteger() << '.' <<
 +										   version[3].asInteger());
 +	info["BUILD_DATE"] = __DATE__;
 +	info["BUILD_TIME"] = __TIME__;
 +	info["CHANNEL"] = gSavedSettings.getString("VersionChannelName");
 +
 +	info["VIEWER_RELEASE_NOTES_URL"] = get_viewer_release_notes_url();
 +
 +#if LL_MSVC
 +	info["COMPILER"] = "MSVC";
 +	info["COMPILER_VERSION"] = _MSC_VER;
 +#elif LL_GNUC
 +	info["COMPILER"] = "GCC";
 +	info["COMPILER_VERSION"] = GCC_VERSION;
  #endif
  	// Position
 @@ -140,120 +239,49 @@ BOOL LLFloaterAbout::postBuild()  	if (region)
  	{
  		const LLVector3d &pos = gAgent.getPositionGlobal();
 -		LLUIString pos_text = getString("you_are_at");
 -		pos_text.setArg("[POSITION]",
 -						llformat("%.1f, %.1f, %.1f ", pos.mdV[VX], pos.mdV[VY], pos.mdV[VZ]));
 -		support.append(pos_text);
 -
 -		LLUIString region_text = getString ("in_region") + " ";
 -		region_text.setArg("[REGION]", llformat ("%s", gAgent.getRegion()->getName().c_str()));
 -		support.append(region_text);
 -
 -		std::string buffer;
 -		buffer = gAgent.getRegion()->getHost().getHostName();
 -		support.append(buffer);
 -		support.append(" (");
 -		buffer = gAgent.getRegion()->getHost().getString();
 -		support.append(buffer);
 -		support.append(")\n");
 -		support.append(gLastVersionChannel);
 -		support.append("\n");
 -		support.append("[" + LLWeb::escapeURL(region->getCapability("ServerReleaseNotes")) +
 -					   " " + LLTrans::getString("ReleaseNotes") + "]");
 -		support.append("\n\n");
 +		info["POSITION"] = ll_sd_from_vector3d(pos);
 +		info["REGION"] = gAgent.getRegion()->getName();
 +		info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName();
 +		info["HOSTIP"] = gAgent.getRegion()->getHost().getString();
 +		info["SERVER_VERSION"] = gLastVersionChannel;
 +		info["SERVER_RELEASE_NOTES_URL"] = LLWeb::escapeURL(region->getCapability("ServerReleaseNotes"));
  	}
 -	// *NOTE: Do not translate text like GPU, Graphics Card, etc -
 -	//  Most PC users that know what these mean will be used to the english versions,
 -	//  and this info sometimes gets sent to support
 -	
  	// CPU
 -	support.append(getString("CPU") + " ");
 -	support.append( gSysCPU.getCPUString() );
 -	support.append("\n");
 -
 -	U32 memory = gSysMemory.getPhysicalMemoryKB() / 1024;
 +	info["CPU"] = gSysCPU.getCPUString();
 +	info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB() / 1024);
  	// Moved hack adjustment to Windows memory size into llsys.cpp
 -
 -	LLStringUtil::format_map_t args;
 -	args["[MEM]"] = llformat ("%u", memory);
 -	support.append(getString("Memory", args) + "\n");
 -
 -	support.append(getString("OSVersion") + " ");
 -	support.append( LLAppViewer::instance()->getOSInfo().getOSString() );
 -	support.append("\n");
 -
 -	support.append(getString("GraphicsCardVendor") + " ");
 -	support.append( (const char*) glGetString(GL_VENDOR) );
 -	support.append("\n");
 -
 -	support.append(getString("GraphicsCard") + " ");
 -	support.append( (const char*) glGetString(GL_RENDERER) );
 -	support.append("\n");
 +	info["OS_VERSION"] = LLAppViewer::instance()->getOSInfo().getOSString();
 +	info["GRAPHICS_CARD_VENDOR"] = (const char*)(glGetString(GL_VENDOR));
 +	info["GRAPHICS_CARD"] = (const char*)(glGetString(GL_RENDERER));
  #if LL_WINDOWS
 -    getWindow()->incBusyCount();
 -    getWindow()->setCursor(UI_CURSOR_ARROW);
 -    support.append("Windows Graphics Driver Version: ");
      LLSD driver_info = gDXHardware.getDisplayInfo();
      if (driver_info.has("DriverVersion"))
      {
 -        support.append(driver_info["DriverVersion"]);
 +        info["GRAPHICS_DRIVER_VERSION"] = driver_info["DriverVersion"];
      }
 -    support.append("\n");
 -    getWindow()->decBusyCount();
 -    getWindow()->setCursor(UI_CURSOR_ARROW);
  #endif
 -	support.append(getString("OpenGLVersion") + " ");
 -	support.append( (const char*) glGetString(GL_VERSION) );
 -	support.append("\n");
 -
 -	support.append("\n");
 -
 -	support.append(getString("LibCurlVersion") + " ");
 -	support.append( LLCurl::getVersionString() );
 -	support.append("\n");
 -
 -	support.append(getString("J2CDecoderVersion") + " ");
 -	support.append( LLImageJ2C::getEngineInfo() );
 -	support.append("\n");
 -
 -	support.append(getString("AudioDriverVersion") + " ");
 +	info["OPENGL_VERSION"] = (const char*)(glGetString(GL_VERSION));
 +	info["LIBCURL_VERSION"] = LLCurl::getVersionString();
 +	info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();
  	bool want_fullname = true;
 -	support.append( gAudiop ? gAudiop->getDriverName(want_fullname) : getString("none") );
 -	support.append("\n");
 +	info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD();
  	// TODO: Implement media plugin version query
 -
 -	support.append(getString("LLQtWebkitVersion") + " ");
 -	support.append("\n");
 +	info["QT_WEBKIT_VERSION"] = "4.5.2";
  	if (gPacketsIn > 0)
  	{
 -		args["[LOST]"] = llformat ("%.0f", LLViewerStats::getInstance()->mPacketsLostStat.getCurrent());
 -		args["[IN]"] = llformat ("%.0f", F32(gPacketsIn));
 -		args["[PCT]"] = llformat ("%.1f", 100.f*LLViewerStats::getInstance()->mPacketsLostStat.getCurrent() / F32(gPacketsIn) );
 -		support.append(getString ("PacketsLost", args) + "\n");
 +		info["PACKETS_LOST"] = LLViewerStats::getInstance()->mPacketsLostStat.getCurrent();
 +		info["PACKETS_IN"] = F32(gPacketsIn);
 +		info["PACKETS_PCT"] = 100.f*info["PACKETS_LOST"].asReal() / info["PACKETS_IN"].asReal();
  	}
 -	support_widget->appendText(support, 
 -								FALSE, 
 -								LLStyle::Params()
 -									.color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor")));
 -	support_widget->blockUndo();
 -
 -	// Fix views
 -	support_widget->setCursorPos(0);
 -	support_widget->setEnabled(FALSE);
 -
 -	credits_widget->setCursorPos(0);
 -	credits_widget->setEnabled(FALSE);
 -
 -	return TRUE;
 +    return info;
  }
 -
  static std::string get_viewer_release_notes_url()
  {
  	std::ostringstream version;
 @@ -272,6 +300,27 @@ static std::string get_viewer_release_notes_url()  	return LLWeb::escapeURL(url.str());
  }
 +class LLFloaterAboutListener: public LLDispatchListener
 +{
 +public:
 +	LLFloaterAboutListener():
 +		LLDispatchListener("LLFloaterAbout", "op")
 +	{
 +		add("getInfo", &LLFloaterAboutListener::getInfo, LLSD().insert("reply", LLSD()));
 +	}
 +
 +private:
 +	void getInfo(const LLSD& request) const
 +	{
 +		LLReqID reqid(request);
 +		LLSD reply(LLFloaterAbout::getInfo());
 +		reqid.stamp(reply);
 +		LLEventPumps::instance().obtain(request["reply"]).post(reply);
 +	}
 +};
 +
 +static LLFloaterAboutListener floaterAboutListener;
 +
  void LLFloaterAbout::onClickCopyToClipboard()
  {
  	LLViewerTextEditor *support_widget = 
 diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 3802d13f8b..c32ef2f22b 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -261,6 +261,15 @@ void LLNavigationBar::draw()  		onTeleportHistoryChanged();  		mPurgeTPHistoryItems = false;  	} + +	if (isBackgroundVisible()) +	{ +		static LLUICachedControl<S32> drop_shadow_floater ("DropShadowFloater", 0); +		static LLUIColor color_drop_shadow = LLUIColorTable::instance().getColor("ColorDropShadow"); +		gl_drop_shadow(0, getRect().getHeight(), getRect().getWidth(), 0, +                           color_drop_shadow, drop_shadow_floater ); +	} +  	LLPanel::draw();  } diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp new file mode 100644 index 0000000000..ca7ebb1ad8 --- /dev/null +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -0,0 +1,1095 @@ +/**  + * @file llpanelprimmediacontrols.cpp + * @brief media controls popup panel + * + * $LicenseInfo:firstyear=2003&license=viewergpl$ + *  + * Copyright (c) 2003-2007, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +//LLPanelPrimMediaControls +#include "llagent.h" +#include "llparcel.h" +#include "llpanel.h" +#include "llselectmgr.h" +#include "llmediaentry.h" +#include "llrender.h" +#include "lldrawable.h" +#include "llviewerwindow.h" +#include "lluictrlfactory.h" +#include "llbutton.h" +#include "llface.h" +#include "llcombobox.h" +#include "llslider.h" +#include "llhudview.h" +#include "lliconctrl.h" +#include "lltoolpie.h" +#include "llviewercamera.h" +#include "llviewerobjectlist.h" +#include "llpanelprimmediacontrols.h" +#include "llpluginclassmedia.h" +#include "llprogressbar.h" +#include "llviewercontrol.h" +#include "llviewerparcelmgr.h" +#include "llviewermedia.h" +#include "llviewermediafocus.h" +#include "llvovolume.h" +#include "llweb.h" +#include "llwindow.h" + +glh::matrix4f glh_get_current_modelview(); +glh::matrix4f glh_get_current_projection(); + +const F32 ZOOM_NEAR_PADDING		= 1.0f; +const F32 ZOOM_MEDIUM_PADDING	= 1.15f; +const F32 ZOOM_FAR_PADDING		= 1.5f; + +// Warning: make sure these two match! +const LLPanelPrimMediaControls::EZoomLevel LLPanelPrimMediaControls::kZoomLevels[] = { ZOOM_NONE, ZOOM_MEDIUM }; +const int LLPanelPrimMediaControls::kNumZoomLevels = 2; + +// +// LLPanelPrimMediaControls +// + +LLPanelPrimMediaControls::LLPanelPrimMediaControls() :  +	mAlpha(1.f), +	mCurrentURL(""), +	mPreviousURL(""), +	mPauseFadeout(false), +	mUpdateSlider(true), +	mClearFaceOnFade(false), +	mCurrentRate(0.0), +	mMovieDuration(0.0), +	mUpdatePercent(0) +{ +	mCommitCallbackRegistrar.add("MediaCtrl.Close",		boost::bind(&LLPanelPrimMediaControls::onClickClose, this)); +	mCommitCallbackRegistrar.add("MediaCtrl.Back",		boost::bind(&LLPanelPrimMediaControls::onClickBack, this)); +	mCommitCallbackRegistrar.add("MediaCtrl.Forward",	boost::bind(&LLPanelPrimMediaControls::onClickForward, this)); +	mCommitCallbackRegistrar.add("MediaCtrl.Home",		boost::bind(&LLPanelPrimMediaControls::onClickHome, this)); +	mCommitCallbackRegistrar.add("MediaCtrl.Stop",		boost::bind(&LLPanelPrimMediaControls::onClickStop, this)); +	mCommitCallbackRegistrar.add("MediaCtrl.Reload",	boost::bind(&LLPanelPrimMediaControls::onClickReload, this)); +	mCommitCallbackRegistrar.add("MediaCtrl.Play",		boost::bind(&LLPanelPrimMediaControls::onClickPlay, this)); +	mCommitCallbackRegistrar.add("MediaCtrl.Pause",		boost::bind(&LLPanelPrimMediaControls::onClickPause, this)); +	mCommitCallbackRegistrar.add("MediaCtrl.Open",		boost::bind(&LLPanelPrimMediaControls::onClickOpen, this)); +	mCommitCallbackRegistrar.add("MediaCtrl.Zoom",		boost::bind(&LLPanelPrimMediaControls::onClickZoom, this)); +	mCommitCallbackRegistrar.add("MediaCtrl.CommitURL",	boost::bind(&LLPanelPrimMediaControls::onCommitURL, this)); +	mCommitCallbackRegistrar.add("MediaCtrl.JumpProgress",		boost::bind(&LLPanelPrimMediaControls::onCommitSlider, this)); +	mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeUp",	boost::bind(&LLPanelPrimMediaControls::onCommitVolumeUp, this)); +	mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeDown",	boost::bind(&LLPanelPrimMediaControls::onCommitVolumeDown, this)); +	mCommitCallbackRegistrar.add("MediaCtrl.ToggleMute",		boost::bind(&LLPanelPrimMediaControls::onToggleMute, this)); +	 +	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_prim_media_controls.xml"); +	mInactivityTimer.reset(); +	mFadeTimer.stop(); +	mCurrentZoom = ZOOM_NONE; +	mScrollState = SCROLL_NONE; + +	mPanelHandle.bind(this); +} +LLPanelPrimMediaControls::~LLPanelPrimMediaControls() +{ +} + +BOOL LLPanelPrimMediaControls::postBuild() +{ +	LLButton* scroll_up_ctrl = getChild<LLButton>("scrollup"); +	scroll_up_ctrl->setClickedCallback(onScrollUp, this); +	scroll_up_ctrl->setHeldDownCallback(onScrollUpHeld, this); +	scroll_up_ctrl->setMouseUpCallback(onScrollStop, this); +	LLButton* scroll_left_ctrl = getChild<LLButton>("scrollleft"); +	scroll_left_ctrl->setClickedCallback(onScrollLeft, this); +	scroll_left_ctrl->setHeldDownCallback(onScrollLeftHeld, this); +	scroll_left_ctrl->setMouseUpCallback(onScrollStop, this); +	LLButton* scroll_right_ctrl = getChild<LLButton>("scrollright"); +	scroll_right_ctrl->setClickedCallback(onScrollRight, this); +	scroll_right_ctrl->setHeldDownCallback(onScrollLeftHeld, this); +	scroll_right_ctrl->setMouseUpCallback(onScrollStop, this); +	LLButton* scroll_down_ctrl = getChild<LLButton>("scrolldown"); +	scroll_down_ctrl->setClickedCallback(onScrollDown, this); +	scroll_down_ctrl->setHeldDownCallback(onScrollDownHeld, this); +	scroll_down_ctrl->setMouseUpCallback(onScrollStop, this); +	 +	LLUICtrl* media_address	= getChild<LLUICtrl>("media_address"); +	media_address->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this )); +	mInactiveTimeout = gSavedSettings.getF32("MediaControlTimeout"); +	mControlFadeTime = gSavedSettings.getF32("MediaControlFadeTime"); + +	mCurrentZoom = ZOOM_NONE; +	// clicks on HUD buttons do not remove keyboard focus from media +	setIsChrome(TRUE); +	return TRUE; +} + +void LLPanelPrimMediaControls::setMediaFace(LLPointer<LLViewerObject> objectp, S32 face, viewer_media_t media_impl, LLVector3 pick_normal) +{ +	if (media_impl.notNull() && objectp.notNull()) +	{ +		mTargetImplID = media_impl->getMediaTextureID(); +		mTargetObjectID = objectp->getID(); +		mTargetObjectFace = face; +		mTargetObjectNormal = pick_normal; +		mClearFaceOnFade = false; +	} +	else +	{ +		// This happens on a timer now. +//		mTargetImplID = LLUUID::null; +//		mTargetObjectID = LLUUID::null; +//		mTargetObjectFace = 0; +		mClearFaceOnFade = true; +	} + +	updateShape(); +} + +void LLPanelPrimMediaControls::focusOnTarget() +{ +	// Sets the media focus to the current target of the LLPanelPrimMediaControls. +	// This is how we transition from hover to focus when the user clicks on a control. +	LLViewerMediaImpl* media_impl = getTargetMediaImpl(); +	if(media_impl) +	{ +		if(!media_impl->hasFocus()) +		{	 +			// The current target doesn't have media focus -- focus on it. +			LLViewerObject* objectp = getTargetObject(); +			LLViewerMediaFocus::getInstance()->setFocusFace(objectp, mTargetObjectFace, media_impl, mTargetObjectNormal); +		} +	}	 +} + +LLViewerMediaImpl* LLPanelPrimMediaControls::getTargetMediaImpl() +{ +	return LLViewerMedia::getMediaImplFromTextureID(mTargetImplID); +} + +LLViewerObject* LLPanelPrimMediaControls::getTargetObject() +{ +	return gObjectList.findObject(mTargetObjectID); +} + +LLPluginClassMedia* LLPanelPrimMediaControls::getTargetMediaPlugin() +{ +	LLViewerMediaImpl* impl = getTargetMediaImpl(); +	if(impl && impl->hasMedia()) +	{ +		return impl->getMediaPlugin(); +	} +	 +	return NULL; +} + +void LLPanelPrimMediaControls::updateShape() +{ +	const S32 MIN_HUD_WIDTH=400; +	const S32 MIN_HUD_HEIGHT=120; + +	LLViewerMediaImpl* media_impl = getTargetMediaImpl(); +	LLViewerObject* objectp = getTargetObject(); +	 +	if(!media_impl) +	{ +		setVisible(FALSE); +		return; +	} + +	LLPluginClassMedia* media_plugin = NULL; +	if(media_impl->hasMedia()) +	{ +		media_plugin = media_impl->getMediaPlugin(); +	} +	 +	LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + +	bool can_navigate = parcel->getMediaAllowNavigate(); +	bool enabled = false; +	bool has_focus = media_impl->hasFocus(); +	setVisible(enabled); + +	if (objectp) +	{ +		bool mini_controls = false; +		LLMediaEntry *media_data = objectp->getTE(mTargetObjectFace)->getMediaData(); +		if (media_data && NULL != dynamic_cast<LLVOVolume*>(objectp)) +		{ +			// Don't show the media HUD if we do not have permissions +			enabled = dynamic_cast<LLVOVolume*>(objectp)->hasMediaPermission(media_data, LLVOVolume::MEDIA_PERM_CONTROL); +			mini_controls = (LLMediaEntry::MINI == media_data->getControls()); +		} +		 +		// +		// Set the state of the buttons +		// +		LLUICtrl* back_ctrl					= getChild<LLUICtrl>("back"); +		LLUICtrl* fwd_ctrl					= getChild<LLUICtrl>("fwd"); +		LLUICtrl* reload_ctrl				= getChild<LLUICtrl>("reload"); +		LLUICtrl* play_ctrl					= getChild<LLUICtrl>("play"); +		LLUICtrl* pause_ctrl				= getChild<LLUICtrl>("pause"); +		LLUICtrl* stop_ctrl					= getChild<LLUICtrl>("stop"); +		LLUICtrl* media_stop_ctrl			= getChild<LLUICtrl>("media_stop"); +		LLUICtrl* home_ctrl					= getChild<LLUICtrl>("home"); +		LLUICtrl* close_ctrl				= getChild<LLUICtrl>("close"); +		LLUICtrl* open_ctrl					= getChild<LLUICtrl>("new_window"); +        LLUICtrl* zoom_ctrl					= getChild<LLUICtrl>("zoom_frame"); +		LLPanel* media_loading_panel		= getChild<LLPanel>("media_progress_indicator"); +		LLUICtrl* media_address_ctrl		= getChild<LLUICtrl>("media_address"); +		LLUICtrl* media_play_slider_ctrl	= getChild<LLUICtrl>("media_play_position"); +		LLUICtrl* volume_ctrl				= getChild<LLUICtrl>("media_volume"); +		LLButton* volume_btn				= getChild<LLButton>("media_volume_button"); +		LLUICtrl* volume_up_ctrl			= getChild<LLUICtrl>("volume_up"); +		LLUICtrl* volume_down_ctrl			= getChild<LLUICtrl>("volume_down"); +		LLIconCtrl* whitelist_icon			= getChild<LLIconCtrl>("media_whitelist_flag"); +		LLIconCtrl* secure_lock_icon		= getChild<LLIconCtrl>("media_secure_lock_flag"); +		 +		LLUICtrl* media_panel_scroll		= getChild<LLUICtrl>("media_panel_scroll"); +		LLUICtrl* scroll_up_ctrl			= getChild<LLUICtrl>("scrollup"); +		LLUICtrl* scroll_left_ctrl			= getChild<LLUICtrl>("scrollleft"); +		LLUICtrl* scroll_right_ctrl			= getChild<LLUICtrl>("scrollright"); +		LLUICtrl* scroll_down_ctrl			= getChild<LLUICtrl>("scrolldown");		 +				 +		// XXX RSP: TODO: FIXME: clean this up so that it is clearer what mode we are in, +		// and that only the proper controls get made visible/enabled according to that mode.  +		back_ctrl->setVisible(has_focus); +		fwd_ctrl->setVisible(has_focus); +		reload_ctrl->setVisible(has_focus); +		stop_ctrl->setVisible(false); +		home_ctrl->setVisible(has_focus); +		close_ctrl->setVisible(has_focus); +		open_ctrl->setVisible(true); +		media_address_ctrl->setVisible(has_focus && !mini_controls); +		media_play_slider_ctrl->setVisible(has_focus && !mini_controls); +		volume_ctrl->setVisible(false); +		volume_up_ctrl->setVisible(false); +		volume_down_ctrl->setVisible(false); +		 +		whitelist_icon->setVisible(!mini_controls && (media_data)?media_data->getWhiteListEnable():false); +		// Disable zoom if HUD +		zoom_ctrl->setEnabled(!objectp->isHUDAttachment()); +		secure_lock_icon->setVisible(false); +		mCurrentURL = media_impl->getMediaURL(); +		 +		back_ctrl->setEnabled((media_impl != NULL) && media_impl->canNavigateBack() && can_navigate); +		fwd_ctrl->setEnabled((media_impl != NULL) && media_impl->canNavigateForward() && can_navigate); +		stop_ctrl->setEnabled(has_focus && can_navigate); +		home_ctrl->setEnabled(has_focus && can_navigate); +		LLPluginClassMediaOwner::EMediaStatus result = ((media_impl != NULL) && media_impl->hasMedia()) ? media_plugin->getStatus() : LLPluginClassMediaOwner::MEDIA_NONE; + +		if(media_plugin && media_plugin->pluginSupportsMediaTime()) +		{ +			reload_ctrl->setEnabled(FALSE); +			reload_ctrl->setVisible(FALSE); +			media_stop_ctrl->setVisible(has_focus); +			home_ctrl->setVisible(FALSE); +			back_ctrl->setEnabled(has_focus); +			fwd_ctrl->setEnabled(has_focus); +			media_address_ctrl->setVisible(false); +			media_address_ctrl->setEnabled(false); +			media_play_slider_ctrl->setVisible(!mini_controls); +			media_play_slider_ctrl->setEnabled(!mini_controls); +				 +			volume_ctrl->setVisible(has_focus); +			volume_up_ctrl->setVisible(has_focus); +			volume_down_ctrl->setVisible(has_focus); +			volume_ctrl->setEnabled(has_focus); + +			whitelist_icon->setVisible(false); +			secure_lock_icon->setVisible(false); +			scroll_up_ctrl->setVisible(false); +			scroll_left_ctrl->setVisible(false); +			scroll_right_ctrl->setVisible(false); +			scroll_down_ctrl->setVisible(false); +			media_panel_scroll->setVisible(false); +				 +			F32 volume = media_impl->getVolume(); +			// movie's url changed +			if(mCurrentURL!=mPreviousURL) +			{ +				mMovieDuration = media_plugin->getDuration(); +				mPreviousURL = mCurrentURL; +			} +				 +			if(mMovieDuration == 0)  +			{ +				mMovieDuration = media_plugin->getDuration(); +				media_play_slider_ctrl->setValue(0); +				media_play_slider_ctrl->setEnabled(false); +			} +			// TODO: What if it's not fully loaded +					 +			if(mUpdateSlider && mMovieDuration!= 0) +			{ +				F64 current_time =  media_plugin->getCurrentTime(); +				F32 percent = current_time / mMovieDuration; +				media_play_slider_ctrl->setValue(percent); +				media_play_slider_ctrl->setEnabled(true); +			} +				 +			// video vloume +			if(volume <= 0.0) +			{ +				volume_up_ctrl->setEnabled(TRUE); +				volume_down_ctrl->setEnabled(FALSE); +				media_impl->setVolume(0.0); +				volume_btn->setToggleState(true); +			} +			else if (volume >= 1.0) +			{ +				volume_up_ctrl->setEnabled(FALSE); +				volume_down_ctrl->setEnabled(TRUE); +				media_impl->setVolume(1.0); +				volume_btn->setToggleState(false); +			} +			else +			{ +				volume_up_ctrl->setEnabled(TRUE); +				volume_down_ctrl->setEnabled(TRUE); +			} +				 +			switch(result) +			{ +				case LLPluginClassMediaOwner::MEDIA_PLAYING: +					play_ctrl->setEnabled(FALSE); +					play_ctrl->setVisible(FALSE); +					pause_ctrl->setEnabled(TRUE); +					pause_ctrl->setVisible(has_focus); +					media_stop_ctrl->setEnabled(TRUE); +					 +					break; +				case LLPluginClassMediaOwner::MEDIA_PAUSED: +				default: +					pause_ctrl->setEnabled(FALSE); +					pause_ctrl->setVisible(FALSE); +					play_ctrl->setEnabled(TRUE); +					play_ctrl->setVisible(has_focus); +					media_stop_ctrl->setEnabled(FALSE); +					break; +			} +		} +		else   // web based +		{ +			if(media_plugin) +			{ +				mCurrentURL = media_plugin->getLocation(); +			} +			else +			{ +				mCurrentURL.clear(); +			} +				 +			play_ctrl->setVisible(FALSE); +			pause_ctrl->setVisible(FALSE); +			media_stop_ctrl->setVisible(FALSE); +			media_address_ctrl->setVisible(has_focus && !mini_controls); +			media_address_ctrl->setEnabled(has_focus && !mini_controls); +			media_play_slider_ctrl->setVisible(FALSE); +			media_play_slider_ctrl->setEnabled(FALSE); +				 +			volume_ctrl->setVisible(FALSE); +			volume_up_ctrl->setVisible(FALSE); +			volume_down_ctrl->setVisible(FALSE); +			volume_ctrl->setEnabled(FALSE); +			volume_up_ctrl->setEnabled(FALSE); +			volume_down_ctrl->setEnabled(FALSE); +				 +			scroll_up_ctrl->setVisible(has_focus); +			scroll_left_ctrl->setVisible(has_focus); +			scroll_right_ctrl->setVisible(has_focus); +			scroll_down_ctrl->setVisible(has_focus); +			media_panel_scroll->setVisible(has_focus); +			// TODO: get the secure lock bool from media plug in +			std::string prefix =  std::string("https://"); +			std::string test_prefix = mCurrentURL.substr(0, prefix.length()); +			LLStringUtil::toLower(test_prefix); +			if(test_prefix == prefix) +			{ +				secure_lock_icon->setVisible(has_focus); +			} +				 +			if(mCurrentURL!=mPreviousURL) +			{ +				setCurrentURL(); +				mPreviousURL = mCurrentURL; +			} + +			if(result == LLPluginClassMediaOwner::MEDIA_LOADING) +			{ +				reload_ctrl->setEnabled(FALSE); +				reload_ctrl->setVisible(FALSE); +				stop_ctrl->setEnabled(TRUE); +				stop_ctrl->setVisible(has_focus); +			} +			else +			{ +				reload_ctrl->setEnabled(TRUE); +				reload_ctrl->setVisible(has_focus); +				stop_ctrl->setEnabled(FALSE); +				stop_ctrl->setVisible(FALSE); +			} +		} + +		 +		if(media_plugin) +		{ +			// +			// Handle progress bar +			// +			mUpdatePercent = media_plugin->getProgressPercent(); +			if(mUpdatePercent<100.0f) +			{ +				media_loading_panel->setVisible(true); +				getChild<LLProgressBar>("media_progress_bar")->setPercent(mUpdatePercent); +				gFocusMgr.setTopCtrl(media_loading_panel); +			} +			else +			{ +				media_loading_panel->setVisible(false); +				gFocusMgr.setTopCtrl(NULL); +			} +		} + +		if(media_plugin) +		{ +			// +			// Handle Scrolling +			// +			switch (mScrollState)  +			{ +			case SCROLL_UP: +				media_plugin->scrollEvent(0, -1, MASK_NONE); +				break; +			case SCROLL_DOWN: +				media_plugin->scrollEvent(0, 1, MASK_NONE); +				break; +			case SCROLL_LEFT: +				media_impl->handleKeyHere(KEY_LEFT, MASK_NONE); +				break; +			case SCROLL_RIGHT: +				media_impl->handleKeyHere(KEY_RIGHT, MASK_NONE); +				break; +			case SCROLL_NONE: +			default: +				break; +			} +		} +		 +		setVisible(enabled); + +		// +		// Calculate position and shape of the controls +		// +		glh::matrix4f mat = glh_get_current_projection()*glh_get_current_modelview(); +		std::vector<LLVector3>::iterator vert_it; +		std::vector<LLVector3>::iterator vert_end; +		std::vector<LLVector3> vect_face; + +		LLVolume* volume = objectp->getVolume(); + +		if (volume) +		{ +			const LLVolumeFace& vf = volume->getVolumeFace(mTargetObjectFace); + +			const LLVector3* ext = vf.mExtents; + +			LLVector3 center = (ext[0]+ext[1])*0.5f; +			LLVector3 size = (ext[1]-ext[0])*0.5f; +			LLVector3 vert[] = +			{ +				center + size.scaledVec(LLVector3(1,1,1)), +				center + size.scaledVec(LLVector3(-1,1,1)), +				center + size.scaledVec(LLVector3(1,-1,1)), +				center + size.scaledVec(LLVector3(-1,-1,1)), +				center + size.scaledVec(LLVector3(1,1,-1)), +				center + size.scaledVec(LLVector3(-1,1,-1)), +				center + size.scaledVec(LLVector3(1,-1,-1)), +				center + size.scaledVec(LLVector3(-1,-1,-1)), +			}; + +			LLVOVolume* vo = (LLVOVolume*) objectp; + +			for (U32 i = 0; i < 8; i++) +			{ +				vect_face.push_back(vo->volumePositionToAgent(vert[i]));	 +			} +		} +		vert_it = vect_face.begin(); +		vert_end = vect_face.end(); + +		LLVector3 min = LLVector3(1,1,1); +		LLVector3 max = LLVector3(-1,-1,-1); +		for(; vert_it != vert_end; ++vert_it) +		{ +			// project silhouette vertices into screen space +			glh::vec3f screen_vert = glh::vec3f(vert_it->mV);  +			mat.mult_matrix_vec(screen_vert); + +			// add to screenspace bounding box +			update_min_max(min, max, LLVector3(screen_vert.v)); +		} + +        LLCoordGL screen_min; +		screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidth() * (min.mV[VX] + 1.f) * 0.5f); +		screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeight() * (min.mV[VY] + 1.f) * 0.5f); + +		LLCoordGL screen_max; +		screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidth() * (max.mV[VX] + 1.f) * 0.5f); +		screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeight() * (max.mV[VY] + 1.f) * 0.5f); + +		// grow panel so that screenspace bounding box fits inside "media_region" element of HUD +		LLRect media_controls_rect; +		getParent()->screenRectToLocal(LLRect(screen_min.mX, screen_max.mY, screen_max.mX, screen_min.mY), &media_controls_rect); +		LLView* media_region = getChild<LLView>("media_region"); +		media_controls_rect.mLeft -= media_region->getRect().mLeft; +		media_controls_rect.mBottom -= media_region->getRect().mBottom; +		media_controls_rect.mTop += getRect().getHeight() - media_region->getRect().mTop; +		media_controls_rect.mRight += getRect().getWidth() - media_region->getRect().mRight; + +		LLRect old_hud_rect = media_controls_rect; +		// keep all parts of HUD on-screen +		media_controls_rect.intersectWith(getParent()->getLocalRect()); + +		// clamp to minimum size, keeping centered +		media_controls_rect.setCenterAndSize(media_controls_rect.getCenterX(), media_controls_rect.getCenterY(), +			llmax(MIN_HUD_WIDTH, media_controls_rect.getWidth()), llmax(MIN_HUD_HEIGHT, media_controls_rect.getHeight())); + +		setShape(media_controls_rect, true); + +		// Test mouse position to see if the cursor is stationary +		LLCoordWindow cursor_pos_window; +		getWindow()->getCursorPosition(&cursor_pos_window); + +		// If last pos is not equal to current pos, the mouse has moved +		// We need to reset the timer, and make sure the panel is visible +		if(cursor_pos_window.mX != mLastCursorPos.mX || +			cursor_pos_window.mY != mLastCursorPos.mY || +			mScrollState != SCROLL_NONE) +		{ +			mInactivityTimer.start(); +			mLastCursorPos = cursor_pos_window; +		} +		 +		if(isMouseOver()) +		{ +			// Never fade the controls if the mouse is over them. +			mFadeTimer.stop(); +		} +		else if(!mClearFaceOnFade && (mInactivityTimer.getElapsedTimeF32() < mInactiveTimeout)) +		{ +			// Mouse is over the object, but has not been stationary for long enough to fade the UI +			mFadeTimer.stop(); +		} +		else if(! mFadeTimer.getStarted() ) +		{ +			// we need to start fading the UI (and we have not already started) +			mFadeTimer.reset(); +			mFadeTimer.start(); +		} +		else +		{ +			// I don't think this is correct anymore.  This is done in draw() after the fade has completed. +//			setVisible(FALSE); +		} +	} +} + +/*virtual*/ +void LLPanelPrimMediaControls::draw() +{ +	F32 alpha = 1.f; +	if(mFadeTimer.getStarted()) +	{ +		F32 time = mFadeTimer.getElapsedTimeF32(); +		alpha = llmax(lerp(1.0, 0.0, time / mControlFadeTime), 0.0f); + +		if(mFadeTimer.getElapsedTimeF32() >= mControlFadeTime) +		{ +			setVisible(FALSE); +			if(mClearFaceOnFade) +			{ +				mClearFaceOnFade = false; +				mTargetImplID = LLUUID::null; +				mTargetObjectID = LLUUID::null; +				mTargetObjectFace = 0; +			} +		} +	} +	 +	{ +		LLViewDrawContext context(alpha); +		LLPanel::draw(); +	} +} + +BOOL LLPanelPrimMediaControls::handleScrollWheel(S32 x, S32 y, S32 clicks) +{ +	mInactivityTimer.start(); +	return LLViewerMediaFocus::getInstance()->handleScrollWheel(x, y, clicks); +} + +BOOL LLPanelPrimMediaControls::handleMouseDown(S32 x, S32 y, MASK mask) +{ +	mInactivityTimer.start(); +	return LLPanel::handleMouseDown(x, y, mask); +} + +BOOL LLPanelPrimMediaControls::handleMouseUp(S32 x, S32 y, MASK mask) +{ +	mInactivityTimer.start(); +	return LLPanel::handleMouseUp(x, y, mask); +} + +BOOL LLPanelPrimMediaControls::handleKeyHere( KEY key, MASK mask ) +{ +	mInactivityTimer.start(); +	return LLPanel::handleKeyHere(key, mask); +} + +bool LLPanelPrimMediaControls::isMouseOver() +{ +	bool result = false; +	 +	if( getVisible() ) +	{ +		LLCoordWindow cursor_pos_window; +		LLCoordScreen cursor_pos_screen; +		LLCoordGL cursor_pos_gl; +		S32 x, y; +		getWindow()->getCursorPosition(&cursor_pos_window); +		getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl); +		 +		LLPanel* controls_panel = NULL; +		controls_panel = getChild<LLPanel>("media_hover_controls"); +		if(controls_panel && !controls_panel->getVisible()) +		{ +			// The hover controls aren't visible -- use the focused controls instead. +			controls_panel = getChild<LLPanel>("media_focused_controls"); +		} +		 +		if(controls_panel && controls_panel->getVisible()) +		{ +			controls_panel->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y); + +			LLView *hit_child = controls_panel->childFromPoint(x, y); +			if(hit_child) +			{ +				// This was useful for debugging both coordinate translation and view hieararchy problems... +//				llinfos << "mouse coords: " << x << ", " << y << " hit child " << hit_child->getName() << llendl; +				result = true; +			} +		} +	} + +	return result; +} + + +void LLPanelPrimMediaControls::onClickClose() +{ +	close(); +} + +void LLPanelPrimMediaControls::close() +{ +	LLViewerMediaFocus::getInstance()->clearFocus(); +	resetZoomLevel(); +	setVisible(FALSE); +} + + +void LLPanelPrimMediaControls::onClickBack() +{ +	focusOnTarget(); + +	LLViewerMediaImpl* impl =getTargetMediaImpl(); +	 +	if (impl) +	{ +		impl->navigateBack(); +	} +} + +void LLPanelPrimMediaControls::onClickForward() +{ +	focusOnTarget(); + +	LLViewerMediaImpl* impl = getTargetMediaImpl(); +	 +	if (impl) +	{ +		impl->navigateForward(); +	} +} + +void LLPanelPrimMediaControls::onClickHome() +{ +	focusOnTarget(); + +	LLViewerMediaImpl* impl = getTargetMediaImpl(); + +	if(impl) +	{ +		impl->navigateHome(); +	} +} + +void LLPanelPrimMediaControls::onClickOpen() +{ +	LLViewerMediaImpl* impl =getTargetMediaImpl(); +	if(impl) +	{ +		if(impl->getMediaPlugin()) +		{	 +			if(impl->getMediaPlugin()->getLocation().empty()) +			{ +				LLWeb::loadURL(impl->getMediaURL()); +			} +			else +			{ +				LLWeb::loadURL( impl->getMediaPlugin()->getLocation()); +			} +		} +	}	 +} + +void LLPanelPrimMediaControls::onClickReload() +{ +	focusOnTarget(); + +	//LLViewerMedia::navigateHome(); +	LLViewerMediaImpl* impl = getTargetMediaImpl(); + +	if(impl) +	{ +		impl->navigateReload(); +	} +} + +void LLPanelPrimMediaControls::onClickPlay() +{ +	focusOnTarget(); + +	LLViewerMediaImpl* impl = getTargetMediaImpl(); + +	if(impl) +	{ +		impl->play(); +	} +} + +void LLPanelPrimMediaControls::onClickPause() +{ +	focusOnTarget(); + +	LLViewerMediaImpl* impl = getTargetMediaImpl(); + +	if(impl) +	{ +		impl->pause(); +	} +} + +void LLPanelPrimMediaControls::onClickStop() +{ +	focusOnTarget(); + +	LLViewerMediaImpl* impl = getTargetMediaImpl(); + +	if(impl) +	{ +		impl->stop(); +	} +} + +void LLPanelPrimMediaControls::onClickZoom() +{ +	focusOnTarget(); + +	nextZoomLevel(); +} +void LLPanelPrimMediaControls::nextZoomLevel() +{ +	int index = 0; +	while (index < kNumZoomLevels) +	{ +		if (kZoomLevels[index] == mCurrentZoom)  +		{ +			index++; +			break; +		} +		index++; +	} +	mCurrentZoom = kZoomLevels[index % kNumZoomLevels]; +	updateZoom(); +} + +void LLPanelPrimMediaControls::resetZoomLevel() +{ +	if(mCurrentZoom != ZOOM_NONE) +	{ +		mCurrentZoom = ZOOM_NONE; +		updateZoom(); +	} +} + +void LLPanelPrimMediaControls::updateZoom() +{ +	F32 zoom_padding = 0.0f; +	switch (mCurrentZoom) +	{ +	case ZOOM_NONE: +		{ +			gAgent.setFocusOnAvatar(TRUE, ANIMATE); +			break; +		} +	case ZOOM_FAR: +		{ +			zoom_padding = ZOOM_FAR_PADDING; +			break; +		} +	case ZOOM_MEDIUM: +		{ +			zoom_padding = ZOOM_MEDIUM_PADDING; +			break; +		} +	case ZOOM_NEAR: +		{ +			zoom_padding = ZOOM_NEAR_PADDING; +			break; +		} +	default: +		{ +			gAgent.setFocusOnAvatar(TRUE, ANIMATE); +			break; +		} +	} + +	if (zoom_padding > 0.0f)		 +		LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding); +} +void LLPanelPrimMediaControls::onScrollUp(void* user_data) +{ +	LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data); +	this_panel->focusOnTarget(); + +	LLPluginClassMedia* plugin = this_panel->getTargetMediaPlugin(); +	 +	if(plugin) +	{ +		plugin->scrollEvent(0, -1, MASK_NONE); +	} +} +void LLPanelPrimMediaControls::onScrollUpHeld(void* user_data) +{ +	LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data); +	this_panel->mScrollState = SCROLL_UP; +} +void LLPanelPrimMediaControls::onScrollRight(void* user_data) +{ +	LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data); +	this_panel->focusOnTarget(); + +	LLViewerMediaImpl* impl = this_panel->getTargetMediaImpl(); + +	if(impl) +	{ +		impl->handleKeyHere(KEY_RIGHT, MASK_NONE); +	} +} +void LLPanelPrimMediaControls::onScrollRightHeld(void* user_data) +{ +	LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data); +	this_panel->mScrollState = SCROLL_RIGHT; +} + +void LLPanelPrimMediaControls::onScrollLeft(void* user_data) +{ +	LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data); +	this_panel->focusOnTarget(); + +	LLViewerMediaImpl* impl = this_panel->getTargetMediaImpl(); + +	if(impl) +	{ +		impl->handleKeyHere(KEY_LEFT, MASK_NONE); +	} +} +void LLPanelPrimMediaControls::onScrollLeftHeld(void* user_data) +{ +	LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data); +	this_panel->mScrollState = SCROLL_LEFT; +} + +void LLPanelPrimMediaControls::onScrollDown(void* user_data) +{ +	LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data); +	this_panel->focusOnTarget(); + +	LLPluginClassMedia* plugin = this_panel->getTargetMediaPlugin(); +	 +	if(plugin) +	{ +		plugin->scrollEvent(0, 1, MASK_NONE); +	} +} +void LLPanelPrimMediaControls::onScrollDownHeld(void* user_data) +{ +	LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data); +	this_panel->mScrollState = SCROLL_DOWN; +} + +void LLPanelPrimMediaControls::onScrollStop(void* user_data) +{ +	LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data); +	this_panel->mScrollState = SCROLL_NONE; +} + +void LLPanelPrimMediaControls::onCommitURL() +{ +	focusOnTarget(); + +	LLUICtrl *media_address_ctrl = getChild<LLUICtrl>("media_address_url"); +	std::string url = media_address_ctrl->getValue().asString(); +	if(getTargetMediaImpl() && !url.empty()) +	{ +		getTargetMediaImpl()->navigateTo( url, "", true); + +		// Make sure keyboard focus is set to the media focus object. +		gFocusMgr.setKeyboardFocus(LLViewerMediaFocus::getInstance()); +			 +	} +	mPauseFadeout = false; +	mFadeTimer.start(); +} + + +void LLPanelPrimMediaControls::onInputURL(LLFocusableElement* caller, void *userdata) +{ + +	LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (userdata); +	this_panel->focusOnTarget(); + +	this_panel->mPauseFadeout = true; +	this_panel->mFadeTimer.stop(); +	this_panel->mFadeTimer.reset(); +	 +} + +void LLPanelPrimMediaControls::setCurrentURL() +{	 +	LLComboBox* media_address_combo	= getChild<LLComboBox>("media_address_combo"); +	// redirects will navigate momentarily to about:blank, don't add to history +	if (media_address_combo && mCurrentURL != "about:blank") +	{ +		media_address_combo->remove(mCurrentURL); +		media_address_combo->add(mCurrentURL, ADD_SORTED); +		media_address_combo->selectByValue(mCurrentURL); +	} +} + +void LLPanelPrimMediaControls::onCommitSlider() +{ +	focusOnTarget(); + +	LLSlider* media_play_slider_ctrl	= getChild<LLSlider>("media_play_slider"); +	LLViewerMediaImpl* media_impl = getTargetMediaImpl(); +	if (media_impl)  +	{ +		// get slider value +		F64 slider_value = media_play_slider_ctrl->getValue().asReal(); +		if(slider_value <= 0.0) +		{	 +			media_impl->stop(); +		} +		else  +		{ +			media_impl->seek(slider_value*mMovieDuration); +			//mUpdateSlider= false; +		} +	} +}		 + +void LLPanelPrimMediaControls::onCommitVolumeUp() +{ +	focusOnTarget(); + +	LLViewerMediaImpl* media_impl = getTargetMediaImpl(); +	if (media_impl)  +	{ +		F32 volume = media_impl->getVolume(); +		 +		volume += 0.1f; +		if(volume >= 1.0f) +		{ +			volume = 1.0f; +		} +		 +		media_impl->setVolume(volume); +		getChild<LLButton>("media_volume")->setToggleState(false); +	} +}		 + +void LLPanelPrimMediaControls::onCommitVolumeDown() +{ +	focusOnTarget(); + +	LLViewerMediaImpl* media_impl = getTargetMediaImpl(); +	if (media_impl)  +	{ +		F32 volume = media_impl->getVolume(); +		 +		volume -= 0.1f; +		if(volume <= 0.0f) +		{ +			volume = 0.0f; +		} + +		media_impl->setVolume(volume); +		getChild<LLButton>("media_volume")->setToggleState(false); +	} +}		 + + +void LLPanelPrimMediaControls::onToggleMute() +{ +	focusOnTarget(); + +	LLViewerMediaImpl* media_impl = getTargetMediaImpl(); +	if (media_impl)  +	{ +		F32 volume = media_impl->getVolume(); +		 +		if(volume > 0.0) +		{ +			media_impl->setVolume(0.0); +		} +		else  +		{ +			media_impl->setVolume(0.5); +		} +	} +} + diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h new file mode 100644 index 0000000000..3ec7aa2356 --- /dev/null +++ b/indra/newview/llpanelprimmediacontrols.h @@ -0,0 +1,148 @@ +/**  + * @file llpanelprimmediacontrols.h + * @brief Pop-up media controls panel + * + * $LicenseInfo:firstyear=2003&license=viewergpl$ + *  + * Copyright (c) 2003-2007, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_PANELPRIMMEDIACONTROLS_H +#define LL_PANELPRIMMEDIACONTROLS_H + +#include "llpanel.h" +#include "llviewermedia.h" + +class LLCoordWindow; +class LLViewerMediaImpl; + +class LLPanelPrimMediaControls : public LLPanel +{ +public: +	LLPanelPrimMediaControls(); +	virtual ~LLPanelPrimMediaControls(); +	/*virtual*/ BOOL postBuild(); +	virtual void draw(); +	virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); + +	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); +	virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); +	virtual BOOL handleKeyHere(KEY key, MASK mask); +	 +	void updateShape(); +	bool isMouseOver(); +	void nextZoomLevel(); +	void resetZoomLevel(); +	void close(); + +	LLHandle<LLPanelPrimMediaControls>	getHandle() const { return mPanelHandle; } +	void setMediaFace(LLPointer<LLViewerObject> objectp, S32 face, viewer_media_t media_impl, LLVector3 pick_normal = LLVector3::zero); + + +	enum EZoomLevel +	{ +		ZOOM_NONE = 0, +		ZOOM_FAR, +		ZOOM_MEDIUM, +		ZOOM_NEAR +	}; +	static const EZoomLevel kZoomLevels[]; +	static const int kNumZoomLevels; +	 +	enum EScrollDir +	{ +		SCROLL_UP = 0, +		SCROLL_DOWN, +		SCROLL_LEFT, +		SCROLL_RIGHT, +		SCROLL_NONE +	}; + +private: +	void onClickClose(); +	void onClickBack(); +	void onClickForward(); +	void onClickHome(); +	void onClickOpen(); +	void onClickReload(); +	void onClickPlay(); +	void onClickPause(); +	void onClickStop(); +	void onClickZoom(); +	void onCommitURL(); +	 +	void updateZoom(); +	void setCurrentURL(); +	void onCommitSlider(); +	 +	void onCommitVolumeUp(); +	void onCommitVolumeDown(); +	void onToggleMute(); +	 +	static void onScrollUp(void* user_data); +	static void onScrollUpHeld(void* user_data); +	static void onScrollLeft(void* user_data); +	static void onScrollLeftHeld(void* user_data); +	static void onScrollRight(void* user_data); +	static void onScrollRightHeld(void* user_data); +	static void onScrollDown(void* user_data); +	static void onScrollDownHeld(void* user_data); +	static void onScrollStop(void* user_data); +	 +	static void onInputURL(LLFocusableElement* caller, void *userdata); +	static bool hasControlsPermission(LLViewerObject *obj, const LLMediaEntry *media_entry); +	 +	void focusOnTarget(); +	 +	LLViewerMediaImpl* getTargetMediaImpl(); +	LLViewerObject* getTargetObject(); +	LLPluginClassMedia* getTargetMediaPlugin(); +	bool mPauseFadeout; +	bool mUpdateSlider; +	bool mClearFaceOnFade; + +	LLMatrix4 mLastCameraMat; +	EZoomLevel mCurrentZoom; +	EScrollDir mScrollState; +	LLCoordWindow mLastCursorPos; +	LLFrameTimer mInactivityTimer; +	LLFrameTimer mFadeTimer; +	F32 mInactiveTimeout; +	F32 mControlFadeTime; +	LLRootHandle<LLPanelPrimMediaControls> mPanelHandle; +	F32 mAlpha; +	std::string mCurrentURL; +	std::string mPreviousURL; +	F64 mCurrentRate; +	F64 mMovieDuration; +	int mUpdatePercent; + +	LLUUID mTargetObjectID; +	S32 mTargetObjectFace; +	LLUUID mTargetImplID; +	LLVector3 mTargetObjectNormal; +}; + +#endif // LL_PANELPRIMMEDIACONTROLS_H diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index 17547cae39..5d9046ac90 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -804,8 +804,9 @@ void LLTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height,  	gGL.setColorMask(false, true);  	gGL.setSceneBlendType(LLRender::BT_REPLACE); +	  	// (Optionally) replace alpha with a single component image from a tga file. -	if (!info->mStaticAlphaFileName.empty() && mMaskLayerList.empty()) +	if (!info->mStaticAlphaFileName.empty())  	{  		LLGLSNoAlphaTest gls_no_alpha_test;  		gGL.flush(); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 02fda191be..8bd74dcb04 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -156,10 +156,10 @@ public:  	{  		if(!mInitialized && ! mime_type.empty())  		{ -			if (mMediaImpl->initializeMedia(mime_type)) +			if(mMediaImpl->initializeMedia(mime_type))  			{  				mInitialized = true; -				mMediaImpl->play(); +				mMediaImpl->loadURI();  			}  		}  	} @@ -267,10 +267,6 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s  			{  				needs_navigate = (media_entry->getCurrentURL() != previous_url);  			} -			else if(!media_entry->getHomeURL().empty()) -			{ -				needs_navigate = (media_entry->getHomeURL() != previous_url); -			}  		}  	}  	else @@ -293,8 +289,6 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s  	if(media_impl && needs_navigate)  	{  		std::string url = media_entry->getCurrentURL(); -		if(url.empty()) -			url = media_entry->getHomeURL();  		media_impl->navigateTo(url, "", true, true);  	} @@ -639,13 +633,14 @@ LLViewerMediaImpl::LLViewerMediaImpl(	  const LLUUID& texture_id,  	mUsedInUI(false),  	mHasFocus(false),  	mPriority(LLPluginClassMedia::PRIORITY_UNLOADED), -	mDoNavigateOnLoad(false), -	mDoNavigateOnLoadRediscoverType(false), -	mDoNavigateOnLoadServerRequest(false), +	mNavigateRediscoverType(false), +	mNavigateServerRequest(false),  	mMediaSourceFailed(false),  	mRequestedVolume(1.0f),  	mIsMuted(false),  	mNeedsMuteCheck(false), +	mPreviousMediaState(MEDIA_NONE), +	mPreviousMediaTime(0.0f),  	mIsUpdated(false)  {  @@ -716,7 +711,6 @@ bool LLViewerMediaImpl::initializeMedia(const std::string& mime_type)  		mMimeType = mime_type;  	} -	// play();  	return (mMediaSource != NULL);  } @@ -729,16 +723,13 @@ void LLViewerMediaImpl::createMediaSource()  		return;  	} -	if(mDoNavigateOnLoad) +	if(! mMediaURL.empty())  	{ -		if(! mMediaURL.empty()) -		{ -			navigateTo(mMediaURL, mMimeType, mDoNavigateOnLoadRediscoverType, mDoNavigateOnLoadServerRequest); -		} -		else if(! mMimeType.empty()) -		{ -			initializeMedia(mMimeType); -		} +		navigateInternal(); +	} +	else if(! mMimeType.empty()) +	{ +		initializeMedia(mMimeType);  	}  } @@ -869,6 +860,46 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type)  	return false;  } +////////////////////////////////////////////////////////////////////////////////////////// +void LLViewerMediaImpl::loadURI() +{ +	if(mMediaSource) +	{ +		mMediaSource->loadURI( mMediaURL ); + +		if(mPreviousMediaState == MEDIA_PLAYING) +		{ +			// This media was playing before this instance was unloaded. + +			if(mPreviousMediaTime != 0.0f) +			{ +				// Seek back to where we left off, if possible. +				seek(mPreviousMediaTime); +			} +			 +			start(); +		} +		else if(mPreviousMediaState == MEDIA_PAUSED) +		{ +			// This media was paused before this instance was unloaded. + +			if(mPreviousMediaTime != 0.0f) +			{ +				// Seek back to where we left off, if possible. +				seek(mPreviousMediaTime); +			} +			 +			pause(); +		} +		else +		{ +			// No relevant previous media play state -- if we're loading the URL, we want to start playing. +			start(); +		} +	} +} + +//////////////////////////////////////////////////////////////////////////////////////////  void LLViewerMediaImpl::setSize(int width, int height)  {  	mMediaWidth = width; @@ -882,24 +913,21 @@ void LLViewerMediaImpl::setSize(int width, int height)  //////////////////////////////////////////////////////////////////////////////////////////  void LLViewerMediaImpl::play()  { -	// first stop any previously playing media -	// stop(); - -	// mMediaSource->addObserver( this ); +	// If the media source isn't there, try to initialize it and load an URL.  	if(mMediaSource == NULL)  	{ -	 	if(!initializePlugin(mMimeType)) +	 	if(!initializeMedia(mMimeType))  		{  			// This may be the case where the plugin's priority is PRIORITY_UNLOADED  			return;  		} +		 +		// Only do this if the media source was just loaded. +		loadURI();  	} -	mMediaSource->loadURI( mMediaURL ); -	if(/*mMediaSource->pluginSupportsMediaTime()*/ true) -	{ -		start(); -	} +	// always start the media +	start();  }  ////////////////////////////////////////////////////////////////////////////////////////// @@ -1165,27 +1193,21 @@ void LLViewerMediaImpl::navigateHome()  //////////////////////////////////////////////////////////////////////////////////////////  void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mime_type,  bool rediscover_type, bool server_request)  { -	if(server_request) -	{ -		setNavState(MEDIANAVSTATE_SERVER_SENT); -	} -	else +	if(mMediaURL != url)  	{ -		setNavState(MEDIANAVSTATE_NONE); +		// Don't carry media play state across distinct URLs. +		resetPreviousMediaState();  	}  	// Always set the current URL and MIME type.  	mMediaURL = url;  	mMimeType = mime_type; -	// If the current URL is not null, make the instance do a navigate on load. -	mDoNavigateOnLoad = !mMediaURL.empty(); -  	// if mime type discovery was requested, we'll need to do it when the media loads -	mDoNavigateOnLoadRediscoverType = rediscover_type; +	mNavigateRediscoverType = rediscover_type;  	// and if this was a server request, the navigate on load will also need to be one. -	mDoNavigateOnLoadServerRequest = server_request; +	mNavigateServerRequest = server_request;  	// An explicit navigate resets the "failed" flag.  	mMediaSourceFailed = false; @@ -1193,7 +1215,7 @@ void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mi  	if(mPriority == LLPluginClassMedia::PRIORITY_UNLOADED)  	{  		// Helpful to have media urls in log file. Shouldn't be spammy. -		llinfos << "UNLOADED media id= " << mTextureId << " url=" << url << " mime_type=" << mime_type << llendl; +		llinfos << "NOT LOADING media id= " << mTextureId << " url=" << url << " mime_type=" << mime_type << llendl;  		// This impl should not be loaded at this time.  		LL_DEBUGS("PluginPriority") << this << "Not loading (PRIORITY_UNLOADED)" << LL_ENDL; @@ -1201,10 +1223,24 @@ void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mi  		return;  	} +	navigateInternal(); +} + +////////////////////////////////////////////////////////////////////////////////////////// +void LLViewerMediaImpl::navigateInternal() +{  	// Helpful to have media urls in log file. Shouldn't be spammy. -	llinfos << "media id= " << mTextureId << " url=" << url << " mime_type=" << mime_type << llendl; -	 -	 +	llinfos << "media id= " << mTextureId << " url=" << mMediaURL << " mime_type=" << mMimeType << llendl; + +	if(mNavigateServerRequest) +	{ +		setNavState(MEDIANAVSTATE_SERVER_SENT); +	} +	else +	{ +		setNavState(MEDIANAVSTATE_NONE); +	} +			  	// If the caller has specified a non-empty MIME type, look that up in our MIME types list.  	// If we have a plugin for that MIME type, use that instead of attempting auto-discovery.  	// This helps in supporting legacy media content where the server the media resides on returns a bogus MIME type @@ -1216,11 +1252,11 @@ void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mi  		if(!plugin_basename.empty())  		{  			// We have a plugin for this mime type -			rediscover_type = false; +			mNavigateRediscoverType = false;  		}  	} -	if(rediscover_type) +	if(mNavigateRediscoverType)  	{  		LLURI uri(mMediaURL); @@ -1236,7 +1272,7 @@ void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mi  			// We use "data" internally for a text/html url for loading the login screen  			if(initializeMedia("text/html"))  			{ -				mMediaSource->loadURI( mMediaURL ); +				loadURI();  			}  		}  		else @@ -1244,24 +1280,18 @@ void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mi  			// This catches 'rtsp://' urls  			if(initializeMedia(scheme))  			{ -				mMediaSource->loadURI( mMediaURL ); +				loadURI();  			}  		}  	} -	else if (mMediaSource) +	else if(initializeMedia(mMimeType))  	{ -		mMediaSource->loadURI( mMediaURL ); -	} -	else if(initializeMedia(mime_type) && mMediaSource) -	{ -		mMediaSource->loadURI( mMediaURL ); +		loadURI();  	}  	else  	{ -		LL_WARNS("Media") << "Couldn't navigate to: " << url << " as there is no media type for: " << mime_type << LL_ENDL; -		return; +		LL_WARNS("Media") << "Couldn't navigate to: " << mMediaURL << " as there is no media type for: " << mMimeType << LL_ENDL;  	} -  }  ////////////////////////////////////////////////////////////////////////////////////////// @@ -1390,6 +1420,7 @@ void LLViewerMediaImpl::update()  	if(mMediaSource->isPluginExited())  	{ +		resetPreviousMediaState();  		destroyMediaSource();  		return;  	} @@ -1586,6 +1617,14 @@ bool LLViewerMediaImpl::hasMedia()  }  ////////////////////////////////////////////////////////////////////////////////////////// +// +void LLViewerMediaImpl::resetPreviousMediaState() +{ +	mPreviousMediaState = MEDIA_NONE; +	mPreviousMediaTime = 0.0f; +} + +//////////////////////////////////////////////////////////////////////////////////////////  void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginClassMediaOwner::EMediaEvent event)  {  	switch(event) @@ -1595,6 +1634,9 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla  			// The plugin failed to load properly.  Make sure the timer doesn't retry.  			// TODO: maybe mark this plugin as not loadable somehow?  			mMediaSourceFailed = true; + +			// Reset the last known state of the media to defaults. +			resetPreviousMediaState();  			// TODO: may want a different message for this case?  			LLSD args; @@ -1608,6 +1650,9 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla  			// The plugin crashed.  			mMediaSourceFailed = true; +			// Reset the last known state of the media to defaults. +			resetPreviousMediaState(); +  			LLSD args;  			args["PLUGIN"] = LLMIMETypes::implType(mMimeType);  			// SJB: This is getting called every frame if the plugin fails to load, continuously respawining the alert! @@ -1833,11 +1878,11 @@ void LLViewerMediaImpl::setUsedInUI(bool used_in_ui)  	{  		if(getVisible())  		{ -			mPriority = LLPluginClassMedia::PRIORITY_NORMAL; +			setPriority(LLPluginClassMedia::PRIORITY_NORMAL);  		}  		else  		{ -			mPriority = LLPluginClassMedia::PRIORITY_HIDDEN; +			setPriority(LLPluginClassMedia::PRIORITY_HIDDEN);  		}  		createMediaSource(); @@ -1858,6 +1903,15 @@ F64 LLViewerMediaImpl::getCPUUsage() const  void LLViewerMediaImpl::setPriority(LLPluginClassMedia::EPriority priority)  { +	if(mPriority != priority) +	{ +		LL_INFOS("PluginPriority") +			<< "changing priority of media id " << mTextureId +			<< " from " << LLPluginClassMedia::priorityToString(mPriority) +			<< " to " << LLPluginClassMedia::priorityToString(priority) +			<< LL_ENDL; +	} +	  	mPriority = priority;  	if(priority == LLPluginClassMedia::PRIORITY_UNLOADED) @@ -1865,6 +1919,11 @@ void LLViewerMediaImpl::setPriority(LLPluginClassMedia::EPriority priority)  		if(mMediaSource)  		{  			// Need to unload the media source +			 +			// First, save off previous media state +			mPreviousMediaState = mMediaSource->getStatus(); +			mPreviousMediaTime = mMediaSource->getCurrentTime(); +			  			destroyMediaSource();  		}  	} diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index b15314e954..4f0d39dd80 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -123,6 +123,7 @@ public:  	void setMediaType(const std::string& media_type);  	bool initializeMedia(const std::string& mime_type);  	bool initializePlugin(const std::string& media_type); +	void loadURI();  	LLPluginClassMedia* getMediaPlugin() { return mMediaSource; }  	void setSize(int width, int height); @@ -151,6 +152,7 @@ public:  	void navigateReload();  	void navigateHome();  	void navigateTo(const std::string& url, const std::string& mime_type = "", bool rediscover_type = false, bool server_request = false); +	void navigateInternal();  	void navigateStop();  	bool handleKeyHere(KEY key, MASK mask);  	bool handleUnicodeCharHere(llwchar uni_char); @@ -174,6 +176,7 @@ public:  	bool isMediaPaused();  	bool hasMedia();  	bool isMediaFailed() { return mMediaSourceFailed; }; +	void resetPreviousMediaState();  	ECursorType getLastSetCursor() { return mLastSetCursor; }; @@ -287,14 +290,14 @@ public:  	bool mUsedInUI;  	bool mHasFocus;  	LLPluginClassMedia::EPriority mPriority; -	bool mDoNavigateOnLoad; -	bool mDoNavigateOnLoadRediscoverType; -	bool mDoNavigateOnLoadServerRequest; +	bool mNavigateRediscoverType; +	bool mNavigateServerRequest;  	bool mMediaSourceFailed;  	F32 mRequestedVolume;  	bool mIsMuted;  	bool mNeedsMuteCheck; - +	int mPreviousMediaState; +	F64 mPreviousMediaTime;  private:  	BOOL mIsUpdated ; diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index b47e0b8406..5d0b77d4fb 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -35,7 +35,7 @@  //LLViewerMediaFocus  #include "llviewerobjectlist.h" -#include "llpanelmediahud.h" +#include "llpanelprimmediacontrols.h"  #include "llpluginclassmedia.h"  #include "llagent.h"  #include "lltoolpie.h" @@ -106,19 +106,19 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac  		// We must do this before  processing the media HUD zoom, or it may zoom to the wrong face.   		update(); -		if(mMediaHUD.get() && face_auto_zoom && ! parcel->getMediaPreventCameraZoom()) +		if(mMediaControls.get() && face_auto_zoom && ! parcel->getMediaPreventCameraZoom())  		{ -			mMediaHUD.get()->resetZoomLevel(); -			mMediaHUD.get()->nextZoomLevel(); +			mMediaControls.get()->resetZoomLevel(); +			mMediaControls.get()->nextZoomLevel();  		}  	}  	else  	{  		if(mFocusedImplID != LLUUID::null)  		{ -			if(mMediaHUD.get()) +			if(mMediaControls.get())  			{ -				mMediaHUD.get()->resetZoomLevel(); +				mMediaControls.get()->resetZoomLevel();  			}  			gFocusMgr.setKeyboardFocus(NULL); @@ -327,20 +327,20 @@ void LLViewerMediaFocus::update()  		// We have an object and impl to point at.  		// Make sure the media HUD object exists. -		if(! mMediaHUD.get()) +		if(! mMediaControls.get())  		{ -			LLPanelMediaHUD* media_hud = new LLPanelMediaHUD(); -			mMediaHUD = media_hud->getHandle(); -			gHUDView->addChild(media_hud);	 +			LLPanelPrimMediaControls* media_controls = new LLPanelPrimMediaControls(); +			mMediaControls = media_controls->getHandle(); +			gHUDView->addChild(media_controls);	  		} -		mMediaHUD.get()->setMediaFace(viewer_object, face, media_impl, normal); +		mMediaControls.get()->setMediaFace(viewer_object, face, media_impl, normal);  	}  	else  	{  		// The media HUD is no longer needed. -		if(mMediaHUD.get()) +		if(mMediaControls.get())  		{ -			mMediaHUD.get()->setMediaFace(NULL, 0, NULL); +			mMediaControls.get()->setMediaFace(NULL, 0, NULL);  		}  	}  } diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h index c77533ba5a..c1179de39d 100644 --- a/indra/newview/llviewermediafocus.h +++ b/indra/newview/llviewermediafocus.h @@ -40,7 +40,7 @@  #include "llselectmgr.h"  class LLViewerMediaImpl; -class LLPanelMediaHUD; +class LLPanelPrimMediaControls;  class LLViewerMediaFocus :   	public LLFocusableElement,  @@ -88,7 +88,7 @@ protected:  private: -	LLHandle<LLPanelMediaHUD> mMediaHUD; +	LLHandle<LLPanelPrimMediaControls> mMediaControls;  	LLUUID mFocusedObjectID;  	S32 mFocusedObjectFace; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index a402aff8ab..f9c95afc31 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -6400,6 +6400,11 @@ LLBBox LLVOAvatar::getHUDBBox() const  				 ++attachment_iter)  			{  				const LLViewerObject* attached_object = (*attachment_iter); +				if (attached_object == NULL) +				{ +					llwarns << "HUD attached object is NULL!" << llendl; +					continue; +				}  				// initialize bounding box to contain identity orientation and center point for attached object  				bbox.addPointLocal(attached_object->getPosition());  				// add rotated bounding box for attached object diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index 8f74ea29ac..a091028ec2 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -545,7 +545,7 @@ BOOL LLWearable::isDirty() const  				else  				{  					// image found in current image list but not saved image list -					return FALSE; +					return TRUE;  				}  			}  		} diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index b46b766fc0..d3366cdcaa 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -144,6 +144,7 @@    <texture name="Info" file_name="icons/Info.png" preload="false" />    <texture name="Info_Small" file_name="icons/Info_Small.png" preload="false" />    <texture name="Info_Off" file_name="navbar/Info_Off.png" preload="false" /> +  <texture name="Info_Over" file_name="icons/Info_Over.png" preload="false" />    <texture name="Info_Press" file_name="navbar/Info_Press.png" preload="false" />    <texture name="Inspector_Background" file_name="windows/Inspector_Background.png" preload="false" /> diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index b194b533af..5cd11ba292 100644 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -7,66 +7,56 @@   save_rect="true"   title="About [APP_NAME]"   width="470"> -    <floater.string -     name="you_are_at"> -        You are at [POSITION] -    </floater.string> -    <floater.string -     name="in_region"> -        in [REGION] located at -    </floater.string> -    <floater.string -     name="CPU"> -        CPU: -    </floater.string> -    <floater.string -     name="Memory"> -        Memory: [MEM] MB -    </floater.string> -    <floater.string -     name="OSVersion"> -        OS Version: -    </floater.string> -    <floater.string -     name="GraphicsCardVendor"> -        Graphics Card Vendor: -    </floater.string> -    <floater.string -     name="GraphicsCard"> -        Graphics Card: -    </floater.string> -    <floater.string -     name="OpenGLVersion"> -        OpenGL Version: -    </floater.string> -    <floater.string -     name="LibCurlVersion"> -        libcurl Version: -    </floater.string> -    <floater.string -     name="J2CDecoderVersion"> -        J2C Decoder Version: -    </floater.string> -    <floater.string -     name="AudioDriverVersion"> -        Audio Driver Version: -    </floater.string> -    <floater.string -     name="none"> -        (none) -    </floater.string> -    <floater.string -     name="LLMozLibVersion"> -        LLMozLib Version: -    </floater.string>    <floater.string -     name="LLQtWebkitVersion"> -        Qt Webkit Version: 4.5.2 +     name="AboutHeader"> +[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL]) +[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] + +</floater.string> +  <floater.string +     name="AboutCompiler"> +Built with [COMPILER] version [COMPILER_VERSION] + +</floater.string> +  <floater.string +     name="AboutPosition"> +You are at [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at [HOSTNAME] ([HOSTIP]) +[SERVER_VERSION] +[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] + +</floater.string> +  <!-- *NOTE: Do not translate text like GPU, Graphics Card, etc - +       Most PC users who know what these mean will be used to the English versions, +       and this info sometimes gets sent to support. --> +  <floater.string +     name="AboutSystem"> +CPU: [CPU] +Memory: [MEMORY_MB] MB +OS Version: [OS_VERSION] +Graphics Card Vendor: [GRAPHICS_CARD_VENDOR] +Graphics Card: [GRAPHICS_CARD] +</floater.string> +  <floater.string +     name="AboutDriver"> +Windows Graphics Driver Version: [GRAPHICS_DRIVER_VERSION] +</floater.string> +  <floater.string +     name="AboutLibs"> +OpenGL Version: [OPENGL_VERSION] + +libcurl Version: [LIBCURL_VERSION] +J2C Decoder Version: [J2C_VERSION] +Audio Driver Version: [AUDIO_DRIVER_VERSION] +Qt Webkit Version: [QT_WEBKIT_VERSION] +</floater.string> +  <floater.string +     name="none"> +      (none)    </floater.string>    <floater.string -     name="PacketsLost"> -        Packets Lost: [LOST]/[IN] ([PCT]%) -    </floater.string> +     name="AboutTraffic"> +Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) +</floater.string>    <tab_container      follows="all"       top="25" 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 072fafd06e..aa0b4094b4 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -28,7 +28,9 @@       follows="left|top|right|bottom"       height="400"       layout="topleft" +     font="SansSerifSmall"       left="1" +       tab_padding_right="5"       name="landtab"       tab_position="top"       top="20" diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml index 520249c2a2..a713cc32a0 100644 --- a/indra/newview/skins/default/xui/en/floater_camera.xml +++ b/indra/newview/skins/default/xui/en/floater_camera.xml @@ -1,17 +1,17 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater   can_dock="true" - can_minimize="true" - can_close="true"  + can_minimize="false" + can_close="true"   center_horiz="true" - follows="top" - height="110" + follows="bottom" + height="152"   layout="topleft"   name="camera_floater"   help_topic="camera_floater"   save_rect="true"   save_visibility="true" - width="105"> + width="150">      <floater.string       name="rotate_tooltip">          Rotate Camera Around Focus @@ -25,69 +25,71 @@          Move Camera Up and Down, Left and Right      </floater.string>      <panel -     border="true" -     height="79" +     border="false" +     height="110"       layout="topleft" -     left="0" +     left="2"       top="0" -     mouse_opaque="false"  +     mouse_opaque="false"       name="controls" -     width="105"> -        <joystick_rotate -         follows="top|left" -         height="64" -         image_selected="cam_rotate_in.tga" -         image_unselected="cam_rotate_out.tga" -         layout="topleft" -         left="2" -         name="cam_rotate_stick" -         picture_style="true" -         quadrant="left" -         scale_image="false" -         sound_flags="3" -         tool_tip="Orbit camera around focus" -         top="15" -         width="64" /> +     width="148">          <joystick_track           follows="top|left" -         height="64" -         image_selected="cam_tracking_in.tga" -         image_unselected="cam_tracking_out.tga" +         height="78" +         image_selected="Cam_Tracking_In" +         image_unselected="Cam_Tracking_Out"           layout="topleft" -         left="2" +         left="45"           name="cam_track_stick"           picture_style="true"           quadrant="left"           scale_image="false"           sound_flags="3"           tool_tip="Move camera up and down, left and right" -         top="15" +         top="22"           visible="false" -         width="64" /> +         width="78" /> +         <!--TODO: replace with slider, + - images -->          <joystick_zoom           follows="top|left" -         height="64" -         image_unselected="cam_zoom_out.tga" +         height="78" +         image_unselected="ScrollThumb_Vert"           layout="topleft" -         left_delta="70" -         minus_image="cam_zoom_minus_in.tga" +         left="7" +         minus_image="ScrollThumb_Vert"           name="zoom"           picture_style="true" -         plus_image="cam_zoom_plus_in.tga" +         plus_image="ScrollThumb_Vert"           quadrant="left"           scale_image="false"           sound_flags="3"           tool_tip="Zoom camera toward focus" -         top_delta="0" -         width="16" /> +         top="22" +         width="20" /> +         <joystick_rotate +         follows="top|left" +         height="78" +         image_selected="Cam_Rotate_In" +         image_unselected="Cam_Rotate_Out" +         layout="topleft" +         left="45" +         name="cam_rotate_stick" +         picture_style="true" +         quadrant="left" +         scale_image="false" +         sound_flags="3" +         visible="true" +         tool_tip="Orbit camera around focus" +         top="22" +         width="78" />          <panel -         height="70" +         height="78"           layout="topleft" -         left="15" +         left="36"           name="camera_presets" -         top="15" +         top="30"           visible="false" -         width="75"> +         width="78">              <button               height="30"               image_selected="CameraPreset_Rear" @@ -127,7 +129,7 @@               name="front_view"               picture_style="true"               tool_tip="Front View" -             top_pad="2" +             top_pad="5"               width="30">                  <click_callback                   function="CameraPresets.ChangeView" @@ -151,21 +153,21 @@          </panel>      </panel>      <panel -     border="true" -     height="25" +     border="false" +     height="42"       layout="topleft" -     left="0" -     top_pad="1" +     left="2" +     top_pad="0"       name="buttons" -     width="105"> +     width="148">          <button           height="23"           label=""           layout="topleft" -         left="2" +         left="23"           is_toggle="true"           image_overlay="Cam_Orbit_Off" -         image_selected="PushButton_Selected_Press"  +         image_selected="PushButton_Selected_Press"           name="orbit_btn"           tab_stop="false"           tool_tip="Orbit camera" @@ -179,7 +181,7 @@           left_pad="0"           is_toggle="true"           image_overlay="Cam_Pan_Off" -         image_selected="PushButton_Selected_Press"  +         image_selected="PushButton_Selected_Press"           name="pan_btn"           tab_stop="false"           tool_tip="Pan camera" @@ -191,7 +193,7 @@           layout="topleft"           left_pad="0"           image_overlay="Cam_Avatar_Off" -         image_selected="PushButton_Selected_Press"  +         image_selected="PushButton_Selected_Press"           name="avatarview_btn"           tab_stop="false"           tool_tip="See as avatar" @@ -204,12 +206,11 @@           left_pad="0"           is_toggle="true"           image_overlay="Cam_FreeCam_Off" -         image_selected="PushButton_Selected_Press"  +         image_selected="PushButton_Selected_Press"           name="freecamera_btn"           tab_stop="false"           tool_tip="View object"           width="25">          </button> -              </panel>  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_pay.xml b/indra/newview/skins/default/xui/en/floater_pay.xml index 5f70f09a34..69525d48d2 100644 --- a/indra/newview/skins/default/xui/en/floater_pay.xml +++ b/indra/newview/skins/default/xui/en/floater_pay.xml @@ -34,7 +34,7 @@       type="string"       length="1"       follows="left|top" -     font="SansSerif" +     font="SansSerifSmall"       height="16"       layout="topleft"       left_pad="7" @@ -44,6 +44,7 @@      </text>      <button       height="23" +     font="SansSerifSmall"         label="L$1"       label_selected="L$1"       layout="topleft" @@ -53,7 +54,8 @@       width="80" />      <button       height="23" -     label="L$5" +     label="L$1" +     font="SansSerif"         label_selected="L$5"       layout="topleft"       left_pad="15" @@ -62,6 +64,7 @@      <button       height="23"       label="L$10" +     font="SansSerifHuge"         label_selected="L$10"       layout="topleft"       left="25" diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml index 8cdafe110a..d2b8455eab 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml @@ -83,7 +83,7 @@          Loading...      </text_editor>      <button -     follows="left|bottom" +     follows="right|bottom"       height="22"       label="Save"       label_selected="Save" diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml index abde4ba5fa..884532c7a3 100644 --- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml @@ -14,19 +14,19 @@       allow_no_texture="true"       default_image_name="None"       follows="left|top" -     height="125" +     height="150"       layout="topleft" -     left="10" -     name="screenshot" -     top="23" -     width="160" /> +     left="60" +     name="" +     top="15" +     width="220" />      <check_box       height="15"       label="Use this screenshot"       layout="topleft" -     left_pad="5" +     left="8"       name="screen_check" -     top="120" +     top_pad="-12"       width="116" />      <text       type="string" @@ -38,8 +38,8 @@       layout="topleft"       left="10"       name="reporter_title" -     top="140" -     width="60"> +     top_pad="0" +     width="100">          Reporter:      </text>      <text @@ -48,24 +48,25 @@       follows="left|top"       height="16"       layout="topleft" -     left_pad="10" +     left_pad="5"       name="reporter_field"       top_delta="0" -     width="193"> -        Loremipsum Dolorsitamut +     use_ellipses="true" +     width="200"> +        Loremipsum Dolorsitamut Longnamez      </text>      <text       type="string"       length="1"       follows="left|top"       height="16" -     font.name="SansSerif"  +     font.name="SansSerif"       font.style="BOLD"       layout="topleft"       left="10"       name="sim_title" -     top_pad="5" -     width="60"> +     top_pad="2" +     width="100">          Region:      </text>      <text @@ -74,10 +75,11 @@       follows="left|top"       height="16"       layout="topleft" -     left_pad="2" +     left_pad="5"       name="sim_field"       top_delta="0" -     width="193"> +     use_ellipses="true" +     width="200">          Region Name      </text>      <text @@ -85,13 +87,13 @@       length="1"       follows="left|top"       height="16" -     font.name="SansSerif"  +     font.name="SansSerif"       font.style="BOLD"       layout="topleft"       left="10"       name="pos_title" -     top_pad="5" -     width="50"> +     top_pad="2" +     width="100">          Position:      </text>      <text @@ -100,10 +102,10 @@       follows="left|top"       height="16"       layout="topleft" -     left_pad="12" +     left_pad="5"       name="pos_field"       top_delta="0" -     width="193"> +     width="200">          {128.1, 128.1, 15.4}      </text>   <text @@ -114,7 +116,7 @@       layout="topleft"       left="10"       name="select_object_label" -     top_pad="5" +     top_pad="2"       width="310">          Click the button, then the abusive object:      </text> @@ -133,13 +135,13 @@       length="1"       follows="left|top"       height="16" -     font.name="SansSerif"  +     font.name="SansSerif"       font.style="BOLD"       layout="topleft"       left="48"       name="object_name_label"       top_delta="0" -     width="60"> +     width="80">          Object:      </text>      <text @@ -151,7 +153,8 @@       left_pad="6"       name="object_name"       top_delta="0" -     width="157"> +     use_ellipses="true" +     width="185">          Consetetur Sadipscing      </text>      <text @@ -159,13 +162,13 @@       length="1"       follows="left|top"       height="16" -     font.name="SansSerif"  +     font.name="SansSerif"       font.style="BOLD"       layout="topleft"       left="48"       name="owner_name_label"       top_pad="0" -     width="60"> +     width="80">          Owner:      </text>      <text @@ -177,8 +180,9 @@       left_pad="6"       name="owner_name"       top_delta="0" -     width="157"> -        Hendrerit Vulputate +     use_ellipses="true" +     width="185"> +        Hendrerit Vulputate Kamawashi Longname      </text>      <combo_box       height="23" @@ -349,8 +353,8 @@       type="string"       length="1"       follows="left|top" -     height="16" -     font.name="SansSerif"  +     height="14" +     font.name="SansSerif"       font.style="BOLD"       layout="topleft"       left_delta="0" @@ -368,11 +372,10 @@       left_delta="0"       max_length="32"       name="abuser_name_edit" -     top_pad="2" +     top_pad="0"       width="195" />      <button       height="23" -     font="SansSerifSmall"       label="Choose"       layout="topleft"       left_pad="5" @@ -394,13 +397,13 @@       type="string"       length="1"       follows="left|top" -     height="16" -     font.name="SansSerif"  +     height="14" +     font.name="SansSerif"       font.style="BOLD"       layout="topleft"       left="10"       name="abuser_name_title2" -     top_pad="5" +     top_pad="2"       width="313">          Location of Abuse:      </text> @@ -413,19 +416,19 @@       left="10"       max_length="256"       name="abuse_location_edit" -     top_pad="2" +     top_pad="0"       width="313" />      <text       type="string"       length="1"       follows="left|top"       height="16" -     font.name="SansSerif"  +     font.name="SansSerif"       font.style="BOLD"       layout="topleft"       left_delta="0"       name="sum_title" -     top_pad="5" +     top_pad="2"       width="313">          Summary:      </text> @@ -438,14 +441,14 @@       left_delta="0"       max_length="64"       name="summary_edit" -     top_pad="2" +     top_pad="0"       width="313" />      <text       type="string"       length="1"       follows="left|top" -     height="16" -     font.name="SansSerif"  +     height="14" +     font.name="SansSerif"       font.style="BOLD"       layout="topleft"       left_delta="0" @@ -461,9 +464,9 @@       height="16"       layout="topleft"       name="bug_aviso" -     left_pad="0" +     left_pad="10"       width="200"> -        Please be as specific as possible. +        Please be as specific as possible      </text>      <text_editor       follows="left|top" @@ -479,16 +482,15 @@       type="string"       length="1"       follows="left|top" -     height="50" +     height="30"       layout="topleft"       left="10" -     font.name="SansSerif"  -     font.style="BOLD" +     font.name="SansSerifSmall"       name="incomplete_title" -     top_pad="5" +     top_pad="2"       word_wrap="true"       width="313"> -        Note: Incomplete reports won't be investigated. +        * Incomplete reports won't be investigated      </text>       <button       left="80" diff --git a/indra/newview/skins/default/xui/en/floater_test_textbox.xml b/indra/newview/skins/default/xui/en/floater_test_textbox.xml index 8305452c85..c33ab8aa70 100644 --- a/indra/newview/skins/default/xui/en/floater_test_textbox.xml +++ b/indra/newview/skins/default/xui/en/floater_test_textbox.xml @@ -114,16 +114,59 @@          Escaped greater than >      </text>      <text -     type="string" -     length="1" -     bottom="390" -     label="N" -     layout="topleft" -     left="10" -     name="floater_map_north" -     right="30" -     text_color="1 1 1 0.7" -     top="370"> -        N -    </text> +   type="string" +   length="1" +   bottom="390" +   label="N" +   layout="topleft" +   left="10" +   name="right_aligned_text" +   width="380" +   halign="right"  +   text_color="1 1 1 0.7" +   top_pad="10"> +    Right aligned text +  </text> +  <text + type="string" + length="1" + bottom="390" + label="N" + layout="topleft" + left="10" + name="centered_text" + width="380" + halign="center" + text_color="1 1 1 0.7" + top_pad="10"> +    Centered text +  </text> +  <text + type="string" + length="1" + bottom="390" + label="N" + layout="topleft" + left="10" + name="centered_text" + width="380" + halign="left" + text_color="1 1 1 0.7" + top_pad="10"> +    Left aligned text +  </text> +  <text +   type="string" +   length="1" +   bottom="390" +   label="N" +   layout="topleft" +   left="10" +   name="floater_map_north" +   right="30" +   text_color="1 1 1 0.7" +   top="370"> +    N +  </text> +  </floater> diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index 75ded4f249..af1919bd8f 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -486,7 +486,7 @@ things in this group. There's a broad variety of Abilities.          </panel>      </tab_container>      <panel -     height="170" +     height="190"       layout="topleft"       follows="left|top"       left="10" @@ -556,7 +556,7 @@ things in this group. There's a broad variety of Abilities.          </scroll_list>      </panel>      <panel -     height="215" +     height="252"       layout="topleft"       left_delta="0"       name="roles_footer" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index ec6377c723..0db5a41cc5 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -49,11 +49,13 @@ background_visible="true"       height="500"       layout="topleft"       left="10" +       font="SansSerifBigBold"       name="tabs"       tab_min_width="70"       tab_height="30"       tab_position="top"       top_pad="10" +     halign="center"         width="313">          <panel           follows="all" diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml new file mode 100644 index 0000000000..b21fbc1795 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml @@ -0,0 +1,594 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel +	follows="left|right|top|bottom" +	name="MediaControls" +	bg_alpha_color="1 1 1 0" +	height="160" +	layout="topleft" +	mouse_opaque="false" +	width="800"> +  <panel +	  name="media_region" +	  bottom="125" +	  follows="left|right|top|bottom" +	  layout="topleft" +	  left="20" +	  mouse_opaque="false" +	  right="-20" +	  top="20" /> +  <layout_stack +	  follows="left|right|bottom" +	  height="32" +	  layout="topleft" +	  animate="false" +	  left="0" +	  orientation="horizontal" +	  top="96"> +	<!-- outer layout_panels center the inner one --> +	<layout_panel +		width="0" +		layout="topleft" +		user_resize="false" /> +	<panel +		name="media_progress_indicator" +		height="22" +		layout="topleft" +		left="0" +		top="0" +		auto_resize="false" +		user_resize="false" +		min_width="100" +		width="200"> +	  <progress_bar +		  name="media_progress_bar" +		  color_bar="1 1 1 0.96" +		  follows="left|right|top" +		  height="16" +		  layout="topleft" +		  left="0" +		  tool_tip="Media is Loading"/> +	</panel> +	<layout_panel +		width="0" +		layout="topleft" +		user_resize="false" /> +  </layout_stack> +  <layout_stack +	  name="media_controls" +	  follows="left|right" +	  animate="false" +	  height="32" +	  layout="topleft" +	  left="0" +	  orientation="horizontal" +	  top="128"> +	<!-- outer layout_panels center the inner one --> +	<layout_panel +		width="0" +		layout="topleft" +		user_resize="false" /> +	<layout_panel +		name="back" +		auto_resize="false" +		user_resize="false" +		layout="topleft" +		min_width="22" +		width="22" +		top="4"> +	  <button +		  auto_resize="false" +		  height="22" +		  image_selected="media_btn_back.png" +		  image_unselected="media_btn_back.png" +		  layout="topleft" +		  tool_tip="Step back" +		  picture_style="true" +		  width="22" +		  top_delta="4"> +		<button.commit_callback +			function="MediaCtrl.Back" /> +	  </button> +	</layout_panel> +	<layout_panel +		name="fwd" +		auto_resize="false" +		user_resize="false" +		layout="topleft" +		top="10" +		min_width="17" +		width="17"> +	  <button +		  height="22" +		  image_selected="media_btn_forward.png" +		  image_unselected="media_btn_forward.png" +		  layout="topleft" +		  tool_tip="Step forward" +		  picture_style="true" +		  top_delta="0" +		  min_width="17" +		  width="17"> +		<button.commit_callback +			function="MediaCtrl.Forward" /> +	  </button> +	</layout_panel> +<!-- +	<panel +		height="22" +		layout="topleft" +		auto_resize="false" +		min_width="3" +		width="3"> +	  <icon +		  height="22" +		  image_name="media_panel_divider.png" +		  layout="topleft" +		  top="0" +		  min_width="3" +		  width="3" /> +	</panel> +--> +	<layout_panel +		name="home" +		auto_resize="false" +		user_resize="false" +		layout="topleft" +		top="-2" +		min_width="22" +		width="22"> +	  <button +		  height="22" +		  image_selected="media_btn_home.png" +		  image_unselected="media_btn_home.png" +		  layout="topleft" +		  tool_tip="Home page" +		  picture_style="true" +		  min_width="22" +		  width="22"> +		<button.commit_callback +			function="MediaCtrl.Home" /> +	  </button> +	</layout_panel> +	<layout_panel +		name="media_stop" +		auto_resize="false" +		user_resize="false" +		layout="topleft" +		top="2" +		min_width="22" +		width="22"> +	  <button +		  height="22" +		  image_selected="button_anim_stop.tga" +		  image_unselected="button_anim_stop.tga" +		  layout="topleft" +		  tool_tip="Stop media" +		  picture_style="true" +		  min_width="22" +		  width="22"> +		<button.commit_callback +			function="MediaCtrl.Stop" /> +	  </button> +	</layout_panel> +<!-- +	<panel +		height="22" +		layout="topleft" +		auto_resize="false" +		min_width="3" +		width="3"> +	  <icon +		  height="22" +		  image_name="media_panel_divider.png" +		  layout="topleft" +		  top="0" +		  min_width="3" +		  width="3" /> +	</panel> +--> +	<layout_panel +		name="reload" +		auto_resize="false" +		user_resize="false" +		layout="topleft" +		top="6" +		min_width="22" +		width="22"> +	  <button +		  height="22" +		  image_selected="media_btn_reload.png" +		  image_unselected="media_btn_reload.png" +		  layout="topleft" +		  tool_tip="Reload" +		  picture_style="true" +		  min_width="22" +		  width="22"> +		<button.commit_callback +			function="MediaCtrl.Reload" /> +	  </button> +	</layout_panel> +	<layout_panel +		name="stop" +		auto_resize="false" +		user_resize="false" +		layout="topleft" +		top="10" +		min_width="22" +		width="22"> +	  <button +		  height="22" +		  image_selected="media_btn_stoploading.png" +		  image_unselected="media_btn_stoploading.png" +		  layout="topleft" +		  picture_style="true" +		  tool_tip = "Stop loading" +		  min_width="22" +		  width="22"> +		<button.commit_callback +			function="MediaCtrl.Stop" /> +	  </button> +	</layout_panel> +	<layout_panel +		name="play" +		auto_resize="false" +		user_resize="false" +		layout="topleft" +		top="14" +		min_width="22" +		width="22"> +	  <button +		  height="22" +		  image_selected="button_anim_play.tga" +		  image_unselected="button_anim_play.tga" +		  layout="topleft" +		  tool_tip = "Play media" +		  picture_style="true" +		  min_width="22" +		  width="22"> +		<button.commit_callback +			function="MediaCtrl.Play" /> +	  </button> +	</layout_panel> +	<layout_panel +		name="pause" +		auto_resize="false" +		user_resize="false" +		layout="topleft" +		top="18" +		min_width="22" +		width="22"> +	  <button +		  height="22" +		  image_selected="button_anim_pause.tga" +		  image_unselected="button_anim_pause.tga" +		  layout="topleft" +		  tool_tip = "Pause media" +		  picture_style="true"> +		<button.commit_callback +			function="MediaCtrl.Pause" /> +	  </button> +	</layout_panel> +	<!-- media URL entry  --> +	<layout_panel +		name="media_address" +		auto_resize="true" +		user_resize="false" +		height="22" +		follows="left|right|bottom" +		layout="topleft" +		width="190" +		min_width="90"> +	  <!-- +		  RE-ENABLE THIS WHEN WE HAVE A HISTORY DROP-DOWN AGAIN + +<combo_box +name="media_address_url" +allow_text_entry="true" +height="22" +layout="topleft" +max_chars="1024" +tool_tip = "Media URL" +<combo_box.commit_callback +function="MediaCtrl.CommitURL" /> +</combo_box> +	  --> +	  <line_editor  +		  name="media_address_url" +		  follows="left|right"  +		  height="22" +		  top="0" +		  tool_tip="Media URL" +		  text_pad_right="16">  +		<line_editor.commit_callback +			function="MediaCtrl.CommitURL"/> +	  </line_editor> +	  <layout_stack +		  animate="false" +		  follows="right" +		  width="32" +		  min_width="32" +		  height="16" +		  top="3" +		  orientation="horizontal" +		  left_pad="-38"> +		<icon +			name="media_whitelist_flag" +			follows="top|right" +			height="16" +			image_name="smicon_warn.tga" +			layout="topleft" +			tool_tip="White List enabled" +			min_width="16" +			width="16" /> +		<icon +			name="media_secure_lock_flag" +			height="16" +			image_name="inv_item_eyes.tga" +			layout="topleft" +			tool_tip="Secured Browsing" +			min_width="16" +			width="16" /> +	  </layout_stack> +	</layout_panel> +	<layout_panel +		name="media_play_position" +		auto_resize="true" +		user_resize="false" +		follows="left|right|top|bottom" +		layout="topleft" +		min_width="100" +		width="200"> +	  <slider_bar +		  name="media_play_slider" +		  follows="left|right|top" +		  height="22" +		  increment="0.05" +		  initial_value="0.5" +		  layout="topleft" +		  tool_tip="Movie play progress" +		  min_width="100" +		  width="200"> +		<slider_bar.commit_callback +			function="MediaCtrl.JumpProgress" /> +	  </slider_bar> +	</layout_panel> +	<layout_panel +		name="media_volume" +		auto_resize="false" +		user_resize="false" +		layout="topleft" +		height="24" +		min_width="24" +		width="24"> +	  <button +		  name="media_volume_button" +		  height="22" +		  image_selected="icn_speaker-muted_dark.tga" +		  image_unselected="icn_speaker_dark.tga" +		  is_toggle="true" +		  layout="topleft" +		  scale_image="false"  +		  picture_style="true" +		  tool_tip="Mute This Media" +		  top_delta="22" +		  min_width="24" +		  width="24" > +		<button.commit_callback +			function="MediaCtrl.ToggleMute" /> +	  </button> +	</layout_panel> +	<layout_panel +		name="volume_up" +		auto_resize="false" +		user_resize="false" +		layout="topleft" +		min_width="20" +		height="14" +		width="20"> +	  <button +		  top="-3" +		  height="14" +		  image_selected="media_btn_scrollup.png" +		  image_unselected="media_btn_scrollup.png" +		  layout="topleft" +		  tool_tip="Volume up" +		  picture_style="true" +		  scale_image="true" +		  min_width="20" +		  width="20" > +		<button.commit_callback +			function="MediaCtrl.CommitVolumeUp" /> +	  </button> +	</layout_panel> +	<layout_panel +		name="volume_down" +		auto_resize="false" +		user_resize="false" +		layout="topleft" +		min_width="20" +		height="14" +		width="20"> +	  <button +		  top="-5" +		  height="14" +		  image_selected="media_btn_scrolldown.png" +		  image_unselected="media_btn_scrolldown.png" +		  layout="topleft" +		  tool_tip="Volume down" +		  picture_style="true" +		  scale_image="true" +		  min_width="20" +		  width="20"> +		<button.commit_callback +			function="MediaCtrl.CommitVolumeDown" /> +	  </button> +	</layout_panel> +	<!-- Scroll pad --> +	<layout_panel +		name="media_panel_scroll" +		auto_resize="false" +		user_resize="false" +		height="32" +		follows="left|right|top|bottom" +		layout="topleft" +		min_width="32" +		width="32"> +	  <icon +		  height="32" +		  image_name="media_panel_scrollbg.png" +		  layout="topleft" +		  top="0" +		  min_width="32" +		  width="32" /> +	  <button +		  name="scrollup" +		  height="8" +		  image_selected="media_btn_scrollup.png" +		  image_unselected="media_btn_scrollup.png" +		  layout="topleft" +		  tool_tip="Scroll up" +		  picture_style="true" +		  scale_image="false" +		  left="12" +		  top_delta="4" +		  min_width="8" +		  width="8" /> +	  <button +		  name="scrollleft" +		  height="8" +		  image_selected="media_btn_scrollleft.png" +		  image_unselected="media_btn_scrollleft.png" +		  layout="topleft" +		  left="3" +		  tool_tip="Scroll left" +		  picture_style="true" +		  scale_image="false" +		  top="12" +		  min_width="8" +		  width="8" /> +	  <button +		  name="scrollright" +		  height="8" +		  image_selected="media_btn_scrollright.png" +		  image_unselected="media_btn_scrollright.png" +		  layout="topleft" +		  left_pad="9" +		  tool_tip="Scroll right" +		  picture_style="true" +		  scale_image="false" +		  top_delta="0" +		  min_width="8" +		  width="8" /> +	  <button +		  name="scrolldown" +		  height="8" +		  image_selected="media_btn_scrolldown.png" +		  image_unselected="media_btn_scrolldown.png" +		  layout="topleft" +		  left="12" +		  tool_tip="Scroll down" +		  picture_style="true" +		  scale_image="false" +		  top="20" +		  min_width="8" +		  width="8" /> +	</layout_panel> +	<layout_panel +		name="zoom_frame" +		auto_resize="false" +		user_resize="false" +		layout="topleft" +		height="28" +		min_width="22" +		width="22"> +	  <button +		  height="22" +		  image_selected="media_btn_optimalzoom.png" +		  image_unselected="media_btn_optimalzoom.png" +		  layout="topleft" +		  tool_tip="Zoom" +		  picture_style="true" +		  min_width="22" +		  width="22"> +		<button.commit_callback +			function="MediaCtrl.Zoom" /> +	  </button> +	</layout_panel> +<!-- +	<panel +		height="22" +		layout="topleft" +		auto_resize="false" +		min_width="3" +		width="3"> +	  <icon +		  height="22" +		  image_name="media_panel_divider.png" +		  layout="topleft" +		  top="0" +		  min_width="3" +		  width="3" /> +	</panel> +--> +	<layout_panel +		name="new_window" +		auto_resize="false" +		user_resize="false" +		layout="topleft" +		min_width="22" +		width="22"> +	  <button +		  height="22" +		  image_selected="media_btn_newwindow.png" +		  image_unselected="media_btn_newwindow.png" +		  layout="topleft" +		  tool_tip = "Open URL in browser" +		  picture_style="true" +		  top_delta="-3" +		  min_width="24" +		  width="24" > +		<button.commit_callback +			function="MediaCtrl.Open" /> +	  </button> +	</layout_panel> +<!-- +	<panel +		height="22" +		layout="topleft" +		auto_resize="false" +		min_width="3" +		width="3"> +	  <icon +		  height="22" +		  image_name="media_panel_divider.png" +		  layout="topleft" +		  top="0" +		  min_width="3" +		  width="3" /> +	</panel> +--> +	<layout_panel +		name="close" +		auto_resize="false" +		user_resize="false" +		layout="topleft" +		min_width="21" +		width="21" > +	  <button +		  height="22" +		  image_selected="media_btn_done.png" +		  image_unselected="media_btn_done.png" +		  layout="topleft" +		  tool_tip ="Close media control" +		  picture_style="true" +		  top_delta="-4" +		  width="21" > +		<button.commit_callback +			function="MediaCtrl.Close" /> +	  </button> +	</layout_panel> +	<layout_panel +		width="0" +		layout="topleft" +		user_resize="false" /> +  </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 35d6478c48..4eacd72a7d 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -61,9 +61,7 @@  	<string name="TooltipFlagGroupScripts">Group Scripts</string>  	<string name="TooltipFlagNoScripts">No Scripts</string>  	<string name="TooltipLand">Land:</string> -	<string name="TooltipMustSingleDrop">Only a single item can be dragged here</string>	 -	<string name="TooltipAltLeft">Alt+← for previous tab</string>	 -	<string name="TooltipAltRight">Alt+→ for next tab</string>	 +	<string name="TooltipMustSingleDrop">Only a single item can be dragged here</string>  	<!-- tooltips for Urls -->  	<string name="TooltipHttpUrl">Click to view this web page</string> @@ -2018,15 +2016,14 @@ this texture in your inventory  	<string name="IMTeen">teen</string>  	<!-- floater region info --> +	<!-- The following will replace variable [ALL_ESTATES] in notifications EstateAllowed*, EstateBanned*, EstateManager* -->  	<string name="RegionInfoError">error</string>  	<string name="RegionInfoAllEstatesOwnedBy"> -		all estates -owned by [OWNER] +		all estates owned by [OWNER]  	</string> -	<string name="RegionInfoAllEstatesYouOwn">all estates you owned</string> +	<string name="RegionInfoAllEstatesYouOwn">all estates that you own</string>  	<string name="RegionInfoAllEstatesYouManage"> -		all estates that -you managed for [OWNER] +		all estates that you manage for [OWNER]  	</string>  	<string name="RegionInfoAllowedResidents">Allowed residents: ([ALLOWEDAGENTS], max [MAXACCESS])</string>  	<string name="RegionInfoAllowedGroups">Allowed groups: ([ALLOWEDGROUPS], max [MAXACCESS])</string> diff --git a/indra/newview/skins/default/xui/en/widgets/chat_history.xml b/indra/newview/skins/default/xui/en/widgets/chat_history.xml index b72d59524e..ea6997ebd5 100644 --- a/indra/newview/skins/default/xui/en/widgets/chat_history.xml +++ b/indra/newview/skins/default/xui/en/widgets/chat_history.xml @@ -4,8 +4,8 @@      message_separator="panel_chat_separator.xml"      left_text_pad="10"  	right_text_pad="15" -    left_widget_pad="5" -	rigth_widget_pad="10" +    left_widget_pad="0" +	right_widget_pad="10"  	max_length="2147483647"  	enabled="false"  	track_bottom="true" diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml index 2fe5f517a2..7d10df1af7 100644 --- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml +++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml @@ -1,6 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <tab_container tab_min_width="60"                 tab_max_width="150" +               font_halign="left"                 tab_height="16">    <first_tab tab_top_image_unselected="TabTop_Left_Off"                 tab_top_image_selected="TabTop_Left_Selected" diff --git a/indra/viewer_components/login/CMakeLists.txt b/indra/viewer_components/login/CMakeLists.txt index fb65779eb7..2f0324bedf 100644 --- a/indra/viewer_components/login/CMakeLists.txt +++ b/indra/viewer_components/login/CMakeLists.txt @@ -53,4 +53,4 @@ set_source_files_properties(      LL_TEST_ADDITIONAL_LIBRARIES "${PTH_LIBRARIES}"    ) -LL_ADD_PROJECT_UNIT_TESTS(lllogin "${lllogin_TEST_SOURCE_FILES}") +#LL_ADD_PROJECT_UNIT_TESTS(lllogin "${lllogin_TEST_SOURCE_FILES}") | 
