diff options
| author | brad kittenbrink <brad@lindenlab.com> | 2009-08-13 01:28:38 -0400 | 
|---|---|---|
| committer | brad kittenbrink <brad@lindenlab.com> | 2009-08-13 01:28:38 -0400 | 
| commit | 39c2a584f47785c826c3bc133106f3689120bf32 (patch) | |
| tree | 898695d92fc467672618f08260106ab773e456b5 | |
| parent | a15feff98c13cd693e60fc59345609c007de16db (diff) | |
| parent | efd58603da6062d90a5d7019987409994bc73858 (diff) | |
Merged latest viewer-2.0.0-3 change up through svn r130333 into login-api.
197 files changed, 6346 insertions, 3234 deletions
diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp index d431071c25..835cdbca04 100644 --- a/indra/llcommon/llassettype.cpp +++ b/indra/llcommon/llassettype.cpp @@ -282,6 +282,12 @@ bool LLAssetType::lookupIsProtectedCategoryType(EType asset_type)  	return true;  } +// static +bool LLAssetType::lookupIsEnsembleCategoryType(EType asset_type) +{ +	return (asset_type >= AT_FOLDER_ENSEMBLE_START && +			asset_type <= AT_FOLDER_ENSEMBLE_END); +}  // static. Generate a good default description  void LLAssetType::generateDescriptionFor(LLAssetType::EType asset_type, diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h index eb6ad494db..8b29c8defa 100644 --- a/indra/llcommon/llassettype.h +++ b/indra/llcommon/llassettype.h @@ -186,6 +186,7 @@ public:  	static const char*  		lookupCategoryName(EType asset_type);
  	static bool 				lookupIsProtectedCategoryType(EType asset_type);
 +	static bool 				lookupIsEnsembleCategoryType(EType asset_type);
  	/* TODO: Change return types from "const char *" to "const std::string &".
  	This is fairly straightforward, but requires changing some calls to use .c_str().
 diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp index 59aca12de2..e2a77f1d1e 100644 --- a/indra/llinventory/llinventory.cpp +++ b/indra/llinventory/llinventory.cpp @@ -133,6 +133,11 @@ LLAssetType::EType LLInventoryObject::getActualType() const  	return mType;  } +BOOL LLInventoryObject::getIsLinkType() const +{ +	return LLAssetType::lookupIsLinkType(mType); +} +  // See LLInventoryItem override.  // virtual  const LLUUID& LLInventoryObject::getLinkedUUID() const diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h index ce64317f48..2b4d8ed831 100644 --- a/indra/llinventory/llinventory.h +++ b/indra/llinventory/llinventory.h @@ -97,7 +97,7 @@ public:  	virtual const std::string& getName() const;  	virtual LLAssetType::EType getType() const;  	LLAssetType::EType getActualType() const; // bypasses indirection for linked items - +	BOOL getIsLinkType() const;  	// mutators - will not call updateServer();  	void setUUID(const LLUUID& new_uuid);  	void rename(const std::string& new_name); @@ -263,6 +263,10 @@ public:  	void setInventoryType(LLInventoryType::EType inv_type);  	void setFlags(U32 flags);  	void setCreationDate(time_t creation_date_utc); +	 +	// This is currently only used in the Viewer to handle calling cards +	// where the creator is actually used to store the target. +	void setCreator(const LLUUID& creator) { mPermissions.setCreator(creator); }  	// Put this inventory item onto the current outgoing mesage. It  	// assumes you have already called nextBlock(). diff --git a/indra/llinventory/llpermissions.h b/indra/llinventory/llpermissions.h index d4ec399436..864088148f 100644 --- a/indra/llinventory/llpermissions.h +++ b/indra/llinventory/llpermissions.h @@ -252,7 +252,11 @@ public:  	BOOL setGroupBits( const LLUUID& agent, const LLUUID& group, BOOL set, PermissionMask bits);  	BOOL setEveryoneBits(const LLUUID& agent, const LLUUID& group, BOOL set, PermissionMask bits);  	BOOL setNextOwnerBits(const LLUUID& agent, const LLUUID& group, BOOL set, PermissionMask bits); - +	 +	// This is currently only used in the Viewer to handle calling cards +	// where the creator is actually used to store the target. Use with care. +	void setCreator(const LLUUID& creator) { mCreator = creator; } +	  	//  	// METHODS  	// diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index 269c02263d..2f6ae72ef5 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -48,6 +48,7 @@ set(llui_SOURCE_FILES      llkeywords.cpp
      lllayoutstack.cpp
      lllineeditor.cpp
 +    lllink.cpp
      llmenugl.cpp
      llmodaldialog.cpp
      llmultifloater.cpp 
 @@ -126,6 +127,7 @@ set(llui_HEADER_FILES      lllayoutstack.h
      lllazyvalue.h
      lllineeditor.h
 +    lllink.h
      llmenugl.h
      llmodaldialog.h
      llmultifloater.h 
 diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index fc3af34951..c566282bef 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -64,12 +64,15 @@ LLButton::Params::Params()  :	label_selected("label_selected"),				// requires is_toggle true  	label_shadow("label_shadow", true),  	auto_resize("auto_resize", false), +	use_ellipses("use_ellipses", false),  	image_unselected("image_unselected"),  	image_selected("image_selected"),  	image_hover_selected("image_hover_selected"),  	image_hover_unselected("image_hover_unselected"),  	image_disabled_selected("image_disabled_selected"),  	image_disabled("image_disabled"), +	image_pressed("image_pressed"), +	image_pressed_selected("image_pressed_selected"),  	image_overlay("image_overlay"),  	image_overlay_alignment("image_overlay_alignment", std::string("center")),  	label_color("label_color"), @@ -108,7 +111,6 @@ LLButton::LLButton(const LLButton::Params& p)  	mFlashing( FALSE ),  	mCurGlowStrength(0.f),  	mNeedsHighlight(FALSE), -	mImagep( NULL ),  	mUnselectedLabel(p.label()),  	mSelectedLabel(p.label_selected()),  	mGLFont(p.font), @@ -118,6 +120,8 @@ LLButton::LLButton(const LLButton::Params& p)  	mImageSelected(p.image_selected),  	mImageDisabled(p.image_disabled),  	mImageDisabledSelected(p.image_disabled_selected), +	mImagePressed(p.image_pressed), +	mImagePressedSelected(p.image_pressed_selected),  	mImageHoverSelected(p.image_hover_selected),  	mImageHoverUnselected(p.image_hover_unselected),  	mUnselectedLabelColor(p.label_color()), @@ -135,6 +139,7 @@ LLButton::LLButton(const LLButton::Params& p)  	mScaleImage(p.scale_image),  	mDropShadowedText(p.label_shadow),  	mAutoResize(p.auto_resize), +	mUseEllipses( p.use_ellipses ),  	mHAlign(p.font_halign),  	mLeftHPad(p.pad_left),  	mRightHPad(p.pad_right), @@ -182,6 +187,11 @@ LLButton::LLButton(const LLButton::Params& p)  			mImageDisabled = p.image_unselected;  			mFadeWhenDisabled = TRUE;  		} + +		if (p.image_pressed_selected == default_params.image_pressed_selected) +		{ +			mImagePressedSelected = mImageUnselected; +		}  	}  	// if custom selected button image provided... @@ -193,6 +203,21 @@ LLButton::LLButton(const LLButton::Params& p)  			mImageDisabledSelected = p.image_selected;  			mFadeWhenDisabled = TRUE;  		} + +		if (p.image_pressed == default_params.image_pressed) +		{ +			mImagePressed = mImageSelected; +		} +	} + +	if (!p.image_pressed.isProvided()) +	{ +		mImagePressed = mImageSelected; +	} + +	if (!p.image_pressed_selected.isProvided()) +	{ +		mImagePressedSelected = mImageUnselected;  	}  	if (mImageUnselected.isNull()) @@ -257,11 +282,6 @@ boost::signals2::connection LLButton::setHeldDownCallback( const commit_signal_t  {  	return mHeldDownSignal.connect(cb);  } -														   -boost::signals2::connection LLButton::setRightClickedCallback( const commit_signal_t::slot_type& cb ) -{ -	return mRightClickSignal.connect(cb); -}  // *TODO: Deprecate (for backwards compatability only) @@ -414,7 +434,7 @@ BOOL	LLButton::handleRightMouseUp(S32 x, S32 y, MASK mask)  		if (pointInView(x, y))  		{ -			mRightClickSignal(this, getValue()); +			mRightClickSignal(this, x,y,mask);  		}  	}  	else  @@ -427,7 +447,7 @@ BOOL	LLButton::handleRightMouseUp(S32 x, S32 y, MASK mask)  void LLButton::onMouseEnter(S32 x, S32 y, MASK mask)  { -	if (getEnabled()) +	if (isInEnabledChain())  		mNeedsHighlight = TRUE;  } @@ -462,7 +482,7 @@ BOOL LLButton::handleHover(S32 x, S32 y, MASK mask)  // virtual  void LLButton::draw()  { -	BOOL flash = FALSE; +	bool flash = FALSE;  	static LLUICachedControl<F32> button_flash_rate("ButtonFlashRate", 0);  	static LLUICachedControl<S32> button_flash_count("ButtonFlashCount", 0); @@ -474,7 +494,7 @@ void LLButton::draw()  		flash = (flash_count % 2 == 0) || flash_count > S32((F32)button_flash_count * 2.f);  	} -	BOOL pressed_by_keyboard = FALSE; +	bool pressed_by_keyboard = FALSE;  	if (hasFocus())  	{  		pressed_by_keyboard = gKeyboard->getKeyDown(' ') || (mCommitOnReturn && gKeyboard->getKeyDown(KEY_RETURN)); @@ -485,24 +505,31 @@ void LLButton::draw()  	S32 local_mouse_y;  	LLUI::getCursorPositionLocal(this, &local_mouse_x, &local_mouse_y); -	BOOL pressed = pressed_by_keyboard  -					|| (hasMouseCapture() && pointInView(local_mouse_x, local_mouse_y))  -                    || getToggleState(); +	bool enabled = isInEnabledChain(); + +	bool pressed = pressed_by_keyboard  +					|| (hasMouseCapture() && pointInView(local_mouse_x, local_mouse_y)); +	bool selected = getToggleState(); -	BOOL use_glow_effect = FALSE; +	bool use_glow_effect = FALSE;  	LLColor4 glow_color = LLColor4::white;  	LLRender::eBlendType glow_type = LLRender::BT_ADD_WITH_ALPHA; -	if ( mNeedsHighlight ) +	LLUIImage* imagep = NULL; +	if (pressed)  	{ -		if (pressed) +		imagep = selected ? mImagePressedSelected : mImagePressed; +	} +	else if ( mNeedsHighlight ) +	{ +		if (selected)  		{  			if (mImageHoverSelected)  			{ -				mImagep = mImageHoverSelected; +				imagep = mImageHoverSelected;  			}  			else  			{ -				mImagep = mImageSelected; +				imagep = mImageSelected;  				use_glow_effect = TRUE;  			}  		} @@ -510,22 +537,37 @@ void LLButton::draw()  		{  			if (mImageHoverUnselected)  			{ -				mImagep = mImageHoverUnselected; +				imagep = mImageHoverUnselected;  			}  			else  			{ -				mImagep = mImageUnselected; +				imagep = mImageUnselected;  				use_glow_effect = TRUE;  			}  		}  	} -	else if ( pressed ) +	else   	{ -		mImagep = mImageSelected; +		imagep = selected ? mImageSelected : mImageUnselected;  	} -	else + +	// Override if more data is available +	// HACK: Use gray checked state to mean either: +	//   enabled and tentative +	// or +	//   disabled but checked +	if (!mImageDisabledSelected.isNull()  +		&&  +			( (enabled && getTentative())  +			|| (!enabled && selected ) ) )  	{ -		mImagep = mImageUnselected; +		imagep = mImageDisabledSelected; +	} +	else if (!mImageDisabled.isNull()  +		&& !enabled  +		&& !selected) +	{ +		imagep = mImageDisabled;  	}  	if (mFlashing) @@ -540,26 +582,7 @@ void LLButton::draw()  			glow_color = flash_color;  	} -	// Override if more data is available -	// HACK: Use gray checked state to mean either: -	//   enabled and tentative -	// or -	//   disabled but checked -	if (!mImageDisabledSelected.isNull()  -		&&  -			( (getEnabled() && getTentative())  -			|| (!getEnabled() && pressed ) ) ) -	{ -		mImagep = mImageDisabledSelected; -	} -	else if (!mImageDisabled.isNull()  -		&& !getEnabled()  -		&& !pressed) -	{ -		mImagep = mImageDisabled; -	} - -	if (mNeedsHighlight && !mImagep) +	if (mNeedsHighlight && !imagep)  	{  		use_glow_effect = TRUE;  	} @@ -568,7 +591,7 @@ void LLButton::draw()  	LLColor4 label_color;  	// label changes when button state changes, not when pressed -	if ( getEnabled() ) +	if ( enabled )  	{  		if ( getToggleState() )  		{ @@ -596,32 +619,18 @@ void LLButton::draw()  	if( getToggleState() )  	{ -		if( getEnabled() || mDisabledSelectedLabel.empty() ) -		{ -			label = mSelectedLabel; -		} -		else -		{ -			label = mDisabledSelectedLabel; -		} +		label = mSelectedLabel;  	}  	else  	{ -		if( getEnabled() || mDisabledLabel.empty() ) -		{ -			label = mUnselectedLabel; -		} -		else -		{ -			label = mDisabledLabel; -		} +		label = mUnselectedLabel;  	}  	// overlay with keyboard focus border  	if (hasFocus())  	{  		F32 lerp_amt = gFocusMgr.getFocusFlashAmt(); -		drawBorder(gFocusMgr.getFocusColor(), llround(lerp(1.f, 3.f, lerp_amt))); +		drawBorder(imagep, gFocusMgr.getFocusColor(), llround(lerp(1.f, 3.f, lerp_amt)));  	}  	if (use_glow_effect) @@ -638,27 +647,27 @@ void LLButton::draw()  	// Draw button image, if available.  	// Otherwise draw basic rectangular button. -	if (mImagep.notNull()) +	if (imagep != NULL)  	{  		// apply automatic 50% alpha fade to disabled image  		LLColor4 disabled_color = mFadeWhenDisabled ? mDisabledImageColor.get() % 0.5f : mDisabledImageColor.get();  		if ( mScaleImage)  		{ -			mImagep->draw(getLocalRect(), getEnabled() ? mImageColor.get() : disabled_color  ); +			imagep->draw(getLocalRect(), enabled ? mImageColor.get() : disabled_color  );  			if (mCurGlowStrength > 0.01f)  			{  				gGL.setSceneBlendType(glow_type); -				mImagep->drawSolid(0, 0, getRect().getWidth(), getRect().getHeight(), glow_color % mCurGlowStrength); +				imagep->drawSolid(0, 0, getRect().getWidth(), getRect().getHeight(), glow_color % mCurGlowStrength);  				gGL.setSceneBlendType(LLRender::BT_ALPHA);  			}  		}  		else  		{ -			mImagep->draw(0, 0, getEnabled() ? mImageColor.get() : disabled_color ); +			imagep->draw(0, 0, enabled ? mImageColor.get() : disabled_color );  			if (mCurGlowStrength > 0.01f)  			{  				gGL.setSceneBlendType(glow_type); -				mImagep->drawSolid(0, 0, glow_color % mCurGlowStrength); +				imagep->drawSolid(0, 0, glow_color % mCurGlowStrength);  				gGL.setSceneBlendType(LLRender::BT_ALPHA);  			}  		} @@ -699,7 +708,7 @@ void LLButton::draw()  		// fade out overlay images on disabled buttons  		LLColor4 overlay_color = mImageOverlayColor.get(); -		if (!getEnabled()) +		if (!enabled)  		{  			overlay_color.mV[VALPHA] = 0.5f;  		} @@ -768,28 +777,33 @@ void LLButton::draw()  			x++;  		} +		// *NOTE: mantipov: before mUseEllipses is implemented in EXT-279 U32_MAX has been passed as +		// max_chars. +		// LLFontGL::render expects S32 max_chars variable but process in a separate way -1 value. +		// Due to U32_MAX is equal to S32 -1 value I have rest this value for non-ellipses mode. +		// Not sure if it is really needed. Probably S32_MAX should be always passed as max_chars.  		mGLFont->render(label, 0, (F32)x, (F32)(LLBUTTON_V_PAD + y_offset),   			label_color,  			mHAlign, LLFontGL::BOTTOM,  			LLFontGL::NORMAL,  			mDropShadowedText ? LLFontGL::DROP_SHADOW_SOFT : LLFontGL::NO_SHADOW, -			U32_MAX, text_width, -			NULL, FALSE, FALSE); +			S32_MAX, text_width, +			NULL, FALSE, mUseEllipses);  	} -	LLView::draw(); +	LLUICtrl::draw();  } -void LLButton::drawBorder(const LLColor4& color, S32 size) +void LLButton::drawBorder(LLUIImage* imagep, const LLColor4& color, S32 size)  { -	if (mImagep.isNull()) return; +	if (imagep == NULL) return;  	if (mScaleImage)  	{ -		mImagep->drawBorder(getLocalRect(), color, size); +		imagep->drawBorder(getLocalRect(), color, size);  	}  	else  	{ -		mImagep->drawBorder(0, 0, color, size); +		imagep->drawBorder(0, 0, color, size);  	}  } @@ -851,16 +865,6 @@ void LLButton::setLabelSelected( const LLStringExplicit& label )  	mSelectedLabel = label;  } -void LLButton::setDisabledLabel( const LLStringExplicit& label ) -{ -	mDisabledLabel = label; -} - -void LLButton::setDisabledSelectedLabel( const LLStringExplicit& label ) -{ -	mDisabledSelectedLabel = label; -} -  void LLButton::setImageUnselected(LLPointer<LLUIImage> image)  {  	mImageUnselected = image; @@ -875,25 +879,11 @@ void LLButton::autoResize()  	LLUIString label;  	if(getToggleState())  	{ -		if( getEnabled() || mDisabledSelectedLabel.empty() ) -		{ -			label = mSelectedLabel; -		} -		else -		{ -			label = mDisabledSelectedLabel; -		} +		label = mSelectedLabel;  	}  	else  	{ -		if( getEnabled() || mDisabledLabel.empty() ) -		{ -			label = mUnselectedLabel; -		} -		else -		{ -			label = mDisabledLabel; -		} +		label = mUnselectedLabel;  	}  	resize(label);  } @@ -915,9 +905,8 @@ void LLButton::resize(LLUIString label)  }  void LLButton::setImages( const std::string &image_name, const std::string &selected_name )  { -	setImageUnselected(image_name); -	setImageSelected(selected_name); - +	setImageUnselected(LLUI::getUIImage(image_name)); +	setImageSelected(LLUI::getUIImage(selected_name));  }  void LLButton::setImageSelected(LLPointer<LLUIImage> image) @@ -950,19 +939,6 @@ void LLButton::setImageDisabledSelected(LLPointer<LLUIImage> image)  	mFadeWhenDisabled = TRUE;  } -void LLButton::setDisabledImages( const std::string &image_name, const std::string &selected_name) -{ -	setDisabledImages( image_name, selected_name, mImageColor.get()); -	mFadeWhenDisabled = TRUE; -} - -void LLButton::setDisabledImages( const std::string &image_name, const std::string &selected_name, const LLColor4& c ) -{ -	setImageDisabled(image_name); -	setImageDisabledSelected(selected_name); -	mDisabledImageColor = c; -} -  void LLButton::setImageHoverSelected(LLPointer<LLUIImage> image)  {  	mImageHoverSelected = image; @@ -973,12 +949,6 @@ void LLButton::setImageHoverUnselected(LLPointer<LLUIImage> image)  	mImageHoverUnselected = image;  } -void LLButton::setHoverImages( const std::string& image_name, const std::string& selected_name ) -{ -	setImageHoverUnselected(image_name); -	setImageHoverSelected(selected_name); -} -  void LLButton::setImageOverlay(const std::string& image_name, LLFontGL::HAlign alignment, const LLColor4& color)  {  	if (image_name.empty()) @@ -1016,42 +986,6 @@ S32 round_up(S32 grid, S32 value)  	}  } -void			LLButton::setImageUnselected(const std::string &image_name) -{	 -	setImageUnselected(LLUI::getUIImage(image_name)); -	mImageUnselectedName = image_name; -} - -void			LLButton::setImageSelected(const std::string &image_name) -{	 -	setImageSelected(LLUI::getUIImage(image_name)); -	mImageSelectedName = image_name; -} - -void			LLButton::setImageHoverSelected(const std::string &image_name) -{ -	setImageHoverSelected(LLUI::getUIImage(image_name)); -	mImageHoverSelectedName = image_name; -} - -void			LLButton::setImageHoverUnselected(const std::string &image_name) -{ -	setImageHoverUnselected(LLUI::getUIImage(image_name)); -	mImageHoverUnselectedName = image_name; -} - -void			LLButton::setImageDisabled(const std::string &image_name) -{ -	setImageDisabled(LLUI::getUIImage(image_name)); -	mImageDisabledName = image_name; -} - -void			LLButton::setImageDisabledSelected(const std::string &image_name) -{ -	setImageDisabledSelected(LLUI::getUIImage(image_name)); -	mImageDisabledSelectedName = image_name; -} -  void LLButton::addImageAttributeToXML(LLXMLNodePtr node,   									  const std::string& image_name,  									  const LLUUID&	image_id, diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h index e387c91a17..249882013a 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -76,6 +76,7 @@ public:  		Optional<std::string>	label_selected;  		Optional<bool>			label_shadow;  		Optional<bool>			auto_resize; +		Optional<bool>			use_ellipses;  		// images  		Optional<LLUIImage*>	image_unselected, @@ -84,6 +85,8 @@ public:  								image_hover_unselected,  								image_disabled_selected,  								image_disabled, +								image_pressed, +								image_pressed_selected,  								image_overlay;  		Optional<std::string>	image_overlay_alignment; @@ -150,14 +153,14 @@ public:  	void			setUnselectedLabelColor( const LLColor4& c )		{ mUnselectedLabelColor = c; }  	void			setSelectedLabelColor( const LLColor4& c )			{ mSelectedLabelColor = c; } +	void			setUseEllipses( BOOL use_ellipses )					{ mUseEllipses = use_ellipses; } +  	boost::signals2::connection setClickedCallback( const commit_signal_t::slot_type& cb ); // mouse down and up within button  	boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb );  	boost::signals2::connection setMouseUpCallback( const commit_signal_t::slot_type& cb ); // mouse up, EVEN IF NOT IN BUTTON  	// Passes a 'count' parameter in the commit param payload, i.e. param["count"])  	boost::signals2::connection setHeldDownCallback( const commit_signal_t::slot_type& cb ); // Mouse button held down and in button -	boost::signals2::connection setRightClickedCallback( const commit_signal_t::slot_type& cb ); // right mouse down and up within button -  	// *TODO: Deprecate (for backwards compatability only) @@ -190,11 +193,7 @@ public:  	virtual void	setColor(const LLColor4& c);  	void			setImages(const std::string &image_name, const std::string &selected_name); -	void			setDisabledImages(const std::string &image_name, const std::string &selected_name); -	void			setDisabledImages(const std::string &image_name, const std::string &selected_name, const LLColor4& c); -	void			setHoverImages(const std::string &image_name, const std::string &selected_name); -  	void			setDisabledImageColor(const LLColor4& c)		{ mDisabledImageColor = c; }  	void			setDisabledSelectedLabelColor( const LLColor4& c )	{ mDisabledSelectedLabelColor = c; } @@ -208,8 +207,6 @@ public:  	virtual BOOL	setLabelArg( const std::string& key, const LLStringExplicit& text );  	void			setLabelUnselected(const LLStringExplicit& label);  	void			setLabelSelected(const LLStringExplicit& label); -	void			setDisabledLabel(const LLStringExplicit& disabled_label); -	void			setDisabledSelectedLabel(const LLStringExplicit& disabled_label);  	void			setDisabledLabelColor( const LLColor4& c )		{ mDisabledLabelColor = c; }  	void			setFont(const LLFontGL *font)		 @@ -223,15 +220,6 @@ public:  	void			setHoverGlowStrength(F32 strength) { mHoverGlowStrength = strength; } -	void			setImageUnselected(const std::string &image_name); -	const std::string& getImageUnselectedName() const { return mImageUnselectedName; } -	void			setImageSelected(const std::string &image_name); -	const std::string& getImageSelectedName() const { return mImageSelectedName; } -	void			setImageHoverSelected(const std::string &image_name); -	void			setImageHoverUnselected(const std::string &image_name); -	void			setImageDisabled(const std::string &image_name); -	void			setImageDisabledSelected(const std::string &image_name); -  	void			setImageUnselected(LLPointer<LLUIImage> image);  	void			setImageSelected(LLPointer<LLUIImage> image);  	void			setImageHoverSelected(LLPointer<LLUIImage> image); @@ -250,106 +238,85 @@ public:  	static void		setFloaterToggle(LLUICtrl* ctrl, const LLSD& sdname);  protected: - -	virtual void	drawBorder(const LLColor4& color, S32 size); - -	void			setImageUnselectedID(const LLUUID &image_id); -	const LLUUID&	getImageUnselectedID() const { return mImageUnselectedID; } -	void			setImageSelectedID(const LLUUID &image_id); -	const LLUUID&	getImageSelectedID() const { return mImageSelectedID; } -	void			setImageHoverSelectedID(const LLUUID &image_id); -	void			setImageHoverUnselectedID(const LLUUID &image_id); -	void			setImageDisabledID(const LLUUID &image_id); -	void			setImageDisabledSelectedID(const LLUUID &image_id);  	const LLPointer<LLUIImage>&	getImageUnselected() const	{ return mImageUnselected; }  	const LLPointer<LLUIImage>& getImageSelected() const	{ return mImageSelected; } -	void			resetMouseDownTimer();  	LLFrameTimer	mMouseDownTimer;  	// If the label is empty, set the picture_style attribute  	static void setupParamsForExport(Params& p, LLView* parent); +private: +	void			drawBorder(LLUIImage* imagep, const LLColor4& color, S32 size); +	void			resetMouseDownTimer();  private: -	commit_signal_t mMouseDownSignal; -	commit_signal_t mMouseUpSignal; -	commit_signal_t mHeldDownSignal; +	commit_signal_t 			mMouseDownSignal; +	commit_signal_t 			mMouseUpSignal; +	commit_signal_t 			mHeldDownSignal; -	const LLFontGL	*mGLFont; +	const LLFontGL*				mGLFont; -	S32				mMouseDownFrame; -	S32 			mMouseHeldDownCount; 	// Counter for parameter passed to held-down callback -	F32				mHeldDownDelay;			// seconds, after which held-down callbacks get called -	S32				mHeldDownFrameDelay;	// frames, after which held-down callbacks get called +	S32							mMouseDownFrame; +	S32 						mMouseHeldDownCount; 	// Counter for parameter passed to held-down callback +	F32							mHeldDownDelay;			// seconds, after which held-down callbacks get called +	S32							mHeldDownFrameDelay;	// frames, after which held-down callbacks get called  	LLPointer<LLUIImage>		mImageOverlay;  	LLFontGL::HAlign			mImageOverlayAlignment; -	LLUIColor	mImageOverlayColor; +	LLUIColor					mImageOverlayColor;  	LLPointer<LLUIImage>		mImageUnselected;  	LLUIString					mUnselectedLabel; -	LLUIColor	mUnselectedLabelColor; +	LLUIColor					mUnselectedLabelColor;  	LLPointer<LLUIImage>		mImageSelected;  	LLUIString					mSelectedLabel; -	LLUIColor	mSelectedLabelColor; +	LLUIColor					mSelectedLabelColor;  	LLPointer<LLUIImage>		mImageHoverSelected;  	LLPointer<LLUIImage>		mImageHoverUnselected;  	LLPointer<LLUIImage>		mImageDisabled; -	LLUIString					mDisabledLabel; -	LLUIColor	mDisabledLabelColor; +	LLUIColor					mDisabledLabelColor;  	LLPointer<LLUIImage>		mImageDisabledSelected;  	LLUIString					mDisabledSelectedLabel; -	LLUIColor	mDisabledSelectedLabelColor; - -	LLUUID			mImageUnselectedID; -	LLUUID			mImageSelectedID; -	LLUUID			mImageHoverSelectedID; -	LLUUID			mImageHoverUnselectedID; -	LLUUID			mImageDisabledID; -	LLUUID			mImageDisabledSelectedID; -	std::string		mImageUnselectedName; -	std::string		mImageSelectedName; -	std::string		mImageHoverSelectedName; -	std::string		mImageHoverUnselectedName; -	std::string		mImageDisabledName; -	std::string		mImageDisabledSelectedName; +	LLUIColor					mDisabledSelectedLabelColor; -	LLUIColor	mHighlightColor; -	LLUIColor		mFlashBgColor; +	LLPointer<LLUIImage>		mImagePressed; +	LLPointer<LLUIImage>		mImagePressedSelected; -	LLUIColor	mImageColor; -	LLUIColor	mDisabledImageColor; +	LLUIColor					mHighlightColor; +	LLUIColor					mFlashBgColor; -	BOOL			mIsToggle; -	BOOL			mScaleImage; +	LLUIColor					mImageColor; +	LLUIColor					mDisabledImageColor; -	BOOL			mDropShadowedText; -	BOOL			mAutoResize; -	BOOL			mBorderEnabled; +	BOOL						mIsToggle; +	BOOL						mScaleImage; -	BOOL			mFlashing; +	BOOL						mDropShadowedText; +	BOOL						mAutoResize; +	BOOL						mUseEllipses; +	BOOL						mBorderEnabled; -	LLFontGL::HAlign mHAlign; -	S32				mLeftHPad; -	S32				mRightHPad; +	BOOL						mFlashing; -	F32				mHoverGlowStrength; -	F32				mCurGlowStrength; +	LLFontGL::HAlign			mHAlign; +	S32							mLeftHPad; +	S32							mRightHPad; -	BOOL			mNeedsHighlight; -	BOOL			mCommitOnReturn; -	BOOL			mFadeWhenDisabled; +	F32							mHoverGlowStrength; +	F32							mCurGlowStrength; -	std::string		mHelpURL; +	BOOL						mNeedsHighlight; +	BOOL						mCommitOnReturn; +	BOOL						mFadeWhenDisabled; -	LLPointer<LLUIImage> mImagep; +	std::string					mHelpURL; -	LLFrameTimer	mFlashingTimer; +	LLFrameTimer				mFlashingTimer;  }; diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp index b43f91e766..455b17ffc7 100644 --- a/indra/llui/llcheckboxctrl.cpp +++ b/indra/llui/llcheckboxctrl.cpp @@ -161,7 +161,6 @@ void LLCheckBoxCtrl::onCommit()  void LLCheckBoxCtrl::setEnabled(BOOL b)  {  	LLView::setEnabled(b); -	mButton->setEnabled(b);  	if (b)  	{ diff --git a/indra/llui/llclipboard.cpp b/indra/llui/llclipboard.cpp index 2cb8197a67..cbd4cb380f 100644 --- a/indra/llui/llclipboard.cpp +++ b/indra/llui/llclipboard.cpp @@ -61,6 +61,12 @@ void LLClipboard::copyFromSubstring(const LLWString &src, S32 pos, S32 len, cons  	LLView::getWindow()->copyTextToClipboard( mString );  } +void LLClipboard::copyFromString(const LLWString &src, const LLUUID& source_id ) +{ +	mSourceID = source_id; +	mString = src; +	LLView::getWindow()->copyTextToClipboard( mString ); +}  const LLWString& LLClipboard::getPasteWString( LLUUID* source_id )  { diff --git a/indra/llui/llclipboard.h b/indra/llui/llclipboard.h index 034a7a6aeb..d7ffeb33e0 100644 --- a/indra/llui/llclipboard.h +++ b/indra/llui/llclipboard.h @@ -50,6 +50,7 @@ public:  	   (i.e. X11/Linux). */  	void		copyFromSubstring(const LLWString ©_from, S32 pos, S32 len, const LLUUID& source_id = LLUUID::null ); +	void		copyFromString(const LLWString ©_from, const LLUUID& source_id = LLUUID::null );  	BOOL		canPasteString() const;  	const LLWString&	getPasteWString(LLUUID* source_id = NULL); diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index f8c6204afb..93d2b83c9f 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -182,12 +182,6 @@ LLComboBox::~LLComboBox()  } -void LLComboBox::setEnabled(BOOL enabled) -{ -	LLView::setEnabled(enabled); -	mButton->setEnabled(enabled); -} -  void LLComboBox::clear()  {   	if (mTextEntry) @@ -196,8 +190,6 @@ void LLComboBox::clear()  	}  	mButton->setLabelSelected(LLStringUtil::null);  	mButton->setLabelUnselected(LLStringUtil::null); -	mButton->setDisabledLabel(LLStringUtil::null); -	mButton->setDisabledSelectedLabel(LLStringUtil::null);  	mList->deselectAllItems();  } @@ -376,10 +368,7 @@ void LLComboBox::setLabel(const LLStringExplicit& name)  	if (!mAllowTextEntry)  	{ -		mButton->setLabelUnselected(name); -		mButton->setLabelSelected(name); -		mButton->setDisabledLabel(name); -		mButton->setDisabledSelectedLabel(name); +		mButton->setLabel(name);  	}  } @@ -441,14 +430,6 @@ void LLComboBox::setButtonVisible(BOOL visible)  	}  } -void LLComboBox::draw() -{ -	mButton->setEnabled(getEnabled() /*&& !mList->isEmpty()*/); - -	// Draw children normally -	LLUICtrl::draw(); -} -  BOOL LLComboBox::setCurrentByIndex( S32 index )  {  	BOOL found = mList->selectNthItem( index ); diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h index db97b0df75..4becda195f 100644 --- a/indra/llui/llcombobox.h +++ b/indra/llui/llcombobox.h @@ -110,11 +110,8 @@ protected:  public:  	// LLView interface -	virtual void	draw();  	virtual void	onFocusLost(); -	virtual void	setEnabled(BOOL enabled); -  	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect);  	virtual BOOL	handleKeyHere(KEY key, MASK mask);  	virtual BOOL	handleUnicodeCharHere(llwchar uni_char); diff --git a/indra/llui/llfiltereditor.cpp b/indra/llui/llfiltereditor.cpp index 0f36483fc2..7d6a4007a2 100644 --- a/indra/llui/llfiltereditor.cpp +++ b/indra/llui/llfiltereditor.cpp @@ -87,6 +87,12 @@ BOOL LLFilterEditor::setLabelArg( const std::string& key, const LLStringExplicit  }  //virtual +void LLFilterEditor::setLabel( const LLStringExplicit &new_label ) +{ +	mFilterEditor->setLabel(new_label); +} + +//virtual  void LLFilterEditor::clear()  {  	if (mFilterEditor) diff --git a/indra/llui/llfiltereditor.h b/indra/llui/llfiltereditor.h index 4240fd770c..fceb82af8d 100644 --- a/indra/llui/llfiltereditor.h +++ b/indra/llui/llfiltereditor.h @@ -74,6 +74,7 @@ public:  	virtual LLSD	getValue() const;  	virtual BOOL	setTextArg( const std::string& key, const LLStringExplicit& text );  	virtual BOOL	setLabelArg( const std::string& key, const LLStringExplicit& text ); +	virtual void	setLabel( const LLStringExplicit &new_label );  	virtual void	clear();  private: diff --git a/indra/llui/llflyoutbutton.cpp b/indra/llui/llflyoutbutton.cpp index 536919c072..3483bac782 100644 --- a/indra/llui/llflyoutbutton.cpp +++ b/indra/llui/llflyoutbutton.cpp @@ -74,13 +74,6 @@ void LLFlyoutButton::draw()  	LLComboBox::draw();	  } -void LLFlyoutButton::setEnabled(BOOL enabled) -{ -	mActionButton->setEnabled(enabled); -	LLComboBox::setEnabled(enabled); -} - -  void LLFlyoutButton::setToggleState(BOOL state)  {  	mToggleState = state; diff --git a/indra/llui/llflyoutbutton.h b/indra/llui/llflyoutbutton.h index 1f1716593a..d8c0f1a50d 100644 --- a/indra/llui/llflyoutbutton.h +++ b/indra/llui/llflyoutbutton.h @@ -61,7 +61,6 @@ protected:  	friend class LLUICtrlFactory;  public:  	virtual void	draw(); -	virtual void	setEnabled(BOOL enabled);  	void setToggleState(BOOL state); diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp index a66f147dcc..3899897c5f 100644 --- a/indra/llui/llfocusmgr.cpp +++ b/indra/llui/llfocusmgr.cpp @@ -49,7 +49,6 @@ LLFocusMgr::LLFocusMgr()  	mDefaultKeyboardFocus( NULL ),  	mKeystrokesOnly(FALSE),  	mTopCtrl( NULL ), -	mFocusWeight(0.f),  	mAppHasFocus(TRUE)   // Macs don't seem to notify us that we've gotten focus, so default to true  	#ifdef _DEBUG  		, mMouseCaptorName("none") @@ -98,8 +97,6 @@ void LLFocusMgr::setKeyboardFocus(LLUICtrl* new_focus, BOOL lock, BOOL keystroke  		return;  	} -	//llinfos << "Keyboard focus handled by " << (new_focus ? new_focus->getName() : "nothing") << llendl; -  	mKeystrokesOnly = keystrokes_only;  	if( new_focus != mKeyboardFocus ) @@ -107,18 +104,48 @@ void LLFocusMgr::setKeyboardFocus(LLUICtrl* new_focus, BOOL lock, BOOL keystroke  		mLastKeyboardFocus = mKeyboardFocus;  		mKeyboardFocus = new_focus; -		if( mLastKeyboardFocus ) +		view_handle_list_t new_focus_list; + +		// walk up the tree to root and add all views to the new_focus_list +		for (LLView* ctrl = mKeyboardFocus; ctrl && ctrl != LLUI::getRootView(); ctrl = ctrl->getParent())  		{ -			mLastKeyboardFocus->onFocusLost(); +			if (ctrl)  +			{ +				new_focus_list.push_front(ctrl->getHandle()); +			}  		} -		// clear out any existing flash -		if (new_focus) +		view_handle_list_t::iterator new_focus_iter = new_focus_list.begin(); +		view_handle_list_t::iterator old_focus_iter = mCachedKeyboardFocusList.begin(); + +		// compare the new focus sub-tree to the old focus sub-tree +		// iterate through the lists in lockstep until we get to a non-common ancestor +		while ((new_focus_iter != new_focus_list.end()) &&  +			   (old_focus_iter != mCachedKeyboardFocusList.end()) &&  +			   ((*new_focus_iter) == (*old_focus_iter)))  		{ -			mFocusWeight = 0.f; -			new_focus->onFocusReceived(); +			new_focus_iter++; +			old_focus_iter++;  		} -		mFocusTimer.reset(); +		 +		// call onFocusLost on all remaining in the old focus list +		while (old_focus_iter != mCachedKeyboardFocusList.end()) +		{ +			if (old_focus_iter->get() != NULL) { +				old_focus_iter->get()->onFocusLost(); +			} +			old_focus_iter++; +		} + +		// call onFocusReceived on all remaining in the new focus list +		while (new_focus_iter != new_focus_list.end()) +		{ +			new_focus_iter->get()->onFocusReceived(); +			new_focus_iter++; +		} + +		// cache the new focus list for next time +		swap(mCachedKeyboardFocusList, new_focus_list);  		#ifdef _DEBUG  			mKeyboardFocusName = new_focus ? new_focus->getName() : std::string("none"); @@ -318,7 +345,7 @@ void LLFocusMgr::unlockFocus()  F32 LLFocusMgr::getFocusFlashAmt() const  { -	return clamp_rescale(getFocusTime(), 0.f, FOCUS_FADE_TIME, mFocusWeight, 0.f); +	return clamp_rescale(mFocusFlashTimer.getElapsedTimeF32(), 0.f, FOCUS_FADE_TIME, 1.f, 0.f);  }  LLColor4 LLFocusMgr::getFocusColor() const @@ -335,8 +362,7 @@ LLColor4 LLFocusMgr::getFocusColor() const  void LLFocusMgr::triggerFocusFlash()  { -	mFocusTimer.reset(); -	mFocusWeight = 1.f; +	mFocusFlashTimer.reset();  }  void LLFocusMgr::setAppHasFocus(BOOL focus)  diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h index aaeb25a870..fbe0d22084 100644 --- a/indra/llui/llfocusmgr.h +++ b/indra/llui/llfocusmgr.h @@ -63,7 +63,6 @@ public:  	BOOL			getKeystrokesOnly() { return mKeystrokesOnly; }  	void			setKeystrokesOnly(BOOL keystrokes_only) { mKeystrokesOnly = keystrokes_only; } -	F32				getFocusTime() const { return mFocusTimer.getElapsedTimeF32(); }  	F32				getFocusFlashAmt() const;  	S32				getFocusFlashWidth() const { return llround(lerp(1.f, 3.f, getFocusFlashAmt())); }  	LLColor4		getFocusColor() const; @@ -102,12 +101,15 @@ private:  	LLUICtrl*			mLastKeyboardFocus;			// who last had focus  	LLUICtrl*			mDefaultKeyboardFocus;  	BOOL				mKeystrokesOnly; +	 +	// caching list of keyboard focus ancestors for calling onFocusReceived and onFocusLost +	typedef std::list<LLHandle<LLView> > view_handle_list_t; +	view_handle_list_t mCachedKeyboardFocusList;  	// Top View  	LLUICtrl*			mTopCtrl; -	LLFrameTimer		mFocusTimer; -	F32					mFocusWeight; +	LLFrameTimer		mFocusFlashTimer;  	BOOL				mAppHasFocus; diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index f94eb7fcc3..20957499bc 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -318,10 +318,8 @@ void LLLineEditor::setMaxTextLength(S32 max_text_length)  void LLLineEditor::updateTextPadding()  {  	static LLUICachedControl<S32> line_editor_hpad ("UILineEditorHPad", 0); -	mTextPadLeft = llclamp(mTextPadLeft, 0, getRect().getWidth()); -	mTextPadRight = llclamp(mTextPadRight, 0, getRect().getWidth()); -	mMinHPixels = line_editor_hpad + mTextPadLeft; -	mMaxHPixels = getRect().getWidth() - mMinHPixels - mTextPadRight; +	mMinHPixels = line_editor_hpad + llclamp(mTextPadLeft, 0, getRect().getWidth());; +	mMaxHPixels = getRect().getWidth() - mMinHPixels - llclamp(mTextPadRight, 0, getRect().getWidth());  } @@ -625,6 +623,8 @@ BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask)  	// delay cursor flashing  	mKeystrokeTimer.reset(); +	 +	LLUICtrl::handleMouseDown(x,y,mask);  	return TRUE;  } @@ -738,7 +738,9 @@ BOOL LLLineEditor::handleMouseUp(S32 x, S32 y, MASK mask)  		// take selection to 'primary' clipboard  		updatePrimary();  	} - +	 +	// We won't call LLUICtrl::handleMouseUp to avoid double calls of  childrenHandleMouseUp().Just invoke the signal manually. +	mMouseUpSignal(this,x,y, mask);  	return handled;  } diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index e355cfda8b..e5c32846a0 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -176,6 +176,12 @@ LLMenuItemGL::LLMenuItemGL(const LLMenuItemGL::Params& p)  	std::string key_str = shortcut.substr(pipe_pos+1);  	LLKeyboard::keyFromString(key_str, &mAcceleratorKey); + +	LL_DEBUGS("HotKeys") << "Process short cut key: shortcut: " << shortcut +		<< ", key str: " << key_str +		<< ", accelerator mask: " << mAcceleratorMask +		<< ", accelerator key: " << mAcceleratorKey +		<< LL_ENDL;  }  BOOL LLMenuItemGL::handleAcceleratorKey(KEY key, MASK mask) @@ -285,6 +291,7 @@ void LLMenuItemGL::appendAcceleratorString( std::string& st ) const  		st.append( " " );  	}  	st.append( keystr ); +	LL_DEBUGS("HotKeys") << "appendAcceleratorString: " << st << LL_ENDL;  }  void LLMenuItemGL::setJumpKey(KEY key) @@ -797,7 +804,7 @@ BOOL LLMenuItemCallGL::handleRightMouseUp(S32 x, S32 y, MASK mask)  {  	if (pointInView(x, y))  	{ -		mRightClickSignal(this, getValue()); +		mRightClickSignal(this,x,y, mask);  	}  	return TRUE; @@ -2996,6 +3003,7 @@ BOOL LLMenuBarGL::handleMouseDown(S32 x, S32 y, MASK mask)  	return LLMenuGL::handleMouseDown(x, y, mask);  } +/*  BOOL LLMenuBarGL::handleRightMouseDown(S32 x, S32 y, MASK mask)  {  	// clicks on menu bar closes existing menus from other contexts but leave @@ -3007,6 +3015,7 @@ BOOL LLMenuBarGL::handleRightMouseDown(S32 x, S32 y, MASK mask)  	return LLMenuGL::handleMouseDown(x, y, mask);  } +*/  void LLMenuBarGL::draw() diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 828956a217..930276f7bc 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -297,10 +297,6 @@ public:  		return mEnableSignal.connect(cb);  	} -	boost::signals2::connection setRightClickedCallback( const commit_signal_t::slot_type& cb ) -	{ -		return mRightClickSignal.connect(cb); -	}  private:  	enable_signal_t mEnableSignal; @@ -492,9 +488,6 @@ public:  	void buildDrawLabels();  	void createJumpKeys(); -	// Show popup in global screen space based on last mouse location. -	static void showPopup(LLMenuGL* menu); -  	// Show popup at a specific location.  	static void showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y); @@ -716,7 +709,9 @@ public:  	/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);  	/*virtual*/ BOOL handleJumpKey(KEY key);  	/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); -	/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); +//	/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); + +  	/*virtual*/ void draw();  	/*virtual*/ BOOL jumpKeysActive(); diff --git a/indra/llui/llmultislider.h b/indra/llui/llmultislider.h index 89d44eaa87..da633cc1cd 100644 --- a/indra/llui/llmultislider.h +++ b/indra/llui/llmultislider.h @@ -120,4 +120,4 @@ protected:  	commit_signal_t	mMouseUpSignal;  }; -#endif  // LL_LLSLIDER_H +#endif  // LL_MULTI_SLIDER_H diff --git a/indra/llui/llscrollbar.cpp b/indra/llui/llscrollbar.cpp index bc489592d4..566825ff3b 100644 --- a/indra/llui/llscrollbar.cpp +++ b/indra/llui/llscrollbar.cpp @@ -497,8 +497,8 @@ void LLScrollbar::draw()  	}  	// Draw background and thumb. -	if (   ( mOrientation == VERTICAL&&(mThumbImageV.isNull() || mThumbImageV.isNull()) )  -		|| (mOrientation == HORIZONTAL&&(mTrackImageH.isNull() || mThumbImageH.isNull()) )) +	if (   ( mOrientation == VERTICAL&&(mThumbImageV.isNull() || mThumbImageH.isNull()) )  +		|| (mOrientation == HORIZONTAL&&(mTrackImageH.isNull() || mTrackImageV.isNull()) ))  	{  		gl_rect_2d(mOrientation == HORIZONTAL ? mThickness : 0,   		mOrientation == VERTICAL ? getRect().getHeight() - 2 * mThickness : getRect().getHeight(), @@ -513,7 +513,6 @@ void LLScrollbar::draw()  		// Thumb  		LLRect outline_rect = mThumbRect;  		outline_rect.stretch(2); -		S32 rect_fix = 0;  		// Background  		if(mOrientation == HORIZONTAL) @@ -521,7 +520,7 @@ void LLScrollbar::draw()  			mTrackImageH->drawSolid(mThickness								//S32 x  								   , 0										//S32 y  								   , getRect().getWidth() - 2 * mThickness  //S32 width -								   , getRect().getHeight()- rect_fix		//S32 height +								   , getRect().getHeight()					//S32 height  								   , mTrackColor.get());                    //const LLColor4& color  			if (gFocusMgr.getKeyboardFocus() == this) @@ -540,7 +539,7 @@ void LLScrollbar::draw()  		}  		else if(mOrientation == VERTICAL)  		{ -			mTrackImageV->drawSolid(  0+rect_fix								//S32 x +			mTrackImageV->drawSolid(  0										//S32 x  								   , mThickness								//S32 y  								   , getRect().getWidth()					//S32 width  								   , getRect().getHeight() - 2 * mThickness	//S32 height diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 79f0f9d71b..3041773fb2 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -1684,7 +1684,8 @@ BOOL LLScrollListCtrl::handleDoubleClick(S32 x, S32 y, MASK mask)  		// so the scroll bars will work.  		if (NULL == LLView::childrenHandleDoubleClick(x, y, mask))  		{ -			if( mCanSelect && mOnDoubleClickCallback ) +			// Run the callback only if an item is being double-clicked. +			if( mCanSelect && hitItem(x, y) && mOnDoubleClickCallback )  			{  				mOnDoubleClickCallback();  			} diff --git a/indra/llui/llslider.cpp b/indra/llui/llslider.cpp index 9483cca104..840dd9b089 100644 --- a/indra/llui/llslider.cpp +++ b/indra/llui/llslider.cpp @@ -51,6 +51,8 @@ LLSlider::Params::Params()  	thumb_outline_color("thumb_outline_color"),  	thumb_center_color("thumb_center_color"),  	thumb_image("thumb_image"), +	thumb_image_pressed("thumb_image_pressed"), +	thumb_image_disabled("thumb_image_disabled"),  	track_image("track_image"),  	track_highlight_image("track_highlight_image"),  	mouse_down_callback("mouse_down_callback"), @@ -66,6 +68,8 @@ LLSlider::LLSlider(const LLSlider::Params& p)  	mThumbOutlineColor(p.thumb_outline_color()),  	mThumbCenterColor(p.thumb_center_color()),  	mThumbImage(p.thumb_image), +	mThumbImagePressed(p.thumb_image_pressed), +	mThumbImageDisabled(p.thumb_image_disabled),  	mTrackImage(p.track_image),  	mTrackHighlightImage(p.track_highlight_image)  { @@ -245,10 +249,6 @@ void LLSlider::draw()  	// drawing solids requires texturing be disabled  	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -	F32 opacity = getEnabled() ? 1.f : 0.3f; -	LLColor4 center_color = (mThumbCenterColor.get() % opacity); -	LLColor4 track_color = (mTrackColor.get() % opacity); -  	// Track  	LLRect track_rect(mThumbImage->getWidth() / 2,   						getLocalRect().getCenterY() + (mTrackImage->getHeight() / 2),  @@ -259,18 +259,38 @@ void LLSlider::draw()  	mTrackHighlightImage->draw(highlight_rect);  	// Thumb -	if( hasMouseCapture() ) -	{ -		// Show ghost where thumb was before dragging began. -		mThumbImage->draw(mDragStartThumbRect, mThumbCenterColor.get() % 0.3f); -	}  	if (hasFocus())  	{  		// Draw focus highlighting.  		mThumbImage->drawBorder(mThumbRect, gFocusMgr.getFocusColor(), gFocusMgr.getFocusFlashWidth());  	} -	// Fill in the thumb. -	mThumbImage->draw(mThumbRect, hasMouseCapture() ? mThumbOutlineColor.get() : center_color); +	if( hasMouseCapture() ) // currently clicking on slider +	{ +		// Show ghost where thumb was before dragging began. +		if (mThumbImage.notNull()) +		{ +			mThumbImage->draw(mDragStartThumbRect, mThumbCenterColor.get() % 0.3f); +		} +		if (mThumbImagePressed.notNull()) +		{ +			mThumbImagePressed->draw(mThumbRect, mThumbOutlineColor); +		} +	} +	else if (!isInEnabledChain()) +	{ +		if (mThumbImageDisabled.notNull()) +		{ +			mThumbImageDisabled->draw(mThumbRect, mThumbCenterColor); +		} +	} +	else +	{ +		if (mThumbImage.notNull()) +		{ +			mThumbImage->draw(mThumbRect, mThumbCenterColor); +		} +	} +	  	LLUICtrl::draw();  } diff --git a/indra/llui/llslider.h b/indra/llui/llslider.h index 088fd20d94..e2a94e4d8c 100644 --- a/indra/llui/llslider.h +++ b/indra/llui/llslider.h @@ -46,6 +46,8 @@ public:  							thumb_center_color;  		Optional<LLUIImage*>	thumb_image, +								thumb_image_pressed, +								thumb_image_disabled,  								track_image,  								track_highlight_image; @@ -85,9 +87,11 @@ private:  	S32				mMouseOffset;  	LLRect			mDragStartThumbRect; -	LLUIImage*		mThumbImage; -	LLUIImage*		mTrackImage; -	LLUIImage*		mTrackHighlightImage; +	LLPointer<LLUIImage>	mThumbImage; +	LLPointer<LLUIImage>	mThumbImagePressed; +	LLPointer<LLUIImage>	mThumbImageDisabled; +	LLPointer<LLUIImage>	mTrackImage; +	LLPointer<LLUIImage>	mTrackHighlightImage;  	LLRect			mThumbRect;  	LLUIColor	mTrackColor; diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp index 3dd8d21f6b..f9bcb685b8 100644 --- a/indra/llui/lltextbox.cpp +++ b/indra/llui/lltextbox.cpp @@ -32,12 +32,18 @@  #include "linden_common.h"  #include "lltextbox.h" +#include "lllink.h"  #include "lluictrlfactory.h"  #include "llfocusmgr.h"  #include "llwindow.h"  static LLDefaultChildRegistry::Register<LLTextBox> r("text"); +//*NOTE +// LLLink is not used in code for now, therefor Visual Studio doesn't build it. +// "link" is registered here to force Visual Studio to build LLLink class. +static LLDefaultChildRegistry::Register<LLLink>	register_link("link"); +  LLTextBox::Params::Params()  :	text_color("text_color"),  	length("length"), diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index 19d1d4040c..8aa7540446 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -47,7 +47,6 @@ LLUICtrl::Params::Params()  	init_callback("init_callback"),  	commit_callback("commit_callback"),  	validate_callback("validate_callback"), -	rightclick_callback("rightclick_callback"),  	mouseenter_callback("mouseenter_callback"),  	mouseleave_callback("mouseleave_callback"),  	control_name("control_name") @@ -199,9 +198,6 @@ void LLUICtrl::initFromParams(const Params& p)  		}  	} -	if(p.rightclick_callback.isProvided()) -		initCommitCallback(p.rightclick_callback, mRightClickSignal); -  	if(p.mouseenter_callback.isProvided())  		initCommitCallback(p.mouseenter_callback, mMouseEnterSignal); @@ -282,7 +278,24 @@ void LLUICtrl::onMouseLeave(S32 x, S32 y, MASK mask)  {  	mMouseLeaveSignal(this, getValue());  } - +//virtual  +BOOL LLUICtrl::handleMouseDown(S32 x, S32 y, MASK mask){ +	BOOL handled  = LLView::handleMouseDown(x,y,mask); +	mMouseDownSignal(this,x,y,mask); +	return handled; +} +//virtual +BOOL LLUICtrl::handleMouseUp(S32 x, S32 y, MASK mask){ +	BOOL handled  = LLView::handleMouseUp(x,y,mask); +	mMouseUpSignal(this,x,y,mask); +	return handled; +} +//virtual +BOOL LLUICtrl::handleRightMouseUp(S32 x, S32 y, MASK mask){ +	BOOL handled  = LLView::handleRightMouseUp(x,y,mask); +	mRightClickSignal(this,x,y,mask); +	return handled; +}  void LLUICtrl::onCommit()  {  	mCommitSignal(this, getValue()); diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h index cf6634f370..6ba3b01fcb 100644 --- a/indra/llui/lluictrl.h +++ b/indra/llui/lluictrl.h @@ -81,6 +81,8 @@ public:  	typedef boost::function<void (LLUICtrl* ctrl, const LLSD& param)> commit_callback_t;  	typedef boost::signals2::signal<void (LLUICtrl* ctrl, const LLSD& param)> commit_signal_t; +	// *TODO: add xml support for this type of signal in the future +	typedef boost::signals2::signal<void (LLUICtrl* ctrl, S32 x, S32 y, MASK mask)> mouse_signal_t;  	typedef boost::function<bool (LLUICtrl* ctrl, const LLSD& param)> enable_callback_t;  	typedef boost::signals2::signal<bool (LLUICtrl* ctrl, const LLSD& param), boost_boolean_combiner> enable_signal_t; @@ -144,8 +146,6 @@ public:  										commit_callback;  		Optional<EnableCallbackParam>	validate_callback; -		Optional<CommitCallbackParam>	rightclick_callback; -  		Optional<CommitCallbackParam>	mouseenter_callback;  		Optional<CommitCallbackParam>	mouseleave_callback; @@ -186,6 +186,9 @@ public:  	/*virtual*/ BOOL	getTentative() const;  	/*virtual*/ void	onMouseEnter(S32 x, S32 y, MASK mask);  	/*virtual*/ void	onMouseLeave(S32 x, S32 y, MASK mask); +	/*virtual*/ BOOL 	handleMouseDown(S32 x, S32 y, MASK mask); +	/*virtual*/ BOOL 	handleMouseUp(S32 x, S32 y, MASK mask); +	/*virtual*/ BOOL	handleRightMouseUp(S32 x, S32 y, MASK mask);  	// From LLFocusableElement  	/*virtual*/ void	setFocus( BOOL b ); @@ -253,6 +256,10 @@ public:  	boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mMouseEnterSignal.connect(cb); }  	boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mMouseLeaveSignal.connect(cb); } +	boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb ) { return mMouseDownSignal.connect(cb); } +	boost::signals2::connection setMouseUpCallback( const mouse_signal_t::slot_type& cb ) { return mMouseUpSignal.connect(cb); } +	boost::signals2::connection setRightClickedCallback( const mouse_signal_t::slot_type& cb ) { return mRightClickSignal.connect(cb); } +	  	// *TODO: Deprecate; for backwards compatability only:  	boost::signals2::connection setCommitCallback( boost::function<void (LLUICtrl*,void*)> cb, void* data);	  	boost::signals2::connection setValidateBeforeCommit( boost::function<bool (const LLSD& data)> cb ); @@ -279,11 +286,14 @@ protected:  	commit_signal_t		mCommitSignal;  	enable_signal_t		mValidateSignal; -	commit_signal_t		mRightClickSignal;  	commit_signal_t		mMouseEnterSignal;  	commit_signal_t		mMouseLeaveSignal; - +	 +	mouse_signal_t		mMouseDownSignal; +	mouse_signal_t		mMouseUpSignal; +	mouse_signal_t		mRightClickSignal; +	      LLViewModelPtr  mViewModel;  	LLControlVariable* mControlVariable; diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h index 9dbe458bae..b82feb3f58 100644 --- a/indra/llui/lluictrlfactory.h +++ b/indra/llui/lluictrlfactory.h @@ -459,6 +459,14 @@ LLChildRegistry<DERIVED>::Register<T>::Register(const char* tag, LLWidgetCreator  {  	const std::type_info* widget_type_infop = &typeid(T);  	// associate parameter block type with template .xml file +	std::string* existing_tag = LLWidgetNameRegistry ::instance().getValue(&typeid(typename T::Params)); +	if (existing_tag != NULL && *existing_tag != tag) +	{ +		// duplicate entry for T::Params +		// try creating empty param block in derived classes that inherit T::Params +		int* crash = 0; +		*crash = 0; +	}  	LLWidgetNameRegistry ::instance().defaultRegistrar().add(&typeid(typename T::Params), tag);  	// associate widget type with factory function  	LLDefaultWidgetRegistry::instance().defaultRegistrar().add(widget_type_infop, &LLUICtrlFactory::createDefaultWidget<T>); diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index d94472a8e5..e3b61dfaa2 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -75,6 +75,8 @@ S32		LLView::sLastBottomXML = S32_MIN;  BOOL LLView::sIsDrawing = FALSE;  #endif +static LLDefaultChildRegistry::Register<LLView> r("view"); +  LLView::Params::Params()  :	name("name", std::string("unnamed")),  	enabled("enabled", true), diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 4a9a715b34..c68d01d705 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -135,7 +135,6 @@ set(viewer_SOURCE_FILES      llflexibleobject.cpp      llfloaterabout.cpp      llfloateractivespeakers.cpp -    llfloateraddlandmark.cpp      llfloateranimpreview.cpp      llfloaterauction.cpp      llfloateravatarpicker.cpp @@ -162,7 +161,6 @@ set(viewer_SOURCE_FILES      llfloaterfonttest.cpp      llfloatergesture.cpp      llfloatergodtools.cpp -    llfloatergroupinfo.cpp      llfloatergroupinvite.cpp      llfloatergroups.cpp      llfloaterhandler.cpp @@ -249,6 +247,7 @@ set(viewer_SOURCE_FILES      lllocaltextureobject.cpp      lllocationhistory.cpp      lllocationinputctrl.cpp +    llurllineeditorctrl.cpp      lllogchat.cpp      llloginhandler.cpp      lllogininstance.cpp @@ -280,11 +279,12 @@ set(viewer_SOURCE_FILES      llnotify.cpp      lloutputmonitorctrl.cpp      lloverlaybar.cpp +    llpanelappearance.cpp +    llpanelappearancetab.cpp      llpanelavatar.cpp      llpanelavatarrow.cpp      llpanelavatartag.cpp      llpanelclassified.cpp -    llsidetraypanelcontainer.cpp      llpanelcontents.cpp      llpaneldirbrowser.cpp      llpaneldirclassified.cpp @@ -308,6 +308,8 @@ set(viewer_SOURCE_FILES      llpanellandmarks.cpp      llpanellandmedia.cpp      llpanellogin.cpp +    llpanellookinfo.cpp +    llpanellooks.cpp      llpanelmedia.cpp      llpanelmeprofile.cpp      llpanelmovetip.cpp @@ -332,7 +334,6 @@ set(viewer_SOURCE_FILES      llpreviewanim.cpp      llpreview.cpp      llpreviewgesture.cpp -    llpreviewlandmark.cpp      llpreviewnotecard.cpp      llpreviewscript.cpp      llpreviewsound.cpp @@ -346,6 +347,7 @@ set(viewer_SOURCE_FILES      llscreenchannel.cpp      llselectmgr.cpp      llsidetray.cpp +    llsidetraypanelcontainer.cpp      llsky.cpp      llslurl.cpp      llspatialpartition.cpp @@ -356,6 +358,8 @@ set(viewer_SOURCE_FILES      llstylemap.cpp      llsurface.cpp      llsurfacepatch.cpp +    llsyswellitem.cpp +    llsyswellwindow.cpp      llteleporthistory.cpp      lltexglobalcolor.cpp      lltexlayer.cpp @@ -582,7 +586,6 @@ set(viewer_HEADER_FILES      llflexibleobject.h      llfloaterabout.h      llfloateractivespeakers.h -    llfloateraddlandmark.h      llfloateranimpreview.h      llfloaterauction.h      llfloateravatarpicker.h @@ -609,7 +612,6 @@ set(viewer_HEADER_FILES      llfloaterfriends.h      llfloatergesture.h      llfloatergodtools.h -    llfloatergroupinfo.h      llfloatergroupinvite.h      llfloatergroups.h      llfloaterhandler.h @@ -697,6 +699,7 @@ set(viewer_HEADER_FILES      lllocaltextureobject.h      lllocationhistory.h      lllocationinputctrl.h +    llurllineeditorctrl.h      lllogchat.h      llloginhandler.h      lllogininstance.h @@ -726,11 +729,12 @@ set(viewer_HEADER_FILES      llnotify.h      lloutputmonitorctrl.h      lloverlaybar.h +    llpanelappearance.h +    llpanelappearancetab.h      llpanelavatar.h      llpanelavatarrow.h      llpanelavatartag.h      llpanelclassified.h -    llsidetraypanelcontainer.h      llpanelcontents.h      llpaneldirbrowser.h      llpaneldirclassified.h @@ -754,6 +758,8 @@ set(viewer_HEADER_FILES      llpanellandmarks.h      llpanellandmedia.h      llpanellogin.h +    llpanellookinfo.h +    llpanellooks.h      llpanelmedia.h      llpanelmeprofile.h      llpanelmovetip.h @@ -778,7 +784,6 @@ set(viewer_HEADER_FILES      llpreview.h      llpreviewanim.h      llpreviewgesture.h -    llpreviewlandmark.h      llpreviewnotecard.h      llpreviewscript.h      llpreviewsound.h @@ -794,6 +799,7 @@ set(viewer_HEADER_FILES      llsavedsettingsglue.h      llselectmgr.h      llsidetray.h +    llsidetraypanelcontainer.h      llsky.h      llslurl.h      llspatialpartition.h @@ -804,6 +810,8 @@ set(viewer_HEADER_FILES      llstylemap.h      llsurface.h      llsurfacepatch.h +    llsyswellitem.h +    llsyswellwindow.h          lltable.h      llteleporthistory.h      lltexglobalcolor.h diff --git a/indra/newview/app_settings/foldertypes.xml b/indra/newview/app_settings/foldertypes.xml index 4d4d479bdd..698158308e 100644 --- a/indra/newview/app_settings/foldertypes.xml +++ b/indra/newview/app_settings/foldertypes.xml @@ -9,50 +9,66 @@      asset_num="27"      xui_name="head"      icon_name="inv_folder_outfit_head.tga" +	allowed="hair,eyes"       />    <ensemble      asset_num="28"      xui_name="gloves"      icon_name="inv_folder_outfit_gloves.tga" +	allowed="gloves"       />    <ensemble      asset_num="29"      xui_name="jacket"      icon_name="inv_folder_outfit_jacket.tga" +	allowed="jacket"       />    <ensemble      asset_num="30"      xui_name="pants"      icon_name="inv_folder_outfit_pants.tga" +	allowed="pants,underpants"       />    <ensemble      asset_num="31"      xui_name="shape"      icon_name="inv_folder_outfit_shape.tga" +	allowed="shape,skin,hair,eyes"       />    <ensemble      asset_num="32"      xui_name="shoes"      icon_name="inv_folder_outfit_shoes.tga" +	allowed="shoes,socks"       />    <ensemble      asset_num="33"      xui_name="shirt"      icon_name="inv_folder_outfit_shirt.tga" +	allowed="shirt,undershirt"       />    <ensemble      asset_num="34"      xui_name="skirt"      icon_name="inv_folder_outfit_skirt.tga" +	allowed=""       />    <ensemble      asset_num="35"      xui_name="underpants"      icon_name="inv_folder_outfit_underpants.tga" +	allowed="underpants"       />    <ensemble      asset_num="36"      xui_name="undershirt"      icon_name="inv_folder_outfit_undershirt.tga" +	allowed="undershirt" +     /> +  <ensemble +    asset_num="47" +    xui_name="outfit" +    icon_name="inv_folder_outfit.tga" +	allowed="outfit"       />  </ensemble_defs> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 1432365d38..702839869a 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1193,10 +1193,10 @@          <real>6.0</real>        </array>      </map> -    <key>CameraOffsetDefault</key> +    <key>CameraOffsetRearView</key>      <map>        <key>Comment</key> -      <string>Default camera offset from avatar</string> +      <string>Initial camera offset from avatar in Rear View</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -1208,6 +1208,36 @@          <real>0.75</real>        </array>      </map> +    <key>CameraOffsetFrontView</key> +    <map> +      <key>Comment</key> +      <string>Initial camera offset from avatar in Front View</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Vector3</string> +      <key>Value</key> +      <array> +        <real>2.2</real> +        <real>0.0</real> +        <real>0.0</real> +      </array> +    </map> +    <key>CameraOffsetGroupView</key> +    <map> +      <key>Comment</key> +      <string>Initial camera offset from avatar in Group View</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Vector3</string> +      <key>Value</key> +      <array> +        <real>-1.0</real> +        <real>0.7</real> +        <real>0.5</real> +      </array> +    </map>      <key>CameraOffsetScale</key>      <map>        <key>Comment</key> @@ -1245,6 +1275,17 @@        <key>Value</key>        <real>1.0</real>      </map> +    <key>CameraPreset</key> +    <map> +      <key>Comment</key> +      <string>Preset camera position - view (0 - rear, 1 - front, 2 - group)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ChatBarStealsFocus</key>      <map>        <key>Comment</key> @@ -3134,14 +3175,14 @@        <key>Value</key>        <integer>0</integer>      </map> -    <key>FocusOffsetDefault</key> +    <key>FocusOffsetRearView</key>      <map>        <key>Comment</key> -      <string>Default focus point offset relative to avatar (x-axis is forward)</string> +      <string>Initial focus point offset relative to avatar for the camera preset Rear View (x-axis is forward)</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> -      <string>Vector3</string> +      <string>Vector3D</string>        <key>Value</key>        <array>          <real>1.0</real> @@ -3149,6 +3190,36 @@          <real>1.0</real>        </array>      </map> +    <key>FocusOffsetFrontView</key> +    <map> +      <key>Comment</key> +      <string>Initial focus point offset relative to avatar for the camera preset Front View</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Vector3D</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>0.0</real> +        <real>0.0</real> +      </array> +    </map> +    <key>FocusOffsetGroupView</key> +    <map> +      <key>Comment</key> +      <string>Initial focus point offset relative to avatar for the camera preset Group View</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Vector3D</string> +      <key>Value</key> +      <array> +        <real>1.5</real> +        <real>0.5</real> +        <real>1.0</real> +      </array> +    </map>      <key>FocusPosOnLogout</key>      <map>        <key>Comment</key> @@ -4593,7 +4664,7 @@        <key>Type</key>        <string>F32</string>        <key>Value</key> -      <integer>20</integer> +      <integer>130</integer>      </map>      <key>NextOwnerCopy</key>      <map> @@ -6838,8 +6909,30 @@        <string>Boolean</string>        <key>Value</key>        <integer>0</integer> +    </map>     +    <key>ShowPGSearchAll</key>     +    <map> +      <key>Comment</key> +      <string>Show/Hide Navigation Bar Favorites Panel</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer>    +    </map> +    <key>ShowNavbarFavoritesPanel</key>     +    <map> +      <key>Comment</key> +      <string>Show/Hide Navigation Bar Navigation Panel</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer>         </map> -    <key>ShowPGSearchAll</key> +    <key>ShowNavbarNavigationPanel</key>              <map>        <key>Comment</key>        <string>Display results of search All that are flagged as PG</string> diff --git a/indra/newview/build_win32_appConfig.py b/indra/newview/build_win32_appConfig.py new file mode 100644 index 0000000000..2ac0e17dc1 --- /dev/null +++ b/indra/newview/build_win32_appConfig.py @@ -0,0 +1,57 @@ +# @file build_win32_appConfig.py +# @brief Create the windows app.config file to redirect crt linkage. +# +# $LicenseInfo:firstyear=2009&license=viewergpl$ +#  +# Copyright (c) 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$ + +import sys, os +from xml.dom.minidom import parse + +def main(): +    src_manifest_name = sys.argv[1] +    src_config_name = sys.argv[2] +    dst_config_name = sys.argv[3] +  +    manifest_dom = parse(src_manifest_name) +    node = manifest_dom.getElementsByTagName('assemblyIdentity')[0] +    manifest_assm_ver = node.getAttribute('version') +     +    config_dom = parse(src_config_name) +    node = config_dom.getElementsByTagName('bindingRedirect')[0] +    node.setAttribute('newVersion', manifest_assm_ver) +    node.setAttribute('oldVersion', node.getAttribute('oldVersion') + manifest_assm_ver) +    comment = config_dom.createComment("This file is automatically generated by the build. see indra/newview/build_win32_appConfig.py") +    config_dom.insertBefore(comment, config_dom.childNodes[0]) +     +    f = open(dst_config_name, 'w') +    config_dom.writexml(f) +    f.close() +         +    return 0 + +if __name__ == "__main__": +    main() diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index e3d3d66d87..366c337269 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -46,13 +46,15 @@  #include "llfloatercamera.h"  #include "llfloatercustomize.h"  #include "llfloaterdirectory.h" -#include "llfloatergroupinfo.h" +  #include "llfloaterland.h"  #include "llfloatermute.h"  #include "llfloatersnapshot.h"  #include "llfloatertools.h"  #include "llfloaterworldmap.h" +#include "llgroupactions.h" +  #include "llfocusmgr.h"  #include "llgroupmgr.h"  #include "llhomelocationresponder.h" @@ -282,6 +284,8 @@ LLAgent::LLAgent() :  	mLastCameraMode( CAMERA_MODE_THIRD_PERSON ),  	mViewsPushed(FALSE), +	mCameraPreset(CAMERA_PRESET_REAR_VIEW), +  	mCustomAnim(FALSE),  	mShowAvatar(TRUE),  	mCameraAnimating( FALSE ), @@ -295,7 +299,6 @@ LLAgent::LLAgent() :  	mCameraFocusOffset(),  	mCameraFOVDefault(DEFAULT_FIELD_OF_VIEW), -	mCameraOffsetDefault(),  	mCameraCollidePlane(),  	mCurrentCameraDistance(2.f),		// meters, set in init() @@ -409,9 +412,19 @@ void LLAgent::init()  	setFlying( gSavedSettings.getBOOL("FlyingAtExit") );  	mCameraFocusOffsetTarget = LLVector4(gSavedSettings.getVector3("CameraOffsetBuild")); -	mCameraOffsetDefault = gSavedSettings.getVector3("CameraOffsetDefault"); +	 +	mCameraPreset = (ECameraPreset) gSavedSettings.getU32("CameraPreset"); + +	mCameraOffsetInitial[CAMERA_PRESET_REAR_VIEW] = gSavedSettings.getVector3("CameraOffsetRearView"); +	mCameraOffsetInitial[CAMERA_PRESET_FRONT_VIEW] = gSavedSettings.getVector3("CameraOffsetFrontView"); +	mCameraOffsetInitial[CAMERA_PRESET_GROUP_VIEW] = gSavedSettings.getVector3("CameraOffsetGroupView"); + +	mFocusOffsetInitial[CAMERA_PRESET_REAR_VIEW] = gSavedSettings.getVector3d("FocusOffsetRearView"); +	mFocusOffsetInitial[CAMERA_PRESET_FRONT_VIEW] = gSavedSettings.getVector3d("FocusOffsetFrontView"); +	mFocusOffsetInitial[CAMERA_PRESET_GROUP_VIEW] = gSavedSettings.getVector3d("FocusOffsetGroupView"); +  	mCameraCollidePlane.clearVec(); -	mCurrentCameraDistance = mCameraOffsetDefault.magVec() * gSavedSettings.getF32("CameraOffsetScale"); +	mCurrentCameraDistance = getCameraOffsetInitial().magVec() * gSavedSettings.getF32("CameraOffsetScale");  	mTargetCameraDistance = mCurrentCameraDistance;  	mCameraZoomFraction = 1.f;  	mTrackFocusObject = gSavedSettings.getBOOL("TrackFocusObject"); @@ -933,6 +946,20 @@ LLHost LLAgent::getRegionHost() const  //-----------------------------------------------------------------------------  std::string LLAgent::getSLURL() const  { +	return buildSLURL(true); +} + +//----------------------------------------------------------------------------- +// getUnescapedSLURL() +// returns empty() if getRegion() == NULL +//----------------------------------------------------------------------------- +std::string LLAgent::getUnescapedSLURL() const +{ +	return buildSLURL(false); +} + +std::string LLAgent::buildSLURL(const bool escape) const +{  	std::string slurl;  	LLViewerRegion *regionp = getRegion();  	if (regionp) @@ -941,7 +968,10 @@ std::string LLAgent::getSLURL() const  		S32 x = llround( (F32)fmod( agentPos.mdV[VX], (F64)REGION_WIDTH_METERS ) );  		S32 y = llround( (F32)fmod( agentPos.mdV[VY], (F64)REGION_WIDTH_METERS ) );  		S32 z = llround( (F32)agentPos.mdV[VZ] ); -		slurl = LLSLURL::buildSLURL(regionp->getName(), x, y, z); +		if (escape) +			slurl = LLSLURL::buildSLURL(regionp->getName(), x, y, z); +		else +			slurl = LLSLURL::buildUnescapedSLURL(regionp->getName(), x, y, z);  	}  	return slurl;  } @@ -1889,7 +1919,7 @@ void LLAgent::cameraOrbitIn(const F32 meters)  {  	if (mFocusOnAvatar && mCameraMode == CAMERA_MODE_THIRD_PERSON)  	{ -		F32 camera_offset_dist = llmax(0.001f, mCameraOffsetDefault.magVec() * gSavedSettings.getF32("CameraOffsetScale")); +		F32 camera_offset_dist = llmax(0.001f, getCameraOffsetInitial().magVec() * gSavedSettings.getF32("CameraOffsetScale"));  		mCameraZoomFraction = (mTargetCameraDistance - meters) / camera_offset_dist; @@ -3544,7 +3574,6 @@ LLVector3d LLAgent::calcThirdPersonFocusOffset()  {  	// ...offset from avatar  	LLVector3d focus_offset; -	focus_offset.setVec(gSavedSettings.getVector3("FocusOffsetDefault"));  	LLQuaternion agent_rot = mFrameAgent.getQuaternion();  	if (!mAvatarObject.isNull() && mAvatarObject->getParent()) @@ -3552,7 +3581,7 @@ LLVector3d LLAgent::calcThirdPersonFocusOffset()  		agent_rot *= ((LLViewerObject*)(mAvatarObject->getParent()))->getRenderRotation();  	} -	focus_offset = focus_offset * agent_rot; +	focus_offset = mFocusOffsetInitial[mCameraPreset] * agent_rot;  	return focus_offset;  } @@ -3629,7 +3658,6 @@ LLVector3d LLAgent::calcCameraPositionTargetGlobal(BOOL *hit_limit)  	LLVector3d	frame_center_global = mAvatarObject.isNull() ? getPositionGlobal()   															 : getPosGlobalFromAgent(mAvatarObject->mRoot.getWorldPosition()); -	LLVector3   upAxis = getUpAxis();  	BOOL		isConstrained = FALSE;  	LLVector3d	head_offset;  	head_offset.setVec(mThirdPersonHeadOffset); @@ -3692,7 +3720,7 @@ LLVector3d LLAgent::calcCameraPositionTargetGlobal(BOOL *hit_limit)  		}  		else  		{ -			local_camera_offset = mCameraZoomFraction * mCameraOffsetDefault * gSavedSettings.getF32("CameraOffsetScale"); +			local_camera_offset = mCameraZoomFraction * getCameraOffsetInitial() * gSavedSettings.getF32("CameraOffsetScale");  			// are we sitting down?  			if (mAvatarObject.notNull() && mAvatarObject->getParent()) @@ -3889,6 +3917,12 @@ LLVector3d LLAgent::calcCameraPositionTargetGlobal(BOOL *hit_limit)  } +LLVector3 LLAgent::getCameraOffsetInitial() +{ +	return mCameraOffsetInitial[mCameraPreset]; +} + +  //-----------------------------------------------------------------------------  // handleScrollWheel()  //----------------------------------------------------------------------------- @@ -3923,10 +3957,12 @@ void LLAgent::handleScrollWheel(S32 clicks)  		}  		else if (mFocusOnAvatar && mCameraMode == CAMERA_MODE_THIRD_PERSON)  		{ -			F32 current_zoom_fraction = mTargetCameraDistance / (mCameraOffsetDefault.magVec() * gSavedSettings.getF32("CameraOffsetScale")); +			F32 camera_offset_initial_mag = getCameraOffsetInitial().magVec(); +			 +			F32 current_zoom_fraction = mTargetCameraDistance / (camera_offset_initial_mag * gSavedSettings.getF32("CameraOffsetScale"));  			current_zoom_fraction *= 1.f - pow(ROOT_ROOT_TWO, clicks); -			cameraOrbitIn(current_zoom_fraction * mCameraOffsetDefault.magVec() * gSavedSettings.getF32("CameraOffsetScale")); +			cameraOrbitIn(current_zoom_fraction * camera_offset_initial_mag * gSavedSettings.getF32("CameraOffsetScale"));  		}  		else  		{ @@ -4299,6 +4335,20 @@ void LLAgent::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_ani  } +void LLAgent::switchCameraPreset(ECameraPreset preset) +{ +	//zoom is supposed to be reset for the front and group views +	mCameraZoomFraction = 1.f; + +	//focusing on avatar in that case means following him on movements +	mFocusOnAvatar = TRUE; + +	mCameraPreset = preset; + +	gSavedSettings.setU32("CameraPreset", mCameraPreset); +} + +  //  // Focus point management  // @@ -5497,8 +5547,8 @@ BOOL LLAgent::downGrabbed() const  void update_group_floaters(const LLUUID& group_id)  { -	LLFloaterGroupInfo::refreshGroup(group_id); - +	 +	LLGroupActions::refresh(group_id);  	//*TODO Implement group update for Profile View   	// still actual as of July 31, 2009 (DZ) @@ -5546,7 +5596,7 @@ void LLAgent::processAgentDropGroup(LLMessageSystem *msg, void **)  		LLGroupMgr::getInstance()->clearGroupData(group_id);  		// close the floater for this group, if any. -		LLFloaterGroupInfo::closeGroup(group_id); +		LLGroupActions::closeGroup(group_id);  		// refresh the group panel of the search window, if necessary.  		LLFloaterDirectory::refreshGroup(group_id);  	} @@ -5625,7 +5675,7 @@ class LLAgentDropGroupViewerNode : public LLHTTPNode  				LLGroupMgr::getInstance()->clearGroupData(group_id);  				// close the floater for this group, if any. -				LLFloaterGroupInfo::closeGroup(group_id); +				LLGroupActions::closeGroup(group_id);  				// refresh the group panel of the search window,  				//if necessary.  				LLFloaterDirectory::refreshGroup(group_id); diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 35ebc41909..090f165576 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -75,6 +75,19 @@ enum ECameraMode  	CAMERA_MODE_FOLLOW  }; +/** Camera Presets for CAMERA_MODE_THIRD_PERSON */ +enum ECameraPreset  +{ +	/** Default preset, what the Third Person Mode actually was */ +	CAMERA_PRESET_REAR_VIEW, +	 +	/** "Looking at the Avatar from the front" */ +	CAMERA_PRESET_FRONT_VIEW,  + +	/** "Above and to the left, over the shoulder, pulled back a little on the zoom" */ +	CAMERA_PRESET_GROUP_VIEW +}; +  enum EAnimRequest  {  	ANIM_REQUEST_START, @@ -265,10 +278,12 @@ public:  	LLViewerRegion	*getRegion() const;  	LLHost			getRegionHost() const;  	std::string		getSLURL() const; +	std::string		getUnescapedSLURL() const;  	BOOL			inPrelude();  	BOOL 			buildLocationString(std::string& str, ELocationFormat fmt = LOCATION_FORMAT_LANDMARK); // Utility to build a location string  private:  	LLViewerRegion	*mRegionp; +	std::string  	buildSLURL(const bool escape) const;  	//--------------------------------------------------------------------  	// History @@ -661,6 +676,27 @@ private:  	ECameraMode		mLastCameraMode;  	//-------------------------------------------------------------------- +	// Preset +	//-------------------------------------------------------------------- +public: +	void switchCameraPreset(ECameraPreset preset); + +private: +	 +	/** Determines default camera offset depending on the current camera preset */ +	LLVector3 getCameraOffsetInitial(); + +	/** Camera preset in Third Person Mode */ +	ECameraPreset mCameraPreset;  + +	/** Initial camera offsets */ +	std::map<ECameraPreset, LLVector3> mCameraOffsetInitial; + +	/** Initial focus offsets */ +	std::map<ECameraPreset, LLVector3d> mFocusOffsetInitial; + + +	//--------------------------------------------------------------------  	// Position  	//--------------------------------------------------------------------  public: @@ -678,7 +714,6 @@ private:  	F32				mCameraFOVZoomFactor;			// Amount of fov zoom applied to camera when zeroing in on an object  	F32				mCameraCurrentFOVZoomFactor;	// Interpolated fov zoom  	F32				mCameraFOVDefault;				// Default field of view that is basis for FOV zoom effect -	LLVector3		mCameraOffsetDefault;			// Default third-person camera offset  	LLVector4		mCameraCollidePlane;			// Colliding plane for camera  	F32				mCameraZoomFraction;			// Mousewheel driven fraction of zoom  	LLVector3		mCameraPositionAgent;			// Camera position in agent coordinates diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 22875cbca2..4834b31bc7 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -37,6 +37,7 @@  #include "llfloatercustomize.h"  #include "llfloaterinventory.h" +#include "llinventorybridge.h"  #include "llinventorymodel.h"  #include "llnotify.h"  #include "llviewerregion.h" @@ -46,6 +47,9 @@  #include <boost/scoped_ptr.hpp> +// For viewer2.0 internal demo, don't use current outfit folder contents at all during initial startup.  Will reenable +// this once we're sure this works completely. +// #define USE_CURRENT_OUTFIT_FOLDER  LLAgentWearables gAgentWearables; @@ -662,13 +666,6 @@ BOOL LLAgentWearables::isWearingItem(const LLUUID& item_id, BOOL include_linked_  	return FALSE;  } -struct InitialWearableData -{ -	S32 mType; -	U32 mIndex; -	LLUUID mItemID; -}; -  // MULTI-WEARABLE: update for multiple  // static  void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgsys, void** user_data) @@ -696,14 +693,18 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs  			return;  		} +		// Get the UUID of the current outfit folder (will be created if it doesn't exist) +		LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); +		 +		LLOutfitFolderFetch* outfit = new LLOutfitFolderFetch(); +		  		//lldebugs << "processAgentInitialWearablesUpdate()" << llendl;  		// Add wearables -		LLUUID asset_id_array[WT_COUNT]; -		LLUUID item_id_array[WT_COUNT];  		// MULTI-WEARABLE: TODO: update once messages change.  Currently use results to populate the zeroth element.  		gAgentWearables.mItemsAwaitingWearableUpdate.clear();  		for (S32 i=0; i < num_wearables; i++)  		{ +			// Parse initial werables data from message system  			U8 type_u8 = 0;  			gMessageSystem->getU8Fast(_PREHASH_WearableData, _PREHASH_WearableType, type_u8, i);  			if (type_u8 >= WT_COUNT) @@ -711,10 +712,10 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs  				continue;  			}  			const EWearableType type = (EWearableType) type_u8; - +			  			LLUUID item_id;  			gMessageSystem->getUUIDFast(_PREHASH_WearableData, _PREHASH_ItemID, item_id, i); - +			  			LLUUID asset_id;  			gMessageSystem->getUUIDFast(_PREHASH_WearableData, _PREHASH_AssetID, asset_id, i);  			if (asset_id.isNull()) @@ -728,34 +729,77 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs  				{  					continue;  				} - -				// MULTI-WEARABLE: extend arrays to index by type + index. -				gAgentWearables.mItemsAwaitingWearableUpdate.insert(item_id); -				item_id_array[type] = item_id; -				asset_id_array[type] = asset_id; +				 +				// MULTI-WEARABLE: TODO: update once messages change.  Currently use results to populate the zeroth element. +				 +				// Store initial wearables data until we know whether we have the current outfit folder or need to use the data. +				InitialWearableData * temp_wearable_data = new InitialWearableData(type, 0, item_id, asset_id); // MULTI-WEARABLE: update +				outfit->mAgentInitialWearables.push_back(temp_wearable_data); +				  			}  			lldebugs << "       " << LLWearableDictionary::getTypeLabel(type) << llendl;  		} +		 +		// What we do here is get the complete information on the items in +		// the inventory, and set up an observer that will wait for that to +		// happen. +		LLInventoryFetchDescendentsObserver::folder_ref_t folders; +		folders.push_back(current_outfit_id); +		outfit->fetchDescendents(folders); +		if(outfit->isEverythingComplete()) +		{ +			// everything is already here - call done. +			outfit->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(outfit); +		} +	} +} -		// now that we have the asset ids...request the wearable assets -		for (S32 i = 0; i < WT_COUNT; i++) +// static  +void LLAgentWearables::fetchInitialWearables(initial_wearable_data_vec_t & current_outfit_links, initial_wearable_data_vec_t & message_wearables) +{ +#ifdef USE_CURRENT_OUTFIT_FOLDER +	if (!current_outfit_links.empty()) +	{ +		for (U8 i = 0; i < current_outfit_links.size(); ++i)  		{ -			// MULTI-WEARABLE: TODO: update once messages change. -			// Currently use results to populate the zeroth element. -			if (!item_id_array[i].isNull()) -			{ -				InitialWearableData *wear_data = new InitialWearableData; -				wear_data->mType = i; -				wear_data->mIndex = 0; // MULTI-WEARABLE: update -				wear_data->mItemID = item_id_array[i]; -				LLWearableList::instance().getAsset(asset_id_array[i], -													LLStringUtil::null, -													LLWearableDictionary::getAssetType((EWearableType) i),  -													onInitialWearableAssetArrived, (void*)wear_data); -			} +			// Fetch the wearables in the current outfit folder +			LLWearableList::instance().getAsset(current_outfit_links[i]->mAssetID, +												LLStringUtil::null, +												LLWearableDictionary::getAssetType(current_outfit_links[i]->mType), +												onInitialWearableAssetArrived, (void*)(current_outfit_links[i]));			 +		} +	} +	else  +#endif +	if (!message_wearables.empty()) // We have an empty current outfit folder, use the message data instead. +	{ +		LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); +		for (U8 i = 0; i < message_wearables.size(); ++i) +		{ +			// Populate the current outfit folder with links to the wearables passed in the message +#ifdef USE_CURRENT_OUTFIT_FOLDER +			std::string link_name = "WearableLink"; +			link_inventory_item(gAgent.getID(), message_wearables[i]->mItemID, current_outfit_id, link_name, +								LLAssetType::AT_LINK, LLPointer<LLInventoryCallback>(NULL)); +#endif +			// Fetch the wearables +			LLWearableList::instance().getAsset(message_wearables[i]->mAssetID, +												LLStringUtil::null, +												LLWearableDictionary::getAssetType(message_wearables[i]->mType), +												onInitialWearableAssetArrived, (void*)(message_wearables[i]));  		}  	} +	else +	{ +		LL_WARNS("Wearables") << "No current outfit folder iterms found and no initial wearables fallback message received." << LL_ENDL; +	}  }  // A single wearable that the avatar was wearing on start-up has arrived from the database. @@ -763,7 +807,7 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs  void LLAgentWearables::onInitialWearableAssetArrived(LLWearable* wearable, void* userdata)  {  	boost::scoped_ptr<InitialWearableData> wear_data((InitialWearableData*)userdata);  -	const EWearableType type = (EWearableType)wear_data->mType; +	const EWearableType type = wear_data->mType;  	const U32 index = wear_data->mIndex;  	LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); @@ -775,10 +819,11 @@ void LLAgentWearables::onInitialWearableAssetArrived(LLWearable* wearable, void*  	if (wearable)  	{  		llassert(type == wearable->getType()); +		// MULTI-WEARABLE: is this always zeroth element?  Change sometime.  		wearable->setItemID(wear_data->mItemID); -		gAgentWearables.setWearable(type,index,wearable); +		gAgentWearables.setWearable(type, index, wearable);  		gAgentWearables.mItemsAwaitingWearableUpdate.erase(wear_data->mItemID); -		 +  		// disable composites if initial textures are baked  		avatar->setupComposites(); @@ -954,6 +999,8 @@ void LLAgentWearables::createStandardWearablesAllDone()  	mAvatarObject->onFirstTEMessageReceived();  } +// Note:	wearables_to_include should be a list of EWearableType types +//			attachments_to_include should be a list of attachment points  void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name,  									 const LLDynamicArray<S32>& wearables_to_include,  									 const LLDynamicArray<S32>& attachments_to_include, @@ -1087,6 +1134,97 @@ void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name,  	}   } +// Note:	wearables_to_include should be a list of EWearableType types +//			attachments_to_include should be a list of attachment points +void LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name, +										  const LLDynamicArray<S32>& wearables_to_include, +										  const LLDynamicArray<S32>& attachments_to_include, +										  BOOL rename_clothing) +{ +	if (mAvatarObject.isNull()) +	{ +		return; +	} + +	// First, make a folder in the Clothes directory. +	LLUUID folder_id = gInventory.createNewCategory( +		gInventory.findCategoryUUIDForType(LLAssetType::AT_MY_OUTFITS), +		LLAssetType::AT_OUTFIT, +		new_folder_name); + +//	bool found_first_item = false; + +	/////////////////// +	// Wearables + +	if (wearables_to_include.count()) +	{ +		// Then, iterate though each of the wearables and save links to them in the folder. +		S32 i; +		S32 count = wearables_to_include.count(); +		LLDynamicArray<LLUUID> delete_items; +		LLPointer<LLRefCount> cbdone = NULL; +		for (i = 0; i < count; ++i) +		{ +			const S32 type = wearables_to_include[i]; +			for (U32 j=0; j<getWearableCount((EWearableType)i); j++) +			{ +				LLWearable* old_wearable = getWearable((EWearableType)type,j); +				if (old_wearable) +				{ +					std::string new_name; +					if (rename_clothing) +					{ +						new_name = new_folder_name; +						new_name.append(" "); +						new_name.append(old_wearable->getTypeLabel()); +						LLStringUtil::truncate(new_name, DB_INV_ITEM_NAME_STR_LEN); +					} + +					LLViewerInventoryItem* item = gInventory.getItem(getWearableItemID((EWearableType) type, j)); +					if (!item) continue; +					LLPointer<LLInventoryCallback> cb = NULL; +					link_inventory_item(gAgent.getID(), +										item->getUUID(), +										folder_id, +										new_name, +										LLAssetType::AT_LINK, +										cb); +				} +			} +		} +		gInventory.notifyObservers(); +	} + + +	/////////////////// +	// Attachments + +	if (attachments_to_include.count()) +	{ +		for (S32 i = 0; i < attachments_to_include.count(); i++) +		{ +			S32 attachment_pt = attachments_to_include[i]; +			LLViewerJointAttachment* attachment = get_if_there(mAvatarObject->mAttachmentPoints, attachment_pt, (LLViewerJointAttachment*)NULL); +			if (!attachment) continue; +			LLViewerObject* attached_object = attachment->getObject(); +			if (!attached_object) continue; +			const LLUUID& item_id = attachment->getItemID(); +			if (item_id.isNull()) continue; +			LLInventoryItem* item = gInventory.getItem(item_id); +			if (!item) continue; + +			LLPointer<LLInventoryCallback> cb = NULL; +			link_inventory_item(gAgent.getID(), +								item->getUUID(), +								folder_id, +								item->getName(), +								LLAssetType::AT_LINK, +								cb); +		} +	}  +} +  void LLAgentWearables::makeNewOutfitDone(S32 type, U32 index)  {  	LLUUID first_item_id = getWearableItemID((EWearableType)type, index); @@ -1635,3 +1773,56 @@ void LLAgentWearables::updateServer()  	sendAgentWearablesUpdate();  	gAgent.sendAgentSetAppearance();  } + +void LLAgentWearables::LLOutfitFolderFetch::done() +{ +	// What we do here is get the complete information on the items in +	// the library, and set up an observer that will wait for that to +	// happen. +	LLInventoryModel::cat_array_t cat_array; +	LLInventoryModel::item_array_t item_array; +	gInventory.collectDescendents(mCompleteFolders.front(), +								  cat_array, +								  item_array, +								  LLInventoryModel::EXCLUDE_TRASH); +	S32 count = item_array.count(); +	LLAgentWearables::initial_wearable_data_vec_t current_outfit_links; +	current_outfit_links.reserve(count); +	 +	for(S32 i = 0; i < count; ++i) +	{ +		// A bit of a hack since wearables database doesn't contain asset types... +		// Perform indirection in case this assetID is in fact a link.  This only works +		// because of the assumption that all assetIDs and itemIDs are unique (i.e.  +		// no assetID is also used as an itemID elsewhere); therefore if the assetID +		// exists as an itemID in the user's inventory, then this must be a link. +		const LLInventoryItem *linked_item = gInventory.getItem(item_array.get(i)->getUUID()); +		LLAssetType::EType asset_type = (LLAssetType::EType) 0; +		if (linked_item) +		{ +			asset_type = linked_item->getType(); +			LLInventoryItem * base_item = gInventory.getItem(linked_item->getLinkedUUID()); +			if (base_item) +			{ +				EWearableType type = (EWearableType) (base_item->getFlags() & LLInventoryItem::II_FLAGS_WEARABLES_MASK); +				// MULTI-WEARABLE: update +				InitialWearableData * temp_wearable_data = new InitialWearableData(type, 0, linked_item->getLinkedUUID(), base_item->getAssetUUID()); +				current_outfit_links.push_back(temp_wearable_data); +			} +			else +			{ +				llwarns << "Null base_item in LLOutfitFolderFetch::done, linkedUUID is " << linked_item->getLinkedUUID().asString() << llendl; +			} +		} +		else +		{ +			llwarns << "Null linked_item in LLOutfitFolderFetch::done, UUID is " << item_array.get(i)->getUUID().asString() << llendl; +		} +	} +	 +	gInventory.removeObserver(this); +	LLAgentWearables::fetchInitialWearables(current_outfit_links, mAgentInitialWearables); +	mAgentInitialWearables.clear(); +	delete this; +} + diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index 977efd71b4..971fd9ee37 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -36,15 +36,34 @@  #include "llmemory.h"  #include "lluuid.h"  #include "llinventory.h" +#include "llinventorymodel.h"  #include "llviewerinventory.h" +#include "llvoavatardefines.h"  class LLInventoryItem;  class LLVOAvatarSelf;  class LLWearable; +// Forward Declaration +class LLInventoryFetchDescendentsObserver; +  class LLAgentWearables  {  	//-------------------------------------------------------------------- +	// Data Types +	//-------------------------------------------------------------------- +	typedef struct _InitialWearableData +	{ +		EWearableType mType; +		U32 mIndex; +		LLUUID mItemID; +		LLUUID mAssetID; +		_InitialWearableData(EWearableType type, U32 index, LLUUID itemID, LLUUID assetID) : +		mType(type), mIndex(index), mItemID(itemID), mAssetID(assetID) { } +	} InitialWearableData; +	typedef std::vector<InitialWearableData *> initial_wearable_data_vec_t; +	 +	//--------------------------------------------------------------------  	// Constructors / destructors / Initializers  	//--------------------------------------------------------------------  public: @@ -85,13 +104,14 @@ public:  	U32				getWearableCount(const EWearableType type) const; +	//-------------------------------------------------------------------- +	// Setters +	//-------------------------------------------------------------------- +  private:  	// Low-level data structure setter - public access is via setWearableItem, etc.  	void 			setWearable(const EWearableType type, U32 index, LLWearable *wearable); -	//-------------------------------------------------------------------- -	// Setters -	//--------------------------------------------------------------------  public:  	void			setWearableItem(LLInventoryItem* new_item, LLWearable* wearable, bool do_append = false);  	void			setWearableOutfit(const LLInventoryItem::item_array_t& items, const LLDynamicArray< LLWearable* >& wearables, BOOL remove); @@ -127,7 +147,9 @@ protected:  	// Server Communication  	//--------------------------------------------------------------------  public: +	// Processes the initial wearables update message (if necessary, since the outfit folder makes it redundant)  	static void		processAgentInitialWearablesUpdate(LLMessageSystem* mesgsys, void** user_data); +	static void		fetchInitialWearables(initial_wearable_data_vec_t & current_outfit_links, initial_wearable_data_vec_t & message_wearables);  protected:  	void			sendAgentWearablesUpdate();  	void			sendAgentWearablesRequest(); @@ -139,10 +161,19 @@ protected:  	// Outfits  	//--------------------------------------------------------------------  public: +	// Note:	wearables_to_include should be a list of EWearableType types +	//			attachments_to_include should be a list of attachment points  	void			makeNewOutfit(const std::string& new_folder_name,  								  const LLDynamicArray<S32>& wearables_to_include,  								  const LLDynamicArray<S32>& attachments_to_include, -								  BOOL rename_clothing);protected: +								  BOOL rename_clothing); +	 +	// Note:	wearables_to_include should be a list of EWearableType types +	//			attachments_to_include should be a list of attachment points +	void			makeNewOutfitLinks(const std::string& new_folder_name, +									   const LLDynamicArray<S32>& wearables_to_include, +									   const LLDynamicArray<S32>& attachments_to_include, +									   BOOL rename_clothing);  private:  	void			makeNewOutfitDone(S32 type, U32 index);  @@ -223,6 +254,17 @@ private:  		U32 mTodo;  		LLPointer<LLRefCount> mCB;  	}; +	 +	// Outfit folder fetching callback structure. +	class LLOutfitFolderFetch : public LLInventoryFetchDescendentsObserver +	{ +	public: +		LLOutfitFolderFetch() {} +		~LLOutfitFolderFetch() {} +		virtual void done(); +		 +		LLAgentWearables::initial_wearable_data_vec_t mAgentInitialWearables; +	};  }; // LLAgentWearables diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 281d73b18b..4e289efd1b 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -48,6 +48,7 @@  #include "llviewermessage.h"	// for handle_lure  #include "llviewerregion.h" +  // static  void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::string& name)  { @@ -79,6 +80,19 @@ void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::strin  }  // static +void LLAvatarActions::requestFriendshipDialog(const LLUUID& id) +{ +	if(id.isNull()) +	{ +		return; +	} + +	std::string full_name; +	gCacheName->getFullName(id, full_name); +	requestFriendshipDialog(id, full_name); +} + +// static  void LLAvatarActions::removeFriendDialog(const LLUUID& id)  {  	if (id.isNull()) diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index 73325d21f1..f3c411e033 100644 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -45,6 +45,11 @@ public:  	static void requestFriendshipDialog(const LLUUID& id, const std::string& name);  	/** +	 * Show a dialog explaining what friendship entails, then request friendship. +	 */ +	static void requestFriendshipDialog(const LLUUID& id); + +	/**  	 * Show a friend removal dialog.  	 */  	static void removeFriendDialog(const LLUUID& id); diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 40dd20dfa4..a85f8710c7 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -117,24 +117,6 @@ void LLAvatarList::draw()  	}  } -//virtual -BOOL LLAvatarList::handleMouseDown(S32 x, S32 y, MASK mask) -{ -	LLScrollListItem* hit_item = hitItem(x, y); -	if (NULL == hit_item) -	{ -		std::vector<LLScrollListItem*> selectedItems = getAllSelected(); -		std::vector<LLScrollListItem*>::const_iterator it = selectedItems.begin(); - -		for (; it != selectedItems.end(); ++it) -		{ -			(*it)->setSelected(FALSE); -		} -		return TRUE; -	} -	return LLScrollListCtrl::handleMouseDown(x, y, mask); -} -  std::vector<LLUUID> LLAvatarList::getSelectedIDs()  {  	LLUUID selected_id; diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 991e9fa145..8b419dbb57 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -59,14 +59,6 @@ public:  	virtual	~LLAvatarList() {}  	/*virtual*/ void	draw(); -	/** -	 * Overrides base-class behavior of Mouse Down Event. -	 *  -	 * LLScrollListCtrl::handleMouseDown version calls setFocus which select the first item if nothing selected. -	 * We need to deselect all items if perform click not over the any item. Otherwise calls base method. -	 * See EXT-246 -	 */ -	/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);  	BOOL update(const std::vector<LLUUID>& all_buddies,  		const std::string& name_filter = LLStringUtil::null); diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 9eb8369c4c..bfb2d26870 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -1,34 +1,34 @@  /**  -* @file llbottomtray.cpp -* @brief LLBottomTray class implementation -* -* $LicenseInfo:firstyear=2009&license=viewergpl$ -*  -* Copyright (c) 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$ -*/ + * @file llbottomtray.cpp + * @brief LLBottomTray class implementation + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + *  + * Copyright (c) 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" // must be first include  #include "llbottomtray.h" @@ -37,6 +37,7 @@  #include "llchiclet.h"  #include "llfloaterreg.h"  #include "llflyoutbutton.h" +#include "lllayoutstack.h"  #include "llnearbychatbar.h"  #include "llsplitbutton.h"  #include "llfloatercamera.h" @@ -47,20 +48,23 @@ LLBottomTray::LLBottomTray(const LLSD&)  	mIMWell(NULL),  	mSysWell(NULL),  	mTalkBtn(NULL), -	mNearbyChatBar(NULL) +	mNearbyChatBar(NULL), +	mToolbarStack(NULL) +  {  	mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL);  	LLUICtrlFactory::getInstance()->buildPanel(this,"panel_bottomtray.xml"); -	mChicletPanel = getChild<LLChicletPanel>("chiclet_list",TRUE,FALSE); -	mIMWell = getChild<LLNotificationChiclet>("im_well",TRUE,FALSE); -	mSysWell = getChild<LLNotificationChiclet>("sys_well",TRUE,FALSE); +	mChicletPanel = getChild<LLChicletPanel>("chiclet_list"); +	mIMWell = getChild<LLNotificationChiclet>("im_well"); +	mSysWell = getChild<LLNotificationChiclet>("sys_well"); +	mSysWell->setNotificationChicletWindow(LLFloaterReg::getInstance("syswell_window"));  	mChicletPanel->setChicletClickedCallback(boost::bind(&LLBottomTray::onChicletClick,this,_1)); -	LLSplitButton* presets = getChild<LLSplitButton>("presets", TRUE, FALSE); -	if (presets) presets->setSelectionCallback(LLFloaterCamera::onClickCameraPresets); +	LLSplitButton* presets = getChild<LLSplitButton>("presets"); +	presets->setSelectionCallback(LLFloaterCamera::onClickCameraPresets);  	LLIMMgr::getInstance()->addSessionObserver(this); @@ -75,9 +79,10 @@ LLBottomTray::LLBottomTray(const LLSD&)  BOOL LLBottomTray::postBuild()  { -	 mNearbyChatBar = getChild<LLNearbyChatBar>("chat_bar"); +	mNearbyChatBar = getChild<LLNearbyChatBar>("chat_bar"); +	mToolbarStack = getChild<LLLayoutStack>("toolbar_stack"); -	 return TRUE; +	return TRUE;  }  LLBottomTray::~LLBottomTray() @@ -152,13 +157,14 @@ void LLBottomTray::setVisible(BOOL visible)  {  	LLPanel::setVisible(visible); -	LLView* stack = getChild<LLView>("toolbar_stack",TRUE,FALSE); - -	if (stack) +	// *NOTE: we must check mToolbarStack against NULL because sewtVisible is called from the  +	// LLPanel::initFromParams BEFORE postBuild is called and child controls are not exist yet +	if (NULL != mToolbarStack)  	{  		BOOL visibility = gAgent.cameraMouselook() ? false : true; -		for ( child_list_const_iter_t child_it = stack->getChildList()->begin(); child_it != stack->getChildList()->end(); child_it++) +		for ( child_list_const_iter_t child_it = mToolbarStack->getChildList()->begin();  +			child_it != mToolbarStack->getChildList()->end(); child_it++)  		{  			LLView* viewp = *child_it; diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index ffb0f9ae4f..fec533f9f3 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -38,6 +38,7 @@  class LLChicletPanel;  class LLLineEditor; +class LLLayoutStack;  class LLNotificationChiclet;  class LLTalkButton;  class LLNearbyChatBar; @@ -80,6 +81,8 @@ protected:  	LLNotificationChiclet* 	mSysWell;  	LLTalkButton* 		mTalkBtn;  	LLNearbyChatBar*	mNearbyChatBar; +	LLLayoutStack*		mToolbarStack; +  };  #endif // LL_LLBOTTOMPANEL_H diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp index 118385ab58..91945038aa 100644 --- a/indra/newview/llchannelmanager.cpp +++ b/indra/newview/llchannelmanager.cpp @@ -58,15 +58,14 @@ LLChannelManager::~LLChannelManager()  //--------------------------------------------------------------------------  void LLChannelManager::onLoginCompleted()  { -	S32 hidden_notifications = 0; +	S32 away_notifications = 0;  	for(std::vector<ChannelElem>::iterator it = mChannelList.begin(); it !=  mChannelList.end(); ++it)  	{ -		//(*it).channel->showToasts(); -		hidden_notifications +=(*it).channel->getNumberOfHiddenToasts(); +		away_notifications +=(*it).channel->getNumberOfHiddenToasts();  	} -	if(!hidden_notifications) +	if(!away_notifications)  	{  		LLScreenChannel::setStartUpToastShown();  		return; @@ -81,15 +80,19 @@ void LLChannelManager::onLoginCompleted()  	if(!mStartUpChannel)  		return; -	static_cast<LLUICtrl*>(mStartUpChannel)->setCommitCallback(boost::bind(&LLChannelManager::enableShowToasts, this)); -	mStartUpChannel->setNumberOfHiddenToasts(hidden_notifications); -	mStartUpChannel->createOverflowToast(gSavedSettings.getS32("ChannelBottomPanelMargin"), gSavedSettings.getS32("StartUpToastTime")); +	static_cast<LLUICtrl*>(mStartUpChannel)->setCommitCallback(boost::bind(&LLChannelManager::removeStartUpChannel, this)); +	mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("ChannelBottomPanelMargin"), gSavedSettings.getS32("StartUpToastTime"));  }  //-------------------------------------------------------------------------- -void LLChannelManager::enableShowToasts() +void LLChannelManager::removeStartUpChannel()  { -	LLScreenChannel::setStartUpToastShown(); +	if(!mStartUpChannel) +		return; + +	mStartUpChannel->setVisible(FALSE); +	mStartUpChannel->closeStartUpToast(); +	getRootView()->removeChild(mStartUpChannel);  	delete mStartUpChannel;  	mStartUpChannel = NULL;  } diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h index ac8e81d7ef..6adc79713a 100644 --- a/indra/newview/llchannelmanager.h +++ b/indra/newview/llchannelmanager.h @@ -102,7 +102,7 @@ public:  	// On LoginCompleted - show StartUp toast  	void onLoginCompleted(); -	void enableShowToasts(); +	void removeStartUpChannel();  	//TODO: make protected? in order to be shure that channels are created only by notification handlers  	LLScreenChannel*	createChannel(LLChannelManager::Params& p); diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp index 46a2179e8d..7a118deb8a 100644 --- a/indra/newview/llchatbar.cpp +++ b/indra/newview/llchatbar.cpp @@ -122,6 +122,8 @@ BOOL LLChatBar::postBuild()  {  	getChild<LLUICtrl>("Say")->setCommitCallback(boost::bind(&LLChatBar::onClickSay, this, _1)); +	// * NOTE: mantipov: getChild with default parameters returns dummy widget. +	// Seems this class will be completle removed  	// attempt to bind to an existing combo box named gesture  	setGestureCombo(getChild<LLComboBox>( "Gesture", TRUE, FALSE)); diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index 2b455485ca..a63477a442 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -82,8 +82,10 @@ void	LLChatItemCtrl::reshape		(S32 width, S32 height, BOOL called_from_parent )  {  	LLPanel::reshape(width, height,called_from_parent); -	LLPanel* caption = getChild<LLPanel>("msg_caption",false,false); -	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text",false,false); +	// *NOTE: we must check if child items exist because reshape is called from the  +	// LLView::initFromParams BEFORE postBuild is called and child controls are not exist yet +	LLPanel* caption = findChild<LLPanel>("msg_caption", false); +	LLChatMsgBox* msg_text = findChild<LLChatMsgBox>("msg_text" ,false);  	if(caption && msg_text)  	{  		LLRect caption_rect = caption->getRect(); @@ -125,17 +127,14 @@ std::string LLChatItemCtrl::appendTime()  void	LLChatItemCtrl::addText		(const std::string& message)  { -	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text",false,false); -	if(msg_text) -		msg_text->addText(message); +	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); +	msg_text->addText(message);  	mMessages.push_back(message);  }  void	LLChatItemCtrl::setMessage	(const LLChat& msg)  { -	LLPanel* caption = getChild<LLPanel>("msg_caption",false,false); -	if(!caption) -		return; +	LLPanel* caption = getChild<LLPanel>("msg_caption", false);  	std::string str_sender; @@ -145,20 +144,19 @@ void	LLChatItemCtrl::setMessage	(const LLChat& msg)  	else  		str_sender = LLTrans::getString("You");; -	caption->getChild<LLTextBox>("sender_name",false,false)->setText(str_sender); +	caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender);  	std::string tt = appendTime(); -	caption->getChild<LLTextBox>("msg_time",false,false)->setText(tt); +	caption->getChild<LLTextBox>("msg_time", false)->setText(tt); -	caption->getChild<LLAvatarIconCtrl>("avatar_icon",false,false)->setValue(msg.mFromID); +	caption->getChild<LLAvatarIconCtrl>("avatar_icon", false)->setValue(msg.mFromID);  	mOriginalMessage = msg; -	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text",false,false); -	if(msg_text) -		msg_text->setText(msg.mText); +	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); +	msg_text->setText(msg.mText);  	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");  	if(mOriginalMessage.mSourceType != CHAT_SOURCE_AGENT) @@ -170,17 +168,13 @@ void	LLChatItemCtrl::setMessage	(const LLChat& msg)  void	LLChatItemCtrl::snapToMessageHeight	()  { -	LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text",false,false); -	if(!text_box) -		return;///actually assert fits better +	LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false);  	S32 new_height = text_box->getTextPixelHeight();  	LLRect panel_rect = getRect();  	S32 caption_height = 0; -	LLPanel* caption = getChild<LLPanel>("msg_caption",false,false); -	if(caption) -		caption_height = caption->getRect().getHeight(); - +	LLPanel* caption = getChild<LLPanel>("msg_caption", false); +	caption_height = caption->getRect().getHeight();  	panel_rect.setLeftTopAndSize( panel_rect.mLeft, panel_rect.mTop, panel_rect.getWidth()	, caption_height + new_height); @@ -193,14 +187,11 @@ void	LLChatItemCtrl::snapToMessageHeight	()  void	LLChatItemCtrl::setWidth(S32 width)  { -	LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text",false,false); -	if(!text_box) -		return;///actually assert fits better - +	LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false);  	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,false); -	if(msg_text && mOriginalMessage.mText.length()) +	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); +	if(mOriginalMessage.mText.length())  		msg_text->setText(mOriginalMessage.mText);  	for(size_t i=0;i<mMessages.size();++i) @@ -212,58 +203,41 @@ void	LLChatItemCtrl::setWidth(S32 width)  void LLChatItemCtrl::onMouseLeave			(S32 x, S32 y, MASK mask)  { -	LLPanel* caption = getChild<LLPanel>("msg_caption",false,false); -	if(!caption) -		return; +	LLPanel* caption = getChild<LLPanel>("msg_caption", false);  	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector"); -	if(msg_inspector) -		msg_inspector->setVisible(false); +	msg_inspector->setVisible(false);  }  void LLChatItemCtrl::onMouseEnter				(S32 x, S32 y, MASK mask)  {  	if(mOriginalMessage.mSourceType != CHAT_SOURCE_AGENT)  		return; -	LLPanel* caption = getChild<LLPanel>("msg_caption",false,false); -	if(!caption) -		return; +	LLPanel* caption = getChild<LLPanel>("msg_caption", false);  	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector"); -	if(msg_inspector) -		msg_inspector->setVisible(true); +	msg_inspector->setVisible(true);  }  BOOL	LLChatItemCtrl::handleMouseDown	(S32 x, S32 y, MASK mask)  {  	if(mOriginalMessage.mSourceType != CHAT_SOURCE_AGENT)  		return LLPanel::handleMouseDown(x,y,mask); -	LLPanel* caption = getChild<LLPanel>("msg_caption",false,false); -	if(caption) +	LLPanel* caption = getChild<LLPanel>("msg_caption", false); +	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector"); +	S32 local_x = x - msg_inspector->getRect().mLeft - caption->getRect().mLeft; +	S32 local_y = y - msg_inspector->getRect().mBottom - caption->getRect().mBottom; +	if(msg_inspector->pointInView(local_x, local_y))  	{ -		LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector"); -		if(msg_inspector) -		{ -			S32 local_x = x - msg_inspector->getRect().mLeft - caption->getRect().mLeft; -			S32 local_y = y - msg_inspector->getRect().mBottom - caption->getRect().mBottom; -			if(msg_inspector->pointInView(local_x, local_y)) -			{ -				LLFloaterReg::showInstance("mini_inspector", mOriginalMessage.mFromID); -			} -		} +		LLFloaterReg::showInstance("mini_inspector", mOriginalMessage.mFromID);  	}  	return LLPanel::handleMouseDown(x,y,mask);  }  void	LLChatItemCtrl::setHeaderVisibility(EShowItemHeader e)  { -	LLPanel* caption = getChild<LLPanel>("msg_caption",false,false); -	if(!caption) -		return; +	LLPanel* caption = getChild<LLPanel>("msg_caption", false); -	LLUICtrl* icon = caption->getChild<LLUICtrl>("avatar_icon",false,false); -	LLUICtrl* name = caption->getChild<LLUICtrl>("sender_name",false,false); - -	if(icon == 0 || name == 0) -		return; +	LLUICtrl* icon = caption->getChild<LLUICtrl>("avatar_icon", false); +	LLUICtrl* name = caption->getChild<LLUICtrl>("sender_name", false);  	icon->setVisible(e == CHATITEMHEADER_SHOW_ONLY_ICON || e==CHATITEMHEADER_SHOW_BOTH);  	name->setVisible(e == CHATITEMHEADER_SHOW_ONLY_NAME || e==CHATITEMHEADER_SHOW_BOTH); @@ -272,20 +246,15 @@ void	LLChatItemCtrl::setHeaderVisibility(EShowItemHeader e)  bool	LLChatItemCtrl::canAddText	()  { -	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text",false,false); -	if(!msg_text ) -		return false; +	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);  	return msg_text->getTextLinesNum()<10;  }  BOOL	LLChatItemCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)  { -	LLPanel* caption = getChild<LLPanel>("msg_caption",false,false); -	if(!caption) -		return LLPanel::handleRightMouseDown(x,y,mask); -	LLUICtrl* avatar_icon = caption->getChild<LLUICtrl>("avatar_icon",false,false); -	if(!avatar_icon) -		return LLPanel::handleRightMouseDown(x,y,mask); +	LLPanel* caption = getChild<LLPanel>("msg_caption", false); +	LLUICtrl* avatar_icon = caption->getChild<LLUICtrl>("avatar_icon", false); +  	S32 local_x = x - avatar_icon->getRect().mLeft - caption->getRect().mLeft;  	S32 local_y = y - avatar_icon->getRect().mBottom - caption->getRect().mBottom; diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 3b88bcfe20..80e27bd366 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -39,7 +39,6 @@  #include "lliconctrl.h"  #include "llimpanel.h"				// LLFloaterIMPanel  #include "llimview.h" -#include "llfloatergroupinfo.h"  #include "llfloaterreg.h"  #include "llmenugl.h"  #include "lloutputmonitorctrl.h" @@ -78,6 +77,7 @@ LLNotificationChiclet::LLNotificationChiclet(const Params& p)  : LLChiclet(p)  , mButton(NULL)  , mCounterCtrl(NULL) +, mNotificationChicletWindow(NULL)  {  	LLButton::Params button_params = p.button;  	button_params.rect(p.rect()); @@ -403,9 +403,7 @@ void LLIMChiclet::onMenuItemClicked(const LLSD& user_data)  	}  	else if("add" == level)  	{ -		std::string name; -		gCacheName->getFullName(other_participant_id,name); -		LLAvatarActions::requestFriendshipDialog(other_participant_id,name); +		LLAvatarActions::requestFriendshipDialog(other_participant_id);  	}  	else if("remove" == level)  	{ @@ -417,7 +415,7 @@ void LLIMChiclet::onMenuItemClicked(const LLSD& user_data)  	}  	else if("info" == level)  	{ -		LLFloaterGroupInfo::showFromUUID(other_participant_id); +		LLGroupActions::show(other_participant_id);  	}  } diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index a748141a14..103443ccd8 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -363,10 +363,15 @@ public:  	/*virtual*/ ~ LLNotificationChiclet(); +	// Notification Chiclet Window +	void	setNotificationChicletWindow(LLFloater* wnd) { mNotificationChicletWindow = wnd; } +  protected:  	LLNotificationChiclet(const Params& p);  	friend class LLUICtrlFactory; +	LLFloater*	mNotificationChicletWindow; +  protected:  	LLButton* mButton;  	LLChicletNotificationCounterCtrl* mCounterCtrl; diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 3964fbfa74..9cb3ea127f 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -168,6 +168,18 @@ void LLFavoritesBarCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)  	LLUICtrl::reshape(width, height, called_from_parent);  } +LLXMLNodePtr LLFavoritesBarCtrl::getButtonXMLNode() +{ +	LLXMLNodePtr buttonXMLNode = NULL; +	bool success = LLUICtrlFactory::getLayeredXMLNode("favorites_bar_button.xml", buttonXMLNode); +	if (!success) +	{ +		llwarns << "Unable to read xml file with button for Favorites Bar: favorites_bar_button.xml" << llendl; +		buttonXMLNode = NULL; +	} +	return buttonXMLNode; +} +  void LLFavoritesBarCtrl::updateButtons(U32 bar_width)  {  	LLInventoryModel::item_array_t items; @@ -177,21 +189,25 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)  		return;  	} -	const S32 buttonHPad = LLUI::sSettingGroups["config"]->getS32("ButtonHPad"); -	const S32 buttonHGap = 2; +	static LLXMLNodePtr buttonXMLNode = getButtonXMLNode(); +	if (buttonXMLNode.isNull()) +	{ +		return; +	} + +	S32 buttonWidth = 120; //default value +	buttonXMLNode->getAttributeS32("width", buttonWidth); +	S32 buttonHGap = 2; // default value +	buttonXMLNode->getAttributeS32("left", buttonHGap); +  	const S32 buttonVGap = 2; -	static LLButton::Params default_button_params(LLUICtrlFactory::getDefaultParams<LLButton>()); -	std::string flat_icon			= "transparent.j2c"; -	std::string hover_icon			= default_button_params.image_unselected.name; -	std::string hover_icon_selected	= default_button_params.image_selected.name; -	S32 curr_x = buttonHGap; -  	S32 count = items.count(); +	const S32 buttonHPad = LLUI::sSettingGroups["config"]->getS32("ButtonHPad");  	const S32 chevron_button_width = mFont->getWidth(">>") + buttonHPad * 2; -	S32 buttons_space = bar_width - curr_x; +	S32 buttons_space = bar_width - buttonHGap;  	S32 first_drop_down_item = count; @@ -199,7 +215,7 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)  	S32 buttons_width = 0;  	for (S32 i = 0; i < count; ++i)  	{ -		buttons_width += mFont->getWidth(items.get(i)->getName()) + buttonHPad * 2 + buttonHGap; +		buttons_width += buttonWidth + buttonHGap;  		if (buttons_width > buttons_space)  		{  			// There is no space for all buttons. @@ -207,7 +223,7 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)  			buttons_space -= chevron_button_width + buttonHGap;  			while (i >= 0 && buttons_width > buttons_space)  			{ -				buttons_width -= mFont->getWidth(items.get(i)->getName()) + buttonHPad * 2 + buttonHGap; +				buttons_width -= buttonWidth + buttonHGap;  				i--;  			}  			first_drop_down_item = i + 1; // First item behind visible items @@ -259,37 +275,7 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)  			}  		} -		// Adding buttons -		for(S32 i = mFirstDropDownItem -1; i >= 0; i--) -		{ - -			LLInventoryItem* item = items.get(i); - -			S32 buttonWidth = mFont->getWidth(item->getName()) + buttonHPad * 2; - -			LLRect rect; -			rect.setOriginAndSize(curr_x, buttonVGap, buttonWidth, getRect().getHeight()-buttonVGap); - -			LLButton::Params bparams; -			bparams.image_unselected.name(flat_icon); -			bparams.image_disabled.name(flat_icon); -			bparams.image_selected.name(hover_icon_selected); -			bparams.image_hover_selected.name(hover_icon_selected); -			bparams.image_disabled_selected.name(hover_icon_selected); -			bparams.image_hover_unselected.name(hover_icon); -			bparams.follows.flags (FOLLOWS_LEFT | FOLLOWS_BOTTOM); -			bparams.rect (rect); -			bparams.tab_stop(false); -			bparams.font(mFont); -			bparams.name(item->getName()); -			bparams.tool_tip(item->getName()); -			bparams.click_callback.function(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID())); -			bparams.rightclick_callback.function(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID())); - -			addChildInBack(LLUICtrlFactory::create<LLButton> (bparams)); - -			curr_x += buttonWidth + buttonHGap; -		} +		createButtons(items, buttonXMLNode, buttonWidth, buttonHGap);  	}  	// Chevron button @@ -307,6 +293,11 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)  		}  		else  		{ +			static LLButton::Params default_button_params(LLUICtrlFactory::getDefaultParams<LLButton>()); +			std::string flat_icon			= "transparent.j2c"; +			std::string hover_icon			= default_button_params.image_unselected.name; +			std::string hover_icon_selected	= default_button_params.image_selected.name; +  			LLButton::Params bparams;  			LLRect rect; @@ -341,6 +332,37 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)  	}  } + +void LLFavoritesBarCtrl::createButtons(const LLInventoryModel::item_array_t &items, const LLXMLNodePtr &buttonXMLNode, S32 buttonWidth, S32 buttonHGap) +{ +	S32 curr_x = buttonHGap; +	// Adding buttons +	for(S32 i = mFirstDropDownItem -1; i >= 0; i--) +	{ +		LLInventoryItem* item = items.get(i); + +		LLButton* fav_btn = LLUICtrlFactory::defaultBuilder<LLButton>(buttonXMLNode, this, NULL); +		if (NULL == fav_btn) +		{ +			llwarns << "Unable to create button for landmark: " << item->getName() << llendl; +			continue; +		} + +		// change only left and save bottom +		fav_btn->setOrigin(curr_x, fav_btn->getRect().mBottom); +		fav_btn->setFont(mFont); +		fav_btn->setName(item->getName()); +		fav_btn->setLabel(item->getName()); +		fav_btn->setToolTip(item->getName()); +		fav_btn->setCommitCallback(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID())); +		fav_btn->setRightClickedCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3,_4 )); +		sendChildToBack(fav_btn); + +		curr_x += buttonWidth + buttonHGap; +	} +} + +  BOOL LLFavoritesBarCtrl::postBuild()  {  	// make the popup menu available @@ -462,10 +484,8 @@ void LLFavoritesBarCtrl::showDropDownMenu()  			item_params.label(item_name);  			item_params.on_click.function(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID())); -			item_params.rightclick_callback.function(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID())); -  			LLMenuItemCallGL *menu_item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params); - +			menu_item->setRightClickedCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this,item->getUUID(),_1,_2,_3,_4));  			// Check whether item name wider than menu  			if ((S32) menu_item->getNominalWidth() > bar_width)  			{ @@ -514,7 +534,7 @@ void LLFavoritesBarCtrl::onButtonClick(LLUUID item_id)  	LLInvFVBridgeAction::doAction(item_id,&gInventory);  } -void LLFavoritesBarCtrl::onButtonRightClick(LLUUID item_id) +void LLFavoritesBarCtrl::onButtonRightClick( LLUUID item_id,LLView* fav_button,S32 x,S32 y,MASK mask)  {  	mSelectedItemID = item_id; @@ -525,10 +545,7 @@ void LLFavoritesBarCtrl::onButtonRightClick(LLUUID item_id)  	}  	menu->updateParent(LLMenuGL::sMenuContainer); - -	S32 x,y; -	LLUI::getCursorPositionLocal(this, &x, &y); -	LLMenuGL::showPopup(this, menu, x, y); +	LLMenuGL::showPopup(fav_button, menu, x, y);  }  void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata) diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index a559692331..7da33e2f6e 100644 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -61,10 +61,12 @@ public:  protected:  	void updateButtons(U32 bar_width); +	void createButtons(const LLInventoryModel::item_array_t &items, const LLXMLNodePtr &root, S32 buttonWidth, S32 buttonHGap); +	LLXMLNodePtr getButtonXMLNode();  	BOOL collectFavoriteItems(LLInventoryModel::item_array_t &items);  	void onButtonClick(LLUUID id); -	void onButtonRightClick(LLUUID id); +	void onButtonRightClick(LLUUID id,LLView* button,S32 x,S32 y,MASK mask);  	void doToSelected(const LLSD& userdata); diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index 81f1beb40d..94ea20893a 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -53,6 +53,11 @@ const F32 CAMERA_BUTTON_DELAY = 0.0f;  #define PAN "cam_track_stick"  #define CONTROLS "controls" + +void show_tip(LLFirstTimeTipsManager::EFirstTimeTipType tipType, LLView* anchorView) +{ +	LLFirstTimeTipsManager::showTipsFor(tipType, anchorView, LLFirstTimeTipsManager::TPA_POS_RIGHT_ALIGN_TOP); +}  //  // Member functions  // @@ -93,7 +98,8 @@ void LLFloaterCamera::update()  {  	ECameraControlMode mode = determineMode();  	if (mode != mCurrMode) setMode(mode); -	LLFirstTimeTipsManager::showTipsFor(mMode2TipType[mode], this); +	updatePosition(); +	show_tip(mMode2TipType[mode], this);  } @@ -134,17 +140,17 @@ void LLFloaterCamera::onClickCameraPresets(LLUICtrl* ctrl, const LLSD& param)  	if ("rear_view" == name)  	{  		LLFirstTimeTipsManager::showTipsFor(LLFirstTimeTipsManager::FTT_CAMERA_PRESET_REAR, ctrl); -		gAgent.resetView(TRUE, TRUE); +		gAgent.switchCameraPreset(CAMERA_PRESET_REAR_VIEW);  	} -	else if ("3/4_view" == name) +	else if ("group_view" == name)  	{  		LLFirstTimeTipsManager::showTipsFor(LLFirstTimeTipsManager::FTT_CAMERA_PRESET_GROUP); -		//*TODO implement 3/4 view +		gAgent.switchCameraPreset(CAMERA_PRESET_GROUP_VIEW);  	}  	else if ("front_view" == name)  	{  		LLFirstTimeTipsManager::showTipsFor(LLFirstTimeTipsManager::FTT_CAMERA_PRESET_FRONT); -		//*TODO implement front view +		gAgent.switchCameraPreset(CAMERA_PRESET_FRONT_VIEW);  	}  } @@ -159,8 +165,7 @@ void LLFloaterCamera::updatePosition()  	LLBottomTray* tray = LLBottomTray::getInstance();  	if (!tray) return; -	LLButton* camera_button = tray->getChild<LLButton>("camera_btn", TRUE, FALSE); -	if (!camera_button) return; +	LLButton* camera_button = tray->getChild<LLButton>("camera_btn");  	//align centers of a button and a floater  	S32 x = camera_button->calcScreenRect().getCenterX() - getRect().getWidth()/2; @@ -270,19 +275,15 @@ void LLFloaterCamera::onClickBtn(ECameraControlMode mode)  	switchMode(mode); -	LLFirstTimeTipsManager::showTipsFor(mMode2TipType[mode], mMode2Button[mode]); +	show_tip(mMode2TipType[mode], this);  }  void LLFloaterCamera::assignButton2Mode(ECameraControlMode mode, const std::string& button_name)  { -	LLButton* button = getChild<LLButton>(button_name, TRUE, FALSE); -	llassert_always(button); +	LLButton* button = getChild<LLButton>(button_name); -	if (button) -	{ -		button->setClickedCallback(boost::bind(&LLFloaterCamera::onClickBtn, this, mode)); -		mMode2Button[mode] = button; -	} +	button->setClickedCallback(boost::bind(&LLFloaterCamera::onClickBtn, this, mode)); +	mMode2Button[mode] = button;  }  void LLFloaterCamera::initMode2TipTypeMap() diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp index 8fcb7b985f..742cc5c5de 100644 --- a/indra/newview/llfloaterchat.cpp +++ b/indra/newview/llfloaterchat.cpp @@ -339,11 +339,14 @@ void LLFloaterChat::addChat(const LLChat& chat,  			text_color = LLUIColorTable::instance().getColor("IMChatColor");  			size = INSTANT_MSG_SIZE;  		} +		// Disabling the console for 2.0 - SJB +#if 0  		// We display anything if it's not an IM. If it's an IM, check pref...  		if	( !from_instant_message || gSavedSettings.getBOOL("IMInChatConsole") )   		{  			gConsole->addLine(chat.mText, size, text_color);  		} +#endif  	}  	if(from_instant_message && (gSavedPerAccountSettings.getS32("IMLogOptions")== LOG_BOTH_TOGETHER)) diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp index 7f03d63b3e..f49f854620 100644 --- a/indra/newview/llfloatergroups.cpp +++ b/indra/newview/llfloatergroups.cpp @@ -273,7 +273,7 @@ void LLPanelGroups::onBtnSearch(void* userdata)  void LLPanelGroups::create()  { -	LLGroupActions::create(); +	LLGroupActions::createGroup();  }  void LLPanelGroups::activate() @@ -293,7 +293,7 @@ void LLPanelGroups::info()  	LLUUID group_id;  	if (group_list && (group_id = group_list->getCurrentID()).notNull())  	{ -		LLGroupActions::info(group_id); +		LLGroupActions::show(group_id);  	}  } diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp index a486ef565a..718719fe57 100644 --- a/indra/newview/llfloaterinventory.cpp +++ b/indra/newview/llfloaterinventory.cpp @@ -64,7 +64,6 @@  #include "llmenugl.h"  #include "llpreviewanim.h"  #include "llpreviewgesture.h" -#include "llpreviewlandmark.h"  #include "llpreviewnotecard.h"  #include "llpreviewscript.h"  #include "llpreviewsound.h" @@ -1275,9 +1274,9 @@ void LLInventoryPanel::draw()  	LLPanel::draw();  } -void LLInventoryPanel::setFilterTypes(U32 filter_types) +void LLInventoryPanel::setFilterTypes(U64 filter_types, BOOL filter_for_categories)  { -	mFolders->getFilter()->setFilterTypes(filter_types); +	mFolders->getFilter()->setFilterTypes(filter_types, filter_for_categories);  }	  void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask) diff --git a/indra/newview/llfloaterinventory.h b/indra/newview/llfloaterinventory.h index 734ab5032e..fd61e121ea 100644 --- a/indra/newview/llfloaterinventory.h +++ b/indra/newview/llfloaterinventory.h @@ -133,7 +133,7 @@ public:  	void setSelectCallback(const LLFolderView::signal_t::slot_type& cb) { if (mFolders) mFolders->setSelectCallback(cb); }  	void clearSelection();  	LLInventoryFilter* getFilter() { return mFolders->getFilter(); } -	void setFilterTypes(U32 filter); +	void setFilterTypes(U64 filter, BOOL filter_for_categories = FALSE); // if filter_for_categories is true, operate on folder preferred asset type  	U32 getFilterTypes() const { return mFolders->getFilterTypes(); }  	void setFilterPermMask(PermissionMask filter_perm_mask);  	U32 getFilterPermMask() const { return mFolders->getFilterPermissions(); } diff --git a/indra/newview/llfloaterlagmeter.cpp b/indra/newview/llfloaterlagmeter.cpp index da6dceb149..3753dcaaa8 100644 --- a/indra/newview/llfloaterlagmeter.cpp +++ b/indra/newview/llfloaterlagmeter.cpp @@ -152,25 +152,25 @@ void LLFloaterLagMeter::determineClient()  	if (!gFocusMgr.getAppHasFocus())  	{ -		mClientButton->setImageUnselected(LAG_GOOD_IMAGE_NAME); +		mClientButton->setImageUnselected(LLUI::getUIImage(LAG_GOOD_IMAGE_NAME));  		mClientText->setText( getString("client_frame_time_window_bg_msg", mStringArgs) );  		mClientCause->setText( LLStringUtil::null );  	}  	else if(client_frame_time >= mClientFrameTimeCritical)  	{ -		mClientButton->setImageUnselected(LAG_CRITICAL_IMAGE_NAME); +		mClientButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME));  		mClientText->setText( getString("client_frame_time_critical_msg", mStringArgs) );  		find_cause = true;  	}  	else if(client_frame_time >= mClientFrameTimeWarning)  	{ -		mClientButton->setImageUnselected(LAG_WARNING_IMAGE_NAME); +		mClientButton->setImageUnselected(LLUI::getUIImage(LAG_WARNING_IMAGE_NAME));  		mClientText->setText( getString("client_frame_time_warning_msg", mStringArgs) );  		find_cause = true;  	}  	else  	{ -		mClientButton->setImageUnselected(LAG_GOOD_IMAGE_NAME); +		mClientButton->setImageUnselected(LLUI::getUIImage(LAG_GOOD_IMAGE_NAME));  		mClientText->setText( getString("client_frame_time_normal_msg", mStringArgs) );  		mClientCause->setText( LLStringUtil::null );  	}	 @@ -211,13 +211,13 @@ void LLFloaterLagMeter::determineNetwork()  	if(packet_loss >= mNetworkPacketLossCritical)  	{ -		mNetworkButton->setImageUnselected(LAG_CRITICAL_IMAGE_NAME); +		mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME));  		mNetworkText->setText( getString("network_packet_loss_critical_msg", mStringArgs) );  		find_cause_loss = true;  	}  	else if(ping_time >= mNetworkPingCritical)  	{ -		mNetworkButton->setImageUnselected(LAG_CRITICAL_IMAGE_NAME); +		mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME));  		if (client_frame_time_ms < mNetworkPingCritical)  		{  			mNetworkText->setText( getString("network_ping_critical_msg", mStringArgs) ); @@ -226,13 +226,13 @@ void LLFloaterLagMeter::determineNetwork()  	}  	else if(packet_loss >= mNetworkPacketLossWarning)  	{ -		mNetworkButton->setImageUnselected(LAG_WARNING_IMAGE_NAME); +		mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_WARNING_IMAGE_NAME));  		mNetworkText->setText( getString("network_packet_loss_warning_msg", mStringArgs) );  		find_cause_loss = true;  	}  	else if(ping_time >= mNetworkPingWarning)  	{ -		mNetworkButton->setImageUnselected(LAG_WARNING_IMAGE_NAME); +		mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_WARNING_IMAGE_NAME));  		if (client_frame_time_ms < mNetworkPingWarning)  		{  			mNetworkText->setText( getString("network_ping_warning_msg", mStringArgs) ); @@ -241,7 +241,7 @@ void LLFloaterLagMeter::determineNetwork()  	}  	else  	{ -		mNetworkButton->setImageUnselected(LAG_GOOD_IMAGE_NAME); +		mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_GOOD_IMAGE_NAME));  		mNetworkText->setText( getString("network_performance_normal_msg", mStringArgs) );  	} @@ -266,19 +266,19 @@ void LLFloaterLagMeter::determineServer()  	if(sim_frame_time >= mServerFrameTimeCritical)  	{ -		mServerButton->setImageUnselected(LAG_CRITICAL_IMAGE_NAME); +		mServerButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME));  		mServerText->setText( getString("server_frame_time_critical_msg", mStringArgs) );  		find_cause = true;  	}  	else if(sim_frame_time >= mServerFrameTimeWarning)  	{ -		mServerButton->setImageUnselected(LAG_WARNING_IMAGE_NAME); +		mServerButton->setImageUnselected(LLUI::getUIImage(LAG_WARNING_IMAGE_NAME));  		mServerText->setText( getString("server_frame_time_warning_msg", mStringArgs) );  		find_cause = true;  	}  	else  	{ -		mServerButton->setImageUnselected(LAG_GOOD_IMAGE_NAME); +		mServerButton->setImageUnselected(LLUI::getUIImage(LAG_GOOD_IMAGE_NAME));  		mServerText->setText( getString("server_frame_time_normal_msg", mStringArgs) );  		mServerCause->setText( LLStringUtil::null );  	}	 diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 63ac44da4f..c5e07c6596 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -51,7 +51,6 @@  #include "llfloateravatarpicker.h"  #include "llfloaterauction.h"  #include "llfloatergroups.h" -#include "llfloatergroupinfo.h"  #include "llavataractions.h"  #include "lllineeditor.h"  #include "llnamelistctrl.h" @@ -79,6 +78,8 @@  #include "roles_constants.h"  #include "lltrans.h" +#include "llgroupactions.h" +  static std::string OWNER_ONLINE 	= "0";  static std::string OWNER_OFFLINE	= "1";  static std::string OWNER_GROUP 		= "2"; @@ -806,7 +807,7 @@ void LLPanelLandGeneral::onClickProfile(void* data)  	if (parcel->getIsGroupOwned())  	{  		const LLUUID& group_id = parcel->getGroupID(); -		LLFloaterGroupInfo::showFromUUID(group_id); +		LLGroupActions::show(group_id);  	}  	else  	{ @@ -1080,7 +1081,7 @@ void LLPanelLandObjects::onDoubleClickOwner(void *userdata)  		BOOL is_group = cell->getValue().asString() == OWNER_GROUP;  		if (is_group)  		{ -			LLFloaterGroupInfo::showFromUUID(owner_id); +			LLGroupActions::show(owner_id);  		}  		else  		{ diff --git a/indra/newview/llfloaterlandholdings.cpp b/indra/newview/llfloaterlandholdings.cpp index de3cd5d4e3..19552ca9c9 100644 --- a/indra/newview/llfloaterlandholdings.cpp +++ b/indra/newview/llfloaterlandholdings.cpp @@ -42,7 +42,6 @@  #include "llagent.h"  #include "llfloaterreg.h" -#include "llfloatergroupinfo.h"  #include "llfloaterworldmap.h"  #include "llproductinforequest.h"  #include "llscrolllistctrl.h" @@ -56,6 +55,8 @@  #include "llviewermessage.h"  #include "lluictrlfactory.h" +#include "llgroupactions.h" +  // protected  LLFloaterLandHoldings::LLFloaterLandHoldings(const LLSD& key)  :	LLFloater(key), @@ -323,7 +324,7 @@ void LLFloaterLandHoldings::onGrantList(void* data)  	LLUUID group_id = list->getCurrentID();  	if (group_id.notNull())  	{ -		LLFloaterGroupInfo::showFromUUID(group_id); +		LLGroupActions::show(group_id);  	}  } diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp index 7042882084..0a3d97245b 100644 --- a/indra/newview/llfloaternotificationsconsole.cpp +++ b/indra/newview/llfloaternotificationsconsole.cpp @@ -212,12 +212,9 @@ void LLFloaterNotificationConsole::addChannel(const std::string& name, bool open  void LLFloaterNotificationConsole::removeChannel(const std::string& name)  { -	LLPanel* panelp = getChild<LLPanel>(name, TRUE, FALSE); -	if (panelp) -	{ -		getChildRef<LLLayoutStack>("notification_channels").removePanel(panelp); -		delete panelp; -	} +	LLPanel* panelp = getChild<LLPanel>(name); +	getChildRef<LLLayoutStack>("notification_channels").removePanel(panelp); +	delete panelp;  	updateResizeLimits();  } diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 8a7b2d84c0..6050fbfa5d 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -361,7 +361,9 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)  	mCommitCallbackRegistrar.add("Pref.AutoDetectAspect",       boost::bind(&LLFloaterPreference::onCommitAutoDetectAspect, this));	  	mCommitCallbackRegistrar.add("Pref.onSelectAspectRatio",    boost::bind(&LLFloaterPreference::onKeystrokeAspectRatio, this));	  	mCommitCallbackRegistrar.add("Pref.QualityPerformance",     boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));	 - +	 +	sSkin = gSavedSettings.getString("SkinCurrent"); +	  	gSavedSettings.getControl("AvatarNameTagMode")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged,  _2));  } diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index 7312808bd6..8ac00832c9 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -43,7 +43,6 @@  #include "llagent.h"  #include "llbutton.h"  #include "llcheckboxctrl.h" -#include "llfloatergroupinfo.h"  #include "llavataractions.h"  #include "llinventorymodel.h"  #include "lllineeditor.h" @@ -59,6 +58,7 @@  #include "llviewerregion.h"  #include "llviewercontrol.h"  #include "llviewerwindow.h" +#include "llgroupactions.h"  #include "lluictrlfactory.h" @@ -244,7 +244,7 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)  	const BOOL can_agent_sell = gAgent.allowOperation(PERM_OWNER, perm,   													  GP_OBJECT_SET_SALE) &&  		!cannot_restrict_permissions; -	const BOOL is_link = LLAssetType::lookupIsLinkType(i->getActualType()); +	const BOOL is_link = i->getIsLinkType();  	// You need permission to modify the object to modify an inventory  	// item in it. @@ -554,7 +554,7 @@ void LLFloaterProperties::onClickOwner()  	if(!item) return;  	if(item->getPermissions().isGroupOwned())  	{ -		LLFloaterGroupInfo::showFromUUID(item->getPermissions().getGroup()); +		LLGroupActions::show(item->getPermissions().getGroup());  	}  	else  	{ diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 57acbb147d..098a5197df 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -51,12 +51,13 @@  #include "llfocusmgr.h"  #include "lllandmarklist.h"  #include "lllineeditor.h" -#include "llpreviewlandmark.h"  #include "llregionhandle.h"  #include "llscrolllistctrl.h"  #include "llslurl.h" +#include "lltabcontainer.h"  #include "lltextbox.h"  #include "lltracker.h" +#include "llinventorymodel.h"  #include "llviewerinventory.h"	// LLViewerInventoryItem  #include "llviewermenu.h"  #include "llviewerregion.h" diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index c54eafb67a..4a5a775a05 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -1103,26 +1103,7 @@ void LLFolderView::changeType(LLInventoryModel *model, LLAssetType::EType new_fo  	if (!folder_bridge) return;  	LLViewerInventoryCategory *cat = folder_bridge->getCategory();  	if (!cat) return; -		 -	const LLUUID &folder_id = cat->getUUID(); -	const LLUUID &parent_id = cat->getParentUUID(); -	const std::string &name = cat->getName(); -		 -	LLMessageSystem* msg = gMessageSystem; -	msg->newMessageFast(_PREHASH_UpdateInventoryFolder); -	msg->nextBlockFast(_PREHASH_AgentData); -	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -	msg->nextBlockFast(_PREHASH_FolderData); -	msg->addUUIDFast(_PREHASH_FolderID, folder_id); -	msg->addUUIDFast(_PREHASH_ParentID, parent_id); -	msg->addS8Fast(_PREHASH_Type, new_folder_type); -	msg->addStringFast(_PREHASH_Name, name); -	gAgent.sendReliableMessage(); - -	cat->setPreferredType(new_folder_type); -	gInventory.addChangedMask(LLInventoryObserver::LABEL, folder_id); -	gInventory.updateLinkedObjects(folder_id); +	cat->changeType(new_folder_type);  }  void LLFolderView::autoOpenItem( LLFolderViewFolder* item ) diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h index eb06123b46..254ce4062a 100644 --- a/indra/newview/llfoldervieweventlistener.h +++ b/indra/newview/llfoldervieweventlistener.h @@ -62,6 +62,7 @@ public:  	virtual LLFontGL::StyleFlags getLabelStyle() const = 0;  	virtual std::string getLabelSuffix() const = 0;  	virtual void openItem( void ) = 0; +	virtual void closeItem( void ) = 0;  	virtual void previewItem( void ) = 0;  	virtual void selectItem(void) = 0;  	virtual void showProperties(void) = 0; diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index a6a8da2a76..69ce2f0e0e 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -1912,12 +1912,16 @@ void LLFolderViewFolder::setOpenArrangeRecursively(BOOL openitem, ERecurseType r  {  	BOOL was_open = mIsOpen;  	mIsOpen = openitem; -	if(!was_open && openitem) +	if (mListener)  	{ -		if(mListener) +		if(!was_open && openitem)  		{  			mListener->openItem();  		} +		else if(was_open && !openitem) +		{ +			mListener->closeItem(); +		}  	}  	if (recurse == RECURSE_DOWN || recurse == RECURSE_UP_DOWN) diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index 69498d3099..59274c8638 100644 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -1151,7 +1151,7 @@ void LLGestureManager::done()  {  	for(item_map_t::iterator it = mActive.begin(); it != mActive.end(); ++it)  	{ -		if(it->second->mName.empty()) +		if(it->second && it->second->mName.empty())  		{  			LLViewerInventoryItem* item = gInventory.getItem(it->first);  			if(item) diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index 30f4447283..b14f23f9cf 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -36,12 +36,74 @@  #include "llgroupactions.h"  #include "llagent.h" -#include "llfloatergroupinfo.h"  #include "llfloaterreg.h"  #include "llimview.h" // for gIMMgr  #include "llgroupmgr.h"  #include "llavataractions.h"  #include "llviewercontrol.h" +#include "llsidetray.h" + +#include "llcommandhandler.h" + +// +// Globals +// + +class LLGroupHandler : public LLCommandHandler +{ +public: +	// requires trusted browser to trigger +	LLGroupHandler() : LLCommandHandler("group", true) { } +	bool handle(const LLSD& tokens, const LLSD& query_map, +				LLWebBrowserCtrl* web) +	{ +		if (tokens.size() < 1) +		{ +			return false; +		} + +		if (tokens[0].asString() == "create") +		{ +			LLGroupActions::createGroup(); +			return true; +		} + +		if (tokens.size() < 2) +		{ +			return false; +		} + +		if (tokens[0].asString() == "list") +		{ +			if (tokens[1].asString() == "show") +			{ +				LLFloaterReg::showInstance("contacts", "groups"); +				return true; +			} +            return false; +		} + +		LLUUID group_id; +		if (!group_id.set(tokens[0], FALSE)) +		{ +			return false; +		} + +		if (tokens[1].asString() == "about") +		{ +			if (group_id.isNull()) +				return true; + +			LLGroupActions::show(group_id); + +			return true; +		} +		return false; +	} +}; +LLGroupHandler gGroupHandler; + +  // LLGroupActions::teleport helper  // @@ -168,12 +230,6 @@ void LLGroupActions::search()  }  // static -void LLGroupActions::create() -{ -	LLFloaterGroupInfo::showCreateGroup(NULL); -} - -// static  void LLGroupActions::leave(const LLUUID& group_id)  {  	if (group_id.isNull()) @@ -208,14 +264,66 @@ void LLGroupActions::activate(const LLUUID& group_id)  	gAgent.sendReliableMessage();  } +bool	isGroupUIVisible() +{ +	LLPanel* panel = LLSideTray::getInstance()->findChild<LLPanel>("panel_group_info_sidetray"); +	if(!panel) +		return false; +	return panel->getVisible(); +} +  // static -void LLGroupActions::info(const LLUUID& group_id) +void LLGroupActions::show(const LLUUID& group_id)  {  	if (group_id.isNull())  		return; -	LLFloaterGroupInfo::showFromUUID(group_id);	 +	LLSD params; +	params["group_id"] = group_id; +	params["open_tab_name"] = "panel_group_info_sidetray"; + +	LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params); +} + +//static  +void LLGroupActions::refresh(const LLUUID& group_id) +{ +	if(!isGroupUIVisible()) +		return; + +	LLSD params; +	params["group_id"] = group_id; +	params["open_tab_name"] = "panel_group_info_sidetray"; +	params["action"] = "refresh"; + +	LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params); +} + +//static  +void LLGroupActions::createGroup() +{ +	LLSD params; +	params["group_id"] = LLUUID::null; +	params["open_tab_name"] = "panel_group_info_sidetray"; +	params["action"] = "create"; + +	LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params); +  } +//static +void LLGroupActions::closeGroup(const LLUUID& group_id) +{ +	if(!isGroupUIVisible()) +		return; + +	LLSD params; +	params["group_id"] = group_id; +	params["open_tab_name"] = "panel_group_info_sidetray"; +	params["action"] = "close"; + +	LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params); +} +  // static  void LLGroupActions::startChat(const LLUUID& group_id) diff --git a/indra/newview/llgroupactions.h b/indra/newview/llgroupactions.h index b6ddb4511a..70170d3cfe 100644 --- a/indra/newview/llgroupactions.h +++ b/indra/newview/llgroupactions.h @@ -48,11 +48,6 @@ public:  	static void search();  	/** -	 * Invokes group creation floater. -	 */ -	static void create(); - -	/**  	 * Invokes "Leave Group" floater.  	 */  	static void leave(const LLUUID& group_id); @@ -63,9 +58,24 @@ public:  	static void activate(const LLUUID& group_id);  	/** -	 * Show group information dialog. +	 * Show group information panel. +	 */ +	static void show(const LLUUID& group_id); + +	/** +	 * Refresh group information panel. +	 */ +	static void refresh(const LLUUID& group_id); + +	/** +	 * Refresh group information panel. +	 */ +	static void createGroup(); + +	/** +	 * Close group information panel.  	 */ -	static void info(const LLUUID& group_id); +	static void closeGroup		(const LLUUID& group_id);  	/**  	 * Start group instant messaging session. diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index a8d97c6afb..0ba1019765 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -51,7 +51,8 @@  #include "lleconomy.h"  #include "llviewerwindow.h"  #include "llfloaterdirectory.h" -#include "llfloatergroupinfo.h" +#include "llpanelgroup.h" +#include "llgroupactions.h"  #include "lluictrlfactory.h"  #include <boost/regex.hpp> @@ -1210,7 +1211,7 @@ void LLGroupMgr::processEjectGroupMemberReply(LLMessageSystem* msg, void ** data  	// If we had a failure, the group panel needs to be updated.  	if (!success)  	{ -		LLFloaterGroupInfo::refreshGroup(group_id); +		LLGroupActions::refresh(group_id);  	}  } @@ -1230,7 +1231,7 @@ void LLGroupMgr::processJoinGroupReply(LLMessageSystem* msg, void ** data)  		LLGroupMgr::getInstance()->clearGroupData(group_id);  		// refresh the floater for this group, if any. -		LLFloaterGroupInfo::refreshGroup(group_id); +		LLGroupActions::refresh(group_id);  		// refresh the group panel of the search window, if necessary.  		LLFloaterDirectory::refreshGroup(group_id);  	} @@ -1252,7 +1253,7 @@ void LLGroupMgr::processLeaveGroupReply(LLMessageSystem* msg, void ** data)  		LLGroupMgr::getInstance()->clearGroupData(group_id);  		// close the floater for this group, if any. -		LLFloaterGroupInfo::closeGroup(group_id); +		LLGroupActions::closeGroup(group_id);  		// refresh the group panel of the search window, if necessary.  		LLFloaterDirectory::refreshGroup(group_id);  	} @@ -1288,8 +1289,10 @@ void LLGroupMgr::processCreateGroupReply(LLMessageSystem* msg, void ** data)  		gAgent.mGroups.push_back(gd); -		LLFloaterGroupInfo::closeCreateGroup(); -		LLFloaterGroupInfo::showFromUUID(group_id,"roles_tab"); +		LLPanelGroup::refreshCreatedGroup(group_id); +		//FIXME +		//LLFloaterGroupInfo::closeCreateGroup(); +		//LLFloaterGroupInfo::showFromUUID(group_id,"roles_tab");  	}  	else  	{ diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index 4ae188977e..eeb127c878 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -51,9 +51,9 @@  #include "llchat.h"  #include "llchiclet.h"  #include "llconsole.h" +#include "llgroupactions.h"  #include "llfloater.h"  #include "llfloatercall.h" -#include "llfloatergroupinfo.h"  #include "llavataractions.h"  #include "llimview.h"  #include "llinventory.h" @@ -1581,7 +1581,8 @@ void LLFloaterIMPanel::onClickGroupInfo( void* userdata )  	//  Bring up the Profile window  	LLFloaterIMPanel* self = (LLFloaterIMPanel*) userdata; -	LLFloaterGroupInfo::showFromUUID(self->mSessionUUID); +	LLGroupActions::show(self->mSessionUUID); +  }  // static @@ -1713,35 +1714,6 @@ void LLFloaterIMPanel::sendMsg()  								mOtherParticipantUUID,  								mDialog); -				// local echo -				if((mDialog == IM_NOTHING_SPECIAL) &&  -				   (mOtherParticipantUUID.notNull())) -				{ -					std::string history_echo; -					gAgent.buildFullname(history_echo); - -					// Look for IRC-style emotes here. -					std::string prefix = utf8_text.substr(0, 4); -					if (prefix == "/me " || prefix == "/me'") -					{ -						utf8_text.replace(0,3,""); -					} -					else -					{ -						history_echo += ": "; -					} -					history_echo += utf8_text; - -					BOOL other_was_typing = mOtherTyping; - -					addHistoryLine(history_echo, LLUIColorTable::instance().getColor("IMChatColor"), true, gAgent.getID()); - -					if (other_was_typing)  -					{ -						addTypingIndicator(mOtherTypingName); -					} - -				}  			}  			else  			{ @@ -2149,7 +2121,7 @@ BOOL LLIMFloater::postBuild()  	childSetCommitCallback("chat_editor", onSendMsg, this); -	mHistoryEditor = getChild<LLViewerTextEditor>("im_text", true, false); +	mHistoryEditor = getChild<LLViewerTextEditor>("im_text");  	setTitle(LLIMModel::instance().getName(mSessionID));  	setDocked(true); diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 66165090ef..b45d36e7ac 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -380,6 +380,28 @@ void LLIMModel::sendMessage(const std::string& utf8_text,  		std::string from;  		gAgent.buildFullname(from);  		LLIMModel::instance().addToHistory(im_session_id, from, utf8_text); + +		//local echo for the legacy communicate panel +		std::string history_echo; +		std::string utf8_copy = utf8_text; +		gAgent.buildFullname(history_echo); + +		// Look for IRC-style emotes here. + +		std::string prefix = utf8_copy.substr(0, 4); +		if (prefix == "/me " || prefix == "/me'") +		{ +			utf8_copy.replace(0,3,""); +		} +		else +		{ +			history_echo += ": "; +		} +		history_echo += utf8_copy; +		 +		LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(im_session_id); +		if (floater) floater->addHistoryLine(history_echo, LLUIColorTable::instance().getColor("IMChatColor"), true, gAgent.getID()); +  	}  	// Add the recipient to the recent people list. @@ -1362,7 +1384,7 @@ LLUUID LLIMMgr::addSession(  	{  		// *TODO: Remove this?  Otherwise old communicate window opens on  		// second initiation of IM session from People panel? -		floater->openFloater(); +		// floater->openFloater();  	}  	//mTabContainer->selectTabPanel(panel);  	floater->setInputFocus(TRUE); diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 5877a0b19c..5f634496d3 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -67,7 +67,6 @@  #include "llmenugl.h"  #include "llpreviewanim.h"  #include "llpreviewgesture.h" -#include "llpreviewlandmark.h"  #include "llpreviewnotecard.h"  #include "llpreviewscript.h"  #include "llpreviewsound.h" @@ -114,7 +113,7 @@ void dec_busy_count()  struct LLWearableHoldingPattern;  void wear_add_inventory_item_on_avatar(LLInventoryItem* item);  void wear_inventory_category_on_avatar(LLInventoryCategory* category, BOOL append); -void wear_inventory_category_on_avatar_step2( BOOL proceed, LLUUID category, BOOL append); +void wear_inventory_category_on_avatar_step2( BOOL proceed, LLUUID category, BOOL append, BOOL follow_folder_links);  void wear_inventory_category_on_avatar_loop(LLWearable* wearable, void*);  void wear_inventory_category_on_avatar_step3(LLWearableHoldingPattern* holder, BOOL append);  void remove_inventory_category_from_avatar(LLInventoryCategory* category); @@ -220,7 +219,7 @@ void LLInvFVBridge::renameLinkedItems(const LLUUID &item_id, const std::string&  	LLInventoryItem* itemp = model->getItem(mUUID);  	if (!itemp) return; -	if (LLAssetType::lookupIsLinkType(itemp->getActualType())) +	if (itemp->getIsLinkType())  	{  		return;  	} @@ -655,7 +654,7 @@ BOOL LLInvFVBridge::isLinkedObjectInTrash() const  	if (isInTrash()) return TRUE;  	LLInventoryObject *obj = getInventoryObject(); -	if (obj && LLAssetType::lookupIsLinkType(obj->getActualType())) +	if (obj && obj->getIsLinkType())  	{  		LLInventoryModel* model = getInventoryModel();  		if(!model) return FALSE; @@ -1024,7 +1023,7 @@ void LLItemBridge::restoreToWorld()  void LLItemBridge::gotoItem(LLFolderView *folder)  {  	LLInventoryObject *obj = getInventoryObject(); -	if (obj && LLAssetType::lookupIsLinkType(obj->getActualType())) +	if (obj && obj->getIsLinkType())  	{  		LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel();  		if (active_panel) @@ -1090,7 +1089,7 @@ LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const  	}  	const LLViewerInventoryItem* item = getItem(); -	if (LLAssetType::lookupIsLinkType(item->getActualType())) +	if (item && item->getIsLinkType())  	{  		font |= LLFontGL::ITALIC;  	} @@ -1117,7 +1116,7 @@ std::string LLItemBridge::getLabelSuffix() const  			BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType());  			if (broken_link) return BROKEN_LINK; -			BOOL link = LLAssetType::lookupIsLinkType(item->getActualType()); +			BOOL link = item->getIsLinkType();  			if (link) return LINK;  			BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID()); @@ -1242,7 +1241,7 @@ BOOL LLItemBridge::isItemCopyable() const  		// All items can be copied, not all can be pasted.  		// The only time an item can't be copied is if it's a link   		// return (item->getPermissions().allowCopyBy(gAgent.getID())); -		if (LLAssetType::lookupIsLinkType(item->getActualType())) +		if (item->getIsLinkType())  		{  			return FALSE;  		} @@ -1442,6 +1441,13 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  		BOOL move_is_into_trash = (mUUID == trash_id)  				|| model->isObjectDescendentOf(mUUID, trash_id);  		BOOL is_movable = (!LLAssetType::lookupIsProtectedCategoryType(inv_cat->getPreferredType())); +		LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); +		BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); +		if (move_is_into_current_outfit) +		{ +			// BAP - restrictions? +			is_movable = true; +		}  		if( is_movable )  		{  			gInventory.collectDescendents( cat_id, descendent_categories, descendent_items, FALSE ); @@ -1508,13 +1514,27 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  				}  			} -			// Reparent the folder and restamp children if it's moving -			// into trash. -			LLInvFVBridge::changeCategoryParent( -				model, -				(LLViewerInventoryCategory*)inv_cat, -				mUUID, -				move_is_into_trash); +			if (current_outfit_id == mUUID) // if target is current outfit folder we use link +			{ +				link_inventory_item( +					gAgent.getID(), +					inv_cat->getUUID(), +					mUUID, +					inv_cat->getName(), +					LLAssetType::AT_LINK_FOLDER, +					LLPointer<LLInventoryCallback>(NULL)); +			} +			else +			{ +				 +				// Reparent the folder and restamp children if it's moving +				// into trash. +				LLInvFVBridge::changeCategoryParent( +					model, +					(LLViewerInventoryCategory*)inv_cat, +					mUUID, +					move_is_into_trash); +			}  		}  	}  	else if(LLToolDragAndDrop::SOURCE_WORLD == source) @@ -1900,7 +1920,29 @@ void LLFolderBridge::openItem()  	lldebugs << "LLFolderBridge::openItem()" << llendl;  	LLInventoryModel* model = getInventoryModel();  	if(!model) return; -	model->fetchDescendentsOf(mUUID); +	bool fetching_inventory = model->fetchDescendentsOf(mUUID); +	// Only change folder type if we have the folder contents. +	if (!fetching_inventory) +	{ +		// Disabling this for now, it's causing crash when new items are added to folders +		// since folder type may change before new item item has finished processing. +		// determineFolderType(); +	} +} + +void LLFolderBridge::closeItem() +{ +	determineFolderType(); +} + +void LLFolderBridge::determineFolderType() +{ +	if (isUpToDate()) +	{ +		LLInventoryModel* model = getInventoryModel(); +		LLViewerInventoryCategory* category = model->getCategory(mUUID); +		category->determineFolderType(); +	}  }  BOOL LLFolderBridge::isItemRenameable() const @@ -2014,6 +2056,15 @@ LLUIImagePtr LLFolderBridge::getIcon(LLAssetType::EType preferred_type)  			//TODO - need icon  			control = "inv_folder_plain_closed.tga";  			break; +		case LLAssetType::AT_OUTFIT: +			control = "inv_folder_outfit.tga"; +			break; +		case LLAssetType::AT_CURRENT_OUTFIT: +			control = "inv_folder_current_outfit.tga"; +			break; +		case LLAssetType::AT_MY_OUTFITS: +			control = "inv_folder_my_outfits.tga"; +			break;  		default:  			control = "inv_folder_plain_closed.tga";  			break; @@ -2200,6 +2251,10 @@ void LLFolderBridge::folderOptionsMenu()  		}  		mItems.push_back(std::string("Take Off Items"));  	} +	if (LLAssetType::AT_CURRENT_OUTFIT == category->getPreferredType()) +	{ +		mItems.push_back(std::string("Replace Outfit")); +	}  	hideContextEntries(*mMenu, mItems, disabled_items);  } @@ -2254,6 +2309,8 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	else if(isAgentInventory()) // do not allow creating in library  	{  		mItems.push_back(std::string("New Folder")); +		mItems.push_back(std::string("New Outfit")); +		mItems.push_back(std::string("New My Outfits"));  		mItems.push_back(std::string("New Script"));  		mItems.push_back(std::string("New Note"));  		mItems.push_back(std::string("New Gesture")); @@ -2493,7 +2550,9 @@ void LLFolderBridge::modifyOutfit(BOOL append)  	LLViewerInventoryCategory* cat = getCategory();  	if(!cat) return; -	wear_inventory_category_on_avatar( cat, append ); +	// BAP - was: +	// wear_inventory_category_on_avatar( cat, append ); +	wear_inventory_category( cat, FALSE, append );  }  // helper stuff @@ -2899,10 +2958,6 @@ void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* mod  			key["id"] = item->getUUID();  			LLSideTray::getInstance()->showPanel("panel_places", key); -			 -			// Floater preview_landmark disabled,  -			// its functionality moved to Side Tray Places Panel  -			//LLFloaterReg::showInstance("preview_landmark", LLSD(item->getUUID()), TAKE_FOCUS_YES);  		}  	}  	else  @@ -3505,7 +3560,7 @@ LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const  	}  	LLInventoryItem* item = getItem(); -	if (LLAssetType::lookupIsLinkType(item->getActualType())) +	if (item && item->getIsLinkType())  	{  		font |= LLFontGL::ITALIC;  	} @@ -3604,7 +3659,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	else  	{  		LLInventoryItem* item = getItem(); -		if (item && LLAssetType::lookupIsLinkType(item->getActualType())) +		if (item && item->getIsLinkType())  		{  			items.push_back(std::string("Goto Link"));  		} @@ -4091,17 +4146,18 @@ void wear_inventory_category_on_avatar( LLInventoryCategory* category, BOOL appe  	lldebugs << "wear_inventory_category_on_avatar( " << category->getName()  			 << " )" << llendl; +	BOOL follow_folder_links = (category->getPreferredType() == LLAssetType::AT_CURRENT_OUTFIT || category->getPreferredType() == LLAssetType::AT_OUTFIT );   	if( gFloaterCustomize )  	{ -		gFloaterCustomize->askToSaveIfDirty(boost::bind(wear_inventory_category_on_avatar_step2, _1, category->getUUID(), append)); +		gFloaterCustomize->askToSaveIfDirty(boost::bind(wear_inventory_category_on_avatar_step2, _1, category->getUUID(), append, follow_folder_links));  	}  	else  	{ -		wear_inventory_category_on_avatar_step2(TRUE, category->getUUID(), append ); +		wear_inventory_category_on_avatar_step2(TRUE, category->getUUID(), append, follow_folder_links );  	}  } -void wear_inventory_category_on_avatar_step2( BOOL proceed, LLUUID category, BOOL append ) +void wear_inventory_category_on_avatar_step2( BOOL proceed, LLUUID category, BOOL append, BOOL follow_folder_links )  {  	// Find all the wearables that are in the category's subtree.	  	lldebugs << "wear_inventory_category_on_avatar_step2()" << llendl; @@ -4114,7 +4170,8 @@ void wear_inventory_category_on_avatar_step2( BOOL proceed, LLUUID category, BOO  										cat_array,  										item_array,  										LLInventoryModel::EXCLUDE_TRASH, -										is_wearable); +										is_wearable, +										follow_folder_links);  		S32 i;  		S32 wearable_count = item_array.count(); @@ -4125,7 +4182,8 @@ void wear_inventory_category_on_avatar_step2( BOOL proceed, LLUUID category, BOO  										obj_cat_array,  										obj_item_array,  										LLInventoryModel::EXCLUDE_TRASH, -										is_object); +										is_object, +										follow_folder_links);  		S32 obj_count = obj_item_array.count();  		// Find all gestures in this folder @@ -4136,7 +4194,8 @@ void wear_inventory_category_on_avatar_step2( BOOL proceed, LLUUID category, BOO  										gest_cat_array,  										gest_item_array,  										LLInventoryModel::EXCLUDE_TRASH, -										is_gesture); +										is_gesture, +										follow_folder_links);  		S32 gest_count = gest_item_array.count();  		if( !wearable_count && !obj_count && !gest_count) @@ -4144,11 +4203,26 @@ void wear_inventory_category_on_avatar_step2( BOOL proceed, LLUUID category, BOO  			LLNotifications::instance().add("CouldNotPutOnOutfit");  			return;  		} +		 +		const LLUUID ¤t_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); -		// Processes that take time should show the busy cursor  		if (wearable_count > 0 || obj_count > 0)  		{ +			// Processes that take time should show the busy cursor  			inc_busy_count(); +			 +			// Remove all current outfit folder links if we're now replacing the contents. +			if (!append) +			{ +				LLInventoryModel::cat_array_t cat_array; +				LLInventoryModel::item_array_t item_array; +				gInventory.collectDescendents(current_outfit_id, cat_array, item_array, +											  LLInventoryModel::EXCLUDE_TRASH); +				for (i = 0; i < item_array.count(); ++i) +				{ +					gInventory.purgeObject(item_array.get(i)->getUUID()); +				} +			}  		}  		// Activate all gestures in this folder @@ -4189,8 +4263,14 @@ void wear_inventory_category_on_avatar_step2( BOOL proceed, LLUUID category, BOO  			for(i = 0; i < wearable_count; ++i)  			{  				gAddToOutfit = append; -  				found = found_container.get(i); +				 +				// Populate the current outfit folder with links to the newly added wearables +				std::string link_name = "WearableLink"; +				link_inventory_item(gAgent.getID(), found->mItemID, current_outfit_id, link_name, +									LLAssetType::AT_LINK, LLPointer<LLInventoryCallback>(NULL)); + +				// Fetch the wearables about to be worn.  				LLWearableList::instance().getAsset(found->mAssetID,  										found->mName,  									   found->mAssetType, @@ -4245,9 +4325,9 @@ void wear_inventory_category_on_avatar_step2( BOOL proceed, LLUUID category, BOO  						msg->addBOOLFast(_PREHASH_FirstDetachAll, !append );  					} -					LLInventoryItem* item = obj_item_array.get(i); +					const LLInventoryItem* item = obj_item_array.get(i).get();  					msg->nextBlockFast(_PREHASH_ObjectData ); -					msg->addUUIDFast(_PREHASH_ItemID, item->getUUID() ); +					msg->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID());  					msg->addUUIDFast(_PREHASH_OwnerID, item->getPermissions().getOwner());  					msg->addU8Fast(_PREHASH_AttachmentPt, 0 );	// Wear at the previous or default attachment point  					pack_permissions_slam(msg, item->getFlags(), item->getPermissions()); @@ -4259,9 +4339,26 @@ void wear_inventory_category_on_avatar_step2( BOOL proceed, LLUUID category, BOO  						// End of message chunk  						msg->sendReliable( gAgent.getRegion()->getHost() );  					} + +				} + +				for(i = 0; i < obj_count; ++i) +				{ +					const std::string link_name = "AttachmentLink"; +					const LLInventoryItem* item = obj_item_array.get(i).get(); +					link_inventory_item(gAgent.getID(), item->getLinkedUUID(), current_outfit_id, link_name, +										LLAssetType::AT_LINK, LLPointer<LLInventoryCallback>(NULL));  				}  			}  		} + +		// Create a link to the folder that we wore. +		LLViewerInventoryCategory* catp = gInventory.getCategory(category); +		if (catp) +		{ +			link_inventory_item(gAgent.getID(), category, current_outfit_id, catp->getName(), +								LLAssetType::AT_LINK_FOLDER, LLPointer<LLInventoryCallback>(NULL)); +		}  	}  } @@ -4588,7 +4685,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  			items.push_back(std::string("Open"));  		} -		if (item && LLAssetType::lookupIsLinkType(item->getActualType())) +		if (item && item->getIsLinkType())  		{  			items.push_back(std::string("Goto Link"));  		} diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 915dfec629..5cfebe6c15 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -157,6 +157,7 @@ public:  	}  	virtual std::string getLabelSuffix() const { return LLStringUtil::null; }  	virtual void openItem() {} +	virtual void closeItem() {}  	virtual void gotoItem(LLFolderView *folder) {} // for links  	virtual void previewItem() {openItem();}  	virtual void showProperties(); @@ -271,6 +272,7 @@ public:  								BOOL drop);  	virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);  	virtual void openItem(); +	virtual void closeItem();  	virtual BOOL isItemRenameable() const;  	virtual void selectItem();  	virtual void restoreItem(); @@ -325,6 +327,8 @@ protected:  	BOOL checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& typeToCheck);  	void modifyOutfit(BOOL append); +	void determineFolderType(); +  public:  	static LLFolderBridge* sSelf;  	static void staticFolderOptionsMenu(); diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 9cbe11f5c9..596211f16c 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -39,6 +39,7 @@  #include "llfolderviewitem.h"  #include "llinventorymodel.h"	// gInventory.backgroundFetchActive()  #include "llviewercontrol.h" +#include "llviewerinventory.h"  // linden library includes  #include "lltrans.h" @@ -51,12 +52,13 @@ LLInventoryFilter::LLInventoryFilter(const std::string& name)  	mModified(FALSE),  	mNeedTextRebuild(TRUE)  { -	mFilterOps.mFilterTypes = 0xffffffff; +	mFilterOps.mFilterTypes = 0xffffffffffffffffULL;  	mFilterOps.mMinDate = time_min();  	mFilterOps.mMaxDate = time_max();  	mFilterOps.mHoursAgo = 0;  	mFilterOps.mShowFolderState = SHOW_NON_EMPTY_FOLDERS;  	mFilterOps.mPermissions = PERM_NONE; +	mFilterOps.mFilterForCategories = FALSE;  	mOrder = SO_FOLDERS_BY_NAME; // This gets overridden by a pref immediately @@ -94,7 +96,25 @@ BOOL LLInventoryFilter::check(LLFolderViewItem* item)  	}  	LLFolderViewEventListener* listener = item->getListener();  	mSubStringMatchOffset = mFilterSubString.size() ? item->getSearchableLabel().find(mFilterSubString) : std::string::npos; -	BOOL passed = (0x1 << listener->getInventoryType() & mFilterOps.mFilterTypes || listener->getInventoryType() == LLInventoryType::IT_NONE) + +	bool passed_type = false; +	if (mFilterOps.mFilterForCategories) +	{ +		if (listener->getInventoryType() == LLInventoryType::IT_CATEGORY) +		{ +			LLViewerInventoryCategory *cat = gInventory.getCategory(listener->getUUID()); +			if (cat) +			{ +				passed_type |= ((1LL << cat->getPreferredType() & mFilterOps.mFilterTypes) != U64(0)); +			} +		} +	} +	else +	{ +		passed_type |= ((1LL << listener->getInventoryType() & mFilterOps.mFilterTypes) != U64(0)) || listener->getInventoryType() == LLInventoryType::IT_NONE; +	} + +	BOOL passed = passed_type  		&& (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos)  		&& ((listener->getPermissionMask() & mFilterOps.mPermissions) == mFilterOps.mPermissions)  		&& (listener->getCreationDate() >= earliest && listener->getCreationDate() <= mFilterOps.mMaxDate); @@ -124,7 +144,7 @@ BOOL LLInventoryFilter::isNotDefault()  BOOL LLInventoryFilter::isActive()  { -	return mFilterOps.mFilterTypes != 0xffffffff  +	return mFilterOps.mFilterTypes != 0xffffffffffffffffULL   		|| mFilterSubString.size()   		|| mFilterOps.mPermissions != PERM_NONE   		|| mFilterOps.mMinDate != time_min() @@ -144,7 +164,7 @@ BOOL LLInventoryFilter::isModifiedAndClear()  	return ret;  } -void LLInventoryFilter::setFilterTypes(U32 types) +void LLInventoryFilter::setFilterTypes(U64 types, BOOL filter_for_categories)  {  	if (mFilterOps.mFilterTypes != types)  	{ @@ -168,8 +188,8 @@ void LLInventoryFilter::setFilterTypes(U32 types)  		{  			setModified(FILTER_MORE_RESTRICTIVE);  		} -  	} +	mFilterOps.mFilterForCategories = filter_for_categories;  }  void LLInventoryFilter::setFilterSubString(const std::string& string) @@ -374,7 +394,7 @@ void LLInventoryFilter::setModified(EFilterBehavior behavior)  BOOL LLInventoryFilter::isFilterWith(LLInventoryType::EType t)  { -	return mFilterOps.mFilterTypes & (0x01 << t); +	return mFilterOps.mFilterTypes & (1LL << t);  }  std::string LLInventoryFilter::getFilterText() diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index 7c5f6681cf..670b1f000b 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -64,7 +64,7 @@ public:  	LLInventoryFilter(const std::string& name);  	virtual ~LLInventoryFilter(); -	void setFilterTypes(U32 types); +	void setFilterTypes(U64 types, BOOL filter_for_categories = FALSE); // if filter_for_categories is true, operate on folder preferred asset type  	U32 getFilterTypes() const { return mFilterOps.mFilterTypes; }  	void setFilterSubString(const std::string& string); @@ -120,7 +120,8 @@ public:  protected:  	struct filter_ops  	{ -		U32			mFilterTypes; +		U64			mFilterTypes; +		BOOL        mFilterForCategories;  		time_t		mMinDate;  		time_t		mMaxDate;  		U32			mHoursAgo; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 9d3d383d1c..6e89fd75e9 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -434,7 +434,8 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,  											cat_array_t& cats,  											item_array_t& items,  											BOOL include_trash, -											LLInventoryCollectFunctor& add) +											LLInventoryCollectFunctor& add, +											BOOL follow_folder_links)  {  	// Start with categories  	if(!include_trash) @@ -458,9 +459,38 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,  		}  	} -	// Move onto items  	LLViewerInventoryItem* item = NULL;  	item_array_t* item_array = get_ptr_in_map(mParentChildItemTree, id); + +	// Follow folder links recursively.  Currently never goes more +	// than one level deep (for current outfit support) +	// Note: if making it fully recursive, need more checking against infinite loops. +	if (follow_folder_links && item_array) +	{ +		S32 count = item_array->count(); +		for(S32 i = 0; i < count; ++i) +		{ +			item = item_array->get(i); +			if (item->getActualType() == LLAssetType::AT_LINK_FOLDER) +			{ +				// BAP either getLinkedCategory() should return non-const, or the functor should take const. +				LLViewerInventoryCategory *linked_cat = const_cast<LLViewerInventoryCategory*>(item->getLinkedCategory()); +				if (linked_cat) +				{ +					if(add(linked_cat,NULL)) +					{ +						// BAP should this be added here?  May not +						// matter if it's only being used in current +						// outfit traversal. +						cats.put(LLPointer<LLViewerInventoryCategory>(linked_cat)); +					} +					collectDescendentsIf(linked_cat->getUUID(), cats, items, include_trash, add, FALSE); +				} +			} +		} +	} +	 +	// Move onto items  	if(item_array)  	{  		S32 count = item_array->count(); @@ -565,9 +595,11 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)  	}  	LLViewerInventoryItem* old_item = getItem(item->getUUID()); +	LLPointer<LLViewerInventoryItem> new_item;  	if(old_item)  	{  		// We already have an old item, modify its values +		new_item = old_item;  		LLUUID old_parent_id = old_item->getParentUUID();  		LLUUID new_parent_id = item->getParentUUID();  		if(old_parent_id != new_parent_id) @@ -596,7 +628,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)  	else  	{  		// Simply add this item -		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); +		new_item = new LLViewerInventoryItem(item);  		addItem(new_item);  		if(item->getParentUUID().isNull()) @@ -656,11 +688,24 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)  		}  		mask |= LLInventoryObserver::ADD;  	} -	if(item->getType() == LLAssetType::AT_CALLINGCARD) +	if(new_item->getType() == LLAssetType::AT_CALLINGCARD)  	{  		mask |= LLInventoryObserver::CALLING_CARD; +		// Handle user created calling cards. +		// Target ID is stored in the description field of the card. +		LLUUID id; +		std::string desc = new_item->getDescription(); +		BOOL isId = desc.empty() ? FALSE : id.set(desc, FALSE); +		if (isId) +		{ +			// Valid UUID; set the item UUID and rename it +			new_item->setCreator(id); +			std::string avatar_name; +			// Fetch the currect name +			gCacheName->get(id, FALSE, boost::bind(&LLViewerInventoryItem::onCallingCardNameLookup, new_item.get(), _1, _2, _3)); +		}  	} -	addChangedMask(mask, item->getUUID()); +	addChangedMask(mask, new_item->getUUID());  	return mask;  } @@ -857,7 +902,7 @@ void LLInventoryModel::purgeLinkedObjects(const LLUUID &id)  	LLInventoryObject* objectp = getObject(id);  	if (!objectp) return; -	if (LLAssetType::lookupIsLinkType(objectp->getActualType())) +	if (objectp->getIsLinkType())  	{  		return;  	} @@ -1181,14 +1226,14 @@ void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::str  	gInventory.notifyObservers("fetchinventory");  } -void LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) +bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id)  {  	LLViewerInventoryCategory* cat = getCategory(folder_id);  	if(!cat)  	{  		llwarns << "Asked to fetch descendents of non-existent folder: "  				<< folder_id << llendl; -		return; +		return false;  	}  	//S32 known_descendents = 0;  	///cat_array_t* categories = get_ptr_in_map(mParentChildCategoryTree, folder_id); @@ -1201,10 +1246,7 @@ void LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id)  	//{  	//	known_descendents += items->count();  	//} -	if(!cat->fetchDescendents()) -	{ -		//llinfos << "Not fetching descendents" << llendl; -	} +	return cat->fetchDescendents();  }  //Initialize statics. @@ -1322,6 +1364,7 @@ void  fetchDescendentsResponder::result(const LLSD& content)  			{  				cat->setVersion(version);  				cat->setDescendentCount(descendents); +				cat->determineFolderType();  			}  		} @@ -4036,7 +4079,7 @@ bool LLAssetIDMatches::operator()(LLInventoryCategory* cat, LLInventoryItem* ite  bool LLLinkedItemIDMatches::operator()(LLInventoryCategory* cat, LLInventoryItem* item)  {  	return (item &&  -			(LLAssetType::lookupIsLinkType(item->getActualType())) && +			(item->getIsLinkType()) &&  			(item->getLinkedUUID() == mBaseItemID)); // A linked item's assetID will be the compared-to item's itemID.  } diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index da10528c9d..bd0aaa3678 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -185,7 +185,8 @@ public:  							  cat_array_t& categories,  							  item_array_t& items,  							  BOOL include_trash, -							  LLInventoryCollectFunctor& add); +							  LLInventoryCollectFunctor& add, +							  BOOL follow_folder_links = FALSE);  	// Collect all items in inventory that are linked to item_id.  	// Assumes item_id is itself not a linked item. @@ -296,8 +297,9 @@ public:  	// minimal functionality before the actual arrival of inventory.  	//void mock(const LLUUID& root_id); -	// make sure we have the descendents in the structure. -	void fetchDescendentsOf(const LLUUID& folder_id); +	// Make sure we have the descendents in the structure.  Returns true +	// if a fetch was performed. +	bool fetchDescendentsOf(const LLUUID& folder_id);  	// Add categories to a list to be fetched in bulk.  	static void bulkFetch(std::string url); diff --git a/indra/newview/lllocationhistory.cpp b/indra/newview/lllocationhistory.cpp index 68143fd1e3..03d6953521 100644 --- a/indra/newview/lllocationhistory.cpp +++ b/indra/newview/lllocationhistory.cpp @@ -38,33 +38,58 @@  #include "llui.h" +const char LLLocationHistory::delimiter = '\t'; +  LLLocationHistory::LLLocationHistory() :  	mFilename("typed_locations.txt")  {  } -void LLLocationHistory::addItem(std::string item) -{ +void LLLocationHistory::addItem(const std::string & item, const std::string & tooltip) {  	static LLUICachedControl<S32> max_items("LocationHistoryMaxSize", 100); -	 -	std::vector<std::string>::iterator item_iter = std::find(mItems.begin(), mItems.end(), item); -	if (item_iter != mItems.end()) { -		mItems.erase(item_iter); +	// check if this item doesn't duplicate any existing one +	if (touchItem(item)) { +		return;  	}  	mItems.push_back(item); +	mToolTips[item] = tooltip;  	// If the vector size exceeds the maximum, purge the oldest items. -	if ((S32)mItems.size() > max_items) -		mItems.erase(mItems.begin(), mItems.end()-max_items); +	if ((S32)mItems.size() > max_items) { +		for(std::vector<std::string>::iterator i = mItems.begin(); i != mItems.end()-max_items; ++i) { +			mToolTips.erase(*i); +			mItems.erase(i); +		} +	} +} + +bool LLLocationHistory::touchItem(const std::string & item) { +	bool result = false; +	std::vector<std::string>::iterator item_iter = std::find(mItems.begin(), mItems.end(), item); + +	// the last used item should be the first in the history +	if (item_iter != mItems.end()) { +		mItems.erase(item_iter); +		mItems.push_back(item); +		result = true; +	} + +	return result;  }  void LLLocationHistory::removeItems()  {  	mItems.clear(); +	mToolTips.clear();  } +std::string LLLocationHistory::getToolTip(const std::string & item) const { +	std::map<std::string, std::string>::const_iterator i = mToolTips.find(item); + +	return i != mToolTips.end() ? i->second : ""; +}  bool LLLocationHistory::getMatchingItems(std::string substring, location_list_t& result) const  { @@ -110,7 +135,7 @@ void LLLocationHistory::save() const  	}  	for (location_list_t::const_iterator it = mItems.begin(); it != mItems.end(); ++it) -		file << (*it) << std::endl; +		file << (*it) << delimiter << mToolTips.find(*it)->second << std::endl;  	file.close();  } @@ -129,13 +154,21 @@ void LLLocationHistory::load()  		return;  	} -	// remove current entries before we load over them -	mItems.clear(); +	removeItems();  	// add each line in the file to the list  	std::string line; -	while (std::getline(file, line)) -		addItem(line); + +	while (std::getline(file, line)) { +		size_t dp = line.find(delimiter); + +		if (dp != std::string::npos) { +			const std::string reg_name = line.substr(0, dp); +			const std::string tooltip = line.substr(dp + 1, std::string::npos); + +			addItem(reg_name, tooltip); +		} +	}  	file.close(); diff --git a/indra/newview/lllocationhistory.h b/indra/newview/lllocationhistory.h index 19032686c1..67eabcdaca 100644 --- a/indra/newview/lllocationhistory.h +++ b/indra/newview/lllocationhistory.h @@ -37,6 +37,7 @@  #include <vector>  #include <string> +#include <map>  #include <boost/function.hpp>  class LLLocationHistory: public LLSingleton<LLLocationHistory> @@ -50,8 +51,10 @@ public:  	LLLocationHistory(); -	void					addItem(std::string item); +	void					addItem(const std::string & item, const std::string & tooltip); +	bool					touchItem(const std::string & item);  	void                    removeItems(); +	std::string				getToolTip(const std::string & item) const;  	size_t					getItemCount() const	{ return mItems.size(); }  	const location_list_t&	getItems() const		{ return mItems; }  	bool					getMatchingItems(std::string substring, location_list_t& result) const; @@ -62,9 +65,11 @@ public:  	void					dump() const;  private: -	std::vector<std::string>	mItems; -	std::string					mFilename; /// File to store the history to. -	loaded_signal_t				mLoadedSignal; +	const static char delimiter; +	std::vector<std::string>			mItems; +	std::map<std::string, std::string>	mToolTips; +	std::string							mFilename; /// File to store the history to. +	loaded_signal_t						mLoadedSignal;  };  #endif diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 3880ea91eb..e2dc7d69a1 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -55,7 +55,7 @@  #include "llviewerinventory.h"  #include "llviewerparcelmgr.h"  #include "llviewercontrol.h" - +#include "llurllineeditorctrl.h"  //============================================================================  /*   * "ADD LANDMARK" BUTTON UPDATING LOGIC @@ -163,12 +163,38 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)  	mInfoBtn(NULL),  	mAddLandmarkBtn(NULL)  { +	// Lets replace default LLLineEditor with LLLocationLineEditor +	// to make needed escaping while copying and cutting url +	this->removeChild(mTextEntry); +	delete mTextEntry; + +	// Can't access old mTextEntry fields as they are protected, so lets build new params +	// That is C&P from LLComboBox::createLineEditor function +	static LLUICachedControl<S32> drop_shadow_button ("DropShadowButton", 0); +	S32 arrow_width = mArrowImage ? mArrowImage->getWidth() : 0; +	LLRect text_entry_rect(0, getRect().getHeight(), getRect().getWidth(), 0); +	text_entry_rect.mRight -= llmax(8,arrow_width) + 2 * drop_shadow_button; + +	LLLineEditor::Params params = p.combo_editor; +	params.rect(text_entry_rect); +	params.default_text(LLStringUtil::null); +	params.max_length_bytes(p.max_chars); +	params.commit_callback.function(boost::bind(&LLComboBox::onTextCommit, this, _2)); +	params.keystroke_callback(boost::bind(&LLComboBox::onTextEntry, this, _1)); +	params.focus_lost_callback(NULL); +	params.handle_edit_keys_directly(true); +	params.commit_on_focus_lost(false); +	params.follows.flags(FOLLOWS_ALL); +	mTextEntry = LLUICtrlFactory::create<LLURLLineEditor>(params); +	this->addChild(mTextEntry); +	// LLLineEditor is replaced with LLLocationLineEditor +  	// "Place information" button.  	LLButton::Params info_params = p.info_button;  	mInfoBtn = LLUICtrlFactory::create<LLButton>(info_params);  	mInfoBtn->setClickedCallback(boost::bind(&LLLocationInputCtrl::onInfoButtonClicked, this));  	addChild(mInfoBtn); -	 +  	// "Add landmark" button.  	LLButton::Params al_params = p.add_landmark_button;  	if (p.add_landmark_image_enabled()) @@ -187,6 +213,7 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)  	addChild(mAddLandmarkBtn);  	setPrearrangeCallback(boost::bind(&LLLocationInputCtrl::onLocationPrearrange, this, _2)); +	getTextEntry()->setMouseUpCallback(boost::bind(&LLLocationInputCtrl::onTextEditorMouseUp, this, _2,_3,_4));  	updateWidgetlayout(); @@ -234,17 +261,20 @@ BOOL LLLocationInputCtrl::handleToolTip(S32 x, S32 y, std::string& msg, LLRect*  	// Let the buttons show their tooltips.  	if (LLUICtrl::handleToolTip(x, y, msg, sticky_rect_screen) && !msg.empty())  	{ -		return TRUE; -	} +		if (mList->getRect().pointInRect(x, y)) { +			LLLocationHistory* lh = LLLocationHistory::getInstance(); +			const std::string tooltip = lh->getToolTip(msg); -	// Cursor is above the text entry. -	msg = LLUI::sShowXUINames ? getShowNamesToolTip() : gAgent.getSLURL(); -	if (mTextEntry && sticky_rect_screen) -	{ -		*sticky_rect_screen = mTextEntry->calcScreenRect(); +			if (!tooltip.empty()) { +				msg = tooltip; +			} +		} + +		return TRUE;  	} -	return TRUE; +	msg = LLUI::sShowXUINames ? getShowNamesToolTip() : ""; +	return mTextEntry->getRect().pointInRect(x, y);  }  BOOL LLLocationInputCtrl::handleKeyHere(KEY key, MASK mask) @@ -321,19 +351,19 @@ void LLLocationInputCtrl::handleLoginComplete()  void LLLocationInputCtrl::onFocusReceived()  {  	prearrangeList(); -	setText(gAgent.getSLURL()); -	if (mTextEntry) -		mTextEntry->endSelection(); // we don't want handleMouseUp() to "finish" the selection  }  void LLLocationInputCtrl::onFocusLost()  {  	LLUICtrl::onFocusLost();  	refreshLocation(); +	if(mTextEntry->hasSelection()){ +		mTextEntry->deselect(); +	}  }  void	LLLocationInputCtrl::draw(){ -	if(!hasFocus()){ +	if(!hasFocus() && gSavedSettings.getBOOL("ShowCoordinatesOption")){  		refreshLocation();  	}  	LLComboBox::draw(); @@ -347,9 +377,6 @@ void LLLocationInputCtrl::onInfoButtonClicked()  void LLLocationInputCtrl::onAddLandmarkButtonClicked()  {  	LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark")); -	 -	// Floater "Add Landmark" functionality moved to Side Tray -	//LLFloaterReg::showInstance("add_landmark");  }  void LLLocationInputCtrl::onAgentParcelChange() @@ -374,6 +401,13 @@ void LLLocationInputCtrl::onLocationPrearrange(const LLSD& data)  	rebuildLocationHistory(filter);  	mList->mouseOverHighlightNthItem(-1); // Clear highlight on the last selected item.  } +void LLLocationInputCtrl::onTextEditorMouseUp(S32 x, S32 y, MASK mask) +{ +	if (!mTextEntry->hasSelection()) { +			setText(gAgent.getUnescapedSLURL()); +			mTextEntry->selectAll(); +	} +}  void LLLocationInputCtrl::refresh()  { diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h index bda67fd313..0196aae4e7 100644 --- a/indra/newview/lllocationinputctrl.h +++ b/indra/newview/lllocationinputctrl.h @@ -103,6 +103,7 @@ private:  	void					onInfoButtonClicked();  	void					onLocationHistoryLoaded();  	void					onLocationPrearrange(const LLSD& data); +	void 					onTextEditorMouseUp(S32 x, S32 y, MASK mask);  	void					onLandmarkLoaded(LLLandmark* lm);  	void					onAddLandmarkButtonClicked();  	void					onAgentParcelChange(); diff --git a/indra/newview/lllookshistorypanel.h b/indra/newview/lllookshistorypanel.h new file mode 100644 index 0000000000..986c9a1c4d --- /dev/null +++ b/indra/newview/lllookshistorypanel.h @@ -0,0 +1,72 @@ +/**  + * @file llpanelteleporthistory.h + * @brief Teleport history represented by a scrolling list + * class definition + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + *  + * Copyright (c) 2001-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_LLPANELLOOKSHISTORY_H +#define LL_LLPANELLOOKSHISTORY_H + +#include "lluictrlfactory.h" +#include "llscrolllistctrl.h" + +#include "llpanelappearancetab.h" +#include "lllookshistory.h" + +class LLLooksHistoryPanel : public LLPanelAppearanceTab +{ +public: +	LLLooksHistoryPanel(); +	virtual ~LLLooksHistoryPanel(); + +	/*virtual*/ BOOL postBuild(); +	/*virtual*/ void onSearchEdit(const std::string& string); +	/*virtual*/ void onShowOnMap(); +	/*virtual*/ void onLooks(); +	///*virtual*/ void onCopySLURL(); + +	void showLooksHistory(); +	void handleItemSelect(const LLSD& data); + +	static void onDoubleClickItem(void* user_data); + +private: +	enum LOOKS_HISTORY_COLUMN_ORDER +	{ +		LIST_ICON, +		LIST_ITEM_TITLE, +		LIST_INDEX +	}; + +	LLLooksHistory*		mLooksHistory; +	LLScrollListCtrl*		mHistoryItems; +	std::string				mFilterSubString; +}; + +#endif //LL_LLPANELLOOKSHISTORY_H diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index 124a2def7f..fc425d1b33 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -373,8 +373,7 @@ void LLFloaterMove::updatePosition()  	LLBottomTray* tray = LLBottomTray::getInstance();  	if (!tray) return; -	LLButton* movement_btn = tray->getChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME, TRUE, FALSE); -	if (!movement_btn) return; +	LLButton* movement_btn = tray->getChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME);  	//align centers of a button and a floater  	S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; @@ -435,7 +434,7 @@ void LLFloaterMove::showQuickTips(const EMovementMode mode)  	default: llwarns << "Quick Tip type was not detected, FTT_MOVE_WALK will be used" << llendl;  	} -	LLFirstTimeTipsManager::showTipsFor(tipType, this); +	LLFirstTimeTipsManager::showTipsFor(tipType, this, LLFirstTimeTipsManager::TPA_POS_LEFT_ALIGN_TOP);  }  void LLFloaterMove::setModeButtonToggleState(const EMovementMode mode) @@ -569,8 +568,7 @@ void LLPanelStandStopFlying::updatePosition()  	LLBottomTray* tray = LLBottomTray::getInstance();  	if (!tray) return; -	LLButton* movement_btn = tray->getChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME, TRUE, FALSE); -	if (!movement_btn) return; +	LLButton* movement_btn = tray->getChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME);  	//align centers of a button and a floater  	S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 06cab9afb0..0f719f29e9 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -56,6 +56,7 @@  #include "llworldmap.h"  #include "llappviewer.h"  #include "llviewercontrol.h" +#include "llfavoritesbar.h"  //-- LLTeleportHistoryMenuItem ----------------------------------------------- @@ -181,10 +182,14 @@ LLNavigationBar::LLNavigationBar()  	mBtnHome(NULL),  	mCmbLocation(NULL),  	mLeSearch(NULL), -	mPurgeTPHistoryItems(false) +	mPurgeTPHistoryItems(false), +	mUpdateTypedLocationHistory(false)  {  	setIsChrome(TRUE); +	mParcelMgrConnection = LLViewerParcelMgr::getInstance()->setAgentParcelChangedCallback( +			boost::bind(&LLNavigationBar::onTeleportFinished, this)); +  	// Register callbacks and load the location field context menu (NB: the order matters).  	mCommitCallbackRegistrar.add("Navbar.Action", boost::bind(&LLNavigationBar::onLocationContextMenuItemClicked, this, _2));  	mEnableCallbackRegistrar.add("Navbar.EnableMenuItem", boost::bind(&LLNavigationBar::onLocationContextMenuItemEnabled, this, _2)); @@ -196,10 +201,14 @@ LLNavigationBar::LLNavigationBar()  	// set a listener function for LoginComplete event  	LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLNavigationBar::handleLoginComplete, this)); + +	// Necessary for focus movement among child controls +	setFocusRoot(TRUE);  }  LLNavigationBar::~LLNavigationBar()  { +	mParcelMgrConnection.disconnect();  	sInstance = 0;  } @@ -241,6 +250,9 @@ BOOL LLNavigationBar::postBuild()  		return FALSE;  	} +	mDefaultNbRect = getRect(); +	mDefaultFpRect = getChild<LLFavoritesBarCtrl>("favorite")->getRect(); +  	// we'll be notified on teleport history changes  	LLTeleportHistory::getInstance()->setHistoryChangedCallback(  			boost::bind(&LLNavigationBar::onTeleportHistoryChanged, this)); @@ -273,6 +285,11 @@ BOOL LLNavigationBar::handleRightMouseUp(S32 x, S32 y, MASK mask)  		{  			mLocationContextMenu->buildDrawLabels();  			mLocationContextMenu->updateParent(LLMenuGL::sMenuContainer); +			LLLineEditor* textEntry =mCmbLocation->getTextEntry();   +			if(textEntry && !textEntry->hasSelection() ){ +				textEntry->setText(gAgent.getUnescapedSLURL()); +				textEntry->selectAll(); +			}  			LLMenuGL::showPopup(this, mLocationContextMenu, x, y);  		}  		return TRUE; @@ -324,12 +341,12 @@ void LLNavigationBar::onLocationSelection()  	std::string region_name;  	LLVector3 local_coords(128, 128, 0); +	S32 x = 0, y = 0, z = 0;  	// Is the typed location a SLURL?  	if (LLSLURL::isSLURL(typed_location))  	{  		// Yes. Extract region name and local coordinates from it. -		S32 x = 0, y = 0, z = 0;  		if (LLURLSimString::parse(LLSLURL::stripProtocol(typed_location), ®ion_name, &x, &y, &z))  			local_coords.set(x, y, z);  		else @@ -337,8 +354,13 @@ void LLNavigationBar::onLocationSelection()  	}  	else  	{ +		region_name = extractLocalCoordsFromRegName(typed_location, &x, &y, &z); + +		if (region_name != typed_location) { +			local_coords.set(x, y, z); +		}  		// Treat it as region name. -		region_name = typed_location; +		// region_name = typed_location;  	}  	// Resolve the region name to its global coordinates. @@ -349,6 +371,32 @@ void LLNavigationBar::onLocationSelection()  	LLWorldMap::getInstance()->sendNamedRegionRequest(region_name, cb, std::string("unused"), false);  } +void LLNavigationBar::onTeleportFinished() { + +	if (mUpdateTypedLocationHistory) { +		LLLocationHistory* lh = LLLocationHistory::getInstance(); + +		// Location is valid. Add it to the typed locations history. +		// If user has typed text this variable will contain -1. +		if (mCmbLocation->getCurrentIndex() != -1) { +			lh->touchItem(mCmbLocation->getSelectedItemLabel()); +		} else { +			std::string region_name; +			std::string url = gAgent.getSLURL(); +			S32 x = 0, y = 0, z = 0; + +			if (LLSLURL::isSLURL(url)) { +				LLURLSimString::parse(LLSLURL::stripProtocol(url), ®ion_name, &x, &y, &z); +				appendLocalCoordsToRegName(®ion_name, x, y, z); +				lh->addItem(region_name, url); +			} +		} + +		lh->save(); +		mUpdateTypedLocationHistory = false; +	} +} +  void LLNavigationBar::onTeleportHistoryChanged()  {  	// Update navigation controls. @@ -415,27 +463,13 @@ void LLNavigationBar::onRegionNameResponse(  		return;  	} -	// Location is valid. Add it to the typed locations history. -	// If user has typed text this variable will contain -1. -	S32 selected_item = mCmbLocation->getCurrentIndex(); - -	/* -	LLLocationHistory* lh = LLLocationHistory::getInstance(); -	lh->addItem(selected_item == -1 ? typed_location : mCmbLocation->getSelectedItemLabel()); -	lh->save(); -	*/ -  	// Teleport to the location.  	LLVector3d region_pos = from_region_handle(region_handle);  	LLVector3d global_pos = region_pos + (LLVector3d) local_coords; - +	mUpdateTypedLocationHistory = true;  	llinfos << "Teleporting to: " << global_pos  << llendl;  	gAgent.teleportViaLocation(global_pos); - -	LLLocationHistory* lh = LLLocationHistory::getInstance(); -	lh->addItem(selected_item == -1 ? typed_location : mCmbLocation->getSelectedItemLabel()); -	lh->save();  }  void	LLNavigationBar::showTeleportHistoryMenu() @@ -474,9 +508,6 @@ void LLNavigationBar::onLocationContextMenuItemClicked(const LLSD& userdata)  	else if (item == std::string("landmark"))  	{  		LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark")); - -		// Floater "Add Landmark" functionality moved to Side Tray -		//LLFloaterReg::showInstance("add_landmark");  	}  	else if (item == std::string("cut"))  	{ @@ -546,6 +577,38 @@ void LLNavigationBar::invokeSearch(std::string search_text)  	LLFloaterReg::showInstance("search", LLSD().insert("panel", "all").insert("id", LLSD(search_text)));  } +void LLNavigationBar::appendLocalCoordsToRegName(std::string* reg_name, S32 x, S32 y, S32 z) { +	std::string fmt = *reg_name + " (%d, %d, %d)"; +	*reg_name = llformat(fmt.c_str(), x, y, z); +} + +std::string LLNavigationBar::extractLocalCoordsFromRegName(const std::string & reg_name, S32* x, S32* y, S32* z) { +	/* +	 * This regular expression extracts numbers from the following string +	 * construct: "(num1, num2, num3)", where num1, num2 and num3 are decimal +	 * numbers. Leading and trailing spaces are also caught by the expression. +	 */ +	const boost::regex re("\\s*\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)\\s*"); + +	boost::smatch m; +	if (boost::regex_search(reg_name, m, re)) { +		// string representations of parsed by regex++ numbers +		std::string xstr(m[1].first, m[1].second); +		std::string ystr(m[2].first, m[2].second); +		std::string zstr(m[3].first, m[3].second); + +		*x = atoi(xstr.c_str()); +		*y = atoi(ystr.c_str()); +		*z = atoi(zstr.c_str()); + +		return boost::regex_replace(reg_name, re, ""); +	} + +	*x = *y = *z = 0; + +	return reg_name; +} +  void LLNavigationBar::clearHistoryCache()  {  	mCmbLocation->removeall(); @@ -554,3 +617,131 @@ void LLNavigationBar::clearHistoryCache()  	lh->save();	  	mPurgeTPHistoryItems= true;  } + +void LLNavigationBar::showNavigationPanel(BOOL visible) +{ +	bool fpVisible = gSavedSettings.getBOOL("ShowNavbarFavoritesPanel"); + +	LLFavoritesBarCtrl* fb = getChild<LLFavoritesBarCtrl>("favorite"); +	LLPanel* navPanel = getChild<LLPanel>("navigation_panel"); + +	LLRect nbRect(getRect()); +	LLRect fbRect(fb->getRect()); + +	navPanel->setVisible(visible); + +	if (visible) +	{ +		if (fpVisible) +		{ +			// Navigation Panel must be shown. Favorites Panel is visible. + +			nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), mDefaultNbRect.getHeight()); +			fbRect.setLeftTopAndSize(fbRect.mLeft, mDefaultFpRect.mTop, fbRect.getWidth(), fbRect.getHeight()); + +			// this is duplicated in 'else' section because it should be called BEFORE fb->reshape +			reshape(nbRect.getWidth(), nbRect.getHeight()); +			setRect(nbRect); + +			fb->reshape(fbRect.getWidth(), fbRect.getHeight()); +			fb->setRect(fbRect); +		} +		else +		{ +			// Navigation Panel must be shown. Favorites Panel is hidden. + +			S32 height = mDefaultNbRect.getHeight() - mDefaultFpRect.getHeight(); +			nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), height); + +			reshape(nbRect.getWidth(), nbRect.getHeight()); +			setRect(nbRect); +		} +	} +	else +	{ +		if (fpVisible) +		{ +			// Navigation Panel must be hidden. Favorites Panel is visible. + +			nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), fbRect.getHeight()); +			fbRect.setLeftTopAndSize(fbRect.mLeft, fbRect.getHeight(), fbRect.getWidth(), fbRect.getHeight()); + +			// this is duplicated in 'else' section because it should be called BEFORE fb->reshape +			reshape(nbRect.getWidth(), nbRect.getHeight()); +			setRect(nbRect); + +			fb->reshape(fbRect.getWidth(), fbRect.getHeight()); +			fb->setRect(fbRect); +		} +		else +		{ +			// Navigation Panel must be hidden. Favorites Panel is hidden. + +			nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), 0); + +			reshape(nbRect.getWidth(), nbRect.getHeight()); +			setRect(nbRect); +		} +	} +} + +void LLNavigationBar::showFavoritesPanel(BOOL visible) +{ +	bool npVisible = gSavedSettings.getBOOL("ShowNavbarNavigationPanel"); + +	LLFavoritesBarCtrl* fb = getChild<LLFavoritesBarCtrl>("favorite"); + +	LLRect nbRect(getRect()); +	LLRect fbRect(fb->getRect()); + +	if (visible) +	{ +		if (npVisible) +		{ +			// Favorites Panel must be shown. Navigation Panel is visible. + +			S32 fbHeight = fbRect.getHeight(); +			S32 newHeight = nbRect.getHeight() + fbHeight; + +			nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), newHeight); +			fbRect.setLeftTopAndSize(mDefaultFpRect.mLeft, mDefaultFpRect.mTop, fbRect.getWidth(), fbRect.getHeight()); +		} +		else +		{ +			// Favorites Panel must be shown. Navigation Panel is hidden. + +			S32 fpHeight = mDefaultFpRect.getHeight(); +			nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), fpHeight); +			fbRect.setLeftTopAndSize(fbRect.mLeft, fpHeight, fbRect.getWidth(), fpHeight); +		} + +		reshape(nbRect.getWidth(), nbRect.getHeight()); +		setRect(nbRect); + +		fb->reshape(fbRect.getWidth(), fbRect.getHeight()); +		fb->setRect(fbRect); +	} +	else +	{ +		if (npVisible) +		{ +			// Favorites Panel must be hidden. Navigation Panel is visible. + +			S32 fbHeight = fbRect.getHeight(); +			S32 newHeight = nbRect.getHeight() - fbHeight; + +			nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), newHeight); +		} +		else +		{ +			// Favorites Panel must be hidden. Navigation Panel is hidden. + +			nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), 0); +		} + +		reshape(nbRect.getWidth(), nbRect.getHeight()); +		setRect(nbRect); +	} + +	fb->setVisible(visible); +} diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h index 17a1438912..c533953a02 100644 --- a/indra/newview/llnavigationbar.h +++ b/indra/newview/llnavigationbar.h @@ -60,6 +60,9 @@ public:  	void handleLoginComplete();  	void clearHistoryCache(); + +	void showNavigationPanel(BOOL visible); +	void showFavoritesPanel(BOOL visible);  private:  	LLNavigationBar(); @@ -68,6 +71,9 @@ private:  	void showTeleportHistoryMenu();  	void invokeSearch(std::string search_text); +	static void appendLocalCoordsToRegName(std::string* reg_name, S32 x, S32 y, S32 z); +	static std::string extractLocalCoordsFromRegName(const std::string & reg_name, S32* x, S32* y, S32* z); +  	// callbacks  	bool onLocationContextMenuItemEnabled(const LLSD& userdata);  	void onLocationContextMenuItemClicked(const LLSD& userdata); @@ -81,6 +87,7 @@ private:  	void onLocationSelection();  	void onLocationPrearrange(const LLSD& data);  	void onSearchCommit(); +	void onTeleportFinished();  	void onRegionNameResponse(  			std::string typed_location,  			std::string region_name, @@ -90,14 +97,18 @@ private:  	static LLNavigationBar *sInstance; -	LLMenuGL*				mLocationContextMenu; -	LLMenuGL*				mTeleportHistoryMenu; -	LLButton*				mBtnBack; -	LLButton*				mBtnForward; -	LLButton*				mBtnHome; -	LLSearchEditor*			mLeSearch; -	LLLocationInputCtrl*	mCmbLocation; -	bool					mPurgeTPHistoryItems; +	LLMenuGL*					mLocationContextMenu; +	LLMenuGL*					mTeleportHistoryMenu; +	LLButton*					mBtnBack; +	LLButton*					mBtnForward; +	LLButton*					mBtnHome; +	LLSearchEditor*				mLeSearch; +	LLLocationInputCtrl*		mCmbLocation; +	LLRect						mDefaultNbRect; +	LLRect						mDefaultFpRect; +	boost::signals2::connection	mParcelMgrConnection; +	bool						mPurgeTPHistoryItems; +	bool						mUpdateTypedLocationHistory;  };  #endif diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 1fa1e2a09d..c89715e815 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -48,11 +48,20 @@  #include "llnearbychathandler.h"  #include "llchannelmanager.h" +//for LLViewerTextEditor support +#include "llagent.h" 			// gAgent +#include "llfloaterscriptdebug.h" +#include "llviewertexteditor.h" +#include "llstylemap.h" + +  static const S32 RESIZE_BAR_THICKNESS = 3;  LLNearbyChat::LLNearbyChat(const LLSD& key) :  	LLFloater(key), -	mEChatTearofState(CHAT_PINNED) +	mEChatTearofState(CHAT_PINNED), +	mChatCaptionPanel(NULL), +	mChatHistoryEditor(NULL)  {  } @@ -94,23 +103,14 @@ BOOL LLNearbyChat::postBuild()  	gSavedSettings.declareS32("nearbychat_showicons_and_names",2,"NearByChat header settings",true); -	/* -	LLChatItemsContainerCtrl* panel = getChild<LLChatItemsContainerCtrl>("chat_history",false,false); -	if(panel) -	{ -		panel->setHeaderVisibility((EShowItemHeader)gSavedSettings.getS32("nearbychat_showicons_and_names")); -	} -	*/ -	 +	mChatCaptionPanel = getChild<LLPanel>("chat_caption", false); +	mChatHistoryEditor = getChild<LLViewerTextEditor>("Chat History Editor"); +  	reshape(getRect().getWidth(), getRect().getHeight(), FALSE);  	return LLFloater::postBuild();  } -#include "llagent.h" 			// gAgent -#include "llfloaterscriptdebug.h" -#include "llviewertexteditor.h" -#include "llstylemap.h"  LLColor4 nearbychat_get_text_color(const LLChat& chat)  { @@ -215,15 +215,6 @@ void nearbychat_add_timestamped_line(LLViewerTextEditor* edit, LLChat chat, cons  void	LLNearbyChat::addMessage(const LLChat& chat)  { -	/* -	LLChatItemsContainerCtrl* panel = getChild<LLChatItemsContainerCtrl>("chat_history",false,false); -	if(!panel) -		return; -	panel->addMessage(message); -	*/ - -	//"Chat History Editor" !!!!! -  	LLColor4 color = nearbychat_get_text_color(chat); @@ -241,13 +232,12 @@ void	LLNearbyChat::addMessage(const LLChat& chat)  	// could flash the chat button in the status bar here. JC -	LLViewerTextEditor*	history_editor = getChild<LLViewerTextEditor>("Chat History Editor"); -	history_editor->setParseHTML(TRUE); -	history_editor->setParseHighlights(TRUE); +	mChatHistoryEditor->setParseHTML(TRUE); +	mChatHistoryEditor->setParseHighlights(TRUE);  	if (!chat.mMuted) -		nearbychat_add_timestamped_line(history_editor, chat, color); +		nearbychat_add_timestamped_line(mChatHistoryEditor, chat, color);  }  void LLNearbyChat::onNearbySpeakers() @@ -270,8 +260,6 @@ void LLNearbyChat::reshape(S32 width, S32 height, BOOL called_from_parent)  	LLFloater::reshape(width, height, called_from_parent); -	LLPanel* caption = getChild<LLPanel>("chat_caption",false,false); -  	LLRect resize_rect;  	resize_rect.setLeftTopAndSize( 0, height, width, RESIZE_BAR_THICKNESS);  	if (mResizeBar[LLResizeBar::TOP]) @@ -301,25 +289,23 @@ void LLNearbyChat::reshape(S32 width, S32 height, BOOL called_from_parent)  		mResizeBar[LLResizeBar::RIGHT]->setRect(resize_rect);  	} - +	// *NOTE: we must check mChatCaptionPanel and mChatHistoryEditor against NULL because reshape is called from the  +	// LLView::initFromParams BEFORE postBuild is called and child controls are not exist yet  	LLRect caption_rect; -	if (caption) +	if (NULL != mChatCaptionPanel)  	{ -		caption_rect = caption->getRect(); +		caption_rect = mChatCaptionPanel->getRect();  		caption_rect.setLeftTopAndSize( 2, height - RESIZE_BAR_THICKNESS, width - 4, caption_rect.getHeight()); -		caption->reshape( width - 4, caption_rect.getHeight(), 1); -		caption->setRect(caption_rect); +		mChatCaptionPanel->reshape( width - 4, caption_rect.getHeight(), 1); +		mChatCaptionPanel->setRect(caption_rect);  	} -	//LLPanel* scroll_panel = getChild<LLPanel>("chat_history",false,false); -	LLViewerTextEditor*	scroll_panel = getChild<LLViewerTextEditor>("Chat History Editor"); -	 -	if (scroll_panel) +	if (NULL != mChatHistoryEditor)  	{ -		LLRect scroll_rect = scroll_panel->getRect(); +		LLRect scroll_rect = mChatHistoryEditor->getRect();  		scroll_rect.setLeftTopAndSize( 2, height - caption_rect.getHeight() - RESIZE_BAR_THICKNESS, width - 4, height - caption_rect.getHeight() - RESIZE_BAR_THICKNESS*2); -		scroll_panel->reshape( width - 4, height - caption_rect.getHeight() - RESIZE_BAR_THICKNESS*2, 1); -		scroll_panel->setRect(scroll_rect); +		mChatHistoryEditor->reshape( width - 4, height - caption_rect.getHeight() - RESIZE_BAR_THICKNESS*2, 1); +		mChatHistoryEditor->setRect(scroll_rect);  	}  	// @@ -342,57 +328,47 @@ void LLNearbyChat::reshape(S32 width, S32 height, BOOL called_from_parent)  BOOL	LLNearbyChat::handleMouseDown	(S32 x, S32 y, MASK mask)  { -	LLPanel* caption = getChild<LLPanel>("chat_caption",false,false); -	if(caption) +	LLUICtrl* nearby_speakers_btn = mChatCaptionPanel->getChild<LLUICtrl>("nearby_speakers_btn"); +	LLUICtrl* tearoff_btn = mChatCaptionPanel->getChild<LLUICtrl>("tearoff_btn"); +	LLUICtrl* close_btn = mChatCaptionPanel->getChild<LLUICtrl>("close_btn"); +	 +	S32 caption_local_x = x - mChatCaptionPanel->getRect().mLeft; +	S32 caption_local_y = y - mChatCaptionPanel->getRect().mBottom; +	 +	S32 local_x = caption_local_x - nearby_speakers_btn->getRect().mLeft; +	S32 local_y = caption_local_y - nearby_speakers_btn->getRect().mBottom; +	if(nearby_speakers_btn->pointInView(local_x, local_y))  	{ -		LLUICtrl* nearby_speakers_btn = caption->getChild<LLUICtrl>("nearby_speakers_btn"); -		LLUICtrl* tearoff_btn = caption->getChild<LLUICtrl>("tearoff_btn"); -		LLUICtrl* close_btn = caption->getChild<LLUICtrl>("close_btn"); -		 -		S32 caption_local_x = x - caption->getRect().mLeft; -		S32 caption_local_y = y - caption->getRect().mBottom; -		 -		if(nearby_speakers_btn && tearoff_btn) -		{ -			S32 local_x = caption_local_x - nearby_speakers_btn->getRect().mLeft; -			S32 local_y = caption_local_y - nearby_speakers_btn->getRect().mBottom; -			if(nearby_speakers_btn->pointInView(local_x, local_y)) -			{ -				onNearbySpeakers(); -				bringToFront( x, y ); -				return true; -			} -			local_x = caption_local_x - tearoff_btn->getRect().mLeft; -			local_y = caption_local_y- tearoff_btn->getRect().mBottom; -			if(tearoff_btn->pointInView(local_x, local_y)) -			{ -				onTearOff(); -				bringToFront( x, y ); -				return true; -			} +		onNearbySpeakers(); +		bringToFront( x, y ); +		return true; +	} +	local_x = caption_local_x - tearoff_btn->getRect().mLeft; +	local_y = caption_local_y- tearoff_btn->getRect().mBottom; +	if(tearoff_btn->pointInView(local_x, local_y)) +	{ +		onTearOff(); +		bringToFront( x, y ); +		return true; +	} -			if(close_btn) -			{ -				local_x = caption_local_x - close_btn->getRect().mLeft; -				local_y = caption_local_y - close_btn->getRect().mBottom; -				if(close_btn->pointInView(local_x, local_y)) -				{ -					setVisible(false); -					bringToFront( x, y ); -					return true; -				} -			} -		} +	local_x = caption_local_x - close_btn->getRect().mLeft; +	local_y = caption_local_y - close_btn->getRect().mBottom; +	if(close_btn->pointInView(local_x, local_y)) +	{ +		setVisible(false); +		bringToFront( x, y ); +		return true; +	} -		if(mEChatTearofState == CHAT_UNPINNED && caption->pointInView(caption_local_x, caption_local_y) ) -		{ -			//start draggind -			gFocusMgr.setMouseCapture(this); -			mStart_Y = y; -			mStart_X = x; -			bringToFront( x, y ); -			return true; -		} +	if(mEChatTearofState == CHAT_UNPINNED && mChatCaptionPanel->pointInView(caption_local_x, caption_local_y) ) +	{ +		//start draggind +		gFocusMgr.setMouseCapture(this); +		mStart_Y = y; +		mStart_X = x; +		bringToFront( x, y ); +		return true;  	}  	return LLFloater::handleMouseDown(x,y,mask); @@ -425,8 +401,7 @@ BOOL	LLNearbyChat::handleHover(S32 x, S32 y, MASK mask)  void	LLNearbyChat::pinn_panel()  {  	mEChatTearofState = CHAT_PINNED; -	LLPanel* caption = getChild<LLPanel>("chat_caption",false,false); -	LLIconCtrl* tearoff_btn = caption->getChild<LLIconCtrl>("tearoff_btn",false,false); +	LLIconCtrl* tearoff_btn = mChatCaptionPanel->getChild<LLIconCtrl>("tearoff_btn",false);  	tearoff_btn->setValue("inv_item_landmark_visited.tga"); @@ -445,8 +420,7 @@ void	LLNearbyChat::pinn_panel()  void	LLNearbyChat::float_panel()  {  	mEChatTearofState = CHAT_UNPINNED; -	LLPanel* caption = getChild<LLPanel>("chat_caption",false,false); -	LLIconCtrl* tearoff_btn = caption->getChild<LLIconCtrl>("tearoff_btn",false,false); +	LLIconCtrl* tearoff_btn = mChatCaptionPanel->getChild<LLIconCtrl>("tearoff_btn", false);  	tearoff_btn->setValue("inv_item_landmark.tga");  	mResizeBar[LLResizeBar::BOTTOM]->setVisible(true); @@ -456,50 +430,20 @@ void	LLNearbyChat::float_panel()  	translate(4,4);  } -void LLNearbyChat::onNearbyChatContextMenuItemClicked(const LLSD& userdata) +void	LLNearbyChat::onNearbyChatContextMenuItemClicked(const LLSD& userdata)  { -	/* -	LLChatItemsContainerCtrl* panel = getChild<LLChatItemsContainerCtrl>("chat_history",false,false); -	if(!panel) -		return; - -	std::string str = userdata.asString(); -	if(str == "show_buddy_icons") -		panel->setHeaderVisibility(CHATITEMHEADER_SHOW_ONLY_ICON); -	else if(str == "show_names") -		panel->setHeaderVisibility(CHATITEMHEADER_SHOW_ONLY_NAME); -	else if(str == "show_icons_and_names") -		panel->setHeaderVisibility(CHATITEMHEADER_SHOW_BOTH); - -	gSavedSettings.setS32("nearbychat_showicons_and_names", (S32)panel->getHeaderVisibility()); -	*/  }  bool	LLNearbyChat::onNearbyChatCheckContextMenuItem(const LLSD& userdata)  {  	std::string str = userdata.asString();  	if(str == "nearby_people")  		onNearbySpeakers();	 -	/* -	LLChatItemsContainerCtrl* panel = getChild<LLChatItemsContainerCtrl>("chat_history",false,false); -	if(!panel) -		return false; -	 -	if(str == "show_buddy_icons") -		return panel->getHeaderVisibility() == CHATITEMHEADER_SHOW_ONLY_ICON; -	else if(str == "show_names") -		return panel->getHeaderVisibility() == CHATITEMHEADER_SHOW_ONLY_NAME; -	else if(str == "show_icons_and_names") -		return panel->getHeaderVisibility() == CHATITEMHEADER_SHOW_BOTH; -	else if(str == "nearby_people") -		onNearbySpeakers(); -	*/  	return false;  }  BOOL LLNearbyChat::handleRightMouseDown(S32 x, S32 y, MASK mask)  { -	LLPanel* caption = getChild<LLPanel>("chat_caption",false,false); -	if(caption && caption->pointInView(x - caption->getRect().mLeft, y - caption->getRect().mBottom) ) +	if(mChatCaptionPanel->pointInView(x - mChatCaptionPanel->getRect().mLeft, y - mChatCaptionPanel->getRect().mBottom) )  	{  		LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get(); diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index 670a394c95..efa2e479e6 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -38,6 +38,7 @@  #include "llchat.h"  class LLResizeBar; +class LLViewerTextEditor;  class LLNearbyChat: public LLFloater  { @@ -87,6 +88,8 @@ private:  	//LLResizeBar*		mResizeBar[RESIZE_BAR_COUNT];  	LLHandle<LLView>	mPopupMenuHandle; +	LLPanel*			mChatCaptionPanel; +	LLViewerTextEditor*	mChatHistoryEditor;  };  #endif diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 83f8d14b5f..50e31e85e4 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -179,25 +179,29 @@ LLNearbyChatBar::LLNearbyChatBar()  //virtual  BOOL LLNearbyChatBar::postBuild()  { -	mChatBox = getChild<LLLineEditor>("chat_box",TRUE,FALSE); +	mChatBox = getChild<LLLineEditor>("chat_box"); -	if (mChatBox) -	{ -		mChatBox->setCommitCallback(boost::bind(&LLNearbyChatBar::onChatBoxCommit, this)); -		mChatBox->setKeystrokeCallback(&onChatBoxKeystroke, this); -		mChatBox->setFocusLostCallback(&onChatBoxFocusLost, this); - -		mChatBox->setIgnoreArrowKeys(TRUE); -		mChatBox->setCommitOnFocusLost( FALSE ); -		mChatBox->setRevertOnEsc( FALSE ); -		mChatBox->setIgnoreTab(TRUE); -		mChatBox->setPassDelete(TRUE); -		mChatBox->setReplaceNewlinesWithSpaces(FALSE); -		mChatBox->setMaxTextLength(1023); -		mChatBox->setEnableLineHistory(TRUE); -	} +	mChatBox->setCommitCallback(boost::bind(&LLNearbyChatBar::onChatBoxCommit, this)); +	mChatBox->setKeystrokeCallback(&onChatBoxKeystroke, this); +	mChatBox->setFocusLostCallback(&onChatBoxFocusLost, this); + +	mChatBox->setIgnoreArrowKeys(TRUE); +	mChatBox->setCommitOnFocusLost( FALSE ); +	mChatBox->setRevertOnEsc( FALSE ); +	mChatBox->setIgnoreTab(TRUE); +	mChatBox->setPassDelete(TRUE); +	mChatBox->setReplaceNewlinesWithSpaces(FALSE); +	mChatBox->setMaxTextLength(1023); +	mChatBox->setEnableLineHistory(TRUE); + +	mTalkBtn = getChild<LLTalkButton>("talk"); -	mTalkBtn = getChild<LLTalkButton>("talk",TRUE,FALSE); +	// Speak button should be initially disabled because +	// it takes some time between logging in to world and connecting to voice channel. +	mTalkBtn->setEnabled(FALSE); + +	// Registering Chat Bar to receive Voice client status change notifications. +	gVoiceClient->addObserver(this);  	return TRUE;  } @@ -208,6 +212,12 @@ LLNearbyChatBar* LLNearbyChatBar::getInstance()  	return LLBottomTray::getInstance() ? LLBottomTray::getInstance()->getNearbyChatBar() : NULL;  } +//static +bool LLNearbyChatBar::instanceExists() +{ +	return LLBottomTray::instanceExists() && LLBottomTray::getInstance()->getNearbyChatBar() != NULL; +} +  std::string LLNearbyChatBar::getCurrentChat()  {  	return mChatBox ? mChatBox->getText() : LLStringUtil::null; @@ -616,6 +626,27 @@ public:  	}  }; +void LLNearbyChatBar::onChange(EStatusType status, const std::string &channelURI, bool proximal) +{ +	// Time it takes to connect to voice channel might be pretty long, +	// so don't expect user login or STATUS_VOICE_ENABLED to be followed by STATUS_JOINED. +	BOOL enable = FALSE; + +	switch (status) +	{ +	// Do not add STATUS_VOICE_ENABLED because voice chat is  +	// inactive until STATUS_JOINED +	case STATUS_JOINED: +		enable = TRUE; +		break; +	default: +		enable = FALSE; +		break; +	} + +	mTalkBtn->setEnabled(enable); +} +  // Creating the object registers with the dispatcher.  LLChatHandler gChatHandler; diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index b640aedf7a..4b0c42c3c0 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -38,6 +38,7 @@  #include "llgesturemgr.h"  #include "llchat.h"  #include "llchiclet.h" +#include "llvoiceclient.h"  class LLGestureComboBox  	: public LLComboBox @@ -65,6 +66,7 @@ protected:  class LLNearbyChatBar  :	public LLPanel +,   public LLVoiceClientStatusObserver  {  public:  	// constructor for inline chat-bars (e.g. hosted in chat history window) @@ -75,6 +77,8 @@ public:  	static LLNearbyChatBar* getInstance(); +	static bool instanceExists(); +  	LLLineEditor* getChatBox() { return mChatBox; }  	std::string getCurrentChat(); @@ -87,6 +91,11 @@ public:  	static void sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate);  	static void sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate); +	/** +	 * Implements LLVoiceClientStatusObserver::onChange() +	 */ +	/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal); +  protected:  	static BOOL matchChatTypeTrigger(const std::string& in_str, std::string* out_str);  	static void onChatBoxKeystroke(LLLineEditor* caller, void* userdata); diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index cb1b65a604..837f924c44 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -62,7 +62,7 @@ LLNearbyChatHandler::LLNearbyChatHandler(e_notification_type type, const LLSD& i  	mChannel = LLChannelManager::getInstance()->createChannel(p);  	mChannel->setFollows(FOLLOWS_LEFT | FOLLOWS_BOTTOM | FOLLOWS_TOP);   	mChannel->setOverflowFormatString("You have %d unread nearby chat messages"); -	mChannel->setStoreToasts(false); +	mChannel->setCanStoreToasts(false);  }  LLNearbyChatHandler::~LLNearbyChatHandler()  { @@ -93,11 +93,11 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg)  	item->setVisible(true); - -	LLToast* toast = mChannel->addToast(id, item); -	 -	toast->setOnMouseEnterCallback(boost::bind(&LLNearbyChatHandler::onToastDestroy, this, toast)); -	toast->setAndStartTimer(gSavedSettings.getS32("NotificationToastTime")); +	LLToast::Params p; +	p.id = id; +	p.panel = item; +	p.on_mouse_enter = boost::bind(&LLNearbyChatHandler::onToastDestroy, this, _1); +	mChannel->addToast(p);	  }  void LLNearbyChatHandler::onToastDestroy(LLToast* toast) diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp index 06826998bf..7003879dbf 100644 --- a/indra/newview/llnotificationalerthandler.cpp +++ b/indra/newview/llnotificationalerthandler.cpp @@ -67,21 +67,20 @@ LLAlertHandler::~LLAlertHandler()  //--------------------------------------------------------------------------  void LLAlertHandler::processNotification(const LLSD& notify)  { -	LLToast* toast = NULL; -	  	LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());  	if (notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "load")  	{  		LLToastAlertPanel* alert_dialog = new LLToastAlertPanel(notification, mIsModal); -		 -		toast = mChannel->addToast(notification->getID(), (LLToastPanel*)alert_dialog); -		if(!toast) -			return; -		toast->setHideButtonEnabled(false); -		toast->setOnToastDestroyCallback((boost::bind(&LLAlertHandler::onToastDestroy, this, toast))); -		toast->setCanFade(false); -		toast->setModal(mIsModal); +		LLToast::Params p; +		p.id = notification->getID(); +		p.notification = notification; +		p.panel = dynamic_cast<LLToastPanel*>(alert_dialog); +		p.enable_hide_btn = false; +		p.can_fade = false; +		p.is_modal = mIsModal; +		p.on_toast_destroy = boost::bind(&LLAlertHandler::onToastDestroy, this, _1); +		mChannel->addToast(p);  	}  	else if (notify["sigtype"].asString() == "change")  	{ diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp index ad09f43c10..9a6a041c35 100644 --- a/indra/newview/llnotificationgrouphandler.cpp +++ b/indra/newview/llnotificationgrouphandler.cpp @@ -37,6 +37,8 @@  #include "llagent.h"  #include "llbottomtray.h"  #include "llviewercontrol.h" +#include "llfloaterreg.h" +#include "llsyswellwindow.h"  using namespace LLNotificationsUI; @@ -65,18 +67,17 @@ LLGroupHandler::~LLGroupHandler()  //--------------------------------------------------------------------------  void LLGroupHandler::processNotification(const LLSD& notify)  { -	LLToast* toast = NULL; -  	LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());  	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")  	{ -			LLPanel* notify_box = new LLToastGroupNotifyPanel(notification); -			toast = mChannel->addToast(notification->getID(), notify_box); -			if(!toast) -				return;			 -			toast->setAndStartTimer(gSavedSettings.getS32("NotificationToastTime"));  -			toast->setOnToastDestroyCallback((boost::bind(&LLGroupHandler::onToastDestroy, this, toast))); -			mChiclet->setCounter(mChiclet->getCounter() + 1); +		LLPanel* notify_box = new LLToastGroupNotifyPanel(notification); +		LLToast::Params p; +		p.id = notification->getID(); +		p.notification = notification; +		p.panel = notify_box; +		p.on_toast_destroy = boost::bind(&LLGroupHandler::onToastDestroy, this, _1); +		mChannel->addToast(p); +		mChiclet->setCounter(mChiclet->getCounter() + 1);  	}  	else if (notify["sigtype"].asString() == "delete")  	{ @@ -88,6 +89,14 @@ void LLGroupHandler::processNotification(const LLSD& notify)  void LLGroupHandler::onToastDestroy(LLToast* toast)  {  	mChiclet->setCounter(mChiclet->getCounter() - 1); + +	LLToastPanel* panel = dynamic_cast<LLToastPanel*>(toast->getPanel()); +	LLFloaterReg::getTypedInstance<LLSysWellWindow>("syswell_window")->removeItemByID(panel->getID()); + +	// turning hovering off mannualy because onMouseLeave won't happen if a toast was closed using a keyboard +	if(toast->hasFocus()) +		mChannel->setHovering(false); +  	toast->close();  } diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index 9037fc82ab..2e5fdd9ed5 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -127,12 +127,14 @@ public:  	LLInfoHandler(e_notification_type type, const LLSD& id);  	virtual ~LLInfoHandler(); - +	// base interface functions  	virtual void processNotification(const LLSD& notify);  	virtual void onToastDestroy(LLToast* toast);  	virtual void onChicletClick(void);  	virtual void onChicletClose(void); +	// own handlers +	void onStoreToast(LLPanel* info_panel, LLUUID id);  protected:  }; diff --git a/indra/newview/llpanelappearancetab.h b/indra/newview/llpanelappearancetab.h new file mode 100644 index 0000000000..8a9ba66ec0 --- /dev/null +++ b/indra/newview/llpanelappearancetab.h @@ -0,0 +1,65 @@ +/**  + * @file llpanelplacestab.h + * @brief Tabs interface for Side Bar "Places" panel + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + *  + * Copyright (c) 2004-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_LLPANELAPPEARANCETAB_H +#define LL_LLPANELAPPEARANCETAB_H + +#include "llpanel.h" + +#include "llpanelappearance.h" + +class LLPanelAppearanceTab : public LLPanel +{ +public: +	LLPanelAppearanceTab(LLPanelAppearance *parent) :  +		LLPanel(), +		mParent(parent) +	{} +	virtual ~LLPanelAppearanceTab() {} + +	virtual void onSearchEdit(const std::string& string) = 0; +	virtual void updateVerbs() = 0;		// Updates buttons at the bottom of Appearance panel +	virtual void onWear() = 0; +	virtual void onEdit() = 0; +	virtual void onNew() = 0; + +	bool isTabVisible(); // Check if parent TabContainer is visible. + +	void setPanelAppearanceButtons(LLPanelAppearance* panel); + + +protected: +	LLButton*				mWearBtn; +	LLButton*				mEditBtn; +	LLPanelAppearance*		mParent; +}; + +#endif //LL_LLPANELAPPEARANCETAB_H diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 91156ae542..6c7fb8a0be 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -31,14 +31,13 @@   */  #include "llviewerprecompiledheaders.h" -  #include "llpanelavatar.h"  #include "llagent.h" +#include "llavataractions.h"  #include "llavatarconstants.h"  #include "llcallingcard.h"  #include "llcombobox.h" -#include "llavataractions.h"  #include "llimview.h"  #include "lltexteditor.h"  #include "lltexturectrl.h" @@ -117,136 +116,240 @@ BOOL LLDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  static LLDefaultChildRegistry::Register<LLDropTarget> r("drop_target"); -////////////////////////////////////////////////////////////////////////// +static LLRegisterPanelClassWrapper<LLPanelAvatarProfile> t_panel_profile("panel_profile"); +static LLRegisterPanelClassWrapper<LLPanelAvatarMeProfile> t_panel_me_profile("panel_me_profile"); +static LLRegisterPanelClassWrapper<LLPanelAvatarNotes> t_panel_notes("panel_notes"); +  //----------------------------------------------------------------------------- -// LLPanelProfileTab() +// LLPanelAvatarNotes()  //----------------------------------------------------------------------------- -////////////////////////////////////////////////////////////////////////// -LLPanelProfileTab::LLPanelProfileTab(const LLUUID& avatar_id)  - : LLPanel() - , mAvatarId(LLUUID::null) - , mProfileType(PT_UNKNOWN) +LLPanelAvatarNotes::LLPanelAvatarNotes() +: LLPanelProfileTab() +{ + +} + +void LLPanelAvatarNotes::updateData()  { -	setAvatarId(avatar_id); +	LLAvatarPropertiesProcessor::getInstance()->sendDataRequest(getAvatarId(),APT_NOTES);  } -LLPanelProfileTab::LLPanelProfileTab(const Params& params ) - : LLPanel() - , mAvatarId(LLUUID::null) - , mProfileType(PT_UNKNOWN) +BOOL LLPanelAvatarNotes::postBuild()  { +	childSetCommitCallback("status_check", boost::bind(&LLPanelAvatarNotes::onCommitRights, this), NULL); +	childSetCommitCallback("map_check", boost::bind(&LLPanelAvatarNotes::onCommitRights, this), NULL); +	childSetCommitCallback("objects_check", boost::bind(&LLPanelAvatarNotes::onCommitRights, this), NULL); + +	childSetCommitCallback("add_friend", boost::bind(&LLPanelAvatarNotes::onAddFriendButtonClick, this),NULL); +	childSetCommitCallback("im", boost::bind(&LLPanelAvatarNotes::onIMButtonClick, this), NULL); +	childSetCommitCallback("call", boost::bind(&LLPanelAvatarNotes::onCallButtonClick, this), NULL); +	childSetCommitCallback("teleport", boost::bind(&LLPanelAvatarNotes::onTeleportButtonClick, this), NULL); +	childSetCommitCallback("share", boost::bind(&LLPanelAvatarNotes::onShareButtonClick, this), NULL); +	LLTextEditor* te = getChild<LLTextEditor>("notes_edit"); +	te->setCommitCallback(boost::bind(&LLPanelAvatarNotes::onCommitNotes,this)); +	te->setCommitOnFocusLost(TRUE); + +	resetControls(); +	resetData(); + +	return TRUE;  } -LLPanelProfileTab::~LLPanelProfileTab() +void LLPanelAvatarNotes::onOpen(const LLSD& key) +{ +	LLPanelProfileTab::onOpen(key); + +	fillRightsData(); + +	//Disable "Add Friend" button for friends. +	childSetEnabled("add_friend", !LLAvatarActions::isFriend(getAvatarId())); +} + +void LLPanelAvatarNotes::fillRightsData()  { -	if(mAvatarId.notNull()) +	const LLRelationship* relation = LLAvatarTracker::instance().getBuddyInfo(getAvatarId()); +	// If true - we are viewing friend's profile, enable check boxes and set values. +	if(relation)  	{ -		LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this); +		S32 rights = relation->getRightsGrantedTo(); + +		childSetValue("status_check",LLRelationship::GRANT_ONLINE_STATUS & rights ? TRUE : FALSE); +		childSetValue("map_check",LLRelationship::GRANT_MAP_LOCATION & rights ? TRUE : FALSE); +		childSetValue("objects_check",LLRelationship::GRANT_MODIFY_OBJECTS & rights ? TRUE : FALSE); + +		childSetEnabled("status_check",TRUE); +		childSetEnabled("map_check",TRUE); +		childSetEnabled("objects_check",TRUE);  	}  } -void LLPanelProfileTab::setAvatarId(const LLUUID& avatar_id) +void LLPanelAvatarNotes::onCommitNotes() +{ +	std::string notes = childGetValue("notes_edit").asString(); +	LLAvatarPropertiesProcessor::getInstance()-> sendNotes(getAvatarId(),notes); +} + +void LLPanelAvatarNotes::onCommitRights() +{ +	S32 rights = 0; + +	if(childGetValue("status_check").asBoolean()) +		rights |= LLRelationship::GRANT_ONLINE_STATUS; +	if(childGetValue("map_check").asBoolean()) +		rights |= LLRelationship::GRANT_MAP_LOCATION; +	if(childGetValue("objects_check").asBoolean()) +		rights |= LLRelationship::GRANT_MODIFY_OBJECTS; + +	LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(getAvatarId(),rights); +} + +void LLPanelAvatarNotes::processProperties(void* data, EAvatarProcessorType type)  { -	if(avatar_id.notNull()) +	if(APT_NOTES == type)  	{ -		if(mAvatarId.notNull()) +		LLAvatarNotes* avatar_notes = static_cast<LLAvatarNotes*>(data); +		if(avatar_notes && getAvatarId() == avatar_notes->target_id)  		{ -			LLAvatarPropertiesProcessor::getInstance()->removeObserver(mAvatarId,this); +			childSetValue("notes_edit",avatar_notes->notes); +			childSetEnabled("notes edit", true); + +			LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this);  		} -		mAvatarId = avatar_id; -		LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(),this); -		setProfileType();  	}  } -void LLPanelProfileTab::setProfileType() +void LLPanelAvatarNotes::resetData()  { -	mProfileType = (gAgentID == mAvatarId) ? PT_OWN : PT_OTHER; +	childSetValue("notes_edit",LLStringUtil::null); +	// Default value is TRUE +	childSetValue("status_check", TRUE);  } -void LLPanelProfileTab::onOpen(const LLSD& key) +void LLPanelAvatarNotes::resetControls() +{ +	//Disable "Add Friend" button for friends. +	childSetEnabled("add_friend", TRUE); + +	childSetEnabled("status_check",FALSE); +	childSetEnabled("map_check",FALSE); +	childSetEnabled("objects_check",FALSE); +} + +void LLPanelAvatarNotes::onAddFriendButtonClick()  { -	onActivate(key); +	LLAvatarActions::requestFriendshipDialog(getAvatarId());  } -void LLPanelProfileTab::onActivate(const LLUUID& id) +void LLPanelAvatarNotes::onIMButtonClick()  { -	setAvatarId(id); -	scrollToTop(); -	updateData(); +	LLAvatarActions::startIM(getAvatarId());  } -void LLPanelProfileTab::onAddFriend() +void LLPanelAvatarNotes::onTeleportButtonClick()  { -	if (getAvatarId().notNull()) +	LLAvatarActions::offerTeleport(getAvatarId()); +} + +void LLPanelAvatarNotes::onCallButtonClick() +{ +	//*TODO not implemented. +} + +void LLPanelAvatarNotes::onShareButtonClick() +{ +	//*TODO not implemented. +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +LLPanelProfileTab::LLPanelProfileTab() +: LLPanel() +, mAvatarId(LLUUID::null) +{ +} + +LLPanelProfileTab::~LLPanelProfileTab() +{ +	if(getAvatarId().notNull())  	{ -		std::string name; -		gCacheName->getFullName(getAvatarId(),name); -		LLAvatarActions::requestFriendshipDialog(getAvatarId(), name); +		LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this);  	}  } -void LLPanelProfileTab::onIM() +void LLPanelProfileTab::setAvatarId(const LLUUID& id)  { -	if (getAvatarId().notNull()) +	if(id.notNull())  	{ -		std::string name; -		gCacheName->getFullName(getAvatarId(), name); -		gIMMgr->addSession(name, IM_NOTHING_SPECIAL, getAvatarId()); +		if(getAvatarId().notNull()) +		{ +			LLAvatarPropertiesProcessor::getInstance()->removeObserver(mAvatarId,this); +		} +		mAvatarId = id; +		LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(),this);  	}  } -void LLPanelProfileTab::onTeleport() +void LLPanelProfileTab::onOpen(const LLSD& key)  { -	if(getAvatarId().notNull()) +	// Don't reset panel if we are opening it for same avatar. +	if(getAvatarId() != key.asUUID())  	{ -		LLAvatarActions::offerTeleport(getAvatarId()); +		resetControls(); +		resetData(); + +		scrollToTop();  	} + +	// Update data even if we are viewing same avatar profile as some data might been changed. +	setAvatarId(key.asUUID()); +	updateData();  }  void LLPanelProfileTab::scrollToTop()  { -	LLScrollContainer* scrollContainer = getChild<LLScrollContainer>("profile_scroll", FALSE, FALSE); -	if (NULL != scrollContainer) -	{ -		scrollContainer->goToTop(); -	} +	LLScrollContainer* scrollContainer = getChild<LLScrollContainer>("profile_scroll"); +	scrollContainer->goToTop();  }  ////////////////////////////////////////////////////////////////////////// -//----------------------------------------------------------------------------- -// LLPanelAvatarProfile() -//-----------------------------------------------------------------------------  ////////////////////////////////////////////////////////////////////////// -LLPanelAvatarProfile::LLPanelAvatarProfile(const LLUUID& avatar_id /* = LLUUID::null */) - : LLPanelProfileTab(avatar_id), mUpdated(false), mEditMode(false), mStatusCombobox(NULL), mStatusMessage(NULL) -{ -	updateData(); -} +////////////////////////////////////////////////////////////////////////// -LLPanelAvatarProfile::LLPanelAvatarProfile(const Params& params ) - : LLPanelProfileTab(params), mUpdated(false), mEditMode(false), mStatusCombobox(NULL), mStatusMessage(NULL) +LLPanelAvatarProfile::LLPanelAvatarProfile() +: LLPanelProfileTab()  {  } -LLPanelAvatarProfile::~LLPanelAvatarProfile() +BOOL LLPanelAvatarProfile::postBuild()  { -	if(getAvatarId().notNull()) -	{ -		LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this); -	} +	childSetActionTextbox("homepage_edit", boost::bind(&LLPanelAvatarProfile::onHomepageTextboxClicked, this)); +	childSetCommitCallback("add_friend",(boost::bind(&LLPanelAvatarProfile::onAddFriendButtonClick,this)),NULL); +	childSetCommitCallback("im",(boost::bind(&LLPanelAvatarProfile::onIMButtonClick,this)),NULL); +	childSetCommitCallback("call",(boost::bind(&LLPanelAvatarProfile::onCallButtonClick,this)),NULL); +	childSetCommitCallback("teleport",(boost::bind(&LLPanelAvatarProfile::onTeleportButtonClick,this)),NULL); +	childSetCommitCallback("share",(boost::bind(&LLPanelAvatarProfile::onShareButtonClick,this)),NULL); + +	LLTextureCtrl* pic = getChild<LLTextureCtrl>("2nd_life_pic"); +	pic->setFallbackImageName("default_land_picture.j2c"); + +	pic = getChild<LLTextureCtrl>("real_world_pic"); +	pic->setFallbackImageName("default_land_picture.j2c"); + +	resetControls(); +	resetData(); + +	return TRUE;  } -void* LLPanelAvatarProfile::create(void* data /* = NULL */) +void LLPanelAvatarProfile::onOpen(const LLSD& key)  { -	LLSD* id = NULL; -	if(data) -	{ -		id = static_cast<LLSD*>(data); -		return new LLPanelAvatarProfile(LLUUID(id->asUUID())); -	} -	return new LLPanelAvatarProfile(); +	LLPanelProfileTab::onOpen(key); + +	//Disable "Add Friend" button for friends. +	childSetEnabled("add_friend", !LLAvatarActions::isFriend(getAvatarId()));  }  void LLPanelAvatarProfile::updateData() @@ -258,6 +361,37 @@ void LLPanelAvatarProfile::updateData()  	}  } +void LLPanelAvatarProfile::resetControls() +{ +	childSetVisible("status_panel", true); +	childSetVisible("profile_buttons_panel", true); +	childSetVisible("title_groups_text", true); +	childSetVisible("sl_groups", true); +	childSetEnabled("add_friend", true); + +	childSetVisible("user_name", false); +	childSetVisible("status_me_panel", false); +	childSetVisible("profile_me_buttons_panel", false); +	childSetVisible("account_actions_panel", false); +	childSetVisible("partner_edit_link", false); +} + +void LLPanelAvatarProfile::resetData() +{ +	childSetValue("2nd_life_pic",LLUUID::null); +	childSetValue("real_world_pic",LLUUID::null); +	childSetValue("online_status",LLStringUtil::null); +	childSetValue("status_message",LLStringUtil::null); +	childSetValue("sl_description_edit",LLStringUtil::null); +	childSetValue("fl_description_edit",LLStringUtil::null); +	childSetValue("sl_groups",LLStringUtil::null); +	childSetValue("homepage_edit",LLStringUtil::null); +	childSetValue("register_date",LLStringUtil::null); +	childSetValue("acc_status_text",LLStringUtil::null); +	childSetTextArg("partner_text", "[FIRST]", LLStringUtil::null); +	childSetTextArg("partner_text", "[LAST]", LLStringUtil::null); +} +  void LLPanelAvatarProfile::processProperties(void* data, EAvatarProcessorType type)  {  	if(APT_PROPERTIES == type) @@ -265,120 +399,94 @@ void LLPanelAvatarProfile::processProperties(void* data, EAvatarProcessorType ty  		const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);  		if(avatar_data && getAvatarId() == avatar_data->avatar_id)  		{ -			childSetValue("register_date", avatar_data->born_on); -			childSetValue("sl_description_edit", avatar_data->about_text); -			childSetValue("fl_description_edit",avatar_data->fl_about_text); -			childSetValue("2nd_life_pic", avatar_data->image_id); -			childSetValue("real_world_pic", avatar_data->fl_image_id); -			childSetValue("homepage_edit", avatar_data->profile_url); - -			if (!isEditMode()) -			{ -				setCaptionText(avatar_data); -				if (avatar_data->partner_id.notNull()) -				{ -					std::string first, last; -					BOOL found = gCacheName->getName(avatar_data->partner_id, first, last); -					if (found) -					{ -						childSetTextArg("partner_text", "[FIRST]", first); -						childSetTextArg("partner_text", "[LAST]", last); -					} -				} -				else -				{ -					childSetTextArg("partner_text", "[FIRST]", getString("no_partner_text")); -				} -			} -			else -			{ -				childSetValue("show_in_search_checkbox", (BOOL)(avatar_data->flags & AVATAR_ALLOW_PUBLISH)); -			} - - -			bool online = avatar_data->flags & AVATAR_ONLINE; -			if(LLAvatarActions::isFriend(avatar_data->avatar_id)) -			{ -				// Online status NO could be because they are hidden -				// If they are a friend, we may know the truth! -				online = LLAvatarTracker::instance().isBuddyOnline(avatar_data->avatar_id); -			} -			childSetValue("online_status", online ? -				"Online" : "Offline"); -			childSetColor("online_status", online ?  -				LLColor4::green : LLColor4::red); - -			LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this); -		} -		if (isOwnProfile() && NULL != mStatusCombobox) -		{ -			std::string status; -			if (gAgent.getAFK()) -			{ -				status = "away"; -			} -			else if (gAgent.getBusy()) -			{ -				status = "busy"; -			} -			else -			{ -				status = "online"; -			} -			mStatusCombobox->setValue(status); -		} -		if (isOwnProfile()) -		{ -			std::string full_name; -			gCacheName->getFullName(mAvatarId, full_name); -			childSetValue("user_name", full_name); +			processProfileProperties(avatar_data);  		}  	}  	else if(APT_GROUPS == type)  	{  		LLAvatarGroups* avatar_groups = static_cast<LLAvatarGroups*>(data); -		if(avatar_groups) +		if(avatar_groups && getAvatarId() == avatar_groups->avatar_id)  		{ -			std::string groups; -			if (!avatar_groups->group_list.empty()) { -				LLAvatarGroups::group_list_t::const_iterator it = avatar_groups->group_list.begin(); -				LLAvatarGroups::LLGroupData group_data = *it; -				groups+= group_data.group_name; -				while (++it != avatar_groups->group_list.end()) -				{ -					group_data = *it;				 -					groups += ", "; -					groups += group_data.group_name; -					 -				} -			} -			childSetValue("sl_groups",groups); +			processGroupProperties(avatar_groups);  		}  	}  } -void LLPanelAvatarProfile::clear() +void LLPanelAvatarProfile::processProfileProperties(const LLAvatarData* avatar_data)  { -	clearControls(); +	fillCommonData(avatar_data); + +	fillPartnerData(avatar_data); + +	fillOnlineStatus(avatar_data); + +	fillAccountStatus(avatar_data);  } -void LLPanelAvatarProfile::clearControls() +void LLPanelAvatarProfile::processGroupProperties(const LLAvatarGroups* avatar_groups)  { -	childSetValue("2nd_life_pic",LLUUID::null); -	childSetValue("real_world_pic",LLUUID::null); -	childSetValue("online_status",LLStringUtil::null); -	childSetValue("status_message",LLStringUtil::null); -	childSetValue("sl_description_edit",LLStringUtil::null); -	childSetValue("fl_description_edit",LLStringUtil::null); -	childSetValue("sl_groups",LLStringUtil::null); -	childSetValue("homepage_edit",LLStringUtil::null); -	childSetValue("register_date",LLStringUtil::null); -	childSetValue("acc_status_text",LLStringUtil::null); -	childSetTextArg("partner_text", "[FIRST]", LLStringUtil::null); -	childSetTextArg("partner_text", "[LAST]", LLStringUtil::null); +	std::string groups; +	LLAvatarGroups::group_list_t::const_iterator it = avatar_groups->group_list.begin(); +	const LLAvatarGroups::group_list_t::const_iterator it_end = avatar_groups->group_list.end(); + +	if(it_end != it) +	{ +		groups = (*it).group_name; +		++it; +	} +	for(; it_end != it; ++it) +	{ +		LLAvatarGroups::LLGroupData group_data = *it; +		groups += ", "; +		groups += group_data.group_name; +	} +	childSetValue("sl_groups",groups); +} + +void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data) +{ +	childSetValue("register_date", avatar_data->born_on); +	childSetValue("sl_description_edit", avatar_data->about_text); +	childSetValue("fl_description_edit",avatar_data->fl_about_text); +	childSetValue("2nd_life_pic", avatar_data->image_id); +	childSetValue("real_world_pic", avatar_data->fl_image_id); +	childSetValue("homepage_edit", avatar_data->profile_url); +} + +void LLPanelAvatarProfile::fillPartnerData(const LLAvatarData* avatar_data) +{ +	if (avatar_data->partner_id.notNull()) +	{ +		std::string first, last; +		BOOL found = gCacheName->getName(avatar_data->partner_id, first, last); +		if (found) +		{ +			childSetTextArg("partner_text", "[FIRST]", first); +			childSetTextArg("partner_text", "[LAST]", last); +		} +	} +	else +	{ +		childSetTextArg("partner_text", "[FIRST]", getString("no_partner_text")); +	} +} + +void LLPanelAvatarProfile::fillOnlineStatus(const LLAvatarData* avatar_data) +{ +	bool online = avatar_data->flags & AVATAR_ONLINE; +	if(LLAvatarActions::isFriend(avatar_data->avatar_id)) +	{ +		// Online status NO could be because they are hidden +		// If they are a friend, we may know the truth! +		online = LLAvatarTracker::instance().isBuddyOnline(avatar_data->avatar_id); +	} +	childSetValue("online_status", online ? +		"Online" : "Offline"); +	childSetColor("online_status", online ?  +		LLColor4::green : LLColor4::red);  } -void LLPanelAvatarProfile::setCaptionText(const LLAvatarData* avatar_data) +void LLPanelAvatarProfile::fillAccountStatus(const LLAvatarData* avatar_data)  {  	std::string caption_text = avatar_data->caption_text;  	if(caption_text.empty()) @@ -432,130 +540,126 @@ void LLPanelAvatarProfile::setCaptionText(const LLAvatarData* avatar_data)  	childSetValue("acc_status_text", caption_text);  } +void LLPanelAvatarProfile::onUrlTextboxClicked(std::string url) +{ +	LLWeb::loadURL(url); +} + +void LLPanelAvatarProfile::onHomepageTextboxClicked() +{ +	std::string url = childGetValue("homepage_edit").asString(); +	if(!url.empty()) +	{ +		onUrlTextboxClicked(url); +	} +} +  void LLPanelAvatarProfile::onAddFriendButtonClick()  { -	onAddFriend(); +	LLAvatarActions::requestFriendshipDialog(getAvatarId());  }  void LLPanelAvatarProfile::onIMButtonClick()  { -	onIM(); +	LLAvatarActions::startIM(getAvatarId());  }  void LLPanelAvatarProfile::onTeleportButtonClick()  { -	onTeleport(); +	LLAvatarActions::offerTeleport(getAvatarId());  }  void LLPanelAvatarProfile::onCallButtonClick()  { - +	//*TODO not implemented  }  void LLPanelAvatarProfile::onShareButtonClick()  { - +	//*TODO not implemented  } -/*virtual*/ BOOL LLPanelAvatarProfile::postBuild(void) +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +LLPanelAvatarMeProfile::LLPanelAvatarMeProfile() +: LLPanelAvatarProfile()  { -	mStatusCombobox = getChild<LLComboBox>("status_combo", TRUE, FALSE); -	if (NULL != mStatusCombobox) -	{ -		mStatusCombobox->setCommitCallback(boost::bind(&LLPanelAvatarProfile::onStatusChanged, this)); -	} -	mStatusMessage =  getChild<LLLineEditor>("status_me_message_edit", TRUE, FALSE); -	if (NULL != mStatusMessage) -	{ -		mStatusMessage->setCommitCallback(boost::bind(&LLPanelAvatarProfile::onStatusMessageChanged, this)); -	} +} -	if (!isEditMode()) -	{ -		childSetActionTextbox("homepage_edit", boost::bind(&LLPanelAvatarProfile::onHomepageTextboxClicked, this)); -		childSetActionTextbox("payment_update_link", boost::bind(&LLPanelAvatarProfile::onUpdateAccountTextboxClicked, this)); -		childSetActionTextbox("my_account_link", boost::bind(&LLPanelAvatarProfile::onMyAccountTextboxClicked, this)); -		childSetActionTextbox("partner_edit_link", boost::bind(&LLPanelAvatarProfile::onPartnerEditTextboxClicked, this)); -	} +BOOL LLPanelAvatarMeProfile::postBuild() +{ +	LLPanelAvatarProfile::postBuild(); -	childSetCommitCallback("add_friend",(boost::bind(&LLPanelAvatarProfile::onAddFriendButtonClick,this)),NULL); -	childSetCommitCallback("im",(boost::bind(&LLPanelAvatarProfile::onIMButtonClick,this)),NULL); -	childSetCommitCallback("call",(boost::bind(&LLPanelAvatarProfile::onCallButtonClick,this)),NULL); -	childSetCommitCallback("teleport",(boost::bind(&LLPanelAvatarProfile::onTeleportButtonClick,this)),NULL); -	childSetCommitCallback("share",(boost::bind(&LLPanelAvatarProfile::onShareButtonClick,this)),NULL); +	mStatusCombobox = getChild<LLComboBox>("status_combo"); -	LLTextureCtrl* pic = getChild<LLTextureCtrl>("2nd_life_pic",TRUE,FALSE); -	if(pic) -	{ -		pic->setFallbackImageName("default_land_picture.j2c"); -	} -	pic = getChild<LLTextureCtrl>("real_world_pic",TRUE,FALSE); -	if(pic) -	{ -		pic->setFallbackImageName("default_land_picture.j2c"); -	} +	childSetCommitCallback("status_combo", boost::bind(&LLPanelAvatarMeProfile::onStatusChanged, this), NULL); +	childSetCommitCallback("status_me_message_text", boost::bind(&LLPanelAvatarMeProfile::onStatusMessageChanged, this), NULL); +	childSetActionTextbox("payment_update_link", boost::bind(&LLPanelAvatarMeProfile::onUpdateAccountTextboxClicked, this)); +	childSetActionTextbox("my_account_link", boost::bind(&LLPanelAvatarMeProfile::onMyAccountTextboxClicked, this)); +	childSetActionTextbox("partner_edit_link", boost::bind(&LLPanelAvatarMeProfile::onPartnerEditTextboxClicked, this)); -	clearControls(); -	updateChildrenList(); +	resetControls(); +	resetData();  	return TRUE;  } -void LLPanelAvatarProfile::onOpen(const LLSD& key) +void LLPanelAvatarMeProfile::onOpen(const LLSD& key)  { -	onActivate(key); -	updateChildrenList(); +	LLPanelProfileTab::onOpen(key); + +	std::string full_name; +	gCacheName->getFullName(getAvatarId(), full_name); +	childSetValue("user_name", full_name);  } +void LLPanelAvatarMeProfile::processProfileProperties(const LLAvatarData* avatar_data) +{ +	fillCommonData(avatar_data); + +	fillPartnerData(avatar_data); -void LLPanelAvatarProfile::updateChildrenList() +	fillStatusData(avatar_data); + +	fillAccountStatus(avatar_data); +} + +void LLPanelAvatarMeProfile::fillStatusData(const LLAvatarData* avatar_data)  { -	switch (mProfileType) +	std::string status; +	if (gAgent.getAFK())  	{ -	case PT_OWN: -		if (mUpdated || isEditMode()) -		{ -			return; -		} -		childSetVisible("user_name", true); -		childSetVisible("status_panel", false); -		childSetVisible("profile_buttons_panel", false); -		childSetVisible("title_groups_text", false); -		childSetVisible("sl_groups", false); -		mUpdated = true; -		childSetVisible("status_me_panel", true); -		childSetVisible("profile_me_buttons_panel", true); - -		break; -	case PT_OTHER: -		childSetVisible("user_name", false); -		childSetVisible("status_me_panel", false); -		childSetVisible("profile_me_buttons_panel", false); - -		childSetVisible("status_panel", true); -		childSetVisible("profile_buttons_panel", true); -		childSetVisible("title_groups_text", true); -		childSetVisible("sl_groups", true); - -		// account actions -		childSetVisible("account_actions_panel", false); -		childSetVisible("partner_edit_link", false); - -		//hide for friends -		childSetEnabled("add_friend", !LLAvatarActions::isFriend(getAvatarId())); - -		//need to update profile view on every activate -		mUpdated = false; -		break; -	case PT_UNKNOWN: break;//do nothing  -	default: -		llassert(false); +		status = "away"; +	} +	else if (gAgent.getBusy()) +	{ +		status = "busy"; +	} +	else +	{ +		status = "online";  	} + +	mStatusCombobox->setValue(status); +} + +void LLPanelAvatarMeProfile::resetControls() +{ +	childSetVisible("user_name", true); +	childSetVisible("status_panel", false); +	childSetVisible("profile_buttons_panel", false); +	childSetVisible("title_groups_text", false); +	childSetVisible("sl_groups", false); +	childSetVisible("status_me_panel", true); +	childSetVisible("profile_me_buttons_panel", true);  } -void LLPanelAvatarProfile::onStatusChanged() + +void LLPanelAvatarMeProfile::onStatusChanged()  {  	LLSD::String status = mStatusCombobox->getValue().asString(); -	 +  	if ("online" == status)  	{  		gAgent.clearAFK(); @@ -572,169 +676,24 @@ void LLPanelAvatarProfile::onStatusChanged()  		gAgent.setBusy();  		LLNotifications::instance().add("BusyModeSet");  	} -	else -	{ -	} -  } -void LLPanelAvatarProfile::onStatusMessageChanged() +void LLPanelAvatarMeProfile::onStatusMessageChanged()  {  	updateData();  } -//static -void LLPanelAvatarProfile::onUrlTextboxClicked(std::string url) -{ -	LLWeb::loadURL(url); -} - -void LLPanelAvatarProfile::onHomepageTextboxClicked() -{ -	onUrlTextboxClicked(childGetValue("homepage_edit").asString()); -} - -void LLPanelAvatarProfile::onUpdateAccountTextboxClicked() +void LLPanelAvatarMeProfile::onUpdateAccountTextboxClicked()  {  	onUrlTextboxClicked(getString("payment_update_link_url"));  } -void LLPanelAvatarProfile::onMyAccountTextboxClicked() +void LLPanelAvatarMeProfile::onMyAccountTextboxClicked()  {  	onUrlTextboxClicked(getString("my_account_link_url"));  } -void LLPanelAvatarProfile::onPartnerEditTextboxClicked() +void LLPanelAvatarMeProfile::onPartnerEditTextboxClicked()  {  	onUrlTextboxClicked(getString("partner_edit_link_url"));  } - -//----------------------------------------------------------------------------- -// LLPanelAvatarNotes() -//----------------------------------------------------------------------------- -LLPanelAvatarNotes::LLPanelAvatarNotes(const LLUUID& id /* = LLUUID::null */) -:LLPanelProfileTab(id) -{ -	updateData(); -} - -LLPanelAvatarNotes::LLPanelAvatarNotes(const Params& params) -: LLPanelProfileTab(params) -{ - -} - -LLPanelAvatarNotes::~LLPanelAvatarNotes() -{ -	if(getAvatarId().notNull()) -	{ -		LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this); -	} -} - -void* LLPanelAvatarNotes::create(void* data) -{ -	if(data) -	{ -		LLSD* id = static_cast<LLSD*>(data); -		return new LLPanelAvatarNotes(LLUUID(id->asUUID())); -	} -	return new LLPanelAvatarNotes(); -} - -void LLPanelAvatarNotes::updateData() -{ -	LLAvatarPropertiesProcessor::getInstance()->sendDataRequest(getAvatarId(),APT_NOTES); - -	const LLRelationship* relation = LLAvatarTracker::instance().getBuddyInfo(getAvatarId()); -	if(relation) -	{ -		childSetEnabled("status_check",TRUE); -		childSetEnabled("map_check",TRUE); -		childSetEnabled("objects_check",TRUE); - -		S32 rights = relation->getRightsGrantedTo(); - -		childSetValue("status_check",LLRelationship::GRANT_ONLINE_STATUS & rights ? TRUE : FALSE); -		childSetValue("map_check",LLRelationship::GRANT_MAP_LOCATION & rights ? TRUE : FALSE); -		childSetValue("objects_check",LLRelationship::GRANT_MODIFY_OBJECTS & rights ? TRUE : FALSE); -	} -} - -BOOL LLPanelAvatarNotes::postBuild() -{ -	childSetCommitCallback("status_check",boost::bind(&LLPanelAvatarNotes::onCommitRights,this),NULL); -	childSetCommitCallback("map_check",boost::bind(&LLPanelAvatarNotes::onCommitRights,this),NULL); -	childSetCommitCallback("objects_check",boost::bind(&LLPanelAvatarNotes::onCommitRights,this),NULL); - -	childSetCommitCallback("add_friend",(boost::bind(&LLPanelAvatarProfile::onAddFriend,this)),NULL); -	childSetCommitCallback("im",(boost::bind(&LLPanelAvatarProfile::onIM,this)),NULL); -//	childSetCommitCallback("call",(boost::bind(&LLPanelAvatarProfile::onCallButtonClick,this))); -	childSetCommitCallback("teleport",(boost::bind(&LLPanelAvatarProfile::onTeleport,this)),NULL); -//	childSetCommitCallback("share",(boost::bind(&LLPanelAvatarProfile::onShareButtonClick,this))); - -	LLTextEditor* te = getChild<LLTextEditor>("notes_edit",TRUE,FALSE); -	if(te)  -	{ -		te->setCommitCallback(boost::bind(&LLPanelAvatarNotes::onCommitNotes,this)); -		te->setCommitOnFocusLost(TRUE); -	} - -	return TRUE; -} - -void LLPanelAvatarNotes::onCommitNotes() -{ -	std::string notes = childGetValue("notes_edit").asString(); -	LLAvatarPropertiesProcessor::getInstance()-> sendNotes(getAvatarId(),notes); -} - -void LLPanelAvatarNotes::onCommitRights() -{ -	S32 rights = 0; - -	if(childGetValue("status_check").asBoolean()) -		rights |= LLRelationship::GRANT_ONLINE_STATUS; -	if(childGetValue("map_check").asBoolean()) -		rights |= LLRelationship::GRANT_MAP_LOCATION; -	if(childGetValue("objects_check").asBoolean()) -		rights |= LLRelationship::GRANT_MODIFY_OBJECTS; - -	LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(getAvatarId(),rights); -} - -void LLPanelAvatarNotes::clear() -{ -	childSetValue("notes_edit",LLStringUtil::null); - -	childSetEnabled("status_check",FALSE); -	childSetEnabled("map_check",FALSE); -	childSetEnabled("objects_check",FALSE); -} - -void LLPanelAvatarNotes::processProperties(void* data, EAvatarProcessorType type) -{ -	if(APT_NOTES == type) -	{ -		LLAvatarNotes* avatar_notes = static_cast<LLAvatarNotes*>(data); -		if(avatar_notes && getAvatarId() == avatar_notes->target_id) -		{ -			childSetValue("notes_edit",avatar_notes->notes); -			childSetEnabled("notes edit", true); - -			LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this); -		} -	} -} - -void LLPanelAvatarNotes::onActivate(const LLUUID& id) -{ -	LLPanelProfileTab::onActivate(id); -	updateChildrenList(); -} - -void LLPanelAvatarNotes::updateChildrenList() -{ -	//hide for friends -	childSetEnabled("add_friend", !LLAvatarActions::isFriend(getAvatarId())); -} diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h index 2b0fbaf193..a6cf2a2d27 100644 --- a/indra/newview/llpanelavatar.h +++ b/indra/newview/llpanelavatar.h @@ -45,137 +45,199 @@ enum EOnlineStatus  	ONLINE_STATUS_YES     = 1  }; - -class LLPanelProfileTab  +/** +* Base class for any Profile View or Me Profile Panel. +*/ +class LLPanelProfileTab  	: public LLPanel  	, public LLAvatarPropertiesObserver  {  public: -	 -	LLPanelProfileTab(const LLUUID& avatar_id); -	LLPanelProfileTab(const Params& params ); -	void setAvatarId(const LLUUID& avatar_id); +	/** +	 * Sets avatar ID, sets panel as observer of avatar related info replies from server. +	 */ +	virtual void setAvatarId(const LLUUID& id); -	const LLUUID& getAvatarId(){return mAvatarId;} +	/** +	 * Returns avatar ID. +	 */ +	virtual const LLUUID& getAvatarId() { return mAvatarId; } +	/** +	 * Sends update data request to server. +	 */  	virtual void updateData() = 0; +	/** +	 * Clears panel data if viewing avatar info for first time and sends update data request. +	 */  	virtual void onOpen(const LLSD& key); -	virtual void onActivate(const LLUUID& id); +	/** +	 * Resets controls visibility, state, etc. +	 */ +	virtual void resetControls(){}; -	typedef enum e_profile_type -	{ -		PT_UNKNOWN, -		PT_OWN, -		PT_OTHER -	} EProfileType; +	/** +	 * Clears all data received from server. +	 */ +	virtual void resetData(){}; -	virtual void onAddFriend(); +	/*virtual*/ ~LLPanelProfileTab(); -	virtual void onIM(); - -	virtual void onTeleport(); +protected: -	virtual void clear(){}; +	LLPanelProfileTab(); -protected: -	virtual ~LLPanelProfileTab(); -	void setProfileType(); +	/** +	 * Scrolls panel to top when viewing avatar info for first time. +	 */ +	void scrollToTop();  private: -	void scrollToTop(); -protected: -	e_profile_type mProfileType;  	LLUUID mAvatarId;  }; -class LLPanelAvatarProfile  +/** +* Panel for displaying Avatar's first and second life related info. +*/ +class LLPanelAvatarProfile  	: public LLPanelProfileTab  {  public: -	LLPanelAvatarProfile(const LLUUID& avatar_id = LLUUID::null); -	LLPanelAvatarProfile(const Params& params ); -	~LLPanelAvatarProfile(); -	 -	static void* create(void* data); +	LLPanelAvatarProfile(); + +	/*virtual*/ void onOpen(const LLSD& key); +	/** +	 * Processes data received from server. +	 */  	/*virtual*/ void processProperties(void* data, EAvatarProcessorType type); -	void updateData(); +	/*virtual*/ BOOL postBuild(); -	void clear(); +	/*virtual*/ void updateData(); -	virtual void clearControls(); +	/*virtual*/ void resetControls(); -	/*virtual*/ BOOL postBuild(void); -	/*virtual*/ void onOpen(const LLSD& key); +	/*virtual*/ void resetData(); -private: -	bool isOwnProfile(){return PT_OWN == mProfileType;} -	bool isEditMode(){return mEditMode;} -	void updateChildrenList(); -	void onStatusChanged(); -	void onStatusMessageChanged(); -	void setCaptionText(const LLAvatarData* avatar_data); +protected: -	static void onUrlTextboxClicked(std::string url); -	void onHomepageTextboxClicked(); -	void onUpdateAccountTextboxClicked(); -	void onMyAccountTextboxClicked(); -	void onPartnerEditTextboxClicked(); +	/** +	 * Process profile related data received from server. +	 */ +	virtual void processProfileProperties(const LLAvatarData* avatar_data); + +	/** +	 * Processes group related data received from server. +	 */ +	virtual void processGroupProperties(const LLAvatarGroups* avatar_groups); + +	/** +	 * Fills common for Avatar profile and Me Profile fields. +	 */ +	virtual void fillCommonData(const LLAvatarData* avatar_data); + +	/** +	 * Fills partner data. +	 */ +	virtual void fillPartnerData(const LLAvatarData* avatar_data); + +	/** +	 * Fills Avatar's online status. +	 */ +	virtual void fillOnlineStatus(const LLAvatarData* avatar_data); +	 +	/** +	 * Fills account status. +	 */ +	virtual void fillAccountStatus(const LLAvatarData* avatar_data); +	void onUrlTextboxClicked(std::string url); +	void onHomepageTextboxClicked();  	void onAddFriendButtonClick();  	void onIMButtonClick();  	void onCallButtonClick();  	void onTeleportButtonClick();  	void onShareButtonClick(); +}; + +/** + * Panel for displaying own first and second life related info. + */ +class LLPanelAvatarMeProfile +	: public LLPanelAvatarProfile +{ +public: +	LLPanelAvatarMeProfile(); + +	/*virtual*/ BOOL postBuild(); + +protected: + +	/*virtual*/ void onOpen(const LLSD& key); + +	/*virtual*/ void processProfileProperties(const LLAvatarData* avatar_data); +	/** +	 * Fills Avatar status data. +	 */ +	virtual void fillStatusData(const LLAvatarData* avatar_data); + +	/*virtual*/ void resetControls();  protected: -	bool mEditMode; + +	void onStatusChanged(); +	void onStatusMessageChanged(); +	void onUpdateAccountTextboxClicked(); +	void onMyAccountTextboxClicked(); +	void onPartnerEditTextboxClicked();  private: -	bool mUpdated; -	LLComboBox * mStatusCombobox; -	LLLineEditor * mStatusMessage; -}; +	LLComboBox* mStatusCombobox; +}; +/** +* Panel for displaying Avatar's notes and modifying friend's rights. +*/  class LLPanelAvatarNotes   	: public LLPanelProfileTab  {  public: -	LLPanelAvatarNotes(const LLUUID& id = LLUUID::null); -	LLPanelAvatarNotes(const Params& params ); -	~LLPanelAvatarNotes(); +	LLPanelAvatarNotes(); -	static void* create(void* data); +	/*virtual*/ void onOpen(const LLSD& key); -	void onActivate(const LLUUID& id); +	/*virtual*/ BOOL postBuild(); -	BOOL postBuild(void); +	/*virtual*/ void processProperties(void* data, EAvatarProcessorType type); -	void onCommitRights(); +	/*virtual*/ void updateData(); -	void onCommitNotes(); +protected: -	void clear(); +	/*virtual*/ void resetControls(); -	void processProperties(void* data, EAvatarProcessorType type); +	/*virtual*/ void resetData(); -	void updateData(); +	/** +	 * Fills rights data for friends. +	 */ +	void fillRightsData(); -protected: +	void onCommitRights(); +	void onCommitNotes(); -	void updateChildrenList(); +	void onAddFriendButtonClick(); +	void onIMButtonClick(); +	void onCallButtonClick(); +	void onTeleportButtonClick(); +	void onShareButtonClick();  }; - - -// helper funcs -void add_left_label(LLPanel *panel, const std::string& name, S32 y); -  #endif // LL_LLPANELAVATAR_H diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index 3acaa6b68e..086b06c1a3 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -35,10 +35,6 @@  #include "llagent.h"  #include "llbutton.h" -#include "llpanelgroupgeneral.h" -#include "llpanelgrouproles.h" -#include "llpanelgrouplandmoney.h" -#include "llpanelgroupnotices.h"  #include "lltabcontainer.h"  #include "lltextbox.h"  #include "llviewermessage.h" @@ -46,26 +42,31 @@  #include "llviewerwindow.h"  #include "llappviewer.h"  #include "llnotifications.h" +#include "llfloaterreg.h"  #include "llfloater.h" -// static -void* LLPanelGroupTab::createTab(void* data) -{ -	LLUUID* group_id = static_cast<LLUUID*>(data); -	return new LLPanelGroupTab(*group_id); -} +#include "llsidetraypanelcontainer.h" + +#include "llpanelgroupnotices.h" +#include "llpanelgroupgeneral.h" + +#include "llsidetray.h" +#include "llaccordionctrltab.h" + +static LLRegisterPanelClassWrapper<LLPanelGroup> t_panel_group("panel_group_info_sidetray"); -LLPanelGroupTab::LLPanelGroupTab(const LLUUID& group_id) + + +LLPanelGroupTab::LLPanelGroupTab()  	: LLPanel(), -	  mGroupID(group_id),  	  mAllowEdit(TRUE),  	  mHasModal(FALSE)  { +	mGroupID = LLUUID::null;  }  LLPanelGroupTab::~LLPanelGroupTab()  { -	mObservers.clear();  }  BOOL LLPanelGroupTab::isVisibleByAgent(LLAgent* agentp) @@ -76,39 +77,10 @@ BOOL LLPanelGroupTab::isVisibleByAgent(LLAgent* agentp)  BOOL LLPanelGroupTab::postBuild()  { -	// Hook up the help button callback. -	LLButton* button = findChild<LLButton>("help_button"); -	if (button) -	{ -		button->setCommitCallback(boost::bind(&LLPanelGroupTab::handleClickHelp, this)); -	} -	mHelpText = getString("help_text");  	return TRUE;  } -void LLPanelGroupTab::addObserver(LLPanelGroupTabObserver *obs) -{ -	mObservers.insert(obs); -} - -void LLPanelGroupTab::removeObserver(LLPanelGroupTabObserver *obs) -{ -	mObservers.erase(obs); -} - -void LLPanelGroupTab::notifyObservers() -{ - -	for (observer_list_t::iterator iter = mObservers.begin(); -		 iter != mObservers.end(); ) -	{ -		LLPanelGroupTabObserver* observer = *iter; -		observer->tabChanged(); -		// safe way to incrament since changed may delete entries! (@!##%@!@&*!) -		iter = mObservers.upper_bound(observer);  -	} -}  void LLPanelGroupTab::handleClickHelp()  { @@ -125,384 +97,240 @@ void LLPanelGroupTab::handleClickHelp()  	}  } -LLPanelGroup::LLPanelGroup(const LLUUID& group_id) -:	LLPanel(), -	LLGroupMgrObserver( group_id ), -	mCurrentTab( NULL ), -	mRequestedTab( NULL ), -	mTabContainer( NULL ), -	mIgnoreTransition( FALSE ), -	mApplyBtn( NULL ), -	mForceClose( FALSE ), -	mAllowEdit( TRUE ), -	mShowingNotifyDialog( FALSE ) +LLPanelGroup::LLPanelGroup() +:	LLPanel() +	,LLGroupMgrObserver( LLUUID() ) +	,mAllowEdit(TRUE)  {  	// Set up the factory callbacks. -	mFactoryMap["general_tab"]	= LLCallbackMap(LLPanelGroupGeneral::createTab, &mID); -	mFactoryMap["roles_tab"]	= LLCallbackMap(LLPanelGroupRoles::createTab, &mID); -	mFactoryMap["notices_tab"]	= LLCallbackMap(LLPanelGroupNotices::createTab, &mID); -	mFactoryMap["land_money_tab"]= LLCallbackMap(LLPanelGroupLandMoney::createTab, &mID);  	// Roles sub tabs -	mFactoryMap["members_sub_tab"] = LLCallbackMap(LLPanelGroupMembersSubTab::createTab, &mID); -	mFactoryMap["roles_sub_tab"] = LLCallbackMap(LLPanelGroupRolesSubTab::createTab, &mID); -	mFactoryMap["actions_sub_tab"] = LLCallbackMap(LLPanelGroupActionsSubTab::createTab, &mID); -  	LLGroupMgr::getInstance()->addObserver(this); +  } +  LLPanelGroup::~LLPanelGroup()  {  	LLGroupMgr::getInstance()->removeObserver(this); - -	for (S32 i=mTabContainer->getTabCount() - 1; i >=0; --i) -	{ -		LLPanelGroupTab* panelp = (LLPanelGroupTab*) mTabContainer->getPanelByIndex(i); -		if ( panelp ) -			panelp->removeObserver(this); -	}  } -void LLPanelGroup::updateTabVisibility() +void LLPanelGroup::onOpen(const LLSD& key)  { -	for (S32 i = mTabContainer->getTabCount() - 1; i >=0; --i) +	LLUUID group_id = key["group_id"]; +	if(!key.has("action"))  	{ -		LLPanelGroupTab* panelp = (LLPanelGroupTab*) mTabContainer->getPanelByIndex(i); +		setGroupID(group_id); +		return; +	} -		BOOL visible = panelp->isVisibleByAgent(&gAgent) || gAgent.isGodlike(); -		mTabContainer->enableTabButton(i, visible); +	std::string str_action = key["action"]; -		if ( !visible && mCurrentTab == panelp ) -		{ -			//we are disabling the currently selected tab -			//select the previous one -			mTabContainer->selectPrevTab(); -			mCurrentTab = (LLPanelGroupTab*) mTabContainer->getCurrentPanel(); -		} +	if(str_action == "refresh") +	{ +		if(mID == group_id) +			refreshData(); +	} +	else if(str_action == "close") +	{ +		onBackBtnClick(); +	} +	else if(str_action == "create") +	{ +		setGroupID(LLUUID::null);  	} -} - +}  BOOL LLPanelGroup::postBuild()  { -	mTabContainer = getChild<LLTabContainer>("group_tab_container"); - -	if (mTabContainer) -	{ -		mCurrentTab = dynamic_cast<LLPanelGroupTab*>(mTabContainer->getCurrentPanel()); -		llassert_always(mCurrentTab); -		 -		// Add click callback. -		mTabContainer->setCommitCallback(boost::bind(&LLPanelGroup::handleClickTab, this)); -		 -		// Setup pabels -		for (S32 i = mTabContainer->getTabCount() - 1; i >=0; --i) -		{ -			LLPanel* tab_panel = mTabContainer->getPanelByIndex(i); -			LLPanelGroupTab* panelp = dynamic_cast<LLPanelGroupTab*>(tab_panel); -			if (panelp) -			{ -				// Pass on whether or not to allow edit to tabs. -				panelp->setAllowEdit(mAllowEdit); -				panelp->addObserver(this); -			} -		} -		updateTabVisibility(); - -		// Act as though this tab was just activated. -		mCurrentTab->activate(); -	} -  	mDefaultNeedsApplyMesg = getString("default_needs_apply_text");  	mWantApplyMesg = getString("want_apply_text"); -	LLButton* button = getChild<LLButton>("btn_ok"); -	button->setClickedCallback(onBtnOK, this); -	button->setVisible(mAllowEdit); -	 -	button = getChild<LLButton>("btn_cancel"); -	button->setClickedCallback(onBtnCancel, this); -	button->setVisible(mAllowEdit); +	LLButton* button;  	button = getChild<LLButton>("btn_apply");  	button->setClickedCallback(onBtnApply, this); -	button->setVisible(mAllowEdit); -	button->setEnabled(FALSE); -	mApplyBtn = button; +	button->setVisible(true); +	button->setEnabled(false); +  	button = getChild<LLButton>("btn_refresh");  	button->setClickedCallback(onBtnRefresh, this);  	button->setVisible(mAllowEdit); +	getChild<LLButton>("btn_create")->setVisible(false); + +	childSetCommitCallback("btn_create",boost::bind(&LLPanelGroup::onBtnCreate,this),NULL); +	childSetCommitCallback("back",boost::bind(&LLPanelGroup::onBackBtnClick,this),NULL); + +	LLPanelGroupTab* panel_general = findChild<LLPanelGroupTab>("group_general_tab_panel"); +	LLPanelGroupTab* panel_roles = findChild<LLPanelGroupTab>("group_roles_tab_panel"); +	LLPanelGroupTab* panel_notices = findChild<LLPanelGroupTab>("group_notices_tab_panel"); +	LLPanelGroupTab* panel_land = findChild<LLPanelGroupTab>("group_land_tab_panel"); + +	if(panel_general)	mTabs.push_back(panel_general); +	if(panel_roles)		mTabs.push_back(panel_roles); +	if(panel_notices)	mTabs.push_back(panel_notices); +	if(panel_land)		mTabs.push_back(panel_land); +	  	return TRUE;  } -void LLPanelGroup::changed(LLGroupChange gc) +void LLPanelGroup::reshape(S32 width, S32 height, BOOL called_from_parent )  { -	updateTabVisibility(); -	// Notify the currently active panel that group manager information has changed. -	LLPanelGroupTab* panelp = (LLPanelGroupTab*) mTabContainer->getCurrentPanel(); +	LLPanel::reshape(width, height, called_from_parent ); -	if (panelp) -	{ -		panelp->update(gc); -	} +	LLButton* button = getChild<LLButton>("btn_apply"); +	LLRect btn_rect = button->getRect(); +	btn_rect.setLeftTopAndSize( btn_rect.mLeft, 28, btn_rect.getWidth(), btn_rect.getHeight()); +	button->setRect(btn_rect); + +	button = getChild<LLButton>("btn_create"); +	btn_rect = button->getRect(); +	btn_rect.setLeftTopAndSize( btn_rect.mLeft, 28, btn_rect.getWidth(), btn_rect.getHeight()); +	button->setRect(btn_rect); + + +	button = getChild<LLButton>("btn_refresh"); +	btn_rect = button->getRect(); +	btn_rect.setLeftTopAndSize( btn_rect.mLeft, 28, btn_rect.getWidth(), btn_rect.getHeight()); +	button->setRect(btn_rect);  } -// PanelGroupTab observer trigger -void LLPanelGroup::tabChanged() +void LLPanelGroup::onBackBtnClick()  { -	//some tab information has changed,....enable/disable the apply button -	//based on if they need an apply -	if ( mApplyBtn ) +	LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent()); +	if(parent)  	{ -		std::string mesg; -		mApplyBtn->setEnabled(mCurrentTab->needsApply(mesg)); +		parent->openPreviousPanel();  	}  } -void LLPanelGroup::handleClickTab() +void LLPanelGroup::onBtnCreate()  { -	// If we are already handling a transition, -	// ignore this. -	if (mIgnoreTransition) -	{ +	LLPanelGroupGeneral* panel_general = findChild<LLPanelGroupGeneral>("group_general_tab_panel"); +	if(!panel_general)  		return; -	} - -	mRequestedTab = (LLPanelGroupTab*) mTabContainer->getCurrentPanel(); - -	// Make sure they aren't just clicking the same tab... -	if (mRequestedTab == mCurrentTab) -	{ -		return; -	} +	std::string apply_mesg; +	panel_general->apply(apply_mesg);//yes yes you need to call apply to create... +} -	// Try to switch from the current panel to the panel the user selected. -	attemptTransition(); +void LLPanelGroup::onBtnRefresh(void* user_data) +{ +	LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data); +	self->refreshData();  } -void LLPanelGroup::setGroupID(const LLUUID& group_id) +void LLPanelGroup::onBtnApply(void* user_data)  { -	LLRect rect(getRect()); +	LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data); +	self->apply(); +} -	LLGroupMgr::getInstance()->removeObserver(this); -	mID = group_id; -	LLGroupMgr::getInstance()->addObserver(this); -	//*TODO:  this is really bad, we should add a method -	// where the panels can just update themselves -	// on a group id change.  Similar to update() but with a group -	// id change. +void LLPanelGroup::changed(LLGroupChange gc) +{ +	for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it) +		(*it)->update(gc); -	// For now, rebuild panel -	//delete children and rebuild panel -	deleteAllChildren(); -	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_group.xml"); +	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mID); +	if(gdatap) +		childSetValue("group_name", gdatap->mName);  } -void LLPanelGroup::selectTab(std::string tab_name) +void LLPanelGroup::notifyObservers()  { -	const BOOL recurse = TRUE; +	for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it) +		(*it)->update(GC_ALL); -	LLPanelGroupTab* tabp = findChild<LLPanelGroupTab>(tab_name, recurse); - -	if ( tabp && mTabContainer ) -	{ -		mTabContainer->selectTabPanel(tabp); -		handleClickTab(); -	} +	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mID); +	if(gdatap) +		childSetValue("group_name", gdatap->mName);  } -BOOL LLPanelGroup::canClose() -{ -	if (mShowingNotifyDialog) return FALSE; -	if (mCurrentTab && mCurrentTab->hasModal()) return FALSE; -	if (mForceClose || !mAllowEdit) return TRUE; -	// Try to switch from the current panel to nothing, indicating a close action. -	mRequestedTab = NULL; -	return attemptTransition(); -} -BOOL LLPanelGroup::attemptTransition() +void LLPanelGroup::setGroupID(const LLUUID& group_id)  { -	// Check if the current tab needs to be applied. -	std::string mesg; -	if (mCurrentTab && mCurrentTab->needsApply(mesg)) -	{ -		// If no message was provided, give a generic one. -		if (mesg.empty()) -		{ -			mesg = mDefaultNeedsApplyMesg; -		} -		// Create a notify box, telling the user about the unapplied tab. -		LLSD args; -		args["NEEDS_APPLY_MESSAGE"] = mesg; -		args["WANT_APPLY_MESSAGE"] = mWantApplyMesg; -		LLNotifications::instance().add("PanelGroupApply", args, LLSD(), -			boost::bind(&LLPanelGroup::handleNotifyCallback, this, _1, _2)); -		mShowingNotifyDialog = TRUE; -		 -		// We need to reselect the current tab, since it isn't finished. -		if (mTabContainer) -		{ -			// selectTabPanel is going to trigger another -			// click event.  We want to ignore it so that -			// mRequestedTab is not updated. -			mIgnoreTransition = TRUE; -			mTabContainer->selectTabPanel( mCurrentTab ); -			mIgnoreTransition = FALSE; -		} -		// Returning FALSE will block a close action from finishing until -		// we get a response back from the user. -		return FALSE; -	} -	else -	{ -		// The current panel didn't have anything it needed to apply. -		if ( mRequestedTab ) -		{ -			transitionToTab(); -		} -		// Returning TRUE will allow any close action to proceed. -		return TRUE; -	} -} +	LLGroupMgr::getInstance()->removeObserver(this); +	mID = group_id; +	LLGroupMgr::getInstance()->addObserver(this); -void LLPanelGroup::transitionToTab() -{ -	// Tell the current panel that it is being deactivated. -	if (mCurrentTab) -	{ -		mCurrentTab->deactivate(); -	} +	for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it) +		(*it)->setGroupID(group_id); + +	LLButton* button_apply = getChild<LLButton>("btn_apply"); +	LLButton* button_refresh = getChild<LLButton>("btn_refresh"); +	LLButton* button_create = getChild<LLButton>("btn_create"); + + +	bool is_null_group_id = group_id == LLUUID::null; -	// If the requested panel exists, activate it. -	if (mRequestedTab) -	{ -		// This is now the current tab; -		mCurrentTab = mRequestedTab; -		mCurrentTab->activate(); -	} -	else // NULL requested indicates a close action. -	{ -		closePanel(); -	} -} +	button_apply->setVisible(!is_null_group_id); +	button_refresh->setVisible(!is_null_group_id); +	button_create->setVisible(is_null_group_id); -bool LLPanelGroup::handleNotifyCallback(const LLSD& notification, const LLSD& response) -{ -	S32 option = LLNotification::getSelectedOption(notification, response); -	mShowingNotifyDialog = FALSE; -	switch (option) -	{ -	case 0: // "Apply Changes" -		// Try to apply changes, and switch to the requested tab. -		if ( !apply() ) -		{ -			// There was a problem doing the apply. -			// Skip switching tabs. -			break; -		} +	LLAccordionCtrlTab* tab_general = findChild<LLAccordionCtrlTab>("group_general_tab"); +	LLAccordionCtrlTab* tab_roles = findChild<LLAccordionCtrlTab>("group_roles_tab"); +	LLAccordionCtrlTab* tab_notices = findChild<LLAccordionCtrlTab>("group_notices_tab"); +	LLAccordionCtrlTab* tab_land = findChild<LLAccordionCtrlTab>("group_land_tab"); -		// This panel's info successfully applied. -		// Switch to the next panel. -		mIgnoreTransition = TRUE; -		mTabContainer->selectTabPanel( mRequestedTab ); -		mIgnoreTransition = FALSE; -		transitionToTab(); -		break; -	case 1: // "Ignore Changes" -		// Switch to the requested panel without applying changes -		// (Changes may already have been applied in the previous block) -		mCurrentTab->cancel(); -		mIgnoreTransition = TRUE; -		mTabContainer->selectTabPanel( mRequestedTab ); -		mIgnoreTransition = FALSE; -		transitionToTab(); -		break; -	case 2: // "Cancel" -	default: -		// Do nothing.  The user is canceling the action. -		// If we were quitting, we didn't really mean it. -		LLAppViewer::instance()->abortQuit(); -		break; +	if(is_null_group_id)//creating new group +	{ +		if(!tab_general->getDisplayChildren()) +			tab_general->changeOpenClose(tab_general->getDisplayChildren()); +		 +		if(tab_roles->getDisplayChildren()) +			tab_roles->changeOpenClose(tab_roles->getDisplayChildren()); +		if(tab_notices->getDisplayChildren()) +			tab_notices->changeOpenClose(tab_notices->getDisplayChildren()); +		if(tab_land->getDisplayChildren()) +			tab_land->changeOpenClose(tab_land->getDisplayChildren()); + +		tab_roles->canOpenClose(false); +		tab_notices->canOpenClose(false); +		tab_land->canOpenClose(false);  	} -	return false; -} - -// static -void LLPanelGroup::onBtnOK(void* user_data) -{ -	LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data); -	// If we are able to apply changes, then close. -	if(self->apply()) +	else  	{ -		self->closePanel(); +		tab_roles->canOpenClose(true); +		tab_notices->canOpenClose(true); +		tab_land->canOpenClose(true);  	}  } -// static -void LLPanelGroup::onBtnCancel(void* user_data) -{ -	LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data); -	self->closePanel(); -} - -// static -void LLPanelGroup::onBtnApply(void* user_data) -{ -	LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data); -	self->apply(); -} - -bool LLPanelGroup::apply() +bool	LLPanelGroup::apply(LLPanelGroupTab* tab)  { -	// Pass this along to the currently visible tab. -	if (!mTabContainer) +	if(!tab)  		return false; -	LLPanelGroupTab* panelp = dynamic_cast<LLPanelGroupTab*>(mTabContainer->getCurrentPanel()); -	if (!panelp) -		return false; -	  	std::string mesg; -	if ( !panelp->needsApply(mesg) ) -	{ -		// We don't need to apply anything. -		// We're done. +	if ( !tab->needsApply(mesg) )  		return true; -	} - -	// Ignore the needs apply message. -	// Try to do the actual apply. +	  	std::string apply_mesg; -	if ( panelp->apply( apply_mesg ) ) -	{ -		// Everything worked.  We're done. +	if(tab->apply( apply_mesg ) )  		return true; -	} - -	// There was a problem doing the actual apply. -	// Inform the user. +		  	if ( !apply_mesg.empty() )  	{  		LLSD args;  		args["MESSAGE"] = apply_mesg;  		LLNotifications::instance().add("GenericAlert", args);  	} -  	return false;  } -// static -void LLPanelGroup::onBtnRefresh(void* user_data) +bool LLPanelGroup::apply()  { -	LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data); -	self->refreshData(); +	return apply(findChild<LLPanelGroupTab>("group_general_tab_panel"))  +		&& apply(findChild<LLPanelGroupTab>("group_roles_tab_panel")) +		&& apply(findChild<LLPanelGroupTab>("group_notices_tab_panel")) +		&& apply(findChild<LLPanelGroupTab>("group_land_tab_panel")) +		;  } +  // virtual  void LLPanelGroup::draw()  { @@ -513,18 +341,22 @@ void LLPanelGroup::draw()  		mRefreshTimer.stop();  		childEnable("btn_refresh");  	} -	if (mCurrentTab) -	{ -		std::string mesg; -		childSetEnabled("btn_apply", mCurrentTab->needsApply(mesg)); -	} +	bool enable = false; +	std::string mesg; +	for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it) +		enable = enable || (*it)->needsApply(mesg); + +	childSetEnabled("btn_apply", enable);  }  void LLPanelGroup::refreshData()  {  	LLGroupMgr::getInstance()->clearGroupData(getID()); -	mCurrentTab->activate(); +	 +	for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it) +		(*it)->activate(); +	  	// 5 second timeout  	childDisable("btn_refresh"); @@ -532,20 +364,6 @@ void LLPanelGroup::refreshData()  	mRefreshTimer.setTimerExpirySec(5);  } -void LLPanelGroup::closePanel() -{ -	// Pass this to the parent, if it is a floater. -	LLView* viewp = getParent(); -	LLFloater* floaterp = dynamic_cast<LLFloater*>(viewp); -	if (floaterp) -	{ -		// First, set the force close flag, since the floater -		// will be asking us whether it can close. -		mForceClose = TRUE; -		// Tell the parent floater to close. -		floaterp->closeFloater(); -	} -}  void LLPanelGroup::showNotice(const std::string& subject,  							  const std::string& message, @@ -553,7 +371,8 @@ void LLPanelGroup::showNotice(const std::string& subject,  							  const std::string& inventory_name,  							  LLOfferInfo* inventory_offer)  { -	if (mCurrentTab->getName() != "notices_tab") +	LLPanelGroupNotices* panel_notices = findChild<LLPanelGroupNotices>("group_notices_tab_panel"); +	if(!panel_notices)  	{  		// We need to clean up that inventory offer.  		if (inventory_offer) @@ -562,8 +381,37 @@ void LLPanelGroup::showNotice(const std::string& subject,  		}  		return;  	} +	panel_notices->showNotice(subject,message,has_inventory,inventory_name,inventory_offer); +} -	LLPanelGroupNotices* notices = static_cast<LLPanelGroupNotices*>(mCurrentTab); -	notices->showNotice(subject,message,has_inventory,inventory_name,inventory_offer); + + +//static +void LLPanelGroup::refreshCreatedGroup(const LLUUID& group_id) +{ +	LLPanelGroup* panel = LLSideTray::getInstance()->findChild<LLPanelGroup>("panel_group_info_sidetray"); +	if(!panel) +		return; +	panel->setGroupID(group_id);  } + +//static + +void LLPanelGroup::showNotice(const std::string& subject, +					   const std::string& message, +					   const LLUUID& group_id, +					   const bool& has_inventory, +					   const std::string& inventory_name, +					   LLOfferInfo* inventory_offer) +{ +	LLPanelGroup* panel = LLSideTray::getInstance()->findChild<LLPanelGroup>("panel_group_info_sidetray"); +	if(!panel) +		return; + +	if(panel->getID() != group_id)//???? only for current group_id or switch panels? FIXME +		return; +	panel->showNotice(subject,message,has_inventory,inventory_name,inventory_offer); + +} + diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h index 55c7494a44..e5e1d1b6ad 100644 --- a/indra/newview/llpanelgroup.h +++ b/indra/newview/llpanelgroup.h @@ -45,93 +45,79 @@ class LLPanelGroupTab;  class LLTabContainer;  class LLAgent; -class LLPanelGroupTabObserver -{ -public: -	LLPanelGroupTabObserver() {}; -	virtual ~LLPanelGroupTabObserver(){}; -	virtual void tabChanged() = 0; -};  class LLPanelGroup : public LLPanel, -					 public LLGroupMgrObserver,  -					 public LLPanelGroupTabObserver +					 public LLGroupMgrObserver   {  public: -	LLPanelGroup(const LLUUID& group_id); +	LLPanelGroup();  	virtual ~LLPanelGroup();  	virtual BOOL postBuild(); -	static void onBtnOK(void*); -	static void onBtnCancel(void*); -	static void onBtnApply(void*); -	static void onBtnRefresh(void*); -	void handleClickTab(); -  	void setGroupID(const LLUUID& group_id); -	void selectTab(std::string tab_name); - -	// Called when embedded in a floater during a close attempt. -	BOOL canClose(); -	 -	// Checks if the current tab needs to be applied, and tries to switch to the requested tab. -	BOOL attemptTransition(); -	 -	// Switches to the requested tab (will close() if requested is NULL) -	void transitionToTab(); - -	void updateTabVisibility(); - -	// Used by attemptTransition to query the user's response to a tab that needs to apply.  -	bool handleNotifyCallback(const LLSD& notification, const LLSD& response); -	bool apply(); -	void refreshData(); -	void closePanel();  	void draw(); +	void onOpen(const LLSD& key); +  	// Group manager observer trigger.  	virtual void changed(LLGroupChange gc); -	// PanelGroupTab observer trigger -	virtual void tabChanged(); - -	void setAllowEdit(BOOL v) { mAllowEdit = v; } -  	void showNotice(const std::string& subject,  					const std::string& message,  					const bool& has_inventory,  					const std::string& inventory_name,  					LLOfferInfo* inventory_offer); + +	void notifyObservers(); + +	bool apply(); +	void refreshData(); + +	virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); + +	void setAllowEdit(BOOL v) { mAllowEdit = v; } + +	 +	static void refreshCreatedGroup(const LLUUID& group_id); + +	static void showNotice(const std::string& subject, +						   const std::string& message, +						   const LLUUID& group_id, +						   const bool& has_inventory, +						   const std::string& inventory_name, +						   LLOfferInfo* inventory_offer); + +	  protected: -	LLPanelGroupTab*		mCurrentTab; -	LLPanelGroupTab*		mRequestedTab; -	LLTabContainer*	mTabContainer; -	BOOL mIgnoreTransition; +	void onBtnCreate(); +	void onBackBtnClick(); -	LLButton* mApplyBtn; +	static void onBtnApply(void*); +	static void onBtnRefresh(void*); + + +protected: +	bool	apply(LLPanelGroupTab* tab);  	LLTimer mRefreshTimer; -	BOOL mForceClose; +	BOOL mAllowEdit;  	std::string mDefaultNeedsApplyMesg;  	std::string mWantApplyMesg; -	BOOL mAllowEdit; -	BOOL mShowingNotifyDialog; +	std::vector<LLPanelGroupTab* > mTabs; +  };  class LLPanelGroupTab : public LLPanel  {  public: -	LLPanelGroupTab(const LLUUID& group_id); +	LLPanelGroupTab();  	virtual ~LLPanelGroupTab(); -	// Factory that returns a new LLPanelGroupFoo tab. -	static void* createTab(void* data); -  	// Triggered when the tab becomes active.  	virtual void activate() { } @@ -168,20 +154,19 @@ public:  	void setAllowEdit(BOOL v) { mAllowEdit = v; } -	void addObserver(LLPanelGroupTabObserver *obs); -	void removeObserver(LLPanelGroupTabObserver *obs); -	void notifyObservers(); +	virtual void setGroupID(const LLUUID& id) {mGroupID = id;}; + +	void notifyObservers() {}; + +	const LLUUID& getGroupID() const { return mGroupID;}  protected:  	LLUUID	mGroupID; -	LLTabContainer*	mTabContainer;  	std::string	mHelpText;  	BOOL mAllowEdit;  	BOOL mHasModal; -	typedef std::set<LLPanelGroupTabObserver*> observer_list_t; -	observer_list_t mObservers;  };  #endif // LL_LLPANELGROUP_H diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index b1b464b4e4..d63e112357 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -37,7 +37,6 @@  #include "lluictrlfactory.h"  #include "llagent.h"  #include "roles_constants.h" -#include "llfloatergroupinfo.h"  // UI elements  #include "llbutton.h" @@ -45,6 +44,7 @@  #include "llcombobox.h"  #include "lldbstrings.h"  #include "llavataractions.h" +#include "llgroupactions.h"  #include "lllineeditor.h"  #include "llnamebox.h"  #include "llnamelistctrl.h" @@ -57,21 +57,16 @@  #include "lltrans.h"  #include "llviewerwindow.h" +static LLRegisterPanelClassWrapper<LLPanelGroupGeneral> t_panel_group_general("panel_group_general"); +  // consts  const S32 MATURE_CONTENT = 1;  const S32 NON_MATURE_CONTENT = 2;  const S32 DECLINE_TO_STATE = 0; -// static -void* LLPanelGroupGeneral::createTab(void* data) -{ -	LLUUID* group_id = static_cast<LLUUID*>(data); -	return new LLPanelGroupGeneral(*group_id); -} - -LLPanelGroupGeneral::LLPanelGroupGeneral(const LLUUID& group_id) -:	LLPanelGroupTab(group_id), +LLPanelGroupGeneral::LLPanelGroupGeneral() +:	LLPanelGroupTab(),  	mPendingMemberUpdate(FALSE),  	mChanged(FALSE),  	mFirstUse(TRUE), @@ -311,7 +306,8 @@ void LLPanelGroupGeneral::onClickInfo(void *userdata)  	lldebugs << "open group info: " << self->mGroupID << llendl; -	LLFloaterGroupInfo::showFromUUID(self->mGroupID); +	LLGroupActions::show(self->mGroupID); +  }  // static @@ -888,3 +884,150 @@ void LLPanelGroupGeneral::updateChanged()  		}  	}  } + +void LLPanelGroupGeneral::reset() +{ +	mCtrlReceiveNotices->set(false); +	 +	 +	mCtrlListGroup->set(true); +	 +	mCtrlReceiveNotices->setEnabled(true); +	mCtrlReceiveNotices->setVisible(true); + +	mCtrlListGroup->setEnabled(true); + +	mGroupNameEditor->setEnabled(TRUE); +	mEditCharter->setEnabled(TRUE); + +	mCtrlShowInGroupList->setEnabled(TRUE); +	mComboMature->setEnabled(TRUE); +	 +	mCtrlOpenEnrollment->setEnabled(TRUE); +	 +	mCtrlEnrollmentFee->setEnabled(TRUE); +	 +	mSpinEnrollmentFee->setEnabled(TRUE); +	mSpinEnrollmentFee->set((F32)0); + +	mBtnJoinGroup->setVisible(FALSE); +	mBtnInfo->setVisible(FALSE); +	mGroupName->setVisible(FALSE); + +	mGroupNameEditor->setVisible(true); + +	mComboActiveTitle->setVisible(false); +	mInsignia->setImageAssetID(mDefaultIconID); + +	{ +		std::string empty_str = ""; +		mEditCharter->setText(empty_str); +	} +	 +	{ +		LLSD row; +		row["columns"][0]["value"] = "no members yet"; + +		mListVisibleMembers->deleteAllItems(); +		mListVisibleMembers->setEnabled(FALSE); +		mListVisibleMembers->addElement(row); +	} + +	mBtnJoinGroup->setVisible(false); + +	{ +		mComboMature->setEnabled(true); +		mComboMature->setVisible( !gAgent.isTeen() ); +	} + + +	resetDirty(); +} + +void	LLPanelGroupGeneral::resetDirty() +{ +	// List all the controls we want to check for changes... +	LLUICtrl *check_list[] = +	{ +		mGroupNameEditor, +		mGroupName, +		mFounderName, +		mInsignia, +		mEditCharter, +		mCtrlShowInGroupList, +		mComboMature, +		mCtrlOpenEnrollment, +		mCtrlEnrollmentFee, +		mSpinEnrollmentFee, +		mCtrlReceiveNotices, +		mCtrlListGroup, +		mActiveTitleLabel, +		mComboActiveTitle +	}; + +	for( size_t i=0; i<LL_ARRAY_SIZE(check_list); i++ ) +	{ +		if( check_list[i] ) +			check_list[i]->resetDirty() ; +	} + + +} + +void LLPanelGroupGeneral::setGroupID(const LLUUID& id) +{ +	LLPanelGroupTab::setGroupID(id); + +	if(id == LLUUID::null) +	{ +		reset(); +		return; +	} + +	BOOL accept_notices = FALSE; +	BOOL list_in_profile = FALSE; +	LLGroupData data; +	if(gAgent.getGroupData(mGroupID,data)) +	{ +		accept_notices = data.mAcceptNotices; +		list_in_profile = data.mListInProfile; +	} +	mCtrlReceiveNotices = getChild<LLCheckBoxCtrl>("receive_notices"); +	if (mCtrlReceiveNotices) +	{ +		mCtrlReceiveNotices->set(accept_notices); +		mCtrlReceiveNotices->setEnabled(data.mID.notNull()); +	} +	 +	mCtrlListGroup = getChild<LLCheckBoxCtrl>("list_groups_in_profile"); +	if (mCtrlListGroup) +	{ +		mCtrlListGroup->set(list_in_profile); +		mCtrlListGroup->setEnabled(data.mID.notNull()); +	} + +	mActiveTitleLabel = getChild<LLTextBox>("active_title_label"); +	 +	mComboActiveTitle = getChild<LLComboBox>("active_title"); + +	if (mGroupID.isNull()) +	{ +		mGroupNameEditor->setEnabled(TRUE); +		mEditCharter->setEnabled(TRUE); + +		mCtrlShowInGroupList->setEnabled(TRUE); +		mComboMature->setEnabled(TRUE); +		mCtrlOpenEnrollment->setEnabled(TRUE); +		mCtrlEnrollmentFee->setEnabled(TRUE); +		mSpinEnrollmentFee->setEnabled(TRUE); + +		mBtnJoinGroup->setVisible(FALSE); +		mBtnInfo->setVisible(FALSE); +		mGroupName->setVisible(FALSE); +	} + +	resetDirty(); + +	activate(); +} + diff --git a/indra/newview/llpanelgroupgeneral.h b/indra/newview/llpanelgroupgeneral.h index c04b40819d..e7028228b0 100644 --- a/indra/newview/llpanelgroupgeneral.h +++ b/indra/newview/llpanelgroupgeneral.h @@ -49,11 +49,10 @@ class LLSpinCtrl;  class LLPanelGroupGeneral : public LLPanelGroupTab  {  public: -	LLPanelGroupGeneral(const LLUUID& group_id); +	LLPanelGroupGeneral();  	virtual ~LLPanelGroupGeneral();  	// LLPanelGroupTab -	static void* createTab(void* data);  	virtual void activate();  	virtual bool needsApply(std::string& mesg);  	virtual bool apply(std::string& mesg); @@ -66,7 +65,13 @@ public:  	virtual void draw(); +	virtual void setGroupID(const LLUUID& id); +  private: +	void	reset(); + +	void	resetDirty(); +  	static void onFocusEdit(LLFocusableElement* ctrl, void* data);  	static void onCommitAny(LLUICtrl* ctrl, void* data);  	static void onCommitUserOnly(LLUICtrl* ctrl, void* data); diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index 39a9f231b2..d95240e30c 100644 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -59,7 +59,54 @@  #include "llfloaterworldmap.h"  #include "llviewermessage.h" +static LLRegisterPanelClassWrapper<LLPanelGroupLandMoney> t_panel_group_money("panel_group_land_money"); + + +  //////////////////////////////////////////////////////////////////////////// +//************************************************* +//** LLGroupMoneyTabEventHandler::impl Functions ** +//************************************************* + +class LLGroupMoneyTabEventHandlerImpl +{ +public: +	LLGroupMoneyTabEventHandlerImpl(LLButton* earlier_buttonp, +		 LLButton* later_buttonp, +		 LLTextEditor* text_editorp, +		 LLPanel* tabpanelp, +		 const std::string& loading_text, +		 S32 interval_length_days, +		 S32 max_interval_days); +	~LLGroupMoneyTabEventHandlerImpl(); + +	bool getCanClickLater(); +	bool getCanClickEarlier(); + +	void updateButtons(); + +	void setGroupID(const LLUUID&	group_id) { mGroupID = group_id; } ; +	const LLUUID&	getGroupID() const { return mGroupID;}  + + +//member variables +public: +	LLUUID mPanelID; +	LLUUID mGroupID; + +	LLPanel* mTabPanelp; + +	int mIntervalLength; +	int mMaxInterval; +	int mCurrentInterval; + +	LLTextEditor* mTextEditorp; +	LLButton*     mEarlierButtonp; +	LLButton*     mLaterButtonp; + +	std::string mLoadingText; +}; +  class LLGroupMoneyTabEventHandler  { @@ -70,7 +117,6 @@ public:  								LLTabContainer* tab_containerp,  								LLPanel* panelp,  								const std::string& loading_text, -								const LLUUID& group_id,  								S32 interval_length_days,  								S32 max_interval_days);  	virtual ~LLGroupMoneyTabEventHandler(); @@ -82,14 +128,17 @@ public:  	virtual void onClickLater();  	virtual void onClickTab(); +	void setGroupID(const LLUUID&	group_id) { if(mImplementationp) mImplementationp->setGroupID(group_id); } ; +  	static void clickEarlierCallback(void* data);  	static void clickLaterCallback(void* data); + +  	static LLMap<LLUUID, LLGroupMoneyTabEventHandler*> sInstanceIDs;  	static std::map<LLPanel*, LLGroupMoneyTabEventHandler*> sTabsToHandlers;  protected: -	class impl; -	impl* mImplementationp; +	LLGroupMoneyTabEventHandlerImpl* mImplementationp;  };  class LLGroupMoneyDetailsTabEventHandler : public LLGroupMoneyTabEventHandler @@ -100,8 +149,8 @@ public:  									   LLTextEditor* text_editorp,  									   LLTabContainer* tab_containerp,  									   LLPanel* panelp, -									   const std::string& loading_text, -									   const LLUUID& group_id); +									   const std::string& loading_text +									   );  	virtual ~LLGroupMoneyDetailsTabEventHandler();  	virtual void requestData(LLMessageSystem* msg); @@ -117,8 +166,8 @@ public:  									 LLTextEditor* text_editorp,  									 LLTabContainer* tab_containerp,  									 LLPanel* panelp, -									 const std::string& loading_text, -									 const LLUUID& group_id); +									 const std::string& loading_text +									 );  	virtual ~LLGroupMoneySalesTabEventHandler();  	virtual void requestData(LLMessageSystem* msg); @@ -131,8 +180,8 @@ public:  	LLGroupMoneyPlanningTabEventHandler(LLTextEditor* text_editor,  										LLTabContainer* tab_containerp,  										LLPanel* panelp, -										const std::string& loading_text, -										const LLUUID& group_id); +										const std::string& loading_text +										);  	virtual ~LLGroupMoneyPlanningTabEventHandler();  	virtual void requestData(LLMessageSystem* msg); @@ -144,7 +193,7 @@ public:  class LLPanelGroupLandMoney::impl  {  public: -	impl(LLPanelGroupLandMoney& panel, const LLUUID& group_id); //constructor +	impl(LLPanelGroupLandMoney& panel); //constructor  	virtual ~impl();  	void requestGroupLandInfo(); @@ -178,7 +227,6 @@ public:  	LLScrollListCtrl* mGroupParcelsp; -	LLUUID mGroupID;  	LLUUID mTransID;  	bool mBeenActivated; @@ -192,9 +240,8 @@ public:  //*******************************************  //** LLPanelGroupLandMoney::impl Functions **  //******************************************* -LLPanelGroupLandMoney::impl::impl(LLPanelGroupLandMoney& panel, const LLUUID& group_id) -	: mPanel(panel), -	  mGroupID(group_id) +LLPanelGroupLandMoney::impl::impl(LLPanelGroupLandMoney& panel) +	: mPanel(panel)  {  	mTransID = LLUUID::null; @@ -227,7 +274,7 @@ void LLPanelGroupLandMoney::impl::requestGroupLandInfo()  	mTransID.generate();  	mGroupParcelsp->deleteAllItems(); -	send_places_query(mGroupID, mTransID, "", query_flags, LLParcel::C_ANY, ""); +	send_places_query(mPanel.mGroupID, mTransID, "", query_flags, LLParcel::C_ANY, "");  }  void LLPanelGroupLandMoney::impl::onMapButton() @@ -277,7 +324,7 @@ bool LLPanelGroupLandMoney::impl::applyContribution()  	    new_contribution <= sqm_avail )  	{  		// update group info and server -		if(!gAgent.setGroupContribution(mGroupID, new_contribution)) +		if(!gAgent.setGroupContribution(mPanel.mGroupID, new_contribution))  		{  			// should never happen...  			llwarns << "Unable to set contribution." << llendl; @@ -304,7 +351,7 @@ int LLPanelGroupLandMoney::impl::getStoredContribution()  	LLGroupData group_data;  	group_data.mContribution = 0; -	gAgent.getGroupData(mGroupID, group_data); +	gAgent.getGroupData(mPanel.mGroupID, group_data);  	return group_data.mContribution;  } @@ -403,7 +450,7 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)  		if ( trans_id != mTransID ) return;  		// This power was removed to make group roles simpler  		//if ( !gAgent.hasPowerInGroup(mGroupID, GP_LAND_VIEW_OWNED) ) return; -		if (!gAgent.isInGroup(mGroupID)) return; +		if (!gAgent.isInGroup(mPanel.mGroupID)) return;  		std::string name;  		std::string desc; @@ -487,25 +534,22 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)  //** LLPanelGroupLandMoney Functions **  //************************************* -//static  -void* LLPanelGroupLandMoney::createTab(void* data) -{ -	LLUUID* group_id = static_cast<LLUUID*>(data); -	return new LLPanelGroupLandMoney(*group_id); -}  //static  LLMap<LLUUID, LLPanelGroupLandMoney*> LLPanelGroupLandMoney::sGroupIDs; -LLPanelGroupLandMoney::LLPanelGroupLandMoney(const LLUUID& group_id) : -	LLPanelGroupTab(group_id)  +LLPanelGroupLandMoney::LLPanelGroupLandMoney() : +	LLPanelGroupTab()   { -	mImplementationp = new impl(*this, group_id); +	//FIXME - add setGroupID(); +	mImplementationp = new impl(*this);  	//problem what if someone has both the group floater open and the finder  	//open to the same group?  Some maps that map group ids to panels  	//will then only be working for the last panel for a given group id :( -	LLPanelGroupLandMoney::sGroupIDs.addData(group_id, this); + +	//FIXME - add to setGroupID() +	//LLPanelGroupLandMoney::sGroupIDs.addData(group_id, this);  }  LLPanelGroupLandMoney::~LLPanelGroupLandMoney() @@ -719,8 +763,7 @@ BOOL LLPanelGroupLandMoney::postBuild()  												   textp,  												   tabcp,  												   panelp, -												   loading_text, -												   mGroupID); +												   loading_text);  	}  	textp = getChild<LLTextEditor>("group_money_planning_text", true); @@ -737,8 +780,7 @@ BOOL LLPanelGroupLandMoney::postBuild()  			new LLGroupMoneyPlanningTabEventHandler(textp,  													tabcp,  													panelp, -													loading_text, -													mGroupID); +													loading_text);  	}  	//pull out the widgets for the L$ sales tab @@ -759,8 +801,7 @@ BOOL LLPanelGroupLandMoney::postBuild()  												 textp,  												 tabcp,  												 panelp, -												 loading_text, -												 mGroupID); +												 loading_text);  	}  	return LLPanelGroupTab::postBuild(); @@ -787,56 +828,15 @@ void LLPanelGroupLandMoney::processPlacesReply(LLMessageSystem* msg, void**)  	selfp->mImplementationp->processGroupLand(msg);  } -//************************************************* -//** LLGroupMoneyTabEventHandler::impl Functions ** -//************************************************* - -class LLGroupMoneyTabEventHandler::impl -{ -public: -	impl(LLButton* earlier_buttonp, -		 LLButton* later_buttonp, -		 LLTextEditor* text_editorp, -		 LLPanel* tabpanelp, -		 const std::string& loading_text, -		 const LLUUID& group_id, -		 S32 interval_length_days, -		 S32 max_interval_days); -	~impl(); - -	bool getCanClickLater(); -	bool getCanClickEarlier(); - -	void updateButtons(); - -//member variables -public: -	LLUUID mGroupID; -	LLUUID mPanelID; - -	LLPanel* mTabPanelp; - -	int mIntervalLength; -	int mMaxInterval; -	int mCurrentInterval; - -	LLTextEditor* mTextEditorp; -	LLButton*     mEarlierButtonp; -	LLButton*     mLaterButtonp; -	std::string mLoadingText; -}; - -LLGroupMoneyTabEventHandler::impl::impl(LLButton* earlier_buttonp, +LLGroupMoneyTabEventHandlerImpl::LLGroupMoneyTabEventHandlerImpl(LLButton* earlier_buttonp,  										LLButton* later_buttonp,  										LLTextEditor* text_editorp,  										LLPanel* tabpanelp,  										const std::string& loading_text, -										const LLUUID& group_id,  										S32 interval_length_days,  										S32 max_interval_days)  { -	mGroupID = group_id;  	mPanelID.generate();  	mIntervalLength = interval_length_days; @@ -851,21 +851,21 @@ LLGroupMoneyTabEventHandler::impl::impl(LLButton* earlier_buttonp,  	mLoadingText = loading_text;  } -LLGroupMoneyTabEventHandler::impl::~impl() +LLGroupMoneyTabEventHandlerImpl::~LLGroupMoneyTabEventHandlerImpl()  {  } -bool LLGroupMoneyTabEventHandler::impl::getCanClickEarlier() +bool LLGroupMoneyTabEventHandlerImpl::getCanClickEarlier()  {  	return (mCurrentInterval < mMaxInterval);  } -bool LLGroupMoneyTabEventHandler::impl::getCanClickLater() +bool LLGroupMoneyTabEventHandlerImpl::getCanClickLater()  {  	return ( mCurrentInterval > 0 );  } -void LLGroupMoneyTabEventHandler::impl::updateButtons() +void LLGroupMoneyTabEventHandlerImpl::updateButtons()  {  	if ( mEarlierButtonp )  	{ @@ -890,16 +890,14 @@ LLGroupMoneyTabEventHandler::LLGroupMoneyTabEventHandler(LLButton* earlier_butto  														 LLTabContainer* tab_containerp,  														 LLPanel* panelp,  														 const std::string& loading_text, -														 const LLUUID& group_id,  														 S32 interval_length_days,  														 S32 max_interval_days)  { -	mImplementationp = new impl(earlier_buttonp, +	mImplementationp = new LLGroupMoneyTabEventHandlerImpl(earlier_buttonp,  								later_buttonp,  								text_editorp,  								panelp,  								loading_text, -								group_id,  								interval_length_days,  								max_interval_days); @@ -998,15 +996,13 @@ LLGroupMoneyDetailsTabEventHandler::LLGroupMoneyDetailsTabEventHandler(LLButton*  																	   LLTextEditor* text_editorp,  																	   LLTabContainer* tab_containerp,  																	   LLPanel* panelp, -																	   const std::string& loading_text, -																	   const LLUUID& group_id) +																	   const std::string& loading_text)  	: LLGroupMoneyTabEventHandler(earlier_buttonp,  								  later_buttonp,  								  text_editorp,  								  tab_containerp,  								  panelp,  								  loading_text, -								  group_id,  								  SUMMARY_INTERVAL,  								  SUMMARY_MAX)  { @@ -1022,7 +1018,7 @@ void LLGroupMoneyDetailsTabEventHandler::requestData(LLMessageSystem* msg)  	msg->nextBlockFast(_PREHASH_AgentData);  	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );  	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); -	msg->addUUIDFast(_PREHASH_GroupID,  mImplementationp->mGroupID ); +	msg->addUUIDFast(_PREHASH_GroupID,  mImplementationp->getGroupID() );  	msg->nextBlockFast(_PREHASH_MoneyData);  	msg->addUUIDFast(_PREHASH_RequestID, mImplementationp->mPanelID );  	msg->addS32Fast(_PREHASH_IntervalDays, mImplementationp->mIntervalLength ); @@ -1043,7 +1039,7 @@ void LLGroupMoneyDetailsTabEventHandler::processReply(LLMessageSystem* msg,  {  	LLUUID group_id;  	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_GroupID, group_id ); -	if (mImplementationp->mGroupID != group_id)  +	if (mImplementationp->getGroupID() != group_id)   	{  		llwarns << "Group Account details not for this group!" << llendl;  		return; @@ -1133,15 +1129,13 @@ LLGroupMoneySalesTabEventHandler::LLGroupMoneySalesTabEventHandler(LLButton* ear  																   LLTextEditor* text_editorp,  																   LLTabContainer* tab_containerp,  																   LLPanel* panelp, -																   const std::string& loading_text, -																   const LLUUID& group_id) +																   const std::string& loading_text)  	: LLGroupMoneyTabEventHandler(earlier_buttonp,  								  later_buttonp,  								  text_editorp,  								  tab_containerp,  								  panelp,  								  loading_text, -								  group_id,  								  SUMMARY_INTERVAL,  								  SUMMARY_MAX)  { @@ -1157,7 +1151,7 @@ void LLGroupMoneySalesTabEventHandler::requestData(LLMessageSystem* msg)  	msg->nextBlockFast(_PREHASH_AgentData);  	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );  	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); -	msg->addUUIDFast(_PREHASH_GroupID, mImplementationp->mGroupID ); +	msg->addUUIDFast(_PREHASH_GroupID, mImplementationp->getGroupID() );  	msg->nextBlockFast(_PREHASH_MoneyData);  	msg->addUUIDFast(_PREHASH_RequestID, mImplementationp->mPanelID );  	msg->addS32Fast(_PREHASH_IntervalDays, mImplementationp->mIntervalLength ); @@ -1178,7 +1172,7 @@ void LLGroupMoneySalesTabEventHandler::processReply(LLMessageSystem* msg,  {  	LLUUID group_id;  	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_GroupID, group_id ); -	if (mImplementationp->mGroupID != group_id)  +	if (mImplementationp->getGroupID() != group_id)   	{  		llwarns << "Group Account Transactions not for this group!" << llendl;  		return; @@ -1305,15 +1299,13 @@ void LLPanelGroupLandMoney::processGroupAccountTransactionsReply(LLMessageSystem  LLGroupMoneyPlanningTabEventHandler::LLGroupMoneyPlanningTabEventHandler(LLTextEditor* text_editorp,  																		 LLTabContainer* tab_containerp,  																		 LLPanel* panelp, -																		 const std::string& loading_text, -																		 const LLUUID& group_id) +																		 const std::string& loading_text)  	: LLGroupMoneyTabEventHandler(NULL,  								  NULL,  								  text_editorp,  								  tab_containerp,  								  panelp,  								  loading_text, -								  group_id,  								  SUMMARY_INTERVAL,  								  SUMMARY_MAX)  { @@ -1329,7 +1321,7 @@ void LLGroupMoneyPlanningTabEventHandler::requestData(LLMessageSystem* msg)  	msg->nextBlockFast(_PREHASH_AgentData);  	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );  	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); -	msg->addUUIDFast(_PREHASH_GroupID, mImplementationp->mGroupID ); +	msg->addUUIDFast(_PREHASH_GroupID, mImplementationp->getGroupID() );  	msg->nextBlockFast(_PREHASH_MoneyData);  	msg->addUUIDFast(_PREHASH_RequestID, mImplementationp->mPanelID );  	msg->addS32Fast(_PREHASH_IntervalDays, mImplementationp->mIntervalLength); @@ -1350,7 +1342,7 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg,  {  	LLUUID group_id;  	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_GroupID, group_id ); -	if (mImplementationp->mGroupID != group_id)  +	if (mImplementationp->getGroupID() != group_id)   	{  		llwarns << "Group Account Summary received not for this group!" << llendl;  		return; @@ -1468,3 +1460,141 @@ void LLPanelGroupLandMoney::processGroupAccountSummaryReply(LLMessageSystem* msg  	self->processReply(msg, data);  } + +void LLPanelGroupLandMoney::setGroupID(const LLUUID& id) +{ +	LLPanelGroupLandMoney::sGroupIDs.removeData(mGroupID); +	LLPanelGroupTab::setGroupID(id); +	LLPanelGroupLandMoney::sGroupIDs.addData(mGroupID, this); + + +	bool can_view = gAgent.isInGroup(mGroupID); + +	mImplementationp->mGroupOverLimitIconp =  +		getChild<LLIconCtrl>("group_over_limit_icon"); +	mImplementationp->mGroupOverLimitTextp =  +		getChild<LLTextBox>("group_over_limit_text"); + +	mImplementationp->mYourContributionEditorp  +		= getChild<LLLineEditor>("your_contribution_line_editor"); +	if ( mImplementationp->mYourContributionEditorp ) +	{ +		LLLineEditor* editor = mImplementationp->mYourContributionEditorp; + +	    editor->setCommitCallback(mImplementationp->contributionCommitCallback, this); +		editor->setKeystrokeCallback(mImplementationp->contributionKeystrokeCallback, this); +	} + +	mImplementationp->mMapButtonp = getChild<LLButton>("map_button"); + +	mImplementationp->mGroupParcelsp =  +		getChild<LLScrollListCtrl>("group_parcel_list"); + +	if ( mImplementationp->mGroupParcelsp ) +	{ +		mImplementationp->mGroupParcelsp->setCommitCallback(boost::bind(&LLButton::setEnabled, mImplementationp->mMapButtonp, true)); +		mImplementationp->mGroupParcelsp->setCommitOnSelectionChange(true); +	} + +	mImplementationp->mCantViewParcelsText = getString("cant_view_group_land_text"); +	mImplementationp->mCantViewAccountsText = getString("cant_view_group_accounting_text"); +	 +	if ( mImplementationp->mMapButtonp ) +	{ +		mImplementationp->mMapButtonp->setClickedCallback(LLPanelGroupLandMoney::impl::mapCallback, mImplementationp); +	} + +	if ( mImplementationp->mGroupOverLimitTextp ) +	{ +		mImplementationp->mGroupOverLimitTextp->setVisible(FALSE); +	} + +	if ( mImplementationp->mGroupOverLimitIconp ) +	{ +		mImplementationp->mGroupOverLimitIconp->setVisible(FALSE); +	} + +	if ( !can_view ) +	{ +		if ( mImplementationp->mGroupParcelsp ) +		{ +			mImplementationp->mGroupParcelsp->setCommentText( +							mImplementationp->mCantViewParcelsText); +			mImplementationp->mGroupParcelsp->setEnabled(FALSE); +		} +	} + + + +	LLButton* earlierp, *laterp; +	LLTextEditor* textp; +	LLPanel* panelp; + +	LLTabContainer* tabcp = getChild<LLTabContainer>("group_money_tab_container"); + +	if ( tabcp ) +	{ +		S32 i; +		S32 tab_count = tabcp->getTabCount(); + +		for (i = tab_count - 1; i >=0; --i) +		{ +			tabcp->enableTabButton(i, can_view ); +		} +	} + +	std::string loading_text = getString("loading_txt"); +	 +	//pull out the widgets for the L$ details tab +	earlierp = getChild<LLButton>("earlier_details_button", true); +	laterp = getChild<LLButton>("later_details_button", true); +	textp = getChild<LLTextEditor>("group_money_details_text", true); +	panelp = getChild<LLPanel>("group_money_details_tab", true); + +	if ( !can_view ) +	{ +		textp->setText(mImplementationp->mCantViewAccountsText); +	} +	else +	{ +		if(mImplementationp->mMoneyDetailsTabEHp == 0) +			mImplementationp->mMoneyDetailsTabEHp = new LLGroupMoneyDetailsTabEventHandler(earlierp,laterp,textp,tabcp,panelp,loading_text); +		mImplementationp->mMoneyDetailsTabEHp->setGroupID(mGroupID); +	} + +	textp = getChild<LLTextEditor>("group_money_planning_text", true); +	 + +	if ( !can_view ) +	{ +		textp->setText(mImplementationp->mCantViewAccountsText); +	} +	else +	{ +		panelp = getChild<LLPanel>("group_money_planning_tab", true); +		if(mImplementationp->mMoneyPlanningTabEHp == 0) +			mImplementationp->mMoneyPlanningTabEHp = new LLGroupMoneyPlanningTabEventHandler(textp,tabcp,panelp,loading_text); +		mImplementationp->mMoneyPlanningTabEHp->setGroupID(mGroupID); +	} + +	//pull out the widgets for the L$ sales tab +	textp = getChild<LLTextEditor>("group_money_sales_text", true); + + +	if ( !can_view ) +	{ +		textp->setText(mImplementationp->mCantViewAccountsText); +	} +	else +	{ +		earlierp = getChild<LLButton>("earlier_sales_button", true); +		laterp = getChild<LLButton>("later_sales_button", true); +		panelp = getChild<LLPanel>("group_money_sales_tab", true); +		if(mImplementationp->mMoneySalesTabEHp == NULL)  +			mImplementationp->mMoneySalesTabEHp = new LLGroupMoneySalesTabEventHandler(earlierp,laterp,textp,tabcp,panelp,loading_text); +		mImplementationp->mMoneySalesTabEHp->setGroupID(mGroupID); +	} + +	activate(); +} + diff --git a/indra/newview/llpanelgrouplandmoney.h b/indra/newview/llpanelgrouplandmoney.h index 748485745b..73c52cdf2e 100644 --- a/indra/newview/llpanelgrouplandmoney.h +++ b/indra/newview/llpanelgrouplandmoney.h @@ -44,13 +44,11 @@  class LLPanelGroupLandMoney : public LLPanelGroupTab  {  public: -	LLPanelGroupLandMoney(const LLUUID& group_id); +	LLPanelGroupLandMoney();  	virtual ~LLPanelGroupLandMoney();  	virtual BOOL postBuild();  	virtual BOOL isVisibleByAgent(LLAgent* agentp); -	static void* createTab(void* data); -  	virtual void activate();  	virtual bool needsApply(std::string& mesg);  	virtual bool apply(std::string& mesg); @@ -64,6 +62,8 @@ public:  	static void processGroupAccountDetailsReply(LLMessageSystem* msg,  void** data);  	static void processGroupAccountTransactionsReply(LLMessageSystem* msg, void** data);  	static void processGroupAccountSummaryReply(LLMessageSystem* msg, void** data); + +	virtual void setGroupID(const LLUUID& id);  protected:  	class impl; diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index 15ae374447..f06342ebfc 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -58,6 +58,9 @@  #include "llviewermessage.h"  #include "llnotifications.h" +static LLRegisterPanelClassWrapper<LLPanelGroupNotices> t_panel_group_notices("panel_group_notices"); + +  /////////////////////////  // LLPanelGroupNotices //  ///////////////////////// @@ -207,12 +210,13 @@ std::string build_notice_date(const U32& the_time)  	return dateStr;  } -LLPanelGroupNotices::LLPanelGroupNotices(const LLUUID& group_id) : -	LLPanelGroupTab(group_id), +LLPanelGroupNotices::LLPanelGroupNotices() : +	LLPanelGroupTab(),  	mInventoryItem(NULL),  	mInventoryOffer(NULL)  { -	sInstances[group_id] = this; +	 +	  }  LLPanelGroupNotices::~LLPanelGroupNotices() @@ -228,12 +232,6 @@ LLPanelGroupNotices::~LLPanelGroupNotices()  	}  } -// static -void* LLPanelGroupNotices::createTab(void* data) -{ -	LLUUID* group_id = static_cast<LLUUID*>(data); -	return new LLPanelGroupNotices(*group_id); -}  BOOL LLPanelGroupNotices::isVisibleByAgent(LLAgent* agentp)  { @@ -590,3 +588,17 @@ void LLPanelGroupNotices::arrangeNoticeView(ENoticeView view_type)  		mBtnOpenAttachment->setEnabled(FALSE);  	}  } +void LLPanelGroupNotices::setGroupID(const LLUUID& id) +{ +	sInstances.erase(mGroupID); +	LLPanelGroupTab::setGroupID(id); +	sInstances[mGroupID] = this; + +	mBtnNewMessage->setEnabled(gAgent.hasPowerInGroup(mGroupID, GP_NOTICES_SEND)); + +	LLGroupDropTarget* target = getChild<LLGroupDropTarget> ("drop_target"); +	target->setPanel (this); +	target->setGroup (mGroupID); +	 +	activate(); +} diff --git a/indra/newview/llpanelgroupnotices.h b/indra/newview/llpanelgroupnotices.h index a0712f1770..c41a5f501b 100644 --- a/indra/newview/llpanelgroupnotices.h +++ b/indra/newview/llpanelgroupnotices.h @@ -47,11 +47,10 @@ class LLScrollListCtrl;  class LLPanelGroupNotices : public LLPanelGroupTab  {  public: -	LLPanelGroupNotices(const LLUUID& group_id); +	LLPanelGroupNotices();  	virtual ~LLPanelGroupNotices();  	// LLPanelGroupTab -	static void* createTab(void* data);  	virtual void activate();  	//virtual bool needsApply(std::string& mesg);  	//virtual bool apply(std::string& mesg); @@ -70,6 +69,8 @@ public:  					const std::string& inventory_name,  					LLOfferInfo* inventory_offer); +	virtual void setGroupID(const LLUUID& id); +  private:  	static void onClickRemoveAttachment(void* data);  	static void onClickOpenAttachment(void* data); diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 50e1f84cad..ab614fea53 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -55,6 +55,8 @@  #include "roles_constants.h" +static LLRegisterPanelClassWrapper<LLPanelGroupRoles> t_panel_group_roles("panel_group_roles"); +  bool agentCanRemoveFromRole(const LLUUID& group_id,  							const LLUUID& role_id)  { @@ -108,14 +110,9 @@ bool agentCanAddToRole(const LLUUID& group_id,  }  // static -void* LLPanelGroupRoles::createTab(void* data) -{ -	LLUUID* group_id = static_cast<LLUUID*>(data); -	return new LLPanelGroupRoles(*group_id); -} -LLPanelGroupRoles::LLPanelGroupRoles(const LLUUID& group_id) -:	LLPanelGroupTab(group_id), +LLPanelGroupRoles::LLPanelGroupRoles() +:	LLPanelGroupTab(),  	mCurrentTab(NULL),  	mRequestedTab( NULL ),  	mSubTabContainer( NULL ), @@ -126,13 +123,6 @@ LLPanelGroupRoles::LLPanelGroupRoles(const LLUUID& group_id)  LLPanelGroupRoles::~LLPanelGroupRoles()  { -	int i; -	for (i = 0; i < mSubTabContainer->getTabCount(); ++i) -	{ -		LLPanelGroupSubTab* subtabp = (LLPanelGroupSubTab*) mSubTabContainer->getPanelByIndex(i); - -		subtabp->removeObserver(this); -	}  }  BOOL LLPanelGroupRoles::postBuild() @@ -161,7 +151,7 @@ BOOL LLPanelGroupRoles::postBuild()  		if (!subtabp->postBuildSubTab(this))  			return FALSE; -		subtabp->addObserver(this); +		//subtabp->addObserver(this);  	}  	// Set the current tab to whatever is currently being shown. @@ -387,7 +377,8 @@ std::string LLPanelGroupRoles::getHelpText() const  void LLPanelGroupRoles::update(LLGroupChange gc)  {  	if (mGroupID.isNull()) return; - +	 +	  	LLPanelGroupTab* panelp = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel();  	if (panelp)  	{ @@ -397,6 +388,7 @@ void LLPanelGroupRoles::update(LLGroupChange gc)  	{  		llwarns << "LLPanelGroupRoles::update() -- No subtab to update!" << llendl;  	} +	  }  void LLPanelGroupRoles::activate() @@ -464,17 +456,12 @@ BOOL LLPanelGroupRoles::hasModal()  	return panelp->hasModal();  } -// PanelGroupTab observer trigger -void LLPanelGroupRoles::tabChanged() -{ -	notifyObservers(); -}  ////////////////////////////  // LLPanelGroupSubTab  //////////////////////////// -LLPanelGroupSubTab::LLPanelGroupSubTab(const LLUUID& group_id) -:	LLPanelGroupTab(group_id), +LLPanelGroupSubTab::LLPanelGroupSubTab() +:	LLPanelGroupTab(),  	mHeader(NULL),  	mFooter(NULL),  	mSearchLineEditor(NULL), @@ -847,15 +834,11 @@ void LLPanelGroupSubTab::setFooterEnabled(BOOL enable)  // LLPanelGroupMembersSubTab  //////////////////////////// -// static -void* LLPanelGroupMembersSubTab::createTab(void* data) -{ -	LLUUID* group_id = static_cast<LLUUID*>(data); -	return new LLPanelGroupMembersSubTab(*group_id); -} -LLPanelGroupMembersSubTab::LLPanelGroupMembersSubTab(const LLUUID& group_id) -: 	LLPanelGroupSubTab(group_id), +static LLRegisterPanelClassWrapper<LLPanelGroupMembersSubTab> t_panel_group_members_subtab("panel_group_members_subtab"); + +LLPanelGroupMembersSubTab::LLPanelGroupMembersSubTab() +: 	LLPanelGroupSubTab(),  	mMembersList(NULL),  	mAssignedRolesList(NULL),  	mAllowedActionsList(NULL), @@ -1708,15 +1691,10 @@ void LLPanelGroupMembersSubTab::updateMembers()  // LLPanelGroupRolesSubTab  //////////////////////////// -// static -void* LLPanelGroupRolesSubTab::createTab(void* data) -{ -	LLUUID* group_id = static_cast<LLUUID*>(data); -	return new LLPanelGroupRolesSubTab(*group_id); -} +static LLRegisterPanelClassWrapper<LLPanelGroupRolesSubTab> t_panel_group_roles_subtab("panel_group_roles_subtab"); -LLPanelGroupRolesSubTab::LLPanelGroupRolesSubTab(const LLUUID& group_id) -  : LLPanelGroupSubTab(group_id), +LLPanelGroupRolesSubTab::LLPanelGroupRolesSubTab() +  : LLPanelGroupSubTab(),  	mRolesList(NULL),  	mAssignedMembersList(NULL),  	mAllowedActionsList(NULL), @@ -2418,15 +2396,11 @@ void LLPanelGroupRolesSubTab::saveRoleChanges()  // LLPanelGroupActionsSubTab  //////////////////////////// -// static -void* LLPanelGroupActionsSubTab::createTab(void* data) -{ -	LLUUID* group_id = static_cast<LLUUID*>(data); -	return new LLPanelGroupActionsSubTab(*group_id); -} +static LLRegisterPanelClassWrapper<LLPanelGroupActionsSubTab> t_panel_group_actions_subtab("panel_group_actions_subtab"); -LLPanelGroupActionsSubTab::LLPanelGroupActionsSubTab(const LLUUID& group_id) -: LLPanelGroupSubTab(group_id) + +LLPanelGroupActionsSubTab::LLPanelGroupActionsSubTab() +: LLPanelGroupSubTab()  {  } @@ -2598,3 +2572,30 @@ void LLPanelGroupActionsSubTab::handleActionSelect()  		LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mGroupID);  	}  } +void LLPanelGroupRoles::setGroupID(const LLUUID& id) +{ +	LLPanelGroupTab::setGroupID(id); +	 +	LLPanelGroupMembersSubTab* group_members_tab = findChild<LLPanelGroupMembersSubTab>("members_sub_tab"); +	LLPanelGroupRolesSubTab*  group_roles_tab = findChild<LLPanelGroupRolesSubTab>("roles_sub_tab"); +	LLPanelGroupActionsSubTab* group_actions_tab = findChild<LLPanelGroupActionsSubTab>("actions_sub_tab"); + +	if(group_members_tab) group_members_tab->setGroupID(id); +	if(group_roles_tab) group_roles_tab->setGroupID(id); +	if(group_actions_tab) group_actions_tab->setGroupID(id); +	 +	activate(); + +	if (!mSubTabContainer) return ; + +	// Hook up each sub-tabs callback and widgets. +	for (S32 i = 0; i < mSubTabContainer->getTabCount(); ++i) +	{ +		LLPanel* panel = mSubTabContainer->getPanelByIndex(i); +		LLPanelGroupSubTab* subtabp = dynamic_cast<LLPanelGroupSubTab*>(panel); +		if (subtabp) +			subtabp->postBuildSubTab(this); +	} +} + + diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index 3ceaae1313..9519263bba 100644 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -49,11 +49,10 @@ class LLTextEditor;  typedef std::map<std::string,std::string> icon_map_t; -class LLPanelGroupRoles : public LLPanelGroupTab, -						  public LLPanelGroupTabObserver +class LLPanelGroupRoles : public LLPanelGroupTab  {  public: -	LLPanelGroupRoles(const LLUUID& group_id); +	LLPanelGroupRoles();  	virtual ~LLPanelGroupRoles();  	// Allow sub tabs to ask for sibling controls. @@ -64,7 +63,7 @@ public:  	virtual BOOL postBuild();  	virtual BOOL isVisibleByAgent(LLAgent* agentp); -	static void* createTab(void* data); +	  	void handleClickSubTab();  	// Checks if the current tab needs to be applied, and tries to switch to the requested tab. @@ -87,8 +86,7 @@ public:  	virtual void cancel();  	virtual void update(LLGroupChange gc); -	// PanelGroupTab observer trigger -	virtual void tabChanged(); +	virtual void setGroupID(const LLUUID& id);  protected:  	LLPanelGroupTab*		mCurrentTab; @@ -104,7 +102,7 @@ protected:  class LLPanelGroupSubTab : public LLPanelGroupTab  {  public: -	LLPanelGroupSubTab(const LLUUID& group_id); +	LLPanelGroupSubTab();  	virtual ~LLPanelGroupSubTab();  	virtual BOOL postBuild(); @@ -164,13 +162,11 @@ protected:  class LLPanelGroupMembersSubTab : public LLPanelGroupSubTab  {  public: -	LLPanelGroupMembersSubTab(const LLUUID& group_id); +	LLPanelGroupMembersSubTab();  	virtual ~LLPanelGroupMembersSubTab();  	virtual BOOL postBuildSubTab(LLView* root); -	static void* createTab(void* data); -  	static void onMemberSelect(LLUICtrl*, void*);  	void handleMemberSelect(); @@ -229,13 +225,11 @@ protected:  class LLPanelGroupRolesSubTab : public LLPanelGroupSubTab  {  public: -	LLPanelGroupRolesSubTab(const LLUUID& group_id); +	LLPanelGroupRolesSubTab();  	virtual ~LLPanelGroupRolesSubTab();  	virtual BOOL postBuildSubTab(LLView* root); -	static void* createTab(void* data); -  	virtual void activate();  	virtual void deactivate();  	virtual bool needsApply(std::string& mesg); @@ -290,12 +284,11 @@ protected:  class LLPanelGroupActionsSubTab : public LLPanelGroupSubTab  {  public: -	LLPanelGroupActionsSubTab(const LLUUID& group_id); +	LLPanelGroupActionsSubTab();  	virtual ~LLPanelGroupActionsSubTab();  	virtual BOOL postBuildSubTab(LLView* root); -	static void* createTab(void* data);  	virtual void activate();  	virtual void deactivate(); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 9be2fb12d2..a8e3fd3195 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -638,6 +638,11 @@ void LLPanelPeople::onTabSelected(const LLSD& param)  	std::string tab_name = getChild<LLPanel>(param.asString())->getName();  	mNearbyListUpdater->setActive(tab_name == NEARBY_TAB_NAME);  	updateButtons(); + +	if (GROUP_TAB_NAME == tab_name) +		mFilterEditor->setLabel(getString("groups_filter_label")); +	else +		mFilterEditor->setLabel(getString("people_filter_label"));  }  void LLPanelPeople::onAvatarListDoubleClicked(LLAvatarList* list) @@ -669,9 +674,7 @@ void LLPanelPeople::onAddFriendButtonClicked()  	LLUUID id = getCurrentItemID();  	if (id.notNull())  	{ -		std::string name; -		gCacheName->getFullName(id, name); -		LLAvatarActions::requestFriendshipDialog(id, name); +		LLAvatarActions::requestFriendshipDialog(id);  	}  } @@ -693,9 +696,7 @@ void LLPanelPeople::onDeleteFriendButtonClicked()  void LLPanelPeople::onGroupInfoButtonClicked()  { -	LLUUID group_id = getCurrentItemID(); -	if (group_id.notNull()) -		LLGroupActions::info(group_id); +	LLGroupActions::show(getCurrentItemID());  }  void LLPanelPeople::onChatButtonClicked() @@ -763,7 +764,7 @@ void LLPanelPeople::onGroupPlusMenuItemClicked(const LLSD& userdata)  	if (chosen_item == "join_group")  		LLGroupActions::search();  	else if (chosen_item == "new_group") -		LLGroupActions::create(); +		LLGroupActions::createGroup();  }  void LLPanelPeople::onCallButtonClicked() @@ -798,6 +799,9 @@ void LLPanelPeople::onMoreButtonClicked()  void	LLPanelPeople::onOpen(const LLSD& key)  {  	std::string tab_name = key["people_panel_tab_name"]; +	mFilterEditor -> clear(); +	onFilterEdit(""); +	  	if (!tab_name.empty())  		mTabContainer->selectTabByName(tab_name);  	else diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 19aef93d7e..d515b03ea9 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -56,7 +56,6 @@  #include "llcombobox.h"  #include "lluiconstants.h"  #include "lldbstrings.h" -#include "llfloatergroupinfo.h"  #include "llfloatergroups.h"  #include "llfloaterreg.h"  #include "llavataractions.h" @@ -65,6 +64,7 @@  #include "lluictrlfactory.h"  #include "llspinctrl.h"  #include "roles_constants.h" +#include "llgroupactions.h"  ///----------------------------------------------------------------------------  /// Class llpanelpermissions @@ -820,7 +820,7 @@ void LLPanelPermissions::onClickOwner(void *data)  	{  		LLUUID group_id;  		LLSelectMgr::getInstance()->selectGetGroup(group_id); -		LLFloaterGroupInfo::showFromUUID(group_id); +		LLGroupActions::show(group_id);  	}  	else  	{ diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index e8d6ff9ec9..afcd8c735c 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -57,12 +57,13 @@ static const std::string XML_PICKS_LIST = "back_panel";  #define PICK_ITEMS_BETWEEN 5 +static LLRegisterPanelClassWrapper<LLPanelPicks> t_panel_picks("panel_picks");  //-----------------------------------------------------------------------------  // LLPanelPicks  //-----------------------------------------------------------------------------  LLPanelPicks::LLPanelPicks() -:	LLPanelProfileTab(LLUUID::null), +:	LLPanelProfileTab(),  	mPopupMenu(NULL),  	mSelectedPickItem(NULL),  	mProfilePanel(NULL), @@ -100,7 +101,6 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)  			childSetTextArg("pick_title", "[NAME]",name);  			LLView* picks_list = getPicksList(); -			if(!picks_list) return;  			// to restore selection of the same item later  			LLUUID pick_id_selected(LLUUID::null); @@ -131,7 +131,7 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)  				picture->setPickId(pick_id);  				picture->setCreatorId(getAvatarId()); -				LLAvatarPropertiesProcessor::instance().addObserver(mAvatarId, picture); +				LLAvatarPropertiesProcessor::instance().addObserver(getAvatarId(), picture);  				picture->update();  				mPickItemList.push_back(picture);  				if (pick_id_selected != LLUUID::null &&  @@ -152,14 +152,11 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)  void LLPanelPicks::clear()  {  	LLView* scroll = getPicksList(); -	if(scroll) +	picture_list_t::const_iterator it = mPickItemList.begin(); +	for(; mPickItemList.end() != it; ++it)  	{ -		picture_list_t::const_iterator it = mPickItemList.begin(); -		for(; mPickItemList.end() != it; ++it) -		{ -			scroll->removeChild(*it); -			delete *it; -		} +		scroll->removeChild(*it); +		delete *it;  	}  	mPickItemList.clear();  	mSelectedPickItem = NULL; @@ -225,7 +222,7 @@ void LLPanelPicks::reshapePickItem(LLView* const pick_item, const S32 last_botto  LLView* LLPanelPicks::getPicksList() const  { -	return getChild<LLView>(XML_PICKS_LIST, TRUE, FALSE); +	return getChild<LLView>(XML_PICKS_LIST);  }  BOOL LLPanelPicks::postBuild() @@ -261,6 +258,8 @@ void LLPanelPicks::onOpen(const LLSD& key)  	// Disable buttons when viewing profile for first time  	if(getAvatarId() != id)  	{ +		clear(); +  		childSetEnabled(XML_BTN_INFO,FALSE);  		childSetEnabled(XML_BTN_TELEPORT,FALSE);  		childSetEnabled(XML_BTN_SHOW_ON_MAP,FALSE); @@ -373,7 +372,7 @@ void LLPanelPicks::updateButtons()  	int picks_num = mPickItemList.size();  	childSetEnabled(XML_BTN_INFO, picks_num > 0); -	if (mAvatarId == gAgentID) +	if (getAvatarId() == gAgentID)  	{  		childSetEnabled(XML_BTN_NEW, picks_num < MAX_AVATAR_PICKS);  		childSetEnabled(XML_BTN_DELETE, picks_num > 0); @@ -403,12 +402,14 @@ void LLPanelPicks::setSelectedPickItem(LLPickItem* item)  BOOL LLPanelPicks::isMouseInPick( S32 x, S32 y )  { -	LLScrollContainer* scroll = getChild<LLScrollContainer>("profile_scroll"); -	if (!scroll->parentPointInView(x, y)) return FALSE; -  	S32 x_l = x;  	S32 y_l = y; +	if(!getChild<LLUICtrl>("profile_scroll")->getRect().pointInRect(x, y)) +	{ +		return FALSE; +	} +  	picture_list_t::const_iterator it = mPickItemList.begin();  	for(; mPickItemList.end() != it; ++it)  	{ @@ -516,11 +517,8 @@ void LLPickItem::init(LLPickData* pick_data)  	mPosGlobal = pick_data->pos_global;  	mLocation = pick_data->location_text; -	LLTextureCtrl* picture = getChild<LLTextureCtrl>("picture", TRUE, FALSE); -	if (picture) -	{ -		picture->setImageAssetID(pick_data->snapshot_id); -	} +	LLTextureCtrl* picture = getChild<LLTextureCtrl>("picture"); +	picture->setImageAssetID(pick_data->snapshot_id);  }  void LLPickItem::setPickName(const std::string& name) diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp index 31d76ca4e2..d6d827356b 100644 --- a/indra/newview/llpanelplaceinfo.cpp +++ b/indra/newview/llpanelplaceinfo.cpp @@ -68,7 +68,10 @@ LLPanelPlaceInfo::LLPanelPlaceInfo()  	mRequestedID(),  	mPosRegion(),  	mLandmarkID(), -	mMinHeight(0) +	mMinHeight(0), +	mScrollingPanel(NULL), +	mInfoPanel(NULL), +	mMediaPanel(NULL)  {}  LLPanelPlaceInfo::~LLPanelPlaceInfo() @@ -111,9 +114,10 @@ BOOL LLPanelPlaceInfo::postBuild()  	mMinHeight = scroll_container->getScrolledViewRect().getHeight();  	mScrollingPanel = getChild<LLPanel>("scrolling_panel"); - -	mInfoPanel = getChild<LLPanel>("info_panel", TRUE, FALSE); -	mMediaPanel = getChild<LLMediaPanel>("media_panel", TRUE, FALSE); +	mInfoPanel = getChild<LLPanel>("info_panel"); +	mMediaPanel = getChild<LLMediaPanel>("media_panel"); +	if (!mMediaPanel) +		return FALSE;  	return TRUE;  } @@ -238,15 +242,20 @@ void LLPanelPlaceInfo::setParcelID(const LLUUID& parcel_id)  void LLPanelPlaceInfo::setInfoType(INFO_TYPE type)  { -	if (!mInfoPanel) -	    return; +	if (type != PLACE) +		toggleMediaPanel(FALSE); +	 +	bool is_landmark_info_type = type == LANDMARK; +	LLPanel* landmark_info_panel = getChild<LLPanel>("landmark_info_panel"); +	if (landmark_info_panel) +	{ +		landmark_info_panel->setVisible(is_landmark_info_type); +	}  	switch(type)  	{  		case CREATE_LANDMARK:  			mCurrentTitle = getString("title_create_landmark"); - -			toggleMediaPanel(FALSE);  		break;  		case PLACE: @@ -262,14 +271,10 @@ void LLPanelPlaceInfo::setInfoType(INFO_TYPE type)  		// a landmark or a teleport history item  		case LANDMARK:  			mCurrentTitle = getString("title_landmark"); - -			toggleMediaPanel(FALSE);  		break; -		 +  		case TELEPORT_HISTORY:  			mCurrentTitle = getString("title_place"); -  -			toggleMediaPanel(FALSE);  		break;  	}  } @@ -284,7 +289,7 @@ BOOL LLPanelPlaceInfo::isMediaPanelVisible()  void LLPanelPlaceInfo::toggleMediaPanel(BOOL visible)  { -    if (!(mMediaPanel && mInfoPanel)) +    if (!mMediaPanel)          return;      if (visible) @@ -384,7 +389,7 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)  	if (mCurrentTitle != getString("title_landmark"))  	{ -		mTitleEditor->setText(parcel_data.name + "; " + name); +		mTitleEditor->setText(parcel_data.name);  		mNotesEditor->setText(LLStringUtil::null);  	}  } @@ -432,7 +437,7 @@ void LLPanelPlaceInfo::displayAgentParcelInfo()  	LLParcelData parcel_data;  	parcel_data.desc = parcel->getDesc(); -	parcel_data.flags = parcel->getParcelFlags(); +	parcel_data.flags = region->getSimAccess();  	parcel_data.name = parcel->getName();  	parcel_data.sim_name = gAgent.getRegion()->getName();  	parcel_data.snapshot_id = parcel->getSnapshotID(); @@ -500,7 +505,7 @@ void LLPanelPlaceInfo::createLandmark(const LLUUID& folder_id)  	// If typed name is empty use the parcel name instead.  	if (name.empty())  	{ -		name = mParcelName->getText() + "; " + mRegionName->getText(); +		name = mParcelName->getText();  	}  	LLStringUtil::replaceChar(desc, '\n', ' '); @@ -511,7 +516,7 @@ void LLPanelPlaceInfo::createLandmark(const LLUUID& folder_id)  void LLPanelPlaceInfo::reshape(S32 width, S32 height, BOOL called_from_parent)  { -	if (mMinHeight > 0) +	if (mMinHeight > 0 && mScrollingPanel != NULL)  	{  		mScrollingPanel->reshape(mScrollingPanel->getRect().getWidth(), mMinHeight);  	} diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 31b2d01dcf..7461d150c8 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -106,6 +106,9 @@ BOOL LLPanelPlaces::postBuild()  	mOverflowBtn = getChild<LLButton>("overflow_btn"); +	// *TODO: Assign the action to an appropriate event. +	mOverflowBtn->setClickedCallback(boost::bind(&LLPanelPlaces::toggleMediaPanel, this)); +  	mTabContainer = getChild<LLTabContainer>("Places Tabs");  	if (mTabContainer)  	{ @@ -118,17 +121,14 @@ BOOL LLPanelPlaces::postBuild()  		mFilterEditor->setCommitCallback(boost::bind(&LLPanelPlaces::onFilterEdit, this, _2));  	} -	mPlaceInfo = getChild<LLPanelPlaceInfo>("panel_place_info", TRUE, FALSE); -	if (mPlaceInfo) +	mPlaceInfo = getChild<LLPanelPlaceInfo>("panel_place_info"); +	if (!mPlaceInfo) +		return FALSE; +	 +	LLButton* back_btn = mPlaceInfo->getChild<LLButton>("back_btn"); +	if (back_btn)  	{ -		LLButton* back_btn = mPlaceInfo->getChild<LLButton>("back_btn"); -		if (back_btn) -		{ -			back_btn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); -		} - -		// *TODO: Assign the action to an appropriate event. -		mOverflowBtn->setClickedCallback(boost::bind(&LLPanelPlaces::toggleMediaPanel, this)); +		back_btn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this));  	}  	return TRUE; @@ -136,7 +136,10 @@ BOOL LLPanelPlaces::postBuild()  void LLPanelPlaces::onOpen(const LLSD& key)  { -	if(key.size() == 0) +	mFilterEditor->clear(); +	onFilterEdit(""); +	 +	if(mPlaceInfo == NULL || key.size() == 0)  		return;  	mPlaceInfoType = key["type"].asString(); @@ -197,10 +200,15 @@ void LLPanelPlaces::onOpen(const LLSD& key)  									  hist_items[index].mRegionID,  									  pos_global);  	} +	 +  }  void LLPanelPlaces::setItem(LLInventoryItem* item)  { +	if (!mPlaceInfo) +		return; +  	mItem = item;  	// If the item is a link get a linked item @@ -224,6 +232,9 @@ void LLPanelPlaces::setItem(LLInventoryItem* item)  void LLPanelPlaces::onLandmarkLoaded(LLLandmark* landmark)  { +	if (!mPlaceInfo) +		return; +  	LLUUID region_id;  	landmark->getRegionID(region_id);  	LLVector3d pos_global; @@ -263,11 +274,6 @@ void LLPanelPlaces::onShareButtonClicked()  	// TODO: Launch the "Things" Share wizard  } -void LLPanelPlaces::onAddLandmarkButtonClicked() -{ -	LLFloaterReg::showInstance("add_landmark"); -} -  void LLPanelPlaces::onCopySLURLButtonClicked()  {  	mActivePanel->onCopySLURL(); @@ -276,6 +282,9 @@ void LLPanelPlaces::onCopySLURLButtonClicked()  void LLPanelPlaces::onTeleportButtonClicked()  { +	if (!mPlaceInfo) +		return; +  	if (mPlaceInfo->getVisible())  	{  		if (mPlaceInfoType == "landmark") @@ -284,7 +293,7 @@ void LLPanelPlaces::onTeleportButtonClicked()  			payload["asset_id"] = mItem->getAssetUUID();  			LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload);  		} -		else if (mPlaceInfoType == "remote_place") +		else if (mPlaceInfoType == "remote_place" || mPlaceInfoType == "agent")  		{  			LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();  			if (!mPosGlobal.isExactlyZero() && worldmap_instance) @@ -302,6 +311,9 @@ void LLPanelPlaces::onTeleportButtonClicked()  void LLPanelPlaces::onShowOnMapButtonClicked()  { +	if (!mPlaceInfo) +		return; +  	if (mPlaceInfo->getVisible())  	{  		LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); @@ -368,6 +380,11 @@ void LLPanelPlaces::toggleMediaPanel()  		return;  	mPlaceInfo->toggleMediaPanel(!mPlaceInfo->isMediaPanelVisible()); +	 +	// Refresh the current place info because +	// the media panel controls can't refer to +	// the remote parcel media. +	onOpen(LLSD().insert("type", "agent"));  }  void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible) @@ -430,10 +447,17 @@ void LLPanelPlaces::changed(U32 mask)  void LLPanelPlaces::onAgentParcelChange()  { -	if (mPlaceInfo->getVisible() && (mPlaceInfoType == "agent" || mPlaceInfoType == "create_landmark")) +	if (!mPlaceInfo) +		return; + +	if (mPlaceInfo->getVisible() && mPlaceInfoType == "create_landmark")  	{  		onOpen(LLSD().insert("type", mPlaceInfoType));  	} +	else if (mPlaceInfo->isMediaPanelVisible()) +	{ +		onOpen(LLSD().insert("type", "agent")); +	}  	else  	{  		updateVerbs(); @@ -442,9 +466,13 @@ void LLPanelPlaces::onAgentParcelChange()  void LLPanelPlaces::updateVerbs()  { +	if (!mPlaceInfo) +		return; +  	bool is_place_info_visible = mPlaceInfo->getVisible();  	bool is_agent_place_info_visible = mPlaceInfoType == "agent";  	bool is_create_landmark_visible = mPlaceInfoType == "create_landmark"; +	bool is_media_panel_visible = mPlaceInfo->isMediaPanelVisible();  	mTeleportBtn->setVisible(!is_create_landmark_visible);  	mShareBtn->setVisible(!is_create_landmark_visible); @@ -459,15 +487,18 @@ void LLPanelPlaces::updateVerbs()  	{  		if (is_agent_place_info_visible)  		{ -			// We don't need to teleport to the current location so disable the button -			mTeleportBtn->setEnabled(FALSE); +			// We don't need to teleport to the current location +			// so check if the location is not within the current parcel. +			mTeleportBtn->setEnabled(!is_media_panel_visible && +									 !mPosGlobal.isExactlyZero() && +									 !LLViewerParcelMgr::getInstance()->inAgentParcel(mPosGlobal));  		}  		else if (mPlaceInfoType == "landmark" || mPlaceInfoType == "remote_place")  		{  			mTeleportBtn->setEnabled(TRUE);  		} -		mShowOnMapBtn->setEnabled(TRUE); +		mShowOnMapBtn->setEnabled(!is_media_panel_visible);  	}  	else  	{ diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h index 695c78cfba..431c8168d9 100644 --- a/indra/newview/llpanelplaces.h +++ b/indra/newview/llpanelplaces.h @@ -66,7 +66,6 @@ private:  	void onFilterEdit(const std::string& search_string);  	void onTabSelected(); -	//void onAddLandmarkButtonClicked();  	//void onCopySLURLButtonClicked();  	//void onShareButtonClicked();  	void onTeleportButtonClicked(); diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index f97105caa8..017a7312a1 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -32,20 +32,16 @@  #include "llviewerprecompiledheaders.h"  #include "llpanelprofile.h" -#include "lltabcontainer.h" -#include "llpanelpicks.h" +  #include "llagent.h" -#include "llcommandhandler.h"  #include "llavataractions.h" +#include "llcommandhandler.h" +#include "llpanelpicks.h" +#include "lltabcontainer.h"  static const std::string PANEL_PICKS = "panel_picks"; -static const std::string PANEL_NOTES = "panel_notes";  static const std::string PANEL_PROFILE = "panel_profile"; -static LLRegisterPanelClassWrapper<LLPanelAvatarProfile> t_panel_profile(PANEL_PROFILE); -static LLRegisterPanelClassWrapper<LLPanelPicks> t_panel_picks(PANEL_PICKS); - -  class LLAgentHandler : public LLCommandHandler  {  public: @@ -74,34 +70,45 @@ LLAgentHandler gAgentHandler;  LLPanelProfile::LLPanelProfile() -:	LLPanel(), -	mTabContainer(NULL) -{ -} - -LLPanelProfile::~LLPanelProfile() + : LLPanel() + , mTabCtrl(NULL) + , mAvatarId(LLUUID::null)  {  }  BOOL LLPanelProfile::postBuild()  { -	mTabContainer = getChild<LLTabContainer>("tabs"); -	mTabContainer->setCommitCallback(boost::bind(&LLPanelProfile::onTabSelected, this, _2)); +	mTabCtrl = getChild<LLTabContainer>("tabs"); + +	getTabCtrl()->setCommitCallback(boost::bind(&LLPanelProfile::onTabSelected, this, _2));  	LLPanelPicks* panel_picks = getChild<LLPanelPicks>(PANEL_PICKS);  	panel_picks->setProfilePanel(this); -	mTabs[PANEL_PICKS] = panel_picks; -	mTabs[PANEL_PROFILE] = getChild<LLPanelAvatarProfile>(PANEL_PROFILE); +	getTabContainer()[PANEL_PICKS] = panel_picks; +	getTabContainer()[PANEL_PROFILE] = getChild<LLPanelAvatarProfile>(PANEL_PROFILE);  	return TRUE;  } +void LLPanelProfile::onOpen(const LLSD& key) +{ +	if (key.has("open_tab_name")) +	{ +		// onOpen from selected panel will be called from onTabSelected callback +		getTabCtrl()->selectTabByName(key["open_tab_name"]); +	} +	else +	{ +		getTabCtrl()->getCurrentPanel()->onOpen(getAvatarId()); +	} +} +  //*TODO redo panel toggling  void LLPanelProfile::togglePanel(LLPanel* panel)  {  	// TRUE - we need to open/expand "panel" -	BOOL expand = this->getChildList()->back() != panel;  // mTabContainer->getVisible(); +	bool expand = getChildList()->back() != panel;  // mTabCtrl->getVisible();  	if (expand)  	{ @@ -128,29 +135,31 @@ void LLPanelProfile::togglePanel(LLPanel* panel)  	else   	{  		this->setAllChildrenVisible(TRUE); -		if (panel->getParent() == this) removeChild(panel); -		sendChildToBack(mTabContainer); -		mTabContainer->getCurrentPanel()->onOpen(mAvatarId); +		if (panel->getParent() == this)  +		{ +			removeChild(panel); +		} +		sendChildToBack(getTabCtrl()); +		getTabCtrl()->getCurrentPanel()->onOpen(getAvatarId());  	}  } -  void LLPanelProfile::onTabSelected(const LLSD& param)  {  	std::string tab_name = param.asString(); -	if (NULL != mTabs[tab_name]) +	if (NULL != getTabContainer()[tab_name])  	{ -		mTabs[tab_name]->onOpen(mAvatarId); +		getTabContainer()[tab_name]->onOpen(getAvatarId());  	}  }  void LLPanelProfile::setAllChildrenVisible(BOOL visible)  {  	const child_list_t* child_list = getChildList(); -	for (child_list_const_iter_t child_it = child_list->begin(); child_it != child_list->end(); ++child_it) +	child_list_const_iter_t child_it = child_list->begin(); +	for (; child_it != child_list->end(); ++child_it)  	{  		LLView* viewp = *child_it;  		viewp->setVisible(visible);  	}  } - diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h index 2f6d53a859..b55963ec4a 100644 --- a/indra/newview/llpanelprofile.h +++ b/indra/newview/llpanelprofile.h @@ -39,34 +39,42 @@  class LLTabContainer; +/** +* Base class for Profile View and Me Profile. +*/  class LLPanelProfile : public LLPanel  {  	LOG_CLASS(LLPanelProfile);  public: -	virtual BOOL postBuild(); +	/*virtual*/ BOOL postBuild(); -	virtual void onOpen(const LLSD& key) {}; +	/*virtual*/ void onOpen(const LLSD& key);  	virtual void togglePanel(LLPanel*);  protected: +  	LLPanelProfile(); -	~LLPanelProfile(); -	void onTabSelected(const LLSD& param); +	virtual void onTabSelected(const LLSD& param); + +	virtual void setAllChildrenVisible(BOOL visible); + +	LLTabContainer* getTabCtrl() { return mTabCtrl; } -	void setAllChildrenVisible(BOOL visible); +	const LLUUID& getAvatarId() { return mAvatarId; } +	void setAvatarId(const LLUUID& avatar_id) { mAvatarId = avatar_id; } -	LLTabContainer* mTabContainer; -	  	typedef std::map<std::string, LLPanelProfileTab*> profile_tabs_t; -	profile_tabs_t mTabs; +	profile_tabs_t& getTabContainer() { return mTabContainer; } + +private: +	LLTabContainer* mTabCtrl;	 +	profile_tabs_t mTabContainer;  	LLUUID mAvatarId;  }; - -  #endif //LL_LLPANELPROFILE_H diff --git a/indra/newview/llpanelprofileview.cpp b/indra/newview/llpanelprofileview.cpp index 00254ee8ee..cd18dc4462 100644 --- a/indra/newview/llpanelprofileview.cpp +++ b/indra/newview/llpanelprofileview.cpp @@ -39,14 +39,12 @@  #include "llpanelprofile.h"  static LLRegisterPanelClassWrapper<LLPanelProfileView> t_panel_target_profile("panel_profile_view"); -static LLRegisterPanelClassWrapper<LLPanelAvatarNotes> t_panel_notes("panel_notes"); -static std::string PANEL_PROFILE = "panel_profile"; -static std::string PANEL_PICKS = "panel_picks";  static std::string PANEL_NOTES = "panel_notes";  LLPanelProfileView::LLPanelProfileView()  :	LLPanelProfile() +,	mCacheNameCallbackConnected(false)  {  } @@ -57,32 +55,39 @@ LLPanelProfileView::~LLPanelProfileView(void)  /*virtual*/   void LLPanelProfileView::onOpen(const LLSD& key)  { -	LLUUID id = key["id"]; -	if (key.has("open_tab_name")) -		mTabContainer->selectTabByName(key["open_tab_name"]); - -	if(id.notNull() && mAvatarId != id) +	LLUUID id; +	if(key.has("id"))  	{ -		mAvatarId = id; - -		mTabs[PANEL_PROFILE]->clear(); -		mTabs[PANEL_PICKS]->clear(); -		mTabs[PANEL_NOTES]->clear(); +		id = key["id"]; +	} +	if(id.notNull() && getAvatarId() != id) +	{ +		setAvatarId(id);  	} -	mTabContainer->getCurrentPanel()->onOpen(mAvatarId); +	LLPanelProfile::onOpen(key); + +	// *HACK Profile View is created before gCacheName, as a result we can't call addObserver() +	// in postBuild() and have to connect callback here. +	// This will call addObserver() once per LLPanelProfileView instance. +	if(!mCacheNameCallbackConnected) +	{ +		gCacheName->addObserver(boost::bind(&LLPanelProfileView::cacheNameCallback, this, _1, _2, _3, _4)); +		mCacheNameCallbackConnected = true; +	} +	// getFullName() will return "(Loading...)" for non cached names,  +	// in this case cacheNameCallback() will resolve the name.  	std::string full_name; -	gCacheName->getFullName(mAvatarId,full_name); +	gCacheName->getFullName(getAvatarId(),full_name);  	childSetValue("user_name",full_name);  } -  BOOL LLPanelProfileView::postBuild()  {  	LLPanelProfile::postBuild(); -	mTabs[PANEL_NOTES] = (getChild<LLPanelAvatarNotes>(PANEL_NOTES)); +	getTabContainer()[PANEL_NOTES] = getChild<LLPanelAvatarNotes>(PANEL_NOTES);  	childSetCommitCallback("back",boost::bind(&LLPanelProfileView::onBackBtnClick,this),NULL); @@ -100,3 +105,11 @@ void LLPanelProfileView::onBackBtnClick()  		parent->openPreviousPanel();  	}  } + +void LLPanelProfileView::cacheNameCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name, BOOL is_group) +{ +	if(getAvatarId() == id) +	{ +		childSetValue("user_name", first_name + " " + last_name); +	} +} diff --git a/indra/newview/llpanelprofileview.h b/indra/newview/llpanelprofileview.h index 6c5fc77951..4d5e2997c1 100644 --- a/indra/newview/llpanelprofileview.h +++ b/indra/newview/llpanelprofileview.h @@ -35,24 +35,46 @@  #include "llpanel.h"  #include "llpanelprofile.h" +#include "llavatarpropertiesprocessor.h"  class LLPanelProfile;  class LLPanelProfileTab; + +/** +* Panel for displaying Avatar's profile. It consists of three sub panels - Profile, +* Picks and Notes. +*/  class LLPanelProfileView : public LLPanelProfile  {  	LOG_CLASS(LLPanelProfileView);  	friend class LLUICtrlFactory;  public: +  	LLPanelProfileView(); -	~LLPanelProfileView(void); +	/*virtual*/ ~LLPanelProfileView(); -	void onOpen(const LLSD& key); +	/*virtual*/ void onOpen(const LLSD& key); -	BOOL postBuild(); +	/*virtual*/ BOOL postBuild(); + +	// LLCacheName will call this function when avatar name is loaded from server. +	// This is required to display names that have not been cached yet. +	void cacheNameCallback( +		const LLUUID& id,  +		const std::string& first_name, +		const std::string& last_name, +		BOOL is_group); + +protected: +  	void onBackBtnClick(); + +private: + +	bool mCacheNameCallbackConnected;  };  #endif //LL_LLPANELPROFILEVIEW_H diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index f3d0dc538d..ce9fcd9da2 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -73,10 +73,9 @@ LLPreviewNotecard::LLPreviewNotecard(const LLSD& key) //const LLUUID& item_id,  	const LLInventoryItem *item = getItem();  	if (item)  	{ -		mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID(); -		//Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this,"floater_preview_notecard.xml", FALSE);  		mAssetID = item->getAssetUUID();  	}	 +	//Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this,"floater_preview_notecard.xml", FALSE);  }  LLPreviewNotecard::~LLPreviewNotecard() @@ -91,18 +90,8 @@ BOOL LLPreviewNotecard::postBuild()  		ed->setNotecardInfo(mItemUUID, mObjectID, getKey());  		ed->makePristine();  	} -	if (mShowKeepDiscard) -	{ -		childSetAction("Keep",onKeepBtn,this); -		childSetAction("Discard",onDiscardBtn,this); -	} -	else -	{ -		getChild<LLButton>("Keep")->setLabel(getString("Save")); -		childSetAction("Keep",onClickSave,this); -		childSetVisible("Discard", false); -	} +	childSetAction("Save", onClickSave, this);  	childSetVisible("lock", FALSE);	  	const LLInventoryItem* item = getItem(); @@ -137,18 +126,16 @@ void LLPreviewNotecard::setEnabled( BOOL enabled )  	childSetEnabled("Notecard Editor", enabled);  	childSetVisible("lock", !enabled);  	childSetEnabled("desc", enabled); -	childSetEnabled("Keep", enabled && editor && (!editor->isPristine())); - +	childSetEnabled("Save", enabled && editor && (!editor->isPristine()));  }  void LLPreviewNotecard::draw()  { -	  	LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor"); -	BOOL script_changed = !editor->isPristine(); +	BOOL changed = !editor->isPristine(); -	childSetEnabled("Keep", script_changed && getEnabled()); +	childSetEnabled("Save", changed && getEnabled());  	LLPreview::draw();  } @@ -293,7 +280,9 @@ void LLPreviewNotecard::loadAsset()  		editor->setText(LLStringUtil::null);  		editor->makePristine();  		editor->setEnabled(TRUE); -		mAssetStatus = PREVIEW_ASSET_LOADED; +		// Don't set asset status here; we may not have set the item id yet +		// (e.g. when this gets called initially) +		//mAssetStatus = PREVIEW_ASSET_LOADED;  	}  } diff --git a/indra/newview/llpreviewnotecard.h b/indra/newview/llpreviewnotecard.h index 2a008be1e6..5b8cf1c2f6 100644 --- a/indra/newview/llpreviewnotecard.h +++ b/indra/newview/llpreviewnotecard.h @@ -102,7 +102,6 @@ protected:  	LLUUID mAssetID;  	LLUUID mObjectID; -	BOOL mShowKeepDiscard;  }; diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 5ae79f6c63..10561f5701 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -37,7 +37,10 @@  #include "lltextbox.h"  #include "llscreenchannel.h" +#include "lltoastpanel.h"  #include "llviewercontrol.h" +#include "llfloaterreg.h" +#include "lltrans.h"  #include <algorithm> @@ -46,9 +49,10 @@ using namespace LLNotificationsUI;  bool LLScreenChannel::mWasStartUpToastShown = false;  //-------------------------------------------------------------------------- -LLScreenChannel::LLScreenChannel(): mUnreadToastsPanel(NULL),  +LLScreenChannel::LLScreenChannel(): mOverflowToastPanel(NULL),  +									mStartUpToastPanel(NULL),  									mToastAlignment(NA_BOTTOM),  -									mStoreToasts(true), +									mCanStoreToasts(true),  									mHiddenToastsNum(0),  									mOverflowToastHidden(false),  									mIsHovering(false), @@ -56,10 +60,8 @@ LLScreenChannel::LLScreenChannel(): mUnreadToastsPanel(NULL),  {	  	setFollows(FOLLOWS_RIGHT | FOLLOWS_BOTTOM | FOLLOWS_TOP);   -	//TODO: load as a resource string -	mOverflowFormatString = "You have %d more notification"; +	mOverflowFormatString = LLTrans::getString("OverflowInfoChannelString"); -	mToastList.clear();  	setMouseOpaque( false );  } @@ -85,44 +87,48 @@ void LLScreenChannel::reshape(S32 width, S32 height, BOOL called_from_parent)  }  //-------------------------------------------------------------------------- -LLToast* LLScreenChannel::addToast(LLUUID id, LLPanel* panel, bool is_not_tip) -{	 -	ToastElem new_toast_elem(id, panel); +void LLScreenChannel::addToast(LLToast::Params p) +{ +	bool isSysWellWndShown = LLFloaterReg::getInstance("syswell_window")->getVisible(); +	// we show toast in the following cases: +	//	- the StartUp Toast is already hidden and the SysWell's window is hidden +	//  - the SysWell's window is shown, but notification is a tip. We can't store it, so we show it +	//	- the channel has a CENTRE allignment, so it is intended for alerts. We always show alerts +	bool show_toast = (mWasStartUpToastShown && !isSysWellWndShown) || (isSysWellWndShown && p.is_tip) || mToastAlignment == NA_CENTRE; +	bool store_toast = !show_toast && !p.is_tip && mCanStoreToasts; + +	// if we can't show or store a toast, then do nothing, just send ignore to a notification  +	if(!show_toast && !store_toast) +	{ +		if(p.notification) +		{ +			p.notification->setIgnored(TRUE); +			p.notification->respond(p.notification->getResponseTemplate()); +		} +		return; +	} + +	ToastElem new_toast_elem(p);  	mOverflowToastHidden = false; -	mToastList.push_back(new_toast_elem);  	getRootView()->addChild(new_toast_elem.toast);  	new_toast_elem.toast->setOnFadeCallback(boost::bind(&LLScreenChannel::onToastFade, this, new_toast_elem.toast));  	if(mControlHovering)  	{  		new_toast_elem.toast->setOnToastHoverCallback(boost::bind(&LLScreenChannel::onToastHover, this, _1, _2));  	} - -	// don't show toasts until StartUp toast will fade, but show alerts -	if(!mWasStartUpToastShown && mToastAlignment != NA_CENTRE) -	{ -		new_toast_elem.toast->stopTimer(); -		// Count and store only non tip notifications -		if(is_not_tip) -		{ -			mHiddenToastsNum++;			 -			storeToast(new_toast_elem); -		} -		else -		{ -			// destroy tip toasts at once -			new_toast_elem.toast->close();			 -		} -		// remove toast from channel -		mToastList.pop_back(); -	} -	else +	 +	if(show_toast)  	{ +		mToastList.push_back(new_toast_elem);  		showToasts(); +	}	 +	else // store_toast +	{ +		mHiddenToastsNum++; +		storeToast(new_toast_elem);  	} - -	return new_toast_elem.toast;  }  //-------------------------------------------------------------------------- @@ -130,11 +136,12 @@ void LLScreenChannel::onToastFade(LLToast* toast)  {	  	std::vector<ToastElem>::iterator it = find(mToastList.begin(), mToastList.end(), static_cast<LLPanel*>(toast)); -	bool destroy_toast = toast->isViewed() || !mStoreToasts || !toast->getCanBeStored(); +	// *TODO: toast->isViewed() - seems unnecessary +	bool destroy_toast = toast->isViewed() || !mCanStoreToasts || !toast->getCanBeStored();  	if(destroy_toast)  	{  		mToastList.erase(it); -		toast->mOnToastDestroy(toast, LLSD()); +		toast->mOnToastDestroy(toast);  	}  	else  	{ @@ -149,7 +156,14 @@ void LLScreenChannel::onToastFade(LLToast* toast)  void LLScreenChannel::storeToast(ToastElem& toast_elem)  { +	// do not store clones +	std::vector<ToastElem>::iterator it = find(mStoredToastList.begin(), mStoredToastList.end(), toast_elem.id); +	if( it != mStoredToastList.end() ) +		return; + +	toast_elem.toast->stopTimer();  	mStoredToastList.push_back(toast_elem); +	mOnStoreToast(toast_elem.toast->getPanel(), toast_elem.id);  }  //-------------------------------------------------------------------------- @@ -173,16 +187,74 @@ void LLScreenChannel::loadStoredToastsToChannel()  }  //-------------------------------------------------------------------------- +void LLScreenChannel::loadStoredToastByIDToChannel(LLUUID id) +{ +	std::vector<ToastElem>::iterator it = find(mStoredToastList.begin(), mStoredToastList.end(), id); + +	if( it == mStoredToastList.end() ) +		return; + +	mOverflowToastHidden = false; + +	LLToast* toast = (*it).toast; +	toast->resetTimer(); +	mToastList.push_back((*it)); +	mStoredToastList.erase(it); + +	showToasts(); +} + +//-------------------------------------------------------------------------- +void LLScreenChannel::removeStoredToastByID(LLUUID id) +{ +	// *TODO: may be remove this function +	std::vector<ToastElem>::iterator it = find(mStoredToastList.begin(), mStoredToastList.end(), id); + +	if( it == mStoredToastList.end() ) +		return; + +	LLToast* toast = (*it).toast; +	mStoredToastList.erase(it); +	toast->discardNotification(); +} + +//--------------------------------------------------------------------------  void LLScreenChannel::killToastByNotificationID(LLUUID id)  { +	// searching among toasts on a screen  	std::vector<ToastElem>::iterator it = find(mToastList.begin(), mToastList.end(), id);  	if( it != mToastList.end())  	{  		LLToast* toast = (*it).toast; -		mToastList.erase(it); -		toast->mOnToastDestroy(toast, LLSD()); -		showToasts(); +		// if it is a notification toast and notification is UnResponded - then respond on it +		// else - simply destroy a toast +		// +		// NOTE:	if a notification is unresponded this function will be called twice for the same toast. +		//			At first, the notification will be discarded, at second (it will be caused by discarding), +		//			the toast will be destroyed. +		if(toast->getIsNotificationUnResponded()) +		{ +			toast->discardNotification(); +		} +		else +		{ +			mToastList.erase(it); +			toast->mOnToastDestroy(toast); +			showToasts(); +		} +		return; +	} + +	// searching among stored toasts +	it = find(mStoredToastList.begin(), mStoredToastList.end(), id); + +	if( it != mStoredToastList.end() ) +	{ +		LLToast* toast = (*it).toast; +		mStoredToastList.erase(it); +		toast->discardNotification(); +		toast->mOnToastDestroy(toast);  	}  } @@ -197,7 +269,7 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)  		LLPanel* old_panel = toast->getPanel();  		toast->removeChild(old_panel);  		delete old_panel; -		toast->arrange(panel); +		toast->insertPanel(panel);  		toast->resetTimer();  		showToasts();  	} @@ -297,15 +369,16 @@ void LLScreenChannel::showToastsTop()  void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)  {  	LLRect toast_rect; -	mUnreadToastsPanel = new LLToast(NULL); +	LLToast::Params p; // *TODO: fill structure +	mOverflowToastPanel = new LLToast(p); -	if(!mUnreadToastsPanel) +	if(!mOverflowToastPanel)  		return; -	mUnreadToastsPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onOverflowToastHide, this)); +	mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onOverflowToastHide, this)); -	LLTextBox* text_box = mUnreadToastsPanel->getChild<LLTextBox>("toast_text"); -	LLIconCtrl* icon = mUnreadToastsPanel->getChild<LLIconCtrl>("icon"); +	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)  	{ @@ -316,41 +389,107 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)  		text += "s.";  	} -	toast_rect = mUnreadToastsPanel->getRect(); -	mUnreadToastsPanel->reshape(getRect().getWidth(), toast_rect.getHeight(), true); +	toast_rect = mOverflowToastPanel->getRect(); +	mOverflowToastPanel->reshape(getRect().getWidth(), toast_rect.getHeight(), true);  	toast_rect.setLeftTopAndSize(getRect().mLeft, bottom + toast_rect.getHeight()+gSavedSettings.getS32("ToastMargin"), getRect().getWidth(), toast_rect.getHeight());	 -	mUnreadToastsPanel->setRect(toast_rect); -	mUnreadToastsPanel->setAndStartTimer(timer); -	getRootView()->addChild(mUnreadToastsPanel); +	mOverflowToastPanel->setRect(toast_rect); +	mOverflowToastPanel->setAndStartTimer(timer); +	getRootView()->addChild(mOverflowToastPanel);  	text_box->setValue(text);  	text_box->setVisible(TRUE);  	icon->setVisible(TRUE); -	mUnreadToastsPanel->setVisible(TRUE); +	mOverflowToastPanel->setVisible(TRUE);  }  //--------------------------------------------------------------------------  void LLScreenChannel::onOverflowToastHide()  {  	mOverflowToastHidden = true; +	// *TODO: check whether it is needed: closeOverflowToastPanel();	 +} + +//-------------------------------------------------------------------------- +void LLScreenChannel::closeOverflowToastPanel() +{ +	if(mOverflowToastPanel != NULL) +	{ +		mOverflowToastPanel->close(); +		mOverflowToastPanel = NULL; +	} +} + +//-------------------------------------------------------------------------- +void LLScreenChannel::createStartUpToast(S32 notif_num, S32 bottom, F32 timer) +{ +	LLRect toast_rect; +	LLToast::Params p; // *TODO: fill structure +	mStartUpToastPanel = new LLToast(p); + +	if(!mStartUpToastPanel) +		return; + +	mStartUpToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onStartUpToastHide, this)); + +	LLTextBox* text_box = mStartUpToastPanel->getChild<LLTextBox>("toast_text"); +	LLIconCtrl* icon = mStartUpToastPanel->getChild<LLIconCtrl>("icon"); + +	std::string mStartUpFormatString; + +	if(notif_num == 1) +	{ +		mStartUpFormatString = LLTrans::getString("StartUpNotification"); +	} +	else +	{ +		mStartUpFormatString = LLTrans::getString("StartUpNotifications"); +	} +	 + +	std::string	text = llformat(mStartUpFormatString.c_str(), notif_num); + +	toast_rect = mStartUpToastPanel->getRect(); +	mStartUpToastPanel->reshape(getRect().getWidth(), toast_rect.getHeight(), true); +	toast_rect.setLeftTopAndSize(getRect().mLeft, bottom + toast_rect.getHeight()+gSavedSettings.getS32("ToastMargin"), getRect().getWidth(), toast_rect.getHeight());	 +	mStartUpToastPanel->setRect(toast_rect); +	mStartUpToastPanel->setAndStartTimer(timer); +	getRootView()->addChild(mStartUpToastPanel); + +	text_box->setValue(text); +	text_box->setVisible(TRUE); +	icon->setVisible(TRUE); + +	mStartUpToastPanel->setVisible(TRUE); +} + +//-------------------------------------------------------------------------- +void LLScreenChannel::updateStartUpString(S32 num) +{ +	// *TODO: update string if notifications are arriving while the StartUp toast is on a screen +} + +//-------------------------------------------------------------------------- +void LLScreenChannel::onStartUpToastHide() +{  	onCommit();  }  //-------------------------------------------------------------------------- -void LLScreenChannel::closeUnreadToastsPanel() +void LLScreenChannel::closeStartUpToast()  { -	if(mUnreadToastsPanel != NULL) +	if(mStartUpToastPanel != NULL)  	{ -		mUnreadToastsPanel->close(); -		mUnreadToastsPanel = NULL; +		LLScreenChannel::setStartUpToastShown(); +		mStartUpToastPanel->close(); +		mStartUpToastPanel = NULL;  	}  }  //--------------------------------------------------------------------------  void LLScreenChannel::hideToastsFromScreen()  { -	closeUnreadToastsPanel(); +	closeOverflowToastPanel();  	for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end(); it++)  		(*it).toast->setVisible(FALSE);  } @@ -368,6 +507,24 @@ void LLScreenChannel::removeToastsFromChannel()  }  //-------------------------------------------------------------------------- +void LLScreenChannel::removeAndStoreAllVisibleToasts() +{ +	if(mToastList.size() == 0) +		return; + +	hideToastsFromScreen(); +	for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end(); it++) +	{ +		mStoredToastList.push_back(*it); +		mOnStoreToast((*it).toast->getPanel(), (*it).id); +		(*it).toast->stopTimer(); +		(*it).toast->setVisible(FALSE); +	} + +	mToastList.clear(); +} + +//--------------------------------------------------------------------------  void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)  {  	// because of LLViewerWindow::updateUI() that ALWAYS calls onMouseEnter BEFORE onMouseLeave diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h index a205b913ab..1ca70c72d0 100644 --- a/indra/newview/llscreenchannel.h +++ b/indra/newview/llscreenchannel.h @@ -59,45 +59,76 @@ public:  	LLScreenChannel();  	virtual ~LLScreenChannel(); +	// Channel's outfit-functions +	// classic reshape  	void		reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); - -	LLToast*	addToast(LLUUID id, LLPanel* panel, bool is_not_tip = true); +	// initialization of channel's shape and position  	void		init(S32 channel_left, S32 channel_right); +	// set allignment of toasts inside a channel +	void		setToastAlignment(e_notification_toast_alignment align) {mToastAlignment = align;} +	// set a template for a string in the OverflowToast +	void		setOverflowFormatString ( std::string str)  { mOverflowFormatString = str; } +	// Operating with toasts +	// add a toast to a channel +	void		addToast(LLToast::Params p); +	// kill or modify a toast by its ID  	void		killToastByNotificationID(LLUUID id);  	void		modifyToastByNotificationID(LLUUID id, LLPanel* panel); -	 -	void		setToastAlignment(e_notification_toast_alignment align) {mToastAlignment = align;} - -	void		setControlHovering(bool control) { mControlHovering = control; } -	void		setHovering(bool hovering) { mIsHovering = hovering; } - -	void		removeToastsFromChannel(); -	void 		closeUnreadToastsPanel(); +	// hide all toasts from screen, but not remove them from a channel  	void		hideToastsFromScreen(); - -	void		setStoreToasts(bool store) { mStoreToasts = store; } -	void		loadStoredToastsToChannel(); -	 +	// removes all toasts from a channel +	void		removeToastsFromChannel(); +	// show all toasts in a channel  	void		showToasts(); - -	S32			getNumberOfHiddenToasts() { return mHiddenToastsNum;} -	void		setNumberOfHiddenToasts(S32 num) { mHiddenToastsNum = num;} - +	// +	void		loadStoredToastsToChannel(); +	// finds a toast among stored by its ID and throws it on a screen to a channel +	void		loadStoredToastByIDToChannel(LLUUID id); +	// removes a toast from stored finding it by its ID  +	void		removeStoredToastByID(LLUUID id); +	// remove all toasts from screen and store them +	void		removeAndStoreAllVisibleToasts(); +	// close the Overflow Toast +	void 		closeOverflowToastPanel(); +	// close the StartUp Toast +	void		closeStartUpToast(); + +	// Channel's behavior-functions +	// set whether a channel will control hovering inside itself or not +	void		setControlHovering(bool control) { mControlHovering = control; } +	// set Hovering flag for a channel +	void		setHovering(bool hovering) { mIsHovering = hovering; } +	// set whether a channel will store faded toasts or not +	void		setCanStoreToasts(bool store) { mCanStoreToasts = store; } +	// tell all channels that the StartUp toast was shown and allow them showing of toasts  	static void	setStartUpToastShown() { mWasStartUpToastShown = true; } - +	// +	static bool	getStartUpToastShown() { return mWasStartUpToastShown; } + +	// Channel's other interface functions functions +	// get number of hidden notifications from a channel +	S32		getNumberOfHiddenToasts() { return mHiddenToastsNum;} +	// update number of notifications in the StartUp Toast +	void	updateStartUpString(S32 num);  	e_notification_toast_alignment getToastAlignment() {return mToastAlignment;} -	void		setOverflowFormatString ( std::string str)  { mOverflowFormatString = str; } +	// Channel's callbacks +	// callback for storing of faded toasts +	typedef boost::function<void (LLPanel* info_panel, const LLUUID id)> store_tost_callback_t; +	typedef boost::signals2::signal<void (LLPanel* info_panel, const LLUUID id)> store_tost_signal_t; +	store_tost_signal_t mOnStoreToast;	 +	boost::signals2::connection setOnStoreToastCallback(store_tost_callback_t cb) { return mOnStoreToast.connect(cb); }  private:  	struct ToastElem  	{  		LLUUID		id;  		LLToast*	toast; -		ToastElem(LLUUID lluuid, LLPanel* panel) : id(lluuid) + +		ToastElem(LLToast::Params p) : id(p.id)  		{ -			toast = new LLToast(panel); +			toast = new LLToast(p);  		}  		ToastElem(const ToastElem& toast_elem) @@ -117,31 +148,46 @@ private:  		}  	}; +	// Channel's handlers  	void	onToastHover(LLToast* toast, bool mouse_enter); -  	void	onToastFade(LLToast* toast); +	void	onOverflowToastHide(); +	void	onStartUpToastHide(); + +	//  	void	storeToast(ToastElem& toast_elem); +	// show-functions depending on allignment of toasts  	void	showToastsBottom();  	void	showToastsCentre();  	void	showToastsTop(); +	// create the Overflow Toast  	void	createOverflowToast(S32 bottom, F32 timer); -	void	onOverflowToastHide(); +	// create the StartUp Toast +	void	createStartUpToast(S32 notif_num, S32 bottom, F32 timer); + +	// Channel's flags  	static bool	mWasStartUpToastShown;  	bool		mControlHovering;  	bool		mIsHovering; -	bool		mStoreToasts; +	bool		mCanStoreToasts;  	bool		mOverflowToastHidden; -	S32			mHiddenToastsNum; -	LLToast*	mUnreadToastsPanel; -	std::vector<ToastElem>	mToastList; -	std::vector<ToastElem>	mStoredToastList; +	//   	e_notification_toast_alignment	mToastAlignment; -	std::map<LLToast*, bool>	mToastEventStack; +	// attributes for the Overflow Toast +	S32			mHiddenToastsNum; +	LLToast*	mOverflowToastPanel;	  	std::string mOverflowFormatString; + +	// attributes for the StartUp Toast	 +	LLToast* mStartUpToastPanel; + +	std::vector<ToastElem>		mToastList; +	std::vector<ToastElem>		mStoredToastList; +	std::map<LLToast*, bool>	mToastEventStack;  };  } diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 5f0fbe6ee5..438b1b558f 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -281,7 +281,7 @@ bool        LLSideTray::addTab          ( const std::string& tab_name  LLSideTrayTab* LLSideTray::getTab(const std::string& name)  { -	return getChild<LLSideTrayTab>(name,false,false); +	return getChild<LLSideTrayTab>(name,false);  } @@ -311,7 +311,7 @@ bool LLSideTray::selectTabByName	(const std::string& name)  {  	LLSideTrayTab* side_bar = getTab(name); -	if(side_bar == NULL || side_bar == mActiveTab) +	if(side_bar == mActiveTab)  		return false;  	//deselect old tab  	toggleTabButton(mActiveTab); @@ -508,6 +508,8 @@ void LLSideTray::expandSideBar	()  {  	mCollapsed = false;  	mCollapseButton->setLabel(EXPANDED_NAME); +	LLSD key;//empty +	mActiveTab->onOpen(key);  	mActiveTab->setVisible(TRUE);  	reflectCollapseChange(); diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 1f8b6b402f..b691a42db1 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -89,10 +89,13 @@ private:  	LLView*	mMainPanel;  }; - -class LLSideTray : public LLPanel +// added inheritance from LLDestroyClass<LLSideTray> to enable Side Tray perform necessary actions  +// while disconnecting viewer in LLAppViewer::disconnectViewer(). +// LLDestroyClassList::instance().fireCallbacks() calls destroyClass method. See EXT-245. +class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>  {  	friend class LLUICtrlFactory; +	friend class LLDestroyClass<LLSideTray>;  public:  	LOG_CLASS(LLSideTray); @@ -216,6 +219,15 @@ protected:  	void		setPanelRect	(); + +private: +	// Implementation of LLDestroyClass<LLSideTray> +	static void destroyClass() +	{ +		// Disable SideTray to avoid crashes. EXT-245 +		if (LLSideTray::instanceCreated()) +			LLSideTray::getInstance()->setEnabled(FALSE); +	}  private: diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp index bd93f5dd28..ffadeeddf2 100644 --- a/indra/newview/llslurl.cpp +++ b/indra/newview/llslurl.cpp @@ -106,6 +106,13 @@ std::string LLSLURL::buildSLURL(const std::string& regionname, S32 x, S32 y, S32  }  // static +std::string LLSLURL::buildUnescapedSLURL(const std::string& regionname, S32 x, S32 y, S32 z) +{ +	std::string unescapedslurl = PREFIX_SLURL + regionname + llformat("/%d/%d/%d",x,y,z); +	return unescapedslurl; +} + +// static  bool LLSLURL::matchPrefix(const std::string& url, const std::string& prefix)  {  	std::string test_prefix = url.substr(0, prefix.length()); diff --git a/indra/newview/llslurl.h b/indra/newview/llslurl.h index 05788623d9..5c9fea3e96 100644 --- a/indra/newview/llslurl.h +++ b/indra/newview/llslurl.h @@ -69,11 +69,16 @@ public:  	static bool isSLURLHelp(const std::string& url);  	/** -	 * builds: http://slurl.com/secondlife/RegionName/x/y/z/ +	 * builds: http://slurl.com/secondlife/Region%20Name/x/y/z/ escaping result url.  	 */  	static std::string buildSLURL(const std::string& regionname, S32 x, S32 y, S32 z);  	/** +	 * builds: http://slurl.com/secondlife/Region Name/x/y/z/ without escaping result url. +	 */ +	static std::string buildUnescapedSLURL(const std::string& regionname, S32 x, S32 y, S32 z); + +	/**  	 * Strip protocol part from the URL.  	 */  	static std::string stripProtocol(const std::string& url); diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index bc90fe7adc..569e7b3397 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -48,6 +48,7 @@  #include "llfloaterscriptdebug.h"  #include "llhudicon.h"  #include "llfloaterinventory.h" +#include "llnavigationbar.h"  #include "llkeyboard.h"  #include "lllineeditor.h"  #include "llmenugl.h" @@ -244,6 +245,30 @@ void LLStatusBar::draw()  	LLPanel::draw();  } +BOOL LLStatusBar::handleRightMouseUp(S32 x, S32 y, MASK mask) +{ +	if (mHideNavbarContextMenu) +	{ +		mHideNavbarContextMenu->buildDrawLabels(); +		mHideNavbarContextMenu->updateParent(LLMenuGL::sMenuContainer); +		LLMenuGL::showPopup(this, mHideNavbarContextMenu, x, y); +	} + +	return TRUE; +} + +BOOL LLStatusBar::postBuild() +{ +	mCommitCallbackRegistrar.add("HideNavbarMenu.Action", boost::bind(&LLStatusBar::onHideNavbarContextMenuItemClicked, this, _2)); +	mEnableCallbackRegistrar.add("HideNavbarMenu.EnableMenuItem", boost::bind(&LLStatusBar::onHideNavbarContextMenuItemEnabled, this, _2)); + +	mHideNavbarContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_hide_navbar.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +	gMenuHolder->addChild(mHideNavbarContextMenu); + +	gMenuBarView->setRightClickedCallback(boost::bind(&LLStatusBar::onMainMenuRightClicked, this, _1, _2, _3, _4)); + +	return TRUE; +}  // Per-frame updates of visibility  void LLStatusBar::refresh() @@ -479,9 +504,11 @@ void LLStatusBar::creditBalance(S32 credit)  void LLStatusBar::setBalance(S32 balance)  {  	std::string money_str = LLResMgr::getInstance()->getMonetaryString( balance ); -	std::string balance_str = "L$"; -	balance_str += money_str; -	mBtnBuyCurrency->setLabel( balance_str ); + +	LLStringUtil::format_map_t string_args; +	string_args["[AMT]"] = llformat("%s", money_str.c_str()); +	std::string labe_str = getString("buycurrencylabel", string_args); +	mBtnBuyCurrency->setLabel(labe_str);  	// Resize the balance button so that the label fits it, and the button expands to the left.  	// *TODO: LLButton should have an option where to expand. @@ -714,6 +741,48 @@ void LLStatusBar::setupDate()  	}  } +bool LLStatusBar::onHideNavbarContextMenuItemEnabled(const LLSD& userdata) +{ +	std::string item = userdata.asString(); + +	if (item == "show_navbar_navigation_panel") +	{ +		return gSavedSettings.getBOOL("ShowNavbarNavigationPanel"); +	} +	else if (item == "show_navbar_favorites_panel") +	{ +		return gSavedSettings.getBOOL("ShowNavbarFavoritesPanel"); +	} + +	return FALSE; +} + +void LLStatusBar::onHideNavbarContextMenuItemClicked(const LLSD& userdata) +{ +	std::string item = userdata.asString(); + +	if (item == "show_navbar_navigation_panel") +	{ +		BOOL state = !gSavedSettings.getBOOL("ShowNavbarNavigationPanel"); + +		LLNavigationBar::getInstance()->showNavigationPanel(state); +		gSavedSettings.setBOOL("ShowNavbarNavigationPanel", state); +	} +	else if (item == "show_navbar_favorites_panel") +	{ +		BOOL state = !gSavedSettings.getBOOL("ShowNavbarFavoritesPanel"); + +		LLNavigationBar::getInstance()->showFavoritesPanel(state); +		gSavedSettings.setBOOL("ShowNavbarFavoritesPanel", state); +	} +} + + +void LLStatusBar::onMainMenuRightClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask) +{ +	handleRightMouseUp(x, y, mask); +} +  // static  void LLStatusBar::onCommitSearch(LLUICtrl*, void* data)  { diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h index 84dd761930..0cb3551768 100644 --- a/indra/newview/llstatusbar.h +++ b/indra/newview/llstatusbar.h @@ -34,6 +34,7 @@  #define LL_LLSTATUSBAR_H  #include "llpanel.h" +#include <llmenugl.h>  // "Constants" loaded from settings.xml at start time  extern S32 STATUS_BAR_HEIGHT; @@ -57,6 +58,9 @@ public:  	/*virtual*/ void draw(); +	/*virtual*/ BOOL handleRightMouseUp(S32 x, S32 y, MASK mask); +	/*virtual*/ BOOL postBuild(); +  	// MANIPULATORS  	void		setBalance(S32 balance);  	void		debitBalance(S32 debit); @@ -87,6 +91,10 @@ private:  	// simple method to setup the part that holds the date  	void setupDate(); +	bool onHideNavbarContextMenuItemEnabled(const LLSD& userdata); +	void onHideNavbarContextMenuItemClicked(const LLSD& userdata); + +	void onMainMenuRightClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask);  	static void onCommitSearch(LLUICtrl*, void* data);  	static void onClickSearch(void* data);  	static void onClickStatGraph(void* data); @@ -106,6 +114,7 @@ private:  	S32				mSquareMetersCommitted;  	LLFrameTimer*	mBalanceTimer;  	LLFrameTimer*	mHealthTimer; +	LLMenuGL*		mHideNavbarContextMenu;  	static std::vector<std::string> sDays;  	static std::vector<std::string> sMonths; diff --git a/indra/newview/llsyswellitem.cpp b/indra/newview/llsyswellitem.cpp new file mode 100644 index 0000000000..5ed8a8b604 --- /dev/null +++ b/indra/newview/llsyswellitem.cpp @@ -0,0 +1,105 @@ +/**  + * @file llsyswellitem.cpp + * @brief                                    // TODO + * + * $LicenseInfo:firstyear=2000&license=viewergpl$ + *  + * Copyright (c) 2000-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" // must be first include + +#include "llsyswellitem.h" + +#include "llwindow.h" +#include "v4color.h" + +//--------------------------------------------------------------------------------- +LLSysWellItem::LLSysWellItem(const Params& p) : LLScrollingPanel(p), +												mTitle(NULL), +												mCloseBtn(NULL), +												mIcon(NULL) +{ +	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_sys_well_item.xml"); + +	mTitle = getChild<LLTextBox>("title"); +	mCloseBtn = getChild<LLButton>("close_btn"); +	mIcon = getChild<LLIconCtrl>("icon"); + +	mTitle->setValue(p.title); +	mCloseBtn->setClickedCallback(boost::bind(&LLSysWellItem::onClickCloseBtn,this)); + +	mID = p.notification_id; +} + +//--------------------------------------------------------------------------------- +LLSysWellItem::~LLSysWellItem() +{ +} + +//--------------------------------------------------------------------------------- +void LLSysWellItem::setTitle( std::string title ) +{ +	mTitle->setValue(title); +} + +//--------------------------------------------------------------------------------- +void LLSysWellItem::onClickCloseBtn() +{ +	mOnItemClose(this); +} + +//--------------------------------------------------------------------------------- +void LLSysWellItem::updatePanel(BOOL allow_modify) +{ +	//nothing to do here +} + +//--------------------------------------------------------------------------------- +BOOL LLSysWellItem::handleMouseDown(S32 x, S32 y, MASK mask) +{ +	if(!mCloseBtn->getRect().pointInRect(x, y)) +		mOnItemClick(this); + +	return LLPanel::handleMouseDown(x, y, mask); +} + +//--------------------------------------------------------------------------------- +void LLSysWellItem::onMouseEnter(S32 x, S32 y, MASK mask) +{ +	setTransparentColor(LLColor4(0.3f, 0.3f, 0.3f, 1.0f)); +} + +//--------------------------------------------------------------------------------- +void LLSysWellItem::onMouseLeave(S32 x, S32 y, MASK mask) +{ +	setTransparentColor(LLColor4(0.0f, 0.0f, 0.0f, 0.0f)); +} + +//--------------------------------------------------------------------------------- + + diff --git a/indra/newview/llsyswellitem.h b/indra/newview/llsyswellitem.h new file mode 100644 index 0000000000..b0761f2790 --- /dev/null +++ b/indra/newview/llsyswellitem.h @@ -0,0 +1,90 @@ +/**  + * @file llsyswellitem.h + * @brief                                    // TODO + * + * $LicenseInfo:firstyear=2003&license=viewergpl$ + *  + * Copyright (c) 2003-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_LLSYSWELLITEM_H +#define LL_LLSYSWELLITEM_H + +#include "llscrollingpanellist.h" +#include "lltextbox.h" +#include "llbutton.h" +#include "lliconctrl.h" + +#include <string> + +class LLSysWellItem : public LLScrollingPanel  +{ +public: +	struct Params :	public LLInitParam::Block<Params, LLPanel::Params> +	{ +		LLUUID        	notification_id; +		std::string		title; +        Params()        {}; +	}; + + +	LLSysWellItem(const Params& p); +	virtual	~LLSysWellItem(); + +	void updatePanel(BOOL allow_modify); + +	// title +	void setTitle( std::string title ); + +	// get item's ID +	LLUUID getID() { return mID; } + +	// handlers +	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); +	virtual void onMouseEnter(S32 x, S32 y, MASK mask); +	virtual void onMouseLeave(S32 x, S32 y, MASK mask); + +	//callbacks +	typedef boost::function<void (LLSysWellItem* item)> syswell_item_callback_t; +	typedef boost::signals2::signal<void (LLSysWellItem* item)> syswell_item_signal_t; +	syswell_item_signal_t mOnItemClose;	 +	syswell_item_signal_t mOnItemClick;	 +	boost::signals2::connection setOnItemCloseCallback(syswell_item_callback_t cb) { return mOnItemClose.connect(cb); } +	boost::signals2::connection setOnItemClickCallback(syswell_item_callback_t cb) { return mOnItemClick.connect(cb); } + +private: + +	void onClickCloseBtn(); + +	LLTextBox*	mTitle; +	LLButton*	mCloseBtn; +	LLIconCtrl*	mIcon; +	LLUUID		mID; +}; + +#endif // LL_LLSYSWELLITEM_H + + diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp new file mode 100644 index 0000000000..c8eea5e7b4 --- /dev/null +++ b/indra/newview/llsyswellwindow.cpp @@ -0,0 +1,210 @@ +/**  + * @file llsyswellwindow.cpp + * @brief                                    // TODO + * $LicenseInfo:firstyear=2000&license=viewergpl$ + *  + * Copyright (c) 2000-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" // must be first include + +#include "llsyswellwindow.h" + +#include "llbottomtray.h" +#include "llviewercontrol.h" + + +//--------------------------------------------------------------------------------- +LLSysWellWindow::LLSysWellWindow(const LLSD& key) : LLFloater(LLSD()), +													mChannel(NULL), +													mScrollContainer(NULL), +													mNotificationList(NULL) +{ +	// Ho to use: +	// LLFloaterReg::showInstance("syswell_window"); +	LLUICtrlFactory::getInstance()->buildFloater(this, "floater_sys_well.xml", NULL); +} + +//--------------------------------------------------------------------------------- +BOOL LLSysWellWindow::postBuild() +{ +	mCloseBtn = getChild<LLButton>("close_btn"); +	mScrollContainer = getChild<LLScrollContainer>("notification_list_container"); +	mNotificationList = getChild<LLScrollingPanelList>("notification_list"); + +	mCloseBtn->setClickedCallback(boost::bind(&LLSysWellWindow::onClickCloseBtn,this)); + +	return TRUE; +} + +//--------------------------------------------------------------------------------- +LLSysWellWindow::~LLSysWellWindow() +{ +} + +//--------------------------------------------------------------------------------- +void LLSysWellWindow::addItem(LLSysWellItem::Params p) +{ +	// do not add clones +	if( findItemByID(p.notification_id) >= 0 ) +		return; + +	LLSysWellItem* new_item = new LLSysWellItem(p); +	mNotificationList->addPanel(dynamic_cast<LLScrollingPanel*>(new_item)); +	reshapeWindow(); +	adjustWindowPosition(); + +	new_item->setOnItemCloseCallback(boost::bind(&LLSysWellWindow::onItemClose, this, _1)); +	new_item->setOnItemClickCallback(boost::bind(&LLSysWellWindow::onItemClick, this, _1)); +} + +//--------------------------------------------------------------------------------- +void LLSysWellWindow::clear() +{ + // *TODO: fill later +} + +//--------------------------------------------------------------------------------- +S32 LLSysWellWindow::findItemByID(const LLUUID& id) +{ +	const LLScrollingPanelList::panel_list_t list = mNotificationList->getPanelList(); +	if(list.size() == 0) +		return -1; + +	LLScrollingPanelList::panel_list_t::const_iterator it = list.begin();  +	S32 index = 0; +	while(it != list.end()) +	{ +		if( dynamic_cast<LLSysWellItem*>(*it)->getID() == id ) +			break; +		++it; +		++index; +	} + +	if(it == list.end()) +		return -1; +	else +		return index; + +} + +//--------------------------------------------------------------------------------- +void LLSysWellWindow::removeItemByID(const LLUUID& id) +{ +	S32 index = findItemByID(id); + +	if(index >= 0) +		mNotificationList->removePanel(index); +	else +		return; + +	reshapeWindow(); +	adjustWindowPosition(); +	// hide chiclet window if there are no items left +	S32 items_left = mNotificationList->getPanelList().size(); +	if(items_left == 0) +		setVisible(FALSE); +} + +//--------------------------------------------------------------------------------- +void LLSysWellWindow::onItemClick(LLSysWellItem* item) +{ +	LLUUID id = item->getID(); +	mChannel->loadStoredToastByIDToChannel(id); +} + +//--------------------------------------------------------------------------------- +void LLSysWellWindow::onItemClose(LLSysWellItem* item) +{ +	LLUUID id = item->getID(); +	removeItemByID(id); +	mChannel->killToastByNotificationID(id); +} + +//--------------------------------------------------------------------------------- +void LLSysWellWindow::onClickCloseBtn() +{ +	setVisible(false); +} + +//--------------------------------------------------------------------------------- +void LLSysWellWindow::setVisible(BOOL visible) +{ +	// on Show adjust position of SysWell chiclet's window +	if(visible) +	{ +		mChannel->removeAndStoreAllVisibleToasts(); +		adjustWindowPosition(); +	} + +	LLFloater::setVisible(visible); +} + +//--------------------------------------------------------------------------------- +void LLSysWellWindow::adjustWindowPosition() +{ +	const S32 WINDOW_MARGIN	= 5; + +	LLRect btm_rect = LLBottomTray::getInstance()->getRect(); +	LLRect this_rect = getRect(); +	setOrigin(btm_rect.mRight - this_rect.getWidth() - WINDOW_MARGIN, WINDOW_MARGIN);  +} +//--------------------------------------------------------------------------------- +void LLSysWellWindow::reshapeWindow() +{ +	// Get scrollbar size +	const LLUICachedControl<S32> SCROLLBAR_SIZE("UIScrollbarSize", 0); + +	// Get item list	 +	const LLScrollingPanelList::panel_list_t list = mNotificationList->getPanelList(); + +	// window's size constants +	const S32 WINDOW_HEADER_HEIGHT	= 30; +	const S32 MAX_WINDOW_HEIGHT		= 200; +	const S32 MIN_WINDOW_WIDTH		= 320; + +	// Get height and border's width for a scrolling panel list +	S32 list_height			= mNotificationList->getRect().getHeight(); +	S32 list_border_width	= mScrollContainer->getBorderWidth() * 2; + +	// Check that the floater doesn't exceed its parent view limits after reshape +	S32 new_height = list_height + WINDOW_HEADER_HEIGHT + list_border_width; + +	if(new_height > MAX_WINDOW_HEIGHT) +	{ +		reshape(MIN_WINDOW_WIDTH + SCROLLBAR_SIZE, MAX_WINDOW_HEIGHT, FALSE); +	} +	else +	{ +		reshape(MIN_WINDOW_WIDTH, new_height, FALSE); +	} +} + +//--------------------------------------------------------------------------------- + + + diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h new file mode 100644 index 0000000000..9554f3cb82 --- /dev/null +++ b/indra/newview/llsyswellwindow.h @@ -0,0 +1,89 @@ +/**  + * @file llsyswellwindow.h + * @brief                                    // TODO + * + * $LicenseInfo:firstyear=2003&license=viewergpl$ + *  + * Copyright (c) 2003-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_LLSYSWELLWINDOW_H +#define LL_LLSYSWELLWINDOW_H + +#include "llsyswellitem.h" + +#include "llfloater.h" +#include "llbutton.h" +#include "llscreenchannel.h" +#include "llscrollcontainer.h" + +#include "boost/shared_ptr.hpp" + + + +class LLSysWellWindow : public LLFloater +{ +	friend class LLFloaterReg; + +public: +    LLSysWellWindow(const LLSD& key); +    ~LLSysWellWindow(); +	BOOL postBuild(); + +	// change attributes +	void setChannel(LLNotificationsUI::LLScreenChannel*	channel) {mChannel = channel;} + +	// Operating with items +	void addItem(LLSysWellItem::Params p); +    void clear( void ); +	void removeItemByID(const LLUUID& id); +	S32	 findItemByID(const LLUUID& id); + +	// Operating with outfit +	virtual void setVisible(BOOL visible); +	void adjustWindowPosition(); + +	// Handlers +	void onItemClick(LLSysWellItem* item); +	void onItemClose(LLSysWellItem* item); + +private: + +	void onClickCloseBtn(); +	void reshapeWindow(); + +	// pointer to a corresponding channel's instance +	LLNotificationsUI::LLScreenChannel*	mChannel; + +	LLButton*				mCloseBtn; +	LLScrollContainer*		mScrollContainer; +	LLScrollingPanelList*	mNotificationList; +}; + +#endif // LL_LLSYSWELLWINDOW_H + + + diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index 8a7c7708b9..a67ef85f87 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -41,36 +41,61 @@  using namespace LLNotificationsUI;  //-------------------------------------------------------------------------- -LLToast::LLToast(LLPanel* panel) :  -				    LLFloater(LLSD()),  -					mTimerValue(5),   -					mIsViewed(false),  -					mPanel(panel),  -					mCanFade(true), -					mHideBtn(NULL), -					mIsModal(false), -					mCanBeStored(true), -					mHideBtnPressed(false) +LLToast::LLToast(LLToast::Params p) :	LLFloater(LLSD()),  +										mPanel(p.panel),  +										mTimerValue(p.timer_period),   +										mID(p.id),   +										mCanFade(p.can_fade), +										mCanBeStored(p.can_be_stored), +										mHideBtnEnabled(p.enable_hide_btn), +										mIsModal(p.is_modal), +										mIsTipNotification(p.is_tip), +										mHideBtn(NULL), +										mNotification(p.notification), +										mIsViewed(false),  +										mHideBtnPressed(false)  { -	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_toast.xml"); +	LLUICtrlFactory::getInstance()->buildFloater(this, "panel_toast.xml", NULL); -	mHideBtn = getChild<LLButton>("hide_btn"); -	if(mHideBtn) +	if(mPanel) +	{ +		insertPanel(mPanel); +	} + +	if(mHideBtnEnabled)  	{ +		mHideBtn = getChild<LLButton>("hide_btn");  		mHideBtn->setClickedCallback(boost::bind(&LLToast::hide,this));  	} -	if(mPanel) + +	if(mIsModal)  	{ -		arrange(mPanel); +		gFocusMgr.setMouseCapture( this ); +		gFocusMgr.setTopCtrl( this ); +		setFocus(TRUE);  	} -	// disable unnecessary Floater's functionality -	setTitleVisible(FALSE); -	setCanMinimize(FALSE); -	setCanClose(FALSE); -	setCanTearOff(FALSE); -	setCanResize(FALSE); -	setCanDrag(FALSE); + +	if(!p.on_toast_destroy.empty()) +		mOnToastDestroy.connect(p.on_toast_destroy); + +	if(!p.on_mouse_enter.empty()) +		mOnMousEnter.connect(p.on_mouse_enter); +} + +//-------------------------------------------------------------------------- +BOOL LLToast::postBuild() +{ +	if(mCanFade) +	{ +		mTimer.start(); +	} +	else +	{ +		mTimer.stop(); +	} + +	return TRUE;  }  //-------------------------------------------------------------------------- @@ -124,7 +149,7 @@ void LLToast::hide()  	setVisible(FALSE);  	mIsViewed = false;  	mTimer.stop(); -	mOnFade(this, LLSD()); +	mOnFade(this);  }  //-------------------------------------------------------------------------- @@ -142,12 +167,12 @@ void LLToast::tick()  	{  		setVisible(FALSE);  		mTimer.stop(); -		mOnFade(this, LLSD());  +		mOnFade(this);   	}  }  //-------------------------------------------------------------------------- -void LLToast::arrange(LLPanel* panel) +void LLToast::insertPanel(LLPanel* panel)  {  	LLRect panel_rect, toast_rect; @@ -213,13 +238,12 @@ void LLToast::onMouseEnter(S32 x, S32 y, MASK mask)  	sendChildToFront(mHideBtn);  	if(mHideBtn && mHideBtn->getEnabled())  		mHideBtn->setVisible(TRUE); -	mOnMousEnter(this, LLSD()); +	mOnMousEnter(this);  }  //--------------------------------------------------------------------------  void LLToast::onMouseLeave(S32 x, S32 y, MASK mask)  {	 -	llinfos << "MOUSE LEAVE: x = " << x << "y = " << y << llendl;  	mOnToastHover(this, MOUSE_LEAVE);  	if(mCanFade && !mIsViewed) @@ -249,5 +273,26 @@ BOOL LLToast::handleMouseDown(S32 x, S32 y, MASK mask)  	return LLFloater::handleMouseDown(x, y, mask);  } +//-------------------------------------------------------------------------- +void LLToast::discardNotification() +{ +	if(mNotification) +	{ +		mNotification->setIgnored(TRUE); +		mNotification->respond(mNotification->getResponseTemplate()); +	} +} + +//-------------------------------------------------------------------------- +bool LLToast::getIsNotificationUnResponded() +{ +	if(mNotification) +	{ +		return !mNotification->isRespondedTo(); +	} +	return false; +} + +//-------------------------------------------------------------------------- diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h index f998754585..a4dee1e386 100644 --- a/indra/newview/lltoast.h +++ b/indra/newview/lltoast.h @@ -37,7 +37,9 @@  #include "llpanel.h"  #include "llfloater.h"  #include "lltimer.h" -#include "lldate.h" +#include "llnotifications.h" + +#include "llviewercontrol.h"  #define MOUSE_LEAVE false  #define MOUSE_ENTER true @@ -52,53 +54,108 @@ namespace LLNotificationsUI  class LLToast : public LLFloater  {  public: -	LLToast(LLPanel* panel); +	typedef boost::function<void (LLToast* toast)> toast_callback_t; +	typedef boost::signals2::signal<void (LLToast* toast)> toast_signal_t; + +	struct Params :	public LLInitParam::Block<Params, LLFloater::Params> +	{ +		LLPanel*			panel; +		LLUUID				id;	 //notification or message ID +		LLNotificationPtr	notification; +		F32					timer_period; +		toast_callback_t	on_toast_destroy; +		toast_callback_t	on_mouse_enter; +		bool				can_fade; +		bool				can_be_stored; +		bool				enable_hide_btn; +		bool				is_modal; +		bool				is_tip; + +		Params() :	can_fade(true), +					can_be_stored(true), +					is_modal(false), +					is_tip(false), +					enable_hide_btn(true), +					panel(NULL), +					timer_period(gSavedSettings.getS32("NotificationToastTime")) + +		{}; +	}; + +	LLToast(LLToast::Params p);  	virtual ~LLToast(); +	BOOL postBuild(); +	// Toast handlers  	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); -	// -	bool isViewed() { return mIsViewed; } -	 -	void setCanFade(bool can_fade); +	virtual void onMouseEnter(S32 x, S32 y, MASK mask); +	virtual void onMouseLeave(S32 x, S32 y, MASK mask); +	// Operating with toasts +	// insert a panel to a toast +	void insertPanel(LLPanel* panel); +	// get toast's panel +	LLPanel* getPanel() { return mPanel; } +	// discard notification +	void discardNotification(); +	// enable/disable Toast's Hide button  	void setHideButtonEnabled(bool enabled); - -	void setCanBeStored(bool can_be_stored) { mCanBeStored = can_be_stored; } -	bool getCanBeStored() { return mCanBeStored; } -	// +	// initialize and start Toast's timer  	void setAndStartTimer(F32 period); -	// +	//   	void resetTimer() { mTimer.start(); } +	//  	void stopTimer() { mTimer.stop(); } +	//  	void close() { die(); } +	//  	virtual void draw(); +	//  	virtual void setVisible(BOOL show); -	virtual void onMouseEnter(S32 x, S32 y, MASK mask); -	virtual void onMouseLeave(S32 x, S32 y, MASK mask); +	//  	virtual void hide(); -	LLPanel* getPanel() { return mPanel; } -	void arrange(LLPanel* panel); + + + +	// get/set Toast's flags or states +	// get information whether the notification corresponding to the toast is responded or not +	bool getIsNotificationUnResponded(); +	// +	bool isViewed() { return mIsViewed; } +	// +	void setCanFade(bool can_fade); +	// +	void setCanBeStored(bool can_be_stored) { mCanBeStored = can_be_stored; } +	// +	bool getCanBeStored() { return mCanBeStored; } +	//  	void setModal(bool modal);  	// Registers callbacks for events -	boost::signals2::connection setOnFadeCallback(commit_callback_t cb) { return mOnFade.connect(cb); } -	boost::signals2::connection setOnMouseEnterCallback(commit_callback_t cb) { return mOnMousEnter.connect(cb); } -	boost::signals2::connection setOnToastDestroyCallback(commit_callback_t cb) { return mOnToastDestroy.connect(cb); } +	toast_signal_t mOnFade; +	toast_signal_t mOnMousEnter; +	toast_signal_t mOnToastDestroy; +	boost::signals2::connection setOnFadeCallback(toast_callback_t cb) { return mOnFade.connect(cb); } +	boost::signals2::connection setOnMouseEnterCallback(toast_callback_t cb) { return mOnMousEnter.connect(cb); } +	boost::signals2::connection setOnToastDestroyCallback(toast_callback_t cb) { return mOnToastDestroy.connect(cb); } +  	typedef boost::function<void (LLToast* toast, bool mouse_enter)> toast_hover_check_callback_t;  	typedef boost::signals2::signal<void (LLToast* toast, bool mouse_enter)> toast_hover_check_signal_t;  	toast_hover_check_signal_t mOnToastHover;	  	boost::signals2::connection setOnToastHoverCallback(toast_hover_check_callback_t cb) { return mOnToastHover.connect(cb); } -	commit_signal_t mOnFade; -	commit_signal_t mOnMousEnter; -	commit_signal_t mOnToastDestroy;  private: +	// check timer  	bool	timerHasExpired(); +	// on timer finished function  	void	tick(); +	LLUUID				mID; +	LLNotificationPtr	mNotification; +  	LLTimer		mTimer;  	F32			mTimerValue; @@ -107,9 +164,11 @@ private:  	LLColor4	mBgColor;  	bool		mIsViewed; +	bool		mIsTipNotification;  	bool		mCanFade;  	bool		mIsModal;  	bool		mCanBeStored; +	bool		mHideBtnEnabled;  	bool		mHideBtnPressed;  }; diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index f5ed7f8710..8a61f6cfda 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -44,7 +44,6 @@  #include "lluiconstants.h"  #include "llui.h"  #include "llviewercontrol.h" -#include "llfloatergroupinfo.h"  #include "lltrans.h"  #include "llinitparam.h" @@ -76,14 +75,14 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification  	const std::string& from_name = payload["sender_name"].asString();  	std::stringstream from;  	from << from_name << "/" << groupData.mName; -	LLTextBox* pTitleText = this->getChild<LLTextBox>("title", TRUE, FALSE); +	LLTextBox* pTitleText = this->getChild<LLTextBox>("title");  	pTitleText->setValue(from.str());  	//message body  	const std::string& subject = payload["subject"].asString();  	const std::string& message = payload["message"].asString(); -	LLTextEditor* pMessageText = getChild<	LLTextEditor>("message", TRUE, FALSE); +	LLTextEditor* pMessageText = getChild<	LLTextEditor>("message");  	pMessageText->setValue("");  	pMessageText->setEnabled(FALSE);  	pMessageText->setTakesFocus(FALSE); @@ -113,7 +112,7 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification  	//attachment  	BOOL hasInventory = payload["inventory_offer"].isDefined(); -	LLTextBox * pAttachLink = getChild<LLTextBox>("attachment", TRUE, FALSE); +	LLTextBox * pAttachLink = getChild<LLTextBox>("attachment");  	pAttachLink->setVisible(hasInventory);  	if (hasInventory) {  		pAttachLink->setValue(payload["inventory_name"]); @@ -130,7 +129,7 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification  	}  	//ok button -	LLButton* pOkBtn = getChild<LLButton>("btn_ok", TRUE, FALSE); +	LLButton* pOkBtn = getChild<LLButton>("btn_ok");  	pOkBtn->setClickedCallback((boost::bind(&LLToastGroupNotifyPanel::onClickOk, this)));  	setDefaultBtn(pOkBtn);  } @@ -167,8 +166,7 @@ void LLToastGroupNotifyPanel::onClickAttachment()  	if (mInventoryOffer != NULL) {  		mInventoryOffer->forceResponse(IOR_ACCEPT); -		LLTextBox * pAttachLink = getChild<LLTextBox> ("attachment", TRUE, -				FALSE); +		LLTextBox * pAttachLink = getChild<LLTextBox> ("attachment");  		static const LLUIColor textColor = LLUIColorTable::instance().getColor(  				"GroupNotifyDimmedTextColor");  		pAttachLink->setColor(textColor); diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp index 79a7d45bbf..c39bac97a8 100644 --- a/indra/newview/lltoastpanel.cpp +++ b/indra/newview/lltoastpanel.cpp @@ -34,9 +34,28 @@  #include "lltoastpanel.h" -LLToastPanel::LLToastPanel(LLNotificationPtr& notification) { +LLToastPanel::LLToastPanel(LLNotificationPtr& notification)  +{  	mNotification = notification;  } -LLToastPanel::~LLToastPanel() { +LLToastPanel::~LLToastPanel()  +{  } + +std::string LLToastPanel::getTitle() +{ +// *TODO: localize header of Title +/*	std::string title; +	std::string notification_type = mNotification->getType(); + +	if( notification_type == "groupnotify" ) +	{ +		title = LLTrans::getString("TitleGroup"); +	} +*/ +	return (mNotification->getName() + "\n" + mNotification->getMessage()); +} + + + diff --git a/indra/newview/lltoastpanel.h b/indra/newview/lltoastpanel.h index 82e2a74672..2258eca273 100644 --- a/indra/newview/lltoastpanel.h +++ b/indra/newview/lltoastpanel.h @@ -36,6 +36,8 @@  #include "llpanel.h"  #include "llnotifications.h" +#include <string> +  /**   * Base class for all panels that can be added to the toast.   * All toast panels should contain necessary logic for representing certain notification @@ -46,6 +48,9 @@ class LLToastPanel: public LLPanel {  public:  	LLToastPanel(LLNotificationPtr&);  	virtual ~LLToastPanel() = 0; + +	virtual std::string getTitle(); +	virtual const LLUUID& getID() { return mNotification->id();}  protected:  	LLNotificationPtr mNotification;  }; diff --git a/indra/newview/llurllineeditorctrl.cpp b/indra/newview/llurllineeditorctrl.cpp new file mode 100644 index 0000000000..046b3e619b --- /dev/null +++ b/indra/newview/llurllineeditorctrl.cpp @@ -0,0 +1,97 @@ +/**  + * @file llurllineeditorctrl.cpp + * @brief LLURLLineEditor base class + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + *  + * Copyright (c) 2001-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 "llclipboard.h" +#include "lluictrlfactory.h" + +#include "llurllineeditorctrl.h" + +#include "llweb.h" + +//Constructor +LLURLLineEditor::LLURLLineEditor(const LLLineEditor::Params& p) +: LLLineEditor(p){ + +} + +// copy selection to clipboard +void LLURLLineEditor::copy() +{ +	if( canCopy() ) +	{ +		copyEscapedURLToClipboard(); +	} +} + +// cut selection to clipboard +void LLURLLineEditor::cut() +{ +	if( canCut() ) +	{ +		// Prepare for possible rollback +		LLURLLineEditorRollback rollback( this ); + +		copyEscapedURLToClipboard(); + +		deleteSelection(); + +		// Validate new string and rollback the if needed. +		BOOL need_to_rollback = ( mPrevalidateFunc && !mPrevalidateFunc( mText.getWString() ) ); +		if( need_to_rollback ) +		{ +			rollback.doRollback( this ); +			reportBadKeystroke(); +		} +		else +		if( mKeystrokeCallback ) +		{ +			mKeystrokeCallback( this ); +		} +	} +} +// Copies escaped URL to clipboard +void LLURLLineEditor::copyEscapedURLToClipboard() +{ +	S32 left_pos = llmin( mSelectionStart, mSelectionEnd ); +	S32 length = llabs( mSelectionStart - mSelectionEnd ); + +	const std::string unescaped_text = wstring_to_utf8str(mText.getWString().substr(left_pos, length)); +	LLWString selected_escaped_text = utf8str_to_wstring(LLWeb::escapeURL(unescaped_text)); +	gClipboard.copyFromString( selected_escaped_text ); +} +// Makes UISndBadKeystroke sound +void LLURLLineEditor::reportBadKeystroke() +{ +	make_ui_sound("UISndBadKeystroke"); +} diff --git a/indra/newview/llurllineeditorctrl.h b/indra/newview/llurllineeditorctrl.h new file mode 100644 index 0000000000..618f29dfbf --- /dev/null +++ b/indra/newview/llurllineeditorctrl.h @@ -0,0 +1,100 @@ +/**  + * @file llurllineeditorctrl.h + * @brief Combobox-like location input control + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + *  + * Copyright (c) 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 LLURLLINEEDITOR_H_ +#define LLURLLINEEDITOR_H_ + +#include "linden_common.h" + +#include "lllineeditor.h" +#include "lluictrl.h" + +// LLURLLineEditor class performing escaping of an URL while copying or cutting the target text +class LLURLLineEditor: public LLLineEditor { +	LOG_CLASS( LLURLLineEditor); + +public: +	// LLLineEditor overrides to do necessary escaping +	/*virtual*/		void copy(); +	/*virtual*/ 	void cut(); + +protected: +	LLURLLineEditor(const Params&); +	friend class LLUICtrlFactory; +	friend class LLFloaterEditUI; + +private: +	// util function to escape selected text and copy it to clipboard +	void 			copyEscapedURLToClipboard(); +	// send a beep signal if keystroke is bad. As it is private at LLLineEditor we need own function +	void			reportBadKeystroke(); + +	// Helper class to do rollback if needed +	class LLURLLineEditorRollback +	{ +	public: +		LLURLLineEditorRollback( LLURLLineEditor* ed ) +			: +			mCursorPos( ed->mCursorPos ), +			mScrollHPos( ed->mScrollHPos ), +			mIsSelecting( ed->mIsSelecting ), +			mSelectionStart( ed->mSelectionStart ), +			mSelectionEnd( ed->mSelectionEnd ) +		{ +			mText = ed->getText(); +		} + +		void doRollback( LLURLLineEditor* ed ) +		{ +			ed->mCursorPos = mCursorPos; +			ed->mScrollHPos = mScrollHPos; +			ed->mIsSelecting = mIsSelecting; +			ed->mSelectionStart = mSelectionStart; +			ed->mSelectionEnd = mSelectionEnd; +			ed->mText = mText; +			ed->mPrevText = mText; +		} + +		std::string getText()   { return mText; } + +	private: +		std::string mText; +		S32		mCursorPos; +		S32		mScrollHPos; +		BOOL	mIsSelecting; +		S32		mSelectionStart; +		S32		mSelectionEnd; +	}; // end class LLURLLineEditorRollback + +}; + +#endif /* LLURLLINEEDITOR_H_ */ diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 30c97cdfa3..4640745e8c 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -49,6 +49,7 @@  #include "llsky.h"  #include "llvieweraudio.h" +#include "llviewermenu.h"  #include "llviewertexturelist.h"  #include "llviewerthrottle.h"  #include "llviewerwindow.h" @@ -599,6 +600,8 @@ void settings_setup_listeners()  	gSavedSettings.getControl("AudioLevelMic")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _2));  	gSavedSettings.getControl("LipSyncEnabled")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _2));	  	gSavedSettings.getControl("VelocityInterpolate")->getSignal()->connect(boost::bind(&handleVelocityInterpolate, _2)); +	gSavedSettings.getControl("QAMode")->getSignal()->connect(boost::bind(&show_debug_menus)); +	gSavedSettings.getControl("UseDebugMenus")->getSignal()->connect(boost::bind(&show_debug_menus));  }  #if TEST_CACHED_CONTROL diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 9c29131def..c1915d2ead 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -40,7 +40,6 @@  #include "llcompilequeue.h"  #include "llfloaterabout.h"  #include "llfloateractivespeakers.h" -#include "llfloateraddlandmark.h"  #include "llfloateranimpreview.h"  #include "llfloaterauction.h"  #include "llfloateravatarpicker.h" @@ -64,7 +63,6 @@  #include "llfloaterfonttest.h"  #include "llfloatergesture.h"  #include "llfloatergodtools.h" -#include "llfloatergroupinfo.h"  #include "llfloatergroups.h"  #include "llfloaterhardwaresettings.h"  #include "llfloaterhtmlcurrency.h" @@ -114,12 +112,12 @@  #include "llpreviewanim.h"  #include "llpreviewgesture.h" -#include "llpreviewlandmark.h"  #include "llpreviewnotecard.h"  #include "llpreviewscript.h"  #include "llpreviewsound.h"  #include "llpreviewtexture.h"  #include "llfloaterminiinspector.h" +#include "llsyswellwindow.h"  //class LLLLFloaterObjectIMInfo; @@ -129,7 +127,6 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("about_land", "floater_about_land.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLand>);  	LLFloaterReg::add("active_speakers", "floater_active_speakers.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterActiveSpeakers>); -	LLFloaterReg::add("add_landmark", "floater_add_landmark.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAddLandmark>);  	LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>);  	LLFloaterReg::add("avatar_picker", "floater_avatar_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarPicker>);  	LLFloaterReg::add("avatar_textures", "floater_avatar_textures.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarTextures>); @@ -162,7 +159,6 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("gestures", "floater_gesture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGesture>);  	LLFloaterReg::add("god_tools", "floater_god_tools.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGodTools>); -	LLFloaterReg::add("group_info", "floater_groupinfo.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGroupInfo>);  	LLFloaterReg::add("group_picker", "floater_choose_group.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGroupPicker>);  	LLFloaterReg::add("hud", "floater_hud.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHUD>); @@ -184,6 +180,7 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("mute_object", "floater_mute_object.xml", &LLFloaterMute::buildFloaterMuteObjectUI);  	LLFloaterReg::add("mini_map", "floater_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMap>);  	LLFloaterReg::add("mini_inspector", "panel_mini_inspector.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMiniInspector>); +	LLFloaterReg::add("syswell_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLSysWellWindow>);  	LLFloaterReg::add("notifications_console", "floater_notifications_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationConsole>);  	LLFloaterReg::add("nearby_chat", "floater_nearby_chat.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNearbyChat>); @@ -203,7 +200,6 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("pref_voicedevicesettings", "floater_device_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVoiceDeviceSettings>);  	LLFloaterReg::add("preview_anim", "floater_preview_animation.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewAnim>, "preview");  	LLFloaterReg::add("preview_gesture", "floater_preview_gesture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewGesture>, "preview"); -	LLFloaterReg::add("preview_landmark", "floater_preview_existing_landmark.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewLandmark>, "preview");  	LLFloaterReg::add("preview_notecard", "floater_preview_notecard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewNotecard>, "preview");  	LLFloaterReg::add("preview_script", "floater_script_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewLSL>, "preview");  	LLFloaterReg::add("preview_scriptedit", "floater_live_lsleditor.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLLiveLSLEditor>, "preview"); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index bb14a619c5..78e8f084c7 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -37,6 +37,7 @@  #include "indra_constants.h"  #include "llagent.h" +#include "llfoldertype.h"  #include "llviewercontrol.h"  #include "llconsole.h"  #include "llinventorymodel.h" @@ -587,6 +588,79 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const  	return true;  } +void LLViewerInventoryCategory::determineFolderType() +{ +	LLAssetType::EType original_type = getPreferredType(); +	if (LLAssetType::lookupIsProtectedCategoryType(original_type)) +		return; + +	U64 folder_valid = 0; +	U64 folder_invalid = 0; +	LLInventoryModel::cat_array_t category_array; +	LLInventoryModel::item_array_t item_array; +	gInventory.collectDescendents(getUUID(),category_array,item_array,FALSE); + +	// For ensembles +	if (category_array.empty()) +	{ +		for (LLInventoryModel::item_array_t::iterator item_iter = item_array.begin(); +			 item_iter != item_array.end(); +			 item_iter++) +		{ +			const LLViewerInventoryItem *item = (*item_iter); +			if (item->getIsLinkType()) +				return; +			if (item->getInventoryType() == LLInventoryType::IT_WEARABLE) +			{ +				U32 flags = item->getFlags(); +				if (flags > WT_COUNT) +					return; +				const EWearableType wearable_type = EWearableType(flags); +				const std::string& wearable_name = LLWearableDictionary::getTypeName(wearable_type); +				U64 valid_folder_types = LLFolderType::lookupValidFolderTypes(wearable_name); +				folder_valid |= valid_folder_types; +				folder_invalid |= ~valid_folder_types; +			} +		} +		for (U8 i = LLAssetType::AT_FOLDER_ENSEMBLE_START; i <= LLAssetType::AT_FOLDER_ENSEMBLE_END; i++) +		{ +			if ((folder_valid & (1LL << i)) && +				!(folder_invalid & (1LL << i))) +			{ +				changeType((LLAssetType::EType)i); +				return; +			} +		} +	} +	if (LLAssetType::lookupIsEnsembleCategoryType(original_type)) +	{ +		changeType(LLAssetType::AT_NONE); +	} +} + +void LLViewerInventoryCategory::changeType(LLAssetType::EType new_folder_type) +{ +	const LLUUID &folder_id = getUUID(); +	const LLUUID &parent_id = getParentUUID(); +	const std::string &name = getName(); +		 +	LLMessageSystem* msg = gMessageSystem; +	msg->newMessageFast(_PREHASH_UpdateInventoryFolder); +	msg->nextBlockFast(_PREHASH_AgentData); +	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); +	msg->nextBlockFast(_PREHASH_FolderData); +	msg->addUUIDFast(_PREHASH_FolderID, folder_id); +	msg->addUUIDFast(_PREHASH_ParentID, parent_id); +	msg->addS8Fast(_PREHASH_Type, new_folder_type); +	msg->addStringFast(_PREHASH_Name, name); +	gAgent.sendReliableMessage(); + +	setPreferredType(new_folder_type); +	gInventory.addChangedMask(LLInventoryObserver::LABEL, folder_id); +	gInventory.updateLinkedObjects(folder_id);	 +} +  ///----------------------------------------------------------------------------  /// Local function definitions  ///---------------------------------------------------------------------------- @@ -728,6 +802,16 @@ void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id,  	gAgent.sendReliableMessage();  } +void create_inventory_callingcard(const LLUUID& avatar_id) +{ +	std::string item_desc = avatar_id.asString(); +	std::string item_name; +	gCacheName->getFullName(avatar_id, item_name); +	create_inventory_item(gAgent.getID(), gAgent.getSessionID(), +						  LLUUID::null, LLTransactionID::tnull, item_name, item_desc, LLAssetType::AT_CALLINGCARD, +						  LLInventoryType::IT_CALLINGCARD, NOT_WEARABLE, PERM_MOVE | PERM_TRANSFER, NULL); +} +  void copy_inventory_item(  	const LLUUID& agent_id,  	const LLUUID& current_owner, @@ -870,16 +954,23 @@ void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, co  {  	std::string type = userdata.asString(); -	if ("category" == type) +	if (("category" == type) || ("current" == type) || ("outfit" == type) || ("my_otfts" == type) )  	{ +		LLAssetType::EType a_type = LLAssetType::AT_NONE; +		if ("current" == type) +			a_type = LLAssetType::AT_CURRENT_OUTFIT; +		if ("outfit" == type) +			a_type = LLAssetType::AT_OUTFIT; +		if ("my_otfts" == type) +			a_type = LLAssetType::AT_MY_OUTFITS;  		LLUUID category;  		if (bridge)  		{ -			category = gInventory.createNewCategory(bridge->getUUID(), LLAssetType::AT_NONE, LLStringUtil::null); +			category = gInventory.createNewCategory(bridge->getUUID(), a_type, LLStringUtil::null);  		}  		else  		{ -			category = gInventory.createNewCategory(gInventory.getRootFolderID(), LLAssetType::AT_NONE, LLStringUtil::null); +			category = gInventory.createNewCategory(gInventory.getRootFolderID(), a_type, LLStringUtil::null);  		}  		gInventory.notifyObservers();  		folder->setSelectionByID(category, TRUE); @@ -1019,6 +1110,11 @@ const std::string& LLViewerInventoryItem::getName() const  const LLPermissions& LLViewerInventoryItem::getPermissions() const  { +	if (const LLViewerInventoryItem *linked_item = getLinkedItem()) +	{ +		return linked_item->getPermissions(); +	} +  	// Use the actual permissions of the symlink, not its parent.  	return LLInventoryItem::getPermissions();	  } @@ -1060,6 +1156,13 @@ LLInventoryType::EType LLViewerInventoryItem::getInventoryType() const  		return linked_item->getInventoryType();  	} +	// Categories don't have types.  If this item is an AT_FOLDER_LINK, +	// treat it as a category. +	if (getLinkedCategory()) +	{ +		return LLInventoryType::IT_CATEGORY; +	} +  	return LLInventoryItem::getInventoryType();  } @@ -1069,7 +1172,6 @@ U32 LLViewerInventoryItem::getFlags() const  	{  		return linked_item->getFlags();  	} -  	return LLInventoryItem::getFlags();  } @@ -1102,3 +1204,13 @@ const LLViewerInventoryCategory *LLViewerInventoryItem::getLinkedCategory() cons  	}  	return NULL;  } + +//---------- + +void LLViewerInventoryItem::onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name) +{ +	rename(first_name + " " + last_name); +	gInventory.addChangedMask(LLInventoryObserver::LABEL, getUUID()); +	gInventory.notifyObservers(); +} + diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 5198f5efc7..10309d023b 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -48,7 +48,7 @@ class LLViewerInventoryCategory;  // their inventory.  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLViewerInventoryItem : public LLInventoryItem +class LLViewerInventoryItem : public LLInventoryItem, public boost::signals2::trackable  {  public:  	typedef LLDynamicArray<LLPointer<LLViewerInventoryItem> > item_array_t; @@ -144,6 +144,10 @@ public:  	const LLViewerInventoryItem *getLinkedItem() const;  	const LLViewerInventoryCategory *getLinkedCategory() const; +	// callback +	void onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name); +	 +public:  	BOOL mIsComplete;  	LLTransactionID mTransactionID;  }; @@ -202,7 +206,8 @@ public:  	// other than cacheing.  	bool exportFileLocal(LLFILE* fp) const;  	bool importFileLocal(LLFILE* fp); - +	void determineFolderType(); +	void changeType(LLAssetType::EType new_folder_type);  protected:  	LLUUID mOwnerID;  	S32 mVersion; @@ -271,6 +276,7 @@ extern LLInventoryCallbackManager gInventoryCallbacks;  #define NOT_WEARABLE (EWearableType)0 +// *TODO: Find a home for these  void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id,  						   const LLUUID& parent, const LLTransactionID& transaction_id,  						   const std::string& name, @@ -279,6 +285,8 @@ void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id,  						   U32 next_owner_perm,  						   LLPointer<LLInventoryCallback> cb); +void create_inventory_callingcard(const LLUUID& avatar_id); +  /**   * @brief Securely create a new inventory item by copying from another.   */ diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index eb676d3188..a6157aa1e0 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -102,7 +102,6 @@  #include "llfloaterfonttest.h"  #include "llfloatergesture.h"  #include "llfloatergodtools.h" -#include "llfloatergroupinfo.h"  #include "llfloatergroupinvite.h"  #include "llfloatergroups.h"  #include "llfloaterhtml.h" @@ -5106,19 +5105,20 @@ void print_agent_nvpairs(void*)  void show_debug_menus()  { -	// this can get called at login screen where there is no menu so only toggle it if one exists +	// this might get called at login screen where there is no menu so only toggle it if one exists  	if ( gMenuBarView )  	{  		BOOL debug = gSavedSettings.getBOOL("UseDebugMenus"); +		BOOL qamode = gSavedSettings.getBOOL("QAMode");  		gMenuBarView->setItemVisible("Advanced", debug); -		gMenuBarView->setItemEnabled("Advanced", debug); +// 		gMenuBarView->setItemEnabled("Advanced", debug); // Don't disable Advanced keyboard shortcuts when hidden -		gMenuBarView->setItemVisible("Debug", debug); -		gMenuBarView->setItemEnabled("Debug", debug); +		gMenuBarView->setItemVisible("Debug", qamode); +		gMenuBarView->setItemEnabled("Debug", qamode); -		gMenuBarView->setItemVisible("Develop", debug); -		gMenuBarView->setItemEnabled("Develop", debug); +		gMenuBarView->setItemVisible("Develop", qamode); +		gMenuBarView->setItemEnabled("Develop", qamode);  		// Server ('Admin') menu hidden when not in godmode.  		const bool show_server_menu = debug && (gAgent.getGodLevel() > GOD_NOT); @@ -5280,9 +5280,7 @@ class LLWorldCreateLandmark : public view_listener_t  	bool handleEvent(const LLSD& userdata)  	{  		LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark")); -			 -		// Floater "Add Landmark" functionality moved to Side Tray -		//LLFloaterReg::showInstance("add_landmark"); +  		return true;  	}  }; @@ -5373,6 +5371,19 @@ class LLAvatarAddFriend : public view_listener_t  	}  }; +class LLAvatarAddContact : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); +		if(avatar) +		{ +			create_inventory_callingcard(avatar->getID()); +		} +		return true; +	} +}; +  bool complete_give_money(const LLSD& notification, const LLSD& response, LLObjectSelectionHandle handle)  {  	S32 option = LLNotification::getSelectedOption(notification, response); @@ -7931,6 +7942,7 @@ void initialize_menus()  	 // Avatar pie menu  	view_listener_t::addMenu(new LLObjectMute(), "Avatar.Mute");  	view_listener_t::addMenu(new LLAvatarAddFriend(), "Avatar.AddFriend"); +	view_listener_t::addMenu(new LLAvatarAddContact(), "Avatar.AddContact");  	view_listener_t::addMenu(new LLAvatarFreeze(), "Avatar.Freeze");  	view_listener_t::addMenu(new LLAvatarDebug(), "Avatar.Debug");  	view_listener_t::addMenu(new LLAvatarVisibleDebug(), "Avatar.VisibleDebug"); diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index e8d350b0b6..cf482266d6 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -49,6 +49,7 @@ void init_menus();  void cleanup_menus();  void show_debug_menus(); // checks for if menus should be shown first. +void toggle_debug_menus(void*);  void show_context_menu( S32 x, S32 y, MASK mask );  void show_build_mode_context_menu(S32 x, S32 y, MASK mask);  BOOL enable_save_into_inventory(void*); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index f8b6e0f687..5849a40726 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -78,7 +78,6 @@  #include "llfloaterbuycurrency.h"  #include "llfloaterbuyland.h"  #include "llfloaterchat.h" -#include "llfloatergroupinfo.h"  #include "llfloaterimagepreview.h"  #include "llfloaterland.h"  #include "llfloaterregioninfo.h" @@ -136,6 +135,7 @@  #include "llfloaterworldmap.h"  #include "llviewerdisplay.h"  #include "llkeythrottle.h" +#include "llgroupactions.h"  #include <boost/tokenizer.hpp>  #include <boost/algorithm/string/split.hpp> @@ -640,7 +640,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)  	if (option == 2 && !group_id.isNull())  	{ -		LLFloaterGroupInfo::showFromUUID(group_id); +		LLGroupActions::show(group_id);  		LLSD args;  		args["MESSAGE"] = message;  		LLNotifications::instance().add("JoinGroup", args, notification["payload"]); @@ -1743,7 +1743,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			// Also send down the old path for now.  			if (IM_GROUP_NOTICE_REQUESTED == dialog)  			{ -				LLFloaterGroupInfo::showNotice(subj,mes,group_id,has_inventory,item_name,info); +				 +				LLPanelGroup::showNotice(subj,mes,group_id,has_inventory,item_name,info);  			}  		}  		break; diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index ae3b50abe4..b7f6cacc0e 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -45,7 +45,6 @@  // Viewer includes  #include "llagent.h" -#include "llfloatergroupinfo.h"  #include "llviewerwindow.h"  #include "llviewercontrol.h"  #include "llfirstuse.h" diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index afee30293a..9e0713b494 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -50,7 +50,6 @@  #include "llpreview.h"  #include "llpreviewtexture.h"  #include "llpreviewnotecard.h" -#include "llpreviewlandmark.h"  #include "llscrollbar.h"  #include "llsidetray.h"  #include "lltooldraganddrop.h" @@ -1377,12 +1376,6 @@ void LLViewerTextEditor::openEmbeddedLandmark( LLInventoryItem* item, llwchar wc  	{  		panel->setItem(item);  	} - -//	LLPreviewLandmark* preview = LLFloaterReg::showTypedInstance<LLPreviewLandmark>("preview_landmark", LLSD(item->getUUID()), TAKE_FOCUS_YES); -//	if (preview) -//	{ -//		preview->setItem( item ); -//	}  }  void LLViewerTextEditor::openEmbeddedNotecard( LLInventoryItem* item, llwchar wc ) diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index b4838db690..2aa8e4d314 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -45,6 +45,7 @@  #include "llfloaterreg.h"  #include "llpanellogin.h"  #include "llviewerkeyboard.h" +#include "llviewermenu.h"  #include "llviewerwindow.h"  #include "llviewquery.h" @@ -256,8 +257,6 @@ std::string	LLViewerWindow::sSnapshotDir;  std::string	LLViewerWindow::sMovieBaseName; -extern void toggle_debug_menus(void*); -  class RecordToChatConsole : public LLError::Recorder, public LLSingleton<RecordToChatConsole>  {  public: @@ -1566,9 +1565,6 @@ void LLViewerWindow::initWorldUI()  	getRootView()->sendChildToFront(gSnapshotFloaterView);  	// new bottom panel -	getRootView()->addChild(LLBottomTray::getInstance()); -	// Make sure Bottom Tray is behind Side Tray regardless "addChild" order. -	getRootView()->sendChildToBack(LLBottomTray::getInstance());  	LLRect rc = LLBottomTray::getInstance()->getRect();  	rc.mLeft = 0;  	rc.mRight = mRootView->getRect().getWidth(); @@ -1641,6 +1637,16 @@ void LLViewerWindow::initWorldUI()  	navbar->translate(0, root_rect.getHeight() - menu_bar_height - navbar->getRect().getHeight()); // FIXME  	navbar->setBackgroundColor(gMenuBarView->getBackgroundColor().get()); +	if (!gSavedSettings.getBOOL("ShowNavbarNavigationPanel")) +	{ +		navbar->showNavigationPanel(FALSE); +	} + +	if (!gSavedSettings.getBOOL("ShowNavbarFavoritesPanel")) +	{ +		navbar->showFavoritesPanel(FALSE); +	} +  	getRootView()->addChild(gStatusBar);  	getRootView()->addChild(navbar); @@ -2912,7 +2918,9 @@ void LLViewerWindow::updateKeyboardFocus()  	{  		if (!cur_focus->isInVisibleChain() || !cur_focus->isInEnabledChain())  		{ -			gFocusMgr.releaseFocusIfNeeded(cur_focus); +            // don't release focus, just reassign so that if being given +            // to a sibling won't call onFocusLost on all the ancestors +			// gFocusMgr.releaseFocusIfNeeded(cur_focus);  			LLUICtrl* parent = cur_focus->getParentUICtrl();  			const LLUICtrl* focus_root = cur_focus->findRootMostFocusRoot(); diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index f1d4520370..2304571cf1 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -1510,6 +1510,7 @@ std::string LLVoiceClientStatusObserver::status2string(LLVoiceClientStatusObserv  		CASE(STATUS_JOINED);  		CASE(STATUS_LEFT_CHANNEL);  		CASE(STATUS_VOICE_DISABLED); +		CASE(STATUS_VOICE_ENABLED);  		CASE(BEGIN_ERROR_STATUS);  		CASE(ERROR_CHANNEL_FULL);  		CASE(ERROR_CHANNEL_LOCKED); @@ -5786,7 +5787,7 @@ bool LLVoiceClient::getMuteMic() const  void LLVoiceClient::setUserPTTState(bool ptt)  {  	mUserPTTState = ptt; -	LLNearbyChatBar::getInstance()->setPTTState(ptt); +	if (LLNearbyChatBar::instanceExists()) LLNearbyChatBar::getInstance()->setPTTState(ptt);  }  bool LLVoiceClient::getUserPTTState() @@ -5797,7 +5798,7 @@ bool LLVoiceClient::getUserPTTState()  void LLVoiceClient::toggleUserPTTState(void)  {  	mUserPTTState = !mUserPTTState; -	LLNearbyChatBar::getInstance()->setPTTState(mUserPTTState); +	if (LLNearbyChatBar::instanceExists()) LLNearbyChatBar::getInstance()->setPTTState(mUserPTTState);  }  void LLVoiceClient::setVoiceEnabled(bool enabled) @@ -5805,15 +5806,21 @@ void LLVoiceClient::setVoiceEnabled(bool enabled)  	if (enabled != mVoiceEnabled)  	{  		mVoiceEnabled = enabled; +		LLVoiceClientStatusObserver::EStatusType status; +  		if (enabled)  		{  			LLVoiceChannel::getCurrentVoiceChannel()->activate(); +			status = LLVoiceClientStatusObserver::STATUS_VOICE_ENABLED;  		}  		else  		{  			// Turning voice off looses your current channel -- this makes sure the UI isn't out of sync when you re-enable it.  			LLVoiceChannel::getCurrentVoiceChannel()->deactivate(); +			status = LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED;  		} + +		notifyStatusObservers(status);  	}  } diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index 8b3bbb68bb..fe99e787da 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -65,6 +65,11 @@ public:  		STATUS_JOINED,  		STATUS_LEFT_CHANNEL,  		STATUS_VOICE_DISABLED, + +		// Adding STATUS_VOICE_ENABLED as pair status for STATUS_VOICE_DISABLED +		// See LLVoiceClient::setVoiceEnabled() +		STATUS_VOICE_ENABLED, +  		BEGIN_ERROR_STATUS,  		ERROR_CHANNEL_FULL,  		ERROR_CHANNEL_LOCKED, diff --git a/indra/newview/skins/default/textures/icons/ForwardArrow_Off.png b/indra/newview/skins/default/textures/icons/ForwardArrow_Off.png Binary files differnew file mode 100644 index 0000000000..e9b72b0401 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/ForwardArrow_Off.png diff --git a/indra/newview/skins/default/textures/icons/ForwardArrow_Press.png b/indra/newview/skins/default/textures/icons/ForwardArrow_Press.png Binary files differnew file mode 100644 index 0000000000..c7b2c769ae --- /dev/null +++ b/indra/newview/skins/default/textures/icons/ForwardArrow_Press.png diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png Binary files differnew file mode 100644 index 0000000000..2dc32a576b --- /dev/null +++ b/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png Binary files differnew file mode 100644 index 0000000000..bea218a2fb --- /dev/null +++ b/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 96d93e7081..1515a34eeb 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -15,6 +15,9 @@    <texture name="Arrow_Right_Off" file_name="navbar/Arrow_Right_Off.png" preload="true"/>    <texture name="Arrow_Right_Press" file_name="navbar/Arrow_Right_Press.png" preload="true"/> +  <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="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" />    <texture name="BackArrow_Press" file_name="icons/BackArrow_Press.png" preload="false" /> @@ -56,9 +59,12 @@    <texture name="FileMenu_BarSelect" file_name="navbar/FileMenu_BarSelect.png" preload="false" />    <texture name="FileMenu_BG" file_name="navbar/FileMenu_BG.png" preload="false" /> +  <texture name="ForwardArrow_Off" file_name="icons/ForwardArrow_Off.png" preload="false" /> +  <texture name="ForwardArrow_Press" file_name="icons/ForwardArrow_Press.png" preload="false" /> +    <texture name="Help_Off" file_name="navbar/Help_Off.png" preload="false"/>    <texture name="Help_Press" file_name="navbar/Help_Press.png" preload="false"/> -   +    <texture name="History_Arrow" file_name="navbar/History_Arrow.png" preload="true"/>    <texture name="Home_Off" file_name="navbar/Home_Off.png" preload="false"/> @@ -110,7 +116,8 @@    <texture name="PushButton_Selected" file_name="widgets/PushButton_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />    <texture name="PushButton_Selected_Press" file_name="widgets/PushButton_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />    <texture name="PushButton_Selected_Disabled" file_name="widgets/PushButton_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> - +   +  <texture name="RadioButton_Press" file_name="widgets/RadioButton_Press.png" preload="true" />    <texture name="RadioButton_On_Press" file_name="widgets/RadioButton_On_Press.png" preload="true" />    <texture name="RadioButton_Off" file_name="widgets/RadioButton_Off.png" preload="true" />    <texture name="RadioButton_On" file_name="widgets/RadioButton_On.png" preload="true" /> @@ -167,6 +174,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="TabIcon_Appearance_Off" file_name="taskpanel/TabIcon_Appearance_Off.png" preload="false" /> +  <texture name="TabIcon_Appearance_Over" file_name="taskpanel/TabIcon_Appearance_Over.png" preload="false"/> +  <texture name="TabIcon_Appearance_Selected" file_name="taskpanel/TabIcon_Appearance_Selected.png" preload="false" />    <texture name="TabIcon_Close_Off" file_name="taskpanel/TabIcon_Close_Off.png" preload="false" />    <texture name="TabIcon_Close_Over" file_name="taskpanel/TabIcon_Close_Over.png" preload="false"/>    <texture name="TabIcon_Home_Off" file_name="taskpanel/TabIcon_Home_Off.png" preload="false" /> @@ -240,7 +250,7 @@    <texture name="Window_Background" file_name="windows/Window_Background.png" preload="true" />    <texture name="Window_Foreground" file_name="windows/Window_Foreground.png" preload="true" /> -  + @@ -249,7 +259,7 @@    <texture name="btn_chatbar.tga" scale.left="20" scale.top="24" scale.right="44" scale.bottom="0"/>    <texture name="btn_chatbar_selected.tga" scale.left="20" scale.top="24" scale.right="44" scale.bottom="0"/> -   +    <texture name="cam_rotate_out.tga" preload="false"/>    <texture name="cam_rotate_in.tga" preload="false"/>    <texture name="cam_zoom_out.tga" preload="false"/> @@ -333,7 +343,7 @@    <texture name="minimize_pressed.tga"	preload="true"/>    <texture name="sm_rounded_corners_simple.tga" scale.left="4" scale.top="4" scale.bottom="4" scale.right="4"/> -  +    <texture name="rounded_square.tga"	file_name="rounded_square.j2c" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" />    <texture name="rounded_square_soft.tga"	file_name="rounded_square_soft.j2c" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16"/> @@ -378,11 +388,14 @@    <texture name="inv_folder_bodypart.tga"/>    <texture name="inv_folder_callingcard.tga"/>    <texture name="inv_folder_clothing.tga"/> +  <texture name="inv_folder_current_outfit.tga"/>    <texture name="inv_folder_gesture.tga"/>    <texture name="inv_folder_landmark.tga"/>    <texture name="inv_folder_lostandfound.tga"/> +  <texture name="inv_folder_my_outfits.tga"/>    <texture name="inv_folder_notecard.tga"/>    <texture name="inv_folder_object.tga"/> +  <texture name="inv_folder_outfit.tga"/>    <texture name="inv_folder_plain_closed.tga"/>    <texture name="inv_folder_script.tga"/>    <texture name="inv_folder_snapshot.tga"/> diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Down.png b/indra/newview/skins/default/textures/widgets/Arrow_Down.png Binary files differnew file mode 100644 index 0000000000..e10f6472eb --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/Arrow_Down.png diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Up.png b/indra/newview/skins/default/textures/widgets/Arrow_Up.png Binary files differnew file mode 100644 index 0000000000..48df69d82e --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/Arrow_Up.png diff --git a/indra/newview/skins/default/xui/en/favorites_bar_button.xml b/indra/newview/skins/default/xui/en/favorites_bar_button.xml new file mode 100644 index 0000000000..4525df31b6 --- /dev/null +++ b/indra/newview/skins/default/xui/en/favorites_bar_button.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- *NOTE: mantipov: to use the "use_ellipses" attribute label should be LEFT aligned  +untill LLFontGL::render() is fixed to avoid this requirement--> +<!-- *NOTE: mantipov: top & height should be synchronized with <favorites_bar> in the panel_navigation_bar.xml--> +<!-- All buttons in the Favorites bar will be created from this one --> +<button + follows="left|bottom" + halign="left" + height="23" + image_disabled="transparent.j2c" + image_disabled_selected="PushButton_Selected" + image_hover_selected="PushButton_Selected" + image_hover_unselected="PushButton_Off" + image_selected="PushButton_Selected" + image_unselected="transparent.j2c" + layout="topleft" + left="2" + name="favorites_bar_btn" + tab_stop="false" + top="2" + use_ellipses="true" + width="120" /> diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml index 0012294160..b0472eb7e2 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml @@ -157,7 +157,7 @@               label="Range"               layout="topleft"               left="10" -             max_val="40" +             max_val="130"               min_val="5"               name="near_me_range"               top="32" diff --git a/indra/newview/skins/default/xui/en/floater_buy_land.xml b/indra/newview/skins/default/xui/en/floater_buy_land.xml index ec52c565ae..777236504d 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_land.xml @@ -374,9 +374,11 @@ supports [AMOUNT2] objects       length="1"       bottom_delta="-119"       follows="top|left" +     height="16"       layout="topleft"       left="204"       name="info_parcel_label" +     top="30"       width="48">          Parcel:      </text> @@ -389,7 +391,7 @@ supports [AMOUNT2] objects       layout="topleft"       left_delta="16"       name="info_parcel" -     top_delta="-1" +     top_pad="1"       width="180">          Scotopteryx 138,204      </text> @@ -397,9 +399,11 @@ supports [AMOUNT2] objects       type="string"       length="1"       follows="top|left" +     height="16"       layout="topleft"       left="204"       name="info_size_label" +     top_pad="1"       width="48">          Size:      </text> @@ -412,7 +416,7 @@ supports [AMOUNT2] objects       layout="topleft"       left_delta="16"       name="info_size" -     top_delta="-1" +     top_pad="1"       width="180">          1024 m²      </text> @@ -420,9 +424,11 @@ supports [AMOUNT2] objects       type="string"       length="1"       follows="top|left" +     height="16"       layout="topleft"       left="204"       name="info_price_label" +     top_pad="1"       width="48">          Price:      </text> @@ -435,7 +441,7 @@ supports [AMOUNT2] objects       layout="topleft"       left_delta="16"       name="info_price" -     top_delta="-1" +     top_pad="1"       width="180">          L$ 1500  (L$ 1.1/m²) @@ -450,7 +456,7 @@ sold with objects       layout="topleft"       left="16"       name="info_action" -     top="156" +     top="166"       width="350">          Buying this land will:      </text> @@ -485,7 +491,7 @@ sold with objects       layout="topleft"       left_delta="0"       name="error_web" -     top_delta="144" +     top_delta="154"       width="120" />      <locate       height="-200" @@ -508,7 +514,7 @@ sold with objects       left="72"       name="account_action"       right="438" -     top="190" +     top="200"       width="218">          Upgrade you to premium membership.      </text> @@ -562,7 +568,7 @@ sold with objects       left="72"       name="land_use_action"       right="438" -     top="274" +     top="284"       width="218">          Increase your monthly land use fees to US$ 40/month.      </text> @@ -638,7 +644,7 @@ sold with objects       layout="topleft"       left="170"       name="currency_amt" -     top="398" +     top="408"       width="80">          1000      </line_editor> @@ -654,7 +660,7 @@ sold with objects       layout="topleft"       left="260"       name="currency_est" -     top="399" +     top="409"       width="178">          for approx. US$ [AMOUNT2]      </text> diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml index 37c6cbf391..610c62a21a 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory.xml @@ -207,6 +207,22 @@                   parameter="category" />              </menu_item_call>              <menu_item_call +             label="New Outfit" +             layout="topleft" +             name="New Outfit"> +                <menu_item_call.on_click +                 function="Inventory.DoCreate" +                 parameter="outfit" /> +            </menu_item_call> +            <menu_item_call +             label="New My Outfits" +             layout="topleft" +             name="New My Outfits"> +                <menu_item_call.on_click +                 function="Inventory.DoCreate" +                 parameter="my_otfts" /> +            </menu_item_call> +            <menu_item_call               label="New Script"               layout="topleft"               name="New Script"> diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml index 6cb044cda1..467168ebd8 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater   auto_tile="true" - height="320" + height="340"   layout="topleft"   name="item properties"   save_rect="true" @@ -185,31 +185,71 @@       name="OwnerLabel"       top="125"       width="78"> -        You can: +        You:      </text>      <check_box       height="16" -     label="Modify" +     label="Edit"       layout="topleft" -     left_delta="0" +     left_pad="5"       name="CheckOwnerModify" -     top_pad="4" +     top_delta="0"       width="78" />      <check_box       height="16"       label="Copy"       layout="topleft" -     left_delta="78" +     left_delta="0"       name="CheckOwnerCopy" -     top_delta="0" +     top_pad="5"       width="88" />      <check_box       height="16" -     label="Resell/Give away" +     label="Resell"       layout="topleft" -     left_delta="88" +     left_delta="0"       name="CheckOwnerTransfer" +     top_pad="5" +     width="106" /> +    <text +     type="string" +     length="1" +     follows="left|top" +     height="10" +     layout="topleft" +     left="10" +     name="AnyoneLabel" +     top_pad="5" +     width="78"> +        Anyone: +    </text> +    <check_box +     height="16" +     label="Copy" +     layout="topleft" +     left_pad="5" +     name="CheckEveryoneCopy"       top_delta="0" +     width="130" /> +    <text +     type="string" +     length="1" +     follows="left|top" +     height="10" +     layout="topleft" +     left="10" +     name="GroupLabel" +     top_pad="5" +     width="78"> +        Group: +    </text> +    <check_box +     height="16" +     label="Share" +     layout="topleft" +     left_pad="5" +     name="CheckShareWithGroup" +     top_delta="5"       width="106" />      <text       type="string" @@ -218,6 +258,93 @@       height="10"       layout="topleft"       left="10" +     name="NextOwnerLabel" +     top_pad="5" +     width="78"> +        Next owner: +    </text> +    <check_box +     height="16" +     label="Edit" +     layout="topleft" +     left_pad="5" +     name="CheckNextOwnerModify" +     top_delta="0" +     width="78" /> +    <check_box +     height="16" +     label="Copy" +     layout="topleft" +     left_delta="0" +     name="CheckNextOwnerCopy" +     top_pad="5" +     width="88" /> +    <check_box +     height="16" +     label="Resell" +     layout="topleft" +     left_delta="0" +     name="CheckNextOwnerTransfer" +     top_pad="5" +     width="106" /> +    <check_box +     height="16" +     label="For Sale" +     layout="topleft" +     left="10" +     name="CheckPurchase" +     top_pad="5" +     width="78" /> +     <combo_box +     height="19" +     left_pad="5" +     layout="topleft" +     follows="left|top" +     name="combobox sale copy" +     width="90"> +        <combo_box.item +         label="Copy" +         name="Copy" +         value="Copy" /> +        <combo_box.item +         label="Original" +         name="Original" +         value="Original" /> +    </combo_box> +    <spinner +        follows="left|top" +        decimal_digits="0" +        increment="1" +        control_name="Edit Cost" +        name="Edit Cost" +        label="Price: L$" +        label_width="60" +        left="10" +        width="180" +        min_val="1" +        height="19" +        max_val="999999999" +        top_pad="5"/> + +    <!--line_editor +     border_style="line" +     border_thickness="1" +     follows="left|top|right" +     height="16" +     layout="topleft" +     left_pad="5" +     max_length="25" +     name="EditPrice" +     top_delta="0" +     width="242" /--> + +    <!--text +     type="string" +     length="1" +     follows="left|top" +     height="10" +     layout="topleft" +     left="10"       name="BaseMaskDebug"       top="155"       width="330"> @@ -270,60 +397,8 @@       top_delta="0"       width="90">          N: -    </text> -    <check_box -     height="16" -     label="Share with group" -     layout="topleft" -     left="10" -     name="CheckShareWithGroup" -     top="171" -     width="106" /> -    <check_box -     height="16" -     label="Allow anyone to copy" -     layout="topleft" -     left_delta="0" -     name="CheckEveryoneCopy" -     top_pad="16" -     width="130" /> -    <text -     type="string" -     length="1" -     follows="left|top" -     height="10" -     layout="topleft" -     left_delta="0" -     name="NextOwnerLabel" -     top_pad="16" -     width="88"> -        Next owner can: -    </text> -    <check_box -     height="16" -     label="Modify" -     layout="topleft" -     left_delta="0" -     name="CheckNextOwnerModify" -     top_pad="4" -     width="78" /> -    <check_box -     height="16" -     label="Copy" -     layout="topleft" -     left_delta="78" -     name="CheckNextOwnerCopy" -     top_delta="0" -     width="88" /> -    <check_box -     height="16" -     label="Resell/Give away" -     layout="topleft" -     left_delta="88" -     name="CheckNextOwnerTransfer" -     top_delta="0" -     width="106" /> -    <text +    </text--> +        <!--text       type="string"       length="1"       follows="left|top" @@ -331,19 +406,13 @@       layout="topleft"       left="10"       name="SaleLabel" -     top="265" +     top_pad="5"       width="330">          Mark Item: -    </text> -    <check_box -     height="16" -     label="For Sale" -     layout="topleft" -     left_delta="0" -     name="CheckPurchase" -     top_pad="4" -     width="78" /> -    <radio_group +    </text--> +     + +    <!--radio_group       draw_border="false"       follows="left|top|right"       height="16" @@ -368,28 +437,19 @@           name="radio2"           top_delta="0"           width="70" /> -    </radio_group> -    <text +    </radio_group--> +     +    <!--text       type="string"       length="1"       follows="left|top"       height="16"       layout="topleft" -     left="42" +     left="10"       name="TextPrice" -     top="299" -     width="56"> -        Price:  L$ -    </text> -    <line_editor -     border_style="line" -     border_thickness="1" -     follows="left|top|right" -     height="16" -     layout="topleft" -     left_delta="56" -     max_length="25" -     name="EditPrice" -     top_delta="0" -     width="242" /> +     top_pad="5" +     width="78"> +        Price: L$ +    </text--> +  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml index 3327dc8c8b..f8f1abd179 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml @@ -83,23 +83,11 @@      <button       follows="left|bottom"       height="20" -     label="Discard" +     label="Save"       label_selected="Discard"       layout="topleft"       left="9" -     name="Discard" +     name="Save"       top="332"       width="100" /> -    <button -     enabled="false" -     follows="left|bottom" -     height="20" -     label="Keep" -     label_selected="Keep" -     layout="topleft" -     left_pad="5" -     mouse_opaque="false" -     name="Keep" -     top_delta="0" -     width="100" />  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_sys_well.xml b/indra/newview/skins/default/xui/en/floater_sys_well.xml new file mode 100644 index 0000000000..468d41e2f0 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_sys_well.xml @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater  + background_opaque="false" + background_visible="true"  + bevel_style="in" + bg_alpha_color="0.0 0.0 0.0 0.0" + height="60" + left="0" + top="0"  + follows="right|bottom" + layout="topleft" + name="notification_chiclet" + save_rect="true" + title="" + width="320" + can_minimize="false" + can_tear_off="false" + can_resize="false" + can_drag_on_left="false" + can_close="false" + can_dock="false" +> +  <scroll_container +   follows="top|bottom" +   layout="topleft" +   name="notification_list_container" +   left="1" +   top="30" +   width="336" +   height="30"> +    <scrolling_panel_list +     follows="left|right" +     layout="topleft" +     name="notification_list" +     left="0" +     top="0" +     height="20" +     width="320" /> +  </scroll_container> + +  <panel  +    top="0"  +    width="320"  +    height="30" +    layout="topleft" +    follows="top|left|right" +    background_visible="true"  +    background_opaque="false"  +    bg_alpha_color="0.0 0.0 0.0 1.0"  +    name="notification_caption" +  > +    <text +      width="255"  +      left="25"  +      height="20"  +      layout="topleft" +      follows="left|right|top" +      font="SansSerifBoldBig"  +      text_color="white"  +      word_wrap="true" +      mouse_opaque="true"  +      name="sender_name" +    > +      NOTIFICATIONS   +    </text> +    <button +      top="5" +      left="270" +      width="15" +      height="15" +      layout="topleft" +      follows="right" +      label="" +      toggle="true"  +      image_unselected="arrow_up.tga" +      image_disabled="arrow_up.tga" +      image_selected="arrow_down.tga" +      image_hover_selected="arrow_down.tga" +      image_disabled_selected="arrow_down.tga" +      name="tear_btn" +    />     +    <button  +      top="5"  +      left="300" +      width="15"  +      height="15" +      layout="topleft" +      follows="right" +      label=""  +      image_unselected="closebox.tga"  +      image_disabled="closebox.tga" +      image_selected="closebox.tga"  +      image_hover_selected="closebox.tga" +      image_disabled_selected="closebox.tga" +      name="close_btn" +    /> +  </panel> + +</floater> diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index c788f8f095..dd8acea4ed 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -85,6 +85,22 @@           parameter="current" />      </menu_item_call>      <menu_item_call +       label="New Outfit" +       layout="topleft" +       name="New Outfit"> +      <menu_item_call.on_click +         function="Inventory.DoCreate" +         parameter="outfit" /> +    </menu_item_call> +    <menu_item_call +       label="New My Outfits" +       layout="topleft" +       name="New My Outfits"> +      <menu_item_call.on_click +         function="Inventory.DoCreate" +         parameter="my_otfts" /> +    </menu_item_call> +    <menu_item_call       label="New Script"       layout="topleft"       name="New Script"> @@ -322,6 +338,14 @@               function="Inventory.DoToSelected"               parameter="change_folder_type_undershirt" />          </menu_item_call> +        <menu_item_call +         label="Outfit" +         layout="topleft" +         name="Outfit"> +            <menu_item_call.on_click +             function="Inventory.DoToSelected" +             parameter="change_folder_type_outfit" /> +        </menu_item_call>      </menu>      <menu_item_call       label="Teleport" diff --git a/indra/newview/skins/default/xui/en/menu_nearby_chat.xml b/indra/newview/skins/default/xui/en/menu_nearby_chat.xml index 02a2f83d14..ff89e20ea5 100644 --- a/indra/newview/skins/default/xui/en/menu_nearby_chat.xml +++ b/indra/newview/skins/default/xui/en/menu_nearby_chat.xml @@ -7,7 +7,7 @@  	</menu_item_call>  	<menu_item_separator /> -	<menu_item_check bottom_delta="-18" height="18" label="Show Muted Text" left="0" mouse_opaque="true" +	<menu_item_check bottom_delta="-18" height="18" label="Show Blocked Text" left="0" mouse_opaque="true"  	     name="muted_text" width="128">      	<menu_item_check.on_click function="NearbyChat.Action" userdata="muted_text" />  		<menu_item_check.on_check function="NearbyChat.Check" userdata="muted_text"/> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 44565333e5..40847b28fe 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -205,7 +205,7 @@               function="Floater.Toggle"               parameter="active_speakers" />          </menu_item_check> -        <menu_item_check +        <!--menu_item_check           label="Block List"           layout="topleft"           name="Mute List"> @@ -215,7 +215,7 @@              <menu_item_check.on_click               function="Floater.Toggle"               parameter="mute" /> -        </menu_item_check> +        </menu_item_check-->          <menu_item_separator           layout="topleft" />          <menu_item_check @@ -930,7 +930,7 @@          </menu>      </menu>      <menu -     label="Geek" +     label="Advanced"       layout="topleft"       name="Advanced"       tear_off="true" @@ -1824,6 +1824,18 @@               function="Advanced.ShowDebugSettings"               parameter="all" />          </menu_item_call> +        <menu_item_check +         label="Debug (QA) Mode" +         layout="topleft" +         name="Debug Mode" +         shortcut="control|alt|Q"> +            <menu_item_check.on_check +             function="CheckControl" +             parameter="QAMode" /> +            <menu_item_check.on_click +             function="ToggleControl" +             parameter="QAMode" /> +        </menu_item_check>      </menu>      <menu       create_jump_keys="true" diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 4c880f6dc0..91039539f9 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -127,8 +127,8 @@                  <split_button.item                   image_selected="camera_presets/camera_presets_34_view.png"                   image_unselected="camera_presets/camera_presets_34_view.png" -                 name="3/4_view" -                 tool_tip="3/4 View"  +                 name="group_view" +                 tool_tip="Group View"                   />                  <split_button.item                   image_selected="camera_presets/camera_presets_fron_view.png" diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml index 71b5f78d59..b9a384bf8f 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -4,6 +4,7 @@   follows="all"   height="514"   label="General" + class="panel_group_general"   layout="topleft"   left="1"   name="general_tab" @@ -42,6 +43,7 @@ Hover your mouse over the options for more help.      <line_editor       follows="left|top"       font="SansSerifSmall" +     prevalidate_callback="asci"       halign="left"       height="16"       label="Type your new group name here" diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml new file mode 100644 index 0000000000..4f179d7a16 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> + +<panel + 	follows="left|top|right|bottom" +	height="660" +	label="Group Info" + 	layout="topleft" +	name="panel_group_info" +	border="false" +	width="300"> +    <panel.string +     name="default_needs_apply_text"> +        There are unapplied changes on the current tab. +    </panel.string> +    <panel.string +     name="want_apply_text"> +        Do you want to apply these changes? +    </panel.string> + +	<button  +     layout="topleft"  +     name="back"  +     left="5"  +     top="5"  +     width="20"  +     height="20"  +     label="" +     follows="top|left" +     image_selected="navbar_bg_button.tga" +     image_unselected="navbar_bg_button.tga" +     image_overlay="navbar_back.tga"/> +    <text  +     layout="topleft"  +     top="5"  +     left_pad="15"  +     width="200"  +     height="20"  +     font="SansSerifBold"  +     text_color="white"  +     follows="top|left|right" +     mouse_opaque="true"  +     name="group_name">(Loading...)</text> +    <button +     top="632" +     height="20" +     font="SansSerifSmall" +     label="Apply" +     label_selected="Apply" +     name="btn_apply" +     left="5" +     width="65" /> +    <button +	 top="632" +	 left="75"	  +	 height="20" +     ont="SansSerifSmall" +     label="Refresh" +     label_selected="Refresh" +     name="btn_refresh" +	 follows="top|left" +     width="65" /> +    <button +     top="632" +     height="20" +     font="SansSerifSmall" +     label="Create" +     label_selected="Create" +     name="btn_create" +     left="5" +     visible="false" +     width="65" /> +      <accordion layout="topleft" left="2" width="296" top="28" height="600" follows="all" name="panel_me_profile"> +		<accordion_tab min_height="515" title="Group General" name="group_general_tab"> +        	<panel class="panel_group_general" filename="panel_group_general.xml" name="group_general_tab_panel"/> +		</accordion_tab> +		<accordion_tab min_height="380" title="Group Roles" name="group_roles_tab" can_resize="false"> +        	<panel class="panel_group_roles" filename="panel_group_roles.xml" name="group_roles_tab_panel"/> +		</accordion_tab> +		<accordion_tab min_height="530" title="Group Notices" name="group_notices_tab" can_resize="false"> +			<panel class="panel_group_notices" filename="panel_group_notices.xml" name="group_notices_tab_panel"/> +		</accordion_tab> +		<accordion_tab min_height="270" title="Group Land Money" name="group_land_tab" can_resize="false"> +			<panel class="panel_group_land_money" filename="panel_group_land_money.xml" name="group_land_tab_panel"/> +		</accordion_tab> +	  </accordion> + + +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml index b96421ca2f..c52994b43d 100644 --- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml @@ -2,7 +2,7 @@  <panel   border="true"   follows="all" - height="514" + height="420"   label="Land & L$"   layout="topleft"   left="1" @@ -281,7 +281,7 @@               bg_readonly_color="0.784314 0.819608 0.8 1"               follows="all"               font="Monospace" -             height="150" +             height="180"               layout="topleft"               left="8"               max_length="4096" diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index dd6cd8c95e..132c06d028 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -1,12 +1,11 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel   border="true" - height="530" + height="380"   label="Members & Roles"   layout="topleft"   left="1"   name="roles_tab" - top="530"   width="280">      <panel.string       name="default_needs_apply_text"> @@ -31,7 +30,7 @@      -->      <panel       follows="left|top" -     height="24" +     height="80"       layout="topleft"       left="10"       name="members_header" @@ -174,7 +173,7 @@       left_delta="0"       name="roles_tab_container"       tab_position="top" -     top="70" +     top="80"       width="265">          <panel           border="true" @@ -185,6 +184,7 @@           name="members_sub_tab"           tool_tip="Members"           top="16" +         class="panel_group_members_subtab"           width="265">              <panel.string               name="help_text"> @@ -279,6 +279,7 @@ clicking on their names.           layout="topleft"           left_delta="0"           name="roles_sub_tab" +         class="panel_group_roles_subtab"           top_delta="0"           width="265">              <panel.string @@ -384,6 +385,7 @@ including the Everyone and Owner Roles.           layout="topleft"           left_delta="0"           name="actions_sub_tab" +         class="panel_group_actions_subtab"           top_delta="0"           width="265">              <panel.string diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index 4904a0d40a..8d90c6ebf0 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -8,118 +8,124 @@   layout="topleft"   name="navigation_bar"   width="600"> -     <button -     follows="left|top" -     font="SansSerifSmall" -     height="23" -     image_disabled="PushButton_Disabled" -     image_disabled_selected="PushButton_Disabled" -     image_overlay="Arrow_Left_Off" -     image_selected="PushButton_Selected" -     image_unselected="PushButton_Off" -     hover_glow_amount="0.15" -     layout="topleft" -     left="10" -     name="back_btn" -     picture_style="true" -     tool_tip="Go back to previous location" -     top="8" -     width="31" /> - -    <button -     follows="left|top" -     font="SansSerifSmall" -     height="23" -     image_disabled="PushButton_Disabled" -     image_disabled_selected="PushButton_Disabled" -     image_overlay="Arrow_Right_Off" -     image_selected="PushButton_Selected" -     image_unselected="PushButton_Off" -     hover_glow_amount="0.15" -     layout="topleft" -     left_pad="0" -     name="forward_btn" -     picture_style="true" -     tool_tip="Go forward one location" -     top_delta="0" -     width="31" /> -    <button -     follows="left|top" -     font="SansSerifSmall" -     height="23" -     image_disabled="PushButton_Disabled" -     image_disabled_selected="PushButton_Disabled" -     image_overlay="Home_Off" -     image_selected="PushButton_Selected" -     image_unselected="PushButton_Off" -     hover_glow_amount="0.15" -     layout="topleft" -     left_pad="7" -     name="home_btn" -     picture_style="true" -     tool_tip="Teleport to your home location" -     top_delta="0" -     width="32" /> -    <location_input -     follows="left|right|top" -     halign="right" -     height="22" -     label="Location" -     layout="topleft" -     left_pad="7" -     max_chars="254" -     mouse_opaque="false" -     name="location_combo" -     top_delta="0" -     width="266"> -     <!-- *TODO: Delete.  Let the location_input use the correct art sizes. -        <location_input.add_landmark_button -         height="18" -         name="location_combo_add" -         width="20" /> -        <location_input.info_button -         height="18" -         name="location_combo_info" -         width="20" /> -      --> -    </location_input> - -<!--     <button --> -<!--      follows="right|top" --> -<!--      height="20" --> -<!--      image_disabled="TextField_Search_Off" --> -<!--      image_disabled_selected="TextField_Search_Off" --> -<!--      image_hover_selected="TextField_Search_Off" --> -<!--      image_hover_unselected="TextField_Search_Off" --> -<!--      image_selected="TextField_Search_Off" --> -<!--      image_unselected="TextField_Search_Off" --> -<!--      layout="topleft" --> -<!--      left_pad="5" --> -<!--      mouse_opaque="false" --> -<!--      name="search_bg" --> -<!--      picture_style="true" --> -<!--      top_delta="0" --> -<!--      width="168" /> --> -     -    <search_editor -     bevel_style="none" -     border_style="line" -     border.border_thickness="0" -     commit_on_focus_lost="false" -     follows="right|top" -     halign="right" -     height="22" -     label="Search All" -     layout="topleft" -     left_pad="7" -     mouse_opaque="false" -     name="search_input" -     tool_tip="Search All" -     top_delta="0" -     width="200" />  -     -     - +	<panel +	 background_visible="false" +	 follows="left|top|right" +	 height="60" +	 layout="topleft" +	 name="navigation_panel" +	 width="600">	  +	     <button +	     follows="left|top" +	     font="SansSerifSmall" +	     height="23" +	     image_disabled="PushButton_Disabled" +	     image_disabled_selected="PushButton_Disabled" +	     image_overlay="Arrow_Left_Off" +	     image_selected="PushButton_Selected" +	     image_unselected="PushButton_Off" +	     hover_glow_amount="0.15" +	     layout="topleft" +	     left="10" +	     name="back_btn" +	     picture_style="true" +	     tool_tip="Go back to previous location" +	     top="3" +	     width="31" /> +	 +	    <button +	     follows="left|top" +	     font="SansSerifSmall" +	     height="23" +	     image_disabled="PushButton_Disabled" +	     image_disabled_selected="PushButton_Disabled" +	     image_overlay="Arrow_Right_Off" +	     image_selected="PushButton_Selected" +	     image_unselected="PushButton_Off" +	     hover_glow_amount="0.15" +	     layout="topleft" +	     left_pad="0" +	     name="forward_btn" +	     picture_style="true" +	     tool_tip="Go forward one location" +	     top_delta="0" +	     width="31" /> +	    <button +	     follows="left|top" +	     font="SansSerifSmall" +	     height="23" +	     image_disabled="PushButton_Disabled" +	     image_disabled_selected="PushButton_Disabled" +	     image_overlay="Home_Off" +	     image_selected="PushButton_Selected" +	     image_unselected="PushButton_Off" +	     hover_glow_amount="0.15" +	     layout="topleft" +	     left_pad="7" +	     name="home_btn" +	     picture_style="true" +	     tool_tip="Teleport to your home location" +	     top_delta="0" +	     width="32" /> +	    <location_input +	     follows="left|right|top" +	     halign="right" +	     height="22" +	     label="Location" +	     layout="topleft" +	     left_pad="7" +	     max_chars="254" +	     mouse_opaque="false" +	     name="location_combo" +	     top_delta="0" +	     width="266"> +	     <!-- *TODO: Delete.  Let the location_input use the correct art sizes. +	        <location_input.add_landmark_button +	         height="18" +	         name="location_combo_add" +	         width="20" /> +	        <location_input.info_button +	         height="18" +	         name="location_combo_info" +	         width="20" /> +	      --> +	    </location_input> +	 +	<!--     <button --> +	<!--      follows="right|top" --> +	<!--      height="20" --> +	<!--      image_disabled="TextField_Search_Off" --> +	<!--      image_disabled_selected="TextField_Search_Off" --> +	<!--      image_hover_selected="TextField_Search_Off" --> +	<!--      image_hover_unselected="TextField_Search_Off" --> +	<!--      image_selected="TextField_Search_Off" --> +	<!--      image_unselected="TextField_Search_Off" --> +	<!--      layout="topleft" --> +	<!--      left_pad="5" --> +	<!--      mouse_opaque="false" --> +	<!--      name="search_bg" --> +	<!--      picture_style="true" --> +	<!--      top_delta="0" --> +	<!--      width="168" /> --> +	     +	    <search_editor +	     bevel_style="none" +	     border_style="line" +	     border.border_thickness="0" +	     commit_on_focus_lost="false" +	     follows="right|top" +	     halign="right" +	     height="22" +	     label="Search All" +	     layout="topleft" +	     left_pad="7" +	     mouse_opaque="false" +	     name="search_input" +	     tool_tip="Search All" +	     top_delta="0" +	     width="200" />         +	</panel> +	      <favorites_bar       follows="left|right|top"       height="25" diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml index a0ac9df8a5..e616389c36 100644 --- a/indra/newview/skins/default/xui/en/panel_notes.xml +++ b/indra/newview/skins/default/xui/en/panel_notes.xml @@ -1,205 +1,121 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel - follows="top|left|right|bottom"   bevel_style="in" - height="625" - label="Notes and Privacy" + follows="left|top|right|bottom" + height="570" + width="295" + border="false"   layout="topleft" - left="10" - name="panel_notes" - top="10" - width="305"> + left="0" + top="0" + label="Notes & Privacy" + name="panel_notes">      <scroll_container -     left="8"  -     width="260"  -     height="570"  +     color="DkGray2"       follows="left|top|right|bottom" +     height="570" +     width="265"       layout="topleft" -     name="profile_scroll" +     left="5" +     top_pad="0" + bevel_style="in"       opaque="true" -     color="DkGray2" +     name="profile_scroll"       reserve_scroll_corner="false"> -        <panel -         layout="topleft" -         width="260" -         height="530" -         left="0" -         follows="left|right" -         top="0"> -           <!-- <text -             type="string" -             length="1" -             follows="left|top" -             font="SansSerifHugeBold" -             height="20" -             layout="topleft" -             left="10" -             name="pick_title" -             text_color="white" -             top="10" -             width="250" -             word_wrap="true"> -                Private Notes -            </text>-->              <text               type="string"               length="1"               follows="left|top"               font="SansSerifBold" -             height="15" -             layout="topleft" -             left="10" +             height="16" +             width="225" +             left="0"               name="status_message" -             text_color="White" -             top="20" -             width="260"> -                Your private notes: +             text_color="white" +             top=""> +               My private notes:              </text>              <text_editor -             bg_focus_color="LtGray" -             bg_writeable_color="LtGray" -             follows="left|right" -             font="SansSerif"               height="200" +             follows="left|top" +             width="243"               hide_scrollbar="true" -             layout="topleft"               left="10"               max_length="1000"               name="notes_edit"               text_color="black"               top_pad="10" -             width="240"               word_wrap="true" /> -           <!-- <text -             type="string" -             length="1" -             follows="left|top" -             font="SansSerifHugeBold" -             height="20" -             layout="topleft" -             left="10" -             name="pick_title2" -             text_color="white" -             top_pad="10" -             width="250" -             word_wrap="true"> -                Private Settings -            </text> -->             <text               type="string"               length="1"               follows="left|top"               font="SansSerifBold" -             height="15" -             layout="topleft" +             height="16" +             width="225"               left="10"               name="status_message2"               text_color="white" -             top_pad="30" -             width="260"> -                Allow this user to: +             top_pad="30"> +                Let this person:              </text>              <check_box               enabled="false"               follows="left|top" -             font="SansSerif" +             width="230"               height="20"               label="See my online status" -             layout="topleft" -             left="10" -             name="status_check" -             text_disabled_color="0.1 0.1 0.1 1" -             text_enabled_color="white" +             left="20"               top_pad="10" -             width="260" /> +             name="status_check" />              <check_box               enabled="false"               follows="left|top" -             font="SansSerif" +             width="230"               height="20"               label="See me on the map" -             layout="topleft" -             left="10" -             name="map_check" -             text_disabled_color="0.1 0.1 0.1 1" -             text_enabled_color="white" +             left="20"               top_pad="10" -             width="260" /> +             name="map_check"/>              <check_box               enabled="false"               follows="left|top" -             font="SansSerif" +             width="230"               height="20"               label="Edit, delete or take my objects" -             layout="topleft" -             left="10" -             name="objects_check" -             text_disabled_color="0.1 0.1 0.1 1" -             text_enabled_color="white" +             left="20"               top_pad="10" -             width="260" /> -        </panel> +             name="objects_check" />      </scroll_container>      <panel -	 layout="topleft" -     follows="bottom" +     follows="bottom|left"       height="30" -     left="8" -     name="notes_buttons_panel" -     bottom="625" -     width="280"> -        <button -         follows="bottom|left" -         font="SansSerifSmallBold" -         height="25" -         label="Add Friend" -         layout="topleft" -         left="0" -         mouse_opaque="false" -         name="add_friend" -         top="0" -         width="90" /> -        <button -         follows="bottom|left" -         font="SansSerifSmallBold" -         height="25" -         label="IM" -         layout="topleft" -         left_pad="0" -         name="im" -         top="0" -         width="40" /> -        <button -         follows="bottom|left" -         font="SansSerifSmallBold" -         height="25" -         label="Call" -         layout="topleft" -         left_pad="0" -         name="call" -         top="0" -         width="50" -         enabled="false"/> +     width="280" +     layout="topleft" +     left="10" +     top_pad="5" +     name="notes_buttons_panel">          <button           follows="bottom|left"           font="SansSerifSmallBold"           height="25"           label="Teleport"           layout="topleft" -         left_pad="0" -         name="teleport" +         left="0" +         name="teleport_btn" +         enabled="false"           top="0"           width="75" />          <button           follows="bottom|left"           font="SansSerifSmallBold"           height="25" -         label="Share" +         label="Show on Map"           layout="topleft"           left_pad="0" -         name="share" +         name="show_on_map_btn" +         enabled="false"           top="0" -         width="60" -         enabled="false"/> +         width="105" />      </panel>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 6b3f5eaee1..bccc04e30c 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -1,28 +1,30 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel    layout="topleft" +  font="SansSerifBigBold"    top="0"    left="0"    width="305"    height="465" -  follows="left|top|right|bottom"   -  background_visible="true" +  follows="left|top|right|bottom" +     background_visible="true" +     bg_alpha_color="DkGray2" + bevel_style="in"    label="People"    name="people_panel">    <filter_editor      layout="topleft"      top="3" -    left="15" -    width="270" -    height="20" +    left="10" +    width="256" +    height="23"      follows="left|top|right"      max_length="270" -    label="Filter People"      name="filter_input"      font="SansSerif"      background_image="TextField_Search_Off"      text_pad_left="23" -    text_color="black"/> +    text_color="black" />    <button            name="people_search"            layout="topleft" @@ -39,8 +41,8 @@    <tab_container      layout="topleft"      top="30" -    left="10" -    width="280" +     left="10" +    width="295"      height="400"      follows="left|top|right|bottom"      name="tabs" @@ -50,8 +52,8 @@        height="390"        width="280"        follows="left|top|right|bottom" -      background_visible="true" -      bevel_style="bright"  +      background_visible="false" +      bevel_style="none"        label="Nearby"        name="nearby_panel">        <avatar_list @@ -62,7 +64,7 @@          height="357"          follows="left|top|right|bottom"          name="avatar_list" -		volume_column_width="20"/> +	volume_column_width="20"/>        <panel          layout="topleft"          bottom="390" @@ -71,7 +73,7 @@          height="30"          follows="left|right|bottom"          background_visible="true" -        bevel_style="bright" +        bevel_style="none"          label="bottom_panel"          name="bottom_panel">          <button @@ -96,7 +98,7 @@        width="280"        follows="left|top|right|bottom"        background_visible="true" -      bevel_style="bright"  +      bevel_style="none"        label="Friends"        name="friends_panel">        <avatar_list @@ -115,7 +117,7 @@          height="30"          follows="left|right|bottom"          background_visible="true" -        bevel_style="in" +        bevel_style="none"          label="bottom_panel"          name="bottom_panel">           <button @@ -163,10 +165,10 @@      <panel        layout="topleft"        height="390" -      width="280"   +      width="280"        follows="left|top|right|bottom"        background_visible="true" -      bevel_style="bright"  +      bevel_style="none"        label="Groups"        name="groups_panel">        <group_list @@ -185,7 +187,7 @@          height="30"          follows="left|right|bottom"          background_visible="true" -        bevel_style="in" +        bevel_style="none"          label="bottom_panel"          name="bottom_panel">          <button @@ -240,7 +242,7 @@            hover_glow_amount="0.15"            image_selected="TrashItem_Press"            image_unselected="TrashItem_Off" -          picture_style="true"/>  +          picture_style="true"/>          </panel>      </panel>      <panel @@ -249,8 +251,8 @@        width="280"        follows="left|top|right|bottom"        background_visible="true" -      bevel_style="bright" -      label="Recent" +      bevel_style="none" +      label="History"        name="recent_panel">        <avatar_list          layout="topleft" @@ -268,7 +270,7 @@          height="30"          follows="left|right|bottom"          background_visible="true" -        bevel_style="in" +        bevel_style="none"          label="bottom_panel"          name="bottom_panel">          <button @@ -293,7 +295,7 @@      follows="left|right|bottom"      bottom="6"      left="6" -    width="280" +    width="295"      height="27"      orientation="horizontal"      animate="false" @@ -478,7 +480,7 @@          follows="top|right"          font="SansSerifSmallBold"/>      </layout_panel> -  </layout_stack>  +  </layout_stack>    <string name="no_people">      No people    </string> @@ -491,4 +493,10 @@    <string name="no_groups">      No groups    </string> +  <string name="people_filter_label"> +    Filter People +  </string> +  <string name="groups_filter_label"> +    Filter Groups +  </string>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml index 393521f1d2..1425246540 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_info.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml @@ -1,24 +1,13 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel + follows="left|top|right|bottom"   bevel_style="in" - height="660" + height="625" + width="280"   layout="topleft"   left="0"   name="panel_pick_info" - top="0" - width="305"> -    <button -     follows="top|left" -     height="20" -     image_overlay="navbar_back.tga" -     image_selected="navbar_bg_button.tga" -     image_unselected="navbar_bg_button.tga" -     layout="topleft" -     left="10" -     name="back_btn" -     picture_style="true" -     top="5" -     width="20" /> + top="0">      <text       type="string"       length="1" @@ -33,15 +22,24 @@       width="150">          Pick Info      </text> +   <button +     follows="top|right" +     right="-25" +     top="10" +     width="20" +     height="20" +     image_overlay="BackArrow_Off" +     layout="topleft" +     name="back_btn" +     picture_style="true" />      <panel       follows="left|right|top|bottom" -     height="580" +     min_height="300"       width="280"       layout="topleft"       background_visible="true"       bg_alpha_color="DkGray2"       left="10" -     right="-10"       top="30">          <texture_picker           enabled="false" diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml index 1a06e2bb06..78bec6035f 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml @@ -1,63 +1,57 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel - bg_alpha_color="0.4 0.4 0.4 1" - bg_opaque_color="0.4 0.4 0.4 1" - border="true" - follows="top|left|right" - height="80" - layout="topleft" + border="false" + follows="top|left|right|bottom" + top="0"   left="0" - name="picture_item" - top="80" - width="245"> + height="100" +     width="265" + name="picture_item">      <texture_picker       allow_no_texture="true"       default_image_name="None"       enabled="false"       follows="left|top" -     height="80" +     height="100" +     width="100"       layout="topleft" -     left="5" +     left="10" +     bottom_pad="10"       mouse_opaque="false"       name="picture"       tab_stop="false" -     top="7" -     width="70" /> +     top="10" />      <text       follows="top|left|right" -     font="SansSerif" -     height="20" +     font="SansSerifTiny" +     height="16"       layout="topleft" -     left="80" +     left="120"       name="picture_name" -     text_color="black" -     top="5" +     top="10" +     text_color="white"       use_ellipses="true" -     width="150"/> +     width="120" />      <text       follows="top|left|right" -     font="SansSerifSmall" -     height="40" +     font="SansSerifTiny" +     height="60" +     width="140" +     top_pad="0"       layout="topleft"       name="picture_descr" -     text_color="white" -     top="25"       use_ellipses="true" -     width="150"       word_wrap="true" />      <button       follows="top|right" -     height="20" -     image_disabled="navbar_bg_button.tga" -     image_disabled_selected="navbar_bg_button.tga" -     image_overlay="navbar_forward.tga" -     image_selected="navbar_bg_button.tga" -     image_unselected="navbar_bg_button.tga" +     height="16" +     image_selected="Info" +     image_unselected="Info"       layout="topleft"       name="info_chevron"       picture_style="true" -     right="-5"       tab_stop="false" -     top="28" -     width="20" /> +     top="6" +     left="233" +     width="16" />  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml index 5b66026f48..2be9f900da 100644 --- a/indra/newview/skins/default/xui/en/panel_picks.xml +++ b/indra/newview/skins/default/xui/en/panel_picks.xml @@ -2,78 +2,64 @@  <panel   bevel_style="in"   follows="left|top|right|bottom" - height="625" - label="Picks" + height="570" + width="295" + border="false"   layout="topleft"   left="0" - name="panel_picks"   top="0" - width="305"> -    <!--<text -     type="string" -     length="1" -     follows="top|left|right" -     font="SansSerifHugeBold" -     height="50" + label="Picks" + name="panel_picks"> +    <scroll_container +     color="DkGray2" +     follows="left|top|right|bottom" +     height="570" +     width="265"       layout="topleft" -     left="10" -     name="pick_title" -     text_color="white" -     top="10" -     width="270" -     word_wrap="true"> -        [NAME]'s favorite places in Second Life... -    </text>--> -    <!-- below is a special title shown for the Agent on the "Picks" tab--> +     left="5" +     top_pad="0" + bevel_style="in" +     opaque="true" +     name="profile_scroll" +     reserve_scroll_corner="false"> +<!-- below is a special title shown for the Agent on the "Picks" tab      <text       type="string"       length="1"       follows="top"       font="SansSerifBold"       height="35" +     width="250"       layout="topleft"       left="10"       name="pick_title_agent"       text_color="white" -     top="10" -     visible="false"  -     width="270" +     top_pad="25" +     visible="false"       word_wrap="true">          Tell everyone about your favorite Second Life places... -    </text> -    <scroll_container -     follows="left|top|right|bottom" -     height="495" -     layout="topleft" -     left="8" -     name="profile_scroll" -     opaque="true" -     color="DkGray2" -     reserve_scroll_corner="false" -     top_pad="0" -     width="260"> +    </text>-->          <panel -         bevel_style="in" -         height="40" +         height="115" +     width="265"           layout="topleft"           left="0"           name="back_panel" -         top="0" -         width="260" /> +         top="0" />      </scroll_container> -    <panel +   <panel       background_visible="true" -     bevel_style="in" +     bevel_style="none"       enabled="false"       follows="left|right|bottom" -     height="25" +     height="30"       label="bottom_panel"       layout="topleft" -     left="8" +     left="0"       name="edit_panel"       visible="false"       top_pad="0" -     width="260"> +     width="280">          <button           enabled="false"           follows="bottom|left" @@ -123,29 +109,18 @@      <panel       follows="bottom|left"       height="30" +     width="280"       layout="topleft" -     left="8" -     name="buttons_cucks" -     bottom="625" -     width="280"> -        <button -         follows="bottom|left" -         font="SansSerifSmallBold" -         height="25" -         label="Info" -         layout="topleft" -         left="0" -         name="info_btn" -         enabled="false" -         top="0" -         width="60" /> +     left="10" +     top_pad="5" +     name="buttons_cucks">          <button           follows="bottom|left"           font="SansSerifSmallBold"           height="25"           label="Teleport"           layout="topleft" -         left_pad="0" +         left="0"           name="teleport_btn"           enabled="false"           top="0" @@ -161,16 +136,5 @@           enabled="false"           top="0"           width="105" /> -        <button -         enabled="false" -         follows="bottom|right" -         font="SansSerifSmallBold" -         height="25" -         label="Verb" -         layout="topleft" -         left_pad="0" -         name="verb_btn" -         top="0" -         width="60" />      </panel>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 13efa7bcff..c154c5d21e 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -13,24 +13,15 @@          <!-- ADVANCED --> -    <check_box -     control_name="SmallAvatarNames" -     height="16" -     initial_value="true" -     label="Small Avatar Names" -     layout="topleft" -     left_delta="30" -     name="small_avatar_names_checkbox" -     top="20" -     width="200" /> +      <check_box       control_name="ArrowKeysMoveAvatar"       height="16"       label="Arrow keys always move avatar when chatting"       layout="topleft" -     left_delta="0" +     left_delta="30"       name="arrow_keys_move_avatar_check" -     top_pad="10" +     top="20"       width="237" />      <text       type="string" @@ -253,6 +244,17 @@       name="first_person_avatar_visible"       top_delta="0"       width="256" /> +     +        <check_box +     control_name="UseChatBubbles" +     height="16" +     label="Show chat bubbles" +     layout="topleft" +     left="30" +     name="bubble_text_chat" +     top_pad="5" +     width="400" /> +  </panel>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index 89d96b015f..f4696152f9 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -278,15 +278,6 @@       top_pad="40"       width="400" />      <check_box -     control_name="UseChatBubbles" -     height="16" -     label="Show chat bubbles" -     layout="topleft" -     left_delta="0" -     name="bubble_text_chat" -     top_pad="5" -     width="400" /> -    <check_box       enabled="false"       height="16"       label="Email me IMs when I'm offline" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index 2d42757150..95d8d2ce2a 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -263,13 +263,23 @@       name="show_my_name_checkbox"       top_pad="5"       width="300" /> +    <check_box +     control_name="SmallAvatarNames" +     height="16" +     initial_value="true" +     label="Small name tags" +     layout="topleft" +     left_delta="175" +     name="small_avatar_names_checkbox" +     top_delta="0" +     width="200" />     <check_box  	 enabled_control="AvatarNameTagMode"       control_name="RenderShowGroupTitleAll"       height="16"       label="Show group titles"       layout="topleft" -     left_delta="0" +     left_delta="-175"       name="show_all_title_checkbox"       top_pad="5"       width="300" /> diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index 2b21c05283..2a49db8d4f 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -2,21 +2,22 @@  <panel   bevel_style="in"   follows="left|top|right|bottom" - height="625" - label="Profile" + height="570" + width="295" + border="false"   layout="topleft" - left="10" + left="0" + top="0" + label="Profile"   mouse_opaque="false" - name="panel_profile" - top="10" - width="305"> + name="panel_profile">      <panel.string       name="CaptionTextAcctInfo">          [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]      </panel.string>      <panel.string       name="AcctTypeResident"> -        Resident. +        Resident      </panel.string>      <panel.string       name="AcctTypeTrial"> @@ -70,51 +71,41 @@       color="DkGray2"       follows="left|top|right|bottom"       height="570" +     width="265"       layout="topleft" -     left="8" -     name="profile_scroll" +     left="5" +     top_pad="0" +     border="false"       opaque="true" -     reserve_scroll_corner="false" -     width="260"> +     name="profile_scroll" +     reserve_scroll_corner="false">           <panel -         height="680" +         height="300"           layout="topleft"           left="0"           top="0" -         width="280"> -            <text  -             type="string" -             follows="top|left|right" -             font="SansSerifHugeBold"  -             height="20"  -             layout="topleft"  -             left="9"  -             name="user_name"  -             text_color="white"  -             top="0"  -             mouse_opaque="true"  -             width="250"> -              (Loading...) -            </text>  + bevel_style="in" +     width="265">                 <panel                   follows="left|top"                   height="100"                   layout="topleft"                   left="10" + bevel_style="in"                   name="second_life_image_panel"                   top="20" -                 width="250"> +                 width="230">                      <texture_picker                       allow_no_texture="true"                       default_image_name="None"                       enabled="false"                       follows="top|left" -                     height="100" +                     height="125"                       layout="topleft"                       left="0"                       name="2nd_life_pic"                       top="0" -                     width="100" /> +                     width="125" />                      <text               type="string"               follows="left|top" @@ -130,12 +121,12 @@              </text>              <text               type="string" -             top_pad="4" +             left_pad="10" +             top_pad="5"               follows="left|top|right"               font="SansSerifSmall" -             height="75" +             height="125"               layout="topleft" -             left_delta="0"               name="sl_description_edit"               text_color="LtGray"               width="125" @@ -147,7 +138,7 @@                   follows="left|top"                   height="100"                   layout="topleft" -                 left="10"  +                 left="10"                   name="first_life_image_panel"                   top_pad="20"                   width="125"> @@ -156,12 +147,12 @@                       default_image_name="None"                       enabled="false"                       follows="top|left" -                     height="100" +                     height="125"                       layout="topleft"                       left="0"                       name="real_world_pic"                       top_pad="0" -                     width="100" /> +                     width="125" />                      <text               type="string"               follows="left|top" @@ -179,9 +170,9 @@               type="string"               follows="left|top|right"               font="SansSerifSmall" -             height="45" +             height="125"               layout="topleft" -             left_delta="0" +             left_pad="10"               top_pad="10"               name="fl_description_edit"               text_color="LtGray" @@ -190,63 +181,20 @@                  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.              </text>                    </panel> -            <text -             type="string" -             follows="left|top" -             font="SansSerifBold" -             height="15" -             layout="topleft" -             halign="right" -             left="10" -             name="title_groups_text" -             text_color="white" -             top_pad="20" -             width="100"> -                Groups: -            </text> -            <text +            <link               type="string"               follows="left|top|right"               font="SansSerifSmall" -             height="45" -             layout="topleft" -             left_pad="10" -             top_delta="0" -             name="sl_groups" -             text_color="LtGray" -             width="125" -             word_wrap="true"> -                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. -            </text> -            <text -             type="string" -             follows="left|top" -             font="SansSerifBold"               height="15" -             halign="right" -             layout="topleft" -             left="10" -             name="title_homepage_text" -             text_color="white"               top_pad="20" -             width="100"> -                Homepage: -            </text> -            <text -             type="string" -             follows="left|top|right" -             font="SansSerifSmall" -             font.style="UNDERLINE" -             font_shadow="hard"  -             height="15" -             top_delta="0"               layout="topleft" -             left_pad="10" +             left="10"               name="homepage_edit" -             text_color="0.2 0.2 1 1" -             width="125"> +             text_color="HTMLLinkColor" +             hover_color="0.5 0.4 1 1" +             width="280">                  TODO -            </text> +            </link>              <text               type="string"               follows="left|top" @@ -287,7 +235,7 @@               name="title_acc_status_text"               text_color="white"               width="100"> -                Account status: +                Status:              </text>              <text               type="string" @@ -339,65 +287,88 @@                   word_wrap="true">                      [FIRST] [LAST]                  </text> -                <text +                <link                   type="string"                   follows="top|right"                   font="SansSerifSmall" -                 font.style="UNDERLINE" -                 font_shadow="hard"                    height="15"                   layout="topleft"                   left_delta="0"                   name="partner_edit_link" -                 text_color="0.2 0.2 1 1" +                 text_color="HTMLLinkColor" +                 hover_color="0.5 0.4 1 1"                   top_delta="15"                   width="40">                      Edit -                </text> +                </link>              </panel> -            -           <panel +            <text +             type="string" +             follows="left|top" +             font="SansSerifBold" +             height="15" +             layout="topleft" +             halign="right" +             left="10" +             name="title_groups_text" +             text_color="white" +             top_pad="20" +             width="100"> +                Groups: +            </text> +            <text +             type="string" +             follows="left|top|right|bottom" +             font="SansSerifSmall" +             height="120" +             layout="topleft" +             left_pad="10" +             top_delta="0" +             name="sl_groups" +             text_color="LtGray" +             width="125" +             word_wrap="true"> +                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. +            </text> +           <!--panel               follows="left|top|right"               height="15"               layout="topleft"               left="50" -             top_pad="40" +             top_pad="30"               name="account_actions_panel"               width="200"> -                <text +                <link                   type="string"                   follows="left|top"                   font="SansSerif" -                 font.style="UNDERLINE" -                 font_shadow="hard"                    height="15"                   layout="topleft"                   left="0"                   name="payment_update_link" -                 text_color="0.2 0.2 1 1" +                 text_color="HTMLLinkColor" +                 hover_color="0.5 0.4 1 1"                   top="0"                   width="100">                      Update -                </text> -                <text -                 type="string" +                </link> +                <link                   follows="left|top"                   font="SansSerif" -                 font.style="UNDERLINE" -                 font_shadow="hard"                    height="15"                   layout="topleft"                   left="70"                   name="my_account_link" -                 text_color="0.2 0.2 1 1" +                 text_color="HTMLLinkColor" +                 hover_color="0.5 0.4 1 1"                   top="0"                   width="80">                      My Account -                </text> -            </panel> -            -            -            +                </link> +            </panel--> + + +             <!--             <panel               follows="left|top|right" @@ -431,14 +402,14 @@                      TBD                   </text>          </panel>  --> -            <panel +            <!--panel               follows="left|top|right"               height="80"               layout="topleft"               left="0"               name="status_me_panel"               top_pad="20" -             width="250"> +             width="125">                  <text                   type="string"                   follows="left|top" @@ -499,25 +470,25 @@                   name="status_me_message_edit"                   select_on_focus="true"                   text_color="0.5 0.5 0.5 1" -                 width="250"> +                 width="230">                      Type a message about what you're doing in SL!                  </line_editor> +            </panel--> + + + +              </panel> -             -          -             -             -            </panel> -             +      </scroll_container>      <panel -     bottom="625"       follows="bottom|left"       height="30" +     width="280"       layout="topleft" -     left="8" -     name="profile_buttons_panel" -     width="280"> +     left="10" +     top_pad="5" +     name="profile_buttons_panel">          <button           follows="bottom|left"           font="SansSerifSmallBold" @@ -560,7 +531,7 @@           name="teleport"           top="0"           width="75" /> -        <button + <!--       <button           enabled="false"           follows="bottom|left"           font="SansSerifSmallBold" @@ -570,17 +541,17 @@           left_pad="0"           name="share"           top="0" -         width="60" /> -    </panel>  +         width="60" />--> +    </panel>     <panel -     bottom="625"       follows="bottom|left"       height="30" +     width="280"       layout="topleft" -     left="8" -     name="profile_me_buttons_panel" +     left="10" +     top_pad="5"       visible="false" -     width="345"> +     name="profile_me_buttons_panel">          <button           follows="bottom|left"           font="SansSerifSmallBold" @@ -601,5 +572,5 @@           name="edit_appearance_btn"           top="0"           width="130" /> -    </panel>  +    </panel>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml index 2466480d16..a14d8bbc6b 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml @@ -2,63 +2,76 @@  <panel   background_visible="true"   follows="left|top|right|bottom" - height="660" +  width="305" +  height="650"   label="Profile" + bevel_style="in"   layout="topleft"   left="0"   name="panel_target_profile" - top="0" - width="250"> -    <button  -     layout="topleft"  -     name="back"  -     left="5"  -     top="5"  -     width="20"  -     height="20"  -     label="" -     tab_stop="false" -     follows="top|left" -     image_selected="navbar_bg_button.tga" -     image_unselected="navbar_bg_button.tga" -     image_overlay="navbar_back.tga"/> -    <text  -     layout="topleft"  -     top="0"  -     left_pad="15"  -     width="125"  -     height="20"  -     font="SansSerifHugeBold"  -     text_color="white"  + top="0"> +    <text +     layout="topleft" +     top="0" +     left="10" +     width="250" +     height="20" +     font="SansSerifHugeBold" +     text_color="white"       follows="top|left|right" -     mouse_opaque="true"  +     mouse_opaque="true"       name="user_name">(Loading...)</text> +    <text +     layout="topleft" +     width="100" +     height="16" +     left="10" +     top_pad="5" +     font="SansSerifTiny" +     text_color="LtGray_50" +     follows="top|left" +     mouse_opaque="true" +     name="status">Online</text> +    <button +     layout="topleft" +     name="back" +     right="-10" +     top="0" +     width="25" +     height="25" +     label="" +     tab_stop="false" +     follows="top|right" +     image_selected="" +     image_unselected="" +     image_overlay="BackArrow_Off" />      <tab_container       follows="left|top|right|bottom" -     height="625" +     height="550" +     width="306" +     tab_min_width="75"       layout="topleft" -     left="0" +     left="10"       name="tabs"       tab_position="top" -     top="35" -     width="280"> +     top_pad="20">          <panel           class="panel_profile"           filename="panel_profile.xml"           label="Profile"           layout="topleft" -         name="panel_profile"/> +         name="panel_profile" />          <panel           class="panel_picks"           filename="panel_picks.xml"           label="Picks"           layout="topleft" -         name="panel_picks"/> +         name="panel_picks" />          <panel           class="panel_notes"           filename="panel_notes.xml" -         label="Notes" +         label="Notes & Privacy"           layout="topleft" -         name="panel_notes"/> +         name="panel_notes" />      </tab_container>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml index 8953633276..58be74a598 100644 --- a/indra/newview/skins/default/xui/en/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml @@ -50,9 +50,16 @@          filename="panel_profile_view.xml"          border="true"        /> +      <panel  +        class="panel_group_info_sidetray"  +        name="panel_group_info_sidetray"  +        filename="panel_group_info_sidetray.xml"  +        label="Group Info"  +        border="true" +      /> +      </panel_container>    </sidetray_tab> -  <!-- *TODO Vadim: isn't the sidetray_tab "label" attribute redundant since we have "tab_title" ? -->    <sidetray_tab       name="sidebar_places"      tab_title="Places" @@ -67,7 +74,7 @@          class="panel_places"           name="panel_places"           filename="panel_places.xml"  -        label="Places"  +        label="Places"          border="true"        />    </sidetray_tab> @@ -82,94 +89,14 @@      bg_opaque_color="0.5 0.5 0.5 1.0"    >        <panel  -        class="panel_me_profile"  +        class="panel_me_profile_view"           name="panel_me_profile"           filename="panel_me_profile.xml"          label="Me"           border="true"        />    </sidetray_tab> -      <!-- -  <sidetray_tab  -    name="sidebar_group" -    mouse_opaque="false"  -    background_visible="true"  -    bg_opaque_color="0.5 0.5 0.5 1.0" -    image="icn_voice-groupfocus.tga" -    tab_title="Groups" -    description="Manage Groups." -  > -    <accordion_tab  -      name="group_accordion"  -      title="Group General" -      expanded="true" -      collapsible="true"  -      min_width="200"  -      min_height="200"  -      header_visible="true" -    > -      <panel  -        class="panel_group_general"  -        name="panel_group_general"  -        filename="panel_group_general.xml"  -        label="Group"  -        border="true" -      /> -    </accordion_tab> -     <accordion_tab  -      name="groupland_accordion"  -      title="Group Land and Money" -      expanded="false" -      collapsible="true"  -      min_width="200"  -      min_height="200"  -      header_visible="true" -    > -      <panel  -        class="panel_group_land"  -        name="panel_group_land"  -        filename="panel_group_land_money.xml"  -        label="Group"  -        border="true" -      /> -    </accordion_tab> -     <accordion_tab  -      name="groupnotices_accordion"  -      title="Group Notices" -      expanded="false" -      collapsible="true"  -      min_width="200"  -      min_height="200"  -      header_visible="true" -    > -      <panel  -        class="panel_group_roles"  -        name="panel_group_roles"  -        filename="panel_group_roles.xml"  -        label="Group"  -        border="true" -      /> -    </accordion_tab> -     <accordion_tab  -      name="grouproles_accordion"  -      title="Group Roles" -      expanded="false" -      collapsible="true"  -      min_width="200"  -      min_height="200"  -      header_visible="true" -    > -      <panel  -        class="panel_group_roles"  -        name="panel_group_roles"  -        filename="panel_group_roles.xml"  -        label="Group"  -        border="true" -      /> -    </accordion_tab> -  </sidetray_tab>   -     <sidetray_tab 	      name="sidebar_previews"  @@ -659,5 +586,25 @@    </sidetray_tab>   -->  + +  <sidetray_tab +    name="sidebar_appearance" +    tab_title="Appearance" +    description="Change your looks and appearance." +    image="TabIcon_Appearance_Off" +    mouse_opaque="false"  +    background_opaque="false"  +    background_visible="true"  +    bg_opaque_color="0.5 0.5 0.5 1.0" +  > +      <panel  +        class="panel_appearance" +        name="panel_appearance"  +        filename="panel_appearance.xml"  +        border="true"  +      /> +  </sidetray_tab> + +  </side_tray> 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 a85662603d..f10161cecd 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 @@ -85,6 +85,31 @@        				mouse_opaque="false" name="tab_description" >      					Change your profile, your look and quick links to your outfits.    				</text> +		</panel> +		<panel  +			left="10" width="280" height="130"  +			background_visible="true"  +			background_opaque="false"  +			bg_alpha_color="0.3 0.3 0.3 1.0"  +			name="sidebar_appearance" +			follows="left|top|right" +			class="panel_sidetray_home_info"> +    			<text +        			top="-10" width="200" left="5" height="30" follows="left|right|top" +        			font="SansSerifHugeBold" text_color="white" word_wrap="true" +        			mouse_opaque="false" name="tab_name" > +					Appearance +    			</text> +    			<icon +      				top="-10" right="-10" width="20" height="20" follows="top|right" +      				color="1 1 1 1" enabled="true" image_name="inv_item_shirt.tga" +      				mouse_opaque="false" name="tab_icon"/> +  				<text +      				top="-40" left="10" right="-10" height="120" follows="left|right|bottom" +      				font="SansSerifBig" text_color="white" word_wrap="true" +      				mouse_opaque="false" name="tab_description" >     +					Change your appearance. +  				</text>  		</panel>   </panel>     
\ No newline at end of file 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 9bf401d817..82b7e02aeb 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -35,6 +35,10 @@       name="timeTooltip">          [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]      </panel.string> +	<panel.string +     name="buycurrencylabel"> +        L$ [AMT] +    </panel.string>      <button       auto_resize="true"       follows="right|bottom" 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 new file mode 100644 index 0000000000..eccb919b04 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- All our XML is utf-8 encoded. --> + +<panel +	name="sys_well_item" +	title="sys_well_item" +  visible="false" +  top="0"  +  left="0"  +	width="318" +	height="35" +  layout="topleft" +  follows="top" +  background_opaque="false" +  background_visible="true" +  bg_alpha_color="0.0 0.0 0.0 0.0" > + +  <icon +    top="8" +    left="8" +    width="20" +    height="20" +    layout="topleft" +    follows="left" +    name="icon" +    label="" +    mouse_opaque="false" +    image_name="lag_status_warning.tga"  +    /> + +  <text +    top="2"  +    left_pad="8"  +    width="255"  +    height="28"  +    layout="topleft" +    follows="right|left" +    font="SansSerifBold"  +    text_color="white" +    use_ellipses="true"  +    word_wrap="true" +    mouse_opaque="false" +    name="title" > +    Select your streaming media preference. Select your streaming media preference. +  </text>   +   +  <button +    top="5"  +    left_pad="5"  +    width="15"  +    height="15"  +    layout="topleft" +    follows="right" +    name="close_btn"  +    mouse_opaque="true" +    label="" +    image_unselected="toast_hide_btn.tga"  +    image_disabled="toast_hide_btn.tga" +    image_selected="toast_hide_btn.tga"  +    image_hover_selected="toast_hide_btn.tga" +    image_disabled_selected="toast_hide_btn.tga"  +  /> + +</panel>  diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml index ba4915e074..f7d8cf948e 100644 --- a/indra/newview/skins/default/xui/en/panel_toast.xml +++ b/indra/newview/skins/default/xui/en/panel_toast.xml @@ -1,9 +1,9 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <!-- All our XML is utf-8 encoded. --> -<panel +<floater  	name="toast" -	title="toast" +	title=""    visible="false"    layout="topleft"  	width="350" @@ -14,6 +14,12 @@    background_opaque="true"    background_visible="true"    bevel_style="in" +  can_minimize="false" +  can_tear_off="false" +  can_resize="false" +  can_drag_on_left="false" +  can_close="false" +  can_dock="false"      bg_alpha_color="0.3 0.3 0.3 1.0">    <text @@ -62,4 +68,4 @@      image_hover_selected="toast_hide_btn.tga"      image_disabled_selected="toast_hide_btn.tga"    /> -</panel>  +</floater>  diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index bc364687e9..0ed473a01a 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -320,7 +320,14 @@  	<string name="GroupNotifyViewPastNotices">View past notices or opt-out of receiving these messages here.</string>  	<string name="GroupNotifyOpenAttachment">Open Attachment</string>  	<string name="GroupNotifySaveAttachment">Save Attachment</string> -	 +  <string name="TeleportOffer">Teleport offering</string> +  <!-- start-up toast's string--> +  <string name="StartUpNotification">%d new notification arrived while you were away...</string> +  <string name="StartUpNotifications">%d new notifications arrived while you were away...</string> +  <!-- overflow toast's string--> +  <string name="OverflowInfoChannelString">You have %d more notification</string> +   +    	<!-- body parts -->  	<string name="BodyPartsRightArm">Right Arm</string>  	<string name="BodyPartsHead">Head</string> @@ -402,6 +409,8 @@ this texture in your inventory  	<string name="InvFolder Animations">Animations</string>  	<string name="InvFolder Gestures">Gestures</string>  	<string name="InvFolder favorite">Favorites</string> +	<string name="InvFolder Current Outfit">Current Outfit</string> +	<string name="InvFolder My Outfits">My Outfits</string>  	<!-- inventory FVBridge -->  	<string name="Buy">Buy</string> @@ -733,7 +742,195 @@ If you continue to receive this message, contact customer support.  If you continue to receive this message, contact customer support.  	</string> -	<!-- Group Information --> -	 -	 +	<!-- Avatar Shape Information --> +    <string name="Attached Earlobes">Attached Earlobes</string> +	<string name="Arm Length">Arm Length</string>	 +    <string name="Back Bangs Down">Back Bangs Down</string> +    <string name="Back Bangs Up">Back Bangs Up</string> +    <string name="Back Hair Down">Back Hair Down</string> +    <string name="Back Hair Up">Back Hair Up</string> +    <string name="Belly Size">Belly Size</string>	 +	<string name="Blonde Hair">Blonde Hair</string> +    <string name="Big Eyeball">Big Eyeball</string> +    <string name="Big Hair Back">Big Hair Back</string> +    <string name="Big Hair Front">Big Hair Front</string> +    <string name="Big Hair Top">Big Hair Top</string> +	<string name="Body Fat">Body Fat</string> +    <string name="Body Thickness">Body Thickness</string> +    <string name="Breast Buoyancy">Breast Buoyancy</string> +    <string name="Breast Cleavage">Breast Cleavage</string> +	<string name="Breast Size">Breast Size</string> +    <string name="Bridge Width">Bridge Width</string> +    <string name="Brow Size">Brow Size</string> +    <string name="Butt Size">Butt Size</string> +    <string name="Cheek Bones">Cheek Bones</string> +    <string name="Chest Size">Chest Size</string> +    <string name="Chin Angle">Chin Angle</string> +    <string name="Chin Cleft">Chin Cleft</string> +    <string name="Chin Depth">Chin Depth</string> +    <string name="Chin-Neck">Chin-Neck</string> +	<string name="Collar Back">Collar Back</string> +	<string name="Collar Front">Collar Front</string> +    <string name="Crooked Nose">Crooked Nose</string> +    <string name="Cuff Flare">Cuff Flare</string> +    <string name="Ear Angle">Ear Angle</string> +    <string name="Ear Size">Ear Size</string> +    <string name="Ear Tips">Ear Tips</string> +    <string name="Egg Head">Egg Head</string> +    <string name="Eye Bags">Eye Bags</string> +	<string name="Eye Color">Eye Color</string> +    <string name="Eye Depth">Eye Depth</string> +	<string name="Eye Lightness">Eye Lightness</string> +    <string name="Eye Opening">Eye Opening</string> +    <string name="Eye Pop">Eye Pop</string> +    <string name="Eye Size">Eye Size</string> +    <string name="Eye Spacing">Eye Spacing</string> +    <string name="Eyeball Size">Eyeball Size</string> +    <string name="Eyebrow Arc">Eyebrow Arc</string> +    <string name="Eyebrow Height">Eyebrow Height</string> +    <string name="Eyebrow Points">Eyebrow Points</string> +    <string name="Eyelash Length">Eyelash Length</string> +	<string name="Eyeliner">Eyeliner</string> +	<string name="Eyeliner Color">Eyeliner Color</string> +	<string name="Face Shear">Face Shear</string> +	<string name="Facial Definitionr">Facial Definition</string> +    <string name="Fat Head">Fat Head</string> +    <string name="Fat Lower Lip">Fat Lower Lip</string> +    <string name="Fat Torso">Fat Torso</string> +    <string name="Fat Upper Lip">Fat Upper Lip</string> +    <string name="Foot Size">Foot Size</string> +	<string name="Freckles">Freckles</string> +    <string name="Front Bangs Down">Front Bangs Down</string> +    <string name="Front Bangs Up">Front Bangs Up</string> +    <string name="Front Hair Down">Front Hair Down</string> +    <string name="Front Hair Up">Front Hair Up</string> +	<string name="Forehead Angle">Forehead Angle</string> +    <string name="Full Hair Sides">Full Hair Sides</string> +	<string name="Glove Fingers">Glove Fingers</string>  +	<string name="Glove Length">Glove Length</string> +    <string name="Hair Thickess">Hair Thickess</string> +    <string name="Hair Tilted Left">Hair Tilted Left</string> +    <string name="Hair Tilted Right">Hair Tilted Right</string> +    <string name="Hair Volume">Hair Volume</string> +	<string name="Hand Size">Hand Size</string> +	<string name="Head Length">Head Length</string> +    <string name="Head Shape">Head Shape</string> +    <string name="Head Size">Head Size</string> +    <string name="Head Stretch">Head Stretch</string> +    <string name="Heel Height">Heel Height</string> +    <string name="Heel Shape">Heel Shape</string> +    <string name="Height">Height</string> +    <string name="Hip Width">Hip Width</string> +	<string name="Hip Length">Hip Length</string> +    <string name="Inner Eye Corner">Inner Eye Corner</string> +    <string name="Jacket Length">Jacket Length</string> +    <string name="Jacket Wrinkles">Jacket Wrinkles</string> +    <string name="Jowls">Jowls</string>	 +    <string name="Jaw Angle">Jaw Angle</string> +    <string name="Jaw Jut">Jaw Jut</string> +    <string name="Jaw Shape">Jaw Shape</string> +    <string name="Knee Angle">Knee Angle</string> +    <string name="Left Part">Left Part</string> +    <string name="Leg Muscles">Leg Muscles</string> +	<string name="Leg Length">Leg Length</string> +    <string name="Lip Cleft">Lip Cleft</string> +    <string name="Lip Cleft Depth">Lip Cleft Depth</string> +    <string name="Lip Fullness">Lip Fullness</string> +	<string name="Lip Pinkness">Lip Pinkness</string> +    <string name="Lip Ratio">Lip Ratio</string> +    <string name="Lip Thickness">Lip Thickness</string>	 +    <string name="Lip Width">Lip Width</string> +    <string name="Longcuffs">Longcuffs</string> +    <string name="Love Handles">Love Handles</string> +    <string name="Lower Bridge">Lower Bridge</string> +    <string name="Lower Cheeks">Lower Cheeks</string> +    <string name="Middle Part">Middle Part</string> +    <string name="Mouth Corner">Mouth Corner</string> +    <string name="Mouth Position">Mouth Position</string> +	<string name="Nail Polish">Nail Polish</string> +	<string name="Nail Polish Color">Nail Polish Color</string> +	<string name="Neck Length">Neck Length</string> +	<string name="Neck Thickness">Neck Thickness</string> +    <string name="Nose Size">Nose Size</string> +    <string name="Nose Thickness">Nose Thickness</string> +    <string name="Nose Tip Angle">Nose Tip Angle</string> +    <string name="Nose Tip Shape">Nose Tip Shape</string> +    <string name="Nose Width">Nose Width</string> +    <string name="Nostril Division">Nostril Division</string> +    <string name="Nostril Width">Nostril Width</string> +    <string name="Open Front">Open Front</string> +    <string name="Outer Eye Corner">Outer Eye Corner</string> +	<string name="Outer Shadow">Outer Shadow</string> +	<string name="Out Shdw Opacity">Out Shdw Opacity</string> +	<string name="Out Shdw Color">Out Shdw Color</string>	 +    <string name="Package">Package</string> +    <string name="Pants Crotch">Pants Crotch</string>  +	<string name="Pants Fit">Pants Fit</string> +	<string name="Pants Length">Pants Length</string> +	<string name="Pants Waist">Pants Waist</string> +	<string name="Pants Wrinkles">Pants Wrinkles</string> +    <string name="Part Bangs">Part Bangs</string> +    <string name="Pectorals">Pectorals</string> +    <string name="Platform Height">Platform Height</string> +    <string name="Platform Width">Platform Width</string> +	<string name="Pigment">Pigment</string> +    <string name="Puffy Eyelids">Puffy Eyelids</string> +	<string name="Rainbow Color">Rainbow Color</string> +	<string name="Red Hair">Red Hair</string> +    <string name="Right Part">Right Part</string> +    <string name="Round Forehead">Round Forehead</string> +	<string name="Rosy Complexion">Rosy Complexion</string> +    <string name="Ruddiness">Ruddiness</string> +    <string name="Rumpled Hair">Rumpled Hair</string> +    <string name="Saddle Bags">Saddle Bags</string> +    <string name="Scrawny Leg">Scrawny Leg</string> +    <string name="Shear Back">Shear Back</string> +    <string name="Shear Face">Shear Face</string> +    <string name="Shear Front">Shear Front</string> +    <string name="Shift Mouth">Shift Mouth</string> +	<string name="Shirt Bottom">Shirt Bottom</string> +    <string name="Shirt Fit">Shirt Fit</string> +	<string name="Shirt Wrinkles">Shirt Wrinkles</string> +	<string name="Shoe Height">Shoe Height</string> +    <string name="Shoulders">Shoulders</string> +    <string name="Side Bangs Down">Side Bangs Down</string> +    <string name="Side Bangs Up">Side Bangs Up</string> +    <string name="Sides Hair Down">Sides Hair Down</string> +    <string name="Sides Hair Up">Sides Hair Up</string> +    <string name="Skirt Fit">Skirt Fit</string> +	<string name="Skirt Length">Skirt Length</string> +    <string name="Slanted Forehead">Slanted Forehead</string>  +	<string name="Sleeve Length">Sleeve Length</string> +    <string name="Sleeve Looseness">Sleeve Looseness</string>  +	<string name="Slit Back">Slit Back</string>  +	<string name="Slit Front">Slit Front</string>  +	<string name="Slit Left">Slit Left</string>  +	<string name="Slit Right">Slit Right</string>  +	<string name="Socks Length">Socks Length</string> +    <string name="Spiked Hair">Spiked Hair</string> +    <string name="Squash/Stretch Head">Squash/Stretch Head</string> +    <string name="Swept Back Hair">Swept Back Hair</string> +    <string name="Swept Forward Hair">Swept Forward Hair</string> +    <string name="Taper Back">Taper Back</string> +    <string name="Taper Front">Taper Front</string> +    <string name="Toe Shape">Toe Shape</string> +    <string name="Toe Thickness">Toe Thickness</string> +	<string name="Toe Length">Toe Length</string> +	<string name="Torso Length">Torso Length</string> +    <string name="Torso Muscles">Torso Muscles</string> +    <string name="Torso Scrawny">Torso Scrawny</string> +    <string name="Upper Bridge">Upper Bridge</string> +    <string name="Upper Cheeks">Upper Cheeks</string> +    <string name="Upper Chin Cleft">Upper Chin Cleft</string> +    <string name="Upper Eyelid Fold">Upper Eyelid Fold</string> +	<string name="Waist Height">Waist Height</string> +	<string name="White Hair">White Hair</string> +    <string name="big belly skirt">big belly skirt</string> +    <string name="bigbutt skirt">bigbutt skirt</string> +    <string name="bustle skirt">bustle skirt</string> +    <string name="legs skirt">legs skirt</string> +    <string name="loose skirt">loose skirt</string> +    <string name="poofy skirt">poofy skirt</string> +    <string name="tight skirt">tight skirt</string>	 +	<string name="wrinkles">wrinkles</string>	  </strings> diff --git a/indra/newview/skins/default/xui/en/widgets/check_box.xml b/indra/newview/skins/default/xui/en/widgets/check_box.xml index 97060fb161..bbb5e9b56a 100644 --- a/indra/newview/skins/default/xui/en/widgets/check_box.xml +++ b/indra/newview/skins/default/xui/en/widgets/check_box.xml @@ -13,5 +13,7 @@                            image_unselected="Checkbox_Off"                            image_selected="Checkbox_On"                            image_disabled="Checkbox_Off_Disabled" -                          image_disabled_selected="Checkbox_On_Disabled" /> +                          image_disabled_selected="Checkbox_On_Disabled" +                          image_pressed="Checkbox_Press" +                          image_pressed_selected="Checkbox_On_Press"/>  </check_box> diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml index eb9bb99b20..777651c452 100644 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -42,7 +42,7 @@    <combo_list bg_writeable_color="MenuDefaultBgColor"/>    <combo_editor name="Combo Text Entry"                  text_pad_left="20" -                select_on_focus="true" +                select_on_focus="false"                  font="SansSerifSmall"                  bevel_style="none"                  border_style="line" diff --git a/indra/newview/skins/default/xui/en/widgets/radio_item.xml b/indra/newview/skins/default/xui/en/widgets/radio_item.xml index 281a55d5e2..dd848f3acd 100644 --- a/indra/newview/skins/default/xui/en/widgets/radio_item.xml +++ b/indra/newview/skins/default/xui/en/widgets/radio_item.xml @@ -5,6 +5,8 @@                            image_unselected="RadioButton_Off"                            image_selected="RadioButton_On"                            image_disabled="RadioButton_Disabled" -                          image_disabled_selected="RadioButton_On_Disabled"/> +                          image_disabled_selected="RadioButton_On_Disabled" +                          image_pressed="RadioButton_Press" +                          image_pressed_selected="RadioButton_On_Press"/>  </radio_item> 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 b33acf81cc..bc1ca339a2 100644 --- a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml +++ b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml @@ -3,5 +3,7 @@              thumb_outline_color="SliderThumbOutlineColor"              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" /> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 3270cba58c..aa9594f0c9 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -220,6 +220,9 @@ class WindowsManifest(ViewerManifest):                  self.path("Microsoft.VC80.CRT.manifest")
              self.end_prefix()
 +        # The config file name needs to match the exe's name.
 +        self.path(src="%s/secondlife-bin.exe.config" % self.args['configuration'], dst=self.final_exe() + ".config")
 +
          # Mozilla runtime DLLs (CP)
          if self.prefix(src=self.args['configuration'], dst=""):
              self.path("freebl3.dll")
 @@ -248,9 +251,6 @@ class WindowsManifest(ViewerManifest):          # Mozilla hack to get it to accept newer versions of msvc*80.dll than are listed in manifest
          # necessary as llmozlib2-vc80.lib refers to an old version of msvc*80.dll - can be removed when new version of llmozlib is built - Nyx
 -        # The config file name needs to match the exe's name.
 -        self.path("SecondLife.exe.config", dst=self.final_exe() + ".config")
 -
          # Vivox runtimes
          if self.prefix(src=self.args['configuration'], dst=""):
              self.path("SLVoice.exe")
  | 
