diff options
Diffstat (limited to 'indra/newview')
98 files changed, 2340 insertions, 1288 deletions
| diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 9d44f34ea8..4adef84cd3 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -447,6 +447,7 @@ set(viewer_SOURCE_FILES      llviewerassettype.cpp      llvieweraudio.cpp      llviewercamera.cpp +	llviewerchat.cpp      llviewercontrol.cpp      llviewercontrollistener.cpp      llviewerdisplay.cpp @@ -946,6 +947,7 @@ set(viewer_HEADER_FILES      llvieweraudio.h      llviewerbuild.h      llviewercamera.h +	llviewerchat.h      llviewercontrol.h      llviewercontrollistener.h      llviewerdisplay.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index eb4148f92f..8ad52784d3 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3563,7 +3563,7 @@        <key>Type</key>        <string>S32</string>        <key>Value</key> -      <integer>400</integer> +      <integer>305</integer>      </map>      <key>HelpUseLocal</key>      <map> @@ -4917,7 +4917,7 @@        <key>Type</key>        <string>S32</string>        <key>Value</key> -      <integer>350</integer> +      <integer>305</integer>      </map>      <key>NotificationToastLifeTime</key>      <map> diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index 3209654498..f84102e1fb 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -118,7 +118,7 @@ if [ -n "$LL_TCMALLOC" ]; then      fi  fi -export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"`pwd`"/app_settings/mozilla-runtime-linux-i686:"${LD_LIBRARY_PATH}"' +export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"${LD_LIBRARY_PATH}"'  export SL_CMD='$LL_WRAPPER bin/do-not-directly-run-secondlife-bin'  export SL_OPT="`cat etc/gridargs.dat` $@" diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index d2c8558f0b..ca1688ad1f 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3080,10 +3080,6 @@ void LLAgent::updateCamera()  		mOrbitLeftKey > 0.f,	// right  		mOrbitDownKey > 0.f);	// bottom -		camera_floater->mZoom->setToggleState(  -		mOrbitInKey > 0.f,		// top -		mOrbitOutKey > 0.f);	// bottom -  		camera_floater->mTrack->setToggleState(  		mPanLeftKey > 0.f,		// left  		mPanUpKey > 0.f,		// top diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 7df278d887..c670a65bcc 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -311,3 +311,18 @@ void LLAvatarListItem::onNameCache(const std::string& first_name, const std::str  	mAvatarName->setValue(name);  	mAvatarName->setToolTip(name);  } + +void LLAvatarListItem::reshapeAvatarName() +{ +	S32 width_delta = 0; +	width_delta += mShowProfileBtn ? mProfileBtnWidth : 0; +	width_delta += mSpeakingIndicator->getVisible() ? mSpeakingIndicatorWidth : 0; +	width_delta += mAvatarIcon->getVisible() ? mIconWidth : 0; +	width_delta += mShowInfoBtn ? mInfoBtnWidth : 0; +	width_delta += mLastInteractionTime->getVisible() ? mLastInteractionTime->getRect().getWidth() : 0; + +	S32 height = mAvatarName->getRect().getHeight(); +	S32 width  = getRect().getWidth() - width_delta; + +	mAvatarName->reshape(width, height); +} diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index d379797a46..9d48101a44 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -82,6 +82,8 @@ public:  	void setContextMenu(ContextMenu* menu) { mContextMenu = menu; } +	void reshapeAvatarName(); +  private:  	typedef enum e_online_status { diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index ab685b69ad..fd711b72b0 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -52,6 +52,7 @@ LLBottomTray::LLBottomTray(const LLSD&)  	mNearbyChatBar(NULL),  	mToolbarStack(NULL)  ,	mMovementButton(NULL) +,	mResizeState(RS_NORESIZE)  // Add more members  {  	mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL); @@ -261,22 +262,22 @@ void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask)  void LLBottomTray::showGestureButton(BOOL visible)  { -	mGesturePanel->setVisible(visible); +	setTrayButtonVisibleIfPossible(RS_BUTTON_GESTURES, visible);  }  void LLBottomTray::showMoveButton(BOOL visible)  { -	mMovementPanel->setVisible(visible); +	setTrayButtonVisibleIfPossible(RS_BUTTON_MOVEMENT, visible);  }  void LLBottomTray::showCameraButton(BOOL visible)  { -	mCamPanel->setVisible(visible); +	setTrayButtonVisibleIfPossible(RS_BUTTON_CAMERA, visible);  }  void LLBottomTray::showSnapshotButton(BOOL visible)  { -	mSnapshotPanel->setVisible(visible); +	setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible);  }  namespace @@ -367,212 +368,186 @@ void LLBottomTray::verifyChildControlsSizes()  		mNearbyChatBar->setRect(rect);  	}  } -#define __FEATURE_EXT_991 +  void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)  { -	lldebugs << "****************************************" << llendl; +	static S32 debug_calling_number = 0; +	lldebugs << "**************************************** " << ++debug_calling_number << llendl;  	S32 current_width = getRect().getWidth(); +	S32 delta_width = width - current_width;  	lldebugs << "Reshaping: "   		<< ", width: " << width -		<< ", height: " << height -		<< ", called_from_parent: " << called_from_parent  		<< ", cur width: " << current_width -		<< ", cur height: " << getRect().getHeight() +		<< ", delta_width: " << delta_width +		<< ", called_from_parent: " << called_from_parent  		<< llendl;  	if (mNearbyChatBar)			log(mNearbyChatBar, "before");  	if (mChicletPanel)			log(mChicletPanel, "before"); +	// stores width size on which bottom tray is less than width required by its children. EXT-991 +	static S32 extra_shrink_width = 0; +	bool should_be_reshaped = true; +  	if (mChicletPanel && mToolbarStack && mNearbyChatBar)  	{  		mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);   		verifyChildControlsSizes(); - 		updateResizeState(width, current_width); -	} -	LLPanel::reshape(width, height, called_from_parent); +		// bottom tray is narrowed +		if (delta_width < 0) +		{ +			if (extra_shrink_width > 0) +			{ +				// is world rect was extra shrunk and decreasing again only update this value +				// to delta_width negative +				extra_shrink_width -= delta_width; // use "-=" because delta_width is negative +				should_be_reshaped = false; +			} +			else +			{ +				extra_shrink_width = processWidthDecreased(delta_width); + +				// increase new width to extra_shrink_width value to not reshape less than bottom tray minimum +				width += extra_shrink_width; +			} +		} +		// bottom tray is widen +		else +		{ +			if (extra_shrink_width > delta_width) +			{ +				// Less than minimum width is more than increasing (delta_width)  +				// only reduce it value and make no reshape +				extra_shrink_width -= delta_width; +				should_be_reshaped = false; +			} +			else  +			{ +				if (extra_shrink_width > 0) +				{ +					// If we have some extra shrink width let's reduce delta_width & width +					delta_width -= extra_shrink_width; +					width -= extra_shrink_width; +					extra_shrink_width = 0; +				} +				processWidthIncreased(delta_width); +			} +		} +	} +	lldebugs << "There is no enough width to reshape all children: " << extra_shrink_width << llendl; +	if (should_be_reshaped) +	{ +		lldebugs << "Reshape all children with width: " << width << llendl; +		LLPanel::reshape(width, height, called_from_parent); +	}  	if (mNearbyChatBar)			log(mNearbyChatBar, "after");  	if (mChicletPanel)			log(mChicletPanel, "after");  } -void LLBottomTray::updateResizeState(S32 new_width, S32 cur_width) +S32 LLBottomTray::processWidthDecreased(S32 delta_width)  { -	mResizeState = RS_NORESIZE; -	MASK compensative_view_item_mask = RS_CHATBAR_INPUT; -	LLPanel* compansative_view = mNearbyChatBar; - -	S32 delta_width = new_width - cur_width; -//	if (delta_width == 0) return; -	bool shrink = new_width < cur_width; +	bool still_should_be_processed = true;  	const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();  	const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); -	const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth(); -	const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth(); -	const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth(); - -	lldebugs << "chatbar_panel_width: " << chatbar_panel_width -		<< ", chatbar_panel_min_width: " << chatbar_panel_min_width -		<< ", chatbar_panel_max_width: " << chatbar_panel_max_width -		<< ", chiclet_panel_width: " << chiclet_panel_width -		<< ", chiclet_panel_min_width: " << chiclet_panel_min_width -		<< llendl; - -	bool still_should_be_processed = true; -	// bottom tray is narrowed -	if (shrink) +	if (chiclet_panel_width > chiclet_panel_min_width)  	{ -		S32 compensative_delta_width = 0; -		if (chiclet_panel_width > chiclet_panel_min_width) -		{ -			// we have some space to decrease chiclet panel -			S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width; -			mResizeState |= RS_CHICLET_PANEL; +		// we have some space to decrease chiclet panel +		S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width; -			S32 delta_panel = llmin(-delta_width, panel_delta_min); +		S32 delta_panel = llmin(-delta_width, panel_delta_min); -			lldebugs << "delta_width: " << delta_width -				<< ", panel_delta_min: " << panel_delta_min -				<< ", delta_panel: " << delta_panel -				<< llendl; +		lldebugs << "delta_width: " << delta_width +			<< ", panel_delta_min: " << panel_delta_min +			<< ", delta_panel: " << delta_panel +			<< llendl; -			// is chiclet panel width enough to process resizing? -			delta_width += panel_delta_min; +		// is chiclet panel width enough to process resizing? +		delta_width += panel_delta_min; -			still_should_be_processed = delta_width < 0; +		still_should_be_processed = delta_width < 0; -			mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - delta_panel, mChicletPanel->getParent()->getRect().getHeight()); -			log(mChicletPanel, "after processing panel decreasing via chiclet panel"); +		mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - delta_panel, mChicletPanel->getParent()->getRect().getHeight()); +		log(mChicletPanel, "after processing panel decreasing via chiclet panel"); -			lldebugs << "RS_CHICLET_PANEL"  -				<< ", delta_width: " << delta_width -				<< llendl; -		} -		 -		if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width) -		{ -			// we have some space to decrease chatbar panel -			S32 panel_delta_min = chatbar_panel_width - chatbar_panel_min_width; -			mResizeState |= RS_CHATBAR_INPUT; - -			S32 delta_panel = llmin(-delta_width, panel_delta_min); - -			// is chatbar panel width enough to process resizing? -			delta_width += panel_delta_min; -			 +		lldebugs << "RS_CHICLET_PANEL"  +			<< ", delta_width: " << delta_width +			<< llendl; +	} -			still_should_be_processed = delta_width < 0; +	const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth(); +	const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth(); +	if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width) +	{ +		// we have some space to decrease chatbar panel +		S32 panel_delta_min = chatbar_panel_width - chatbar_panel_min_width; -			mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mNearbyChatBar->getRect().getHeight()); +		S32 delta_panel = llmin(-delta_width, panel_delta_min); -			lldebugs << "RS_CHATBAR_INPUT" -				<< ", delta_panel: " << delta_panel -				<< ", delta_width: " << delta_width -				<< llendl; +		// whether chatbar panel width is enough to process resizing? +		delta_width += panel_delta_min; -			log(mChicletPanel, "after nearby was processed"); +		still_should_be_processed = delta_width < 0; -		} -		if (still_should_be_processed) -		{ -			mResizeState |= compensative_view_item_mask; +		mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mNearbyChatBar->getRect().getHeight()); -			if (mSnapshotPanel->getVisible()) -			{ -				mResizeState |= RS_BUTTON_SNAPSHOT; -				delta_width += mSnapshotPanel->getRect().getWidth(); +		log(mChicletPanel, "after processing panel decreasing via nearby chatbar panel"); -				if (delta_width > 0) -				{ -					compensative_delta_width += delta_width; -				} -				lldebugs << "RS_BUTTON_SNAPSHOT"  -					<< ", compensative_delta_width: " << compensative_delta_width -					<< ", delta_width: " << delta_width -					<< llendl; -				showSnapshotButton(false); -			} +		lldebugs << "RS_CHATBAR_INPUT" +			<< ", delta_panel: " << delta_panel +			<< ", delta_width: " << delta_width +			<< llendl; +	} -			if (delta_width < 0 && mCamPanel->getVisible()) -			{ -				mResizeState |= RS_BUTTON_CAMERA; -				delta_width += mCamPanel->getRect().getWidth(); -				if (delta_width > 0) -				{ -					compensative_delta_width += delta_width; -				} -				lldebugs << "RS_BUTTON_CAMERA" -					<< ", compensative_delta_width: " << compensative_delta_width -					<< ", delta_width: " << delta_width -					<< llendl; -				showCameraButton(false); -			} +	S32 extra_shrink_width = 0; +	S32 buttons_freed_width = 0; +	if (still_should_be_processed) +	{ +		processHideButton(RS_BUTTON_SNAPSHOT, &delta_width, &buttons_freed_width); -			if (delta_width < 0 && mMovementPanel->getVisible()) -			{ -				mResizeState |= RS_BUTTON_MOVEMENT; -				delta_width += mMovementPanel->getRect().getWidth(); -				if (delta_width > 0) -				{ -					compensative_delta_width += delta_width; -				} -				lldebugs << "RS_BUTTON_MOVEMENT" -					<< ", compensative_delta_width: " << compensative_delta_width -					<< ", delta_width: " << delta_width -					<< llendl; -				showMoveButton(false); -			} +		if (delta_width < 0) +		{ +			processHideButton(RS_BUTTON_CAMERA, &delta_width, &buttons_freed_width); +		} -			if (delta_width < 0 && mGesturePanel->getVisible()) -			{ -				mResizeState |= RS_BUTTON_GESTURES; -				delta_width += mGesturePanel->getRect().getWidth(); -				if (delta_width > 0) -				{ -					compensative_delta_width += delta_width; -				} -				lldebugs << "RS_BUTTON_GESTURES" -					<< ", compensative_delta_width: " << compensative_delta_width -					<< ", delta_width: " << delta_width -					<< llendl; -				showGestureButton(false); -			} +		if (delta_width < 0) +		{ +			processHideButton(RS_BUTTON_MOVEMENT, &delta_width, &buttons_freed_width); +		} -			if (delta_width < 0) -			{ -				llwarns << "WARNING: there is no enough room for bottom tray, resizing still should be processed" << llendl; -			} +		if (delta_width < 0) +		{ +			processHideButton(RS_BUTTON_GESTURES, &delta_width, &buttons_freed_width); +		} -			if (compensative_delta_width != 0) -			{ -				if (compansative_view)			log(compansative_view, "before applying compensative width: "); -				compansative_view->reshape(compansative_view->getRect().getWidth() + compensative_delta_width, compansative_view->getRect().getHeight() ); -				if (compansative_view)			log(compansative_view, "after applying compensative width: "); -				lldebugs << compensative_delta_width << llendl; +		if (delta_width < 0) +		{ +			extra_shrink_width = -delta_width; +			lldebugs << "There is no enough room for bottom tray, resizing still should be processed: "  +				<< extra_shrink_width << llendl; +		} -			} +		if (buttons_freed_width > 0) +		{ +			log(mNearbyChatBar, "before applying compensative width"); +			mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() + buttons_freed_width, mNearbyChatBar->getRect().getHeight() ); +			log(mNearbyChatBar, "after applying compensative width"); +			lldebugs << buttons_freed_width << llendl;  		}  	} -	// bottom tray is widen -	else -	{ -		processWidthIncreased(delta_width); -	} - -	lldebugs << "New resize state: " << mResizeState << llendl; -} - -void LLBottomTray::processWidthDecreased(S32 delta_width) -{ +	return extra_shrink_width;  }  void LLBottomTray::processWidthIncreased(S32 delta_width)  { +	if (delta_width <= 0) return; +  	const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();  	const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); @@ -627,9 +602,9 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)  			chatbar_shrink_width = chatbar_available_shrink_width;  		} -		log(mNearbyChatBar, "increase width: before applying compensative width: "); +		log(mNearbyChatBar, "increase width: before applying compensative width");  		mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - chatbar_shrink_width, mNearbyChatBar->getRect().getHeight() ); -		if (mNearbyChatBar)			log(mNearbyChatBar, "after applying compensative width: "); +		if (mNearbyChatBar)			log(mNearbyChatBar, "after applying compensative width");  		lldebugs << chatbar_shrink_width << llendl;  		// 3. use width available via decreasing of chiclet panel @@ -651,7 +626,6 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)  	S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth();  	if (delta_width > 0 && chatbar_panel_width_ < chatbar_panel_max_width)  	{ -		mResizeState |= RS_CHATBAR_INPUT;  		S32 delta_panel_max = chatbar_panel_max_width - chatbar_panel_width_;  		S32 delta_panel = llmin(delta_width, delta_panel_max);  		delta_width -= delta_panel_max; @@ -667,7 +641,7 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa  		lldebugs << "There is no object to process for state: " << shown_object_type << llendl;  		return false;  	} -	bool can_be_shown = canButtonBeShown(panel); +	bool can_be_shown = canButtonBeShown(shown_object_type);  	if (can_be_shown)  	{  		//validate if we have enough room to show this button @@ -678,30 +652,70 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa  			*available_width -= required_width;  			*buttons_required_width += required_width; -			switch (shown_object_type) -			{ -			case RS_BUTTON_GESTURES:	showGestureButton(true);				break; -			case RS_BUTTON_MOVEMENT:	showMoveButton(true);					break; -			case RS_BUTTON_CAMERA:		showCameraButton(true);					break; -			case RS_BUTTON_SNAPSHOT:	showSnapshotButton(true);				break; -			default: -				llwarns << "Unexpected type of button to be shown: " << shown_object_type << llendl; -			} +			setTrayButtonVisible(shown_object_type, true);  			lldebugs << "processing object type: " << shown_object_type -				<< ", buttons_required_width: " << buttons_required_width +				<< ", buttons_required_width: " << *buttons_required_width  				<< llendl; +			mResizeState &= ~shown_object_type;  		}  	}  	return can_be_shown;  } -bool LLBottomTray::canButtonBeShown(LLPanel* panel) const +void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width) +{ +	LLPanel* panel = mStateProcessedObjectMap[processed_object_type]; +	if (NULL == panel) +	{ +		lldebugs << "There is no object to process for state: " << processed_object_type << llendl; +		return; +	} + +	if (panel->getVisible()) +	{ +		*required_width += panel->getRect().getWidth(); + +		if (*required_width > 0) +		{ +			*buttons_freed_width += *required_width; +		} + +		setTrayButtonVisible(processed_object_type, false); + +		mResizeState |= processed_object_type; + +		lldebugs << "processing object type: " << processed_object_type +			<< ", buttons_freed_width: " << *buttons_freed_width +			<< llendl; +	} +} + +bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const  { -	bool can_be_shown = !panel->getVisible(); +	bool can_be_shown = mResizeState & processed_object_type;  	if (can_be_shown)  	{ -		// *TODO: mantipov: synchronize with situation when button was hidden via context menu; +		static MASK MOVEMENT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES; +		static MASK CAMERA_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT; +		static MASK SNAPSHOT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT | RS_BUTTON_CAMERA; + +		switch(processed_object_type) +		{ +		case RS_BUTTON_GESTURES: // Gestures should be shown first +			break; +		case RS_BUTTON_MOVEMENT: // Move only if gesture is shown +			can_be_shown = !(MOVEMENT_PREVIOUS_BUTTONS_MASK & mResizeState); +			break; +		case RS_BUTTON_CAMERA: +			can_be_shown = !(CAMERA_PREVIOUS_BUTTONS_MASK & mResizeState); +			break; +		case RS_BUTTON_SNAPSHOT: +			can_be_shown = !(SNAPSHOT_PREVIOUS_BUTTONS_MASK & mResizeState); +			break; +		default: // nothing to do here +			break; +		}  	}  	return can_be_shown;  } @@ -713,4 +727,61 @@ void LLBottomTray::initStateProcessedObjectMap()  	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, mCamPanel));  	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, mSnapshotPanel));  } + +void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible) +{ +	LLPanel* panel = mStateProcessedObjectMap[shown_object_type]; +	if (NULL == panel) +	{ +		lldebugs << "There is no object to show for state: " << shown_object_type << llendl; +		return; +	} + +	panel->setVisible(visible); +} + +void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible) +{ +	bool can_be_set = true; + +	if (visible) +	{ +		LLPanel* panel = mStateProcessedObjectMap[shown_object_type]; +		if (NULL == panel) +		{ +			lldebugs << "There is no object to process for state: " << shown_object_type << llendl; +			return; +		} + +		const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth(); +		const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth(); + +		const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); +		const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); + +		const S32 available_width = (chatbar_panel_width - chatbar_panel_min_width) +			+ (chiclet_panel_width - chiclet_panel_min_width); + +		const S32 required_width = panel->getRect().getWidth(); +		can_be_set = available_width >= required_width; +	} + +	if (can_be_set) +	{ +		setTrayButtonVisible(shown_object_type, visible); + +		// if we hide the button mark it NOT to show while future bottom tray extending +		if (!visible) +		{ +			mResizeState &= ~shown_object_type; +		} +	} +	else +	{ +		// mark this button to show it while future bottom tray extending +		mResizeState |= shown_object_type; +		LLNotifications::instance().add("BottomTrayButtonCanNotBeShown"); +	} +} +  //EOF diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index c88bdeda1c..974289d5e0 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -103,13 +103,40 @@ private:  	void updateResizeState(S32 new_width, S32 cur_width);  	void verifyChildControlsSizes(); -	void processWidthDecreased(S32 delta_width); +	S32 processWidthDecreased(S32 delta_width);  	void processWidthIncreased(S32 delta_width);  	void log(LLView* panel, const std::string& descr);  	bool processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width); -	bool canButtonBeShown(LLPanel* panel) const; +	void processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width); + +	/** +	 * Determines if specified by type object can be shown. It should be hidden by shrink before. +	 * +	 * Processes buttons a such way to show buttons in constant order: +	 *   - Gestures, Move, View, Snapshot +	 */ +	bool canButtonBeShown(EResizeState processed_object_type) const;  	void initStateProcessedObjectMap(); +	/** +	 * Sets passed visibility to object specified by resize type. +	 */ +	void setTrayButtonVisible(EResizeState shown_object_type, bool visible); + +	/** +	 * Sets passed visibility to object specified by resize type if it is possible. +	 * +	 * If it is impossible to show required button due to there is no enough room in bottom tray +	 * it will no be shown. Is called via context menu commands. +	 * In this case Alert Dialog will be shown to notify user about that. +	 * +	 * Method also stores resize state to be processed while future bottom tray extending: +	 *  - if hidden while resizing button should be hidden it will not be shown while extending; +	 *  - if hidden via context menu button should be shown but there is no enough room for now +	 *    it will be shown while extending. +	 */ +	void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible); +  	MASK mResizeState;  	typedef std::map<EResizeState, LLPanel*> state_object_map_t; diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp index 4523267edd..442dc660cd 100644 --- a/indra/newview/llchatbar.cpp +++ b/indra/newview/llchatbar.cpp @@ -210,8 +210,9 @@ void LLChatBar::refreshGestures()  		// collect list of unique gestures  		std::map <std::string, BOOL> unique; -		LLGestureManager::item_map_t::iterator it; -		for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it) +		LLGestureManager::item_map_t::const_iterator it; +		const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures(); +		for (it = active_gestures.begin(); it != active_gestures.end(); ++it)  		{  			LLMultiGesture* gesture = (*it).second;  			if (gesture) diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index d1922cfd6e..028bb7a384 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -53,7 +53,7 @@ std::string formatCurrentTime()  	time_t utc_time;  	utc_time = time_corrected();  	std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:[" -		+LLTrans::getString("TimeMin")+"] "; +		+LLTrans::getString("TimeMin")+"]";  	LLSD substitution; @@ -84,6 +84,10 @@ public:  		if (level == "profile")  		{ +			LLSD params; +			params["object_id"] = getAvatarId(); + +			LLFloaterReg::showInstance("inspect_object", params);  		}  		else if (level == "block")  		{ @@ -131,7 +135,7 @@ public:  		menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_object_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  		mPopupMenuHandleObject = menu->getHandle(); -		setMouseDownCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4)); +		setDoubleClickCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4));  		return LLPanel::postBuild();  	} @@ -167,7 +171,15 @@ public:  	void onHeaderPanelClick(S32 x, S32 y, MASK mask)  	{ -		LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mAvatarID)); +		if (mSourceType == CHAT_SOURCE_OBJECT) +		{ +			LLFloaterReg::showInstance("inspect_object", LLSD().insert("object_id", mAvatarID)); +		} +		else if (mSourceType == CHAT_SOURCE_AGENT) +		{ +			LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mAvatarID)); +		} +		//if chat source is system, you may add "else" here to define behaviour.  	}  	const LLUUID&		getAvatarId () const { return mAvatarID;} @@ -333,16 +345,30 @@ LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style  	return header;  } -void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params) +void LLChatHistory::appendWidgetMessage(const LLChat& chat)  {  	LLView* view = NULL; -	std::string view_text = "\n[" + formatCurrentTime() + "] " + chat.mFromName + ": "; +	std::string view_text = "\n[" + formatCurrentTime() + "] "; +	if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM) +		view_text += chat.mFromName + ": "; +  	LLInlineViewSegment::Params p;  	p.force_newline = true;  	p.left_pad = mLeftWidgetPad;  	p.right_pad = mRightWidgetPad; +	 +	LLColor4 txt_color = LLUIColorTable::instance().getColor("White"); +	LLViewerChat::getChatColor(chat,txt_color); +	LLFontGL* fontp = LLViewerChat::getChatFont(); +	 +	LLStyle::Params style_params; +	style_params.color(txt_color); +	style_params.readonly_color(txt_color); +	style_params.font(fontp); + +	  	if (mLastFromName == chat.mFromName)  	{  		view = getSeparator(); @@ -357,6 +383,7 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& sty  		else  			p.top_pad = mTopHeaderPad;  		p.bottom_pad = mBottomHeaderPad; +		  	}  	p.view = view; diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h index f0944042af..f689a225fe 100644 --- a/indra/newview/llchathistory.h +++ b/indra/newview/llchathistory.h @@ -34,7 +34,7 @@  #define LLCHATHISTORY_H_  #include "lltexteditor.h" -#include "llchat.h" +#include "llviewerchat.h"  //Chat log widget allowing addition of a message as a widget   class LLChatHistory : public LLTextEditor @@ -109,7 +109,7 @@ class LLChatHistory : public LLTextEditor  		 * @param time time of a message.  		 * @param message message itself.  		 */ -		void appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params); +		void appendWidgetMessage(const LLChat& chat);  	private:  		std::string mLastFromName; diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index 63b9fd8e66..d2e3247250 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -120,10 +120,10 @@ std::string LLNearbyChatToastPanel::appendTime() -void	LLNearbyChatToastPanel::addText		(const std::string& message) +void	LLNearbyChatToastPanel::addText	(const std::string& message , const LLStyle::Params& input_params)  {  	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); -	msg_text->addText(message); +	msg_text->addText(message , input_params);  	mMessages.push_back(message);  } @@ -134,9 +134,34 @@ void LLNearbyChatToastPanel::init(LLSD& notification)  	mText = notification["message"].asString();		// UTF-8 line of text  	mFromName = notification["from"].asString();	// agent or object name  	mFromID = notification["from_id"].asUUID();		// agent id or object id +	  	int sType = notification["source"].asInteger();      mSourceType = (EChatSourceType)sType; - +	 +	std::string color_name = notification["text_color"].asString(); +	 +	mTextColor = LLUIColorTable::instance().getColor(color_name); +	mTextColor.mV[VALPHA] =notification["color_alpha"].asReal(); +	 +	S32 font_size = notification["font_size"].asInteger(); +	switch(font_size) +	{ +		case 0: +			mFont = LLFontGL::getFontSansSerifSmall(); +			break; +		default: +		case 1: +			mFont = LLFontGL::getFontSansSerif(); +			break; +		case 2: +			mFont = LLFontGL::getFontSansSerifBig(); +			break; +	} +	 +	LLStyle::Params style_params; +	style_params.color(mTextColor); +	style_params.font(mFont); +	  	std::string str_sender;  	if(gAgentID != mFromID) @@ -144,13 +169,13 @@ void LLNearbyChatToastPanel::init(LLSD& notification)  	else  		str_sender = LLTrans::getString("You");; -	caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender); +	caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender , style_params); -	caption->getChild<LLTextBox>("msg_time", false)->setText(appendTime()); +	caption->getChild<LLTextBox>("msg_time", false)->setText(appendTime() , style_params );  	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); -	msg_text->setText(mText); +	msg_text->setText(mText, style_params);  	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");  	if(mSourceType != CHAT_SOURCE_AGENT) @@ -171,7 +196,15 @@ void	LLNearbyChatToastPanel::setMessage	(const LLChat& chat_msg)  	notification["from_id"] = chat_msg.mFromID;  	notification["time"] = chat_msg.mTime;  	notification["source"] = (S32)chat_msg.mSourceType; - +	 +	std::string r_color_name="White"; +	F32 r_color_alpha = 1.0f;  +	LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha); +	 +	notification["text_color"] = r_color_name; +	notification["color_alpha"] = r_color_alpha; +	 +	notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;  	init(notification);  } @@ -201,11 +234,17 @@ void	LLNearbyChatToastPanel::setWidth(S32 width)  	text_box->reshape(width - msg_left_offset - msg_right_offset,100/*its not magic number, we just need any number*/);  	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); +	 +	LLStyle::Params style_params; +	style_params.color(mTextColor); +	style_params.font(mFont); +	 +	  	if(mText.length()) -		msg_text->setText(mText); +		msg_text->setText(mText, style_params);  	for(size_t i=0;i<mMessages.size();++i) -		msg_text->addText(mMessages[i]); +		msg_text->addText(mMessages[i] , style_params);  	setRect(LLRect(getRect().mLeft, getRect().mTop, getRect().mLeft + width	, getRect().mBottom));  	snapToMessageHeight	(); diff --git a/indra/newview/llchatitemscontainerctrl.h b/indra/newview/llchatitemscontainerctrl.h index 8fb045b6d9..a65bfedd09 100644 --- a/indra/newview/llchatitemscontainerctrl.h +++ b/indra/newview/llchatitemscontainerctrl.h @@ -36,7 +36,7 @@  #include "llpanel.h"  #include "llscrollbar.h"  #include "string" -#include "llchat.h" +#include "llviewerchat.h"  #include "lltoastpanel.h"  typedef enum e_show_item_header @@ -59,7 +59,7 @@ public:  	const LLUUID& getFromID() const { return mFromID;} -	void	addText		(const std::string& message); +	void	addText		(const std::string& message ,  const LLStyle::Params& input_params = LLStyle::Params());  	void	setMessage	(const LLChat& msg);  	void	setWidth		(S32 width);  	void	snapToMessageHeight	(); @@ -89,6 +89,8 @@ private:  	std::string		mFromName;	// agent or object name  	LLUUID			mFromID;	// agent id or object id  	EChatSourceType	mSourceType; +	LLColor4        mTextColor; +	LLFontGL*       mFont;  	std::vector<std::string> mMessages; diff --git a/indra/newview/llchatmsgbox.cpp b/indra/newview/llchatmsgbox.cpp index 12626e3b43..bb0ec2db27 100644 --- a/indra/newview/llchatmsgbox.cpp +++ b/indra/newview/llchatmsgbox.cpp @@ -84,7 +84,7 @@ LLChatMsgBox::LLChatMsgBox(const Params& p) :  	mBlockSpacing(p.block_spacing)  {} -void LLChatMsgBox::addText( const LLStringExplicit& text ) +void LLChatMsgBox::addText( const LLStringExplicit& text , const LLStyle::Params& input_params )  {  	S32 length = getLength();  	// if there is existing text, add a separator @@ -94,5 +94,5 @@ void LLChatMsgBox::addText( const LLStringExplicit& text )  		insertSegment(new ChatSeparator(length - 1, length - 1));  	}  	// prepend newline only if there is some existing text -	appendText(text, length > 0); +	appendText(text, length > 0, input_params);  } diff --git a/indra/newview/llchatmsgbox.h b/indra/newview/llchatmsgbox.h index df29db58c3..9e16616729 100644 --- a/indra/newview/llchatmsgbox.h +++ b/indra/newview/llchatmsgbox.h @@ -61,7 +61,7 @@ protected:  	friend class LLUICtrlFactory;  public: -	void				addText(const LLStringExplicit &text); +	void				addText(const LLStringExplicit &text, const LLStyle::Params& input_params = LLStyle::Params());  private:  	S32					mBlockSpacing; diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index b919195fb2..9e290c8c04 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -54,10 +54,12 @@ static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel");  static LLDefaultChildRegistry::Register<LLNotificationChiclet> t2("chiclet_notification");  static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t3("chiclet_im_p2p");  static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t4("chiclet_im_group"); +static LLDefaultChildRegistry::Register<LLAdHocChiclet> t5("chiclet_im_adhoc");  static const LLRect CHICLET_RECT(0, 25, 25, 0); -static const LLRect CHICLET_ICON_RECT(0, 24, 24, 0); +static const LLRect CHICLET_ICON_RECT(0, 22, 22, 0);  static const LLRect VOICE_INDICATOR_RECT(25, 25, 45, 0); +static const S32	OVERLAY_ICON_SHIFT = 2;	// used for shifting of an overlay icon for new massages in a chiclet  // static  const S32 LLChicletPanel::s_scroll_ratio = 10; @@ -217,13 +219,15 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)  	icon_params.visible = false;  	icon_params.image = LLUI::getUIImage(p.new_messages_icon_name);  	mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(icon_params); +	addChild(mNewMessagesIcon); +  	// adjust size and position of an icon  	LLRect chiclet_rect = p.rect; -	LLRect overlay_icon_rect = LLRect(chiclet_rect.getWidth()/2, chiclet_rect.mTop, chiclet_rect.mRight, chiclet_rect.getHeight()/2);  -	// shift an icon a little bit to the right and up corner of a chiclet -	overlay_icon_rect.translate(overlay_icon_rect.getWidth()/5, overlay_icon_rect.getHeight()/5); +	LLRect overlay_icon_rect = LLRect(chiclet_rect.getWidth()/2, chiclet_rect.getHeight(), chiclet_rect.getWidth(), chiclet_rect.getHeight()/2);   	mNewMessagesIcon->setRect(overlay_icon_rect); -	addChild(mNewMessagesIcon); +	 +	// shift an icon a little bit to the right and up corner of a chiclet +	overlay_icon_rect.translate(OVERLAY_ICON_SHIFT, OVERLAY_ICON_SHIFT);  	setShowCounter(false);  } @@ -423,7 +427,6 @@ void LLIMP2PChiclet::updateMenuItems()  	bool is_friend = LLAvatarActions::isFriend(getOtherParticipantId());  	mPopupMenu->getChild<LLUICtrl>("Add Friend")->setEnabled(!is_friend); -	mPopupMenu->getChild<LLUICtrl>("Remove Friend")->setEnabled(is_friend);  }  BOOL LLIMP2PChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) @@ -602,6 +605,9 @@ BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)  LLIMGroupChiclet::Params::Params()  : group_icon("group_icon") +, unread_notifications("unread_notifications") +, speaker("speaker") +, show_speaker("show_speaker")  {  	rect(CHICLET_RECT); @@ -830,8 +836,17 @@ LLChicletPanel::~LLChicletPanel()  void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){  	LLUUID session_id = data["session_id"].asUUID(); +	LLUUID from_id = data["from_id"].asUUID(); +	const std::string from = data["from"].asString();  	S32 unread = data["num_unread"].asInteger(); +	// if new message came +	if(unread != 0) +	{ +		//we do not show balloon (indicator of new messages) for system messages and our own messages +		if (from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from) return; +	} +  	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);  	if (im_floater && im_floater->getVisible())  	{ @@ -851,7 +866,6 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){  	    	llwarns << "Unable to set counter for chiclet " << session_id << llendl;  	    }  	} -  } @@ -880,19 +894,34 @@ BOOL LLChicletPanel::postBuild()  void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id)  { -	for(chiclet_list_t::iterator it = mChicletList.begin(); it != mChicletList.end(); ++it) +	static LLUUID s_previous_active_voice_session_id; + +	std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(session_id); + +	for(std::list<LLChiclet *>::iterator it = chiclets.begin(); it != chiclets.end(); ++it)  	{  		LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);  		if(chiclet)  		{ -			if(chiclet->getSessionId() == session_id) +			chiclet->setShowSpeaker(true); +		} +	} + +	if(!s_previous_active_voice_session_id.isNull() && s_previous_active_voice_session_id != session_id) +	{ +		chiclets = LLIMChiclet::sFindChicletsSignal(s_previous_active_voice_session_id); + +		for(std::list<LLChiclet *>::iterator it = chiclets.begin(); it != chiclets.end(); ++it) +		{ +			LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it); +			if(chiclet)  			{ -				chiclet->setShowSpeaker(true); -				continue; +				chiclet->setShowSpeaker(false);  			} -			chiclet->setShowSpeaker(false); -		} +		}		  	} + +	s_previous_active_voice_session_id = session_id;  }  S32 LLChicletPanel::calcChickletPanleWidth() diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index 424d635321..6d7da107ac 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -129,12 +129,12 @@ void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL calle  	}  } -void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text) +void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,const LLStyle::Params& input_params)  {  	// LLTextBox::setText will obliterate the expander segment, so make sure  	// we generate it again by clearing mExpanderVisible  	mExpanderVisible = false; -	LLTextBox::setText(text); +	LLTextBox::setText(text, input_params);  	// text contents have changed, segments are cleared out  	// so hide the expander and determine if we need it diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h index 3fe646c29c..7c989cfa50 100644 --- a/indra/newview/llexpandabletextbox.h +++ b/indra/newview/llexpandabletextbox.h @@ -60,7 +60,7 @@ protected:  		// adds or removes "More" link as needed  		/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); -		/*virtual*/ void setText(const LLStringExplicit& text); +		/*virtual*/ void setText(const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params());  		/**  		 * Returns difference between text box height and text height. diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index d1317f7c36..92e958b32d 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -40,10 +40,12 @@  // Viewer includes  #include "lljoystickbutton.h"  #include "llviewercontrol.h" +#include "llviewercamera.h"  #include "llbottomtray.h"  #include "llagent.h"  #include "lltoolmgr.h"  #include "lltoolfocus.h" +#include "llslider.h"  // Constants  const F32 CAMERA_BUTTON_DELAY = 0.0f; @@ -54,6 +56,93 @@ const F32 CAMERA_BUTTON_DELAY = 0.0f;  #define PRESETS "camera_presets"  #define CONTROLS "controls" +// Zoom the camera in and out +class LLPanelCameraZoom +:	public LLPanel +{ +	LOG_CLASS(LLPanelCameraZoom); +public: +	LLPanelCameraZoom(); + +	/* virtual */ BOOL	postBuild(); +	/* virtual */ void	onOpen(const LLSD& key); + +protected: +	void	onZoomPlusHeldDown(); +	void	onZoomMinusHeldDown(); +	void	onSliderValueChanged(); + +private: +	F32			mSavedSliderVal; +	LLButton*	mPlusBtn; +	LLButton*	mMinusBtn; +	LLSlider*	mSlider; +}; + +static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camera_zoom_panel"); + +//------------------------------------------------------------------------------- +// LLPanelCameraZoom +//------------------------------------------------------------------------------- + +LLPanelCameraZoom::LLPanelCameraZoom() +:	mPlusBtn( NULL ), +	mMinusBtn( NULL ), +	mSlider( NULL ), +	mSavedSliderVal(0.f) +{ +	mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this)); +	mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this)); +	mCommitCallbackRegistrar.add("Slider.value_changed", boost::bind(&LLPanelCameraZoom::onSliderValueChanged, this)); +} + +BOOL LLPanelCameraZoom::postBuild() +{ +	mPlusBtn  = getChild <LLButton> ("zoom_plus_btn"); +	mMinusBtn = getChild <LLButton> ("zoom_minus_btn"); +	mSlider   = getChild <LLSlider> ("zoom_slider"); +	mSlider->setMinValue(.0f); +	mSlider->setMaxValue(8.f); +	return LLPanel::postBuild(); +} + +void LLPanelCameraZoom::onOpen(const LLSD& key) +{ +	LLVector3d to_focus = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()) - gAgent.calcFocusPositionTargetGlobal(); +	mSavedSliderVal = 8.f - (F32)to_focus.magVec(); // maximum minus current +	mSlider->setValue( mSavedSliderVal ); +} + +void LLPanelCameraZoom::onZoomPlusHeldDown() +{ +	F32 val = mSlider->getValueF32(); +	F32 inc = mSlider->getIncrement(); +	mSlider->setValue(val - inc); +	// commit only if value changed +	if (val != mSlider->getValueF32()) +		mSlider->onCommit(); +} + +void LLPanelCameraZoom::onZoomMinusHeldDown() +{ +	F32 val = mSlider->getValueF32(); +	F32 inc = mSlider->getIncrement(); +	mSlider->setValue(val + inc); +	// commit only if value changed +	if (val != mSlider->getValueF32()) +		mSlider->onCommit(); +} + +void  LLPanelCameraZoom::onSliderValueChanged() +{ +	F32 val	 = mSlider->getValueF32(); +	F32 rate = val - mSavedSliderVal; + +	gAgent.unlockView(); +	gAgent.cameraOrbitIn(rate); + +	mSavedSliderVal = val; +}  //  // Member functions @@ -125,6 +214,7 @@ void LLFloaterCamera::onOpen(const LLSD& key)  		anchor_panel, this,  		getDockTongue(), LLDockControl::TOP)); +	mZoom->onOpen(key);  }  void LLFloaterCamera::onClose(bool app_quitting) @@ -147,7 +237,7 @@ BOOL LLFloaterCamera::postBuild()  	setIsChrome(TRUE);  	mRotate = getChild<LLJoystickCameraRotate>(ORBIT); -	mZoom = getChild<LLJoystickCameraZoom>(ZOOM); +	mZoom = getChild<LLPanelCameraZoom>(ZOOM);  	mTrack = getChild<LLJoystickCameraTrack>(PAN);  	assignButton2Mode(CAMERA_CTRL_MODE_ORBIT,			"orbit_btn"); diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h index 583f279e62..4873a34e00 100644 --- a/indra/newview/llfloatercamera.h +++ b/indra/newview/llfloatercamera.h @@ -39,6 +39,7 @@ class LLJoystickCameraRotate;  class LLJoystickCameraZoom;  class LLJoystickCameraTrack;  class LLFloaterReg; +class LLPanelCameraZoom;  enum ECameraControlMode  { @@ -74,7 +75,7 @@ public:  	virtual void onClose(bool app_quitting);  	LLJoystickCameraRotate* mRotate; -	LLJoystickCameraZoom*	mZoom; +	LLPanelCameraZoom*	mZoom;  	LLJoystickCameraTrack*	mTrack;  private: diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index c114eed4a2..854d02873a 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -89,6 +89,52 @@ LLFloaterGesture::LLFloaterGesture(const LLSD& key)  	//LLUICtrlFactory::getInstance()->buildFloater(this, "floater_gesture.xml");  } +void LLFloaterGesture::done() +{ +	//this method can be called twice: for GestureFolder and once after loading all sudir of GestureFolder +	if (gInventory.isCategoryComplete(mGestureFolderID)) +	{ +		LL_DEBUGS("Gesture")<< "mGestureFolderID loaded" << LL_ENDL; +		// we load only gesture folder without childred. +		LLInventoryModel::cat_array_t* categories; +		LLInventoryModel::item_array_t* items; +		LLInventoryFetchDescendentsObserver::folder_ref_t unloaded_folders; +		LL_DEBUGS("Gesture")<< "Get subdirs of Gesture Folder...." << LL_ENDL; +		gInventory.getDirectDescendentsOf(mGestureFolderID, categories, items); +		if (categories->empty()) +		{ +			gInventory.removeObserver(this); +			LL_INFOS("Gesture")<< "Gesture dos NOT contains sub-directories."<< LL_ENDL; +			return; +		} +		LL_DEBUGS("Gesture")<< "There are " << categories->size() << " Folders "<< LL_ENDL; +		for (LLInventoryModel::cat_array_t::iterator it = categories->begin(); it != categories->end(); it++) +		{ +			if (!gInventory.isCategoryComplete(it->get()->getUUID())) +			{ +				unloaded_folders.push_back(it->get()->getUUID()); +				LL_DEBUGS("Gesture")<< it->get()->getName()<< " Folder added to fetchlist"<< LL_ENDL; +			} + +		} +		if (!unloaded_folders.empty()) +		{ +			LL_DEBUGS("Gesture")<< "Fetching subdirectories....." << LL_ENDL; +			fetchDescendents(unloaded_folders); +		} +		else +		{ +			LL_DEBUGS("Gesture")<< "All Gesture subdirectories have been loaded."<< LL_ENDL; +			gInventory.removeObserver(this); +			buildGestureList(); +		} +	} +	else +	{ +		LL_WARNS("Gesture")<< "Gesture list was NOT loaded"<< LL_ENDL; +	} +} +  // virtual  LLFloaterGesture::~LLFloaterGesture()  { @@ -121,7 +167,14 @@ BOOL LLFloaterGesture::postBuild()  	childSetVisible("play_btn", true);  	childSetVisible("stop_btn", false);  	setDefaultBtn("play_btn"); -	 +	mGestureFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE, false); + +	folder_ref_t folders; +	folders.push_back(mGestureFolderID); +	//perform loading Gesture directory anyway to make sure that all subdirectory are loaded too. See method done() for details. +	gInventory.addObserver(this); +	fetchDescendents(folders); +  	buildGestureList();  	childSetFocus("gesture_list"); @@ -171,101 +224,125 @@ void LLFloaterGesture::buildGestureList()  	if (! (list && scroll)) return; -	// attempt to preserve scroll position through re-builds -	// since we do re-build any time anything dirties -	S32 current_scroll_pos = scroll->getScrollPos(); -	 +	LLUUID selected_item = list->getCurrentID(); +	LL_DEBUGS("Gesture")<< "Rebuilding gesture list "<< LL_ENDL;  	list->operateOnAll(LLCtrlListInterface::OP_DELETE); -	LLGestureManager::item_map_t::iterator it; -	for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it) +	LLGestureManager::item_map_t::const_iterator it; +	const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures(); +	for (it = active_gestures.begin(); it != active_gestures.end(); ++it)  	{ -		const LLUUID& item_id = (*it).first; -		LLMultiGesture* gesture = (*it).second; +		addGesture(it->first,it->second, list); +	} +	if (gInventory.isCategoryComplete(mGestureFolderID)) +	{ +		LLIsType is_gesture(LLAssetType::AT_GESTURE); +		LLInventoryModel::cat_array_t categories; +		LLInventoryModel::item_array_t items; +		gInventory.collectDescendentsIf(mGestureFolderID, categories, items, +				LLInventoryModel::EXCLUDE_TRASH, is_gesture); -		// Note: Can have NULL item if inventory hasn't arrived yet. -		std::string item_name = getString("loading"); -		LLInventoryItem* item = gInventory.getItem(item_id); -		if (item) +		for (LLInventoryModel::item_array_t::iterator it = items.begin(); it!= items.end(); ++it)  		{ -			item_name = item->getName(); +			LLInventoryItem* item = it->get(); +			if (active_gestures.find(item->getUUID()) == active_gestures.end()) +			{ +				// if gesture wasn't loaded yet, we can display only name +				addGesture(item->getUUID(), NULL, list); +			}  		} +	} +	// attempt to preserve scroll position through re-builds +	// since we do re-build any time anything dirties +	if(list->selectByValue(LLSD(selected_item))) +	{ +		scroll->scrollToShowSelected(); +	} +} -		std::string font_style = "NORMAL"; -		// If gesture is playing, bold it +void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gesture,LLCtrlListInterface * list ) +{ +	// Note: Can have NULL item if inventory hasn't arrived yet. +	static std::string item_name = getString("loading"); +	LLInventoryItem* item = gInventory.getItem(item_id); +	if (item) +	{ +		item_name = item->getName(); +	} + +	static std::string font_style = "NORMAL"; +	// If gesture is playing, bold it -		LLSD element; -		element["id"] = item_id; +	LLSD element; +	element["id"] = item_id; -		if (gesture) +	if (gesture) +	{ +		if (gesture->mPlaying)  		{ -			if (gesture->mPlaying) -			{ -				font_style = "BOLD"; -			} +			font_style = "BOLD"; +		} -			element["columns"][0]["column"] = "trigger"; -			element["columns"][0]["value"] = gesture->mTrigger; -			element["columns"][0]["font"]["name"] = "SANSSERIF"; -			element["columns"][0]["font"]["style"] = font_style; +		element["columns"][0]["column"] = "trigger"; +		element["columns"][0]["value"] = gesture->mTrigger; +		element["columns"][0]["font"]["name"] = "SANSSERIF"; +		element["columns"][0]["font"]["style"] = font_style; -			std::string key_string = LLKeyboard::stringFromKey(gesture->mKey); -			std::string buffer; +		std::string key_string = LLKeyboard::stringFromKey(gesture->mKey); +		std::string buffer; -			if (gesture->mKey == KEY_NONE) -			{ -				buffer = "---"; -				key_string = "~~~";		// alphabetize to end -			} -			else -			{ -				buffer = LLKeyboard::stringFromAccelerator( gesture->mMask, gesture->mKey ); -			} +		if (gesture->mKey == KEY_NONE) +		{ +			buffer = "---"; +			key_string = "~~~"; // alphabetize to end +		} +		else +		{ +			buffer = LLKeyboard::stringFromAccelerator(gesture->mMask, +					gesture->mKey); +		} -			element["columns"][1]["column"] = "shortcut"; -			element["columns"][1]["value"] = buffer; -			element["columns"][1]["font"]["name"] = "SANSSERIF"; -			element["columns"][1]["font"]["style"] = font_style; +		element["columns"][1]["column"] = "shortcut"; +		element["columns"][1]["value"] = buffer; +		element["columns"][1]["font"]["name"] = "SANSSERIF"; +		element["columns"][1]["font"]["style"] = font_style; -			// hidden column for sorting -			element["columns"][2]["column"] = "key"; -			element["columns"][2]["value"] = key_string; -			element["columns"][2]["font"]["name"] = "SANSSERIF"; -			element["columns"][2]["font"]["style"] = font_style; +		// hidden column for sorting +		element["columns"][2]["column"] = "key"; +		element["columns"][2]["value"] = key_string; +		element["columns"][2]["font"]["name"] = "SANSSERIF"; +		element["columns"][2]["font"]["style"] = font_style; -			// Only add "playing" if we've got the name, less confusing. JC -			if (item && gesture->mPlaying) -			{ -				item_name += " " + getString("playing"); -			} -			element["columns"][3]["column"] = "name"; -			element["columns"][3]["value"] = item_name; -			element["columns"][3]["font"]["name"] = "SANSSERIF"; -			element["columns"][3]["font"]["style"] = font_style; -		} -		else +		// Only add "playing" if we've got the name, less confusing. JC +		if (item && gesture->mPlaying)  		{ -			element["columns"][0]["column"] = "trigger"; -			element["columns"][0]["value"] = ""; -			element["columns"][0]["font"]["name"] = "SANSSERIF"; -			element["columns"][0]["font"]["style"] = font_style; -			element["columns"][0]["column"] = "trigger"; -			element["columns"][0]["value"] = "---"; -			element["columns"][0]["font"]["name"] = "SANSSERIF"; -			element["columns"][0]["font"]["style"] = font_style; -			element["columns"][2]["column"] = "key"; -			element["columns"][2]["value"] = "~~~"; -			element["columns"][2]["font"]["name"] = "SANSSERIF"; -			element["columns"][2]["font"]["style"] = font_style; -			element["columns"][3]["column"] = "name"; -			element["columns"][3]["value"] = item_name; -			element["columns"][3]["font"]["name"] = "SANSSERIF"; -			element["columns"][3]["font"]["style"] = font_style; +			item_name += " " + getString("playing");  		} -		list->addElement(element, ADD_BOTTOM); +		element["columns"][3]["column"] = "name"; +		element["columns"][3]["value"] = item_name; +		element["columns"][3]["font"]["name"] = "SANSSERIF"; +		element["columns"][3]["font"]["style"] = font_style;  	} -	 -	scroll->setScrollPos(current_scroll_pos); +	else +	{ +		element["columns"][0]["column"] = "trigger"; +		element["columns"][0]["value"] = ""; +		element["columns"][0]["font"]["name"] = "SANSSERIF"; +		element["columns"][0]["font"]["style"] = font_style; +		element["columns"][0]["column"] = "trigger"; +		element["columns"][0]["value"] = "---"; +		element["columns"][0]["font"]["name"] = "SANSSERIF"; +		element["columns"][0]["font"]["style"] = font_style; +		element["columns"][2]["column"] = "key"; +		element["columns"][2]["value"] = "~~~"; +		element["columns"][2]["font"]["name"] = "SANSSERIF"; +		element["columns"][2]["font"]["style"] = font_style; +		element["columns"][3]["column"] = "name"; +		element["columns"][3]["value"] = item_name; +		element["columns"][3]["font"]["name"] = "SANSSERIF"; +		element["columns"][3]["font"]["style"] = font_style; +	} +	list->addElement(element, ADD_BOTTOM);  }  void LLFloaterGesture::onClickInventory() @@ -284,14 +361,21 @@ void LLFloaterGesture::onClickPlay()  	LLCtrlListInterface *list = childGetListInterface("gesture_list");  	if (!list) return;  	const LLUUID& item_id = list->getCurrentID(); +	if(item_id.isNull()) return; -	if (LLGestureManager::instance().isGesturePlaying(item_id)) +	LL_DEBUGS("Gesture")<<" Trying to play gesture id: "<< item_id <<LL_ENDL; +	if(!LLGestureManager::instance().isGestureActive(item_id))  	{ -		LLGestureManager::instance().stopGesture(item_id); +		// we need to inform server about gesture activating to be consistent with LLPreviewGesture. +		BOOL inform_server = TRUE; +		BOOL deactivate_similar = FALSE; +		LLGestureManager::instance().activateGestureWithAsset(item_id, gInventory.getItem(item_id)->getAssetUUID(), inform_server, deactivate_similar); +		LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL; +		LLGestureManager::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id));  	}  	else  	{ -		LLGestureManager::instance().playGesture(item_id); +		playGesture(item_id);  	}  } @@ -345,3 +429,14 @@ void LLFloaterGesture::onCommitList()  		childSetVisible("stop_btn", false);  	}  } +void LLFloaterGesture::playGesture(LLUUID item_id) +{ +	if (LLGestureManager::instance().isGesturePlaying(item_id)) +	{ +		LLGestureManager::instance().stopGesture(item_id); +	} +	else +	{ +		LLGestureManager::instance().playGesture(item_id); +	} +} diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h index 9c1ab27cb0..e7819d2a03 100644 --- a/indra/newview/llfloatergesture.h +++ b/indra/newview/llfloatergesture.h @@ -38,7 +38,8 @@  #define LL_LLFLOATERGESTURE_H  #include "llfloater.h" - +#include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "lldarray.h"  class LLScrollContainer; @@ -51,31 +52,35 @@ class LLGestureOptions;  class LLScrollListCtrl;  class LLFloaterGestureObserver;  class LLFloaterGestureInventoryObserver; +class LLMultiGesture;  class LLFloaterGesture -:	public LLFloater +:	public LLFloater, LLInventoryFetchDescendentsObserver  { +	LOG_CLASS(LLFloaterGesture);  public:  	LLFloaterGesture(const LLSD& key);  	virtual ~LLFloaterGesture();  	virtual BOOL postBuild(); - +	virtual void done ();  	void refreshAll();  protected:  	// Reads from the gesture manager's list of active gestures  	// and puts them in this list.  	void buildGestureList(); - +	void addGesture(const LLUUID& item_id, LLMultiGesture* gesture, LLCtrlListInterface * list);  	void onClickInventory();  	void onClickEdit();  	void onClickPlay();  	void onClickNew();  	void onCommitList(); +	void playGesture(LLUUID item_id);  protected:  	LLUUID mSelectedID; +	LLUUID mGestureFolderID;  	LLFloaterGestureObserver* mObserver;  }; diff --git a/indra/newview/llfloatertestinspectors.cpp b/indra/newview/llfloatertestinspectors.cpp index 8af011c17a..09996b0b92 100644 --- a/indra/newview/llfloatertestinspectors.cpp +++ b/indra/newview/llfloatertestinspectors.cpp @@ -53,6 +53,9 @@ LLFloaterTestInspectors::~LLFloaterTestInspectors()  BOOL LLFloaterTestInspectors::postBuild()  { +	// Test the dummy widget construction code +	getChild<LLUICtrl>("intentionally-not-found")->setEnabled(true); +  //	getChild<LLUICtrl>("avatar_2d_btn")->setCommitCallback(  //		boost::bind(&LLFloaterTestInspectors::onClickAvatar2D, this));  	getChild<LLUICtrl>("avatar_3d_btn")->setCommitCallback( diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 102651f432..d39a17ca3b 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -387,7 +387,9 @@ BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* roo  // makes sure that this view and it's children are the right size.  S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)  { -	mIndentation = mParentFolder ? mParentFolder->getIndentation() + LEFT_INDENTATION : 0; +	mIndentation = getParentFolder() && getParentFolder()->getParentFolder()  +		? mParentFolder->getIndentation() + LEFT_INDENTATION  +		: 0;  	if (mLabelWidthDirty)  	{  		mLabelWidth = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + getLabelFontForStyle(mLabelStyle)->getWidth(mSearchableLabel);  diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index 62a4b9a187..7c429fc76e 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -110,7 +110,7 @@ public:  	// layout constants  	static const S32 LEFT_PAD = 5; -	static const S32 LEFT_INDENTATION = 13; +	static const S32 LEFT_INDENTATION = 8;  	static const S32 ICON_PAD = 2;  	static const S32 ICON_WIDTH = 16;  	static const S32 TEXT_PAD = 1; diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index 1ff2566dca..23d9436fa6 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -33,6 +33,7 @@  #include "llviewerprecompiledheaders.h"  #include "llinventory.h" +#include "llinventoryobserver.h"  #include "lltrans.h"  #include "llfriendcard.h" @@ -91,44 +92,39 @@ const LLUUID& get_folder_uuid(const LLUUID& parentFolderUUID, LLInventoryCollect  	return LLUUID::null;  } - -// LLViewerInventoryCategory::fetchDescendents has it own period of fetching. -// for now it is FETCH_TIMER_EXPIRY = 10.0f; So made our period a bit more. -const F32 FETCH_FRIENDS_DESCENDENTS_PERIOD = 11.0f; - -  /** - * Intended to call passed callback after the specified period of time. + * Class for fetching initial friend cards data   * - * Implemented to fix an issue when Inventory folders are in incomplete state. See EXT-2061, EXT-1935, EXT-813. - * For now it uses to periodically sync Inventory Friends/All folder with a Agent's Friends List - * until it is complete. - */  -class FriendListUpdater : public LLEventTimer + * Implemented to fix an issue when Inventory folders are in incomplete state. + * See EXT-2320, EXT-2061, EXT-1935, EXT-813. + * Uses a callback to sync Inventory Friends/All folder with agent's Friends List. + */ +class LLInitialFriendCardsFetch : public LLInventoryFetchDescendentsObserver  {  public: -	typedef boost::function<bool()> callback_t; +	typedef boost::function<void()> callback_t; -	FriendListUpdater(callback_t cb, F32 period) -		:	LLEventTimer(period) -		,	mCallback(cb) -	{ -		mEventTimer.start(); -	} +	LLInitialFriendCardsFetch(callback_t cb) +		:	mCheckFolderCallback(cb)	{} -	virtual BOOL tick() // from LLEventTimer -	{ -		return mCallback(); -	} +	/* virtual */ void done();  private: -	callback_t		mCallback; +	callback_t		mCheckFolderCallback;  }; +void LLInitialFriendCardsFetch::done() +{ +	// This observer is no longer needed. +	gInventory.removeObserver(this); + +	mCheckFolderCallback(); + +	delete this; +}  // LLFriendCardsManager Constructor / Destructor  LLFriendCardsManager::LLFriendCardsManager() -: mFriendsAllFolderCompleted(true)  {  	LLAvatarTracker::instance().addObserver(this);  } @@ -167,30 +163,6 @@ const LLUUID LLFriendCardsManager::extractAvatarID(const LLUUID& avatarID)  	return rv;  } -// be sure LLInventoryModel::buildParentChildMap() has been called before it. -// and this method must be called before any actions with friend list -void LLFriendCardsManager::ensureFriendFoldersExist() -{ -	const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); - -	LLUUID friendFolderUUID = findFriendFolderUUIDImpl(); - -	if (friendFolderUUID.isNull()) -	{ -		friendFolderUUID = gInventory.createNewCategory(callingCardsFolderID, -			LLFolderType::FT_CALLINGCARD, get_friend_folder_name()); -	} - -	LLUUID friendAllSubfolderUUID = findFriendAllSubfolderUUIDImpl(); - -	if (friendAllSubfolderUUID.isNull()) -	{ -		friendAllSubfolderUUID = gInventory.createNewCategory(friendFolderUUID, -			LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name()); -	} -} - -  bool LLFriendCardsManager::isItemInAnyFriendsList(const LLViewerInventoryItem* item)  {  	if (item->getType() != LLAssetType::AT_CALLINGCARD) @@ -305,63 +277,12 @@ bool LLFriendCardsManager::isAnyFriendCategory(const LLUUID& catID) const  	return TRUE == gInventory.isObjectDescendentOf(catID, friendFolderID);  } -bool LLFriendCardsManager::syncFriendsFolder() +void LLFriendCardsManager::syncFriendCardsFolders()  { -	//lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" if they are absent -	LLFriendCardsManager::instance().ensureFriendFoldersExist(); - -	LLAvatarTracker::buddy_map_t all_buddies; -	LLAvatarTracker::instance().copyBuddyList(all_buddies); - -	// 1. Remove Friend Cards for non-friends -	LLInventoryModel::cat_array_t cats; -	LLInventoryModel::item_array_t items; - -	gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH); -	 -	LLInventoryModel::item_array_t::const_iterator it; -	for (it = items.begin(); it != items.end(); ++it) -	{ -		lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl; -		if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID())) -		{ -			lldebugs << "NONEXISTS, so remove it" << llendl; -			removeFriendCardFromInventory((*it)->getCreatorUUID()); -		} -	} - -	// 2. Add missing Friend Cards for friends -	LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin(); -	llinfos << "try to build friends, count: " << all_buddies.size() << llendl;  -	mFriendsAllFolderCompleted = true; -	for(; buddy_it != all_buddies.end(); ++buddy_it) -	{ -		const LLUUID& buddy_id = (*buddy_it).first; -		addFriendCardToInventory(buddy_id); -	} - -	if (!mFriendsAllFolderCompleted) -	{ -		forceFriendListIsLoaded(findFriendAllSubfolderUUIDImpl()); - -		static bool timer_started = false; -		if (!timer_started) -		{ -			lldebugs << "Create and start timer to sync Inventory Friends All folder with Friends list" << llendl; - -			// do not worry about destruction of the FriendListUpdater.  -			// It will be deleted by LLEventTimer::updateClass when FriendListUpdater::tick() returns true. -			new FriendListUpdater(boost::bind(&LLFriendCardsManager::syncFriendsFolder, this), -				FETCH_FRIENDS_DESCENDENTS_PERIOD); -		} -		timer_started = true; -	} -	else -	{ -		lldebugs << "Friends/All Inventory folder is synchronized with the Agent's Friends List" << llendl; -	} +	const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); -	return mFriendsAllFolderCompleted; +	fetchAndCheckFolderDescendents(callingCardsFolderID, +			boost::bind(&LLFriendCardsManager::ensureFriendsFolderExists, this));  }  void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const @@ -482,6 +403,122 @@ void LLFriendCardsManager::findMatchedFriendCards(const LLUUID& avatarID, LLInve  	}  } +void LLFriendCardsManager::fetchAndCheckFolderDescendents(const LLUUID& folder_id,  callback_t cb) +{ +	// This instance will be deleted in LLInitialFriendCardsFetch::done(). +	LLInitialFriendCardsFetch* fetch = new LLInitialFriendCardsFetch(cb); + +	LLInventoryFetchDescendentsObserver::folder_ref_t folders; +	folders.push_back(folder_id); + +	fetch->fetchDescendents(folders); +	if(fetch->isEverythingComplete()) +	{ +		// everything is already here - call done. +		fetch->done(); +	} +	else +	{ +		// it's all on it's way - add an observer, and the inventory +		// will call done for us when everything is here. +		gInventory.addObserver(fetch); +	} +} + +// Make sure LLInventoryModel::buildParentChildMap() has been called before it. +// This method must be called before any actions with friends list. +void LLFriendCardsManager::ensureFriendsFolderExists() +{ +	const LLUUID calling_cards_folder_ID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); + +	// If "Friends" folder exists in "Calling Cards" we should check if "All" sub-folder +	// exists in "Friends", otherwise we create it. +	LLUUID friends_folder_ID = findFriendFolderUUIDImpl(); +	if (friends_folder_ID.notNull()) +	{ +		fetchAndCheckFolderDescendents(friends_folder_ID, +				boost::bind(&LLFriendCardsManager::ensureFriendsAllFolderExists, this)); +	} +	else +	{ +		if (!gInventory.isCategoryComplete(calling_cards_folder_ID)) +		{ +			LLViewerInventoryCategory* cat = gInventory.getCategory(calling_cards_folder_ID); +			std::string cat_name = cat ? cat->getName() : "unknown"; +			llwarns << "Failed to find \"" << cat_name << "\" category descendents in Category Tree." << llendl; +		} + +		friends_folder_ID = gInventory.createNewCategory(calling_cards_folder_ID, +			LLFolderType::FT_CALLINGCARD, get_friend_folder_name()); + +		gInventory.createNewCategory(friends_folder_ID, +			LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name()); + +		// Now when we have all needed folders we can sync their contents with buddies list. +		syncFriendsFolder(); +	} +} + +// Make sure LLFriendCardsManager::ensureFriendsFolderExists() has been called before it. +void LLFriendCardsManager::ensureFriendsAllFolderExists() +{ +	LLUUID friends_all_folder_ID = findFriendAllSubfolderUUIDImpl(); +	if (friends_all_folder_ID.notNull()) +	{ +		fetchAndCheckFolderDescendents(friends_all_folder_ID, +				boost::bind(&LLFriendCardsManager::syncFriendsFolder, this)); +	} +	else +	{ +		LLUUID friends_folder_ID = findFriendFolderUUIDImpl(); + +		if (!gInventory.isCategoryComplete(friends_folder_ID)) +		{ +			LLViewerInventoryCategory* cat = gInventory.getCategory(friends_folder_ID); +			std::string cat_name = cat ? cat->getName() : "unknown"; +			llwarns << "Failed to find \"" << cat_name << "\" category descendents in Category Tree." << llendl; +		} + +		friends_all_folder_ID = gInventory.createNewCategory(friends_folder_ID, +			LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name()); + +		// Now when we have all needed folders we can sync their contents with buddies list. +		syncFriendsFolder(); +	} +} + +void LLFriendCardsManager::syncFriendsFolder() +{ +	LLAvatarTracker::buddy_map_t all_buddies; +	LLAvatarTracker::instance().copyBuddyList(all_buddies); + +	// 1. Remove Friend Cards for non-friends +	LLInventoryModel::cat_array_t cats; +	LLInventoryModel::item_array_t items; + +	gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH); + +	LLInventoryModel::item_array_t::const_iterator it; +	for (it = items.begin(); it != items.end(); ++it) +	{ +		lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl; +		if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID())) +		{ +			lldebugs << "NONEXISTS, so remove it" << llendl; +			removeFriendCardFromInventory((*it)->getCreatorUUID()); +		} +	} + +	// 2. Add missing Friend Cards for friends +	LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin(); +	llinfos << "try to build friends, count: " << all_buddies.size() << llendl; +	for(; buddy_it != all_buddies.end(); ++buddy_it) +	{ +		const LLUUID& buddy_id = (*buddy_it).first; +		addFriendCardToInventory(buddy_id); +	} +} +  class CreateFriendCardCallback : public LLInventoryCallback  {  public: @@ -494,9 +531,8 @@ public:  	}  }; -bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID) +void LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)  { -	LLInventoryModel* invModel = &gInventory;  	bool shouldBeAdded = true;  	std::string name; @@ -518,13 +554,6 @@ bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)  		lldebugs << "is found in sentRequests: " << name << llendl;   	} -	LLUUID friendListFolderID = findFriendAllSubfolderUUIDImpl(); -	if (friendListFolderID.notNull() && shouldBeAdded && !invModel->isCategoryComplete(friendListFolderID)) -	{ -		mFriendsAllFolderCompleted = false; -		shouldBeAdded = false; -		lldebugs << "Friends/All category is not completed" << llendl;  -	}  	if (shouldBeAdded)  	{  		putAvatarData(avatarID); @@ -533,10 +562,8 @@ bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)  		// TODO: mantipov: Is CreateFriendCardCallback really needed? Probably not  		LLPointer<LLInventoryCallback> cb = new CreateFriendCardCallback(); -		create_inventory_callingcard(avatarID, friendListFolderID, cb); +		create_inventory_callingcard(avatarID, findFriendAllSubfolderUUIDImpl(), cb);  	} - -	return shouldBeAdded;  }  void LLFriendCardsManager::removeFriendCardFromInventory(const LLUUID& avatarID) @@ -582,11 +609,4 @@ void LLFriendCardsManager::onFriendListUpdate(U32 changed_mask)  	}  } -void LLFriendCardsManager::forceFriendListIsLoaded(const LLUUID& folder_id) const -{ -	bool fetching_inventory = gInventory.fetchDescendentsOf(folder_id); -	lldebugs << "Trying to fetch descendants of Friends/All Inventory folder, fetched: " -		<< fetching_inventory << llendl; -} -  // EOF diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h index feea05bc1d..98dc3153d0 100644 --- a/indra/newview/llfriendcard.h +++ b/indra/newview/llfriendcard.h @@ -58,14 +58,6 @@ public:  	}  	/** -	 *	Ensures that all necessary folders are created in Inventory. -	 *  -	 *	For now it processes Calling Card, Calling Card/Friends & Calling Card/Friends/All folders -	 */ -	void ensureFriendFoldersExist(); - - -	/**  	 *	Determines if specified Inventory Calling Card exists in any of lists   	 *	in the Calling Card/Friends/ folder (Default, or Custom)  	 */ @@ -88,11 +80,10 @@ public:  	bool isAnyFriendCategory(const LLUUID& catID) const;  	/** -	 *	Synchronizes content of the Calling Card/Friends/All Global Inventory folder with Agent's Friend List -	 * -	 *	@return true - if folder is already synchronized, false otherwise. +	 *	Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" category +	 *	(creates them otherwise) and fetches their contents to synchronize with Agent's Friends List.  	 */ -	bool syncFriendsFolder(); +	void syncFriendCardsFolders();  	/*!  	 * \brief @@ -108,6 +99,8 @@ public:  	void collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const;  private: +	typedef boost::function<void()> callback_t; +  	LLFriendCardsManager();  	~LLFriendCardsManager(); @@ -133,10 +126,29 @@ private:  	const LLUUID& findFriendCardInventoryUUIDImpl(const LLUUID& avatarID);  	void findMatchedFriendCards(const LLUUID& avatarID, LLInventoryModel::item_array_t& items) const; +	void fetchAndCheckFolderDescendents(const LLUUID& folder_id, callback_t cb); + +	/** +	 *	Checks whether "Calling Cards/Friends" folder exists. If not, creates it with "All" +	 *	sub-folder and synchronizes its contents with buddies list. +	 */ +	void ensureFriendsFolderExists(); + +	/** +	 *	Checks whether "Calling Cards/Friends/All" folder exists. If not, creates it and +	 *	synchronizes its contents with buddies list. +	 */ +	void ensureFriendsAllFolderExists(); + +	/** +	 *	Synchronizes content of the Calling Card/Friends/All Global Inventory folder with Agent's Friend List +	 */ +	void syncFriendsFolder(); +  	/**  	 *	Adds avatar specified by its UUID into the Calling Card/Friends/All Global Inventory folder  	 */ -	bool addFriendCardToInventory(const LLUUID& avatarID); +	void addFriendCardToInventory(const LLUUID& avatarID);  	/**  	 *	Removes an avatar specified by its UUID from the Calling Card/Friends/All Global Inventory folder @@ -146,20 +158,11 @@ private:  	void onFriendListUpdate(U32 changed_mask); -	/** -	 * Force fetching of the Inventory folder specified by passed folder's LLUUID. -	 * -	 * It only sends request to server, server reply should be processed in other place. -	 * Because request can be sent via UDP we need to periodically check if request was completed with success. -	 */ -	void forceFriendListIsLoaded(const LLUUID& folder_id) const; -  private:  	typedef std::set<LLUUID> avatar_uuid_set_t;  	avatar_uuid_set_t mBuddyIDSet; -	bool mFriendsAllFolderCompleted;  };  #endif // LL_LLFRIENDCARD_H diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index 59274c8638..8e774dc199 100644 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -37,7 +37,6 @@  // system  #include <functional>  #include <algorithm> -#include <boost/tokenizer.hpp>  // library  #include "lldatapacker.h" @@ -206,6 +205,9 @@ struct LLLoadInfo  // If inform_server is true, will send a message upstream to update  // the user_gesture_active table. +/** + * It will load a gesture from remote storage + */  void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id,  												const LLUUID& asset_id,  												BOOL inform_server, @@ -921,8 +923,8 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,  	delete info;  	info = NULL; - -	LLGestureManager::instance().mLoadingCount--; +	LLGestureManager& self = LLGestureManager::instance(); +	self.mLoadingCount--;  	if (0 == status)  	{ @@ -944,15 +946,15 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,  		{  			if (deactivate_similar)  			{ -				LLGestureManager::instance().deactivateSimilarGestures(gesture, item_id); +				self.deactivateSimilarGestures(gesture, item_id);  				// Display deactivation message if this was the last of the bunch. -				if (LLGestureManager::instance().mLoadingCount == 0 -					&& LLGestureManager::instance().mDeactivateSimilarNames.length() > 0) +				if (self.mLoadingCount == 0 +					&& self.mDeactivateSimilarNames.length() > 0)  				{  					// we're done with this set of deactivations  					LLSD args; -					args["NAMES"] = LLGestureManager::instance().mDeactivateSimilarNames; +					args["NAMES"] = self.mDeactivateSimilarNames;  					LLNotifications::instance().add("DeactivatedGesturesTrigger", args);  				}  			} @@ -965,9 +967,9 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,  			else  			{  				// Watch this item and set gesture name when item exists in inventory -				LLGestureManager::instance().watchItem(item_id); +				self.watchItem(item_id);  			} -			LLGestureManager::instance().mActive[item_id] = gesture; +			self.mActive[item_id] = gesture;  			// Everything has been successful.  Add to the active list.  			gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); @@ -989,14 +991,21 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,  				gAgent.sendReliableMessage();  			} +			callback_map_t::iterator i_cb = self.mCallbackMap.find(item_id); +			 +			if(i_cb != self.mCallbackMap.end()) +			{ +				i_cb->second(gesture); +				self.mCallbackMap.erase(i_cb); +			} -			LLGestureManager::instance().notifyObservers(); +			self.notifyObservers();  		}  		else  		{  			llwarns << "Unable to load gesture" << llendl; -			LLGestureManager::instance().mActive.erase(item_id); +			self.mActive.erase(item_id);  			delete gesture;  			gesture = NULL; diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h index c8b26f7309..094ca13798 100644 --- a/indra/newview/llgesturemgr.h +++ b/indra/newview/llgesturemgr.h @@ -57,6 +57,12 @@ public:  class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventoryCompletionObserver  {  public: + +	typedef boost::function<void (LLMultiGesture* loaded_gesture)> gesture_loaded_callback_t; +	// Maps inventory item_id to gesture +	typedef std::map<LLUUID, LLMultiGesture*> item_map_t; +	typedef std::map<LLUUID, gesture_loaded_callback_t> callback_map_t; +  	LLGestureManager();  	~LLGestureManager(); @@ -97,6 +103,7 @@ public:  	BOOL isGesturePlaying(const LLUUID& item_id); +	const item_map_t& getActiveGestures() const { return mActive; }  	// Force a gesture to be played, for example, if it is being  	// previewed.  	void playGesture(LLMultiGesture* gesture); @@ -106,7 +113,15 @@ public:  	// Also remove from playing list  	void stopGesture(LLMultiGesture* gesture);  	void stopGesture(const LLUUID& item_id); - +	/** +	 * Add cb into callbackMap. +	 * Note: +	 * Manager will call cb after gesture will be loaded and will remove cb automatically.  +	 */ +	void setGestureLoadedCallback(LLUUID inv_item_id, gesture_loaded_callback_t cb) +	{ +		mCallbackMap[inv_item_id] = cb; +	}  	// Trigger the first gesture that matches this key.  	// Returns TRUE if it finds a gesture bound to that key.  	BOOL triggerGesture(KEY key, MASK mask); @@ -144,13 +159,7 @@ protected:  						   LLAssetType::EType type,  						   void* user_data, S32 status, LLExtStat ext_status); -public: -	BOOL mValid; -	std::vector<LLMultiGesture*> mPlaying; - -	// Maps inventory item_id to gesture -	typedef std::map<LLUUID, LLMultiGesture*> item_map_t; - +private:  	// Active gestures.  	// NOTE: The gesture pointer CAN BE NULL.  This means that  	// there is a gesture with that item_id, but the asset data @@ -159,8 +168,11 @@ public:  	S32 mLoadingCount;  	std::string mDeactivateSimilarNames; - +	  	std::vector<LLGestureManagerObserver*> mObservers; +	callback_map_t mCallbackMap; +	std::vector<LLMultiGesture*> mPlaying;	 +	BOOL mValid;  };  #endif diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 54fc6f02fb..e3121fbc7a 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -120,11 +120,7 @@ void LLIMFloater::newIMCallback(const LLSD& data){  		LLUUID session_id = data["session_id"].asUUID();  		LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id); -		if (floater == NULL) -		{ -			llwarns << "new_im_callback for non-existent session_id " << session_id << llendl; -			return; -		} +		if (floater == NULL) return;          // update if visible, otherwise will be updated when opened  		if (floater->getVisible()) @@ -211,6 +207,7 @@ BOOL LLIMFloater::postBuild()  	}  	mControlPanel->setSessionId(mSessionID); +	mControlPanel->setVisible(gSavedSettings.getBOOL("IMShowControlPanel"));  	LLButton* slide_left = getChild<LLButton>("slide_left_btn");  	slide_left->setVisible(mControlPanel->getVisible()); @@ -356,8 +353,6 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)  				LLDockControl::TOP,  boost::bind(&LLIMFloater::getAllowedRect, floater, _1)));  	} -	floater->childSetVisible("panel_im_control_panel", gSavedSettings.getBOOL("IMShowControlPanel")); -  	return floater;  } @@ -463,7 +458,7 @@ void LLIMFloater::updateMessages()  	if (messages.size())  	{ -		LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor"); +//		LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor");  		std::ostringstream message;  		std::list<LLSD>::const_reverse_iterator iter = messages.rbegin(); @@ -476,32 +471,13 @@ void LLIMFloater::updateMessages()  			LLUUID from_id = msg["from_id"].asUUID();  			std::string from = from_id != gAgentID ? msg["from"].asString() : LLTrans::getString("You");  			std::string message = msg["message"].asString(); -			LLStyle::Params style_params; -			style_params.color(chat_color);  			LLChat chat;  			chat.mFromID = from_id;  			chat.mFromName = from; +			chat.mText = message; -			//Handle IRC styled /me messages. -			std::string prefix = message.substr(0, 4); -			if (prefix == "/me " || prefix == "/me'") -			{ -				if (from.size() > 0) -				{ -					style_params.font.style = "ITALIC"; -					chat.mText = from + " "; -					mChatHistory->appendWidgetMessage(chat, style_params); -				} -				message = message.substr(3); -				style_params.font.style = "UNDERLINE"; -				mChatHistory->appendText(message, FALSE, style_params); -			} -			else -			{ -				chat.mText = message; -				mChatHistory->appendWidgetMessage(chat, style_params); -			} +			mChatHistory->appendWidgetMessage(chat);  			mLastMessageIndex = msg["index"].asInteger();  		} diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index 0b8b5935f8..87b801d73b 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -848,8 +848,11 @@ void LLFloaterIMPanel::processSessionUpdate(const LLSD& session_update)  		} -		//update the speakers dropdown too -		mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated); +		//update the speakers dropdown too, if it's available +		if (mSpeakerPanel) +		{ +			mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated); +		}  	}  } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index a94254e17e..dc32291714 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -441,11 +441,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co  	addToHistory(session_id, from, from_id, utf8_text);  	if (log2file) logToFile(session_id, from, from_id, utf8_text); -	//we do not count system messages and our messages -	if (from_id.notNull() && from_id != gAgentID && SYSTEM_FROM != from) -	{ -		session->mNumUnread++; -	} +	session->mNumUnread++;  	// notify listeners  	LLSD arg; @@ -1128,13 +1124,9 @@ void LLOutgoingCallDialog::onOpen(const LLSD& key)  	LLSD callee_id = mPayload["other_user_id"];  	childSetTextArg("calling", "[CALLEE_NAME]", callee_name); +	childSetTextArg("connecting", "[CALLEE_NAME]", callee_name);  	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");  	icon->setValue(callee_id); - -	// dock the dialog to the sys well, where other sys messages appear -	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(), -					 this, getDockTongue(), LLDockControl::TOP, -					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1)));  } @@ -1159,6 +1151,11 @@ BOOL LLOutgoingCallDialog::postBuild()  	childSetAction("Cancel", onCancel, this); +	// dock the dialog to the sys well, where other sys messages appear +	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(), +					 this, getDockTongue(), LLDockControl::TOP, +					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1))); +  	return success;  } @@ -1195,6 +1192,11 @@ BOOL LLIncomingCallDialog::postBuild()  		call_type = getString("VoiceInviteAdHoc");  	} +	// check to see if this is an Avaline call +	LLUUID session_id = mPayload["session_id"].asUUID(); +	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
 +	childSetVisible("Start IM", is_avatar); // no IM for avaline +  	LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name");  	caller_name_widget->setValue(caller_name + " " + call_type);  	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon"); diff --git a/indra/newview/llinspectgroup.cpp b/indra/newview/llinspectgroup.cpp index c78bcd6afe..7fd7b69021 100644 --- a/indra/newview/llinspectgroup.cpp +++ b/indra/newview/llinspectgroup.cpp @@ -216,7 +216,8 @@ void LLInspectGroup::requestUpdate()  	getChild<LLUICtrl>("group_details")->setValue("");  	getChild<LLUICtrl>("group_cost")->setValue("");  	// Must have a visible button so the inspector can take focus -	getChild<LLUICtrl>("leave_btn")->setVisible(true); +	getChild<LLUICtrl>("view_profile_btn")->setVisible(true); +	getChild<LLUICtrl>("leave_btn")->setVisible(false);  	getChild<LLUICtrl>("join_btn")->setVisible(false);  	// Make a new request for properties diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index dc704f2b82..129178e42e 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -114,6 +114,7 @@ BOOL LLInventoryPanel::postBuild()  		p.name = getName();
  		p.rect = folder_rect;
  		p.parent_panel = this;
 +		p.tool_tip = p.name;
  		mFolders = LLUICtrlFactory::create<LLFolderView>(p);
  		mFolders->setAllowMultiSelect(mAllowMultiSelect);
  	}
 @@ -455,6 +456,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)  					p.icon = new_listener->getIcon();
  					p.root = mFolders;
  					p.listener = new_listener;
 +					p.tool_tip = p.name;
  					LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p);
  					folderp->setItemSortOrder(mFolders->getSortOrder());
 @@ -481,6 +483,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)  					params.root(mFolders);
  					params.listener(new_listener);
  					params.rect(LLRect (0, 0, 0, 0));
 +					params.tool_tip = params.name;
  					itemp = LLUICtrlFactory::create<LLFolderViewItem> (params);
  				}
  			}
 diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp index bd6702a0b2..d7eaad94f0 100644 --- a/indra/newview/lljoystickbutton.cpp +++ b/indra/newview/lljoystickbutton.cpp @@ -134,16 +134,31 @@ void LLJoystick::updateSlop()  	return;  } +BOOL LLJoystick::pointInCircle(S32 x, S32 y) const  +{  +	//cnt is x and y coordinates of center of joystick circle, and also its radius, +	//because area is not just rectangular, it's a square! +	//Make sure to change method if this changes. +	int cnt = this->getLocalRect().mTop/2; +	if((x-cnt)*(x-cnt)+(y-cnt)*(y-cnt)<=cnt*cnt) +		return TRUE; +	return FALSE; +}  BOOL LLJoystick::handleMouseDown(S32 x, S32 y, MASK mask)  {  	//llinfos << "joystick mouse down " << x << ", " << y << llendl; +	bool handles = false; -	mLastMouse.set(x, y); -	mFirstMouse.set(x, y); +	if(handles = pointInCircle(x, y)) +	{ +		mLastMouse.set(x, y); +		mFirstMouse.set(x, y); +		mMouseDownTimer.reset(); +		handles = LLButton::handleMouseDown(x, y, mask); +	} -	mMouseDownTimer.reset(); -	return LLButton::handleMouseDown(x, y, mask); +	return handles;  } diff --git a/indra/newview/lljoystickbutton.h b/indra/newview/lljoystickbutton.h index 4c657913b8..0465f78031 100644 --- a/indra/newview/lljoystickbutton.h +++ b/indra/newview/lljoystickbutton.h @@ -78,6 +78,8 @@ public:  	static void		onBtnHeldDown(void *userdata);		// called by llbutton callback handler  	void            setInitialQuadrant(EJoystickQuadrant initial) { mInitialQuadrant = initial; }; + +	BOOL			pointInCircle(S32 x, S32 y) const;  	static std::string nameFromQuadrant(const EJoystickQuadrant quadrant);  	static EJoystickQuadrant quadrantFromName(const std::string& name); diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index a01426ea87..955347bce2 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -73,9 +73,9 @@ LLLoginInstance::LLLoginInstance() :  {  	mLoginModule->getEventPump().listen("lllogininstance",   		boost::bind(&LLLoginInstance::handleLoginEvent, this, _1)); -	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("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));  }  LLLoginInstance::~LLLoginInstance() diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index ac806d7106..85db69174d 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -132,120 +132,31 @@ void    LLNearbyChat::applySavedVariables()  	}  } -LLColor4 nearbychat_get_text_color(const LLChat& chat) -{ -	LLColor4 text_color; - -	if(chat.mMuted) -	{ -		text_color.setVec(0.8f, 0.8f, 0.8f, 1.f); -	} -	else -	{ -		switch(chat.mSourceType) -		{ -		case CHAT_SOURCE_SYSTEM: -			text_color = LLUIColorTable::instance().getColor("SystemChatColor");  -			break; -		case CHAT_SOURCE_AGENT: -		    if (chat.mFromID.isNull()) -			{ -				text_color = LLUIColorTable::instance().getColor("SystemChatColor"); -			} -			else -			{ -				if(gAgentID == chat.mFromID) -				{ -					text_color = LLUIColorTable::instance().getColor("UserChatColor"); -				} -				else -				{ -					text_color = LLUIColorTable::instance().getColor("AgentChatColor"); -				} -			} -			break; -		case CHAT_SOURCE_OBJECT: -			if (chat.mChatType == CHAT_TYPE_DEBUG_MSG) -			{ -				text_color = LLUIColorTable::instance().getColor("ScriptErrorColor"); -			} -			else if ( chat.mChatType == CHAT_TYPE_OWNER ) -			{ -				text_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor"); -			} -			else -			{ -				text_color = LLUIColorTable::instance().getColor("ObjectChatColor"); -			} -			break; -		default: -			text_color.setToWhite(); -		} - -		if (!chat.mPosAgent.isExactlyZero()) -		{ -			LLVector3 pos_agent = gAgent.getPositionAgent(); -			F32 distance = dist_vec(pos_agent, chat.mPosAgent); -			if (distance > gAgent.getNearChatRadius()) -			{ -				// diminish far-off chat -				text_color.mV[VALPHA] = 0.8f; -			} -		} -	} - -	return text_color; -} - -void LLNearbyChat::add_timestamped_line(const LLChat& chat, const LLColor4& color) -{ -	S32 font_size = gSavedSettings.getS32("ChatFontSize"); - -	const LLFontGL* fontp = NULL; -	switch(font_size) -	{ -	case 0: -		fontp = LLFontGL::getFontSansSerifSmall(); -		break; -	default: -	case 1: -		fontp = LLFontGL::getFontSansSerif(); -		break; -	case 2: -		fontp = LLFontGL::getFontSansSerifBig(); -		break; -	} - -	LLStyle::Params style_params; -	style_params.color(color); -	style_params.font(fontp); -	LLUUID uuid = chat.mFromID; -	std::string from = chat.mFromName; -	std::string message = chat.mText; -	mChatHistory->appendWidgetMessage(chat, style_params); -} -  void	LLNearbyChat::addMessage(const LLChat& chat)  { -	LLColor4 color = nearbychat_get_text_color(chat); -	  	if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)  	{  		if(gSavedSettings.getBOOL("ShowScriptErrors") == FALSE)  			return;  		if (gSavedSettings.getS32("ShowScriptErrorsLocation")== 1)// show error in window //("ScriptErrorsAsChat"))  		{ + +			LLColor4 txt_color; + +			LLViewerChat::getChatColor(chat,txt_color); +			  			LLFloaterScriptDebug::addScriptLine(chat.mText,  												chat.mFromName,  -												color,  +												txt_color,   												chat.mFromID);  			return;  		}  	} -	// could flash the chat button in the status bar here. JC  	if (!chat.mMuted) -		add_timestamped_line(chat, color); +	{ +		mChatHistory->appendWidgetMessage(chat); +	}  }  void LLNearbyChat::onNearbySpeakers() diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index cb4654654a..3303c388af 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -35,7 +35,7 @@  #include "lldockablefloater.h"  #include "llscrollbar.h" -#include "llchat.h" +#include "llviewerchat.h"  class LLResizeBar;  class LLChatHistory; @@ -47,8 +47,7 @@ public:  	~LLNearbyChat();  	BOOL	postBuild			(); -	void	addMessage			(const LLChat& message); -	 +	void	addMessage			(const LLChat& message);	  	void	onNearbyChatContextMenuItemClicked(const LLSD& userdata);  	bool	onNearbyChatCheckContextMenuItem(const LLSD& userdata); @@ -64,7 +63,6 @@ private:  	void	getAllowedRect		(LLRect& rect);  	void	onNearbySpeakers	(); -	void	add_timestamped_line(const LLChat& chat, const LLColor4& color);  private: diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 94b8791147..333646d2c5 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -97,9 +97,10 @@ void LLGestureComboBox::refreshGestures()  	clearRows();  	mGestures.clear(); -	LLGestureManager::item_map_t::iterator it; +	LLGestureManager::item_map_t::const_iterator it; +	const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();  	LLSD::Integer idx(0); -	for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it) +	for (it = active_gestures.begin(); it != active_gestures.end(); ++it)  	{  		LLMultiGesture* gesture = (*it).second;  		if (gesture) diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index e10c506f08..458845fff3 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -63,8 +63,6 @@ class LLNearbyChatScreenChannel: public LLScreenChannelBase  public:  	LLNearbyChatScreenChannel(const LLUUID& id):LLScreenChannelBase(id) { mStopProcessing = false;}; -	void init				(S32 channel_left, S32 channel_right); -  	void addNotification	(LLSD& notification);  	void arrangeToasts		();  	void showToastsBottom	(); @@ -120,15 +118,6 @@ protected:  	bool	mStopProcessing;  }; -void LLNearbyChatScreenChannel::init(S32 channel_left, S32 channel_right) -{ -	S32 channel_top = gViewerWindow->getWorldViewRectRaw().getHeight(); -	S32 channel_bottom = gViewerWindow->getWorldViewRectRaw().mBottom; -	setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom)); -	setVisible(TRUE); -} - -  void	LLNearbyChatScreenChannel::createOverflowToast(S32 bottom, F32 timer)  {  	//we don't need overflow toast in nearby chat @@ -223,7 +212,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)  void LLNearbyChatScreenChannel::arrangeToasts()  { -	if(m_active_toasts.size() == 0 || mIsHovering) +	if(m_active_toasts.size() == 0 || isHovering())  		return;  	hideToastsFromScreen(); @@ -332,7 +321,8 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg)  	//only messages from AGENTS  	if(CHAT_SOURCE_OBJECT == chat_msg.mSourceType)  	{ -		return;//dn't show toast for messages from objects +		if(chat_msg.mChatType == CHAT_TYPE_DEBUG_MSG) +			return;//ok for now we don't skip messeges from object, so skip only debug messages  	}  	LLUUID id; @@ -351,7 +341,14 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg)  		notification["time"] = chat_msg.mTime;  		notification["source"] = (S32)chat_msg.mSourceType;  		notification["chat_type"] = (S32)chat_msg.mChatType; - +		 +		std::string r_color_name = "White"; +		F32 r_color_alpha = 1.0f;  +		LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha); +		 +		notification["text_color"] = r_color_name; +		notification["color_alpha"] = r_color_alpha; +		notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;  		channel->addNotification(notification);	  	} diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index 471dd28426..94e733913d 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -96,11 +96,11 @@ bool LLOfferHandler::processNotification(const LLSD& notify)  		if (!LLIMMgr::instance().hasSession(session_id))  		{  			session_id = LLIMMgr::instance().addSession( -					notification->getSubstitutions()["NAME"], IM_NOTHING_SPECIAL, +					notification->getSubstitutions()["OBJECTFROMNAME"], IM_NOTHING_SPECIAL,  					notification->getPayload()["from_id"]);  		}  		LLIMMgr::instance().addMessage(session_id, LLUUID(), -				notification->getSubstitutions()["NAME"], +				notification->getSubstitutions()["OBJECTFROMNAME"],  				notification->getMessage());  		LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification); diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index 823c92a94e..60a27d5154 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -91,6 +91,7 @@ bool LLTipHandler::processNotification(const LLSD& notify)  		if(nearby_chat)  		{  			LLChat chat_msg(notification->getMessage()); +			chat_msg.mSourceType = CHAT_SOURCE_SYSTEM;  			nearby_chat->addMessage(chat_msg);  			// don't show toast if Nearby Chat is opened diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index b2e05ccead..00502341fc 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -176,10 +176,8 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)  	getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(mAvatarID); -	// Fetch the currect name -	gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4)); - -	// Disable profile button if participant is not realy SL avatar +	// Disable most profile buttons if the participant is +	// not really an SL avatar (e.g., an Avaline caller).  	LLIMModel::LLIMSession* im_session =  		im_model.findIMSession(session_id);  	if( im_session && !im_session->mOtherParticipantIsAvatar ) @@ -190,6 +188,13 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)  		childSetEnabled("share_btn", FALSE);  		childSetEnabled("teleport_btn", FALSE);  		childSetEnabled("pay_btn", FALSE); + +        getChild<LLTextBox>("avatar_name")->setValue(im_session->mName);
 +	} +	else +	{ +		// If the participant is an avatar, fetch the currect name +		gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4));  	}  } diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp index 2cf56d5571..ad8a379cc1 100644 --- a/indra/newview/llpanelmediasettingsgeneral.cpp +++ b/indra/newview/llpanelmediasettingsgeneral.cpp @@ -322,13 +322,19 @@ void LLPanelMediaSettingsGeneral::updateMediaPreview()  {  	if ( mHomeURL->getValue().asString().length() > 0 )  	{ -		mPreviewMedia->navigateTo( mHomeURL->getValue().asString() ); +		if(mPreviewMedia->getCurrentNavUrl() != mHomeURL->getValue().asString()) +		{ +			mPreviewMedia->navigateTo( mHomeURL->getValue().asString() ); +		}  	}  	else  	// new home URL will be empty if media is deleted so display a   	// "preview goes here" data url page  	{ -		mPreviewMedia->navigateTo( CHECKERBOARD_DATA_URL ); +		if(mPreviewMedia->getCurrentNavUrl() != CHECKERBOARD_DATA_URL) +		{ +			mPreviewMedia->navigateTo( CHECKERBOARD_DATA_URL ); +		}  	};  } diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index a5e9407a41..b1fbf789c6 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -1570,6 +1570,7 @@ void LLPanelObjectInventory::reset()  	p.name = "task inventory";  	p.task_id = getTaskUUID();  	p.parent_panel = this; +	p.tool_tip= p.name;  	mFolders = LLUICtrlFactory::create<LLFolderView>(p);  	// this ensures that we never say "searching..." or "no items found"  	mFolders->getFilter()->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS); @@ -1711,6 +1712,7 @@ void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root  		p.icon_open = LLUI::getUIImage("Inv_FolderOpen");  		p.root = mFolders;  		p.listener = bridge; +		p.tool_tip = p.name;  		new_folder = LLUICtrlFactory::create<LLFolderViewFolder>(p);  		new_folder->addToFolder(mFolders, mFolders);  		new_folder->toggleOpen(); @@ -1751,6 +1753,7 @@ void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* invento  				p.icon_open = LLUI::getUIImage("Inv_FolderOpen");  				p.root = mFolders;  				p.listener = bridge; +				p.tool_tip = p.name;  				view = LLUICtrlFactory::create<LLFolderViewFolder>(p);  				child_categories.put(new obj_folder_pair(obj,  														 (LLFolderViewFolder*)view)); @@ -1764,6 +1767,7 @@ void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* invento  				params.root(mFolders);  				params.listener(bridge);  				params.rect(LLRect()); +				params.tool_tip = params.name;  				view = LLUICtrlFactory::create<LLFolderViewItem> (params);  			}  			view->addToFolder(folder, mFolders); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 69edccf09f..1f5ffb7335 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -520,7 +520,6 @@ BOOL LLPanelPeople::postBuild()  	LLPanel* groups_panel = getChild<LLPanel>(GROUP_TAB_NAME);  	groups_panel->childSetAction("activate_btn", boost::bind(&LLPanelPeople::onActivateButtonClicked,	this));  	groups_panel->childSetAction("plus_btn",	boost::bind(&LLPanelPeople::onGroupPlusButtonClicked,	this)); -	groups_panel->childSetAction("minus_btn",	boost::bind(&LLPanelPeople::onGroupMinusButtonClicked,	this));  	LLPanel* friends_panel = getChild<LLPanel>(FRIENDS_TAB_NAME);  	friends_panel->childSetAction("add_btn",	boost::bind(&LLPanelPeople::onAddFriendWizButtonClicked,	this)); @@ -569,6 +568,7 @@ BOOL LLPanelPeople::postBuild()  	LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;  	registrar.add("People.Group.Plus.Action",  boost::bind(&LLPanelPeople::onGroupPlusMenuItemClicked,  this, _2)); +	registrar.add("People.Group.Minus.Action", boost::bind(&LLPanelPeople::onGroupMinusButtonClicked,  this));  	registrar.add("People.Friends.ViewSort.Action",  boost::bind(&LLPanelPeople::onFriendsViewSortMenuItemClicked,  this, _2));  	registrar.add("People.Nearby.ViewSort.Action",  boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemClicked,  this, _2));  	registrar.add("People.Groups.ViewSort.Action",  boost::bind(&LLPanelPeople::onGroupsViewSortMenuItemClicked,  this, _2)); diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 24de2dcdfc..12ad070efd 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -44,6 +44,7 @@  #include "llbutton.h"  #include "llface.h"  #include "llcombobox.h" +#include "lllayoutstack.h"  #include "llslider.h"  #include "llhudview.h"  #include "lliconctrl.h" @@ -84,8 +85,7 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :  	mUpdateSlider(true),  	mClearFaceOnFade(false),  	mCurrentRate(0.0), -	mMovieDuration(0.0), -	mUpdatePercent(0) +	mMovieDuration(0.0)  {  	mCommitCallbackRegistrar.add("MediaCtrl.Close",		boost::bind(&LLPanelPrimMediaControls::onClickClose, this));  	mCommitCallbackRegistrar.add("MediaCtrl.Back",		boost::bind(&LLPanelPrimMediaControls::onClickBack, this)); @@ -117,37 +117,69 @@ LLPanelPrimMediaControls::~LLPanelPrimMediaControls()  BOOL LLPanelPrimMediaControls::postBuild()  { -	LLButton* scroll_up_ctrl = getChild<LLButton>("scrollup"); -	if (scroll_up_ctrl) +	mMediaRegion			= getChild<LLView>("media_region"); +	mBackCtrl				= getChild<LLUICtrl>("back"); +	mFwdCtrl				= getChild<LLUICtrl>("fwd"); +	mReloadCtrl				= getChild<LLUICtrl>("reload"); +	mPlayCtrl				= getChild<LLUICtrl>("play"); +	mPauseCtrl				= getChild<LLUICtrl>("pause"); +	mStopCtrl				= getChild<LLUICtrl>("stop"); +	mMediaStopCtrl			= getChild<LLUICtrl>("media_stop"); +	mHomeCtrl				= getChild<LLUICtrl>("home"); +	mUnzoomCtrl				= getChild<LLUICtrl>("close"); // This is actually "unzoom"  +	mOpenCtrl				= getChild<LLUICtrl>("new_window"); +	mZoomCtrl				= getChild<LLUICtrl>("zoom_frame"); +	mMediaProgressPanel		= getChild<LLPanel>("media_progress_indicator"); +	mMediaProgressBar		= getChild<LLProgressBar>("media_progress_bar"); +	mMediaAddressCtrl		= getChild<LLUICtrl>("media_address"); +	mMediaAddress			= getChild<LLUICtrl>("media_address_url"); +	mMediaPlaySliderPanel	= getChild<LLUICtrl>("media_play_position"); +	mMediaPlaySliderCtrl	= getChild<LLUICtrl>("media_play_slider"); +	mVolumeCtrl				= getChild<LLUICtrl>("media_volume"); +	mVolumeBtn				= getChild<LLButton>("media_volume_button"); +	mVolumeUpCtrl			= getChild<LLUICtrl>("volume_up"); +	mVolumeDownCtrl			= getChild<LLUICtrl>("volume_down"); +	mWhitelistIcon			= getChild<LLIconCtrl>("media_whitelist_flag"); +	mSecureLockIcon			= getChild<LLIconCtrl>("media_secure_lock_flag"); +	mMediaControlsStack		= getChild<LLLayoutStack>("media_controls"); +	mLeftBookend			= getChild<LLUICtrl>("left_bookend"); +	mRightBookend			= getChild<LLUICtrl>("right_bookend"); +	mBackgroundImage		= LLUI::getUIImage(getString("control_background_image_name")); + +	// These are currently removed...but getChild creates a "dummy" widget. +	// This class handles them missing. +	mMediaPanelScroll		= findChild<LLUICtrl>("media_panel_scroll"); +	mScrollUpCtrl			= findChild<LLButton>("scrollup"); +	mScrollLeftCtrl			= findChild<LLButton>("scrollleft"); +	mScrollRightCtrl		= findChild<LLButton>("scrollright"); +	mScrollDownCtrl			= findChild<LLButton>("scrolldown");	 +	 +	if (mScrollUpCtrl)  	{ -		scroll_up_ctrl->setClickedCallback(onScrollUp, this); -		scroll_up_ctrl->setHeldDownCallback(onScrollUpHeld, this); -		scroll_up_ctrl->setMouseUpCallback(onScrollStop, this); +		mScrollUpCtrl->setClickedCallback(onScrollUp, this); +		mScrollUpCtrl->setHeldDownCallback(onScrollUpHeld, this); +		mScrollUpCtrl->setMouseUpCallback(onScrollStop, this);  	} -	LLButton* scroll_left_ctrl = getChild<LLButton>("scrollleft"); -	if (scroll_left_ctrl) +	if (mScrollLeftCtrl)  	{ -		scroll_left_ctrl->setClickedCallback(onScrollLeft, this); -		scroll_left_ctrl->setHeldDownCallback(onScrollLeftHeld, this); -		scroll_left_ctrl->setMouseUpCallback(onScrollStop, this); +		mScrollLeftCtrl->setClickedCallback(onScrollLeft, this); +		mScrollLeftCtrl->setHeldDownCallback(onScrollLeftHeld, this); +		mScrollLeftCtrl->setMouseUpCallback(onScrollStop, this);  	} -	LLButton* scroll_right_ctrl = getChild<LLButton>("scrollright"); -	if (scroll_right_ctrl) +	if (mScrollRightCtrl)  	{ -		scroll_right_ctrl->setClickedCallback(onScrollRight, this); -		scroll_right_ctrl->setHeldDownCallback(onScrollRightHeld, this); -		scroll_right_ctrl->setMouseUpCallback(onScrollStop, this); +		mScrollRightCtrl->setClickedCallback(onScrollRight, this); +		mScrollRightCtrl->setHeldDownCallback(onScrollRightHeld, this); +		mScrollRightCtrl->setMouseUpCallback(onScrollStop, this);  	} -	LLButton* scroll_down_ctrl = getChild<LLButton>("scrolldown"); -	if (scroll_down_ctrl) +	if (mScrollDownCtrl)  	{ -		scroll_down_ctrl->setClickedCallback(onScrollDown, this); -		scroll_down_ctrl->setHeldDownCallback(onScrollDownHeld, this); -		scroll_down_ctrl->setMouseUpCallback(onScrollStop, this); +		mScrollDownCtrl->setClickedCallback(onScrollDown, this); +		mScrollDownCtrl->setHeldDownCallback(onScrollDownHeld, this); +		mScrollDownCtrl->setMouseUpCallback(onScrollStop, this);  	} -	LLUICtrl* media_address	= getChild<LLUICtrl>("media_address"); -	media_address->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this )); +	mMediaAddress->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this ));  	mInactiveTimeout = gSavedSettings.getF32("MediaControlTimeout");  	mControlFadeTime = gSavedSettings.getF32("MediaControlFadeTime"); @@ -261,90 +293,63 @@ void LLPanelPrimMediaControls::updateShape()  		//  		// Set the state of the buttons  		// -		LLUICtrl* back_ctrl					= getChild<LLUICtrl>("back"); -		LLUICtrl* fwd_ctrl					= getChild<LLUICtrl>("fwd"); -		LLUICtrl* reload_ctrl				= getChild<LLUICtrl>("reload"); -		LLUICtrl* play_ctrl					= getChild<LLUICtrl>("play"); -		LLUICtrl* pause_ctrl				= getChild<LLUICtrl>("pause"); -		LLUICtrl* stop_ctrl					= getChild<LLUICtrl>("stop"); -		LLUICtrl* media_stop_ctrl			= getChild<LLUICtrl>("media_stop"); -		LLUICtrl* home_ctrl					= getChild<LLUICtrl>("home"); -		LLUICtrl* unzoom_ctrl				= getChild<LLUICtrl>("close"); // This is actually "unzoom" -		LLUICtrl* open_ctrl					= getChild<LLUICtrl>("new_window"); -        LLUICtrl* zoom_ctrl					= getChild<LLUICtrl>("zoom_frame"); -		LLPanel* media_loading_panel		= getChild<LLPanel>("media_progress_indicator"); -		LLUICtrl* media_address_ctrl		= getChild<LLUICtrl>("media_address"); -		LLUICtrl* media_play_slider_panel	= getChild<LLUICtrl>("media_play_position"); -		LLUICtrl* media_play_slider_ctrl	= getChild<LLUICtrl>("media_play_slider"); -		LLUICtrl* volume_ctrl				= getChild<LLUICtrl>("media_volume"); -		LLButton* volume_btn				= getChild<LLButton>("media_volume_button"); -		LLUICtrl* volume_up_ctrl			= getChild<LLUICtrl>("volume_up"); -		LLUICtrl* volume_down_ctrl			= getChild<LLUICtrl>("volume_down"); -		LLIconCtrl* whitelist_icon			= getChild<LLIconCtrl>("media_whitelist_flag"); -		LLIconCtrl* secure_lock_icon		= getChild<LLIconCtrl>("media_secure_lock_flag"); -		 -		LLUICtrl* media_panel_scroll		= getChild<LLUICtrl>("media_panel_scroll"); -		LLUICtrl* scroll_up_ctrl			= getChild<LLUICtrl>("scrollup"); -		LLUICtrl* scroll_left_ctrl			= getChild<LLUICtrl>("scrollleft"); -		LLUICtrl* scroll_right_ctrl			= getChild<LLUICtrl>("scrollright"); -		LLUICtrl* scroll_down_ctrl			= getChild<LLUICtrl>("scrolldown");		  		// XXX RSP: TODO: FIXME: clean this up so that it is clearer what mode we are in,  		// and that only the proper controls get made visible/enabled according to that mode.  -		back_ctrl->setVisible(has_focus); -		fwd_ctrl->setVisible(has_focus); -		reload_ctrl->setVisible(has_focus); -		stop_ctrl->setVisible(false); -		home_ctrl->setVisible(has_focus); -		zoom_ctrl->setVisible(!is_zoomed); -		unzoom_ctrl->setVisible(has_focus && is_zoomed); -		open_ctrl->setVisible(true); -		media_address_ctrl->setVisible(has_focus && !mini_controls); -		media_play_slider_panel->setVisible(has_focus && !mini_controls); -		volume_ctrl->setVisible(false); -		volume_up_ctrl->setVisible(false); -		volume_down_ctrl->setVisible(false); +		mBackCtrl->setVisible(has_focus); +		mFwdCtrl->setVisible(has_focus); +		mReloadCtrl->setVisible(has_focus); +		mStopCtrl->setVisible(false); +		mHomeCtrl->setVisible(has_focus); +		mZoomCtrl->setVisible(!is_zoomed); +		mUnzoomCtrl->setVisible(has_focus && is_zoomed); +		mOpenCtrl->setVisible(true); +		mMediaAddressCtrl->setVisible(has_focus && !mini_controls); +		mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls); +		mVolumeCtrl->setVisible(false); +		mVolumeUpCtrl->setVisible(false); +		mVolumeDownCtrl->setVisible(false); -		whitelist_icon->setVisible(!mini_controls && (media_data)?media_data->getWhiteListEnable():false); +		mWhitelistIcon->setVisible(!mini_controls && (media_data)?media_data->getWhiteListEnable():false);  		// Disable zoom if HUD -		zoom_ctrl->setEnabled(!objectp->isHUDAttachment()); -		unzoom_ctrl->setEnabled(!objectp->isHUDAttachment()); -		secure_lock_icon->setVisible(false); +		mZoomCtrl->setEnabled(!objectp->isHUDAttachment()); +		mUnzoomCtrl->setEnabled(!objectp->isHUDAttachment()); +		mSecureLockIcon->setVisible(false);  		mCurrentURL = media_impl->getCurrentMediaURL(); -		back_ctrl->setEnabled((media_impl != NULL) && media_impl->canNavigateBack() && can_navigate); -		fwd_ctrl->setEnabled((media_impl != NULL) && media_impl->canNavigateForward() && can_navigate); -		stop_ctrl->setEnabled(has_focus && can_navigate); -		home_ctrl->setEnabled(has_focus && can_navigate); +		mBackCtrl->setEnabled((media_impl != NULL) && media_impl->canNavigateBack() && can_navigate); +		mFwdCtrl->setEnabled((media_impl != NULL) && media_impl->canNavigateForward() && can_navigate); +		mStopCtrl->setEnabled(has_focus && can_navigate); +		mHomeCtrl->setEnabled(has_focus && can_navigate);  		LLPluginClassMediaOwner::EMediaStatus result = ((media_impl != NULL) && media_impl->hasMedia()) ? media_plugin->getStatus() : LLPluginClassMediaOwner::MEDIA_NONE;  		if(media_plugin && media_plugin->pluginSupportsMediaTime())  		{ -			reload_ctrl->setEnabled(FALSE); -			reload_ctrl->setVisible(FALSE); -			media_stop_ctrl->setVisible(has_focus); -			home_ctrl->setVisible(FALSE); -			back_ctrl->setEnabled(has_focus); -			fwd_ctrl->setEnabled(has_focus); -			media_address_ctrl->setVisible(false); -			media_address_ctrl->setEnabled(false); -			media_play_slider_panel->setVisible(has_focus && !mini_controls); -			media_play_slider_panel->setEnabled(has_focus && !mini_controls); +			mReloadCtrl->setEnabled(FALSE); +			mReloadCtrl->setVisible(FALSE); +			mMediaStopCtrl->setVisible(has_focus); +			mHomeCtrl->setVisible(FALSE); +			mBackCtrl->setEnabled(has_focus); +			mFwdCtrl->setEnabled(has_focus); +			mMediaAddressCtrl->setVisible(false); +			mMediaAddressCtrl->setEnabled(false); +			mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls); +			mMediaPlaySliderPanel->setEnabled(has_focus && !mini_controls); -			volume_ctrl->setVisible(has_focus); -			volume_up_ctrl->setVisible(has_focus); -			volume_down_ctrl->setVisible(has_focus); -			volume_ctrl->setEnabled(has_focus); - -			whitelist_icon->setVisible(false); -			secure_lock_icon->setVisible(false); -			if (media_panel_scroll) +			mVolumeCtrl->setVisible(has_focus); +			mVolumeUpCtrl->setVisible(has_focus); +			mVolumeDownCtrl->setVisible(has_focus); +			mVolumeCtrl->setEnabled(has_focus); + +			mWhitelistIcon->setVisible(false); +			mSecureLockIcon->setVisible(false); +			if (mMediaPanelScroll)  			{ -				media_panel_scroll->setVisible(false); -				scroll_up_ctrl->setVisible(false); -				scroll_left_ctrl->setVisible(false); -				scroll_right_ctrl->setVisible(false); -				scroll_down_ctrl->setVisible(false); +				mMediaPanelScroll->setVisible(false); +				mScrollUpCtrl->setVisible(false); +				mScrollDownCtrl->setVisible(false); +				mScrollRightCtrl->setVisible(false); +				mScrollDownCtrl->setVisible(false);  			}  			F32 volume = media_impl->getVolume(); @@ -358,8 +363,8 @@ void LLPanelPrimMediaControls::updateShape()  			if(mMovieDuration == 0)   			{  				mMovieDuration = media_plugin->getDuration(); -				media_play_slider_ctrl->setValue(0); -				media_play_slider_ctrl->setEnabled(false); +				mMediaPlaySliderCtrl->setValue(0); +				mMediaPlaySliderCtrl->setEnabled(false);  			}  			// TODO: What if it's not fully loaded @@ -367,48 +372,48 @@ void LLPanelPrimMediaControls::updateShape()  			{  				F64 current_time =  media_plugin->getCurrentTime();  				F32 percent = current_time / mMovieDuration; -				media_play_slider_ctrl->setValue(percent); -				media_play_slider_ctrl->setEnabled(true); +				mMediaPlaySliderCtrl->setValue(percent); +				mMediaPlaySliderCtrl->setEnabled(true);  			}  			// video vloume  			if(volume <= 0.0)  			{ -				volume_up_ctrl->setEnabled(TRUE); -				volume_down_ctrl->setEnabled(FALSE); +				mVolumeUpCtrl->setEnabled(TRUE); +				mVolumeDownCtrl->setEnabled(FALSE);  				media_impl->setVolume(0.0); -				volume_btn->setToggleState(true); +				mVolumeBtn->setToggleState(true);  			}  			else if (volume >= 1.0)  			{ -				volume_up_ctrl->setEnabled(FALSE); -				volume_down_ctrl->setEnabled(TRUE); +				mVolumeUpCtrl->setEnabled(FALSE); +				mVolumeDownCtrl->setEnabled(TRUE);  				media_impl->setVolume(1.0); -				volume_btn->setToggleState(false); +				mVolumeBtn->setToggleState(false);  			}  			else  			{ -				volume_up_ctrl->setEnabled(TRUE); -				volume_down_ctrl->setEnabled(TRUE); +				mVolumeUpCtrl->setEnabled(TRUE); +				mVolumeDownCtrl->setEnabled(TRUE);  			}  			switch(result)  			{  				case LLPluginClassMediaOwner::MEDIA_PLAYING: -					play_ctrl->setEnabled(FALSE); -					play_ctrl->setVisible(FALSE); -					pause_ctrl->setEnabled(TRUE); -					pause_ctrl->setVisible(has_focus); -					media_stop_ctrl->setEnabled(TRUE); +					mPlayCtrl->setEnabled(FALSE); +					mPlayCtrl->setVisible(FALSE); +					mPauseCtrl->setEnabled(TRUE); +					mPauseCtrl->setVisible(has_focus); +					mMediaStopCtrl->setEnabled(TRUE);  					break;  				case LLPluginClassMediaOwner::MEDIA_PAUSED:  				default: -					pause_ctrl->setEnabled(FALSE); -					pause_ctrl->setVisible(FALSE); -					play_ctrl->setEnabled(TRUE); -					play_ctrl->setVisible(has_focus); -					media_stop_ctrl->setEnabled(FALSE); +					mPauseCtrl->setEnabled(FALSE); +					mPauseCtrl->setVisible(FALSE); +					mPlayCtrl->setEnabled(TRUE); +					mPlayCtrl->setVisible(has_focus); +					mMediaStopCtrl->setEnabled(FALSE);  					break;  			}  		} @@ -423,28 +428,28 @@ void LLPanelPrimMediaControls::updateShape()  				mCurrentURL.clear();  			} -			play_ctrl->setVisible(FALSE); -			pause_ctrl->setVisible(FALSE); -			media_stop_ctrl->setVisible(FALSE); -			media_address_ctrl->setVisible(has_focus && !mini_controls); -			media_address_ctrl->setEnabled(has_focus && !mini_controls); -			media_play_slider_panel->setVisible(FALSE); -			media_play_slider_panel->setEnabled(FALSE); +			mPlayCtrl->setVisible(FALSE); +			mPauseCtrl->setVisible(FALSE); +			mMediaStopCtrl->setVisible(FALSE); +			mMediaAddressCtrl->setVisible(has_focus && !mini_controls); +			mMediaAddressCtrl->setEnabled(has_focus && !mini_controls); +			mMediaPlaySliderPanel->setVisible(FALSE); +			mMediaPlaySliderPanel->setEnabled(FALSE); -			volume_ctrl->setVisible(FALSE); -			volume_up_ctrl->setVisible(FALSE); -			volume_down_ctrl->setVisible(FALSE); -			volume_ctrl->setEnabled(FALSE); -			volume_up_ctrl->setEnabled(FALSE); -			volume_down_ctrl->setEnabled(FALSE); +			mVolumeCtrl->setVisible(FALSE); +			mVolumeUpCtrl->setVisible(FALSE); +			mVolumeDownCtrl->setVisible(FALSE); +			mVolumeCtrl->setEnabled(FALSE); +			mVolumeUpCtrl->setEnabled(FALSE); +			mVolumeDownCtrl->setEnabled(FALSE); -			if (media_panel_scroll) +			if (mMediaPanelScroll)  			{ -				media_panel_scroll->setVisible(has_focus); -				scroll_up_ctrl->setVisible(has_focus); -				scroll_left_ctrl->setVisible(has_focus); -				scroll_right_ctrl->setVisible(has_focus); -				scroll_down_ctrl->setVisible(has_focus); +				mMediaPanelScroll->setVisible(has_focus); +				mScrollUpCtrl->setVisible(has_focus); +				mScrollDownCtrl->setVisible(has_focus); +				mScrollRightCtrl->setVisible(has_focus); +				mScrollDownCtrl->setVisible(has_focus);  			}  			// TODO: get the secure lock bool from media plug in  			std::string prefix =  std::string("https://"); @@ -452,7 +457,7 @@ void LLPanelPrimMediaControls::updateShape()  			LLStringUtil::toLower(test_prefix);  			if(test_prefix == prefix)  			{ -				secure_lock_icon->setVisible(has_focus); +				mSecureLockIcon->setVisible(has_focus);  			}  			if(mCurrentURL!=mPreviousURL) @@ -463,17 +468,17 @@ void LLPanelPrimMediaControls::updateShape()  			if(result == LLPluginClassMediaOwner::MEDIA_LOADING)  			{ -				reload_ctrl->setEnabled(FALSE); -				reload_ctrl->setVisible(FALSE); -				stop_ctrl->setEnabled(TRUE); -				stop_ctrl->setVisible(has_focus); +				mReloadCtrl->setEnabled(FALSE); +				mReloadCtrl->setVisible(FALSE); +				mStopCtrl->setEnabled(TRUE); +				mStopCtrl->setVisible(has_focus);  			}  			else  			{ -				reload_ctrl->setEnabled(TRUE); -				reload_ctrl->setVisible(has_focus); -				stop_ctrl->setEnabled(FALSE); -				stop_ctrl->setVisible(FALSE); +				mReloadCtrl->setEnabled(TRUE); +				mReloadCtrl->setVisible(has_focus); +				mStopCtrl->setEnabled(FALSE); +				mStopCtrl->setVisible(FALSE);  			}  		} @@ -483,16 +488,15 @@ void LLPanelPrimMediaControls::updateShape()  			//  			// Handle progress bar  			// -			mUpdatePercent = media_plugin->getProgressPercent(); -			if(mUpdatePercent<100.0f) -			{ -				media_loading_panel->setVisible(true); -				getChild<LLProgressBar>("media_progress_bar")->setPercent(mUpdatePercent); -				gFocusMgr.setTopCtrl(media_loading_panel); +			if(LLPluginClassMediaOwner::MEDIA_LOADING == media_plugin->getStatus()) +			{	 +				mMediaProgressPanel->setVisible(true); +				mMediaProgressBar->setPercent(media_plugin->getProgressPercent()); +				gFocusMgr.setTopCtrl(mMediaProgressPanel);  			}  			else  			{ -				media_loading_panel->setVisible(false); +				mMediaProgressPanel->setVisible(false);  				gFocusMgr.setTopCtrl(NULL);  			}  		} @@ -589,11 +593,10 @@ void LLPanelPrimMediaControls::updateShape()  		// grow panel so that screenspace bounding box fits inside "media_region" element of HUD  		LLRect media_controls_rect;  		getParent()->screenRectToLocal(LLRect(screen_min.mX, screen_max.mY, screen_max.mX, screen_min.mY), &media_controls_rect); -		LLView* media_region = getChild<LLView>("media_region"); -		media_controls_rect.mLeft -= media_region->getRect().mLeft; -		media_controls_rect.mBottom -= media_region->getRect().mBottom; -		media_controls_rect.mTop += getRect().getHeight() - media_region->getRect().mTop; -		media_controls_rect.mRight += getRect().getWidth() - media_region->getRect().mRight; +		media_controls_rect.mLeft -= mMediaRegion->getRect().mLeft; +		media_controls_rect.mBottom -= mMediaRegion->getRect().mBottom; +		media_controls_rect.mTop += getRect().getHeight() - mMediaRegion->getRect().mTop; +		media_controls_rect.mRight += getRect().getWidth() - mMediaRegion->getRect().mRight;  		LLRect old_hud_rect = media_controls_rect;  		// keep all parts of HUD on-screen @@ -669,6 +672,20 @@ void LLPanelPrimMediaControls::draw()  		}  	} +	// Build rect for icon area in coord system of this panel +	// Assumes layout_stack is a direct child of this panel +	mMediaControlsStack->updateLayout(); +	LLRect icon_area = mMediaControlsStack->getRect(); +	 +	// adjust to ignore space from left bookend padding +	icon_area.mLeft += mLeftBookend->getRect().getWidth(); +	 +	// ignore space from right bookend padding +	icon_area.mRight -= mRightBookend->getRect().getWidth(); +	 +	// get UI image +	mBackgroundImage->draw( icon_area, UI_VERTEX_COLOR % alpha); +	  	{  		LLViewDrawContext context(alpha);  		LLPanel::draw(); @@ -711,16 +728,12 @@ bool LLPanelPrimMediaControls::isMouseOver()  		S32 x, y;  		getWindow()->getCursorPosition(&cursor_pos_window);  		getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl); -		 -		LLView* controls_view = NULL; -		controls_view = getChild<LLView>("media_controls"); -		 -		//FIXME: rewrite as LLViewQuery or get hover set from LLViewerWindow? -		if(controls_view && controls_view->getVisible()) +				 +		if(mMediaControlsStack->getVisible())  		{ -			controls_view->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y); +			mMediaControlsStack->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y); -			LLView *hit_child = controls_view->childFromPoint(x, y); +			LLView *hit_child = mMediaControlsStack->childFromPoint(x, y);  			if(hit_child && hit_child->getVisible())  			{  				// This was useful for debugging both coordinate translation and view hieararchy problems... @@ -1002,8 +1015,7 @@ void LLPanelPrimMediaControls::onCommitURL()  {  	focusOnTarget(); -	LLUICtrl *media_address_ctrl = getChild<LLUICtrl>("media_address_url"); -	std::string url = media_address_ctrl->getValue().asString(); +	std::string url = mMediaAddress->getValue().asString();  	if(getTargetMediaImpl() && !url.empty())  	{  		getTargetMediaImpl()->navigateTo( url, "", true); @@ -1032,19 +1044,18 @@ void LLPanelPrimMediaControls::onInputURL(LLFocusableElement* caller, void *user  void LLPanelPrimMediaControls::setCurrentURL()  {	  #ifdef USE_COMBO_BOX_FOR_MEDIA_URL -	LLComboBox* media_address_combo	= getChild<LLComboBox>("media_address_combo"); -	// redirects will navigate momentarily to about:blank, don't add to history -	if (media_address_combo && mCurrentURL != "about:blank") -	{ -		media_address_combo->remove(mCurrentURL); -		media_address_combo->add(mCurrentURL, ADD_SORTED); -		media_address_combo->selectByValue(mCurrentURL); -	} +//	LLComboBox* media_address_combo	= getChild<LLComboBox>("media_address_combo"); +//	// redirects will navigate momentarily to about:blank, don't add to history +//	if (media_address_combo && mCurrentURL != "about:blank") +//	{ +//		media_address_combo->remove(mCurrentURL); +//		media_address_combo->add(mCurrentURL, ADD_SORTED); +//		media_address_combo->selectByValue(mCurrentURL); +//	}  #else   // USE_COMBO_BOX_FOR_MEDIA_URL -	LLLineEditor* media_address_url = getChild<LLLineEditor>("media_address_url"); -	if (media_address_url && mCurrentURL != "about:blank") +	if (mMediaAddress && mCurrentURL != "about:blank")  	{ -		media_address_url->setValue(mCurrentURL); +		mMediaAddress->setValue(mCurrentURL);  	}  #endif	// USE_COMBO_BOX_FOR_MEDIA_URL  } @@ -1053,12 +1064,11 @@ void LLPanelPrimMediaControls::onCommitSlider()  {  	focusOnTarget(); -	LLSlider* media_play_slider_ctrl	= getChild<LLSlider>("media_play_slider");  	LLViewerMediaImpl* media_impl = getTargetMediaImpl();  	if (media_impl)   	{  		// get slider value -		F64 slider_value = media_play_slider_ctrl->getValue().asReal(); +		F64 slider_value = mMediaPlaySliderCtrl->getValue().asReal();  		if(slider_value <= 0.0)  		{	  			media_impl->stop(); @@ -1087,7 +1097,7 @@ void LLPanelPrimMediaControls::onCommitVolumeUp()  		}  		media_impl->setVolume(volume); -		getChild<LLButton>("media_volume")->setToggleState(false); +		mVolumeBtn->setToggleState(false);  	}  }		 @@ -1107,7 +1117,7 @@ void LLPanelPrimMediaControls::onCommitVolumeDown()  		}  		media_impl->setVolume(volume); -		getChild<LLButton>("media_volume")->setToggleState(false); +		mVolumeBtn->setToggleState(false);  	}  }		 diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h index 3ec7aa2356..124fa9cce4 100644 --- a/indra/newview/llpanelprimmediacontrols.h +++ b/indra/newview/llpanelprimmediacontrols.h @@ -35,7 +35,11 @@  #include "llpanel.h"  #include "llviewermedia.h" +class LLButton;  class LLCoordWindow; +class LLIconCtrl; +class LLLayoutStack; +class LLProgressBar;  class LLViewerMediaImpl;  class LLPanelPrimMediaControls : public LLPanel @@ -119,6 +123,44 @@ private:  	LLViewerMediaImpl* getTargetMediaImpl();  	LLViewerObject* getTargetObject();  	LLPluginClassMedia* getTargetMediaPlugin(); +	 +private: +	 +	LLView *mMediaRegion; +	LLUICtrl *mBackCtrl; +	LLUICtrl *mFwdCtrl; +	LLUICtrl *mReloadCtrl; +	LLUICtrl *mPlayCtrl; +	LLUICtrl *mPauseCtrl; +	LLUICtrl *mStopCtrl; +	LLUICtrl *mMediaStopCtrl; +	LLUICtrl *mHomeCtrl; +	LLUICtrl *mUnzoomCtrl; +	LLUICtrl *mOpenCtrl; +	LLUICtrl *mZoomCtrl; +	LLPanel  *mMediaProgressPanel; +	LLProgressBar *mMediaProgressBar; +	LLUICtrl *mMediaAddressCtrl; +	LLUICtrl *mMediaAddress; +	LLUICtrl *mMediaPlaySliderPanel; +	LLUICtrl *mMediaPlaySliderCtrl; +	LLUICtrl *mVolumeCtrl; +	LLButton *mVolumeBtn; +	LLUICtrl *mVolumeUpCtrl; +	LLUICtrl *mVolumeDownCtrl; +	LLIconCtrl *mWhitelistIcon; +	LLIconCtrl *mSecureLockIcon; +	LLLayoutStack *mMediaControlsStack; +	LLUICtrl *mLeftBookend; +	LLUICtrl *mRightBookend; +	LLUIImage* mBackgroundImage; +	 +	LLUICtrl *mMediaPanelScroll; +	LLButton *mScrollUpCtrl; +	LLButton *mScrollLeftCtrl; +	LLButton *mScrollRightCtrl; +	LLButton *mScrollDownCtrl; +	  	bool mPauseFadeout;  	bool mUpdateSlider;  	bool mClearFaceOnFade; @@ -137,8 +179,7 @@ private:  	std::string mPreviousURL;  	F64 mCurrentRate;  	F64 mMovieDuration; -	int mUpdatePercent; - +	  	LLUUID mTargetObjectID;  	S32 mTargetObjectFace;  	LLUUID mTargetImplID; diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index f5367c0477..13bd059d45 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -130,6 +130,7 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)  				{  					name.erase(found, moderator_indicator_len);  					item->setName(name); +					item->reshapeAvatarName();  				}  			}  		} @@ -151,6 +152,7 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)  					name += " ";  					name += moderator_indicator;  					item->setName(name); +					item->reshapeAvatarName();  				}  			}  		} diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index b667fbf5fd..81eb133b07 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -63,7 +63,7 @@ LLScreenChannelBase::LLScreenChannelBase(const LLUUID& id) :  												,mCanStoreToasts(true)  												,mHiddenToastsNum(0)  												,mOverflowToastHidden(false) -												,mIsHovering(false) +												,mHoveredToast(NULL)  												,mControlHovering(false)  												,mShowToasts(true)  {	 @@ -216,8 +216,10 @@ void LLScreenChannel::deleteToast(LLToast* toast)  	// update channel's Hovering state  	// turning hovering off manually because onMouseLeave won't happen if a toast was closed using a keyboard -	if(toast->hasFocus()) -		setHovering(false); +	if(mHoveredToast == toast) +	{ +		mHoveredToast  = NULL; +	}  	// close the toast  	toast->closeFloater(); @@ -352,7 +354,7 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)  //--------------------------------------------------------------------------  void LLScreenChannel::redrawToasts()  { -	if(mToastList.size() == 0 || mIsHovering) +	if(mToastList.size() == 0 || isHovering())  		return;  	hideToastsFromScreen(); @@ -453,10 +455,9 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)  	if(!mOverflowToastPanel)  		return; -	mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::closeOverflowToastPanel, this)); +	mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onOverflowToastHide, this));  	LLTextBox* text_box = mOverflowToastPanel->getChild<LLTextBox>("toast_text"); -	LLIconCtrl* icon = mOverflowToastPanel->getChild<LLIconCtrl>("icon");  	std::string	text = llformat(mOverflowFormatString.c_str(),mHiddenToastsNum);  	if(mHiddenToastsNum == 1)  	{ @@ -474,7 +475,6 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)  	text_box->setValue(text);  	text_box->setVisible(TRUE); -	icon->setVisible(TRUE);  	mOverflowToastPanel->setVisible(TRUE);  } @@ -532,7 +532,6 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)  	mStartUpToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onStartUpToastHide, this));  	LLTextBox* text_box = mStartUpToastPanel->getChild<LLTextBox>("toast_text"); -	LLIconCtrl* icon = mStartUpToastPanel->getChild<LLIconCtrl>("icon");  	std::string mStartUpFormatString; @@ -555,8 +554,6 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)  	text_box->setValue(text);  	text_box->setVisible(TRUE); -	icon->setVisible(TRUE); -  	addChild(mStartUpToastPanel);  	mStartUpToastPanel->setVisible(TRUE); @@ -654,7 +651,14 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)  	// we must check this to prevent incorrect setting for hovering in a channel  	std::map<LLToast*, bool>::iterator it_first, it_second;  	S32 stack_size = mToastEventStack.size(); -	mIsHovering = mouse_enter; +	if(mouse_enter) +	{ +		mHoveredToast = toast; +	} +	else +	{ +		mHoveredToast = NULL; +	}  	switch(stack_size)  	{ @@ -666,7 +670,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)  		if((*it_first).second && !mouse_enter && ((*it_first).first != toast) )  		{  			mToastEventStack.clear(); -			mIsHovering = true; +			mHoveredToast = toast;  		}  		else  		{ @@ -678,7 +682,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)  		LL_ERRS ("LLScreenChannel::onToastHover: stack size error " ) << stack_size << llendl;  	} -	if(!mIsHovering) +	if(!isHovering())  		redrawToasts();  } diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h index fd31690622..f39b94b89d 100644 --- a/indra/newview/llscreenchannel.h +++ b/indra/newview/llscreenchannel.h @@ -93,9 +93,10 @@ public:  	// Channel's behavior-functions  	// set whether a channel will control hovering inside itself or not  	virtual void setControlHovering(bool control) { mControlHovering = control; } -	// set Hovering flag for a channel -	virtual void setHovering(bool hovering) { mIsHovering = hovering; } + +	bool isHovering() { return mHoveredToast != NULL; } +  	void setCanStoreToasts(bool store) { mCanStoreToasts = store; }  	void setDisplayToastsAlways(bool display_toasts) { mDisplayToastsAlways = display_toasts; } @@ -117,7 +118,7 @@ public:  protected:  	// Channel's flags  	bool		mControlHovering; -	bool		mIsHovering; +	LLToast*		mHoveredToast;  	bool		mCanStoreToasts;  	bool		mDisplayToastsAlways;  	bool		mOverflowToastHidden; diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 8c5439d47e..6ca6734598 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -435,7 +435,7 @@ void LLSpatialGroup::clearDrawMap()  BOOL LLSpatialGroup::isRecentlyVisible() const  { -	return (LLDrawable::getCurrentFrame() - (S32)mVisible) < LLDrawable::getMinVisFrameRange() ; +	return (LLDrawable::getCurrentFrame() - mVisible[LLViewerCamera::sCurCameraID]) < LLDrawable::getMinVisFrameRange() ;  }  BOOL LLSpatialGroup::isVisible() const diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 2ed82b7d62..261bdbcfc0 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -359,6 +359,9 @@ void LLSpeakerMgr::updateSpeakerList()  LLPointer<LLSpeaker> LLSpeakerMgr::findSpeaker(const LLUUID& speaker_id)  { +	//In some conditions map causes crash if it is empty(Windows only), adding check (EK) +	if (mSpeakers.size() == 0) +		return NULL;  	speaker_map_t::iterator found_it = mSpeakers.find(speaker_id);  	if (found_it == mSpeakers.end())  	{ diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 84371b75cd..d36ff1605e 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -873,6 +873,9 @@ bool idle_startup()  		gViewerWindow->getWindow()->show();  		display_startup(); +		//DEV-10530.  do cleanup.  remove at some later date.  jan-2009 +		LLFloaterPreference::cleanupBadSetting(); +  		// DEV-16927.  The following code removes errant keystrokes that happen while the window is being   		// first made visible.  #ifdef _WIN32 @@ -1688,8 +1691,11 @@ bool idle_startup()  		//all categories loaded. lets create "My Favorites" category  		gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true); -		// lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" and fill it with buddies -		LLFriendCardsManager::instance().syncFriendsFolder(); +		// Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder, +		// fetches their contents if needed and synchronizes it with buddies list. +		// If the folders are not found they are created. +		LLFriendCardsManager::instance().syncFriendCardsFolders(); +  		// set up callbacks  		llinfos << "Registering Callbacks" << llendl; @@ -1900,9 +1906,6 @@ bool idle_startup()          //DEV-17797.  get null folder.  Any items found here moved to Lost and Found          LLInventoryModel::findLostItems(); -		//DEV-10530.  do cleanup.  remove at some later date.  jan-2009 -		LLFloaterPreference::cleanupBadSetting(); -  		LLStartUp::setStartupState( STATE_PRECACHE );  		timeout.reset();  		return FALSE; diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 4dccdfd7e6..b649a0c38e 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -109,6 +109,7 @@ const S32 TEXT_HEIGHT = 18;  static void onClickBuyCurrency(void*);  static void onClickHealth(void*);  static void onClickScriptDebug(void*); +static void onClickVolume(void*);  std::vector<std::string> LLStatusBar::sDays;  std::vector<std::string> LLStatusBar::sMonths; @@ -116,6 +117,12 @@ const U32 LLStatusBar::MAX_DATE_STRING_LENGTH = 2000;  LLStatusBar::LLStatusBar(const LLRect& rect)  :	LLPanel(), +	mTextHealth(NULL), +	mTextTime(NULL), +	mSGBandwidth(NULL), +	mSGPacketLoss(NULL), +	mBtnBuyCurrency(NULL), +	mBtnVolume(NULL),  	mBalance(0),  	mHealth(100),  	mSquareMetersCredit(0), @@ -148,6 +155,11 @@ LLStatusBar::LLStatusBar(const LLRect& rect)  	mBtnBuyCurrency = getChild<LLButton>( "buycurrency" );  	mBtnBuyCurrency->setClickedCallback( onClickBuyCurrency, this ); +	mBtnVolume = getChild<LLButton>( "volume_btn" ); +	mBtnVolume->setClickedCallback( onClickVolume, this ); + +	gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2)); +  	childSetAction("scriptout", onClickScriptDebug, this);  	childSetAction("health", onClickHealth, this); @@ -333,6 +345,10 @@ void LLStatusBar::refresh()  	mSGBandwidth->setVisible(net_stats_visible);  	mSGPacketLoss->setVisible(net_stats_visible);  	childSetEnabled("stat_btn", net_stats_visible); + +	// update the master volume button state +	BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); +	mBtnVolume->setToggleState(mute_audio);  }  void LLStatusBar::setVisibleForMouselook(bool visible) @@ -488,6 +504,13 @@ static void onClickScriptDebug(void*)  	LLFloaterScriptDebug::show(LLUUID::null);  } +static void onClickVolume(void* data) +{ +	// toggle the master mute setting +	BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); +	gSavedSettings.setBOOL("MuteAudio", !mute_audio); +} +  // sets the static variables necessary for the date  void LLStatusBar::setupDate()  { @@ -562,6 +585,10 @@ BOOL can_afford_transaction(S32 cost)  	return((cost <= 0)||((gStatusBar) && (gStatusBar->getBalance() >=cost)));  } +void LLStatusBar::onVolumeChanged(const LLSD& newvalue) +{ +	refresh(); +}  // Implements secondlife:///app/balance/request to request a L$ balance  // update via UDP message system. JC diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h index d5629e6f1e..3ce3549961 100644 --- a/indra/newview/llstatusbar.h +++ b/indra/newview/llstatusbar.h @@ -91,9 +91,10 @@ private:  	// simple method to setup the part that holds the date  	void setupDate(); -	static void onCommitSearch(LLUICtrl*, void* data); -	static void onClickSearch(void* data); +	void onVolumeChanged(const LLSD& newvalue); +  	static void onClickStatGraph(void* data); +	  private:  	LLTextBox	*mTextHealth; @@ -103,6 +104,7 @@ private:  	LLStatGraph *mSGPacketLoss;  	LLButton	*mBtnBuyCurrency; +	LLButton	*mBtnVolume;  	S32				mBalance;  	S32				mHealth; diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index 4422c4b672..2fb6550107 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -501,14 +501,14 @@ LLSysWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&  	switch (im_chiclet_type)  	{  	case LLIMChiclet::TYPE_GROUP: +		mChiclet = getChild<LLIMGroupChiclet>("group_chiclet"); +		break;  	case LLIMChiclet::TYPE_AD_HOC: -		mChiclet = getChild<LLIMChiclet>("group_chiclet"); -		childSetVisible("p2p_chiclet", false); +		mChiclet = getChild<LLAdHocChiclet>("adhoc_chiclet");		  		break;  	case LLIMChiclet::TYPE_UNKNOWN: // assign mChiclet a non-null value anyway  	case LLIMChiclet::TYPE_IM: -		mChiclet = getChild<LLIMChiclet>("p2p_chiclet"); -		childSetVisible("group_chiclet", false); +		mChiclet = getChild<LLIMP2PChiclet>("p2p_chiclet");  		break;  	} @@ -517,6 +517,7 @@ LLSysWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&  	mChiclet->setSessionId(sessionId);  	mChiclet->setIMSessionName(name);  	mChiclet->setOtherParticipantId(otherParticipantId); +	mChiclet->setVisible(true);  	LLTextBox* contactName = getChild<LLTextBox>("contact_name");  	contactName->setValue(name); diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp index 9370e318cf..1ea5f515b7 100644 --- a/indra/newview/lltoastimpanel.cpp +++ b/indra/newview/lltoastimpanel.cpp @@ -69,7 +69,7 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) :	LLToastPanel(p.notif  	mNotification = p.notification;  	// if message comes from the system - there shouldn't be a reply btn -	if(p.from == "Second Life") +	if(p.from == SYSTEM_FROM)  	{  		mAvatar->setVisible(FALSE);  		sys_msg_icon->setVisible(TRUE); diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp new file mode 100644 index 0000000000..d65a060bbc --- /dev/null +++ b/indra/newview/llviewerchat.cpp @@ -0,0 +1,203 @@ +/**  + * @file llviewerchat.cpp + * @brief Builds menus out of items. + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + *  + * Copyright (c) 2002-2009, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llviewerchat.h"  + +// newview includes +#include "llagent.h" 	// gAgent		 +#include "lluicolortable.h" +#include "llviewercontrol.h" // gSavedSettings + +// LLViewerChat + +//static  +void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color) +{ +	if(chat.mMuted) +	{ +		r_color= LLUIColorTable::instance().getColor("LtGray"); +	} +	else +	{ +		switch(chat.mSourceType) +		{ +			case CHAT_SOURCE_SYSTEM: +				r_color = LLUIColorTable::instance().getColor("SystemChatColor");  +				break; +			case CHAT_SOURCE_AGENT: +				if (chat.mFromID.isNull()) +				{ +					r_color = LLUIColorTable::instance().getColor("SystemChatColor"); +				} +				else +				{ +					if(gAgentID == chat.mFromID) +					{ +						r_color = LLUIColorTable::instance().getColor("UserChatColor"); +					} +					else +					{ +						r_color = LLUIColorTable::instance().getColor("AgentChatColor"); +					} +				} +				break; +			case CHAT_SOURCE_OBJECT: +				if (chat.mChatType == CHAT_TYPE_DEBUG_MSG) +				{ +					r_color = LLUIColorTable::instance().getColor("ScriptErrorColor"); +				} +				else if ( chat.mChatType == CHAT_TYPE_OWNER ) +				{ +					r_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor"); +				} +				else +				{ +					r_color = LLUIColorTable::instance().getColor("ObjectChatColor"); +				} +				break; +			default: +				r_color.setToWhite(); +		} +		 +		if (!chat.mPosAgent.isExactlyZero()) +		{ +			LLVector3 pos_agent = gAgent.getPositionAgent(); +			F32 distance = dist_vec(pos_agent, chat.mPosAgent); +			if (distance > gAgent.getNearChatRadius()) +			{ +				// diminish far-off chat +				r_color.mV[VALPHA] = 0.8f; +			} +		} +	} +} + + +//static  +void LLViewerChat::getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha) +{ +	if(chat.mMuted) +	{ +		r_color_name = "LtGray"; +	} +	else +	{ +		switch(chat.mSourceType) +		{ +			case CHAT_SOURCE_SYSTEM: +				r_color_name = "SystemChatColor"; +				break; +				 +			case CHAT_SOURCE_AGENT: +				if (chat.mFromID.isNull()) +				{ +					r_color_name = "SystemChatColor"; +				} +				else +				{ +					if(gAgentID == chat.mFromID) +					{ +						r_color_name = "UserChatColor"; +					} +					else +					{ +						r_color_name = "AgentChatColor"; +					} +				} +				break; +				 +			case CHAT_SOURCE_OBJECT: +				if (chat.mChatType == CHAT_TYPE_DEBUG_MSG) +				{ +					r_color_name = "ScriptErrorColor"; +				} +				else if ( chat.mChatType == CHAT_TYPE_OWNER ) +				{ +					r_color_name = "llOwnerSayChatColor"; +				} +				else +				{ +					r_color_name = "ObjectChatColor"; +				} +				break; +			default: +				r_color_name = "White"; +		} +		 +		if (!chat.mPosAgent.isExactlyZero()) +		{ +			LLVector3 pos_agent = gAgent.getPositionAgent(); +			F32 distance = dist_vec(pos_agent, chat.mPosAgent); +			if (distance > gAgent.getNearChatRadius()) +			{ +				// diminish far-off chat +				r_color_alpha = 0.8f;  +			} +			else +			{ +				r_color_alpha = 1.0f; +			} +		} +	} +	 +} + + +//static  +LLFontGL* LLViewerChat::getChatFont() +{ +	S32 font_size = gSavedSettings.getS32("ChatFontSize"); +	LLFontGL* fontp = NULL; +	switch(font_size) +	{ +		case 0: +			fontp = LLFontGL::getFontSansSerifSmall(); +			break; +		default: +		case 1: +			fontp = LLFontGL::getFontSansSerif(); +			break; +		case 2: +			fontp = LLFontGL::getFontSansSerifBig(); +			break; +	} +	 +	return fontp; +	 +} + +//static +S32 LLViewerChat::getChatFontSize() +{ +	return gSavedSettings.getS32("ChatFontSize"); +} diff --git a/indra/newview/llviewerchat.h b/indra/newview/llviewerchat.h new file mode 100644 index 0000000000..d8840d5dd2 --- /dev/null +++ b/indra/newview/llviewerchat.h @@ -0,0 +1,53 @@ +/**  + * @file llviewerchat.h + * @brief wrapper of LLChat in viewer + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + *  + * Copyright (c) 2002-2009, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLVIEWERCHAT_H +#define LL_LLVIEWERCHAT_H + +#include "llchat.h" +#include "llfontgl.h" +#include "v4color.h" + + +class LLViewerChat  +{ +public: +	static void getChatColor(const LLChat& chat, LLColor4& r_color); +	static void getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha); +	static LLFontGL* getChatFont(); +	static S32 getChatFontSize(); +	 + + +}; + +#endif diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 493457704b..251d7d4a13 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -54,6 +54,8 @@  #include <boost/bind.hpp>	// for SkinFolder listener  #include <boost/signals2.hpp> +/*static*/ const char* LLViewerMedia::AUTO_PLAY_MEDIA_SETTING = "AutoPlayMedia"; +  // Move this to its own file.  LLViewerMediaEventEmitter::~LLViewerMediaEventEmitter() @@ -135,9 +137,19 @@ public:  	LLMimeDiscoveryResponder( viewer_media_t media_impl)  		: mMediaImpl(media_impl),  		  mInitialized(false) -	{} - +	{ +		if(mMediaImpl->mMimeTypeProbe != NULL) +		{ +			llerrs << "impl already has an outstanding responder" << llendl; +		} +		 +		mMediaImpl->mMimeTypeProbe = this; +	} +	~LLMimeDiscoveryResponder() +	{ +		disconnectOwner(); +	}  	virtual void completedHeader(U32 status, const std::string& reason, const LLSD& content)  	{ @@ -149,23 +161,63 @@ public:  	virtual void error( U32 status, const std::string& reason )  	{ -		// completeAny(status, "none/none"); +		if(status == 401) +		{ +			// This is the "you need to authenticate" status.   +			// Treat this like an html page. +			completeAny(status, "text/html"); +		} +		else +		{ +			llwarns << "responder failed with status " << status << ", reason " << reason << llendl; +		 +			if(mMediaImpl) +			{ +				mMediaImpl->mMediaSourceFailed = true; +			} +		}  	}  	void completeAny(U32 status, const std::string& mime_type)  	{ -		if(!mInitialized && ! mime_type.empty()) +		// the call to initializeMedia may disconnect the responder, which will clear mMediaImpl. +		// Make a local copy so we can call loadURI() afterwards. +		LLViewerMediaImpl *impl = mMediaImpl; +		 +		if(impl && !mInitialized && ! mime_type.empty())  		{ -			if(mMediaImpl->initializeMedia(mime_type)) +			if(impl->initializeMedia(mime_type))  			{  				mInitialized = true; -				mMediaImpl->loadURI(); +				impl->loadURI(); +				disconnectOwner();  			}  		}  	} +	 +	void cancelRequest() +	{ +		disconnectOwner(); +	} +	 +private: +	void disconnectOwner() +	{ +		if(mMediaImpl) +		{ +			if(mMediaImpl->mMimeTypeProbe != this) +			{ +				llerrs << "internal error: mMediaImpl->mMimeTypeProbe != this" << llendl; +			} -	public: -		viewer_media_t mMediaImpl; +			mMediaImpl->mMimeTypeProbe = NULL; +		} +		mMediaImpl = NULL; +	} +	 +	 +public: +		LLViewerMediaImpl *mMediaImpl;  		bool mInitialized;  };  static LLViewerMedia::impl_list sViewerMediaImplList; @@ -272,7 +324,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s  			// If (the media was already loaded OR the media was set to autoplay) AND this update didn't come from this agent,  			// do a navigate. -			if((was_loaded || (media_entry->getAutoPlay() && gSavedSettings.getBOOL("AutoPlayMedia"))) && !update_from_self) +			if((was_loaded || (media_entry->getAutoPlay() && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING))) && !update_from_self)  			{  				needs_navigate = (media_entry->getCurrentURL() != previous_url);  			} @@ -289,7 +341,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s  		media_impl->setHomeURL(media_entry->getHomeURL()); -		if(media_entry->getAutoPlay() && gSavedSettings.getBOOL("AutoPlayMedia")) +		if(media_entry->getAutoPlay() && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING))  		{  			needs_navigate = true;  		} @@ -708,6 +760,7 @@ LLViewerMediaImpl::LLViewerMediaImpl(	  const LLUUID& texture_id,  	mIsDisabled(false),  	mIsParcelMedia(false),  	mProximity(-1), +	mMimeTypeProbe(NULL),  	mIsUpdated(false)  {  @@ -811,7 +864,9 @@ void LLViewerMediaImpl::destroyMediaSource()  	{  		oldImage->setPlaying(FALSE) ;  	} - +	 +	cancelMimeTypeProbe(); +	  	if(mMediaSource)  	{  		delete mMediaSource; @@ -1316,6 +1371,8 @@ void LLViewerMediaImpl::unload()  //////////////////////////////////////////////////////////////////////////////////////////  void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mime_type,  bool rediscover_type, bool server_request)  { +	cancelMimeTypeProbe(); +  	if(mMediaURL != url)  	{  		// Don't carry media play state across distinct URLs. @@ -1358,6 +1415,12 @@ void LLViewerMediaImpl::navigateInternal()  	// Helpful to have media urls in log file. Shouldn't be spammy.  	llinfos << "media id= " << mTextureId << " url=" << mMediaURL << " mime_type=" << mMimeType << llendl; +	if(mMimeTypeProbe != NULL) +	{ +		llwarns << "MIME type probe already in progress -- bailing out." << llendl; +		return; +	} +	  	if(mNavigateServerRequest)  	{  		setNavState(MEDIANAVSTATE_SERVER_SENT); @@ -1390,7 +1453,7 @@ void LLViewerMediaImpl::navigateInternal()  		if(scheme.empty() || "http" == scheme || "https" == scheme)  		{ -			LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this)); +			LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this), 10.0f);  		}  		else if("data" == scheme || "file" == scheme || "about" == scheme)  		{ @@ -1521,7 +1584,15 @@ void LLViewerMediaImpl::update()  {  	if(mMediaSource == NULL)  	{ -		if(mPriority != LLPluginClassMedia::PRIORITY_UNLOADED) +		if(mPriority == LLPluginClassMedia::PRIORITY_UNLOADED) +		{ +			// This media source should not be loaded. +		} +		else if(mMimeTypeProbe != NULL) +		{ +			// this media source is doing a MIME type probe -- don't try loading it again. +		} +		else  		{  			// This media may need to be loaded.  			if(sMediaCreateTimer.hasExpired()) @@ -1644,7 +1715,7 @@ LLViewerMediaTexture* LLViewerMediaImpl::updatePlaceholderImage()  		// MEDIAOPT: seems insane that we actually have to make an imageraw then  		// immediately discard it  		LLPointer<LLImageRaw> raw = new LLImageRaw(texture_width, texture_height, texture_depth); -		raw->clear(0x0f, 0x0f, 0x0f, 0xff); +		raw->clear(0x00, 0x00, 0x00, 0xff);  		int discard_level = 0;  		// ask media source for correct GL image format constants @@ -2120,6 +2191,21 @@ void LLViewerMediaImpl::setNavState(EMediaNavState state)  	}  } +void LLViewerMediaImpl::cancelMimeTypeProbe() +{ +	if(mMimeTypeProbe != NULL) +	{ +		// There doesn't seem to be a way to actually cancel an outstanding request. +		// Simulate it by telling the LLMimeDiscoveryResponder not to write back any results. +		mMimeTypeProbe->cancelRequest(); +		 +		// The above should already have set mMimeTypeProbe to NULL. +		if(mMimeTypeProbe != NULL) +		{ +			llerrs << "internal error: mMimeTypeProbe is not NULL after cancelling request." << llendl; +		} +	} +}  void LLViewerMediaImpl::addObject(LLVOVolume* obj)   { diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 3f5f3ca746..639aed4b8a 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -48,6 +48,7 @@ class LLUUID;  class LLViewerMediaTexture;  class LLMediaEntry;  class LLVOVolume ; +class LLMimeDiscoveryResponder;  typedef LLPointer<LLViewerMediaImpl> viewer_media_t;  /////////////////////////////////////////////////////////////////////////////// @@ -73,6 +74,9 @@ class LLViewerMedia  	LOG_CLASS(LLViewerMedia);  	public: +		// String to get/set media autoplay in gSavedSettings +		static const char *AUTO_PLAY_MEDIA_SETTING; +	  		typedef std::vector<LLViewerMediaImpl*> impl_list;  		// Special case early init for just web browser component @@ -294,6 +298,7 @@ public:  	EMediaNavState getNavState() { return mMediaNavState; }  	void setNavState(EMediaNavState state); +	void cancelMimeTypeProbe();  public:  	// a single media url with some data and an impl.  	LLPluginClassMedia* mMediaSource; @@ -331,7 +336,8 @@ public:  	bool mIsDisabled;  	bool mIsParcelMedia;  	S32 mProximity; - +	LLMimeDiscoveryResponder *mMimeTypeProbe; +	  private:  	BOOL mIsUpdated ;  	std::list< LLVOVolume* > mObjectList ; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 7f25e567d0..0153116887 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -43,7 +43,7 @@  #include "llfloaterbump.h"  #include "llassetstorage.h"  #include "llcachename.h" -#include "llchat.h" +  #include "lldbstrings.h"  #include "lleconomy.h"  #include "llfilepicker.h" @@ -116,6 +116,7 @@  #include "llui.h"			// for make_ui_sound  #include "lluploaddialog.h"  #include "llviewercamera.h" +#include "llviewerchat.h"  #include "llviewergenericmessage.h"  #include "llviewerinventory.h"  #include "llviewermenu.h" @@ -1366,7 +1367,9 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)  	payload["from_id"] = info->mFromID;  	args["OBJECTFROMNAME"] = info->mFromName; -	args["NAME"] = info->mFromName; +	args["NAME"] = LLSLURL::buildCommand("agent", info->mFromID, "about"); +	std::string verb = "highlight?name=" + msg; +	args["ITEM_SLURL"] = LLSLURL::buildCommand("inventory", info->mObjectID, verb.c_str());  	LLNotification::Params p("ObjectGiveItem");  	p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2)); @@ -2249,7 +2252,7 @@ void process_decline_callingcard(LLMessageSystem* msg, void**)  void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  { -	LLChat		chat; +	LLChat	chat;  	std::string		mesg;  	std::string		from_name;  	U8			source_temp; @@ -2849,7 +2852,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)  			// Chat the "back" SLURL. (DEV-4907)  			LLChat chat("Teleport completed from " + gAgent.getTeleportSourceSLURL());  			chat.mSourceType = CHAT_SOURCE_SYSTEM; - 			LLFloaterChat::addChatHistory(chat); + 		    LLFloaterChat::addChatHistory(chat);  			// Set the new position  			avatarp->setPositionAgent(agent_pos); @@ -4621,7 +4624,7 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp  		if (caution)  		{  			LLChat chat(notice.getString()); -			LLFloaterChat::addChat(chat, FALSE, FALSE); +	//		LLFloaterChat::addChat(chat, FALSE, FALSE);  		}  	}  } diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index 336d7f684e..7559fd8e72 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -324,10 +324,36 @@ std::string LLViewerParcelMedia::getMimeType()  {  	return sMediaImpl.notNull() ? sMediaImpl->getMimeType() : "none/none";  } + +//static  +std::string LLViewerParcelMedia::getURL() +{ +	std::string url; +	if(sMediaImpl.notNull()) +		url = sMediaImpl->getMediaURL(); +	 +	if (url.empty()) +		url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaCurrentURL(); +	 +	if (url.empty()) +		url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaURL(); +	 +	return url; +} + +//static  +std::string LLViewerParcelMedia::getName() +{ +	if(sMediaImpl.notNull()) +		return sMediaImpl->getName(); +	return ""; +} +  viewer_media_t LLViewerParcelMedia::getParcelMedia()  {  	return sMediaImpl;  } +  //////////////////////////////////////////////////////////////////////////////////////////  // static  void LLViewerParcelMedia::processParcelMediaCommandMessage( LLMessageSystem *msg, void ** ) diff --git a/indra/newview/llviewerparcelmedia.h b/indra/newview/llviewerparcelmedia.h index 3f7f898356..19e1ef78d4 100644 --- a/indra/newview/llviewerparcelmedia.h +++ b/indra/newview/llviewerparcelmedia.h @@ -71,6 +71,8 @@ class LLViewerParcelMedia : public LLViewerMediaObserver  		static LLPluginClassMediaOwner::EMediaStatus getStatus();  		static std::string getMimeType(); +		static std::string getURL(); +		static std::string getName();  		static viewer_media_t getParcelMedia();  		static void processParcelMediaCommandMessage( LLMessageSystem *msg, void ** ); diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 9923c9ac74..85bc26c9c0 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -206,33 +206,31 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 wid  LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(  	                                               const LLUUID &image_id,											         												   BOOL usemipmaps, -												   S32 boost_priority, +												   LLViewerTexture::EBoostLevel boost_priority,  												   S8 texture_type,  												   LLGLint internal_format,  												   LLGLenum primary_format,  												   LLHost request_from_host)  { -	llassert_always(boost_priority >= LLViewerTexture::BOOST_NONE) ;  	return gTextureList.getImage(image_id, usemipmaps, boost_priority, texture_type, internal_format, primary_format, request_from_host) ;  }  LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromFile(  	                                               const std::string& filename,												     												   BOOL usemipmaps, -												   S32 boost_priority, +												   LLViewerTexture::EBoostLevel boost_priority,  												   S8 texture_type,  												   LLGLint internal_format,  												   LLGLenum primary_format,   												   const LLUUID& force_id)  { -	llassert_always(boost_priority >= LLViewerTexture::BOOST_NONE) ;  	return gTextureList.getImageFromFile(filename, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ;  }  //static   LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const std::string& url,									   									 BOOL usemipmaps, -									 S32 boost_priority, +									 LLViewerTexture::EBoostLevel boost_priority,  									 S8 texture_type,  									 LLGLint internal_format,  									 LLGLenum primary_format, @@ -1485,9 +1483,8 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  		if ( mBoostLevel > BOOST_HIGH)  		{  			priority += 10000000.f; -		} -		 -		if(mAdditionalDecodePriority > 0.0f) +		}		 +		else if(mAdditionalDecodePriority > 0.0f)  		{  			// 1-9  			S32 additional_priority = (S32)(1.0f + mAdditionalDecodePriority*8.0f + .5f); // round @@ -3147,8 +3144,7 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()  	if(mNeedsResetMaxVirtualSize)  	{ -		mMaxVirtualSize = 0.f ;//reset -		mNeedsResetMaxVirtualSize = FALSE ; +		addTextureStats(0.f, FALSE) ;//reset  	}  	if(mIsPlaying) //media is playing diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index bde87d1dd5..141979052d 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -107,12 +107,11 @@ public:  	enum EBoostLevel  	{ -		//skip 0 and 1 to avoid mistakenly mixing boost level with boolean numbers. -		BOOST_NONE 			= 2, -		BOOST_AVATAR_BAKED	= 3, -		BOOST_AVATAR		= 4, -		BOOST_CLOUDS		= 5, -		BOOST_SCULPTED      = 6, +		BOOST_NONE 			= 0, +		BOOST_AVATAR_BAKED	= 1, +		BOOST_AVATAR		= 2, +		BOOST_CLOUDS		= 3, +		BOOST_SCULPTED      = 4,  		BOOST_HIGH 			= 10,  		BOOST_TERRAIN		= 11, // has to be high priority for minimap / low detail @@ -668,7 +667,7 @@ public:  	static LLViewerFetchedTexture* getFetchedTexture(const LLUUID &image_id,									   									 BOOL usemipmap = TRUE, -									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation. +									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -677,7 +676,7 @@ public:  	static LLViewerFetchedTexture* getFetchedTextureFromFile(const std::string& filename,									   									 BOOL usemipmap = TRUE, -									 S32 boost_priority = LLViewerTexture::BOOST_NONE, +									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -686,7 +685,7 @@ public:  	static LLViewerFetchedTexture* getFetchedTextureFromUrl(const std::string& url,									   									 BOOL usemipmap = TRUE, -									 S32 boost_priority = LLViewerTexture::BOOST_NONE, +									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 081b7cc483..703a13976c 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -325,7 +325,7 @@ void LLViewerTextureList::restoreGL()  LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& filename,												     												   BOOL usemipmaps, -												   S32 boost_priority, +												   LLViewerTexture::EBoostLevel boost_priority,  												   S8 texture_type,  												   LLGLint internal_format,  												   LLGLenum primary_format,  @@ -345,7 +345,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string&  LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& url,  												   BOOL usemipmaps, -												   S32 boost_priority, +												   LLViewerTexture::EBoostLevel boost_priority,  												   S8 texture_type,  												   LLGLint internal_format,  												   LLGLenum primary_format,  @@ -411,7 +411,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string&  LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,											         												   BOOL usemipmaps, -												   S32 boost_priority, +												   LLViewerTexture::EBoostLevel boost_priority,  												   S8 texture_type,  												   LLGLint internal_format,  												   LLGLenum primary_format, @@ -441,7 +441,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,  //when this function is called, there is no such texture in the gTextureList with image_id.  LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,											         												   BOOL usemipmaps, -												   S32 boost_priority, +												   LLViewerTexture::EBoostLevel boost_priority,  												   S8 texture_type,  												   LLGLint internal_format,  												   LLGLenum primary_format, @@ -1346,7 +1346,7 @@ LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id, S32 priority)  	const BOOL use_mips = FALSE;  	const LLRect scale_rect = LLRect::null; -	return loadUIImageByID(image_id, use_mips, scale_rect, priority); +	return loadUIImageByID(image_id, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority);  }  LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priority) @@ -1360,21 +1360,27 @@ LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priori  	const BOOL use_mips = FALSE;  	const LLRect scale_rect = LLRect::null; -	return loadUIImageByName(image_name, image_name, use_mips, scale_rect, priority); +	return loadUIImageByName(image_name, image_name, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority);  }  LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename, -											  BOOL use_mips, const LLRect& scale_rect, S32 boost_priority ) +											  BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority )  { -	if (boost_priority == 0) boost_priority = LLViewerFetchedTexture::BOOST_UI; +	if (boost_priority == LLViewerTexture::BOOST_NONE) +	{ +		boost_priority = LLViewerTexture::BOOST_UI; +	}  	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, MIPMAP_NO, boost_priority);  	return loadUIImage(imagep, name, use_mips, scale_rect);  }  LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id, -											BOOL use_mips, const LLRect& scale_rect, S32 boost_priority) +											BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority)  { -	if (boost_priority == 0) boost_priority = LLViewerFetchedTexture::BOOST_UI; +	if (boost_priority == LLViewerTexture::BOOST_NONE) +	{ +		boost_priority = LLViewerTexture::BOOST_UI; +	}  	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, MIPMAP_NO, boost_priority);  	return loadUIImage(imagep, id.asString(), use_mips, scale_rect);  } diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index 3c9c81a689..028f8441ab 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -130,7 +130,7 @@ private:  	LLViewerFetchedTexture * getImage(const LLUUID &image_id,									   									 BOOL usemipmap = TRUE, -									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation. +									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -139,7 +139,7 @@ private:  	LLViewerFetchedTexture * getImageFromFile(const std::string& filename,									   									 BOOL usemipmap = TRUE, -									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation. +									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -148,7 +148,7 @@ private:  	LLViewerFetchedTexture* getImageFromUrl(const std::string& url,  									 BOOL usemipmap = TRUE, -									 BOOL level_immediate = FALSE,		// Get the requested level immediately upon creation. +									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -157,7 +157,7 @@ private:  	LLViewerFetchedTexture* createImage(const LLUUID &image_id,  									 BOOL usemipmap = TRUE, -									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation. +									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.  									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,  									 LLGLint internal_format = 0,  									 LLGLenum primary_format = 0, @@ -228,9 +228,11 @@ public:  	static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );  private:  	LLUIImagePtr loadUIImageByName(const std::string& name, const std::string& filename, -								   BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, S32 boost_priority = 0); +		                           BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,  +		                           LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);  	LLUIImagePtr loadUIImageByID(const LLUUID& id, -								 BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, S32 boost_priority = 0); +								 BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,  +								 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);  	LLUIImagePtr loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null); diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index d93913b944..ae32ec7d11 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -870,29 +870,60 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s  void LLVoiceChannelP2P::setState(EState state)  { -	// HACK: Open/close the call window if needed. +	// *HACK: Open/close the call window if needed.  	toggleCallWindowIfNeeded(state); -	// *HACK: open outgoing call floater if needed, might be better done elsewhere. -	mCallDialogPayload["session_id"] = mSessionID; -	mCallDialogPayload["session_name"] = mSessionName; -	mCallDialogPayload["other_user_id"] = mOtherUserID; -	if (!mReceivedCall && state == STATE_RINGING) -	{ -		llinfos << "RINGINGGGGGGGG " << mSessionName << llendl; -		if (!mSessionName.empty()) +	if (mReceivedCall) // incoming call +	{ +		// you only "answer" voice invites in p2p mode +		// so provide a special purpose message here +		if (mReceivedCall && state == STATE_RINGING)  		{ -			LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE); +			gIMMgr->addSystemMessage(mSessionID, "answering", mNotifyArgs); +			doSetState(state); +			return;  		}  	} - -	// you only "answer" voice invites in p2p mode -	// so provide a special purpose message here -	if (mReceivedCall && state == STATE_RINGING) +	else // outgoing call  	{ -		gIMMgr->addSystemMessage(mSessionID, "answering", mNotifyArgs); -		doSetState(state); -		return; +		mCallDialogPayload["session_id"] = mSessionID; +		mCallDialogPayload["session_name"] = mSessionName; +		mCallDialogPayload["other_user_id"] = mOtherUserID; +		if (state == STATE_RINGING) +		{ +			// *HACK: open outgoing call floater if needed, might be better done elsewhere. +			// *TODO: should move this squirrelly ui-fudging crap into LLOutgoingCallDialog itself +			if (!mSessionName.empty()) +			{ +				LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE)); +				if (ocd) +				{ +					ocd->getChild<LLTextBox>("calling")->setVisible(true); +					ocd->getChild<LLTextBox>("leaving")->setVisible(true); +					ocd->getChild<LLTextBox>("connecting")->setVisible(false); +				} +			} +		} +		/*else if (state == STATE_CONNECTED) +		{ +				LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE)); +				if (ocd) +				{ +					ocd->getChild<LLTextBox>("calling")->setVisible(false); +					ocd->getChild<LLTextBox>("leaving")->setVisible(false); +					ocd->getChild<LLTextBox>("connecting")->setVisible(true); +				}			 +				}*/ +		else if (state == STATE_HUNG_UP || +			 state == STATE_CONNECTED) +		{ +				LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE)); +				if (ocd) +				{ +					ocd->closeFloater(); +				}			 +		}  	} +  	LLVoiceChannel::setState(state);  } diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index fe24c30022..5fedfc943b 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -1598,7 +1598,7 @@ void LLVoiceClient::stateMachine()  				}  				else  				{ -					LL_WARNS("Voice") << "region doesn't have ParcelVoiceInfoRequest capability.  This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL; +					LL_WARNS_ONCE("Voice") << "region doesn't have ParcelVoiceInfoRequest capability.  This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL;  				}  			}  		} diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp index 8d3165b98c..9897f40c4e 100644 --- a/indra/newview/llworldmipmap.cpp +++ b/indra/newview/llworldmipmap.cpp @@ -196,7 +196,7 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32  	// END DEBUG  	//LL_INFOS("World Map") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL; -	LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); +	LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);  	img->setBoostLevel(LLViewerTexture::BOOST_MAP);  	// Return the smart pointer diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 4c4b6a3899..d5293bdbb5 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -23,13 +23,13 @@    <texture name="Arrow_Up" file_name="widgets/Arrow_Up.png" preload="true" />    <texture name="Arrow_Down" file_name="widgets/Arrow_Down.png" preload="true" /> -  <texture name="AudioMute_Off.png" file_name="icons/AudioMute_Off.png" preload="false" /> -  <texture name="AudioMute_Over.png" file_name="icons/AudioMute_Over.png" preload="false" /> -  <texture name="AudioMute_Press.png" file_name="icons/AudioMute_Press.png" preload="false" /> +  <texture name="AudioMute_Off" file_name="icons/AudioMute_Off.png" preload="false" /> +  <texture name="AudioMute_Over" file_name="icons/AudioMute_Over.png" preload="false" /> +  <texture name="AudioMute_Press" file_name="icons/AudioMute_Press.png" preload="false" /> -  <texture name="Audio_Off.png" file_name="icons/Audio_Off.png" preload="false" /> -  <texture name="Audio_Over.png" file_name="icons/Audio_Over.png" preload="false" /> -  <texture name="Audio_Press.png" file_name="icons/Audio_Press.png" preload="false" /> +  <texture name="Audio_Off" file_name="icons/Audio_Off.png" preload="false" /> +  <texture name="Audio_Over" file_name="icons/Audio_Over.png" preload="false" /> +  <texture name="Audio_Press" file_name="icons/Audio_Press.png" preload="false" />    <texture name="BackArrow_Disabled" file_name="icons/BackArrow_Disabled.png" preload="false" />    <texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" /> @@ -109,9 +109,9 @@    <texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" /> -  <texture name="ExternalBrowser_Off.png" file_name="icons/ExternalBrowser_Off.png" preload="false" /> -  <texture name="ExternalBrowser_Over.png" file_name="icons/ExternalBrowser_Over.png" preload="false" /> -  <texture name="ExternalBrowser_Press.png" file_name="icons/ExternalBrowser_Press.png" preload="false" /> +  <texture name="ExternalBrowser_Off" file_name="icons/ExternalBrowser_Off.png" preload="false" /> +  <texture name="ExternalBrowser_Over" file_name="icons/ExternalBrowser_Over.png" preload="false" /> +  <texture name="ExternalBrowser_Press" file_name="icons/ExternalBrowser_Press.png" preload="false" />    <texture name="Favorite_Star_Active" file_name="navbar/Favorite_Star_Active.png" preload="false" />    <texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" /> @@ -338,12 +338,12 @@   <texture name="parcel_lght_Voice" file_name="icons/parcel_lght_Voice.png" preload="false" />   <texture name="parcel_lght_VoiceNo" file_name="icons/parcel_lght_VoiceNo.png" preload="false" /> -  <texture name="Pause_Off.png" file_name="icons/Pause_Off.png" preload="false" /> -  <texture name="Pause_Over.png" file_name="icons/Pause_Over.png" preload="false" /> -  <texture name="Pause_Press.png" file_name="icons/Pause_Press.png" preload="false" /> -  <texture name="Play_Off.png" file_name="icons/Play_Off.png" preload="false" /> -  <texture name="Play_Over.png" file_name="icons/Play_Over.png" preload="false" /> -  <texture name="Play_Press.png" file_name="icons/Play_Press.png" preload="false" /> +  <texture name="Pause_Off" file_name="icons/Pause_Off.png" preload="false" /> +  <texture name="Pause_Over" file_name="icons/Pause_Over.png" preload="false" /> +  <texture name="Pause_Press" file_name="icons/Pause_Press.png" preload="false" /> +  <texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" /> +  <texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" /> +  <texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" />    <texture name="Progress_1" file_name="icons/Progress_1.png" preload="false" />    <texture name="Progress_2" file_name="icons/Progress_2.png" preload="false" /> @@ -425,12 +425,12 @@    <texture name="SegmentedBtn_Right_Selected_Press" file_name="widgets/SegmentedBtn_Right_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />    <texture name="SegmentedBtn_Right_Selected_Disabled" file_name="widgets/SegmentedBtn_Right_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> -  <texture name="SkipBackward_Off.png" file_name="icons/SkipBackward_Off.png" preload="false" /> -  <texture name="SkipBackward_Over.png" file_name="icons/SkipBackward_Over.png" preload="false" /> -  <texture name="SkipBackward_Press.png" file_name="icons/SkipBackward_Press.png" preload="false" /> -  <texture name="SkipForward_Off.png" file_name="icons/SkipForward_Off.png" preload="false" /> -  <texture name="SkipForward_Over.png" file_name="icons/SkipForward_Over.png" preload="false" /> -  <texture name="SkipForward_Press.png" file_name="icons/SkipForward_Press.png" preload="false" /> +  <texture name="SkipBackward_Off" file_name="icons/SkipBackward_Off.png" preload="false" /> +  <texture name="SkipBackward_Over" file_name="icons/SkipBackward_Over.png" preload="false" /> +  <texture name="SkipBackward_Press" file_name="icons/SkipBackward_Press.png" preload="false" /> +  <texture name="SkipForward_Off" file_name="icons/SkipForward_Off.png" preload="false" /> +  <texture name="SkipForward_Over" file_name="icons/SkipForward_Over.png" preload="false" /> +  <texture name="SkipForward_Press" file_name="icons/SkipForward_Press.png" preload="false" />    <texture name="SliderTrack_Horiz" file_name="widgets/SliderTrack_Horiz.png" scale.left="4" scale.top="4" scale.right="100" scale.bottom="2" />    <texture name="SliderTrack_Vert" file_name="widgets/SliderTrack_Vert.png" scale.left="2" scale.top="100" scale.right="4" scale.bottom="4" /> @@ -449,9 +449,9 @@    <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="StopReload_Off.png" file_name="icons/StopReload_Off.png" preload="false" /> -  <texture name="StopReload_Over.png" file_name="icons/StopReload_Over.png" preload="false" /> -  <texture name="StopReload_Press.png" file_name="icons/StopReload_Press.png" preload="false" /> +  <texture name="StopReload_Off" file_name="icons/StopReload_Off.png" preload="false" /> +  <texture name="StopReload_Over" file_name="icons/StopReload_Over.png" preload="false" /> +  <texture name="StopReload_Press" file_name="icons/StopReload_Press.png" preload="false" />    <texture name="TabIcon_Appearance_Large" file_name="taskpanel/TabIcon_Appearance_Large.png" preload="false" />    <texture name="TabIcon_Appearance_Off" file_name="taskpanel/TabIcon_Appearance_Off.png" preload="false" /> @@ -531,8 +531,8 @@    <texture name="Toolbar_Right_Off" file_name="containers/Toolbar_Right_Off.png" preload="false" />    <texture name="Toolbar_Right_Press" file_name="containers/Toolbar_Right_Press.png" preload="false" />    <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" /> -   -  <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="1" scale.right="99" scale.bottom="14" /> + +  <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="16" scale.right="100" scale.bottom="3" />    <texture name="TrashItem_Disabled" file_name="icons/TrashItem_Disabled.png" preload="false" />    <texture name="TrashItem_Off" file_name="icons/TrashItem_Off.png" preload="false" /> @@ -563,9 +563,9 @@    <texture name="YouAreHere_Badge" file_name="icons/YouAreHere_Badge.png" preload="false" /> -  <texture name="Zoom_Off.png" file_name="icons/Zoom_Off.png" preload="false" /> -  <texture name="Zoom_Over.png" file_name="icons/Zoom_Over.png" preload="false" /> -  <texture name="Zoom_Press.png" file_name="icons/Zoom_Press.png" preload="false" /> +  <texture name="Zoom_Off" file_name="icons/Zoom_Off.png" preload="false" /> +  <texture name="Zoom_Over" file_name="icons/Zoom_Over.png" preload="false" /> +  <texture name="Zoom_Press" file_name="icons/Zoom_Press.png" preload="false" />    <!--WARNING OLD ART *do not use*--> diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml index 5c09bc3a02..f553184c19 100644 --- a/indra/newview/skins/default/xui/en/floater_camera.xml +++ b/indra/newview/skins/default/xui/en/floater_camera.xml @@ -49,22 +49,57 @@           top="22"           visible="false"           width="78" /> -         <!--TODO: replace with slider, + - images --> - <joystick_zoom -         follows="top|left" -         height="78" -         image_unselected="ScrollThumb_Vert" -         layout="topleft" -         left="7" -         minus_image="ScrollThumb_Vert" -         name="zoom" -         plus_image="ScrollThumb_Vert" -         quadrant="left" -         scale_image="false" -         sound_flags="3" -         tool_tip="Zoom camera toward focus" -         top="22" -         width="20" /> +         <!--TODO: replace + - images --> +         <panel +            border="false" +            class="camera_zoom_panel" +            height="94" +            layout="topleft" +            left="7" +            mouse_opaque="false" +            name="zoom" +            top="22" +            width="18"> +           <button +              follows="top|left" +              height="18" +              image_disabled="AddItem_Disabled" +              image_selected="AddItem_Press" +              image_unselected="AddItem_Off" +              layout="topleft" +              name="zoom_plus_btn" +              width="18"> +             <commit_callback +                function="Zoom.plus" /> +             <mouse_held_callback +                function="Zoom.plus" /> +           </button> +           <slider_bar +              height="48" +              layout="topleft" +              name="zoom_slider" +              orientation="vertical" +              tool_tip="Zoom camera toward focus" +              top_pad="0" +              width="18"> +             <commit_callback function="Slider.value_changed"/> +           </slider_bar> +           <button +              follows="top|left" +              height="18" +              image_disabled="AddItem_Disabled" +              image_selected="AddItem_Press" +              image_unselected="AddItem_Off" +              layout="topleft" +              name="zoom_minus_btn" +              top_pad="0" +              width="18"> +             <commit_callback +                function="Zoom.minus" /> +             <mouse_held_callback +                function="Zoom.minus" /> +           </button> +         </panel>           <joystick_rotate           follows="top|left"           height="78" @@ -72,6 +107,7 @@           image_unselected="Cam_Rotate_Out"           layout="topleft"           left="45" +         mouse_opaque="false"            name="cam_rotate_stick"           quadrant="left"           scale_image="false" @@ -80,7 +116,7 @@           tool_tip="Orbit camera around focus"           top="22"           width="78" /> -            <panel +         <panel           height="78"           layout="topleft"           left="36" diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml index b23482655c..a3ac878202 100644 --- a/indra/newview/skins/default/xui/en/floater_gesture.xml +++ b/indra/newview/skins/default/xui/en/floater_gesture.xml @@ -84,21 +84,21 @@                   top_delta="0"                   width="18" />                  <button -                 follows="bottom|left" +                 follows="bottom|right"                   font="SansSerifBigBold"                   height="18"                   image_selected="TrashItem_Press"                   image_unselected="TrashItem_Off"                   image_disabled="TrashItem_Disabled"                   layout="topleft" -                 left_pad="230"                   name="del_btn" +                 right="-5"                   tool_tip="Delete this gesture"                   top_delta="0"                   width="18" />              </panel>      <button -     follows="bottom|right" +     follows="left|bottom"       height="23"       label="Edit"       layout="topleft" @@ -107,7 +107,7 @@       top_pad="5"       width="83" />      <button -     follows="bottom|right" +     follows="left|bottom"       height="23"       label="Play"       layout="topleft" @@ -116,7 +116,7 @@       top_delta="0"       width="83" />      <button -     follows="bottom|right" +     follows="left|bottom"       height="23"       label="Stop"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_incoming_call.xml b/indra/newview/skins/default/xui/en/floater_incoming_call.xml index 9c2898945b..526fda90d1 100644 --- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml @@ -12,7 +12,7 @@   width="410">      <floater.string       name="localchat"> -        Local Voice Chat +        Nearby Voice Chat      </floater.string>      <floater.string       name="anonymous"> diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml index 6713700372..82417de8a7 100644 --- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml @@ -12,7 +12,7 @@   width="410">      <floater.string       name="localchat"> -        Local Voice Chat +        Nearby Voice Chat      </floater.string>      <floater.string       name="anonymous"> @@ -40,6 +40,18 @@       height="20"       layout="topleft"       left="77" +     name="connecting" +     top="27" +     visible="false" +     width="315" +     word_wrap="true"> +Connecting to [CALLEE_NAME] +    </text> +    <text +     font="SansSerifLarge" +     height="20" +     layout="topleft" +     left="77"       name="calling"       top="27"       width="315" @@ -60,6 +72,8 @@ Leaving [CURRENT_CHAT].      <button       height="24"       label="Cancel" +     label_selected="Cancel" +     left="70"       layout="topleft"       name="Cancel"       left_pad="10" diff --git a/indra/newview/skins/default/xui/en/floater_test_slider.xml b/indra/newview/skins/default/xui/en/floater_test_slider.xml index 57d8e686ce..86ff82e01f 100644 --- a/indra/newview/skins/default/xui/en/floater_test_slider.xml +++ b/indra/newview/skins/default/xui/en/floater_test_slider.xml @@ -57,6 +57,13 @@       width="200" />      <slider_bar       bottom="320" +     height="100" +     left="20" +     name="slider_bar_vertical" +     orientation="vertical" +     width="20" /> +    <slider_bar +     bottom="300"       height="20"       increment="1"       initial_value="2.0" @@ -64,6 +71,7 @@       layout="topleft"       max_val="5"       min_val="1" +     left_pad="20"       name="slider_bar"       width="300" />      <slider diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index c33d7cf31d..b2f46bc433 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -262,6 +262,18 @@  		  <check_box.commit_callback  			function="BuildTool.selectComponent"/>  	</check_box> + +   <text +   text_color="LtGray_50" +   follows="top|left" +   halign="left" +   left="13" +   name="RenderingCost" +   top_pad="9" +   type="string" +   width="100"> +   รพ: [COUNT] +   </text>  	<check_box       control_name="ScaleUniform"       height="19" @@ -325,7 +337,7 @@  	 <button.commit_callback  	     function="BuildTool.gridOptions"/>  	</button> -    <button +   <button       follows="left|top"       height="20"       image_disabled="Object_Cube" @@ -701,6 +713,7 @@  	     function="BuildTool.applyToSelection"/>      </button>      <text +    text_color="LtGray_50"       type="string"       length="1"       height="12" @@ -714,6 +727,7 @@          Objects: [COUNT]      </text>      <text +    text_color="LtGray_50"       type="string"       length="1"       follows="left|top" @@ -730,7 +744,7 @@       halign="center"       left="0"       name="Object Info Tabs" -     tab_max_width="55" +     tab_max_width="54"       tab_min_width="40"       tab_position="top"       tab_height="25" diff --git a/indra/newview/skins/default/xui/en/floater_tos.xml b/indra/newview/skins/default/xui/en/floater_tos.xml index 4e2cce1428..1adb824e2a 100644 --- a/indra/newview/skins/default/xui/en/floater_tos.xml +++ b/indra/newview/skins/default/xui/en/floater_tos.xml @@ -53,22 +53,6 @@          Please read the following Terms of Service carefully. To continue logging in to [SECOND_LIFE],  you must accept the agreement.      </text> -    <text_editor -     type="string" -     length="1" -     follows="left|top" -     font="SansSerif" -     height="283" -     layout="topleft" -     left_delta="0" -     max_length="65536" -     name="tos_text" -     top_pad="43" -     width="568" -     handle_edit_keys_directly="true"  -     word_wrap="true"> -        TOS_TEXT -    </text_editor>      <web_browser       follows="left|top"       height="340" @@ -76,6 +60,6 @@ you must accept the agreement.       left_delta="0"       name="tos_html"       start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E" -     top_delta="-27" +     top_delta="0"       width="568" />  </floater> diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml index e5e5007c56..f48af2f97e 100644 --- a/indra/newview/skins/default/xui/en/inspect_group.xml +++ b/indra/newview/skins/default/xui/en/inspect_group.xml @@ -31,7 +31,7 @@       use_ellipses="true"       width="240"       word_wrap="false"> -    Grumpity's Grumpy Group of Moose +    Grumpity's Grumpy Group of Moose    </text>    <text     follows="all" diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index 08f7ee456e..9e35c95d45 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -51,6 +51,13 @@                 name="main_view"                 user_resize="true"                 width="500"> +          <view bottom="500" +                follows="all" +                height="500" +                left="0" +                mouse_opaque="false" +                name="world_view_rect" +                width="500"/>            <layout_stack border_size="0"                          bottom="500"                          follows="all" @@ -66,13 +73,6 @@                     mouse_opaque="false"                     name="hud container"                     width="500"> -              <view bottom="500" -                    follows="all" -                    height="500" -                    left="0" -                    mouse_opaque="false" -                    name="world_view_rect" -                    width="500"/>                <panel follows="right|top|bottom"                       height="500"                       mouse_opaque="false" diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index bd60574a95..07940e18b6 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -193,6 +193,13 @@               function="ShowFloater"               parameter="test_widgets" />          </menu_item_call> +        <menu_item_call +         label="Inspectors Test" +         name="Inspectors Test"> +            <menu_item_call.on_click +             function="ShowFloater" +             parameter="test_inspectors" /> +        </menu_item_call>        <menu_item_check           label="Reg In Client Test (restart)"           name="Reg In Client Test (restart)"> diff --git a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml index 6dd44255bf..304492bedb 100644 --- a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml +++ b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml @@ -13,15 +13,11 @@         function="CheckControl"         parameter="GroupListShowIcons" />    </menu_item_check> -  <menu_item_check +  <menu_item_call     label="Leave Selected Group"     layout="topleft"     name="Leave Selected Group"> -      <menu_item_check.on_click -       function="People.Groups.ViewSort.Action" -       parameter="show_icons" /> -      <menu_item_check.on_check -       function="CheckControl" -       parameter="GroupListShowIcons" /> -  </menu_item_check> +      <menu_item_call.on_click +       function="People.Group.Minus.Action"/> +  </menu_item_call>  </menu> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index ff0cd7ffeb..9fe03859bb 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4957,8 +4957,9 @@ No valid parcel could be found.    <notification     icon="notify.tga"     name="ObjectGiveItem" -   type="notify"> -An object named [OBJECTFROMNAME] owned by [FIRST] [LAST] has given you a [OBJECTTYPE] named [OBJECTNAME]. +   type="offer"> +An object named [OBJECTFROMNAME] owned by [NAME] has offered you [OBJECTTYPE]: +[ITEM_SLURL]      <form name="form">        <button         index="0" @@ -5000,7 +5001,8 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a     icon="notify.tga"     name="UserGiveItem"     type="offer"> -[NAME] has given you a [OBJECTTYPE] named '[OBJECTNAME]'. +[NAME] has offered you [OBJECTTYPE]: +[ITEM_SLURL]      <form name="form">        <button         index="0" @@ -5585,7 +5587,7 @@ We're sorry.  This area has reached maximum capacity for voice conversation     icon="notifytip.tga"     name="VoiceChannelDisconnected"     type="notifytip"> -You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnected to spatial voice chat. +You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnected to Nearby Voice Chat.      <unique>        <context key="VOICE_CHANNEL_NAME"/>      </unique> @@ -5595,7 +5597,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnect     icon="notifytip.tga"     name="VoiceChannelDisconnectedP2P"     type="notifytip"> -[VOICE_CHANNEL_NAME] has ended the call.  You will now be reconnected to spatial voice chat. +[VOICE_CHANNEL_NAME] has ended the call.  You will now be reconnected to Nearby Voice Chat.      <unique>        <context key="VOICE_CHANNEL_NAME"/>      </unique> @@ -5605,7 +5607,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnect     icon="notifytip.tga"     name="P2PCallDeclined"     type="notifytip"> -[VOICE_CHANNEL_NAME] has declined your call.  You will now be reconnected to spatial voice chat. +[VOICE_CHANNEL_NAME] has declined your call.  You will now be reconnected to Nearby Voice Chat.      <unique>        <context key="VOICE_CHANNEL_NAME"/>      </unique> @@ -5615,7 +5617,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnect     icon="notifytip.tga"     name="P2PCallNoAnswer"     type="notifytip"> -[VOICE_CHANNEL_NAME] is not available to take your call.  You will now be reconnected to spatial voice chat. +[VOICE_CHANNEL_NAME] is not available to take your call.  You will now be reconnected to Nearby Voice Chat.      <unique>        <context key="VOICE_CHANNEL_NAME"/>      </unique> @@ -5625,7 +5627,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnect     icon="notifytip.tga"     name="VoiceChannelJoinFailed"     type="notifytip"> -Failed to connect to [VOICE_CHANNEL_NAME], please try again later.  You will now be reconnected to spatial voice chat. +Failed to connect to [VOICE_CHANNEL_NAME], please try again later.  You will now be reconnected to Nearby Voice Chat.      <unique>        <context key="VOICE_CHANNEL_NAME"/>      </unique> @@ -5739,6 +5741,15 @@ Are you sure you want to delete your teleport history?       yestext="OK"/>    </notification> +  <notification +   icon="alert.tga" +   name="BottomTrayButtonCanNotBeShown" +   type="alert"> +Selected button can not be shown right now. +The button will be shown when there is enough space for it.
 +  </notification> + +    <global name="UnsupportedCPU">  - Your CPU speed does not meet the minimum requirements.    </global> diff --git a/indra/newview/skins/default/xui/en/panel_activeim_row.xml b/indra/newview/skins/default/xui/en/panel_activeim_row.xml index 8b815b0f71..38294c907a 100644 --- a/indra/newview/skins/default/xui/en/panel_activeim_row.xml +++ b/indra/newview/skins/default/xui/en/panel_activeim_row.xml @@ -7,7 +7,9 @@  	left="0"  	height="35"  	width="318" -	background_visible="false"> +  background_opaque="false"
 +  background_visible="true"
 +  bg_alpha_color="0.0 0.0 0.0 0.0" >    <chiclet_im_p2p  		name="p2p_chiclet"  		layout="topleft" @@ -15,7 +17,16 @@  		top="3"  		left="5"  		height="25" -		width="25"> +		width="25" +    visible="false" +    speaker.name="speaker_p2p" +    speaker.width="20" +    speaker.height="25" +    speaker.left="25" +    speaker.top="25" +    speaker.auto_update="true" +    speaker.draw_border="false" +    speaker.visible="false">    </chiclet_im_p2p>    <chiclet_im_group  		name="group_chiclet" @@ -24,14 +35,41 @@  		top="3"  		left="5"  		height="25" -		width="25"> +		width="25" +    visible="false" +    speaker.name="speaker_grp" +    speaker.width="20" +    speaker.height="25" +    speaker.left="25" +    speaker.top="25" +    speaker.auto_update="true" +    speaker.draw_border="false" +    speaker.visible="false">    </chiclet_im_group> +  <chiclet_im_adhoc +		name="adhoc_chiclet" +		layout="topleft" +		follows="left" +		top="3" +		left="5" +		height="25" +		width="25" +    visible="false" +    speaker.name="speaker_hoc" +    speaker.width="20" +    speaker.height="25" +    speaker.left="25" +    speaker.top="25" +    speaker.auto_update="true" +    speaker.draw_border="false" +    speaker.visible="false"> +  </chiclet_im_adhoc>  	<text  		type="string"  		name="contact_name"  		layout="topleft"  		top="10" -		left_pad="0" +		left_pad="20"  		height="14"  		width="245"  		length="1" diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 3c16a439d9..a902f50582 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -333,6 +333,6 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.           min_width="4"            right="-1"           top="0" -         width="26"/> +         width="4"/>      </layout_stack>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml index ef3120174e..984a799b41 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notify.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml @@ -1,77 +1,117 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel background_visible="true" bevel_style="in" bg_alpha_color="0 0 0 0" -	height="155" label="instant_message" layout="topleft" left="0" -	name="panel_group_notify" top="0" width="350"> -    <string -     name="message_max_lines_count"> -        4 -    </string> -	<panel follows="top" background_visible="true" bevel_style="in" bg_alpha_color="black" -		height="30" label="header" layout="topleft" left="0" name="header" -		top="0" width="350"> -		<icon follows="left|top|right|bottom" height="20"  width="20" layout="topleft" -			top="5"  left="5" mouse_opaque="true" name="group_icon"/> -		<text type="string" length="1" follows="left|top|right|bottom" -			font="SansSerifBigBold" height="20" layout="topleft" left_pad="10" name="title" -			text_color="GroupNotifyTextColor" top="5" width="275" use_ellipses="true"> -			Sender Name / Group Name -        </text> -	</panel> -	<text -     follows="top" -     height="20" -     layout="topleft" -     left="25" -     name="subject" -     text_color="GroupNotifyTextColor" -     font="SansSerifBig" -     top="40" -     use_ellipses="true" -     value="subject" -     width="300" -     word_wrap="true"> -     subject  -    </text> -    <text -     follows="top" -     height="20" -     layout="topleft" -     left="25" -     name="datetime" -     text_color="GroupNotifyTextColor" -     font="SansSerif" -     top="80" -     use_ellipses="true" -     value="datetime" -     width="300" -     word_wrap="true"> -     datetime -    </text> -    <text -     follows="left|top|bottom|right" -     height="0" -     layout="topleft" -     left="25" -     name="message" -     text_color="GroupNotifyTextColor" -     top="100" -     use_ellipses="true" -     value="message" -     width="300" -     word_wrap="true" -     visible="true" > -    </text> -    <icon -	  follows="left|bottom|right" height="15" width="15" -		layout="topleft" bottom="122" left="25" mouse_opaque="true" name="attachment_icon" visible="true" -	/> -	<text font="SansSerif" font.style="UNDERLINE" font_shadow="none" -		type="string" length="1" follows="left|bottom|right" layout="topleft" -		left="45" bottom="122" height="15" width="280" name="attachment" -		text_color="GroupNotifyTextColor" visible="true"> -		Attachment -     </text> - -	<button label="OK" layout="topleft" bottom="145" left="140" height="20" -		width="70" name="btn_ok" follows="bottom" /> -</panel>
\ No newline at end of file +<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 +<panel
 + background_visible="true"
 + bevel_style="in"
 + bg_alpha_color="0 0 0 0"
 + height="135"
 + label="instant_message"
 + layout="topleft"
 + left="0"
 + name="panel_group_notify"
 + top="0"
 + width="305">
 +    <string
 +     name="message_max_lines_count"
 +     value="4" />
 +    <panel
 +     background_visible="true"
 +     bevel_style="in"
 +     bg_alpha_color="black"
 +     follows="top"
 +     height="30"
 +     label="header"
 +     layout="topleft"
 +     left="0"
 +     name="header"
 +     top="0"
 +     width="305">
 +        <icon
 +         follows="left|top|right|bottom"
 +         height="20"
 +         layout="topleft"
 +         left="5"
 +         mouse_opaque="true"
 +         name="group_icon"
 +         top="5"
 +         width="20" />
 +        <text
 +         follows="left|top|right|bottom"
 +         font="SansSerifBigBold"
 +         height="20"
 +         layout="topleft"
 +         left_pad="10"
 +         name="title"
 +         text_color="GroupNotifyTextColor"
 +         top="5"
 +         use_ellipses="true"
 +         value="Sender Name / Group Name"
 +         width="230" />
 +    </panel>
 +    <text
 +     follows="top"
 +     font="SansSerifBig"
 +     height="20"
 +     layout="topleft"
 +     left="25"
 +     name="subject"
 +     text_color="GroupNotifyTextColor"
 +     top="40"
 +     use_ellipses="true"
 +     value="subject"
 +     width="270"
 +     wrap="true" />
 +    <text
 +     follows="top"
 +     font="SansSerif"
 +     height="20"
 +     layout="topleft"
 +     left="25"
 +     name="datetime"
 +     text_color="GroupNotifyTextColor"
 +     top="80"
 +     use_ellipses="true"
 +     value="datetime"
 +     width="270"
 +     wrap="true" />
 +    <text
 +     follows="left|top|bottom|right"
 +     height="0"
 +     layout="topleft"
 +     left="25"
 +     name="message"
 +     text_color="GroupNotifyTextColor"
 +     top="100"
 +     use_ellipses="true"
 +     value="message"
 +     width="270"
 +     wrap="true" />
 +    <icon
 +     bottom="122"
 +     follows="left|bottom|right"
 +     height="15"
 +     layout="topleft"
 +     left="25"
 +     mouse_opaque="true"
 +     name="attachment_icon"
 +     width="15" />
 +    <text
 +     bottom="122"
 +     follows="left|bottom|right"
 +     font="SansSerif"
 +     height="15"
 +     layout="topleft"
 +     left="45"
 +     name="attachment"
 +     text_color="GroupNotifyTextColor"
 +     value="Attachment"
 +     width="280" />
 +    <button
 +     bottom="130"
 +     follows="bottom"
 +     height="20"
 +     label="OK"
 +     layout="topleft"
 +     left="25"
 +     name="btn_ok"
 +     width="70" />
 +</panel>
 diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml index 1ef845b769..ecf35523cd 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml @@ -23,11 +23,11 @@       layout="topleft"       left_delta="7"       left="0" -     max_length="254" +     max_length="512"       name="chat_box"       tool_tip="Press Enter to say, Ctrl+Enter to shout"       top="0" -     width="250" /> +     width="279" />      <output_monitor       auto_update="true"       follows="right" diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml index 34a185fb44..462188ee24 100644 --- a/indra/newview/skins/default/xui/en/panel_notification.xml +++ b/indra/newview/skins/default/xui/en/panel_notification.xml @@ -10,7 +10,7 @@    left="0"    name="notification_panel"    top="0" -  	height="10" +  	height="140"    width="305">    <!-- THIS PANEL CONTROLS TOAST HEIGHT? -->    <panel @@ -20,18 +20,18 @@    bg_alpha_color="0.3 0.3 0.3 0"    bg_opaque_color="0.3 0.3 0.3 0"      follows="left|right|top" -    height="10" +    height="100"      label="info_panel"      layout="topleft"      left="0"      name="info_panel"      top="0"      width="305"> -  <!--  <text +    <text        border_visible="false"        follows="left|right|top|bottom"        font="SansSerif" -      height="90" +      height="85"        layout="topleft"        left="10"        name="text_box" @@ -39,21 +39,21 @@        text_color="white"        top="10"        visible="false"  -      width="300" +      width="285"        wrap="true"/>      <text        border_visible="false"        follows="left|right|top|bottom"        font="SansSerifBold" -      height="90" +      height="85"        layout="topleft" -      left="45" +      left="10"        name="caution_text_box"        text_color="1 0.82 0.46 1" -      top="5" +      top="10"        visible="false" -      width="300" -      wrap="true"/>  --> +      width="285" +      wrap="true"/>      <text_editor      	h_pad="0"  	v_pad="0" @@ -63,6 +63,7 @@        enabled="false"        follows="left|right|top|bottom"        font="SansSerif" +      height="85"         layout="topleft"        left="10"        mouse_opaque="false" @@ -74,17 +75,20 @@        top="10"        visible="false"        width="285" -      wrap="true"/> +      wrap="true" +      parse_highlights="true" +      allow_html="true"/>    </panel>    <panel      background_visible="false"      follows="left|right|bottom" +    height="40"       label="control_panel"      layout="topleft"      left="0"      left_delta="-38"      name="control_panel" -    top="20"> +    top_pad="0">    </panel>    <!--    <icon diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml index 3bdd7114ee..70c5d7b823 100644 --- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml @@ -2,19 +2,18 @@  <panel  	follows="left|right|top|bottom"  	name="MediaControls" -	bg_alpha_color="1 1 1 0" +	background_visible="false"  	height="160"  	layout="topleft"  	mouse_opaque="false"  	width="800"> +  <string name="control_background_image_name">Inspector_Background</string>    <panel  	  name="media_region"  	  bottom="125"  	  follows="left|right|top|bottom"  	  layout="topleft" -	  left="20"  	  mouse_opaque="false" -	  right="-20"  	  top="20" />    <layout_stack  	  follows="left|right|bottom" @@ -33,6 +32,7 @@  		name="media_progress_indicator"  		height="22"  		layout="topleft" +		visible="false"  		left="0"  		top="0"  		auto_resize="false" @@ -64,6 +64,7 @@  	  top="128">  	<!-- outer layout_panels center the inner one -->  	<layout_panel +		name="left_bookend"  		width="0"  		layout="topleft"  		user_resize="false" /> @@ -83,6 +84,7 @@  		  layout="topleft"  		  tool_tip="Step back"  		  width="22" +		  left="0"  		  top_delta="4">  		<button.commit_callback  			function="MediaCtrl.Back" /> @@ -109,22 +111,22 @@  			function="MediaCtrl.Forward" />  	  </button>  	</layout_panel> -<!-- -	<panel +	<!-- +		<panel  		height="22"  		layout="topleft"  		auto_resize="false"  		min_width="3"  		width="3"> -	  <icon -		  height="22" -		  image_name="media_panel_divider.png" -		  layout="topleft" -		  top="0" -		  min_width="3" -		  width="3" /> -	</panel> ---> +		<icon +		height="22" +		image_name="media_panel_divider.png" +		layout="topleft" +		top="0" +		min_width="3" +		width="3" /> +		</panel> +	-->  	<layout_panel  		name="home"  		auto_resize="false" @@ -165,22 +167,22 @@  			function="MediaCtrl.Stop" />  	  </button>  	</layout_panel> -<!-- -	<panel +	<!-- +		<panel  		height="22"  		layout="topleft"  		auto_resize="false"  		min_width="3"  		width="3"> -	  <icon -		  height="22" -		  image_name="media_panel_divider.png" -		  layout="topleft" -		  top="0" -		  min_width="3" -		  width="3" /> -	</panel> ---> +		<icon +		height="22" +		image_name="media_panel_divider.png" +		layout="topleft" +		top="0" +		min_width="3" +		width="3" /> +		</panel> +	-->  	<layout_panel  		name="reload"  		auto_resize="false" @@ -294,31 +296,43 @@ function="MediaCtrl.CommitURL" />  			function="MediaCtrl.CommitURL"/>  	  </line_editor>  	  <layout_stack +		  name="media_address_url_icons"  		  animate="false"  		  follows="right" -		  width="32" -		  min_width="32" -		  height="16" -		  top="3" -		  orientation="horizontal" -		  left_pad="-38"> -		<icon -			name="media_whitelist_flag" -			follows="top|right" -			height="16" -			image_name="smicon_warn.tga" +		  height="20" +		  width="38" +		  right="-2" +		  top="-1" +		  orientation="horizontal"> +		<layout_panel  			layout="topleft" -			tool_tip="White List enabled" -			min_width="16" -			width="16" /> -		<icon -			name="media_secure_lock_flag" -			height="16" -			image_name="inv_item_eyes.tga" +			width="16" +			auto_resize="false" +			user_resize="false"> +		  <icon +			  name="media_whitelist_flag" +			  follows="top|right" +			  height="16" +			  image_name="smicon_warn.tga" +			  layout="topleft" +			  tool_tip="White List enabled" +			  min_width="16" +			  width="16" /> +		</layout_panel> +		<layout_panel  			layout="topleft" -			tool_tip="Secured Browsing" -			min_width="16" -			width="16" /> +			width="16" +			auto_resize="false" +			user_resize="false"> +		  <icon +			  name="media_secure_lock_flag" +			  height="16" +			  image_name="icon_lock.tga" +			  layout="topleft" +			  tool_tip="Secured Browsing" +			  min_width="16" +			  width="16" /> +		</layout_panel>  	  </layout_stack>  	</layout_panel>  	<layout_panel @@ -412,9 +426,9 @@ function="MediaCtrl.CommitURL" />  	  </button>  	</layout_panel>  	<!-- Scroll pad --> -<!-- -disabled -	<layout_panel +	<!-- +		disabled +		<layout_panel  		name="media_panel_scroll"  		auto_resize="false"  		user_resize="false" @@ -423,64 +437,64 @@ disabled  		layout="topleft"  		min_width="32"  		width="32"> -	  <icon -		  height="32" -		  image_name="media_panel_scrollbg.png" -		  layout="topleft" -		  top="0" -		  min_width="32" -		  width="32" /> -	  <button -		  name="scrollup" -		  height="8" -		  image_selected="media_btn_scrollup.png" -		  image_unselected="media_btn_scrollup.png" -		  layout="topleft" -		  tool_tip="Scroll up" -		  scale_image="false" -		  left="12" -		  top_delta="4" -		  min_width="8" -		  width="8" /> -	  <button -		  name="scrollleft" -		  height="8" -		  image_selected="media_btn_scrollleft.png" -		  image_unselected="media_btn_scrollleft.png" -		  layout="topleft" -		  left="3" -		  tool_tip="Scroll left" -		  scale_image="false" -		  top="12" -		  min_width="8" -		  width="8" /> -	  <button -		  name="scrollright" -		  height="8" -		  image_selected="media_btn_scrollright.png" -		  image_unselected="media_btn_scrollright.png" -		  layout="topleft" -		  left_pad="9" -		  tool_tip="Scroll right" -		  scale_image="false" -		  top_delta="0" -		  min_width="8" -		  width="8" /> -	  <button -		  name="scrolldown" -		  height="8" -		  image_selected="media_btn_scrolldown.png" -		  image_unselected="media_btn_scrolldown.png" -		  layout="topleft" -		  left="12" -		  tool_tip="Scroll down" -		  scale_image="false" -		  top="20" -		  min_width="8" -		  width="8" /> -	</layout_panel> -disabled ---> +		<icon +		height="32" +		image_name="media_panel_scrollbg.png" +		layout="topleft" +		top="0" +		min_width="32" +		width="32" /> +		<button +		name="scrollup" +		height="8" +		image_selected="media_btn_scrollup.png" +		image_unselected="media_btn_scrollup.png" +		layout="topleft" +		tool_tip="Scroll up" +		scale_image="false" +		left="12" +		top_delta="4" +		min_width="8" +		width="8" /> +		<button +		name="scrollleft" +		height="8" +		image_selected="media_btn_scrollleft.png" +		image_unselected="media_btn_scrollleft.png" +		layout="topleft" +		left="3" +		tool_tip="Scroll left" +		scale_image="false" +		top="12" +		min_width="8" +		width="8" /> +		<button +		name="scrollright" +		height="8" +		image_selected="media_btn_scrollright.png" +		image_unselected="media_btn_scrollright.png" +		layout="topleft" +		left_pad="9" +		tool_tip="Scroll right" +		scale_image="false" +		top_delta="0" +		min_width="8" +		width="8" /> +		<button +		name="scrolldown" +		height="8" +		image_selected="media_btn_scrolldown.png" +		image_unselected="media_btn_scrolldown.png" +		layout="topleft" +		left="12" +		tool_tip="Scroll down" +		scale_image="false" +		top="20" +		min_width="8" +		width="8" /> +		</layout_panel> +		disabled +	-->  	<layout_panel  		name="zoom_frame"  		auto_resize="false" @@ -520,22 +534,22 @@ disabled  			function="MediaCtrl.Close" />  	  </button>  	</layout_panel> -<!-- -	<panel +	<!-- +		<panel  		height="22"  		layout="topleft"  		auto_resize="false"  		min_width="3"  		width="3"> -	  <icon -		  height="22" -		  image_name="media_panel_divider.png" -		  layout="topleft" -		  top="0" -		  min_width="3" -		  width="3" /> -	</panel> ---> +		<icon +		height="22" +		image_name="media_panel_divider.png" +		layout="topleft" +		top="0" +		min_width="3" +		width="3" /> +		</panel> +	-->  	<layout_panel  		name="new_window"  		auto_resize="false" @@ -556,23 +570,25 @@ disabled  			function="MediaCtrl.Open" />  	  </button>  	</layout_panel> -<!-- -	<panel +	<!-- +		<panel  		height="22"  		layout="topleft"  		auto_resize="false"  		min_width="3"  		width="3"> -	  <icon -		  height="22" -		  image_name="media_panel_divider.png" -		  layout="topleft" -		  top="0" -		  min_width="3" -		  width="3" /> -	</panel> ---> +		<icon +		height="22" +		image_name="media_panel_divider.png" +		layout="topleft" +		top="0" +		min_width="3" +		width="3" /> +		</panel> +	--> +	<!-- bookend panel -->  	<layout_panel +		name="right_bookend"  		width="0"  		layout="topleft"  		user_resize="false" /> diff --git a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml index 9636e32187..566fc95230 100644 --- a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml +++ b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml @@ -227,7 +227,7 @@           right="-10"           top="10"           width="20" -         image_name="TabIcon_Inventory_Selected"/> +         image_name="TabIcon_Things_Selected"/>          <text           follows="all"           height="90" diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 1171a8f0b5..8fc78c6701 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -46,14 +46,24 @@       font="SansSerifSmall"       image_selected="BuyArrow_Over"       image_unselected="BuyArrow_Off" -	image_pressed="BuyArrow_Press" +     image_pressed="BuyArrow_Press"       height="16" -     left="-220" +     left="-245"       name="buycurrency"       pad_right="22px"       tool_tip="My Balance: Click to buy more L$"       top="1"       width="117" /> +    <button +     follows="right|bottom" +     height="16" +     image_selected="parcel_drk_VoiceNo" +     image_unselected="parcel_drk_Voice" +     is_toggle="true" +     left_pad="15" +     top="1" +     name="volume_btn" +     width="16" />      <text       type="string"       length="1" @@ -61,9 +71,9 @@       follows="right|bottom"       halign="right"       height="16" -     top="3" +     top="5"       layout="topleft" -     left_pad="15" +     left_pad="7"       name="TimeText"       text_color="TimeTextColor"       tool_tip="Current time (Pacific)" diff --git a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml index 7722583ce2..63e60aab78 100644 --- a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml +++ b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml @@ -9,7 +9,10 @@    width="300"    height="35"    layout="topleft" -  follows="left|right"> +  follows="left|right" +  background_opaque="false"
 +  background_visible="true"
 +  bg_alpha_color="0.0 0.0 0.0 0.0" >    <text      top="2"      left="10" diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml index 7f7777586c..f16329f8d7 100644 --- a/indra/newview/skins/default/xui/en/panel_toast.xml +++ b/indra/newview/skins/default/xui/en/panel_toast.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <!-- All our XML is utf-8 encoded. --> -<!-- All this does is establish the position of the "close" button on the toast. --> +<!-- Don't remove floater's height! It is needed for Overflow and Start-Up toasts!-->  <floater   legacy_header_height="18" @@ -9,6 +9,7 @@  	title=""    visible="false"    layout="topleft" +  height="40"   	width="305"    left="0"    top="0" @@ -26,36 +27,21 @@    drop_shadow_visible = "false"    border = "false"    > - -  <!-- +  <!-- Don't remove this wiget! It is needed for Overflow and Start-Up toasts!-->    <text     visible="false"     follows="left|top|right|bottom"     font="SansSerifBold" -   height="40" +   height="20"     layout="topleft" -   left="60" +   left="20"     name="toast_text"     word_wrap="true"     text_color="white" -   top="20" -   width="290"> +   top="5"  +   width="260">      Toast text;    </text> -  <icon -    top="20" -    left="10" -    width="32" -    height="32" -    follows="top|left" -    layout="topleft" -    visible="false" -    color="1 1 1 1" -    enabled="true" -    image_name="notify_tip_icon.tga" -    mouse_opaque="true" -    name="icon" -  />-->    <button      layout="topleft"      top="-6" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index ea66bfa197..761c17cfd2 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2863,7 +2863,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].      Connecting...    </string>    <string name="conference-title"> -    Friends Conference +    Ad-hoc Conference    </string>    <string name="inventory_item_offered-im">      Inventory item offered diff --git a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml index bc1ca339a2..706c89f5ed 100644 --- a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml +++ b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml @@ -4,6 +4,8 @@              thumb_center_color="SliderThumbCenterColor"              thumb_image="SliderThumb_Off"              thumb_image_pressed="SliderThumb_Press" -            thumb_image_disabled="SliderThumb_Disabled"  -            track_image="SliderTrack_Horiz" -            track_highlight_image="SliderTrack_Horiz" /> +            thumb_image_disabled="SliderThumb_Disabled" +            track_image_horizontal="SliderTrack_Horiz" +            track_image_vertical="SliderTrack_Vert" +            track_highlight_horizontal_image="SliderTrack_Horiz" +            track_highlight_vertical_image="SliderTrack_Vert" /> | 
