diff options
| author | Yuri Chebotarev <ychebotarev@productengine.com> | 2009-12-23 10:00:41 +0200 | 
|---|---|---|
| committer | Yuri Chebotarev <ychebotarev@productengine.com> | 2009-12-23 10:00:41 +0200 | 
| commit | 633c15570a52082030667ec2d096058f16ccf228 (patch) | |
| tree | 674de11ffa2ee17e36e226e698a327ec55aa1481 /indra | |
| parent | 4d9762eb846ae1894f0c31eecb6230803018e730 (diff) | |
| parent | 0a98034641267ea57360fdd369acb8b94ff9bc20 (diff) | |
merge
--HG--
branch : product-engine
Diffstat (limited to 'indra')
97 files changed, 1775 insertions, 751 deletions
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h index 45b84ea3ea..f5c90291b8 100644 --- a/indra/llcommon/llfasttimer.h +++ b/indra/llcommon/llfasttimer.h @@ -36,6 +36,7 @@  #include "llinstancetracker.h"  #define FAST_TIMER_ON 1 +#define TIME_FAST_TIMERS 0  #if LL_WINDOWS @@ -56,7 +57,7 @@ inline U32 get_cpu_clock_count_32()      return ret_val;  } -// return full timer value, still shifted by 8 bits +// return full timer value, *not* shifted by 8 bits  inline U64 get_cpu_clock_count_64()  {  	U64 ret_val; @@ -69,7 +70,7 @@ inline U64 get_cpu_clock_count_64()  		mov dword ptr [ret_val+4], edx  		mov dword ptr [ret_val], eax  	} -    return ret_val >> 8; +    return ret_val;  }  #endif // LL_WINDOWS @@ -242,6 +243,9 @@ public:  	LLFastTimer(NamedTimer::FrameState& timer)  	:	mFrameState(&timer)  	{ +#if TIME_FAST_TIMERS +		U64 timer_start = get_cpu_clock_count_64(); +#endif  #if FAST_TIMER_ON  		NamedTimer::FrameState* frame_state = &timer;  		U32 cur_time = get_cpu_clock_count_32(); @@ -256,10 +260,17 @@ public:  		mLastTimer = sCurTimer;  		sCurTimer = this;  #endif +#if TIME_FAST_TIMERS +		U64 timer_end = get_cpu_clock_count_64(); +		sTimerCycles += timer_end - timer_start; +#endif  	}  	~LLFastTimer()  	{ +#if TIME_FAST_TIMERS +		U64 timer_start = get_cpu_clock_count_64(); +#endif  #if FAST_TIMER_ON  		NamedTimer::FrameState* frame_state = mFrameState;  		U32 cur_time = get_cpu_clock_count_32(); @@ -276,6 +287,11 @@ public:  		U32 total_time = cur_time - mStartTotalTime;  		last_timer->mStartSelfTime += total_time;  #endif +#if TIME_FAST_TIMERS +		U64 timer_end = get_cpu_clock_count_64(); +		sTimerCycles += timer_end - timer_start; +		sTimerCalls++; +#endif	  	} @@ -297,11 +313,12 @@ public:  	static const NamedTimer* getTimerByName(const std::string& name);  public: -	static bool 		sPauseHistory; -	static bool 		sResetHistory; +	static bool 			sPauseHistory; +	static bool 			sResetHistory; +	static U64				sTimerCycles; +	static U32				sTimerCalls;  private: -	typedef std::vector<LLFastTimer*> timer_stack_t;  	static LLFastTimer*		sCurTimer;  	static S32				sCurFrameIndex;  	static S32				sLastFrameIndex; diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index f7fd2dbdfe..d7a692ec9b 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -2717,7 +2717,7 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o  	}  	params.from_xui = true; -	setupParams(params, parent); +	applyXUILayout(params, parent);   	initFromParams(params);  	initFloater(params); diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 5e15fa3919..1aaba88c49 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -247,7 +247,7 @@ LLView* LLLayoutStack::fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o  	}  	p.from_xui = true; -	setupParams(p, parent); +	applyXUILayout(p, parent);  	LLLayoutStack* layout_stackp = LLUICtrlFactory::create<LLLayoutStack>(p);  	if (parent && layout_stackp) @@ -414,6 +414,16 @@ void LLLayoutStack::updatePanelAutoResize(const std::string& panel_name, BOOL au  	}  } +void LLLayoutStack::setPanelUserResize(const std::string& panel_name, BOOL user_resize) +{ +	LayoutPanel* panel = findEmbeddedPanelByName(panel_name); + +	if (panel) +	{ +		panel->mUserResize = user_resize; +	} +} +  bool LLLayoutStack::getPanelMinSize(const std::string& panel_name, S32* min_widthp, S32* min_heightp)  {  	LayoutPanel* panel = findEmbeddedPanelByName(panel_name); diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index c1af428674..cde383b047 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -80,6 +80,7 @@ public:  	S32 getNumPanels() { return mPanels.size(); }  	void updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize); +	void setPanelUserResize(const std::string& panel_name, BOOL user_resize);  	/**  	 * Gets minimal width and/or height of the specified by name panel. diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp index 1891bca36c..aea7c5f87c 100644 --- a/indra/llui/llmultislider.cpp +++ b/indra/llui/llmultislider.cpp @@ -50,6 +50,12 @@ const F32 FLOAT_THRESHOLD = 0.00001f;  S32 LLMultiSlider::mNameCounter = 0; +LLMultiSlider::SliderParams::SliderParams() +:	name("name"), +	value("value", 0.f) +{ +} +  LLMultiSlider::Params::Params()  :	max_sliders("max_sliders", 1),  	allow_overlap("allow_overlap", false), @@ -63,7 +69,8 @@ LLMultiSlider::Params::Params()  	triangle_color("triangle_color"),  	mouse_down_callback("mouse_down_callback"),  	mouse_up_callback("mouse_up_callback"), -	thumb_width("thumb_width") +	thumb_width("thumb_width"), +	sliders("slider")  {  	name = "multi_slider_bar";  	mouse_opaque(true); @@ -99,6 +106,20 @@ LLMultiSlider::LLMultiSlider(const LLMultiSlider::Params& p)  	{  		setMouseUpCallback(initCommitCallback(p.mouse_up_callback));  	} + +	for (LLInitParam::ParamIterator<SliderParams>::const_iterator it = p.sliders().begin(); +		it != p.sliders().end(); +		++it) +	{ +		if (it->name.isProvided()) +		{ +			addSlider(it->value, it->name); +		} +		else +		{ +			addSlider(it->value); +		} +	}  }  LLMultiSlider::~LLMultiSlider() @@ -230,6 +251,30 @@ const std::string& LLMultiSlider::addSlider(F32 val)  	return mCurSlider;  } +void LLMultiSlider::addSlider(F32 val, const std::string& name) +{ +	F32 initVal = val; + +	if(mValue.size() >= mMaxNumSliders) { +		return; +	} + +	bool foundOne = findUnusedValue(initVal); +	if(!foundOne) { +		return; +	} + +	// add a new thumb rect +	mThumbRects[name] = LLRect( 0, getRect().getHeight(), mThumbWidth, 0 ); + +	// add the value and set the current slider to this one +	mValue.insert(name, initVal); +	mCurSlider = name; + +	// move the slider +	setSliderValue(mCurSlider, initVal, TRUE); +} +  bool LLMultiSlider::findUnusedValue(F32& initVal)  {  	bool firstTry = true; @@ -572,7 +617,6 @@ void LLMultiSlider::draw()  	LLF32UICtrl::draw();  } -  boost::signals2::connection LLMultiSlider::setMouseDownCallback( const commit_signal_t::slot_type& cb )   {   	if (!mMouseDownSignal) mMouseDownSignal = new commit_signal_t(); diff --git a/indra/llui/llmultislider.h b/indra/llui/llmultislider.h index f8e43a0470..88576da85b 100644 --- a/indra/llui/llmultislider.h +++ b/indra/llui/llmultislider.h @@ -41,6 +41,13 @@ class LLUICtrlFactory;  class LLMultiSlider : public LLF32UICtrl  {  public: +	struct SliderParams : public LLInitParam::Block<SliderParams> +	{ +		Optional<std::string>	name; +		Mandatory<F32>			value; +		SliderParams(); +	}; +  	struct Params : public LLInitParam::Block<Params, LLF32UICtrl::Params>  	{  		Optional<S32>	max_sliders; @@ -60,6 +67,7 @@ public:  										mouse_up_callback;  		Optional<S32>		thumb_width; +		Multiple<SliderParams>	sliders;  		Params();  	}; @@ -68,13 +76,13 @@ protected:  	friend class LLUICtrlFactory;  public:  	virtual ~LLMultiSlider(); -	void			setSliderValue(const std::string& name, F32 value, BOOL from_event = FALSE); -	F32				getSliderValue(const std::string& name) const; +	void				setSliderValue(const std::string& name, F32 value, BOOL from_event = FALSE); +	F32					getSliderValue(const std::string& name) const; -	const std::string& getCurSlider() const					{ return mCurSlider; } -	F32				getCurSliderValue() const				{ return getSliderValue(mCurSlider); } -	void			setCurSlider(const std::string& name); -	void			setCurSliderValue(F32 val, BOOL from_event = false) { setSliderValue(mCurSlider, val, from_event); } +	const std::string&	getCurSlider() const					{ return mCurSlider; } +	F32					getCurSliderValue() const				{ return getSliderValue(mCurSlider); } +	void				setCurSlider(const std::string& name); +	void				setCurSliderValue(F32 val, BOOL from_event = false) { setSliderValue(mCurSlider, val, from_event); }  	/*virtual*/ void	setValue(const LLSD& value);  	/*virtual*/ LLSD	getValue() const		{ return mValue; } @@ -82,12 +90,13 @@ public:  	boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb );  	boost::signals2::connection setMouseUpCallback(	const commit_signal_t::slot_type& cb ); -	bool			findUnusedValue(F32& initVal); +	bool				findUnusedValue(F32& initVal);  	const std::string&	addSlider();  	const std::string&	addSlider(F32 val); -	void			deleteSlider(const std::string& name); -	void			deleteCurSlider()			{ deleteSlider(mCurSlider); } -	void			clear(); +	void				addSlider(F32 val, const std::string& name); +	void				deleteSlider(const std::string& name); +	void				deleteCurSlider()			{ deleteSlider(mCurSlider); } +	void				clear();  	/*virtual*/ BOOL	handleHover(S32 x, S32 y, MASK mask);  	/*virtual*/ BOOL	handleMouseUp(S32 x, S32 y, MASK mask); @@ -109,7 +118,8 @@ protected:  	LLRect			mDragStartThumbRect;  	S32				mThumbWidth; -	std::map<std::string, LLRect>	mThumbRects; +	std::map<std::string, LLRect>	 +					mThumbRects;  	LLUIColor		mTrackColor;  	LLUIColor		mThumbOutlineColor;  	LLUIColor		mThumbCenterColor; diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp index 7323323d8c..f4434a0f78 100644 --- a/indra/llui/llmultisliderctrl.cpp +++ b/indra/llui/llmultisliderctrl.cpp @@ -65,7 +65,8 @@ LLMultiSliderCtrl::Params::Params()  	text_color("text_color"),  	text_disabled_color("text_disabled_color"),  	mouse_down_callback("mouse_down_callback"), -	mouse_up_callback("mouse_up_callback") +	mouse_up_callback("mouse_up_callback"), +	sliders("slider")  {  	mouse_opaque = true;  } @@ -161,6 +162,7 @@ LLMultiSliderCtrl::LLMultiSliderCtrl(const LLMultiSliderCtrl::Params& p)  	S32 slider_left = label_width ? label_width + multi_sliderctrl_spacing : 0;  	LLRect slider_rect( slider_left, top, slider_right, bottom );  	LLMultiSlider::Params params; +	params.sliders = p.sliders;  	params.rect(slider_rect);  	params.commit_callback.function( LLMultiSliderCtrl::onSliderCommit );  	params.mouse_down_callback( p.mouse_down_callback ); diff --git a/indra/llui/llmultisliderctrl.h b/indra/llui/llmultisliderctrl.h index 16d07541f2..e8366d09c2 100644 --- a/indra/llui/llmultisliderctrl.h +++ b/indra/llui/llmultisliderctrl.h @@ -69,6 +69,8 @@ public:  		Optional<CommitCallbackParam>	mouse_down_callback,  										mouse_up_callback; +		Multiple<LLMultiSlider::SliderParams>	sliders; +  		Params();  	}; diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index 738a96f730..db32882438 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -452,7 +452,7 @@ void LLPanel::initFromParams(const LLPanel::Params& p)  	parseFollowsFlags(p);  	setToolTip(p.tool_tip()); -	setSaveToXML(p.from_xui); +	setFromXUI(p.from_xui);  	mHoverCursor = getCursorFromString(p.hover_cursor); @@ -542,7 +542,7 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu  		}  		params.from_xui = true; -		setupParams(params, parent); +		applyXUILayout(params, parent);  		{  			LLFastTimer timer(FTM_PANEL_CONSTRUCTION);  			initFromParams(params); diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp index 997b9c13f8..4087b484aa 100644 --- a/indra/llui/llradiogroup.cpp +++ b/indra/llui/llradiogroup.cpp @@ -116,6 +116,10 @@ void LLRadioGroup::initFromParams(const Params& p)  		item_params.font.setIfNotProvided(mFont); // apply radio group font by default  		item_params.commit_callback.function = boost::bind(&LLRadioGroup::onClickButton, this, _1);  		item_params.from_xui = p.from_xui; +		if (p.from_xui) +		{ +			applyXUILayout(item_params, this); +		}  		LLRadioCtrl* item = LLUICtrlFactory::create<LLRadioCtrl>(item_params, this);  		mRadioButtons.push_back(item); diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp index 544352176a..7238d903a3 100644 --- a/indra/llui/llscrolllistcell.cpp +++ b/indra/llui/llscrolllistcell.cpp @@ -353,7 +353,7 @@ LLScrollListCheck::LLScrollListCheck(const LLScrollListCell::Params& p)  {  	LLCheckBoxCtrl::Params checkbox_p;  	checkbox_p.name("checkbox"); -	checkbox_p.rect.left(0).bottom(0).width(p.width).height(p.width); +	checkbox_p.rect = LLRect(0, p.width, p.width, 0);  	checkbox_p.enabled(p.enabled);  	checkbox_p.initial_value(p.value()); diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp index d6d46654d5..20a1ab7af3 100644 --- a/indra/llui/llspinctrl.cpp +++ b/indra/llui/llspinctrl.cpp @@ -75,10 +75,8 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)  	static LLUICachedControl<S32> spinctrl_spacing ("UISpinctrlSpacing", 0);  	static LLUICachedControl<S32> spinctrl_btn_width ("UISpinctrlBtnWidth", 0);  	static LLUICachedControl<S32> spinctrl_btn_height ("UISpinctrlBtnHeight", 0); -	S32 top = getRect().getHeight(); -	S32 bottom = top - 2 * spinctrl_btn_height; -	S32 centered_top = top; -	S32 centered_bottom = bottom; +	S32 centered_top = getRect().getHeight(); +	S32 centered_bottom = getRect().getHeight() - 2 * spinctrl_btn_height;  	S32 btn_left = 0;  	// reserve space for spinner  	S32 label_width = llclamp(p.label_width(), 0, llmax(0, getRect().getWidth() - 40)); @@ -105,25 +103,15 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)  	// Spin buttons  	LLButton::Params up_button_params(p.up_button); -	up_button_params.rect -					.left(btn_left) -					.top(top) -					.right(btn_right) -					.height(spinctrl_btn_height); +	up_button_params.rect = LLRect(btn_left, getRect().getHeight(), btn_right, getRect().getHeight() - spinctrl_btn_height);  	up_button_params.click_callback.function(boost::bind(&LLSpinCtrl::onUpBtn, this, _2));  	up_button_params.mouse_held_callback.function(boost::bind(&LLSpinCtrl::onUpBtn, this, _2));  	mUpBtn = LLUICtrlFactory::create<LLButton>(up_button_params);  	addChild(mUpBtn); -	LLRect down_rect( btn_left, top - spinctrl_btn_height, btn_right, bottom ); -  	LLButton::Params down_button_params(p.down_button); -	down_button_params.rect -					.left(btn_left) -					.right(btn_right) -					.bottom(bottom) -					.height(spinctrl_btn_height); +	down_button_params.rect = LLRect(btn_left, getRect().getHeight() - spinctrl_btn_height, btn_right, getRect().getHeight() - 2 * spinctrl_btn_height);  	down_button_params.click_callback.function(boost::bind(&LLSpinCtrl::onDownBtn, this, _2));  	down_button_params.mouse_held_callback.function(boost::bind(&LLSpinCtrl::onDownBtn, this, _2));  	mDownBtn = LLUICtrlFactory::create<LLButton>(down_button_params); diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 83e2e3db50..327dd01612 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -266,8 +266,6 @@ bool LLTabContainer::addChild(LLView* view, S32 tab_group)  	if (panelp)  	{ -		panelp->setSaveToXML(TRUE); -  		addTabPanel(TabPanelParams().panel(panelp).label(panelp->getLabel()).is_placeholder(dynamic_cast<LLPlaceHolderPanel*>(view) != NULL));  		return true;  	} @@ -1019,12 +1017,10 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)  	{  		if (textbox)  		{ -			textbox->setSaveToXML(false);  			addChild( textbox, 0 );  		}  		if (btn)  		{ -			btn->setSaveToXML(false);  			addChild( btn, 0 );  		}  	} @@ -1747,24 +1743,20 @@ void LLTabContainer::initButtons()  		}  	} -	mPrevArrowBtn->setSaveToXML(false);  	mPrevArrowBtn->setTabStop(FALSE);  	addChild(mPrevArrowBtn); -	mNextArrowBtn->setSaveToXML(false);  	mNextArrowBtn->setTabStop(FALSE);  	addChild(mNextArrowBtn);  	if (mJumpPrevArrowBtn)  	{ -		mJumpPrevArrowBtn->setSaveToXML(false);  		mJumpPrevArrowBtn->setTabStop(FALSE);  		addChild(mJumpPrevArrowBtn);  	}  	if (mJumpNextArrowBtn)  	{ -		mJumpNextArrowBtn->setSaveToXML(false);  		mJumpNextArrowBtn->setTabStop(FALSE);  		addChild(mJumpNextArrowBtn);  	} diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index cb0907a771..e54032ac5e 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -962,7 +962,10 @@ void LLTextBase::draw()  	reflow();  	// then update scroll position, as cursor may have moved -	updateScrollFromCursor(); +	if (!mReadOnly) +	{ +		updateScrollFromCursor(); +	}  	LLRect doc_rect;  	if (mScroller) @@ -1932,11 +1935,19 @@ void LLTextBase::endOfLine()  void LLTextBase::startOfDoc()  {  	setCursorPos(0); +	if (mScroller) +	{ +		mScroller->goToTop(); +	}  }  void LLTextBase::endOfDoc()  {  	setCursorPos(getLength()); +	if (mScroller) +	{ +		mScroller->goToBottom(); +	}  }  void LLTextBase::changePage( S32 delta ) @@ -2001,6 +2012,16 @@ void LLTextBase::changeLine( S32 delta )  	setCursorPos(new_cursor_pos, true);  } +bool LLTextBase::scrolledToStart() +{ +	return mScroller->isAtTop(); +} + +bool LLTextBase::scrolledToEnd() +{ +	return mScroller->isAtBottom(); +} +  bool LLTextBase::setCursor(S32 row, S32 column)  { diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index a1f8ba39ae..c91578b637 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -180,6 +180,8 @@ public:  	void					changePage( S32 delta );  	void					changeLine( S32 delta ); +	bool					scrolledToStart(); +	bool					scrolledToEnd();  	const LLFontGL*			getDefaultFont() const					{ return mDefaultFont; } diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index 1ea6b66a93..d0ed3b6fca 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -1915,6 +1915,7 @@ namespace LLInitParam  		green = color.mV[VGREEN];  		blue = color.mV[VBLUE];  		alpha = color.mV[VALPHA]; +		control.set("", false);  	}  	void TypeValues<LLUIColor>::declareValues() @@ -2046,12 +2047,16 @@ namespace LLInitParam  	void TypedParam<LLRect>::setBlockFromValue()  	{ -		left = mData.mValue.mLeft; -		right = mData.mValue.mRight; -		bottom = mData.mValue.mBottom; -		top = mData.mValue.mTop; -		width.setProvided(false); -		height.setProvided(false); +		// because of the ambiguity in specifying a rect by position and/or dimensions +		// we clear the "provided" flag so that values from xui/etc have priority +		// over those calculated from the rect object + +		left.set(mData.mValue.mLeft, false); +		right.set(mData.mValue.mRight, false); +		bottom.set(mData.mValue.mBottom, false); +		top.set(mData.mValue.mTop, false); +		width.set(mData.mValue.getWidth(), false); +		height.set(mData.mValue.getHeight(), false);  	}  	TypedParam<LLCoordGL>::TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h index 6788f29ba9..b1fa6add67 100644 --- a/indra/llui/lluictrlfactory.h +++ b/indra/llui/lluictrlfactory.h @@ -184,8 +184,6 @@ public:  	{  		T* widget = NULL; -		T::setupParams(params, parent); -  		if (!params.validateBlock())  		{  			llwarns << getInstance()->getCurFileName() << ": Invalid parameter block for " << typeid(T).name() << llendl; @@ -310,6 +308,7 @@ fail:  		// Apply layout transformations, usually munging rect  		params.from_xui = true; +		T::applyXUILayout(params, parent);  		T* widget = createWidget<T>(params, parent);  		typedef typename T::child_registry_t registry_t; diff --git a/indra/llui/lluiimage.cpp b/indra/llui/lluiimage.cpp index 1dfc281d93..966d919dc7 100644 --- a/indra/llui/lluiimage.cpp +++ b/indra/llui/lluiimage.cpp @@ -168,6 +168,7 @@ namespace LLInitParam  		if (name() == "none")  		{  			mData.mValue = NULL; +			return;  		}  		LLUIImage* imagep =  LLUI::getUIImage(name()); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 95dc2ce027..983f0a2d49 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -80,7 +80,7 @@ std::string LLUrlEntryBase::escapeUrl(const std::string &url) const  			"ABCDEFGHIJKLMNOPQRSTUVWXYZ"  			"abcdefghijklmnopqrstuvwxyz"  			"0123456789" -			"-._~!$?&()*+,@:;=/%"; +			"-._~!$?&()*+,@:;=/%#";  		std::sort(no_escape_chars.begin(), no_escape_chars.end());  		initialized = true; diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index afcff0d409..ad5c0911f8 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -223,3 +223,23 @@ bool LLUrlRegistry::hasUrl(const LLWString &text)  	LLUrlMatch match;  	return findUrl(text, match);  } + +bool LLUrlRegistry::isUrl(const std::string &text) +{ +	LLUrlMatch match; +	if (findUrl(text, match)) +	{ +		return (match.getStart() == 0 && match.getEnd() >= text.size()-1); +	} +	return false; +} + +bool LLUrlRegistry::isUrl(const LLWString &text) +{ +	LLUrlMatch match; +	if (findUrl(text, match)) +	{ +		return (match.getStart() == 0 && match.getEnd() >= text.size()-1); +	} +	return false; +} diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h index d7800d8cfc..399ee0a988 100644 --- a/indra/llui/llurlregistry.h +++ b/indra/llui/llurlregistry.h @@ -85,6 +85,10 @@ public:  	bool hasUrl(const std::string &text);  	bool hasUrl(const LLWString &text); +	// return true if the given string is a URL that findUrl would match +	bool isUrl(const std::string &text); +	bool isUrl(const LLWString &text); +  private:  	LLUrlRegistry();  	friend class LLSingleton<LLUrlRegistry>; diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index a8d8626e49..f1b08c380b 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -126,7 +126,7 @@ LLView::LLView(const LLView::Params& p)  :	mName(p.name),  	mParentView(NULL),  	mReshapeFlags(FOLLOWS_NONE), -	mSaveToXML(p.from_xui), +	mFromXUI(p.from_xui),  	mIsFocusRoot(FALSE),  	mLastVisible(FALSE),  	mNextInsertionOrdinal(0), @@ -2479,7 +2479,7 @@ static bool get_last_child_rect(LLView* parent, LLRect *rect)  	for (;itor != parent->getChildList()->end(); ++itor)  	{  		LLView *last_view = (*itor); -		if (last_view->getSaveToXML()) +		if (last_view->getFromXUI())  		{  			*rect = last_view->getRect();  			return true; @@ -2489,7 +2489,7 @@ static bool get_last_child_rect(LLView* parent, LLRect *rect)  }  //static -void LLView::setupParams(LLView::Params& p, LLView* parent) +void LLView::applyXUILayout(LLView::Params& p, LLView* parent)  {  	const S32 VPAD = 4;  	const S32 MIN_WIDGET_HEIGHT = 10; @@ -2509,7 +2509,7 @@ void LLView::setupParams(LLView::Params& p, LLView* parent)  		LLRect last_rect = parent->getLocalRect();  		bool layout_topleft = (p.layout() == "topleft"); -		if (layout_topleft && p.from_xui) +		if (layout_topleft)  		{  			//invert top to bottom  			if (p.rect.top.isProvided()) p.rect.top = parent_rect.getHeight() - p.rect.top; @@ -2535,10 +2535,10 @@ void LLView::setupParams(LLView::Params& p, LLView* parent)  				p.rect.right.setProvided(false); // recalculate the right  			}  		} -		else if (p.from_xui) // only do negative coordinate magic for XUI +		else  		{ -			if (p.rect.left < 0) p.rect.left = p.rect.left + parent_rect.getWidth(); -			if (p.rect.right < 0) p.rect.right = p.rect.right + parent_rect.getWidth(); +			if (p.rect.left.isProvided() && p.rect.left < 0) p.rect.left = p.rect.left + parent_rect.getWidth(); +			if (p.rect.right.isProvided() && p.rect.right < 0) p.rect.right = p.rect.right + parent_rect.getWidth();  		}  		if (p.center_vert)  		{ @@ -2556,15 +2556,15 @@ void LLView::setupParams(LLView::Params& p, LLView* parent)  				p.rect.top.setProvided(false); // recalculate the top  			}  		} -		else if (p.from_xui) +		else  		{ -			if (p.rect.bottom < 0) p.rect.bottom = p.rect.bottom + parent_rect.getHeight(); -			if (p.rect.top < 0) p.rect.top = p.rect.top + parent_rect.getHeight(); +			if (p.rect.bottom.isProvided() && p.rect.bottom < 0) p.rect.bottom = p.rect.bottom + parent_rect.getHeight(); +			if (p.rect.top.isProvided() && p.rect.top < 0) p.rect.top = p.rect.top + parent_rect.getHeight();  		}  		// DEPRECATE: automatically fall back to height of MIN_WIDGET_HEIGHT pixels -		if (!p.rect.height.isProvided() && !p.rect.top.isProvided()) +		if (!p.rect.height.isProvided() && !p.rect.top.isProvided() && p.rect.height == 0)  		{  			p.rect.height = MIN_WIDGET_HEIGHT;  		} @@ -2663,7 +2663,7 @@ static void convert_to_relative_layout(LLView::Params& p, LLView* parent)  	// Use setupParams to get the final widget rectangle  	// according to our wacky layout rules.  	LLView::Params final = p; -	LLView::setupParams(final, parent); +	LLView::applyXUILayout(final, parent);  	// Must actually extract the rectangle to get consistent  	// right = left+width, top = bottom+height  	LLRect final_rect = final.rect; diff --git a/indra/llui/llview.h b/indra/llui/llview.h index f8460f5361..c4d7313743 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -395,8 +395,8 @@ public:  	void parseFollowsFlags(const LLView::Params& params);  	// Some widgets, like close box buttons, don't need to be saved -	BOOL getSaveToXML() const { return mSaveToXML; } -	void setSaveToXML(BOOL b) { mSaveToXML = b; } +	BOOL getFromXUI() const { return mFromXUI; } +	void setFromXUI(BOOL b) { mFromXUI = b; }  	typedef enum e_hit_test_type  	{ @@ -498,7 +498,7 @@ public:  	// Set up params after XML load before calling new(),  	// usually to adjust layout. -	static void setupParams(Params& p, LLView* parent); +	static void applyXUILayout(Params& p, LLView* parent);  	// For re-export of floaters and panels, convert the coordinate system  	// to be top-left based. @@ -573,7 +573,7 @@ private:  	LLUIString	mToolTipMsg;	// isNull() is true if none.  	U8          mSoundFlags; -	BOOL		mSaveToXML; +	BOOL		mFromXUI;  	BOOL		mIsFocusRoot;  	BOOL		mUseBoundingRect; // hit test against bounding rectangle that includes all child elements diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 9f7b782320..f3d399c616 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1446,6 +1446,10 @@ if (WINDOWS)        ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qmng4.dll        ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qsvg4.dll        ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qtiff4.dll +      ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qcncodecs4.dll +      ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qjpcodecs4.dll +      ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qkrcodecs4.dll +      ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qtwcodecs4.dll        ${ARCH_PREBUILT_DIRS_DEBUG}/libeay32.dll        ${ARCH_PREBUILT_DIRS_DEBUG}/qtcored4.dll        ${ARCH_PREBUILT_DIRS_DEBUG}/qtguid4.dll @@ -1460,6 +1464,10 @@ if (WINDOWS)        ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qmngd4.dll        ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qsvgd4.dll        ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qtiffd4.dll +      ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qcncodecsd4.dll +      ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qjpcodecsd4.dll +      ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qkrcodecsd4.dll +      ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qtwcodecsd4.dll        SLPlugin        media_plugin_quicktime        media_plugin_webkit diff --git a/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl index 28908a311d..0fad5b4b50 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl @@ -10,7 +10,6 @@  uniform sampler2DRect depthMap;  uniform sampler2DRect normalMap;  uniform sampler2DRect lightMap; -uniform sampler2DRect edgeMap;  uniform float dist_factor;  uniform float blur_size; @@ -46,53 +45,36 @@ void main()  	dlt /= max(-pos.z*dist_factor, 1.0); -	vec2 defined_weight = kern[0].xy; // special case the kern[0] (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free' +	vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'  	vec4 col = defined_weight.xyxx * ccol; - -	float center_e = 1.0 - (texture2DRect(edgeMap, vary_fragcoord.xy).a+ -		      texture2DRect(edgeMap, vary_fragcoord.xy+dlt*0.333).a+ -	              texture2DRect(edgeMap, vary_fragcoord.xy-dlt*0.333).a); -	float e = center_e;  	for (int i = 1; i < 4; i++)  	{  		vec2 tc = vary_fragcoord.xy + kern[i].z*dlt; -		 -		e = max(e, 0.0); -		 -		vec2 wght = kern[i].xy*e; -		 -		col += texture2DRect(lightMap, tc)*wght.xyxx; -		defined_weight += wght; -		 -		e *= e; -		e -= texture2DRect(edgeMap, tc.xy).a+ -			texture2DRect(edgeMap, tc.xy+dlt*0.333).a+ -			texture2DRect(edgeMap, tc.xy-dlt*0.333).a; +	        vec3 samppos = getPosition(tc).xyz;  +		float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane +		if (d*d <= 0.003) +		{ +			col += texture2DRect(lightMap, tc)*kern[i].xyxx; +			defined_weight += kern[i].xy; +		}  	} - -	e = center_e;  	for (int i = 1; i < 4; i++)  	{  		vec2 tc = vary_fragcoord.xy - kern[i].z*dlt; -		 -		e = max(e, 0.0); -		 -		vec2 wght = kern[i].xy*e; -		 -		col += texture2DRect(lightMap, tc)*wght.xyxx; -		defined_weight += wght; -		 -		e *= e; -		e -= texture2DRect(edgeMap, tc.xy).a+ -			texture2DRect(edgeMap, tc.xy+dlt*0.333).a+ -			texture2DRect(edgeMap, tc.xy-dlt*0.333).a; +	        vec3 samppos = getPosition(tc).xyz;  +		float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane +		if (d*d <= 0.003) +		{ +			col += texture2DRect(lightMap, tc)*kern[i].xyxx; +			defined_weight += kern[i].xy; +		}  	} +  	col /= defined_weight.xyxx;  	gl_FragColor = col; -	 -	//gl_FragColor = ccol;  } + diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index d20c23df80..4029bf95a0 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -1,4 +1,4 @@ -version 20 +version 21  // NOTE: This is mostly identical to featuretable_mac.txt with a few differences  // Should be combined into one table @@ -28,6 +28,7 @@ RenderAvatarCloth			1	1  RenderAvatarLODFactor		1	1.0  RenderAvatarVP				1	1  RenderCubeMap				1	1 +RenderDelayVBUpdate			1	0  RenderFarClip				1	256  RenderFlexTimeFactor		1	1.0  RenderFogRatio				1	4.0 diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index 57d712ede7..61a8e51c50 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -1,4 +1,4 @@ -version 20 +version 21  // NOTE: This is mostly identical to featuretable_mac.txt with a few differences  // Should be combined into one table @@ -28,6 +28,7 @@ RenderAvatarCloth			1	1  RenderAvatarLODFactor		1	1.0  RenderAvatarVP				1	1  RenderCubeMap				1	1 +RenderDelayVBUpdate			1	0  RenderFarClip				1	256  RenderFlexTimeFactor		1	1.0  RenderFogRatio				1	4.0 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index 15974c0691..12d47a904c 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -1,4 +1,4 @@ -version 20 +version 21  // NOTE: This is mostly identical to featuretable_mac.txt with a few differences  // Should be combined into one table @@ -28,6 +28,7 @@ RenderAvatarCloth				0	0  RenderAvatarLODFactor			1	1.0  RenderAvatarVP					1	0  RenderCubeMap					1	1 +RenderDelayVBUpdate				1	0  RenderFarClip					1	256  RenderFlexTimeFactor			1	1.0  RenderFogRatio					1	4.0 diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 454e547155..79ba3fb51d 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -871,24 +871,31 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs  	if (mInitialWearablesUpdateReceived)  		return;  	mInitialWearablesUpdateReceived = true; +	 +	// If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account) +	// then auto-populate outfits from the library into the My Outfits folder. +	if (LLInventoryModel::getIsFirstTimeInViewer2()) +	{ +		gAgentWearables.populateMyOutfitsFolder(); +	}  	LLUUID agent_id;  	gMessageSystem->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); -	const BOOL is_first_time_in_viewer2_0 = (gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, FALSE) == LLUUID::null); - -  	LLVOAvatar* avatar = gAgent.getAvatarObject();  	if (avatar && (agent_id == avatar->getID()))  	{  		gMessageSystem->getU32Fast(_PREHASH_AgentData, _PREHASH_SerialNum, gAgentQueryManager.mUpdateSerialNum); +		const S32 NUM_BODY_PARTS = 4;  		S32 num_wearables = gMessageSystem->getNumberOfBlocksFast(_PREHASH_WearableData); -		if (num_wearables < 4) +		if (num_wearables < NUM_BODY_PARTS)  		{  			// Transitional state.  Avatars should always have at least their body parts (hair, eyes, shape and skin). -			// The fact that they don't have any here (only a dummy is sent) implies that this account existed -			// before we had wearables, or that the database has gotten messed up. +			// The fact that they don't have any here (only a dummy is sent) implies that either: +			// 1. This account existed before we had wearables +			// 2. The database has gotten messed up +			// 3. This is the account's first login (i.e. the wearables haven't been generated yet).  			return;  		} @@ -957,8 +964,6 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs  			gInventory.addObserver(outfit);  		} -		if (is_first_time_in_viewer2_0) -			gAgentWearables.populateMyOutfitsFolder();  	}  } diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index c5a1ffdcb3..2a8c55e5db 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -243,7 +243,6 @@ void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids)  		return;  	} -	// start the call once the session has fully initialized  	gIMMgr->autoStartCallOnStartup(session_id);  	make_ui_sound("UISndStartIM"); @@ -333,6 +332,54 @@ void LLAvatarActions::pay(const LLUUID& id)  	}  } +// static +void LLAvatarActions::kick(const LLUUID& id) +{ +	LLSD payload; +	payload["avatar_id"] = id; +	LLNotifications::instance().add("KickUser", LLSD(), payload, handleKick); +} + +// static +void LLAvatarActions::freeze(const LLUUID& id) +{ +	LLSD payload; +	payload["avatar_id"] = id; +	LLNotifications::instance().add("FreezeUser", LLSD(), payload, handleFreeze); +} + +// static +void LLAvatarActions::unfreeze(const LLUUID& id) +{ +	LLSD payload; +	payload["avatar_id"] = id; +	LLNotifications::instance().add("UnFreezeUser", LLSD(), payload, handleUnfreeze); +} + +//static  +void LLAvatarActions::csr(const LLUUID& id, std::string name) +{ +	if (name.empty()) return; +	 +	std::string url = "http://csr.lindenlab.com/agent/"; +	 +	// slow and stupid, but it's late +	S32 len = name.length(); +	for (S32 i = 0; i < len; i++) +	{ +		if (name[i] == ' ') +		{ +			url += "%20"; +		} +		else +		{ +			url += name[i]; +		} +	} +	 +	LLWeb::loadURL(url); +} +  //static   void LLAvatarActions::share(const LLUUID& id)  { @@ -457,6 +504,67 @@ bool LLAvatarActions::callbackAddFriendWithMessage(const LLSD& notification, con  }  // static +bool LLAvatarActions::handleKick(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotification::getSelectedOption(notification, response); + +	if (option == 0) +	{ +		LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID(); +		LLMessageSystem* msg = gMessageSystem; + +		msg->newMessageFast(_PREHASH_GodKickUser); +		msg->nextBlockFast(_PREHASH_UserInfo); +		msg->addUUIDFast(_PREHASH_GodID,		gAgent.getID() ); +		msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID()); +		msg->addUUIDFast(_PREHASH_AgentID,   avatar_id ); +		msg->addU32("KickFlags", KICK_FLAGS_DEFAULT ); +		msg->addStringFast(_PREHASH_Reason,    response["message"].asString() ); +		gAgent.sendReliableMessage(); +	} +	return false; +} +bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotification::getSelectedOption(notification, response); + +	if (option == 0) +	{ +		LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID(); +		LLMessageSystem* msg = gMessageSystem; + +		msg->newMessageFast(_PREHASH_GodKickUser); +		msg->nextBlockFast(_PREHASH_UserInfo); +		msg->addUUIDFast(_PREHASH_GodID,		gAgent.getID() ); +		msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID()); +		msg->addUUIDFast(_PREHASH_AgentID,   avatar_id ); +		msg->addU32("KickFlags", KICK_FLAGS_FREEZE ); +		msg->addStringFast(_PREHASH_Reason, response["message"].asString() ); +		gAgent.sendReliableMessage(); +	} +	return false; +} +bool LLAvatarActions::handleUnfreeze(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotification::getSelectedOption(notification, response); +	std::string text = response["message"].asString(); +	if (option == 0) +	{ +		LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID(); +		LLMessageSystem* msg = gMessageSystem; + +		msg->newMessageFast(_PREHASH_GodKickUser); +		msg->nextBlockFast(_PREHASH_UserInfo); +		msg->addUUIDFast(_PREHASH_GodID,		gAgent.getID() ); +		msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID()); +		msg->addUUIDFast(_PREHASH_AgentID,   avatar_id ); +		msg->addU32("KickFlags", KICK_FLAGS_UNFREEZE ); +		msg->addStringFast(_PREHASH_Reason,    text ); +		gAgent.sendReliableMessage(); +	} +	return false; +} +// static  bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& response)  {  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index 01c18d4228..a4504ae679 100644 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -138,11 +138,35 @@ public:  	 */	  	static void inviteToGroup(const LLUUID& id); +	/** +	 * Kick avatar off grid +	 */	 +	static void kick(const LLUUID& id); + +	/** +	 * Freeze avatar +	 */	 +	static void freeze(const LLUUID& id); + +	/** +	 * Unfreeze avatar +	 */	 +	static void unfreeze(const LLUUID& id); + +	/** +	 * Open csr page for avatar +	 */	 +	static void csr(const LLUUID& id, std::string name); + +	  private:  	static bool callbackAddFriend(const LLSD& notification, const LLSD& response);  	static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);  	static bool handleRemove(const LLSD& notification, const LLSD& response);  	static bool handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id); +	static bool handleKick(const LLSD& notification, const LLSD& response); +	static bool handleFreeze(const LLSD& notification, const LLSD& response); +	static bool handleUnfreeze(const LLSD& notification, const LLSD& response);  	static void callback_invite_to_group(LLUUID group_id, LLUUID id);  	// Just request friendship, no dialog. diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index fe4f0c5525..c222ced98f 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -79,6 +79,28 @@ static void* create_non_avatar_caller(void*)  	return new LLNonAvatarCaller;  } +LLCallFloater::LLAvatarListItemRemoveTimer::LLAvatarListItemRemoveTimer(callback_t remove_cb, F32 period, const LLUUID& speaker_id) +: LLEventTimer(period) +, mRemoveCallback(remove_cb) +, mSpeakerId(speaker_id) +{ +} + +BOOL LLCallFloater::LLAvatarListItemRemoveTimer::tick() +{ +	if (mRemoveCallback) +	{ +		mRemoveCallback(mSpeakerId); +	} +	return TRUE; +} + + +LLCallFloater::Params::Params() +: voice_left_remove_delay("voice_left_remove_delay", 10) +{ +} +  LLCallFloater::LLCallFloater(const LLSD& key)  : LLDockableFloater(NULL, false, key)  , mSpeakerManager(NULL) @@ -90,6 +112,7 @@ LLCallFloater::LLCallFloater(const LLSD& key)  , mSpeakingIndicator(NULL)  , mIsModeratorMutedVoice(false)  , mInitParticipantsVoiceState(false) +, mVoiceLeftRemoveDelay(10) // TODO: mantipov: make xml driven  {  	mFactoryMap["non_avatar_caller"] = LLCallbackMap(create_non_avatar_caller, NULL);  	LLVoiceClient::getInstance()->addObserver(this); @@ -98,6 +121,8 @@ LLCallFloater::LLCallFloater(const LLSD& key)  LLCallFloater::~LLCallFloater()  { +	resetVoiceRemoveTimers(); +  	delete mPaticipants;  	mPaticipants = NULL; @@ -149,7 +174,11 @@ void LLCallFloater::draw()  	// It should be done only when she joins or leaves voice chat.  	// But seems that LLVoiceClientParticipantObserver is not enough to satisfy this requirement.  	// *TODO: mantipov: remove from draw() -	onChange(); + +	// NOTE: it looks like calling onChange() here is not necessary, +	// but sometime it is not called properly from the observable object. +	// Seems this is a problem somewhere in Voice Client (LLVoiceClient::participantAddedEvent) +//	onChange();  	bool is_moderator_muted = gVoiceClient->getIsModeratorMuted(gAgentID); @@ -262,12 +291,28 @@ void LLCallFloater::updateSession()  		if (show_me)   		{  			setVisible(true); +			// Workaround(EM): Set current call dialog to front most because +			// connect/leaving popups should appear on top of VCP. +			// See bug EXT-3628. +			LLOutgoingCallDialog* instance = +				LLFloaterReg::findTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY); +			if(instance && instance->getVisible()) +			{ +				instance->setFrontmost(); +			}  		}  	}  }  void LLCallFloater::refreshPartisipantList()  { +	// lets forget states from the previous session +	// for timers... +	resetVoiceRemoveTimers(); + +	// ...and for speaker state +	mSpeakerStateMap.clear(); +  	delete mPaticipants;  	mPaticipants = NULL;  	mAvatarList->clear(); @@ -482,28 +527,10 @@ void LLCallFloater::updateParticipantsVoiceState()  	std::vector<LLUUID> speakers_list;  	// Get a list of participants from VoiceClient -	LLVoiceClient::participantMap *map = gVoiceClient->getParticipantList(); -	if (!map) return; - -	for (LLVoiceClient::participantMap::const_iterator iter = map->begin(); -		iter != map->end(); ++iter) -	{ -		LLUUID id = (*iter).second->mAvatarID; -//		if ( id != gAgent.getID() ) -		{ -			speakers_list.push_back(id); -/* -			LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*> (mAvatarList->getItemByValue(id)); -			if (item) -			{ -				setState(item, STATE_JOINED); -			} -*/ - -		} -	} +	std::vector<LLUUID> speakers_uuids; +	get_voice_participants_uuids(speakers_uuids); -	// Updating the status for each participant. +	// Updating the status for each participant already in list.  	std::vector<LLPanel*> items;  	mAvatarList->getItems(items);  	std::vector<LLPanel*>::const_iterator @@ -518,14 +545,14 @@ void LLCallFloater::updateParticipantsVoiceState()  		const LLUUID participant_id = item->getAvatarId();  		bool found = false; -		std::vector<LLUUID>::iterator speakers_iter = std::find(speakers_list.begin(), speakers_list.end(), participant_id); +		std::vector<LLUUID>::iterator speakers_iter = std::find(speakers_uuids.begin(), speakers_uuids.end(), participant_id);  		lldebugs << "processing speaker: " << item->getAvatarName() << ", " << item->getAvatarId() << llendl;  		// If an avatarID assigned to a panel is found in a speakers list  		// obtained from VoiceClient we assign the JOINED status to the owner  		// of this avatarID. -		if (speakers_iter != speakers_list.end()) +		if (speakers_iter != speakers_uuids.end())  		{  			setState(item, STATE_JOINED); @@ -534,15 +561,15 @@ void LLCallFloater::updateParticipantsVoiceState()  				continue;  			speaker->mHasLeftCurrentCall = FALSE; -			speakers_list.erase(speakers_iter); +			speakers_uuids.erase(speakers_iter);  			found = true;  		} -		// If an avatarID is not found in a speakers list from VoiceClient and -		// a panel with this ID has a JOINED status this means that this person -		// HAS LEFT the call.  		if (!found)  		{ +			// If an avatarID is not found in a speakers list from VoiceClient and +			// a panel with this ID has a JOINED status this means that this person +			// HAS LEFT the call.  			if ((getState(participant_id) == STATE_JOINED))  			{  				setState(item, STATE_LEFT); @@ -553,30 +580,13 @@ void LLCallFloater::updateParticipantsVoiceState()  				speaker->mHasLeftCurrentCall = TRUE;  			} +			// If an avatarID is not found in a speakers list from VoiceClient and +			// a panel with this ID has a LEFT status this means that this person +			// HAS ENTERED session but it is not in voice chat yet. So, set INVITED status  			else if ((getState(participant_id) != STATE_LEFT))  			{  				setState(item, STATE_INVITED);  			} - -/* -			// If there is already a started timer for the current panel don't do anything. -			bool no_timer_for_current_panel = true; -			if (mTimersMap.size() > 0) -			{ -				timers_map::iterator found_it = mTimersMap.find(participant_id); -				if (found_it != mTimersMap.end()) -				{ -					no_timer_for_current_panel = false; -				} -			} - -			if (no_timer_for_current_panel) -			{ -				// Starting a timer to remove an avatar row panel after timeout -				// *TODO Make the timeout period adjustable -				mTimersMap.insert(timer_pair(participant_id, new LLAvatarRowRemoveTimer(this->getHandle(), 10, participant_id))); -			} -*/  		}  	} @@ -584,6 +594,19 @@ void LLCallFloater::updateParticipantsVoiceState()  void LLCallFloater::setState(LLAvatarListItem* item, ESpeakerState state)  { +	// *HACK: mantipov: sometimes such situation is possible while switching to voice channel: +/* +	- voice channel is switched to the one user is joining +	- participant list is initialized with voice states: agent is in voice +	- than such log messages were found (with agent UUID) +			- LLVivoxProtocolParser::process_impl: parsing: <Response requestId="22" action="Session.MediaDisconnect.1"><ReturnCode>0</ReturnCode><Results><StatusCode>0</StatusCode><StatusString /></Results><InputXml><Request requestId="22" action="Session.MediaDisconnect.1"><SessionGroupHandle>9</SessionGroupHandle><SessionHandle>12</SessionHandle><Media>Audio</Media></Request></InputXml></Response> +			- LLVoiceClient::sessionState::removeParticipant: participant "sip:x2pwNkMbpR_mK4rtB_awASA==@bhr.vivox.com" (da9c0d90-c6e9-47f9-8ae2-bb41fdac0048) removed. +	- and than while updating participants voice states agent is marked as HAS LEFT +	- next updating of LLVoiceClient state makes agent JOINED +	So, lets skip HAS LEFT state for agent's avatar +*/ +	if (STATE_LEFT == state && item->getAvatarId() == gAgentID) return; +  	setState(item->getAvatarId(), state);  	LLStyle::Params speaker_style; @@ -592,18 +615,16 @@ void LLCallFloater::setState(LLAvatarListItem* item, ESpeakerState state)  	switch (state)  	{  	case STATE_INVITED: -//		status_str = "INVITED";			// *TODO: localize  		new_desc.setStyle(LLFontGL::NORMAL);  		break;  	case STATE_JOINED: -//		status_str = "JOINED";			// *TODO: localize +		removeVoiceRemoveTimer(item->getAvatarId());  		new_desc.setStyle(LLFontGL::NORMAL);  		break;  	case STATE_LEFT:  		{ -			//		status_str = "HAS LEFT CALL";	// *TODO: localize +			setVoiceRemoveTimer(item->getAvatarId());  			new_desc.setStyle(LLFontGL::ITALIC); -  		}  		break;  	default: @@ -622,4 +643,70 @@ void LLCallFloater::setState(LLAvatarListItem* item, ESpeakerState state)  	}  } +void LLCallFloater::setVoiceRemoveTimer(const LLUUID& voice_speaker_id) +{ + +	// If there is already a started timer for the current panel don't do anything. +	bool no_timer_for_current_panel = true; +	if (mVoiceLeftTimersMap.size() > 0) +	{ +		timers_map::iterator found_it = mVoiceLeftTimersMap.find(voice_speaker_id); +		if (found_it != mVoiceLeftTimersMap.end()) +		{ +			no_timer_for_current_panel = false; +		} +	} + +	if (no_timer_for_current_panel) +	{ +		// Starting a timer to remove an avatar row panel after timeout +		mVoiceLeftTimersMap.insert(timer_pair(voice_speaker_id, +			new LLAvatarListItemRemoveTimer(boost::bind(&LLCallFloater::removeVoiceLeftParticipant, this, _1), mVoiceLeftRemoveDelay, voice_speaker_id))); +	} +} + +void LLCallFloater::removeVoiceLeftParticipant(const LLUUID& voice_speaker_id) +{ +	if (mVoiceLeftTimersMap.size() > 0) +	{ +		mVoiceLeftTimersMap.erase(mVoiceLeftTimersMap.find(voice_speaker_id)); +	} + +	LLAvatarList::uuid_vector_t& speaker_uuids = mAvatarList->getIDs(); +	LLAvatarList::uuid_vector_t::iterator pos = std::find(speaker_uuids.begin(), speaker_uuids.end(), voice_speaker_id); +	if(pos != speaker_uuids.end()) +	{ +		speaker_uuids.erase(pos); +		mAvatarList->setDirty(); +	} +} + + +void LLCallFloater::resetVoiceRemoveTimers() +{ +	if (mVoiceLeftTimersMap.size() > 0) +	{ +		for (timers_map::iterator iter = mVoiceLeftTimersMap.begin(); +			iter != mVoiceLeftTimersMap.end(); ++iter) +		{ +			delete iter->second; +		} +	} +	mVoiceLeftTimersMap.clear(); +} + +void LLCallFloater::removeVoiceRemoveTimer(const LLUUID& voice_speaker_id) +{ +	// Remove the timer if it has been already started +	if (mVoiceLeftTimersMap.size() > 0) +	{ +		timers_map::iterator found_it = mVoiceLeftTimersMap.find(voice_speaker_id); +		if (found_it != mVoiceLeftTimersMap.end()) +		{ +			delete found_it->second; +			mVoiceLeftTimersMap.erase(found_it); +		} +	} +} +  //EOF diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h index 21fba433c6..537c57f671 100644 --- a/indra/newview/llcallfloater.h +++ b/indra/newview/llcallfloater.h @@ -57,6 +57,15 @@ class LLSpeakerMgr;  class LLCallFloater : public LLDockableFloater, LLVoiceClientParticipantObserver  {  public: +	struct Params :	public LLInitParam::Block<Params, LLDockableFloater::Params> +	{ +		Optional<S32>			voice_left_remove_delay; + +		Params(); +	}; + +	LOG_CLASS(LLCallFloater); +  	LLCallFloater(const LLSD& key);  	~LLCallFloater(); @@ -106,6 +115,13 @@ private:  	 * Refreshes participant list according to current Voice Channel  	 */  	void refreshPartisipantList(); + +	/** +	 * Handles event on avatar list is refreshed after it was marked dirty. +	 * +	 * It sets initial participants voice states (once after the first refreshing) +	 * and updates voice states each time anybody is joined/left voice chat in session. +	 */  	void onAvatarListRefreshed(); @@ -114,7 +130,21 @@ private:  	void setModeratorMutedVoice(bool moderator_muted);  	void updateAgentModeratorState(); +	/** +	 * Sets initial participants voice states in avatar list (Invited, Joined, Has Left). +	 * +	 * @see refreshPartisipantList() +	 * @see onAvatarListRefreshed() +	 * @see mInitParticipantsVoiceState +	 */  	void initParticipantsVoiceState(); + +	/** +	 * Updates participants voice states in avatar list (Invited, Joined, Has Left). +	 * +	 * @see onAvatarListRefreshed() +	 * @see onChanged() +	 */  	void updateParticipantsVoiceState();  	void setState(LLAvatarListItem* item, ESpeakerState state); @@ -130,6 +160,34 @@ private:  		return mSpeakerStateMap[speaker_id];  	} + +	/** +	 * Instantiates new LLAvatarListItemRemoveTimer and adds it into the map if it is not already created. +	 * +	 * @param voice_speaker_id LLUUID of Avatar List item to be removed from the list when timer expires. +	 */ +	void setVoiceRemoveTimer(const LLUUID& voice_speaker_id); + +	/** +	 * Removes specified by UUID Avatar List item. +	 * +	 * @param voice_speaker_id LLUUID of Avatar List item to be removed from the list. +	 */ +	void removeVoiceLeftParticipant(const LLUUID& voice_speaker_id); + +	/** +	 * Deletes all timers from the list to prevent started timers from ticking after destruction +	 * and after switching on another voice channel. +	 */ +	void resetVoiceRemoveTimers(); + +	/** +	 * Removes specified by UUID timer from the map. +	 * +	 * @param voice_speaker_id LLUUID of Avatar List item whose timer should be removed from the map. +	 */ +	void removeVoiceRemoveTimer(const LLUUID& voice_speaker_id); +  private:  	speaker_state_map_t mSpeakerStateMap;  	LLSpeakerMgr* mSpeakerManager; @@ -141,10 +199,45 @@ private:  	LLOutputMonitorCtrl* mSpeakingIndicator;  	bool mIsModeratorMutedVoice; +	/** +	 * Flag indicated that participants voice states should be initialized. +	 * +	 * It is used due to Avatar List has delayed refreshing after it content is changed. +	 * Real initializing is performed when Avatar List is first time refreshed. +	 * +	 * @see onAvatarListRefreshed() +	 * @see initParticipantsVoiceState() +	 */  	bool mInitParticipantsVoiceState;  	boost::signals2::connection mAvatarListRefreshConnection; +	/** +	 * class LLAvatarListItemRemoveTimer +	 *  +	 * Implements a timer that removes avatar list item of a participant +	 * who has left the call. +	 */ +	class LLAvatarListItemRemoveTimer : public LLEventTimer +	{ +	public: +		typedef boost::function<void(const LLUUID&)> callback_t; + +		LLAvatarListItemRemoveTimer(callback_t remove_cb, F32 period, const LLUUID& speaker_id); +		virtual ~LLAvatarListItemRemoveTimer() {}; + +		virtual BOOL tick(); + +	private: +		callback_t		mRemoveCallback; +		LLUUID			mSpeakerId; +	}; + +	typedef std::pair<LLUUID, LLAvatarListItemRemoveTimer*> timer_pair; +	typedef std::map<LLUUID, LLAvatarListItemRemoveTimer*> timers_map; + +	timers_map		mVoiceLeftTimersMap; +	S32				mVoiceLeftRemoveDelay;  }; diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 7a83299dac..b1ddddc4b1 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -44,6 +44,8 @@  #include "llfloaterreg.h"  #include "llmutelist.h"  #include "llstylemap.h" +#include "lllayoutstack.h" +#include "llagent.h"  #include "llsidetray.h"//for blocked objects panel @@ -346,18 +348,23 @@ protected:  LLChatHistory::LLChatHistory(const LLChatHistory::Params& p) -: LLTextEditor(p), -mMessageHeaderFilename(p.message_header), -mMessageSeparatorFilename(p.message_separator), -mLeftTextPad(p.left_text_pad), -mRightTextPad(p.right_text_pad), -mLeftWidgetPad(p.left_widget_pad), -mRightWidgetPad(p.right_widget_pad), -mTopSeparatorPad(p.top_separator_pad), -mBottomSeparatorPad(p.bottom_separator_pad), -mTopHeaderPad(p.top_header_pad), -mBottomHeaderPad(p.bottom_header_pad) +:	LLUICtrl(p), +	mMessageHeaderFilename(p.message_header), +	mMessageSeparatorFilename(p.message_separator), +	mLeftTextPad(p.left_text_pad), +	mRightTextPad(p.right_text_pad), +	mLeftWidgetPad(p.left_widget_pad), +	mRightWidgetPad(p.right_widget_pad), +	mTopSeparatorPad(p.top_separator_pad), +	mBottomSeparatorPad(p.bottom_separator_pad), +	mTopHeaderPad(p.top_header_pad), +	mBottomHeaderPad(p.bottom_header_pad)  { +	LLTextEditor::Params editor_params(p); +	editor_params.rect = getLocalRect(); +	editor_params.follows.flags = FOLLOWS_ALL; +	editor_params.enabled = false; // read only +	mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this);  }  LLChatHistory::~LLChatHistory() @@ -365,6 +372,49 @@ LLChatHistory::~LLChatHistory()  	this->clear();  } +void LLChatHistory::initFromParams(const LLChatHistory::Params& p) +{ +	static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0); + +	LLRect stack_rect = getLocalRect(); +	stack_rect.mRight -= scrollbar_size; +	LLLayoutStack::Params layout_p; +	layout_p.rect = stack_rect; +	layout_p.follows.flags = FOLLOWS_ALL; +	layout_p.orientation = "vertical"; +	layout_p.mouse_opaque = false; +	 +	LLLayoutStack* stackp = LLUICtrlFactory::create<LLLayoutStack>(layout_p, this); +	 +	const S32 NEW_TEXT_NOTICE_HEIGHT = 20; +	 +	LLPanel::Params panel_p; +	panel_p.name = "spacer"; +	panel_p.background_visible = false; +	panel_p.has_border = false; +	panel_p.mouse_opaque = false; +	stackp->addPanel(LLUICtrlFactory::create<LLPanel>(panel_p), 0, 30, true, false, LLLayoutStack::ANIMATE); + +	panel_p.name = "new_text_notice_holder"; +	LLRect new_text_notice_rect = getLocalRect(); +	new_text_notice_rect.mTop = new_text_notice_rect.mBottom + NEW_TEXT_NOTICE_HEIGHT; +	panel_p.rect = new_text_notice_rect; +	panel_p.background_opaque = true; +	panel_p.background_visible = true; +	panel_p.visible = false; +	mMoreChatPanel = LLUICtrlFactory::create<LLPanel>(panel_p); +	 +	LLTextBox::Params text_p(p.more_chat_text); +	text_p.rect = mMoreChatPanel->getLocalRect(); +	text_p.follows.flags = FOLLOWS_ALL; +	text_p.name = "more_chat_text"; +	mMoreChatText = LLUICtrlFactory::create<LLTextBox>(text_p, mMoreChatPanel); +	mMoreChatText->setClickedCallback(boost::bind(&LLChatHistory::onClickMoreText, this)); + +	stackp->addPanel(mMoreChatPanel, 0, 0, false, false, LLLayoutStack::ANIMATE); +} + +  /*void LLChatHistory::updateTextRect()  {  	static LLUICachedControl<S32> texteditor_border ("UITextEditorBorder", 0); @@ -393,15 +443,49 @@ LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style  	return header;  } +void LLChatHistory::onClickMoreText() +{ +	mEditor->endOfDoc(); +} +  void LLChatHistory::clear()  {  	mLastFromName.clear(); -	LLTextEditor::clear(); +	mEditor->clear();  	mLastFromID = LLUUID::null;  }  void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_chat_history, const LLStyle::Params& input_append_params)  { +	if (!mEditor->scrolledToEnd() && chat.mFromID != gAgent.getID() && !chat.mFromName.empty()) +	{ +		mUnreadChatSources.insert(chat.mFromName); +		mMoreChatPanel->setVisible(TRUE); +		std::string chatters; +		for (unread_chat_source_t::iterator it = mUnreadChatSources.begin(); +			it != mUnreadChatSources.end();) +		{ +			chatters += *it; +			if (++it != mUnreadChatSources.end()) +			{ +				chatters += ","; +			} +		} +		LLStringUtil::format_map_t args; +		args["SOURCES"] = chatters; + +		if (mUnreadChatSources.size() == 1) +		{ +			mMoreChatText->setValue(LLTrans::getString("unread_chat_single", args)); +		} +		else +		{ +			mMoreChatText->setValue(LLTrans::getString("unread_chat_multiple", args)); +		} +		S32 height = mMoreChatText->getTextPixelHeight() + 5; +		mMoreChatPanel->reshape(mMoreChatPanel->getRect().getWidth(), height); +	} +  	LLColor4 txt_color = LLUIColorTable::instance().getColor("White");  	LLViewerChat::getChatColor(chat,txt_color);  	LLFontGL* fontp = LLViewerChat::getChatFont();	 @@ -416,7 +500,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_  	if (use_plain_text_chat_history)  	{ -		appendText("[" + chat.mTimeStr + "] ", getText().size() != 0, style_params); +		mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getText().size() != 0, style_params);  		if (utf8str_trim(chat.mFromName).size() != 0)  		{ @@ -426,11 +510,11 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_  				LLStyle::Params link_params(style_params);  				link_params.fillFrom(LLStyleMap::instance().lookupAgent(chat.mFromID));  				// Convert the name to a hotlink and add to message. -				appendText(chat.mFromName + ": ", false, link_params); +				mEditor->appendText(chat.mFromName + ": ", false, link_params);  			}  			else  			{ -				appendText(chat.mFromName + ": ", false, style_params); +				mEditor->appendText(chat.mFromName + ": ", false, style_params);  			}  		}  	} @@ -457,7 +541,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_  		else  		{  			view = getHeader(chat, style_params); -			if (getText().size() == 0) +			if (mEditor->getText().size() == 0)  				p.top_pad = 0;  			else  				p.top_pad = mTopHeaderPad; @@ -467,9 +551,9 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_  		p.view = view;  		//Prepare the rect for the view -		LLRect target_rect = getDocumentView()->getRect(); +		LLRect target_rect = mEditor->getDocumentView()->getRect();  		// squeeze down the widget by subtracting padding off left and right -		target_rect.mLeft += mLeftWidgetPad + mHPad; +		target_rect.mLeft += mLeftWidgetPad + mEditor->getHPad();  		target_rect.mRight -= mRightWidgetPad;  		view->reshape(target_rect.getWidth(), view->getRect().getHeight());  		view->setOrigin(target_rect.mLeft, view->getRect().mBottom); @@ -478,7 +562,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_  		if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)  			header_text += chat.mFromName + ": "; -		appendWidget(p, header_text, false); +		mEditor->appendWidget(p, header_text, false);  		mLastFromName = chat.mFromName;  		mLastFromID = chat.mFromID;  		mLastMessageTime = new_message_time; @@ -490,10 +574,10 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_  		style_params.font.style = "ITALIC";  		if (chat.mFromName.size() > 0) -			appendText(chat.mFromName + " ", TRUE, style_params); +			mEditor->appendText(chat.mFromName + " ", TRUE, style_params);  		// Ensure that message ends with NewLine, to avoid losing of new lines  		// while copy/paste from text chat. See EXT-3263. -		appendText(chat.mText.substr(4) + NEW_LINE, FALSE, style_params); +		mEditor->appendText(chat.mText.substr(4) + NEW_LINE, FALSE, style_params);  	}  	else  	{ @@ -504,8 +588,19 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_  			// while copy/paste from text chat. See EXT-3263.  			message += NEW_LINE;  		} -		appendText(message, FALSE, style_params); +		mEditor->appendText(message, FALSE, style_params);  	} -	blockUndo(); +	mEditor->blockUndo(); +} + +void LLChatHistory::draw() +{ +	if (mEditor->scrolledToEnd()) +	{ +		mUnreadChatSources.clear(); +		mMoreChatPanel->setVisible(FALSE); +	} + +	LLUICtrl::draw();  } diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h index 8ca7dd1d58..260015e2dc 100644 --- a/indra/newview/llchathistory.h +++ b/indra/newview/llchathistory.h @@ -34,10 +34,11 @@  #define LLCHATHISTORY_H_  #include "lltexteditor.h" +#include "lltextbox.h"  #include "llviewerchat.h"  //Chat log widget allowing addition of a message as a widget  -class LLChatHistory : public LLTextEditor +class LLChatHistory : public LLUICtrl  {  	public:  		struct Params : public LLInitParam::Block<Params, LLTextEditor::Params> @@ -63,6 +64,8 @@ class LLChatHistory : public LLTextEditor  			//Header bottom padding  			Optional<S32>			bottom_header_pad; +			Optional<LLTextBox::Params>	more_chat_text; +  			Params()  			:	message_header("message_header"),  				message_separator("message_separator"), @@ -73,15 +76,16 @@ class LLChatHistory : public LLTextEditor  				top_separator_pad("top_separator_pad"),  				bottom_separator_pad("bottom_separator_pad"),  				top_header_pad("top_header_pad"), -				bottom_header_pad("bottom_header_pad") -				{ -				} +				bottom_header_pad("bottom_header_pad"), +				more_chat_text("more_chat_text") +			{}  		};  	protected:  		LLChatHistory(const Params&);  		friend class LLUICtrlFactory; +		/*virtual*/ void draw();  		/**  		 * Redefinition of LLTextEditor::updateTextRect() to considerate text  		 * left/right padding params. @@ -98,9 +102,13 @@ class LLChatHistory : public LLTextEditor  		 */  		LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params); +		void onClickMoreText(); +  	public:  		~LLChatHistory(); +		void initFromParams(const Params&); +  		/**  		 * Appends a widget message.  		 * If last user appended message, concurs with current user, @@ -129,5 +137,11 @@ class LLChatHistory : public LLTextEditor  		S32 mBottomSeparatorPad;  		S32 mTopHeaderPad;  		S32 mBottomHeaderPad; + +		LLPanel*		mMoreChatPanel; +		LLTextBox*		mMoreChatText; +		LLTextEditor*	mEditor; +		typedef std::set<std::string> unread_chat_source_t; +		unread_chat_source_t mUnreadChatSources;  };  #endif /* LLCHATHISTORY_H_ */ diff --git a/indra/newview/llcommanddispatcherlistener.cpp b/indra/newview/llcommanddispatcherlistener.cpp index 00a20de30e..91baeaf989 100644 --- a/indra/newview/llcommanddispatcherlistener.cpp +++ b/indra/newview/llcommanddispatcherlistener.cpp @@ -31,6 +31,11 @@ LLCommandDispatcherListener::LLCommandDispatcherListener(/* LLCommandDispatcher*          "[\"query\"] map of parameters, as if from ?key1=val&key2=val\n"          "[\"trusted\"] boolean indicating trusted browser [default true]",          &LLCommandDispatcherListener::dispatch); +    add("enumerate", +        "Post to [\"reply\"] a map of registered LLCommandHandler instances, containing\n" +        "name key and (e.g.) untrusted flag", +        &LLCommandDispatcherListener::enumerate, +        LLSD().with("reply", LLSD()));  }  void LLCommandDispatcherListener::dispatch(const LLSD& params) const @@ -45,3 +50,11 @@ void LLCommandDispatcherListener::dispatch(const LLSD& params) const      LLCommandDispatcher::dispatch(params["cmd"], params["params"], params["query"], NULL,                                    trusted_browser);  } + +void LLCommandDispatcherListener::enumerate(const LLSD& params) const +{ +    LLReqID reqID(params); +    LLSD response(LLCommandDispatcher::enumerate()); +    reqID.stamp(response); +    LLEventPumps::instance().obtain(params["reply"]).post(response); +} diff --git a/indra/newview/llcommanddispatcherlistener.h b/indra/newview/llcommanddispatcherlistener.h index d0070ddd71..9bcddebcc1 100644 --- a/indra/newview/llcommanddispatcherlistener.h +++ b/indra/newview/llcommanddispatcherlistener.h @@ -23,6 +23,7 @@ public:  private:      void dispatch(const LLSD& params) const; +    void enumerate(const LLSD& params) const;      //LLCommandDispatcher* mDispatcher;  }; diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp index 8c7e7bea83..dc506a1692 100644 --- a/indra/newview/llcommandhandler.cpp +++ b/indra/newview/llcommandhandler.cpp @@ -36,6 +36,7 @@  #include "llcommandhandler.h"  #include "llnotificationsutil.h"  #include "llcommanddispatcherlistener.h" +#include "stringize.h"  // system includes  #include <boost/tokenizer.hpp> @@ -67,6 +68,7 @@ public:  				  bool trusted_browser);  private: +	friend LLSD LLCommandDispatcher::enumerate();  	std::map<std::string, LLCommandHandlerInfo> mMap;  }; @@ -175,3 +177,56 @@ bool LLCommandDispatcher::dispatch(const std::string& cmd,  	return LLCommandHandlerRegistry::instance().dispatch(  		cmd, params, query_map, web, trusted_browser);  } + +static std::string lookup(LLCommandHandler::EUntrustedAccess value); + +LLSD LLCommandDispatcher::enumerate() +{ +	LLSD response; +	LLCommandHandlerRegistry& registry(LLCommandHandlerRegistry::instance()); +	for (std::map<std::string, LLCommandHandlerInfo>::const_iterator chi(registry.mMap.begin()), +																	 chend(registry.mMap.end()); +		 chi != chend; ++chi) +	{ +		LLSD info; +		info["untrusted"] = chi->second.mUntrustedBrowserAccess; +		info["untrusted_str"] = lookup(chi->second.mUntrustedBrowserAccess); +		response[chi->first] = info; +	} +	return response; +} + +/*------------------------------ lookup stuff ------------------------------*/ +struct symbol_info +{ +	const char* name; +	LLCommandHandler::EUntrustedAccess value; +}; + +#define ent(SYMBOL)										\ +	{													\ +		#SYMBOL + 28, /* skip "LLCommandHandler::UNTRUSTED_" prefix */	\ +		SYMBOL											\ +	} + +symbol_info symbols[] = +{ +	ent(LLCommandHandler::UNTRUSTED_ALLOW),		  // allow commands from untrusted browsers +	ent(LLCommandHandler::UNTRUSTED_BLOCK),		  // ignore commands from untrusted browsers +	ent(LLCommandHandler::UNTRUSTED_THROTTLE)	  // allow untrusted, but only a few per min. +}; + +#undef ent + +static std::string lookup(LLCommandHandler::EUntrustedAccess value) +{ +	for (symbol_info *sii(symbols), *siend(symbols + (sizeof(symbols)/sizeof(symbols[0]))); +		 sii != siend; ++sii) +	{ +		if (sii->value == value) +		{ +			return sii->name; +		} +	} +	return STRINGIZE("UNTRUSTED_" << value); +} diff --git a/indra/newview/llcommandhandler.h b/indra/newview/llcommandhandler.h index 1bae6d9414..a1d4c880f5 100644 --- a/indra/newview/llcommandhandler.h +++ b/indra/newview/llcommandhandler.h @@ -34,6 +34,8 @@  #ifndef LLCOMMANDHANDLER_H  #define LLCOMMANDHANDLER_H +#include "llsd.h" +  /* Example:  secondlife:///app/foo/<uuid>     Command "foo" that takes one parameter, a UUID. @@ -103,6 +105,9 @@ public:  		// Execute a command registered via the above mechanism,  		// passing string parameters.  		// Returns true if command was found and executed correctly. +	/// Return an LLSD::Map of registered LLCommandHandlers and associated +	/// info (e.g. EUntrustedAccess). +	static LLSD enumerate();  };  #endif diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 0b27001f10..effa57b1ef 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -98,6 +98,7 @@ LLFastTimerView::LLFastTimerView(const LLRect& rect)  	mHoverBarIndex = -1;  	FTV_NUM_TIMERS = LLFastTimer::NamedTimer::instanceCount();  	mPrintStats = -1;	 +	mAverageCyclesPerTimer = 0;  } @@ -306,8 +307,9 @@ void LLFastTimerView::draw()  	S32 height = (S32) (gViewerWindow->getWindowRectScaled().getHeight()*0.75f);  	S32 width = (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f); -	// HACK: casting away const. Should use setRect or some helper function instead. -		const_cast<LLRect&>(getRect()).setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height); +	LLRect new_rect; +	new_rect.setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height); +	setRect(new_rect);  	S32 left, top, right, bottom;  	S32 x, y, barw, barh, dx, dy; @@ -321,6 +323,10 @@ void LLFastTimerView::draw()  	S32 xleft = margin;  	S32 ytop = margin; +	mAverageCyclesPerTimer = llround(lerp((F32)mAverageCyclesPerTimer, (F32)(LLFastTimer::sTimerCycles / (U64)LLFastTimer::sTimerCalls), 0.1f)); +	LLFastTimer::sTimerCycles = 0; +	LLFastTimer::sTimerCalls = 0; +  	// Draw some help  	{ @@ -328,6 +334,10 @@ void LLFastTimerView::draw()  		y = height - ytop;  		texth = (S32)LLFontGL::getFontMonospace()->getLineHeight(); +#if TIME_FAST_TIMERS +		tdesc = llformat("Cycles per timer call: %d", mAverageCyclesPerTimer); +		LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP); +#else  		char modedesc[][32] = {  			"2 x Average ",  			"Max         ", @@ -342,7 +352,6 @@ void LLFastTimerView::draw()  		tdesc = llformat("Full bar = %s [Click to pause/reset] [SHIFT-Click to toggle]",modedesc[mDisplayMode]);  		LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP); -  		textw = LLFontGL::getFontMonospace()->getWidth(tdesc);  		x = xleft, y -= (texth + 2); @@ -352,6 +361,7 @@ void LLFastTimerView::draw()  		LLFontGL::getFontMonospace()->renderUTF8(std::string("[Right-Click log selected] [ALT-Click toggle counts] [ALT-SHIFT-Click sub hidden]"),  										 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP); +#endif  		y -= (texth + 2);  	} diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h index 2bb023ab14..f5c8f23818 100644 --- a/indra/newview/llfasttimerview.h +++ b/indra/newview/llfasttimerview.h @@ -91,6 +91,7 @@ private:  	S32 mHoverBarIndex;  	LLFrameTimer mHighlightTimer;  	S32 mPrintStats; +	S32 mAverageCyclesPerTimer;  };  #endif diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index ff568a11a9..7e0e8bfaa7 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -760,8 +760,9 @@ void LLFloaterPreference::onClickResetCache()  	{  		gSavedSettings.setString("NewCacheLocation", "");  		gSavedSettings.setString("NewCacheLocationTopFolder", ""); -		LLNotificationsUtil::add("CacheWillBeMoved");  	} +	 +	LLNotificationsUtil::add("CacheWillBeMoved");  	std::string cache_location = gDirUtilp->getCacheDir(true);  	gSavedSettings.setString("CacheLocation", cache_location);  	std::string top_folder(gDirUtilp->getBaseFileName(cache_location)); diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index dbecd45d1f..f53b62e490 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -1379,7 +1379,6 @@ void LLFloaterSnapshot::Impl::onClickDiscard(void* data)  	if (view)  	{ -		view->getParent()->setMouseOpaque(FALSE);  		view->closeFloater();  	}  } @@ -2105,6 +2104,12 @@ void LLFloaterSnapshot::onOpen(const LLSD& key)  	gSnapshotFloaterView->adjustToFitScreen(this, FALSE);  } +void LLFloaterSnapshot::onClose(bool app_quitting) +{ +	getParent()->setMouseOpaque(FALSE); +} + +  //static   void LLFloaterSnapshot::update()  { diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index bd01f6c573..1333497bd2 100644 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -52,6 +52,7 @@ public:  	/*virtual*/ BOOL postBuild();  	/*virtual*/ void draw();  	/*virtual*/ void onOpen(const LLSD& key); +	/*virtual*/ void onClose(bool app_quitting);  	static void update(); diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 8b05f8614d..9cca1b07db 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -751,7 +751,7 @@ void LLFolderView::sanitizeSelection()  		}  		// Don't allow invisible items (such as root folders) to be selected. -		if (item->getDontShowInHierarchy()) +		if (item->getHidden())  		{  			items_to_remove.push_back(item);  		} @@ -774,7 +774,7 @@ void LLFolderView::sanitizeSelection()  				parent_folder;  				parent_folder = parent_folder->getParentFolder())  			{ -				if (parent_folder->potentiallyVisible() && !parent_folder->getDontShowInHierarchy()) +				if (parent_folder->potentiallyVisible() && !parent_folder->getHidden())  				{  					// give initial selection to first ancestor folder that potentially passes the filter  					if (!new_selection) @@ -796,7 +796,7 @@ void LLFolderView::sanitizeSelection()  			// nothing selected to start with, so pick "My Inventory" as best guess  			new_selection = getItemByID(gInventory.getRootFolderID());  			// ... except if it's hidden from the UI. -			if (new_selection && new_selection->getDontShowInHierarchy()) +			if (new_selection && new_selection->getHidden())  			{  				new_selection = NULL;  			} diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index bfd9d6dca7..720c2c7b1a 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -136,7 +136,7 @@ LLFolderViewItem::LLFolderViewItem(LLFolderViewItem::Params p)  	mListener(p.listener),  	mArrowImage(p.folder_arrow_image),  	mBoxImage(p.selection_image), -	mDontShowInHierarchy(false), +	mHidden(false),  	mShowLoadStatus(false)  {  	refresh(); @@ -201,7 +201,7 @@ LLFolderViewItem* LLFolderViewItem::getPreviousOpenNode(BOOL include_children)  	LLFolderViewItem* itemp = mParentFolder->getPreviousFromChild( this, include_children );  	// Skip over items that are invisible or are hidden from the UI. -	while(itemp && (!itemp->getVisible() || itemp->getDontShowInHierarchy())) +	while(itemp && (!itemp->getVisible() || itemp->getHidden()))  	{  		LLFolderViewItem* next_itemp = itemp->mParentFolder->getPreviousFromChild( itemp, include_children );  		if (itemp == next_itemp)  @@ -418,7 +418,7 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)  S32 LLFolderViewItem::getItemHeight()  { -	if (mDontShowInHierarchy) return 0; +	if (mHidden) return 0;  	S32 icon_height = mIcon->getHeight();  	S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight()); @@ -823,7 +823,7 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  void LLFolderViewItem::draw()  { -	if (mDontShowInHierarchy) return; +	if (mHidden) return;  	static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);  	static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE); @@ -970,11 +970,26 @@ void LLFolderViewItem::draw()  		font->renderUTF8( mLabel, 0, text_left, y, color, -				   LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -			S32_MAX, getRect().getWidth() - (S32) text_left, &right_x, TRUE); +						  LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, +						  S32_MAX, getRect().getWidth() - (S32) text_left, &right_x, TRUE); +//		LLViewerInventoryCategory *item = 0; +//		if (getListener()) +//			item = gInventory.getCategory(getListener()->getUUID()); +		bool root_is_loading = false; +		if (getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(),gInventory.getRootFolderID())) +		{ +			// Descendent of my inventory. +			root_is_loading = gInventory.myInventoryFetchInProgress(); +		} +		if (getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(),gInventory.getLibraryRootFolderID())) +		{ +			// Descendent of library +			root_is_loading = gInventory.libraryFetchInProgress(); +		} +			  		if ( (mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime")) -			|| (LLInventoryModel::backgroundFetchActive() && mShowLoadStatus) ) +			|| (LLInventoryModel::backgroundFetchActive() && root_is_loading && mShowLoadStatus) )  		{  			std::string load_string = " ( " + LLTrans::getString("LoadingData") + " ) ";  			font->renderUTF8(load_string, 0, right_x, y, sSearchStatusColor, @@ -1257,7 +1272,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)  			// filter self only on first pass through  			LLFolderViewItem::filter( filter );  		} -		if (mDontShowInHierarchy) +		if (mHidden)  		{  			setOpen();  		} diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index a43096dcb2..21e24c2a4d 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -162,7 +162,7 @@ protected:  	LLUIImagePtr				mBoxImage;  	BOOL                        mIsLoading;  	LLTimer                     mTimeSinceRequestStart; -	bool						mDontShowInHierarchy; +	bool						mHidden;  	bool						mShowLoadStatus;  	// helper function to change the selection from the root. @@ -206,8 +206,11 @@ public:  	// makes sure that this view and it's children are the right size.  	virtual S32 arrange( S32* width, S32* height, S32 filter_generation );  	virtual S32 getItemHeight(); -	void setDontShowInHierarchy(bool dont_show) { mDontShowInHierarchy = dont_show; } -	bool getDontShowInHierarchy() const { return mDontShowInHierarchy; } + +	// Hide the folder from the UI, such as if you want to hide the root +	// folder in an inventory panel. +	void setHidden(bool hidden) { mHidden = hidden; } +	bool getHidden() const { return mHidden; }  	// applies filters to control visibility of inventory items  	virtual void filter( LLInventoryFilter& filter); diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index 22658b4d65..7dd8ea694e 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -138,12 +138,7 @@ void LLGroupActions::startCall(const LLUUID& group_id)  	}  	// start the call -	// *TODO: move this to LLIMMgr? -	LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id); -	if (session && session->mSessionInitialized) -		gIMMgr->startCall(session_id); -	else -		gIMMgr->autoStartCallOnStartup(session_id); +	gIMMgr->autoStartCallOnStartup(session_id);  	make_ui_sound("UISndStartIM");  } diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index acaa6076f8..0ce8d4b7cd 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -45,6 +45,7 @@  #include "llfloaterchat.h"  #include "llfloaterreg.h"  #include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container +#include "lllayoutstack.h"  #include "lllineeditor.h"  #include "lllogchat.h"  #include "llpanelimcontrolpanel.h" @@ -56,6 +57,7 @@  #include "llvoicechannel.h"  #include "lltransientfloatermgr.h"  #include "llinventorymodel.h" +#include "llrootview.h" @@ -220,6 +222,12 @@ LLIMFloater::~LLIMFloater()  //virtual  BOOL LLIMFloater::postBuild()  { +	// User-resizable control panels in P2P sessions look ugly (EXT-3470). +	if (mDialog == IM_NOTHING_SPECIAL || mDialog == IM_SESSION_P2P_INVITE) +	{ +		getChild<LLLayoutStack>("im_panels")->setPanelUserResize("panel_im_control_panel", FALSE); +	} +  	const LLUUID& other_party_id = LLIMModel::getInstance()->getOtherParticipantID(mSessionID);  	if (other_party_id.notNull())  	{ @@ -437,6 +445,16 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)  void LLIMFloater::getAllowedRect(LLRect& rect)  {  	rect = gViewerWindow->getWorldViewRectRaw(); +	static S32 right_padding = 0; +	if (right_padding == 0) +	{ +		LLPanel* side_bar_tabs = +				gViewerWindow->getRootView()->getChild<LLPanel> ( +						"side_bar_tabs"); +		right_padding = side_bar_tabs->getRect().getWidth(); +		LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs); +	} +	rect.mRight -= right_padding;  }  void LLIMFloater::setDocked(bool docked, bool pop_on_undock) diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index a521eb56af..d209060b58 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -439,6 +439,50 @@ LLIMModel::LLIMSession* LLIMModel::findIMSession(const LLUUID& session_id) const  		(LLIMModel::LLIMSession*) NULL);  } +//*TODO consider switching to using std::set instead of std::list for holding LLUUIDs across the whole code +LLIMModel::LLIMSession* LLIMModel::findAdHocIMSession(const std::vector<LLUUID>& ids) +{ +	S32 num = ids.size(); +	if (!num) return NULL; + +	if (mId2SessionMap.empty()) return NULL; + +	std::map<LLUUID, LLIMSession*>::const_iterator it = mId2SessionMap.begin(); +	for (; it != mId2SessionMap.end(); ++it) +	{ +		LLIMSession* session = (*it).second; +	 +		if (!session->isAdHoc()) continue; +		if (session->mInitialTargetIDs.size() != num) continue; + +		std::list<LLUUID> tmp_list(session->mInitialTargetIDs.begin(), session->mInitialTargetIDs.end()); + +		std::vector<LLUUID>::const_iterator iter = ids.begin(); +		while (iter != ids.end()) +		{ +			tmp_list.remove(*iter); +			++iter; +			 +			if (tmp_list.empty())  +			{ +				break; +			} +		} + +		if (tmp_list.empty() && iter == ids.end()) +		{ +			return session; +		} +	} + +	return NULL; +} + +bool LLIMModel::LLIMSession::isAdHoc() +{ +	return IM_SESSION_CONFERENCE_START == mType || (IM_SESSION_INVITE == mType && !gAgent.isInGroup(mSessionID)); +} +  void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id)  {  	LLIMSession* session = findIMSession(old_session_id); @@ -1413,11 +1457,20 @@ void LLCallDialog::getAllowedRect(LLRect& rect)  	rect = gViewerWindow->getWorldViewRectScaled();  } -void LLCallDialog::onOpen(const LLSD& key) +BOOL LLCallDialog::postBuild()  { +	if (!LLDockableFloater::postBuild()) +		return FALSE; +  	// dock the dialog to the Speak Button, where other sys messages appear -	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getChild<LLPanel>("speak_panel"), -		this, getDockTongue(), LLDockControl::TOP, boost::bind(&LLCallDialog::getAllowedRect, this, _1))); +	LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_panel"); + +	setDockControl(new LLDockControl( +		anchor_panel, this, +		getDockTongue(), LLDockControl::TOP, +		boost::bind(&LLCallDialog::getAllowedRect, this, _1))); + +	return TRUE;  }  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1561,7 +1614,7 @@ void LLOutgoingCallDialog::onCancel(void* user_data)  BOOL LLOutgoingCallDialog::postBuild()  { -	BOOL success = LLDockableFloater::postBuild(); +	BOOL success = LLCallDialog::postBuild();  	childSetAction("Cancel", onCancel, this); @@ -1580,7 +1633,7 @@ LLCallDialog(payload)  BOOL LLIncomingCallDialog::postBuild()  { -	LLDockableFloater::postBuild(); +	LLCallDialog::postBuild();  	LLUUID session_id = mPayload["session_id"].asUUID();  	LLSD caller_id = mPayload["caller_id"]; @@ -2107,7 +2160,13 @@ BOOL LLIMMgr::getIMReceived() const  void LLIMMgr::autoStartCallOnStartup(const LLUUID& session_id)  {  	LLIMModel::LLIMSession *session = LLIMModel::getInstance()->findIMSession(session_id); -	if (session) +	if (!session) return; +	 +	if (session->mSessionInitialized) +	{ +		startCall(session_id); +	} +	else  	{  		session->mStartCallOnInitialize = true;  	}	 @@ -2169,12 +2228,22 @@ LLUUID LLIMMgr::addSession(  	bool new_session = !LLIMModel::getInstance()->findIMSession(session_id); +	//works only for outgoing ad-hoc sessions +	if (new_session && IM_SESSION_CONFERENCE_START == dialog && ids.size()) +	{ +		LLIMModel::LLIMSession* ad_hoc_found = LLIMModel::getInstance()->findAdHocIMSession(ids); +		if (ad_hoc_found) +		{ +			new_session = false; +			session_id = ad_hoc_found->mSessionID; +		} +	} +  	if (new_session)  	{  		LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids, voice);  	} -  	//*TODO remove this "floater" thing when Communicate Floater's gone  	LLFloaterIMPanel* floater = findFloaterBySession(session_id);  	if(!floater) diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 09f0c9df71..3f46b0d754 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -74,6 +74,8 @@ public:  		void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction);  		static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata); +		bool isAdHoc(); +  		LLUUID mSessionID;  		std::string mName;  		EInstantMessage mType; @@ -133,6 +135,12 @@ public:  	 */  	LLIMSession* findIMSession(const LLUUID& session_id) const; +	/**  +	 * Find an Ad-Hoc IM Session with specified participants +	 * @return first found Ad-Hoc session or NULL if the session does not exist +	 */ +	LLIMSession* findAdHocIMSession(const std::vector<LLUUID>& ids); +  	/**  	 * Rebind session data to a new session id.  	 */ @@ -476,7 +484,7 @@ public:  	LLCallDialog(const LLSD& payload);  	~LLCallDialog() {} -	virtual void onOpen(const LLSD& key); +	virtual BOOL postBuild();  protected:  	virtual void getAllowedRect(LLRect& rect); diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 0a8108899a..1eb8d1bc2c 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -67,6 +67,7 @@ F32  LLInventoryModel::sMaxTimeBetweenFetches = 10.f;  BOOL LLInventoryModel::sTimelyFetchPending = FALSE;  LLFrameTimer LLInventoryModel::sFetchTimer;  S16 LLInventoryModel::sBulkFetchCount = 0; +BOOL LLInventoryModel::sFirstTimeInViewer2 = TRUE;  // Increment this if the inventory contents change in a non-backwards-compatible way.  // For viewer 2, the addition of link items makes a pre-viewer-2 cache incorrect. @@ -1339,8 +1340,7 @@ bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id)  //Initialize statics.  bool LLInventoryModel::isBulkFetchProcessingComplete()  { -	return ( (sFetchQueue.empty()  -			&& sBulkFetchCount<=0)  ?  TRUE : FALSE ) ; +	return sFetchQueue.empty() && sBulkFetchCount<=0;  }  class LLInventoryModelFetchDescendentsResponder: public LLHTTPClient::Responder @@ -1615,10 +1615,58 @@ void LLInventoryModel::bulkFetch(std::string url)  	}	  } +bool fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id) +{ +	for (std::deque<LLUUID>::iterator it = sFetchQueue.begin(); +		 it != sFetchQueue.end(); ++it) +	{ +		const LLUUID& fetch_id = *it; +		if (gInventory.isObjectDescendentOf(fetch_id, cat_id)) +			return false; +	} +	return true; +} + +/* static */ +bool LLInventoryModel::libraryFetchStarted() +{ +	return sLibraryFetchStarted; +} + +/* static */ +bool LLInventoryModel::libraryFetchCompleted() +{ +	return libraryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getLibraryRootFolderID()); +} + +/* static */ +bool LLInventoryModel::libraryFetchInProgress() +{ +	return libraryFetchStarted() && !libraryFetchCompleted(); +} +	 +/* static */ +bool LLInventoryModel::myInventoryFetchStarted() +{ +	return sMyInventoryFetchStarted; +} + +/* static */ +bool LLInventoryModel::myInventoryFetchCompleted() +{ +	return myInventoryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getRootFolderID()); +} + +/* static */ +bool LLInventoryModel::myInventoryFetchInProgress() +{ +	return myInventoryFetchStarted() && !myInventoryFetchCompleted(); +} +  // static  bool LLInventoryModel::isEverythingFetched()  { -	return (sAllFoldersFetched ? true : false); +	return sAllFoldersFetched;  }  //static @@ -1637,7 +1685,6 @@ void LLInventoryModel::startBackgroundFetch(const LLUUID& cat_id)  			if (!sMyInventoryFetchStarted)  			{  				sMyInventoryFetchStarted = TRUE; -				sFetchQueue.push_back(gInventory.getLibraryRootFolderID());  				sFetchQueue.push_back(gInventory.getRootFolderID());  				gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL);  			} @@ -1645,7 +1692,6 @@ void LLInventoryModel::startBackgroundFetch(const LLUUID& cat_id)  			{  				sLibraryFetchStarted = TRUE;  				sFetchQueue.push_back(gInventory.getLibraryRootFolderID()); -				sFetchQueue.push_back(gInventory.getRootFolderID());  				gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL);  			}  		} @@ -2517,6 +2563,10 @@ void LLInventoryModel::buildParentChildMap()  		llwarns << "Found  " << lost << " lost categories." << llendl;  	} +	const BOOL COF_exists = (findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, FALSE) != LLUUID::null); +	sFirstTimeInViewer2 = !COF_exists || gAgent.isFirstLogin(); + +  	// Now the items. We allocated in the last step, so now all we  	// have to do is iterate over the items and put them in the right  	// place. @@ -3530,6 +3580,19 @@ void LLInventoryModel::setLibraryOwnerID(const LLUUID& val)  	mLibraryOwnerID = val;  } +// static +BOOL LLInventoryModel::getIsFirstTimeInViewer2() +{ +	// Do not call this before parentchild map is built. +	if (!gInventory.mIsAgentInvUsable) +	{ +		llwarns << "Parent Child Map not yet built; guessing as first time in viewer2." << llendl; +		return TRUE; +	} + +	return sFirstTimeInViewer2; +} +  //----------------------------------------------------------------------------  // *NOTE: DEBUG functionality diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index 27bbca493d..39377b4ae2 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -499,9 +499,9 @@ public:  	// *NOTE: DEBUG functionality  	void dumpInventory() const; -	//////////////////////////////////////////////////////////////////////////////// -	// Bulk / Background Fetch +	//////////////////////////////////////////////////////////////////////////////// +	// Bulk fetch  public:  	// Start and stop background breadth-first fetching of inventory contents.  	// This gets triggered when performing a filter-search @@ -516,6 +516,14 @@ public:  	// Add categories to a list to be fetched in bulk.  	static void bulkFetch(std::string url); +	static bool libraryFetchStarted(); +	static bool libraryFetchCompleted(); +	static bool libraryFetchInProgress(); +	 +	static bool myInventoryFetchStarted(); +	static bool myInventoryFetchCompleted(); +	static bool myInventoryFetchInProgress(); +	  private:   	static BOOL sMyInventoryFetchStarted;  	static BOOL sLibraryFetchStarted; @@ -525,6 +533,13 @@ private:  	// completing the fetch once per session should be sufficient  	static BOOL sBackgroundFetchActive;  	static S16 sBulkFetchCount; + +	//////////////////////////////////////////////////////////////////////////////// +	// Login status +public: +	static BOOL getIsFirstTimeInViewer2(); +private: +	static BOOL sFirstTimeInViewer2;  };  // a special inventory model for the agent diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 3c34ba32e2..082b7a9468 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -402,9 +402,12 @@ void LLInventoryPanel::modelChanged(U32 mask)  // static  void LLInventoryPanel::onIdle(void *userdata)  { +	if (!gInventory.isInventoryUsable()) +		return; +  	LLInventoryPanel *self = (LLInventoryPanel*)userdata;  	// Inventory just initialized, do complete build -	if (!self->mViewsInitialized && gInventory.isInventoryUsable()) +	if (!self->mViewsInitialized)  	{  		self->initializeViews();  	} @@ -502,7 +505,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)  				// but still have the parent folder present for listener-related operations.  				if (id == mStartFolderID)  				{ -					folderp->setDontShowInHierarchy(TRUE); +					folderp->setHidden(TRUE);  				}  			}  		} diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 2dc9f255d7..24c72c65ce 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -76,6 +76,7 @@ LLLoginInstance::LLLoginInstance() :  	mDispatcher.add("fail.login", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1));  	mDispatcher.add("connect",    boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1));  	mDispatcher.add("disconnect", boost::bind(&LLLoginInstance::handleDisconnect, this, _1)); +	mDispatcher.add("indeterminate", boost::bind(&LLLoginInstance::handleIndeterminate, this, _1));  }  LLLoginInstance::~LLLoginInstance() @@ -204,6 +205,8 @@ bool LLLoginInstance::handleLoginEvent(const LLSD& event)  		mTransferRate = event["transfer_rate"].asReal();  	} +	 +  	// Call the method registered in constructor, if any, for more specific  	// handling  	LLEventDispatcher::Callable method(mDispatcher.get(event["change"])); @@ -295,6 +298,22 @@ void LLLoginInstance::handleDisconnect(const LLSD& event)      // placeholder  } +void LLLoginInstance::handleIndeterminate(const LLSD& event) +{ +	// The indeterminate response means that the server +	// gave the viewer a new url and params to try. +	// The login module handles the retry, but it gives us the +	// server response so that we may show +	// the user some status. +	LLSD message = event.get("data").get("message"); +	if(message.isDefined()) +	{ +		LLSD progress_update; +		progress_update["desc"] = message; +		LLEventPumps::getInstance()->obtain("LLProgressView").post(progress_update); +	} +} +  bool LLLoginInstance::handleTOSResponse(bool accepted, const std::string& key)  {  	if(accepted) @@ -374,28 +393,6 @@ void LLLoginInstance::updateApp(bool mandatory, const std::string& auth_msg)  		mNotifications->add(notification_name, args, payload,   			boost::bind(&LLLoginInstance::updateDialogCallback, this, _1, _2));  	} - -	/* *NOTE:Mani Experiment with Event API interface. -	if(!mUpdateAppResponse) -	{ -		bool make_unique = true; -		mUpdateAppResponse.reset(new LLEventStream("logininstance_updateapp", make_unique)); -		mUpdateAppResponse->listen("diaupdateDialogCallback",  -								   boost::bind(&LLLoginInstance::updateDialogCallback, -								 			   this, _1 -											   ) -								   ); -	} - -	LLSD event; -	event["op"] = "requestAdd"; -	event["name"] = notification_name; -	event["substitutions"] = args; -	event["payload"] = payload; -	event["reply"] = mUpdateAppResponse->getName(); - -	LLEventPumps::getInstance()->obtain("LLNotifications").post(event); -	*/  }  bool LLLoginInstance::updateDialogCallback(const LLSD& notification, const LLSD& response) diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h index 19d7449bc1..c8704eddb4 100644 --- a/indra/newview/lllogininstance.h +++ b/indra/newview/lllogininstance.h @@ -89,6 +89,7 @@ private:  	void handleLoginFailure(const LLSD& event);  	void handleLoginSuccess(const LLSD& event);  	void handleDisconnect(const LLSD& event); +	void handleIndeterminate(const LLSD& event);  	bool handleTOSResponse(bool v, const std::string& key); @@ -107,7 +108,6 @@ private:  	std::string mSerialNumber;  	int mLastExecEvent;  	UpdaterLauncherCallback mUpdaterLauncher; -	boost::scoped_ptr<LLEventStream> mUpdateAppResponse;  	LLEventDispatcher mDispatcher;  }; diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp index 2bb2a3da6f..b8da368bd7 100755 --- a/indra/newview/llmediadataclient.cpp +++ b/indra/newview/llmediadataclient.cpp @@ -164,7 +164,7 @@ void LLMediaDataClient::enqueue(const Request *request)  		// Sadly, we have to const-cast because items put into the queue are not const  		mSortedQueue.push_back(const_cast<LLMediaDataClient::Request*>(request)); -		LL_DEBUGS("LLMediaDataClient") << "SORTED queue:" << mSortedQueue << LL_ENDL; +		LL_DEBUGS("LLMediaDataClientQueue") << "SORTED queue:" << mSortedQueue << LL_ENDL;  	}  	else {  		if (mRoundRobinQueue.size() > mMaxRoundRobinQueueSize)  @@ -187,7 +187,7 @@ void LLMediaDataClient::enqueue(const Request *request)  			// Sadly, we have to const-cast because items put into the queue are not const  			mRoundRobinQueue.push_front(const_cast<LLMediaDataClient::Request*>(request)); -			LL_DEBUGS("LLMediaDataClient") << "RR queue:" << mRoundRobinQueue << LL_ENDL;			 +			LL_DEBUGS("LLMediaDataClientQueue") << "RR queue:" << mRoundRobinQueue << LL_ENDL;			  		}  		else  		{ @@ -226,16 +226,16 @@ bool LLMediaDataClient::processQueueTimer()  	{  		LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, SORTED queue size is:	  " << mSortedQueue.size()   			<< ", RR queue size is:	  " << mRoundRobinQueue.size() << LL_ENDL; -		LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, SORTED queue is:	  " << mSortedQueue << LL_ENDL; -		LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, RR queue is:	  " << mRoundRobinQueue << LL_ENDL; +		LL_DEBUGS("LLMediaDataClientQueue") << "QueueTimer::tick() started, SORTED queue is:	  " << mSortedQueue << LL_ENDL; +		LL_DEBUGS("LLMediaDataClientQueue") << "QueueTimer::tick() started, RR queue is:	  " << mRoundRobinQueue << LL_ENDL;  	}  	serviceQueue();  	LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, SORTED queue size is:	  " << mSortedQueue.size()   		<< ", RR queue size is:	  " << mRoundRobinQueue.size() << LL_ENDL; -	LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, SORTED queue is:	  " << mSortedQueue << LL_ENDL; -	LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, RR queue is:	  " << mRoundRobinQueue << LL_ENDL; +	LL_DEBUGS("LLMediaDataClientQueue") << "QueueTimer::tick() finished, SORTED queue is:	  " << mSortedQueue << LL_ENDL; +	LL_DEBUGS("LLMediaDataClientQueue") << "QueueTimer::tick() finished, RR queue is:	  " << mRoundRobinQueue << LL_ENDL;  	return isEmpty();  } @@ -649,7 +649,7 @@ void LLMediaDataClient::Responder::error(U32 status, const std::string& reason)  /*virtual*/  void LLMediaDataClient::Responder::result(const LLSD& content)  { -	LL_DEBUGS("LLMediaDataClient") << *mRequest << " result : " << ll_print_sd(content) << LL_ENDL; +	LL_DEBUGS("LLMediaDataClientResponse") << *mRequest << " result : " << ll_print_sd(content) << LL_ENDL;  }  ////////////////////////////////////////////////////////////////////////////////////// @@ -703,7 +703,7 @@ void LLObjectMediaDataClient::Responder::result(const LLSD& content)  	llassert(type == LLMediaDataClient::Request::GET || type == LLMediaDataClient::Request::UPDATE)  	if (type == LLMediaDataClient::Request::GET)  	{ -		LL_DEBUGS("LLMediaDataClient") << *(getRequest()) << " GET returned: " << ll_print_sd(content) << LL_ENDL; +		LL_DEBUGS("LLMediaDataClientResponse") << *(getRequest()) << " GET returned: " << ll_print_sd(content) << LL_ENDL;  		// Look for an error  		if (content.has("error")) diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 6210151d1b..71dc0f9011 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -51,6 +51,8 @@  #include "llsidetray.h"  #include "llslurl.h"  #include "llurlsimstring.h" +#include "llurlregistry.h" +#include "llurldispatcher.h"  #include "llviewerinventory.h"  #include "llviewermenu.h"  #include "llviewerparcelmgr.h" @@ -58,6 +60,7 @@  #include "llappviewer.h"  #include "llviewercontrol.h"  #include "llfloatermediabrowser.h" +#include "llweb.h"  #include "llinventorymodel.h"  #include "lllandmarkactions.h" @@ -543,7 +546,20 @@ void LLNavigationBar::onRegionNameResponse(  	// Invalid location?  	if (!region_handle)  	{ -		invokeSearch(typed_location); +		// handle any secondlife:// SLapps, or +		// display http:// URLs in the media browser, or +		// anything else is sent to the search floater +		if (LLUrlRegistry::instance().isUrl(typed_location)) +		{ +			if (! LLURLDispatcher::dispatchFromTextEditor(typed_location)) +			{ +				LLWeb::loadURL(typed_location); +			} +		} +		else +		{ +			invokeSearch(typed_location); +		}  		return;  	} diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index ffe7f57167..e9131a342e 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -403,6 +403,11 @@ void LLPanelProfileTab::updateButtons()  //////////////////////////////////////////////////////////////////////////  ////////////////////////////////////////////////////////////////////////// +bool enable_god() +{ +	return gAgent.isGodlike(); +} +  LLPanelAvatarProfile::LLPanelAvatarProfile()  : LLPanelProfileTab()  { @@ -423,6 +428,13 @@ BOOL LLPanelAvatarProfile::postBuild()  	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;  	registrar.add("Profile.Pay",  boost::bind(&LLPanelAvatarProfile::pay, this));  	registrar.add("Profile.Share", boost::bind(&LLPanelAvatarProfile::share, this)); +	registrar.add("Profile.Kick", boost::bind(&LLPanelAvatarProfile::kick, this)); +	registrar.add("Profile.Freeze", boost::bind(&LLPanelAvatarProfile::freeze, this)); +	registrar.add("Profile.Unfreeze", boost::bind(&LLPanelAvatarProfile::unfreeze, this)); +	registrar.add("Profile.CSR", boost::bind(&LLPanelAvatarProfile::csr, this)); + +	LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable; +	enable.add("Profile.EnableGod", boost::bind(&enable_god));  	mProfileMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); @@ -622,6 +634,28 @@ void LLPanelAvatarProfile::share()  	LLAvatarActions::share(getAvatarId());  } +void LLPanelAvatarProfile::kick() +{ +	LLAvatarActions::kick(getAvatarId()); +} + +void LLPanelAvatarProfile::freeze() +{ +	LLAvatarActions::freeze(getAvatarId()); +} + +void LLPanelAvatarProfile::unfreeze() +{ +	LLAvatarActions::unfreeze(getAvatarId()); +} + +void LLPanelAvatarProfile::csr() +{ +	std::string name; +	gCacheName->getFullName(getAvatarId(), name); +	LLAvatarActions::csr(getAvatarId(), name); +} +  void LLPanelAvatarProfile::onUrlTextboxClicked(const std::string& url)  {  	LLWeb::loadURL(url); diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h index b19c5cca49..8f07c67fb1 100644 --- a/indra/newview/llpanelavatar.h +++ b/indra/newview/llpanelavatar.h @@ -181,6 +181,15 @@ protected:  	 */  	void share(); +	void kick(); +	void freeze(); +	void unfreeze(); +	void csr(); +	 + +	bool enableGod(); + +  	void onUrlTextboxClicked(const std::string& url);  	void onHomepageTextboxClicked();  	void onAddFriendButtonClick(); diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index a52aa6d30f..751705dd57 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -485,6 +485,18 @@ void LLPanelPicks::onOpen(const LLSD& key)  	LLPanelProfileTab::onOpen(key);  } +void LLPanelPicks::onClosePanel() +{ +	if (mPanelClassifiedInfo) +	{ +		onPanelClassifiedClose(mPanelClassifiedInfo); +	} +	if (mPanelPickInfo) +	{ +		onPanelPickClose(mPanelPickInfo); +	} +} +  void LLPanelPicks::onListCommit(const LLFlatListView* f_list)  {  	// Make sure only one of the lists has selection. diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h index fd8a9e6938..1b2e35ca46 100644 --- a/indra/newview/llpanelpicks.h +++ b/indra/newview/llpanelpicks.h @@ -74,6 +74,8 @@ public:  	/*virtual*/ void onOpen(const LLSD& key); +	/*virtual*/ void onClosePanel(); +  	void processProperties(void* data, EAvatarProcessorType type);  	void updateData(); diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 5941487c7d..7d5944ea2b 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -213,7 +213,6 @@ void LLParticipantList::updateRecentSpeakersOrder()  	if (E_SORT_BY_RECENT_SPEAKERS == getSortOrder())  	{  		// Resort avatar list -		mAvatarList->setDirty(true);  		sort();  	}  } diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index 5f6b210767..7a48f890e0 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -72,10 +72,12 @@ const S32 ANIMATION_FRAMES = 1; //13;  LLProgressView::LLProgressView(const LLRect &rect)   :	LLPanel(),  	mPercentDone( 0.f ), -	mMouseDownInActiveArea( false ) +	mMouseDownInActiveArea( false ), +	mUpdateEvents("LLProgressView")  {  	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_progress.xml");  	reshape(rect.getWidth(), rect.getHeight()); +	mUpdateEvents.listen("self", boost::bind(&LLProgressView::handleUpdate, this, _1));  }  BOOL LLProgressView::postBuild() @@ -260,3 +262,26 @@ void LLProgressView::onClickMessage(void* data)  		}  	}  } + +bool LLProgressView::handleUpdate(const LLSD& event_data) +{ +	LLSD message = event_data.get("message"); +	LLSD desc = event_data.get("desc"); +	LLSD percent = event_data.get("percent"); + +	if(message.isDefined()) +	{ +		setMessage(message.asString()); +	} + +	if(desc.isDefined()) +	{ +		setText(desc.asString()); +	} +	 +	if(percent.isDefined()) +	{ +		setPercent(percent.asReal()); +	} +	return false; +} diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h index 865646c85d..6853674d88 100644 --- a/indra/newview/llprogressview.h +++ b/indra/newview/llprogressview.h @@ -35,6 +35,7 @@  #include "llpanel.h"  #include "llframetimer.h" +#include "llevents.h"  class LLImageRaw;  class LLButton; @@ -75,7 +76,12 @@ protected:  	LLRect mOutlineRect;  	bool mMouseDownInActiveArea; +	// The LLEventStream mUpdateEvents depends upon this class being a singleton +	// to avoid pump name conflicts.  	static LLProgressView* sInstance; +	LLEventStream mUpdateEvents;  + +	bool handleUpdate(const LLSD& event_data);  };  #endif // LL_LLPROGRESSVIEW_H diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index bd256ec9c2..c18fe8ad7e 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -217,7 +217,10 @@ void LLScreenChannel::addToast(const LLToast::Params& p)  	ToastElem new_toast_elem(p); +	// reset HIDDEN flags for the Overflow Toast  	mOverflowToastHidden = false; +	if(mOverflowToastPanel) +		mOverflowToastPanel->setIsHidden(false);  	new_toast_elem.toast->setOnFadeCallback(boost::bind(&LLScreenChannel::onToastFade, this, _1));  	new_toast_elem.toast->setOnToastDestroyedCallback(boost::bind(&LLScreenChannel::onToastDestroyed, this, _1)); @@ -459,8 +462,6 @@ void LLScreenChannel::showToastsBottom()  	S32		toast_margin = 0;  	std::vector<ToastElem>::reverse_iterator it; -	closeOverflowToastPanel(); -  	for(it = mToastList.rbegin(); it != mToastList.rend(); ++it)  	{  		if(it != mToastList.rbegin()) @@ -513,7 +514,11 @@ void LLScreenChannel::showToastsBottom()  			mHiddenToastsNum++;  		}  		createOverflowToast(bottom, gSavedSettings.getS32("NotificationTipToastLifeTime")); -	}	 +	} +	else +	{ +		closeOverflowToastPanel(); +	}  }  //-------------------------------------------------------------------------- @@ -544,11 +549,14 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)  	LLRect toast_rect;  	LLToast::Params p;  	p.lifetime_secs = timer; -	mOverflowToastPanel = new LLToast(p); + +	if(!mOverflowToastPanel) +		mOverflowToastPanel = new LLToast(p);  	if(!mOverflowToastPanel)  		return; +	mOverflowToastPanel->startFading();  	mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onOverflowToastHide, this));  	LLTextBox* text_box = mOverflowToastPanel->getChild<LLTextBox>("toast_text"); @@ -606,8 +614,8 @@ void LLScreenChannel::closeOverflowToastPanel()  {  	if(mOverflowToastPanel != NULL)  	{ -		mOverflowToastPanel->closeFloater(); -		mOverflowToastPanel = NULL; +		mOverflowToastPanel->setVisible(FALSE); +		mOverflowToastPanel->stopFading();  	}  } diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp index fd39bde118..90214a1bd7 100644 --- a/indra/newview/llspeakbutton.cpp +++ b/indra/newview/llspeakbutton.cpp @@ -61,7 +61,9 @@ void LLSpeakButton::draw()  {  	// gVoiceClient is the authoritative global source of info regarding our open-mic state, we merely reflect that state.  	bool openmic = gVoiceClient->getUserPTTState(); -	mSpeakBtn->setToggleState(openmic); +	bool voiceenabled = gVoiceClient->voiceEnabled(); +	mSpeakBtn->setToggleState(openmic && voiceenabled); +	mOutputMonitor->setIsMuted(!voiceenabled);  	LLUICtrl::draw();  } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 73e7d99815..eb2275bff0 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -1082,6 +1082,17 @@ bool idle_startup()  		credentials["passwd"] = gPassword;  		login->connect(credentials); +		LLStartUp::setStartupState( STATE_LOGIN_CURL_UNSTUCK ); +		return FALSE; +	} + +	if(STATE_LOGIN_CURL_UNSTUCK == LLStartUp::getStartupState()) +	{ +		// If we get here we have gotten past the potential stall +		// in curl, so take "may appear frozen" out of progress bar. JC +		auth_desc = LLTrans::getString("LoginInProgressNoFrozen"); +		set_startup_status(progress, auth_desc, auth_message); +  		LLStartUp::setStartupState( STATE_LOGIN_PROCESS_RESPONSE );  		return FALSE;  	} @@ -1168,16 +1179,6 @@ bool idle_startup()  				show_connect_box = true;  			}  		} -		else -		{ -			// Still waiting for response. -			// *TODO:Mani - Actually check for login progress. -			// If we get here we have gotten past the potential stall -			// in curl, so take "may appear frozen" out of progress bar. JC -			auth_desc = LLTrans::getString("LoginInProgressNoFrozen"); -			set_startup_status(progress, auth_desc, auth_message); -		} -  		return FALSE;  	} @@ -2703,6 +2704,7 @@ std::string LLStartUp::startupStateToString(EStartupState state)  		RTNENUM( STATE_LOGIN_WAIT );  		RTNENUM( STATE_LOGIN_CLEANUP );  		RTNENUM( STATE_LOGIN_AUTH_INIT ); +		RTNENUM( STATE_LOGIN_CURL_UNSTUCK );  		RTNENUM( STATE_LOGIN_PROCESS_RESPONSE );  		RTNENUM( STATE_WORLD_INIT );  		RTNENUM( STATE_MULTIMEDIA_INIT ); diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h index ab11b42e74..92fe9521d3 100644 --- a/indra/newview/llstartup.h +++ b/indra/newview/llstartup.h @@ -55,6 +55,7 @@ typedef enum {  	STATE_LOGIN_WAIT,				// Wait for user input at login screen  	STATE_LOGIN_CLEANUP,			// Get rid of login screen and start login  	STATE_LOGIN_AUTH_INIT,			// Start login to SL servers +	STATE_LOGIN_CURL_UNSTUCK,		// Update progress to remove "SL appears frozen" msg.  	STATE_LOGIN_PROCESS_RESPONSE,	// Check authentication reply  	STATE_WORLD_INIT,				// Start building the world  	STATE_MULTIMEDIA_INIT,			// Init the rest of multimedia library diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 5f7c2f5080..25e5e23e6f 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -1237,6 +1237,7 @@ void LLTextureCtrl::draw()  	// Using the discard level, do not show the string if the texture is almost but not   	// fully loaded.  	if ( mTexturep.notNull() && +		 (!mTexturep->isFullyLoaded()) &&  		 (mShowLoadingPlaceholder == TRUE) &&   		 (mTexturep->getDiscardLevel() != 1) &&  		 (mTexturep->getDiscardLevel() != 0)) diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h index 0b232da62b..fb1d591e32 100644 --- a/indra/newview/lltexturectrl.h +++ b/indra/newview/lltexturectrl.h @@ -45,7 +45,7 @@  class LLButton;  class LLFloaterTexturePicker;  class LLInventoryItem; -class LLViewerTexture; +class LLViewerFetchedTexture;  // used for setting drag & drop callbacks.  typedef boost::function<BOOL (LLUICtrl*, LLInventoryItem*)> drag_n_drop_callback; @@ -189,7 +189,7 @@ private:  	drag_n_drop_callback	 mDropCallback;  	commit_callback_t		 mOnCancelCallback;  	commit_callback_t		 mOnSelectCallback; -	LLPointer<LLViewerTexture> mTexturep; +	LLPointer<LLViewerFetchedTexture> mTexturep;  	LLUIColor				 mBorderColor;  	LLUUID					 mImageItemID;  	LLUUID					 mImageAssetID; diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index e80dafe245..3f489544b4 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -801,7 +801,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  	if (mState == SEND_HTTP_REQ)  	{  		{ -			const S32 HTTP_QUEUE_MAX_SIZE = 32; +			const S32 HTTP_QUEUE_MAX_SIZE = 8;  			// *TODO: Integrate this with llviewerthrottle  			// Note: LLViewerThrottle uses dynamic throttling which makes sense for UDP,  			// but probably not for Textures. @@ -874,12 +874,30 @@ bool LLTextureFetchWorker::doWork(S32 param)  			S32 cur_size = mFormattedImage.notNull() ? mFormattedImage->getDataSize() : 0;  			if (mRequestedSize < 0)  			{ -				const S32 HTTP_MAX_RETRY_COUNT = 3; -				S32 max_attempts = (mGetStatus == HTTP_NOT_FOUND) ? 1 : HTTP_MAX_RETRY_COUNT + 1; - 				llinfos << "HTTP GET failed for: " << mUrl -						<< " Status: " << mGetStatus << " Reason: '" << mGetReason << "'" -						<< " Attempt:" << mHTTPFailCount+1 << "/" << max_attempts << llendl; -				++mHTTPFailCount; +				S32 max_attempts; +				if (mGetStatus == HTTP_NOT_FOUND) +				{ +					mHTTPFailCount = max_attempts = 1; // Don't retry +					llinfos << "Texture missing from server (404): " << mUrl << llendl; +				} +				else if (mGetStatus == HTTP_SERVICE_UNAVAILABLE) +				{ +					// *TODO: Should probably introduce a timer here to delay future HTTP requsts +					// for a short time (~1s) to ease server load? Ideally the server would queue +					// requests instead of returning 503... we already limit the number pending. +					++mHTTPFailCount; +					max_attempts = mHTTPFailCount+1; // Keep retrying +					LL_INFOS_ONCE("Texture") << "Texture server busy (503): " << mUrl << LL_ENDL; +				} +				else +				{ +					const S32 HTTP_MAX_RETRY_COUNT = 3; +					max_attempts = HTTP_MAX_RETRY_COUNT + 1; +					++mHTTPFailCount; +					llinfos << "HTTP GET failed for: " << mUrl +							<< " Status: " << mGetStatus << " Reason: '" << mGetReason << "'" +							<< " Attempt:" << mHTTPFailCount+1 << "/" << max_attempts << llendl; +				}  				if (mHTTPFailCount >= max_attempts)  				{  					if (cur_size > 0) diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 74fbce890d..b1d09eccba 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -731,14 +731,13 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)  				// *HACK: We may select this object, so pretend it was clicked  				mPick = mHoverPick;  				LLInspector::Params p; +				p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());  				p.message(avatar_name);  				p.image(LLUI::getUIImage("Info"));  				p.click_callback(boost::bind(showAvatarInspector, hover_object->getID()));  				p.visible_time_near(6.f);  				p.visible_time_far(3.f);  				p.wrap(false); - -				p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());  				LLToolTipMgr::instance().show(p);  			} @@ -822,6 +821,7 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)  					// We may select this object, so pretend it was clicked  					mPick = mHoverPick;  					LLInspector::Params p; +					p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());  					p.message(tooltip_msg);  					p.image(LLUI::getUIImage("Info_Off"));  					p.click_callback(boost::bind(showObjectInspector, hover_object->getID(), mHoverPick.mObjectFace)); @@ -833,8 +833,6 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)  					p.visible_time_near(6.f);  					p.visible_time_far(3.f);  					p.wrap(false); - -					p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());  					LLToolTipMgr::instance().show(p);  				} diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index f98aa361e0..70bfc67523 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -134,9 +134,21 @@ public:  	virtual F64 getMediaInterest() const   		{  -			F64 tmp = mObject->getTotalMediaInterest();   -			return (tmp < 0.0) ? mObject->getPixelArea() : tmp;  +			F64 interest = mObject->getTotalMediaInterest(); +			if (interest < (F64)0.0) +			{ +				// media interest not valid yet, try pixel area +				interest = mObject->getPixelArea(); +				// HACK: force recalculation of pixel area if interest is the "magic default" of 1024. +				if (interest == 1024.f) +				{ +					const_cast<LLVOVolume*>(static_cast<LLVOVolume*>(mObject))->setPixelAreaAndAngle(gAgent); +					interest = mObject->getPixelArea(); +				} +			} +			return interest;   		} +	  	virtual bool isInterestingEnough() const  		{  			return LLViewerMedia::isInterestingEnough(mObject, getMediaInterest()); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 73b5222ee3..4f4fc83819 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -6352,7 +6352,8 @@ void LLPipeline::renderDeferredLighting()  			mDeferredLight[0].flush(); -			if (gSavedSettings.getBOOL("RenderDeferredBlurLight")) +			if (gSavedSettings.getBOOL("RenderDeferredBlurLight") && +			    gSavedSettings.getBOOL("RenderDeferredGI"))  			{  				LLFastTimer ftm(FTM_EDGE_DETECTION);  				//get edge map diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 88e77f11ee..706245a479 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -71,10 +71,14 @@  	<color  	 name="Transparent"  	 value="0 0 0 0" /> +  <!-- Make potentially unused colors show up bright purple. +  Leave this here until all Unused? are removed below, otherwise +  the viewer generates many warnings on startup. --> +  <color +	 name="Unused?" +	 value="1 0 1 1" /> - - -	<!-- UI Definitions --> +  <!-- UI Definitions -->  	<color       name="AgentChatColor" diff --git a/indra/newview/skins/default/textures/icons/SL_Logo.png b/indra/newview/skins/default/textures/icons/SL_Logo.png Binary files differnew file mode 100644 index 0000000000..c9fbde987a --- /dev/null +++ b/indra/newview/skins/default/textures/icons/SL_Logo.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 412f8b6d68..8a9126208a 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -234,6 +234,7 @@ with the same filename but different name    <texture name="Inv_Gloves" file_name="icons/Inv_Gloves.png" preload="false" />    <texture name="Inv_Hair" file_name="icons/Inv_Hair.png" preload="false" />    <texture name="Inv_LinkItem" file_name="icons/Inv_LinkItem.png" preload="false" /> +  <texture name="Inv_LinkItem_Broken" file_name="icons/Inv_LinkItem_Broken.png" preload="false" />    <texture name="Inv_LinkFolder" file_name="icons/Inv_LinkFolder.png" preload="false" />    <texture name="Inv_Jacket" file_name="icons/Inv_Jacket.png" preload="false" />    <texture name="Inv_LookFolderOpen" file_name="icons/Inv_LookFolderOpen.png" preload="false" /> @@ -487,7 +488,8 @@ with the same filename but different name    <texture name="SliderThumb_Off" file_name="widgets/SliderThumb_Off.png" />    <texture name="SliderThumb_Disabled" file_name="widgets/SliderThumb_Disabled.png" />    <texture name="SliderThumb_Press" file_name="widgets/SliderThumb_Press.png" /> -  <texture name="SL_Logo" file_name="map_infohub.tga" /> + +  <texture name="SL_Logo" file_name="icons/SL_Logo.png" preload="true" />    <texture name="Snapshot_Off" file_name="bottomtray/Snapshot_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />    <texture name="Snapshot_Over" file_name="bottomtray/Snapshot_Over.png" preload="false" /> @@ -495,12 +497,12 @@ with the same filename but different name    <texture name="startup_logo"  file_name="windows/startup_logo.png" preload="true" /> -  <texture name="Stepper_Down_Disabled" file_name="widgets/Stepper_Down_Disabled.png" preload="true" /> -  <texture name="Stepper_Down_Off" file_name="widgets/Stepper_Down_Off.png" preload="true" /> -  <texture name="Stepper_Down_Press" file_name="widgets/Stepper_Down_Press.png" preload="true" /> -  <texture name="Stepper_Up_Disabled" file_name="widgets/Stepper_Up_Disabled.png" preload="true" /> -  <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="true" /> -  <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="true" /> +  <texture name="Stepper_Down_Disabled" file_name="widgets/Stepper_Down_Disabled.png" preload="false" /> +  <texture name="Stepper_Down_Off" file_name="widgets/Stepper_Down_Off.png" preload="false" /> +  <texture name="Stepper_Down_Press" file_name="widgets/Stepper_Down_Press.png" preload="false" /> +  <texture name="Stepper_Up_Disabled" file_name="widgets/Stepper_Up_Disabled.png" preload="false" /> +  <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="false" /> +  <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="false" />    <texture name="Stop_Off" file_name="icons/Stop_Off.png" preload="false" />    <texture name="Stop_Over" file_name="icons/Stop_Over.png" preload="false" /> diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml index 6956b73371..cb4cbd229a 100644 --- a/indra/newview/skins/default/xui/en/floater_aaa.xml +++ b/indra/newview/skins/default/xui/en/floater_aaa.xml @@ -15,21 +15,21 @@   title="TEST FLOATER"   save_dock_state="true"   save_visibility="true" - single_instance="true" + single_instance="true"    width="320">    <string name="nudge_parabuild">Nudge 1</string>    <string name="test_the_vlt">This string is extracted.</string>    <chat_history     allow_html="true"     bg_readonly_color="ChatHistoryBgColor" -   bg_writeable_color="ChatHistoryBgColor" -   border_visible="false"  +   bg_writeable_color="ChatHistoryBgColor"  +   border_visible="false"     follows="all"     font="SansSerif"  -	    left="1" +	 left="1"     top="20"     layout="topleft" -	    height="260" +	 height="260"     name="chat_history"     parse_highlights="true"     text_color="ChatHistoryTextColor" 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 a581190d18..cc955369e2 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -4,6 +4,7 @@   height="420"   layout="topleft"   name="floaterland" + help_topic="floaterland"   save_rect="true"   title="ABOUT LAND"   width="490"> diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml index fb8893678d..58ba346e50 100644 --- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml @@ -18,6 +18,7 @@   height="300"   layout="topleft"   name="nearby_chat" + help_topic="nearby_chat"   save_rect="true"   title="NEARBY CHAT"   save_dock_state="true" diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 2f26e5d0c1..15655a920e 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -7,6 +7,7 @@   height="460"   layout="topleft"   name="Preferences" + help_topic="preferences"   single_instance="true"   title="PREFERENCES"   width="620"> diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index 9c1a5499db..5a9e2ebe6e 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -4,8 +4,8 @@   can_resize="true"   height="646"   layout="topleft" - min_height="140" - min_width="467" + min_height="646" + min_width="670"   name="floater_search"   help_topic="floater_search"   save_rect="true" diff --git a/indra/newview/skins/default/xui/en/floater_water.xml b/indra/newview/skins/default/xui/en/floater_water.xml index 7f31692ad9..32739ac953 100644 --- a/indra/newview/skins/default/xui/en/floater_water.xml +++ b/indra/newview/skins/default/xui/en/floater_water.xml @@ -4,6 +4,7 @@   height="240"   layout="topleft"   name="Water Floater" + help_topic="water_floater"   save_rect="true"   title="ADVANCED WATER EDITOR"   width="700"> diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml index e632b67d11..169a0ea676 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -296,7 +296,7 @@       layout="topleft"       name="pg_label"       width="60"> -        PG +        General      </text>      <check_box @@ -330,7 +330,7 @@       layout="topleft"       name="mature_label"       width="66"> -        Mature +        Moderate      </text>      <check_box @@ -361,7 +361,7 @@       top_delta="2"       left_pad="3"       layout="topleft" -     name="pg_label" +     name="adult_label"       width="66">          Adult      </text> diff --git a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml index d0128d1c9a..1dc1c610cf 100644 --- a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml +++ b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml @@ -19,4 +19,40 @@          <menu_item_call.on_click           function="Profile.Share" />      </menu_item_call> +  <menu_item_call +   label="Kick" +   layout="topleft" +   name="kick"> +    <menu_item_call.on_click +     function="Profile.Kick" /> +    <menu_item_call.on_visible +     function="Profile.EnableGod" /> +  </menu_item_call> +  <menu_item_call +   label="Freeze" +   layout="topleft" +   name="freeze"> +    <menu_item_call.on_click +     function="Profile.Freeze" /> +    <menu_item_call.on_visible +     function="Profile.EnableGod" /> +  </menu_item_call> +  <menu_item_call +   label="Unfreeze" +   layout="topleft" +   name="unfreeze"> +    <menu_item_call.on_click +     function="Profile.Unfreeze" /> +    <menu_item_call.on_visible +     function="Profile.EnableGod" /> +  </menu_item_call> +  <menu_item_call +   label="CSR" +   layout="topleft" +   name="csr"> +    <menu_item_call.on_click +     function="Profile.CSR" /> +    <menu_item_call.on_visible +     function="Profile.EnableGod" /> +  </menu_item_call>  </toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index b4ce32ea1d..8f1799688b 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2975,14 +2975,6 @@              <menu_item_call.on_click               function="Advanced.SendTestIMs" />            </menu_item_call> -          <menu_item_call -           label="Test Inspectors" -           name="Test Inspectors" -           shortcut="control|shift|I"> -            <menu_item_call.on_click -             function="Floater.Show" -             parameter="test_inspectors" /> -          </menu_item_call>          </menu>          <menu           create_jump_keys="true" diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml index 5c99022f35..d6d8e9562b 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -3,7 +3,7 @@   <panel name="Outfits"   background_visible="true"    follows="all" - height="550" + height="570"   label="Things"   layout="topleft"   min_height="350" diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml index 7f4b4aef82..44248eedd5 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml @@ -2,23 +2,24 @@  <panel  background_visible="true"  follows="all" -height="635" +height="570"  label="Outfits"  layout="topleft" -min_height="460" +min_height="350" +min_width="240"  name="appearance panel"  top="0"  left="0" -   width="333"> +width="333">     <string     name="No Outfit"     value="No Outfit" />     <panel     left="0"     top="0" -   follows="left|top|right" +   follows="all"     layout="topleft" -   width="333" +   width="330"     height="33"     name="panel_currentlook"     > @@ -85,9 +86,9 @@ left="0"     class="panel_outfits_inventory"     filename="panel_outfits_inventory.xml"     name="panel_outfits_inventory" -   height="550" -   min_height="510" -   width="333" +   height="515" +   min_height="410" +   width="320"     top_pad="0"     follows="all"     /> diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index 7b0b4b0bde..790f8afd3a 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -33,10 +33,10 @@       	 height="18"       	 image_name="Lock"  	     layout="topleft" -		 right="-50" +		 right="-15"  	     mouse_opaque="true"  	     name="IconLocked" -	     top="4" +	     top="8"  	     width="18" />      <button       follows="top|right" @@ -60,14 +60,23 @@       use_ellipses="true"       value="Object Profile"       width="275" /> +    	    <text +     follows="top|left" +     height="13" +     layout="topleft" +     left="45" +     name="where" +     text_color="LtGray_50" +     value="(Inventory)" +     width="150" />  	<panel           follows="all" -         height="500" +         height="490"           label=""           layout="topleft"           left="10"           help_topic="" -         top="30" +         top="45"           width="313"     background_visible="true"     bg_alpha_color="DkGray2"> @@ -125,7 +134,7 @@  		     layout="topleft"      		 left="5"  		     name="LabelCreatorTitle" -top_pad="10" +		  top_pad="10"  		     width="78">  	        Creator:      	</text> @@ -135,7 +144,7 @@ top_pad="10"       default_icon_name="Generic_Person"       layout="topleft"       left_pad="0" -		     top_delta="-6" +     top_delta="-6"       mouse_opaque="true"       width="20" />  	    <text @@ -165,28 +174,28 @@ top_pad="10"  			 follows="left|top"  			 height="23"  			 layout="topleft" -    		 left="5" +			   left="5"  			 name="LabelOwnerTitle" -top_pad="5" +			   top_pad="10"  			 width="78">  			    Owner:  	     </text>  	     <avatar_icon -     follows="top|left" -     height="20" -     default_icon_name="Generic_Person" -     layout="topleft" -     left_pad="0" -		     top_delta="-6" -     mouse_opaque="true" -     width="20" /> +			   follows="top|left" +			   height="20" +			   default_icon_name="Generic_Person" +			   layout="topleft" +			   left_pad="0" +			   top_delta="-6" +			   mouse_opaque="true" +			   width="20" />  	     <text  			 type="string" -     follows="left|right" -     font="SansSerifSmall" -     height="15" -     layout="topleft" -     left_pad="5" +			   follows="left|right" +			   font="SansSerifSmall" +			   height="15" +			   layout="topleft" +			   left_pad="5"  			 name="LabelOwnerName"  			 top_delta="6"  			 width="140"> @@ -224,7 +233,7 @@ top_pad="10"  			 top_delta="0"  			 width="222">  			Wed May 24 12:50:46 2006 -	    </text> +      </text>  	 <panel           border="false"           follows="left|top" @@ -350,7 +359,7 @@ top_pad="10"  			 tool_tip="Next owner can give away or resell this object"  			 width="106" />  	    </panel> -	    <check_box +	<check_box  			 height="18"  			 label="For Sale"  			 layout="topleft" @@ -388,144 +397,21 @@ top_pad="10"  			    height="23"  			    max_val="999999999"  			    top_pad="10"/> -	    <!--line_editor -			 border_style="line" -			 border_thickness="1" -			 follows="left|top|right" -			 height="16" -			 layout="topleft" -			 left_pad="5" -			 max_length="25" -			 name="EditPrice" -			 top_delta="0" -			 width="242" /--> -	    <!--text -			 type="string" -			 length="1" -			 follows="left|top" -			 height="10" -			 layout="topleft" -			 left="10" -			 name="BaseMaskDebug" -			 top="155" -			 width="330"> -			B: -	    </text> -	    <text -			 type="string" -			 length="1" -			 follows="left|top" -			 height="10" -			 layout="topleft" -			 left_delta="60" -			 name="OwnerMaskDebug" -			 top_delta="0" -			 width="270"> -			O: -	    </text> -	    <text -			 type="string" -			 length="1" -			 follows="left|top" -			 height="10" -			 layout="topleft" -			 left_delta="60" -			 name="GroupMaskDebug" -			 top_delta="0" -			 width="210"> -			G: -	    </text> -	    <text -			 type="string" -			 length="1" -			 follows="left|top" -			 height="10" -			 layout="topleft" -			 left_delta="60" -			 name="EveryoneMaskDebug" -			 top_delta="0" -			 width="150"> -			E: -	    </text> -	    <text -			 type="string" -			 length="1" -			 follows="left|top" -			 height="10" -			 layout="topleft" -			 left_delta="60" -			 name="NextMaskDebug" -			 top_delta="0" -			 width="90"> -			N: -	    </text--> -			    <!--text -			 type="string" -			 length="1" -			 follows="left|top" -			 height="10" -			 layout="topleft" -			 left="10" -			 name="SaleLabel" -			 top_pad="5" -			 width="330"> -			Mark Item: -	    </text--> -	    <!--radio_group -			 draw_border="false" -			 follows="left|top|right" -			 height="16" -			 layout="topleft" -			 left_delta="78" -			 name="RadioSaleType" -			 top_delta="0" -			 width="252"> -			    <radio_item -			     height="16" -			     label="Original" -			     layout="topleft" -			     left="0" -			     name="radio" -			     top="0" -			     width="70" /> -			    <radio_item -			     height="16" -			     label="Copy" -			     layout="topleft" -			     left_delta="60" -			     name="radio2" -			     top_delta="0" -			     width="70" /> -	    </radio_group--> -	    <!--text -			 type="string" -			 length="1" -			 follows="left|top" -			 height="16" -			 layout="topleft" -			 left="10" -			 name="TextPrice" -			 top_pad="5" -			 width="78"> -			Price: L$ -	    </text--> -	</panel> +   </panel>      <panel -		 height="25" +		 height="30"  		 layout="bottomright"  		 help_topic="button_tab"  		 name="button_panel"  		 left="5" -		 bottom="5" +		 bottom="2"  		 width="313">  	    <button -		     follows="bottom|right" -		     height="25" +		     height="23"  		     label="Cancel"  		     layout="topleft"  		     name="cancel_btn"  		     right="-1" -		     left_pad="10"  		     width="100" /> -	</panel> -</panel> +	    </panel> +	</panel>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml index 5b379b54e3..d26e855e2f 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -6,7 +6,7 @@  	 name="object properties"  	 help_topic="object_properties"  	 save_rect="true" -	 title="Object Properties" +	 title="Object Profile"  	 width="333">  	 <panel.string  	  name="text deed continued"> @@ -57,127 +57,173 @@                  Mixed Sale              </panel.string>      <button -	     follows="top|right" -	     height="25" -	     image_overlay="BackArrow_Off" -	     layout="topleft" -	     name="back_btn" -	     picture_style="true" -	     right="-5" -	     tab_stop="false" -	     top="0" -	     width="25" /> +     follows="top|right" +     height="23" +     image_overlay="BackArrow_Off" +     layout="topleft" +     left="10" +     name="back_btn" +     tab_stop="false" +     top="0" +     width="23" /> +        <text +     follows="top|left|right" +     font="SansSerifHuge" +     height="26" +     layout="topleft" +     left_pad="10" +     name="title" +     text_color="LtGray" +     top="0" +     use_ellipses="true" +     value="Object Profile" +     width="275" /> +	    <text +     follows="top|left" +     height="13" +     layout="topleft" +     left="45" +     name="where" +     text_color="LtGray_50" +     value="(In World)" +     width="150" />  	<panel           follows="all" -         height="500" +         height="490"           label=""           layout="topleft" -         left="5" +         left="10"           help_topic="" -         top="30" -		 border="1" -         width="313"> -            <text -             type="string" -             length="1" -             follows="left|top" -             height="10" -             layout="topleft" -             left="10" +         top="45" +         width="313" +   background_visible="true" +   bg_alpha_color="DkGray2"> +	    	    <text +		     type="string" +		     length="1" +		     follows="left|top" +		     height="10" +		     layout="topleft" +		     left="5"               name="Name:" -             top_pad="5" -             width="90"> -                Name: -            </text> -            <line_editor -             follows="left|top|right" -             height="19" -             layout="topleft" -             left_pad="0" -             max_length="63" +		     top="10" +		     width="78"> +	        Name: +	    </text> +	    <line_editor +		     border_style="line" +		     border_thickness="1" +	    	 follows="left|top|right" +		     height="20" +		     layout="topleft" +	    	 left_delta="78" +		     max_length="63"               name="Object Name" -             select_on_focus="true" -             top_delta="0" -             width="170" /> -            <text -             type="string" -             length="1" -             follows="left|top" -             height="10" -             layout="topleft" -             left="10" +	    	 top_delta="0" +		     width="225" /> +	    <text +	    type="string" +	    length="1" +	    follows="left|top" +	    height="10" +	    layout="topleft" +	    left="5"               name="Description:" -             top_pad="3" -             width="90"> -                Description: -            </text> +	    top_pad="10" +	    width="78"> +	        Description: +	    </text>              <line_editor +	     border_style="line" +    	     border_thickness="1"               follows="left|top|right" -             height="19" +             height="23"               layout="topleft" -             left_pad="0" -             max_length="127"               name="Object Description"               select_on_focus="true" -             top_delta="0" -             width="170" /> -            <text -             type="string" -             left="10" -             length="1" -             follows="left|top" -             height="19" -             layout="topleft" -             name="Creator:" -             width="90"> -                Creator: -            </text> -            <text -             type="string" -             length="1" -             follows="left|top" -             left_pad="0" -             height="19" -             layout="topleft" +    		 left_delta="78" +		     max_length="127" +	    	 top_delta="-5" +	    	 width="225"/> +	    <text +		     type="string" +		     length="1" +		     follows="left|top" +		     height="23" +		     layout="topleft" +    		 left="5" +		 name="CreatorNameLabel" +		  top_pad="10" +		     width="78"> +	        Creator: +    	</text> +	    	<avatar_icon +     follows="top|left" +     height="20" +     default_icon_name="Generic_Person" +     layout="topleft" +     left_pad="0" +      top_delta="-6" +     mouse_opaque="true" +     width="20" /> +	    <text +		     type="string" +     follows="left|right" +     font="SansSerifSmall" +     height="15" +     layout="topleft" +     left_pad="5"               name="Creator Name" -             width="175"> -                Esbee Linden -            </text> -            <text -             type="string" -             length="1" -             left="10" -             follows="left|top" -             height="19" -             layout="topleft" -             name="Owner:" -             width="90"> -                Owner: -            </text> -            <text -             type="string" -             length="1" -             follows="left|top" -             height="19" -             layout="topleft" -             name="Owner Name" -             left_pad="0" -             width="175"> -                Erica Linden -            </text> -           <text -             type="string" -             length="1" -             follows="left|top" -             layout="topleft" -             left="10" -             height="18" -             name="Group:" -             top_pad="4" -             width="75"> -                Group: -            </text> -            <button +		     top_delta="6" +		     width="140"> +	        Erica Linden +	     </text> +	    <text +			 type="string" +			 length="1" +			 follows="left|top" +			 height="23" +			layout="topleft" +			left="5" +			name="Owner:" +			top_pad="10" +			 width="78"> +			    Owner: +	     </text> +	     <avatar_icon +     follows="top|left" +     height="20" +     default_icon_name="Generic_Person" +     layout="topleft" +     left_pad="0" +	    top_delta="-6" +	    mouse_opaque="true" +     width="20" /> +	     <text +			    type="string" +			    follows="left|right" +			    font="SansSerifSmall" +			    height="15" +			    layout="topleft" +			    left_pad="5" +			    name="Owner Name" +			    top_delta="6" +			    width="140"> +			    Erica Linden +	     </text> +	    	    <text +			 type="string" +			 length="1" +			 follows="left|top" +			 height="23" +			 layout="topleft" +			 left="5" +			name="Group_label" +			top_pad="10" +			width="78"> +			    Group: +	     </text> +      		<button  			 follows="top|left"  			 height="10"  			 image_disabled="Activate_Checkmark" @@ -203,43 +249,34 @@               width="150" />              <button               follows="top|left" -             height="20" +             height="23"               label="Deed"               label_selected="Deed"               layout="topleft"               name="button deed"               top_pad="0" -             left="100" +             left="81"               tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer." -             width="80" /> -            <check_box -             height="19" -             follows="left|top" -             label="Share" -             layout="topleft" -             name="checkbox share with group" -             tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions." -             left_pad="3"               width="100" />              <text               type="string"               length="1"               follows="left|top" -             height="16" +             height="9"               layout="topleft" -             top_pad="15" -             left="10" +             top_pad="5" +             left="5"               name="label click action" -             width="90"> +             width="280">                  Click to:              </text>              <combo_box               follows="left|top" -             height="20" +             height="23"               layout="topleft"               name="clickaction"               width="168" -             left_pad="0"> +             left="81">                  <combo_box.item                   label="Touch  (default)"                   name="Touch/grab(default)" @@ -261,26 +298,131 @@                   name="Open"                   value="Open" />              </combo_box> -            <check_box -             height="16" +	 <panel +         border="false" +         follows="left|top" +         layout="topleft" +         mouse_opaque="false" +         background_visible="true" +         bg_alpha_color="DkGray" +         name="perms_inv" +         left="0" +         top_pad="15" +         height="135" +         width="313"> +	  <text +             type="string" +             length="1" +             left="10"               top_pad="15" -             label="For Sale:" +             text_color="EmphasisColor" +	     height="15" +             follows="left|top|right" +             layout="topleft" +             name="perm_modify" +             width="200"> +                You can modify this object +            </text> +	  	    <text +			 type="string" +			 length="1" +			 follows="left|top" +			 height="16" +			 layout="topleft" +			 left="10" +               name="Anyone can:" +			 top_pad="8" +			 width="100"> +			Anyone: +	    </text> +	    <check_box +			 height="18" +			 label="Copy" +			 layout="topleft" +			 left_pad="0" +             name="checkbox allow everyone copy" +			 top_delta="-2" +			 width="90" /> +	    <check_box +             height="18" +             label="Move"               layout="topleft" +             name="checkbox allow everyone move" +			 left_pad="0" +             width="150" /> +	       	<text +			 type="string" +			 length="1" +			 follows="left|top" +			 height="16" +			 layout="topleft" +			 left="10" +			 name="GroupLabel" +			 top_pad="8" +			 width="100"> +			Group: +    	</text> +			    <check_box +			 height="18" +			 label="Share" +			 layout="topleft" +			 left_pad="90" +			 top_delta="-2" +             name="checkbox share with group" +			 tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions." +			 width="150" /> +	    	    <text +			 type="string" +			 length="1" +			 follows="left|top" +			 height="16" +			 layout="topleft" +			 left="10" +			 name="NextOwnerLabel" +			 top_pad="8" +			 width="200" +			 word_wrap="true"> +			Next owner: +	    </text> +	    <check_box +			 height="18" +			 label="Modify" +			 layout="topleft" +			 left="20" +			 top_pad="0" +             name="checkbox next owner can modify" +			 width="90" /> +	    <check_box +			 height="18" +			 label="Copy" +			 layout="topleft" +			 left_pad="0" +             name="checkbox next owner can copy" +			 width="90" /> +	    <check_box +			 height="18" +			 label="Transfer" +			 layout="topleft" +			 left_pad="0" +             name="checkbox next owner can transfer" +			 tool_tip="Next owner can give away or resell this object" +			 width="106" /> +	    </panel> +	    <check_box +			 height="23" +			 label="For Sale" +			 layout="topleft" +			 left="20"               name="checkbox for sale" -             left="10" -             width="90" /> -<!-- NEW SALE TYPE COMBO BOX --> -      <combo_box -            left_pad="0" -            layout="topleft" -            follows="left|top" -            allow_text_entry="false" -            height="20" -            intial_value="2" -            max_chars="20" -            mouse_opaque="true" +			 top_pad="10" +			 width="100" /> +		<combo_box +			 height="23" +			 left_pad="0" +			 layout="topleft" +			 follows="left|top"              name="sale type" -            width="158"> +			 width="170">          <combo_box.item             name="Copy"             label="Copy" @@ -293,14 +435,13 @@             name="Original"             label="Original"             value="1" /> -      </combo_box> -<!-- NEW PRICE SPINNER --> -      <spinner +	    </combo_box> +		<spinner          follows="left|top"          decimal_digits="0"          increment="1" -        top_pad="8" -        left="100" +        top_pad="10" +        left="120"          control_name="Edit Cost"          name="Edit Cost"          label="Price: L$" @@ -310,106 +451,25 @@          height="20"          max_val="999999999" />        <check_box -	   height="15" +	   height="20"  	   width="110" -	   top_pad="3" +	   top_pad="6"  	   label="Show in search"         layout="topleft" -	   left="100" +	   left="120"         name="search_check"         tool_tip="Let people see this object in search results" /> -		<panel -         border="false" -         follows="left|top" -         layout="topleft" -         mouse_opaque="false" -         background_visible="true" -         bg_alpha_color="DkGray" -         name="perms_build" -         left="0" -         top="241" -         height="120" -         width="278"> -            <text -             type="string" -             length="1" -             left="10" -             top_pad="9" -             text_color="EmphasisColor" -             height="16" -             follows="left|top|right" -             layout="topleft" -             name="perm_modify" -             width="250"> -                You can modify this object -            </text> -            <text -               type="string" -               follows="left|top" -               name="Anyone can:" -               width="250" -               left="10"> -                 Anyone: -            </text> -            <check_box -             height="19" -             label="Move" -             layout="topleft" -             name="checkbox allow everyone move" -             left="15" -             width="85" /> -            <check_box -             height="19" -             label="Copy" -             layout="topleft" -             left_pad="0" -             name="checkbox allow everyone copy" -             width="90" /> -            <text -               type="string" -               follows="left|top" -               height="19" -               name="Next owner can:" -               width="250" -               left="10"> -                  Next owner: -            </text> -            <check_box -             follows="left|top|right" -             label="Modify" -             layout="topleft" -             left="15" -             name="checkbox next owner can modify" -             width="85" /> -            <check_box -             follows="left|top|right" -             height="19" -             label="Copy" -             layout="topleft" -             left_pad="0" -             name="checkbox next owner can copy" -             width="90" /> -            <check_box -             follows="left|top|right" -             height="19" -             label="Transfer" -             layout="topleft" -             name="checkbox next owner can transfer" -             left_pad="0" -             top_delta="0" -             tool_tip="Next owner can give away or resell this object" -             width="90" />              <text               type="string"               text_color="EmphasisColor"               length="1" -             top_pad="5" +             top_pad="15"               follows="left|top"               layout="topleft"               left="10"               name="B:"               height="10" -             width="45"> +             width="50">                  B:              </text>              <text @@ -421,7 +481,7 @@               left_pad="0"               name="O:"               height="10" -             width="44"> +             width="50">                  O:              </text>              <text @@ -433,7 +493,7 @@               left_pad="0"               name="G:"               height="10" -             width="43"> +             width="50">                  G:              </text>              <text @@ -445,7 +505,7 @@               layout="topleft"               name="E:"               height="10" -             width="43"> +             width="50">                  E:              </text>              <text @@ -457,7 +517,7 @@               left_pad="0"               name="N:"               height="10" -             width="48"> +             width="50">                  N:              </text>              <text @@ -473,7 +533,6 @@                  F:              </text>  		</panel> - </panel>      <panel  		 height="25"  		 layout="bottomright" @@ -484,30 +543,30 @@  		 width="313">          <button  		     follows="bottom|left" -		     height="25" +		     height="23"  		     label="Open"  		     layout="topleft"  		     left="5"  		     name="open_btn"  		     top="0" -		     width="60" /> +		     width="100" />  	    <button  		     follows="bottom|left" -		     height="25" +		     height="23"  		     label="Pay"  		     layout="topleft"  		     left_pad="5"  		     name="pay_btn"  		     top="0" -		     width="50" /> +		     width="100" />  	    <button  		     follows="bottom|left" -		     height="25" +		     height="23"  		     label="Buy"  		     layout="topleft"  		     left_pad="5"  		     name="buy_btn"  		     top="0" -		     width="60" /> +		     width="100" />  	</panel>  </panel>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 9aae04ba38..32eae9d11d 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2904,13 +2904,13 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  	<string name="joined_call">Joined the voice call</string>    <string name="ringing-im"> -    Joining Voice Chat... +    Joining voice call...    </string>    <string name="connected-im">      Connected, click End Call to hang up    </string>    <string name="hang_up-im"> -    Left Voice Chat +    Left voice call    </string>    <string name="answering-im">      Connecting... @@ -2996,4 +2996,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].    <string name="close_on_no_ability">      You no longer have the ability to be in the chat session.    </string> +  <string name="unread_chat_single"> +    [SOURCES] has said something new +  </string>" +  <string name="unread_chat_multiple"> +    [SOURCES] have said something new +  </string>"  </strings> 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 2be37d222a..8785dff2ae 100644 --- a/indra/newview/skins/default/xui/en/widgets/chat_history.xml +++ b/indra/newview/skins/default/xui/en/widgets/chat_history.xml @@ -11,9 +11,13 @@  	top_header_pad="17"  	bottom_header_pad="10"  	max_length="2147483647" -	enabled="false"  	track_bottom="true"  	name="chat_history"  	type="string"  	word_wrap="true" -  font="SansSerif"/> +  font="SansSerif"> +  <more_chat_text +    mouse_opaque="true"  +    word_wrap="true" +    /> +</chat_history> 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 3368fa88ef..3f5a4b8379 100644 --- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml +++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml @@ -20,12 +20,12 @@ label_pad_left - padding to the left of tab button labels                 tab_top_image_selected="TabTop_Middle_Selected"                 tab_bottom_image_unselected="Toolbar_Middle_Off"                 tab_bottom_image_selected="Toolbar_Middle_Selected" -               tab_left_image_unselected="TabTop_Middle_Off" -               tab_left_image_selected="TabTop_Middle_Selected"/> +               tab_left_image_unselected="SegmentedBtn_Left_Disabled" +               tab_left_image_selected="SegmentedBtn_Left_Off"/>    <last_tab tab_top_image_unselected="TabTop_Right_Off"                 tab_top_image_selected="TabTop_Right_Selected"                 tab_bottom_image_unselected="Toolbar_Right_Off"                 tab_bottom_image_selected="Toolbar_Right_Selected" -               tab_left_image_unselected="TabTop_Middle_Off" -               tab_left_image_selected="TabTop_Middle_Selected"/> +               tab_left_image_unselected="SegmentedBtn_Left_Disabled" +               tab_left_image_selected="SegmentedBtn_Left_Off"/>  </tab_container> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index d2859db296..0db18525d7 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -354,6 +354,14 @@ class WindowsManifest(ViewerManifest):                      self.path("qtiffd4.dll")                      self.end_prefix() +                # For WebKit/Qt plugin runtimes (codec/character encoding plugins) +                if self.prefix(src="codecs", dst="codecs"): +                    self.path("qcncodecsd4.dll") +                    self.path("qjpcodecsd4.dll") +                    self.path("qkrcodecsd4.dll") +                    self.path("qtwcodecsd4.dll") +                    self.end_prefix() +                  self.end_prefix()          else:              if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'release'), @@ -377,6 +385,14 @@ class WindowsManifest(ViewerManifest):                      self.path("qtiff4.dll")                      self.end_prefix() +                # For WebKit/Qt plugin runtimes (codec/character encoding plugins) +                if self.prefix(src="codecs", dst="codecs"): +                    self.path("qcncodecs4.dll") +                    self.path("qjpcodecs4.dll") +                    self.path("qkrcodecs4.dll") +                    self.path("qtwcodecs4.dll") +                    self.end_prefix() +                  self.end_prefix()          self.disable_manifest_check() diff --git a/indra/test_apps/llplugintest/CMakeLists.txt b/indra/test_apps/llplugintest/CMakeLists.txt index 89e2d8582d..b4043b0fd9 100644 --- a/indra/test_apps/llplugintest/CMakeLists.txt +++ b/indra/test_apps/llplugintest/CMakeLists.txt @@ -428,7 +428,23 @@ if(WINDOWS)      ${plugintest_debug_files}      )    set(plugin_test_targets ${plugin_test_targets} ${out_targets}) -   + +  # Debug config runtime files required for the plugin test mule (Qt codec plugins) +  set(plugintest_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug/codecs") +  set(plugintest_debug_files +    qcncodecsd4.dll +    qjpcodecsd4.dll +    qkrcodecsd4.dll +    qtwcodecsd4.dll +    ) +  copy_if_different( +    ${plugintest_debug_src_dir} +    "${CMAKE_CURRENT_BINARY_DIR}/Debug/codecs" +    out_targets +    ${plugintest_debug_files} +    ) +  set(plugin_test_targets ${plugin_test_targets} ${out_targets}) +     # Release & ReleaseDebInfo config runtime files required for the plugin test mule    set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")    set(plugintest_release_files @@ -486,6 +502,30 @@ if(WINDOWS)      ${plugintest_release_files}      )    set(plugin_test_targets ${plugin_test_targets} ${out_targets}) + +  # Release & ReleaseDebInfo config runtime files required for the plugin test mule (Qt codec plugins) +  set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release/codecs") +  set(plugintest_release_files +    qcncodecs4.dll   +    qjpcodecs4.dll   +    qkrcodecs4.dll   +    qtwcodecs4.dll   +    ) +  copy_if_different( +    ${plugintest_release_src_dir} +    "${CMAKE_CURRENT_BINARY_DIR}/Release/codecs" +    out_targets +    ${plugintest_release_files} +    ) +  set(plugin_test_targets ${plugin_test_targets} ${out_targets}) + +  copy_if_different( +    ${plugintest_release_src_dir} +    "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/codecs" +    out_targets +    ${plugintest_release_files} +    ) +  set(plugin_test_targets ${plugin_test_targets} ${out_targets})     add_custom_target(copy_plugintest_libs ALL       DEPENDS  diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp index 018f691672..364088ab31 100644 --- a/indra/viewer_components/login/lllogin.cpp +++ b/indra/viewer_components/login/lllogin.cpp @@ -235,6 +235,8 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential                  break;              } +			sendProgressEvent("offline", "indeterminate", mAuthResponse["responses"]); +              // Here the login service at the current URI is redirecting us              // to some other URI ("indeterminate" -- why not "redirect"?).              // The response should contain another uri to try, with its @@ -276,7 +278,14 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential      // Here we got through all the rewrittenURIs without succeeding. Tell      // caller this didn't work out so well. Of course, the only failure data      // we can reasonably show are from the last of the rewrittenURIs. -    sendProgressEvent("offline", "fail.login", mAuthResponse["responses"]); + +	// *NOTE: The response from LLXMLRPCListener's Poller::poll method returns an +	// llsd with no "responses" node. To make the output from an incomplete login symmetrical  +	// to success, add a data/message and data/reason fields. +	LLSD error_response; +	error_response["reason"] = mAuthResponse["status"]; +	error_response["message"] = mAuthResponse["error"]; +	sendProgressEvent("offline", "fail.login", error_response);  }  void LLLogin::Impl::disconnect()  | 
