diff options
Diffstat (limited to 'indra')
35 files changed, 427 insertions, 312 deletions
diff --git a/indra/llcommon/lldarray.h b/indra/llcommon/lldarray.h index a8cd03b42a..131b819c99 100644 --- a/indra/llcommon/lldarray.h +++ b/indra/llcommon/lldarray.h @@ -51,7 +51,7 @@ public:  	LLDynamicArray(S32 size=0) : std::vector<Type>(size) { if (size < BlockSize) std::vector<Type>::reserve(BlockSize); } -	void reset() { std::vector<Type>::resize(0); } +	void reset() { std::vector<Type>::clear(); }  	// ACCESSORS  	const Type& get(S32 index) const	 			{ return std::vector<Type>::operator[](index); } diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index bd65ce8573..b209e4aa38 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -28,10 +28,14 @@  #define LL_LLVERSIONVIEWER_H  const S32 LL_VERSION_MAJOR = 2; -const S32 LL_VERSION_MINOR = 2; -const S32 LL_VERSION_PATCH = 1; +const S32 LL_VERSION_MINOR = 4; +const S32 LL_VERSION_PATCH = 0;  const S32 LL_VERSION_BUILD = 0;  const char * const LL_CHANNEL = "Second Life Developer"; +#if LL_DARWIN +const char * const LL_VERSION_BUNDLE_ID = "com.secondlife.snowglobe.viewer"; +#endif +  #endif diff --git a/indra/llui/llmenubutton.cpp b/indra/llui/llmenubutton.cpp index 3df05f4d3f..c1b5efaa72 100644 --- a/indra/llui/llmenubutton.cpp +++ b/indra/llui/llmenubutton.cpp @@ -45,7 +45,8 @@ LLMenuButton::Params::Params()  LLMenuButton::LLMenuButton(const LLMenuButton::Params& p)  :	LLButton(p),  	mMenu(NULL), -	mMenuVisibleLastFrame(false) +	mMenuVisibleLastFrame(false), +	mMenuPosition(MP_BOTTOM_LEFT)  {  	std::string menu_filename = p.menu_filename; @@ -57,38 +58,51 @@ LLMenuButton::LLMenuButton(const LLMenuButton::Params& p)  			llwarns << "Error loading menu_button menu" << llendl;  		}  	} + +	updateMenuOrigin();  } -void LLMenuButton::toggleMenu() +boost::signals2::connection LLMenuButton::setMouseDownCallback( const mouse_signal_t::slot_type& cb )  { -    if(!mMenu) -		return; +	return LLUICtrl::setMouseDownCallback(cb); +} -	if (mMenu->getVisible() || mMenuVisibleLastFrame) -	{ -		mMenu->setVisible(FALSE); -	} -	else +void LLMenuButton::hideMenu() +{ +	if(!mMenu) return; +	mMenu->setVisible(FALSE); +} + +void LLMenuButton::setMenu(LLMenuGL* menu, EMenuPosition position /*MP_TOP_LEFT*/) +{ +	mMenu = menu; +	mMenuPosition = position; +} + +void LLMenuButton::draw() +{ +	//we save this off so next frame when we try to close it by +	//button click, and it hides menus before we get to it, we know +	mMenuVisibleLastFrame = mMenu && mMenu->getVisible(); + +	if (mMenuVisibleLastFrame)  	{ -	    LLRect rect = getRect(); -		//mMenu->needsArrange(); //so it recalculates the visible elements -		LLMenuGL::showPopup(getParent(), mMenu, rect.mLeft, rect.mBottom); +		setForcePressedState(true);  	} -} +	LLButton::draw(); -void LLMenuButton::hideMenu()  -{  -	if(!mMenu) -		return; -	mMenu->setVisible(FALSE);  +	setForcePressedState(false);  } -  BOOL LLMenuButton::handleKeyHere(KEY key, MASK mask )  {  	if( KEY_RETURN == key && mask == MASK_NONE && !gKeyboard->getKeyRepeated(key))  	{ +		// *HACK: We emit the mouse down signal to fire the callback bound to the +		// menu emerging event before actually displaying the menu. See STORM-263. +		LLUICtrl::handleMouseDown(-1, -1, MASK_NONE); +  		toggleMenu();  		return TRUE;  	} @@ -104,34 +118,52 @@ BOOL LLMenuButton::handleKeyHere(KEY key, MASK mask )  BOOL LLMenuButton::handleMouseDown(S32 x, S32 y, MASK mask)  { -	if (hasTabStop() && !getIsChrome()) -	{ -		setFocus(TRUE); -	} - +	LLButton::handleMouseDown(x, y, mask);  	toggleMenu(); -	if (getSoundFlags() & MOUSE_DOWN) -	{ -		make_ui_sound("UISndClick"); -	} -  	return TRUE;  } -void LLMenuButton::draw() +void LLMenuButton::toggleMenu()  { -	//we save this off so next frame when we try to close it by  -	//button click, and it hides menus before we get to it, we know -	mMenuVisibleLastFrame = mMenu && mMenu->getVisible(); -	 -	if (mMenuVisibleLastFrame) +    if(!mMenu) return; + +	if (mMenu->getVisible() || mMenuVisibleLastFrame)  	{ -		setForcePressedState(true); +		mMenu->setVisible(FALSE);  	} +	else +	{ +		mMenu->buildDrawLabels(); +		mMenu->arrangeAndClear(); +		mMenu->updateParent(LLMenuGL::sMenuContainer); -	LLButton::draw(); +		updateMenuOrigin(); -	setForcePressedState(false); +	    //mMenu->needsArrange(); //so it recalculates the visible elements +		LLMenuGL::showPopup(getParent(), mMenu, mX, mY); +	}  } +void LLMenuButton::updateMenuOrigin() +{ +	if (!mMenu)	return; + +	LLRect rect = getRect(); + +	switch (mMenuPosition) +	{ +		case MP_TOP_LEFT: +		{ +			mX = rect.mLeft; +			mY = rect.mTop + mMenu->getRect().getHeight(); +			break; +		} +		case MP_BOTTOM_LEFT: +		{ +			mX = rect.mLeft; +			mY = rect.mBottom; +			break; +		} +	} +} diff --git a/indra/llui/llmenubutton.h b/indra/llui/llmenubutton.h index 81ca0e047c..81c3592b16 100644 --- a/indra/llui/llmenubutton.h +++ b/indra/llui/llmenubutton.h @@ -42,22 +42,40 @@ public:  		Optional<std::string>	menu_filename;  		Params(); -	};	 +	}; + +	typedef enum e_menu_position +	{ +		MP_TOP_LEFT, +		MP_BOTTOM_LEFT +	} EMenuPosition; -	void toggleMenu(); +	boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb ); +  	/*virtual*/ void draw();  	/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);  	/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask ); +  	void hideMenu(); +  	LLMenuGL* getMenu() { return mMenu; } +	void setMenu(LLMenuGL* menu, EMenuPosition position = MP_TOP_LEFT); + +	void setMenuPosition(EMenuPosition position) { mMenuPosition = position; }  protected:  	friend class LLUICtrlFactory;  	LLMenuButton(const Params&); +	void toggleMenu(); +	void updateMenuOrigin(); +  private: -	LLMenuGL*	mMenu; -	bool mMenuVisibleLastFrame; +	LLMenuGL*		mMenu; +	bool 			mMenuVisibleLastFrame; +	EMenuPosition	mMenuPosition; +	S32				mX; +	S32				mY;  }; diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 6d590cf54e..a6cf86d9b8 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -1848,89 +1848,104 @@ BOOL LLMenuGL::isOpen()  	}  } -void LLMenuGL::scrollItemsUp() + + +bool LLMenuGL::scrollItems(EScrollingDirection direction)  { -	// Slowing down the items scrolling when arrow button is held  +	// Slowing down items scrolling when arrow button is held  	if (mScrollItemsTimer.hasExpired() && NULL != mFirstVisibleItem)  	{  		mScrollItemsTimer.setTimerExpirySec(.033f);  	}  	else  	{ -		return; +		return false;  	} -	item_list_t::iterator cur_item_iter; -	item_list_t::iterator prev_item_iter; -	for (cur_item_iter = mItems.begin(), prev_item_iter = mItems.begin(); cur_item_iter != mItems.end(); cur_item_iter++) +	switch (direction)  	{ -		if( (*cur_item_iter) == mFirstVisibleItem) +	case SD_UP: +	{ +		item_list_t::iterator cur_item_iter; +		item_list_t::iterator prev_item_iter; +		for (cur_item_iter = mItems.begin(), prev_item_iter = mItems.begin(); cur_item_iter != mItems.end(); cur_item_iter++)  		{ -			break; +			if( (*cur_item_iter) == mFirstVisibleItem) +			{ +				break; +			} +			if ((*cur_item_iter)->getVisible()) +			{ +				prev_item_iter = cur_item_iter; +			}  		} -		if ((*cur_item_iter)->getVisible()) + +		if ((*prev_item_iter)->getVisible())  		{ -			prev_item_iter = cur_item_iter; +			mFirstVisibleItem = *prev_item_iter;  		} +		break;  	} - -	if ((*prev_item_iter)->getVisible()) -	{ -		mFirstVisibleItem = *prev_item_iter; -	} -	 -	mNeedsArrange = TRUE; -	arrangeAndClear(); -} - -void LLMenuGL::scrollItemsDown() -{ -	// Slowing down the items scrolling when arrow button is held  -	if (mScrollItemsTimer.hasExpired()) -	{ -		mScrollItemsTimer.setTimerExpirySec(.033f); -	} -	else -	{ -		return; -	} -	 -	if (NULL == mFirstVisibleItem) -	{ -		mFirstVisibleItem = *mItems.begin(); -	} - -	item_list_t::iterator cur_item_iter; -	 -	for (cur_item_iter = mItems.begin(); cur_item_iter != mItems.end(); cur_item_iter++) +	case SD_DOWN:  	{ -		if( (*cur_item_iter) == mFirstVisibleItem) +		if (NULL == mFirstVisibleItem)  		{ -			break; +			mFirstVisibleItem = *mItems.begin();  		} -	} -	item_list_t::iterator next_item_iter; +		item_list_t::iterator cur_item_iter; -	if (cur_item_iter != mItems.end()) -	{ -		for (next_item_iter = ++cur_item_iter; next_item_iter != mItems.end(); next_item_iter++) +		for (cur_item_iter = mItems.begin(); cur_item_iter != mItems.end(); cur_item_iter++)  		{ -			if( (*next_item_iter)->getVisible()) +			if( (*cur_item_iter) == mFirstVisibleItem)  			{  				break;  			}  		} -		 -		if (next_item_iter != mItems.end() && -		    (*next_item_iter)->getVisible()) + +		item_list_t::iterator next_item_iter; + +		if (cur_item_iter != mItems.end())  		{ -			mFirstVisibleItem = *next_item_iter; +			for (next_item_iter = ++cur_item_iter; next_item_iter != mItems.end(); next_item_iter++) +			{ +				if( (*next_item_iter)->getVisible()) +				{ +					break; +				} +			} + +			if (next_item_iter != mItems.end() && +				(*next_item_iter)->getVisible()) +			{ +				mFirstVisibleItem = *next_item_iter; +			}  		} +		break;  	} -	 +	case SD_BEGIN: +	{ +		mFirstVisibleItem = *mItems.begin(); +		break; +	} +	case SD_END: +	{ +		item_list_t::reverse_iterator first_visible_item_iter = mItems.rend(); + +		// Advance by mMaxScrollableItems back from the end of the list +		// to make the last item visible. +		std::advance(first_visible_item_iter, mMaxScrollableItems); +		mFirstVisibleItem = *first_visible_item_iter; +		break; +	} +	default: +		llwarns << "Unknown scrolling direction: " << direction << llendl; +	} +  	mNeedsArrange = TRUE;  	arrangeAndClear(); + +	return true;  }  // rearrange the child rects so they fit the shape of the menu. @@ -2162,7 +2177,7 @@ void LLMenuGL::arrange( void )  					LLMenuScrollItem::Params item_params;  					item_params.name(ARROW_UP);  					item_params.arrow_type(LLMenuScrollItem::ARROW_UP); -					item_params.scroll_callback.function(boost::bind(&LLMenuGL::scrollItemsUp, this)); +					item_params.scroll_callback.function(boost::bind(&LLMenuGL::scrollItems, this, SD_UP));  					mArrowUpItem = LLUICtrlFactory::create<LLMenuScrollItem>(item_params);  					LLUICtrl::addChild(mArrowUpItem); @@ -2173,7 +2188,7 @@ void LLMenuGL::arrange( void )  					LLMenuScrollItem::Params item_params;  					item_params.name(ARROW_DOWN);  					item_params.arrow_type(LLMenuScrollItem::ARROW_DOWN); -					item_params.scroll_callback.function(boost::bind(&LLMenuGL::scrollItemsDown, this)); +					item_params.scroll_callback.function(boost::bind(&LLMenuGL::scrollItems, this, SD_DOWN));  					mArrowDownItem = LLUICtrlFactory::create<LLMenuScrollItem>(item_params);  					LLUICtrl::addChild(mArrowDownItem);				 @@ -2603,14 +2618,8 @@ LLMenuItemGL* LLMenuGL::highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disa  		((LLFloater*)getParent())->setFocus(TRUE);  	} -	item_list_t::iterator cur_item_iter; -	for (cur_item_iter = mItems.begin(); cur_item_iter != mItems.end(); ++cur_item_iter) -	{ -		if( (*cur_item_iter) == cur_item) -		{ -			break; -		} -	} +	// Current item position in the items list +	item_list_t::iterator cur_item_iter = std::find(mItems.begin(), mItems.end(), cur_item);  	item_list_t::iterator next_item_iter;  	if (cur_item_iter == mItems.end()) @@ -2621,9 +2630,37 @@ LLMenuItemGL* LLMenuGL::highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disa  	{  		next_item_iter = cur_item_iter;  		next_item_iter++; + +		// First visible item position in the items list +		item_list_t::iterator first_visible_item_iter = std::find(mItems.begin(), mItems.end(), mFirstVisibleItem); +  		if (next_item_iter == mItems.end())  		{  			next_item_iter = mItems.begin(); + +			// If current item is the last in the list, the menu is scrolled to the beginning +			// and the first item is highlighted. +			if (mScrollable && !scrollItems(SD_BEGIN)) +			{ +				return NULL; +			} +		} +		// If current item is the last visible, the menu is scrolled one item down +		// and the next item is highlighted. +		else if (mScrollable && +				 (U32)std::abs(std::distance(first_visible_item_iter, next_item_iter)) >= mMaxScrollableItems) +		{ +			// Call highlightNextItem() recursively only if the menu was successfully scrolled down. +			// If scroll timer hasn't expired yet the menu won't be scrolled and calling +			// highlightNextItem() will result in an endless recursion. +			if (scrollItems(SD_DOWN)) +			{ +				return highlightNextItem(cur_item, skip_disabled); +			} +			else +			{ +				return NULL; +			}  		}  	} @@ -2681,14 +2718,8 @@ LLMenuItemGL* LLMenuGL::highlightPrevItem(LLMenuItemGL* cur_item, BOOL skip_disa  		((LLFloater*)getParent())->setFocus(TRUE);  	} -	item_list_t::reverse_iterator cur_item_iter; -	for (cur_item_iter = mItems.rbegin(); cur_item_iter != mItems.rend(); ++cur_item_iter) -	{ -		if( (*cur_item_iter) == cur_item) -		{ -			break; -		} -	} +	// Current item reverse position from the end of the list +	item_list_t::reverse_iterator cur_item_iter = std::find(mItems.rbegin(), mItems.rend(), cur_item);  	item_list_t::reverse_iterator prev_item_iter;  	if (cur_item_iter == mItems.rend()) @@ -2699,9 +2730,37 @@ LLMenuItemGL* LLMenuGL::highlightPrevItem(LLMenuItemGL* cur_item, BOOL skip_disa  	{  		prev_item_iter = cur_item_iter;  		prev_item_iter++; + +		// First visible item reverse position in the items list +		item_list_t::reverse_iterator first_visible_item_iter = std::find(mItems.rbegin(), mItems.rend(), mFirstVisibleItem); +  		if (prev_item_iter == mItems.rend())  		{  			prev_item_iter = mItems.rbegin(); + +			// If current item is the first in the list, the menu is scrolled to the end +			// and the last item is highlighted. +			if (mScrollable && !scrollItems(SD_END)) +			{ +				return NULL; +			} +		} +		// If current item is the first visible, the menu is scrolled one item up +		// and the previous item is highlighted. +		else if (mScrollable && +				 std::distance(first_visible_item_iter, cur_item_iter) <= 0) +		{ +			// Call highlightNextItem() only if the menu was successfully scrolled up. +			// If scroll timer hasn't expired yet the menu won't be scrolled and calling +			// highlightNextItem() will result in an endless recursion. +			if (scrollItems(SD_UP)) +			{ +				return highlightPrevItem(cur_item, skip_disabled); +			} +			else +			{ +				return NULL; +			}  		}  	} @@ -2872,12 +2931,12 @@ BOOL LLMenuGL::handleScrollWheel( S32 x, S32 y, S32 clicks )  	if( clicks > 0 )  	{  		while( clicks-- ) -			scrollItemsDown(); +			scrollItems(SD_DOWN);  	}  	else  	{  		while( clicks++ ) -			scrollItemsUp(); +			scrollItems(SD_UP);  	}  	return TRUE; diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 19b738312e..35544402f4 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -397,6 +397,15 @@ public:  	static const std::string ARROW_UP;  	static const std::string ARROW_DOWN; +	// for scrollable menus +	typedef enum e_scrolling_direction +	{ +		SD_UP = 0, +		SD_DOWN = 1, +		SD_BEGIN = 2, +		SD_END = 3 +	} EScrollingDirection; +  protected:  	LLMenuGL(const LLMenuGL::Params& p);  	friend class LLUICtrlFactory; @@ -503,8 +512,7 @@ public:  	S32 getShortcutPad() { return mShortcutPad; } -	void scrollItemsUp(); -	void scrollItemsDown(); +	bool scrollItems(EScrollingDirection direction);  	BOOL isScrollable() const { return mScrollable; }  	static class LLMenuHolderGL* sMenuContainer; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 9adeddca99..758df418e8 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1622,7 +1622,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para  	style_params.fillFrom(getDefaultStyleParams());  	S32 part = (S32)LLTextParser::WHOLE; -	if(mParseHTML) +	if (mParseHTML && !style_params.is_link) // Don't search for URLs inside a link segment (STORM-358).  	{  		S32 start=0,end=0;  		LLUrlMatch match; diff --git a/indra/mac_updater/mac_updater.cpp b/indra/mac_updater/mac_updater.cpp index e4d100d1ec..23980ffac2 100644 --- a/indra/mac_updater/mac_updater.cpp +++ b/indra/mac_updater/mac_updater.cpp @@ -61,6 +61,7 @@ Boolean gCancelled = false;  const char *gUpdateURL;  const char *gProductName; +const char *gBundleID;  void *updatethreadproc(void*); @@ -329,6 +330,10 @@ int parse_args(int argc, char **argv)  		{  			gProductName = argv[j];  		} +		else if ((!strcmp(argv[j], "-bundleid")) && (++j < argc))  +		{ +			gBundleID = argv[j]; +		}  	}  	return 0; @@ -355,6 +360,7 @@ int main(int argc, char **argv)  	//  	gUpdateURL  = NULL;  	gProductName = NULL; +	gBundleID = NULL;  	parse_args(argc, argv);  	if (!gUpdateURL)  	{ @@ -372,6 +378,14 @@ int main(int argc, char **argv)  		{  			gProductName = "Second Life";  		} +		if (gBundleID) +		{ +			llinfos << "Bundle ID is: " << gBundleID << llendl; +		} +		else +		{ +			gBundleID = "com.secondlife.indra.viewer"; +		}  	}  	llinfos << "Starting " << gProductName << " Updater" << llendl; @@ -592,7 +606,8 @@ static bool isFSRefViewerBundle(FSRef *targetRef)  	CFURLRef targetURL = NULL;  	CFBundleRef targetBundle = NULL;  	CFStringRef targetBundleID = NULL; -	 +	CFStringRef sourceBundleID = NULL; +  	targetURL = CFURLCreateFromFSRef(NULL, targetRef);  	if(targetURL == NULL) @@ -619,7 +634,8 @@ static bool isFSRefViewerBundle(FSRef *targetRef)  	}  	else  	{ -		if(CFStringCompare(targetBundleID, CFSTR("com.secondlife.indra.viewer"), 0) == kCFCompareEqualTo) +		sourceBundleID = CFStringCreateWithCString(NULL, gBundleID, kCFStringEncodingUTF8); +		if(CFStringCompare(sourceBundleID, targetBundleID, 0) == kCFCompareEqualTo)  		{  			// This is the bundle we're looking for.  			result = true; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index ba14c248aa..931b9fd2f3 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -30,6 +30,7 @@  // Viewer includes  #include "llversioninfo.h" +#include "llversionviewer.h"  #include "llfeaturemanager.h"  #include "lluictrlfactory.h"  #include "lltexteditor.h" @@ -4513,6 +4514,8 @@ void LLAppViewer::launchUpdater()  	LLAppViewer::sUpdaterInfo->mUpdateExePath += update_url.asString();  	LLAppViewer::sUpdaterInfo->mUpdateExePath += "\" -name \"";  	LLAppViewer::sUpdaterInfo->mUpdateExePath += LLAppViewer::instance()->getSecondLifeTitle(); +	LLAppViewer::sUpdaterInfo->mUpdateExePath += "\" -bundleid \""; +	LLAppViewer::sUpdaterInfo->mUpdateExePath += LL_VERSION_BUNDLE_ID;  	LLAppViewer::sUpdaterInfo->mUpdateExePath += "\" &";  	LL_DEBUGS("AppInit") << "Calling updater: " << LLAppViewer::sUpdaterInfo->mUpdateExePath << LL_ENDL; diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index ababa71348..d353c809ca 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -31,6 +31,7 @@  #include "llchatmsgbox.h"  #include "llavatariconctrl.h" +#include "llcommandhandler.h"  #include "llfloaterreg.h"  #include "lllocalcliprect.h"  #include "lltrans.h" @@ -45,6 +46,40 @@ static const S32 msg_right_offset = 10;  static const S32 msg_height_pad = 5;  //******************************************************************************************************************* +// LLObjectHandler +//******************************************************************************************************************* + +// handle secondlife:///app/object/<ID>/inspect SLURLs +class LLObjectHandler : public LLCommandHandler +{ +public: +	LLObjectHandler() : LLCommandHandler("object", UNTRUSTED_BLOCK) { } + +	bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) +	{ +		if (params.size() < 2) return false; + +		LLUUID object_id; +		if (!object_id.set(params[0], FALSE)) +		{ +			return false; +		} + +		const std::string verb = params[1].asString(); + +		if (verb == "inspect") +		{ +			LLFloaterReg::showInstance("inspect_object", LLSD().with("object_id", object_id)); +			return true; +		} + +		return false; +	} +}; + +LLObjectHandler gObjectHandler; + +//*******************************************************************************************************************  //LLNearbyChatToastPanel  //******************************************************************************************************************* @@ -169,17 +204,26 @@ void LLNearbyChatToastPanel::init(LLSD& notification)  	{  		std::string str_sender; -		str_sender = "<nolink>"; // disable parsing URLs in object names (STORM-358) -		str_sender += fromName; -		str_sender += "</nolink>"; +		str_sender = fromName;  		str_sender+=" "; -		//append user name +		//append sender name +		if (mSourceType == CHAT_SOURCE_AGENT || mSourceType == CHAT_SOURCE_OBJECT)  		{  			LLStyle::Params style_params_name;  			LLColor4 userNameColor = LLUIColorTable::instance().getColor("ChatToastAgentNameColor"); +			std::string href; + +			if (mSourceType == CHAT_SOURCE_AGENT) +			{ +				href = LLSLURL("agent", mFromID, "about").getSLURLString(); +			} +			else +			{ +				href = LLSLURL("object", mFromID, "inspect").getSLURLString(); +			}  			style_params_name.color(userNameColor); @@ -188,11 +232,16 @@ void LLNearbyChatToastPanel::init(LLSD& notification)  			style_params_name.font.name(font_name);  			style_params_name.font.size(font_style_size); -			style_params_name.link_href = LLSLURL("agent",mFromID,"about").getSLURLString(); +			style_params_name.link_href = href; +			style_params_name.is_link = true;  			msg_text->appendText(str_sender, FALSE, style_params_name);  		} +		else +		{ +			msg_text->appendText(str_sender, false); +		}  	}  	//append text diff --git a/indra/newview/llcommandlineparser.cpp b/indra/newview/llcommandlineparser.cpp index ee8646aad0..f31ff14df6 100644 --- a/indra/newview/llcommandlineparser.cpp +++ b/indra/newview/llcommandlineparser.cpp @@ -267,7 +267,11 @@ bool LLCommandLineParser::parseAndStoreResults(po::command_line_parser& clp)      {          clp.options(gOptionsDesc);          clp.positional(gPositionalOptions); -        clp.style(po::command_line_style::default_style  +		// SNOW-626: Boost 1.42 erroneously added allow_guessing to the default style +		// (see http://groups.google.com/group/boost-list/browse_thread/thread/545d7bf98ff9bb16?fwc=2&pli=1) +		// Remove allow_guessing from the default style, because that is not allowed +		// when we have options that are a prefix of other options (aka, --help and --helperuri). +        clp.style((po::command_line_style::default_style & ~po::command_line_style::allow_guessing)                    | po::command_line_style::allow_long_disguise);  		if(mExtraParser)  		{ diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index db9d386b6b..33c968bf00 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -38,6 +38,7 @@  #include "llinventoryfunctions.h"  #include "llinventorymodel.h"  #include "lllistcontextmenu.h" +#include "llmenubutton.h"  #include "llnotificationsutil.h"  #include "lloutfitobserver.h"  #include "llsidetray.h" @@ -126,18 +127,6 @@ public:  		llassert(mMenu);  	} -	void show(LLView* spawning_view) -	{ -		if (!mMenu) return; - -		updateItemsVisibility(); -		mMenu->buildDrawLabels(); -		mMenu->updateParent(LLMenuGL::sMenuContainer); -		S32 menu_x = 0; -		S32 menu_y = spawning_view->getRect().getHeight() + mMenu->getRect().getHeight(); -		LLMenuGL::showPopup(spawning_view, mMenu, menu_x, menu_y); -	} -  	void updateItemsVisibility()  	{  		if (!mMenu) return; @@ -148,6 +137,8 @@ public:  		mMenu->arrangeAndClear(); // update menu height  	} +	LLMenuGL* getMenu() { return mMenu; } +  private:  	const LLUUID& getSelectedOutfitID()  	{ @@ -386,6 +377,11 @@ BOOL LLOutfitsList::postBuild()  	mAccordion = getChild<LLAccordionCtrl>("outfits_accordion");  	mAccordion->setComparator(&OUTFIT_TAB_NAME_COMPARATOR); +	LLMenuButton* menu_gear_btn = getChild<LLMenuButton>("options_gear_btn"); + +	menu_gear_btn->setMouseDownCallback(boost::bind(&LLOutfitListGearMenu::updateItemsVisibility, mGearMenu)); +	menu_gear_btn->setMenu(mGearMenu->getMenu()); +  	return TRUE;  } @@ -727,13 +723,6 @@ bool LLOutfitsList::isActionEnabled(const LLSD& userdata)  	return false;  } -// virtual -void LLOutfitsList::showGearMenu(LLView* spawning_view) -{ -	if (!mGearMenu) return; -	mGearMenu->show(spawning_view); -} -  void LLOutfitsList::getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const  {  	// Collect selected items from all selected lists. diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h index f73ae5bef2..5fecbb83e7 100644 --- a/indra/newview/lloutfitslist.h +++ b/indra/newview/lloutfitslist.h @@ -94,8 +94,6 @@ public:  	/*virtual*/ bool isActionEnabled(const LLSD& userdata); -	/*virtual*/ void showGearMenu(LLView* spawning_view); -  	const LLUUID& getSelectedOutfitUUID() const { return mSelectedOutfitUUID; }  	/*virtual*/ void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const; diff --git a/indra/newview/llpanelappearancetab.h b/indra/newview/llpanelappearancetab.h index 81366c5db4..2ed6b00497 100644 --- a/indra/newview/llpanelappearancetab.h +++ b/indra/newview/llpanelappearancetab.h @@ -39,8 +39,6 @@ public:  	virtual bool isActionEnabled(const LLSD& userdata) = 0; -	virtual void showGearMenu(LLView* spawning_view) = 0; -  	virtual void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const {}  	static const std::string& getFilterSubString() { return sFilterSubString; } diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index c4a484d368..e5695f420a 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -47,6 +47,7 @@  #include "llinventorymodelbackgroundfetch.h"  #include "llinventorypanel.h"  #include "lllandmarkactions.h" +#include "llmenubutton.h"  #include "llplacesinventorybridge.h"  #include "llplacesinventorypanel.h"  #include "llsidetray.h" @@ -191,6 +192,7 @@ LLLandmarksPanel::LLLandmarksPanel()  	,	mLibraryInventoryPanel(NULL)  	,	mCurrentSelectedList(NULL)  	,	mListCommands(NULL) +	,	mGearButton(NULL)  	,	mGearFolderMenu(NULL)  	,	mGearLandmarkMenu(NULL)  { @@ -685,7 +687,9 @@ void LLLandmarksPanel::initListCommandsHandlers()  {  	mListCommands = getChild<LLPanel>("bottom_panel"); -	mListCommands->childSetAction(OPTIONS_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onActionsButtonClick, this)); +	mGearButton = getChild<LLMenuButton>(OPTIONS_BUTTON_NAME); +	mGearButton->setMouseDownCallback(boost::bind(&LLLandmarksPanel::onActionsButtonClick, this)); +  	mListCommands->childSetAction(TRASH_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onTrashButtonClick, this));  	LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>(TRASH_BUTTON_NAME); @@ -741,7 +745,7 @@ void LLLandmarksPanel::onActionsButtonClick()  		}  	} -	showActionMenu(menu,OPTIONS_BUTTON_NAME); +	mGearButton->setMenu(menu);  }  void LLLandmarksPanel::showActionMenu(LLMenuGL* menu, std::string spawning_view_name) @@ -750,7 +754,10 @@ void LLLandmarksPanel::showActionMenu(LLMenuGL* menu, std::string spawning_view_  	{  		menu->buildDrawLabels();  		menu->updateParent(LLMenuGL::sMenuContainer); -		LLView* spawning_view = getChild<LLView> (spawning_view_name); +		menu->arrangeAndClear(); + +		LLView* spawning_view = getChild<LLView>(spawning_view_name); +  		S32 menu_x, menu_y;  		//show menu in co-ordinates of panel  		spawning_view->localPointToOtherView(0, spawning_view->getRect().getHeight(), &menu_x, &menu_y, this); diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index 0d4402d8cb..28c19d3e5f 100644 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -39,6 +39,7 @@  class LLAccordionCtrlTab;  class LLFolderViewItem; +class LLMenuButton;  class LLMenuGL;  class LLInventoryPanel;  class LLPlacesInventoryPanel; @@ -155,6 +156,7 @@ private:  	LLPlacesInventoryPanel*		mLandmarksInventoryPanel;  	LLPlacesInventoryPanel*		mMyInventoryPanel;  	LLPlacesInventoryPanel*		mLibraryInventoryPanel; +	LLMenuButton*				mGearButton;  	LLMenuGL*					mGearLandmarkMenu;  	LLMenuGL*					mGearFolderMenu;  	LLMenuGL*					mMenuAdd; diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 5b07e4863b..cc69dbd9d4 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -39,6 +39,7 @@  #include "llinventorypanel.h"  #include "llfiltereditor.h"  #include "llfloaterreg.h" +#include "llmenubutton.h"  #include "lloutfitobserver.h"  #include "llpreviewtexture.h"  #include "llresmgr.h" @@ -192,6 +193,8 @@ BOOL LLPanelMainInventory::postBuild()  		mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2));  	} +	mGearMenuButton = getChild<LLMenuButton>("options_gear_btn"); +  	initListCommandsHandlers();  	// *TODO:Get the cost info from the server @@ -900,7 +903,6 @@ void LLFloaterInventoryFinder::selectNoTypes(void* user_data)  void LLPanelMainInventory::initListCommandsHandlers()  { -	childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));  	childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));  	childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this)); @@ -914,6 +916,7 @@ void LLPanelMainInventory::initListCommandsHandlers()  	mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2));  	mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));  	mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +	mGearMenuButton->setMenu(mMenuGearDefault);  	mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  	// Update the trash button when selected item(s) get worn or taken off. @@ -927,11 +930,6 @@ void LLPanelMainInventory::updateListCommands()  	mTrashButton->setEnabled(trash_enabled);  } -void LLPanelMainInventory::onGearButtonClick() -{ -	showActionMenu(mMenuGearDefault,"options_gear_btn"); -} -  void LLPanelMainInventory::onAddButtonClick()  {  	setUploadCostIfNeeded(); diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index cf2cc14531..f95a99157d 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -40,6 +40,7 @@ class LLSaveFolderState;  class LLFilterEditor;  class LLTabContainer;  class LLFloaterInventoryFinder; +class LLMenuButton;  class LLMenuGL;  class LLFloater; @@ -129,7 +130,6 @@ private:  protected:  	void initListCommandsHandlers();  	void updateListCommands(); -	void onGearButtonClick();  	void onAddButtonClick();  	void showActionMenu(LLMenuGL* menu, std::string spawning_view_name);  	void onTrashButtonClick(); @@ -145,6 +145,7 @@ private:  	LLDragAndDropButton*		mTrashButton;  	LLMenuGL*					mMenuGearDefault;  	LLMenuGL*					mMenuAdd; +	LLMenuButton*				mGearMenuButton;  	bool						mNeedUploadCost;  	// List Commands                                                              // diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 494db01f77..5638374178 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -56,6 +56,7 @@  #include "llinventorymodel.h"  #include "llinventorymodelbackgroundfetch.h"  #include "llloadingindicator.h" +#include "llmenubutton.h"  #include "llpaneloutfitsinventory.h"  #include "lluiconstants.h"  #include "llsaveoutfitcombobtn.h" @@ -403,7 +404,9 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()  	mAddWearablesPanel(NULL),  	mFolderViewFilterCmbBox(NULL),  	mListViewFilterCmbBox(NULL), -	mPlusBtn(NULL) +	mPlusBtn(NULL), +	mWearablesGearMenuBtn(NULL), +	mGearMenuBtn(NULL)  {  	mSavedFolderState = new LLSaveFolderState();  	mSavedFolderState->setApply(FALSE); @@ -478,13 +481,14 @@ BOOL LLPanelOutfitEdit::postBuild()  	childSetCommitCallback("folder_view_btn", boost::bind(&LLPanelOutfitEdit::saveListSelection, this), NULL);  	childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::showWearablesListView, this), NULL);  	childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::saveListSelection, this), NULL); -	childSetCommitCallback("wearables_gear_menu_btn", boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1), NULL); -	childSetCommitCallback("gear_menu_btn", boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1), NULL);  	childSetCommitCallback("shop_btn_1", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL);  	childSetCommitCallback("shop_btn_2", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL);  	setVisibleCallback(boost::bind(&LLPanelOutfitEdit::onVisibilityChange, this, _2)); +	mWearablesGearMenuBtn = getChild<LLMenuButton>("wearables_gear_menu_btn"); +	mGearMenuBtn = getChild<LLMenuButton>("gear_menu_btn"); +  	mCOFWearables = findChild<LLCOFWearables>("cof_wearables_list");  	mCOFWearables->setCommitCallback(boost::bind(&LLPanelOutfitEdit::filterWearablesBySelectedItem, this)); @@ -557,6 +561,13 @@ BOOL LLPanelOutfitEdit::postBuild()  	mWearableItemsList->setComparator(mWearableListViewItemsComparator); +	// Creating "Add Wearables" panel gear menu after initialization of mWearableItemsList and mInventoryItemsPanel. +	mAddWearablesGearMenu = LLAddWearablesGearMenu::create(mWearableItemsList, mInventoryItemsPanel); +	mWearablesGearMenuBtn->setMenu(mAddWearablesGearMenu); + +	mGearMenu = LLPanelOutfitEditGearMenu::create(); +	mGearMenuBtn->setMenu(mGearMenu); +  	mSaveComboBtn.reset(new LLSaveOutfitComboBtn(this));  	return TRUE;  } @@ -1256,37 +1267,6 @@ void LLPanelOutfitEdit::resetAccordionState()  	}  } -void LLPanelOutfitEdit::onGearButtonClick(LLUICtrl* clicked_button) -{ -	LLMenuGL* menu = NULL; - -	if (mAddWearablesPanel->getVisible()) -	{ -		if (!mAddWearablesGearMenu) -		{ -			mAddWearablesGearMenu = LLAddWearablesGearMenu::create(mWearableItemsList, mInventoryItemsPanel); -		} - -		menu = mAddWearablesGearMenu; -	} -	else -	{ -		if (!mGearMenu) -		{ -			mGearMenu = LLPanelOutfitEditGearMenu::create(); -		} - -		menu = mGearMenu; -	} - -	if (!menu) return; - -	menu->arrangeAndClear(); // update menu height -	S32 menu_y = menu->getRect().getHeight() + clicked_button->getRect().getHeight(); -	menu->buildDrawLabels(); -	LLMenuGL::showPopup(clicked_button, menu, 0, menu_y); -} -  void LLPanelOutfitEdit::onAddMoreButtonClicked()  {  	toggleAddWearablesPanel(); diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 2dca986e33..963db84503 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -54,6 +54,7 @@ class LLScrollListCtrl;  class LLToggleableMenu;  class LLFilterEditor;  class LLFilteredWearableListManager; +class LLMenuButton;  class LLMenuGL;  class LLFindNonLinksByMask;  class LLFindWearablesOfType; @@ -186,8 +187,6 @@ public:  									  std::string& tooltip_msg);  private: - -	void onGearButtonClick(LLUICtrl* clicked_button);  	void onAddMoreButtonClicked();  	void showFilteredWearablesListView(LLWearableType::EType type);  	void onOutfitChanging(bool started); @@ -238,8 +237,8 @@ private:  	LLMenuGL*			mAddWearablesGearMenu;  	bool				mInitialized;  	std::auto_ptr<LLSaveOutfitComboBtn> mSaveComboBtn; - - +	LLMenuButton*		mWearablesGearMenuBtn; +	LLMenuButton*		mGearMenuBtn;  }; diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index d6d8a38ebe..4f2cfa2bbc 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -232,9 +232,7 @@ void LLPanelOutfitsInventory::initListCommandsHandlers()  {  	mListCommands = getChild<LLPanel>("bottom_panel");  	mListCommands->childSetAction("wear_btn", boost::bind(&LLPanelOutfitsInventory::onWearButtonClick, this)); -	mMyOutfitsPanel->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::showGearMenu, this));  	mMyOutfitsPanel->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this)); -	mCurrentOutfitPanel->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::showGearMenu, this));  }  void LLPanelOutfitsInventory::updateListCommands() @@ -258,14 +256,6 @@ void LLPanelOutfitsInventory::updateListCommands()  	}  } -void LLPanelOutfitsInventory::showGearMenu() -{ -	if (!mActivePanel) return; - -	LLView* spawning_view = getChild<LLView>("options_gear_btn"); -	mActivePanel->showGearMenu(spawning_view); -} -  void LLPanelOutfitsInventory::onTrashButtonClick()  {  	LLNotificationsUtil::add("DeleteOutfits", LLSD(), LLSD(), boost::bind(&LLPanelOutfitsInventory::onOutfitsRemovalConfirmation, this, _1, _2)); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 040b5319b9..b79a2d3224 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -29,6 +29,7 @@  // libs  #include "llavatarname.h"  #include "llfloaterreg.h" +#include "llmenubutton.h"  #include "llmenugl.h"  #include "llnotificationsutil.h"  #include "lleventtimer.h" @@ -464,7 +465,11 @@ LLPanelPeople::LLPanelPeople()  		mAllFriendList(NULL),  		mNearbyList(NULL),  		mRecentList(NULL), -		mGroupList(NULL) +		mGroupList(NULL), +		mNearbyGearButton(NULL), +		mFriendsGearButton(NULL), +		mGroupsGearButton(NULL), +		mRecentGearButton(NULL)  {  	mFriendListUpdater = new LLFriendListUpdater(boost::bind(&LLPanelPeople::updateFriendList,	this));  	mNearbyListUpdater = new LLNearbyListUpdater(boost::bind(&LLPanelPeople::updateNearbyList,	this)); @@ -600,11 +605,6 @@ BOOL LLPanelPeople::postBuild()  	buttonSetAction("teleport_btn",		boost::bind(&LLPanelPeople::onTeleportButtonClicked,	this));  	buttonSetAction("share_btn",		boost::bind(&LLPanelPeople::onShareButtonClicked,		this)); -	getChild<LLPanel>(NEARBY_TAB_NAME)->childSetAction("nearby_view_sort_btn",boost::bind(&LLPanelPeople::onNearbyViewSortButtonClicked,		this)); -	getChild<LLPanel>(RECENT_TAB_NAME)->childSetAction("recent_viewsort_btn",boost::bind(&LLPanelPeople::onRecentViewSortButtonClicked,			this)); -	getChild<LLPanel>(FRIENDS_TAB_NAME)->childSetAction("friends_viewsort_btn",boost::bind(&LLPanelPeople::onFriendsViewSortButtonClicked,		this)); -	getChild<LLPanel>(GROUP_TAB_NAME)->childSetAction("groups_viewsort_btn",boost::bind(&LLPanelPeople::onGroupsViewSortButtonClicked,		this)); -  	// Must go after setting commit callback and initializing all pointers to children.  	mTabContainer->selectTabByName(NEARBY_TAB_NAME); @@ -624,24 +624,41 @@ BOOL LLPanelPeople::postBuild()  	enable_registrar.add("People.Recent.ViewSort.CheckItem",	boost::bind(&LLPanelPeople::onRecentViewSortMenuItemCheck,	this, _2));  	enable_registrar.add("People.Nearby.ViewSort.CheckItem",	boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemCheck,	this, _2)); +	mNearbyGearButton = getChild<LLMenuButton>("nearby_view_sort_btn"); +	mFriendsGearButton = getChild<LLMenuButton>("friends_viewsort_btn"); +	mGroupsGearButton = getChild<LLMenuButton>("groups_viewsort_btn"); +	mRecentGearButton = getChild<LLMenuButton>("recent_viewsort_btn"); +  	LLMenuGL* plus_menu  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_group_plus.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  	mGroupPlusMenuHandle  = plus_menu->getHandle();  	LLMenuGL* nearby_view_sort  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_nearby_view_sort.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  	if(nearby_view_sort) +	{  		mNearbyViewSortMenuHandle  = nearby_view_sort->getHandle(); +		mNearbyGearButton->setMenu(nearby_view_sort); +	}  	LLMenuGL* friend_view_sort  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_friends_view_sort.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  	if(friend_view_sort) +	{  		mFriendsViewSortMenuHandle  = friend_view_sort->getHandle(); +		mFriendsGearButton->setMenu(friend_view_sort); +	}  	LLMenuGL* group_view_sort  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_groups_view_sort.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  	if(group_view_sort) +	{  		mGroupsViewSortMenuHandle  = group_view_sort->getHandle(); +		mGroupsGearButton->setMenu(group_view_sort); +	}  	LLMenuGL* recent_view_sort  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_recent_view_sort.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  	if(recent_view_sort) +	{  		mRecentViewSortMenuHandle  = recent_view_sort->getHandle(); +		mRecentGearButton->setMenu(recent_view_sort); +	}  	LLVoiceClient::getInstance()->addObserver(this); @@ -911,7 +928,7 @@ void LLPanelPeople::showGroupMenu(LLMenuGL* menu)  	// Calculate its coordinates.  	// (assumes that groups panel is the current tab) -	LLPanel* bottom_panel = mTabContainer->getCurrentPanel()->getChild<LLPanel>("bottom_panel");  +	LLPanel* bottom_panel = mTabContainer->getCurrentPanel()->getChild<LLPanel>("bottom_panel");  	LLPanel* parent_panel = mTabContainer->getCurrentPanel();  	menu->arrangeAndClear();  	S32 menu_height = menu->getRect().getHeight(); @@ -1346,38 +1363,6 @@ void LLPanelPeople::onMoreButtonClicked()  	// *TODO: not implemented yet  } -void LLPanelPeople::onFriendsViewSortButtonClicked() -{ -	LLMenuGL* menu = (LLMenuGL*)mFriendsViewSortMenuHandle.get(); -	if (!menu) -		return; -	showGroupMenu(menu); -} - -void LLPanelPeople::onGroupsViewSortButtonClicked() -{ -	LLMenuGL* menu = (LLMenuGL*)mGroupsViewSortMenuHandle.get(); -	if (!menu) -		return; -	showGroupMenu(menu); -} - -void LLPanelPeople::onRecentViewSortButtonClicked() -{ -	LLMenuGL* menu = (LLMenuGL*)mRecentViewSortMenuHandle.get(); -	if (!menu) -		return; -	showGroupMenu(menu); -} - -void LLPanelPeople::onNearbyViewSortButtonClicked() -{ -	LLMenuGL* menu = (LLMenuGL*)mNearbyViewSortMenuHandle.get(); -	if (!menu) -		return; -	showGroupMenu(menu); -} -  void	LLPanelPeople::onOpen(const LLSD& key)  {  	std::string tab_name = key["people_panel_tab_name"]; diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index f5ff09b038..4412aed062 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -36,6 +36,7 @@ class LLAvatarList;  class LLAvatarName;  class LLFilterEditor;  class LLGroupList; +class LLMenuButton;  class LLTabContainer;  class LLPanelPeople  @@ -101,10 +102,6 @@ private:  	void					onShareButtonClicked();  	void					onMoreButtonClicked();  	void					onActivateButtonClicked(); -	void					onRecentViewSortButtonClicked(); -	void					onNearbyViewSortButtonClicked(); -	void					onFriendsViewSortButtonClicked(); -	void					onGroupsViewSortButtonClicked();  	void					onAvatarListDoubleClicked(LLUICtrl* ctrl);  	void					onAvatarListCommitted(LLAvatarList* list);  	void					onGroupPlusButtonClicked(); @@ -156,6 +153,11 @@ private:  	Updater*				mNearbyListUpdater;  	Updater*				mRecentListUpdater; +	LLMenuButton*			mNearbyGearButton; +	LLMenuButton*			mFriendsGearButton; +	LLMenuButton*			mGroupsGearButton; +	LLMenuButton*			mRecentGearButton; +  	std::string				mFilterSubString;  	std::string				mFilterSubStringOrig;  }; diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 9b8167b15a..766f93e0a5 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -27,6 +27,7 @@  #include "llviewerprecompiledheaders.h"  #include "llfloaterreg.h" +#include "llmenubutton.h"  #include "llfloaterworldmap.h"  #include "llpanelteleporthistory.h" @@ -375,7 +376,8 @@ LLTeleportHistoryPanel::LLTeleportHistoryPanel()  		mHistoryAccordion(NULL),  		mAccordionTabMenu(NULL),  		mLastSelectedFlatlList(NULL), -		mLastSelectedItemIndex(-1) +		mLastSelectedItemIndex(-1), +		mMenuGearButton(NULL)  {  	buildFromFile( "panel_teleport_history.xml");  } @@ -439,8 +441,6 @@ BOOL LLTeleportHistoryPanel::postBuild()  		}  	} -	getChild<LLPanel>("bottom_panel")->childSetAction("gear_btn",boost::bind(&LLTeleportHistoryPanel::onGearButtonClicked, this)); -  	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;  	registrar.add("TeleportHistory.ExpandAllFolders",  boost::bind(&LLTeleportHistoryPanel::onExpandAllFolders,  this)); @@ -448,9 +448,14 @@ BOOL LLTeleportHistoryPanel::postBuild()  	registrar.add("TeleportHistory.ClearTeleportHistory",  boost::bind(&LLTeleportHistoryPanel::onClearTeleportHistory,  this));  	mEnableCallbackRegistrar.add("TeleportHistory.GearMenu.Enable", boost::bind(&LLTeleportHistoryPanel::isActionEnabled, this, _2)); -	LLMenuGL* gear_menu  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_teleport_history_gear.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +	mMenuGearButton = getChild<LLMenuButton>("gear_btn"); + +	LLMenuGL* gear_menu  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_teleport_history_gear.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());;  	if(gear_menu) +	{  		mGearMenuHandle  = gear_menu->getHandle(); +		mMenuGearButton->setMenu(gear_menu); +	}  	return TRUE;  } @@ -985,27 +990,6 @@ LLFlatListView* LLTeleportHistoryPanel::getFlatListViewFromTab(LLAccordionCtrlTa  	return NULL;  } -void LLTeleportHistoryPanel::onGearButtonClicked() -{ -	LLMenuGL* menu = (LLMenuGL*)mGearMenuHandle.get(); -	if (!menu) -		return; - -	// Shows the menu at the top of the button bar. - -	// Calculate its coordinates. -	LLPanel* bottom_panel = getChild<LLPanel>("bottom_panel"); -	menu->arrangeAndClear(); -	S32 menu_height = menu->getRect().getHeight(); -	S32 menu_x = -2; // *HACK: compensates HPAD in showPopup() -	S32 menu_y = bottom_panel->getRect().mTop + menu_height; - -	// Actually show the menu. -	menu->buildDrawLabels(); -	menu->updateParent(LLMenuGL::sMenuContainer); -	LLMenuGL::showPopup(this, menu, menu_x, menu_y); -} -  bool LLTeleportHistoryPanel::isActionEnabled(const LLSD& userdata) const  {  	S32 tabs_cnt = mItemContainers.size(); diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h index b5a025b39b..3d29454d15 100644 --- a/indra/newview/llpanelteleporthistory.h +++ b/indra/newview/llpanelteleporthistory.h @@ -38,6 +38,7 @@ class LLTeleportHistoryStorage;  class LLAccordionCtrl;  class LLAccordionCtrlTab;  class LLFlatListView; +class LLMenuButton;  class LLTeleportHistoryPanel : public LLPanelPlacesTab  { @@ -94,7 +95,6 @@ private:  	void showTeleportHistory();  	void handleItemSelect(LLFlatListView* );  	LLFlatListView* getFlatListViewFromTab(LLAccordionCtrlTab *); -	void onGearButtonClicked();  	bool isActionEnabled(const LLSD& userdata) const;  	void setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed); @@ -118,6 +118,7 @@ private:  	ContextMenu mContextMenu;  	LLContextMenu*			mAccordionTabMenu;  	LLHandle<LLView>		mGearMenuHandle; +	LLMenuButton*			mMenuGearButton;  }; diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp index 860470cd73..3b3d0cdce5 100644 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -32,6 +32,7 @@  #include "llinventoryfunctions.h"  #include "llinventorymodel.h"  #include "llinventoryobserver.h" +#include "llmenubutton.h"  #include "llsidetray.h"  #include "llviewermenu.h"  #include "llwearableitemslist.h" @@ -63,16 +64,7 @@ public:  		llassert(mMenu);  	} -	void show(LLView* spawning_view) -	{ -		if (!mMenu) return; - -		mMenu->buildDrawLabels(); -		mMenu->updateParent(LLMenuGL::sMenuContainer); -		S32 menu_x = 0; -		S32 menu_y = spawning_view->getRect().getHeight() + mMenu->getRect().getHeight(); -		LLMenuGL::showPopup(spawning_view, mMenu, menu_x, menu_y); -	} +	LLMenuGL* getMenu() { return mMenu; }  private: @@ -189,6 +181,10 @@ BOOL LLPanelWearing::postBuild()  	mCOFItemsList = getChild<LLWearableItemsList>("cof_items_list");  	mCOFItemsList->setRightMouseDownCallback(boost::bind(&LLPanelWearing::onWearableItemsListRightClick, this, _1, _2, _3)); +	LLMenuButton* menu_gear_btn = getChild<LLMenuButton>("options_gear_btn"); + +	menu_gear_btn->setMenu(mGearMenu->getMenu()); +  	return TRUE;  } @@ -253,13 +249,6 @@ bool LLPanelWearing::isActionEnabled(const LLSD& userdata)  	return false;  } -// virtual -void LLPanelWearing::showGearMenu(LLView* spawning_view) -{ -	if (!mGearMenu) return; -	mGearMenu->show(spawning_view); -} -  boost::signals2::connection LLPanelWearing::setSelectionChangeCallback(commit_callback_t cb)  {  	if (!mCOFItemsList) return boost::signals2::connection(); diff --git a/indra/newview/llpanelwearing.h b/indra/newview/llpanelwearing.h index 1fa97735b1..157b2c4c5f 100644 --- a/indra/newview/llpanelwearing.h +++ b/indra/newview/llpanelwearing.h @@ -58,8 +58,6 @@ public:  	/*virtual*/ bool isActionEnabled(const LLSD& userdata); -	/*virtual*/ void showGearMenu(LLView* spawning_view); -  	/*virtual*/ void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const;  	boost::signals2::connection setSelectionChangeCallback(commit_callback_t cb); diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 0c17b5e297..8ef3a3b839 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -880,8 +880,10 @@ void LLWorldMapView::drawFrustum()  	F32 half_width_meters = far_clip_meters * tan( horiz_fov / 2 );  	F32 half_width_pixels = half_width_meters * meters_to_pixels; -	F32 ctr_x = getLocalRect().getWidth() * 0.5f + sPanX; -	F32 ctr_y = getLocalRect().getHeight() * 0.5f + sPanY; +	// Compute the frustum coordinates. Take the UI scale into account. +	F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor"); +	F32 ctr_x = (getLocalRect().getWidth() * 0.5f + sPanX)  * ui_scale_factor; +	F32 ctr_y = (getLocalRect().getHeight() * 0.5f + sPanY) * ui_scale_factor;  	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml index 2ae46f79a5..2a5933e3e9 100644 --- a/indra/newview/skins/default/xui/en/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml @@ -115,7 +115,7 @@  		       layout="topleft"  		       name="options_gear_btn_panel"  		       width="32"> -		          <button +		          <menu_button  		           follows="bottom|left"  		           tool_tip="Show additional options"  		           height="25" diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index 16529f4064..2b6e082542 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -119,7 +119,7 @@         layout="topleft"         name="options_gear_btn_panel"         width="32"> -          <button +          <menu_button             follows="bottom|left"             tool_tip="Show additional options"             height="25" diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml index bc050f9ad1..f4dee9cd55 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -378,7 +378,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap       name="no_add_wearables_button_bar"       top_pad="0"       width="313"> -        <button +        <menu_button           follows="bottom|left"           height="25"           image_hover_unselected="Toolbar_Left_Over" @@ -426,7 +426,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap       top_delta="0"       visible="false"       width="313"> -        <button +        <menu_button           follows="bottom|left"           height="25"           image_hover_unselected="Toolbar_Left_Over" diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml index d18f0d57ca..9f98019c94 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml @@ -35,7 +35,7 @@  	 visible="true"  	 name="bottom_panel"  	 width="312"> -     <button +     <menu_button         follows="bottom|left"         tool_tip="Show additional options"         height="25" diff --git a/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml index 2fbbf6610c..d85b778db2 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml @@ -29,7 +29,7 @@       name="bottom_panel"       top_pad="0"       width="312"> -        <button +        <menu_button           follows="bottom|left"           height="25"           image_hover_unselected="Toolbar_Left_Over" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index e7a0b768c6..d34c0c29a8 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -114,7 +114,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M               name="bottom_panel"               top_pad="0"               width="313"> -             <button +             <menu_button               follows="bottom|left"               height="25"               image_hover_unselected="Toolbar_Left_Over" @@ -242,7 +242,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M  				       layout="topleft"  				       name="options_gear_btn_panel"  				       width="32"> -				          <button +				          <menu_button  				           follows="bottom|left"  				           tool_tip="Show additional options"  				           height="25" @@ -407,7 +407,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M               name="bottom_panel"               top_pad="0"               width="313"> -               <button +               <menu_button                 follows="bottom|left"                 tool_tip="Options"                 height="25" @@ -490,7 +490,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M               name="bottom_panel"               top_pad="0"               width="313"> -               <button +               <menu_button                 follows="bottom|left"                 tool_tip="Options"                 height="25" @@ -499,7 +499,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M                 image_selected="Toolbar_Left_Selected"                 image_unselected="Toolbar_Left_Off"                 layout="topleft" -               left="3"                 name="recent_viewsort_btn"                 top="1"                 width="31" /> diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml index bf09836e87..768efc2f3f 100644 --- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml @@ -157,7 +157,7 @@       left="3"       name="bottom_panel"       width="313"> -        <button +        <menu_button           follows="bottom|left"           tool_tip="Show additional options"           height="25"  | 
